• 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!
  • New resources must be posted under Resources tab. A discussion thread will be created automatically, you can't open threads manually anymore.

MoveEvent Pillow Puzzle [revived, by Colandus]

Ketada

New Member
Joined
Aug 25, 2013
Messages
15
Reaction score
0
I'm reposting this as my original thread disappeared with OTFans and the script is floating around without credits. Thanks to BlackList for reviving it


Hello everybody!

I've made this script by a request from Etheryn. Yet another quest idea token from Tibia!

The script works like this:
- Walk on tiles to push the pillows.
- Creates a teleport when the puzzle is finnished
- Puzzle will reset when you walk into the teleport, and the teleport will be removed.

How to handle the settings/config:
Lua:
local verticalTiles = 5400
This is the actionid of all vertical tiles (When you have maped the area you will understand), don't forget to add this actionid to the tiles! Without the actionids on the correct tiles, the script won't work (properly).

Lua:
local horizontalTiles = 5401
This is the actionid of all horizontal tiles (When you have maped the area you will understand), don't forget to add this actionid to the tiles! Without the actionids on the correct tiles, the script won't work (properly).

Lua:
local ground = {normal = 426, used = 425}
"normal" is the itemid of the ground tile when it's not used, which means when you don't stand on it. The other one, "used", is the itemid of the ground when you use it, which means when you're standing on it. These are the tiles who has the actionid mentioned in "verticalTiles" and "horizontalTiles"!

Lua:
local teleport = {itemid = 1387, actionid = 5408}
"itemid" is the itemid and "actionid" is the actionid of the teleport that appears when you have finnished the puzzle.

Lua:
local teleportPosition = {x = 584, y = 371, z = 7}
This is the position where the teleport will be spawned/created when you finnish the puzzle.

Lua:
local newPosition = {x = 595, y = 381, z = 7}
This is the position where the teleport will send you (The one which spawns/creates when you finnish the puzzle).

Lua:
local position = {x = 587, y = 374, z = 7}
This should be the north west (top left) position of the puzzles area. Take a look at the image if you don't understand this.

Lua:
local magicEffect = 12
This one is not so important, it will just send a effect on the player when he/she finnish the puzzle. To exclude it, please type "local magicEffect = nil" instead, because you might change your mind one day


pillowpuzzleal9.png

Please save this image, you might forget how to use this script later!

Notice the bright blue rectangle. That position is the position you are going to write in the variable "position", let's say for example in your map that position is: x = 200 and y = 350 and z = 7, then it would look like this in the script:
Lua:
local position = {x = 200, y = 350, z = 7}
Now to the script.

data/movements/scripts
- pillow puzzle.lua
Lua:
-- >>CREDITS<< --
-- Script 100% by COLANDUS
-- Functions 100% by COLANDUS
-- >>CREDITS<< --

-- >>INFO<< --
-- Don't forget: Place 9 pillows of each color in different order in the mapeditor!

-- Do you use a lever to teleport you to this room? Then you could make it randomize the puzzle when you press it!
-- If you do that, you could remove the randomize part, so it doesn't randomize in this script, make it randomize only when you pull the lever.
-- Your own choise, just giving you ideas!

-- Pilow order to complete:
-- BLUE, GREEN
-- RED, YELLOW
-- >>INFO<< --

-- >>CONFIG<< --
local verticalTiles = 5400 -- Action id of the vertical tiles.
local horizontalTiles = 5401 -- Action id of the horizontal tiles.
local ground = {normal = 426, used = 425} -- Itemid of the ground tile when it is normal or used (when you stand on it)
local teleport = {itemid = 1387, actionid = 5408} -- Enter the itemid and the actionid of the teleport.
local teleportPosition = {x = 584, y = 371, z = 7} -- Where should the teleport be spawned when you finnish the puzzle?
local newPosition = {x = 595, y = 381, z = 7} -- Where should you get teleported when you enter the teleport?
local position = {x = 587, y = 374, z = 7} -- Position of the north west (top left) side of the puzzle area.
local magicEffect = 12 -- What effect will appear when you finnish the puzzle? Leave blank or write "nil" if you don't want any.
-- >>CONFIG<< --

function onStepIn(cid, item, pos)
    teleportPosition.stackpos = 1
    local getTeleport = getThingfromPos(teleportPosition)
    if getTeleport.itemid == teleport.itemid and getTeleport.actionid == teleport.actionid then
        doRemoveItem(getTeleport.uid, 1)
    end
    local getPillow = {}
    if item.actionid == verticalTiles then
        for i = 0, 5 do
            getPillow[i + 1] = getThingfromPos({x = position.x + (i * 1), y = getPlayerPosition(cid).y, z = position.z, stackpos = 1})
        end
    elseif item.actionid == horizontalTiles then
        for i = 0, 5 do
            getPillow[i + 1] = getThingfromPos({x = getPlayerPosition(cid).x, y = position.y + (i * 1), z = position.z, stackpos = 1})
        end
    end
    doTransformItem(getPillow[1].uid, getPillow[6].itemid)
    for i = 1, 5 do
        doTransformItem(getPillow[i + 1].uid, getPillow[i].itemid)
    end
    if checkPillows(position.x, position.y, 1686) == 1 and checkPillows(position.x + 3, position.y, 1688) == 1 and checkPillows(position.x, position.y + 3, 1687) == 1 and checkPillows(position.x + 3, position.y + 3, 1689) == 1 then
        local newTeleport = doCreateTeleport(teleport.itemid, newPosition, teleportPosition)
        doSetItemActionId(newTeleport, teleport.actionid)
        if magicEffect ~= nil then
            doSendMagicEffect(pos, magicEffect)
        end
    end
    doTransformItem(item.uid, ground.used)
    return 1
end

function onStepOut(cid, item, pos)
    pos.stackpos = 1
    local getPos = getThingfromPos(pos)
    teleportPosition.stackpos = 1
    local getTeleport = getThingfromPos(teleportPosition)
    if comparePos(pos, teleportPosition) and getPos.itemid == getTeleport.itemid and getPos.actionid == getTeleport.actionid then
        teleportPosition.stackpos = 1
        doRemoveItem(getTeleport.uid, 1)
        resetPuzzle()
        return 1
    else
        doTransformItem(item.uid, ground.normal)
        return 1
    end
end

function checkPillows(posx, posy, item)
    local returnValue = 1
    for gx = posx, posx + 2 do
        for gy = posy, posy + 2 do
            if getThingfromPos({x = gx, y = gy, z = position.z, stackpos = 1}).itemid ~= item then
                returnValue = 0
                break
            end
        end
    end
    return returnValue
end

function resetPuzzle()
    local availablePillows = {}
    for i = 0, 3 do
        local pillowId = 1686 + i
        for i = 1, 9 do
            table.insert(availablePillows, pillowId)
        end
    end
    availablePillows = shuffleTable(availablePillows)
    for gx = position.x, position.x + 5 do
        for gy = position.y, position.y + 5 do
            local pillow = math.random(1, #availablePillows)
            getItem = getThingfromPos({x = gx, y = gy, z = position.z, stackpos = 1})
            doTransformItem(getItem.uid, availablePillows[pillow])
            table.remove(availablePillows, pillow)
        end
    end
end

function shuffleTable(t)
    local newTable = {}
    for i = 1, #t do
        randomId = math.random(1, #t)
        table.insert(newTable, t[randomId])
        table.remove(t, randomId)
    end
    return newTable
end

data/movements
- movements.xml
XML:
<movevent event="StepIn" actionid="5400" script="pillow puzzle.lua" />
<movevent event="StepOut" actionid="5400" script="pillow puzzle.lua" />
<movevent event="StepIn" actionid="5401" script="pillow puzzle.lua" />
<movevent event="StepOut" actionid="5401" script="pillow puzzle.lua" />
<movevent event="StepOut" actionid="5408" script="pillow puzzle.lua" />

All you have to do in the mapeditor is making the pillow area, placing the pillows in a random order (not as the completed one), setting an actionid (you choose, write in the "config" which one you choosed), to each vertical tile, and another actionid to the horizontal tiles, and ofcourse you should change that in the "config" too. You could use the actionids that are already written in the "config" already, which is "5400" for the vertical tiles and "5401" for the horizontal tiles.

Also, check your global.lua in the data folder, if this function is found:
Lua:
function comparePos(pos1, pos2)
    return (pos1.x == pos2.x and pos1.y == pos2.y and pos1.z == pos2.z)
end

If it isn't found, just add it =)
Note that this function, comparePos, was not made by me!


Note that if you use /clean, the puzzle will be cleaned aswell! Therefore, make the puzzle area PZ!


Please report any bugs, and tell me any way to improve this script (Only by the way of how Tibia does it). Also comment the script, what do you think about it, also tell me WHY do you think so?

Enjoy the script, please? =)


Regards,
Colandus
 
Last edited:
When I try to go on a tile

18:33 The tile seems to be protected against unwanted intruders.
 
The Action id is probably used for some other script, or you didn't do movements.xml right. Try another id
 
Nope, its not used and yes its right :p
using 0.4
 
Back
Top