Add cs_get_item_alias() native & cleanup alias datas

This commit is contained in:
Arkshine
2016-01-24 19:29:09 +01:00
parent 664c25bdac
commit c3a52b366e
8 changed files with 165 additions and 233 deletions

View File

@ -19,6 +19,7 @@
*/
#define CSI_NONE CSW_NONE
#define CSI_P228 CSW_P228
#define CSI_GLOCK CSW_GLOCK // Unused by game
#define CSI_SCOUT CSW_SCOUT
#define CSI_HEGRENADE CSW_HEGRENADE
#define CSI_XM1014 CSW_XM1014
@ -73,6 +74,7 @@
*/
#define CSW_NONE 0
#define CSW_P228 1
#define CSW_GLOCK 2 // Unused by game
#define CSW_SCOUT 3
#define CSW_HEGRENADE 4
#define CSW_XM1014 5

View File

@ -162,7 +162,7 @@ DETOUR_DECL_STATIC1(C_ClientCommand, void, edict_t*, pEdict) // void ClientComma
UTIL_StringToLower(command, commandLowered, sizeof(commandLowered));
if (ItemsManager.GetAliasInfosFromBuy(commandLowered, &info))
if (ItemsManager.GetAliasInfos(commandLowered, &info))
{
CurrentItemId = info.itemid;
}

View File

@ -24,7 +24,6 @@ char WeaponNameList[MAX_WEAPONS][64];
CsItemInfo::CsItemInfo()
:
m_ParseState(PSTATE_ALIASES_TYPE),
m_List(nullptr),
m_ListsRetrievedFromConfig(false)
{}
@ -35,9 +34,8 @@ CsItemInfo::~CsItemInfo()
void CsItemInfo::Clear()
{
m_CommonAliasesList.clear();
m_WeaponAliasesList.clear();
m_BuyAliasesList.clear();
m_BuyAliasesAltList.clear();
}
bool CsItemInfo::HasConfigError()
@ -51,33 +49,15 @@ SMCResult CsItemInfo::ReadSMC_NewSection(const SMCStates *states, const char *na
{
case PSTATE_ALIASES_TYPE:
{
m_List = nullptr;
if (!strcmp(name, "CommonAlias"))
{
m_List = &m_CommonAliasesList;
}
else if (!strcmp(name, "WeaponAlias"))
{
m_List = &m_WeaponAliasesList;
}
else if (!strcmp(name, "BuyAlias") || !strcmp(name, "BuyEquipAlias") || !strcmp(name, "BuyAmmoAlias"))
{
m_List = &m_BuyAliasesList;
}
if (m_List)
if (!strcmp(name, "BuyAliases"))
{
m_ParseState = PSTATE_ALIASES_ALIAS;
}
break;
}
case PSTATE_ALIASES_ALIAS:
{
m_AliasInfo.clear();
m_Alias = name;
m_ParseState = PSTATE_ALIASES_ALIAS_DEFS;
break;
}
@ -129,6 +109,10 @@ SMCResult CsItemInfo::ReadSMC_KeyValue(const SMCStates *states, const char *key,
}
}
}
else if (!strcmp(key, "altname"))
{
m_AliasAlt = value;
}
break;
}
}
@ -147,11 +131,16 @@ SMCResult CsItemInfo::ReadSMC_LeavingSection(const SMCStates *states)
}
case PSTATE_ALIASES_ALIAS_DEFS:
{
m_List->replace(m_Alias.chars(), m_AliasInfo);
if (m_AliasAlt.length())
{
m_BuyAliasesAltList.replace(m_AliasAlt.chars(), m_AliasInfo);
m_AliasInfo.alt_alias = Move(m_AliasAlt);
}
m_BuyAliasesList.replace(m_Alias.chars(), m_AliasInfo);
m_WeaponIdToClass[m_AliasInfo.itemid] = static_cast<CsWeaponClassType>(m_AliasInfo.classid);
m_AliasInfo.clear();
m_ParseState = PSTATE_ALIASES_ALIAS;
break;
}
@ -170,7 +159,7 @@ void CsItemInfo::ReadSMC_ParseEnd(bool halted, bool failed)
bool CsItemInfo::GetAliasInfos(const char *alias, AliasInfo *info)
{
if (GetAliasInfosFromBuy(alias, info) || m_WeaponAliasesList.retrieve(alias, info))
if (m_BuyAliasesList.retrieve(alias, info) || m_BuyAliasesAltList.retrieve(alias, info))
{
return true;
}
@ -178,11 +167,17 @@ bool CsItemInfo::GetAliasInfos(const char *alias, AliasInfo *info)
return false;
}
bool CsItemInfo::GetAliasInfosFromBuy(const char *alias, AliasInfo *info)
bool CsItemInfo::GetAliasFromId(size_t id, ke::AString &name, ke::AString &altname)
{
if (m_CommonAliasesList.retrieve(alias, info) || m_BuyAliasesList.retrieve(alias, info))
for (auto iter = m_BuyAliasesList.iter(); !iter.empty(); iter.next())
{
return true;
if (iter->value.itemid == id)
{
name = iter->key;
altname = iter->value.alt_alias;
return true;
}
}
return false;
@ -190,47 +185,50 @@ bool CsItemInfo::GetAliasInfosFromBuy(const char *alias, AliasInfo *info)
bool CsItemInfo::GetAliasInfosFromName(const char *name, AliasInfo *info)
{
static const char prefix_weapon[] = "weapon_";
static const char prefix_item[] = "item_";
static const char prefix_weapon[] = "weapon";
static const char prefix_item[] = "item";
const char *alias = name;
static const size_t prefix_weapon_length = sizeof(prefix_weapon) - 1;
static const size_t prefix_item_length = sizeof(prefix_item) - 1;
if (strstr(name, prefix_weapon) && strcmp(name + sizeof(prefix_weapon) - 1, "shield"))
if (name[prefix_weapon_length] == '_' && !strncmp(name, prefix_weapon, prefix_weapon_length))
{
for (size_t id = 0; id < ARRAYSIZE(WeaponNameList); ++id)
{
if (!strcmp(name, WeaponNameList[id]))
{
info->classname = name;
info->itemid = id;
info->classid = WeaponIdToClass(id);
name += prefix_weapon_length + 1; // including '_'
}
else if (name[prefix_item_length] == '_' && !strncmp(name, prefix_item, prefix_item_length))
{
name += prefix_item_length + 1;
}
return true;
}
for (size_t id = 0; id < ARRAYSIZE(WeaponNameList); ++id)
{
const char *weapon = WeaponNameList[id];
if (weapon[prefix_weapon_length] == '_' && !strncmp(weapon, prefix_weapon, prefix_weapon_length))
{
weapon += prefix_weapon_length + 1;
}
alias = name + sizeof(prefix_weapon) - 1;
}
else if (strstr(name, prefix_item))
{
for (auto iter = m_BuyAliasesList.iter(); !iter.empty(); iter.next())
if (!strcmp(weapon, name))
{
if (iter->value.classname.length() && !iter->value.classname.compare(name))
{
*info = iter->value;
return true;
}
info->classname = name;
info->itemid = id;
info->classid = WeaponIdToClass(id);
return true;
}
alias = name + sizeof(prefix_item) - 1;
}
if (GetAliasInfos(alias, info))
for (auto iter = m_BuyAliasesList.iter(); !iter.empty(); iter.next())
{
return true;
if (iter->value.classname.length() && !strcmp(iter->value.classname.chars() + prefix_item_length + 1, name))
{
*info = iter->value;
return true;
}
}
return false;
return GetAliasInfos(name, info);
}
CsWeaponClassType CsItemInfo::WeaponIdToClass(int id)

View File

@ -31,11 +31,14 @@ struct AliasInfo
{
itemid = CSI_NONE;
classid = CS_WEAPONCLASS_NONE;
classname = nullptr;
alt_alias = nullptr;
}
int itemid;
int classid;
ke::AString classname;
ke::AString alt_alias;
};
enum class Equipments
@ -73,8 +76,8 @@ class CsItemInfo : public ITextListener_SMC
public:
bool GetAliasInfos(const char *alias, AliasInfo *info);
bool GetAliasInfosFromBuy(const char *alias, AliasInfo *info);
bool GetAliasInfosFromName(const char *classname, AliasInfo *info);
bool GetAliasFromId(size_t id, ke::AString &name, ke::AString &altname);
CsWeaponClassType WeaponIdToClass(int id);
@ -84,17 +87,16 @@ class CsItemInfo : public ITextListener_SMC
typedef StringHashMap<AliasInfo> AliasMap;
AliasMap m_CommonAliasesList;
AliasMap m_WeaponAliasesList;
AliasMap m_BuyAliasesList;
AliasMap m_BuyAliasesAltList;
CsWeaponClassType m_WeaponIdToClass[CSI_MAX_COUNT];
private: // Config parsing
int m_ParseState;
AliasMap* m_List;
ke::AString m_Alias;
ke::AString m_AliasAlt;
AliasInfo m_AliasInfo;
bool m_ListsRetrievedFromConfig;
int m_EquipmentsPrice[static_cast<size_t>(Equipments::Count)];

View File

@ -1809,6 +1809,40 @@ static cell AMX_NATIVE_CALL cs_get_item_id(AMX* amx, cell* params)
return CSI_NONE;
}
// native bool:cs_get_item_alias(itemid, name[], name_maxlen, altname[] = "", altname_maxlen = 0);
static cell AMX_NATIVE_CALL cs_get_item_alias(AMX* amx, cell* params)
{
if (ItemsManager.HasConfigError())
{
MF_LogError(amx, AMX_ERR_NATIVE, "Native cs_get_item_alias() is disabled because of corrupted or missing gamedata");
return 0;
}
auto itemid = params[1];
if (itemid == CSI_SHIELDGUN)
{
itemid = CSI_SHIELD;
}
else if (itemid == CSI_GLOCK)
{
itemid = CSI_GLOCK18;
}
else if (itemid <= CSI_NONE || itemid >= CSI_MAX_COUNT)
{
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid item id: %d", itemid);
return FALSE;
}
ke::AString name, altname;
auto result = ItemsManager.GetAliasFromId(itemid, name, altname);
MF_SetAmxString(amx, params[2], name.chars(), params[3]);
MF_SetAmxString(amx, params[4], altname.chars(), params[5]);
return result ? TRUE : FALSE;
}
// native bool:cs_get_translated_item_alias(const alias[], itemname[], maxlength);
static cell AMX_NATIVE_CALL cs_get_translated_item_alias(AMX* amx, cell* params)
{
@ -2005,6 +2039,7 @@ AMX_NATIVE_INFO CstrikeNatives[] =
{"cs_find_ent_by_class", cs_find_ent_by_class},
{"cs_find_ent_by_owner", cs_find_ent_by_owner},
{"cs_get_item_id", cs_get_item_id},
{"cs_get_item_alias", cs_get_item_alias},
{"cs_get_translated_item_alias",cs_get_translated_item_alias},
{"cs_get_weapon_info", cs_get_weapon_info},
{"cs_get_user_weapon_entity", cs_get_user_weapon_entity},