📄 serverobj_de.h
字号:
class __ClassDefiner;
extern __ClassDefiner *__g_ClassDefinerHead;
class __ClassDefiner
{
public:
__ClassDefiner(ClassDef *pDef)
{
m_pClass = pDef;
m_pNext = __g_ClassDefinerHead;
__g_ClassDefinerHead = this;
}
ClassDef *m_pClass;
__ClassDefiner *m_pNext;
};
extern ClassDef **__g_cpp_classlist;
class __cpp_classlist_auto_free {
public:
~__cpp_classlist_auto_free() {
if(__g_cpp_classlist) {
free(__g_cpp_classlist);
__g_cpp_classlist = 0;
}
}
};
#define DEFINE_CLASSES() \
ClassDef **__g_cpp_classlist=0;\
__cpp_classlist_auto_free __free_the_g_cpp_classlist;\
ServerDE *g_pServerDE=(ServerDE*)0;\
BEGIN_EXTERNC() \
__declspec(dllexport) ClassDef** ObjectDLLSetup(int *nDefs, ServerDE *pServer, int *version); \
END_EXTERNC() \
__ClassDefiner *__g_ClassDefinerHead=0;\
ClassDef** ObjectDLLSetup(int *nDefs, ServerDE *pServer, int *version) \
{\
int nClasses;\
__ClassDefiner *pCurDefiner;\
*version = SERVEROBJ_VERSION;\
g_pServerDE = pServer;\
nClasses=0;\
pCurDefiner = __g_ClassDefinerHead;\
while(pCurDefiner)\
{\
pCurDefiner = pCurDefiner->m_pNext;\
++nClasses;\
}\
__g_cpp_classlist = (ClassDef**)malloc(sizeof(ClassDef*) * nClasses);\
nClasses=0;\
pCurDefiner = __g_ClassDefinerHead;\
while(pCurDefiner)\
{\
__g_cpp_classlist[nClasses] = pCurDefiner->m_pClass;\
pCurDefiner = pCurDefiner->m_pNext;\
++nClasses;\
}\
*nDefs = nClasses; \
return __g_cpp_classlist; \
}
#endif
// -------------------------------------------------------- //
// These are the macros that you use to define classes.
// -------------------------------------------------------- //
#ifdef __cplusplus
#define ALLOCATEONE(type) (void*)(new type)
#define DELETEONE(type, ptr) delete ((type*)ptr)
#else
#define ALLOCATEONE(type) malloc(sizeof(type))
#define DELETEONE(type, ptr) free(ptr)
#endif
#ifndef COMPILE_WITH_C
inline void* operator new(size_t size, void *ptr, int asdf, char a)
{
return ptr;
}
#if _MSC_VER != 1100
inline void operator delete(void *pDataPtr, void *ptr, int asdf, char a)
{
}
#endif
#endif
// It adds a dummy property here so C syntax doesn't break when you have no properties..
#define NOCOLOR DVector(0.0f, 0.0f, 0.0f)
// If you want level designers to be able to set object flags, you should
// use these macros so the property names are standardized.
// Use the ADD_X_FLAG macros in your property list.
#define ADD_VISIBLE_FLAG(defVal, flags) \
ADD_PROP_FLAG(Visible, PT_BOOL, defVal, 0, flags)
#define ADD_SHADOW_FLAG(defVal, flags) \
ADD_PROP_FLAG(Shadow, PT_BOOL, defVal, 0, flags)
#define ADD_ROTATEABLESPRITE_FLAG(defVal, flags) \
ADD_PROP_FLAG(RotateableSprite, PT_BOOL, defVal, 0, flags)
#define ADD_CHROMAKEY_FLAG(defVal, flags) \
ADD_PROP_FLAG(Chromakey, PT_BOOL, defVal, 0, flags)
#define ADD_SOLID_FLAG(defVal, flags) \
ADD_PROP_FLAG(Solid, PT_BOOL, defVal, 0, flags)
#define ADD_GRAVITY_FLAG(defVal, flags) \
ADD_PROP_FLAG(Gravity, PT_BOOL, defVal, 0, flags)
#define ADD_TOUCHNOTIFY_FLAG(defVal, flags) \
ADD_PROP_FLAG(Touch Notify, PT_BOOL, defVal, 0, flags)
#define ADD_RAYHIT_FLAG(defVal, flags) \
ADD_PROP_FLAG(Rayhit, PT_BOOL, defVal, 0, flags)
// Full property definitions.
#define ADD_PROP_FLAG(name, type, valFloat, valString, flags) \
PropDef_t(#name, type, NOCOLOR, valFloat, valString, flags),
#define ADD_REALPROP_FLAG(name, val, flags) \
PropDef_t(#name, PT_REAL, NOCOLOR, val, "", flags),
#define ADD_STRINGPROP_FLAG(name, val, flags) \
PropDef_t(#name, PT_STRING, NOCOLOR, 0.0f, val, flags),
#define ADD_VECTORPROP_FLAG(name, flags) \
PropDef_t(#name, PT_VECTOR, NOCOLOR, 0.0f, (char*)0, flags),
#define ADD_VECTORPROP_VAL_FLAG(name, defX, defY, defZ, flags) \
PropDef_t(#name, PT_VECTOR, DVector(defX, defY, defZ), 0.0f, (char*)0, flags),
#define ADD_LONGINTPROP_FLAG(name, val, flags) \
PropDef_t(#name, PT_LONGINT, NOCOLOR, (float)val, (char*)0, flags),
#define ADD_ROTATIONPROP_FLAG(name, flags) \
PropDef_t(#name, PT_ROTATION, NOCOLOR, 0.0f, (char*)0, flags),
#define ADD_BOOLPROP_FLAG(name, val, flags) \
PropDef_t(#name, PT_BOOL, NOCOLOR, (float)val, (char*)0, flags),
#define ADD_COLORPROP_FLAG(name, valR, valG, valB, flags) \
PropDef_t(#name, PT_COLOR, DVector(valR, valG, valB), 0.0f, (char*)0, flags),
// Add properties without flags (only here for backward compatibility).
#define ADD_PROP(name, type, valFloat, valString) \
ADD_PROP_FLAG(name, type, valFloat, valString, 0)
#define ADD_REALPROP(name, val) \
ADD_REALPROP_FLAG(name, val, 0)
#define ADD_STRINGPROP(name, val) \
ADD_STRINGPROP_FLAG(name, val, 0)
#define ADD_VECTORPROP(name) \
ADD_VECTORPROP_FLAG(name, 0)
#define ADD_VECTORPROP_VAL(name, defX, defY, defZ) \
ADD_VECTORPROP_VAL_FLAG(name, defX, defY, defZ, 0)
#define ADD_LONGINTPROP(name, val) \
ADD_LONGINTPROP_FLAG(name, val, 0)
#define ADD_ROTATIONPROP(name) \
ADD_ROTATIONPROP_FLAG(name, 0)
#define ADD_BOOLPROP(name, val) \
ADD_BOOLPROP_FLAG(name, val, 0)
#define ADD_COLORPROP(name, valR, valG, valB) \
ADD_COLORPROP_FLAG(name, valR, valG, valB, 0)
// Define a group with this.
#define PROP_DEFINEGROUP(groupName, groupFlag) \
PropDef_t(#groupName, PT_LONGINT, NOCOLOR, (float)0.0f, (char*)0, groupFlag|PF_GROUPOWNER),
#define BEGIN_CLASS(name) \
static PropDef _##name##_Props__[] = { \
ADD_STRINGPROP("__NOPROP__!!", "")
// Define the default constructor/destructor functions.
#ifdef COMPILE_WITH_C
#define DO_AUTO_CLASSLIST(name)
#define DO_DEFAULT_FUNCTIONS(_className) \
void Default##_className##Constructor(void *ptr) {}\
void Default##_className##Destructor(void *ptr) {}
#else
#define DO_AUTO_CLASSLIST(name) \
static __ClassDefiner __##name##_definer(&_##name##_Class__);
#define DO_DEFAULT_FUNCTIONS(_className)\
void Default##_className##Constructor(void *ptr)\
{\
::new(ptr, (int)0, (char)0) _className;\
}\
void Default##_className##Destructor(void *ptr)\
{\
_className *thePtr = (_className*)ptr;\
thePtr->~_className();\
}
#endif
#define END_CLASS_SYMBOL(name, parentSymbol, flags, construct_fn, destruct_fn, enginemessage_fn, objectmessage_fn, classFlags) \
ClassDef _##name##_Class__ = { \
#name, parentSymbol, \
flags,\
construct_fn, destruct_fn, \
(EngineMessageFn)enginemessage_fn,\
(ObjectMessageFn)objectmessage_fn,\
(sizeof(_##name##_Props__) / sizeof(PropDef)) - 1,\
&_##name##_Props__[1], \
sizeof(name),\
(void*)0, (void*)0 }; \
DO_AUTO_CLASSLIST(name)
// End class macros with flags.
#define END_CLASS_FLAGS(name, parent, construct_fn, destruct_fn, enginemessage_fn, objectmessage_fn, flags) \
}; \
extern ClassDef _##parent##_Class__; \
END_CLASS_SYMBOL(name, &_##parent##_Class__, flags, construct_fn, destruct_fn, enginemessage_fn, objectmessage_fn, 0)
#define END_CLASS_DEFAULT_FLAGS(name, parent, enginemessage_fn, objectmessage_fn, flags)\
}; \
extern ClassDef _##parent##_Class__; \
DO_DEFAULT_FUNCTIONS(name)\
END_CLASS_SYMBOL(name, &_##parent##_Class__, flags, Default##name##Constructor, Default##name##Destructor, enginemessage_fn, objectmessage_fn, 0)
// Normal end class macros.
#define END_CLASS(name, parent, construct_fn, destruct_fn, enginemessage_fn, objectmessage_fn) \
END_CLASS_FLAGS(name, parent, construct_fn, destruct_fn, enginemessage_fn, objectmessage_fn, 0)
#define END_CLASS_DEFAULT(name, parent, enginemessage_fn, objectmessage_fn)\
END_CLASS_DEFAULT_FLAGS(name, parent, enginemessage_fn, objectmessage_fn, 0)
// Only used internally.
#define END_CLASS_NOPARENT(name, construct_fn, destruct_fn, enginemessage_fn, objectmessage_fn) \
}; \
END_CLASS_SYMBOL(name, (ClassDef*)0, 0, construct_fn, destruct_fn, enginemessage_fn, objectmessage_fn, 0)
#define END_CLASS_DEFAULT_NOPARENT(name, enginemessage_fn, objectmessage_fn) \
}; \
DO_DEFAULT_FUNCTIONS(name)\
END_CLASS_SYMBOL(name, (ClassDef*)0, 0, Default##name##Constructor, Default##name##Destructor, enginemessage_fn, objectmessage_fn, 0)
#endif // __SERVEROBJ_DE_H__
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -