Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Jak skrócić nasz kod?


Rekomendowane odpowiedzi

Opublikowano

Może to się wydawać dziwne, ale zawsze staram się skrócić swój kod do minimum. Tutaj podrzucę Wam kilka porad:

1. 'else - return'

Wiele ludzi mając prostego questa uwzględnia return np:

 

local s = select("Kup","Sprzedaj","Zamknij")
if s == 3 then
return
(...)

Teraz takie pytanie - po co? Nie uwzględniony select (w tym przypadku nasze Zamknij) opuszcza tak jakby questa, czyli działa jak return. Zaoszczędza to niby kilka linijek.

Może to wyglądać tak:

 

say("Chcesz dostać 100 yang?")
local s = select("Tak, chcę!","Nie, dziękuję.")
if s == 1 then
pc.change_money(100)
end
end

No i patrząc na taki przykład questa przejdziemy od razu do punktu drugiego...

2. local s = select("Tak",Nie")

Skoro już chcemy skrócić swój kod do minimum, spójrzmy na przykład ww.

 

say("Chcesz dostać 100 yang?")
local s = select("Tak, chcę!","Nie, dziękuję.")
if s == 1 then
pc.change_money(100)
end
end

Jak widzicie, jest tutaj select zawierający dwie (a na dobrą sprawę jedną) opcje.

No i tu znowuż dwie linijki można zastąpić jedną:

 

say("Chcesz dostać 100 yang?")
if  select("Tak, chcę!","Nie, dziękuję.") == 1 then
pc.change_money(100)
end
end

A jeśli nie chce nam się pisać Tak/Nie, bądź questa udostępniamy na jakiś zagranicznych forach...

 

if select(locale.yes,locale.no) == 1 then

Ja zwykłem tak stosować w questach, jest to po prostu praktyczniejsze.

No dobra, jak widzicie, zastosowałem tutaj opcję z locale.lua.

Nie zalicza się to raczej do skracania kodu, ale według mnie wykorzystanie tego jest bardzo pomocne, np. gdy zmieniamy nazwę serwera, a w questach jest ona użyta x razy.

3. locale.lua

Większości ten plik może kojarzyć się z tłumaczeniami rozmówek npc itd. Otóż ma to o wiele szersze zastosowanie.

Załóżmy, że mamy quest na rozpoczęcie gry.

 

syschat("Witaj na serwerze Alamut!")
syschat("Oto startowy ekwipunek.")
syschat("Pozdrawia Admin - Nismo")
notice_all(pc.get_name().." rozpoczyna przygodę na Alamut")

I z losowego przypadku zmieniasz nazwę serwera - a okazuje się, że masz dziesiątki questów z ogłoszeniami i innymi.

Tutaj wkracza locale.lua. Dodajemy dwie linijki, mianowicie:

 

locale.name = "Alamut"
locale.admin = "Nismo"

Dobra, ale jak je teraz zastosować?

 

syschat("Witaj na serwerze "..locale.name.."!")
syschat("Oto startowy ekwipunek.")
syschat("Pozdrawia Admin - "..locale.admin)
notice_all(pc.get_name().." rozpoczyna przygodę na "..locale.name)

No i efekt mamy dokładnie ten sam.

A propos pisania czegoś x razy... Tutaj się przyda zastosowanie pętli.

4. Pętle

Przykład: modyfikujemy questa na otrzymywanie skilli, chcemy je otrzymywać na P.

Po state start begin dodajemy następującą funkcję. Po co? Zawsze lepiej wpisać jedną linijkę i masz.

 

function set_skill()
for i = 1, 111 do -- od 1 - wojownik do 111 - szaman
pc.set_skill_level(i, 59) -- powtarza funkcję jedynie zmieniając argument pierwszy - podwyższając go.
end
end

No i schodzimy do fragmentu questa, gdzie postać otrzymuje umiejętności i dodajemy tą linkjkę:

 

skill_group.set_skill() -- nazwa questa.nazwa funkcji

Wspomnę jeszcze, że jeśli dodajemy funkcję bezpośrednio do questa, trzeba dodać ten przedrostek. Jeśli dodajemy ją do questlib.lua, nie dodajemy go.

Pętle na for się nie kończą, więc dodam jeszcze jedną pętlę. Chcemy np dostać 99 level od npc. To tutaj taki quest na szybko:

 

quest skill begin
state start begin
when 20091.click begin
repeat
pc.give_exp2(pc.get_next_exp())
until pc.level == 99
syschat("Otrzymano 99 poziom!")
end
end
end

Warto dodać, że ta pętla nie musi być kończona endem!

Tutorial będę rozwijał, to dopiero jego pierwsza część.

Opublikowano

Można też to było zrobić używając for:

 

for i = 1, 99 do
pc.give_exp2(pc.get_next_exp())
end

Przynajmniej tak mi się wydaje.

Opublikowano

Bambusek wieki temu dodał przydatny tutorial z funkcją.

 

-------------------------------------------
---------Funkcja Level By Bambus3k---------
-------------------------------------------
function pc.set_level(lev)
    if pc.getqf("__NEXT_LEVEL__") == 0 then
        pc.setqf("__NEXT_LEVEL__", 1)
---------------
-- BugFix --
---------------
if pc.level >= lev then
return
end
        repeat
            pc.give_exp2(pc.get_next_exp())
        until pc.level == lev
    end
end

http://www.mpcforum.pl/topic/269292-quest-problem-z-doswiadczeniem-na-start/

 

repeat to tu najlepsze wyjście.. napisałeś, że end nie jest potrzebny, więc opisz resztę pętli, w których jest.


 

Opublikowano

neh, po czterech dniach bana można napisać. Zaraz się wezmę za poprawę tutoriala.

Co do ww funkcji, nie rozumiem po co tu ten qf jest.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...