Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <amxmodx>
- #include <colorchat>
- #define AUTHOR "Wicked - amxx.pl/user/60210-wicked/"
- #define ForDynamicArray(%1,%2) for(new %1 = 0; %1 < ArraySize(%2); %1++)
- #define ForArray(%1,%2) for(new %1 = 0; %1 < sizeof %2; %1++)
- #define ForRange(%1,%2,%3) for(new %1 = %2; %1 <= %3; %1++)
- #define ForPlayers(%1) for(new %1 = 1; %1 <= 32; %1++)
- // Ilu graczy ma otrzymac skrzynke.
- new const how_many_cases = 3;
- new const cases_data[][][] =
- {
- { "Skrzynia 1", 75 },
- { "Skrzynia 2", 45 },
- { "Skrzynia 3", 90 }
- };
- new user_cases[33][sizeof(cases_data)];
- public plugin_init()
- {
- register_plugin("x", "v0.1", AUTHOR);
- register_clcmd("say /case", "cmd_give_cases");
- }
- public cmd_give_cases(index)
- {
- give_cases();
- }
- give_cases()
- {
- static Array:history,
- index,
- count;
- // Zmniejszenie ilosci rozdawanych skrzynek, jesli na serwerze jest za malo osob.
- if(get_playersnum() < how_many_cases)
- {
- count = get_playersnum();
- }
- ForRange(i, 0, count - 1)
- {
- // Pobranie wygranego gracza.
- index = get_random_player(history);
- if(!is_user_connected(index))
- {
- continue;
- }
- // Zabezpieczenie przed powtarzaniem sie wystepowania graczy.
- ArrayPushCell(history, index);
- // Dodaj skrzynke.
- add_random_case(index);
- }
- }
- add_random_case(index)
- {
- if(!is_user_connected(index))
- {
- return;
- }
- static max_value,
- value,
- case_id;
- // Zliczenie szans.
- ForArray(i, cases_data)
- {
- max_value += cases_data[i][1][0];
- }
- // Bledne %.
- if(!max_value)
- {
- return;
- }
- // Wylosowanie wartosci.
- value = random_num(0, max_value - 1);
- // Pobranie id skrzynki wzgledem wylosowanej wartosci.
- case_id = get_case_id(value);
- // case_id zwrocilo -1, czyli cos poszlo nie tak jak trzeba (teoretycznie nigdy nie powinno sie to wyswietlic).
- if(case_id == -1)
- {
- log_amx("Losowanie skrzynki nie powiodlo sie. (max_value = %i, value = %i, case_id = %i, index = %i)", max_value, value, case_id, index);
- return;
- }
- // Tutaj dodawanie skrzynki graczowi. Przykladowo:
- user_cases[index][case_id]++;
- ColorChat(index, NORMAL, "Wylosowales skrzynke^x04 %s^x01!", cases_data[case_id][0]);
- }
- get_case_id(value)
- {
- ForArray(i, cases_data)
- {
- // Sprawdzenie czy podana wartosc jest w zakresie % skrzynek.
- if(value > cases_data[i][1][0] && i != sizeof(cases_data) - 1)
- {
- continue;
- }
- // Zwrocenie id skrzynki.
- return i;
- }
- return -1;
- }
- get_random_player(Array:excluded)
- {
- static player;
- player = 0;
- // Brak graczy na serwerze.
- if(!get_playersnum())
- {
- return player;
- }
- static bool:skip,
- Array:players_list;
- players_list = ArrayCreate(1, 1);
- ForPlayers(i)
- {
- if(!is_user_connected(i))
- {
- continue;
- }
- skip = false;
- // Sprawdzenie czy aktualnie sprawdzany gracz nie jest na liscie wykluczonych indeksow.
- ForDynamicArray(j, excluded)
- {
- if(ArrayGetCell(excluded, j) == i)
- {
- skip = true;
- break;
- }
- }
- if(skip)
- {
- continue;
- }
- // Dodawanie id do listy.
- ArrayPushCell(players_list, i);
- }
- // Zwrocenie id gracza, lub 0, jesli nie znaleziono zadnych graczy.
- if(ArraySize(players_list))
- {
- player = ArrayGetCell(players_list, random_num(0, ArraySize(players_list) - 1));
- }
- else
- {
- player = 0;
- }
- // Usuniecie tablicy dynamicznej.
- ArrayDestroy(players_list);
- return player;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement