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

📄 gameweapons.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
					pServerDE->WriteToMessageObject(hMessage, ii.m_hObject);
					pServerDE->WriteToMessageVector(hMessage, &offset);
					pServerDE->WriteToMessageFloat(hMessage, 0.0f);
					pServerDE->WriteToMessageDWord(hMessage, 0);
					pServerDE->WriteToMessageDWord(hMessage, OBJFX_VOODOO_6);
					pServerDE->WriteToMessageDWord(hMessage, 0);

					pServerDE->EndMessage2(hMessage, MESSAGE_GUARANTEED | MESSAGE_NAGGLEFAST);
					//******************************************************************

					if(pServerDE->IsKindOf(hObjClass, hPlayer))
					{
		    			CPlayerObj *pHit = (CPlayerObj*)pServerDE->HandleToObject(ii.m_hObject);

						HMESSAGEWRITE hMsg = pServerDE->StartMessage(pHit->GetClient(), SMSG_WONKYVISION);
						pServerDE->WriteToMessageFloat(hMsg, fWonkyTime);
						pServerDE->WriteToMessageByte(hMsg, 0);	// bNoMove = DFALSE
						pServerDE->EndMessage2(hMsg, MESSAGE_GUARANTEED | MESSAGE_NAGGLE);
					}
				}
			}
		}

		pLink = pLink->m_pNext;
	}

	return bHitSomething;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CShotgun::Fire()
//
//	PURPOSE:	Fires the shotgun
//
// ----------------------------------------------------------------------- //

DDWORD CShotgun::Fire()
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE)
		return DFALSE;

	if (m_eState == WS_ALT_FIRING)
		m_bEjectShell = DTRUE;
	else
		m_bEjectShell = DFALSE;

	return CWeapon::Fire();
/*
	DVector vU, vR, vF;

	pServerDE->GetRotationVectors(&m_rRotation, &vU, &vR, &vF); 

	m_bPlayImpactSound = DFALSE;

	m_bEjectShell = DFALSE;

	// Fire two barrels
	if ((m_eState == WS_ALT_FIRING) && m_dwCurBarrel == BARREL_1)
	{
		DFLOAT newLastShotTime;
		DFLOAT oldLastShotTime = m_fLastShotTime;

		DDWORD dwRet = CWeapon::Fire();
		if (dwRet)
		{
			newLastShotTime = m_fLastShotTime;
			m_fLastShotTime = oldLastShotTime;

			m_bEjectShell = DTRUE;
			// Fire the 2nd barrel.
			dwRet = CWeapon::Fire();
			if (!dwRet)  // 2nd shot didn't go for some reason
			{
				m_fLastShotTime = newLastShotTime;
			}
			else
			{
				VEC_ADD(vR, vU, vR);
			}

			dwRet = 2;
			m_bLastFireAlt = DTRUE;
			m_dwCurBarrel = BARREL_1;
		}
		return dwRet;
	}
	else // Fire only one barrel
	{
		if (m_dwCurBarrel == BARREL_2)
			m_bEjectShell = DTRUE;

		DDWORD dwRet = CWeapon::Fire();
		if (dwRet)
		{
			if (m_dwCurBarrel == BARREL_2)
			{
				m_bLastFireAlt = DTRUE;
				m_dwCurBarrel = BARREL_1;

				VEC_ADD(vR, vU, vR);
			}
			else
			{
				m_bLastFireAlt = DFALSE;
				m_dwCurBarrel = BARREL_2;
			}
			return 1;
		}
		else
			return 0;
	}
*/
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CRGLauncher::FireProjectile()
//
//	PURPOSE:	Fires a projectile for the RGLauncher
//
// ----------------------------------------------------------------------- //

CProjectile* CNapalmCannon::FireProjectile(DVector *vFire, DFLOAT dist, DBOOL bAltFire)
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	CProjectile *pProject = CWeapon::FireProjectile(vFire, dist, bAltFire);

	// Primary fire has rocket projectiles, so turn off gravity
	if (!bAltFire)
	{
		DDWORD dwFlags = pServerDE->GetObjectFlags(pProject->m_hObject);
		dwFlags &= ~FLAG_GRAVITY;
		pProject->SetFlags(dwFlags);
	}
	return pProject;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CDeathRay::CDeathRay()
//
//	PURPOSE:	Constructor
//
// ----------------------------------------------------------------------- //

CDeathRay::CDeathRay() : CWeapon(WEAP_DEATHRAY)
{
	m_nFlags = FLAG_ENVIRONMENTMAP;
	m_fChromeValue = 0.05f;
	m_fLastDamageTime = 0.0f;
	m_pRotModel = DNULL;

	ObjectCreateStruct ocStruct;
	INIT_OBJECTCREATESTRUCT(ocStruct);

	ocStruct.m_ObjectType = OT_NORMAL; 
	ocStruct.m_Flags = FLAG_FORCECLIENTUPDATE;

	HCLASS hClass = g_pServerDE->GetClass("BaseClass");
	m_pRotModel = (BaseClass*)g_pServerDE->CreateObject(hClass, &ocStruct);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CDeathRay::~CDeathRay()
//
//	PURPOSE:	Destructor
//
// ----------------------------------------------------------------------- //

CDeathRay::~CDeathRay()
{
	if(m_pRotModel)
	{
		delete m_pRotModel;
		m_pRotModel = DNULL;
	}
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CDeathRay::Fire()
//
//	PURPOSE:	Fires the rings o' death
//
// ----------------------------------------------------------------------- //

DDWORD CDeathRay::Fire()
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if(!pServerDE)	return 0;

	if(m_eState == WS_ALT_FIRING)
	{
		DVector		vPos;
		DRotation	rRot;

		pServerDE->GetObjectPos(m_hOwner, &vPos);

		if(IsOwnerAPlayer())
		{
   			CPlayerObj	*pObj = (CPlayerObj*)pServerDE->HandleToObject(m_hOwner);
			DFLOAT		fEyeLevel = pObj->GetEyeLevel();
			vPos.y += fEyeLevel;
			pObj->GetPlayerRotation(&rRot);
		}
		else
			pServerDE->GetObjectRotation(m_hOwner, &rRot);

		pServerDE->SetObjectPos(m_pRotModel->m_hObject, &vPos);
		pServerDE->SetObjectRotation(m_pRotModel->m_hObject, &rRot);

		// Create a client side effect around the projectile
		DVector		offset;
		VEC_SET(offset, m_vFlash.y, m_vFlash.x, m_vFlash.z);

		HMESSAGEWRITE hMessage = pServerDE->StartInstantSpecialEffectMessage(&offset);
		pServerDE->WriteToMessageByte(hMessage, SFX_OBJECTFX_ID);

		pServerDE->WriteToMessageObject(hMessage, m_pRotModel->m_hObject);
		pServerDE->WriteToMessageVector(hMessage, &offset);
		pServerDE->WriteToMessageFloat(hMessage, 0.0f);
		pServerDE->WriteToMessageDWord(hMessage, 0);
		pServerDE->WriteToMessageDWord(hMessage, OBJFX_DEATHRAY_RING_1);
		pServerDE->WriteToMessageDWord(hMessage, 0);

		pServerDE->EndMessage2(hMessage, MESSAGE_GUARANTEED | MESSAGE_NAGGLEFAST);

		hMessage = pServerDE->StartInstantSpecialEffectMessage(&offset);
		pServerDE->WriteToMessageByte(hMessage, SFX_OBJECTFX_ID);

		pServerDE->WriteToMessageObject(hMessage, m_pRotModel->m_hObject);
		pServerDE->WriteToMessageVector(hMessage, &offset);
		pServerDE->WriteToMessageFloat(hMessage, 0.0f);
		pServerDE->WriteToMessageDWord(hMessage, 0);
		pServerDE->WriteToMessageDWord(hMessage, OBJFX_DEATHRAY_RING_2);
		pServerDE->WriteToMessageDWord(hMessage, 0);

		pServerDE->EndMessage2(hMessage, MESSAGE_GUARANTEED | MESSAGE_NAGGLEFAST);

		DamageObjectsInFOV(DEATHRAY_BEAM_DIST, DEATHRAY_BEAM_FOV);
	}

	return CWeapon::Fire();
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CDeathRay::DamageObjectsInFOV()
//
//	PURPOSE:	Damages every destructable object in the FOV at a short range
//
// ----------------------------------------------------------------------- //

void CDeathRay::DamageObjectsInFOV(DFLOAT fRange, DFLOAT fFOV)
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE)	return;

	// Get the head of the list of destructable objects
	DLink*	pLink = CDestructable::m_DestructableHead.m_pNext;
	if(!pLink || (pLink == &CDestructable::m_DestructableHead))	return;

	HOBJECT		hObj;

	// Get a forward vector and position of the player who shot the death ray
   	CPlayerObj	*pObj = (CPlayerObj*)pServerDE->HandleToObject(m_hOwner);
	DVector		vOwnerF, vOwnerPos;
	pObj->GetPlayerForward(&vOwnerF);
	pServerDE->GetObjectPos(m_hOwner, &vOwnerPos);
	VEC_NORM(vOwnerF);

	// Go through the list of destructable objects and look for people within your FOV
	while(pLink != &CDestructable::m_DestructableHead)
	{
		hObj = ((CDestructable*)pLink->m_pData)->GetObject();
		if(!hObj)	break;

		DVector		vObjPos, vDir;
		DFLOAT		fDist, fAngle;

		// If it's us... skip to the next in the list
		if(hObj == m_hOwner)
			{ pLink = pLink->m_pNext; continue; }

		// Test the angle between this object and us
		pServerDE->GetObjectPos(hObj, &vObjPos);
		VEC_SUB(vDir, vObjPos, vOwnerPos);
		fDist = VEC_MAG(vDir);

		// If the target is too far away... skip it
		if(fDist > fRange)
			{ pLink = pLink->m_pNext; continue; }

		VEC_NORM(vDir);
		fAngle = VEC_DOT(vDir, vOwnerF);

		// If the target isn't within our square FOV, then skip it
		if(fAngle < fFOV)
			{ pLink = pLink->m_pNext; continue; }

		// Make sure there's nothing blocking our view of the character
		IntersectQuery iq;
		IntersectInfo  ii;

		VEC_COPY(iq.m_From, vOwnerPos);
		VEC_COPY(iq.m_To, vObjPos);
		VEC_MULSCALAR(vDir, vDir, 15.0f);
		VEC_ADD(iq.m_To, iq.m_To, vDir);

		iq.m_Flags = INTERSECT_OBJECTS | IGNORE_NONSOLID;
		iq.m_FilterFn = LiquidFilterFn;
		iq.m_pUserData = NULL;	

		if(pServerDE->IntersectSegment(&iq, &ii))
		{
			if(ii.m_hObject == hObj)
			{
				VEC_NORM(vDir);

				m_nDamageType = DAMAGE_TYPE_ELECTRIC;
				SendDamageMsg(ii.m_hObject, ii.m_Point, &vDir, m_fDamage);

				//******************************************************************
				// Create a particle effect around the hit character
				DVector		offset;
				VEC_SET(offset, 0.0f, 0.0f, 0.0f);

				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_ELECTRIC_1);
				pServerDE->WriteToMessageDWord(hMessage, 0);

				pServerDE->EndMessage2(hMessage, MESSAGE_GUARANTEED | MESSAGE_NAGGLEFAST);
				//******************************************************************
			}
		}

		pLink = pLink->m_pNext;
	}
}

#ifdef _ADD_ON

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CFlayer::FireProjectile()
//
//	PURPOSE:	Fires the weapon
//
// ----------------------------------------------------------------------- //

CProjectile* CFlayer::FireProjectile(DVector *vFire, DFLOAT dist, DBOOL bAltFire)
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE)		return 0;

/*	DVector		vNormal;
	DDWORD		dwExpType = EXP_FLAYER_PRIMARY;

	VEC_SET(vNormal, 0.0f, 1.0f, 0.0f);

	if(bAltFire)
		dwExpType = EXP_FLAYER_ALT;

	// Create a little explosion effect at the source
	HMESSAGEWRITE hMessage = pServerDE->StartInstantSpecialEffectMessage(&m_vPosition);
	pServerDE->WriteToMessageByte(hMessage, SFX_EXPLOSIONFX_ID);

	pServerDE->WriteToMessageVector(hMessage, &m_vPosition);
	pServerDE->WriteToMessageVector(hMessage, &vNormal);
	pServerDE->WriteToMessageDWord(hMessage, dwExpType);

	pServerDE->EndMessage2(hMessage, MESSAGE_GUARANTEED | MESSAGE_NAGGLEFAST);
*/
	return CWeapon::FireProjectile(vFire, dist, bAltFire);
}


#endif

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CTeslaCannon::Fire()
//
//	PURPOSE:	Fires the weapon
//
// ----------------------------------------------------------------------- //

DDWORD CTeslaCannon::Fire()
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE)		return 0;

	if(m_eState == WS_ALT_FIRING)
	{
		numAltFires++;

		if(numAltFires == 2)
			m_szAltProjectileClass = "CTeslaBallProjectile";
		else
			m_szAltProjectileClass = "CTeslaBoltProjectile";
	}

	return CWeapon::Fire();
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CTeslaCannon::FireProjectile()
//
//	PURPOSE:	Fires the weapon
//
// ----------------------------------------------------------------------- //

CProjectile* CTeslaCannon::FireProjectile(DVector *vFire, DFLOAT dist, DBOOL bAltFire)
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE)		return 0;

	if(bAltFire)
	{
		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); }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -