É
pelo que eu entendi, o erro esta no seu npc guarda.. que atk qualquer player que estiver pk,
se for vou postar para vc um npc que funciona normal !!
na pasta data/NPCs cria um arquivo .xml e cole isso dentro do arquivo.xml :
<?xml version="1.0" encoding="UTF-8"?>
<npc name="Guarda NoBanng" script="cityguard.lua" walkinterval="0" floorchange="0" speed="1200">
<health now="150" max="150"/>
<look type="134" head="76" body="0" legs="0" feet="0" addons="3"/>
<interaction range="3" idletime="60">
<interact keywords="hi" focus="1">
<keywords>hello</keywords>
<response text="Nothing to see here, move along.">
<action name="idle" value="1"/>
</response>
</interact>
<interact keywords="bye" focus="0">
<keywords>farewell</keywords>
<response text="Good bye."/>
</interact>
</interaction>
</npc>
Depois, abra a pasta scripts que esta dentro da pasta NPCs e crie um arquivo .lua e cole essa tag dentro do arquivo .lua criado :
local target = 0
local prevTarget = 0
local maxChaseDistance = 20
local origPos = 0
local lastAttack = 0
local followTimeout = 300
local function isSkulled(cid)
if(getPlayerSkullType(cid) >= 3 and isPlayerPzLocked(cid) == TRUE) then
return true
end
return false
end
local function goToOrigPos()
target = 0
lastAttack = 0
selfFollow(0)
doTeleportThing(getNpcCid(), origPos)
end
local function updateTarget()
if(isPlayer(target) == FALSE) then
goToOrigPos()
elseif(not isSkulled(target)) then
selfSay("Now, behave in the future.")
goToOrigPos()
end
if(target == 0) then
local list = getSpectators(getNpcPos(), 9, 9, false)
for i = 1, table.getn(list) do
local _target = list
if(_target ~= 0) then
if(isPlayer(_target) == TRUE and isSkulled(_target)) then
if(getTilePzInfo(getCreaturePosition(_target)) == FALSE) then
if(selfFollow(_target)) then
target = _target
if(target ~= prevTarget) then
selfSay("We do not tolerate people like you here!")
end
prevTarget = target
break
end
end
end
end
end
end
end
function onCreatureAppear(cid)
if(cid == getNpcCid()) then
origPos = getNpcPos()
end
end
function onCreatureDisappear(cid)
if(cid == target) then
goToOrigPos()
end
end
function onCreatureMove(creature, oldPos, newPos)
--
end
function onThink()
updateTarget()
if(target == 0) then
return
end
local playerPos = getCreaturePosition(target)
local myPos = getNpcPos()
if(myPos.z ~= playerPos.z) then
goToOrigPos()
return
end
if(math.abs(myPos.x - origPos.x) > maxChaseDistance or math.abs(myPos.y - origPos.y) > maxChaseDistance) then
selfSay("I'll catch you next time.")
goToOrigPos()
return
end
if(lastAttack == 0) then
lastAttack = os.clock()
end
if(os.clock() - lastAttack > followTimeout) then
selfSay("You got me this time, but just wait.")
goToOrigPos()
return
end
if((math.abs(playerPos.x - myPos.x) <= 1) and (math.abs(playerPos.y - myPos.y) <= 1)) then
doTargetCombatHealth(getNpcCid(), target, COMBAT_LIFEDRAIN, -1000, -1500, CONST_ME_EXPLOSIONAREA)
lastAttack = os.clock()
end
end
Pronto, ai se vc quiser trocar o nome dele é so vc ir na pasta data/NPCs e abrir o arquivo cityguard.xml e trocar a parte "Guarda NoBanng"
é isso ae se ajudei da rep+ ae parceiro. ![]()
vlw prescisa to ae!! ![]()






info
Grupo: Visconde
Registrado: 06/04/11
Posts: 350
Reputação: +8
Char no Tibia: Mulekepirado
ae gente to com um problema com um npc meu, que quando eu falo 'hi' trava tudo no ot e depois de uns 10 segs ele destrava, acho que o problema esta na caixa de dialogo sei la abaixo vou colocar o erro que aparece quando falo hi:
observaçao ele e um npc que mata monstros ou pks quando chega perto...
[02/03/2012 02:54:34] Lua Script Error: [Npc interface]
[02/03/2012 02:54:34] data/npc/scripts/guarda.lua:onCreatureSay
[02/03/2012 02:54:35] data/npc/scripts/guarda.lua:30: attempt to compare nil with number
[02/03/2012 02:54:36] stack traceback:
[02/03/2012 02:54:36] data/npc/scripts/guarda.lua:30: in function <data/npc/scripts/guarda.lua:27>
agora abaixo vou postar o script do npc:
<?xml version="1.0"?> <npc name="Guarda" script="guarda.lua" access="5" lookdir="2" walkinterval="1">
<mana now="800" max="800"/>
<health now="1800" max="1800"/>
<look type="130" head="116" body="94" legs="78" feet="115" addons="3"/>
</npc>
agora o outro:
local level = 20 ----- change this to make the npc hit more/less---------------------|damage_min = (level * 10 + maglevel * 12) * min_multiplier |
local maglevel = 20 ----- change this to make the npc hit more/less -----------------|damage_max = (level * 10 + maglevel * 12) * max_multiplier |
local min_multiplier = 0.8 ----- change this to make the npc hit more/less ----------|damage_formula = math.random(damage_min,damage_max) |
local max_multiplier = 1.2 ----- change this to make the npc hit more/less ---------------------------------------------------------------------
local check_interval = 1 ----- 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 = "MoRrE PeDaSo dE MeRdA..." ----- 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 = EXPLOSION ----- set this to the magic effect the creature will be hit with, see global.lua for more effects
local shoot_effect = CONST_ANI_EXPLOSION ----- 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)
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), shoot_effect)
doSendMagicEffect(getThingPos(monster_table),hit_effect)
doSendAnimatedText(getThingPos(monster_table),damage_formula,damage_colour)
doCreatureAddHealth(monster_table,-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
espero que mim ajudem, esse npc e muito importante no meu ot... flw