📄 engineobjects.c
字号:
#include "serverobj_de.h"
#include "engineobjects_de.h"
void bc_AddAggregate(LPBASECLASS pObject, LPAGGREGATE pAggregate)
{
pAggregate->m_pNextAggregate = pObject->m_pFirstAggregate;
pObject->m_pFirstAggregate = pAggregate;
}
DDWORD bc_EngineMessageFn(LPBASECLASS pObject, DDWORD messageID, void *pData, float fData)
{
LPAGGREGATE pAggregate;
ObjectCreateStruct *pStruct;
GenericProp genProp;
// Handle ReadProp.
switch(messageID)
{
case MID_PRECREATE:
{
// Get the props.
if( fData == 1.0f || fData == 2.0f )
{
pStruct = (ObjectCreateStruct*)pData;
if( g_pServerDE->GetPropGeneric( "Name", &genProp ) == DE_OK )
{
SAFE_STRCPY(pStruct->m_Name, genProp.m_String);
pStruct->m_Name[MAX_CS_FILENAME_LEN] = '\0';
}
if( g_pServerDE->GetPropGeneric( "Pos", &genProp ) == DE_OK )
{
VEC_COPY( pStruct->m_Pos, genProp.m_Vec );
}
if( g_pServerDE->GetPropGeneric( "Rotation", &genProp ) == DE_OK )
{
ROT_COPY( pStruct->m_Rotation, genProp.m_Rotation );
}
if( g_pServerDE->GetPropGeneric( "Flags", &genProp ) == DE_OK )
{
pStruct->m_Flags = genProp.m_Long;
}
if( g_pServerDE->GetPropGeneric( "Visible", &genProp ) == DE_OK )
{
if( genProp.m_Bool )
pStruct->m_Flags |= FLAG_VISIBLE;
else
pStruct->m_Flags &= ~FLAG_VISIBLE;
}
if( g_pServerDE->GetPropGeneric( "Shadow", &genProp ) == DE_OK )
{
if( genProp.m_Bool )
pStruct->m_Flags |= FLAG_SHADOW;
else
pStruct->m_Flags &= ~FLAG_SHADOW;
}
if( g_pServerDE->GetPropGeneric( "RotateableSprite", &genProp ) == DE_OK )
{
if( genProp.m_Bool )
pStruct->m_Flags |= FLAG_ROTATEABLESPRITE;
else
pStruct->m_Flags &= ~FLAG_ROTATEABLESPRITE;
}
if( g_pServerDE->GetPropGeneric( "Chromakey", &genProp ) == DE_OK )
{
if( genProp.m_Bool )
pStruct->m_Flags |= FLAG_SPRITECHROMAKEY;
else
pStruct->m_Flags &= ~FLAG_SPRITECHROMAKEY;
}
if( g_pServerDE->GetPropGeneric( "Solid", &genProp ) == DE_OK )
{
if( genProp.m_Bool )
pStruct->m_Flags |= FLAG_SOLID;
else
pStruct->m_Flags &= ~FLAG_SOLID;
}
if( g_pServerDE->GetPropGeneric( "Gravity", &genProp ) == DE_OK )
{
if( genProp.m_Bool )
pStruct->m_Flags |= FLAG_GRAVITY;
else
pStruct->m_Flags &= ~FLAG_GRAVITY;
}
if( g_pServerDE->GetPropGeneric( "TouchNotify", &genProp ) == DE_OK )
{
if( genProp.m_Bool )
pStruct->m_Flags |= FLAG_TOUCH_NOTIFY;
else
pStruct->m_Flags &= ~FLAG_TOUCH_NOTIFY;
}
if( g_pServerDE->GetPropGeneric( "Rayhit", &genProp ) == DE_OK )
{
if( genProp.m_Bool )
pStruct->m_Flags |= FLAG_RAYHIT;
else
pStruct->m_Flags &= ~FLAG_RAYHIT;
}
if( g_pServerDE->GetPropGeneric( "Filename", &genProp ) == DE_OK )
{
SAFE_STRCPY(pStruct->m_Filename, genProp.m_String);
pStruct->m_Filename[MAX_CS_FILENAME_LEN] = '\0';
}
if( g_pServerDE->GetPropGeneric( "Skin", &genProp ) == DE_OK )
{
SAFE_STRCPY(pStruct->m_SkinName, genProp.m_String);
pStruct->m_SkinName[MAX_CS_FILENAME_LEN] = '\0';
}
break;
}
}
}
// Call the aggregates.
pAggregate = pObject->m_pFirstAggregate;
while(pAggregate)
{
pAggregate->m_EngineMessageFn(pObject, pAggregate, messageID, pData, fData);
pAggregate = pAggregate->m_pNextAggregate;
}
// Default return is 1.
return 1;
}
DDWORD bc_ObjectMessageFn(LPBASECLASS pObject, HOBJECT hSender, DDWORD messageID, HMESSAGEREAD hRead)
{
LPAGGREGATE pAggregate;
// Call the aggregates.
pAggregate = pObject->m_pFirstAggregate;
while(pAggregate)
{
pAggregate->m_ObjectMessageFn(pObject, pAggregate, hSender, messageID, hRead);
pAggregate = pAggregate->m_pNextAggregate;
}
return 1;
}
#ifdef COMPILE_WITH_C
BEGIN_CLASS(BaseClass)
ADD_STRINGPROP(Name, "noname")
ADD_VECTORPROP(Pos)
ADD_ROTATIONPROP(Rotation)
END_CLASS_DEFAULT_NOPARENT(BaseClass, bc_EngineMessageFn, bc_ObjectMessageFn)
#endif
// The model class..
typedef struct
{
BaseClass m_BaseClass;
} Model;
static DDWORD mdl_MessageFn(LPBASECLASS pObject, DDWORD messageID, void *pData, float lData)
{
if(messageID == MID_PRECREATE)
{
((ObjectCreateStruct*)pData)->m_ObjectType = OT_MODEL;
}
// Pass the message down to the base class.
return bc_EngineMessageFn(pObject, messageID, pData, lData);
}
BEGIN_CLASS(Model)
ADD_STRINGPROP(Filename, "")
ADD_STRINGPROP(Skin, "")
ADD_LONGINTPROP(Flags, FLAG_VISIBLE)
END_CLASS_DEFAULT_FLAGS(Model, BaseClass, mdl_MessageFn, bc_ObjectMessageFn, CF_ALWAYSLOAD)
// The WorldModel class.
typedef struct
{
BaseClass m_BaseClass;
} WorldModel;
static DDWORD wmdl_MessageFn(LPBASECLASS pObject, DDWORD messageID, void *pData, float lData)
{
ObjectCreateStruct *pStruct;
if(messageID == MID_PRECREATE)
{
pStruct = (ObjectCreateStruct*)pData;
pStruct->m_ObjectType = OT_WORLDMODEL;
if( lData == 1.0f )
{
g_pServerDE->GetPropString("Name", pStruct->m_Filename, MAX_CS_FILENAME_LEN);
}
}
// Pass the message down to the base class.
return bc_EngineMessageFn(pObject, messageID, pData, lData);
}
BEGIN_CLASS(WorldModel)
ADD_LONGINTPROP(Flags, FLAG_VISIBLE)
END_CLASS_DEFAULT_FLAGS(WorldModel, BaseClass, wmdl_MessageFn, bc_ObjectMessageFn, CF_ALWAYSLOAD)
// The Container class.
typedef struct
{
BaseClass m_BaseClass;
DDWORD m_ContainerCode;
} Container;
static DDWORD cntr_MessageFn(LPBASECLASS pObject, DDWORD messageID, void *pData, float lData)
{
ObjectCreateStruct *pStruct;
long code;
if(messageID == MID_PRECREATE)
{
pStruct = (ObjectCreateStruct*)pData;
pStruct->m_ObjectType = OT_CONTAINER;
if( lData == 1.0f )
{
code = 0;
g_pServerDE->GetPropLongInt("ContainerCode", &code);
pStruct->m_ContainerCode = (D_WORD)code;
g_pServerDE->GetPropString("Name", pStruct->m_Filename, MAX_CS_FILENAME_LEN);
}
}
// Pass the message down to the base class.
return bc_EngineMessageFn(pObject, messageID, pData, lData);
}
BEGIN_CLASS(Container)
ADD_LONGINTPROP(Flags, FLAG_VISIBLE)
ADD_LONGINTPROP(ContainerCode, 0)
END_CLASS_DEFAULT_FLAGS(Container, BaseClass, cntr_MessageFn, bc_ObjectMessageFn, CF_ALWAYSLOAD)
// The sprite class.
typedef struct
{
BaseClass m_BaseClass;
DBYTE m_Color[4]; // RGBA
} Sprite;
static DDWORD spr_MessageFn(LPBASECLASS pObject, DDWORD messageID, void *pData, float lData)
{
ObjectCreateStruct *pStruct;
Sprite *pSprite;
GenericProp prop;
pSprite = (Sprite*)pObject;
switch(messageID)
{
case MID_PRECREATE:
{
pStruct = (ObjectCreateStruct*)pData;
pStruct->m_ObjectType = OT_SPRITE;
g_pServerDE->GetPropGeneric("Color", &prop);
pSprite->m_Color[0] = (DBYTE)prop.m_Color.x;
pSprite->m_Color[1] = (DBYTE)prop.m_Color.y;
pSprite->m_Color[2] = (DBYTE)prop.m_Color.z;
g_pServerDE->GetPropGeneric("Scale", &prop);
VEC_COPY(pStruct->m_Scale, prop.m_Vec);
g_pServerDE->GetPropGeneric("Alpha", &prop);
pSprite->m_Color[3] = (DBYTE)(prop.m_Float * 255.0f);
}
break;
case MID_INITIALUPDATE:
{
g_pServerDE->SetObjectColor(pObject->m_hObject,
pSprite->m_Color[0]/255.0f, pSprite->m_Color[1]/255.0f,
pSprite->m_Color[1]/255.0f, pSprite->m_Color[3]/255.0f);
}
break;
}
// Pass the message down to the base class.
return bc_EngineMessageFn(pObject, messageID, pData, lData);
}
BEGIN_CLASS(Sprite)
ADD_STRINGPROP(Filename, "")
ADD_LONGINTPROP(Flags, FLAG_VISIBLE)
ADD_VECTORPROP_VAL(Scale, 1, 1, 1)
ADD_COLORPROP(Color, 255, 255, 255)
ADD_REALPROP(Alpha, 1)
END_CLASS_DEFAULT_FLAGS(Sprite, BaseClass, spr_MessageFn, bc_ObjectMessageFn, CF_ALWAYSLOAD)
// sound class.
typedef struct
{
BaseClass m_BaseClass;
char m_Filename[101];
float m_fOuterRadius;
float m_fInnerRadius;
DBYTE m_nVolume;
DBOOL m_bAmbient;
DBOOL m_bFileStream;
unsigned char m_nPriority;
} Sound;
static DDWORD as_MessageFn(LPBASECLASS pObject, DDWORD messageID, void *pData, float lData)
{
ObjectCreateStruct *pStruct;
Sound *pSound;
GenericProp genProp;
if(messageID == MID_PRECREATE)
{
pStruct = (ObjectCreateStruct*)pData;
pSound = (Sound*)pObject;
pStruct->m_ObjectType = OT_NORMAL;
if( lData == 0.0f )
{
pSound->m_fOuterRadius = 100.0f;
pSound->m_fInnerRadius = 10.0f;
pSound->m_nVolume = 100;
pSound->m_nPriority = 0;
pSound->m_bAmbient = DTRUE;
pSound->m_bFileStream = DFALSE;
}
else
{
if( g_pServerDE->GetPropGeneric( "Filename", &genProp ) == DE_OK )
{
SAFE_STRCPY(pSound->m_Filename, genProp.m_String);
}
else
pSound->m_Filename[0] = '\0';
if( g_pServerDE->GetPropGeneric("OuterRadius", &genProp ) == DE_OK )
pSound->m_fOuterRadius = genProp.m_Float;
else
pSound->m_fOuterRadius = 100.0f;
if( g_pServerDE->GetPropGeneric("InnerRadius", &genProp ) == DE_OK )
pSound->m_fInnerRadius = genProp.m_Float;
else
pSound->m_fInnerRadius = 10.0f;
if( g_pServerDE->GetPropGeneric("Volume", &genProp) == DE_OK )
pSound->m_nVolume = (DBYTE)genProp.m_Long;
else
pSound->m_nVolume = 100;
if( g_pServerDE->GetPropGeneric("Priority", &genProp) == DE_OK )
pSound->m_nPriority = (unsigned char)genProp.m_Long;
else
pSound->m_nPriority = 0;
if( g_pServerDE->GetPropGeneric("Ambient", &genProp) == DE_OK )
pSound->m_bAmbient = genProp.m_Bool;
else
pSound->m_bAmbient = DTRUE;
if( g_pServerDE->GetPropGeneric("FileStream", &genProp) == DE_OK )
pSound->m_bFileStream = genProp.m_Bool;
else
pSound->m_bFileStream = DTRUE;
}
}
else if(messageID == MID_INITIALUPDATE)
{
PlaySoundInfo playSoundInfo;
PLAYSOUNDINFO_INIT( playSoundInfo );
playSoundInfo.m_dwFlags = PLAYSOUND_LOOP;
SAFE_STRCPY(playSoundInfo.m_szSoundName, (( Sound * )pObject )->m_Filename);
playSoundInfo.m_nPriority = (( Sound * )pObject )->m_nPriority;
playSoundInfo.m_fOuterRadius = (( Sound * )pObject )->m_fOuterRadius;
playSoundInfo.m_fInnerRadius = (( Sound * )pObject )->m_fInnerRadius;
if( (( Sound * )pObject )->m_nVolume < 100 )
{
playSoundInfo.m_nVolume = (( Sound * )pObject )->m_nVolume;
playSoundInfo.m_dwFlags |= PLAYSOUND_CTRL_VOL;
}
g_pServerDE->GetObjectPos( pObject->m_hObject, &playSoundInfo.m_vPosition );
if( (( Sound * )pObject )->m_bAmbient )
{
playSoundInfo.m_dwFlags |= PLAYSOUND_AMBIENT;
}
else
{
playSoundInfo.m_dwFlags |= PLAYSOUND_3D;
}
if((( Sound * )pObject )->m_bFileStream )
{
playSoundInfo.m_dwFlags |= PLAYSOUND_FILESTREAM | PLAYSOUND_TIMESYNC;
}
g_pServerDE->PlaySound( &playSoundInfo );
// sounds just remove themselves right away. Since they don't do
// anything right now, they just take up memory.
g_pServerDE->RemoveObject(pObject->m_hObject);
}
// Pass the message down to the base class.
return bc_EngineMessageFn(pObject, messageID, pData, lData);
}
BEGIN_CLASS(Sound)
ADD_STRINGPROP(Filename, "")
ADD_LONGINTPROP(Priority, 0.0f)
ADD_REALPROP_FLAG(OuterRadius, 100.0f, PF_RADIUS)
ADD_REALPROP_FLAG(InnerRadius, 10.0f, PF_RADIUS)
ADD_LONGINTPROP(Volume, 100.0f)
ADD_BOOLPROP(Ambient, 1)
ADD_BOOLPROP(FileStream, 0)
END_CLASS_DEFAULT_FLAGS(Sound, BaseClass, as_MessageFn, bc_ObjectMessageFn, CF_ALWAYSLOAD)
// Start point class.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -