Tosti Posted June 21, 2013 Share Posted June 21, 2013 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
dzek (varez) Posted June 21, 2013 Share Posted June 21, 2013 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
Wielebny Posted June 24, 2013 Share Posted June 24, 2013 (edited) 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 June 25, 2013 by Guest Link to comment
dzek (varez) Posted June 24, 2013 Share Posted June 24, 2013 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
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now