- Joined
- Nov 17, 2010
- Messages
- 6,798
- Solutions
- 581
- Reaction score
- 5,361
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.
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.
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()