• 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!
  • New resources must be posted under Resources tab. A discussion thread will be created automatically, you can't open threads manually anymore.

NPC NPC atacking PKers, Monsters and Swearers!

Kedor

New Member
Joined
Mar 3, 2008
Messages
263
Reaction score
0
Location
Poland, Gdynia
There Is "Small Bug With It"
Just it will atack NPCs too.. so DO NOT put it near other npcs.

ALL CREDITS GO TO FAR CARDER!
THATS FOR FORGOTTEN SERVER

There Is a Mess In Script But All Is Configureable In Config (Beggining Of Script)

So Here We Go:

GUARDIAN.LUA
Code:
---------------config----------
[COLOR="Green"]local level = 10
local maglevel = 10[/COLOR]  ----- [COLOR="Blue"]change this to make the NPC to hit more or less [/COLOR]
[COLOR="Green"]
local min_multiplier = 2.1[/COLOR]  ----- [COLOR="Blue"]Change that to make NPC got lower minimal dmg[/COLOR]
[COLOR="Green"]local max_multiplier = 4.2 [/COLOR] ----- [COLOR="Blue"]Change that to make NPC got higher max dmg[/COLOR]
[COLOR="Red"]--------- dmg formula is dmg = (level * 2 + maglevel * 3) * max/min_multiplier[/COLOR]


[COLOR="Green"]local check_interval = 5 [/COLOR] ----- [COLOR="Blue"]change this to the time between checks for a creature (the less time the more it will probably lag :S)[/COLOR]  
[COLOR="Green"]local radiusx = 7 [/COLOR] ----- [COLOR="Blue"]default 7 so he checks 7 squares left and right(the hole screen) [/COLOR] 
[COLOR="Green"]local radiusy = 5[/COLOR]  ----- [COLOR="Blue"]default 5 so he checks 5 squares up and down(the hole screen)  [/COLOR]


[COLOR="Green"]local Attack_message = "An Invader, ATTACK!!!"[/COLOR]  ----- [COLOR="Blue"]npc says that when he sees a monster[/COLOR]
[COLOR="Green"]local town_name = "CITYNAME" [/COLOR] ----- [COLOR="Blue"]the name of the town, npc says when you say "hi"  hi dont work sometimes [/COLOR]
[COLOR="Green"]local Attack_monsters = TRUE [/COLOR] ----- [COLOR="Blue"]NPC atack monsters? TRUE-yes FALSE-no[/COLOR] 
[COLOR="Green"]local Attack_swearers = TRUE  [/COLOR]----- [COLOR="Blue"]NPC atack swearers? TRUE-yes FALSE-no[/COLOR] 
[COLOR="Green"]local Attack_pkers = TRUE  [/COLOR]-----[COLOR="Blue"]NPC atack guys with white or red skull?? TRUE-yes FALSE-no[/COLOR] 
[COLOR="Green"]local health_left = 10  [/COLOR]----- [COLOR="Blue"]set to the amount of health the npc will leave a player with if they swear at him[/COLOR] 
[COLOR="Green"]local swear_message = "dont swear!"  [/COLOR]-----[COLOR="Blue"] change this to what NPC says when he attacke a swearer [/COLOR] 
[COLOR="Green"]local swear_words = {"shit", "fuck", "dick", "cunt"} [/COLOR] ----- [COLOR="Blue"]if "Attack_swearers" is TRUE then npc will attack anyone who says a word that you will write here.[/COLOR]  
[COLOR="Green"]local hit_effect = CONST_ME_MORTAREA  [/COLOR]----- [COLOR="Blue"]hit effect[/COLOR] 
[COLOR="Green"]local shoot_effect = CONST_ANI_SUDDENDEATH  [/COLOR]-----[COLOR="Blue"] magic effect of npc atack[/COLOR] 
[COLOR="Green"]local damage_colour = TEXTCOLOR_RED  [/COLOR]----- [COLOR="Blue"]dmg color[/COLOR] 




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


GUARDIAN.XML
Code:
<npc name="Guardian" script="data/npc/scripts/guardian.lua" autowalk="25" floorchange="0" access="3" level="1" maglevel="1">
  <mana now="800" max="800"/>
  <health now="200" max="200"/>
  <look type="131" head="116" body="94" legs="78" feet="115" addons="3"/>
 </npc>

ALL CREDITS GO TO FAR CARDER!
 
Last edited by a moderator:
This is npc not function error in line 7

-dmg formula is dmg = (level * 2 + maglevel * 3) * max/min_multiplier

fixed ! ?
 
yep.. try now :p

i just made mistake when i was describing :)
now it should work fine

TESTED :p
 
Last edited:
There is small problem... NPC isnt reacting when player walkaway or just when is idletimeout, so when someone will say "hi" and his conversation with NPC will not be finished using "bye", NPC will always send message: "~Sorry, you are next in line" (something like that). How to fix it?
 
i didnt made that script (as you can see in credits) and i am not sure how to do that.. i will try to do some but i cant say i will fix that for sure :p

i will try^^
 
Far Carder made this script :p

Add it to credits :)

For latest svn:
PHP:
-------By Far Carder------ 
 -----------------start of config-----------------------------------------------------------------------What the formula looks like---------------
 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

Evolutions:
PHP:
-------By Far Carder------ 
 -----------------start of config-----------------------------------------------------------------------What the formula looks like---------------
 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 -- NOTE: Set this to FALSE if you are using TFS as there is no way to tell if a player is skulled on TFS, you will only get errors
 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 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 = getPlayerHealth(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 ..' ') 
    doPlayerAddHealth(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 getPlayerSkull(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)   
       doSendMagicEffect(getThingPos(monster_table[i]),17)
       doCreatureAddHealth(monster_table[i],-damage_formula)  doSendMagicEffect(getThingPos(monster_table[i]),hit_effect)
       doSendAnimatedText(getThingPos(monster_table[i]),damage_formula,damage_colour)  
       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

Latest version xml:
PHP:
<?xml version="1.0"?>
 
 <npc name="Defender" script="defender.lua" access="5" lookdir="2" autowalk="25">
  <mana now="800" max="800"/>
  <health now="200" max="200"/>
  <look type="131" head="116" body="94" legs="78" feet="115" addons="3"/>
 </npc>

Evolutions xml:
PHP:
<?xml version="1.0"?>
 
 <npc name="Defender" script="data/npc/scripts/defender.lua" access="5" lookdir="2" autowalk="25">
  <mana now="800" max="800"/>
  <health now="200" max="200"/>
  <look type="131" head="116" body="94" legs="78" feet="115" addons="3"/>
 </npc>


And if there is any errors, check your global.lua for these functions before you add them, this is only if you get any errors.
PHP:
function messagecontains(txt, str) 
    return (string.find(txt, str) and not string.find(txt, '(%w+)' .. str) and not string.find(txt, str .. '(%w+)')) 
end 
 
function messageIsInArray(array_name, message)
    value = false
    message = string.lower(message)
        for a = 1, table.getn(array_name) do
            if messagecontains(message, array_name[a]) then
                value = true
            end
        end
    return value
end

ALL CREDITS GO TO FAR CARDER!!!!!!!!!!!
 
Last edited by a moderator:
This code dont look to be short, then it will take much CPU :p

thats a retarded comment...


nice script I'm thinking about using it at my open gate leading into the town 'protecting' the people from monsters and raids
 
Kedor said:
There Is "Small Bug With It"
Just it will atack NPCs too.. so DO NOT put it near other npcs.
asdasdasdasd

Code:
if isCreature(creature.uid) == TRUE then 
if isPlayer(creature.uid) == FALSE then
Code:
if isCreature(creature.uid) == TRUE then 
if creature.type == 2 then

fixed ;)
 
why this npc atack my npc? xD
25840450.jpg
 
Why he's attacking NPC's? PK Destroyer is already in TFS ;>
 
lol 1 notepad document without text is like 1kb well this are like 4 docs with like 2kb each, OMG DONT CREATE IT IT WILL TAKE 8KB OMG NOOOO ITS TO HEAVY FOR A COMPUTER
 
Back
Top