| Flick3rR |
08-08-2014 12:01 |
ArrayGetArray problem, help with ArrayPushArray
Hello, guys! I decided to practice a bit with arrays and started to make something like GAG plugin. So, the idea is just to learn how to properly use the arrays. Well, seems like my problem occurs in pushing array into array. Like when I have to gag the player and push the data into the array, I can't figure it out. However, the idea is that admin gags a player, then some strings and integers are saved into the array:
PHP Code:
enum _:GagInfo { Trie:Gagged, Reason[64], AdminName[32], Date[32], Len }
The trie in the enum is the place where I save gagged IDs (it's a trie)
Well, every time I try to gag a player, I do the following:
PHP Code:
public cmdGag(id, level, cid) { if(!cmd_access(id, level, cid, 4)) return PLUGIN_HANDLED new arg1[32], arg2[32], arg3[32] read_argv(1, arg1, charsmax(arg1)) read_argv(2, arg2, charsmax(arg2)) read_argv(3, arg3, charsmax(arg3)) new target = cmd_target(id, arg1, 0) new iTime = str_to_num(arg2) if(get_gagged_id(target) > -1) { console_print(id, "The player is already gagged") return PLUGIN_HANDLED } new szID[16] get_user_authid(target, szID, charsmax(szID)) new szTimeDate[64] get_time("%d/%m/%Y %H:%M:%S", szTimeDate, charsmax(szTimeDate)) new szAdminName[32] get_user_name(id, szAdminName, charsmax(szAdminName)) new aData[GagInfo] aData[Gagged] = _:TrieCreate() copy(aData[Reason], charsmax(aData[Reason]), arg3) copy(aData[AdminName], charsmax(aData[AdminName]), szAdminName) copy(aData[Date], charsmax(aData[Date]), szTimeDate) aData[Len] = iTime ArrayPushArray(g_aGaggedPlayers, aData) SetPlayerGagged(target, ArraySize(g_aGaggedPlayers)) ArrayGetArray(g_aGaggedPlayers, get_gagged_id(target), aData) console_print(id, "The player is successfuly gagged!") console_print(id, "Reason: %s", aData[Reason]) console_print(id, "Admin: %s", aData[AdminName]) console_print(id, "Date: %s", aData[Date]) console_print(id, "Lenght: %d seconds", aData[Len]) return PLUGIN_CONTINUE }
g_aGaggedPlayers is my array, I create it like:
PHP Code:
new Array:g_aGaggedPlayers /*INIT*/ g_aGaggedPlayers = ArrayCreate(GagInfo)
Okay, let's see the stocks:
PHP Code:
stock SetPlayerGagged(id, size) { new aData[GagInfo] new szID[32] get_user_authid(id, szID, charsmax(szID)) if(size > -1) { ArrayGetArray(g_aGaggedPlayers, size, aData) TrieSetCell(aData[Gagged], szID, 1) ArraySetArray(g_aGaggedPlayers, size, aData) } }
stock get_gagged_id(const id) { new szID[32] get_user_authid(id, szID, charsmax(szID)) new aData[GagInfo] for(new i; i < ArraySize(g_aGaggedPlayers); i++) { ArrayGetArray(g_aGaggedPlayers, i, aData) if(TrieKeyExists(aData[Gagged], szID)) return i } return -1 }
Where is the problem, I cant figure out. Why it is not properly pushing the array. Just to say, I got an error in arraygetarray in SetPlayerGagged stock. When I try to use it with the size of ArraySize(g_aGaggedPlayers).
Code:
L 08/08/2014 - 18:58:59: Invalid cellvector handle provided (1:1:1)
L 08/08/2014 - 18:58:59: [AMXX] Displaying debug trace (plugin "AdvancedGag.amxx")
L 08/08/2014 - 18:58:59: [AMXX] Run time error 10: native error (native "ArrayGetArray")
L 08/08/2014 - 18:58:59: [AMXX] [0] AdvancedGag.sma::SetPlayerGagged (line 185)
L 08/08/2014 - 18:58:59: [AMXX] [1] AdvancedGag.sma::cmdGag (line 115)
Any help appreciated!
PHP Code:
#include <amxmodx> #include <amxmisc> #include <colorchat>
#define PLUGIN "GAG" #define VERSION "1.0" #define AUTHOR "Flicker"
new const szPrefix[] = "[GAG]"
const ACCESS = ADMIN_BAN
new Array:g_aGaggedPlayers
enum _:GagInfo { Trie:Gagged, Reason[64], AdminName[32], Date[32], Len }
public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) register_concmd("amx_gag", "cmdGag", ACCESS, "<nick> <time> ^"reason^"") register_concmd("amx_ungag", "cmdUnGag", ACCESS, "<nick>") register_clcmd("say /gag", "gagme") register_clcmd("say", "cmdSay") register_clcmd("say_team", "cmdSay") g_aGaggedPlayers = ArrayCreate(GagInfo) }
public gagme(id) { if(get_gagged_id(id) > -1) { RemovePlayerGag(id, get_gagged_id(id)) client_print(id, print_chat, "Ungagged") } else { new aData[GagInfo] aData[Gagged] = _:TrieCreate() copy(aData[Reason], charsmax(aData[Reason]), "") copy(aData[AdminName], charsmax(aData[AdminName]), "") copy(aData[Date], charsmax(aData[Date]), "") aData[Len] = 0 ArrayPushArray(g_aGaggedPlayers, aData) SetPlayerGagged(id, ArraySize(g_aGaggedPlayers)) client_print(id, print_chat, "Gagged!") } }
public cmdSay(id) { if(get_gagged_id(id) > -1) { client_print(id, print_chat, "You are gagged!") return PLUGIN_HANDLED } else return PLUGIN_CONTINUE return PLUGIN_CONTINUE }
public cmdGag(id, level, cid) { if(!cmd_access(id, level, cid, 4)) return PLUGIN_HANDLED new arg1[32], arg2[32], arg3[32] read_argv(1, arg1, charsmax(arg1)) read_argv(2, arg2, charsmax(arg2)) read_argv(3, arg3, charsmax(arg3)) new target = cmd_target(id, arg1, 0) new iTime = str_to_num(arg2) if(get_gagged_id(target) > -1) { console_print(id, "The player is already gagged") return PLUGIN_HANDLED } new szID[16] get_user_authid(target, szID, charsmax(szID)) new szTimeDate[64] get_time("%d/%m/%Y %H:%M:%S", szTimeDate, charsmax(szTimeDate)) new szAdminName[32] get_user_name(id, szAdminName, charsmax(szAdminName)) new aData[GagInfo] aData[Gagged] = _:TrieCreate() copy(aData[Reason], charsmax(aData[Reason]), arg3) copy(aData[AdminName], charsmax(aData[AdminName]), szAdminName) copy(aData[Date], charsmax(aData[Date]), szTimeDate) aData[Len] = iTime ArrayPushArray(g_aGaggedPlayers, aData) SetPlayerGagged(target, ArraySize(g_aGaggedPlayers)) ArrayGetArray(g_aGaggedPlayers, get_gagged_id(target), aData) console_print(id, "The player is successfuly gagged!") console_print(id, "Reason: %s", aData[Reason]) console_print(id, "Admin: %s", aData[AdminName]) console_print(id, "Date: %s", aData[Date]) console_print(id, "Lenght: %d seconds", aData[Len]) return PLUGIN_CONTINUE }
public cmdUnGag(id, level, cid) { if(!cmd_access(id, level, cid, 2)) return PLUGIN_HANDLED new arg1[32] read_argv(1, arg1, charsmax(arg1)) new target = cmd_target(id, arg1, 0) if(get_gagged_id(target) < 0) { console_print(id, "The player is not gagged") return PLUGIN_HANDLED } RemovePlayerGag(target, get_gagged_id(target)) console_print(id, "Player successfully ungagged!") return PLUGIN_CONTINUE }
stock gChat(const id, const szMsg[], any:...) { new szText[192] vformat(szText, charsmax(szText), szMsg, 3) ColorChat(id, GREEN, "%s^1 %s", szPrefix, szText) }
stock get_gagged_id(const id) { new szID[32] get_user_authid(id, szID, charsmax(szID)) new aData[GagInfo] for(new i; i < ArraySize(g_aGaggedPlayers); i++) { ArrayGetArray(g_aGaggedPlayers, i, aData) if(TrieKeyExists(aData[Gagged], szID)) return i } return -1 }
stock SetPlayerGagged(id, size) { new aData[GagInfo] new szID[32] get_user_authid(id, szID, charsmax(szID)) if(size > -1) { ArrayGetArray(g_aGaggedPlayers, size, aData) TrieSetCell(aData[Gagged], szID, 1) ArraySetArray(g_aGaggedPlayers, size, aData) } }
stock RemovePlayerGag(id, size) { new aData[GagInfo] new szID[32] get_user_authid(id, szID, charsmax(szID)) if(size > -1) { ArrayGetArray(g_aGaggedPlayers, size, aData) TrieDeleteKey(aData[Gagged], szID) ArraySetArray(g_aGaggedPlayers, size, aData) } }
The command /gag (gagme()) is a test command. Doesn't matter!
|