Jump to content

Problem z onPlayerWasted.


Recommended Posts

Witam! Mam problem z moim skryptem na Arenę minigun. Po zabiciu gracza nie dodaje mi score ani pieniędzy.... a zabitemu graczowi czasami zostaje minigun.

function poZabiciu(napastnik) 
    if (napastnik) then 
        if (getElementType(napastnik)=="player") then 
            if getElementData(napastnik,"zabawa")==minigun then  
                if getElementData(source,"zabawa")==minigun then 
                --Dla napastnika 
                setPlayerMoney(napastnik,getPlayerMoney(napastnik)+500) 
                setElementData(napastnik,tonumber(getElementData(napastnik, "Score"))+1) 
                outputChatBox("Dostałeś 500$ i 1 score za wykończenie przeciwnika.",napastnik,27,224,89) 
                --Dla zamordowanego 
                takeWeapon(source,38) 
                setElementData(source, "zabawa", brak) 
                end 
            end  
        end 
    end 
end 
addEventHandler("onPlayerWasted",root,poZabiciu) 

Proszę o pomoc. Z góry thx.

Link to comment

Ma to wyglądać tak:

Gracz wpisuje /mg i wtedy ustawia mu (zabawa minigun) czyli setElementData(player, "zabawa", minigun) , losuje jeden z 4 spawnów na arenie i daje miniguna. Nie działa mi tylko dodawanie score i kasy po zabiciu przeciwnika.

Więc w getElementData powinien być minigun czyli getElementData(napastnik, "zabawa", minigun). Niewiem jak dokładniej wytłumaczyć .

Link to comment

Więc w getElementData powinien być minigun czyli getElementData(napastnik, "zabawa", minigun). Niewiem jak dokładniej wytłumaczyć .

Zapewne masz na myśli, że w getElementData(napastnik, "zabawa") ma być "minigun", bo minigun bez cudzysłowów to nazwa zmiennej (której prawdopodobnie nie masz zdefiniowanej).

Pokaż nam fragment w kodzie gdzie robisz setElementData(napastnik, "zabawa")

Link to comment

Jak możemy Ci pomóc, skoro opisujesz inny błąd, a kod wklejasz inny.

Wcześniej Twój problem polegał na tym, że zapisywałeś string

  
setElementData(player,"zabawa","minigun") 
  

A odczytywałeś poprzez:

  
getElementData(napastnik,"zabawa")==minigun 
  

Zamiast:

  
getElementData(napastnik,"zabawa")=="minigun" 
  

Obecnie tego problemu nie ma, gdyż poprawiłeś go w międzyczasie.

.... a zabitemu graczowi czasami zostaje minigun.

Masz podpięte dwa handlery obsługujące onPlayerWasted.

Pierwszy nam właśnie pokazałeś i on przydziela kasę i usuwa setElementData(source, "zabawa").

Drugi respawnuje gracza.

Problem polega na tym, że błędnie założyłeś, że zawsze bedą wykonywać się w takiej kolejności. W sytuacji, w której ten drugi wykona się przed pierwszym, gracz zostanie zespawnowany na arenie (kod kliencki) a chwile później "zabawa" zostanie usunięta. Dlatego czasami minigun dawany jest po śmierci.

Ogólnie popełniłeś też błąd umieszczając kod spawnowania peda na arenie po stronie klienta. Funkcje takie jak setElementDimension i setElementInterior jeśli nie zostaną wykonane po stronie serwera, nie zostaną zsynchronizowane. W efekcie gracz albo nie będzie widział innych, albo inni nie bedą widzieli go, albo będą dziać się jeszcze inne dziwne rzeczy.

Proponuje Ci podejść do tematu od nowa i napisać całość po stronie serwera z wpięciem do posiadanych juz przez Ciebie funkcji respawnujących gracza po śmierci.

No niech będzie moja strata... po usunięciu problemu usunę ztąd kod. Może nikt nie skopiuje..

Cóż, pomyśl kiedyś o oddaniu społeczności czegoś w zamian za to co bierzesz. MTA to otwarty projekt i dzięki temu, że jest otwarty, jest taki potężny.

Link to comment
Pierwszy nam właśnie pokazałeś i on przydziela kasę i usuwa setElementData(source, "zabawa").

Problem w tym, że nie przydziela kasy.

Obecnie tego problemu nie ma, gdyż poprawiłeś go w międzyczasie.

Poprawiłem kiedy varez mówił o cudzysłowiach.. i dalej niedziała.

Cóż, pomyśl kiedyś o oddaniu społeczności czegoś w zamian za to co bierzesz. MTA to otwarty projekt i dzięki temu, że jest otwarty, jest taki potężny.

Właśnie chce to udostępnić...ale najpierw chce skończyć wszystkie zabawy (Chowany, Wojna Gangów, Wyścig, Derby, MG, Biegi i parę innych).

Pomożecie w pisaniu od nowa?

Link to comment

Pomożemy, ale póki co masz straszne podejście do wszystkiego, tj:

1) Bierzesz się z góry na zbyt skomplikowane rzeczy. Jeżeli zapominasz w losowych miejscach o cudzysłowiach to znaczy, że nie ogarniasz jeszcze tego na tyle, by napisać cokolwiek poza prostymi zabawami z kodem

2) Nie stosuj polskich nazw w kodzie, nigdzie. Tekst wyświetlany na menusach i innych może być po polsku (a może warto z góry założyć wielojęzyczność skryptu i przygotować sobie teksty chociażby w zmiennych), ale żadnych "zabawa" czy poZabiciu

3) Nazwa funkcji niech będzie krótka, ale niech określa też co robi (poZabiciu określa kiedy się wykonuje, ale nie wiadomo co robi, w dużym projekcie takie nazwy Cię zgubią)

4) Napisałeś 50 linijek kodu, na który ciężko się patrzy, a jednocześnie boisz się, że Ci go ktoś ukradnie - to jest związane z punktem pierwszym - wydaje Ci się, że umiesz i tworzysz coś niesamowitego, zapatrzenie w siebie na wczesnym etapie nigdy nikomu nie przyniosło nic dobrego (na późnym etapie zresztą też)

A więc wróć do podstaw (programowania ogólnie, poczytaj o KISS, DRY, o tworzeniu wcięć, ogólnie o językach programowania, czym są tablice, stringi, poczytaj tutoriale o LUA pod MTA, poznaj różnice między stroną klienta i serwera, dowiedz się jak debugować skrypty, a potem zacznij od prostych skryptów, takich zabaw, które na prawdziwy serwer się nie nadadzą, ale pomogą Ci zrozumieć synchronizację i inne tajniki MTA/Lua), a potem w razie problemów - zapraszamy po pomoc :)

Powodzenia!

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...