←  Problemy

AMXX.pl: Support AMX Mod X i SourceMod

»

Napisany przeze mnie plugin nie działa

  • +
  • -
K!113r - zdjęcie K!113r 06.03.2013


#include <amxmodx>
#include <fun>
#include <hamsandwich>
#include <colorchat>

#define PLUGIN "Kalosze Murzyna"
#define VERSION "1.2.0"
#define AUTHOR "MuFFes"

new losowygracz;
new cvar_maxspeed;
new cvar_mingraczy;
new cvar_maxgraczy;

public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)

register_logevent("roundstart", 2, "1=Round_Start")
RegisterHam(Ham_Item_PreFrame, "player", "HamItemPreFramePost", 1)

cvar_mingraczy=register_cvar("amx_kaloszeminplayers","4")
cvar_maxgraczy=register_cvar("amx_kaloszemaxplayers","32")
cvar_maxspeed=register_cvar("amx_kaloszespeed","1.3")
}

public roundstart() {
new gracze[32], liczba;
get_players(gracze, liczba, "ah")
if(liczba>=get_pcvar_float(cvar_mingraczy) && liczba<=get_pcvar_float(cvar_maxgraczy))
{
losowygracz = gracze[random(liczba)+1];
if(is_user_alive(losowygracz))
{
new szName[33];
get_user_name(losowygracz, szName, 32);
ColorChat(0, GREEN, "[Losowanie]^x01 Gracz ^x03%s^x01 znalazl kalosze murzyna i^x04 biega szybciej^x01 !",szName);
}
else set_task(2.0, "roundstart")
}
else losowygracz = 0;
return PLUGIN_CONTINUE;
}

public HamItemPreFramePost(this)
{
if(this == losowygracz && is_user_alive(this))
set_user_maxspeed(losowygracz, get_user_maxspeed(losowygracz) * get_pcvar_float(cvar_maxspeed));
}


Nie testowałem.

Gracz o najmniejszym id nie zostanie wylosowany nigdy, a wylosowanie gracza o największym id skończy się bardzo nieprzyjemnym błędem, oczywiście prędkości mu także nie dodając.

losowygracz = gracze[random(ilosc)+1];

Ta jedynka nie powinna być dodawana.


Śmiem się nie zgodzić, przecież random(max) zwraca liczbę z przedziału od 0 do max-1, więc w Twoim przypadku gracz z najwyższym id nie zostanie wylosowany, więc po dodaniu 1 dostaniemy przedział od 1 do max.

I jeszcze jedno, przyjmijmy, że na serwerze znajdowało się 32 graczy, jeżeli 10 pierwszych, którzy pierwsi połączyli się z serwerem (pierwsze numery id) rozłączyli się z serwerem czyli zostaną id 11-32, przy losowaniu pobieramy liczbę graczy (22) wylosujemy np. 5 i nic się nie stanie, no chyba że się mylę i po każdym opuszczeniu serwera przez gracza id zmieniają właścicieli, ale jak kiedyś sprawdzałem tak się nie dzieje, więc trzeba sprawdzać czy wylosowany znajduje się na serwerze.

jeżeli się mylę to MuFFes możesz usunąć to sprawdzanie i else z set taskiem.
Odpowiedz

  • +
  • -
MuFFes - zdjęcie MuFFes 06.03.2013

Killer - Testowałem plugin na swoim serwerze. Najpierw bylem tylko ja i jakis koles. On mial kalosze 5x z rzedu ja ani razu. Potem wbiły inne 2 osoby i graliśmy we 4, i po kilkunastu rundach stwierdziłem, że ten plugin mnie pomija i nie dostane kaloszy. Zauważyłem też, że jedna osoba miała kalosze dużo częściej od innych, a czasami napis pojawiał się nie od razu tylko dopieru po kilku sekundach. Myślę, że to wina tej oto jedynki
Odpowiedz

  • +
  • -
K!113r - zdjęcie K!113r 06.03.2013

A testowałeś bez? Sprawdzałeś id szczęśliwca? Jest to liczba losowana, można mieć takie szczęście, spróbuj bez jedynki i z jedynką kilka/kilkanaście prób i wypisuj sobie jak na razie id szczęśliwca, do testów może się przydać.
Odpowiedz

Gość_21977_* 06.03.2013

Śmiem się nie zgodzić, przecież random(max) zwraca liczbę z przedziału od 0 do max-1, więc w Twoim przypadku gracz z najwyższym id nie zostanie wylosowany, więc po dodaniu 1 dostaniemy przedział od 1 do max.

Zgadzam się z 100%, że otrzymamy liczbę z przedziału od 0 do max-1, a po dodaniu 1, otrzymamy liczbę z przedziału od 1 do max, jednakże nie zgadzam się z tym, że będzie kod działać poprawnie.

Jednakże

Komenda
get_players(gracze, liczba, "ah")
do tablicy gracze o indeksach od 0 do liczba, gdzie liczba to liczba graczy, którzy spełniają wymagania trzeciego argumentu, "ah" oznacza tylko żywych graczy i pomija HLTV.
Twój kod:
losowygracz = gracze[random(liczba)+1];

Niech na serwerze 32 slotowym grają 32 osoby (wszyscy jeszcze żywi), liczba przyjmie wartość 32 graczy (nie ma HLTV), a random(liczba) niech wylosuje największą możliwą liczbę z zakresu, czyli, jak sam wspomniałeś, liczba-1, czyli 31.
Po dodaniu do 31 Twojej jedynki, otrzymamy liczbę 32, a pobranie elementu o indeksie 32 z tablicy 32 elementowej (bo taką utworzy funkcja get_players), zakończy się błędem, gdyż tablica gracze ma tylko 32 elementy (przypomnijmy, indeksy tablicy liczymy od 0, nie od jedynki), dlatego pobranie elementu o indeksie 32 (czyli tak naprawdę trzydziestego trzeciego) tablicy trzydziestodwuelementowej zakończy się niepowodzeniem, o czym przekonałbyś się wkrótce w logach na serwerze.

Inny przykład, niech będzie tylko 2 graczy (Jacek i Ania), obydwoje żywi, brak HLTV i botów.
Niech Jacek ma id 5, a Ania 17. Kod
get_players(gracze, liczba, "ah")
przypisze zmiennej liczba wartość 2, a tablica gracze przyjmie 2 elementy
index	value
0	5
1	17
Funkcja
random(liczba)
może przyjąć tylko 2 wartości, 0, bądź 1 (co do tego chyba jesteśmy zgodni).
Dodanie do tej wartości 1, sprawi, że będziemy pobierali element o indekszie 1, bądź 2.
Tym samym, indeks 0 nie będzie wylosowany nigdy, więc wartość 5 nie zostanie nigdy wylosowana, przez co Jacek nigdy nie wylosuje speed buffa.
jedynka zwróci Anię, próba pobrania tablica[1+1], czyli tablica[2] zakończy się w tym wypadku pobraniem wartości 0 (tablica[2] nie została zapełniona,
więc przyjmie wartość 0). gorzej w przypadku, gdy Jacek zaprosi 20 kolegów, a Ania 10 koleżanek. Wtedy, pobranie tablica[33] może być bardzo nieprzyjemne, gdyż będzie próbowało pobrać pamięć spoza zakresu tablicy.
Użytkownik Benio101 edytował ten post 06.03.2013 22:30
Odpowiedz

Gość_21977_* 06.03.2013

Killer - Testowałem plugin na swoim serwerze. Najpierw bylem tylko ja i jakis koles. On mial kalosze 5x z rzedu ja ani razu. Potem wbiły inne 2 osoby i graliśmy we 4, i po kilkunastu rundach stwierdziłem, że ten plugin mnie pomija i nie dostane kaloszy. Zauważyłem też, że jedna osoba miała kalosze dużo częściej od innych, a czasami napis pojawiał się nie od razu tylko dopieru po kilku sekundach. Myślę, że to wina tej oto jedynki

Jest to wynikiem dodawania jedynki w kodzie Killera. W przypadku 2 osób, osoba o niższym id NIGDY ale to PRZENIGDY nie zostanie wylosowana.
W przypadku, gdy będą grały 32 osoby na Twoim serwerze, polecą bardzo nieprzyjemne error logi.

Po prostu usuń to +1.
Odpowiedz