Jump to content

Komenda /zaloguj [Frakcja]


Recommended Posts

Witam, jako iż jestem początkujący i lubię porządek w kodzie napisałem sobie funkcję na komendę /zaloguj [frakcja]. Lecz problem polega na tym że nie daje mnie do teamu podanego w stringu tylko do pierwszego uwzględnionego w kodzie.

Kod: (serverside)

policja = createTeam("Policja", 0, 0, 255) 
pogotowie = createTeam("Pogotowie", 255, 0, 0) 
pd = createTeam("Pomoc Drogowa", 255, 0, 255) 
sn = createTeam("San Andreas News", 69, 99, 99) 
cywile = createTeam("Cywile", 255, 255, 255) 
  
function logowanie(thePlayer, komenda, team) 
    if team == "Policja" or "policja" or "poli" and isObjectInACLGroup("user."..getAccountName(getPlayerAccount(thePlayer)), aclGetGroup("Policja"))then 
        setPlayerTeam(thePlayer, policja) 
        setPlayerNametagColor(thePlayer, 0, 0, 255) 
        giveWeapon(thePlayer, 3) 
        setElementModel(thePlayer, 280) 
    elseif team=="Pogotowie" or "pogotowie" or "pogo" and isObjectInACLGroup("user."..getAccountName(getPlayerAccount(thePlayer)), aclGetGroup("Pogotowie")) then 
        setPlayerTeam(thePlayer, pogotowie) 
        setElementModel(thePlayer, 275) 
        setPlayerNametagColor(thePlayer, 255, 0, 0) 
    elseif team=="Pomoc" or "pd" or "pomoc" and isObjectInACLGroup("user."..getAccountName(getPlayerAccount(thePlayer)), aclGetGroup("PD"))then 
        setPlayerTeam(thePlayer, pd) 
        setElementModel(thePlayer, 50) 
        setPlayerNametagColor(thePlayer, 255, 0, 255) 
    elseif team=="san" or "sn" or "SAN" and isObjectInACLGroup("user."..getAccountName(getPlayerAccount(thePlayer)), aclGetGroup("San News")) then 
        setPlayerTeam(thePlayer, sn) 
        setPlayerNametagColor(thePlayer, 0, 255, 255) 
        giveWeapon(thePlayer, 43) 
        setElementModel(thePlayer, 60) 
    elseif team=="cywil" or "cywile" then 
        setPlayerTeam(thePlayer, cywile) 
        setElementModel(thePlayer, 0) 
        outputChatBox("Od teraz jesteś cywilem!", thePlayer) 
    else 
end 
end 
addCommandHandler("zaloguj", logowanie) 

Link to comment
if team == "Policja" or "policja" 

każdy warunek między and/or jest traktowany osobno, czyli mniej więcej wygląda to tak:

if (team == "Policja") or ("policja") 

zrobienie `if "dowolny_string"` powoduje zaakceptowanie warunku (bo string jest przeliczany do true w ifie)

powinieneś zrobić

if team == "Policja" or team == "policja" 

if team == "Policja" or "policja" or "poli" and isObjectInACLGroup("user."..getAccountName(getPlayerAccount(thePlayer)), aclGetGroup("Policja"))then 

to będzie zdradliwe. sam nie wiem w jakiej kolejności zostanie to zinterpretowane, ale pewnie nie tak jak chcemy --- chodzi mi o to "and" na końcu.

dodatkowe nawiasy w niczym nie szkodzą, a pomagają w zrozumieniu kodu i eliminują przypadkowe błędy, warunki z or oraz and rób tak:

if (warunek or warunek2 or warunek3) and warunek4 then 

inne języki jak lua w ogóle wymagają wzięcia w nawias wszystkiego pomiędzy `if` a `then` - to też dobra rzecz, łatwiej dostrzec gdzie nam się zaczyna i kończy listing warunków, ja zawsze wszystko brałem w nawias. nawiasów możesz sobie wstawiać do woli, nawet `if ((((1)))) then`.

edit: więcej o if-ie w lua, i ogólnie o warunkach:

http://www.troubleshooters.com/codecorn/lua/luaif.htm

Link to comment

Gwoli ścisłości, LUA ewaaluje porównania od lewej do prawej, przerywając porównywanie tak szybko jak to możliwe.

  
if (warunek1 or warunek2 or warunek3) then ... end 
  

Jeśli warunek1 okaże się prawdziwy, to reszta nie jest w ogóle sprawdzana.

Ale faktycznie nie ma co polegać na pamiętaniu właściwego zachowania - zawsze bezpieczniej dać ten nawias, aby kod wykonał się zawsze po naszej myśli i był czytelniejszy.

Edited by Guest
Link to comment
Gwoli ścisłości, LUA ewaaluje porównania (...) przerywając porównywanie tak szybko jak to możliwe.

Każdy język, który jest w powszechnym użyciu tak robi - kwestia wydajnościowa, bo po co liczyć coś, co nie ma już znaczenia. Dlatego też np. w takim przypadku jako pierwszy warunek sprawdzamy rzeczy, które najszybciej się przeliczą - np. porównanie do stringa, a dopiero potem np. jakieś pobranie danych z bazy.

Podobnie zresztą z samymi zapytaniami do MySQL bazy danych - w WHERE podajemy pierwsze te warunki, które wyeliminują najwięcej wierszy, żeby kolejne miały mniej do sprawdzenia (tu należy też kierować się rozsądkiem, jeżeli pierwszy warunek wyeliminuje najwięcej wierszy (np. 95%), ale jest to np. regexp, a innym warunkiem prostym warukiem (i to ideksowanym) wyeliminujemy 25% - możliwe, że bardziej się opłaci wstawić ten prosty jako pierwszy).

Ale takie kwestie się rozważa dopiero jak się już ogarnia programowanie dobrze, wie się co i jak chce się zrobić - wtedy można myśleć też ekstra o wydajności (a jest naprawdę dużo rzeczy, które można usprawnić w praktycznie każdym skrypcie).

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