Ir para conteúdo

Featured Replies

Postado
  • Este é um post popular.

Bom galera, a um tempo atrás um amigo pediu uma magia que empurrasse e minha primeira iniciativa foi dar uma procura por aí. A maioria dos scripts que eu achei não funcionava, o resto funcionava cheio dos mais variados bugs então eu decidi pegar um desses scripts como base e fazer a magia que empurra.  :accepted: 
Testado e funcionando em TFS 0.3.6 (Crying Damson).

Não lembro de onde eu peguei e nem quem fez porque o autor não colocou créditos no script mas quero deixar bem claro de que 

80% dos créditos vão pra esse pessoa, visto que eu apenas me baseei na metodologia dele pra fazer o script funcionar sem bugs 

(y)

Sem mais delongas, vamos ao script:

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, 2)
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -9.0, -30, -10.0, 4)


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)


local function doPushCreature(uid,direction,distance,time)
   if isCreature(uid) == TRUE then
   local rand = (2*math.random(0,1))-1
   local rand2 = math.random(-1,0)
      if direction == 0 then
      signal = {0,rand,-rand,rand,-rand,0,-1,-1,-1,0,0,0}
      elseif direction == 1 then
      signal = {1,1,1,0,0,0,0,rand,-rand,rand,-rand,0}
      elseif direction == 2 then
      signal = {0,rand,-rand,rand,-rand,0,1,1,1,0,0,0}
      elseif direction == 3 then
      signal = {-1,-1,-1,0,0,0,0,rand,-rand,rand,-rand,0}
      elseif direction == 4 then
      signal = {-1,rand2,(-rand2)-1,0,1,rand2+1,rand2,0}
      elseif direction == 5 then
      signal = {1,-rand2,-((-rand2)-1),0,1,rand2+1,rand2,0}
      elseif direction == 6 then
      signal = {-1,rand2,(-rand2)-1,0,-1,(-rand2)-1,rand2,0}
      else
      signal = {1,-rand2,-((-rand2)-1),0,-1,(-rand2)-1,rand2,0}
      end
   local pos = getThingPos(uid)
   nsig = #signal
   nvar = 0
   
   repeat
   nvar = nvar+1
   
   newpos = {x=pos.x+(signal[nvar]),y=pos.y+(signal[(nsig/2)+nvar]),z=pos.z}
   newtile = {x=newpos.x,y=newpos.y,z=newpos.z,stackpos=0}
    until getTileThingByPos(newtile).uid ~= 0 and hasProperty(getTileThingByPos(newtile).uid,3) == FALSE and queryTileAddThing(uid,newpos) == 1 or nvar == (nsig/2) 
   
   
   if canWalk(newpos) == TRUE then
      if distance == nil or distance == 1 then
      doTeleportThing(uid,newpos,TRUE)   
      else
      distance = distance-1
      doTeleportThing(uid,newpos,TRUE)
         if time ~= nil then
         addEvent(doPushCreature,time,uid,direction,distance,time)
         else
         addEvent(doPushCreature,500,uid,direction,distance,500)
         end       
      end
   end  
end
end 




local 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


function canWalk(pos, creature, pz, proj) -- nord
if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end
local creature = getTopCreature(pos)
if creature.type > 0 then return false end
if getTilePzInfo(pos) and not pz then return false end
local n = not proj and 3 or 2
for i = 0, 255 do
pos.stackpos = i
local tile = getTileThingByPos(pos)
if tile.itemid ~= 0 and not isCreature(tile.uid) then
if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
return false
end
end
end
return true
end






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))
   doSendAnimatedText(getThingPos(cid), "GET OFF", 215)
   end
end


return doCombat(cid, combat, var)end



OBS: Ele está 200% funcional, não empurra pra dentro de pz e nem buga de nenhuma forma.  :hum: 

Agora no spells.xml adicione: 

<instant name="Get off here" words="exani grav" lvl="160"  mana="500" prem="1" direction="1" exhaustion="2000" needlearn="0" event="script" value="empurrar.lua">
<vocation id="6"/>
<vocation id="7"/>
<vocation id="5"/>
</instant>

Faça bom proveito!!  ;D


EDIT: Algumas imagens pra vocês

6qlln.jpg

 

438s.jpg

 

PS: Dano adicionado pelo membro @Emersonssss ;]

Editado por xWhiteWolf (veja o histórico de edições)

Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá!

"Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

  • 1 month later...
  • Respostas 35
  • Visualizações 6.6k
  • Created
  • Última resposta

Top Posters In This Topic

Most Popular Posts

  • remove isso do script  setCombatParam(combat, COMBAT_PARAM_EFFECT, 2) agora procura essa parte:   if getPlayerLookDir(cid) == 0 then       signal = {-1,1,1,2}       elseif getPlayerLookDir(cid) ==

  • local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_COMBAT_NONE) 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

  • ele só sai só pra baixo se vc esquecer de botar direction="1" na tag do xml.

Postado

eu queria saber se tem como empurrar esse tanto de espaço mais so aparecer o efeito apenas no sqm da frente do atacante.. e o atacado voar esse tanto ae, sem aparecer os efeitos na quantidade de sqm que apareceu na imagem de exemplo, tem como? pode me ajudar com isso?

Postado
  • Autor

remove isso do script 

setCombatParam(combat, COMBAT_PARAM_EFFECT, 2)

agora procura essa parte:
  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

aqui ele tá pegando a direção do player... como vc quer que a magia solte um efeito na frente dele é só adicionar posições de acordo com a direção que ele tá olhando, sendo que

NORTH = 0
EAST = 1
SOUTH = 2
WEST = 3

local pos = getThingPos(uid)

então se a direção que ele ta olhando for 0, o SQM na frente dele vai ser 
 effectpos = {x=pos.x+1,y=pos.y,z=pos.z}
se for 1 a posição será
 effectpos = {x=pos.x,y=pos.y+1,z=pos.z}
se for 2 a posição será 
 effectpos = {x=pos.x-1,y=pos.y,z=pos.z}
se for 3, a posição será
 effectpos = {x=pos.x,y=pos.y-1,z=pos.z}

daí é só colocar pra mandar o magic effect que vc quiser na posição effectpos.

Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá!

"Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

Postado

olha eu gostei de você ter respondido rapido! , mas eu nao estou conseguindo entender mt bem...sera que teria uma maneira de vc fazer a script e me mandar? pois estou tentando e nao to conseguindo...se nao for encomodar e claro!..desde já agradeço ^.~ 

Postado
  • Autor
local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_COMBAT_NONE)



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)




local function doPushCreature(uid,direction,distance,time)
   if isCreature(uid) == TRUE then
   local rand = (2*math.random(0,1))-1
   local rand2 = math.random(-1,0)
      if direction == 0 then
      signal = {0,rand,-rand,rand,-rand,0,-1,-1,-1,0,0,0}
      elseif direction == 1 then
      signal = {1,1,1,0,0,0,0,rand,-rand,rand,-rand,0}
      elseif direction == 2 then
      signal = {0,rand,-rand,rand,-rand,0,1,1,1,0,0,0}
      elseif direction == 3 then
      signal = {-1,-1,-1,0,0,0,0,rand,-rand,rand,-rand,0}
      elseif direction == 4 then
      signal = {-1,rand2,(-rand2)-1,0,1,rand2+1,rand2,0}
      elseif direction == 5 then
      signal = {1,-rand2,-((-rand2)-1),0,1,rand2+1,rand2,0}
      elseif direction == 6 then
      signal = {-1,rand2,(-rand2)-1,0,-1,(-rand2)-1,rand2,0}
      else
      signal = {1,-rand2,-((-rand2)-1),0,-1,(-rand2)-1,rand2,0}
      end
   local pos = getThingPos(uid)
   nsig = #signal
   nvar = 0
   
   repeat
   nvar = nvar+1
   
   newpos = {x=pos.x+(signal[nvar]),y=pos.y+(signal[(nsig/2)+nvar]),z=pos.z}
   newtile = {x=newpos.x,y=newpos.y,z=newpos.z,stackpos=0}
    until getTileThingByPos(newtile).uid ~= 0 and hasProperty(getTileThingByPos(newtile).uid,3) == FALSE and queryTileAddThing(uid,newpos) == 1 or nvar == (nsig/2) 
   
   
   if canWalk(newpos) == TRUE then
      if distance == nil or distance == 1 then
      doTeleportThing(uid,newpos,TRUE)   
      else
      distance = distance-1
      doTeleportThing(uid,newpos,TRUE)
         if time ~= nil then
         addEvent(doPushCreature,time,uid,direction,distance,time)
         else
         addEvent(doPushCreature,500,uid,direction,distance,500)
         end       
      end
   end  
end
end 








local 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
   local pos = getThingPos(cid)
      if getPlayerLookDir(cid) == 0 then


 effectpos = {x=pos.x,y=pos.y-1,z=pos.z}
 signal = {-1,1,1,2}
      elseif getPlayerLookDir(cid) == 1 then
effectpos = {x=pos.x+1,y=pos.y,z=pos.z}
      signal = {1,-1,2,1}
      elseif getPlayerLookDir(cid) == 2 then
  effectpos = {x=pos.x,y=pos.y+1,z=pos.z} 
signal = {1,-1,1,2}
      else
effectpos = {x=pos.x-1,y=pos.y,z=pos.z}
      signal = {-1,1,2,1}
      end
 doSendMagicEffect(effectpos, 2)
   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




function canWalk(pos, creature, pz, proj) -- nord
if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end
local creature = getTopCreature(pos)
if creature.type > 0 then return false end
if getTilePzInfo(pos) and not pz then return false end
local n = not proj and 3 or 2
for i = 0, 255 do
pos.stackpos = i
local tile = getTileThingByPos(pos)
if tile.itemid ~= 0 and not isCreature(tile.uid) then
if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
return false
end
end
end
return true
end












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))
   doSendAnimatedText(getThingPos(cid), "GET OFF", 215)
   end
end




return doCombat(cid, combat, var)end

Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá!

"Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.6k

Informação Importante

Confirmação de Termo