fire64
Житель форума
Дата регистрации : Apr 2007
Проживает : Москва
Сообщений : 2362
Возраст: 34
Рейтинг
[кратко]
Пользователи:
6.9 (18 )
Нарушения:
-8.4 (? )
Сообщения:
0.2 (Метки )
Регистрация:
9.6
глюки оружия, если на сервере играет больше одного игрока
Здравствуйте, у меня проблемы с дисплейсером.
когда игрок один на сервере, то все нормально, оружие стреляет каждый раз когда нажимают левую клавишу и энергошар летит в правильном направлении ( в то место куда стреляет игрок )
а вот если на сервере 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 );
__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей
За это сообщение fire64 получил предупреждение за оверквотинг
Сообщить модератору | IP: Записан
Сообщение: 43349