Lost_Gamer_
NULL Девойс
Дата регистрации : Jan 2017
Проживает : Лида
Сообщений : 17
Рейтинг
[кратко]
Пользователи:
-6.0 (2 )
Нарушения:
-5.4 (? )
Сообщения:
0.0 (Метки )
Регистрация:
6.5
Проблема c grapple.
http://youtu.be/e_X38m6QAg0 здесь показан баг у grapple.
Вот весь код:
C++ Source Code:
3 * Copyright © 1996-2001, Valve LLC. All rights reserved.
5 * This product contains software technology licensed from Id
6 * Software, Inc. ("Id Technology"). Id Technology © 1996 Id Software, Inc.
9 * Use, distribution, and modification of this source code and/or resulting
10 * object code is restricted to non-commercial enhancements to products from
11 * Valve LLC. All other use, distribution, or modification is prohibited
12 * without written permission from Valve LLC.
24 #include "customentity.h"
25 #include "grapple_tonguetip.h"
29 LINK_ENTITY_TO_CLASS(grapple_tonguetip, CGrappleTonguetip);
31 TYPEDESCRIPTION CGrappleTonguetip::m_SaveData[] =
33 DEFINE_FIELD(CGrappleTonguetip, m_pMyGrappler, FIELD_CLASSPTR),
36 IMPLEMENT_SAVERESTORE(CGrappleTonguetip, CBaseEntity);
38 //=========================================================
40 //=========================================================
41 void CGrappleTonguetip::Spawn(void )
43 pev->movetype = MOVETYPE_TOSS;
44 pev->classname = MAKE_STRING("grapple_tonguetip" );
46 pev->solid = SOLID_BBOX;
47 pev->rendermode = kRenderTransTexture;
51 SET_MODEL(ENT(pev), "models/v_bgrap_tonguetip.mdl" );
53 UTIL_SetSize(pev, Vector(0, 0, 0), Vector(0, 0, 0));
55 SetTouch(&CGrappleTonguetip::TipTouch);
59 //=========================================================
61 //=========================================================
62 CGrappleTonguetip* CGrappleTonguetip::CreateTip(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity)
64 CGrappleTonguetip* pTonguetip = GetClassPtr((CGrappleTonguetip *)NULL);
67 UTIL_SetOrigin(pTonguetip->pev, vecStart);
68 pTonguetip->pev->velocity = vecVelocity;
69 pTonguetip->pev->owner = ENT(pevOwner);
70 pTonguetip->m_pMyGrappler = GetClassPtr((CGrapple*)pevOwner);
71 pTonguetip->SetThink(&CGrappleTonguetip::FlyThink);
72 pTonguetip->pev->nextthink = gpGlobals->time + 0.1;
77 //=========================================================
79 //=========================================================
80 void CGrappleTonguetip::FlyThink(void )
82 //ALERT(at_console, "FlyThink\n");
84 pev->nextthink = gpGlobals->time + 0.1f;
87 //=========================================================
89 //=========================================================
90 void CGrappleTonguetip::HitThink(void )
92 //ALERT(at_console, "HitThink\n");
94 pev->nextthink = gpGlobals->time + 0.1f;
97 //=========================================================
99 //=========================================================
100 void CGrappleTonguetip::TipTouch(CBaseEntity *pOther)
102 // Do not collide with the owner.
103 if (ENT(pOther->pev) == pev->owner || (ENT(pOther->pev) == VARS(pev->owner)->owner))
109 const char *pTextureName;
110 Vector vecSrc = pev->origin;
111 Vector vecEnd = pev->origin + pev->velocity * 10;
113 UTIL_TraceLine(vecSrc, vecEnd, dont_ignore_monsters, ENT(pev), &tr);
115 CBaseEntity *pEntity = CBaseEntity::Instance(tr.pHit);
116 vecSrc.CopyToArray(rgfl1);
117 vecEnd.CopyToArray(rgfl2);
120 pTextureName = TRACE_TEXTURE(ENT(pEntity->pev), rgfl1, rgfl2);
122 pTextureName = TRACE_TEXTURE(ENT(0), rgfl1, rgfl2);
125 int content = UTIL_PointContents(tr.vecEndPos);
126 int hitFlags = pOther->pev->flags;
128 m_pMyGrappler->m_iHitFlags = hitFlags;
130 if (FClassnameIs( pOther->pev, "monster_barnacle" ))
132 pev->velocity = Vector(0, 0, 0);
133 pev->movetype = MOVETYPE_NONE;
135 m_pMyGrappler->m_fTipHit = FALSE;
137 m_pMyGrappler->OnTongueTipHitSurface(tr.vecEndPos);
141 if ((hitFlags & (FL_CLIENT | FL_MONSTER)) || (FClassnameIs( pOther->pev, "ammo_spore" )) || (hitFlags && pTextureName && m_pMyGrappler && (strnicmp (pTextureName, "xeno_grapple" , 15) == 0)))
143 // Set player attached flag.
144 if (pOther->IsPlayer())
145 ((CBasePlayer*)pOther)->m_afPhysicsFlags |= PFLAG_ATTACHED;
147 pev->origin = pOther->Center();
149 pev->movetype = MOVETYPE_FOLLOW;
150 pev->aiment = ENT(pOther->pev);
152 pev->velocity = pev->velocity.Normalize();
154 m_pMyGrappler->OnTongueTipHitEntity(pOther);
155 m_pMyGrappler->m_fTipHit = TRUE;
160 pev->velocity = Vector(0, 0, 0);
161 pev->movetype = MOVETYPE_NONE;
163 m_pMyGrappler->m_fTipHit = FALSE;
165 m_pMyGrappler->OnTongueTipHitSurface(tr.vecEndPos);
169 EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "weapons/bgrapple_impact.wav" , 1, ATTN_NORM, 0, 100);
172 SetThink(&CGrappleTonguetip::HitThink);
173 pev->nextthink = gpGlobals->time + 0.1f;
176 void CGrappleTonguetip::PreRemoval(void )
178 if (pev->aiment != NULL)
180 CBaseEntity* pEnt = GetClassPtr((CBaseEntity*)VARS(pev->aiment));
181 if (pEnt && pEnt->IsPlayer())
183 // Remove attached flag of the target entity.
184 ((CBasePlayer*)pEnt)->m_afPhysicsFlags &= ~PFLAG_ATTACHED;
187 CBaseEntity::PreRemoval();
191 LINK_ENTITY_TO_CLASS(weapon_grapple, CGrapple);
207 //=========================================================
209 //=========================================================
210 void CGrapple::Spawn()
215 m_iId = WEAPON_GRAPPLE;
216 SET_MODEL(ENT(pev), "models/w_bgrap.mdl" );
222 m_fPlayPullSound = FALSE;
225 m_iFirestate = FIRESTATE_NONE;
227 m_flNextPullSoundTime = 0.0f;
229 FallInit();// get ready to fall down.
232 //=========================================================
234 //=========================================================
235 void CGrapple::Precache(void )
237 PRECACHE_MODEL("models/v_bgrap.mdl" );
238 PRECACHE_MODEL("models/v_bgrap_tonguetip.mdl" );
240 PRECACHE_MODEL("models/w_bgrap.mdl" );
241 PRECACHE_MODEL("models/p_bgrap.mdl" );
243 PRECACHE_SOUND("weapons/alienweap_draw.wav" );
245 PRECACHE_SOUND("weapons/bgrapple_cough.wav" );
246 PRECACHE_SOUND("weapons/bgrapple_fire.wav" );
247 PRECACHE_SOUND("weapons/bgrapple_impact.wav" );
248 PRECACHE_SOUND("weapons/bgrapple_pull.wav" );
249 PRECACHE_SOUND("weapons/bgrapple_release.wav" );
250 PRECACHE_SOUND("weapons/bgrapple_wait.wav" );
252 PRECACHE_MODEL("sprites/tongue.spr" );
255 //=========================================================
257 //=========================================================
258 int CGrapple::GetItemInfo(ItemInfo *p)
260 p->pszName = STRING(pev->classname);
265 p->iMaxClip = WEAPON_GRAPPLE;
268 p->iId = WEAPON_GRAPPLE;
269 p->iWeight = GRAPPLE_WEIGHT;
273 //=========================================================
275 //=========================================================
276 BOOL CGrapple::Deploy()
278 m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.9f;
279 m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.9f;
281 return DefaultDeploy("models/v_bgrap.mdl" , "models/p_bgrap.mdl" , BGRAP_UP, "bgrap" );
284 //=========================================================
286 //=========================================================
287 void CGrapple::Holster(int skiplocal /* = 0 */ )
291 m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5;
292 SendWeaponAnim(BGRAP_DOWN);
295 //=========================================================
297 //=========================================================
298 void CGrapple::PrimaryAttack(void )
300 if (m_iFirestate != FIRESTATE_NONE)
303 m_iFirestate = FIRESTATE_FIRE;
305 m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + RANDOM_FLOAT(10, 15);
306 m_flTimeWeaponIdle = UTIL_WeaponTimeBase();
309 //=========================================================
311 //=========================================================
312 void CGrapple::ItemPostFrame(void )
314 if (!(m_pPlayer->pev->button & IN_ATTACK))
316 m_flLastFireTime = 0.0f;
320 if (m_iFirestate != FIRESTATE_NONE)
327 // Check if fire is still eligible.
328 CheckFireEligibility();
330 // Check if the current tip is attached to a monster or a wall.
331 // If the tongue tip move type is MOVETYPE_FOLLOW, then it
332 // implies that we are targetting a monster, so it will kill
333 // the monster when close enough.
334 CheckTargetProximity();
336 // Update the tip velocity and position.
339 // Update the tongue beam.
342 // Update the pull sound.
346 if ((m_pPlayer->pev->button & IN_ATTACK) && CanAttack(m_flNextPrimaryAttack, gpGlobals->time, UseDecrement()))
348 if ((m_iClip == 0 && pszAmmo1()) || (iMaxClip() == -1 && !m_pPlayer->m_rgAmmo[PrimaryAmmoIndex()]))
350 m_fFireOnEmpty = TRUE;
354 m_pPlayer->TabulateAmmo();
357 m_pPlayer->pev->button &= ~IN_ATTACK;
359 else if (!(m_pPlayer->pev->button & (IN_ATTACK | IN_ATTACK2)))
361 if (m_iFirestate != FIRESTATE_NONE)
367 // no fire buttons down
369 m_fFireOnEmpty = FALSE;
371 if (!IsUseable() && m_flNextPrimaryAttack < (UseDecrement() ? 0.0 : gpGlobals->time))
373 // weapon isn't useable, switch.
374 if (!(iFlags() & ITEM_FLAG_NOAUTOSWITCHEMPTY) && g_pGameRules->GetNextBestWeapon(m_pPlayer, this ))
376 m_flNextPrimaryAttack = (UseDecrement() ? 0.0 : gpGlobals->time) + 0.3;
387 if (ShouldWeaponIdle())
393 //=========================================================
395 //=========================================================
396 void CGrapple::WeaponIdle(void )
400 if (m_flTimeWeaponIdle > UTIL_WeaponTimeBase())
403 if (m_iFirestate != FIRESTATE_NONE)
405 switch (m_iFirestate)
411 case FIRESTATE_FIRE2:
419 case FIRESTATE_REACH:
423 case FIRESTATE_TRAVEL:
427 case FIRESTATE_RELEASE:
438 float flRand = UTIL_SharedRandomFloat(m_pPlayer->random_seed, 0, 1);
441 iAnim = BGRAP_BREATHE;
442 m_flTimeWeaponIdle = 2.6f;
444 else if (flRand <= 0.7f)
446 iAnim = BGRAP_LONGIDLE;
447 m_flTimeWeaponIdle = 10.0f;
449 else if (flRand <= 0.95)
451 iAnim = BGRAP_SHORTIDLE;
452 m_flTimeWeaponIdle = 1.3f;
457 m_flTimeWeaponIdle = 4.6f;
459 EMIT_SOUND(ENT(pev), CHAN_BODY, "weapons/bgrapple_cough.wav" , 1, ATTN_NORM);
462 SendWeaponAnim(iAnim, UseDecrement());
465 //=========================================================
467 //=========================================================
468 void CGrapple::Fire(void )
470 EMIT_SOUND(ENT(pev), CHAN_BODY, "weapons/bgrapple_fire.wav" , 1, ATTN_NORM);
472 SendWeaponAnim(BGRAP_FIRE, UseDecrement());
473 m_iFirestate = FIRESTATE_FIRE2;
475 m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + RANDOM_FLOAT(15, 20);
476 m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.45f;
479 //=========================================================
481 //=========================================================
482 void CGrapple::Fire2(void )
484 // Create the tongue tip.
487 // Start the pull sound.
490 m_iFirestate = FIRESTATE_WAIT;
492 m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + RANDOM_FLOAT(15, 20);
493 m_flTimeWeaponIdle = UTIL_WeaponTimeBase();
496 //=========================================================
498 //=========================================================
499 void CGrapple::FireWait(void )
501 SendWeaponAnim(BGRAP_FIREWAITING, UseDecrement());
503 m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + RANDOM_FLOAT(15, 20);
504 m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.5f;
507 //=========================================================
509 //=========================================================
510 void CGrapple::FireReach(void )
512 SendWeaponAnim(BGRAP_FIREREACHED, UseDecrement());
513 m_iFirestate = FIRESTATE_TRAVEL;
515 // Start pulling the owner toward tongue tip.
518 m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + RANDOM_FLOAT(15, 20);
519 //m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 4.7;
520 m_flTimeWeaponIdle = UTIL_WeaponTimeBase();
523 //=========================================================
525 //=========================================================
526 void CGrapple::FireTravel(void )
528 SendWeaponAnim(BGRAP_FIRETRAVEL, UseDecrement());
530 m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + RANDOM_FLOAT(15, 20);
531 m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.6f;
534 //=========================================================
536 //=========================================================
537 void CGrapple::FireRelease(void )
540 // STOP_SOUND(ENT(pev), CHAN_VOICE, "weapons/bgrapple_pull.wav");
542 // Play release sound.
543 EMIT_SOUND(ENT(pev), CHAN_BODY, "weapons/bgrapple_release.wav" , 1, ATTN_NORM);
545 SendWeaponAnim(BGRAP_FIRERELEASE, UseDecrement());
546 m_iFirestate = FIRESTATE_NONE;
553 // Destroy the tongue tip.
559 m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.75f;
560 m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.1;
563 //=========================================================
565 //=========================================================
566 void CGrapple::OnTongueTipHitSurface(const Vector& vecTarget)
569 //ALERT(at_console, "Hit surface at: (%f,%f,%f).\n", vecTarget.x, vecTarget.y, vecTarget.z);
574 //=========================================================
576 //=========================================================
577 void CGrapple::OnTongueTipHitEntity(CBaseEntity* pEntity)
580 ALERT(at_console, "Hit entity with classname %s.\n" , (char *)STRING(pEntity->pev->classname));
584 //=========================================================
586 //=========================================================
587 void CGrapple::StartPull(void )
590 Vector vecOrigin = m_pPlayer->pev->origin;
593 UTIL_SetOrigin(m_pPlayer->pev, vecOrigin);
595 m_pPlayer->pev->movetype = MOVETYPE_FLY;
596 m_pPlayer->pev->gravity = 0.0f;
598 m_pPlayer->pev->flags &= ~FL_ONGROUND;
600 m_pPlayer->m_afPhysicsFlags |= PFLAG_LATCHING;
604 //=========================================================
606 //=========================================================
607 void CGrapple::StopPull(void )
610 m_pPlayer->pev->movetype = MOVETYPE_WALK;
611 m_pPlayer->pev->gravity = 1.0f;
613 m_pPlayer->m_afPhysicsFlags &= ~PFLAG_LATCHING;
617 //=========================================================
619 //=========================================================
620 void CGrapple::Pull( void )
623 Vector vecOwnerPos, vecTipPos, vecDirToTip;
624 vecOwnerPos = m_pPlayer->pev->origin;
625 vecTipPos = m_pTongueTip->pev->origin;
626 vecDirToTip = (vecTipPos - vecOwnerPos).Normalize();
628 m_pPlayer->pev->velocity = vecDirToTip * 450;
630 m_pPlayer->m_afPhysicsFlags |= PFLAG_LATCHING;
634 //=========================================================
636 //=========================================================
637 void CGrapple::CreateTongueTip( void )
640 Vector vecSrc, vecAiming, vecVel;
641 UTIL_MakeVectors( m_pPlayer->pev->v_angle );
643 vecSrc = m_pPlayer->GetGunPosition();
644 vecSrc = vecSrc + gpGlobals->v_forward * 8;
645 vecSrc = vecSrc + gpGlobals->v_right * 3;
646 vecSrc = vecSrc + gpGlobals->v_up * -3;
648 vecVel = gpGlobals->v_forward * 1200;
650 //GetAttachment(0, vecSrc, vecAiming);
652 m_pTongueTip = CGrappleTonguetip::CreateTip(pev, vecSrc, vecVel);
653 CreateBeam(m_pTongueTip);
659 //=========================================================
661 //=========================================================
662 void CGrapple::DestroyTongueTip(void )
669 UTIL_Remove(m_pTongueTip);
675 //=========================================================
677 //=========================================================
678 void CGrapple::UpdateTongueTip(void )
683 Vector tipVel = m_pTongueTip->pev->velocity;
684 Vector ownerVel = VARS(pev->owner)->velocity;
688 newVel.x = tipVel.x + (ownerVel.x * 0.02f);
689 newVel.y = tipVel.y + (ownerVel.y * 0.05f);
690 newVel.z = tipVel.z + (ownerVel.z * 0.01f);
692 m_pTongueTip->pev->velocity = newVel;
697 //=========================================================
699 //=========================================================
700 void CGrapple::CreateBeam( CBaseEntity* pTongueTip )
703 m_pBeam = CBeam::BeamCreate("sprites/tongue.spr" , 16);
707 m_pBeam-><img src="images/smilies/pp2.gif" border="0" alt="" >ointsInit(pTongueTip->pev->origin, pev->origin);
708 m_pBeam->SetFlags( BEAM_FSOLID );
709 m_pBeam->SetBrightness( 100.0 );
711 m_pBeam->SetEndAttachment( 1 );
712 m_pBeam->pev->spawnflags |= SF_BEAM_TEMPORARY;
717 //=========================================================
719 //=========================================================
720 void CGrapple::DestroyBeam(void )
725 UTIL_Remove(m_pBeam);
731 //=========================================================
733 //=========================================================
734 void CGrapple::UpdateBeam(void )
740 UTIL_MakeVectors(m_pPlayer->pev->v_angle);
742 vecSrc = m_pPlayer->GetGunPosition();
743 vecSrc = vecSrc + gpGlobals->v_forward * 16;
744 vecSrc = vecSrc + gpGlobals->v_right * 6;
745 vecSrc = vecSrc + gpGlobals->v_up * -8;
746 m_pBeam->SetStartPos(vecSrc);
747 m_pBeam->SetEndPos(m_pTongueTip->pev->origin);
748 m_pBeam->RelinkBeam();
753 //=========================================================
755 //=========================================================
756 BOOL CGrapple::CanAttack(float attack_time, float curtime, BOOL isPredicted)
758 #if defined ( CLIENT_WEAPONS )
764 return (attack_time <= curtime) ? TRUE : FALSE;
768 return (attack_time <= 0.0) ? TRUE : FALSE;
773 void CGrapple::StartPullSound(void )
775 m_flNextPullSoundTime = UTIL_WeaponTimeBase();
776 m_fPlayPullSound = TRUE;
779 void CGrapple::UpdatePullSound(void )
781 if (!m_fPlayPullSound)
784 if (m_flNextPullSoundTime <= UTIL_WeaponTimeBase())
786 EMIT_SOUND(ENT(pev), CHAN_BODY, "weapons/bgrapple_pull.wav" , 1, ATTN_NORM);
787 m_flNextPullSoundTime = UTIL_WeaponTimeBase() + 0.6f;
791 void CGrapple::ResetPullSound(void )
793 STOP_SOUND(ENT(pev), CHAN_BODY, "weapons/bgrapple_pull.wav" );
794 m_flNextPullSoundTime = 0.0f;
795 m_fPlayPullSound = FALSE;
798 void CGrapple::CheckTargets( void )
799 {//If the target isn't monster or xeno_grapple
802 EMIT_SOUND(ENT(pev), CHAN_BODY, "weapons/bgrapple_release.wav" , 1, ATTN_NORM);
808 BOOL CGrapple::IsTongueColliding(const Vector& vecShootOrigin, const Vector& vecTipPos)
812 UTIL_TraceLine(vecShootOrigin, vecTipPos, dont_ignore_monsters, ENT(m_pPlayer->pev), &tr);
814 if (tr.flFraction != 1.0)
816 if (m_pTongueTip->pev->movetype == MOVETYPE_FOLLOW)
818 if (tr.pHit && m_pTongueTip->pev->aiment && m_pTongueTip->pev->aiment == tr.pHit)
831 void CGrapple::CheckFireEligibility(void )
834 // Do not check for this if the tongue is not valid.
838 // Check if the tongue is through walls or if other things
839 // such as entities are between the owner and the tip.
840 if (IsTongueColliding(m_pPlayer->GetGunPosition(), m_pTongueTip->pev->origin))
849 BOOL CGrapple::CheckTargetProximity(void )
852 // Do not check for this if the tongue is not valid.
856 if (m_pTongueTip->pev->movetype == MOVETYPE_FOLLOW)
858 // Trace a hull around to see if we hit something within 20 units.
862 pev->origin + VARS(pev->owner)->velocity.Normalize() * 20,
863 dont_ignore_monsters,
869 // Check to see if we are close enough to our target.
870 // In the case o a monster, attempt to get a pointer to
871 // the entity, gib it, release grappler fire.
872 edict_t* pHit = ENT(tr.pHit);
874 (VARS(pHit)->flags & FL_MONSTER) &&
875 (m_pTongueTip->pev->aiment == tr.pHit))
877 // Get a pointer to the entity.
878 CBaseEntity* pEnt = GetClassPtr((CBaseEntity*)VARS(tr.pHit));
885 //ALERT(at_console, "ERROR: %s attempted to reference an unlisted monster.\n", STRING(m_pTongueTip->pev->classname));
895 void CGrapple::Attack( void )
898 //ALERT(at_console, "Attack\n");
900 m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + gpGlobals->time + 0.5f;
904 pev->origin + VARS(pev->owner)->velocity.Normalize() * 20,
905 dont_ignore_monsters,
909 UTIL_MakeVectors( m_pPlayer->pev->v_angle );
910 float flDamage = gSkillData.plrDmgGrapple;
912 if (g_pGameRules->IsMultiplayer())
916 CBaseEntity::Instance( tr.pHit )->TraceAttack( m_pPlayer->pev, flDamage, gpGlobals->v_forward, &tr, DMG_CLUB | DMG_ALWAYSGIB );
917 ApplyMultiDamage( pev, m_pPlayer->pev );
Сообщить модератору | IP: Записан
Сообщение: 166670