Ir para conteúdo
Entre para seguir isso  
Dokmos

Dinastias - getPosfromArea by Dokmos

Recommended Posts

Dokmos    1
Dokmos

logo-d10.jpg

 

 

 

Function getPosfromArea(cid,area)

by Dokmos

 

 

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

 

Bom, antes de postar o script gostaria de agradecer os tutorias disponibilizados pela Equipe OTServ e o apoio aos scripters. Não trabalho com scripts há bastante tempo, portanto não venho aqui colocar o melhor script com menos linhas e mais simples, mas estou colocando o script que desenvolvi com experiência e vontade de crescer, portanto peço desculpas se o script poderia ser menor ou melhor, comecei a mexer a trabalhar com tabelas e loops ontem lendo os tutoriais do OTServ, portanto esse é o meu primeiro script com tabelas e funções loop.

 

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

 

Características

 

 

Agora vou falar sobre esse script, basicamente a função pega determinada área e retorna com uma tabela das posições, algo bastante útil para muitos scripters principalmente para criação de spells. Além disso coloquei um sistema semelhante a função dos OT's em spells que o jogador coloca a área e se ele ativar a condição needdirection a área muda de acordo com a direção que ele está olhando.

 

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

 

Instalação

 

 

Adicione essa função dentro do data\global.lua, você também pode colocá-la em outros libs, mas o global.lua já servirá para todas funções como spells, talkactions, actions, etc.

 

Obs: Alguas versões de OT o global.lua está no data\lib\constant.lua

 

------------------ Function getPosfromArea(cid,area) by Dokmos ------------------
function getPosfromArea(cid,area)
icenter = math.floor(table.getn(area)/2)+1
jcenter = math.floor(table.getn(area[1])/2)+1
center = area[icenter]
ivar = table.getn(area)
jvar = table.getn(area[1])
i = table.getn(area)^2
j = table.getn(area[1])^2

  if center[jcenter] == 3 then
     if getPlayerLookDir(cid) == 0 then
     signal = {-1,1,1,2}
     elseif getPlayerLookDir(cid) == 1 then
     signal = {1,-1,2,1}
     elseif getPlayerLookDir(cid) == 2 then
     signal = {1,-1,1,2}
     else
     signal = {-1,1,2,1}
     end
  else
  signal = {-1,1,1,2}
  end

POSITIONS = {}  
P = 0 

repeat
pvar = {0,0}
I = area[ivar]
J = I[jvar]
i = i-1
j = j-1
  if J == 1 then
     if jvar < jcenter then  
     pvar[signal[3]] = signal[1]*math.abs((jcenter-jvar)) 
     elseif jvar > jcenter then  
     pvar[signal[3]] = signal[2]*math.abs((jcenter-jvar)) 
     end

     if ivar < icenter then  
     pvar[signal[4]] = signal[1]*math.abs((icenter-ivar)) 
     elseif ivar > icenter then
     pvar[signal[4]] = signal[2]*math.abs((icenter-ivar))
     end
  end      
  if jvar > 1 then
  jvar = (jvar-1)
  elseif ivar > 1 then
  jvar = table.getn(area[1])
  ivar = (ivar-1)
  end  
local pos = getThingPos(cid)
local areapos = {x=pos.x+(pvar[1]),y=pos.y+(pvar[2]),z=pos.z}  
  if pos.x ~= areapos.x or pos.y ~= areapos.y then
  P = P+1
  POSITIONS[P] = areapos
  end   
until i <= 0 and j <= 0

return POSITIONS
end

 

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

 

Funcionamento

 

 

Você pode utilizá-la de diversas formas, uma delas é criando um loop para executar uma função em todas posições, ou não caso você não deseje utilizar todas posições da área. Para ativar o sistema de direcionamento de área basta você colocar o número 3 no centro da área, por exemplo:

 

Neste exemplo o 3 é o centro da área, onde fica a posição do jogador e deste modo o sistema de redirecionamento de área está ativado.

local area = {
{0, 1, 1, 1, 0},
{0, 0, 1, 0, 0},
{0, 0, 3, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
}

 

Já agora o sistema de redirecionamente de área está desativado, ou seja, não importa a direção que o jogador estiver olhando a área sempre será a mesma.

local area = {
{0, 1, 1, 1, 0},
{0, 0, 1, 0, 0},
{0, 0, 2, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
}

 

 

Agora vou mostrar um exemplo para utilizar a função principal.

 

function onSay(cid, words, param)
local area = {
{0, 1, 1, 1, 0},
{0, 0, 1, 0, 0},
{0, 0, 3, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
}

pos = getPosfromArea(cid,area)
n = 0

while n < #pos do
n = n+1
doSendMagicEffect(pos[n],10)
end

return TRUE
end

 

Este é exemplo de uma talkaction, o pos é a tabela com as posições da área e este é um loop para enviar o efeito em todas posições, você pode substituir o doSendMagicEffect por outras funções, lembrando sempre dos parametros mostrados como exemplo.

 

Se quiser testar salve este código em data/talkactions/scripts/exemplo.lua, depois coloque este outro código em data/talkactions/talkactions.xml

 

<talkaction words="!exemplo" script="exemplo.lua"/>

 

Agora, vou mostrar um exemplo de uma spell modificada que utiliza o sistema de empurrar criaturas doPushCreature, caso você não o tenha instalado em seu ot, veja neste tópico Function doPushCreature by Dokmos

 

Após ambos instalados vamos ao script de exemplo:

 

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY)
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -1.4, 0, -1.9, 0)

local arr = {
{1, 1, 1},
{1, 1, 1},
{1, 1, 1},
{0, 1, 0},
{0, 3, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
}

local area = createCombatArea(arr)
setCombatArea(combat, area)

function onCastSpell(cid, var)
pos = getPosfromArea(cid,arr)
n = 0

while n < #pos do
n = n+1
thing = {x=pos[n].x,y=pos[n].y,z=pos[n].z,stackpos=253}
  if isCreature(getThingfromPos(thing).uid) == TRUE then
  doPushCreature(getThingfromPos(thing).uid,getPlayerLookDir(cid))
  end
end

return doCombat(cid, combat, var)
end

 

A spell acima é o energy wave modificado, agora além de causar danos ela também empurra, fiz ela só para mostrar um exemplo a vocês de como configurar e utilizar de diversas maneiras em seus scripts que utilizam área.

 

Obs: Lembrando que a posição do jogador deve sempre ficar ficar no meio da área, caso não esteja haverá erro em seu script.

 

Por exemplo:

 

Área Errada

local arr = {

{1, 1, 1},

{1, 1, 1},

{1, 1, 1},

{0, 1, 0},

{0, 3, 0},

}

 

Área Correta

local arr = {

{1, 1, 1},

{1, 1, 1},

{1, 1, 1},

{0, 1, 0},

{0, 3, 0},

{0, 0, 0},

{0, 0, 0},

{0, 0, 0},

{0, 0, 0},

}

 

 

Qualquer erro ou bug no script coloque aqui para eu dar uma verificada, mas a configuração dele no script fica nas mãos de vocês. :bye:

 

 

Atenciosamente,

Dokmos

Editado por Dokmos

Compartilhar este post


Link para o post
grupowebknights    0
grupowebknights

Sou Fan do Dokmos n tem duvida que ele eh o script mais decidido esse forum ele criar e coloca pra galera eh desses scripts que o forum precisa! Parabens

Compartilhar este post


Link para o post
Balder    23
Balder

Parabéns Dokmos, excelente trabalho!

 

Espero que vc aprenda cada dia mais, e possa compartilhar o aprendizado com todos ;)

 

Abraço!

Compartilhar este post


Link para o post
grupowebknights    0
grupowebknights

deu erro aki deu como procurando valor de nil aew tabem lua script interface error

Compartilhar este post


Link para o post
Dokmos    1
Dokmos

Obs: Lembrando que a posição do jogador deve sempre ficar ficar no meio da área, caso não esteja haverá erro em seu script.

 

Por exemplo:

 

Área Errada

local arr = {

{1, 1, 1},

{1, 1, 1},

{1, 1, 1},

{0, 1, 0},

{0, 3, 0},

}

 

Área Correta

local arr = {

{1, 1, 1},

{1, 1, 1},

{1, 1, 1},

{0, 1, 0},

{0, 3, 0},

{0, 0, 0},

{0, 0, 0},

{0, 0, 0},

{0, 0, 0},

}

 

Antes, eu tinha colocado a área errada e por isso deu o erro grupowebknights.

 

Att,

Dokmos

Compartilhar este post


Link para o post
MotoBoy    0
MotoBoy

poxa cara.. parabens

chegou aqui já arregaçando xD

já postou um dos melhores scripts da parea de download..

e uma funçao O.o

parabens cara..

vc eh muito bom =D

 

flws~~

Compartilhar este post


Link para o post
Visitante
Este tópico está impedido de receber novos posts.
Entre para seguir isso  
  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×