• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

Guild Guard NPC

xKnightmarex

New Member
Joined
Mar 11, 2013
Messages
94
Reaction score
3
I have a templet for a guard that kills monsters and skulled player. But I want it to be able to kill people from the opposite guild and I can't figure out how to code it. Any ideas?

Lua:
local level = 10  ----- change this to make the npc hit more/less---------------------|damage_min = (level * 2 + maglevel * 3) * min_multiplier | 
 local maglevel = 10  ----- change this to make the npc hit more/less -----------------|damage_max = (level * 2 + maglevel * 3) * max_multiplier | 
 local min_multiplier = 2.1  ----- change this to make the npc hit more/less ----------|damage_formula = math.random(damage_min,damage_max)      | 
 local max_multiplier = 4.2  ----- change this to make the npc hit more/less --------------------------------------------------------------------- 
 local check_interval = 5  ----- change this to the time between checks for a creature (the less time the more it will probably lag :S)   
 local radiusx = 7  ----- change this to the amount of squares left/right the NPC checks (default 7 so he checks 7 squares left of him and 7 squares right (the hole screen)  
 local radiusy = 5  ----- change this to the amount of squares left/right the NPC checks (default 5 so he checks 5 squares up of him and 5 squares down (the hole screen)   
 local Attack_message = "An Invader, ATTACK!!!"  ----- change this to what the NPC says when he sees a monster(s)   
 local town_name = "Archgard"  ----- the name of the town the NPC says when you say "hi"  
 local Attack_monsters = TRUE  ----- set to TRUE for the npc to attack monsters in his area or FALSE if he doesnt  
 local Attack_swearers = TRUE  ----- set to TRUE for the npc to attack players that swear near him or FALSE if he doesnt  
 local Attack_pkers = TRUE  ----- set to TRUE for the npc to attack players with white and red skulls or FALSE if he doesnt  
 local health_left = 10  ----- set to the amount of health the npc will leave a player with if they swear at him (ie at 10 he will hit the player to 10 health left)  
 local swear_message = "Take this!!!"  ----- change this to what you want the NPC to say when he attackes a swearer  
 local swear_words = {"shit", "fuck", "dick", "cunt"}  ----- if "Attack_swearers" is set to TRUE then the NPC will attack anyone who says a word in here. Remember to put "" around each word and seperate each word with a comma (,)  
 local hit_effect = CONST_ME_MORTAREA  ----- set this to the magic effect the creature will be hit with, see global.lua for more effects 
 local shoot_effect = CONST_ANI_SUDDENDEATH  ----- set this to the magic effect that will be shot at the creature, see global.lua for more effects 
 local damage_colour = TEXTCOLOR_RED  ----- set this to the colour of the text that shows the damage when the creature gets hit 
 ------------------end of config------------------  
 local check_clock = os.clock()  ----- leave this  
 local focus = 0  ----- leave this   
  
 function msgcontains(txt, str)   
  return (string.find(txt, str) and not string.find(txt, '(%w+)' .. str) and not string.find(txt, str .. '(%w+)'))   
 end   
  
 function onCreatureSay(cid, type, msg)   
 msg = string.lower(msg)  
 health = getCreatureHealth(cid) - health_left  
    if ((string.find(msg, '(%a*)hi(%a*)'))) and getDistanceToCreature(cid) < 4 then   
        selfSay('Hello ' .. creatureGetName(cid) .. '! I am a defender of '..town_name..'.')   
        doNpcSetCreatureFocus(cid)   
        focus = 0  
    end  
  
    if msgcontains(msg, 'time') then 
        selfSay('The time is ' .. getWorldTime() .. '.') 
    end 
  
    if messageIsInArray(swear_words, msg) then  
        if Attack_swearers == TRUE then  
            selfSay('' .. swear_message ..' ')   
            doCreatureAddHealth(cid,-health)  
            doSendMagicEffect(getThingPos(cid),17)   
            doSendAnimatedText(getThingPos(cid),health,180)  
            doNpcSetCreatureFocus(cid)   
            focus = 0   
        end  
    end  
 end   
  
 function getMonstersfromArea(pos, radiusx, radiusy, stack)  
 local monsters = { }   
 local starting = {x = (pos.x - radiusx), y = (pos.y - radiusy), z = pos.z, stackpos = stack}   
 local ending = {x = (pos.x + radiusx), y = (pos.y + radiusy), z = pos.z, stackpos = stack}   
 local checking = {x = starting.x, y = starting.y, z = starting.z, stackpos = starting.stackpos}   
    repeat   
        creature = getThingfromPos(checking)   
            if creature.itemid > 0 then   
                if isCreature(creature.uid) == TRUE then  
                    if isPlayer(creature.uid) == FALSE then 
                        if Attack_monsters == TRUE then                             
                            table.insert (monsters, creature.uid)   
                            check_clock = os.clock()                          
                        end 
                    elseif isPlayer(creature.uid) == TRUE then   
                        if Attack_pkers == TRUE then  
                            if getPlayerSkullType(creature.uid) > 0 then  
                                table.insert (monsters, creature.uid)   
                                check_clock = os.clock()       
                            end  
                        end  
                    end   
                end   
            end   
        if checking.x == pos.x-1 and checking.y == pos.y then   
            checking.x = checking.x+2   
        else    
            checking.x = checking.x+1   
        end   
        if checking.x > ending.x then   
            checking.x = starting.x   
            checking.y = checking.y+1   
        end   
    until checking.y > ending.y   
        return monsters   
 end   
  
 function onThink()   
 if (Attack_monsters == TRUE and Attack_pkers == TRUE) or (Attack_monsters == TRUE and Attack_pkers == FALSE) or (Attack_monsters == FALSE and Attack_pkers == TRUE) then  
    if (os.clock() - check_clock) > check_interval then       
        monster_table = getMonstersfromArea(getCreaturePosition(getNpcCid(  )), radiusx, radiusy, 253)   
            if #monster_table >= 1 then  
                selfSay('' .. Attack_message ..' ')   
                    for i = 1, #monster_table do   
                        doNpcSetCreatureFocus(monster_table[i])   
                        local damage_min = (level * 2 + maglevel * 3) * min_multiplier   
                        local damage_max = (level * 2 + maglevel * 3) * max_multiplier   
                        local damage_formula = math.random(damage_min,damage_max) 
                        doSendDistanceShoot(getCreaturePosition(getNpcCid(  )), getThingPos(monster_table[i]), shoot_effect) 
                        doSendMagicEffect(getThingPos(monster_table[i]),hit_effect)   
                        doSendAnimatedText(getThingPos(monster_table[i]),damage_formula,damage_colour)   
                        doCreatureAddHealth(monster_table[i],-damage_formula)   
                        check_clock = os.clock()   
                        focus = 0   
                    end   
            elseif table.getn(monster_table) < 1 then   
                focus = 0   
                check_clock = os.clock()   
            end     
    end  
 end  
    focus = 0  
 end

- - - Updated - - -

Fixed changed

Lua:
0if getPlayerSkullType(creature.uid) > 0 then

to


Lua:
if getPlayerGuildName (creature.uid) == 'The Plauge' then
 
Last edited by a moderator:
If i put 2 of those npcs close together, they will start attacking each others. How can i prevent that from happening?

How to make sure they don't attack other npcs?

- - - Updated - - -

[06/04/2013 19:47:27] [Error - Npc interface]
[06/04/2013 19:47:27] data/npc/scripts/defender.lua:eek:nCreatureSay
[06/04/2013 19:47:27] Description:
[06/04/2013 19:47:27] data/npc/scripts/defender.lua:40: attempt to call global 'messageIsInArray' (a nil value)
[06/04/2013 19:47:27] stack traceback:
[06/04/2013 19:47:27] data/npc/scripts/defender.lua:40: in function <data/npc/scripts/defender.lua:27>



Also i get that error :/?
 
If i put 2 of those npcs close together, they will start attacking each others. How can i prevent that from happening?

How to make sure they don't attack other npcs?

- - - Updated - - -

[06/04/2013 19:47:27] [Error - Npc interface]
[06/04/2013 19:47:27] data/npc/scripts/defender.lua:eek:nCreatureSay
[06/04/2013 19:47:27] Description:
[06/04/2013 19:47:27] data/npc/scripts/defender.lua:40: attempt to call global 'messageIsInArray' (a nil value)
[06/04/2013 19:47:27] stack traceback:
[06/04/2013 19:47:27] data/npc/scripts/defender.lua:40: in function <data/npc/scripts/defender.lua:27>



Also i get that error :/?

40: attempt to call global 'messageIsInArray' (a nil value)
on line 40 of defender.lua, the "messageIsInArray" function is returning nil, recheck it...

also, to make sure that they're will not attack each other, use isNpc(uid)..

if isNpc(uid) then ... end
 
Back
Top