Advertisement
Guest User

Untitled

a guest
Jan 25th, 2020
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.70 KB | None | 0 0
  1. #include <amxmodx>
  2. #include <colorchat>
  3.  
  4. #define AUTHOR "Wicked - amxx.pl/user/60210-wicked/"
  5.  
  6. #define ForDynamicArray(%1,%2) for(new %1 = 0; %1 < ArraySize(%2); %1++)
  7. #define ForArray(%1,%2) for(new %1 = 0; %1 < sizeof %2; %1++)
  8. #define ForRange(%1,%2,%3) for(new %1 = %2; %1 <= %3; %1++)
  9. #define ForPlayers(%1) for(new %1 = 1; %1 <= 32; %1++)
  10.  
  11. // Ilu graczy ma otrzymac skrzynke.
  12. new const how_many_cases = 3;
  13.  
  14. new const cases_data[][][] =
  15. {
  16. { "Skrzynia 1", 75 },
  17. { "Skrzynia 2", 45 },
  18. { "Skrzynia 3", 90 }
  19. };
  20.  
  21. new user_cases[33][sizeof(cases_data)];
  22.  
  23. public plugin_init()
  24. {
  25. register_plugin("x", "v0.1", AUTHOR);
  26.  
  27. register_clcmd("say /case", "cmd_give_cases");
  28. }
  29.  
  30. public cmd_give_cases(index)
  31. {
  32. give_cases();
  33. }
  34.  
  35. give_cases()
  36. {
  37. static Array:history,
  38. index,
  39. count;
  40.  
  41. // Zmniejszenie ilosci rozdawanych skrzynek, jesli na serwerze jest za malo osob.
  42. if(get_playersnum() < how_many_cases)
  43. {
  44. count = get_playersnum();
  45. }
  46.  
  47. ForRange(i, 0, count - 1)
  48. {
  49. // Pobranie wygranego gracza.
  50. index = get_random_player(history);
  51.  
  52. if(!is_user_connected(index))
  53. {
  54. continue;
  55. }
  56.  
  57. // Zabezpieczenie przed powtarzaniem sie wystepowania graczy.
  58. ArrayPushCell(history, index);
  59.  
  60. // Dodaj skrzynke.
  61. add_random_case(index);
  62. }
  63. }
  64.  
  65. add_random_case(index)
  66. {
  67. if(!is_user_connected(index))
  68. {
  69. return;
  70. }
  71.  
  72. static max_value,
  73. value,
  74. case_id;
  75.  
  76. // Zliczenie szans.
  77. ForArray(i, cases_data)
  78. {
  79. max_value += cases_data[i][1][0];
  80. }
  81.  
  82. // Bledne %.
  83. if(!max_value)
  84. {
  85. return;
  86. }
  87.  
  88. // Wylosowanie wartosci.
  89. value = random_num(0, max_value - 1);
  90.  
  91. // Pobranie id skrzynki wzgledem wylosowanej wartosci.
  92. case_id = get_case_id(value);
  93.  
  94. // case_id zwrocilo -1, czyli cos poszlo nie tak jak trzeba (teoretycznie nigdy nie powinno sie to wyswietlic).
  95. if(case_id == -1)
  96. {
  97. log_amx("Losowanie skrzynki nie powiodlo sie. (max_value = %i, value = %i, case_id = %i, index = %i)", max_value, value, case_id, index);
  98.  
  99. return;
  100. }
  101.  
  102. // Tutaj dodawanie skrzynki graczowi. Przykladowo:
  103. user_cases[index][case_id]++;
  104.  
  105. ColorChat(index, NORMAL, "Wylosowales skrzynke^x04 %s^x01!", cases_data[case_id][0]);
  106. }
  107.  
  108. get_case_id(value)
  109. {
  110. ForArray(i, cases_data)
  111. {
  112. // Sprawdzenie czy podana wartosc jest w zakresie % skrzynek.
  113. if(value > cases_data[i][1][0] && i != sizeof(cases_data) - 1)
  114. {
  115. continue;
  116. }
  117.  
  118. // Zwrocenie id skrzynki.
  119. return i;
  120. }
  121.  
  122. return -1;
  123. }
  124.  
  125. get_random_player(Array:excluded)
  126. {
  127. static player;
  128.  
  129. player = 0;
  130.  
  131. // Brak graczy na serwerze.
  132. if(!get_playersnum())
  133. {
  134. return player;
  135. }
  136.  
  137. static bool:skip,
  138. Array:players_list;
  139.  
  140. players_list = ArrayCreate(1, 1);
  141.  
  142. ForPlayers(i)
  143. {
  144. if(!is_user_connected(i))
  145. {
  146. continue;
  147. }
  148.  
  149. skip = false;
  150.  
  151. // Sprawdzenie czy aktualnie sprawdzany gracz nie jest na liscie wykluczonych indeksow.
  152. ForDynamicArray(j, excluded)
  153. {
  154. if(ArrayGetCell(excluded, j) == i)
  155. {
  156. skip = true;
  157.  
  158. break;
  159. }
  160. }
  161.  
  162. if(skip)
  163. {
  164. continue;
  165. }
  166.  
  167. // Dodawanie id do listy.
  168. ArrayPushCell(players_list, i);
  169. }
  170.  
  171. // Zwrocenie id gracza, lub 0, jesli nie znaleziono zadnych graczy.
  172. if(ArraySize(players_list))
  173. {
  174. player = ArrayGetCell(players_list, random_num(0, ArraySize(players_list) - 1));
  175. }
  176. else
  177. {
  178. player = 0;
  179. }
  180.  
  181. // Usuniecie tablicy dynamicznej.
  182. ArrayDestroy(players_list);
  183.  
  184. return player;
  185. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement