📄 clientmarksfx.cpp
字号:
// ----------------------------------------------------------------------- //
//
// MODULE : CClientMarkSFX.cpp
//
// PURPOSE : CClientMarkSFX - Implementation
//
// CREATED : 11/6/97
//
// ----------------------------------------------------------------------- //
#include "ClientMarkSFX.h"
#include "cpp_server_de.h"
#include "SFXMsgIds.h"
BEGIN_CLASS(CClientMarkSFX)
END_CLASS_DEFAULT_FLAGS(CClientMarkSFX, CClientSFX, NULL, NULL, CF_HIDDEN)
// ----------------------------------------------------------------------- //
//
// ROUTINE: CClientMarkSFX::EngineMessageFn
//
// PURPOSE: Handle engine messages
//
// ----------------------------------------------------------------------- //
DDWORD CClientMarkSFX::EngineMessageFn(DDWORD messageID, void *pData, DFLOAT lData)
{
CServerDE* pServerDE = GetServerDE();
if (!pServerDE) return 0;
switch(messageID)
{
case MID_INITIALUPDATE:
{
pServerDE->SetNextUpdate(m_hObject, 0.0001f);
}
break;
case MID_LINKBROKEN:
{
pServerDE->RemoveObject(m_hObject);
}
break;
default : break;
}
return CClientSFX::EngineMessageFn(messageID, pData, lData);
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CClientMarkSFX::Setup
//
// PURPOSE: Send message to client with data
//
// ----------------------------------------------------------------------- //
void CClientMarkSFX::Setup( DVector *pvPos, DVector *pvDir, DBYTE nWeaponType, DBYTE nAmmoType, SurfaceType eSurfType, HOBJECT hLinkObj)
{
CServerDE* pServerDE = GetServerDE();
if (!pServerDE) return;
DRotation rotation;
pServerDE->AlignRotation( &rotation, pvDir, pvDir );
HSTRING hstrSprite = DNULL;
char *pSprite = GetMarkSprite(nWeaponType, nAmmoType, eSurfType);
if (pSprite) hstrSprite = pServerDE->CreateString(pSprite);
DFLOAT fScale = (nAmmoType == AMMO_BULLET) ? 0.05f : 0.035f;
if (hstrSprite)
{
// DVector vColor;
// VEC_SET(vColor,0.0f,0.0f,0.0f);
HMESSAGEWRITE hMessage = pServerDE->StartSpecialEffectMessage(this);
pServerDE->WriteToMessageByte(hMessage, SFX_MARK_ID);
pServerDE->WriteToMessageRotation(hMessage, &rotation);
pServerDE->WriteToMessageFloat( hMessage, fScale );
pServerDE->WriteToMessageHString( hMessage, hstrSprite );
pServerDE->WriteToMessageByte(hMessage, DTRUE);
pServerDE->EndMessage(hMessage);
pServerDE->FreeString(hstrSprite);
}
if (hLinkObj)
{
pServerDE->CreateInterObjectLink(m_hObject, hLinkObj);
}
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CClientMarkSFX::GetMarkSprite()
//
// PURPOSE: Get a mark sprite associated with this weapon and surface
//
// ----------------------------------------------------------------------- //
char* CClientMarkSFX::GetMarkSprite(DBYTE nWeaponType, DBYTE nAmmoType, SurfaceType eSurfType)
{
if (!g_pServerDE) return DNULL;
char* pMark = DNULL;
// Don't place bullet holes for non-vector weapons...
switch(eSurfType)
{
case SURFTYPE_UNKNOWN:
break;
case SURFTYPE_GLASS:
pMark = g_pServerDE->IntRandom(0,1) ? "sprites/glshole1.spr" : "sprites/glshole2.spr";
break;
case SURFTYPE_METAL:
pMark = "sprites/blthole.spr";
break;
case SURFTYPE_PLASTIC:
case SURFTYPE_CLOTH:
pMark = "sprites/blthole2.spr";
break;
case SURFTYPE_WOOD:
pMark = "sprites/blthole5.spr";
break;
case SURFTYPE_STONE:
default:
pMark = g_pServerDE->IntRandom(0,1) ? "sprites/blthole3.spr" : "sprites/blthole4.spr";
break;
}
return pMark;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -