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

📄 gameweapons.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:

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 + -