• 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!

[TFS 1.4] Rollable Carpet System, using Revscripts

Xikini

I whore myself out for likes
Senator
Premium User
Joined
Nov 17, 2010
Messages
6,756
Solutions
578
Reaction score
5,305
Use the carpet to roll it up.
Use the trapdoor to open it up.
Walk into open trapdoor, and carpet+trapdoor resets itself.

It's a nice and neat little system for small secrets or a quest.

Cheers.

ezgif.com-gif-maker (3).gif Untitled.png

data/scripts/rollable_carpets.lua
Lua:
local actionId = 45025

local itemIds = {
    trapdoor = {
        closed = 9624,
        open = 9625
    },
    carpet = {
        vertical = {
            rolled = 9623,
            top = 9629,
            bottom = 9630
        },
        horizontal = {
            rolled = 9621,
            left = 9628,
            right = 9627
        }
    }
}

local function resetCarpetSystem(position)
    Tile(position):getGround():transform(itemIds.trapdoor.closed)
    local tile = Tile(Position(position.x + 1, position.y, position.z))
    if tile then
        local rolledCarpet = tile:getItemById(itemIds.carpet.horizontal.rolled)
        if rolledCarpet then
            rolledCarpet:transform(itemIds.carpet.horizontal.right)
            Game.createItem(itemIds.carpet.horizontal.left, 1, position)
            return
        end
    end
    Tile(Position(position.x, position.y + 1, position.z)):getItemById(itemIds.carpet.vertical.rolled):transform(itemIds.carpet.vertical.bottom)
    Game.createItem(itemIds.carpet.vertical.top, 1, position)
    return
end

local function triggerCarpetSystem(position, itemId)
    if itemId ~= itemIds.trapdoor.closed then
        local trapdoorPosition = Position(position.x - 1, position.y, position.z)
        local rolledCarpet = Tile(position):getItemById(itemIds.carpet.horizontal.rolled)
        if rolledCarpet then
            if Tile(trapdoorPosition):getGround():getId() == itemIds.trapdoor.open then
                resetCarpetSystem(trapdoorPosition)
                return
            end            
            rolledCarpet:transform(itemIds.carpet.horizontal.right)
            Game.createItem(itemIds.carpet.horizontal.left, 1, trapdoorPosition)
            return
        end
        trapdoorPosition = Position(position.x, position.y - 1, position.z)
        rolledCarpet = Tile(position):getItemById(itemIds.carpet.vertical.rolled)
        if rolledCarpet then
            if Tile(trapdoorPosition):getGround():getId() == itemIds.trapdoor.open then
                resetCarpetSystem(trapdoorPosition)
                return
            end    
            rolledCarpet:transform(itemIds.carpet.vertical.bottom)
            Game.createItem(itemIds.carpet.vertical.top, 1, trapdoorPosition)
            return
        end
        return
    end
    local carpet = Tile(position):getItemById(itemIds.carpet.horizontal.left)
    if carpet then
        carpet:remove()
        Tile(Position(position.x + 1, position.y, position.z)):getItemById(itemIds.carpet.horizontal.right):transform(itemIds.carpet.horizontal.rolled)
        return
    end
    carpet = Tile(position):getItemById(itemIds.carpet.vertical.top)
    if carpet then
        carpet:remove()
        Tile(Position(position.x, position.y + 1, position.z)):getItemById(itemIds.carpet.vertical.bottom):transform(itemIds.carpet.vertical.rolled)
        return
    end
    Tile(position):getGround():transform(itemIds.trapdoor.open)
    return
end


local actionEvent = Action()

function actionEvent.onUse(player, item, fromPosition, target, toPosition, isHotkey)
    local itemId = item:getId()
    if itemId == itemIds.trapdoor.open then
        resetCarpetSystem(toPosition)
        return true
    end
    triggerCarpetSystem(toPosition, itemId)
    return true
end

actionEvent:aid(actionId)
actionEvent:register()


local movementEvent = MoveEvent()
movementEvent:type("stepin")

function movementEvent.onStepIn(creature, item, position, fromPosition)
    if not creature:isPlayer() then
        return true
    end
    if item:getId() ~= itemIds.trapdoor.open then
        return true
    end
    addEvent(resetCarpetSystem, 0, position)
    return true
end

movementEvent:aid(actionId)
movementEvent:register()
 
Back
Top