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

Lua monster lever tfs 1.3

Dorianek

Member
Joined
Nov 29, 2018
Messages
247
Reaction score
10
Location
Poland
Hi I need a simple script for tfs 1.3 :

(a lever "1945" that spawns monsters)

when pressed, the lever creates a given monster for us (monster name) when pressed, we are teleported to a given place (x,y,z)
 
Isn't this like a boss room if I understand correctly?
I just copied the part where it teleports players and summons monsters from here.
Anyway, Try this.
Lua:
local config = {
    actionId = 5900, -- ActionID to use in the lever
    bossName = "Demon",
    bossPosition = Position(3111, 1846, 7), -- Position where the boss will appear
    bossArea = {
        entrancePos = Position(3119, 1845, 7) -- Position where players will be teleported when they enter
    },
    participantsAllowAnyCount = true, -- allow any valid number of participants to enter. example: 1,2,3 or 4
    participantsPos = {
        Position(3117, 1842, 7), -- Player 1, this player should be the one to pull the lever
        Position(3118, 1842, 7), -- Player 2
        Position(3119, 1842, 7), -- Player 3
        Position(3120, 1842, 7) -- Player 4
    },
    attempts = {
        level = 200 -- Level required to enter
    },
    leverIds = {1945, 1946} -- Lever animation, on/off
}

local action = Action()

function action.onUse(player, item, fromPos, target, toPos, isHotkey)
    local participants = {}
    for index, pos in pairs(config.participantsPos) do
        local tile = Tile(pos)
        if not tile then
            error("[Warning - Tile not found]")
        end
        local participant = tile:getTopVisibleCreature(player)
        if participant and participant:isPlayer() then
            if index == 1 and participant ~= player then
                player:sendCancelMessage("Only the first participant can pull the lever.")
                return true
            end
            if participant:getLevel() < config.attempts.level then
                player:sendCancelMessage(
                    string.format("The player %s is not level %d.", participant:getName(), config.attempts.level)
                )
                return true
            end

            participants[#participants + 1] = participant
        elseif not participantsAllowAnyCount then
            player:sendCancelMessage("Participants are missing.")
            return true
        end
    end
    local boss = Game.createMonster(config.bossName, config.bossPosition)
    if not boss then
        error(Game.getReturnMessage(RETURNVALUE_NOTENOUGHROOM))
    end
    for index, participant in pairs(participants) do
        config.participantsPos[index]:sendMagicEffect(CONST_ME_POFF)
        participant:teleportTo(config.bossArea.entrancePos, false)
        config.bossArea.entrancePos:sendMagicEffect(CONST_ME_TELEPORT)
    end

    item:transform(item:getId() == config.leverIds[1] and config.leverIds[2] or config.leverIds[1])
    return true
end

action:aid(config.actionId)
action:register()
 
Last edited:
I mean if the player is teleported after 5 minutes to exit the arena monster that was selected disappears (to make the arena empty for the next player)
 
I mean if the player is teleported after 5 minutes to exit the arena monster that was selected disappears (to make the arena empty for the next player)
But the script above doesn't have the player kick after 5 minutes, Did you mix both scripts this one and your other thread's one? Because if yes then why not just use this full one?
 
I would just like to add a function to this script that you wrote to me that causes that after the player leaves the arena, the monster, if selected, will be automatically removed from the machine
 
This should work.
Lua:
local config = {
    actionId = 5900, -- ActionID to use in the lever
    bossName = "Demon",
    bossPosition = Position(3111, 1846, 7), -- Position where the boss will appear
    bossArea = {
        fromPos = Position(3101, 1845, 7), -- Upper left corner of the room
        toPos = Position(3120, 1855, 7), -- Lower right corner of the room
        entrancePos = Position(3119, 1845, 7), -- Position where players will be teleported when they enter
        exitPosition = Position(3118, 1842, 7) -- If the participants take too long they will be kicked from the room to this position
    },
    participantsAllowAnyCount = true, -- allow any valid number of participants to enter. example: 1,2,3 or 4
    participantsPos = {
        Position(3117, 1842, 7), -- Player 1, this player should be the one to pull the lever
        Position(3118, 1842, 7), -- Player 2
        Position(3119, 1842, 7), -- Player 3
        Position(3120, 1842, 7) -- Player 4
    },
    attempts = {
        level = 200 -- Level required to enter
    },
    kickParticipantAfterSeconds = 60 * 5,
    leverIds = {1945, 1946} -- Lever animation, on/off
}

local function getSpectators()
    if not config.centerPosition then
        config.diffX = math.ceil((config.bossArea.toPos.x - config.bossArea.fromPos.x) / 2)
        config.diffY = math.ceil((config.bossArea.toPos.y - config.bossArea.fromPos.y) / 2)
        config.centerPosition = config.bossArea.fromPos + Position(config.diffX, config.diffY, 0)
    end
    return Game.getSpectators(
        config.centerPosition,
        false,
        false,
        config.diffX,
        config.diffX,
        config.diffY,
        config.diffY
    )
end

local action = Action()

function action.onUse(player, item, fromPos, target, toPos, isHotkey)
    local participants = {}
    for index, pos in pairs(config.participantsPos) do
        local tile = Tile(pos)
        if not tile then
            error("[Warning - Tile not found]")
        end
        local participant = tile:getTopVisibleCreature(player)
        if participant and participant:isPlayer() then
            if index == 1 and participant ~= player then
                player:sendCancelMessage("Only the first participant can pull the lever.")
                return true
            end
            if participant:getLevel() < config.attempts.level then
                player:sendCancelMessage(
                    string.format("The player %s is not level %d.", participant:getName(), config.attempts.level)
                )
                return true
            end

            participants[#participants + 1] = participant
        elseif not participantsAllowAnyCount then
            player:sendCancelMessage("Participants are missing.")
            return true
        end
    end
    local boss = Game.createMonster(config.bossName, config.bossPosition)
    if not boss then
        error(Game.getReturnMessage(RETURNVALUE_NOTENOUGHROOM))
    end
    for index, participant in pairs(participants) do
        config.participantsPos[index]:sendMagicEffect(CONST_ME_POFF)
        participant:teleportTo(config.bossArea.entrancePos, false)
        config.bossArea.entrancePos:sendMagicEffect(CONST_ME_TELEPORT)
    end

    config.kickEventId =
        addEvent(
        function()
            for _, spectator in pairs(getSpectators()) do
                if spectator:isPlayer() then
                    spectator:getPosition():sendMagicEffect(CONST_ME_POFF)
                    spectator:teleportTo(config.bossArea.exitPosition, false)
                    config.bossArea.exitPosition:sendMagicEffect(CONST_ME_TELEPORT)
                    spectator:sendTextMessage(MESSAGE_EVENT_ADVANCE, "It's been a long time.")
                else
                    spectator:remove()
                end
            end
        end,
        config.kickParticipantAfterSeconds * 1000
    )

    item:transform(item:getId() == config.leverIds[1] and config.leverIds[2] or config.leverIds[1])
    return true
end

action:aid(config.actionId)
action:register()
 
Back
Top