Guest User

Untitled

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