⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gameweapons.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		// 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 + -