• logo_cipsoft
    Nowe serwery zostały otwarte 19 Lut 2025:
    Noctalia (Open PvP) Ignitera (Open PvP) us_logo Xybra (Open PvP)

NPC Obronca miasta/graczy

Status
Zamknięty.
Odp: Obronca miasta/graczy

MI NIEDZIA??!:curse: debug jest jak sie pojawia jakis monster przy nim
 
Odp: Obronca miasta/graczy

Dzi?ki za skrypcik :). Przyda? mi si?. Za skrypt 9/10, ale wg. mnie ma ma?e hity xd
 
Odp: Obronca miasta/graczy

Heh dzia?a ale moim skromnym zdaniem skrypt jest do dupy :x , poniewa? leje rs'y w dp.. Nawet jak postawisz go daleko od depo to kto? go zluruje.. I co? i wszyscy popadaj?..
 
Odp: Obronca miasta/graczy

To on leje wszyskich w PZ?

Przy okazji przecie? mo?na da? if jest PZ wtedy tp do XX miejsca
 
Odp: Obronca miasta/graczy

pomocy.. DAm Gma na moim ots :) za npc guard ktury bije pk a nie ze sie pyta czy jest nobem..... ;/ pisac domnie na GG 16217460
FAST !!!! DAM GMA. 100 %
 
Odp: Obronca miasta/graczy

Wszystko ?adnie tylko szkoda, ?e jest nie ?miertelny. Je?eli by? by to na przyk?ad goblin to by by?o pi?knie ;)
 
Odp: Obronca miasta/graczy

Skrypt ?wietny. Podrasowa?em go troszk?.
Od teraz NPC nie leczy oraz nie atakuje w PZ.
Mo?emy ustawi? interval dla leczenia oraz efekt jaki b?dzie przy tym si? pokazywa?.
creature.lua
PHP:
    function OTSYS_TIME()
        return os.clock()*1000
    end

    defender = {
        cid = 0,
        targetList = {},
        targetTime = OTSYS_TIME(),
		healTime = OTSYS_TIME(),
        hitInterval = 2000,
        healInterval = 3000,
        shootEffect = CONST_ANI_THROWINGSTAR,
        hitEffect = CONST_ME_HITAREA,
		healEffect = CONST_ME_MAGIC_BLUE,
        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}
                            if not(getTilePzInfo(pos)) then
								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
                end
                if #self.targetList > 0 then
                    if self.sayText ~= "" then
                        doCreatureSay(self.cid, self.sayText, TALKTYPE_ORANGE_1)
                    end
                end
            end
        local _time = OTSYS_TIME()
        if (_time - self.healTime) > self.healInterval then
            self.healTime = _time
            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}
                            if not(getTilePzInfo(pos)) then
								creature = getTopCreature(pos)
								if (creature.type == 1 and getCreatureHealth(creature.uid) < getCreatureMaxHealth(creature.uid)) then
									self:doHeal(creature.uid)
								end
							end
                        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, self.healEffect)
    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:setHealInterval(healInterval)
        self.healInterval = tonumber(healInterval)
    end
    
    function defender:setShootEffect(shootEffect)
        self.shootEffect = shootEffect
    end
    
    function defender:setHitEffect(hitEffect)
        self.hitEffect = hitEffect
    end
	
	function defender:setHealEffect(healEffect)
        self.healEffect = healEffect
    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
npc.lua
PHP:
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local guard = defender:new()
guard:setHitInterval(getNpcParameter("HitInterval"))
guard:setHealInterval(getNpcParameter("HealInterval"))
guard:setShootEffect(getNpcParameter("ShootEffect"))
guard:setHitEffect(getNpcParameter("HitEffect"))
guard:setHealEffect(getNpcParameter("HealEffect"))
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())
Oraz sam NPC:
PHP:
<npc name="Defender" script="npc.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="2000" />
        <parameter key="HealInterval" value="5000" />
        <parameter key="ShootEffect" value="31" />
        <parameter key="HitEffect" value="17" />
        <parameter key="HealEffect" value="39" />
        <parameter key="TypeDmg" value="2048" />
        <parameter key="minDamage" value="200" />
        <parameter key="maxDamage" value="400" />
        <parameter key="sayText" value="Exori Mort" />
        <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" />
        <parameter key="dmgRadiusY" value="5" />
        <parameter key="healRadiusX" value="3" />
        <parameter key="healRadiusY" value="3" />
    </parameters>
</npc>
 
Status
Zamknięty.
Do góry