AlliedModders

AlliedModders (https://forums.alliedmods.net/index.php)
-   Scripting Help (https://forums.alliedmods.net/forumdisplay.php?f=11)
-   -   Solved ttt_items_base.amxx problem (https://forums.alliedmods.net/showthread.php?t=340165)

JuanitoAlimana 10-29-2022 22:17

ttt_items_base.amxx problem
 
Every time I change map I get this error on the console;

[AMXX] Displaying debug trace (plugin "ttt_items_base.amxx", version "2.5.2")
[AMXX] Run time error 10: native error (native "ArrayClear")
[AMXX] [0] ttt_items_base.sma::ttt_gamemode (line 70)

PHP Code:

#include <amxmodx>
#include <cstrike>
#include <ttt>

enum _:ITEM_DATA
{
    
ITEM_NAME[TTT_ITEMLENGHT],
    
ITEM_COST,
    
ITEM_TEAM
}

new 
g_pCommandMenuIDg_pMsgBuyClose;
new 
g_iTotalItemsg_iSetupItems = -1;
new 
g_iItemForward, Array:g_aSetup;
new 
g_szItems[TTT_MAXSHOP][ITEM_DATA];

new const 
g_szBuyCommands[][] =  

    
"buy""buyequip""usp""glock""deagle""p228""elites""fn57""m3""xm1014""mp5""tmp""p90""mac10""ump45""ak47",  
    
"galil""famas""sg552""m4a1""aug""scout""awp""g3sg1""sg550""m249""vest""vesthelm""flash""hegren"
    
"sgren""defuser""nvgs""shield""primammo""secammo""km45""9x19mm""nighthawk""228compact""12gauge"
    
"autoshotgun""smg""mp""c90""cv47""defender""clarion""krieg552""bullpup""magnum""d3au1""krieg550"
    
"buyammo1""buyammo2""cl_autobuy""cl_rebuy""cl_setautobuy""cl_setrebuy"
};

public 
plugin_precache()
    
precache_sound("items/gunpickup2.wav");

public 
plugin_init()
{
    
register_plugin("[TTT] Item menu base"TTT_VERSIONTTT_AUTHOR);

    
register_clcmd("say /buy""ttt_buymenu_showit");
    
register_clcmd("say_team /buy""ttt_buymenu_showit");
    
g_pCommandMenuID ttt_command_add("Buy menu");

    
g_aSetup ArrayCreate(SETUP_DATA);
    
g_iItemForward CreateMultiForward("ttt_item_selected"ET_STOPFP_CELLFP_CELLFP_STRINGFP_CELL);
    
g_pMsgBuyClose get_user_msgid("BuyClose");
}

public 
plugin_end()
{
    
ArrayDestroy(g_aSetup);
}

public 
plugin_natives()
{
    
register_library("ttt");
    
register_native("ttt_buymenu_add""_buymenu_add");
    
register_native("ttt_buymenu_show""_buymenu_show");
    
register_native("ttt_item_setup_add""_item_setup_add");
    
register_native("ttt_item_setup_remove""_item_setup_remove");
    
register_native("ttt_item_setup_update""_item_setup_update");
    
register_native("ttt_item_setup_get""_item_setup_get");
    
register_native("ttt_is_item_setup""_is_item_setup");
    
register_native("ttt_get_item_name""_get_item_name");
    
register_native("ttt_get_item_id""_get_item_id");
}

public 
ttt_command_selected(idmenuidname[])
{
    if(
g_pCommandMenuID == menuid)
        
ttt_buymenu_showit(id);
}

public 
ttt_gamemode(gamemode)
{
    if(
gamemode == GAME_PREPARING)
        
ArrayClear(g_aSetup);
}

public 
client_command(id)
{
    if(!
is_user_alive(id) || ttt_return_check(id))
        return 
PLUGIN_CONTINUE;

    static 
command[16];
    
read_argv(0commandcharsmax(command));
    for(new 
0<= charsmax(g_szBuyCommands); i++)
    {
        if(
equal(commandg_szBuyCommands[i]))
        {
            if(!
task_exists(id))
                
set_task(0.1"ttt_buymenu_showit"id);

            return 
PLUGIN_HANDLED;
        }
    }

    if(
equal(command"client_buy_open"))
    {
        
// CHANGED
        
message_begin(MSG_ONEg_pMsgBuyClose_id);
        
message_end();
        
ttt_buymenu_showit(id);
    }

    return 
PLUGIN_CONTINUE;
}

public 
ttt_buymenu_showit(id)
{
    if(!
is_user_alive(id) || ttt_return_check(id))
        return 
PLUGIN_HANDLED;

    if(
g_iTotalItems == -1)
    {
        
client_print_color(idprint_team_default"%s %L"TTT_TAGid"TTT_NOITEMSTOTAL");
        return 
PLUGIN_HANDLED;
    }

    new 
inno;
    static 
item[128], num[3];
    new 
menu menu_create("\rTTT Buy menu""ttt_buymenu_handle");
    new 
team ttt_get_playerstate(id);
    for(new 
0g_iTotalItemsi++)
    {
        if(
g_szItems[i][ITEM_COST] == -1) continue;
        if(
g_szItems[i][ITEM_TEAM] == PC_INNOCENT)
            
inno++;

        if((
g_szItems[i][ITEM_TEAM] == PC_SPECIAL && (team == PC_TRAITOR || team == PC_DETECTIVE)) || team == g_szItems[i][ITEM_TEAM])
        {
            
formatex(itemcharsmax(item), "%s\R\y%i                                                "g_szItems[i][ITEM_NAME], g_szItems[i][ITEM_COST]);
            
num_to_str(inumcharsmax(num));
            
menu_additem(menuitemnum);
        }
    }

    if(!
inno && team == PC_INNOCENT)
    {
        
client_print_color(idprint_team_default"%s %L"TTT_TAGid"TTT_NOITEMSTEAM"idspecial_names[team]);
        return 
PLUGIN_HANDLED;
    }

    
menu_display(idmenu0);
    return 
PLUGIN_HANDLED;
}

public 
ttt_buymenu_handle(idmenuitem)
{
    if(!
is_user_alive(id) || ttt_return_check(id))
        return 
PLUGIN_HANDLED;

    if(
item == MENU_EXIT)
    {
        
menu_destroy(menu);
        return 
PLUGIN_HANDLED;
    }

    new 
accesscallbacknum[3];
    
menu_item_getinfo(menuitemaccessnumcharsmax(num), __callback);
    
menu_destroy(menu);

    new 
itemid str_to_num(num);

    new 
player_state ttt_get_playerstate(id);
    if((
g_szItems[itemid][ITEM_TEAM] == PC_SPECIAL && player_state != PC_TRAITOR && player_state != PC_DETECTIVE) || (player_state != g_szItems[itemid][ITEM_TEAM] && PC_SPECIAL != g_szItems[itemid][ITEM_TEAM]))
    {
        
client_print_color(idprint_team_default"%s %L"TTT_TAGid"TTT_ITEM3"idspecial_names[g_szItems[itemid][ITEM_TEAM]], g_szItems[itemid][ITEM_NAME]);
        return 
PLUGIN_HANDLED;
    }

    new 
credits ttt_get_playerdata(idPD_CREDITS);
    if(
credits g_szItems[itemid][ITEM_COST])
    {
        
client_print_color(idprint_team_default"%s %L"TTT_TAGid"TTT_ITEM4"g_szItems[itemid][ITEM_NAME], g_szItems[itemid][ITEM_COST]);
        return 
PLUGIN_HANDLED;
    }

    new 
retbuyer get_sharing_id(id);
    if(
is_user_alive(buyer))
    {
        
ExecuteForward(g_iItemForwardretbuyeritemidg_szItems[itemid][ITEM_NAME], g_szItems[itemid][ITEM_COST]);

        if(
ret == PLUGIN_HANDLED)
        {
            
client_cmd(buyer"spk ^"%s^"""items/gunpickup2.wav");
            
ttt_set_playerdata(idPD_CREDITScredits-g_szItems[itemid][ITEM_COST]);
        
            static 
name[32];
            
get_user_name(idnamecharsmax(name));
            if(
is_sharing(id))
            {
                static 
name_for[32];
                
get_user_name(buyername_forcharsmax(name_for));
                
ttt_log_to_file(LOG_ITEM"Player %s bought item %s with ID %d for player %s"nameg_szItems[itemid][ITEM_NAME], itemidname_for);
                
ttt_set_playerdata(idPD_ITEM_SHARING0);
                
client_print_color(idprint_team_default"%s %L"TTT_TAGid"TTT_ITEM_FROM"g_szItems[itemid][ITEM_NAME], name_for);
                
client_print_color(buyerprint_team_default"%s %L"TTT_TAGid"TTT_ITEM_TO"nameg_szItems[itemid][ITEM_NAME]);
            }
            else 
ttt_log_to_file(LOG_ITEM"Player %s bought item %s with ID %d"nameg_szItems[itemid][ITEM_NAME], itemid);
        }
    }

    return 
PLUGIN_HANDLED;
}

public 
_buymenu_add(pluginparams)
{
    if(
params != 3)
        return 
ttt_log_api_error("ttt_buymenu_add needs 3 params(p2: %d, p3: %d)"pluginparamsget_param(2), get_param(3)) -1;

    
get_string(1g_szItems[g_iTotalItems][ITEM_NAME], charsmax(g_szItems[][ITEM_NAME]));
    
g_szItems[g_iTotalItems][ITEM_COST] = get_param(2);
    
g_szItems[g_iTotalItems][ITEM_TEAM] = get_param(3);

    
g_iTotalItems++;
    return (
g_iTotalItems 1);
}

public 
_buymenu_show(pluginparams)
{
    if(
params != 1)
        return 
ttt_log_api_error("ttt_buymenu_show needs 1 param(p1: %d)"pluginparamsget_param(1));

    new 
id get_param(1);
    if(
is_user_alive(id))
    {
        
ttt_buymenu_showit(id);
        return 
1;
    }

    return 
0;
}

public 
_item_setup_add(pluginparams)
{
    if(
params != 7)
        return 
ttt_log_api_error("ttt_item_setup_add needs 7 params"pluginparams) -1;

    static 
data[SETUP_DATA];
    
data[SETUP_ITEMID] = get_param(1);
    
data[SETUP_ITEMENT] = get_param(2);
    
data[SETUP_ITEMTIME] = get_param(3);
    
data[SETUP_ITEMOWNER] = get_param(4);
    
data[SETUP_ITEMTRACER] = get_param(5);
    
data[SETUP_ITEMACTIVE] = get_param(6);
    
get_string(7data[SETUP_ITEMNAME], charsmax(data[SETUP_ITEMNAME]));

    
ArrayPushArray(g_aSetupdata);
    
g_iSetupItems ArraySize(g_aSetup);

    return (
g_iSetupItems -1);
}

public 
_item_setup_remove(pluginparams)
{
    if(
params != 1)
        return 
ttt_log_api_error("ttt_item_setup_remove needs 1 param(p1: %d)"pluginparamsget_param(1)) -1;

    new 
item get_param(1);
    if(
item > -1)
    {
        new 
data[SETUP_DATA] = {00, ...};
        
ArraySetArray(g_aSetupitemdata);
        return 
1;
    }

    return -
1;
}

public 
_item_setup_get(pluginparams)
{
    if(
params != 2)
        return 
ttt_log_api_error("ttt_item_setup_get needs 2 params(p1: %d)"pluginparamsget_param(1)) -1;

    new 
item get_param(1);
    if(
item > -1)
    {
        static 
data[SETUP_DATA];
        
ArrayGetArray(g_aSetupitemdata);

        
set_array(2datasizeof(data));
        return 
1;
    }

    return -
1;
}

public 
_item_setup_update(pluginparams)
{
    if(
params != 2)
        return 
ttt_log_api_error("ttt_item_setup_update needs 2 params(p1: %d)"pluginparamsget_param(1)) -1;

    new 
item get_param(1);
    if(
item > -1)
    {
        static 
data[SETUP_DATA];
        
get_array(2datasizeof(data));

        
ArraySetArray(g_aSetupitemdata);
        return 
1;
    }

    return -
1;
}

public 
_is_item_setup(pluginparams)
{
    if(
params != 1)
        return 
ttt_log_api_error("ttt_is_item_setup needs 1 param(p1: %d)"pluginparamsget_param(1));


    if(
g_iSetupItems && ArraySize(g_aSetup))
    {
        new 
ent get_param(1);
        new 
data[SETUP_DATA];
        for(new 
0g_iSetupItems-1i++)
        {
            
ArrayGetArray(g_aSetupidata);
            if(
ent == data[SETUP_ITEMENT])
                return 
i;
        }
    }

    return -
1;
}

public 
_get_item_name(pluginparams)
{
    if(
params != 3)
        return 
ttt_log_api_error("ttt_get_item_name needs 3 params(p1: %d, p3: %d)"pluginparamsget_param(1), get_param(3));

    
set_string(2g_szItems[get_param(1)][ITEM_NAME], get_param(3));
    return 
1;
}

public 
_get_item_id(pluginparams)
{
    if(
params != 1)
        return 
ttt_log_api_error("ttt_get_item_id needs 1 param(p1: %d)"pluginparamsget_param(1)) -2;

    new 
name[TTT_ITEMLENGHT];
    
get_string(1namecharsmax(name));
    for(new 
0g_iTotalItems-1i++)
    {
        if(
equal(g_szItems[i][ITEM_NAME], name))
            return 
i;
    }

    return -
2;
}

stock get_sharing_id(id)
{
    new 
buyer ttt_get_playerdata(idPD_ITEM_SHARING);
    return 
buyer buyer id;
}

stock is_sharing(id)
    return 
ttt_get_playerdata(idPD_ITEM_SHARING); 

Any ideas as how to solve it? Thanks!

fysiks 10-29-2022 23:48

Re: ttt_items_base.amxx problem
 
Do you have this plugin above ttt_core.amxx in plugins.ini? If so, you should put your plugin after ttt_core.amxx. This way, the plugin_end() function in ttt_core.amxx which causes the execution of ttt_gamemode(GAME_PREPARING) before the array is destroyed in plugin_end() of your plugin.

I can't think of any other reason this would be happening. Alternatively, or in addition to, you should probably check that g_aSetup is valid before calling ArrayClear(g_aSetup).

JuanitoAlimana 10-30-2022 05:38

Re: ttt_items_base.amxx problem
 
Indeed, it was that. Thanks for the help!


All times are GMT -4. The time now is 15:43.

Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.