Odpowiedz 
NPC "Tasker"
15-02-2013, 05:27 PM
Post: #1
Information NPC "Tasker"
Witam,

Aby zrobić prostego NPC Taskowego nie potrzeba dużej znajomości języka, wystarczy trochę uwagi po pierwsze do pliku:
data/npc/scripts/lib/npc.lua dodajemy następująca treść:
Kod PHP:
function taskLoop(cidmsgtaskstalkStages)
    
local choice = {
        {
id=2sendmsgpl="Chce wybrac inne polowanie."},
        {
id=2sendmsgpl="Dowidzenia."},
    }
    
local stage getTalkStage(talkStagescid)
    
    if(
stage == "task_choice")then
        local lvl 
getPlayerLevel(cid)
        
local tmp_stage = {"choice_monster", {}}
        for 
i,v in pairs(tasks) do
            if((
lvl >= v.lvl.min and lvl <= v.lvl.max) or v.lvl.always)then
                table
.insert(choice, {id=1sendmsgpl=.. " {" .. v.reqcount .. "}"})
                
table.insert(tmp_stage[2], i)
            
end
        end
        
        selfSay
("Oto lista potworow na ktore mozesz zapolowac:"cidfalse)
        
Show(cid1choice)
        
setTalkStage(talkStagescidtmp_stage)
    elseif(
type(stage) == "table" and stage[1] == "choice_monster")then
        local c 
tonumber(msg)
        if(
~= nil)then
            local name 
stage[2][c]
            if(
not name:lower():find("group"))then
                setPlayerStorageValue
(cidtasks[name].svgetGlobalKilledMonsterCount(cidname))
            else
                for 
_,v in pairs(tasks[name].group) do
                    
setPlayerStorageValue(cidv.svgetGlobalKilledMonsterCount(cidv.name))
                
end
            end
        end
        
        selfSay
("Swietnie i co teraz?"cidfalse)
        
Show(cid2choice)
        
setTalkStage(talkStagescid"menu_back")
    elseif(
stage == "check_task")then
        local state 
"Stan Twoich polowan:\n"
        
local zero true
        
for i,v in pairs(tasks) do
            if(
not i:lower():find("group"))then
                local tmp 
getPlayerStorageValue(cidv.sv)
                if(
tmp ~= -1)then
                    local count 
v.reqcount - (getGlobalKilledMonsterCount(cidi) - tmp)
                    
state state .. .. ": " .. (count >= and count or 0)
                    
zero false
                end
            
else
                
local sum 0
                
for _,w in pairs(v.group) do
                    
local tmp getPlayerStorageValue(cidw.sv)
                    if(
tmp ~= -1)then
                        sum 
sum + (getGlobalKilledMonsterCount(cidw.name) - tmp)
                        
zero false
                    end
                end
                
                
if(sum 0)then
                    state 
state .. .. ": " .. (v.reqcount sum >= and v.reqcount sum or 0)
                
end
            end
        end
        
        
if(not zero)then
            selfSay
(statecidfalse)
            
Show(cid2choice)
            
setTalkStage(talkStagescid"menu_back")
        else
            
selfSay("Jeszcze nie polujesz!"cidfalse)
            
Show(cid2choice)
            
setTalkStage(talkStagescid"menu_back")
        
end
    
elseif(stage == "complete_tasks")then
        local tmp_stage 
= {"get_rewards", {}}
        for 
i,v in pairs(tasks) do
            if(
not i:lower():find("group"))then
                local tmp 
getPlayerStorageValue(cidv.sv)
                if(
tmp ~= -1)then
                    local count 
v.reqcount - (getGlobalKilledMonsterCount(cidi) - tmp)
                    if(
count <= 0)then
                        table
.insert(choice, {id=1sendmsgpl=i})
                        
table.insert(tmp_stage[2], i)
                    
end
                end
            
else
                
local sum 0
                
for _,w in pairs(v.group) do
                    
local tmp getPlayerStorageValue(cidw.sv)
                    if(
tmp ~= -1)then
                        sum 
sum + (getGlobalKilledMonsterCount(cidw.name) - tmp)
                    
end
                end
                
                
if((v.reqcount sum) <= 0)then
                    table
.insert(choice, {id=1sendmsgpl=i})
                    
table.insert(tmp_stage[2], i)
                
end
            end
        end
        
        
if(#tmp_stage[2] ~= 0)then
            
selfSay("Oto lista zakonczonych polowan:"cidfalse)
            
Show(cid1choice)
            
setTalkStage(talkStages,cidtmp_stage)
        else
            
selfSay("Zadne polowanie nie zostalo zakonczone!"cidfalse)
            
Show(cid2choice)
            
setTalkStage(talkStagescid"menu_back")
        
end
    
elseif(type(stage) == "table" and stage[1] == "get_rewards")then
        local c 
tonumber(msg)
        if(
~= nil)then
            
for i,v in pairs(tasks[stage[2][c]].rewards) do
                if(
== "exp")then
                    addExperience
(cidv)
                elseif(
== "sv")then
                    
if(v.add ~= nil and v.add)then
                        local tmp 
getPlayerStorageValue(cidv.id)
                        
setPlayerStorageValue(cidv.id, (tmp == -and or tmp) + v.count)
                    else
                        
setPlayerStorageValue(cidv.idv.count)
                    
end
                end
            end
        end
        
        selfSay
("Oto twoje nagroda!"cidfalse)
        
Show(cid2choice)
        
setTalkStage(talkStagescid"menu_back")    
    
end        
end 

następne w data/npc tworzymy plik przykładowego npc powiedzmy tasker.xml:
Kod PHP:
<?xml version="1.0" encoding="UTF-8"?>
<npc name="Tasker" script="npc/scripts/tasker.lua" walkinterval="2000" access="1" floorchange="0">
<health now="100" max="100"/>
<look type="155" head="95" body="40" legs="21" feet="114" addons="1"/>
</npc> 

Następnie w data/npc/scripts tworzymy plik tasker.lua i wypełniamy go następującą treścią:
Kod PHP:
local focuses = {}
local talkStages = {}

local tasks = { --WAZNE NIE ZMIENIAC KOLEJNOSCI W TABLICYZAWSZE DOPISYWAC NOWE QUESTY NA KONIEC
    
["Wolf"] = { -- to chyba jasne lecz wazna jest konstrukcja ma to dokladnie tak wygladac zmieniamy tylko tekst w ""
        
lvl = {always=falsemin=6max=49}, -- always czy task jest widoczny mimo levelu(true/false), min minimalny lvl na taskamax analogicznie
        sv 
20000, -- SV przechowujace liczbe zabitych potworow
        reqcount 
300, -- wymagana ilosc potworów do zakonczenia taska
        rewards 
= { -- nagrody
            
["exp"] = 800, -- ilosc expa jaki otrzymamy za taska
        
}
    },
    
    [
"Group Jakas"] = { -- kazda grupa w nazwie musi zawierac slowo `groupwielkosc liter nie ma zbaczenia
        group 
= { -- definicja grupy
            
{name="Troll"sv=20001}, -- sv SV przechowujace liczbe zabitych potworow o nazwie `name`
            {
name="Rotworm"sv=20002}, -- j/w
            
-- {name="i tak dalej"sv=XXXX},
        },
        --
tutaj reszta bez zmian
        lvl 
= {always=truemin=6max=49}, 
        
reqcount 10
        
rewards = { 
            [
"exp"] = 1500
            [
"sv"] = {id=rank_svadd=truecount=2
        }
    },
}

function 
onCreatureSay(cidtypemsglanguage)
    
local choice = {
        {
id=1sendmsgpl="Tak!"},
        {
id=1sendmsgpl="Moze innym razem."},
        
        {
id=2sendmsgpl="Na co moge zapolowac?"},
        {
id=2sendmsgpl="Chcialbym sprawdzic stan swoich polowan."},
        {
id=2sendmsgpl="Chcialbym odebrac nagrody za polowania."},
        {
id=2sendmsgpl="Wroce pozniej..."},
        
        {
id=3sendmsgpl="Chce wybrac inne polowanie."},
        {
id=3sendmsgpl="Dowidzenia."},
    }

    
msg string.lower(msg)
    
local stage getTalkStage(talkStagescid)
    
    if (
isStillSaying(cid) == 1then  
       
return
    
end
    
    
if(getDistanceTo(cid) < 5)then    
        
if(not isFocused(focusescid))then
            
if (msg == "hi" or msg == "hello"then
                addFocus
(focusescid)
                
selfSay("Witaj czy chcialbys na cos zapolowac??"cidfalse)
                
Show(cid1choice)
                
setTalkStage(talkStagescid"task_menu")
            
end
        
elseif(isFocused(focusescid))then
            
if(stage == "task_menu" and msg == "1")then
                stage 
"task_menu"
            
end
            
            
if(stage == "task_menu")then
                
if(msg == "1")then
                    selfSay
("Dobrze wiec, opissss... :D"cidfalse)
                    
Show(cid2choice)
                    
setTalkStage(talkStagescid"task_menu_choose")
                elseif(
msg == "2")then
                    doEndTalk
(cidfalsefocusestalkStagesspecial_stepsspecial_flags)
                
end
            
elseif(stage == "task_menu_choose")then
                
if(msg == "4")then
                    doEndTalk
(cidfalsefocusestalkStagesspecial_stepsspecial_flags)
                    return
                
end
            
                
if(msg == "1")then
                    setTalkStage
(talkStagescid"task_choice")
                elseif(
msg == "2")then
                    setTalkStage
(talkStagescid"check_task")
                elseif(
msg == "3")then
                    setTalkStage
(talkStagescid"complete_tasks")
                
end
                taskLoop
(cidmsgtaskstalkStages)
            elseif(
stage == "menu_back")then
                
if(msg == "1")then
                    Show
(cid2choice)
                    
setTalkStage(talkStagescid"task_menu_choose")
                elseif(
msg == "2")then
                    doEndTalk
(cidfalsefocusestalkStagesspecial_stepsspecial_flags)
                
end
            
else
                
taskLoop(cidmsgtaskstalkStages)
            
end
        end
    end
end
 
function onThink()
-- 
Remember if XML File have moving "1" add "--":
-- 
Pamietaj gdy w pliku XML atrybut moving "1" komentowaæ poni¿sze warunki warunek:
    if 
#focuses == 0 then
        
if isMoving() > 0 then
            startMoving
()
        
end
    
return
    
end
--------------------------------------------------------------------------------
    for 
icid in pairs(focuses) do
        
local distance getDistanceTo(cid) or -1
        
if distance or distance == -1 then
            doEndTalk
(cidfalsefocusestalkStages)
        
end
    end
end
 
function onThingMove(cidposend
function onCreatureAppear(cidend
function onPlayerEndTrade(cid
end 

function onPlayerCloseChannel(cid)
    if 
isFocused(focusescidthen
        doEndTalk
(cidfalsefocusestalkStages)
    
end
end

function onCreatureDisappear(cidpos)
    if 
isFocused(focusescidthen
        doEndTalk
(cidfalsefocusestalkStages)
    
end
end 

Teraz przystępujemy do konfiguracji zawartej w tablicy tasks, opatrzyłem ją dość dobrze komentarzami która linia co znaczy, aby dodać nowego taska po prostu kopiujemy poprzedniego i odpowiednio wyedytowujemy zgodnie z komentarzami zawartymi po podwójnym myślniku( -- ), w razie problemów proszę o kontakt.

Pozdrawiam.
Znajdź wszystkie posty użytkownika
Odpowiedz cytując ten post
Odpowiedz 


Skocz do:


Użytkownicy przeglądający ten wątek: 1 gości