I'm having a bit of difficulty converting a plugin from tf2itemsinfo over to econ data
Original code source (not mine):
https://github.com/NoradTF2/Fixed-Uber-Upgrades
I'm struggling with the proper way to use TF2Econ_GetItemStaticAttributes to replace TF2II_GetItemNumAttributes, TF2II_GetItemAttributeID, and TF2II_GetItemAttributeValue.
Original code:
PHP Code:
public DefineAttributesTab(client, itemidx, slot)
{
//PrintToChat(client, "Entering Def attr tab, ent id: %d", itemidx);
//PrintToChat(client, " #dattrtab item carried: %d - item_buff: %d", itemidx, currentitem_idx[client][slot]);
if (currentitem_idx[client][slot] == 9999)
{
new a, a2, i, a_i;
currentitem_idx[client][slot] = itemidx;
new inumAttr = TF2II_GetItemNumAttributes( itemidx );
for( a = 0, a2 = 0; a < inumAttr && a < 42; a++ )
{
decl String:Buf[64];
a_i = TF2II_GetItemAttributeID( itemidx, a);
TF2II_GetAttribName( a_i, Buf, 64);
// if (!GetTrieValue(_upg_names, Buf, i))
// {
// i = _u_id
// upgradesNames[i] = Buf
// upgrades_costs[i] = 1
// SetTrieValue(_upg_names, Buf, _u_id++)
// upgrades_to_a_id[i] = a_i
// }
if (GetTrieValue(_upg_names, Buf, i))
{
currentupgrades_idx[client][slot][a2] = i;
upgrades_ref_to_idx[client][slot][i] = a2;
currentupgrades_val[client][slot][a2] = TF2II_GetItemAttributeValue( itemidx, a );
//PrintToChat(client, "init-attribute-[%s]%d [%d ; %f]",
// upgradesNames[currentupgrades_idx[client][slot][a2]],
// itemidx, i, currentupgrades_val[client][slot][a]);
a2++;
}
}
currentupgrades_number[client][slot] = a2;
}
else
{
if (itemidx > 0 && itemidx != currentitem_idx[client][slot])
{
ResetClientUpgrade_slot(client, slot);
new a, a2, i, a_i;
currentitem_idx[client][slot] = itemidx;
new inumAttr = TF2II_GetItemNumAttributes( itemidx );
for( a = 0, a2 = 0; a < inumAttr && a < 42; a++ )
{
decl String:Buf[64];
a_i = TF2II_GetItemAttributeID( itemidx, a);
TF2II_GetAttribName( a_i, Buf, 64);
// if (!GetTrieValue(_upg_names, Buf, i))
// {
// i = _u_id
// upgradesNames[i] = Buf
// upgrades_costs[i] = 1
// SetTrieValue(_upg_names, Buf, _u_id++)
// upgrades_to_a_id[i] = a_i
// }
if (GetTrieValue(_upg_names, Buf, i))
{
currentupgrades_idx[client][slot][a2] = i;
upgrades_ref_to_idx[client][slot][i] = a2;
currentupgrades_val[client][slot][a2] = TF2II_GetItemAttributeValue( itemidx, a );
//PrintToChat(client, "init-attribute-%d [%d ; %f]", itemidx, i, currentupgrades_val[client][slot][a]);
a2++;
}
}
currentupgrades_number[client][slot] = a2;
}
}
//PrintToChat(client, "..finish #dattrtab ");
}
This is as far as I got before I was stumped:
PHP Code:
public DefineAttributesTab(client, itemidx, slot)
{
if (currentitem_idx[client][slot] == 9999)
{
new a, a2, i, a_i;
currentitem_idx[client][slot] = itemidx;
new inumAttr = 0;
new Handle:hAttributes = TF2Econ_GetItemStaticAttributes(itemidx);
if(hAttributes == INVALID_HANDLE)
{
inumAttr = 0;
}
else
{
inumAttr = RoundToFloor( float( GetArraySize( hAttributes ) ) / 2.0 );
}
for( a = 0, a2 = 0; a < inumAttr && a < 42; a++ )
{
decl String:Buf[64];
a_i = TF2II_GetItemAttributeID( itemidx, a);
TF2Econ_GetAttributeName( a_i, Buf, 64);
if (GetTrieValue(_upg_names, Buf, i))
{
currentupgrades_idx[client][slot][a2] = i;
upgrades_ref_to_idx[client][slot][i] = a2;
currentupgrades_val[client][slot][a2] = TF2II_GetItemAttributeValue( itemidx, a );
a2++;
}
}
delete hAttributes;
currentupgrades_number[client][slot] = a2;
}
else
{
if (itemidx > 0 && itemidx != currentitem_idx[client][slot])
{
ResetClientUpgrade_slot(client, slot);
new a, a2, i, a_i;
currentitem_idx[client][slot] = itemidx;
new inumAttr = 0;
new Handle:hAttributes = TF2Econ_GetItemStaticAttributes(itemidx);
if(hAttributes == INVALID_HANDLE)
{
inumAttr = 0;
}
else
{
inumAttr = RoundToFloor( float( GetArraySize( hAttributes ) ) / 2.0 );
}
for( a = 0, a2 = 0; a < inumAttr && a < 42; a++ )
{
decl String:Buf[64];
a_i = TF2II_GetItemAttributeID( itemidx, a);
TF2Econ_GetAttributeName( a_i, Buf, 64);
if (GetTrieValue(_upg_names, Buf, i))
{
currentupgrades_idx[client][slot][a2] = i;
upgrades_ref_to_idx[client][slot][i] = a2;
currentupgrades_val[client][slot][a2] = TF2II_GetItemAttributeValue( itemidx, a );
a2++;
}
}
delete hAttributes;
currentupgrades_number[client][slot] = a2;
}
}
}
Information from tf_econ_data_compat.sp
PHP Code:
//TF2II_GetItemNumAttributes() can be done by getting the length of the ArrayList returned from TF2Econ_GetItemStaticAttributes().
CreateNative("TF2II_GetItemNumAttributes", Native_TF2II_GetItemNumAttributes);
//TF2II_GetItemAttributeName() can be done by getting the attribute ID from the ArrayList returned from TF2Econ_GetItemStaticAttributes(), calling TF2Econ_GetAttributeName() to get the name.
CreateNative("TF2II_GetItemAttributeName", Native_NotImplemented);
//TF2II_GetItemAttributeID() can be done by getting the attribute ID from the ArrayList returned from TF2Econ_GetItemStaticAttributes().
CreateNative("TF2II_GetItemAttributeID", Native_TF2II_GetItemAttributeID);
//TF2II_GetItemAttributeValue() can be done by getting the attribute value from TF2Econ_GetItemStaticAttributes(). This returns a raw 32-bit value; if the attribute is a string / vector you'll probably be better off calling TF2Econ_GetItemDefinitionString(defindex, "static_attrs/${attr}", ...) with the attribute name.
CreateNative("TF2II_GetItemAttributeValue", Native_TF2II_GetItemAttributeValue);
Can someone illustrate the proper usage of TF2Econ_GetItemStaticAttributes to get an attribute id and a value?