Codex NG
Recurrent Flamer
- Joined
- Jul 24, 2015
- Messages
- 2,994
- Solutions
- 12
- Reaction score
- 1,657
I have no screen shot for this as I built it on a piece of shit computer & I can't run a program that captures the screen...
Basically this script will allow you to make a tile that players can step on and float across a cavern, its definitely idealistic for those looking to create a flying griffin system on their server.
No special mapping needs to be done, its more of a rough draft then anything.
Basically this script will allow you to make a tile that players can step on and float across a cavern, its definitely idealistic for those looking to create a flying griffin system on their server.
No special mapping needs to be done, its more of a rough draft then anything.
Code:
function newGround(pos, id)
local tile = Tile(pos)
if not tile then
Game.createTile(pos)
tile = Tile(pos)
return tile
end
if not tile:getItemById(id) then
return Game.createItem(id, 1, pos)
end
return false
end
local id = 415 -- tile id
-- position of the base tile that floats across the screen
local pos = {x = 148, y = 148, z = 6, stackpos = 0}
-- the distance the tile will travel
local distance = 5
function removeGround(pos, id)
tile = Tile(pos)
if not tile then
return false
end
local ground = tile:getGround()
--print(ground, tile.itemid == id, tile, id, ground)
if ground then
ground:remove()
end
return pos
end
function updatePosition(pos, dir, num, stack)
if dir == 'n' then
pos = {x = pos.x, y = pos.y + num, z = pos.z, stackpos = stack and stack or ( pos.stackpos and pos.stackpos or 0 ) }
elseif dir == 'e' then
pos = {x = pos.x + num, y = pos.y, z = pos.z, stackpos = stack and stack or ( pos.stackpos and pos.stackpos or 0 ) }
elseif dir == 's' then
pos = {x = pos.x, y = pos.y - num, z = pos.z, stackpos = stack and stack or ( pos.stackpos and pos.stackpos or 0 ) }
elseif dir == 'w' then
pos = {x = pos.x - num, y = pos.y, z = pos.z, stackpos = stack and stack or ( pos.stackpos and pos.stackpos or 0 ) }
end
return pos
end
function relocate(fromPos, toPos)
if fromPos == toPos then
return false
end
local fromTile = Tile(fromPos)
if fromTile == nil then
return false
end
if Tile(toPos) == nil then
return false
end
for i = fromTile:getThingCount() - 1, 0, -1 do
local thing = fromTile:getThing(i)
if thing ~= nil then
if thing:isItem() then
if ItemType(thing:getId()):isMovable() then
thing:moveTo(toPos, true)
end
elseif thing:isCreature() then
thing:teleportTo(toPos, true)
end
end
end
return true
end
local limit = 1
local d = true
local storage = 18050
-- position of the base tile that floats across the screen
local globalPos = {x = 148, y = 148, z = 6, stackpos = 0}
local trackPos = {}
function onThink(creature, interval)
--if creature:getStorageValue(storage) == 0 then
if limit <= distance and d then
if limit > 1 then
removeGround(pos, id)
end
if limit <= distance and #trackPos <= distance then
trackPos[#trackPos + 1] = pos
end
--creature:sendTextMessage(MESSAGE_INFO_DESCR, ' forward x = '..pos.x ..', y = ' .. pos.y .. ', z = '..pos.z..'')
local old = pos
pos = updatePosition(pos, 'e', 1, 0)
relocate(old, pos)
newGround(pos, id)
limit = limit + 1
else
pos.x = pos.x >= globalPos.x and pos.x or globalPos.x
d = false
--creature:sendTextMessage(MESSAGE_INFO_DESCR, ' reverse x = '..pos.x ..', y = ' .. pos.y .. ', z = '..pos.z..'')
removeGround(pos, id)
local old = pos
pos = updatePosition(pos, 'w', 1, 0)
relocate(old, pos)
newGround(pos, id)
limit = limit - 1
if limit == 2 then
d = true
end
end
--else
--reset()
--creature:sendTextMessage(MESSAGE_INFO_DESCR, 'before x = '..pos.x ..', y = ' .. pos.y .. ', z = '..pos.z..'')
--print('before',pos.x, pos.y, pos.z)
--pos = globalPos
--print('after',pos.x, pos.y, pos.z)
--creature:sendTextMessage(MESSAGE_INFO_DESCR, 'after x = '..pos.x ..', y = ' .. pos.y .. ', z = '..pos.z..'')
--end
--MoveTile(1, 6, pos, id, true, 'e', 'w')
end
function reset()
for i = 1, #trackPos do
removeGround(trackPos[i], id)
end
return Game.createItem(id, 1, updatePosition(globalPos, 'e', 1, 0))
end
function MoveTile(from, to, pos, id, go, forward, reverse)
local dir = {}
dir.forward = forward
dir.reverse = reverse
if from <= to and go then
if from > 1 then
removeGround(pos, id)
end
local old = pos
pos = updatePosition(pos, dir.forward, 1, 0)
relocate(old, pos)
newGround(pos, id)
from = from + 1
else
go = false
removeGround(pos, id)
local old = pos
pos = updatePosition(pos, dir.reverse, 1, 0)
relocate(old, pos)
newGround(pos, id)
from = from - 1
if from == 2 then
go = true
end
end
end
Last edited: