Skocz do zawartości


Zdjęcie

[Poradnik] Najprostszy skrypt BW


  • Zaloguj się, aby dodać odpowiedź
1 odpowiedź w tym temacie

#1 Anonimowy Hejter

Anonimowy Hejter
  • Uzytkownik forum
  • 22 postów

Napisano 10 August 2016 - 22:54

chciałbym się dowiedzieć jak zrobić BW podczas wypadku samochodowego bądź pobicia

 

Zaczniemy od opisania algorytmu, czyli kroczków, którymi będzie podążać nasz program.

  1. Gracz ulega wypadkowi samochodowemu lub pobiciu
  2. Następuje BW
  3. Po jakimś czasie BW zostaje zdjęte

 

1.1. Gracz ulega wypadkowi

W tym punkcie skrypt BW zaczyna działać. Aby sprawdzić, czy gracz ulega wypadkowi, wykorzystamy callback OnVehicleDamageStatusUpdate(vehicleid, playerid) wykonywany, gdy zmieni się stan uszkodzenia karoserii pojazdu, jest to jednak nieco prymitywne rozwiązanie, ponieważ jeśli podczas wypadku nie dojdzie do zmiany w karoserii, np. dana część, którą gracz uderzy, już będzie uszkodzona, callback nie zostanie wywołany. Mimo wszystko, to jedyne, co na tę chwilę przychodzi mi do głowy.

  • vehicleid - ID pojazdu, który uległ uszkodzeniu
  • playerid - ID gracza, który uszkodził pojazd
public OnVehicleDamageStatusUpdate(vehicleid,playerid)
{
  //kod, który wykona się przy BW
  return 1;
}

Warto jednak wspomnieć, że taki kod wykona się przy każdym, nawet najmniejszym uszkodzeniu karoserii, nawet jeśli miałoby to być delikatne uderzenie. Aby temu zapobiec, stworzymy globalną tablicę, która będzie przechowywać stan zdrowia każdego pojazdu i na bieżąco sprawdzać, o ile się zmienił.

new Float:VehicleHealth[MAX_VEHICLES];//tworzymy tablicę o wielkości limitu pojazdów, która będzie przechowywać liczby zmiennoprzecinkowe (float) - stan zdrowia pojazdu
public OnVehicleDamageStatusUpdate(vehicleid,playerid)
{
  new Float:vHP;//stworzymy zmienną typu float do pobrania obecnego HP pojazdu
  GetVehicleHealth(vehicleid,vHP);//funkcja pobiera ilość HP pojazdu "vehicleid" do zmiennej "vHP"
  if(VehicleHealth[vehicleid] - 150.0 > vHP)//sprawdzamy, czy uderzenie zabrało ponad 150.0, oczywiście tę liczbę można zmienić. Przypomnę, że VehicleHealth[vehicleid] to odniesienie do wcześniej stworzonej tablicy, przechowującej zdrowie pojazdu, natomiast vHP to aktualne jego zdrowie
  {
    //kod, który wykona się przy BW
  }
  VehicleHealth[vehicleid] = vHP;//aktualizujemy wartość w tablicy VehicleHealth, by kod, który wykona się na nowo, sprawdzał wartość ostatniego uderzenia - czyli zmianę HP od momentu w którym pobieramy, do momentu wyżej - linijka z warunkiem if
  return 1;
}

1.2. Gracz ulega pobiciu

Tutaj skorzystamy z OnPlayerDeath(playerid, killerid, reason).

  • playerid - ID gracza, który zginął
  • killerid - ID gracza, który jako ostatni zadał obrażenia
  • reason - ID broni, którą zadano obrażenia, dla przykładu pięść ma ID 0
public OnPlayerDeath(playerid, killerid, reason)
{
  if(reason == 0)//warunek - w tym przypadku BW zostanie nadane tylko przy pobiciu, można go oczywiście usunąć
  {
    //kod, który wykona się przy BW
  }
  return 1;
}

2. Następuje BW

Tam, gdzie napisałem "kod, który wykona się przy BW" wkleimy właśnie ten kod. Czym właściwie jest BW? Po pierwsze, jest to zamrożenie gracza. Po drugie, ewentualne ustawienie animacji.

TogglePlayerControllable(playerid,0);//zabieramy ("0") możliwość sterowania graczowi "playerid"
ApplyAnimation(playerid,"CRACK","crckidle2",4.1,1,0,0,0,0,1);//nadajemy graczowi "playerid" animację - tutaj mamy trochę cyferek, są to kolejno "4.1" - prędkość animacji, przeważnie 4.1, potem zapętlenie - czy animacja ma się powtarzać (1 - tak), zablokowanie pozycji gracza - czy po końcu animacji gracz ma wrócić na miejsce początkowe, np. przy animacji chodzenia (0, 0 - nie), zamrożenie (0 - nie zamrażamy gracza po zakończeniu animacji - zrobiliśmy to wcześniej), czas, po jakim animacja ma się powtarzać, 0 - bez opóźnienia; wymuszenie synchronizacji, aby każdy gracz w okolicy zobaczył animację bezbłędnie - 1, czyli opcja włączona

Oto cały kod. Ale, ale, trzeba także dodać kod, dzięki któremu BW "upłynie". Dodamy więc jeszcze jedną linijkę, tak zwany timer, czyli wywołanie funkcji z opóźnieniem.

SetTimerEx("KoniecBW",60*15*1000,false,"d",playerid);

"KoniecBW" to nazwa naszej funkcji - w nawiasach, jak każdy tekst prócz nazw zmiennych. Funkcję tę napiszemy w punkcie trzecim.

60*15*1000 - czas w milisekundach. 1000 milisekund to sekunda, 15*1000 ms to 15 sekund, 15*60 sekund to 15 minut.

False - timer nie będzie się powtarzać - BW zdejmujemy tylko raz. Gdy drugi raz gracz otrzyma BW, timer ponownie zostanie wywołany po jego nadaniu.

"d" - format funkcji. d oznacza liczbę, zmienną o typie liczby całkowitej.

playerid - tę liczbę przekazujemy funkcji, w publicach podałem definicję w danym użyciu.

 

 

3. BW zostaje zdjęte

forward KoniecBW(gracz);//deklarujemy, że tworzymy funkcję typu public o nazwie KoniecBW z jedną zmienną
public KoniecBW(gracz)//a tutaj tworzymy właśnie tę funkcję, używamy typu public ze względu na to, że tylko ten typ pozwala na wywołanie z opóźnieniem
{
  ClearAnimations(gracz,1);//gracz o ID, które sobie określiliśmy wyżej jako zmienna "gracz" - zdejmujemy mu animację ową funkcją i parametrem numer dwa, "1", wymuszamy synchronizację z innymi graczami
  TogglePlayerControllable(gracz,1);//działanie odwrotne do poprzedniego TogglePlayerControllable
  return 1;//każda funkcja powinna zwracać wartość. W tym przypadku zwróci "1" po wykonaniu
}

W tym momencie gracz będzie miał już możliwość poruszania się.

 

Jest to naprawdę najprostszy skrypt, można zrobić wiele - jeśli ktoś potrzebuje dodatkowych informacji, pytajcie.



#2 Emils

Emils
  • Uzytkownik forum
  • 2 postów

Napisano 14 August 2016 - 19:24

Dzięki wielkie poprosiłem o poradnik i za parę dni go mam props! Jestem świeży w pisaniu skryptów itp. więc będę pytał czasem co i jak. Następny poradnik jak byście stworzyli to doczepiane dodatki do postaci na serwer role play, pobierana opłata, zapis w bazie danych zakupionych dodatków na naszą postać.






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

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