Компилится нормально, подгружается тоже нормально. Но крашит сервер при создании энтитей, каждый раз при разном значении счетчика иногда 10 дает создать иногда 100, но самый главный прикол в том что энтити создаются только к примеру при нажатии на "q"
(фаст свич), если же написать чтото в чат - краш сразу же идет
(волшебство). Вот собственно сама ошибка
Done! -> Entity Created = 278 // энтити создается нормально ... вроде бы но краш
Uploading dump (in-process) [proxy '']
/tmp/dumps/crash_20121011011814_1.dmp
success = yes
response: CrashID=bp-5a92a58e-3139-442f-b153-ee0892121010
- Код: Выделить всё
static DLL_FUNCTIONS DllTracers
{
...
pfnClientCommand, //void (*pfnClientCommand) ( edict_t *pEntity );
...
}
C_DLLEXPORT int GetEntityAPI2_Post(DLL_FUNCTIONS * pFunctionTable, int * interfaceVersion)
{
memcpy(pFunctionTable, &DllTracers, sizeof(DLL_FUNCTIONS));
return 1;
}
static META_FUNCTIONS g_MetaFunctionsTable =
{
NULL, // pfnGetEntityAPI HL SDK; called before game DLL
NULL, // pfnGetEntityAPI_Post META; called after game DLL
NULL, // pfnGetEntityAPI2 HL SDK2; called before game DLL
GetEntityAPI2_Post, // pfnGetEntityAPI2_Post META; called after game DLL
NULL, // pfnGetNewDLLFunctions HL SDK2; called before game DLL
NULL, // pfnGetNewDLLFunctions_Post META; called after game DLL
GetEngineFunctions, // pfnGetEngineFunctions META; called before HL engine
NULL // pfnGetEngineFunctions_Post META; called after HL engine
};
void pfnClientCommand(edict_t * pClient)//(edict_t * pClient, char *, ...)
{
static int i = 0;
ALERT(at_console, "\nPRINTING = %d", ++i); // Пробую просто вывод без создания и все нормально ...
/*
if(ENTINDEX(pClient) != 1 || (IsAlivePlayer(pClient) && ((pClient -> v.flags) & FL_ONGROUND)) == false)
{
return;
}
//ALERT(at_console, "\nLOLKA = CHAT\n");
UTIL_MakeVectors_CUSTOM(pClient);
edict_t * pTrampolineEntity = CreateEntity(true);
if(pTrampolineEntity -> pvPrivateData != NULL)
{
ALERT(at_console, "\nDone! -> Entity Created = %d\n", ENTINDEX(pTrampolineEntity));
pTrampolineEntity -> v.origin = g_TraceResultData.vecEndPos;
}
else
{
ALERT(at_console, "\nERROR -> Can't Create Entity !\n");
}
*/
}
bool IsPlayer(int iEntity)
{
return ((0 < iEntity) && (iEntity <= (gpGlobals -> maxClients)));
}
bool IsAlive(edict_t * pEntityData)
{
return ((pEntityData -> v.deadflag) == DEAD_NO && ((pEntityData -> v.health) > 0.0));
}
bool IsAlivePlayer(edict_t * pEntityData)
{
return (IsPlayer(ENTINDEX(pEntityData)) && IsAlive(pEntityData));
}
/*
Проблема видимо тут т.к. команды отлавливаются нормально,
*/
void EntityInitialize(edict_t * pTrampoline)
{
ALERT(at_console, "\nINITIALIZE !!!\n");
(*g_engfuncs.pfnSetModel)(pTrampoline, "models/w_medkit.mdl");
MDLL_Spawn(pTrampoline); // gpGamedllFuncs -> dllapi_table -> pfnSpawn(pTrampoline);
(pTrampoline -> v.takedamage) = DAMAGE_NO;
(pTrampoline -> v.health) = 1.0;
(pTrampoline -> v.movetype) = ENTITY_MOVETYPE;
(pTrampoline -> v.solid) = ENTITY_SOLID;
(pTrampoline -> v.classname) = (string_t)ENTITY_CLASSNAME;
Vector vec_fParamsMins = (Vector){-ENTITY_SIZE, -ENTITY_SIZE, -ENTITY_SIZE};
Vector vec_fParamsMaxs = (Vector){ENTITY_SIZE, ENTITY_SIZE, ENTITY_SIZE};
(*g_engfuncs.pfnSetSize)(pTrampoline, vec_fParamsMins, vec_fParamsMaxs);
}
edict_t * CreateEntity(bool bInitialize = false)
{
static int iPrecache = 0;
edict_t * pTrampoline;
if(iPrecache || (iPrecache = MAKE_STRING("info_target")))
{
pTrampoline = CREATE_NAMED_ENTITY(iPrecache);
//CALL_GAME_ENTITY(PLID, classname, &Entity -> v);
if(FNullEnt(pTrampoline) == false)
{
ALERT(at_console, "\nCREATE - GOOD !!!\n");
if(bInitialize)
{
EntityInitialize(pTrampoline);
}
}
else
{
ALERT(at_console, "\nERROR - CREATE !!!\n");
}
}
return pTrampoline;
}