Facebook
From dredek, 1 Year ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 171
  1. #include <amxmodx>
  2. #include <fun>
  3. #include <hamsandwich>
  4. #include <sqlx>
  5. #include <jailbreak>
  6.  
  7. static const name[]                     = "JB: Skills";
  8. static const version[]          = "1.0";
  9. static const author[]           = "dredek";
  10. static const url_author[]       = "https://amxx4u.pl/";
  11.  
  12. static const menu_title[]       = "\d© AMXX4u.pl | SKILLS^n\r[SKILL]\w";
  13. static const menu_prefix[]      = "\d×\w";
  14.  
  15. // static const log_path[]      = "sql_skills.log";
  16.  
  17. static const menu_commands[][] =
  18. {
  19.         "/skill",
  20.         "/skille",
  21.         "/skills",
  22.         "/umiejetnosci",
  23.         "/u",
  24.         "skill",
  25.         "skille",
  26.         "skills",
  27.         "umiejetnosci",
  28.         "u"
  29. };
  30.  
  31. enum _:PlayerSkill
  32. {
  33.         SLABY_PUNKT,
  34.         SPRYT,
  35.         WYTRZYMALOSC,
  36.         KEVLAR,
  37.         ADIDASY
  38. };
  39.  
  40. enum _:CVARS
  41. {
  42.         SQL_HOST[MAX_IP_PORT],
  43.         SQL_USER[MAX_NAME],
  44.         SQL_PASS[MAX_NAME],
  45.         SQL_DATA[MAX_NAME],
  46.  
  47.         MAX_SLABY_PUNKT,
  48.         MAX_SPRYT,
  49.         MAX_WYTRZYMALOSC,
  50.         MAX_KEVLAR,
  51.         MAX_ADIDASY,
  52.  
  53.         COST_SLABY_PUNKT,
  54.         COST_SPRYT,
  55.         COST_WYTRZYMALOSC,
  56.         COST_KEVLAR,
  57.         COST_ADIDASY
  58. };
  59.  
  60. enum _:PLAYER_INFO (+= 1)
  61. {
  62.         PLAYER_NAME[MAX_NAME],
  63.         PLAYER_AUTH[MAX_AUTHID]
  64. }
  65.  
  66. new Handle:sql;
  67. new Handle:connection;
  68. new bool:sql_connected;
  69. new data_loaded;
  70.  
  71. new player_data[MAX_PLAYERS + 1][PLAYER_INFO];
  72.  
  73. new Player[MAX_PLAYERS + 1][PlayerSkill];
  74. new skills_cvars[CVARS];
  75.  
  76. public plugin_init()
  77. {
  78.         register_plugin(name, version, author, url_author);
  79.  
  80.         register_commands(menu_commands, sizeof(menu_commands), "main_menu", ADMIN_USER);
  81.  
  82.         _register_cvars();
  83.         _register_event();
  84. }
  85.  
  86. public plugin_cfg()
  87.         _register_sql();
  88.  
  89. public client_putinserver(index)
  90. {
  91.         if(is_user_hltv(index))
  92.                 return;
  93.  
  94.         get_user_name(index, player_data[index][PLAYER_NAME], charsmax(player_data[][PLAYER_NAME]));
  95.         mysql_escape_string(player_data[index][PLAYER_NAME], player_data[index][PLAYER_NAME], charsmax(player_data[][PLAYER_NAME]));
  96.  
  97.         get_user_authid(index, player_data[index][PLAYER_AUTH], charsmax(player_data[][PLAYER_AUTH]));
  98.  
  99.         set_task(1.0, "load_data", index);
  100. }
  101.  
  102. public client_disconnected(index)
  103. {
  104.         if(is_user_hltv(index))
  105.                 return;
  106.  
  107.         save_data(index, 0);
  108. }
  109.  
  110. public _register_sql()
  111. {
  112.         new error[128];
  113.         new error_num;
  114.  
  115.         get_cvar_string("amxx4u_skills_host", skills_cvars[SQL_HOST], charsmax(skills_cvars[SQL_HOST]));
  116.         get_cvar_string("amxx4u_skills_user", skills_cvars[SQL_USER], charsmax(skills_cvars[SQL_USER]));
  117.         get_cvar_string("amxx4u_skills_pass", skills_cvars[SQL_PASS], charsmax(skills_cvars[SQL_PASS]));
  118.         get_cvar_string("amxx4u_skills_data", skills_cvars[SQL_DATA], charsmax(skills_cvars[SQL_DATA]));
  119.  
  120.         sql         = SQL_MakeDbTuple(skills_cvars[SQL_HOST], skills_cvars[SQL_USER], skills_cvars[SQL_PASS], skills_cvars[SQL_DATA]);
  121.         connection  = SQL_Connect(sql, error_num, error, charsmax(error));
  122.  
  123.         #if defined DEBUG_MODE
  124.                 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]);
  125.         #endif
  126.  
  127.         if(error_num)
  128.         {
  129.                 // log_to_file(log_path, "MySQL ERROR: Query [%d] %s", error_num, error);
  130.                 log_amx("MySQL ERROR: Query [%d] %s", error_num, error);
  131.                 sql = Empty_Handle;
  132.  
  133.                 set_task(1.0, "_register_sql");
  134.                 return;
  135.         }
  136.  
  137.         new query_data[MAX_DESC];
  138.         formatex(query_data, charsmax(query_data), "\
  139.                 CREATE TABLE IF NOT EXISTS `amxx4u_skills` (\
  140.                 `id` INT(11) NOT NULL AUTO_INCREMENT,\
  141.                 `player_name` VARCHAR(64) NOT NULL,\
  142.                 `player_auth` VARCHAR(64) NOT NULL DEFAULT 0,\
  143.                 `skills_slabypunkt` INT(11) NOT NULL DEFAULT 0,\
  144.                 `skills_spryt` INT(11) NOT NULL DEFAULT 0,\
  145.                 `skills_wytrzymalosc` INT(11) NOT NULL DEFAULT 0,\
  146.                 `skills_kevlar` INT(11) NOT NULL DEFAULT 0,\
  147.                 `skills_adidasy` INT(11) NOT NULL DEFAULT 0,\
  148.                 PRIMARY KEY(`id`));");
  149.  
  150.         new Handle:query = SQL_PrepareQuery(connection, query_data);
  151.  
  152.         SQL_Execute(query);
  153.         SQL_FreeHandle(query);
  154.  
  155.         sql_connected = true;
  156. }
  157.  
  158. public save_data(index, end)
  159. {
  160.         if(!get_bit(index, data_loaded))
  161.                 return;
  162.  
  163.         new query_data[MAX_DESC];
  164.         formatex(query_data, charsmax(query_data), "\
  165.                 UPDATE `amxx4u_skills` SET\
  166.                 `player_auth` = ^"%s^",\
  167.                 `skills_slabypunkt` = '%i',\
  168.                 `skills_spryt` = '%i',\
  169.                 `skills_wytrzymalosc` = '%i',\
  170.                 `skills_kevlar` = '%i',\
  171.                 `skills_adidasy` = '%i'\
  172.                 WHERE `player_name` = ^"%s^";",
  173.                 player_data[index][PLAYER_AUTH],
  174.                 Player[index][SLABY_PUNKT],
  175.                 Player[index][SPRYT],
  176.                 Player[index][WYTRZYMALOSC],
  177.                 Player[index][KEVLAR],
  178.                 Player[index][ADIDASY],
  179.                 player_data[index][PLAYER_NAME]);
  180.  
  181.         switch(end)
  182.         {
  183.                 case 0: SQL_ThreadQuery(sql, "ignore_handle", query_data);
  184.                 case 1:
  185.                 {
  186.                         new error[128];
  187.                         new error_num;
  188.                         new Handle:query;
  189.  
  190.                         query = SQL_PrepareQuery(connection, query_data);
  191.  
  192.                         if(!SQL_Execute(query))
  193.                         {
  194.                                 error_num = SQL_QueryError(query, error, charsmax(error));
  195.                                 // log_to_file(log_path, "MySQL ERROR: Non-threaded query failed. [%d] %s", error_num, error);
  196.                                 log_amx("MySQL ERROR: Non-threaded query failed. [%d] %s", error_num, error);
  197.                         }
  198.  
  199.                         SQL_FreeHandle(query);
  200.                         SQL_FreeHandle(connection);
  201.                 }
  202.         }
  203.  
  204.         if(end)
  205.                 rem_bit(index, data_loaded);
  206. }
  207.  
  208. public load_data(index)
  209. {
  210.         if(!sql_connected)
  211.         {
  212.                 set_task(1.0, "load_data", index);
  213.                 return;
  214.         }
  215.  
  216.         new temp[1];
  217.         temp[0] = index;
  218.  
  219.         SQL_ThreadQuery(sql, "load_data_handle", fmt("SELECT * FROM `amxx4u_skills` WHERE `player_name` = ^"%s^"", player_data[index][PLAYER_NAME]), temp, sizeof(temp));
  220. }
  221.  
  222. public load_data_handle(fail_state, Handle:query, error[], error_num, temp_id[], data_size)
  223. {
  224.         if(fail_state)
  225.         {
  226.                 // log_to_file(log_path, "MySQL ERROR: %s [%d]", error, error_num);
  227.                 log_amx("MySQL ERROR: %s [%d]", error, error_num);
  228.                 return;
  229.         }
  230.  
  231.         new index = temp_id[0];
  232.  
  233.         if(SQL_NumRows(query))
  234.         {
  235.                 Player[index][SLABY_PUNKT]      = SQL_ReadResult(query, SQL_FieldNameToNum(query, "skills_slabypunkt"));
  236.                 Player[index][SPRYT]                    = SQL_ReadResult(query, SQL_FieldNameToNum(query, "skills_spryt"));
  237.                 Player[index][WYTRZYMALOSC]     = SQL_ReadResult(query, SQL_FieldNameToNum(query, "skills_wytrzymalosc"));
  238.                 Player[index][KEVLAR]                   = SQL_ReadResult(query, SQL_FieldNameToNum(query, "skills_kevlar"));
  239.                 Player[index][ADIDASY]                  = SQL_ReadResult(query, SQL_FieldNameToNum(query, "skills_adidasy"));
  240.         }
  241.         else
  242.                 SQL_ThreadQuery(sql, "ignore_handle", fmt("INSERT IGNORE INTO `amxx4u_skills` (`player_name`) VALUES (^"%s^");", player_data[index][PLAYER_NAME]));
  243.  
  244.         set_bit(index, data_loaded);
  245. }
  246.  
  247. public ignore_handle(fail_state, Handle:query, error[], error_num, data[], data_size)
  248. {
  249.         if(fail_state)
  250.         {
  251.                 // log_to_file(log_path, "MySQL ERROR: ignore_Handle %s (%d)", error, error_num);
  252.                 log_amx("MySQL ERROR: ignore_Handle %s (%d)", error, error_num);
  253.                 return;
  254.         }
  255.  
  256.         return;
  257. }
  258.  
  259. public main_menu(id)
  260. {
  261.         new menu = menu_create(fmt("%s Skill System\d |\w Punktow:\y %i\d", menu_title, amxx4u_get_points(id)), "menu_handle");
  262.         new callback = menu_makecallback("menu_callback");
  263.  
  264.         new suma_trafien = (skills_cvars[MAX_SLABY_PUNKT] * 2 - Player[id][SLABY_PUNKT]);
  265.         new suma_unik    = (skills_cvars[MAX_SPRYT] * 2 - Player[id][SPRYT]);
  266.  
  267.         menu_additem(menu, fmt("%s Slaby punkt\y [%i/%i]\d |\w Koszt:\y %i punktow^n\
  268.                 ^t^t\r[1/%i Szans na traf. krytyczne]",
  269.                 menu_prefix, Player[id][SLABY_PUNKT], skills_cvars[MAX_SLABY_PUNKT], skills_cvars[COST_SLABY_PUNKT], suma_trafien), "0", 0, callback);
  270.  
  271.         menu_additem(menu, fmt("%s Spryt\y [%i/%i]\d |\w Koszt:\y %i punktow^n\
  272.                 ^t^t\r[1/%i Szans unik traf.]",
  273.                 menu_prefix, Player[id][SPRYT], skills_cvars[MAX_SPRYT], skills_cvars[COST_SPRYT], suma_unik), "1", 1, callback);
  274.  
  275.         menu_additem(menu, fmt("%s Wytrzymalosc\y [%i/%i]\d |\w Koszt:\y %i punktow^n\
  276.                 ^t^t\r[%i Dodatkowego zdrowia]",
  277.                 menu_prefix, Player[id][WYTRZYMALOSC], skills_cvars[MAX_WYTRZYMALOSC], skills_cvars[COST_WYTRZYMALOSC], Player[id][WYTRZYMALOSC]), "2", 2, callback);
  278.  
  279.         menu_additem(menu, fmt("%s Kevlar\y [%i/%i]\d |\w Koszt:\y %i punktow^n\
  280.                 ^t^t\r[%i Dodatkowych pkt kamizelki]",
  281.                 menu_prefix, Player[id][KEVLAR], skills_cvars[MAX_KEVLAR], skills_cvars[COST_KEVLAR], Player[id][KEVLAR]), "3", 3, callback);
  282.  
  283.         menu_additem(menu, fmt("%s Adidasy\y [%i/%i]\d |\w Koszt:\y %i punktow^n\
  284.                 ^t^t\r[%i Dodatkowej predkosci]",
  285.                 menu_prefix, Player[id][ADIDASY], skills_cvars[MAX_ADIDASY], skills_cvars[COST_ADIDASY], Player[id][ADIDASY]), "4", 4, callback);
  286.  
  287.         menu_addblank(menu, .slot = 0);
  288.  
  289.         menu_additem(menu, "\yZresetuj\w umiejetnosci");
  290.  
  291.         menu_setprop(menu, MPROP_BACKNAME, fmt("%s Wroc", menu_prefix));
  292.         menu_setprop(menu, MPROP_NEXTNAME, fmt("%s Dalej", menu_prefix));
  293.         menu_setprop(menu, MPROP_EXITNAME, fmt("%s Wyjdz", menu_prefix));
  294.  
  295.         menu_setprop(menu, MPROP_PERPAGE, 3);
  296.         menu_display(id, menu);
  297.         return PLUGIN_HANDLED;
  298. }
  299.  
  300. public menu_callback(id, menu, item)
  301. {
  302.         new num[10];
  303.         new access;
  304.         new callback;
  305.         menu_item_getinfo(menu, item, access, num, charsmax(num), .callback = callback);
  306.  
  307.         switch(access)
  308.         {
  309.                 case 0:
  310.                 {
  311.                         if(Player[id][SLABY_PUNKT] >= skills_cvars[MAX_SLABY_PUNKT] || amxx4u_get_points(id) < skills_cvars[COST_SLABY_PUNKT])
  312.                                 return ITEM_DISABLED;
  313.                 }
  314.                 case 1:
  315.                 {
  316.                         if(Player[id][SPRYT] >= skills_cvars[MAX_SPRYT] || amxx4u_get_points(id) < skills_cvars[COST_SLABY_PUNKT])
  317.                                 return ITEM_DISABLED;
  318.                 }
  319.                 case 2:
  320.                 {
  321.                         if(Player[id][WYTRZYMALOSC] >= skills_cvars[MAX_WYTRZYMALOSC] || amxx4u_get_points(id) < skills_cvars[COST_SLABY_PUNKT])
  322.                                 return ITEM_DISABLED;
  323.                 }
  324.                 case 3:
  325.                 {
  326.                         if(Player[id][KEVLAR] >= skills_cvars[MAX_KEVLAR] || amxx4u_get_points(id) < skills_cvars[COST_SLABY_PUNKT])
  327.                                 return ITEM_DISABLED;
  328.                 }
  329.                 case 4:
  330.                 {
  331.                         if(Player[id][ADIDASY] >= skills_cvars[MAX_ADIDASY] || amxx4u_get_points(id) < skills_cvars[COST_SLABY_PUNKT])
  332.                                 return ITEM_DISABLED;
  333.                 }
  334.         }
  335.  
  336.         return ITEM_ENABLED;
  337. }
  338.  
  339. public menu_handle(id, menu, item)
  340. {
  341.         if(item == MENU_EXIT)
  342.                 return PLUGIN_HANDLED;
  343.  
  344.         menu_destroy(menu);
  345.  
  346.         switch(item)
  347.         {
  348.                 case 0:
  349.                 {
  350.                         Player[id][SLABY_PUNKT] += 1;
  351.                         amxx4u_set_points(id, amxx4u_get_points(id) - skills_cvars[COST_SLABY_PUNKT]);
  352.                 }
  353.                 case 1:
  354.                 {
  355.                         Player[id][SPRYT] += 1;
  356.                         amxx4u_set_points(id, amxx4u_get_points(id) - skills_cvars[COST_SPRYT]);
  357.                 }
  358.                 case 2:
  359.                 {
  360.                         Player[id][WYTRZYMALOSC] += 1;
  361.                         amxx4u_set_points(id, amxx4u_get_points(id) - skills_cvars[COST_WYTRZYMALOSC]);
  362.                 }
  363.                 case 3:
  364.                 {
  365.                         Player[id][KEVLAR] += 1;
  366.                         amxx4u_set_points(id, amxx4u_get_points(id) - skills_cvars[COST_KEVLAR]);
  367.                 }
  368.                 case 4:
  369.                 {
  370.                         Player[id][ADIDASY] += 1;
  371.                         amxx4u_set_points(id, amxx4u_get_points(id) - skills_cvars[COST_ADIDASY]);
  372.                 }
  373.                 case 5:
  374.                 {
  375.                         amxx4u_set_points(id, amxx4u_get_points(id)
  376.                         + (Player[id][SLABY_PUNKT] * skills_cvars[COST_SLABY_PUNKT])
  377.                         + (Player[id][SPRYT] * skills_cvars[COST_SPRYT])
  378.                         + (Player[id][WYTRZYMALOSC] * skills_cvars[COST_WYTRZYMALOSC])
  379.                         + (Player[id][KEVLAR] * skills_cvars[COST_KEVLAR])
  380.                         + (Player[id][ADIDASY] * skills_cvars[COST_ADIDASY]));
  381.  
  382.                         Player[id][SLABY_PUNKT] = 0;
  383.                         Player[id][SPRYT] = 0;
  384.                         Player[id][WYTRZYMALOSC] = 0;
  385.                         Player[id][KEVLAR] = 0;
  386.                         Player[id][ADIDASY] = 0;
  387.                 }
  388.         }
  389.  
  390.         save_data(id, 0);
  391.         return PLUGIN_HANDLED;
  392. }
  393.  
  394. public fwTakeDamage(this, idinflictor, idattacker, Float:damage, damagebits)
  395. {
  396.         if(!is_user_alive(this) || !is_user_connected(this) || !is_user_connected(idattacker) || get_user_team(this) == get_user_team(idattacker))
  397.                 return HAM_IGNORED;
  398.        
  399.         if(Player[idattacker][SLABY_PUNKT] > 0)
  400.         {
  401.                 if(random_num(1,(skills_cvars[MAX_SLABY_PUNKT]*2)-(Player[idattacker][SLABY_PUNKT])) == 1)
  402.                 {
  403.                         damage*=1.5;
  404.                         set_hudmessage(255, 0, 0, -1.0, 0.7, 2, 6.0, 3.0,  0.1, 1.5)
  405.                         show_hudmessage(idattacker, "TRAFIENIE KRYTYCZNE!")
  406.                 }
  407.         }
  408.  
  409.         if(Player[this][SPRYT] > 0)
  410.         {
  411.                 if(random_num(1,(skills_cvars[MAX_SPRYT]*2)-(Player[this][SPRYT])) == 1)
  412.                 {
  413.                         damage=0.0;
  414.                         set_hudmessage(255, 0, 0, -1.0, 0.7, 2, 6.0, 3.0,  0.1, 1.5)
  415.                         show_hudmessage(this, "UNIK!")
  416.                 }
  417.         }
  418.  
  419.         SetHamParamFloat(4, damage);
  420.  
  421.         return HAM_IGNORED;
  422. }
  423.  
  424. public Respawn(id)
  425. {
  426.         remove_task(id+843);
  427.         set_task(3.0, "GiveBonus", id+843);    
  428. }
  429.  
  430. public GiveBonus(id)
  431. {
  432.         id-=843
  433.         if( !is_user_alive( id ) )
  434.                 return HAM_IGNORED;
  435.  
  436.         if(Player[id][WYTRZYMALOSC] > 0)
  437.                 set_user_health(id, get_user_health(id)+Player[id][WYTRZYMALOSC]);
  438.  
  439.         if(Player[id][KEVLAR] > 0)
  440.                 set_user_armor(id, get_user_armor(id)+Player[id][KEVLAR]);
  441.  
  442.         if(Player[id][ADIDASY] > 0)
  443.                 jail_set_user_speed(id, 250.0 + Player[id][ADIDASY]);
  444.  
  445.         return HAM_IGNORED;
  446. }
  447.  
  448. _register_cvars()
  449. {
  450.         bind_pcvar_string(create_cvar("amxx4u_skills_host", "localhost",  FCVAR_SPONLY | FCVAR_PROTECTED), skills_cvars[SQL_HOST], charsmax(skills_cvars[SQL_HOST]));
  451.         bind_pcvar_string(create_cvar("amxx4u_skills_user", "user",       FCVAR_SPONLY | FCVAR_PROTECTED), skills_cvars[SQL_USER], charsmax(skills_cvars[SQL_USER]));
  452.         bind_pcvar_string(create_cvar("amxx4u_skills_pass", "pass",       FCVAR_SPONLY | FCVAR_PROTECTED), skills_cvars[SQL_PASS], charsmax(skills_cvars[SQL_PASS]));
  453.         bind_pcvar_string(create_cvar("amxx4u_skills_data", "data",       FCVAR_SPONLY | FCVAR_PROTECTED), skills_cvars[SQL_DATA], charsmax(skills_cvars[SQL_DATA]));
  454.  
  455.         bind_pcvar_num(create_cvar("jb_max_slabypunkt", "10",
  456.                 .description = "Maksymalne ulepszenie umiejetnosci Slaby Punkt"), skills_cvars[MAX_SLABY_PUNKT]);
  457.  
  458.         bind_pcvar_num(create_cvar("jb_max_spryt", "10",
  459.                 .description = "Maksymalne ulepszenie umiejetnosci Spryt"), skills_cvars[MAX_SPRYT]);
  460.        
  461.         bind_pcvar_num(create_cvar("jb_max_wytrzymalosc", "10",
  462.                 .description = "Maksymalne ulepszenie umiejetnosci Wytrzymalosc"), skills_cvars[MAX_WYTRZYMALOSC]);
  463.  
  464.         bind_pcvar_num(create_cvar("jb_max_kevlar", "10",
  465.                 .description = "Maksymalne ulepszenie umiejetnosci Kevlar"), skills_cvars[MAX_KEVLAR]);
  466.  
  467.         bind_pcvar_num(create_cvar("jb_max_adidasy", "10",
  468.                 .description = "Maksymalne ulepszenie umiejetnosci Adidasy"), skills_cvars[MAX_ADIDASY]);
  469.  
  470.         bind_pcvar_num(create_cvar("jb_cost_slabypunkt", "2",
  471.                 .description = "Koszt ulepszenia umiejetnosci Slaby Punkt"), skills_cvars[COST_SLABY_PUNKT]);
  472.  
  473.         bind_pcvar_num(create_cvar("jb_cost_spryt", "2",
  474.                 .description = "Koszt ulepszenia umiejetnosci Spryt"), skills_cvars[COST_SPRYT]);
  475.        
  476.         bind_pcvar_num(create_cvar("jb_cost_wytrzymalosc", "2",
  477.                 .description = "Koszt ulepszenia umiejetnosci Wytrzymalosc"), skills_cvars[COST_WYTRZYMALOSC]);
  478.  
  479.         bind_pcvar_num(create_cvar("jb_cost_kevlar", "2",
  480.                 .description = "Koszt ulepszenia umiejetnosci Kevlar"), skills_cvars[COST_KEVLAR]);
  481.  
  482.         bind_pcvar_num(create_cvar("jb_cost_adidasy", "2",
  483.                 .description = "Koszt ulepszenia umiejetnosci Adidasy"), skills_cvars[COST_ADIDASY]);
  484. }
  485.  
  486. _register_event()
  487. {
  488.         RegisterHam(Ham_TakeDamage, "player","fwTakeDamage", 0);
  489.         RegisterHam(Ham_Spawn, "player", "Respawn", 1);
  490. }