Skrypt nie jest mój !!
NPC .xml FILE :
NPC .lua file:
Spoiler:
local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler)
local guard = defender:new()
guard:setHitInterval(getNpcParameter("HitInterval")) guard:setShootEffect(getNpcParameter("ShootEffect")) guard:setHitEffect(getNpcParameter("HitEffect")) guard:setTypeDmg(getNpcParameter("TypeDmg")) guard:setDamage(getNpcParameter("minDamage"),getNpcParameter("maxDamage")) guard:setSayText(getNpcParameter("sayText")) guard:setHeal(getNpcParameter("minHeal"),getNpcParameter("maxHeal")) guard:setHitSkulledPlayer(getNpcParameter("hitSkulledPlayer")) guard:setMultiAttack(getNpcParameter("multiAttack")) guard:setDmgRadius(getNpcParameter("dmgRadiusX"),getNpcParameter("dmgRadiusY")) guard:setHealRadius(getNpcParameter("healRadiusX"),getNpcParameter("healRadiusY"))
function onThink() guard:onThink(getNpcCid()) npcHandler:onThink() end
function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end
npcHandler:addModule(FocusModule:new())
In .../data/npc/lib/npc.lua in first line add:
Spoiler:
dofile('data/npc/lib/creature.lua')
In .../data/npc/lib/ create file creature.lua and in this file put:
Spoiler:
-- @ Mehah and Gesior
function OTSYS_TIME() return os.clock()*1000 end
defender = { cid = 0, targetList = {}, targetTime = OTSYS_TIME(), hitInterval = 1000, shootEffect = CONST_ANI_THROWINGSTAR, hitEffect = CONST_ME_HITAREA, typeDmg = COMBAT_PHYSICALDAMAGE, minDmg = 300, maxDmg = 1200, sayText = "", minHeal = 1, maxHeal = 10, hitSkulledPlayer = 1, multiAttack = 1, dmgRadiusX = 7, dmgRadiusY = 5, healRadiusX = 3, healRadiusY = 3, } function defender:new() local obj = {} setmetatable(obj, self) self.__index = self return obj end function defender:onThink(_cid) if self.cid == 0 then self.cid = _cid return end local _time = OTSYS_TIME() if (_time - self.targetTime) > self.hitInterval then self.targetTime = _time local position = getCreaturePosition(self.cid) local creature = {} local pos = {x = 0, y = 0, z = 0, stackpos = 0} if self.minDmg > 0 and self.maxDmg > 0 then self:clearTargetList() for x = -self.dmgRadiusX, self.dmgRadiusX do for y = -self.dmgRadiusY, self.dmgRadiusY do if not (x == 0 and y == 0) then pos = {x = position.x+x, y = position.y+y, z = position.z, stackpos = STACKPOS_TOP_CREATURE} creature = getTopCreature(pos) if (creature.type == 2) or (creature.type == 1 and self.hitSkulledPlayer == 1 and getPlayerSkullType(creature.uid) > 0) then if self.multiAttack ~= 1 and #self.targetList > 0 then break end self:addTarget(creature.uid) self:doSendDamage(creature.uid) end end end end if #self.targetList > 0 then if self.sayText ~= "" then doCreatureSay(self.cid, self.sayText, TALKTYPE_ORANGE_1) end end end if self.minHeal > 0 and self.maxHeal > 0 then self:clearTargetList() for x = -self.healRadiusX, self.healRadiusX do for y = -self.healRadiusY, self.healRadiusY do if not (x == 0 and y == 0) then pos = {x = position.x+x, y = position.y+y, z = position.z, stackpos = STACKPOS_TOP_CREATURE} creature = getTopCreature(pos) if (creature.type == 1) then self:doHeal(creature.uid) end end end end end end end function defender:doSendDamage(target) if isCreature(target) == TRUE then local hitDmg = math.random(self.minDmg, self.maxDmg) if getCreatureHealth(target) <= hitDmg then doSetCreatureDropLoot(target, 0) end doSendDistanceShoot(getCreaturePosition(self.cid), getCreaturePosition(target), self.shootEffect) doTargetCombatHealth(self.cid, target, self.typeDmg, -hitDmg, -hitDmg, self.hitEffect) end end function defender:doHeal(target) doTargetCombatHealth(self.cid, target, COMBAT_HEALING, self.maxHeal, self.minHeal, CONST_ME_MAGIC_BLUE) end function defender:addTarget(_target) table.insert(self.targetList,_target) end function defender:clearTargetList() self.targetList = {} end function defender:setHitInterval(hitInterval) self.hitInterval = tonumber(hitInterval) end function defender:setShootEffect(shootEffect) self.shootEffect = shootEffect end function defender:setHitEffect(hitEffect) self.hitEffect = hitEffect end function defender:setTypeDmg(typeDmg) self.typeDmg = typeDmg end function defender:setSayText(sayText) self.sayText = tostring(sayText) end
function defender:setDamage(minDmg,maxDmg) self.minDmg = tonumber(minDmg) self.maxDmg = tonumber(maxDmg) end function defender:setHeal(minHeal,maxHeal) self.minHeal = tonumber(minHeal) self.maxHeal = tonumber(maxHeal) end function defender:setHitSkulledPlayer(hitSkulledPlayer) self.hitSkulledPlayer = tonumber(hitSkulledPlayer) end function defender:setMultiAttack(multiAttack) self.multiAttack = tonumber(multiAttack) end
function defender:setDmgRadius(dmgRadiusX,dmgRadiusY) self.dmgRadiusX = tonumber(dmgRadiusX) self.dmgRadiusY = tonumber(dmgRadiusY) end function defender:setHealRadius(healRadiusX,healRadiusY) self.healRadiusX = tonumber(healRadiusX) self.healRadiusY = tonumber(healRadiusY) end
Other NPC .xml examples:
Spoiler:
<?xml version="1.0" encoding="UTF-8"?> <npc name="Defender Liu Chan" script="data/npc/scripts/defender.lua" walkinterval="1000" floorchange="0"> <health now="100" max="100"/> <look type="156" head="114" body="114" legs="114" feet="114" addons="3"/> <parameters> <parameter key="message_greet" value="Hello |PLAYERNAME|. I'm defender of Kni. I'm busy, don't waste my time!"/> <parameter key="message_walkaway" value="Good bye."/> <parameter key="HitInterval" value="1000" /> <parameter key="ShootEffect" value="18" /> <!-- CONST_ANI_THROWINGSTAR --> <parameter key="HitEffect" value="9" /> <!-- CONST_ME_HITAREAR --> <parameter key="TypeDmg" value="1" /> <!-- COMBAT_PHYSICALDAMAGE --> <parameter key="minDamage" value="1" /> <parameter key="maxDamage" value="200" /> <parameter key="sayText" value="Kia!" /> <parameter key="multiAttack" value="1" /> <parameter key="hitSkulledPlayer" value="1" /> <parameter key="minHeal" value="20" /> <parameter key="maxHeal" value="50" /> <parameter key="dmgRadiusX" value="7" /> <parameter key="dmgRadiusY" value="5" /> <parameter key="healRadiusX" value="3" /> <parameter key="healRadiusY" value="3" /> </parameters> </npc><?xml version="1.0" encoding="UTF-8"?> <npc name="Defender Kevin" script="data/npc/scripts/defender.lua" walkinterval="2000" floorchange="0"> <health now="100" max="100"/> <look type="134" head="114" body="114" legs="114" feet="114" addons="3"/> <parameters> <parameter key="message_greet" value="Hello |PLAYERNAME|. I'm defender of Kni. I'm busy, don't waste my time!"/> <parameter key="message_walkaway" value="Good bye."/> <parameter key="HitInterval" value="2000" /> <parameter key="ShootEffect" value="24" /> <!-- CONST_ANI_WHIRLWINDSWORD --> <parameter key="HitEffect" value="9" /> <!-- CONST_ME_HITAREAR --> <parameter key="TypeDmg" value="1" /> <!-- COMBAT_PHYSICALDAMAGE --> <parameter key="minDamage" value="1" /> <parameter key="maxDamage" value="500" /> <parameter key="sayText" value="" /> <parameter key="multiAttack" value="0" /> <parameter key="hitSkulledPlayer" value="1" /> <parameter key="minHeal" value="10" /> <parameter key="maxHeal" value="30" /> <parameter key="dmgRadiusX" value="7" /> <parameter key="dmgRadiusY" value="5" /> <parameter key="healRadiusX" value="3" /> <parameter key="healRadiusY" value="3" /> </parameters> </npc>
|