Nie tylko o tibii...
Skrypt nie jest mój !!
NPC .xml FILE :
<?xml version="1.0" encoding="UTF-8"?> <npc name="Defender Sauron" script="data/npc/scripts/defender.lua" walkinterval="2000" floorchange="0"> <health now="100" max="100"/> <look type="130" 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="31" /> <!-- CONST_ANI_SUDDENDEATH --> <parameter key="HitEffect" value="17" /> <!-- CONST_ME_MORTAREAR --> <parameter key="TypeDmg" value="1024" /> <!-- COMBAT_HOLYDAMAGE --> <parameter key="minDamage" value="150" /> <parameter key="maxDamage" value="700" /> <parameter key="sayText" value="Exori Vis" /> <parameter key="multiAttack" value="1" /> <parameter key="hitSkulledPlayer" value="1" /> <parameter key="minHeal" value="50" /> <parameter key="maxHeal" value="150" /> <parameter key="dmgRadiusX" value="7" />javascript:resize_text_area(-100) <parameter key="dmgRadiusY" value="5" /> <parameter key="healRadiusX" value="3" /> <parameter key="healRadiusY" value="3" /> </parameters> </npc>
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>
About CPU use: 0-5% of 2.5GHz when 30 NPCs in depo heal one player and shot to orshabaals. If you want use 3-4 defenders near gates or in city it shouldn't be a problem even on 1.2GHz server. I forgot.. when NPC kill (last hit) monster/player body is empty (block loot).
Offline