📄 gameweapons.cpp
字号:
CZealotShield::CZealotShield() : CWeapon(WEAP_ZEALOT_SHIELD)
{
CServerDE* pServerDE = BaseClass::GetServerDE();
if (!pServerDE) return;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CZealotShield::Fire()
//
// PURPOSE: Fires the Zealot's Heal Spell
//
// ----------------------------------------------------------------------- //
DDWORD CZealotShield::Fire()
{
CServerDE* pServerDE = BaseClass::GetServerDE();
if (!pServerDE) return 0;
return CWeapon::Fire();
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CZealotShield::FireVector()
//
// PURPOSE: Fires a vector
//
// ----------------------------------------------------------------------- //
DBOOL CZealotShield::FireVector(DVector *vFire, DFLOAT dist, DBOOL bTracer)
{
CServerDE* pServerDE = BaseClass::GetServerDE();
if (!pServerDE) return DFALSE;
IntersectQuery iq;
IntersectInfo ii;
DVector vDist;
iq.m_Flags = INTERSECT_OBJECTS | IGNORE_NONSOLID;
iq.m_FilterFn = DNULL;
iq.m_pUserData = DNULL;
VEC_COPY(iq.m_From, m_vPosition);
VEC_COPY(iq.m_To, m_vPosition);
VEC_MULSCALAR(vDist, *vFire, dist);
VEC_ADD(iq.m_To, iq.m_To, vDist);
HCLASS hCharacter = pServerDE->GetClass("CBaseCharacter");
HCLASS hPlayer = pServerDE->GetClass("CPlayerObj");
HCLASS hObjClass = DNULL;
// Check intersection
if(pServerDE->IntersectSegment(&iq, &ii))
{
// Did we hit an object?
if (ii.m_hObject)
{
// What is the object?
hObjClass = pServerDE->GetObjectClass(ii.m_hObject);
// Is it a player or character?
if(pServerDE->IsKindOf(hObjClass, hCharacter) || pServerDE->IsKindOf(hObjClass, hPlayer))
{
DVector offset;
VEC_SET(offset, 0.0f, 0.0f, 0.0f);
// Display the 'heal' effect.
HMESSAGEWRITE hMessage = pServerDE->StartInstantSpecialEffectMessage(&offset);
pServerDE->WriteToMessageByte(hMessage, SFX_OBJECTFX_ID);
pServerDE->WriteToMessageObject(hMessage, ii.m_hObject);
pServerDE->WriteToMessageVector(hMessage, &offset);
pServerDE->WriteToMessageFloat(hMessage, 0.0f);
pServerDE->WriteToMessageDWord(hMessage, 0);
pServerDE->WriteToMessageDWord(hMessage, OBJFX_SHIELD_1);
pServerDE->WriteToMessageDWord(hMessage, 0);
pServerDE->EndMessage2(hMessage, MESSAGE_GUARANTEED | MESSAGE_NAGGLEFAST);
}
return DTRUE;
}
}
return DFALSE;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CShikariSpit::Fire()
//
// PURPOSE: Fires the weapon
//
// ----------------------------------------------------------------------- //
DDWORD CShikariSpit::Fire()
{
CServerDE* pServerDE = BaseClass::GetServerDE();
if (!pServerDE)
return 0;
return CWeapon::Fire();
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CShikariSpit::FireProjectile()
//
// PURPOSE: Fires the weapon
//
// ----------------------------------------------------------------------- //
CProjectile *CShikariSpit::FireProjectile(DVector *vFire, DFLOAT dist, DBOOL bAltFire)
{
CServerDE* pServerDE = BaseClass::GetServerDE();
CProjectile *pProject = CWeapon::FireProjectile(vFire, dist, bAltFire);
DDWORD dwFlags = pServerDE->GetObjectFlags(pProject->m_hObject);
dwFlags &= ~FLAG_GRAVITY;
pProject->SetFlags(dwFlags);
return pProject;
}
DBOOL IgnoreTypeFilterFn(HOBJECT hObj, void *pUserData)
{
if (!hObj || !g_pServerDE) return DFALSE;
DBOOL bKeep = DTRUE;
HCLASS hTest = (*((HCLASS *)(pUserData)));
HCLASS hClass = g_pServerDE->GetObjectClass(hObj);
if (g_pServerDE->IsKindOf(hClass,hTest))
bKeep = DFALSE;
return bKeep;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CNagaEyes::FireVector()
//
// PURPOSE: Fires the weapon
//
// ----------------------------------------------------------------------- //
DBOOL CNagaEyes::FireVector(DVector *vFire, DFLOAT dist, DBOOL bTracer)
{
CServerDE* pServerDE = BaseClass::GetServerDE();
if (!pServerDE) return 0;
IntersectQuery iq;
IntersectInfo ii;
DVector vDist, vDest;
HCLASS hClass;
hClass = pServerDE->GetObjectClass(m_hOwner);
iq.m_Flags = INTERSECT_OBJECTS | IGNORE_NONSOLID;
iq.m_FilterFn = IgnoreTypeFilterFn;
iq.m_pUserData = (void *)&hClass;
VEC_COPY(iq.m_From, m_vPosition);
VEC_COPY(iq.m_To, m_vPosition);
VEC_MULSCALAR(vDist, *vFire, dist)
VEC_ADD(iq.m_To, iq.m_To, vDist);
if(pServerDE->IntersectSegment(&iq, &ii))
{ VEC_COPY(vDest, ii.m_Point); }
else
{ VEC_COPY(vDest, iq.m_To); }
// Create the client side laser effect
HMESSAGEWRITE hMessage = pServerDE->StartInstantSpecialEffectMessage(&(iq.m_From));
pServerDE->WriteToMessageByte(hMessage, SFX_LASERBEAM_ID);
pServerDE->WriteToMessageVector(hMessage, &m_vPosition);
pServerDE->WriteToMessageVector(hMessage, &vDest);
pServerDE->WriteToMessageByte(hMessage, LASER_RED_SMALL);
pServerDE->EndMessage2(hMessage, MESSAGE_GUARANTEED | MESSAGE_NAGGLEFAST);
// Create the impact effect
DDWORD nType = EXP_NAGA_EYE_BEAM;
hMessage = pServerDE->StartInstantSpecialEffectMessage(&vDest);
pServerDE->WriteToMessageByte(hMessage, SFX_EXPLOSIONFX_ID);
pServerDE->WriteToMessageVector(hMessage, &vDest);
pServerDE->WriteToMessageVector(hMessage, &vDest);
pServerDE->WriteToMessageDWord(hMessage, nType);
pServerDE->EndMessage2(hMessage, MESSAGE_GUARANTEED | MESSAGE_NAGGLEFAST);
return CWeapon::FireVector(vFire, dist, bTracer);
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CNagaSpike::Fire()
//
// PURPOSE: Fires the weapon
//
// ----------------------------------------------------------------------- //
DDWORD CNagaSpike::Fire()
{
CServerDE* pServerDE = BaseClass::GetServerDE();
if (!pServerDE)
return 0;
HCLASS hObjClass = pServerDE->GetObjectClass(m_hOwner);
if(pServerDE->IsKindOf(hObjClass, pServerDE->GetClass("Gideon")))
m_szFireSound = "sounds\\enemies\\gideon\\eyelaser.wav";
return CWeapon::Fire();
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CNagaSpike::FireProjectile()
//
// PURPOSE: Fires the weapon
//
// ----------------------------------------------------------------------- //
CProjectile *CNagaSpike::FireProjectile(DVector *vFire, DFLOAT dist, DBOOL bAltFire)
{
CServerDE* pServerDE = BaseClass::GetServerDE();
CProjectile *pProject = CWeapon::FireProjectile(vFire, dist, bAltFire);
DDWORD dwFlags = pServerDE->GetObjectFlags(pProject->m_hObject);
dwFlags &= ~FLAG_GRAVITY;
pProject->SetFlags(dwFlags);
return pProject;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CNagaDebris::Fire()
//
// PURPOSE: Fires the weapon
//
// ----------------------------------------------------------------------- //
DDWORD CNagaDebris::Fire()
{
CServerDE* pServerDE = BaseClass::GetServerDE();
if (!pServerDE)
return 0;
return CWeapon::Fire();
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CNagaDebris::FireProjectile()
//
// PURPOSE: Fires the weapon
//
// ----------------------------------------------------------------------- //
CProjectile *CNagaDebris::FireProjectile(DVector *vFire, DFLOAT dist, DBOOL bAltFire)
{
CServerDE* pServerDE = BaseClass::GetServerDE();
CProjectile *pProject = CWeapon::FireProjectile(vFire, dist, bAltFire);
DDWORD dwFlags = pServerDE->GetObjectFlags(pProject->m_hObject);
dwFlags &= ~FLAG_GRAVITY;
pProject->SetFlags(dwFlags);
return pProject;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CGideonShield::CGideonShield()
//
// PURPOSE: Constructor
//
// ----------------------------------------------------------------------- //
CGideonShield::CGideonShield() : CWeapon(WEAP_GIDEON_SHIELD)
{
CServerDE* pServerDE = BaseClass::GetServerDE();
if (!pServerDE) return;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CGideonShield::Fire()
//
// PURPOSE: Fires the Zealot's Heal Spell
//
// ----------------------------------------------------------------------- //
DDWORD CGideonShield::Fire()
{
CServerDE* pServerDE = BaseClass::GetServerDE();
if (!pServerDE) return 0;
return CWeapon::Fire();
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CGideonShield::FireVector()
//
// PURPOSE: Fires a vector
//
// ----------------------------------------------------------------------- //
DBOOL CGideonShield::FireVector(DVector *vFire, DFLOAT dist, DBOOL bTracer)
{
CServerDE* pServerDE = BaseClass::GetServerDE();
if (!pServerDE) return DFALSE;
DVector offset;
VEC_SET(offset, 0.0f, 0.0f, 0.0f);
// Display the 'heal' effect.
HMESSAGEWRITE hMessage = pServerDE->StartInstantSpecialEffectMessage(&offset);
pServerDE->WriteToMessageByte(hMessage, SFX_OBJECTFX_ID);
pServerDE->WriteToMessageObject(hMessage, m_hOwner);
pServerDE->WriteToMessageVector(hMessage, &offset);
pServerDE->WriteToMessageFloat(hMessage, 0.0f);
pServerDE->WriteToMessageDWord(hMessage, 0);
pServerDE->WriteToMessageDWord(hMessage, OBJFX_SHIELD_1);
pServerDE->WriteToMessageDWord(hMessage, 0);
pServerDE->EndMessage2(hMessage, MESSAGE_GUARANTEED | MESSAGE_NAGGLEFAST);
return DTRUE;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CGideonWind::CGideonWind()
//
// PURPOSE: Constructor
//
// ----------------------------------------------------------------------- //
CGideonWind::CGideonWind() : CWeapon(WEAP_GIDEON_WIND)
{
CServerDE* pServerDE = BaseClass::GetServerDE();
if (!pServerDE) return;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CGideonWind::Fire()
//
// PURPOSE: Fires the Zealot's Heal Spell
//
// ----------------------------------------------------------------------- //
DDWORD CGideonWind::Fire()
{
CServerDE* pServerDE = BaseClass::GetServerDE();
if (!pServerDE) return 0;
return CWeapon::Fire();
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CGideonWind::FireVector()
//
// PURPOSE: Fires a vector
//
// ----------------------------------------------------------------------- //
DBOOL CGideonWind::FireVector(DVector *vFire, DFLOAT dist, DBOOL bTracer)
{
CServerDE* pServerDE = BaseClass::GetServerDE();
if (!pServerDE) return DFALSE;
DVector vPos;
pServerDE->GetObjectPos(m_hOwner,&vPos);
ObjectList *ol = pServerDE->FindObjectsTouchingSphere(&vPos, 1200.0f);
if(ol)
{
DVector vObjPos, vObjVel, vUp;
ObjectLink* pLink = ol->m_pFirstLink;
DFLOAT mag;
HOBJECT hObj;
short objType;
DDWORD dwUserFlags;
VEC_SET(vUp, 0.0f, 1.0f, 0.0f);
while(pLink)
{
hObj = pLink->m_hObject;
pLink = pLink->m_pNext;
objType = pServerDE->GetObjectType(hObj);
dwUserFlags = pServerDE->GetObjectUserFlags(hObj);
if(hObj == m_hOwner) continue;
if((objType != OT_MODEL) || !(dwUserFlags & USRFLG_SINGULARITY_ATTRACT)) continue;
// if(!pServerDE->IsKindOf(pServerDE->GetObjectClass(hObj), pServerDE->GetClass("CBaseCharacter"))) continue;
// Get the information about the obj
pServerDE->GetObjectPos(hObj, &vObjPos);
pServerDE->GetVelocity(hObj, &vObjVel);
VEC_SUB(vObjPos, vObjPos, vPos);
mag = 1200.0f - VEC_MAG(vObjPos);
if(mag < 0.0f) mag = 0.0f;
VEC_NORM(vObjPos);
VEC_MULSCALAR(vObjPos, vObjPos, mag * 7.5f);
pServerDE->GetGlobalForce(&vUp);
VEC_MULSCALAR(vUp, vUp, -0.25f);
VEC_ADD(vObjVel, vObjVel, vUp);
VEC_ADD(vObjVel, vObjVel, vObjPos);
pServerDE->SetVelocity(hObj, &vObjVel);
}
pServerDE->RelinquishList(ol);
}
return DTRUE;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CVomit::Fire()
//
// PURPOSE: Fires the weapon
//
// ----------------------------------------------------------------------- //
DDWORD CVomit::Fire()
{
CServerDE* pServerDE = BaseClass::GetServerDE();
if (!pServerDE)
return 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -