←  Problemy

AMXX.pl: Support AMX Mod X i SourceMod

»

Napisany przeze mnie plugin nie działa

  • +
  • -
MuFFes - zdjęcie MuFFes 05.03.2013

Witam,
Jakiś czas temu prosiłem o zrobienie pluginu , lecz nikt się tym nie zajął. Postanowiłem samodzielnie zrobić ten plugin. Chodziło oto, aby co rundę losowa osoba otrzymywała podwójną prędkość na czas 1 rundy. Plugin się skompilował, ale jego działania nie dostrzegłem.

Oto kod:
#include  
#include  
#include  


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

new gracze
new losowygracz
new maxspeed

public plugin_init() {
    register_plugin(PLUGIN, VERSION, AUTHOR)
    register_logevent("roundstart", 2, "1=Round_Start")
    register_logevent("roundend", 2, "1=Round_End")
    
}
public OnPlayerConnect() {
    gracze++;
}
public OnPlayerDisconnect() {
    gracze--;
}
public roundstart() {
    losowygracz=random(gracze);
    maxspeed=get_user_maxspeed(losowygracz);
    set_user_maxspeed(losowygracz,2*maxspeed);
}
public roundend() {
    set_user_maxspeed(losowygracz,maxspeed);
}

Jestem nowy w pawnie, więc spodziewam się bardzo dużych błędów. Jeśli ktoś się tego podejmie, to może mogłby też zrobić tak, że na say napisałoby kto ma podwojoną prędkość.Po wklejeniu includy mi poznikały a były one - amxmodx, amxmisc, fun
Użytkownik MuFFes edytował ten post 05.03.2013 19:41
Odpowiedz

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


public OnPlayerConnect() {
gracze++;
}
public OnPlayerDisconnect() {
gracze--;

zrezygnowałbym z tego, czemu? Okej do zliczania ludzi jest spoko, ale, Tobie potrzebny jest indeks gracza? Na początku będzie fajnie działać, ale gdy ktoś wyjdzie?
*le początek serwera
wchodzi 10 osób, dostają indeksy 1, 2, 3, ..., 10 (na tą chwile jeszcze będzie działać), ale ktoś idzie do sklepu i wychodzi, co teraz? (dla przykładu gracz ten miał indeks [numer] 8), zostali nam gracze 1, 2, 3, 4, 5, 6, 7, 9, 10
wylosowana pseudolosowa liczba jest równa 8, no i teraz się dzieje, gracza nie ma, a próbujemy odczytać jego prędkość (nie dość, że nie jest żywy to nawet go nie ma na serwerze!) potem próbujemy nadać mu prędkość, jeżeli zabezpieczyłbyś to warunkiem czy gracz żyje to jeszcze z Bogiem sprawa, losowanie raz (lub kilka) nie zadziała, ale logi czyste i ewentualne crashe są wyeliminowane.

Lepiej użyć w public plugin_init()

new liczba_slotow = get_maxplayers()


Funkcja get_maxplayers() zwraca maksymalną liczbę graczy, czyli ilość slotów, z założenia należy przyjąć że aż tyle jest dostępnych id graczy i np. w pętli musimy sprawdzić wszystkich.

Następnym "błędem" jest fakt że po zmianie broni prędkość jest na nowo ustawiana.

Kod bym sklepał, lecz nie mam czasu i głowy na to, jest tylu wspaniałych scrypterów o tej porze, że ktoś się znajdzie.
Odpowiedz

  • +
  • -
O'Zone - zdjęcie O'Zone 05.03.2013


public OnPlayerConnect() {
gracze++;
}
public OnPlayerDisconnect() {
gracze--;
}

To jest całkowicie zbędne, najlepiej liczbę graczy pobrać przed losowaniem.

Ogólnie można zrobić to w ten sposób:

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


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

public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
register_logevent("roundstart", 2, "1=Round_Start")
RegisterHam(Ham_Item_PreFrame, "player", "Ustaw_Predkosc", 1)

}
public roundstart() {
new ilosc=get_maxplayers();
new losowygracz=random_num(1,ilosc);
if(is_user_connected(losowygracz))
{
Ustaw_Predkosc(losowygracz);
new nick[32];
get_user_name(losowygracz, nick, charsmax(nick));
client_print(0,print_chat, "[Losowanie] Gracz %s otrzymal podwojna predkosc biegu!",nick);
}
return PLUGIN_CONTINUE;
}

public Ustaw_Predkosc(losowygracz){
set_user_maxspeed(losowygracz,get_user_maxspeed(losowygracz)*2);
}


Dlaczego hamsandwich? Bo jak napisał K!113r, prędkość gracza jest ustawiana przy każdej zmianie broni i ustawienie jej twoim sposobem nie da zamierzonego efektu.
Z tego co pamiętam, to prędkość podobnie jak grawitacja jest ponownie ustawiana na początku każdej rundy, więc wydaje mi się, że nie trzeba dodatkowo ustawiać jej na standardową na końcu rundy.
Odpowiedz

  • +
  • -
MuFFes - zdjęcie MuFFes 05.03.2013

Gdyby nie to, że każdy ma double speeda z twoim pluginem to byłoby fajnie i dałbym plusa.
Użytkownik MuFFes edytował ten post 05.03.2013 21:38
Odpowiedz

  • +
  • -
O'Zone - zdjęcie O'Zone 05.03.2013

Jak zwykle musiałem zrobić błąd xD

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

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

public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
register_logevent("roundstart", 2, "1=Round_Start")
RegisterHam(Ham_Item_PreFrame, "player", "Ustaw_Predkosc", 1)
}

public roundstart() {
new gracze[32], ilosc;
get_players(gracze, ilosc);
new losowygracz = random_num(1,ilosc)
if(is_user_connected(losowygracz))
{
Ustaw_Predkosc(losowygracz);
new nick[32];
get_user_name(losowygracz, nick, charsmax(nick));
client_print(0,print_chat, "[Losowanie] Gracz %s otrzymal podwojna predkosc biegu!",nick);
}
else roundstart()

return PLUGIN_CONTINUE;
}

public Ustaw_Predkosc(losowygracz){
set_user_maxspeed(losowygracz,get_user_maxspeed(losowygracz)*2);
}

Przy okazji dodałem ponowne losowanie w razie, gdyby gracz z jakiegoś powodu nie był dostępny :D
Użytkownik O'Zone edytował ten post 05.03.2013 21:41
Odpowiedz

  • +
  • -
MuFFes - zdjęcie MuFFes 05.03.2013

Ciągle jakby mi nie działało, w sensie, że ciągle każdy ma speeda. Ale to może być błąd z mojej strony bo mi cos total commander teraz sypal errorami. Dzis już nie mam za bardzo czasu. Sprawdzę plugin dopiero jutro.
Odpowiedz

  • +
  • -
Klakier - zdjęcie Klakier 05.03.2013

W publicu
public roundstart() { 

zamiast
								
}
else roundstart()


Daj:

}
else set_task(2.0, "roundstart")


Ponieważ serwer będzie crashował.
Odpowiedz

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


/**
* Description: Called each frame for an item, normally only on active items.
* Forward params: function(this)
* Return type: None.
* Execute params: ExecuteHam(Ham_Item_PreFrame, this);
*/

Sprawdź: (powinno działać, nigdy nie korzystałem z Ham_Item_PreFrame)

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

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

new losowygracz

public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
register_logevent("roundstart", 2, "1=Round_Start")
RegisterHam(Ham_Item_PreFrame, "player", "HamItemPreFramePost", 1)
}

public roundstart() {
new gracze[32], ilosc;
get_players(gracze, ilosc);
losowygracz = random(ilosc)+1
if(is_user_alive(losowygracz))
{
new nick[32];
get_user_name(losowygracz, nick, charsmax(nick));
client_print(0,print_chat, "[Losowanie] Gracz %s otrzymal podwojna predkosc biegu!",nick);
}
else set_task(2.0, "roundstart")

return PLUGIN_CONTINUE;
}

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


@ O'Zone co do wcześniejszej wersji

public roundstart() {
new ilosc=get_maxplayers();
new losowygracz=random_num(1,ilosc);
if(is_user_connected(losowygracz))
{
Ustaw_Predkosc(losowygracz);
new nick[32];
get_user_name(losowygracz, nick, charsmax(nick));
client_print(0,print_chat, "[Losowanie] Gracz %s otrzymal podwojna predkosc biegu!",nick);
}
return PLUGIN_CONTINUE;
}

Liczba slotów się nie zmienia, optymalniej byłoby utworzyć zmienną globalną i do niej przypisać wartość zwracaną przez funkcje get_maxplayers() i lepiej użyj random() zamiast random_num() (to już taki mój odruch, wybacz)

edit: poprawione
Odpowiedz

AztekHQS - zdjęcie AztekHQS 05.03.2013

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

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

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

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

public roundstart() {
new los, id[33], ktory_gracz;

for(new i = 1; i <= 32; i++) {
if(!is_user_alive(i)) continue;

id[ktory_gracz] = i;
ktory_gracz++;

los = id[random_num(0, ktory_gracz-1)];

Ustaw_Predkosc(los);
new nick[32]; get_user_name(los, nick, 31);
client_print(0, 3, "[Losowanie] Gracz %s otrzymal podwojna predkosc biegu!", nick);
}
}

public Ustaw_Predkosc(id) set_user_maxspeed(id, get_user_maxspeed(id)*2);

Użytkownik AztekHQS edytował ten post 05.03.2013 22:23
Odpowiedz

  • +
  • -
Jak się nazwać - zdjęcie Jak się nazwać 05.03.2013

powinno latać:
#include  <amxmodx>
#include  <fun>
#include  <hamsandwich>

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

new losowygracz;

public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	register_logevent("roundstart", 2, "1=Round_Start")
	RegisterHam(Ham_Item_PreFrame, "player", "HamItemPreFramePost", 1)	
}

public roundstart() {
	new gracze[32], ilosc;
	get_players(gracze, ilosc, "ah")
	losowygracz = gracze[random(ilosc)+1];
	get_user_name(losowygracz, gracze, charsmax(gracze));
	client_print(0,print_chat, "[Losowanie] Gracz %s otrzymal podwojna predkosc biegu!",gracze);
	return PLUGIN_CONTINUE;
}

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

choć nie jestem pewien czy nie będzie cały czas zwiększać prędkości *2 (nie wgłębiałem się czy przed wywołaniem tego forwardu prędkość jest ustawiana na domyślną dla danej broni), oraz przypominam że flagi nie są już supportowane (co prawda działają, ale jeżeli zainstalujesz niektóre pluginy to mogą zwracać błędne wartości, gdzieś na alliedach był fix do tego)
Odpowiedz

  • +
  • -
MuFFes - zdjęcie MuFFes 05.03.2013

Wielkie Dzięki. Przetestowałem plugin użytkownika "K!113r" i działa. Innych nie testowałem, ale pewnie też działają. Każdy kto starał się pomóc dostał ode mnie Dołączona grafika Jak poprawię swoją znajomość pawna to być może będę tworzyć nowe wersje tego pluginu.
Użytkownik MuFFes edytował ten post 05.03.2013 22:53
Odpowiedz

Gość_21977_* 06.03.2013

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. Ponadto, muszę dodać, bo aż mnie gryzie, gracze są policzalni,
więc zmienna winna nazywać się liczba, nie ilość, choć nie ma to wpływu na przebieg pluginu.

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

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

new losowygracz;

public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
register_logevent("roundstart", 2, "1=Round_Start")
RegisterHam(Ham_Item_PreFrame, "player", "HamItemPreFramePost", 1)
}

public roundstart() {
new gracze[32], liczba;
get_players(gracze, liczba, "ah")
losowygracz = gracze[random(liczba)];
get_user_name(losowygracz, gracze, charsmax(gracze));
client_print(0, print_chat, "[Losowanie] Gracz %s otrzymal podwojna predkosc biegu!", gracze);
return PLUGIN_CONTINUE;
}

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

  • +
  • -
MuFFes - zdjęcie MuFFes 06.03.2013

Jest w tym kodzie powyższym jakaś zmienna, która zawiera liczbę aktualnych graczy na serwerze?
Odpowiedz

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


liczba

http://amxx.pl/dokum...f90/get-players
w drugim parametrze podajesz zmienną i do niej zwracana jest aktualna liczba graczy na serwerze (nie sloty, a gracze)
Odpowiedz

Athrenaline - zdjęcie Athrenaline 06.03.2013

mozna zasys. plugin czy priv ?
Odpowiedz

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

mozna zasys. plugin czy priv ?


Na forum pomaga się publicznie i udostępnia kod, jeżeli kod jest upubliczniony to raczej możesz skorzystać, ale np. nie możesz go podać jako swój etc.
Odpowiedz

Gość_21977_* 06.03.2013

Tutaj dość tani zasys do Beemki: http://allegro.pl/bm...3061642629.html
O ile dobrze kojarzę, to zasys jest plug-in, ale możesz się zapytać właściciela.
Priv pod telefonem: 726529528
Odpowiedz

  • +
  • -
MuFFes - zdjęcie MuFFes 06.03.2013

<p>Pawna jeszcze trochę nie ogarniam, ale mam nadzieję, że już niedługo. Postanowiłem zrobić cvary - minimalna oraz maksymalna liczba graczy do gry z tym pluginem, speed regulowany cvarem, oraz napis na chacie w Colorchat. Niestety znow mam problem. Tym razem z kompilacją pluginu.
Wyskakują błędy - undefinded symbol "nick" - linia 36
oraz - undefined symbol "liczba" - linia 45 i 46

Nie zmieścił się cały plugin więc daje tak - http://wklej.org/id/974327/
Użytkownik MuFFes edytował ten post 06.03.2013 20:33
Odpowiedz

AztekHQS - zdjęcie AztekHQS 06.03.2013

Użyj mojego kodu, działa na 100%.

Taka mała uwaga, czemu pobierasz liczbę graczy w liczbie float ? :o
Odpowiedz

  • +
  • -
MuFFes - zdjęcie MuFFes 06.03.2013

Tamten kod od benia też działał, ale dodałem te cvary i warunek if do maksymalnej i minimalnej liczby graczy i już się nie chce kompilować :/

Poprawiłem i już nie pobieram liczby graczy przez float tylko num
Użytkownik MuFFes edytował ten post 06.03.2013 20:47
Odpowiedz