Jump to content

Wyzwanie gracza na wyścig


Recommended Posts

Witam, postanowiłem napisać autorski skrypt na freeroam począwszy od systemy wyścigów. Jest więc sobie komenda /wyzwij [Nick] lecz po wpisaniu jej nie ma błędu a wyskakuje na czacie wiadomość "Błąd przy ifie z getElementData". Kodzik (clientside):

function wyzwanie(komenda, cel) 
    if cel then 
        gracz=getPlayerName(getLocalPlayer()) 
        nick=getPlayerFromName(cel) 
        if (getElementData(getLocalPlayer(),"gracz.wyzwany")) == "nie" and (getElementData(nick,"gracz.wyzwany")) == "nie" then 
        setElementData(getLocalPlayer(),"gracz.wyzwany", "tak") 
        setElementData(nick,"gracz.wyzwany", "tak") 
        outputChatBox("Wyzwałeś/aś gracza "..cel.." na wyścig!", getLocalPlayer()) 
        outputChatBox("Gracz "..gracz.." wyzwał cię na wyścig! Wpisz /akceptuj by zaakceptować wyzwanie", nick) 
        else 
        outputChatBox("Błąd przy ifie z getElementData", getLocalPlayer()) 
        end 
    else 
    outputChatBox("WZÓR: /"..komenda.." [Nick Gracza]", getLocalPlayer()) 
end 
end 
addCommandHandler("wyzwij", wyzwanie) 

Link to comment

Mefi, wiem że jestem nieogarem ale nie kieruj się stereotypami (skąd ja znam to słowo o.O). Ale wracając do rzeczy, to zrobiłem rzecz oczywistą (czego z początku nie zrobiłem) a mianowicie ustawiłem setElementData przy wejściu na serwer. Nie ma żadnych błędów w debugu a skrypt jak się nie wykonywał tak się nie wykonuje. :)

Kodzik wypocin (standardowo clientside):

function ustawianie() 
    setElementData(source,"gracz.wyzwany", "nie") 
end 
addEventHandler("onClientPlayerJoin", getRootElement(), ustawianie) 

Link to comment

Linia 5 i odwolanie do getLocalPlayer() mowi nam jednoznacznie, ze jest to kod client-side.

Z kolei w kolejnych liniach uzywasz argumentow dostepnych tylko server-side (np. drugi parametr outputChatBox). Poza tym setElementData uzyte na elemencie samodzielnie niesynchronizowanym (inny klient) nie będzie na pewno rozpropagowane ani do serwera ani dalej.

Inna sprawa to ten nieszczesny 'gracz.wyzwany'. Po co ustawiać te dane przy połączeniu? Masz za dużo pasma? Skorzystaj z takiej konstrukcji:

  
local wyzwany=getElementData(player, "gracz.wyzwany") 
if not wyzwany then 
  .. gracz nie byl nigdy wyzwany .. 
else 
 ... gracz byl wyzwany 
end  
  

Ewentualnie możesz też przypisywać domyślną wartość jeśli ta nie była wcześniej ustawiona

local wartosc=getElementData(player, "gracz.wyzwany") or "nie" 

Inna sprawa to to, że zamiast przechowywania tak/nie powinieneś przechowywać tam element przeciwnika lub przynajmniej jego nick - w przeciwnym przypadku kod Ci się posypie jeśli więcej niż 2 osoby bedą z niego korzystać.

Edited by Guest
Link to comment

Od siebie jeszcze dodam, że marnotrawieniem pamięci i danych jest wpisywanie tam "tak"/"nie" jako string. Od tego masz true/false - 1 bit vs 3 bajty, czyli 24 bity. O ile znaki nie są kodowane wielobajtowo (tj. wszystkie, bo chyba jakiś unikod mamy już w mta?)

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...