- #include <amxmodx>
- #include <fun>
- #include <hamsandwich>
- #include <sqlx>
- #include <jailbreak>
- static const name[] = "JB: Skills";
- static const version[] = "1.0";
- static const author[] = "dredek";
- static const url_author[] = "https://amxx4u.pl/";
- static const menu_title[] = "\d© AMXX4u.pl | SKILLS^n\r[SKILL]\w";
- static const menu_prefix[] = "\d×\w";
- // static const log_path[] = "sql_skills.log";
- static const menu_commands[][] =
- {
- "/skill",
- "/skille",
- "/skills",
- "/umiejetnosci",
- "/u",
- "skill",
- "skille",
- "skills",
- "umiejetnosci",
- "u"
- };
- enum _:PlayerSkill
- {
- SLABY_PUNKT,
- SPRYT,
- WYTRZYMALOSC,
- KEVLAR,
- ADIDASY
- };
- enum _:CVARS
- {
- SQL_HOST[MAX_IP_PORT],
- SQL_USER[MAX_NAME],
- SQL_PASS[MAX_NAME],
- SQL_DATA[MAX_NAME],
- MAX_SLABY_PUNKT,
- MAX_SPRYT,
- MAX_WYTRZYMALOSC,
- MAX_KEVLAR,
- MAX_ADIDASY,
- COST_SLABY_PUNKT,
- COST_SPRYT,
- COST_WYTRZYMALOSC,
- COST_KEVLAR,
- COST_ADIDASY
- };
- enum _:PLAYER_INFO (+= 1)
- {
- PLAYER_NAME[MAX_NAME],
- PLAYER_AUTH[MAX_AUTHID]
- }
- new Handle:sql;
- new Handle:connection;
- new bool:sql_connected;
- new data_loaded;
- new player_data[MAX_PLAYERS + 1][PLAYER_INFO];
- new Player[MAX_PLAYERS + 1][PlayerSkill];
- new skills_cvars[CVARS];
- public plugin_init()
- {
- register_plugin(name, version, author, url_author);
- register_commands(menu_commands, sizeof(menu_commands), "main_menu", ADMIN_USER);
- _register_cvars();
- _register_event();
- }
- public plugin_cfg()
- _register_sql();
- public client_putinserver(index)
- {
- if(is_user_hltv(index))
- return;
- get_user_name(index, player_data[index][PLAYER_NAME], charsmax(player_data[][PLAYER_NAME]));
- mysql_escape_string(player_data[index][PLAYER_NAME], player_data[index][PLAYER_NAME], charsmax(player_data[][PLAYER_NAME]));
- get_user_authid(index, player_data[index][PLAYER_AUTH], charsmax(player_data[][PLAYER_AUTH]));
- set_task(1.0, "load_data", index);
- }
- public client_disconnected(index)
- {
- if(is_user_hltv(index))
- return;
- save_data(index, 0);
- }
- public _register_sql()
- {
- new error[128];
- new error_num;
- get_cvar_string("amxx4u_skills_host", skills_cvars[SQL_HOST], charsmax(skills_cvars[SQL_HOST]));
- get_cvar_string("amxx4u_skills_user", skills_cvars[SQL_USER], charsmax(skills_cvars[SQL_USER]));
- get_cvar_string("amxx4u_skills_pass", skills_cvars[SQL_PASS], charsmax(skills_cvars[SQL_PASS]));
- get_cvar_string("amxx4u_skills_data", skills_cvars[SQL_DATA], charsmax(skills_cvars[SQL_DATA]));
- sql = SQL_MakeDbTuple(skills_cvars[SQL_HOST], skills_cvars[SQL_USER], skills_cvars[SQL_PASS], skills_cvars[SQL_DATA]);
- connection = SQL_Connect(sql, error_num, error, charsmax(error));
- #if defined DEBUG_MODE
- log_amx("%s Database: %s %s %s %s", debug_prefix, skills_cvars[SQL_HOST], skills_cvars[SQL_USER], skills_cvars[SQL_PASS], skills_cvars[SQL_DATA]);
- #endif
- if(error_num)
- {
- // log_to_file(log_path, "MySQL ERROR: Query [%d] %s", error_num, error);
- log_amx("MySQL ERROR: Query [%d] %s", error_num, error);
- sql = Empty_Handle;
- set_task(1.0, "_register_sql");
- return;
- }
- new query_data[MAX_DESC];
- formatex(query_data, charsmax(query_data), "\
- CREATE TABLE IF NOT EXISTS `amxx4u_skills` (\
- `id` INT(11) NOT NULL AUTO_INCREMENT,\
- `player_name` VARCHAR(64) NOT NULL,\
- `player_auth` VARCHAR(64) NOT NULL DEFAULT 0,\
- `skills_slabypunkt` INT(11) NOT NULL DEFAULT 0,\
- `skills_spryt` INT(11) NOT NULL DEFAULT 0,\
- `skills_wytrzymalosc` INT(11) NOT NULL DEFAULT 0,\
- `skills_kevlar` INT(11) NOT NULL DEFAULT 0,\
- `skills_adidasy` INT(11) NOT NULL DEFAULT 0,\
- PRIMARY KEY(`id`));");
- new Handle:query = SQL_PrepareQuery(connection, query_data);
- SQL_Execute(query);
- SQL_FreeHandle(query);
- sql_connected = true;
- }
- public save_data(index, end)
- {
- if(!get_bit(index, data_loaded))
- return;
- new query_data[MAX_DESC];
- formatex(query_data, charsmax(query_data), "\
- UPDATE `amxx4u_skills` SET\
- `player_auth` = ^"%s^",\
- `skills_slabypunkt` = '%i',\
- `skills_spryt` = '%i',\
- `skills_wytrzymalosc` = '%i',\
- `skills_kevlar` = '%i',\
- `skills_adidasy` = '%i'\
- WHERE `player_name` = ^"%s^";",
- player_data[index][PLAYER_AUTH],
- Player[index][SLABY_PUNKT],
- Player[index][SPRYT],
- Player[index][WYTRZYMALOSC],
- Player[index][KEVLAR],
- Player[index][ADIDASY],
- player_data[index][PLAYER_NAME]);
- switch(end)
- {
- case 0: SQL_ThreadQuery(sql, "ignore_handle", query_data);
- case 1:
- {
- new error[128];
- new error_num;
- new Handle:query;
- query = SQL_PrepareQuery(connection, query_data);
- if(!SQL_Execute(query))
- {
- error_num = SQL_QueryError(query, error, charsmax(error));
- // log_to_file(log_path, "MySQL ERROR: Non-threaded query failed. [%d] %s", error_num, error);
- log_amx("MySQL ERROR: Non-threaded query failed. [%d] %s", error_num, error);
- }
- SQL_FreeHandle(query);
- SQL_FreeHandle(connection);
- }
- }
- if(end)
- rem_bit(index, data_loaded);
- }
- public load_data(index)
- {
- if(!sql_connected)
- {
- set_task(1.0, "load_data", index);
- return;
- }
- new temp[1];
- temp[0] = index;
- SQL_ThreadQuery(sql, "load_data_handle", fmt("SELECT * FROM `amxx4u_skills` WHERE `player_name` = ^"%s^"", player_data[index][PLAYER_NAME]), temp, sizeof(temp));
- }
- public load_data_handle(fail_state, Handle:query, error[], error_num, temp_id[], data_size)
- {
- if(fail_state)
- {
- // log_to_file(log_path, "MySQL ERROR: %s [%d]", error, error_num);
- log_amx("MySQL ERROR: %s [%d]", error, error_num);
- return;
- }
- new index = temp_id[0];
- if(SQL_NumRows(query))
- {
- Player[index][SLABY_PUNKT] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "skills_slabypunkt"));
- Player[index][SPRYT] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "skills_spryt"));
- Player[index][WYTRZYMALOSC] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "skills_wytrzymalosc"));
- Player[index][KEVLAR] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "skills_kevlar"));
- Player[index][ADIDASY] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "skills_adidasy"));
- }
- else
- SQL_ThreadQuery(sql, "ignore_handle", fmt("INSERT IGNORE INTO `amxx4u_skills` (`player_name`) VALUES (^"%s^");", player_data[index][PLAYER_NAME]));
- set_bit(index, data_loaded);
- }
- public ignore_handle(fail_state, Handle:query, error[], error_num, data[], data_size)
- {
- if(fail_state)
- {
- // log_to_file(log_path, "MySQL ERROR: ignore_Handle %s (%d)", error, error_num);
- log_amx("MySQL ERROR: ignore_Handle %s (%d)", error, error_num);
- return;
- }
- return;
- }
- public main_menu(id)
- {
- new menu = menu_create(fmt("%s Skill System\d |\w Punktow:\y %i\d", menu_title, amxx4u_get_points(id)), "menu_handle");
- new callback = menu_makecallback("menu_callback");
- new suma_trafien = (skills_cvars[MAX_SLABY_PUNKT] * 2 - Player[id][SLABY_PUNKT]);
- new suma_unik = (skills_cvars[MAX_SPRYT] * 2 - Player[id][SPRYT]);
- menu_additem(menu, fmt("%s Slaby punkt\y [%i/%i]\d |\w Koszt:\y %i punktow^n\
- ^t^t\r[1/%i Szans na traf. krytyczne]",
- menu_prefix, Player[id][SLABY_PUNKT], skills_cvars[MAX_SLABY_PUNKT], skills_cvars[COST_SLABY_PUNKT], suma_trafien), "0", 0, callback);
- menu_additem(menu, fmt("%s Spryt\y [%i/%i]\d |\w Koszt:\y %i punktow^n\
- ^t^t\r[1/%i Szans unik traf.]",
- menu_prefix, Player[id][SPRYT], skills_cvars[MAX_SPRYT], skills_cvars[COST_SPRYT], suma_unik), "1", 1, callback);
- menu_additem(menu, fmt("%s Wytrzymalosc\y [%i/%i]\d |\w Koszt:\y %i punktow^n\
- ^t^t\r[%i Dodatkowego zdrowia]",
- menu_prefix, Player[id][WYTRZYMALOSC], skills_cvars[MAX_WYTRZYMALOSC], skills_cvars[COST_WYTRZYMALOSC], Player[id][WYTRZYMALOSC]), "2", 2, callback);
- menu_additem(menu, fmt("%s Kevlar\y [%i/%i]\d |\w Koszt:\y %i punktow^n\
- ^t^t\r[%i Dodatkowych pkt kamizelki]",
- menu_prefix, Player[id][KEVLAR], skills_cvars[MAX_KEVLAR], skills_cvars[COST_KEVLAR], Player[id][KEVLAR]), "3", 3, callback);
- menu_additem(menu, fmt("%s Adidasy\y [%i/%i]\d |\w Koszt:\y %i punktow^n\
- ^t^t\r[%i Dodatkowej predkosci]",
- menu_prefix, Player[id][ADIDASY], skills_cvars[MAX_ADIDASY], skills_cvars[COST_ADIDASY], Player[id][ADIDASY]), "4", 4, callback);
- menu_addblank(menu, .slot = 0);
- menu_additem(menu, "\yZresetuj\w umiejetnosci");
- menu_setprop(menu, MPROP_BACKNAME, fmt("%s Wroc", menu_prefix));
- menu_setprop(menu, MPROP_NEXTNAME, fmt("%s Dalej", menu_prefix));
- menu_setprop(menu, MPROP_EXITNAME, fmt("%s Wyjdz", menu_prefix));
- menu_setprop(menu, MPROP_PERPAGE, 3);
- menu_display(id, menu);
- return PLUGIN_HANDLED;
- }
- public menu_callback(id, menu, item)
- {
- new num[10];
- new access;
- new callback;
- menu_item_getinfo(menu, item, access, num, charsmax(num), .callback = callback);
- switch(access)
- {
- case 0:
- {
- if(Player[id][SLABY_PUNKT] >= skills_cvars[MAX_SLABY_PUNKT] || amxx4u_get_points(id) < skills_cvars[COST_SLABY_PUNKT])
- return ITEM_DISABLED;
- }
- case 1:
- {
- if(Player[id][SPRYT] >= skills_cvars[MAX_SPRYT] || amxx4u_get_points(id) < skills_cvars[COST_SLABY_PUNKT])
- return ITEM_DISABLED;
- }
- case 2:
- {
- if(Player[id][WYTRZYMALOSC] >= skills_cvars[MAX_WYTRZYMALOSC] || amxx4u_get_points(id) < skills_cvars[COST_SLABY_PUNKT])
- return ITEM_DISABLED;
- }
- case 3:
- {
- if(Player[id][KEVLAR] >= skills_cvars[MAX_KEVLAR] || amxx4u_get_points(id) < skills_cvars[COST_SLABY_PUNKT])
- return ITEM_DISABLED;
- }
- case 4:
- {
- if(Player[id][ADIDASY] >= skills_cvars[MAX_ADIDASY] || amxx4u_get_points(id) < skills_cvars[COST_SLABY_PUNKT])
- return ITEM_DISABLED;
- }
- }
- return ITEM_ENABLED;
- }
- public menu_handle(id, menu, item)
- {
- if(item == MENU_EXIT)
- return PLUGIN_HANDLED;
- menu_destroy(menu);
- switch(item)
- {
- case 0:
- {
- Player[id][SLABY_PUNKT] += 1;
- amxx4u_set_points(id, amxx4u_get_points(id) - skills_cvars[COST_SLABY_PUNKT]);
- }
- case 1:
- {
- Player[id][SPRYT] += 1;
- amxx4u_set_points(id, amxx4u_get_points(id) - skills_cvars[COST_SPRYT]);
- }
- case 2:
- {
- Player[id][WYTRZYMALOSC] += 1;
- amxx4u_set_points(id, amxx4u_get_points(id) - skills_cvars[COST_WYTRZYMALOSC]);
- }
- case 3:
- {
- Player[id][KEVLAR] += 1;
- amxx4u_set_points(id, amxx4u_get_points(id) - skills_cvars[COST_KEVLAR]);
- }
- case 4:
- {
- Player[id][ADIDASY] += 1;
- amxx4u_set_points(id, amxx4u_get_points(id) - skills_cvars[COST_ADIDASY]);
- }
- case 5:
- {
- amxx4u_set_points(id, amxx4u_get_points(id)
- + (Player[id][SLABY_PUNKT] * skills_cvars[COST_SLABY_PUNKT])
- + (Player[id][SPRYT] * skills_cvars[COST_SPRYT])
- + (Player[id][WYTRZYMALOSC] * skills_cvars[COST_WYTRZYMALOSC])
- + (Player[id][KEVLAR] * skills_cvars[COST_KEVLAR])
- + (Player[id][ADIDASY] * skills_cvars[COST_ADIDASY]));
- Player[id][SLABY_PUNKT] = 0;
- Player[id][SPRYT] = 0;
- Player[id][WYTRZYMALOSC] = 0;
- Player[id][KEVLAR] = 0;
- Player[id][ADIDASY] = 0;
- }
- }
- save_data(id, 0);
- return PLUGIN_HANDLED;
- }
- public fwTakeDamage(this, idinflictor, idattacker, Float:damage, damagebits)
- {
- if(!is_user_alive(this) || !is_user_connected(this) || !is_user_connected(idattacker) || get_user_team(this) == get_user_team(idattacker))
- return HAM_IGNORED;
- if(Player[idattacker][SLABY_PUNKT] > 0)
- {
- if(random_num(1,(skills_cvars[MAX_SLABY_PUNKT]*2)-(Player[idattacker][SLABY_PUNKT])) == 1)
- {
- damage*=1.5;
- set_hudmessage(255, 0, 0, -1.0, 0.7, 2, 6.0, 3.0, 0.1, 1.5)
- show_hudmessage(idattacker, "TRAFIENIE KRYTYCZNE!")
- }
- }
- if(Player[this][SPRYT] > 0)
- {
- if(random_num(1,(skills_cvars[MAX_SPRYT]*2)-(Player[this][SPRYT])) == 1)
- {
- damage=0.0;
- set_hudmessage(255, 0, 0, -1.0, 0.7, 2, 6.0, 3.0, 0.1, 1.5)
- show_hudmessage(this, "UNIK!")
- }
- }
- SetHamParamFloat(4, damage);
- return HAM_IGNORED;
- }
- public Respawn(id)
- {
- remove_task(id+843);
- set_task(3.0, "GiveBonus", id+843);
- }
- public GiveBonus(id)
- {
- id-=843
- if( !is_user_alive( id ) )
- return HAM_IGNORED;
- if(Player[id][WYTRZYMALOSC] > 0)
- set_user_health(id, get_user_health(id)+Player[id][WYTRZYMALOSC]);
- if(Player[id][KEVLAR] > 0)
- set_user_armor(id, get_user_armor(id)+Player[id][KEVLAR]);
- if(Player[id][ADIDASY] > 0)
- jail_set_user_speed(id, 250.0 + Player[id][ADIDASY]);
- return HAM_IGNORED;
- }
- _register_cvars()
- {
- bind_pcvar_string(create_cvar("amxx4u_skills_host", "localhost", FCVAR_SPONLY | FCVAR_PROTECTED), skills_cvars[SQL_HOST], charsmax(skills_cvars[SQL_HOST]));
- bind_pcvar_string(create_cvar("amxx4u_skills_user", "user", FCVAR_SPONLY | FCVAR_PROTECTED), skills_cvars[SQL_USER], charsmax(skills_cvars[SQL_USER]));
- bind_pcvar_string(create_cvar("amxx4u_skills_pass", "pass", FCVAR_SPONLY | FCVAR_PROTECTED), skills_cvars[SQL_PASS], charsmax(skills_cvars[SQL_PASS]));
- bind_pcvar_string(create_cvar("amxx4u_skills_data", "data", FCVAR_SPONLY | FCVAR_PROTECTED), skills_cvars[SQL_DATA], charsmax(skills_cvars[SQL_DATA]));
- bind_pcvar_num(create_cvar("jb_max_slabypunkt", "10",
- .description = "Maksymalne ulepszenie umiejetnosci Slaby Punkt"), skills_cvars[MAX_SLABY_PUNKT]);
- bind_pcvar_num(create_cvar("jb_max_spryt", "10",
- .description = "Maksymalne ulepszenie umiejetnosci Spryt"), skills_cvars[MAX_SPRYT]);
- bind_pcvar_num(create_cvar("jb_max_wytrzymalosc", "10",
- .description = "Maksymalne ulepszenie umiejetnosci Wytrzymalosc"), skills_cvars[MAX_WYTRZYMALOSC]);
- bind_pcvar_num(create_cvar("jb_max_kevlar", "10",
- .description = "Maksymalne ulepszenie umiejetnosci Kevlar"), skills_cvars[MAX_KEVLAR]);
- bind_pcvar_num(create_cvar("jb_max_adidasy", "10",
- .description = "Maksymalne ulepszenie umiejetnosci Adidasy"), skills_cvars[MAX_ADIDASY]);
- bind_pcvar_num(create_cvar("jb_cost_slabypunkt", "2",
- .description = "Koszt ulepszenia umiejetnosci Slaby Punkt"), skills_cvars[COST_SLABY_PUNKT]);
- bind_pcvar_num(create_cvar("jb_cost_spryt", "2",
- .description = "Koszt ulepszenia umiejetnosci Spryt"), skills_cvars[COST_SPRYT]);
- bind_pcvar_num(create_cvar("jb_cost_wytrzymalosc", "2",
- .description = "Koszt ulepszenia umiejetnosci Wytrzymalosc"), skills_cvars[COST_WYTRZYMALOSC]);
- bind_pcvar_num(create_cvar("jb_cost_kevlar", "2",
- .description = "Koszt ulepszenia umiejetnosci Kevlar"), skills_cvars[COST_KEVLAR]);
- bind_pcvar_num(create_cvar("jb_cost_adidasy", "2",
- .description = "Koszt ulepszenia umiejetnosci Adidasy"), skills_cvars[COST_ADIDASY]);
- }
- _register_event()
- {
- RegisterHam(Ham_TakeDamage, "player","fwTakeDamage", 0);
- RegisterHam(Ham_Spawn, "player", "Respawn", 1);
- }