api_custom_entities.amxx bug
#1
api_custom_entities.amxx

hola tengo un problema con este plugins probé plugins por plugins en mod halowin
y los cierra el juego al intentar entrar al sv cuando esta activado si alguien me puede ayudar se lo agradesco

Código PHP:
#pragma semicolon 1

#include <amxmodx>
#include <amxmisc>

#include <engine>
#include <fakemeta>
#include <hamsandwich>

#include <cellarray>
#include <celltrie>

#include <xs>

#define PLUGIN "[API] Custom Entities"
#define VERSION "1.2.1"
#define AUTHOR "Hedgehog Fog"

#define CE_BASE_CLASSNAME "info_target"
#define LOG_PREFIX "[CE]"

#define TASKID_SUM_DISAPPEAR 1000
#define TASKID_SUM_RESPAWN  2000
#define TASKID_SUM_REMOVE    3000

/*--------------------------------[ Constants ]--------------------------------*/

enum CEPreset
{
CEPreset_None 0,
CEPreset_Item,
CEPreset_NPC,
CEPreset_Prop
};

enum CEFunction
{
CEFunction_Spawn,
CEFunction_Kill,
CEFunction_Killed,
CEFunction_Remove,
CEFunction_Picked,
CEFunction_Pickup,
CEFunction_KVD
};

enum CEHookData
{
CEHookData_PluginID,
CEHookData_FuncID
};

enum _:RegisterArgs
{
RegisterArg_Name 1,
RegisterArg_ModelIndex,
RegisterArg_Mins,
RegisterArg_Maxs,
RegisterArg_LifeTime,
RegisterArg_RespawnTime,
RegisterArg_IgnoreRounds,
RegisterArg_Preset
};

enum _:CEData
{
CEData_Handler,
CEData_TempIndex,
CEData_WorldIndex,
CEData_StartOrigin
};

/*--------------------------------[ Variables ]--------------------------------*/

new g_ptrBaseClassname;

new 
Trie:g_entityHandlers;
new Array:
g_entityName;
new Array:
g_entityPluginID;
new Array:
g_entityModelIndex;
new Array:
g_entityMins;
new Array:
g_entityMaxs;
new Array:
g_entityLifeTime;
new Array:
g_entityRespawnTime;
new Array:
g_entityPreset;
new Array:
g_entityIgnoreRounds;
new Array:
g_entityHooks;

new 
g_entityCount 0;

new Array:
g_worldEntities;
new Array:
g_tmpEntities;

new 
g_lastCEIdx 0;
new 
g_lastCEEnt 0;

public 
plugin_init()
{
register_plugin(PLUGINVERSIONAUTHOR);

if (
g_lastCEEnt) {
dllfunc(DLLFunc_Spawng_lastCEEnt); // spawn last handled entity
}

RegisterHam(Ham_TouchCE_BASE_CLASSNAME"OnTouch", .Post 1);
RegisterHam(Ham_KilledCE_BASE_CLASSNAME"OnKilled", .Post 0);

register_event("HLTV""OnNewRound""a""1=0""2=0");

register_concmd("ce_spawn""OnClCmd_CESpawn"ADMIN_CVAR);
}

public 
plugin_end()
{
for (new 
0g_entityCount; ++i) {
DestroyFunctions(i);
}

if (
g_entityCount) {
TrieDestroy(g_entityHandlers);
ArrayDestroy(g_entityName);
ArrayDestroy(g_entityPluginID);
ArrayDestroy(g_entityModelIndex);
ArrayDestroy(g_entityMins);
ArrayDestroy(g_entityMaxs);
ArrayDestroy(g_entityLifeTime);
ArrayDestroy(g_entityRespawnTime);
ArrayDestroy(g_entityIgnoreRounds);
ArrayDestroy(g_entityPreset);
ArrayDestroy(g_entityHooks);
}

if (
g_tmpEntities) {
ArrayDestroy(g_tmpEntities);
}

if (
g_worldEntities) {
ArrayDestroy(g_worldEntities);
}
}

public 
plugin_precache()
{
g_ptrBaseClassname engfunc(EngFunc_AllocStringCE_BASE_CLASSNAME);

register_forward(FM_KeyValue"OnKeyValue"1); 
RegisterHam(Ham_SpawnCE_BASE_CLASSNAME"OnSpawn", .Post 1);
}

public 
plugin_natives()
{
register_library("api_custom_entities");

register_native("CE_Register""Native_Register"); 
register_native("CE_Create""Native_Create");
register_native("CE_Kill""Native_Kill");
register_native("CE_Remove""Native_Remove");

register_native("CE_GetSize""Native_GetSize");
register_native("CE_GetModelIndex""Native_GetModelIndex");

register_native("CE_RegisterHook""Native_RegisterHook");

register_native("CE_CheckAssociation_""Native_CheckAssociation");

register_native("CE_GetHandler""Native_GetHandler");
register_native("CE_GetHandlerByEntity""Native_GetHandlerByEntity");
}

/*--------------------------------[ Natives ]--------------------------------*/

public Native_Register(pluginIDargc)
{
static 
szClassName[32];
get_string(RegisterArg_NameszClassNamecharsmax(szClassName));

new 
modelIndex get_param(RegisterArg_ModelIndex);
new 
Float:fLifeTime get_param_f(RegisterArg_LifeTime);
new 
Float:fRespawnTime get_param_f(RegisterArg_RespawnTime);
new 
bool:ignoreRounds bool:get_param(RegisterArg_IgnoreRounds);
new 
CEPreset:preset CEPreset:get_param(RegisterArg_Preset);

new 
Float:vMins[3];
get_array_f(RegisterArg_MinsvMins3);

new 
Float:vMaxs[3];
get_array_f(RegisterArg_MaxsvMaxs3);

return 
Register(szClassNamepluginIDmodelIndexvMinsvMaxsfLifeTimefRespawnTimeignoreRoundspreset);
}

public 
Native_Create(pluginIDargc)
{
new 
szClassName[32];
get_string(1szClassNamecharsmax(szClassName));

new 
Float:vOrigin[3];
get_array_f(2vOrigin3);

new 
bool:temp = !!get_param(3);

return 
Create(szClassNamevOrigintemp);
}

public 
Native_Kill(pluginIDargc)
{
new 
ent get_param(1);
new 
killer get_param(2);

Kill(entkiller);
}

public 
bool:Native_Remove(pluginIDargc)
{
new 
ent get_param(1);
return 
Remove(ent);
}

public 
Native_GetSize(pluginIDargc)
{
new 
szClassName[32];
get_string(1szClassNamecharsmax(szClassName));

new 
ceIdx;
if (!
TrieGetCell(g_entityHandlersszClassNameceIdx)) {
return 
false;
}

new 
Float:vMins[3];
ArrayGetArray(g_entityMinsceIdxvMins);

new 
Float:vMaxs[3];
ArrayGetArray(g_entityMaxsceIdxvMaxs);

set_array_f(2vMins3);
set_array_f(3vMaxs3);

return 
true;
}

public 
Native_GetModelIndex(pluginIDargc)
{
new 
szClassName[32];
get_string(1szClassNamecharsmax(szClassName));

new 
ceIdx;
if (!
TrieGetCell(g_entityHandlersszClassNameceIdx)) {
return 
false;
}

return 
ArrayGetCell(g_entityModelIndexceIdx);
}

public 
Native_RegisterHook(pluginIDargc)
{
new 
CEFunction:function = CEFunction:get_param(1);

new 
szClassname[32];
get_string(2szClassnamecharsmax(szClassname));

new 
szCallback[32];
get_string(3szCallbackcharsmax(szCallback));

RegisterHook(function, szClassnameszCallbackpluginID);
}

public 
Native_CheckAssociation(pluginIDargc)
{
new 
ent get_param(1);
new 
ceIdx GetHandlerByEntity(ent);

return (
ceIdx && pluginID == ArrayGetCell(g_entityPluginIDceIdx));
}

public 
Native_GetHandler(pluginIDargc)
{
new 
szClassname[32];
get_string(1szClassnamecharsmax(szClassname));

return 
GetHandler(szClassname);
}

public 
Native_GetHandlerByEntity(pluginIDargc)
{
new 
ent get_param(1);

return 
GetHandlerByEntity(ent);
}

/*--------------------------------[ Hooks ]--------------------------------*/

public OnClCmd_CESpawn(idlevelcid)
{
if(!
cmd_access(idlevelcid2)) {
return 
PLUGIN_HANDLED;
}

static 
szClassname[128];
read_args(szClassnamecharsmax(szClassname));
remove_quotes(szClassname);

if(
szClassname[0] == '^0') {
return 
PLUGIN_HANDLED;
}

static 
Float:vOrigin[3];
pev(idpev_originvOrigin);

new 
ent Create(szClassnamevOrigin);
if (
ent) {
dllfunc(DLLFunc_Spawnent);
}

return 
PLUGIN_HANDLED;
}

public 
OnKeyValue(entkvd)
{
static 
szKey[32];
get_kvd(kvdKV_KeyNameszKeycharsmax(szKey));

static 
szValue[32];
get_kvd(kvdKV_ValueszValuecharsmax(szValue));

if (
equal(szKey"classname"))
{
if (
g_lastCEEnt) {
dllfunc(DLLFunc_Spawng_lastCEEnt); // spawn last handled entity
g_lastCEEnt 0;
}

if (
TrieGetCell(g_entityHandlersszValueg_lastCEIdx)) {
g_lastCEEnt Create(szValue, .temp false); // clone entity
}

return;
}

if (!
g_lastCEEnt) {
return;
}

DispatchKeyValue(g_lastCEEntszKeyszValue); // dispatch kvd to cloned entity
ExecuteFunction(CEFunction_KVDg_lastCEIdxg_lastCEEntszKeyszValue);
}

public 
OnSpawn(ent)
{
if (!
Check(ent)) {
return;
}

new Array:
ceData GetPData(ent);
new 
ceIdx ArrayGetCell(ceDataCEData_Handler);

//Save start origin
if (ArrayGetCell(ceDataCEData_StartOrigin) == Invalid_Array) {
new 
Float:vOrigin[3];
pev(entpev_originvOrigin); 

new Array:
startOrigin ArrayCreate(31);
ArrayPushArray(startOriginvOrigin);

ArraySetCell(ceDataCEData_StartOriginstartOrigin);
}

new 
tmpIdx ArrayGetCell(ceDataCEData_TempIndex);
InitEntity(entceIdx, (tmpIdx >= 0));

ExecuteFunction(CEFunction_SpawnceIdxent);
}

public 
OnTouch(entid)
{
if (
pev(entpev_flags) & ~FL_ONGROUND) {
return;
}

if (!
is_user_connected(id)) {
return;
}

if (!
is_user_alive(id)) {
return;
}

static 
szClassname[32];
pev(entpev_classnameszClassnamecharsmax(szClassname)); 

new 
ceIdx;
if (!
TrieGetCell(g_entityHandlersszClassnameceIdx)) {
return;
}

new 
CEPreset:preset ArrayGetCell(g_entityPresetceIdx);
if (
preset != CEPreset_Item) {
return;
}

if (
ExecuteFunction(CEFunction_PickupceIdxentid) > 0) {
ExecuteFunction(CEFunction_PickedceIdxentid);
Kill(entid, .picked true);
}
}

public 
OnKilled(entkiller)
{
if (!
Check(ent)) {
return 
HAM_IGNORED;
}

Kill(entkiller);
return 
HAM_SUPERCEDE;
}

public 
OnNewRound()
{
Cleanup();
RespawnEntities();
}

/*--------------------------------[ Methods ]--------------------------------*/

Register(
const 
szClassname[],
pluginID,
modelIndex,
const 
Float:vMins[3],
const 
Float:vMaxs[3],
Float:fLifeTime,
Float:fRespawnTime,
bool:ignoreRounds,
CEPreset:preset
)
{
if (!
g_entityCount) {
g_entityHandlers TrieCreate();
g_entityName ArrayCreate(32);
g_entityPluginID ArrayCreate(1);
g_entityModelIndex ArrayCreate(1);
g_entityMaxs ArrayCreate(3);
g_entityMins ArrayCreate(3);
g_entityLifeTime ArrayCreate(1);
g_entityRespawnTime ArrayCreate(1);
g_entityIgnoreRounds ArrayCreate(1);
g_entityPreset ArrayCreate(1);
g_entityHooks ArrayCreate(1);
}

new 
index g_entityCount;

TrieSetCell(g_entityHandlersszClassnameindex);

ArrayPushString(g_entityNameszClassname);
ArrayPushCell(g_entityPluginIDpluginID);
ArrayPushCell(g_entityModelIndexmodelIndex);
ArrayPushArray(g_entityMinsvMins);
ArrayPushArray(g_entityMaxsvMaxs);
ArrayPushCell(g_entityLifeTimefLifeTime);
ArrayPushCell(g_entityRespawnTimefRespawnTime);
ArrayPushCell(g_entityIgnoreRoundsignoreRounds);
ArrayPushCell(g_entityPresetpreset);
ArrayPushCell(g_entityHooks0);

g_entityCount++;

log_amx("%s Entity %s successfully registred."LOG_PREFIXszClassname);

return 
index;
}

Create(const szClassname[], const Float:vOrigin[3] = {0.00.00.0}, bool:temp true)
{
new 
ceIdx;
if (!
TrieGetCell(g_entityHandlersszClassnameceIdx)) {
log_error(0"%s Entity %s is not registered as custom entity."LOG_PREFIXszClassname);
return 
0;
}

new 
ent engfunc(EngFunc_CreateNamedEntityg_ptrBaseClassname);
set_pev(entpev_classnameszClassnamestrlen(szClassname));

engfunc(EngFunc_SetOriginentvOrigin);

new 
tmpIdx = -1;
new 
worldIdx = -1;
if (
temp) {
if (!
g_tmpEntities) {
g_tmpEntities ArrayCreate();


tmpIdx ArraySize(g_tmpEntities);
ArrayPushCell(g_tmpEntitiesent);
} else {
if (!
g_worldEntities) {
g_worldEntities ArrayCreate();
}

worldIdx ArraySize(g_worldEntities);
ArrayPushCell(g_worldEntitiesent);
}

new Array:
ceData CreatePData(ent);

ArraySetCell(ceDataCEData_HandlerceIdx);
ArraySetCell(ceDataCEData_TempIndextmpIdx);
ArraySetCell(ceDataCEData_WorldIndexworldIdx);
ArraySetCell(ceDataCEData_StartOriginInvalid_Array);

set_pev(entpev_deadflagDEAD_NO);

return 
ent;
}

Respawn(ent)
{
remove_task(ent+TASKID_SUM_RESPAWN);

new Array:
ceData GetPData(ent);

new Array:
startOrigin ArrayGetCell(ceDataCEData_StartOrigin);
if (
startOrigin != Invalid_Array) {
static 
Float:vOrigin[3];
ArrayGetArray(startOrigin0vOrigin);
engfunc(EngFunc_SetOriginentvOrigin);
}

set_pev(entpev_deadflagDEAD_NO);
set_pev(entpev_effectspev(entpev_effects) & ~EF_NODRAW);

set_pev(entpev_flagspev(entpev_flags) & ~FL_ONGROUND);
dllfunc(DLLFunc_Spawnent);
}

Kill(entkiller 0bool:picked false)
{
new Array:
ceData GetPData(ent);

new 
ceIdx ArrayGetCell(ceDataCEData_Handler);

if (
ExecuteFunction(CEFunction_KillceIdxentkillerpicked) != PLUGIN_CONTINUE) {
return;
}

set_pev(entpev_takedamageDAMAGE_NO);
set_pev(entpev_effectspev(entpev_effects) | EF_NODRAW);
set_pev(entpev_solidSOLID_NOT);
set_pev(entpev_movetypeMOVETYPE_NONE);
set_pev(entpev_flagspev(entpev_flags) & ~FL_ONGROUND);

//Get temp index
new tmpIdx ArrayGetCell(ceDataCEData_TempIndex);

//Check if entity is temp
if (tmpIdx 0) {
new 
Float:fRespawnTime ArrayGetCell(g_entityRespawnTimeceIdx);
if (
fRespawnTime 0.0) {
set_pev(entpev_deadflagDEAD_RESPAWNABLE);
set_task(fRespawnTime"TaskRespawn"ent+TASKID_SUM_RESPAWN);
} else {
set_pev(entpev_deadflagDEAD_DEAD);
}
} else {
set_pev(entpev_deadflagDEAD_DISCARDBODY);
}

remove_task(ent+TASKID_SUM_DISAPPEAR);

ExecuteFunction(CEFunction_KilledceIdxentkillerpicked);

if (
tmpIdx >= 0) {
set_task(0.0"TaskRemove"ent+TASKID_SUM_REMOVE);
}
}

bool:Remove(ent)
{
if (!
Check(ent)) {
log_error(0"%s Entity %i is not a custom entity."LOG_PREFIXent);
return 
false;
}

new Array:
ceData GetPData(ent);

//Get temp index
new tmpIdx ArrayGetCell(ceDataCEData_TempIndex);

//Check if entity is temp
if (tmpIdx >= 0) {
//Remove entity from storage of temp entities
ArraySetCell(g_tmpEntitiestmpIdx0);
} else {
//Get world index
new worldIdx ArrayGetCell(ceDataCEData_WorldIndex);
if (
worldIdx >= 0) {
ArraySetCell(g_worldEntitiesworldIdx0); 
}
}

ClearTasks(ent);

//Get handler
new ceIdx ArrayGetCell(ceDataCEData_Handler);

//Execute remove function
ExecuteFunction(CEFunction_RemoveceIdxent);

DestroyPData(ent);

//Remove entity
set_pev(entpev_flagspev(entpev_flags) | FL_KILLME);
dllfunc(DLLFunc_Thinkent);

return 
true;
}

Check(ent)
{
return (
pev(entpev_gaitsequence) == 'c'+'e');
}

ClearTasks(ent)
{
remove_task(ent+TASKID_SUM_DISAPPEAR);
remove_task(ent+TASKID_SUM_RESPAWN);
remove_task(ent+TASKID_SUM_REMOVE);
}

GetHandlerByEntity(ent)
{
if (!
Check(ent)) {
return -
1;
}

new Array:
ceData GetPData(ent);

return 
ArrayGetCell(ceDataCEData_Handler);
}

GetHandler(const szClassname[])
{
new 
ceIdx;
if (!
TrieGetCell(g_entityHandlersszClassnameceIdx)) {
return -
1;
}

return 
ceIdx;
}

Cleanup()
{
if (!
g_tmpEntities) {
return;
}

new 
size ArraySize(g_tmpEntities);

for (new 
size 1>= 0; --i)
{
new 
ent ArrayGetCell(g_tmpEntitiesi);

if (
ent && pev_valid(ent))
{
new 
ceIdx GetHandlerByEntity(ent);
if (
ceIdx == -1) {
log_error(0"%s Entity %i is not a custom entity."LOG_PREFIXent);
continue;
}

new 
ignoreRounds ArrayGetCell(g_entityIgnoreRoundsceIdx);
if (!
ignoreRounds) {
Remove(ent);
ArrayDeleteItem(g_tmpEntitiesi);
}
}
}
}

RespawnEntities()
{
if (!
g_worldEntities) {
return;
}

new 
size ArraySize(g_worldEntities);
for (new 
0size; ++i) {
new 
ent ArrayGetCell(g_worldEntitiesi);
if (
ent) {
Respawn(ent);
}
}
}

bool:InitEntity(entceIdxbool:temp)

static 
Float:vMins[3];
ArrayGetArray(g_entityMinsceIdxvMins);

static 
Float:vMaxs[3];
ArrayGetArray(g_entityMaxsceIdxvMaxs);

static 
Float:vOrigin[3];
pev(entpev_originvOrigin);

engfunc(EngFunc_SetSizeentvMinsvMaxs);
engfunc(EngFunc_SetOriginentvOrigin);

{
new 
preset ArrayGetCell(g_entityPresetceIdx);
ApplyPreset(entpreset);
}

new 
modelIndex ArrayGetCell(g_entityModelIndexceIdx);
if (
modelIndex 0) {
set_pev(entpev_modelindexmodelIndex);
}

if (
temp) {
new 
Float:fLifeTime ArrayGetCell(g_entityLifeTimeceIdx);
if (
fLifeTime 0.0) {
set_task(fLifeTime"TaskDisappear"ent+TASKID_SUM_DISAPPEAR);
}
}

return 
true;
}

ApplyPreset(entpreset)
{
switch (
preset)
{
case 
CEPreset_Item:
{
set_pev(entpev_solidSOLID_TRIGGER);
set_pev(entpev_movetypeMOVETYPE_TOSS);
set_pev(entpev_takedamageDAMAGE_NO);
}
case 
CEPreset_NPC:
{
set_pev(entpev_solidSOLID_BBOX);
set_pev(entpev_movetypeMOVETYPE_PUSHSTEP);
set_pev(entpev_takedamageDAMAGE_AIM);

set_pev(entpev_controller_0125);
set_pev(entpev_controller_1125);
set_pev(entpev_controller_2125);
set_pev(entpev_controller_3125);

set_pev(entpev_gamestate1);
set_pev(entpev_gravity1.0);
set_pev(entpev_flagspev(entpev_flags) | FL_MONSTER);
set_pev(entpev_fixangle1);
set_pev(entpev_friction0.25);
}
case 
CEPreset_Prop:
{
set_pev(entpev_solidSOLID_BBOX);
set_pev(entpev_movetypeMOVETYPE_FLY);
set_pev(entpev_takedamageDAMAGE_NO);
}
}
}

RegisterHook(CEFunction:function, const szClassname[], const szCallback[], pluginID = -1)
{
new 
ceIdx;
if (!
TrieGetCell(g_entityHandlersszClassnameceIdx)) {
log_error(0"%s Entity %s is not registered."LOG_PREFIXszClassname);
return -
1;
}

new 
funcID get_func_id(szCallbackpluginID);
if (
funcID 0) {
new 
szFilename[32];
get_plugin(pluginIDszFilenamecharsmax(szFilename));
log_error(0"Function %s not found in plugin %s."szCallbackszFilename);
return -
1;
}

new Array:
functions ArrayGetCell(g_entityHooksceIdx);
if (!
functions) {
functions InitializeFunctions(ceIdx);
}

new Array:
functionHooks ArrayGetCell(functions_:function); 

new Array:
hookData CreateHookData(pluginIDfuncID);
return 
ArrayPushCell(functionHookshookData);
}

Array:
InitializeFunctions(ceIdx)
{
new Array:
functions ArrayCreate(1_:CEFunction);

for (new 
0_:CEFunction; ++i) {
new Array:
functionHooks ArrayCreate();
ArrayPushCell(functionsfunctionHooks);
}

ArraySetCell(g_entityHooksceIdxfunctions);

return 
functions;
}

DestroyFunctions(ceIdx)
{
new Array:
functions ArrayGetCell(g_entityHooksceIdx);

if (!
functions) {
return;
}

for (new 
0_:CEFunction; ++i) {
new Array:
functionHooks ArrayGetCell(functionsi);
ArrayDestroy(functionHooks);
}

ArrayDestroy(functions);
ArraySetCell(g_entityHooksceIdx0);
}

Array:
CreateHookData(pluginIDfuncID)
{
new Array:
hookData ArrayCreate(1_:CEHookData);
ArrayPushCell(hookDatapluginID);
ArrayPushCell(hookDatafuncID);

return 
hookData;
}

ExecuteFunction(CEFunction:function, ceIdxany:...)
{
new 
result 0;
new 
ent getarg(2);

new Array:
functions ArrayGetCell(g_entityHooksceIdx);
if (
functions == Invalid_Array) {
return 
0;
}

new Array:
functionHooks ArrayGetCell(functions_:function);

new 
count ArraySize(functionHooks);
for (new 
0count; ++i)
{
new Array:
hookData ArrayGetCell(functionHooksi);
new 
pluginID ArrayGetCell(hookData_:CEHookData_PluginID);
new 
funcID ArrayGetCell(hookData_:CEHookData_FuncID);

if (
funcID 0) {
continue;
}

if (
callfunc_begin_i(funcIDpluginID) == 1
{
callfunc_push_int(ent);

switch (function)
{
case 
CEFunction_KillCEFunction_Killed: {
new 
killer getarg(3);
new 
bool:picked bool:getarg(4);
callfunc_push_int(killer);
callfunc_push_int(picked);
}
case 
CEFunction_PickupCEFunction_Picked: {
new 
id getarg(3);
callfunc_push_int(id);
}
case 
CEFunction_KVD: {
static 
szKey[32];
for (new 
0charsmax(szKey); ++i) {
szKey[i] = getarg(3i); 

if (
szKey[i]  == '^0') {
break;
}
}

static 
szValue[32];
for (new 
0charsmax(szValue); ++i) {
szValue[i] = getarg(4i); 

if (
szValue[i]  == '^0') {
break;
}
}

callfunc_push_str(szKey);
callfunc_push_str(szValue);
}
}

result += callfunc_end(); 
}
}

return 
result;
}

Array:
CreatePData(ent)
{
new Array:
ceData ArrayCreate(1CEData); 
for (new 
0CEData; ++i) {
ArrayPushCell(ceData0);
}

set_pev(entpev_gaitsequence'c'+'e');
set_pev(entpev_iStepLeftceData); 

return 
ceData;
}

DestroyPData(ent)
{
//Destroy data array
new Array:ceData GetPData(ent);
{
new Array:
startOrigin ArrayGetCell(ceDataCEData_StartOrigin);
if (
startOrigin != Invalid_Array) {
ArrayDestroy(startOrigin);
}
ArrayDestroy(ceData);

set_pev(entpev_gaitsequence0);
set_pev(entpev_iStepLeft0);
}

Array:
GetPData(ent)
{
new Array:
ceData any:pev(entpev_iStepLeft);
if (
ceData == Invalid_Array) {
log_error(0"%s Invalid Custom Entity data provided for %i."LOG_PREFIXent);
}

return 
ceData;
}

/*--------------------------------[ Tasks ]--------------------------------*/

public TaskDisappear(taskID)
{
new 
ent taskID TASKID_SUM_DISAPPEAR;
Kill(ent0);
}

public 
TaskRespawn(taskID)
{
new 
ent taskID TASKID_SUM_RESPAWN;
Respawn(ent);
}

public 
TaskRemove(taskID)
{
new 
ent taskID TASKID_SUM_REMOVE;
Remove(ent);

Responder
#2
¿Qué otros plugins tienes que interactúen con esta API? Posiblemente en alguno de aquellos tengas un model o sprite mal copiado (en el servidor y en tu cliente).
Responder
#3
api_particles.amxx

Código PHP:
#pragma semicolon 1

#include <amxmodx>
#include <fakemeta>
#include <xs>

#define PLUGIN "[API] Particles"
#define VERSION "1.0.0"
#define AUTHOR "Hedgehog Fog"

#define TASKID_SUM_TARGET_TICK 1000
#define TASKID_SUM_REMOVE_TARGET 2000
#define TASKID_SUM_REMOVE_PARTICLE 3000

new Trie:g_particles;
new Array:
g_particlePluginID;
new Array:
g_particleFuncID;
new Array:
g_particleSprites;
new Array:
g_particleLifeTime;
new Array:
g_particleScale;
new Array:
g_particleRenderMode;
new Array:
g_particleRenderAmt;
new Array:
g_particleSpawnCount;
new 
g_particleCount 0;

new 
g_ptrTargetClassname;
new 
g_ptrParticleClassname;

public 
plugin_precache()
{
    
g_ptrTargetClassname engfunc(EngFunc_AllocString"info_target");
    
g_ptrParticleClassname engfunc(EngFunc_AllocString"env_sprite");
}

public 
plugin_init()
{
    
register_plugin(PLUGINVERSIONAUTHOR);
}

public 
plugin_end()
{
    if (
g_particleCount) {
        
TrieDestroy(g_particles);
        
ArrayDestroy(g_particlePluginID);
        
ArrayDestroy(g_particleFuncID);
        
ArrayDestroy(g_particleSprites);
        
ArrayDestroy(g_particleLifeTime);
        
ArrayDestroy(g_particleScale);
        
ArrayDestroy(g_particleRenderMode);
        
ArrayDestroy(g_particleRenderAmt);
        
ArrayDestroy(g_particleSpawnCount);
    }
}

public 
plugin_natives()
{
    
register_library("api_particles");
    
register_native("Particles_Register""Native_Register");
    
register_native("Particles_Spawn""Native_Spawn");
    
register_native("Particles_Remove""Native_Remove");
}

public 
Native_Register(pluginIDargc)
{
    new 
szName[32];
    
get_string(1szNamecharsmax(szName));

    new 
szTransformCallback[32];
    
get_string(2szTransformCallbackcharsmax(szTransformCallback));
    new 
funcID get_func_id(szTransformCallbackpluginID);

    new Array:
sprites any:get_param(3);
    new 
Float:fLifeTime get_param_f(4);
    new 
Float:fScale get_param_f(5);
    new 
renderMode get_param(6);
    new 
Float:fRenderAmt get_param_f(7);
    new 
spawnCount get_param(8);

    
RegisterParticle(szNamepluginIDfuncIDspritesfLifeTimefScalerenderModefRenderAmtspawnCount);
}

public 
Native_Spawn(pluginIDargc)
{
    new 
szName[32];
    
get_string(1szNamecharsmax(szName));

    new 
Float:vOrigin[3];
    
get_array_f(2vOriginsizeof(vOrigin));

    new 
Float:fPlayTime get_param_f(3);

    return 
SpawnParticles(szNamevOriginfPlayTime);
}

public 
Native_Remove(pluginIDargc)
{
    new 
ent get_param(1);
    
RemoveParticles(ent);
}

RegisterParticle(const szName[], pluginIDfuncID, Array:spritesFloat:fLifeTimeFloat:fScalerenderModeFloat:fRenderAmtspawnCount)
{
    if (!
g_particleCount) {
        
g_particles TrieCreate();
        
g_particlePluginID ArrayCreate();
        
g_particleFuncID ArrayCreate();
        
g_particleSprites ArrayCreate();
        
g_particleLifeTime ArrayCreate();
        
g_particleScale ArrayCreate();
        
g_particleRenderMode ArrayCreate();
        
g_particleRenderAmt ArrayCreate();
        
g_particleSpawnCount ArrayCreate();
    }

    new 
index g_particleCount;

    
TrieSetCell(g_particlesszNameindex);
    
ArrayPushCell(g_particlePluginIDpluginID);
    
ArrayPushCell(g_particleFuncIDfuncID);
    
ArrayPushCell(g_particleLifeTimefLifeTime);
    
ArrayPushCell(g_particleScalefScale);
    
ArrayPushCell(g_particleRenderModerenderMode);
    
ArrayPushCell(g_particleRenderAmtfRenderAmt);
    
ArrayPushCell(g_particleSpawnCountspawnCount);
    
ArrayPushCell(g_particleSpritessprites);

    
g_particleCount++;

    return 
index;
}

SpawnParticles(const szName[], const Float:vOrigin[3], Float:fPlayTime)
{
    if (!
g_particleCount) {
        return 
0;
    }

    new 
index;
    if (!
TrieGetCell(g_particlesszNameindex)) {
        return 
0;
    }

    new 
ent engfunc(EngFunc_CreateNamedEntityg_ptrTargetClassname);
    
engfunc(EngFunc_SetOriginentvOrigin);
    
dllfunc(DLLFunc_Spawnent);

    
set_pev(entpev_iuser1index);

    
set_task(0.04"TaskTargetTick"ent+TASKID_SUM_TARGET_TICK__"b");

    if (
fPlayTime 0.0) {
        
set_task(fPlayTime"TaskRemoveTarget"ent+TASKID_SUM_REMOVE_TARGET);
    }

    return 
ent;
}

RemoveParticles(ent)
{
    
remove_task(ent+TASKID_SUM_TARGET_TICK);
    
set_pev(entpev_flagspev(entpev_flags) | FL_KILLME);
    
dllfunc(DLLFunc_Thinkent);
}

public 
TaskRemoveTarget(taskID)
{
    new 
ent taskID TASKID_SUM_REMOVE_TARGET;
    
RemoveParticles(ent);
}

public 
TaskTargetTick(taskID)
{
    new 
ent taskID TASKID_SUM_TARGET_TICK;
    new 
index pev(entpev_iuser1);

    new 
pluginID            ArrayGetCell(g_particlePluginIDindex);
    new 
funcID                ArrayGetCell(g_particleFuncIDindex);
    new 
Float:fLifeTime        ArrayGetCell(g_particleLifeTimeindex);
    new 
Float:fScale        ArrayGetCell(g_particleScaleindex);
    new 
renderMode            ArrayGetCell(g_particleRenderModeindex);
    new 
Float:fRenderAmt    ArrayGetCell(g_particleRenderAmtindex);
    new 
spawnCount            ArrayGetCell(g_particleSpawnCountindex);
    new Array:
sprites        ArrayGetCell(g_particleSpritesindex);

    static 
Float:vOrigin[3];
    static 
Float:vVelocity[3];

    for (new 
0spawnCount; ++i)
    {
        
pev(entpev_originvOrigin);
        
xs_vec_set(vVelocity0.00.00.0);

        if (
callfunc_begin_i(funcIDpluginID) == 1) {
            
callfunc_push_array(_:vOrigin3);
            
callfunc_push_array(_:vVelocity3);
            
callfunc_end();
        }

        static 
modelindex;
        {
            new 
size ArraySize(sprites);
            
modelindex ArrayGetCell(spritesrandom(size));
        }

        static 
particleEnt;
        {
            
particleEnt engfunc(EngFunc_CreateNamedEntityg_ptrParticleClassname);
            
engfunc(EngFunc_SetOriginparticleEntvOrigin);
            
set_pev(particleEntpev_velocityvVelocity);
            
set_pev(particleEntpev_modelindexmodelindex);
            
set_pev(particleEntpev_solidSOLID_TRIGGER);
            
set_pev(particleEntpev_movetypeMOVETYPE_NOCLIP);
            
set_pev(particleEntpev_rendermoderenderMode);
            
set_pev(particleEntpev_renderamtfRenderAmt);
            
set_pev(particleEntpev_scalefScale);

            
set_task(fLifeTime"TaskRemoveParticle"particleEnt+TASKID_SUM_REMOVE_PARTICLE);
        }
    }
}

public 
TaskRemoveParticle(taskID)
{
    new 
ent taskID TASKID_SUM_REMOVE_PARTICLE;
    
set_pev(entpev_flagspev(entpev_flags) | FL_KILLME);
    
dllfunc(DLLFunc_Thinkent);


api_player_burn.amxx
Código PHP:
#pragma semicolon 1

#include <amxmodx>
#include <hamsandwich>
#include <fakemeta>

#define PLUGIN    "[API] Player Burn"
#define VERSION    "0.3.1"
#define AUTHOR    "Hedgehog Fog"

#define MAX_PLAYERS            32

#define CBASEPLAYER_LINUX_OFFSET 5
#define m_flVelocityModifier 108

#define TASKID_SUM_BURN        1000

#define DMG_BURN_PAINSHOCK    0.5
#define DMG_BURN_AMOUNT        3.0

new Array:g_playerAttacker;

new 
g_flagPlayerBurn;

new 
g_sprFlame;
new 
g_sprSmoke;

new 
g_maxPlayers;

new const 
g_szSndBurn[] = "ambience/burning1.wav";

public 
plugin_precache()
{
    
g_sprFlame precache_model("sprites/xffloor.spr");
    
g_sprSmoke precache_model("sprites/black_smoke3.spr");

    
precache_sound(g_szSndBurn);
}

public 
plugin_init()
{
    
register_plugin(PLUGINVERSIONAUTHOR);

    
RegisterHam(Ham_Spawn"player""on_player_spawn", .Post 1);
    
RegisterHam(Ham_Killed"player""on_player_killed", .Post 0);
    
RegisterHam(Ham_TakeDamage"player""on_player_takeDamage", .Post 1);
    
RegisterHam(Ham_Player_PostThink"player""on_player_prethink", .Post 1);

    
g_maxPlayers get_maxplayers();

    
g_playerAttacker ArrayCreate(1g_maxPlayers+1);
    for (new 
0<= g_maxPlayers; ++i) {
        
ArrayPushCell(g_playerAttacker0);
    }
}

public 
plugin_natives()
{
    
register_library("api_player_burn");
    
register_native("burn_player""native_burn_player");
    
register_native("extinguish_player""native_extinguish_player");
    
register_native("is_player_burn""native_is_player_burn");
}

public 
plugin_end()
{
    
ArrayDestroy(g_playerAttacker);
}

/*----[ Natives ]----*/

public bool:native_is_player_burn(plugin_idargc)
{
    new 
id get_param(1);

    return 
is_player_burn(id);
}

public 
native_burn_player(plugin_idargc)
{
    new 
id get_param(1);
    new 
inflictor get_param(2);
    new 
burnTime get_param(3);

    
burn_player(idinflictorburnTime);
}

public 
native_extinguish_player(plugin_idargc)
{
    new 
id get_param(1);

    
extinguish_player(id);
}

/*----[ Private methods ]----*/

bool:is_player_burn(id)
{
    if(
g_flagPlayerBurn & (<< (id 31)))
        return 
true;

    return 
false;
}

burn_player(idattackerburnTime)
{
    if(!
is_user_alive(id))
        return;

    if(
is_player_burn(id))
        return;

    
g_flagPlayerBurn |= (<< (id 31));

    
ArraySetCell(g_playerAttackeridattacker);

    
remove_task(id+TASKID_SUM_BURN);

    
set_task(0.2"task_player_burn_effect"id+TASKID_SUM_BURN__"b");
    
set_task(1.0"task_player_burn_damage"id+TASKID_SUM_BURN__"b");

    if(
burnTime 0)
        
set_task(float(burnTime), "task_player_extinguish"id+TASKID_SUM_BURN);
}

extinguish_player(id)
{
    
remove_task(id+TASKID_SUM_BURN);
    
g_flagPlayerBurn &= ~(<< (id 31));

    
ArraySetCell(g_playerAttackerid0);
    
emit_sound(idCHAN_VOICEg_szSndBurnVOL_NORMATTN_NORMSND_STOPPITCH_NORM);
}

/*----[ Events ]----*/

#if AMXX_VERSION_NUM < 183
    
public client_disconnect(id)
#else
    
public client_disconnected(id)
#endif
{
    if(
is_player_burn(id))
        
extinguish_player(id);
}

public 
on_player_killed(victimattacker)
{
    if(!
is_player_burn(victim)) {
        return;
    }

    if(!
attacker) {
        
SetHamParamEntity(2ArrayGetCell(g_playerAttackervictim));
    }

    
extinguish_player(victim);
}

public 
on_player_spawn(id)
{
    if(!
is_user_alive(id))
        return;

    if(
is_player_burn(id)) {
        
extinguish_player(id);
    }
}

public 
on_player_takeDamage(victiminflictorattackerFloat:damagedamageType)
{
    if(
attacker)
        return;

    if(!
is_player_burn(victim))
        return;

    if(!(
damageType DMG_BURN))
        return;

    new 
Float:fPainShock get_pdata_float(victimm_flVelocityModifierCBASEPLAYER_LINUX_OFFSET);
    
fPainShock fPainShock/DMG_BURN_PAINSHOCK*0.80;
    
set_pdata_float(victimm_flVelocityModifierfPainShockCBASEPLAYER_LINUX_OFFSET);
}

public 
on_player_prethink(id)
{
    if (~
pev(idpev_flags) & FL_INWATER)
        return;

    if (!
is_user_alive(id))
        return;

    if(
is_player_burn(id))
        
extinguish_player(id);
}

/*----[ Tasks ]----*/

public task_player_burn_effect(taskID)
{
    new 
id taskID TASKID_SUM_BURN;

    if(!
is_user_alive(id))
        return;

    static 
Float:fOrigin[3];
    
pev(idpev_originfOrigin);

    
engfunc(EngFunc_MessageBeginMSG_PVSSVC_TEMPENTITYfOrigin0);
    
write_byte(TE_SPRITE);
    
engfunc(EngFunc_WriteCoordfOrigin[0]);
    
engfunc(EngFunc_WriteCoordfOrigin[1]);
    
engfunc(EngFunc_WriteCoordfOrigin[2]);
    
write_short(g_sprFlame);
    
write_byte(random_num(510));
    
write_byte(200);
    
message_end();

    
engfunc(EngFunc_MessageBeginMSG_PVSSVC_TEMPENTITYfOrigin0);
    
write_byte(TE_SMOKE);
    
engfunc(EngFunc_WriteCoordfOrigin[0]);
    
engfunc(EngFunc_WriteCoordfOrigin[1]);
    
engfunc(EngFunc_WriteCoordfOrigin[2]-48.0);
    
write_short(g_sprSmoke);
    
write_byte(random_num(1520));
    
write_byte(random_num(1020));
    
message_end();

    
emit_sound(idCHAN_VOICEg_szSndBurnVOL_NORMATTN_NORM0PITCH_NORM);
}

public 
task_player_burn_damage(taskID)
{
    new 
id taskID TASKID_SUM_BURN;

    if(!
is_user_alive(id))
        return;

    
UTIL_CS_DamagePlayer(idDMG_BURN_AMOUNTDMG_BURN00);
}

public 
task_player_extinguish(taskID)
{
    new 
id taskID TASKID_SUM_BURN;
    
extinguish_player(id);
}

stock UTIL_CS_DamagePlayer(victimFloat:fDamagedmgbits DMG_GENERICattacker 0inflictor 0)
{
    new 
armorType get_pdata_int(victim112);
    
set_pdata_int(victim1120);
    
ExecuteHamB(Ham_TakeDamagevictiminflictorattackerfDamagedmgbits);
    
set_pdata_int(victim112armorType);


api_player_cosmetic.amxx
Código PHP:
#pragma semicolon 1

#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>

#include <nvault>

#include <api_player_inventory>
#include <api_player_cosmetic>

#define PLUGIN "[Player Inventory Item] Cosmetic"
#define VERSION "1.0.0"
#define AUTHOR "Hedgehog Fog"

#define TASKID_SUM_PLAYER_TIMER 1000

#define ITEM_TYPE "cosmetic"
#define UNUSUAL_ENTITY_RENDER_AMT 1.0

enum ItemState
{
    
ItemState_None 0,
    
ItemState_Equiped,
    
ItemState_Equip,
    
ItemState_Unequip
};

enum ItemData
{
    
ItemData_Cosmetic 0,
    
PCosmetic_Type:ItemData_CosmeticType,
    
ItemData_Time,
    
ItemState:ItemData_State,
    
ItemData_Entity
};

new 
Trie:g_cosmeticIndexes;
new Array:
g_cosmeticName;
new Array:
g_cosmeticGroups;
new Array:
g_cosmeticModelIndex;
new Array:
g_cosmeticUnusualColor;
new 
g_cosmeticCount 0;

new Array:
g_playerRenderMode;
new Array:
g_playerRenderAmt;

new 
g_allocClassname;

new 
PInv_ItemType:g_itemType;
new 
g_hVault;

new 
g_maxPlayers;

public 
plugin_precache()
{
    
g_allocClassname engfunc(EngFunc_AllocString"info_target");

    
g_hVault nvault_open("api_player_cosmetic");
    
g_itemType PInv_RegisterItemType(ITEM_TYPE);
}

public 
plugin_init()
{
    
register_plugin(PLUGINVERSIONAUTHOR);

    
RegisterHam(Ham_Spawn"player""OnPlayerSpawn", .Post 1);
    
RegisterHam(Ham_Killed"player""OnPlayerKilled", .Post 1);

    
g_playerRenderMode ArrayCreate(1g_maxPlayers+1);
    
g_playerRenderAmt ArrayCreate(1g_maxPlayers+1);

    
g_maxPlayers get_maxplayers();

    for (new 
0<= g_maxPlayers; ++i) {
        
ArrayPushCell(g_playerRenderMode0);
        
ArrayPushCell(g_playerRenderAmt0);
    }
}

public 
plugin_natives()
{
    
register_library("api_player_cosmetic");
    
register_native("PCosmetic_Register""Native_Register");
    
register_native("PCosmetic_Give""Native_Give");

    
register_native("PCosmetic_Equip""Native_Equip");
    
register_native("PCosmetic_Unequip""Native_Unequip");
    
register_native("PCosmetic_IsItemEquiped""Native_IsItemEquiped");
    
register_native("PCosmetic_CanBeEquiped""Native_CanBeEquiped");

    
register_native("PCosmetic_GetItemCosmetic""Native_GetItemCosmetic");
    
register_native("PCosmetic_GetItemCosmeticType""Native_GetItemCosmeticType");
    
register_native("PCosmetic_GetItemTime""Native_GetItemTime");

    
register_native("PCosmetic_GetCosmeticName""Native_GetCosmeticName");
    
register_native("PCosmetic_GetCosmeticGroups""Native_GetCosmeticGroups");
}

public 
plugin_end()
{
    
ArrayDestroy(g_playerRenderMode);
    
ArrayDestroy(g_playerRenderAmt);
}

#if AMXX_VERSION_NUM < 183
    
public client_disconnect(id)
#else
    
public client_disconnected(id)
#endif
{
    new 
size PInv_Size(id);
    for (new 
0size; ++i)
    {
        new 
PInv_ItemType:itemType PInv_GetItemType(idi);
        if (
itemType != g_itemType) {
            continue;
        }

        
Unequip(idi, .changeState false);
    }

    
ClearPlayerTasks(id);
}

/*--------------------------------[ Hooks ]--------------------------------*/

public OnPlayerSpawn(id)
{
    if (!
is_user_alive(id)) {
        return;
    }

    
UpdateEquipment(id);
    
SetupPlayerTasks(id);
}

public 
OnPlayerKilled(id)
{
    
ClearPlayerTasks(id);
}

/*--------------------------------[ Natives ]--------------------------------*/

public Native_Register(pluginIDargc)
{
    new 
szName[32];
    
get_string(1szNamecharsmax(szName));

    new 
PCosmetic_Groups:groups PCosmetic_Groups:get_param(2);
    new 
modelIndex get_param(3);

    new 
Float:color[3];
    
get_array_f(4color3);

    return 
Register(szNamegroupsmodelIndexcolor);
}

public 
Native_Give(pluginIDargc)
{
    new 
id get_param(1);
    new 
cosmetic get_param(2);
    new 
PCosmetic_Type:cosmeticType PCosmetic_Type:get_param(3);
    new 
time get_param(4);

    return 
Give(idcosmeticcosmeticTypetime);
}

public 
Native_GetCosmeticName(pluginIDargc)
{
    new 
cosmetic get_param(1);
    new 
maxlen get_param(3);

    static 
szName[32];
    
ArrayGetString(g_cosmeticNamecosmeticszNamecharsmax(szName));
    
set_string(2szNamemaxlen);
}

public 
Native_GetCosmeticGroups(pluginIDargc)
{
    new 
cosmetic get_param(1);

    return 
ArrayGetCell(g_cosmeticGroupscosmetic);
}

public 
Native_Equip(pluginIDargc)
{
    new 
id get_param(1);
    new 
slotIdx get_param(2);

    new Array:
item = Array:PInv_GetItem(idslotIdx);
    new 
ItemState:itemState ArrayGetCell(item_:ItemData_State);

    if (
itemState == ItemState_None) {
        
itemState ItemState_Equip;
    } else if (
itemState == ItemState_Unequip) {
        
itemState ItemState_Equiped;
    }

    
ArraySetCell(item_:ItemData_StateitemState);
}

public 
Native_Unequip(pluginIDargc)
{
    new 
id get_param(1);
    new 
slotIdx get_param(2);

    new Array:
item = Array:PInv_GetItem(idslotIdx);
    new 
ItemState:itemState ArrayGetCell(item_:ItemData_State);

    if (
itemState == ItemState_Equiped) {
        
itemState ItemState_Unequip;
    } else if (
itemState == ItemState_Equip) {
        
itemState ItemState_None;
    }

    
ArraySetCell(item_:ItemData_StateitemState);
}

public 
Native_IsItemEquiped(pluginIDargc)
{
    new 
id get_param(1);
    new 
slotIdx get_param(2);

    new Array:
item = Array:PInv_GetItem(idslotIdx);
    new 
ItemState:itemState ArrayGetCell(item_:ItemData_State);

    return (
itemState == ItemState_Equiped || itemState == ItemState_Equip);
}

public 
Native_CanBeEquiped(pluginIDargc)
{
    new 
id get_param(1);
    new 
cosmetic get_param(2);
    new 
ignoreSlotIdx get_param(3);

    return 
CanBeEquiped(idcosmeticignoreSlotIdx);
}

public 
Native_GetItemCosmetic(pluginIDargc)
{
    new 
id get_param(1);
    new 
slotIdx get_param(2);

    new Array:
item = Array:PInv_GetItem(idslotIdx);
    return 
ArrayGetCell(item_:ItemData_Cosmetic);
}

public 
Native_GetItemCosmeticType(pluginIDargc)
{
    new 
id get_param(1);
    new 
slotIdx get_param(2);

    new Array:
item = Array:PInv_GetItem(idslotIdx);
    return 
ArrayGetCell(item_:ItemData_CosmeticType);
}

public 
Native_GetItemTime(pluginIDargc)
{
    new 
id get_param(1);
    new 
slotIdx get_param(2);

    new Array:
item = Array:PInv_GetItem(idslotIdx);
    return 
ArrayGetCell(item_:ItemData_Time);
}

/*--------------------------------[ Events ]--------------------------------*/

public PInv_Event_SlotLoaded(idslotIdx)
{
    new 
PInv_ItemType:itemType PInv_GetItemType(idslotIdx);
    if (
PInv_ItemType:itemType != g_itemType) {
        return; 
//Invalid item type
    
}

    new 
item PInv_GetItem(idslotIdx);

    new 
cosmetic;
    new 
PCosmetic_Type:cosmeticType;
    new 
itemTime;
    new 
ItemState:itemState;

    if (
item == _:Invalid_Array) {
        return; 
//Handler is invalid
    
}

    if (!
LoadItem(itemcosmeticcosmeticTypeitemTimeitemState)) {
        
PInv_SetItem(idslotIdxInvalid_ArrayPInv_Invalid_ItemType);
        
PInv_TakeItem(idslotIdx);
        return; 
//Invalid cosmetic
    
}

    
item _:CreateCosmetic(cosmeticcosmeticTypeitemTime);

    if (
itemState == ItemState_Equiped) {
        
itemState ItemState_Equip;
    } else if (
itemState == ItemState_Unequip) {
        
itemState ItemState_None;
    }

    
PInv_SetItem(idslotIdxitemg_itemType);
    
ArraySetCell(Array:item_:ItemData_StateitemState); //Change state of item
}

public 
PInv_Event_SlotSaved(idslotIdx)
{
    new 
PInv_ItemType:itemType PInv_GetItemType(idslotIdx);
    if (
itemType != g_itemType) {
        return; 
//Invalid item type
    
}

    new 
item PInv_GetItem(idslotIdx);
    if (
item == _:Invalid_Array) {
        return; 
//Handler is invalid
    
}

    
SaveItem(item); //Save data about handler
}

public 
PInv_Event_TakeSlot(idslotIdx)
{
    new 
PInv_ItemType:itemType PInv_GetItemType(idslotIdx);
    if (
itemType != g_itemType) {
        return; 
//Invalid item type
    
}

    new Array:
item PInv_GetItem(idslotIdx);
    if (
item == Invalid_Array) {
        return; 
//Handler is invalid
    
}

    
ArrayDestroy(item);
}

public 
PInv_Event_Destroy()
{
    
TrieDestroy(g_cosmeticIndexes);

    if (
g_cosmeticCount)  {
        
ArrayDestroy(g_cosmeticName);
        
ArrayDestroy(g_cosmeticGroups);
        
ArrayDestroy(g_cosmeticModelIndex);
        
ArrayDestroy(g_cosmeticUnusualColor);
    }

    
nvault_close(g_hVault);
}

/*--------------------------------[ Methods ]--------------------------------*/

Array:CreateCosmetic(cosmeticPCosmetic_Type:cosmeticTypetime)
{
    new Array:
item ArrayCreate(1_:ItemData);
    for (new 
0_:ItemData; ++i) {
        
ArrayPushCell(item0);
    }

    
ArraySetCell(item_:ItemData_Cosmeticcosmetic);
    
ArraySetCell(item_:ItemData_CosmeticTypecosmeticType);
    
ArraySetCell(item_:ItemData_Timetime);
    
ArraySetCell(item_:ItemData_StateItemState_None);

    return 
item;
}

Register(const szName[], PCosmetic_Groups:groupsmodelIndex, const Float:unusualColor[3])
{
    if (!
g_cosmeticCount) {
        
g_cosmeticName ArrayCreate(32);
        
g_cosmeticGroups ArrayCreate();
        
g_cosmeticModelIndex ArrayCreate();
        
g_cosmeticUnusualColor ArrayCreate(3);
        
g_cosmeticIndexes TrieCreate();
    }

    
ArrayPushString(g_cosmeticNameszName);
    
ArrayPushCell(g_cosmeticGroupsgroups);
    
ArrayPushCell(g_cosmeticModelIndexmodelIndex);
    
ArrayPushArray(g_cosmeticUnusualColorunusualColor);

    new 
cosmetic g_cosmeticCount;
    
TrieSetCell(g_cosmeticIndexesszNamecosmetic);

    
g_cosmeticCount++;

    return 
cosmetic;
}

Give(idcosmeticPCosmetic_Type:cosmeticTypetime)
{
    new 
slotIdx = -1;
    new Array:
item Invalid_Array;

    new 
size PInv_Size(id);
    for (new 
0size; ++i)
    {
        if (
g_itemType != PInv_GetItemType(idi)) {
            continue;
        }

        
item = Array:PInv_GetItem(idi);
        new 
itemCosmetic ArrayGetCell(item_:ItemData_Cosmetic);
        new 
PCosmetic_Type:itemCosmeticType ArrayGetCell(item_:ItemData_CosmeticType);

        if (
cosmetic == itemCosmetic && cosmeticType == itemCosmeticType) {
            
slotIdx i;
            break;
        }
    }

    if (
slotIdx == -1) {
        
item CreateCosmetic(cosmeticcosmeticTypetime);
        
slotIdx PInv_GiveItem(iditemg_itemType);
    }

    return 
slotIdx;
}

Equip(idslotIdx)
{
    new 
PInv_ItemType:itemType PInv_GetItemType(idslotIdx);
    if (
itemType != g_itemType) {
        return; 
//Is not a cosmetic
    
}

    new Array:
item = Array:PInv_GetItem(idslotIdx);

    new 
ItemState:itemState ArrayGetCell(item_:ItemData_State);

    if (
itemState == ItemState_Equiped) {
        return; 
//Already equiped
    
}

    new 
cosmetic ArrayGetCell(item_:ItemData_Cosmetic);
    if (!
CanBeEquiped(idcosmeticslotIdx)) {
        return; 
//Can't be equiped
    
}

    new 
PCosmetic_Type:cosmeticType ArrayGetCell(item_:ItemData_CosmeticType);

    new 
ent CreateCosmeticEntity(idcosmeticcosmeticType);
    
ArraySetCell(item_:ItemData_Entityent);
    
ArraySetCell(item_:ItemData_StateItemState_Equiped);
}

Unequip(idslotIdxbool:changeState true)
{
    new 
PInv_ItemType:itemType PInv_GetItemType(idslotIdx);
    if (
itemType != g_itemType) {
        return; 
//Is not a cosmetic
    
}

    new Array:
item = Array:PInv_GetItem(idslotIdx);
    new 
ItemState:itemState ArrayGetCell(item_:ItemData_State);

    if (
itemState == ItemState_None) {
        return; 
//Not equiped
    
}

    new 
ent ArrayGetCell(item_:ItemData_Entity);
    if (
pev_valid(ent)) {
        
set_pev(entpev_movetypeMOVETYPE_NONE);
        
set_pev(entpev_aiment0);
        
engfunc(EngFunc_RemoveEntityent);
    }

    
ArraySetCell(item_:ItemData_Entity0);

    if (
changeState) {
        
ArraySetCell(item_:ItemData_StateItemState_None);
    }

    new 
itemTime ArrayGetCell(item_:ItemData_Time);
    if (
itemTime <= 0) {
        
PInv_TakeItem(idslotIdx);
    }
}

bool:CanBeEquiped(idcosmeticignoreSlotIdx = -1)
{
    new 
cosmeticGroups ArrayGetCell(g_cosmeticGroupscosmetic);

    new 
size PInv_Size(id);
    for (new 
0size; ++i)
    {
        if (
== ignoreSlotIdx) {
            continue;
        }

        new 
PInv_ItemType:itemType PInv_GetItemType(idi);
        if (
itemType != g_itemType) {
            continue;
        }

        new Array:
item = Array:PInv_GetItem(idi);

        new 
ItemState:itemState ArrayGetCell(item_:ItemData_State);
        if (
itemState != ItemState_Equiped && itemState != ItemState_Equip) {
            continue; 
//This item not equiped.
        
}

        new 
itemCosmetic ArrayGetCell(item_:ItemData_Cosmetic);
        if (
cosmetic == itemCosmetic) {
            return 
false//This item is already equiped
        
}

        new 
itemCosmeticGroups ArrayGetCell(g_cosmeticGroupsitemCosmetic);
        if (
cosmeticGroups itemCosmeticGroups) {
            return 
false//Item with some groups already equiped
        
}
    }

    return 
true;
}

CreateCosmeticEntity(ownercosmeticPCosmetic_Type:type PCosmetic_Type_Normal)
{
    new 
ent engfunc(EngFunc_CreateNamedEntityg_allocClassname);
    
set_pev(entpev_movetypeMOVETYPE_FOLLOW);
    
set_pev(entpev_aimentowner);

    if (
type == PCosmetic_Type_Unusual) {
        static 
Float:color[3];
        
ArrayGetArray(g_cosmeticUnusualColorcosmeticcolor);

        
set_pev(entpev_renderfxkRenderFxGlowShell);
        
set_pev(entpev_rendercolorcolor);
        
set_pev(entpev_renderamtUNUSUAL_ENTITY_RENDER_AMT);
    }

    new 
modelIndex ArrayGetCell(g_cosmeticModelIndexcosmetic);
    
set_pev(entpev_modelindexmodelIndex);

    return 
ent;
}

UpdateEquipment(id)
{
    if (!
g_cosmeticCount) {
        return;
    }

    new 
size PInv_Size(id);
    for (new 
0size; ++i)
    {
        new 
PInv_ItemType:itemType PInv_GetItemType(idi);
        if (
itemType != g_itemType) {
            continue; 
//Invalid item type
        
}

        new Array:
item = Array:PInv_GetItem(idi);
        new 
ItemState:itemState ArrayGetCell(item_:ItemData_State);

        if (
itemState == ItemState_Equip) {
            
Equip(idi);
        } else if (
itemState == ItemState_Unequip) {
            
Unequip(idi);
        }
    }
}

SetupPlayerTasks(id)
{
    if (!
task_exists(id)) {
        
set_task(0.1"TaskPlayerThink"id__"b");
    }

    if (!
task_exists(id+TASKID_SUM_PLAYER_TIMER)) {
        
set_task(1.0"TaskPlayerTimer"id+TASKID_SUM_PLAYER_TIMER__"b");
    }
}

ClearPlayerTasks(id)
{
    
remove_task(id);
    
remove_task(id+TASKID_SUM_PLAYER_TIMER);
}

/*--------------------------------[ Vault ]--------------------------------*/

bool:LoadItem(any:item, &cosmetic, &PCosmetic_Type:cosmeticType, &itemTime, &ItemState:itemState)
{
    if (!
g_cosmeticCount) {
        return 
false;
    }

    new 
szKey[32];
    new 
szValue[32];

    
//cosmetic;
    
{
        
format(szKeycharsmax(szKey), "%i_name"item);
        
nvault_get(g_hVaultszKeyszValuecharsmax(szValue));
        
nvault_remove(g_hVaultszKey);

        if (
szValue[0] == '^0') {
            return 
false;
        }

        if (!
TrieKeyExists(g_cosmeticIndexesszValue)) {
            return 
false;
        }

        
//Get index by name
        
if (!TrieGetCell(g_cosmeticIndexesszValuecosmetic)) {
            return 
false;
        }
    }

    
//cosmeticType;
    
{
        
format(szKeycharsmax(szKey), "%i_cosmeticType"item);
        
cosmeticType PCosmetic_Type:nvault_get(g_hVaultszKey);
        
nvault_remove(g_hVaultszKey);
    }

    
//itemTime;
    
{
        
format(szKeycharsmax(szKey), "%i_time"item);
        
itemTime nvault_get(g_hVaultszKey);
        
nvault_remove(g_hVaultszKey);
    }

    
//ItemState:itemState;
    
{
        
format(szKeycharsmax(szKey), "%i_state"item);
        
itemState ItemState:nvault_get(g_hVaultszKey);
        
nvault_remove(g_hVaultszKey);
    }

    return 
true;
}

SaveItem(any:item)
{
    new 
itemTime ArrayGetCell(item_:ItemData_Time);
    if (
itemTime <= 0) {
        return;
    }

    new 
szKey[32];
    new 
szValue[32];

    new 
cosmetic ArrayGetCell(item_:ItemData_Cosmetic);
    {
        
format(szKeycharsmax(szKey), "%i_name"item);
        
ArrayGetString(g_cosmeticNamecosmeticszValuecharsmax(szValue));

        
nvault_set(g_hVaultszKeyszValue);
    }

    new 
cosmeticType ArrayGetCell(item_:ItemData_CosmeticType);
    {
        
format(szKeycharsmax(szKey), "%i_cosmeticType"item);
        
format(szValuecharsmax(szValue), "%i"cosmeticType);

        
nvault_set(g_hVaultszKeyszValue);
    }

    
//itemTime
    
{
        
format(szKeycharsmax(szKey), "%i_time"item);
        
format(szValuecharsmax(szValue), "%i"itemTime);

        
nvault_set(g_hVaultszKeyszValue);
    }

    new 
ItemState:itemState ArrayGetCell(item_:ItemData_State);
    {
        
format(szKeycharsmax(szKey), "%i_state"item);
        
format(szValuecharsmax(szValue), "%i"itemState);

        
nvault_set(g_hVaultszKeyszValue);
    }
}

/*--------------------------------[ Tasks ]--------------------------------*/

public TaskPlayerTimer(taskID)
{
    new 
id taskID TASKID_SUM_PLAYER_TIMER;

    if (!
is_user_alive(id)) {
        return;
    }

    new 
size PInv_Size(id);
    for (new 
0size; ++i)
    {
        if (
g_itemType != PInv_GetItemType(idi)) {
            continue; 
//Invalid item type
        
}

        new Array:
item = Array:PInv_GetItem(idi);
        new 
ItemState:itemState ArrayGetCell(item_:ItemData_State);

        if (
itemState == ItemState_None) {
            continue; 
//This item not equiped.
        
}

        if (
itemState == ItemState_Equip) {
            continue; 
//This item not equiped.
        
}

        new 
time ArrayGetCell(item_:ItemData_Time) - 1;
        if (
time >= 0) {
            
ArraySetCell(item_:ItemData_Timetime);
        } else {
            
ArraySetCell(item_:ItemData_StateItemState_Unequip);
        }
    }
}

public 
TaskPlayerThink(id)
{
    new 
renderMode pev(idpev_rendermode);

    static 
Float:renderAmt;
    
pev(idpev_renderamtrenderAmt);

    if (
renderMode != ArrayGetCell(g_playerRenderModeid)
        || 
renderAmt != ArrayGetCell(g_playerRenderAmtid))
    {
        
ArraySetCell(g_playerRenderModeidrenderMode);
        
ArraySetCell(g_playerRenderAmtidrenderAmt);

        new 
size PInv_Size(id);
        for (new 
0size; ++i)
        {
            if (
g_itemType != PInv_GetItemType(idi)) {
                continue;
            }

            new Array:
item = Array:PInv_GetItem(idi);

            if (
ArrayGetCell(item_:ItemData_State) != ItemState_Equiped
                
&& ArrayGetCell(item_:ItemData_State) != ItemState_Unequip) {
                continue;
            }

            new 
ent ArrayGetCell(item_:ItemData_Entity);
            if (!
ent) {
                continue;
            }

            
set_pev(entpev_rendermoderenderMode);

            if (
ArrayGetCell(item_:ItemData_CosmeticType) == PCosmetic_Type_Normal) {
                
set_pev(entpev_renderamtrenderAmt);
            } else {
                
set_pev(entpev_renderamtUNUSUAL_ENTITY_RENDER_AMT);
            }
        }
    }


api_player_inventory.amxx

Código PHP:
#pragma semicolon 1

#include <amxmodx>

#include <cellarray>
#include <celltrie>

#include <nvault>

#include <api_player_inventory>

#define PLUGIN "[API] Player Inventory"
#define VERSION "1.0.0"
#define AUTHOR "Hedgehog Fog"

enum _:Slot
{
    
Slot_Item,
    
Slot_ItemType
};

new 
g_fwNewSlot;
new 
g_fwTakeSlot;
new 
g_fwSlotLoaded;
new 
g_fwSlotSaved;
new 
g_fwResult;
new 
g_fwDestroy;

new 
g_hVault;

new Array:
g_playerInventories;

new 
Trie:g_itemTypeHandlers;
new Array:
g_itemTypeNames;
new 
g_itemTypeCount 0;

new Array:
g_userAuthID;

new 
g_maxPlayers;

public 
plugin_precache()
{
    
g_hVault nvault_open("api_player_inventory");

    
g_fwNewSlot CreateMultiForward("PInv_Event_NewSlot"ET_IGNOREFP_CELLFP_CELL);
    
g_fwTakeSlot CreateMultiForward("PInv_Event_TakeSlot"ET_IGNOREFP_CELLFP_CELL);
    
g_fwSlotLoaded CreateMultiForward("PInv_Event_SlotLoaded"ET_IGNOREFP_CELLFP_CELL);
    
g_fwSlotSaved CreateMultiForward("PInv_Event_SlotSaved"ET_IGNOREFP_CELLFP_CELL);
    
g_fwDestroy CreateMultiForward("PInv_Event_Destroy"ET_IGNORE);
}

public 
plugin_init()
{
    
register_plugin(PLUGINVERSIONAUTHOR);

    
g_maxPlayers get_maxplayers();

    
g_playerInventories ArrayCreate(1g_maxPlayers+1);
    for (new 
0<= g_maxPlayers; ++i) {
        
ArrayPushCell(g_playerInventoriesInvalid_Array);
    }
}

public 
plugin_end()
{
    for (new 
id 1id <= g_maxPlayers; ++id) {
        
SavePlayerInventory(id);
        
DestroyPlayerInventory(id);
    }

    
ArrayDestroy(g_playerInventories);

    if (
g_itemTypeCount) {
        
TrieDestroy(g_itemTypeHandlers);
        
ArrayDestroy(g_itemTypeNames);
    }

    if (
g_userAuthID != Invalid_Array) {
        
ArrayDestroy(g_userAuthID);
    }

    
nvault_close(g_hVault);

    
ExecuteForward(g_fwDestroyg_fwResult);
}

public 
plugin_natives()
{
    
register_library("api_player_inventory");

    
register_native("PInv_RegisterItemType""Native_RegisterItemType");
    
register_native("PInv_GetItemTypeHandler""Native_GetItemTypeHandler");
    
register_native("PInv_GetItem""Native_GetItem");
    
register_native("PInv_GetItemType""Native_GetItemType");
    
register_native("PInv_GiveItem""Native_GiveItem");
    
register_native("PInv_TakeItem""Native_TakeItem");
    
register_native("PInv_SetItem""Native_SetItem");
    
register_native("PInv_Size""Native_Size");
}

public 
client_authorized(id)
{
    if (
g_userAuthID == Invalid_Array) {
        
g_userAuthID ArrayCreate(32g_maxPlayers+1);
        for (new 
0<= g_maxPlayers; ++i) {
            
ArrayPushCell(g_userAuthID0);
        }
    }

    static 
authID[32];
    
get_user_authid(idauthIDcharsmax(authID));
    
ArraySetString(g_userAuthIDidauthID);
}

public 
client_putinserver(id)
{
    
LoadPlayerInventory(id);
}

#if AMXX_VERSION_NUM < 183
    
public client_disconnect(id)
#else
    
public client_disconnected(id)
#endif
{
    
SavePlayerInventory(id);
}

/*--------------------------------[ Natives ]--------------------------------*/

public Native_RegisterItemType(pluginIDargc)
{
    new 
typeName[32];
    
get_string(1typeNamecharsmax(typeName));

    return 
RegisterItemType(typeName);
}

public 
PInv_ItemType:Native_GetItemTypeHandler(pluginIDargc)
{
    new 
typeName[32];
    
get_string(1typeNamecharsmax(typeName));

    new 
PInv_ItemType:itemType;
    if (!
TrieGetCell(g_itemTypeHandlerstypeNameitemType)) {
        return 
PInv_Invalid_ItemType;
    }

    return 
itemType;
}

public 
Native_GetItem(pluginIDargc)
{
    new 
id get_param(1);
    new 
slotIdx get_param(2);

    new Array:
inventory ArrayGetCell(g_playerInventoriesid);
    new Array:
slot ArrayGetCell(inventoryslotIdx);
    new 
item ArrayGetCell(slotSlot_Item);

    return 
item;
}

public 
Native_GetItemType(pluginIDargc)
{
    new 
id get_param(1);
    new 
slotIdx get_param(2);

    new Array:
inventory ArrayGetCell(g_playerInventoriesid);
    new Array:
slot ArrayGetCell(inventoryslotIdx);
    new 
itemType ArrayGetCell(slotSlot_ItemType);

    return 
itemType;
}

public 
Native_GiveItem(pluginIDargc)
{
    new 
id get_param(1);
    new 
item get_param(2);
    new 
itemType get_param(3);

    return 
GiveItem(iditemitemType);
}

public 
Native_TakeItem(pluginIDargc)
{
    new 
id get_param(1);
    new 
slotIdx get_param(2);

    
TakeItem(idslotIdx);
}

public 
Native_SetItem(pluginIDargc)
{
    new 
id get_param(1);
    new 
slotIdx get_param(2);
    new 
item get_param(3);
    new 
itemType get_param(4);

    
SetItem(idslotIdxitemitemType);
}

public 
Native_Size(pluginIDargc)
{
    new 
id get_param(1);

    new Array:
inventory ArrayGetCell(g_playerInventoriesid);
    if (
inventory == Invalid_Array) {
        return 
0;
    }

    return 
ArraySize(inventory);
}

/*--------------------------------[ Methods ]--------------------------------*/

RegisterItemType(const szTypeName[])
{
    if (!
g_itemTypeCount) {
        
g_itemTypeHandlers TrieCreate();
        
g_itemTypeNames ArrayCreate(32);
    }

    new 
itemType g_itemTypeCount;

    
ArrayPushString(g_itemTypeNamesszTypeName);
    
TrieSetCell(g_itemTypeHandlersszTypeNameitemType);

    
g_itemTypeCount++;

    return 
itemType;
}

GetItemTypeIndex(const szTypeName[])
{
    if (!
g_itemTypeHandlers) {
        return -
1;
    }

    new 
type 0;
    if (!
TrieGetCell(g_itemTypeHandlersszTypeNametype)) {
        return -
1;
    }

    return 
type;
}

GetItemTypeName(itemTypeszTypeName[], maxlen)
{
    
ArrayGetString(g_itemTypeNamesitemTypeszTypeNamemaxlen);
}

Array:
CreatePlayerInventory(id)
{
    new Array:
inventory ArrayCreate(1);
    
ArraySetCell(g_playerInventoriesidinventory);

    return 
inventory;
}

Array:
DestroyPlayerInventory(id)
{
    new Array:
inventory ArrayGetCell(g_playerInventoriesid);
    if (
inventory == Invalid_Array) {
        return;
    }

    
ArrayDestroy(inventory);
}

Array:
ClearPlayerInventory(id)
{
    new Array:
inventory ArrayGetCell(g_playerInventoriesid);
    if (
inventory == Invalid_Array) {
        return;
    }

    
ArrayClear(inventory);
}

AddSlot(Array:inventory)
{
    new Array:
slot ArrayCreate(1Slot);
    for (new 
0Slot; ++i) {
        
ArrayPushCell(slot0);
    }

    new 
index ArraySize(inventory);
    
ArrayPushCell(inventoryslot);
    return 
index;
}

GiveItem(iditemitemType)
{
    if (
itemType == _:PInv_Invalid_ItemType) {
        return -
1;
    }

    new Array:
inventory ArrayGetCell(g_playerInventoriesid);

    if (
inventory == Invalid_Array) {
        
inventory CreatePlayerInventory(id);
    }

    new 
slotIdx AddSlot(inventory);

    new Array:
slot ArrayGetCell(inventoryslotIdx);
    
ArraySetCell(slotSlot_Itemitem);
    
ArraySetCell(slotSlot_ItemTypeitemType);

    
ExecuteForward(g_fwNewSlotg_fwResultidslotIdx);
    return 
slotIdx;
}

TakeItem(idslotIdx)
{
    
ExecuteForward(g_fwTakeSlotg_fwResultidslotIdx);

    new Array:
inventory ArrayGetCell(g_playerInventoriesid);
    new Array:
slot ArrayGetCell(inventoryslotIdx);
    
ArraySetCell(slotSlot_ItemTypePInv_Invalid_ItemType);
}

SetItem(idslotIdxitemitemType)
{
    new Array:
inventory ArrayGetCell(g_playerInventoriesid);
    new Array:
slot ArrayGetCell(inventoryslotIdx);

    
ArraySetCell(slotSlot_Itemitem);
    
ArraySetCell(slotSlot_ItemTypeitemType);
}
/*--------------------------------[ Vault ]--------------------------------*/

LoadPlayerInventory(id)
{
    
ClearPlayerInventory(id);

    new 
authID[32];
    
ArrayGetString(g_userAuthIDidauthIDcharsmax(authID));

    new 
key[32];

    new 
size;
    {
        
format(keycharsmax(key), "%s_size"authID);
        
size nvault_get(g_hVaultkey);
    }

    
//Save items
    
for (new 0size; ++i)
    {
        static 
typeName[32];
        new 
itemType;
        {
            
format(keycharsmax(key), "%s_%i_itemType"authIDi);
            
nvault_get(g_hVaultkeytypeNamecharsmax(typeName));
            
itemType GetItemTypeIndex(typeName);
        }

        
/*if (itemType == _:PInv_Invalid_ItemType) {
            continue;
        }*/

        
new item;
        {
            
format(keycharsmax(key), "%s_%i_item"authIDi);
            
item nvault_get(g_hVaultkey);
        }

        new 
slotIdx GiveItem(iditemitemType);
        
ExecuteForward(g_fwSlotLoadedg_fwResultidslotIdx);
    }
}

SavePlayerInventory(id)
{
    if (
g_userAuthID == Invalid_Array) {
        return;
    }

    new Array:
inventory ArrayGetCell(g_playerInventoriesid);
    if (
inventory == Invalid_Array) {
        return;
    }

    new 
size ArraySize(inventory);
    if (!
size) {
        return;
    }

    new 
authID[32];
    
ArrayGetString(g_userAuthIDidauthIDcharsmax(authID));

    new 
key[32];
    new 
value[32];

    
//Save items
    
new inventorySize 0;
    for (new 
0size; ++i)
    {
        new Array:
slot ArrayGetCell(inventoryi);

        new 
itemType ArrayGetCell(slotSlot_ItemType);
        if (
itemType == _:PInv_Invalid_ItemType) {
            continue;
        }

        new 
item ArrayGetCell(slotSlot_Item);
        {
            
format(keycharsmax(key), "%s_%i_item"authIDinventorySize);
            
format(valuecharsmax(value), "%i"item);
            
nvault_set(g_hVaultkeyvalue);
        }

        
//itemType
        
{
            static 
itemTypeName[32];
            
format(keycharsmax(key), "%s_%i_itemType"authIDinventorySize);
            
GetItemTypeName(itemTypeitemTypeNamecharsmax(itemTypeName));
            
nvault_set(g_hVaultkeyitemTypeName);
        }

        
inventorySize++;

        
ExecuteForward(g_fwSlotSavedg_fwResultidi);
    }

    
//Save inventory size
    
{
        
format(keycharsmax(key), "%s_size"authID);
        
format(valuecharsmax(value), "%i"inventorySize);

        
nvault_set(g_hVaultkeyvalue);
    }



esos serian
Responder
#4
No me sirve el código xD

Me refiero a los models / sprites. Vuelve a instalarlos en tu servidor y cópialos en tu cliente.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)