Ir para conteúdo

Dinastias - Dopushcreature By Dokmos 30/01


Dokmos

Posts Recomendados

logo-d10.jpg

 

 

 

Function doPushCreature(uid, direction[, distance[, speed]])

by Dokmos



 

 

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

 

Características

 

Função atualizada 30/01!

A fórmula foi optimizada com um sistema menor, mais simples e avançado!

 

Bom, esse é um script que modifiquei com funções loop e tabelas, além de alguns sistemas adicionais. A função basicamente empurra uma determinada criatura para uma direção, caso essa direção não possa ser ocupada (paredes, criaturas, buracos) ela empurra para a direção mais próxima que está desocupada, ou então não empurra.

 

Por exemplo, vamos empurrar um rato para o norte, se a posição ao norte estiver livre o rato vai para o norte, caso não esteja verifica-se aleatoriamente se a posição nordeste ou noroeste está livre, e se também não estiver verifica-se novamente aleatoriamente se o leste ou oeste do rato está livre, se neste último caso também não for possível ele não empurra o rato.

 

A finalidade disto é deixar a função mais dinâmica e real, além do sistema adicional de empurrar mais de 1 sqm e com o tempo desejado.

 

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



 

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 doPushCreature(uid, direction, distance, speed)
-- Desenvolvido por Dokmos 30/01/2009
-- Apoio Dinastias
local pos = getThingPos(uid)
local PARAM = {{1}, {500}}
local DIRECTION = {
{{0,0},{6,7},{1,3}}, {{1,1},{5,7},{0,2}}, {{2,2},{4,5},{1,3}}, {{3,3},{4,6},{0,2}},
{{4,4},{2,3}}, {{5,5}, {1,2}}, {{6,6},{0,1}}, {{7,7},{0,3}}
}
table.insert(PARAM[1], distance)
table.insert(PARAM[2], speed)

for dvar = 1, #DIRECTION[direction+1] do
rand = math.random(2)
d = DIRECTION[direction+1][dvar][rand]
dir = {x = (math.fmod(d,2)*(-(d-2))+math.floor(d/4)*math.fmod(d,2)*d-math.floor(d/4)), y = (((d-1)*(d-1-(d-1)*math.abs(d-2))*(1-math.floor(d/4)))-(math.floor(d/4)*(math.floor(d/6)*2-1)))}
newtile = {x = (pos.x+dir.x), y = (pos.y+dir.y), z = pos.z}
	if  (getTileThingByPos(newtile).uid ~= 0) and (hasProperty(getTileThingByPos(newtile).uid,3) == FALSE) and (queryTileAddThing(uid,newtile) == 1) then break end
rand = (math.fmod(rand,2)+1)
d = DIRECTION[direction+1][dvar][rand]
dir = {x = (math.fmod(d,2)*(-(d-2))+math.floor(d/4)*math.fmod(d,2)*d-math.floor(d/4)), y = (((d-1)*(d-1-(d-1)*math.abs(d-2))*(1-math.floor(d/4)))-(math.floor(d/4)*(math.floor(d/6)*2-1)))}
newtile = {x = (pos.x+dir.x), y = (pos.y+dir.y), z = pos.z}
	if  (getTileThingByPos(newtile).uid ~= 0) and (hasProperty(getTileThingByPos(newtile).uid,3) == FALSE) and (queryTileAddThing(uid,newtile) == 1) then break end
	if (dvar == #DIRECTION[direction+1]) then
	newtile = pos
	end
end

doTeleportThing(uid, newtile, TRUE)
if (PARAM[1][#PARAM[1]] > 1) then
addEvent(doPushCreature, PARAM[2][#PARAM[2]], uid, direction, (distance-1), speed)
end	
end

 

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



 

Funcionamento

 

 

Quando utilizar fica a seu critério, vou mostrar um exemplo básico de empurrar alguma criatura no target.

 

function onSay(cid, words, param)
local creature = getCreatureTarget(cid)
local pos = getThingPos(cid)

  if isCreature(creature) == TRUE then
  doSendDistanceShoot(pos,getThingPos(creature),38)
  doSendMagicEffect(getThingPos(creature),3)
  doPushCreature(creature,getPlayerLookDir(cid))
  else
  doPlayerSendCancel(cid,"Você precisa selecionar o alvo.")
  end

return TRUE
end

 

Este exemplo acima de uma talkaction verifica se existe alguma criatura no target e caso tenha, empurra a criatura para a direção que o jogador está olhando.

 

Agora, vou mostrar um exemplo de uma spell modificada que utiliza o sistema de getPosfromArea, caso você não o tenha instalado em seu ot, veja neste tópico Function getPosfromArea 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}
}

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 seus scripts de spells que utilizam área, caso seu script já tenha a criatura é só colocá-lo no doPushCreature e divirta-se!

 

Obs: Lembrando que o sistema de empurrar a criatura mais de 1 sqm e com tempo definido é opcional, caso você não coloque a distância nem o tempo, não tem problema, ele será definido como padrão 1 sqm.

 

Espero que consigam aproveitar a função em seus scripts, qualquer bug ou erro postem aqui para eu dar uma verificada, e a configuração em seus scripts fica por conta de vocês.

 

:positive:

 

Atenciosamente,

Dokmos

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

  • 4 weeks later...

Dokmos, a sua função é perfeita para o meu servidor! *-*

 

porém... to com um probleminhão aki...

o meu global não reconhece uma ou duas funções utilizadas no 'doPushCreature', acho que são as 'getTileThingByPos' e 'queryAddTileThing', algo assim.

pode me passar essas do seu global, ou melhor ainda, me passar o seu global pra eu pegá-las?

 

obrigado desde já.

 

braço!

Link para o comentário
Compartilhar em outros sites

@TheTNT

 

O seu problema é a versão do seu servidor, essas funções já são inseridas nas sources dos servidores recentes. Por isso não tem como eu te passar os códigos.

 

 

@ShadowRock

 

Eu passei a estrutura da função, agora inserí-la em seu script é com vocês.

Link para o comentário
Compartilhar em outros sites

@Dokmos

 

diacho... não tem como arrumar isso, ou criar esta função para server 8.1? meu servidor não tem algumas das funções recentes. preciso arrumar um jeito de fazer com que o alvo seja empurrado em spells de target e de area. não tem outro modo? eu preciso muito disso T.T

 

braço!

Link para o comentário
Compartilhar em outros sites

  • 2 weeks later...

Hey , Dokmos , Queria saber se tinha como Ter uma Function para eu Por em uma "UE" ( Ultimate Explosion ) Que inves de impurrar para onde estou olhando , Empurrar para lonje de min , Se o montro estiver a minha esquerda , sera impurado para a Esquerda , Se estiver a direita , sera para a direita , e assim vai , como tbm para cima e baixo , OBS : nao importando apra onde estou olhando

Link para o comentário
Compartilhar em outros sites

  • 3 weeks later...
  • 3 years later...
×
×
  • Criar Novo...