What's new

Skrypty & Kody problem z npc

Status
Not open for further replies.

myszkacs

Active User
Joined
Nov 21, 2008
Messages
51
Reaction score
4
kiedy napisze 'mission' wyskakuje b??d i dupa.

Code:
[10:34:45.775] [Error - NpcScript Interface]
[10:34:45.775] data/npc/scripts/ongulf.lua:onCreatureSay
[10:34:45.775] Description:
[10:34:45.775] data/npc/lib/npcsystem/npchandler.lua:623: attempt to compare boolean with number
[10:34:45.775] stack traceback:
[10:34:45.775]  data/npc/lib/npcsystem/npchandler.lua:623: in function 'say'
[10:34:45.775]  data/npc/scripts/ongulf.lua:25: in function 'callback'
[10:34:45.775]  data/npc/lib/npcsystem/npchandler.lua:423: in function 'onCreatureSay'
[10:34:45.775]  data/npc/scripts/ongulf.lua:12: in function <data/npc/scripts/ongulf.lua:11>

[lua]local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local talkState = {}
function onCreatureAppear(cid)
npcHandler:eek:nCreatureAppear(cid)
end
function onCreatureDisappear(cid)
npcHandler:eek:nCreatureDisappear(cid)
end
function onCreatureSay(cid, type, msg)
npcHandler:eek:nCreatureSay(cid, type, msg)
end
function onThink()
npcHandler:eek:nThink()
end
function creatureSayCallback(cid, type, msg)
if(not(npcHandler:isFocused(cid))) then
return false
end
local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid
if(msgcontains(msg, "mission")) then
if(getPlayerStorageValue(cid, STORAGE_ONGULF) < 1) then
npcHandler:say("Well, it's a long story but you really should listen to understand what is going on here. You can also hear a short version of the story, but then don't blame me if you mess something up due to your undwarfish impatience. ... ", cid)
npcHandler:say("So what would you like to hear, the long story or the short version? ", cid, true)
talkState[talkUser] = 1
elseif(getPlayerStorageValue(cid, STORAGE_ONGULF) == 1) then
npcHandler:say("Listen, I can handle the organisation down here and my boys will handle the construction of the base fine enough. Actually, all you do down here is to stand in the workers' way. ... ", cid)
npcHandler:say("But there might be something for you to do outside the base. We need to learn more about the land up there. Take the lift and do some exploring. Find a passage leading out of the mountains. ... ", cid, true)
npcHandler:say("Do not explore any further though. You never know whom you might be messing with. ", cid, true)
setPlayerStorageValue(cid, STORAGE_ONGULF, 2)
elseif(getPlayerStorageValue(cid, STORAGE_ONGULF) == 3) then
npcHandler:say("Excellent. Although we have no idea what awaits us in this foreign land, it is always good to know something more about our surroundings. ", cid)
setPlayerStorageValue(cid, STORAGE_ONGULF, 4)
elseif(getPlayerStorageValue(cid, STORAGE_ONGULF) == 4) then
npcHandler:say("Things are running fine so far. Actually so fine that we are short of supplies and men. I'd send a letter home but I guess sending you to get some assistance gives the whole affair a bit more urgency. ... ", cid)
npcHandler:say("So please travel back to Kazordoon. In the western mines outside of The Big Old One, you'll find Melfar of the imperial mining guild. Ask him to send some more miners and wood. When you return, I might have some more interesting missions for you. ", cid, true)
setPlayerStorageValue(cid, STORAGE_ONGULF, 5)
elseif(getPlayerStorageValue(cid, STORAGE_ONGULF) == 8) then
npcHandler:say("Our guards reported some nightly visitors. They chased them through the mountains but lost them when the fugitives climbed up some vines. ... ", cid)
npcHandler:say("It could easily be some trap and I'm somewhat reluctant to send you there, but we can't allow some invisible aggressor to spy on us and maybe to prepare an attack. ... ", cid, true)
npcHandler:say("Find these vines in this mountain, climb up there and find out who is spying on us! If they mean harm, get rid of them if possible. ... ", cid, true)
npcHandler:say("If they are too powerful, just retreat and we will have to re-evaluate the situation. If they are harmless, all the better. ", cid, true)
setPlayerStorageValue(cid, STORAGE_ONGULF, 9)
elseif(getPlayerStorageValue(cid, STORAGE_ONGULF) == 10) then
npcHandler:say("Primitive humans you say? This are most startling news, that's for sure. Well, I guess I'll send some victuals we can spare as a sign of our good will. ... ", cid)
npcHandler:say("However, our miners encountered another problem in the meantime. I'm afraid this will be your next mission. ", cid, true)
setPlayerStorageValue(cid, STORAGE_ONGULF, 11)
elseif(getPlayerStorageValue(cid, STORAGE_ONGULF) == 11) then
npcHandler:say("It seems things went from bad to worse! First we had some problems with the mine shafts we were building, and now that we found some precious veins in one of the new mines, and it happens to be the holiday resort of some hostile stone creatures! ... ", cid)
npcHandler:say("Nothing we dwarfs couldn't handle alone, but I rather thought this could be something interesting for an adventurer like you. ... ", cid, true)
npcHandler:say("So I reserved you the privilege to slay the leader! Use the mining lift to reach mine A07. The more stone creatures you kill, the better. Your mission, however, is to slay their leader, most likely some special stone beast. ", cid, true)
setPlayerStorageValue(cid, STORAGE_ONGULF, 12)
elseif(getPlayerStorageValue(cid, STORAGE_ONGULF) == 13) then
npcHandler:say("Shortly after you killed that creature, the others crumbled to dust and stone. I hope this incident does not foreshadow similar problems in our mines. However, for now I have other things to take care of and you have other missions to accomplish.", cid)
setPlayerStorageValue(cid, STORAGE_ONGULF, 14)
elseif(getPlayerStorageValue(cid, STORAGE_ONGULF) == 14) then
npcHandler:say("Things are getting more and more complicated. You need to convince our friends that some intervention for their part is needed. ... ", cid)
npcHandler:say("We've come a long way with our own resources, but now our resources are short and we need the others to step in. I want you to negotiate some more support from our partners. ... ", cid, true)
npcHandler:say("You'll need all your diplomacy and influence. If you blow the negotiations, look for a guy called Black Bert in Thais. ... ", cid, true)
npcHandler:say("He has access to all kind of odd items, and he might have just the right bribe to convince someone to continue negotiations. ... ", cid, true)
npcHandler:say("It will not be as easy as it might sound. So watch your words and your manners and keep in mind whom you are talking to. ... ", cid, true)
npcHandler:say("Different strategies might be necessary for different people. You may try to FLATTER, THREATEN, IMPRESS, BLUFF, PLEA or to REASON with them. You probably need some luck as well. ... ", cid, true)
npcHandler:say("And now listen: We need more workers for the mines. The technomancers told us that a guy named Telas, who lives in Edron, copied the worker golem technology from Yalahar. Convince him to send us some of these golems. ... ", cid, true)
npcHandler:say("Further, we have more ore and end products than we can use right now. So we need someone to buy all the surplus. Convince Leeland Slim in Venore that the local traders step in as resellers. ... ", cid, true)
npcHandler:say("Another issue at hand is our lack of drilling worms. That should not be a big problem though. Just talk to the worm tamer in Kazordoon. If he does not get mad about you, there should be no problem to get his support. ... ", cid, true)
npcHandler:say("Also, now that our monetary resources are used up and not much cash is coming in, we need additional help to finance this venture. Thais has promised money in advance, but we haven't seen any of this support, yet. ... ", cid, true)
npcHandler:say("Convince the Thaian king to send us the promised money right now. ... ", cid, true)
npcHandler:say("Another problem we need to solve is the exploration of our surroundings. We need to know friends and enemies, and find out about the plants and beasts in the vicinity and learn what is edible and what is dangerous. ... ", cid, true)
npcHandler:say("This is all stuff the Explorer Society is interested in. It should be easy to convince their representative in Port Hope. ... ", cid, true)
npcHandler:say("At last, with the growing numbers of adventurers here, not only the security of the base is growing but also the demand for certain supplies. I'd like the Edron academy to open up a shop in the base. We need to keep you adventurers happy, don't we? ... ", cid, true)
npcHandler:say("Well, I hope you understand the importance of this mission and got what it takes to fulfil it. So hurry up and get us the needed support. ", cid, true)
setPlayerStorageValue(cid, STORAGE_ONGULF, 15)
elseif(getPlayerStorageValue(cid, STORAGE_ONGULF) == 15) then
if(getPlayerStorageValue(cid, STORAGE_ALLIES) == 6) then
npcHandler:say("You did an excellent job! With all this help Farmine will grow and prosper. While we put all available resources into building this base, I have another urgent mission for you. ", cid)
setPlayerStorageValue(cid, STORAGE_ONGULF, 16)
else
npcHandler:say("Are you done yet?", cid)
end
elseif(getPlayerStorageValue(cid, STORAGE_ONGULF) == 16) then
npcHandler:say("Our new friends, those primitive humans sent us a warning. According to them, the 'green men' of the plains plan an attack on the mountains. ... ", cid)
npcHandler:say("Considering their expected number, there is no chance for us to beat them off. We might be able to hold our ground for a while, but without access to the surface and under constant attacks, we might have to abandon the base. ... ", cid, true)
npcHandler:say("Now, I'm aware that you cannot stop an entire army by yourself, but desperate situations call for desperate measures. I ask you to find the leaders of the orcs and ..., well do something. ...", cid, true)
npcHandler:say("Scare them, bribe them, give them another target or whatever. As futile as it may sound: Try to talk to their leaders in some way and make them stop their attack plans. This is our only hope. ", cid, true)
setPlayerStorageValue(cid, STORAGE_ONGULF, 17)
elseif(getPlayerStorageValue(cid, STORAGE_ONGULF) == 20) then
npcHandler:say("Oh my. What a mess you have gotten yourself into. Well, at least you made it out alive. Whatever the value of a minotaur's promise might be, I guess that is the best we can get. ... ", cid)
npcHandler:say("Of course all those revelations lead to new problems and a new mission for you. ", cid, true)
setPlayerStorageValue(cid, STORAGE_ONGULF, 21)
elseif(getPlayerStorageValue(cid, STORAGE_ONGULF) == 21) then
npcHandler:say("Ooook. Now that we managed to keep those orcs and minotaurs at bay at least for a while, we learn that the real meanies over here are some lizardmen. Just great, isn't it?. ... ", cid)
npcHandler:say("So you might already guess your next mission: Find a way to hold those lizards off. Find them, contact them, talk to them, scare them, bribe them, whatever. Just keep that snakes away if anyhow possible. ... ", cid, true)
npcHandler:say("If the orcs are right, they are somewhere in or behind those mountains in the north. I doubt you can reason with them in any way, but you'll have to try for the sake of Farmine. ", cid, true)
setPlayerStorageValue(cid, STORAGE_ONGULF, 22)
elseif(getPlayerStorageValue(cid, STORAGE_ONGULF) == 23) then
npcHandler:say("Oh, my! That sounds like a real mess. For now this dragon empire seems otherwise engaged, but we will be on guard thanks to you my friend. We will continue to fortify the base. ... ", cid)
npcHandler:say("This leaves not much to do for you down here. I recommend you continue to explore this strange new land. ... ", cid, true)
npcHandler:say("I'm pretty sure there are several opportunities at hand for an adventurer like you. ... ", cid, true)
npcHandler:say("Perhaps you can help the primitives you encountered. Who knows, maybe even those minotaurs give you a chance to fortify this fragile peace between us. ... ", cid, true)
npcHandler:say("Even some of the people here in the base might offer you some tasks sooner or later. If you prefer, you can also do some exploring, hunting and good ol' plundering on your own of course. ... ", cid, true)
npcHandler:say("This new land is yours to be taken, so to say. Go out and make your fortune! With Farmine you have always a safe haven to return to. ... ", cid, true)
npcHandler:say("Oh and one last thing: We convinced a carpet pilot to join us here. You'll find him on top of our lift in the mountains. I think he can offer you fast access to some cities back home. ", cid, true)
setPlayerStorageValue(cid, STORAGE_ONGULF, 24)
doPlayerAddItem(cid, 2152, 80)
end
elseif(msgcontains(msg, "short")) then
if(talkState[talkUser] == 1) then
npcHandler:say("<grumbles> Well, we have found this place here full of promising resources and plan to create a new mining outpost. Of course this takes a lot of effort and organisation. ... ", cid)
npcHandler:say("For some of the tasks at hand we need help, even from outsiders like you. So if you are interested in some missions, let me know. ", cid, true)
setPlayerStorageValue(cid, STORAGE_ONGULF, 1)
talkState[talkUser] = 0
end
elseif(msgcontains(msg, "short")) then
if(talkState[talkUser] == 1) then
npcHandler:say("After centuries the resources beneath and around the Big Old One became alarmingly short. Some decades ago, the imperial mining guild financed a project to search and establish new mines far away from Kazordoon. ... ", cid)
npcHandler:say("After several tries with mixed success, the project of the technomancers proved the most successful. Their steamships studied and mapped the great underground rivers deep beneath the earth. ... ", cid, true)
npcHandler:say("With the help of certain apparatuses, they tracked deposits of ore and compiled ship routes to reach them. These mining bases had some obvious advantages and disadvantages. ... ", cid, true)
npcHandler:say("The suitable spots had no connection to the surface. On one hand, this meant that the new mines were safe from most kinds of beasts. On the other hand, it meant that all food and materials had to be brought there by ship. ... ", cid, true)
npcHandler:say("Special, heavy ships were built to carry ore and supplies back and forth. The only limitation for such bases had been the range of the steamships. ... ", cid, true)
npcHandler:say("Recently, the technomancers with the help of the temples of fire and earth made some crucial discoveries that allowed the ships to extend their cruising range almost limitlessly. ... ", cid, true)
npcHandler:say("The survey ships of the technomancers were once again sent out to find new, promising resources. ... ", cid, true)
npcHandler:say("Sadly some of the ships never returned and others only found minor deposits of ore, not worth the effort. But one of the ships made a groundbreaking discovery - a cave that had a connection to the surface. ... ", cid, true)
npcHandler:say("As far as the explorers could tell, the area had been unknown to dwarfhood and mankind so far. ... ", cid, true)
npcHandler:say("What was more, the cave system had an abundance of rare ores. The imperial mining guild agreed to fund a new project and to name it 'project far far away'. ... ", cid, true)
npcHandler:say("Don't look at me, I'm not the one who came up with that name! Those technomancers are such an imaginative bunch. But where were we? Oh, yes, the new project! ...", cid, true)
npcHandler:say("Well, some ships were sent to establish a first base. ... ", cid, true)
npcHandler:say("It became painfully obvious that the number of workers needed there could not easily be supplied by the ships alone. Also such a base would require an amount of money, expertise and manpower that the guild could not provide. ... ", cid, true)
npcHandler:say("We would need help and additional resources. That's where you come into play. If you are interested, let's talk about possible missions.", cid, true)
setPlayerStorageValue(cid, STORAGE_ONGULF, 1)
talkState[talkUser] = 0
end
end
return true
end
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())[/lua]
 

Kahras

Senior User
Joined
Aug 26, 2011
Messages
2,714
Reaction score
167
Age
25
Odp: problem z npc

daj npchandler.lua tzn. nie wiem dok?adnie o co mo?e biaga? nie znam si? zbytnio na NPCtach
 

myszkacs

Active User
Joined
Nov 21, 2008
Messages
51
Reaction score
4
Odp: problem z npc

[lua]-- Advanced NPC System (Created by Jiddo),
-- Modified by TheForgottenServer Team.

if(NpcHandler == nil) then
-- Constant talkdelay behaviors.
TALKDELAY_NONE = 0 -- No talkdelay. Npc will reply immedeatly.
TALKDELAY_ONTHINK = 1 -- Talkdelay handled through the onThink callback function. (Default)
TALKDELAY_EVENT = 2 -- Not yet implemented

-- Currently applied talkdelay behavior. TALKDELAY_ONTHINK is default.
NPCHANDLER_TALKDELAY = TALKDELAY_ONTHINK

-- Constant conversation behaviors.
CONVERSATION_DEFAULT = 0 -- Conversation through default window, like it was before 8.2 update.
CONVERSATION_PRIVATE = 1 -- Conversation through NPCs chat window, as of 8.2 update. (Default)
--Small Note: Private conversations also means the NPC will use multi-focus system.

-- Currently applied conversation behavior. CONVERSATION_PRIVATE is default.
NPCHANDLER_CONVBEHAVIOR = CONVERSATION_PRIVATE

-- Constant indexes for defining default messages.
MESSAGE_GREET = 1 -- When the player greets the npc.
MESSAGE_FAREWELL = 2 -- When the player unGreets the npc.
MESSAGE_BUY = 3 -- When the npc asks the player if he wants to buy something.
MESSAGE_ONBUY = 4 -- When the player successfully buys something via talk.
MESSAGE_BOUGHT = 5 -- When the player bought something through the shop window.
MESSAGE_SELL = 6 -- When the npc asks the player if he wants to sell something.
MESSAGE_ONSELL = 7 -- When the player successfully sells something via talk.
MESSAGE_SOLD = 8 -- When the player sold something through the shop window.
MESSAGE_MISSINGMONEY = 9 -- When the player does not have enough money.
MESSAGE_NEEDMONEY = 10 -- Same as above, used for shop window.
MESSAGE_MISSINGITEM = 11 -- When the player is trying to sell an item he does not have.
MESSAGE_NEEDITEM = 12 -- Same as above, used for shop window.
MESSAGE_NEEDSPACE = 13 -- When the player don't have any space to buy an item
MESSAGE_NEEDMORESPACE = 14 -- When the player has some space to buy an item, but not enough space
MESSAGE_IDLETIMEOUT = 15 -- When the player has been idle for longer then idleTime allows.
MESSAGE_WALKAWAY = 16 -- When the player walks out of the talkRadius of the npc.
MESSAGE_DECLINE = 17 -- When the player says no to something.
MESSAGE_SENDTRADE = 18 -- When the npc sends the trade window to the player
MESSAGE_NOSHOP = 19 -- When the npc's shop is requested but he doesn't have any
MESSAGE_ONCLOSESHOP = 20 -- When the player closes the npc's shop window
MESSAGE_ALREADYFOCUSED = 21 -- When the player already has the focus of this npc.
MESSAGE_PLACEDINQUEUE = 22 -- When the player has been placed in the costumer queue.

-- Constant indexes for callback functions. These are also used for module callback ids.
CALLBACK_CREATURE_APPEAR = 1
CALLBACK_CREATURE_DISAPPEAR = 2
CALLBACK_CREATURE_SAY = 3
CALLBACK_ONTHINK = 4
CALLBACK_GREET = 5
CALLBACK_FAREWELL = 6
CALLBACK_MESSAGE_DEFAULT = 7
CALLBACK_PLAYER_ENDTRADE = 8
CALLBACK_PLAYER_CLOSECHANNEL = 9
CALLBACK_ONBUY = 10
CALLBACK_ONSELL = 11

-- Addidional module callback ids
CALLBACK_MODULE_INIT = 12
CALLBACK_MODULE_RESET = 13

-- Constant strings defining the keywords to replace in the default messages.
TAG_PLAYERNAME = '|PLAYERNAME|'
TAG_ITEMCOUNT = '|ITEMCOUNT|'
TAG_TOTALCOST = '|TOTALCOST|'
TAG_ITEMNAME = '|ITEMNAME|'
TAG_QUEUESIZE = '|QUEUESIZE|'

NpcHandler = {
keywordHandler = nil,
focuses = nil,
talkStart = nil,
idleTime = 300,
talkRadius = 3,
talkDelayTime = 400, -- Seconds to delay outgoing messages.
queue = nil,
talkDelay = nil,
callbackFunctions = nil,
modules = nil,
shopItems = nil, -- They must be here since ShopModule uses "static" functions
messages = {
-- These are the default replies of all npcs. They can/should be changed individually for each npc.
[MESSAGE_GREET] = 'Welcome, |PLAYERNAME|! I have been expecting you.',
[MESSAGE_FAREWELL] = 'Good bye, |PLAYERNAME|!',
[MESSAGE_BUY] = 'Do you want to buy |ITEMCOUNT| |ITEMNAME| for |TOTALCOST| gold coins?',
[MESSAGE_ONBUY] = 'It was a pleasure doing business with you.',
[MESSAGE_BOUGHT] = 'Bought |ITEMCOUNT|x |ITEMNAME| for |TOTALCOST| gold.',
[MESSAGE_SELL] = 'Do you want to sell |ITEMCOUNT| |ITEMNAME| for |TOTALCOST| gold coins?',
[MESSAGE_ONSELL] = 'Thank you for this |ITEMNAME|, |PLAYERNAME| gold.',
[MESSAGE_SOLD] = 'Sold |ITEMCOUNT|x |ITEMNAME| for |TOTALCOST| gold.',
[MESSAGE_MISSINGMONEY] = 'Sorry, you don\'t have enough money.',
[MESSAGE_NEEDMONEY] = 'You do not have enough money.',
[MESSAGE_MISSINGITEM] = 'You don\'t even have that item, |PLAYERNAME|!',
[MESSAGE_NEEDITEM] = 'You do not have this object.',
[MESSAGE_NEEDSPACE] = 'You do not have enough capacity.',
[MESSAGE_NEEDMORESPACE] = 'You do not have enough capacity for all items.',
[MESSAGE_IDLETIMEOUT] = 'Next, please!',
[MESSAGE_WALKAWAY] = 'How rude!',
[MESSAGE_DECLINE] = 'Not good enough, is it... ?',
[MESSAGE_SENDTRADE] = 'Here\'s my offer, |PLAYERNAME|. Don\'t you like it?',
[MESSAGE_NOSHOP] = 'Sorry, I\'m not offering anything.',
[MESSAGE_ONCLOSESHOP] = 'Thank you, come back when you want something more.',
[MESSAGE_ALREADYFOCUSED]= '|PLAYERNAME|! I am already talking to you...',
[MESSAGE_PLACEDINQUEUE] = '|PLAYERNAME|, please wait for your turn. There are |QUEUESIZE| customers before you.'
}
}

-- Creates a new NpcHandler with an empty callbackFunction stack.
function NpcHandler:new(keywordHandler)
local obj = {}
obj.callbackFunctions = {}
obj.modules = {}
if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then
obj.focuses = {}
obj.talkStart = {}
else
obj.queue = Queue:new(obj)
obj.focuses = 0
obj.talkStart = 0
end

obj.talkDelay = {}
obj.keywordHandler = keywordHandler
obj.messages = {}
obj.shopItems = {}

setmetatable(obj.messages, self.messages)
self.messages.__index = self.messages

setmetatable(obj, self)
self.__index = self
return obj
end

-- Re-defines the maximum idle time allowed for a player when talking to this npc.
function NpcHandler:setMaxIdleTime(newTime)
self.idleTime = newTime
end

-- Attackes a new keyword handler to this npchandler
function NpcHandler:setKeywordHandler(newHandler)
self.keywordHandler = newHandler
end

-- Function used to change the focus of this npc.
function NpcHandler:addFocus(newFocus)
if(not isCreature(newFocus)) then
return
end

if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then
if(self:isFocused(newFocus, true)) then
return
end

table.insert(self.focuses, newFocus)
else
self.focuses = newFocus
end

self:updateFocus(true)
end
NpcHandler.changeFocus = NpcHandler.addFocus -- "changeFocus" looks better for CONVERSATION_DEFAULT

-- Function used to verify if npc is focused to certain player
function NpcHandler:isFocused(focus, creatureCheck)
local creatureCheck = creatureCheck or false
if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then
for k, v in pairs(self.focuses) do
if(v == focus) then
if(creatureCheck or isCreature(v)) then
return true
end

self:internalReleaseFocus(focus, k)
return false
end
end

return false
end

if(creatureCheck or isCreature(self.focuses)) then
return self.focuses == focus
end

self:changeFocus(0)
return false
end

-- This function should be called on each onThink and makes sure the npc faces the player it is talking to.
-- Should also be called whenever a new player is focused.
function NpcHandler:updateFocus(creatureCheck)
local creatureCheck = creatureCheck or false
if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then
for _, focus in pairs(self.focuses) do
if(creatureCheck or isCreature(focus)) then
doNpcSetCreatureFocus(focus)
return
end
end
elseif(creatureCheck or isCreature(self.focuses)) then
doNpcSetCreatureFocus(self.focuses)
return
end

doNpcSetCreatureFocus(0)
end

-- Used when the npc should un-focus the player.
function NpcHandler:releaseFocus(focus)
if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then
if(not self:isFocused(focus)) then
return
end

local pos = nil
for k, v in pairs(self.focuses) do
if(v == focus) then
pos = k
end
end

if(pos ~= nil) then
self:internalReleaseFocus(focus, pos)
closeShopWindow(focus)
end
elseif(self.focuses == focus) then
self:changeFocus(0)
if(isCreature(focus)) then
closeShopWindow(focus)
end
end
end

-- Internal un-focusing function, beware using!
function NpcHandler:internalReleaseFocus(focus, pos)
if(type(self.focuses) ~= "table" or pos == nil or self.focuses[pos] == nil) then
return
end

table.remove(self.focuses, pos)
self.talkStart[focus] = nil
self:updateFocus()
end

-- Returns the callback function with the specified id or nil if no such callback function exists.
function NpcHandler:getCallback(id)
local ret = nil
if(self.callbackFunctions ~= nil) then
ret = self.callbackFunctions[id]
end

return ret
end

-- Changes the callback function for the given id to callback.
function NpcHandler:setCallback(id, callback)
if(self.callbackFunctions ~= nil) then
self.callbackFunctions[id] = callback
end
end

-- Adds a module to this npchandler and inits it.
function NpcHandler:addModule(module)
if(self.modules == nil or module == nil) then
return false
end

module:init(self)
if(module.parseParameters ~= nil) then
module:parseParameters()
end

table.insert(self.modules, module)
return true
end

-- Calls the callback function represented by id for all modules added to this npchandler with the given arguments.
function NpcHandler:processModuleCallback(id, ...)
local ret = true
for _, module in pairs(self.modules) do
local tmpRet = true
if(id == CALLBACK_CREATURE_APPEAR and module.callbackOnCreatureAppear ~= nil) then
tmpRet = module:callbackOnCreatureAppear(unpack(arg))
elseif(id == CALLBACK_CREATURE_DISAPPEAR and module.callbackOnCreatureDisappear ~= nil) then
tmpRet = module:callbackOnCreatureDisappear(unpack(arg))
elseif(id == CALLBACK_CREATURE_SAY and module.callbackOnCreatureSay ~= nil) then
tmpRet = module:callbackOnCreatureSay(unpack(arg))
elseif(id == CALLBACK_PLAYER_ENDTRADE and module.callbackOnPlayerEndTrade ~= nil) then
tmpRet = module:callbackOnPlayerEndTrade(unpack(arg))
elseif(id == CALLBACK_PLAYER_CLOSECHANNEL and module.callbackOnPlayerCloseChannel ~= nil) then
tmpRet = module:callbackOnPlayerCloseChannel(unpack(arg))
elseif(id == CALLBACK_ONBUY and module.callbackOnBuy ~= nil) then
tmpRet = module:callbackOnBuy(unpack(arg))
elseif(id == CALLBACK_ONSELL and module.callbackOnSell ~= nil) then
tmpRet = module:callbackOnSell(unpack(arg))
elseif(id == CALLBACK_ONTHINK and module.callbackOnThink ~= nil) then
tmpRet = module:callbackOnThink(unpack(arg))
elseif(id == CALLBACK_GREET and module.callbackOnGreet ~= nil) then
tmpRet = module:callbackOnGreet(unpack(arg))
elseif(id == CALLBACK_FAREWELL and module.callbackOnFarewell ~= nil) then
tmpRet = module:callbackOnFarewell(unpack(arg))
elseif(id == CALLBACK_MESSAGE_DEFAULT and module.callbackOnMessageDefault ~= nil) then
tmpRet = module:callbackOnMessageDefault(unpack(arg))
elseif(id == CALLBACK_MODULE_RESET and module.callbackOnModuleReset ~= nil) then
tmpRet = module:callbackOnModuleReset(unpack(arg))
end

if(not tmpRet) then
ret = false
break
end
end

return ret
end

-- Returns the message represented by id.
function NpcHandler:getMessage(id)
local ret = nil
if(self.messages ~= nil) then
ret = self.messages[id]
end

return ret
end

-- Changes the default response message with the specified id to newMessage.
function NpcHandler:setMessage(id, newMessage)
if(self.messages ~= nil) then
self.messages[id] = newMessage
end
end

-- Translates all message tags found in msg using parseInfo
function NpcHandler:parseMessage(msg, parseInfo)
for search, replace in pairs(parseInfo) do
if(replace ~= nil) then
msg = msg:gsub(search, replace)
end
end

return msg
end

-- Makes sure the npc un-focuses the currently focused player
function NpcHandler:unGreet(cid)
if(not self:isFocused(cid)) then
return
end

local callback = self:getCallback(CALLBACK_FAREWELL)
if(callback == nil or callback(cid)) then
if(self:processModuleCallback(CALLBACK_FAREWELL)) then
if(self.queue == nil or not self.queue:greetNext()) then
local msg = self:getMessage(MESSAGE_FAREWELL)
local parseInfo = { [TAG_PLAYERNAME] = getPlayerName(cid) }
msg = self:parseMessage(msg, parseInfo)

self:say(msg, cid)
self:releaseFocus(cid)
self:say(msg)
end
end
end
end

-- Greets a new player.
function NpcHandler:greet(cid)
if(cid ~= 0) then
local callback = self:getCallback(CALLBACK_GREET)
if(callback == nil or callback(cid)) then
if(self:processModuleCallback(CALLBACK_GREET, cid)) then
local msg = self:getMessage(MESSAGE_GREET)
local parseInfo = { [TAG_PLAYERNAME] = getCreatureName(cid) }
msg = self:parseMessage(msg, parseInfo)

self:say(msg)
self:addFocus(cid)
self:say(msg, cid)
end
end
end
end

-- Handles onCreatureAppear events. If you with to handle this yourself, please use the CALLBACK_CREATURE_APPEAR callback.
function NpcHandler:eek:nCreatureAppear(cid)
local callback = self:getCallback(CALLBACK_CREATURE_APPEAR)
if(callback == nil or callback(cid)) then
if(self:processModuleCallback(CALLBACK_CREATURE_APPEAR, cid)) then
--
end
end
end

-- Handles onCreatureDisappear events. If you with to handle this yourself, please use the CALLBACK_CREATURE_DISAPPEAR callback.
function NpcHandler:eek:nCreatureDisappear(cid)
local callback = self:getCallback(CALLBACK_CREATURE_DISAPPEAR)
if(callback == nil or callback(cid)) then
if(self:processModuleCallback(CALLBACK_CREATURE_DISAPPEAR, cid)) then
if(self:isFocused(cid)) then
self:unGreet(cid)
end
end
end
end

-- Handles onCreatureSay events. If you with to handle this yourself, please use the CALLBACK_CREATURE_SAY callback.
function NpcHandler:eek:nCreatureSay(cid, class, msg)
local callback = self:getCallback(CALLBACK_CREATURE_SAY)
if(callback == nil or callback(cid, class, msg)) then
if(self:processModuleCallback(CALLBACK_CREATURE_SAY, cid, class, msg)) then
if(not self:isInRange(cid)) then
return
end

if(self.keywordHandler ~= nil) then
if((self:isFocused(cid) and (class == TALKTYPE_PRIVATE_PN or NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT)) or not self:isFocused(cid)) then
local ret = self.keywordHandler:processMessage(cid, msg)
if(not ret) then
local callback = self:getCallback(CALLBACK_MESSAGE_DEFAULT)
if(callback ~= nil and callback(cid, class, msg)) then
if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then
self.talkStart[cid] = os.time()
else
self.talkStart = os.time()
end
end
elseif(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then
self.talkStart[cid] = os.time()
else
self.talkStart = os.time()
end
end
end
end
end
end

-- Handles onPlayerEndTrade events. If you wish to handle this yourself, use the CALLBACK_PLAYER_ENDTRADE callback.
function NpcHandler:eek:nPlayerEndTrade(cid)
local callback = self:getCallback(CALLBACK_PLAYER_ENDTRADE)
if(callback == nil or callback(cid)) then
if(self:processModuleCallback(CALLBACK_PLAYER_ENDTRADE, cid, class, msg)) then
if(self:isFocused(cid)) then
local parseInfo = { [TAG_PLAYERNAME] = getPlayerName(cid) }
local msg = self:parseMessage(self:getMessage(MESSAGE_ONCLOSESHOP), parseInfo)
self:say(msg, cid)
end
end
end
end

-- Handles onPlayerCloseChannel events. If you wish to handle this yourself, use the CALLBACK_PLAYER_CLOSECHANNEL callback.
function NpcHandler:eek:nPlayerCloseChannel(cid)
local callback = self:getCallback(CALLBACK_PLAYER_CLOSECHANNEL)
if(callback == nil or callback(cid)) then
if(self:processModuleCallback(CALLBACK_PLAYER_CLOSECHANNEL, cid, class, msg)) then
if(self:isFocused(cid)) then
self:unGreet(cid)
end
end
end
end

-- Handles onBuy events. If you wish to handle this yourself, use the CALLBACK_ONBUY callback.
function NpcHandler:eek:nBuy(cid, itemid, subType, amount, ignoreCap, inBackpacks)
local callback = self:getCallback(CALLBACK_ONBUY)
if(callback == nil or callback(cid, itemid, subType, amount, ignoreCap, inBackpacks)) then
if(self:processModuleCallback(CALLBACK_ONBUY, cid, itemid, subType, amount, ignoreCap, inBackpacks)) then
--
end
end
end

-- Handles onSell events. If you wish to handle this yourself, use the CALLBACK_ONSELL callback.
function NpcHandler:eek:nSell(cid, itemid, subType, amount, ignoreCap, inBackpacks)
local callback = self:getCallback(CALLBACK_ONSELL)
if(callback == nil or callback(cid, itemid, subType, amount, ignoreCap, inBackpacks)) then
if(self:processModuleCallback(CALLBACK_ONSELL, cid, itemid, subType, amount, ignoreCap, inBackpacks)) then
--
end
end
end

-- Handles onThink events. If you wish to handle this yourself, please use the CALLBACK_ONTHINK callback.
function NpcHandler:eek:nThink()
local callback = self:getCallback(CALLBACK_ONTHINK)
if(callback == nil or callback()) then
for i, speech in pairs(self.talkDelay) do
if(speech.cid ~= nil and isCreature(speech.cid) and speech.start ~= nil and speech.time ~= nil and speech.message ~= nil) then
if(os.mtime() >= speech.time) then
local talkStart = (NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT and self.talkStart[speech.cid] or self.talkStart)
if(self:isFocused(speech.cid) and talkStart == speech.start) then
if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then
selfSay(speech.message, speech.cid)
else
selfSay(speech.message)
end
end

self.talkDelay = nil
end
else
self.talkDelay = nil
end
end

if(self:processModuleCallback(CALLBACK_ONTHINK)) then
if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then
for _, focus in pairs(self.focuses) do
if(focus ~= nil) then
if(not self:isInRange(focus)) then
self:eek:nWalkAway(focus)
elseif((os.time() - self.talkStart[focus]) > self.idleTime) then
self:unGreet(focus)
else
self:updateFocus()
end
end
end
elseif(self.focuses ~= 0) then
if(not self:isInRange(self.focuses)) then
self:eek:nWalkAway(self.focuses)
elseif((os.time() - self.talkStart) > self.idleTime) then
self:unGreet(self.focuses)
else
self:updateFocus()
end
end
end
end
end

-- Tries to greet the player with the given cid.
function NpcHandler:eek:nGreet(cid)
if(self:isInRange(cid)) then
if(NPCHANDLER_CONVBEHAVIOR == CONVERSATION_PRIVATE) then
if(not self:isFocused(cid)) then
self:greet(cid)
return
end
elseif(NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT) then
if(self.focuses == 0) then
self:greet(cid)
elseif(self.focuses == cid) then
local msg = self:getMessage(MESSAGE_ALREADYFOCUSED)
local parseInfo = { [TAG_PLAYERNAME] = getCreatureName(cid) }
msg = self:parseMessage(msg, parseInfo)
self:say(msg)
else
if(not self.queue:isInQueue(cid)) then
self.queue:push(cid)
end

local msg = self:getMessage(MESSAGE_PLACEDINQUEUE)
local parseInfo = { [TAG_PLAYERNAME] = getCreatureName(cid), [TAG_QUEUESIZE] = self.queue:getSize() }
msg = self:parseMessage(msg, parseInfo)
self:say(msg)
end
end
end
end

-- Simply calls the underlying unGreet function.
function NpcHandler:eek:nFarewell(cid)
self:unGreet(cid)
end

-- Should be called on this npc's focus if the distance to focus is greater then talkRadius.
function NpcHandler:eek:nWalkAway(cid)
if(self:isFocused(cid)) then
local callback = self:getCallback(CALLBACK_CREATURE_DISAPPEAR)
if(callback == nil or callback(cid)) then
if(self:processModuleCallback(CALLBACK_CREATURE_DISAPPEAR, cid)) then
if(self.queue == nil or not self.queue:greetNext()) then
local msg = self:getMessage(MESSAGE_WALKAWAY)
local parseInfo = { [TAG_PLAYERNAME] = getPlayerName(cid) }
msg = self:parseMessage(msg, parseInfo)

self:say(msg, cid)
self:releaseFocus(cid)
self:say(msg)
end
end
end
end
end

-- Returns true if cid is within the talkRadius of this npc.
function NpcHandler:isInRange(cid)
local distance = getNpcDistanceTo(cid) or -1
return distance ~= -1 and distance <= self.talkRadius
end

-- Resets the npc into it's initial state (in regard of the keyrodhandler).
-- All modules are also receiving a reset call through their callbackOnModuleReset function.
function NpcHandler:resetNpc()
if(self:processModuleCallback(CALLBACK_MODULE_RESET)) then
self.keywordHandler:reset()
end
end

-- Makes the npc represented by this instance of NpcHandler say something.
-- This implements the currently set type of talkdelay.
function NpcHandler:say(message, focus, delay)
local delay = delay or 0
if(NPCHANDLER_TALKDELAY == TALKDELAY_NONE and delay <= 0) then
if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then
selfSay(message, focus)
else
selfSay(message)
end

return
end

-- TODO: Add an event handling method for delayed messages
table.insert(self.talkDelay, {
cid = focus,
message = message,
time = os.mtime() + (delay <= 0 and self.talkDelayTime or delay),
start = os.time()
})
end
end[/lua]
 

Gandhi

Active User
Joined
Aug 7, 2013
Messages
80
Reaction score
19
Odp: problem z npc

Chodzi o to:
Code:
	npcHandler:say("So what would you like to hear, the long story or the short version? ", cid, true)

A to s? argumenty funkcji:
Code:
	function NpcHandler:say(message, focus, delay)

Zamiast tego true musi by? liczba oznaczaj?ca, po ilu milisekundach zostanie wys?ana odpowied?. Pozamieniaj w ca?ym npc, ?eby b??dy si? nie powtarza?y. Proponuje poustawia? warto?ci zale?ne od d?ugo?ci poprzedniego tekstu, to wyjdzie do?? realistycznie.
 
Status
Not open for further replies.
Top