• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

Mock fly system v 1.0

Mock

Mock the bear (MTB)
Joined
Jul 29, 2008
Messages
619
Reaction score
106
Location
Brazil
  • Author: Mock the bear
  • SeTested on: TFS 0.3.6

This script is not the 2.0 is the 1.0 there are small bugs to be fixed but not big.
The magic is one function made by me:
Code:
function doCreateTile(id,pos)
	doAreaCombatHealth(0,0,pos,0,0,0,255)
	doCreateItem(id,1,pos)
end
It abuse of one TFS bug. It create a tile when you execute a spell, and with tile yo ucan create the SQM.
First create flylib.lua on data/lib
Lua:
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 doSetItemActionId(uid,aid)
	doItemSetAttribute(uid,'aid',aid)
end
function hasSqm(pos)-- by Mock
	return getTileThingByPos({x=pos.x,y=pos.y,z=pos.z,stackpos=0}).itemid ~= 0
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

Now we have to install one script on creaturescripts, 3 on talk and 1 on movements.
Creaturescripts​
In login.lua add it:
Code:
fly.login(cid)
the same to logout.lua:
Code:
fly.logout(cid)
and on playerdeath:
Code:
fly.die(cid)
Movements​
In movements.xml:
Code:
<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"/>
and on fly.lua
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​
On talkactions.xml
Code:
<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"/>
on fly.lua
Code:
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
Code:
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
Code:
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

And done.

This script was made 1 year agot o K.A but now KA have a better fly system. This system dont work to ka now so i released it. change it, fix the bugs do what you want but dont remove my credits. This is the first working fly system to be released without source changes. Enjoy.
Look the video:

YouTube - Fly system v 1.0 By mock


I know it can be RO MUCH SMALLER but i dont have time do remake it.

Some missing functions fixed


To fly you need ascess. to add ascess say !fly Player name

And say !fly and then you can say up and down
 
Last edited:
Great release Mock, really happy that you actually released the system!
 
I'm using it with a GOD, when i say "!fly" it says "You cannot fly", if i say "!fly Admin"(Admin is the name of my GOD), it says "Now you can fly" but when i say "up" or "down" nothing happens.

Also if i execute "!fly" or "!fly Admin", when i try to walk in a tile with carpet, it says "Sorry, you cannot fly here."

PD: When i execute "!fly Admin" and it says "Now you can fly.", i don't get the fly outfit.
PD2: I connected with another GOD, and when i try to walk in the tile with carpet where the other player tries to fly, i get a client debug with error in cosole, something like "...Call Stack overflow::executeStep" or something like this.
 
I'm using it with a GOD, when i say "!fly" it says "You cannot fly", if i say "!fly Admin"(Admin is the name of my GOD), it says "Now you can fly" but when i say "up" or "down" nothing happens.

Also if i execute "!fly" or "!fly Admin", when i try to walk in a tile with carpet, it says "Sorry, you cannot fly here."

PD: When i execute "!fly Admin" and it says "Now you can fly.", i don't get the fly outfit.

Try relog and say !fly:)
 
Why not just:
Code:
<movevent type="StepIn" actionid="30001-30009" event="script" value="fly.lua"/>
<movevent type="AddItem" tileitem="1" itemid="460" event="script" value="fly.lua"/>

? :p
 
@darkhaos
you need activate the fly.
say !fly and then say up and down.
 
well mock many thanks for sharing it, I would like to know what bugs it have, 'cause if are dangerous bugs maybe I dont use it on my server... but thanks anyway

how to use:
login in a GOD
type, !fly PlayerName
then, that player says, !fly
and then he can use up or down

xD for those who dont know exactly how to do it :p

pd: its a bit annoying that when u are flying u can get near other walls or grounds, or at least its what happens to me, that I cannot get nearer than 3 sqm from a wall or ground on the same floor :S
 
How shall you type the creaturescript?

EDIT: Got it fixed, but now I wonder, how can you make so you cant fly over zones wich there is no mapping? just black things. :p

I got one solution, but that would be embarassing, lol.. Add walls around you entire map. :p
 
Last edited:
Can you make (if you got time) to add a function so its just usable above z=7? I dont know how to do it.. >_<
 
I made a small buggfix in the script. :D

When this code was:

Code:
if hasSqm(pos) or pos.z < 0 or up.checkAround(pos) then

I made:

Code:
if hasSqm(pos) or pos.z >= 7 or up.checkAround(pos) then

Wich makes the "teleport" up unable unless ur at floor 7. :D

Just so people can fix that too if they want.:peace:

Oops, hotfix:

Code:
	if hasSqm(pos) or pos.z >= 7 or pos.z < 0 or up.checkAround(pos) then

Came this error with the other one:

Code:
[22/08/2010 10:56:36] [Error - TalkAction Interface] 
[22/08/2010 10:56:36] data/talkactions/scripts/flyup.lua:onSay
[22/08/2010 10:56:36] Description: 
[22/08/2010 10:56:36] (luaDoCreateItem) Tile not found

So add a or pos.z < 0 after my code, like this /\ and everything works. :p
 
about flying over nomap you can add check if theres something under destination tile(some loop checking floors below), but youd need to put some aidwater wall to prevent flying to places where you see black tiles
 
Back
Top