Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Napisany przeze mnie plugin nie działa(to nie jest dziwne, to jesdez z moich pierwszych pluginów)


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
24 odpowiedzi w tym temacie

#21 K!113r

    Teraz to chyba Sławek kek

  • Power User

Reputacja: 387
Wszechpomocny

  • Postów:868
  • GG:
  • Steam:steam
  • Imię:Mateusz
  • Lokalizacja:Piotrków Tryb.
Offline

Napisano 06.03.2013 21:33


#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.
  • +
  • -
  • 1

DarkGL to mój autorytet.

skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować


#22 MuFFes

    Życzliwy

  • Autor tematu
  • Użytkownik

Reputacja: 0
Nowy

  • Postów:27
  • Imię:Remigiusz
  • Lokalizacja:Krosno
Offline

Napisano 06.03.2013 22:05

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
  • +
  • -
  • 0

#23 K!113r

    Teraz to chyba Sławek kek

  • Power User

Reputacja: 387
Wszechpomocny

  • Postów:868
  • GG:
  • Steam:steam
  • Imię:Mateusz
  • Lokalizacja:Piotrków Tryb.
Offline

Napisano 06.03.2013 22:24

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ć.
  • +
  • -
  • 0

DarkGL to mój autorytet.

skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować


#24 Gość_21977_*

  • Gość

Reputacja: 0

Offline

Napisano 06.03.2013 22:26

Ś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


#25 Gość_21977_*

  • Gość

Reputacja: 0

Offline

Napisano 06.03.2013 22:28

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.




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych