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

[ZM] Błąd zamrażania zombie


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

#1 TheArek001

    Życzliwy

  • Użytkownik

Reputacja: 0
Nowy

  • Postów:24
  • Lokalizacja:Polska
Offline

Napisano 30.04.2014 09:27

Po rozpoczęciu rundy i wybraniu trybu gry wszystkie zombie/nemesis zostają zamrożone na określony czas i po tym czasie normalnie mogą się ruszać.

Początkowo plugin zamrażał tylko pierwsze zombie oraz nie odmrażał go, co udało mi się samemu naprawić.

Jednak w dalszym ciągu plugin nie działa poprawnie gdyż w trakcie rundy zarażony gracz zostaje zamrożony co nie powinno się dziać.

Zwracam się do was z prośbą o pomoc w naprawieniu tej usterki.

 

 

#include <amxmodx>
#include <zombieplague>
#include <fakemeta>
#include <hamsandwich>
#include <engine>
#include <fun>
#include <amxmisc>
#define PLUGIN "zombie_freeze"
#define VERSION "1.0"
#define AUTHOR "author"
new bool:zamrozony[33]
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_logevent("runda",2,"1=Round_Start")
register_logevent("func_round",2,"1=Round_End")
register_forward(FM_PlayerPreThink, "fw_PlayerPreThink")
}
public zp_user_infected_post(id)
{
if (zp_get_user_zombie(id))
{
zamrozony[id] = true
set_user_godmode(id, 1)
set_user_maxspeed(id, 1.0)
set_task(10.0, "reset", id)
}
}
public fw_PlayerPreThink(id)
{
if (!zamrozony[id]) return PLUGIN_CONTINUE
set_user_maxspeed(id, 1.0)

if( get_user_button(id) & IN_ATTACK && is_user_alive(id))
{
new buttons = pev(id,pev_button)
set_pev(id,pev_button,(buttons & ~IN_ATTACK));
return FMRES_HANDLED;
}

if( get_user_button(id) & IN_ATTACK2 && is_user_alive(id))
{
new buttons = pev(id,pev_button)
set_pev(id,pev_button,(buttons & ~IN_ATTACK2));
return FMRES_HANDLED;
}

return PLUGIN_CONTINUE
}
public reset(id)
{
zamrozony[id] = false
set_user_godmode(id, 0)
set_user_maxspeed(id, 255.0)
}


Użytkownik TheArek001 edytował ten post 30.04.2014 09:28

  • +
  • -
  • 0

#2 VertekS

    Zaawansowany

  • Użytkownik

Reputacja: 48
Pomocny

  • Postów:80
  • Lokalizacja:amxxpc.exe
Offline

Napisano 30.04.2014 15:27

Nie napisałeś, jakiego Zombie Plague używasz, ale po kodzie domyślam się, że wersji 4.3. Moja rada jest taka - forward zp_user_infected_post zamień na zp_round_started. Możliwe, że zmiana jednej linijki nie wystarczy - po pierwsze trzeba będzie wziąć pod uwagę każdy tryb gry, po drugie jeśli sama zmiana forwardu nie zadziała, to zrób jednorazowego taska wywoływanego sekundę po tym, jak zostaje wywołane zp_round_started.

Drugą opcją jest użycie zp_has_round_started i oczekiwanie na zwracaną wartość równą 2 - również tutaj może wystąpić konieczność dopisania taska pomocniczego.


  • +
  • -
  • 0

#3 TheArek001

    Życzliwy

  • Autor tematu
  • Użytkownik

Reputacja: 0
Nowy

  • Postów:24
  • Lokalizacja:Polska
Offline

Napisano 30.04.2014 15:50

Korzystam z ZP 5.0.8, plugin nie ma znaczenia na jakim trybie gry będzie. Jedynie co trzeba zrobić a ja tego nie umiem, jest zrobienie tak żeby plugin działał tylko przez pierwsze X sekund od rozpoczęcia rundy.

Zmieniłem jak podałeś, nie było błędu ale na serwerze zamrażanie w ogóle nie działało.


Użytkownik TheArek001 edytował ten post 30.04.2014 15:51

  • +
  • -
  • 0

#4 VertekS

    Zaawansowany

  • Użytkownik

Reputacja: 48
Pomocny

  • Postów:80
  • Lokalizacja:amxxpc.exe
Offline

Napisano 30.04.2014 20:30

Tak czytam co napisałem i wnioskuję, że napisałem głupoty. Sprostowanie poniżej:

W takim razie między innymi polecam studiowanie bibliotek *.inc do ZP 5.0.x, bo nie istnieje dobra dokumentacja do tego moda, jedynie są udokumentowane niektóre możliwości.

Może spróbuj użyć tego forwardu, a w jaki sposób o tym ponizej:

zp_fw_gamemodes_start(game_mode_id) 

Dokładnie tak wpisanego, jak powyżej - będzie się on tyczyć wszystkich trybów gry.

 

Co do działania pluginu przez pierwszych X sekund - w momencie rozpoczęcia rundy (zp_fw_gamemodes_start), ustawiasz zmienną pomocniczą np. frostOn na 1 oraz deklarujesz taska, który się wykona za ileś tam sekund (odsyłam do dokumentacji). W ciele funkcji wywoływanej przez task ustawiasz zmienną frostOn na 0.

Po co ta zmienna? Po to, aby przy infekcji gracza (zp_user_infected_post) sprawdzać, czy plugin ma zamrozić nowo zarażonego. 

Podsumowując, pierwsze co powinno się dziać po wyłapaniu infekcji, to:

if (frostOn && zp_get_user_zombie(id))

Taka mała sugestia co do kodu - w pewnych forwardach zwracasz jakieś wartości, w niektórych nie. Warto byłoby to poprawić (np. w celu jaśniejszej obsługi powyższego warunku.

EDIT: Nie napisałem, co masz zaincludować. Ma być to plik zp50_gamemodes.inc.


Użytkownik VertekS edytował ten post 30.04.2014 20:31

  • +
  • -
  • 0

#5 TheArek001

    Życzliwy

  • Autor tematu
  • Użytkownik

Reputacja: 0
Nowy

  • Postów:24
  • Lokalizacja:Polska
Offline

Napisano 30.04.2014 23:42

To ja wole sobie odpuścić. Nie połapie się w tym i sam tego nie zrobię.


  • +
  • -
  • 0

#6 VertekS

    Zaawansowany

  • Użytkownik

Reputacja: 48
Pomocny

  • Postów:80
  • Lokalizacja:amxxpc.exe
Offline

Napisano 01.05.2014 09:06

Sam piszesz, że umiesz trochę modyfikować pluginy, to nie będę ci podawał gotowca, tylko naprowadzę na trop. Poskładaj sobie ze skrawków kodu działający plugin:

#include <zp50_gamemodes>
register_plugin(PLUGIN, VERSION, AUTHOR)
register_event("HLTV", "roundStart", "a", "1=0", "2=0")
register_forward(FM_PlayerPreThink, "fw_PlayerPreThink")
public roundStart()
{
// Gracze beda zamrazani po staniu sie zombie (nawet, gdy admin recznie wybierze kogos na zombie)
frostOn = true
}

public zp_fw_gamemodes_start(mode)
{
/* Pierwszy parametr set_task mowi o tym, przez ile pierwszych sekund rundy (liczone od pojawienia sie pierwszego zombie) gracze beda zamrazani po zarazeniu */
set_task(20.0, "resetFrost") 
}
public resetFrost()
{
    // wylaczenie mozliwosci zamrazania zombie poprzez ustawienie zmiennej na falsz

}
if (frostOn && zp_get_user_zombie(id))

Proponuję też przewidzieć taką możliwość, iż gdy gracz będzie zamrożony i weźmie antidotum, to trzeba go odmrozić - zp_user_humanized_post. W tym forwardzie wykonujesz czynności odwrotne, niż po staniu się zombie. W pluginie jest jeszcze kilka oznak złego kodowania (set_user_maxspeed), które mogą ale nie muszą być widocznymi bugami (zależy od ustawień serwera) ale to dasz radę poprawić sam, jeśli nie od razu, to po przeczytaniu tutoriali na amxx.pl.


  • +
  • -
  • 1

#7 TheArek001

    Życzliwy

  • Autor tematu
  • Użytkownik

Reputacja: 0
Nowy

  • Postów:24
  • Lokalizacja:Polska
Offline

Napisano 03.05.2014 08:14

Że przerabiać je umiem to tak i z reguły robię to na wyczucie, ale pisać już nie. Plugin jest mi cholernie potrzebny i jestem w stanie zapłacić za zrobienie go żeby działał ja należy.

Próbowałem poskładać to co mi dałeś ale wyszło mi to z mizernym skutkiem.


  • +
  • -
  • 0




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

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