-
Autor: Mock the bear
-
Servidor testado: TFS 0.3.6
Depois de muita espera eu dei a chance de liberar o script, disse que iria postar assim que descobrissem como criar um tile onde não tem. Pois bem um cara desse forum chamado kydrai descobriu e coube ao lucas123 mostrar. Parabens kydrai ;D
Script dedicado a vc.
A minnha funçao é essa:
function doCreateTile(id,pos) -- By mock doAreaCombatHealth(0,0,pos,0,0,0,255) doCreateItem(id,1,pos) end
E a dele é essa:
function doCreateTile(cid, tileid, pos) -- by Kydrai doCombatAreaHealth(cid, 0, pos, 0, 0, 0, CONST_ME_NONE) doCreateItem(tileid, 1, pos) end
O principio é o mesmo. Abusar de um bug do distro que cria um tile quando executa uma spell. E com o tile pode criar o SQM.
Bom vamos começar.
Primeiro crie um arquivo chamado flylib.lua na pasta data/lib do seu server e coloque isso:
CONST_FLYVOID = 460 CONT_FLYOUTFIT = 239 IGNORED = {6495,7096,7099,5167,5162,5163,405,7100, 5315,5521,5316,5193,5192,5191,945,5048,923,950,951, 952,953,3623,954,955,949,9101,3352,9106,9103,1524, 1111,437,433,443,434,442,436,445,941,444,435,943, 1027,925,930,926,928,922,921,1112,406,904,931,934, 932,933,5319} --- Config here up = {} down = {} fly = {} fly.win = function(cid)-- Script by mock setPlayerStorageValue(cid, 102015,1) doPlayerSendTextMessage(cid,27,'Now you can fly.') end fly.add = function(cid)-- Script by mock if getPlayerStorageValue(cid, 102015) == -1 or getPlayerStorageValue(cid,13241) == 1 then return false end if getPlayerStorageValue(cid, 102059) <= 0 then local outfit = getCreatureOutfit(cid) outfit.lookType = CONT_FLYOUTFIT doSetCreatureOutfit(cid, outfit, -1) setPlayerStorageValue(cid, 102059,1) doChangeSpeed(cid, 390) doPlayerSendTextMessage(cid,27,'Fale \'up\' e \'down\'.' ) return true else doPlayerSendTextMessage(cid,27, "Você ja esta voando.") return false end end function isWalkable(pos, creature, proj, pz)-- by Nord if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end if getTopCreature(pos).uid > 0 and creature then return false end if getTileInfo(pos).protection and pz then return false, true 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 fly.using=function(cid)-- Script by mock return getPlayerStorageValue(cid, 102059) > 0 end fly.logout = function(cid)-- Script by mock if fly.using(cid) then local p = getCreaturePosition(cid) setPlayerStorageValue(cid, 102010,1) setPlayerStorageValue(cid, 102011,p.x) setPlayerStorageValue(cid, 102012,p.y) setPlayerStorageValue(cid, 102013,p.z) deletarEmVolta(p) fly.del(cid) end return true end fly.login = function(cid)-- Script by mock if getPlayerStorageValue(cid, 102010) ~= -1 then setPlayerStorageValue(cid, 102010,-1) local p = {} p.x = getPlayerStorageValue(cid, 102011) p.y = getPlayerStorageValue(cid, 102012) p.z = getPlayerStorageValue(cid, 102013) if not checkAround(p) then fly.add(cid) down.gerarEmVolta(p) doTeleportThing(cid,p) end end return true end fly.die = function(cid)-- Script by mock if fly.using(cid) then local p = getCreaturePosition(cid) setPlayerStorageValue(cid, 102011,-1) setPlayerStorageValue(cid, 102012,-1) setPlayerStorageValue(cid, 102013,-1) deletarEmVolta(p) fly.del(cid) end return true end fly.del = function(cid)-- Script by mock if getPlayerStorageValue(cid, 102059) > 0 then if getSqmId(getCreaturePosition(cid)).itemid == CONST_FLYVOID then return false end doRemoveCondition(cid, CONDITION_OUTFIT) setPlayerStorageValue(cid, 102059,-1) doChangeSpeed(cid, -390) return true end end function hasSqm2(pos)-- Script by mock local f = getTileThingByPos(pos) if f.itemid ~= 0 and f.itemid ~= 1 and (not isWalkable(pos) and not isInArray(IGNORED,f.itemid)) then return true end return false end function hasSqm3(pos)-- Script by mock local f = getTileThingByPos(pos) if f.itemid ~= 0 and f.itemid ~= 1 and f.itemid ~= CONST_FLYVOID and not isInArray(IGNORED,f.itemid) then return true end return false end function deletar(pos)-- Script by mock if hasSqm(pos) then local sqm = getSqmId(pos) if sqm.itemid == CONST_FLYVOID then doRemoveItem(sqm.uid,1) end end end function deletarEmVolta(pos) for x=-1,1 do for y=-1,1 do deletar({x=pos.x+x,y=pos.y+y,z=pos.z}) end end end function checkAround(pos)-- Script by mock for x=-1,1 do for y=-1,1 do if hasSqm2({x=pos.x+x,y=pos.y+y,z=pos.z}) then return true end end end return false end function fly.checkAround(pos)-- Script by mock local n = 0 for x=-1,1 do for y=-1,1 do local g = getTileThingByPos({x=pos.x+x,y=pos.y+y,z=pos.z}) if g.itemid == CONST_FLYVOID then n = n+1 end if isCreature(getTopCreature({x=pos.x+x,y=pos.y+y,z=pos.z}).uid) then return false end end end if n == 9 then return true end return false end function up.checkAround(pos)-- Script by mock for x=-1,1 do for y=-1,1 do local g = getTileThingByPos({x=pos.x+x,y=pos.y+y,z=pos.z}) if hasSqm3({x=pos.x+x,y=pos.y+y,z=pos.z}) or g.itemid == CONST_FLYVOID then return true end end end return false end function down.checkAround(pos,f)-- Script by mock for x=-1,1 do for y=-1,1 do local g = getTileThingByPos({x=pos.x+x,y=pos.y+y,z=pos.z}) if (not f and hasSqm2({x=pos.x+x,y=pos.y+y,z=pos.z})) or g.itemid == CONST_FLYVOID then return true end end end return false end function gerarEmVolta(pos)-- Script by mock local n = 30000 for x=-1,1 do for y=-1,1 do n =n+1 doItem({x=pos.x+x,y=pos.y+y,z=pos.z},n) end end end function doItem(pos,a,d)-- Script by mock if not hasSqm2(pos) then doCreateTile(CONST_FLYVOID,pos) pos.stackpos = 0 local c = getTileThingByPos(pos) doSetItemActionId(c.uid, a) end end function getSqmId(pos,t)-- Script by mock if hasSqm(pos) or t then pos.stackpos = 0 local i = getTileThingByPos(pos) return i end return nil end function down.doItem(pos,a)-- Script by mock if not hasSqm(pos) then doCreateTile(CONST_FLYVOID,pos) pos.stackpos = 0 local c = getTileThingByPos(pos) doSetItemActionId(c.uid, a) end end function down.gerarEmVolta(pos)-- Script by mock local n = 30000 for x=-1,1 do for y=-1,1 do n =n+1 down.doItem({x=pos.x+x,y=pos.y+y,z=pos.z},n) end end end function doCreateTile(id,pos) -- Script by mock doAreaCombatHealth(0,0,pos,0,0,0,255) doCreateItem(id,1,pos) end
Agora é 1 scritp em creaturescripts, 3 em talkactions e 1 em movements.
Creaturescripts
Em seu login.lua coloque isso:
fly.login(cid)
no seu logout.lua coloque isso:
fly.logout(cid)
e no script que o player morre coloque isso:
fly.die(cid)
Isso é para quando o player entrar e sair do server pra voltar onde ele estava :coolface:
Movements
Em movements.xml:
<movevent type="StepIn" actionid="30001" event="script" value="fly.lua"/> <movevent type="StepIn" actionid="30002" event="script" value="fly.lua"/> <movevent type="StepIn" actionid="30003" event="script" value="fly.lua"/> <movevent type="StepIn" actionid="30004" event="script" value="fly.lua"/> <movevent type="StepOut" actionid="30005" event="script" value="fly.lua"/> <movevent type="StepIn" actionid="30006" event="script" value="fly.lua"/> <movevent type="StepIn" actionid="30007" event="script" value="fly.lua"/> <movevent type="StepIn" actionid="30008" event="script" value="fly.lua"/> <movevent type="StepIn" actionid="30009" event="script" value="fly.lua"/> <movevent type="AddItem" tileitem="1" itemid="460" event="script" value="fly.lua"/>
E no script fly.lua
---Script by mock the bear function doCopyItem(item,pos) ---Script by mock the bear for i=1,6 do pos.z = pos.z+1 if hasSqm(pos) and getSqmId(pos).itemid ~= 10217 then local i = doCreateItem(item.itemid,item.type,pos) if item.actionid ~= 0 then doSetItemActionid(i,item.actionid) end doSendMagicEffect(pos,9) return i else local p2 = {x=pos.x+1,y=pos.y+1,z=pos.z} doSendDistanceShoot(pos,p2,40) doSendMagicEffect(pos,2) end end end function onAddItem(item,pos,k) ---Script by mock the bear doCopyItem(item,k) doRemoveItem(item.uid,item.type == 0 and 1 or item.type) end function onStepIn(cid, item, position, fromPosition) ---Script by mock the bear local dir = { [30004] = {0,6,7}, [30007] = {7,0,6,1,5}, [30008] = {1,5,7}, [30009] = {5,4,2,1,7}, [30006] = {2,5,4}, [30003] = {4,3,6,2,5}, [30002] = {3,4,6}, [30001] = {6,0,7,3,4}, } if isPlayer(cid) then local chkps = {x=position.x,y=position.y,z=position.z} local ig = false for i,b in pairs(dir[item.actionid]) do local nw = getPosByDir(chkps,b) local g = getTileThingByPos(nw) if hasSqm3(nw) or g.itemid == CONST_FLYVOID or nw.x < 35 or nw.y < 35 then ig = true break end end if not ig then deletarEmVolta(fromPosition) gerarEmVolta(getCreaturePosition(cid)) else doTeleportThing(cid,fromPosition,false) doPlayerSendTextMessage(cid,27, "Sorry, you cannot fly here.") end end end function onStepOut(cid, item, position, fromPosition,q) addEvent(function(pos) if fly.checkAround(pos) then deletarEmVolta(pos) end end,10000,position) end
Talkactions
Em talkactions.xml
<talkaction words="up" case-sensitive="no" event="script" value="flyup.lua"/> <talkaction words="down" case-sensitive="no" event="script" value="flydown.lua"/> <talkaction words="!fly" case-sensitive="no" event="script" value="fly.lua"/>
Em fly.lua
function onSay(cid, words, param) --- By moc kthe bear (MTB) if param ~= '' and getPlayerGroupId(cid) > 3 then local cida = getPlayerByName(param) if cida and isPlayer(cida) then fly.win(cida) end return true end if fly.using(cid) then local p = getCreaturePosition(cid) p.stackpos = 0 local f = getTileThingByPos(p) if fly.del(cid) then if f.itemid ~= 0 and f.itemid ~= 1 and f.itemid ~= CONST_FLYVOID then return true else setPlayerStorageValue(cid,10941,1) local p = getCreaturePosition(cid) setPlayerStorageValue(cid, 102011,p.x) setPlayerStorageValue(cid, 102012,p.y) setPlayerStorageValue(cid, 102013,p.z) return true end else doPlayerSendTextMessage(cid,27,'You cannot turn off the fly here.') end else if fly.add(cid) then local pos = getCreaturePosition(cid) if getSqmId(pos).itemid == 10217 then down.gerarEmVolta(pos) end return true else doPlayerSendTextMessage(cid,27,'You cannot fly.') return true end end return true end
Flyup.lua
function onSay(cid)--- By moc kthe bear (MTB) local time = os.time() if time < getPlayerStorageValue(cid, 102054) then doPlayerSendCancel(cid, "You are exhausted.") return true end if not fly.using(cid) then return false end local pos = getCreaturePosition(cid) pos.z = pos.z-1 if hasSqm(pos) or pos.z < 0 or up.checkAround(pos) then doPlayerSendTextMessage(cid,27,'You cannot fly higger.') return true else gerarEmVolta(pos) doTeleportThing(cid,pos) pos.z = pos.z+1 deletarEmVolta(pos) end return true end
Flydown.lua
function onSay(cid)--- By moc kthe bear (MTB) local time = os.time() if time < getPlayerStorageValue(cid, 102054) then doPlayerSendCancel(cid, "You are exhausted.") return true end if not fly.using(cid) then return false end local pos = getCreaturePosition(cid) pos.stackpos = 0 local g = getTileThingByPos(pos) pos.z = pos.z+1 local f = getTileThingByPos(pos) if getSqmId(getCreaturePosition(cid)).itemid ~= CONST_FLYVOID or down.checkAround(pos) or (g.itemid ~= CONST_FLYVOID and f.itemid ~= CONST_FLYVOID and f.itemid ~= 0 and f.itemid ~= 1) or (not isWalkable(pos,true,false,false) and hasSqm(pos)) or (hasSqm(pos) and not getTileHouseInfo(pos)) == 0 then doPlayerSendTextMessage(cid,27,'You cannot go to down here.') return true else down.gerarEmVolta(pos) doTeleportThing(cid,pos) pos.z = pos.z-1 deletarEmVolta(pos) end return true end
E pronto. Esse não tem o recurso de cair que tem no video por que aquilo é do K.A junto do flysystem 2.0. Esse ja foi do K.A porem agora ele tem um melhor. Esse ai é bom sim porem não serve mais pro k.a entao ta liberado. Façam bom uso modifiquem da forma que quiserem corrijam os bugs e repostem melhorado contanto que nao tire meus creditos. Lembrando que nao precisa mudança na source.
Eu sei ta um pog do baralho nao tive paciencia pra faze um remake.
Se gostaram clica no meu ovinho da assinatura