📄 gameweapons.cpp
字号:
// Create the client side lightning effect
HMESSAGEWRITE hMessage = pServerDE->StartInstantSpecialEffectMessage(&(iq.m_From));
pServerDE->WriteToMessageByte(hMessage, SFX_LIGHTNING_ID);
pServerDE->WriteToMessageVector(hMessage, &(iq.m_From));
pServerDE->WriteToMessageVector(hMessage, &vDest);
pServerDE->WriteToMessageByte(hMessage, LIGHTNING_SHAPE_BOXED);
pServerDE->WriteToMessageByte(hMessage, LIGHTNING_FORM_THIN2THIN);
pServerDE->WriteToMessageByte(hMessage, LIGHTNING_TYPE_HIGHSEG);
pServerDE->EndMessage2(hMessage, MESSAGE_GUARANTEED | MESSAGE_NAGGLEFAST);
}
return CWeapon::FireProjectile(vFire, dist, bAltFire);
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CSingularity::FireProjectile()
//
// PURPOSE: Fires the weapon
//
// ----------------------------------------------------------------------- //
CProjectile* CSingularity::FireProjectile(DVector *vFire, DFLOAT dist, DBOOL bAltFire)
{
CServerDE* pServerDE = BaseClass::GetServerDE();
if (!pServerDE) return 0;
IntersectQuery iq;
IntersectInfo ii;
DVector vDist, vDest;
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);
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_BLUE_LARGE);
pServerDE->EndMessage2(hMessage, MESSAGE_GUARANTEED | MESSAGE_NAGGLEFAST);
return CWeapon::FireProjectile(vFire, dist, bAltFire);
}
#ifndef _DEMO
// ----------------------------------------------------------------------- //
//
// ROUTINE: CWeapProximityBomb::FireProjectile()
//
// PURPOSE: Fires a projectile
//
// ----------------------------------------------------------------------- //
CProjectile* CWeapProximityBomb::FireProjectile(DVector *vFire, DFLOAT dist, DBOOL bAltFire)
{
CServerDE* pServerDE = BaseClass::GetServerDE();
if (!pServerDE) return DNULL;
CProjectile *pProject = 0;
// If we held onto the bomb too long and it should explode in our hand
if(!m_fProjVelocity)
{
DVector vPos, vNormal;
VEC_SET(vNormal, 0.0f, 1.0f, 0.0f);
pServerDE->GetObjectPos(m_hOwner, &vPos);
// Show a little explosion
HMESSAGEWRITE hMessage = pServerDE->StartInstantSpecialEffectMessage(&vPos);
pServerDE->WriteToMessageByte(hMessage, SFX_EXPLOSIONFX_ID);
pServerDE->WriteToMessageVector(hMessage, &vPos);
pServerDE->WriteToMessageVector(hMessage, &vNormal);
pServerDE->WriteToMessageDWord(hMessage, EXP_DEFAULT_SMALL);
pServerDE->EndMessage2(hMessage, MESSAGE_GUARANTEED | MESSAGE_NAGGLEFAST);
// Play an explosion sound
PlaySoundFromPos(&vPos, "Sounds\\Weapons\\time\\explode.wav", 1000.0f, SOUNDPRIORITY_MISC_MEDIUM);
// Damage yourself
SendDamageMsg(m_hOwner, vPos, &vNormal, m_fDamage);
return DNULL;
}
if( bAltFire )
{
pServerDE->GetObjectPos(m_hOwner, &m_vPosition);
vFire->x = 0.0f;
vFire->y = -1.0f;
vFire->z = 0.0f;
pProject = CWeapon::FireProjectile(vFire, dist, DTRUE);
}
else
pProject = CWeapon::FireProjectile(vFire, dist, DFALSE);
if(m_pInventoryMgr && !m_pInventoryMgr->GetAmmoCount(GetAmmoType(bAltFire)))
m_pInventoryMgr->SelectNextWeapon();
return pProject;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CWeapRemoteBomb::FireProjectile()
//
// PURPOSE: Fires a projectile
//
// ----------------------------------------------------------------------- //
CProjectile* CWeapRemoteBomb::FireProjectile(DVector *vFire, DFLOAT dist, DBOOL bAltFire)
{
CServerDE* pServerDE = BaseClass::GetServerDE();
CProjectile *pProject = 0;
// If we held onto the bomb too long and it should explode in our hand
/* if(!m_fProjVelocity)
{
DVector vPos, vNormal;
VEC_SET(vNormal, 0.0f, 1.0f, 0.0f);
pServerDE->GetObjectPos(m_hOwner, &vPos);
// Show a little explosion
HMESSAGEWRITE hMessage = pServerDE->StartInstantSpecialEffectMessage(&vPos);
pServerDE->WriteToMessageByte(hMessage, SFX_EXPLOSIONFX_ID);
pServerDE->WriteToMessageVector(hMessage, &vPos);
pServerDE->WriteToMessageVector(hMessage, &vNormal);
pServerDE->WriteToMessageDWord(hMessage, EXP_DEFAULT_SMALL);
pServerDE->EndMessage2(hMessage, MESSAGE_GUARANTEED | MESSAGE_NAGGLEFAST);
// Play an explosion sound
PlaySoundFromPos(&vPos, "Sounds\\Weapons\\time\\explode.wav", 1000.0f, SOUNDPRIORITY_MISC_MEDIUM);
// Damage yourself
SendDamageMsg(m_hOwner, vPos, &vNormal, m_fDamage);
return DNULL;
}
*/
if( bAltFire )
{
pServerDE->GetObjectPos(m_hOwner, &m_vPosition);
vFire->x = 0.0f;
vFire->y = -1.0f;
vFire->z = 0.0f;
pProject = CWeapon::FireProjectile(vFire, dist, DTRUE);
}
else
pProject = CWeapon::FireProjectile(vFire, dist, DFALSE);
if(IsOwnerAPlayer())
{
CPlayerObj *pObj = (CPlayerObj*)pServerDE->HandleToObject(m_hOwner);
if(pObj)
pObj->AddRemoteBomb(pProject);
}
if(m_pInventoryMgr && !m_pInventoryMgr->GetAmmoCount(GetAmmoType(bAltFire)))
m_pInventoryMgr->SelectNextWeapon();
return pProject;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CWeapTimeBomb::FireProjectile()
//
// PURPOSE: Fires a projectile
//
// ----------------------------------------------------------------------- //
CProjectile* CWeapTimeBomb::FireProjectile(DVector *vFire, DFLOAT dist, DBOOL bAltFire)
{
CServerDE* pServerDE = BaseClass::GetServerDE();
if (!pServerDE) return DNULL;
CProjectile *pProject = 0;
// If we held onto the bomb too long and it should explode in our hand
if(!m_fProjVelocity)
{
DVector vPos, vNormal;
VEC_SET(vNormal, 0.0f, 1.0f, 0.0f);
pServerDE->GetObjectPos(m_hOwner, &vPos);
// Show a little explosion
HMESSAGEWRITE hMessage = pServerDE->StartInstantSpecialEffectMessage(&vPos);
pServerDE->WriteToMessageByte(hMessage, SFX_EXPLOSIONFX_ID);
pServerDE->WriteToMessageVector(hMessage, &vPos);
pServerDE->WriteToMessageVector(hMessage, &vNormal);
pServerDE->WriteToMessageDWord(hMessage, EXP_DEFAULT_SMALL);
pServerDE->EndMessage2(hMessage, MESSAGE_GUARANTEED | MESSAGE_NAGGLEFAST);
// Play an explosion sound
PlaySoundFromPos(&vPos, "Sounds\\Weapons\\time\\explode.wav", 1000.0f, SOUNDPRIORITY_MISC_MEDIUM);
// Damage yourself
SendDamageMsg(m_hOwner, vPos, &vNormal, m_fDamage);
return DNULL;
}
if( bAltFire )
{
pServerDE->GetObjectPos(m_hOwner, &m_vPosition);
vFire->x = 0.0f;
vFire->y = -1.0f;
vFire->z = 0.0f;
pProject = CWeapon::FireProjectile(vFire, dist, DTRUE);
}
else
pProject = CWeapon::FireProjectile(vFire, dist, DFALSE);
if(m_pInventoryMgr && !m_pInventoryMgr->GetAmmoCount(GetAmmoType(bAltFire)))
m_pInventoryMgr->SelectNextWeapon();
return pProject;
}
#endif // _DEMO
// ----------------------------------------------------------------------- //
//
// ROUTINE: CDrudgeLightning::FireVector()
//
// PURPOSE: Fires a vector
//
// ----------------------------------------------------------------------- //
DBOOL CDrudgeLightning::FireVector(DVector *vFire, DFLOAT dist, DBOOL bTracer)
{
CServerDE* pServerDE = BaseClass::GetServerDE();
if (!pServerDE) return DFALSE;
IntersectQuery iq;
IntersectInfo ii;
DVector vDist, vDest;
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);
if(pServerDE->IntersectSegment(&iq, &ii))
{ VEC_COPY(vDest, ii.m_Point); }
else
{ VEC_COPY(vDest, iq.m_To); }
// Create the client side lightning effect
HMESSAGEWRITE hMessage = pServerDE->StartInstantSpecialEffectMessage(&(iq.m_From));
pServerDE->WriteToMessageByte(hMessage, SFX_LIGHTNING_ID);
pServerDE->WriteToMessageVector(hMessage, &(iq.m_From));
pServerDE->WriteToMessageVector(hMessage, &vDest);
pServerDE->WriteToMessageByte(hMessage, LIGHTNING_SHAPE_BOXED);
pServerDE->WriteToMessageByte(hMessage, LIGHTNING_FORM_THIN2THIN);
pServerDE->WriteToMessageByte(hMessage, LIGHTNING_TYPE_HIGHSEG);
pServerDE->EndMessage2(hMessage, MESSAGE_GUARANTEED | MESSAGE_NAGGLEFAST);
return CWeapon::FireVector(vFire, dist, bTracer);
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CDeathShroudZap::CDeathShroudZap()
//
// PURPOSE: Constructor
//
// ----------------------------------------------------------------------- //
CDeathShroudZap::CDeathShroudZap() : CWeapon(WEAP_DEATHSHROUD_ZAP)
{
CServerDE* pServerDE = BaseClass::GetServerDE();
if (!pServerDE) return;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CDeathShroudZap::Fire()
//
// PURPOSE: Fires the Death Shroud's nasty 'zap'
//
// ----------------------------------------------------------------------- //
DDWORD CDeathShroudZap::Fire()
{
CServerDE* pServerDE = BaseClass::GetServerDE();
if (!pServerDE) return 0;
return CWeapon::Fire();
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CDeathShroudZap::FireVector()
//
// PURPOSE: Fires a vector
//
// ----------------------------------------------------------------------- //
DBOOL CDeathShroudZap::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 hCorpse = pServerDE->GetClass("CCorpse");
HCLASS hObjClass = DNULL;
// Did we hit something?
if(pServerDE->IntersectSegment(&iq, &ii))
{
// Was it an object?
if (ii.m_hObject)
{
hObjClass = pServerDE->GetObjectClass(ii.m_hObject);
// Was it something this spell affects?
if(pServerDE->IsKindOf(hObjClass, hCharacter) || pServerDE->IsKindOf(hObjClass, hPlayer) || pServerDE->IsKindOf(hObjClass, hCorpse))
{
DVector vPos, vNormal;
pServerDE->GetObjectPos(ii.m_hObject,&vPos);
VEC_COPY(vNormal, ii.m_Plane.m_Normal);
// Show a little 'flame' explosion
HMESSAGEWRITE hMessage = pServerDE->StartInstantSpecialEffectMessage(&vPos);
pServerDE->WriteToMessageByte(hMessage, SFX_EXPLOSIONFX_ID);
pServerDE->WriteToMessageVector(hMessage, &vPos);
pServerDE->WriteToMessageVector(hMessage, &vNormal);
pServerDE->WriteToMessageDWord(hMessage, EXP_FLAME_SMALL);
pServerDE->EndMessage2(hMessage, MESSAGE_GUARANTEED | MESSAGE_NAGGLEFAST);
}
}
}
// Pass down to normal vector damage-calculation
return CWeapon::FireVector(vFire, dist, bTracer);
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CZealotHeal::CZealotHeal()
//
// PURPOSE: Constructor
//
// ----------------------------------------------------------------------- //
CZealotHeal::CZealotHeal() : CWeapon(WEAP_ZEALOT_HEAL)
{
CServerDE* pServerDE = BaseClass::GetServerDE();
if (!pServerDE) return;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CZealotHeal::Fire()
//
// PURPOSE: Fires the Zealot's Heal Spell
//
// ----------------------------------------------------------------------- //
DDWORD CZealotHeal::Fire()
{
CServerDE* pServerDE = BaseClass::GetServerDE();
if (!pServerDE) return 0;
return CWeapon::Fire();
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CZealotHeal::FireVector()
//
// PURPOSE: Fires a vector
//
// ----------------------------------------------------------------------- //
DBOOL CZealotHeal::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_HEAL_1);
pServerDE->WriteToMessageDWord(hMessage, 0);
pServerDE->EndMessage2(hMessage, MESSAGE_GUARANTEED | MESSAGE_NAGGLEFAST);
return DTRUE;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CZealotShield::CZealotShield()
//
// PURPOSE: Constructor
//
// ----------------------------------------------------------------------- //
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -