Ir para conteúdo

Dinastias - Getposfromarea By Dokmos


Dokmos

Posts Recomendados

 

logo-d10.jpg





Function getPosfromArea(cid,area)


by Dokmos




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



Bom, 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, 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)+1jcenter = math.floor(table.getn(area[1])/2)+1center = area[icenter]ivar = table.getn(area)jvar = table.getn(area[1])i = table.getn(area)^2j = table.getn(area[1])^2if center[jcenter] == 3 thenif getPlayerLookDir(cid) == 0 thensignal = {-1,1,1,2}elseif getPlayerLookDir(cid) == 1 thensignal = {1,-1,2,1}elseif getPlayerLookDir(cid) == 2 thensignal = {1,-1,1,2}elsesignal = {-1,1,2,1}endelsesignal = {-1,1,1,2}endPOSITIONS = {}P = 0repeatpvar = {0,0}I = area[ivar]J = I[jvar]i = i-1j = j-1if J == 1 thenif jvar < jcenter thenpvar[signal[3]] = signal[1]*math.abs((jcenter-jvar))elseif jvar > jcenter thenpvar[signal[3]] = signal[2]*math.abs((jcenter-jvar))endif ivar < icenter thenpvar[signal[4]] = signal[1]*math.abs((icenter-ivar))elseif ivar > icenter thenpvar[signal[4]] = signal[2]*math.abs((icenter-ivar))endendif jvar > 1 thenjvar = (jvar-1)elseif ivar > 1 thenjvar = table.getn(area[1])ivar = (ivar-1)endlocal 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 thenP = P+1POSITIONS[P] = areaposenduntil i <= 0 and j <= 0return POSITIONSend



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



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 = 0while n < #pos don = n+1doSendMagicEffect(pos[n],10)endreturn TRUEend



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 = 0while n < #pos don = n+1thing = {x=pos[n].x,y=pos[n].y,z=pos[n].z,stackpos=253}if isCreature(getThingfromPos(thing).uid) == TRUE thendoPushCreature(getThingfromPos(thing).uid,getPlayerLookDir(cid))endendreturn 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. :smile_positivo:


Atenciosamente,
Dokmos

Editado por Drazyn
Link para o comentário
Compartilhar em outros sites

  • 6 years later...
×
×
  • Criar Novo...