Skip to content

Commit

Permalink
Add cs_set_ent_class native
Browse files Browse the repository at this point in the history
  • Loading branch information
Arkshine committed Feb 9, 2016
1 parent 664c25b commit 2928c62
Show file tree
Hide file tree
Showing 5 changed files with 82 additions and 2 deletions.
16 changes: 16 additions & 0 deletions gamedata/modules.games/game.cstrike.txt
Expand Up @@ -79,6 +79,22 @@
"mac" "@_Z23UTIL_FindEntityByStringP11CBaseEntityPKcS2_"
}

"AddEntityHashValue" // void AddEntityHashValue(struct entvars_s *pev, const char *value, hash_types_e fieldType)
{
"library" "server"
"windows" "\x8B\x2A\x2A\x2A\x83\x2A\x2A\x85\x2A\x53\x55\x56\x57\x0F"
"linux" "@_Z18AddEntityHashValueP9entvars_sPKc12hash_types_e"
"mac" "@_Z18AddEntityHashValueP9entvars_sPKc12hash_types_e"
}

"RemoveEntityHashValue" // void RemoveEntityHashValue(struct entvars_s *pev, const char *value, hash_types_e fieldType)
{
"library" "server"
"windows" "\x8B\x2A\x2A\x2A\x53\x8B\x2A\x55\x8A\x2A\x33"
"linux" "@_Z21RemoveEntityHashValueP9entvars_sPKc12hash_types_e"
"mac" "@_Z21RemoveEntityHashValueP9entvars_sPKc12hash_types_e"
}

"GetWeaponInfo" // WeaponInfoStruct *GetWeaponInfo(int id);
{
"library" "server"
Expand Down
12 changes: 12 additions & 0 deletions modules/cstrike/cstrike/CstrikeHacks.cpp
Expand Up @@ -39,6 +39,8 @@ CDetour *BuyGunAmmoDetour;
CreateNamedEntityFunc CS_CreateNamedEntity;
UTIL_FindEntityByStringFunc CS_UTIL_FindEntityByString;
GetWeaponInfoFunc GetWeaponInfo;
AddEntityHashValueFunc AddEntityHashValue;
RemoveEntityHashValueFunc RemoveEntityHashValue;

int CurrentItemId;
bool TriggeredFromCommand;
Expand Down Expand Up @@ -537,6 +539,16 @@ void InitFuncsAddresses()
GetWeaponInfo = reinterpret_cast<GetWeaponInfoFunc>(address);
}

if (MainConfig->GetMemSig("AddEntityHashValue", &address)) // cs_set_ent_class()
{
AddEntityHashValue = reinterpret_cast<AddEntityHashValueFunc>(address);
}

if (MainConfig->GetMemSig("RemoveEntityHashValue", &address)) // cs_set_ent_class()
{
RemoveEntityHashValue = reinterpret_cast<RemoveEntityHashValueFunc>(address);
}


if (!CS_CreateNamedEntity)
{
Expand Down
9 changes: 9 additions & 0 deletions modules/cstrike/cstrike/CstrikeHacks.h
Expand Up @@ -54,13 +54,22 @@ extern CDetour *CanBuyThisDetour;
extern CDetour *GiveDefaultItemsDetour;
extern CDetour *BuyGunAmmoDetour;

enum class HashType
{
Classname
};

typedef edict_t* (*CreateNamedEntityFunc)(string_t iszClassname);
typedef void* (*UTIL_FindEntityByStringFunc)(void* pStartEntity, const char *szKeyword, const char *szValue);
typedef WeaponInfoStruct* (*GetWeaponInfoFunc)(int id);
typedef void (*AddEntityHashValueFunc)(struct entvars_s *pev, const char *value, HashType fieldType);
typedef void (*RemoveEntityHashValueFunc)(struct entvars_s *pev, const char *value, HashType fieldType);

extern CreateNamedEntityFunc CS_CreateNamedEntity;
extern UTIL_FindEntityByStringFunc CS_UTIL_FindEntityByString;
extern GetWeaponInfoFunc GetWeaponInfo;
extern AddEntityHashValueFunc AddEntityHashValue;
extern RemoveEntityHashValueFunc RemoveEntityHashValue;

extern CDetour *GiveDefaultItemsDetour;
extern enginefuncs_t *g_pengfuncsTable;
Expand Down
29 changes: 29 additions & 0 deletions modules/cstrike/cstrike/CstrikeNatives.cpp
Expand Up @@ -1782,6 +1782,34 @@ static cell AMX_NATIVE_CALL cs_find_ent_by_owner(AMX* amx, cell* params)
return 0;
}

// cs_set_ent_class(index, const classname[])
static cell AMX_NATIVE_CALL cs_set_ent_class(AMX* amx, cell* params)
{
if (AddEntityHashValue <= 0 || RemoveEntityHashValue <= 0)
{
MF_LogError(amx, AMX_ERR_NATIVE, "Native cs_set_ent_class() is disabled. Check your amxx logs.");
return 0;
}

auto entity = params[1];
CHECK_ENTITY_SIMPLE(entity);

auto pev = TypeConversion.id_to_entvars(entity);

if (pev->classname)
{
RemoveEntityHashValue(pev, STRING(pev->classname), HashType::Classname);
}

int length;
auto new_classname = MF_GetAmxString(amx, params[2], 0, &length);

pev->classname = ALLOC_STRING(new_classname);
AddEntityHashValue(pev, STRING(pev->classname), HashType::Classname);

return 1;
}

// native any:cs_get_item_id(const name[], &CsWeaponClassType:classid = CS_WEAPONCLASS_NONE);
static cell AMX_NATIVE_CALL cs_get_item_id(AMX* amx, cell* params)
{
Expand Down Expand Up @@ -2004,6 +2032,7 @@ AMX_NATIVE_INFO CstrikeNatives[] =
{"cs_create_entity", cs_create_entity },
{"cs_find_ent_by_class", cs_find_ent_by_class},
{"cs_find_ent_by_owner", cs_find_ent_by_owner},
{"cs_set_ent_class", cs_set_ent_class },
{"cs_get_item_id", cs_get_item_id},
{"cs_get_translated_item_alias",cs_get_translated_item_alias},
{"cs_get_weapon_info", cs_get_weapon_info},
Expand Down
18 changes: 16 additions & 2 deletions plugins/include/cstrike.inc
Expand Up @@ -1015,7 +1015,7 @@ native cs_create_entity(const classname[]);
* classname lookup compared to the default FindEntityByString (used by
* find_ent_by_class() for example).
* @note This exclusively considers entities in the hashtable, created by the
* game itself or using cs_create_entity().
* game itself, using cs_create_entity(), or added via cs_set_ent_class().
*
* @param start_index Entity index to start searching from. -1 to start from
* the first entity
Expand All @@ -1034,7 +1034,7 @@ native cs_find_ent_by_class(start_index, const classname[]);
* classname lookup compared to the default FindEntityByString (used by
* find_ent_by_owner() for example).
* @note This exclusively considers entities in the hashtable, created by the
* game itself or using cs_create_entity().
* game itself, using cs_create_entity(), or added via cs_set_ent_class().
*
* @param start_index Entity index to start searching from. -1 to start from
* the first entity
Expand All @@ -1045,6 +1045,20 @@ native cs_find_ent_by_class(start_index, const classname[]);
*/
native cs_find_ent_by_owner(start_index, const classname[], owner);

/**
* Sets a custom classname of an entity.
*
* @note Unlike other mods CS keeps track of entities using a custom hashtable.
* This function adds or updates the classname in the hasthable as well.
* This is useful for use with cs_find_ent_by_class() and cs_find_ent_by_owner().
*
* @param index Entity index
* @param classname Classname to update for
*
* @noreturn
*/
native cs_set_ent_class(index, const classname[]);

/**
* Returns the item id associated with an item name and its aliases.
*
Expand Down

0 comments on commit 2928c62

Please sign in to comment.