Veteran Member
Join Date: Jan 2010
Location: mom's basement
|
04-23-2020
, 15:59
Re: [CSGO] Get active bonus weapon in deathmatch
|
#3
|
I leave test code, of that second way to get bonus weapon in deathmatch.
- It read items_game.txt, to get weapon name with item definition index.
- Each player have own kind weapon load out, so you need look player m_EquippedLoadoutItemDefIndices with m_unDMBonusWeaponLoadoutSlot index
- in this sample, you get sm_test command and repeating timer.
Timer spam in chat 5 seconds before bonus start.
It's easier to get bonus weapon kill by using events, like I posted before.
PHP Code:
/*
m_unDMBonusWeaponLoadoutSlot
- weapon slot index, use in player m_EquippedLoadoutItemDefIndices
- m_EquippedLoadoutItemDefIndices return -> m_iItemDefinitionIndex (items_game.txt)
Note: CT and T have different bonus weapon load outs. Each player have different weapon load out
*/
#include <sdktools>
KeyValues csgo_items;
public void OnPluginStart()
{
csgo_items = new KeyValues("items_game");
if(!CSGO_ImportItems(csgo_items)) SetFailState("Fail - CSGO_ImportItems");
RegConsoleCmd("sm_test", test);
CreateTimer(1.0, mytimer, _, TIMER_REPEAT);
}
public Action test(int client, int args)
{
float m_flDMBonusStartTime = GameRules_GetPropFloat("m_flDMBonusStartTime");
float m_flDMBonusTimeLength = GameRules_GetPropFloat("m_flDMBonusTimeLength");
int m_unDMBonusWeaponLoadoutSlot = GameRules_GetProp("m_unDMBonusWeaponLoadoutSlot");
int m_bDMBonusActive = GameRules_GetProp("m_bDMBonusActive");
PrintToServer("m_flDMBonusStartTime %f\nm_flDMBonusTimeLength %f\nm_unDMBonusWeaponLoadoutSlot %i\nm_bDMBonusActive %i\n",
m_flDMBonusStartTime,
m_flDMBonusTimeLength,
m_unDMBonusWeaponLoadoutSlot,
m_bDMBonusActive);
float timenow = GetGameTime();
//int m_iItemDefinitionIndex;
//char value[MAX_NAME_LENGTH];
/*
for(int x = 0; x < GetEntPropArraySize(client, Prop_Send, "m_EquippedLoadoutItemDefIndices"); x++)
{
m_iItemDefinitionIndex = GetEntProp(client, Prop_Send, "m_EquippedLoadoutItemDefIndices", _, x);
CSGO_GetItemDefinitionClassName(m_iItemDefinitionIndex, value, sizeof(value));
PrintToServer("%i Item Class Name %i %s", x, m_iItemDefinitionIndex, value);
CSGO_GetItemDefinitionName(m_iItemDefinitionIndex, value, sizeof(value));
PrintToServer("%i Item Name %i %s\n", x, m_iItemDefinitionIndex, value);
}
*/
char value[MAX_NAME_LENGTH];
int m_iItemDefinitionIndex = GetEntProp(client, Prop_Send, "m_EquippedLoadoutItemDefIndices", _, m_unDMBonusWeaponLoadoutSlot);
CSGO_GetItemDefinitionName(m_iItemDefinitionIndex, value, sizeof(value));
PrintToChat(client, "Next bonus weapon %s start %0.2f seconds", value, m_flDMBonusStartTime - timenow);
return Plugin_Handled;
}
public Action mytimer(Handle timer)
{
// skip current bonus weapon
if(GameRules_GetProp("m_bDMBonusActive")) return Plugin_Continue;
float m_flDMBonusStartTime = GameRules_GetPropFloat("m_flDMBonusStartTime");
//float m_flDMBonusTimeLength = GameRules_GetPropFloat("m_flDMBonusTimeLength");
int m_unDMBonusWeaponLoadoutSlot = GameRules_GetProp("m_unDMBonusWeaponLoadoutSlot");
float timenow = GetGameTime();
if(0.0 < (m_flDMBonusStartTime - timenow) <= 5.0)
{
int m_iItemDefinitionIndex;
char value[MAX_NAME_LENGTH];
for(int i = 1; i <= MaxClients; i++)
{
if(!IsClientInGame(i) || GetClientTeam(i) <= 1) continue;
m_iItemDefinitionIndex = GetEntProp(i, Prop_Send, "m_EquippedLoadoutItemDefIndices", _, m_unDMBonusWeaponLoadoutSlot);
CSGO_GetItemDefinitionName(m_iItemDefinitionIndex, value, sizeof(value));
PrintToChat(i, "Next bonus weapon is %s", value);
}
}
return Plugin_Continue;
}
stock bool CSGO_ImportItems(KeyValues kv)
{
if(kv == null) return false;
KeyValues temp = new KeyValues("items_game");
if(!temp.ImportFromFile("scripts/items/items_game.txt"))
{
LogError("Couldn't import file scripts/items/items_game.txt");
delete temp;
return false;
}
if(!temp.GotoFirstSubKey(true))
{
LogError("KeyValues items_game not have sub key.");
delete temp;
return false;
}
char section[MAX_NAME_LENGTH];
// items_game.txt file have multiple "items" sections, all over the place.
// - This loop gather all "items" sections and copy to given KeyValues handle.
// - I may also need collect "prefabs", to get missing entity class name
do
{
if(!temp.GetSectionName(section, sizeof(section))) continue;
if(!StrEqual(section, "items", false) && !StrEqual(section, "prefabs", false)) continue;
//if(!StrEqual(section, "items", false)) continue;
if(!temp.GotoFirstSubKey(true))
{
continue;
}
kv.JumpToKey(section, true); // "items" or "prefabs"
do
{
if(!temp.GetSectionName(section, sizeof(section))) continue;
kv.JumpToKey(section, true);
kv.Import(temp);
kv.GoBack(); // Go Top of "items" or "prefabs" Section
}
while(temp.GotoNextKey(true));
kv.Rewind(); // Go Top
temp.GoBack();
}
while(temp.GotoNextKey(true))
delete temp;
//kv.ExportToFile("adidas.txt");
return true;
}
stock bool CSGO_GetItemDefinitionClassName(const int m_iItemDefinitionIndex, char[] item_class, item_class_size)
{
// Lets make sure, we are top of kv before go any further
csgo_items.Rewind();
char key[MAX_NAME_LENGTH];
if(m_iItemDefinitionIndex <= 0)
{
Format(key, sizeof(key), "default");
}
else
{
Format(key, sizeof(key), "%i", m_iItemDefinitionIndex);
}
// no item definition index match
if(!csgo_items.JumpToKey("items", false) || !csgo_items.JumpToKey(key, false))
{
Format(item_class, item_class_size, NULL_STRING);
csgo_items.Rewind();
return false;
}
csgo_items.GetString("item_class", item_class, item_class_size, "-1");
// item found, but couldn't find entity class name
// - look class name from "prefabs"
if(StrEqual(item_class, "-1", false))
{
csgo_items.GetString("prefab", key, sizeof(key), NULL_STRING);
csgo_items.Rewind();
// no item prefab found
if(!csgo_items.JumpToKey("prefabs", false) || !csgo_items.JumpToKey(key, false))
{
Format(item_class, item_class_size, NULL_STRING);
csgo_items.Rewind();
return false;
}
csgo_items.GetString("item_class", item_class, item_class_size, "-1");
// no entity class name found, fail.
if(StrEqual(item_class, "-1", false))
{
Format(item_class, item_class_size, NULL_STRING);
csgo_items.Rewind();
return false;
}
}
// we have entity class name, great!
csgo_items.Rewind();
return true;
}
// Translated #name works in chat/hint messages, and alone itself only. Translation stop working if you add extra text.
stock bool CSGO_GetItemDefinitionTranslatedName(const int m_iItemDefinitionIndex, char[] item_name, item_name_size)
{
// Lets make sure, we are top of kv before go any further
csgo_items.Rewind();
char key[MAX_NAME_LENGTH];
if(m_iItemDefinitionIndex <= 0)
{
Format(key, sizeof(key), "default");
}
else
{
Format(key, sizeof(key), "%i", m_iItemDefinitionIndex);
}
// no item definition index match
if(!csgo_items.JumpToKey("items", false) || !csgo_items.JumpToKey(key, false))
{
Format(item_name, item_name_size, NULL_STRING);
csgo_items.Rewind();
return false;
}
csgo_items.GetString("item_name", item_name, item_name_size, "-1");
// item found, but couldn't find item translated name
// - look translated name from "prefabs"
if(StrEqual(item_name, "-1", false))
{
csgo_items.GetString("prefab", key, sizeof(key), NULL_STRING);
csgo_items.Rewind();
// no item prefab found
if(!csgo_items.JumpToKey("prefabs", false) || !csgo_items.JumpToKey(key, false))
{
Format(item_name, item_name_size, NULL_STRING);
csgo_items.Rewind();
return false;
}
csgo_items.GetString("item_name", item_name, item_name_size, "-1");
// no item translated name found, fail.
if(StrEqual(item_name, "-1", false))
{
Format(item_name, item_name_size, NULL_STRING);
csgo_items.Rewind();
return false;
}
}
// we have item translated name, great!
csgo_items.Rewind();
return true;
}
stock bool CSGO_GetItemDefinitionName(const int m_iItemDefinitionIndex, char[] name, name_size)
{
// Lets make sure, we are top of kv before go any further
csgo_items.Rewind();
char key[MAX_NAME_LENGTH];
if(m_iItemDefinitionIndex <= 0)
{
Format(key, sizeof(key), "default"); // it's weapon_knife
}
else
{
Format(key, sizeof(key), "%i", m_iItemDefinitionIndex);
}
// no item definition index match
if(!csgo_items.JumpToKey("items", false) || !csgo_items.JumpToKey(key, false))
{
Format(name, name_size, NULL_STRING);
csgo_items.Rewind();
return false;
}
csgo_items.GetString("name", name, name_size, "-1");
if(StrEqual(name, "-1", false))
{
Format(name, name_size, NULL_STRING);
csgo_items.Rewind();
return false;
}
// we have item name, great!
csgo_items.Rewind();
return true;
}
__________________
Do not Private Message @me
|
|