Ir para conteúdo
  • Cadastre-se

Monster%252FNPC NPC Guard - Ataca players com skulls.


Posts Recomendados

Nome: Guard

Tipo: NPC

Autor: Oneshot


Muitos devem conhecer o NPC Guard, que possui inteligência artificial e ataca jogadores que possuem skulls de servidores que baixam.

Acontece que o script desse NPC foi programado apenas para um NPC só, então quando você tenta, por exemplo, ter dois Guards no servidor, se um está na cidade A e outro na cidade B e, por exemplo, o NPC da cidade A começa atacar um jogador, o NPC da cidade B se teleporta "magicamente" para a cidade A.

Pensando nisso, resolvi otimizar todo o código, orientando ele a objetos. Isso faz com que cada NPC (objeto) tenha suas próprias variáveis e não compartilhem mais elas entre si.


Em data/npc/lib, crie um arquivo chamado guard.lua e adicione o conteúdo abaixo:

Guard = {

	config = {			  

		attackspeed = 1000,

	},

	combat = {type = COMBAT_PHYSICALDAMAGE, min = 100, max = 200}

}


function Guard:new()

		local ret = {}

		setmetatable({}, {__index = self.combat})

		setmetatable(ret, {__index = self})

		return ret

end


function Guard:reset()

	self.config = Guard.config

	self.target = 0

	selfFollow(0)

	doTeleportThing(self.id, self.position)

end



function Guard:updateTarget()

	if self.target ~= 0 then

		return

	end


	local creatures = getSpectators(getThingPosition(self.id), self.range, self.range, false)

	for i = 1, #creatures do

		local target = creatures[i]

		if isCreature(target) and not isNpc(target) and getCreatureSkull(target) >= 3 then

			if not getTilePzInfo(getThingPosition(target)) then

				if selfFollow(target) then

					selfSay("I don't tolerate people like you, ".. getCreatureName(target))

					self.target = target

					self:attack()

					break

				end

			end

		else

			self:reset()

		end

	end

end


function Guard:attack()

	if self.target == 0 then

		self:reset()

		return

	end


	self.time = self.time or os.clock()

	if self.time < os.clock() then

		if getDistanceBetween(getThingPosition(self.id), getThingPosition(self.target)) == 1 then

			doTargetCombatHealth(self.id, self.target, self.combat.type, -self.combat.min, -self.combat.max, CONST_ME_DRAWBLOOD)

		end

		self.time = self.time + (self.config.attackspeed/1000)

	end

end

Agora em data/npc/scripts, crie um arquivo chamado guard.lua e adicione o conteúdo abaixo:

local guard = Guard:new()


function onCreatureAppear(cid)

	if cid == getNpcId() then

		guard.id = getNpcId()

		guard.target = 0

		guard.position = getNpcPos()

	end

end


function onCreatureDisappear(cid)

	if cid == guard.target then

		guard:reset()

	end

end


function onCreatureSay(cid, type, msg)

	return false

end


function onThink()

	guard:updateTarget()

	if guard.target ~= 0 then

		if isCreature(guard.target) then

			guard:attack()

		else

			guard:reset()

		end

	else

		guard:reset()

	end

end

E em data/npc/ crie um arquivo chamado guard.xml e adicione o conteúdo abaixo:


<?xml version="1.0" encoding="UTF-8"?>

<npc name="Guard" script="guard.lua" walkinterval="0" speed="200" floorchange="0">

	<health now="100" max="100"/>

	<look type="134" head="57" body="59" legs="40" feet="76" addons="0"/>

	<parameters/>

</npc>


Abraços \o

Editado por Oneshot (veja o histórico de edições)

Link para o post
Compartilhar em outros sites

Nossa! não tinha visto esse topico =D

Vou testar e ja volto pra dar o feedback

EDIT

Não deu nenhum erro no distro! :wow:

+ olha só, você testou? :mellow:

veja \/

Qp4EM.jpg

Os Guardas não se mexem =/

O que há com eles? :hum:

Por precaução, olha ai:

gDIYC.jpg

Ahh, um fato importante

Quando eu dei /goto Guarda Fox

o server caiu =|

e a propósito, eu sou o Generator =D

esse é meu usuário principal, tinha perdido a senha '-'

Editado por Lpz (veja o histórico de edições)

tk-melhor.png

Link para o post
Compartilhar em outros sites

Olá, Bonefox

Obrigado pelo report, achei um pequeno bug, o NPC ignorava white skulls.

Agora sobre dar /goto no NPC e o servidor dar crash, sinto muito, isso é particular do seu distro.

Link para o post
Compartilhar em outros sites

EDIT

Script não funciona.

2 motivos:

  • 1 - O Guarda até corre atrás e ataca quando o player abre skull, mas para de correr quando o player sobe sobe e desce um andar.
  • 2 - Como ele para de correr atrás do player, o pk sai, e o npc fica parado lá onde vc subiu e desceu, mesmo SEM pk, se você encostar no guarda, ele te ataka.

Então não adianta.

Se outra pessoa puder atualizar esse script e colocar aqui, ou postar um que funcione vai ser interessante.

Se não, fecha o tópico.

Game Over.

Editado por BoneFox (veja o histórico de edições)

tk-melhor.png

Link para o post
Compartilhar em outros sites

Dá para ver pela screenshot apresentada que seu servidor não possui a função doSteerCreature.

O sistema está 100% funcional em The Forgotten Server, não posso garantir que funcione em distros ultrapassados.

Abraços.

Link para o post
Compartilhar em outros sites
  • 3 years later...

mano o meu ta dando esse erro:

 

[18/06/2015 23:20:28] [Error - Npc interface] 
[18/06/2015 23:20:28] data/npc/scripts/guard.lua
[18/06/2015 23:20:28] Description: 
[18/06/2015 23:20:28] data/npc/scripts/guard.lua:1: attempt to index global 'Guard' (a nil value)
[18/06/2015 23:20:28] [Warning - NpcScript::NpcScript] Cannot load script: data/npc/scripts/guard.lua
 
 
[18/06/2015 23:20:28] [Error - Npc interface] 
[18/06/2015 23:20:28] data/npc/scripts/guard.lua
[18/06/2015 23:20:28] Description: 
[18/06/2015 23:20:28] data/npc/scripts/guard.lua:1: attempt to index global 'Guard' (a nil value)
[18/06/2015 23:20:28] [Warning - NpcScript::NpcScript] Cannot load script: data/npc/scripts/guard.lua

Ajudei Rep+ :D

Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo