Dark Side OTS

Nie tylko o tibii...


#1 2009-03-02 22:37:23

Nix

http://img27.imageshack.us/img27/2596/administratorm.jpg

Zarejestrowany: 2009-02-17
Posty: 119
Punktów :   

Guardian

Skrypt nie jest mój  !!

NPC .xml FILE :

Kod:

<?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>

Kod:

    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).

Masz jakieś pytanie?? Pisz na e-mail

Jeśli chcesz miec u nas reklamę (widoczne w stopce) pisz na e-mail

Offline

 

Stopka forum

RSS
Powered by PunBB
© Copyright 2002–2008 PunBB
Polityka cookies - Wersja Lo-Fi


Darmowe Forum | Ciekawe Fora | Darmowe Fora
https://rudolfov.ibetonovejimky.cz hotels-world fretka hodowla