HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Проблема c grapple. (https://hlfx.ru/forum/showthread.php?threadid=5004)
Отправлено Lost_Gamer_ 24-05-2017 в 16:45:
Проблема 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 ); |
Отправлено master07 25-05-2017 в 01:42:
Lost_Gamer_ Он у тебя притягивается к 0 0 0.
Если притяжение написано в Pull то смотри vecTipPos.
Ксено текстура это часть мира, а мир это тож ентитя по этому он к ней и прятигивается.
В итоге: либо это, либо где то указатель неправильный. Если скажешь где совершается передвижение от игрока к текстуре посмотрю(я не знаю, может Pull это то)
Отправлено Ku2zoff 26-05-2017 в 02:57:
Я код этого оружия никогда не читал, но примерно представляю, как оно работает. Не надо притягивать игрока к какой-то координате. Нужно сделать трейс от игрока к конечной точке, и если там ксен-текстура, то создавать при "касании" языка в этой точке энтитю tonguetip, и к ней уже притягивать. Судя по всему, у тебя tonguetip создаётся в нулевых координатах.
Отправлено Lost_Gamer_ 26-05-2017 в 12:53:
Цитата:
Ku2zoff писал:
Я код этого оружия никогда не читал, но примерно представляю, как оно работает. Не надо притягивать игрока к какой-то координате. Нужно сделать трейс от игрока к конечной точке, и если там ксен-текстура, то создавать при "касании" языка в этой точке энтитю tonguetip, и к ней уже притягивать. Судя по всему, у тебя tonguetip создаётся в нулевых координатах.
Ну вроде там трейс, и к концу языка прикреплена невидимая модель.
Раньше притягивалось к стаенам правильно, но я не помню как я исправлял, чтоб вообще не притягивалось. Да и я нубоват ещё. Просто надеюсь на помощь.
Отправлено a1batross 28-05-2017 в 13:27:
> pev->origin = pOther->Center();
pOther в при Touch() будет ссылаться на мир. Ну ты взял Center() от pOther, вот он и летит в нулевой оригин.
Нужно наверное брать tr.vecEndPos, если pOther является миром, и Center(), если это там монстр или ammo_spore.
Отправлено Lost_Gamer_ 28-05-2017 в 13:48:
Цитата:
a1batross писал:
> pev->origin = pOther->Center();
pOther в при Touch() будет ссылаться на мир. Ну ты взял Center() от pOther, вот он и летит в нулевой оригин.
Нужно наверное брать tr.vecEndPos, если pOther является миром, и Center(), если это там монстр или ammo_spore.
Я это закомментировал и уже разобрался создав отдельное условие
else if( pTextureName && m_pMyGrappler && (strnicmp (pTextureName, "xeno_grapple", 15) == 0))
{
pev->velocity = Vector(0, 0, 0);
pev->movetype = MOVETYPE_NONE;
pev->gravity = 0.0f;
m_pMyGrappler->m_fTipHit = TRUE;
hitFlags = 0;
m_pMyGrappler->OnTongueTipHitSurface(tr.vecEndPos);
CheckTarget = 0;
}
Отправлено Дядя Миша 28-05-2017 в 14:13:
у тебя в слове "xeno_grapple" 12 символов, а ты написал 15. Вот зачем?
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Garux 29-05-2017 в 07:11:
strlen( "\"xeno_grapple\"," ) == 15
Вроде порядочек
Отправлено Дядя Миша 29-05-2017 в 09:25:
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Lost_Gamer_ 30-05-2017 в 14:54:
BOOL CGrapple::CheckTargetProximity(void)
{
#ifndef CLIENT_DLL
// Do not check for this if the tongue is not valid.
if (!m_pTongueTip)
return FALSE;
if (m_pTongueTip->pev->movetype == MOVETYPE_FOLLOW)
{
// Trace a hull around to see if we hit something within 20 units.
TraceResult tr;
UTIL_TraceHull(
pev->origin,
pev->origin + VARS(pev->owner)->velocity.Normalize() * 20,
dont_ignore_monsters,
head_hull,
edict(),
&tr);
// Check to see if we are close enough to our target.
// In the case o a monster, attempt to get a pointer to
// the entity, gib it, release grappler fire.
edict_t* pHit = ENT(tr.pHit);
if ( pHit/* && (m_pTongueTip->pev->aiment == tr.pHit)*/)
{
// Get a pointer to the entity.
CBaseEntity* pEnt = GetClassPtr((CBaseEntity*)VARS(tr.pHit));
if (pEnt)
{
SetThink( &CGrapple::Attack );
pev->nextthink = gpGlobals->time + 1;
}
else
{
FireRelease();
}
}
}
#endif
return FALSE;
}
void CGrapple::Attack( void )
{
#ifndef CLIENT_DLL
ALERT(at_console, "Attack\n");
TraceResult tr;
UTIL_TraceHull(
pev->origin,
pev->origin + VARS(pev->owner)->velocity.Normalize() * 20,
dont_ignore_monsters,
head_hull,
edict(),
&tr);
UTIL_MakeVectors( m_pPlayer->pev->v_angle );
float flDamage = gSkillData.plrDmgGrapple;
if(g_pGameRules->IsMultiplayer())
flDamage *= 2;
ClearMultiDamage();
CBaseEntity::Instance( tr.pHit )->TraceAttack( m_pPlayer->pev, flDamage, gpGlobals->v_forward, &tr, DMG_CLUB | DMG_ALWAYSGIB );
ApplyMultiDamage( pev, m_pPlayer->pev );
#endif
}
Здесь я пытался выставить таймер для дамага.
Но получилось так, что grapple аттакует только через секунду после того, как я перестану жать пкм.
Почему? Что я не так сделал?
Отправлено master07 30-05-2017 в 16:09:
Lost_Gamer_ заведи таймер и не нужно использовать setthink. В место этого функцию атаки скинь в условие и возьми в новое условие. К примеру if(timer <= gpGlibals->time) и в нутри этого условие timer = gpGlobals->time + 1.0f
Отправлено Lost_Gamer_ 30-05-2017 в 16:14:
master07 Можно по-понятнее? Я нубоват еще.
Отправлено master07 30-05-2017 в 16:26:
Lost_Gamer_ Жду в ЛС. Чтобы не спамить.