HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- глюки оружия, если на сервере играет больше одного игрока (https://hlfx.ru/forum/showthread.php?threadid=1755)
Отправлено fire64 10-03-2009 в 17:19:
глюки оружия, если на сервере играет больше одного игрока
Здравствуйте, у меня проблемы с дисплейсером.
когда игрок один на сервере, то все нормально, оружие стреляет каждый раз когда нажимают левую клавишу и энергошар летит в правильном направлении ( в то место куда стреляет игрок )
а вот если на сервере 2 и более игроков, то оружие выстреливает шаром примерно в пропорции 1 выстрел к 3 нажатиям
и летит шар не в том направлении куда стрелял игрок,а в любое куда ему нравится, вот код
за основу взят код из op4sdk + заменена скондари атака
C++ Source Code:
12 | #define SF_DISP_MODE 128 //G-Cont. use for makes alternative displacer - debug features |
26 | LINK_ENTITY_TO_CLASS( weapon_displacer, CDisplacer ); |
28 | #define DISPLACER_SECONDARY_USAGE 2 |
29 | #define DISPLACER_PRIMARY_USAGE 1 |
31 | LINK_ENTITY_TO_CLASS( info_xen, CPointEntity ); |
32 | LINK_ENTITY_TO_CLASS( info_earth, CPointEntity ); |
34 | // displacer teleball code |
36 | class CDispBall : public CBaseEntity//Special for Ghoul [BB] |
40 | void Precache( void ); |
41 | void Explode( TraceResult *pTrace ); |
42 | void RemoveBall (void); |
43 | void SelfRemove( void ); |
44 | void EXPORT ExplodeTouch( CBaseEntity *pOther ); |
46 | void EXPORT BallThink( void ); |
47 | static CDispBall *CreateDispBall( Vector vecOrigin, Vector vecAngles, CBaseEntity *pOwner, CDisplacer *pLauncher ); |
48 | static CDispBall *SelfCreate( void ); |
50 | BOOL m_fIsSelfTeleporter; |
55 | LINK_ENTITY_TO_CLASS( dispball, CDispBall ); |
57 | CDispBall *CDispBall::CreateDispBall( Vector vecOrigin, Vector vecAngles, CBaseEntity *pOwner, CDisplacer *pLauncher ) |
59 | CDispBall *pDispBall = GetClassPtr( (CDispBall *)NULL ); |
61 | UTIL_SetOrigin( pDispBall->pev, vecOrigin ); |
62 | pDispBall->pev->angles = vecAngles; |
63 | pDispBall->m_fIsSelfTeleporter = FALSE; |
65 | pDispBall->SetTouch( CDispBall::ExplodeTouch ); |
66 | pDispBall->pev->owner = pOwner->edict(); |
73 | CDispBall *CDispBall::SelfCreate( void ) |
75 | CDispBall *pDispBall = GetClassPtr( (CDispBall *)NULL ); |
76 | pDispBall->pev->classname = MAKE_STRING("displacer_ball"); |
77 | pDispBall->m_fIsSelfTeleporter = TRUE; |
79 | pDispBall->SelfRemove(); |
87 | void CDispBall :: Spawn( void ) |
93 | if ( !m_fIsSelfTeleporter ) |
95 | pev->movetype = MOVETYPE_FLY; |
96 | pev->solid = SOLID_BBOX; |
97 | pev->velocity = gpGlobals->v_forward * 500; |
100 | SET_MODEL(ENT(pev), "sprites/unused_spark2.spr"); |
103 | UTIL_SetSize(pev, Vector ( 0, 0, 0 ), Vector ( 0, 0, 0 ) ); |
104 | UTIL_SetOrigin( pev, pev->origin ); |
105 | pev->rendermode = kRenderTransAdd; |
106 | pev->renderamt = 255; |
108 | pev->classname = MAKE_STRING("dispball"); |
110 | if ( !m_fIsSelfTeleporter ) |
113 | SetThink( BallThink ); |
114 | SetTouch( ExplodeTouch ); |
115 | pev->nextthink = 0.1; |
120 | UTIL_MakeVectors( pev->angles ); |
121 | pev->angles.x = -(pev->angles.x + 0); |
126 | void CDispBall :: Precache( void ) |
128 | PRECACHE_MODEL("sprites/unused_spark2.spr"); |
129 | PRECACHE_MODEL ("sprites/xflare2.spr"); |
131 | PRECACHE_SOUND("weapons/newflashbang_explode.wav"); |
132 | m_iDispRing = PRECACHE_MODEL ("sprites/bluejet1.spr"); |
135 | void CDispBall :: BallThink( void ) |
142 | for (int i = 0; i < 10; i++) |
144 | Vector vecDir = Vector( RANDOM_FLOAT( -1.0, 1.0 ), RANDOM_FLOAT( -1.0, 1.0 ),RANDOM_FLOAT( -1.0, 1.0 ) ); |
145 | vecDir = vecDir.Normalize(); |
147 | UTIL_TraceLine( pev->origin, pev->origin + vecDir * 1024, ignore_monsters, ENT(pev), &tr1 ); |
148 | if (flDist > tr1.flFraction) |
151 | flDist = tr.flFraction; |
155 | if ( flDist == 1.0 ) return; |
157 | pBeam = CBeam::BeamCreate("sprites/xflare2.spr",200); |
158 | pBeam->PointEntInit( tr.vecEndPos, entindex() ); |
159 | pBeam->SetStartPos( tr.vecEndPos ); |
160 | pBeam->SetEndEntity( entindex() ); |
161 | pBeam->SetColor( 90, 170, 16 ); |
162 | pBeam->SetNoise( 65 ); |
163 | pBeam->SetBrightness( 255 ); |
164 | pBeam->SetWidth( 30 ); |
165 | pBeam->SetScrollRate( 35 ); |
166 | pBeam->LiveForTime( 1 ); |
168 | pev->frame += 1; //animate teleball |
170 | pev->frame = fmod( pev->frame, 24 ); |
172 | pev->nextthink = gpGlobals->time + 0.1; |
176 | void CDispBall :: SelfRemove ( void ) |
178 | pev->velocity = g_vecZero; |
180 | MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, pev->origin ); |
181 | WRITE_BYTE( TE_BEAMCYLINDER ); |
182 | WRITE_COORD( pev->origin.x); |
183 | WRITE_COORD( pev->origin.y); |
184 | WRITE_COORD( pev->origin.z); |
185 | WRITE_COORD( pev->origin.x); |
186 | WRITE_COORD( pev->origin.y); |
187 | WRITE_COORD( pev->origin.z + 640); |
188 | WRITE_SHORT( m_iDispRing ); |
189 | WRITE_BYTE( 0 ); // startframe |
190 | WRITE_BYTE( 10 ); // framerate |
191 | WRITE_BYTE( 3 ); // life |
192 | WRITE_BYTE( 20 ); // width |
193 | WRITE_BYTE( 0 ); // noise |
194 | WRITE_BYTE( 255 ); // r, g, b |
195 | WRITE_BYTE( 255 ); // r, g, b |
196 | WRITE_BYTE( 255 ); // r, g, b |
197 | WRITE_BYTE( 255 ); // brightness |
198 | WRITE_BYTE( 0 ); // speed |
201 | MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, pev->origin ); |
202 | WRITE_BYTE(TE_DLIGHT); |
203 | WRITE_COORD(pev->origin.x); // X |
204 | WRITE_COORD(pev->origin.y); // Y |
205 | WRITE_COORD(pev->origin.z); // Z |
206 | WRITE_BYTE( 32 ); // radius * 0.1 |
207 | WRITE_BYTE( 255 ); // r |
208 | WRITE_BYTE( 180 ); // g |
209 | WRITE_BYTE( 96 ); // b |
210 | WRITE_BYTE( 60 ); // time * 10 |
211 | WRITE_BYTE( 20 ); // decay * 0.1 |
214 | SetThink (RemoveBall); |
216 | pev->nextthink = gpGlobals->time + 0.3; |
219 | void CDispBall::ExplodeTouch( CBaseEntity *pOther ) |
222 | Vector vecSpot;// trace starts here! |
224 | pev->enemy = pOther->edict(); |
226 | vecSpot = pev->origin - pev->velocity.Normalize() * 32; |
227 | UTIL_TraceLine( vecSpot, vecSpot + pev->velocity.Normalize() * 64, dont_ignore_monsters, ENT(pev), &tr ); |
232 | void CDispBall::Explode( TraceResult *pTrace ) |
234 | if(!LockRing)//for partially fix strange bug in HL engine (for full fix teleball MUST be moved to client side). g-cont |
236 | MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, pev->origin ); |
237 | WRITE_BYTE( TE_BEAMCYLINDER ); |
238 | WRITE_COORD( pev->origin.x); |
239 | WRITE_COORD( pev->origin.y); |
240 | WRITE_COORD( pev->origin.z); |
241 | WRITE_COORD( pev->origin.x); |
242 | WRITE_COORD( pev->origin.y); |
243 | WRITE_COORD( pev->origin.z + 800); |
244 | WRITE_SHORT( m_iDispRing ); |
245 | WRITE_BYTE( 0 ); // startframe |
246 | WRITE_BYTE( 10 ); // framerate |
247 | WRITE_BYTE( 3 ); // life |
248 | WRITE_BYTE( 20 ); // width |
249 | WRITE_BYTE( 0 ); // noise |
250 | WRITE_BYTE( 255 ); // r, g, b |
251 | WRITE_BYTE( 255 ); // r, g, b |
252 | WRITE_BYTE( 255 ); // r, g, b |
253 | WRITE_BYTE( 255 ); //brightness |
254 | WRITE_BYTE( 0 ); // speed |
257 | MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY ); |
258 | WRITE_BYTE(TE_DLIGHT); |
259 | WRITE_COORD(pev->origin.x); // X |
260 | WRITE_COORD(pev->origin.y); // Y |
261 | WRITE_COORD(pev->origin.z); // Z |
262 | WRITE_BYTE( 8 ); // radius * 0.1 |
263 | WRITE_BYTE( 243 ); // r |
264 | WRITE_BYTE( 231 ); // g |
265 | WRITE_BYTE( 16 ); // b |
266 | WRITE_BYTE( 20 ); // time * 10 |
267 | WRITE_BYTE( 0 ); // decay * 0.1 |
270 | MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY ); |
271 | WRITE_BYTE(TE_DLIGHT); |
272 | WRITE_COORD(pev->origin.x); // X |
273 | WRITE_COORD(pev->origin.y); // Y |
274 | WRITE_COORD(pev->origin.z); // Z |
275 | WRITE_BYTE( 4 ); // radius * 0.1 |
276 | WRITE_BYTE( 240 ); // r |
277 | WRITE_BYTE( 140 ); // g |
278 | WRITE_BYTE( 12 ); // b |
279 | WRITE_BYTE( 20 ); // time * 10 |
280 | WRITE_BYTE( 0 ); // decay * 0.1 |
285 | pev->velocity = g_vecZero; |
287 | SetThink (RemoveBall); |
288 | pev->nextthink = gpGlobals->time + 0.6; |
292 | void CDispBall::RemoveBall( void ) |
294 | EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/newflashbang_explode.wav", 0.9, ATTN_NORM); |
295 | pev->effects |= EF_NODRAW; |
299 | pevOwner = VARS( pev->owner ); |
305 | ::RadiusDamage( pev->origin, pev, pevOwner, pev->dmg, 200, CLASS_NONE, DMG_ENERGYBEAM ); |
308 | //----------------------- |
310 | //----------------------- |
312 | void CDisplacer::Spawn( ) |
315 | m_iId = WEAPON_DISPLACER; |
316 | SET_MODEL(ENT(pev), "models/w_egon.mdl"); |
319 | FallInit();// get ready to fall down. |
322 | int CDisplacer::AddToPlayer( CBasePlayer *pPlayer ) |
324 | if ( CBasePlayerWeapon::AddToPlayer( pPlayer ) ) |
326 | MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev ); |
334 | BOOL CDisplacer::Deploy( void ) |
336 | return DefaultDeploy( "models/v_BFG.mdl", "models/p_BFG.mdl", DISPLACER_DRAW, "gauss" ); |
339 | void CDisplacer::Holster( int skiplocal ) |
341 | m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.1; |
342 | SendWeaponAnim( DISPLACER_HOLSTER ); |
345 | int CDisplacer::GetItemInfo(ItemInfo *p) |
347 | p->pszName = STRING(pev->classname); |
349 | p->iMaxAmmo1 = _9MM_MAX_CARRY; |
352 | p->iMaxClip = WEAPON_NOCLIP; |
356 | p->iId = m_iId = WEAPON_DISPLACER; |
357 | p->iWeight = DISPLACER_WEIGHT; |
362 | void CDisplacer::Precache( void ) |
364 | PRECACHE_MODEL("models/w_egon.mdl"); |
365 | PRECACHE_MODEL("models/v_BFG.mdl"); |
366 | PRECACHE_MODEL("models/p_BFG.mdl"); |
368 | PRECACHE_SOUND("weapons/gluongun_fire.wav"); |
369 | PRECACHE_SOUND ("buttons/button10.wav"); |
370 | PRECACHE_SOUND ("weapons/tu_fire_missile.wav"); |
372 | UTIL_PrecacheOther( "dispball" ); |
374 | m_iBeam = PRECACHE_MODEL("sprites/xflare2.spr"); |
375 | m_usDisplacer = PRECACHE_EVENT( 1, "events/crossbow2.sc" ); |
378 | void CDisplacer::SpinUp ( void ) |
383 | if (!m_iAttackMode) SetThink (CDisplacer::Fire); |
384 | else SetThink (CDisplacer::Teleport); |
387 | PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usDisplacer, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, 0, m_iBeam, 0, m_iAttackMode); |
389 | pev->nextthink = gpGlobals->time + 0.1; |
390 | m_flTimeWeaponIdle = gpGlobals->time + 1.15; |
394 | void CDisplacer::PrimaryAttack( void ) |
396 | if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] < 1)//Check for ammo |
398 | EMIT_SOUND( edict(), CHAN_BODY, "buttons/button10.wav", 1, ATTN_NORM ); |
399 | m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.1; |
403 | m_iAttackMode = FALSE; //We set attack mode in first mode |
405 | SetThink (CDisplacer::SpinUp); |
407 | m_flNextPrimaryAttack = gpGlobals->time + 0.1; |
408 | m_flTimeWeaponIdle = gpGlobals->time + 1.5; |
409 | pev->nextthink = gpGlobals->time + 0.1; |
412 | void CDisplacer::SecondaryAttack ( void ) |
414 | if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] < 2) |
416 | EMIT_SOUND( edict(), CHAN_BODY, "buttons/button10.wav", 1, ATTN_NORM ); |
417 | m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.1; |
421 | if (m_iAttackMode) return; |
422 | m_iAttackMode = TRUE; //We set attack mode in second mode |
424 | SetThink (CDisplacer::SpinUp); |
426 | m_flNextSecondaryAttack = gpGlobals->time + 4.0; |
427 | m_flTimeWeaponIdle = gpGlobals->time + 1.5; |
428 | pev->nextthink = gpGlobals->time + 0.1; |
431 | void CDisplacer::Fire (void) |
433 | SendWeaponAnim( DISPLACER_FIRE ); |
434 | m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); |
436 | Vector vecSrc = m_pPlayer->GetGunPosition( ) + gpGlobals->v_forward * 16 + gpGlobals->v_right * 2 + gpGlobals->v_up * -5; |
437 | m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] -= DISPLACER_PRIMARY_USAGE; |
439 | EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_WEAPON, "weapons/gluongun_fire.wav", 0.9, ATTN_NORM ); |
440 | CDispBall *pDispBall = CDispBall::CreateDispBall( vecSrc, m_pPlayer->pev->v_angle, m_pPlayer, this ); |
444 | void CDisplacer:: Teleport ( void ) |
446 | m_iPlace = !m_iPlace; |
448 | CBaseEntity *pSpot = NULL; |
449 | m_iAttackMode = FALSE;//reset firemode |
451 | SendWeaponAnim ( DISPLACER_FIRE ); |
455 | if ( g_pGameRules->IsMultiplayer() ) |
457 | // Randomize the destination in multiplayer |
458 | for ( int i = RANDOM_LONG(1,5); i > 0; i-- ) |
459 | pSpot = UTIL_FindEntityByClassname(pSpot, "info_player_deathmatch" ); |
464 | pSpot = UTIL_FindEntityByClassname(pSpot, "info_displacer_earth_target" ); |
466 | pSpot = UTIL_FindEntityByClassname(pSpot, "info_displacer_xen_target" ); |
472 | Vector vecSrc = m_pPlayer->pev->origin; |
473 | CDispBall *pBall = CDispBall::SelfCreate(); |
474 | pBall->pev->owner = m_pPlayer->edict(); |
475 | pBall->pev->origin = vecSrc; |
477 | UTIL_ScreenFade( m_pPlayer, Vector(0, 160, 0), 0.5, 0.5, 255, FFADE_IN ); |
479 | m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] -= DISPLACER_SECONDARY_USAGE; |
480 | Vector tmp = pSpot->pev->origin; |
481 | tmp.z -= m_pPlayer->pev->mins.z; |
483 | UTIL_SetOrigin( m_pPlayer->pev, tmp ); |
485 | m_pPlayer->pev->angles = pSpot->pev->angles; |
486 | m_pPlayer->pev->velocity = m_pPlayer->pev->basevelocity = g_vecZero; |
487 | vecSrc = pSpot->pev->origin; |
489 | MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, pev->origin ); |
490 | WRITE_BYTE(TE_DLIGHT); |
491 | WRITE_COORD( vecSrc.x ); // X |
492 | WRITE_COORD( vecSrc.y ); // Y |
493 | WRITE_COORD( vecSrc.z ); // Z |
494 | WRITE_BYTE( 24 ); // radius * 0.1 |
495 | WRITE_BYTE( 255 ); // r |
496 | WRITE_BYTE( 180 ); // g |
497 | WRITE_BYTE( 96 ); // b |
498 | WRITE_BYTE( 31.66 ); // time * 10 |
499 | WRITE_BYTE( 1 ); // decay * 0.1 |
502 | CSprite *pSpr = CSprite::SpriteCreate( "sprites/xflare2.spr", vecSrc, TRUE ); |
503 | pSpr->AnimateAndDie( 6 ); |
504 | pSpr->SetTransparency(kRenderGlow, 128, 250, 214, 255, kRenderFxNoDissipation); |
506 | EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/tu_fire_missile.wav", 1.0, ATTN_NORM, 0, PITCH_NORM); |
511 | SendWeaponAnim( DISPLACER_SPINUP ); |
512 | EMIT_SOUND( edict(), CHAN_BODY, "buttons/button10.wav", 1, ATTN_NORM ); |
513 | m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.3; |
516 | m_flNextSecondaryAttack = gpGlobals->time + 2.0; |
517 | m_flTimeWeaponIdle = gpGlobals->time + 1.0; |
520 | void CDisplacer::WeaponIdle( void ) |
524 | m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES ); |
526 | if ( m_flTimeWeaponIdle > gpGlobals->time ) |
529 | float flRand = RANDOM_FLOAT(0,1); |
533 | iAnim = DISPLACER_IDLE1; |
534 | m_flTimeWeaponIdle = gpGlobals->time + RANDOM_FLOAT(10,15); |
538 | iAnim = DISPLACER_IDLE2; |
539 | m_flTimeWeaponIdle = gpGlobals->time + 3; |
542 | SendWeaponAnim( iAnim ); |
__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей
Отправлено Дядя Миша 10-03-2009 в 18:01:
Я когда этот код писал - ламером был. Вот так надо:
code:
void CDisplacer::Fire (void)
{
SendWeaponAnim( DISPLACER_FIRE );
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
UTIL_MakeVectors( m_pPlayer->pev->angles );
Vector vecSrc = m_pPlayer->GetGunPosition( ) + gpGlobals->v_forward * 16 + gpGlobals->v_right * 2 + gpGlobals->v_up * -5;
m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] -= DISPLACER_PRIMARY_USAGE;
EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_WEAPON, "weapons/gluongun_fire.wav", 0.9, ATTN_NORM );
CDispBall *pDispBall = CDispBall::CreateDispBall( vecSrc, m_pPlayer->pev->v_angle, m_pPlayer, this );
}
И все должно быть хорошо.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено fire64 10-03-2009 в 19:21:
Спасибо
это помогло
__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей
Отправлено Дядя Миша 10-03-2009 в 20:14:
fire64 очень тебя прошу - не кидай больше исходники в пост.
До всех не достучишься, как об стенку 
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено fire64 10-03-2009 в 20:50:
ок
прошу прощения, был не в курсе
__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей
На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024