Skocz do zawartości
LisuPL

Problem z BW

Rekomendowane odpowiedzi

A wię tak. Próbuje od dłuższego czasu na różne sposoby zrobić system BW do mapki RP. Chyba wiadomo co to BW ;) Chodzi o to by przy "śmierci" wracać na miejsce śmierci z animką leżenia która sama wyłącza się po 5 minutach. Nie prosze tu o gotowca... wystarczy mi wytłumaczyć jakich funkcji i jakie dane pobierac i kiedy je wczytywac itd. Z gory dzięki za pomoc ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
7 godzin temu, Jaev napisał:

OnPlayerDeath

GetPlayerPos

SetPlayerPos

SetTimerEx

ustaw animacje :))

public OnPlayerDeath

GetPlayerPos(playerid, x, y, z);

SetPlayerPos(playerid, x, y, z);

SetTimerEx (coś tam....)

ApplyAnimation(coś tam..)

 

stock Timer (playerid)

 

ClearAnimations (coś tam)

 

Coś takiego?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

W timerze po 5 minutach zrób to co chciałeś czyli clear animations itd.

Pamiętaj, że pozycje gracza to Float:

I warto też TogglePlayerControllable(playerid, 0); żeby sam sobie nie przerwał animacji :D

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Średnie te BW, ale pewnie będzie działać.

Ja to bym zrobił tak, użył y_timers

Zrobił jeden globalny i wywołał bym w nim co jakiś czas funkcję gracza, żeby sprawdzało czy ma bw itd, jeżeli czas w funkcji gracza dobiegnie konca będzie równym to bym go obudził z bw a jeżeli nie to co jakiś czas wyświetla mu się informacja ile do końca bw.

To jest taki bardzo nie obciążony sposób bo mamy jeden timer główny w którym wykonujemy funkcję gracza. dzięki pętli na id gracza.

Chaotycznie bo tłumaczyć nie potrafię ale w praktyce bardzo dobrze się spisuje i działa bez zarzutów/

#edit oczywiście czas pobieramy jak zdechnie w OPD i dodajemy do niego 5min a później sprawdzamy w funkcji czy ten czas dobiegł końca za pomocą warunku if. 

polecam gettime() 

Edytowane przez Maxowski

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

public OnPlayerDeath(playerid, killerid, reason)
{
    new Float:x, Float:y, Float:z;
    
    GetPlayerPos(playerid, x, y, z);
    SetPlayerPos(playerid, x, y, z);
    
    TimerBW[playerid] = SetTimerEx("UnBW", 180000, false, "f", playerid);
    
    return 1;
}

 

Zrobiłem tak i nie działa :(

 

Dobra, może jednak ktoś by wspomógł gotowcem? Z wyjaśnieniem?

 

 

 

@edit A jak bym zrobił w OnPlayerDeath pobranie pozycji, potem dał timer na 10 sekund i wczytał pozycje śmierci to by przeszło?

Edytowane przez LisuPL

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jak już zrobiłeś ten BW to musisz stworzyć forward

forward UnBW(playerid);
public UnBW(playerid)
{
 //KOD - CZYNNOŚĆ JAKA MA SIĘ WYKONAC GDY GRACZ UMRZE NP.
 SendClientMessage(playerid, -1, "Umarłeś :)"); //wysyła mu wiadomość po czasie danym w timerze
 SetPlayerScore(playerid, 9); //Ustawia punkty gracza na 9
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
new Float:x, Float:y, Float:z;
new TimerPrzenies[MAX_PLAYERS];
new TimerBW[MAX_PLAYERS];
forward UnBW(playerid);
forward Przenies(playerid, x, y, z);

public OnPlayerDeath(playerid, killerid, reason)
{    
    GetPlayerPos(playerid, x, y, z);
    TimerPrzenies[playerid] = SetTimerEx("Przenies", 1000*5, false, "f", playerid);
    TimerBW[playerid] = SetTimerEx("UnBW", 1000*60*5, false, "f", playerid);
    
    return 1;
}
public Przenies(playerid, x, y, z)
{
	SetPlayerPos(playerid, x, y, z);
     //ODPALASZ ANIMACJE;(nie pamietam kodu)
	TogglePlayerControllable(playerid,0);
}

public UnBW(playerid)
{
	//USUWASZ ANIMACJE;(nie pamietam kodu)
	SendClientMessage(playerid, -1, "Twój czas śmierci minął :v.");
	TogglePlayerControllable(playerid, 1);
}

Nie wiem po jakim czasie od "zabicia" gracz się "respawnuje", więc ustawiłem, że po 5 sekundach timer 1000(sekunda)*5, przeniesie itd. a po 5 minutach usunie, tylko sobie dopisz te komendy na animacje.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
40 minut temu, Nergosu napisał:

new Float:x, Float:y, Float:z;
new TimerPrzenies[MAX_PLAYERS];
new TimerBW[MAX_PLAYERS];
forward UnBW(playerid);
forward Przenies(playerid, x, y, z);

public OnPlayerDeath(playerid, killerid, reason)
{    
    GetPlayerPos(playerid, x, y, z);
    TimerPrzenies[playerid] = SetTimerEx("Przenies", 1000*5, false, "f", playerid);
    TimerBW[playerid] = SetTimerEx("UnBW", 1000*60*5, false, "f", playerid);
    
    return 1;
}
public Przenies(playerid, x, y, z)
{
	SetPlayerPos(playerid, x, y, z);
     //ODPALASZ ANIMACJE;(nie pamietam kodu)
	TogglePlayerControllable(playerid,0);
}

public UnBW(playerid)
{
	//USUWASZ ANIMACJE;(nie pamietam kodu)
	SendClientMessage(playerid, -1, "Twój czas śmierci minął :v.");
	TogglePlayerControllable(playerid, 1);
}

Nie wiem po jakim czasie od "zabicia" gracz się "respawnuje", więc ustawiłem, że po 5 sekundach timer 1000(sekunda)*5, przeniesie itd. a po 5 minutach usunie, tylko sobie dopisz te komendy na animacje.

Wieczorem sprawdze jak bede mial chwile czasu. Jak to zrobie to dam ci na @edit czy dziala czy nie

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Stwórz sobie zmienną typu

new PlayerIsDeath[MAX_PLAYERS];



później 
PROSTY ZARYS KODU NA SYSTEM BW:

public OnPlayerDeath(playerid, killerid, reason)
{
     if(PlayerIsDeath[playerid] == 0)
     {
	     //przepuść go bo tutaj system uważa, że nie ma on bw
	     }
	     else if(PlayerIsDeath[playerid] == 1)
     {
     GetPlayerPos(playerid, x, y, z)
	     }
     return 1;
}
	 
	public OnPlayerSpawn(playerid)
{
     if(PlayerIsDeath[playerid] == 0)
     {
	     // przepuszczasz go...
     }
	     else if(PlayerIsDeath[playerid] == 1)
     {
	     SetPlayerPos(playerid, x, y, z);
     TogglePlayerControllable(playerid, true);
	     // do tego dodaj sobie jakaś animacje i tyle (ew. timer i te sprawy w zalezności jaki system chcesz mieć 
	     }
     return 1;
}
Edytowane przez CommandeR

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
42 minut temu, CommandeR napisał:

Stwórz sobie zmienną typu


new PlayerIsDeath[MAX_PLAYERS];



później 
PROSTY ZARYS KODU NA SYSTEM BW:


public OnPlayerDeath(playerid, killerid, reason)
{
     if(PlayerIsDeath[playerid] == 0)
     {
	     //przepuść go bo tutaj system uważa, że nie ma on bw
	     }
	     else if(PlayerIsDeath[playerid] == 1)
     {
     GetPlayerPos(playerid, x, y, z)
	     }
     return 1;
}
	 
	public OnPlayerSpawn(playerid)
{
     if(PlayerIsDeath[playerid] == 0)
     {
	     // przepuszczasz go...
     }
	     else if(PlayerIsDeath[playerid] == 1)
     {
	     SetPlayerPos(playerid, x, y, z);
     TogglePlayerControllable(playerid, true);
	     // do tego dodaj sobie jakaś animacje i tyle (ew. timer i te sprawy w zalezności jaki system chcesz mieć 
	     }
     return 1;
}

Ja juz BW mam od dawna tylko mi animki nie dzialaja

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×