Senior Member
Join Date: Nov 2013
Location: Vilnius, Lithuania
|
01-21-2021
, 13:58
SQL_ThreadQuery error
|
#1
|
Hi. That error occurred after I updated my server's amxmodx to 1.9.0. What is need to be changed in the code? Thank you.
L 01/21/2021 - 19:50:28: [AMXX] Displaying debug trace (plugin "csgo-contracts.amxx", version "1.0")
L 01/21/2021 - 19:50:28: [AMXX] Run time error 10: native error (native "SQL_ThreadQuery")
L 01/21/2021 - 19:50:28: [AMXX] [0] csgo-contracts.sma::loadContracts (line 412)
L 01/21/2021 - 19:50:28: [AMXX] [1] csgo-contracts.sma::client_connect (line 82)
L 01/21/2021 - 19:50:28: [MySQL] Invalid info tuple handle: 0
PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#include <engine>
#include <fakemeta>
#include <fakemeta_util>
#include <cstrike>
#include <fun>
#include <sqlx>
#include <csgo_skins>
#define MAX_CONTRACT_SKINS 1000
new const Float:chances_classification[][] = {
{0.0, 1.0},
{1.0, 2.0},
{2.0, 3.0},
{3.0, 4.0},
{4.0, 5.0},
{5.0, 10.0},
{10.0, 15.0},
{15.0, 20.0},
{20.0, 25.0},
{25.0, 30.0},
{30.0, 35.0},
{35.0, 40.0},
{40.0, 45.0},
{45.0, 50.0},
{50.0, 55.0},
{55.0, 60.0},
{60.0, 65.0},
{65.0, 70.0},
{70.0, 75.0},
{75.0, 80.0},
{80.0, 85.0},
{85.0, 90.0},
{90.0, 95.0},
{95.0, 100.0}
}
new skins[33][MAX_CONTRACT_SKINS], pContracts[33];
new item;
new cvar_contracts_buy, cvar_contracts_cost, cvar_contract_min_skins, cvar_contract_max_skins, cvar_contract_lower_per_skin;
new Handle:tuple;
new bool:contractsLoaded[33];
public plugin_init()
{
register_plugin("CSGO SKINS: Contracts Menu", "1.0", "InvIs");
item = cs_menu_additem("Contracts");
cvar_contracts_buy = register_cvar("csgo_contract_buy_amount", "5"); // How many contracts player will buy at once (0 - unlimited uses)
cvar_contracts_cost = register_cvar("csgo_contract_cost", "5000"); // How much contracts cost
cvar_contract_min_skins = register_cvar("csgo_contract_minimum_skins", "5"); // Minimum amount of skins to make a contract
cvar_contract_max_skins = register_cvar("csgo_contract_maximum_skins", "1000"); // Maximum amount of skins to make a contract
cvar_contract_lower_per_skin = register_cvar("csgo_contract_percent_decrease", "0.025"); // How many percents will decrease making a contract per skin
check_extra_plugin();
}
public csgo_register_menu_enter(menu, command[])
{
if(menu == item)
{
register_clcmd(command, "showContractsMenu");
}
}
public csgo_client_info_loaded(id) loadContracts(id);
public csgo_sql_connected()
{
tuple = cs_get_sql_handle();
new szQuery[256];
formatex(szQuery, charsmax(szQuery), "CREATE TABLE IF NOT EXISTS `player_contracts` (`player_id` varchar(64) COLLATE utf8_lithuanian_ci, `contracts` int(16), PRIMARY KEY(`player_id`))");
cs_send_sql_query(szQuery);
}
public client_connect(id)
{
for(new i; i < MAX_CONTRACT_SKINS; i++) skins[id][i] = -1;
pContracts[id] = 0;
contractsLoaded[id] = false;
}
public csgo_on_client_reset(id)
{
for(new i; i < MAX_CONTRACT_SKINS; i++) skins[id][i] = -1;
pContracts[id] = 0;
contractsLoaded[id] = false;
//loadContracts(id);
}
public OnCallBackMainMenu(id, menu, item)
{
new counter = getContractSkins(id);
if(item == 1)
{
if(counter < get_pcvar_num(cvar_contract_max_skins) && counter < MAX_CONTRACT_SKINS) return ITEM_ENABLED;
else return ITEM_DISABLED;
}
else if(item == 2)
{
if(counter < get_pcvar_num(cvar_contract_min_skins) || pContracts[id] < 1) return ITEM_DISABLED;
else return ITEM_ENABLED;
}
return ITEM_ENABLED;
}
public csgo_menuItemSelected(id, item_id) if(item_id == item) showContractsMenu(id, 0)
public showContractsMenu(id, page)
{
new szText[128];
formatex(szText, charsmax(szText), "\d[\rCSGO\d] \wContracts\d: \r%d Contracts", pContracts[id]);
new menu = menu_create(szText, "contractsMenuHandler");
new callback = menu_makecallback("OnCallBackMainMenu");
formatex(szText, charsmax(szText), "Buy contract \d- \r$%d", get_pcvar_num(cvar_contracts_cost));
menu_additem(menu, szText);
menu_additem(menu, "\wAdd skin^n", _, _, callback);
new counter = getContractSkins(id)
formatex(szText, charsmax(szText), "\rMake contract^n^n\w-- \yContract skins \d(\y%d\d) \w--^n^n", counter);
menu_additem(menu, szText, _, _, callback);
new sztext[16];
new skinName[64], menuLine[128], w_name[64], w_name_final[64];
new Float:chance;
new skin_id;
for(new i; i < MAX_CONTRACT_SKINS; i++)
{
if(skins[id][i] != -1)
{
skin_id = skins[id][i];
formatex(sztext, charsmax(sztext), "%d", i);
cs_get_skin_name(skin_id, skinName);
cs_get_weapon_name(cs_get_skin_weapon_id(skin_id), w_name);
chance = 0.0;
chance = getSkinChance(skin_id, id)
if(chance > 75.0) formatex(w_name_final, charsmax(w_name_final), "\d%s", w_name);
else if(chance > 50.0) formatex(w_name_final, charsmax(w_name_final), "\w%s", w_name);
else if(chance > 15.0) formatex(w_name_final, charsmax(w_name_final), "\y%s", w_name);
else formatex(w_name_final, charsmax(w_name_final), "\r%s", w_name);
formatex(menuLine, charsmax(menuLine), "\w%s \d| %s", skinName, w_name_final);
menu_additem(menu, menuLine, sztext);
}
}
menu_display(id, menu, page);
}
stock getContractSkins(id)
{
new counter = 0;
for(new i; i < MAX_CONTRACT_SKINS; i++)
{
if(skins[id][i] != -1) counter++;
}
return counter;
}
stock Float:getSkinChance(i, id)
{
new Float:chance = 0.0;
new Float:tempChance;
new counter;
for(new j; j < cs_get_chests_count(); j++)
{
tempChance = cs_get_skin_chance(i, j, id);
chance += tempChance;
if(tempChance > 0.0) counter++;
}
chance /= counter;
return chance;
}
stock getSkinsAddedToContract(id, skin)
{
new counter = 0;
for(new i; i < MAX_CONTRACT_SKINS; i++)
{
if(skins[id][i] == skin) counter++;
}
return counter;
}
public contractsMenuHandler(id, menu, item)
{
if(item == MENU_EXIT)
{
menu_destroy(menu);
cs_open_main_menu(id);
return PLUGIN_HANDLED;
}
switch(item)
{
case 0: // Buy contract
{
if(cs_get_money(id) >= get_pcvar_num(cvar_contracts_cost))
{
cs_set_money(id, cs_get_money(id) - get_pcvar_num(cvar_contracts_cost))
if(get_pcvar_num(cvar_contracts_buy) == 0) pContracts[id] += 1;
else pContracts[id] += get_pcvar_num(cvar_contracts_buy);
saveContracts(id);
client_printcolor(id, "/y[/ctrCSGO/y] You bought some contracts!");
}
else client_printcolor(id, "/y[/ctrCSGO/y] You don't have enough money!");
showContractsMenu(id, item/7);
return PLUGIN_HANDLED;
}
case 1: // Add skin
{
showSkinsMenu(id, 0);
return PLUGIN_HANDLED;
}
case 2: // Make a contract
{
new contractWillHappen = true;
new which = 0, Float:chance = 0.0;
new counter = getContractSkins(id);
new bool:skin_checked[MAX_CONTRACT_SKINS];
for(new i; i < MAX_CONTRACT_SKINS; i++)
{
if(skins[id][i] != -1 && !skin_checked[i])
{
skin_checked[i] = true;
new skin_count = cs_get_skin_count(id, skins[id][i]);
if(skin_count < getSkinsAddedToContract(id, skins[id][i]))
{
contractWillHappen = false;
break;
}
chance = getSkinChance(skins[id][i], id);
which += addChanceClassification(chance);
}
}
if(contractWillHappen)
{
if(!contractsLoaded[id])
{
showContractsMenu(id, item/7);
client_printcolor(id, "/y[/ctrCSGO/y] You need to wait for MySQL data to load first!");
return PLUGIN_HANDLED;
}
which /= counter;
new skin_id = -1;
client_print(id, print_chat, "DEBUG: %d %d %d", which, counter, sizeof(chances_classification));
if(which < sizeof(chances_classification)) {
new temp = which;
/*while(skin_id == -1 && temp < sizeof(chances_classification)) {
skin_id = cs_pick_random_skin_percentage(chances_classification[which][0] - ( get_pcvar_float(cvar_contract_lower_per_skin) * counter ), chances_classification[temp][1]);
temp++;
}*/
skin_id = cs_pick_random_skin_percentage(chances_classification[which][0] - ( get_pcvar_float(cvar_contract_lower_per_skin) * counter ), chances_classification[temp][1]);
}
if(skin_id != -1)
{
for(new i; i < MAX_CONTRACT_SKINS; i++)
{
if(skins[id][i] != -1)
{
cs_remove_skin(id, skins[id][i], 0);
skins[id][i] = -1;
}
}
if(get_pcvar_num(cvar_contracts_buy) > 0) pContracts[id]--;
saveContracts(id);
new s_name[64], w_name[64], name[64];
get_user_name(id, name, charsmax(name));
cs_get_skin_name(skin_id, s_name);
cs_get_weapon_name(cs_get_skin_weapon_id(skin_id), w_name);
client_printcolor(0, "/y[/ctrCSGO/y] /g%s /ymade a contract from /g%d /yskins and got a /g%s /y(/g%s/y) skin!", name, counter, s_name, w_name);
cs_give_skin(id, skin_id, 0);
}
else
{
for(new i; i < MAX_CONTRACT_SKINS; i++) skins[id][i] = -1;
client_printcolor(id, "/y[/ctrCSGO/y] Something went wrong! Contract failed to make a skin!");
}
}
else client_printcolor(id, "/y[/ctrCSGO/y] Something went wrong! We didn't found some of your skins added to contract!");
showContractsMenu(id, item/7);
return PLUGIN_HANDLED;
}
}
new szData[6], szName[64];
new _access, item_callback;
menu_item_getinfo( menu, item, _access, szData,charsmax( szData ), szName,charsmax( szName ), item_callback );
new index = str_to_num( szData );
skins[id][index] = -1;
showContractsMenu(id, item/7);
return PLUGIN_HANDLED;
}
public addChanceClassification(Float:chance) {
for(new i; i < sizeof(chances_classification); i++) {
if(chances_classification[i][0] <= chance <= chances_classification[i][1]) {
return i;
}
}
return 0;
}
public showSkinsMenu(id, page)
{
new menu = menu_create("\d[\rCSGO\d] \wChoose skin\d:", "skinsMenuHandler");
new skinName[64], menuLine[128], szid[6], w_name[64], w_name_final[64], count;
new Float:chance, count_added;
for(new i; i < cs_get_skins_count(); i++)
{
count = cs_get_skin_count(id, i);
count_added = getSkinsAddedToContract(id, i);
if(count-count_added > 0)
{
formatex(szid, charsmax(szid), "%d", i);
cs_get_skin_name(i, skinName);
cs_get_weapon_name(cs_get_skin_weapon_id(i), w_name);
chance = getSkinChance(i, id);
if(chance > 75.0) formatex(w_name_final, charsmax(w_name_final), "\d%s", w_name);
else if(chance > 50.0) formatex(w_name_final, charsmax(w_name_final), "\w%s", w_name);
else if(chance > 15.0) formatex(w_name_final, charsmax(w_name_final), "\y%s", w_name);
else formatex(w_name_final, charsmax(w_name_final), "\r%s", w_name);
formatex(menuLine, charsmax(menuLine), "\w%s \d| %s \d- \r%d", skinName, w_name_final, count-count_added);
menu_additem(menu, menuLine, szid);
}
}
if(menu_items(menu)) menu_display(id, menu, page);
else
{
client_printcolor(id, "/y[/ctrCSGO/y] You don't have any skins!");
showContractsMenu(id, 0);
}
}
public skinsMenuHandler(id, menu, item)
{
if(item == MENU_EXIT)
{
menu_destroy(menu);
showContractsMenu(id, 0);
return PLUGIN_HANDLED;
}
new szData[6], szName[64];
new _access, item_callback;
menu_item_getinfo( menu, item, _access, szData,charsmax( szData ), szName,charsmax( szName ), item_callback );
new skin_id = str_to_num( szData );
if(getContractSkins(id) < MAX_CONTRACT_SKINS)
{
new skins_added = getSkinsAddedToContract(id, skin_id);
if(skins_added < cs_get_skin_count(id, skin_id))
{
for(new i; i < MAX_CONTRACT_SKINS; i++)
{
if(skins[id][i] == -1)
{
skins[id][i] = skin_id;
break;
}
}
}
else client_printcolor(id, "/y[/ctrCSGO/y] You already added all of these skins!");
}
else
{
client_printcolor(id, "/y[/ctrCSGO/y] You have added maximum amount of skins to this contract!");
showContractsMenu(id, 0);
return PLUGIN_HANDLED;
}
showSkinsMenu(id, item/7);
return PLUGIN_HANDLED;
}
public saveContracts(id)
{
if(!contractsLoaded[id]) return;
new szQuery[256];
new player_id[64];
cs_get_player_id(id, player_id);
formatex(szQuery, charsmax(szQuery), "REPLACE INTO `player_contracts` (`player_id`, `contracts`) VALUES ('%s', '%d');", player_id, pContracts[id]);
cs_send_sql_query(szQuery);
}
public loadContracts(id)
{
static szQuery[ 256 ];
new player_id[64];
cs_get_player_id(id, player_id);
formatex( szQuery, 255, "SELECT * FROM `player_contracts` WHERE `player_id` = '%s';", player_id);
new iData[1];
iData[ 0 ] = id;
SQL_ThreadQuery( tuple, "QuerySelecPlayerContracts", szQuery, iData, 1 );
}
public QuerySelecPlayerContracts( iFailState, Handle:hQuery, szError[ ], iError, iData[ ], iDataSize, Float:fQueueTime )
{
if( iFailState == TQUERY_CONNECT_FAILED || iFailState == TQUERY_QUERY_FAILED )
{
log_amx( "%s", szError );
return;
}
else
{
new id = iData[0];
new col_contracts_count = SQL_FieldNameToNum(hQuery, "contracts")
while (SQL_MoreResults(hQuery))
{
pContracts[id] = SQL_ReadResult(hQuery, col_contracts_count);
SQL_NextRow(hQuery)
}
contractsLoaded[id] = true;
}
}
|
|