@up
Bem para quem aprendeu loops e vetor a pouco tempo
EU achei muito bom
E não ligue para script grande ou pequeno
Funcionar é o que importa
Por Dokmos, 14 de dez. de 2008 em Mods, funções e outros
info
Grupo: Conde
Registrado: 18/12/05
Posts: 912
Reputação: +86
Gênero: Masculino
Char no Tibia: Kohzete

@up
Bem para quem aprendeu loops e vetor a pouco tempo
EU achei muito bom
E não ligue para script grande ou pequeno
Funcionar é o que importa
info
Grupo: Marquês
Registrado: 01/03/06
Posts: 1k
Reputação: +38
Gênero: Masculino

Interessante, pelo que eu entendi, a function retorna as posições de uma certa área, partindo da posição do player, certo?
info
Grupo: Campones
Registrado: 29/11/07
Posts: 81
Reputação: +4
Char no Tibia: Dokmos

@Tibiaa4e
Obrigado pelo apoio.
@Noobinhu
Sim, ela retorna uma tabela com todas as posição da área e também o sistema de redirecionar a área.
info
Grupo: Artesão
Registrado: 21/02/07
Posts: 137
Reputação: +1
Char no Tibia: GOD Grimrath

rox lek tu e sinister nos scripts tb
info
Grupo: Visconde
Registrado: 07/08/11
Posts: 301
Reputação: +70

Muito interessante esse script, parece ser funcional ainda e ajuda bastante para criação de novas spells.
info
Grupo: Campones
Registrado: 29/11/07
Posts: 81
Reputação: +4
Char no Tibia: Dokmos
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 TRUEendEste é 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
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)endA 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.
Atenciosamente,
Dokmos
Editado Agosto 25 por Drazyn