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

[Quest] Tips & Tricks


Rekomendowane odpowiedzi

Opublikowano

Siemanko. Mam zamiar pisać tutaj ciekawostki dotyczące questów, oraz porady dotyczące tego, czego powinniśmy unikać przy pisaniu oraz jak 'odchudzić' nasz kod. Mam również nadzieję, że coś z tego wyniesiecie. W razie jakichkolwiek błędów z mojej strony, piszcie w komentarzach, jestem tylko człowiekiem :)

 

 

Skracanie kodu

 

Zacznijmy od prostej rzeczy, jaką są zmienne. Przyjmijmy, że mamy do wyświetlenia nazwę danego npc, na który kliknęliśmy. Używamy w tym momencie funkcji mob_name() oraz npc.get_race().

 

 

Sporo osób pisze w ten sposób:

say_title(""..mob_name(npc.get_race()).."")

ale po co tutaj niepotrzebne cudzysłowy i kropki? Skrócony kod może wyglądać tak:

say_title(mob_name(npc.get_race()))

Dodatkowym sposobem jest to, że NIE MUSIMY używać nawiasów w funkcjach, które nie przyjmują żadnych argumentów, ale dla przejrzystości kodu i łatwiejszego wyłapywania błędów polecam używać.

 

 

 

Kolejna sprawa. Posłużę się przykładem dawania ekwipunku, w tym przypadku zbroi. Możemy to zapisać na kilka sposobów, przedstawię tutaj 3.

 

 

Wykorzystanie instrukcji warunkowej IF.

if pc.get_job() == 0 then
pc.give_item2(11209, 1)
elseif pc.get_job() == 1 then
pc.give_item2(11409, 1)
elseif pc.get_job() == 2 then
pc.give_item2(11609, 1)
elseif pc.get_job() == 3 then
pc.give_item2(11809, 1)
end

 

Wykorzystanie tablicy

local tablica =
{
11209,
11409,
11609,
11809,
}
pc.give_item2(tablica[pc.get_job()+1])

pc.get_job()+1 w przypadku wojownika zwróci nam wartość 1, bo pc.get_job() wojownika to 0, po dodaniu 1 otrzymujemy 1.

pc.get_job()+1 w przypadku ninjy zwróci nam wartość 2, bo pc.get_job() ninjy to 1, po dodaniu 1 otrzymujemy 2

itd.

 

Wykorzystanie mózgu

Skoro mamy zwiększanie wartości przedmiotu o 200, to możemy użyć takiego rozwiązania:

11209 + 200*pc.get_job()

czyli w praktyce

pc.give_item2(11209+200*pc.get_job())

wojownik - pc.get_job() == 0 czyli 11209 + 0 (wynik mnożony przez zero, daje zawsze zero[200*0]) czyli wychodzi nam 11209, czyli ID zbroi dla wojownika.

sura - pc.get_job() == 2 czyli 11209 + 400 (200*2) czyli wychodzi nam 11609, a to jest ID zbroi dla sury.

 

 

Błędy przy wgrywaniu questów

Polskie znaki diakrytyczne.

 

Po stokroć nie będę o tym przypominał, jest to ostatni raz :) Nie stawiamy polskich znaków (tzw. diakrytycznych) czyli 'ą, ź. ć. ż, ę' itd. przy zamknięciu cudzysłowu.

Niepoprawny zapis:

say("odchudzić")

Aby to 'naprawić', wystarczy przed cudzysłowem postawić spację.

say("odchudzić ")

Często jest tak, że quest wgrywa się na serwer, ale nie działa w grze - to jest właśnie ten problem (w jakichś 99% przypadków). Jeżeli też kompilator zatrzymuje się (niby wgrywając) to również należy sprawdzić polskie znaki. Ja już z przyzwyczajenia stawiam spację po takich znakach. Troszkę praktyki i opanujecie to :)

 

 

syntax error : [string "start"]:2: unexpected symbol near 'when'

test.quest:9:abort (core dumped)

 

 

Błąd, który jest w sumie najłatwiejszy do sprecyzowania. Znając podstawy języka angielskiego lub chociażby używając Google tłumacza, można wywnioskować o co chodzi. Posłużę się przykładem:

 

syntax1.jpg

Przyjrzyjmy się bliżej. Stosując tabulatory oraz czytając treść błędu, szybko znajdujemy przyczynę - brak zamkniętego znacznika when.

 

ZAPAMIĘTAJ!!

Zamykamy każdy:

  • quest
  • state
  • when
  • if (nie mylmy z elseif oraz else, jest to tylko przedłużenie instrukcji warunkowej if (jeżeli))
  • każdą pętlę:

  1. for
  2. while
     

jeżeli o czymś zapomniałem to najmocniej przepraszam :)

 

Reasumując - zamykamy when z linii numer 3 i problem znika.

 

 

 

 

Spis questów napisanych przeze mnie

Automatyczna peleryna

 

 

O co tutaj w ogóle chodzi? Jeżeli klikniemy na przedmiot o ID 70888, co 5 sekund potwory zostaną przywołane w naszą stronę jak po użyciu zwykłej peleryny. Jeżeli nie posiadamy żadnej peleryny męstwa (ID 70038) w ekwipunku, quest nie zostanie uruchomiony. Czas edytujemy w tym miejscu:

local czas = 5 -- sekund

http://wklej.to/ZSFwy

 

 

 

Quiz

 

 

Polega na poprawnym odpowiadaniu na pytania - sama nazwa na to wskazuje :) Quest jest (mam nadzieję) ładny, przejrzysty, łatwy do edycji:

 

Link do tematu:

http://www.mpcforum.pl/topic/788730-quest-quiz/

 

Link na wklej.to:

http://wklej.to/4ROuR

 

Quest w code:

 

quest quiz begin
state start begin
function pytanie()
local q =
{
[0] = {""},
[1] = {"Który przedmiot jest wymagany do ulepszenia Zatrutego Miecza na +9?", "Krwawa perła", "Sok z kwiatu brzoskwini", "Niebieska perła", "Gwoździe", 1},
[2] = {"Gdy ranga postaci osiągnie 12000 punktów, będzie nosiła nazwę...", "Przyjazny", "Wrogi", "Nieprzyjemny", "Rycerski", 4},
[3] = {"Od którego poziomu postaci można rozpocząć misję konną?", "od 25 poziomu", "od 12 poziomu", "od 30 poziomu", "Nie można jeździć konno", 1},
[4] = {"Który poziom postaci jest wymagany do założenia gildii?", "wyższy niż 40 poziom", "maksymalnie 20 poziom", "wyższy niż 50 poziom", "wyższy niż 80 poziom", 1},
[5] = {"Który przedmiot nie pasuje?", "Wachlarz", "Oceaniczny wachlarz", "Morelowy dzwon", "Miecz pełni księżyca", 4},
[6] = {"U instruktura mocy zabójcy może szkolić się...", "Sura", "Wojownik", "Ninja", "Szaman", 3},
[7] = {"Którą zbroję może ubrać wojownik...", "Czarna szata", "Upiorna zbroja płytowa", "Zbroja z czarnej stali", "Ubranie zabójcy", 3},
}

local los = math.random(1, table.getn(q))
say("Pytanie:")
say(q[los][1])
say()
local x = select(q[los][2], q[los][3], q[los][4], q[los][5])
if x == q[los][6] then
table.insert(pkt, 1, pkt[1]+1)
table.insert(pyt, 1, pyt[1]+1)
if pyt[1] >= 5 then
say_title("BRAWO! Odpowiedziałeś poprawnie na wszystkie")
say_title("zadane Ci pytania. Uzyskujesz dodatkowe punkty.")
say_title("Gratulacje!")
say()
pc.setqf("punkty_quiz", pc.getqf("punkty_quiz")+pkt[1])
pc.remove_item(50034, 1)
else
quiz.pytanie()
end
else
say("Niestety, poprawna odpowiedź to: "..q[los][q[los][6]+1])
say("Twoja liczba uzyskanych punktów: "..pkt[1])
say()
say_reward("Uzyskane punkty możesz wymienić na przedmioty")
say_reward("znajdujące się u Dozorcy.")
say()
if pc.getqf("punkty_quiz")+pkt[1] > 0 then
pc.setqf("punkty_quiz", pc.getqf("punkty_quiz")+pkt[1])
elseif pc.getqf("punkty_quiz")+pkt[1] <= 0 then
pc.delqf("punkty_quiz")
end
pc.remove_item(50034, 1)
end
end

when 50034.use begin
pkt = {"0"}
pyt = {"0"}
quiz.pytanie()
end
end
end

 

 

Dodawanie kolejnych pytań? Nic prostszego!

[6] = {"U instruktura mocy zabójcy może szkolić się...", "Sura", "Wojownik", "Ninja", "Szaman", 3},

W pierwszym cudzysłowie mamy pytanie, które jest wyświetlane. Następnie kolejne 4 cudzysłowy to ODPOWIEDZI. Ostatnią liczbą (w tym przypadku jest to liczba 3) jest to odpowiedź. Spośród tych 4 cudzysłowów (odpowiedzi) numer 3, czyli Ninja, jest poprawną odpowiedzią.

 

 

Ten 'poradnik' będę na bieżąco aktualizował. Miłego czytania.

 

umarł

Opublikowano

elseif pc.get_job() == 3 then

To jest funkcja która oznacza klasę postaci (chyba sura)

 

A wiesz może jaka jest funkcja która daje itemy tylko dla danego królestwa?

 

elseif pc.empire_job() == 3 then

?

"Mimo wszystko do normalnego życia jest potrzebna nam druga osoba."


Każdy kiedyś musi...


Koniec z MpcForum.pl


Opublikowano

elseif pc.get_job() == 3 then

To jest funkcja która oznacza klasę postaci (chyba sura)

 

A wiesz może jaka jest funkcja która daje itemy tylko dla danego królestwa?

 

elseif pc.empire_job() == 3 then

?

 

pc.get_empire()==1 dla shinsoo, ==2 dla chunjo, ==3 dla jinno

57199140501148694665.png

Opublikowano

aa i do pc.get_empire trzeba dodac == 1 then / == 2 then / == 3 then ?

"Mimo wszystko do normalnego życia jest potrzebna nam druga osoba."


Każdy kiedyś musi...


Koniec z MpcForum.pl


Opublikowano

elseif pc.get_job() == 3 then

To jest funkcja która oznacza klasę postaci (chyba sura)

 

A wiesz może jaka jest funkcja która daje itemy tylko dla danego królestwa?

 

elseif pc.empire_job() == 3 then

?

Jeżeli chcesz zrobić coś w deseń, że przykładowo ukończenie questu w królestwie Shinsoo daje nam przedmiot o ID 19, a w Chunjo przedmiot o ID 29, Jinno ID 39 to rozwiązaniem jest to:

pc.give_item2(19+(10*(pc.get_empire()-1)), 1)

Dlaczego?

Chunjo == 2 czyli 19 + 10 (10*1) == 29

 

Jeżeli natomiast chcesz zrobić z innymi przedmiotami, gdzie użycie mózgu nie bardzo pomoże, to:

 

if pc.get_empire() == 1 then
pc.give_item2(shinsoo, 1)
elseif pc.get_empire() == 2 then
pc.give_item2(chunjo, 1)
elseif pc.get_empire() == 3 then
pc.give_item2(jinno, 1)
end

 

umarł

Opublikowano

Dopisz o zapytaniach sql, wielowymiarowych tablicach(męczyliśmy się z tym) no i co, to chyba wszystko :)

ePc0b.jpg

mcn_cc.pl - banda złodziei

;)

Piszę questy na zamówienie - Zostanę questerem na serwerze dedykowanym - Na zlecenie napiszę questy - Zakoduję stronę HTML5/CSS3

Opublikowano

Dopisz o zapytaniach sql, wielowymiarowych tablicach(męczyliśmy się z tym) no i co, to chyba wszystko :)

 

toć tablice były omówione i to bardzo dobrze :)

http://www.mpcforum.pl/topic/792847-tuttablice-w-questach-czyli-czym-to-sie-je/

 

 

i masz wielowymiarówki opisane, przeczytaj dokładnie temat ;]

57199140501148694665.png

Opublikowano

toć tablice były omówione i to bardzo dobrze :)

http://www.mpcforum.pl/topic/792847-tuttablice-w-questach-czyli-czym-to-sie-je/

Wiem przecież. Chodziło mi o wielowymiarówkach, do tej pory robię byki w questach :unsure:

ePc0b.jpg

mcn_cc.pl - banda złodziei

;)

Piszę questy na zamówienie - Zostanę questerem na serwerze dedykowanym - Na zlecenie napiszę questy - Zakoduję stronę HTML5/CSS3

Opublikowano

Nie pierdol, bo musimy :D

Albo to ironia albo fail(pc.money/pc.level) ;p

ePc0b.jpg

mcn_cc.pl - banda złodziei

;)

Piszę questy na zamówienie - Zostanę questerem na serwerze dedykowanym - Na zlecenie napiszę questy - Zakoduję stronę HTML5/CSS3

Opublikowano

npc_index_table = {
   ['race'] = npc.getrace,
   ['empire'] = npc.get_empire,
}

pc_index_table = {
   ['weapon']        = pc.getweapon,
   ['level']        = pc.get_level,
   ['hp']        = pc.gethp,
   ['maxhp']        = pc.getmaxhp,
   ['sp']        = pc.getsp,
   ['maxsp']        = pc.getmaxsp,
   ['exp']        = pc.get_exp,
   ['nextexp']        = pc.get_next_exp,
   ['job']        = pc.get_job,
   ['money']        = pc.getmoney,
   ['gold']         = pc.getmoney,
   ['name']         = pc.getname,
   ['playtime']     = pc.getplaytime,
   ['leadership']     = pc.getleadership,
   ['empire']         = pc.getempire,
   ['skillgroup']     = pc.get_skill_group,
   ['x']         = pc.getx,
   ['y']         = pc.gety,
   ['local_x']     = pc.get_local_x,
   ['local_y']     = pc.get_local_y,
}

item_index_table = {
   ['vnum']        = item.get_vnum,
   ['name']        = item.get_name,
   ['size']        = item.get_size,
   ['count']        = item.get_count,
   ['type']        = item.get_type,
   ['sub_type']    = item.get_sub_type,
   ['refine_vnum']    = item.get_refine_vnum,
   ['level']        = item.get_level,
}


function npc_index(t,i)
   local npit = npc_index_table
   if npit[i] then
   return npit[i]()
   else
   return rawget(t,i)
   end
end

function pc_index(t,i)
   local pit = pc_index_table
   if pit[i] then
   return pit[i]()
   else
   return rawget(t,i)
   end
end

function item_index(t, i)
   local iit = item_index_table
   if iit[i] then
   return iit[i]()
   else
   return rawget(t, i)
   end
end

setmetatable(pc,{__index=pc_index})
setmetatable(npc,{__index=npc_index})
setmetatable(item,{__index=item_index})

 

to nie są jak gdyby funkcje, a bardziej coś w stylu 'wiązań' do normalnych funkcji.


 

Opublikowano

Nie pierdol, bo musimy :D

W tych dwóch funkcjach nie musimy. Źle sprecyzowałem swoją wypowiedź ;)

 

umarł

Opublikowano

Możesz jeszcze dopisać, że jak np. używamy dużo razy

mob_name(npc.get_race())

To można zrobić tak:

 

local x = mob_name(npc.get_race())

I dalej:

say_title(x)
say_title(x)
say_title(x)
say_title(x)

Opublikowano

Ja napisałem sobie funkcję do questliba:

 

function npc_name()
return say_title(mob_name(npc.get_race()))
end

potem wystarczy tylko:

npc_name()

 

@down

gówno

 

@down edit

dobra Aronia :D

 

umarł

Opublikowano

Moja fukcja fuk u z4zol :c

@up

moje tak czy siak, won mendo :c

ePc0b.jpg

mcn_cc.pl - banda złodziei

;)

Piszę questy na zamówienie - Zostanę questerem na serwerze dedykowanym - Na zlecenie napiszę questy - Zakoduję stronę HTML5/CSS3

Opublikowano

Mała edycja, dodanie spisu własnych questów oraz kolejny błąd przy wgrywaniu.

 

@down

fakt, mała pomyłka, rozpędziłem się ;)

 

umarł

Opublikowano

Ejj, o ile mi wiadomo, repeat nie zakańczamy endem :c

ePc0b.jpg

mcn_cc.pl - banda złodziei

;)

Piszę questy na zamówienie - Zostanę questerem na serwerze dedykowanym - Na zlecenie napiszę questy - Zakoduję stronę HTML5/CSS3

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...