CH

[ Npc ]Guild Guardian

Por Chose, 23 de set. de 2008 em NPCs, monsters e raids

14
3.8k
ChoseC
23 de setembro de 2008 às 18:41

Tava sem nada para fazer e inspirado no WoW resolvi fazer um NPC que ataca membros da facção (guilda) rival. Ou seja, irá atacar sempre membros que não são da guilda que você escolher.

 

Funciona para as versões mais novas da SVN, tanto 8.1 quanto 8.2.

 

--------------------------------------------------------------------------------------------------------------------------------------------- Guild Guardian 0.1 (por Chose) 
-------------------------------------------------------------------------------------------------------------------------------------------

-- Configuração
-- Digite o nome da guilda que o guarda irá proteger
local guildName = "Exodar Masters"

-------------------------------------------------------------------------------------------------------------------------------------------

local target = 0
local prevTarget = 0
local maxChaseDistance = 20
local origPos = {}
local lastAttack = 0
local followTimeout = 10

function goToOrigPos()
target = 0
lastAttack  = 0
selfFollow(0)
doTeleportThing(getNpcCid(), origPos)
end

function updateTarget()
if (isPlayer(target) == FALSE) then
	goToOrigPos()
elseif (getPlayerGuildName(target) == guildName) then
	selfSay("Welcome sir.")
end

if (target == 0) then
	local list = getSpectators(getNpcPos(), 8, 8, false)
	for i = 1, #list do
		local _target = list[i]
		if (_target ~= 0) then
			if ((isPlayer(_target) == TRUE) and (getPlayerGuildName(_target) ~= guildName)) then
				if (selfFollow(_target)) then
					target = _target
					if (target ~= prevTarget) then
						selfSay("We do not like people like you! Get out!")
					end

					prevTarget = target
					break
				end					
			end
		end
	end
end
end

function onCreatureAppear(cid)
if (cid == getNpcCid()) then
	origPos = getCreaturePosition(cid)
end
end

function onCreatureDisappear(cid)
if (target == cid) 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, -300, -400, CONST_ME_BLOCKHIT)
	lastAttack = os.clock()
end

end

 

Se quiser absolver guildas aliadas (inspiração do Ragnarok), podemos fazer assim:

 

Coloque a seguinte função:

 

function isInArrayEx(arr, arg)
local x, y
for x, y in pairs(arr) do
	if (y == arg) then
		return true, x
	end
end
return false
end

 

Uma matriz no começo do código (remova a variável guildName)

 

local guildsAndAllys = {"Exodar", "Stormwind", "Ogrinmar"}

 

E troque:

 

elseif (getPlayerGuildName(target) == guildName) then

 

por:

 

elseif (isInArrayEx(guildsAndAllys, getPlayerGuildName(target))) then

 

troque também:

 

 

if ((isPlayer(_target) == TRUE) and (getPlayerGuildName(_target) ~= guildName)) then

 

por:

 

if ((isPlayer(_target) == TRUE) and (isInArrayEx(guildsAndAllys, getPlayerGuildName(target)) == false)) then

 

Com esse pequeno path você poderá selecionar as guildas que não serão atacadas pelo guarda.

 

Bom, por hoje é só pessoal.

noobinhuN
23 de setembro de 2008 às 19:43

Esta action só funciona em TFS, se não me engano.

 

Sempre indique isto ou se é para XML/SQL, pelo menos. Muito boa a action :)

inforceI
23 de setembro de 2008 às 20:37

o_O que comand estranho askpaskaskpaskpaskp nada ave mesmo sem nada pra faze mesmo em quando n tenhu nada pra faze fiko postando qlqr coisa no forum

ChoseC
23 de setembro de 2008 às 21:53

@noobinhu

Negativo, funciona em qualquer servidor que se baseia na SVN.

E hoje teoricamente não existe servidores em XML, logo, é compatível com SQL, SQLite e os demais bancos de dados que a SVN suporta atualmente.

Editado Setembro 23 por Chose

1 ano depois...
wellisonW
04 de abril de 2010 às 17:49

@noobinhu

Negativo, funciona em qualquer servidor que se baseia na SVN.

E hoje teoricamente não existe servidores em XML, logo, é compatível com SQL, SQLite e os demais bancos de dados que a SVN suporta atualmente.

Isso mesmo nao tem disso mais apoiado cara você

esta atualizado no mundo tibia ^>^

3 semanas depois...
DXtibiaXDD
23 de abril de 2010 às 10:38

caboulouso

 

npc killer uhAUHUSHuhah

1 mês depois...
XJhoowX
26 de maio de 2010 às 09:11

Muito loco! ;)

1 mês depois...
TheGODMaXT
08 de junho de 2010 às 13:06

Achei bem legal a idéia desse npcs

nunca tinha visto algo igual por aki... :p

 

Fazendo umas modificações nele da pra faze umas coisas rox

 

flws

2 meses depois...
Piabeta KunP
01 de agosto de 2010 às 05:41

qro muito esse npc, eu tenhu algo em mente a seculos, sendo q nao sei como por em pratica o seu sistema poderia dar um help?:????

5 meses depois...
MalerowM
04 de janeiro de 2011 às 13:54

Aee, será que voc poderia editar tipo assim, o lider da guild chega para os npce fala hi e talz e atravez da fala ele diz quem é guilda alida. oque acha ??? seria mais legal do que voce ter que editar pelo lua.

 

Muito Bom esse npc, parabens

4 semanas depois...
VitorCtaylorV
26 de janeiro de 2011 às 20:26

o.O

Que crueldade com os players sem guild ;/

Mas ficou muito bom.

 

Belo script + belas falas em inglês.

Recomendo para por no seu Ot (y)

9 meses depois...
GODMETALG
21 de outubro de 2011 às 12:37

Cara, os Players Podem bater nesse NPC?

1 mês depois...
VincV
07 de novembro de 2011 às 17:27

cara ta muito confuso onde coloca isso

data/npc/script

data/creaturescripts/script

data/actions/script

explica melhor n fala nem qual pasta é pra por nem como modifca o dano, os attacks ¬¬

 

---edit---

olhei o perfil do cara(o chose), ele n entra mais deis de novenbro de 2008

a n ser que troco de conta

Editado Novembro 7 por lordbug99

1 ano depois...
markindootM
10 de agosto de 2013 às 20:10

Revivendo

 

e se eu quisesse um npc que atacasse certas vocations? por exemplo quero um npc que só ataque a vocation 1 e outro npc que só ataque as vocations 2 e 3