use:"npc says something there."
,cid
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local talkState = {}
function onCreatureAppear(cid)
npcHandler:onCreatureAppear(cid)
end
function onCreatureDisappear(cid)
npcHandler:onCreatureDisappear(cid)
end
function onCreatureSay(cid, type, msg)
npcHandler:onCreatureSay(cid, type, msg)
end
function onThink()
npcHandler:onThink()
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, "old backpack")) then
if(getPlayerStorageValue(cid, 330) < 1) then
npcHandler:say("What? Are you telling me you found my old adventurer's backpack that I lost years ago??", cid)
talkState[talkUser] = 1
end
elseif(msgcontains(msg, "yes")) then
if(talkState[talkUser] == 1) then
if(getPlayerItemCount(cid, 3960) >= 1) then
npcHandler:say("Thank you very much! This brings back good old memories! Please, as a reward, travel to Kazordoon and ask my old friend Kroox to provide you a special dwarven armor. ... Sam: I will mail him about you immediately. Just tell him, his old buddy Sam is sending you. ", cid)
setPlayerStorageValue(cid, 330, 1)
doPlayerRemoveItem(cid, 3960, 1)
else
npcHandler:say("You don't have it...", cid)
end
talkState[talkUser] = 0
end
elseif(msgcontains(msg, "no")) then
if(talkState[talkUser] > 0) then
npcHandler:say("Then no.", cid)
talkState[talkUser] = 0
end
end
return true
end
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local talkState = {}
function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end
function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end
function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end
function onThink() npcHandler:onThink() end
local t = {
storage = 330,
}
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, "old backpack")) then
if(getPlayerStorageValue(cid, t.storage) < 1) then
npcHandler:say("What? Are you telling me you found my old adventurer's backpack that I lost years ago??", cid)
talkState[talkUser] = 1
end
elseif(msgcontains(msg, "yes") and talkState[talkUser] == 1) then
if(getPlayerItemCount(cid, 3960) >= 1) and doPlayerRemoveItem(cid, 3960, 1) then
npcHandler:say("Thank you very much! This brings back good old memories! Please, as a reward, travel to Kazordoon and ask my old friend Kroox to provide you a special dwarven armor. ... Sam: I will mail him about you immediately. Just tell him, his old buddy Sam is sending you. ", cid)
setPlayerStorageValue(cid, t.storage, 1)
else
npcHandler:say("You don't have my backpack....", cid)
end
talkState[talkUser] = 0
elseif(msgcontains(msg, "no") and isInArray({1}, talkState[talkUser])) then
npcHandler:say("Then no.", cid)
talkState[talkUser] = 0
end
return true
end
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())
-- Including the Advanced NPC System
dofile('data/npc/lib/npcsystem/npcsystem.lua')
function getDistanceToCreature(id)
if id == 0 or id == nil then
selfGotoIdle()
end
local creaturePosition = getCreaturePosition(id)
cx = creaturePosition.x
cy = creaturePosition.y
cz = creaturePosition.z
if cx == nil then
return nil
end
sx, sy, sz = selfGetPosition()
return math.max(math.abs(sx - cx), math.abs(sy - cy))
end
function moveToPosition(x,y,z)
selfMoveTo(x, y, z)
end
function moveToCreature(id)
if id == 0 or id == nil then
selfGotoIdle()
end
tx, ty, tz = getCreaturePosition(id)
if tx == nil then
selfGotoIdle()
else
moveToPosition(tx, ty, tz)
end
end
function selfGotoIdle()
following = false
attacking = false
selfAttackCreature(0)
target = 0
end
function isPlayerPremiumCallback(cid)
return isPremium(cid)
end
function msgcontains(message, keyword)
local message, keyword = message:lower(), keyword:lower()
if message == keyword then
return true
end
return message:find(keyword) and not message:find('(%w+)' .. keyword)
end
function selfSayChannel(cid, message)
return selfSay(message, cid, FALSE)
end
function doPosRemoveItem(_itemid, n, position)
local thing = getThingfromPos({x = position.x, y = position.y, z = position.z, stackpos = 1})
if thing.itemid == _itemid then
doRemoveItem(thing.uid, n)
else
return false
end
return true
end
function doNpcSellItem(cid, itemid, amount, subType, ignoreCap, inBackpacks, backpack)
local amount, subType, ignoreCap, item = amount or 1, subType or 0, ignoreCap and TRUE or FALSE, 0
ignoreCap = FALSE
if isItemStackable(itemid) then
if(inBackpacks) then
stuff = doCreateItemEx(backpack, 1)
item = doAddContainerItem(stuff, itemid, math.min(100, amount))
else
stuff = doCreateItemEx(itemid, math.min(100, amount))
end
return doPlayerAddItemEx(cid, stuff, ignoreCap) ~= RETURNVALUE_NOERROR and 0 or amount, 0
end
local a = 0
if(inBackpacks) then
local container, b = doCreateItemEx(backpack, 1), 1
for i = 1, amount do
local item = doAddContainerItem(container, itemid, subType)
if(isInArray({(getContainerCapById(backpack) * b), amount}, i) == TRUE) then
if(doPlayerAddItemEx(cid, container, ignoreCap) ~= RETURNVALUE_NOERROR) then
b = b - 1 --
break
end
a = i -- a = a + i
if(amount > i) then
container = doCreateItemEx(backpack, 1)
b = b + 1
end
end
end
return a, b
end
for i = 1, amount do -- normal method for non-stackable items
local item = doCreateItemEx(itemid, subType)
if(doPlayerAddItemEx(cid, item, ignoreCap) ~= RETURNVALUE_NOERROR) then
break
end
a = i
end
return a, 0
end
local func = function(pars)
if isPlayer(pars.pcid) == TRUE then
doCreatureSay(pars.cid, pars.text, pars.type, false, pars.pcid, getCreaturePosition(pars.cid))
pars.e.done = TRUE
end
end
function doCreatureSayWithDelay(cid, text, type, delay, e, pcid)
if isPlayer(pcid) == TRUE then
e.done = FALSE
e.event = addEvent(func, delay < 1 and 1000 or delay, {cid=cid, text=text, type=type, e=e, pcid=pcid})
end
end
-- Advanced NPC System (Created by Jiddo),
-- Modified by Cykotitan, Gesior and Talaturen.
shop_amount = {}
shop_cost = {}
shop_rlname = {}
shop_itemid = {}
shop_container = {}
shop_npcuid = {}
shop_eventtype = {}
shop_subtype = {}
shop_destination = {}
shop_premium = {}
npcs_loaded_shop = {}
npcs_loaded_travel = {}
if(NpcSystem == nil) then
-- Loads the underlying classes of the npcsystem.
dofile('data/npc/lib/npcsystem/keywordhandler.lua')
dofile('data/npc/lib/npcsystem/npchandler.lua')
dofile('data/npc/lib/npcsystem/modules.lua')
-- Global npc constants:
-- Greeting and unGreeting keywords. For more information look at the top of modules.lua
FOCUS_GREETWORDS = {'hi', 'hello'}
FOCUS_FAREWELLWORDS = {'bye', 'farewell'}
-- The word for requesting trade window. For more information look at the top of modules.lua
SHOP_TRADEREQUEST = {'trade'}
-- The word for accepting/declining an offer. CAN ONLY CONTAIN ONE FIELD! For more information look at the top of modules.lua
SHOP_YESWORD = {'yes'}
SHOP_NOWORD = {'no'}
-- Pattern used to get the amount of an item a player wants to buy/sell.
PATTERN_COUNT = '%d+'
-- Talkdelay behavior. For more information, look at the top of npchandler.lua.
NPCHANDLER_TALKDELAY = TALKDELAY_ONTHINK
-- Constant strings defining the keywords to replace in the default messages.
-- For more information, look at the top of npchandler.lua...
TAG_PLAYERNAME = '|PLAYERNAME|'
TAG_ITEMCOUNT = '|ITEMCOUNT|'
TAG_TOTALCOST = '|TOTALCOST|'
TAG_ITEMNAME = '|ITEMNAME|'
NpcSystem = {}
-- Gets an npcparameter with the specified key. Returns nil if no such parameter is found.
function NpcSystem.getParameter(key)
local ret = getNpcParameter(tostring(key))
if((type(ret) == 'number' and ret == 0) or ret == nil) then
return nil
else
return ret
end
end
-- Parses all known parameters for the npc. Also parses parseable modules.
function NpcSystem.parseParameters(npcHandler)
local ret = NpcSystem.getParameter('idletime')
if(ret ~= nil) then
npcHandler.idleTime = tonumber(ret)
end
local ret = NpcSystem.getParameter('talkradius')
if(ret ~= nil) then
npcHandler.talkRadius = tonumber(ret)
end
local ret = NpcSystem.getParameter('message_greet')
if(ret ~= nil) then
npcHandler:setMessage(MESSAGE_GREET, ret)
end
local ret = NpcSystem.getParameter('message_farewell')
if(ret ~= nil) then
npcHandler:setMessage(MESSAGE_FAREWELL, ret)
end
local ret = NpcSystem.getParameter('message_decline')
if(ret ~= nil) then
npcHandler:setMessage(MESSAGE_DECLINE, ret)
end
local ret = NpcSystem.getParameter('message_needmorespace')
if(ret ~= nil) then
npcHandler:setMessage(MESSAGE_NEEDMORESPACE, ret)
end
local ret = NpcSystem.getParameter('message_needspace')
if(ret ~= nil) then
npcHandler:setMessage(MESSAGE_NEEDSPACE, ret)
end
local ret = NpcSystem.getParameter('message_sendtrade')
if(ret ~= nil) then
npcHandler:setMessage(MESSAGE_SENDTRADE, ret)
end
local ret = NpcSystem.getParameter('message_noshop')
if(ret ~= nil) then
npcHandler:setMessage(MESSAGE_NOSHOP, ret)
end
local ret = NpcSystem.getParameter('message_oncloseshop')
if(ret ~= nil) then
npcHandler:setMessage(MESSAGE_ONCLOSESHOP, ret)
end
local ret = NpcSystem.getParameter('message_onbuy')
if(ret ~= nil) then
npcHandler:setMessage(MESSAGE_ONBUY, ret)
end
local ret = NpcSystem.getParameter('message_onsell')
if(ret ~= nil) then
npcHandler:setMessage(MESSAGE_ONSELL, ret)
end
local ret = NpcSystem.getParameter('message_missingmoney')
if(ret ~= nil) then
npcHandler:setMessage(MESSAGE_MISSINGMONEY, ret)
end
local ret = NpcSystem.getParameter('message_needmoney')
if(ret ~= nil) then
npcHandler:setMessage(MESSAGE_NEEDMONEY, ret)
end
local ret = NpcSystem.getParameter('message_missingitem')
if(ret ~= nil) then
npcHandler:setMessage(MESSAGE_MISSINGITEM, ret)
end
local ret = NpcSystem.getParameter('message_needitem')
if(ret ~= nil) then
npcHandler:setMessage(MESSAGE_NEEDITEM, ret)
end
local ret = NpcSystem.getParameter('message_idletimeout')
if(ret ~= nil) then
npcHandler:setMessage(MESSAGE_IDLETIMEOUT, ret)
end
local ret = NpcSystem.getParameter('message_walkaway')
if(ret ~= nil) then
npcHandler:setMessage(MESSAGE_WALKAWAY, ret)
end
local ret = NpcSystem.getParameter('message_alreadyfocused')
if(ret ~= nil) then
npcHandler:setMessage(MESSAGE_ALREADYFOCUSED, ret)
end
local ret = NpcSystem.getParameter('message_buy')
if(ret ~= nil) then
npcHandler:setMessage(MESSAGE_BUY, ret)
end
local ret = NpcSystem.getParameter('message_sell')
if(ret ~= nil) then
npcHandler:setMessage(MESSAGE_SELL, ret)
end
local ret = NpcSystem.getParameter('message_bought')
if(ret ~= nil) then
npcHandler:setMessage(MESSAGE_BOUGHT, ret)
end
local ret = NpcSystem.getParameter('message_sold')
if(ret ~= nil) then
npcHandler:setMessage(MESSAGE_SOLD, ret)
end
local ret = NpcSystem.getParameter('message_walkaway_male')
if(ret ~= nil) then
npcHandler:setMessage(MESSAGE_WALKAWAY_MALE, ret)
end
local ret = NpcSystem.getParameter('message_walkaway_female')
if(ret ~= nil) then
npcHandler:setMessage(MESSAGE_WALKAWAY_FEMALE, ret)
end
-- Parse modules.
for parameter, module in pairs(Modules.parseableModules) do
local ret = NpcSystem.getParameter(parameter)
if(ret ~= nil) then
local number = tonumber(ret)
if(number ~= 0 and module.parseParameters ~= nil) then
local instance = module:new()
npcHandler:addModule(instance)
instance:parseParameters()
end
end
end
end
end
-- Advanced NPC System (Created by Jiddo),
-- Modified by Cykotitan and Talaturen.
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 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_WALKAWAY_MALE = 22 -- When a male player walks out of the talkRadius of the npc.
MESSAGE_WALKAWAY_FEMALE = 23 -- When a female player walks out of the talkRadius of the npc.
-- 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
CALLBACK_ONADDFOCUS = 18
CALLBACK_ONRELEASEFOCUS = 19
CALLBACK_ONTRADEREQUEST = 20
-- 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|"
NpcHandler = {
keywordHandler = nil,
focuses = nil,
talkStart = nil,
idleTime = 86400,
talkRadius = 3,
talkDelayTime = 1, -- Seconds to delay outgoing messages.
talkDelay = nil,
callbackFunctions = nil,
modules = nil,
shopItems = nil, -- They must be here since ShopModule uses 'static' functions
eventSay = nil,
eventDelayedSay = nil,
topic = nil,
messages = {
-- These are the default replies of all npcs. They can/should be changed individually for each npc.
[MESSAGE_GREET] = "Greetings, |PLAYERNAME|.",
[MESSAGE_FAREWELL] = "Good bye, |PLAYERNAME|.",
[MESSAGE_BUY] = "Do you want to buy |ITEMCOUNT| |ITEMNAME| for |TOTALCOST| gold coins?",
[MESSAGE_ONBUY] = "Here you are.",
[MESSAGE_BOUGHT] = "Bought |ITEMCOUNT|x |ITEMNAME| for |TOTALCOST| gold.",
[MESSAGE_SELL] = "Do you want to sell |ITEMCOUNT| |ITEMNAME| for |TOTALCOST| gold coins?",
[MESSAGE_ONSELL] = "Here you are, |TOTALCOST| gold.",
[MESSAGE_SOLD] = "Sold |ITEMCOUNT|x |ITEMNAME| for |TOTALCOST| gold.",
[MESSAGE_MISSINGMONEY] = "You don't have enough money.",
[MESSAGE_NEEDMONEY] = "You don't have enough money.",
[MESSAGE_MISSINGITEM] = "You don't have so many.",
[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] = "Good bye.",
[MESSAGE_WALKAWAY] = "Good bye.",
[MESSAGE_DECLINE] = "Then not.",
[MESSAGE_SENDTRADE] = "Of course, just browse through my wares.",
[MESSAGE_NOSHOP] = "Sorry, I'm not offering anything.",
[MESSAGE_ONCLOSESHOP] = "Thank you, come back whenever you're in need of something else.",
[MESSAGE_ALREADYFOCUSED]= "|PLAYERNAME|, I am already talking to you.",
[MESSAGE_WALKAWAY_MALE] = "Good bye.",
[MESSAGE_WALKAWAY_FEMALE] = "Good bye."
}
}
-- Creates a new NpcHandler with an empty callbackFunction stack.
function NpcHandler:new(keywordHandler)
local obj = {}
obj.callbackFunctions = {}
obj.modules = {}
obj.eventSay = {}
obj.eventDelayedSay = {}
obj.topic = {}
obj.focuses = {}
obj.talkStart = {}
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(self:isFocused(newFocus)) then
return
end
table.insert(self.focuses, newFocus)
self.topic[newFocus] = 0
local callback = self:getCallback(CALLBACK_ONADDFOCUS)
if(callback == nil or callback(newFocus)) then
self:processModuleCallback(CALLBACK_ONADDFOCUS, newFocus)
end
self:updateFocus()
end
-- Function used to verify if npc is focused to certain player
function NpcHandler:isFocused(focus)
for k,v in pairs(self.focuses) do
if v == focus then
return true
end
end
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()
for pos, focus in pairs(self.focuses) do
if(focus ~= nil) then
doNpcSetCreatureFocus(focus)
return
end
end
doNpcSetCreatureFocus(0)
end
-- Used when the npc should un-focus the player.
function NpcHandler:releaseFocus(focus)
if(shop_cost[focus] ~= nil) then
table.remove(shop_amount, focus)
table.remove(shop_cost, focus)
table.remove(shop_rlname, focus)
table.remove(shop_itemid, focus)
table.remove(shop_container, focus)
table.remove(shop_npcuid, focus)
table.remove(shop_eventtype, focus)
table.remove(shop_subtype, focus)
table.remove(shop_destination, focus)
table.remove(shop_premium, focus)
end
if self.eventDelayedSay[focus] then
self:cancelNPCTalk(self.eventDelayedSay[focus])
end
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
table.remove(self.focuses, pos)
self.eventSay[focus] = nil
self.eventDelayedSay[focus] = nil
self.talkStart[focus] = nil
self.topic[focus] = nil
local callback = self:getCallback(CALLBACK_ONRELEASEFOCUS)
if(callback == nil or callback(focus)) then
self:processModuleCallback(CALLBACK_ONRELEASEFOCUS, focus)
end
if isPlayer(focus) == TRUE then
closeShopWindow(focus) --Even if it can not exist, we need to prevent it.
self:updateFocus()
end
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) then
table.insert(self.modules, module)
module:init(self)
end
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 i, module in pairs(self.modules) do
local tmpRet = true
if(id == CALLBACK_CREATURE_APPEAR and module.callbackOnCreatureAppear ~= nil) then
tmpRet = module:callbackOnCreatureAppear(...)
elseif(id == CALLBACK_CREATURE_DISAPPEAR and module.callbackOnCreatureDisappear ~= nil) then
tmpRet = module:callbackOnCreatureDisappear(...)
elseif(id == CALLBACK_CREATURE_SAY and module.callbackOnCreatureSay ~= nil) then
tmpRet = module:callbackOnCreatureSay(...)
elseif(id == CALLBACK_PLAYER_ENDTRADE and module.callbackOnPlayerEndTrade ~= nil) then
tmpRet = module:callbackOnPlayerEndTrade(...)
elseif(id == CALLBACK_PLAYER_CLOSECHANNEL and module.callbackOnPlayerCloseChannel ~= nil) then
tmpRet = module:callbackOnPlayerCloseChannel(...)
elseif(id == CALLBACK_ONBUY and module.callbackOnBuy ~= nil) then
tmpRet = module:callbackOnBuy(...)
elseif(id == CALLBACK_ONSELL and module.callbackOnSell ~= nil) then
tmpRet = module:callbackOnSell(...)
elseif(id == CALLBACK_ONTRADEREQUEST and module.callbackOnTradeRequest ~= nil) then
tmpRet = module:callbackOnTradeRequest(...)
elseif(id == CALLBACK_ONADDFOCUS and module.callbackOnAddFocus ~= nil) then
tmpRet = module:callbackOnAddFocus(...)
elseif(id == CALLBACK_ONRELEASEFOCUS and module.callbackOnReleaseFocus ~= nil) then
tmpRet = module:callbackOnReleaseFocus(...)
elseif(id == CALLBACK_ONTHINK and module.callbackOnThink ~= nil) then
tmpRet = module:callbackOnThink(...)
elseif(id == CALLBACK_GREET and module.callbackOnGreet ~= nil) then
tmpRet = module:callbackOnGreet(...)
elseif(id == CALLBACK_FAREWELL and module.callbackOnFarewell ~= nil) then
tmpRet = module:callbackOnFarewell(...)
elseif(id == CALLBACK_MESSAGE_DEFAULT and module.callbackOnMessageDefault ~= nil) then
tmpRet = module:callbackOnMessageDefault(...)
elseif(id == CALLBACK_MODULE_RESET and module.callbackOnModuleReset ~= nil) then
tmpRet = module:callbackOnModuleReset(...)
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)
local ret = msg
for search, replace in pairs(parseInfo) do
ret = string.gsub(ret, search, replace)
end
return ret
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()) then
if(self:processModuleCallback(CALLBACK_FAREWELL)) then
local msg = self:getMessage(MESSAGE_FAREWELL)
local parseInfo = { [TAG_PLAYERNAME] = getPlayerName(cid) }
msg = self:parseMessage(msg, parseInfo)
self:say(msg, cid, true)
self:releaseFocus(cid)
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, cid, true)
else
return
end
else
return
end
end
self:addFocus(cid)
end
-- Handles onCreatureAppear events. If you with to handle this yourself, please use the CALLBACK_CREATURE_APPEAR callback.
function NpcHandler:onCreatureAppear(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:onCreatureDisappear(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:onCreatureSay(cid, msgtype, msg)
local callback = self:getCallback(CALLBACK_CREATURE_SAY)
if(callback == nil or callback(cid, msgtype, msg)) then
if(self:processModuleCallback(CALLBACK_CREATURE_SAY, cid, msgtype, msg)) then
if(not self:isInRange(cid)) then
return
end
if(self.keywordHandler ~= nil) then
if(self:isFocused(cid) and (msgtype == TALKTYPE_PRIVATE_PN) 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, msgtype, msg)) then
self.talkStart[cid] = os.time()
end
else
self.talkStart[cid] = 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:onPlayerEndTrade(cid)
local callback = self:getCallback(CALLBACK_PLAYER_ENDTRADE)
if(callback == nil or callback(cid)) then
if(self:processModuleCallback(CALLBACK_PLAYER_ENDTRADE, cid, msgtype, 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:onPlayerCloseChannel(cid)
local callback = self:getCallback(CALLBACK_PLAYER_CLOSECHANNEL)
if(callback == nil or callback(cid)) then
if(self:processModuleCallback(CALLBACK_PLAYER_CLOSECHANNEL, cid, msgtype, 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:onBuy(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:onSell(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 onTradeRequest events. If you wish to handle this yourself, use the CALLBACK_ONTRADEREQUEST callback.
function NpcHandler:onTradeRequest(cid)
local callback = self:getCallback(CALLBACK_ONTRADEREQUEST)
if(callback == nil or callback(cid)) then
if(self:processModuleCallback(CALLBACK_ONTRADEREQUEST, cid)) then
return true
end
end
return false
end
-- Handles onThink events. If you wish to handle this yourself, please use the CALLBACK_ONTHINK callback.
function NpcHandler:onThink()
local callback = self:getCallback(CALLBACK_ONTHINK)
if(callback == nil or callback()) then
if(NPCHANDLER_TALKDELAY == TALKDELAY_ONTHINK) then
for cid, talkDelay in pairs(self.talkDelay) do
if(talkDelay.time ~= nil and talkDelay.message ~= nil and os.time() >= talkDelay.time) then
selfSay(talkDelay.message, cid, talkDelay.publicize and TRUE or FALSE)
self.talkDelay[cid] = nil
end
end
end
if(self:processModuleCallback(CALLBACK_ONTHINK)) then
for pos, focus in pairs(self.focuses) do
if(focus ~= nil) then
if(not self:isInRange(focus)) then
self:onWalkAway(focus)
elseif(self.talkStart[focus] ~= nil and (os.time() - self.talkStart[focus]) > self.idleTime) then
self:unGreet(focus)
else
self:updateFocus()
end
end
end
end
end
end
-- Tries to greet the player with the given cid.
function NpcHandler:onGreet(cid)
if(self:isInRange(cid)) then
if(not self:isFocused(cid)) then
self:greet(cid)
return
end
end
end
-- Simply calls the underlying unGreet function.
function NpcHandler:onFarewell(cid)
self:unGreet(cid)
end
-- Should be called on this npc's focus if the distance to focus is greater then talkRadius.
function NpcHandler:onWalkAway(cid)
if(self:isFocused(cid)) then
local callback = self:getCallback(CALLBACK_CREATURE_DISAPPEAR)
if(callback == nil or callback()) then
if(self:processModuleCallback(CALLBACK_CREATURE_DISAPPEAR, cid)) then
local msg = self:getMessage(MESSAGE_WALKAWAY)
local playerName = getPlayerName(cid)
if not playerName then
playerName = -1
end
local parseInfo = { [TAG_PLAYERNAME] = playerName }
local message = self:parseMessage(msg, parseInfo)
local msg_male = self:getMessage(MESSAGE_WALKAWAY_MALE)
local message_male = self:parseMessage(msg_male, parseInfo)
local msg_female = self:getMessage(MESSAGE_WALKAWAY_FEMALE)
local message_female = self:parseMessage(msg_female, parseInfo)
if message_female ~= message_male then
if getPlayerSex(cid) == 0 then
selfSay(message_female)
else
selfSay(message_male)
end
elseif message ~= "" then
selfSay(message)
end
self:releaseFocus(cid)
end
end
end
end
-- Returns true if cid is within the talkRadius of this npc.
function NpcHandler:isInRange(cid)
local distance = isPlayer(cid) == TRUE and getDistanceTo(cid) or -1
if distance == -1 then
return false
end
return (distance <= self.talkRadius)
end
-- Resets the npc into its initial state (in regard of the keywordhandler).
-- 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
function NpcHandler:cancelNPCTalk(events)
for aux = 1, #events do
stopEvent(events[aux].event)
end
events = nil
end
function NpcHandler:doNPCTalkALot(msgs, interval, pcid)
if self.eventDelayedSay[pcid] then
self:cancelNPCTalk(self.eventDelayedSay[pcid])
end
self.eventDelayedSay[pcid] = {}
local ret = {}
for aux = 1, #msgs do
self.eventDelayedSay[pcid][aux] = {}
doCreatureSayWithDelay(getNpcCid(), msgs[aux], TALKTYPE_PRIVATE_NP, ((aux-1) * (interval or 10000)) + 1000, self.eventDelayedSay[pcid][aux], pcid)
table.insert(ret, self.eventDelayedSay[pcid][aux])
end
return(ret)
end
-- Makes the npc represented by this instance of NpcHandler say something.
-- This implements the currently set type of talkdelay.
-- shallDelay is a boolean value. If it is false, the message is not delayed. Default value is true.
function NpcHandler:say(message, focus, publicize, shallDelay, delay)
if(type(message) == "table") then
return self:doNPCTalkALot(message, delay or 10000, focus)
end
if self.eventDelayedSay[focus] then
self:cancelNPCTalk(self.eventDelayedSay[focus])
end
local shallDelay = not shallDelay and true or shallDelay
if(NPCHANDLER_TALKDELAY == TALKDELAY_NONE or shallDelay == false) then
selfSay(message, focus, publicize and TRUE or FALSE)
return
end
self.eventSay[focus] = addEvent(function(x) if isPlayer(x[3]) then doCreatureSay(x[1], x[2], TALKTYPE_PRIVATE_NP, false, x[3], getCreaturePosition(x[1])) end end, self.talkDelayTime * 1000, {getNpcCid(), message, focus})
end
end
[07/07/2013 13:34:41] >> Loading config
[07/07/2013 13:34:41] >> Loading database driver... SQLite 3.7.7.1
[07/07/2013 13:34:41] >> Running database manager
[07/07/2013 13:34:41] > Optimized database.
[07/07/2013 13:34:41] >> Loading bans
[07/07/2013 13:34:41] >> Loading vocations
[07/07/2013 13:34:41] >> Loading commands
[07/07/2013 13:34:41] >> Loading items
[07/07/2013 13:34:41] >> Loading script systems
[07/07/2013 13:34:43] Warning: [Event::checkScript] Can not load script. /scripts/raidCommands.lua
[07/07/2013 13:34:43] cannot open data/talkactions/scripts/raidCommands.lua: No such file or directory
[07/07/2013 13:34:43] Warning: [Event::checkScript] Can not load script. /scripts/raidCommands.lua
[07/07/2013 13:34:43] cannot open data/talkactions/scripts/raidCommands.lua: No such file or directory
[07/07/2013 13:34:43] Warning: [MoveEvents::addEvent] Duplicate move event found: 0
[07/07/2013 13:34:43] Warning: [MoveEvents::addEvent] Duplicate move event found: 0
[07/07/2013 13:34:43] Warning: [MoveEvents::addEvent] Duplicate move event found: 0
[07/07/2013 13:34:43] Warning: [MoveEvents::addEvent] Duplicate move event found: 0
[07/07/2013 13:34:43] Warning: [MoveEvents::addEvent] Duplicate move event found: 0
[07/07/2013 13:34:43] Warning: [MoveEvents::addEvent] Duplicate move event found: 0
[07/07/2013 13:34:43] Warning: [MoveEvents::addEvent] Duplicate move event found: 0
[07/07/2013 13:34:43] Warning: [MoveEvents::addEvent] Duplicate move event found: 0
[07/07/2013 13:34:43] Warning: [MoveEvents::addEvent] Duplicate move event found: 0
[07/07/2013 13:34:43] Warning: [MoveEvents::addEvent] Duplicate move event found: 0
[07/07/2013 13:34:44] Warning: [Event::checkScript] Can not load script. /scripts/pits of inferno quest/pitsOfInfernoQuestTileTeleports.lua
[07/07/2013 13:34:44] ...its of inferno quest/pitsOfInfernoQuestTileTeleports.lua:2: unexpected symbol near ','
[07/07/2013 13:34:44] Warning: [Event::checkScript] Can not load script. /scripts/pits of inferno quest/pitsOfInfernoQuestTileTeleports.lua
[07/07/2013 13:34:44] ...its of inferno quest/pitsOfInfernoQuestTileTeleports.lua:2: unexpected symbol near ','
[07/07/2013 13:34:44] Warning: [Event::checkScript] Can not load script. /scripts/pits of inferno quest/pitsOfInfernoQuestTileTeleports.lua
[07/07/2013 13:34:44] ...its of inferno quest/pitsOfInfernoQuestTileTeleports.lua:2: unexpected symbol near ','
[07/07/2013 13:34:44] Warning: [Event::checkScript] Can not load script. /scripts/pits of inferno quest/pitsOfInfernoQuestTileTeleports.lua
[07/07/2013 13:34:44] ...its of inferno quest/pitsOfInfernoQuestTileTeleports.lua:2: unexpected symbol near ','
[07/07/2013 13:34:44] Warning: [Event::checkScript] Can not load script. /scripts/pits of inferno quest/pitsOfInfernoQuestTileTeleports.lua
[07/07/2013 13:34:44] ...its of inferno quest/pitsOfInfernoQuestTileTeleports.lua:2: unexpected symbol near ','
[07/07/2013 13:34:44] Warning: [Event::checkScript] Can not load script. /scripts/pits of inferno quest/pitsOfInfernoQuestTileTeleports.lua
[07/07/2013 13:34:44] ...its of inferno quest/pitsOfInfernoQuestTileTeleports.lua:2: unexpected symbol near ','
[07/07/2013 13:34:44] Warning: [Event::checkScript] Can not load script. /scripts/pits of inferno quest/pitsOfInfernoQuestTileTeleports.lua
[07/07/2013 13:34:44] ...its of inferno quest/pitsOfInfernoQuestTileTeleports.lua:2: unexpected symbol near ','
[07/07/2013 13:34:44] Warning: [Event::checkScript] Can not load script. /scripts/pits of inferno quest/pitsOfInfernoQuestTileTeleports.lua
[07/07/2013 13:34:44] ...its of inferno quest/pitsOfInfernoQuestTileTeleports.lua:2: unexpected symbol near ','
[07/07/2013 13:34:44] Warning: [Event::checkScript] Can not load script. /scripts/pits of inferno quest/pitsOfInfernoQuestTileTeleports.lua
[07/07/2013 13:34:44] ...its of inferno quest/pitsOfInfernoQuestTileTeleports.lua:2: unexpected symbol near ','
[07/07/2013 13:34:44] Warning: [Event::checkScript] Can not load script. /scripts/pits of inferno quest/pitsOfInfernoQuestTileTeleports.lua
[07/07/2013 13:34:44] ...its of inferno quest/pitsOfInfernoQuestTileTeleports.lua:2: unexpected symbol near ','
[07/07/2013 13:34:44] >> Loading monsters
[07/07/2013 13:34:44] [Warning - Monsters::loadMonster] Unknown race type . data/monster/Update 9.1/Honour Guard.xml
[07/07/2013 13:34:45] Warning: [Monsters::deserializeSpell] - Deepling Master Librarian - Unknown shootEffect: smallplants
[07/07/2013 13:34:45] Warning: [Monsters::deserializeSpell] - Deepling Master Librarian - Unknown shootEffect: smallplants
[07/07/2013 13:34:45] Error: [Monsters::deserializeSpell] - Deepling Master Librarian - Unknown spell name:
[07/07/2013 13:34:45] [Warning - Monsters::loadMonster] Cant load spell. data/monster/Deeplings/Deepling Master Librarian.xml
[07/07/2013 13:34:45] Warning: [Monsters::deserializeSpell] - Deepling Spellsinger - Unknown shootEffect: smallplants
[07/07/2013 13:34:45] Warning: [Monsters::deserializeSpell] - Deepling Spellsinger - Unknown shootEffect: smallplants
[07/07/2013 13:34:45] Error: [Monsters::deserializeSpell] - Deepling Spellsinger - Unknown spell name:
[07/07/2013 13:34:45] [Warning - Monsters::loadMonster] Cant load spell. data/monster/Deeplings/Deepling Spellsinger.xml
[07/07/2013 13:34:45] Error: [Monsters::deserializeSpell] - Hideous Fungus - Unknown spell name:
[07/07/2013 13:34:45] [Warning - Monsters::loadMonster] Cant load spell. data/monster/Gnomegate/Hideous Fungus.xml
[07/07/2013 13:34:45] Error: [Monsters::deserializeSpell] - Stone Devourer - Unknown spell name:
[07/07/2013 13:34:45] [Warning - Monsters::loadMonster] Cant load spell. data/monster/Gnomegate/Stone Devourer.xml
[07/07/2013 13:34:45] Warning: [Monsters::deserializeSpell] - Stone Devourer - Unknown shootEffect:
[07/07/2013 13:34:45] Error: [Monsters::deserializeSpell] - Stone Devourer - Unknown spell name: stones
[07/07/2013 13:34:45] [Warning - Monsters::loadMonster] Cant load spell. data/monster/Gnomegate/Stone Devourer.xml
[07/07/2013 13:34:45] Error: [Monsters::deserializeSpell] - Stone Devourer - Unknown spell name:
[07/07/2013 13:34:45] [Warning - Monsters::loadMonster] Cant load spell. data/monster/Gnomegate/Stone Devourer.xml
[07/07/2013 13:34:46] Warning: [Monsters::deserializeSpell] - Hellgorak - Unknown areaEffect:
[07/07/2013 13:34:46] Warning: [Monsters::deserializeSpell] - Zugurosh - Unknown areaEffect: blue
[07/07/2013 13:34:47] Warning: [Monsters::deserializeSpell] - Phantasm Summon - Unknown shootEffect:
[07/07/2013 13:34:47] Warning: [Monsters::deserializeSpell] - Phantasm - Unknown shootEffect:
[07/07/2013 13:34:47] Warning: [Monsters::deserializeSpell] - Spectre - Unknown shootEffect: redshimmer
[07/07/2013 13:34:47] Warning: [Monsters::deserializeSpell] - Mahrdis - Unknown shootEffect: explosionarea
[07/07/2013 13:34:47] Warning: [Monsters::deserializeSpell] - Thalas - Unknown shootEffect:
[07/07/2013 13:34:48] >> Loading outfits
[07/07/2013 13:34:48] >> Loading admin protocol config
[07/07/2013 13:34:48] >> Loading experience stages
[07/07/2013 13:34:48] >> Using plaintext passwords
[07/07/2013 13:34:48] >> Checking world type... PVP
[07/07/2013 13:34:48] >> Loading map
[07/07/2013 13:34:51] > Map size: 65000x65000.
[07/07/2013 13:35:00] Duplicate uniqueId 3028
[07/07/2013 13:35:02] Duplicate uniqueId 2086
[07/07/2013 13:35:06] > Map loading time: 17.476 seconds.
[07/07/2013 13:35:08] [Warning - NpcScript::NpcScript] Can not load script: data/npc/scripts/Karith.lua
[07/07/2013 13:35:08] data/npc/scripts/Karith.lua:129: unexpected symbol near ','
[07/07/2013 13:35:08] [Warning - NpcScript::NpcScript] Can not load script: data/npc/scripts/Grizzly Adams.lua
[07/07/2013 13:35:08] data/npc/scripts/Grizzly Adams.lua:36: unexpected symbol near ','
[07/07/2013 13:35:08] [Warning - NpcScript::NpcScript] Can not load script: data/npc/scripts/Reed.lua
[07/07/2013 13:35:08] data/npc/scripts/Reed.lua:36: unexpected symbol near ','
[07/07/2013 13:35:08] [Warning - NpcScript::NpcScript] Can not load script: data/npc/scripts/Bruce.lua
[07/07/2013 13:35:08] data/npc/scripts/Bruce.lua:34: '=' expected near 'elseif'
[07/07/2013 13:35:08] [Warning - NpcScript::NpcScript] Can not load script: data/npc/scripts/Ajax.lua
[07/07/2013 13:35:08] data/npc/scripts/Ajax.lua:120: ')' expected near 'then'
[07/07/2013 13:35:08] [Spawn::addMonster] Can not find Butterfly
[07/07/2013 13:35:08] [Spawn::addMonster] Can not find Butterfly
[07/07/2013 13:35:08] [Spawn::addMonster] Can not find Butterfly
[07/07/2013 13:35:08] [Spawn::addMonster] Can not find midnight warrior
[07/07/2013 13:35:08] [Spawn::addMonster] Can not find midnight warrior
[07/07/2013 13:35:08] [Spawn::addMonster] Can not find berrypest
[07/07/2013 13:35:08] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:08] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:08] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:08] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:08] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:08] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:08] [Spawn::addMonster] Can not find Flame Pillar
[07/07/2013 13:35:08] [Spawn::addMonster] Can not find Flame Pillar
[07/07/2013 13:35:08] [Spawn::addMonster] Can not find Flame Pillar
[07/07/2013 13:35:08] [Spawn::addMonster] Can not find Flame Pillar
[07/07/2013 13:35:08] [Spawn::addMonster] Can not find Flame Pillar
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Flame Pillar
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Flame Pillar
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Flame Pillar
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Poisonthrower
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Poisonthrower
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Poisonthrower
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Poisonthrower
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Poisonthrower
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find manta ray
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find manta ray
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find manta ray
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find manta ray
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find manta ray
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find manta ray
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find manta ray
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find manta ray
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find manta ray
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find manta ray
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find manta ray
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find manta ray
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find manta ray
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:09] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:10] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:10] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:10] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:10] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:10] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:10] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:10] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:10] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:10] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:10] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:35:10] [Spawn::addMonster] Can not find Defiler
[07/07/2013 13:36:48] Notice: Map load (relational) took: 98.491 s
[07/07/2013 13:36:48] >> Initializing gamestate
[07/07/2013 13:36:50] >> Loaded all modules, server starting up...
[07/07/2013 13:36:51] >> Forgotten Server Online!