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

Problem with boss room script looking for solution.

endziu2222

Active Member
Joined
Nov 2, 2010
Messages
167
Solutions
1
Reaction score
44
I am trying to understand what has been done wrong here. So my first screen shows you my problem, I can enter with multiple players and monsters just keep spawning but cooldown works fine.

Am I forgetting something? Do I need to add anything else except adding storages?

1695059892600.png

2nd screen how it is on map editor.
1695060046901.png

And now code.

Lua:
local config = {
    cooldown = 60 * 60 * 10, -- in seconds - (Make it 'seconds * minutes * hours' - its will be '60 * 60 * 20' for 20 hours) (player cooldown)
    cooldown_storage = 650025,
    duration = 10, -- time till reset, in minutes (lever cooldown)
    level_req = 100, -- minimum level to do quest
    min_players = 1, -- minimum players to join quest
    lever_id = 2772, -- id of lever before pulled
    pulled_id = 2773, -- id of lever after pulled
}

local player_positions = {
    [1] = {fromPos = Position(2441, 2599, 7), toPos = Position(2429, 2606, 7)},
    [2] = {fromPos = Position(2442, 2599, 7), toPos = Position(2429, 2606, 7)},
    [3] = {fromPos = Position(2443, 2599, 7), toPos = Position(2429, 2606, 7)},
    [4] = {fromPos = Position(2444, 2599, 7), toPos = Position(2429, 2606, 7)}
}

local monsters = {
    [1] = {pos = Position(2431, 2605, 7), name = "Angry Demon"},
    [2] = {pos = Position(2431, 2606, 7), name = "Angry Demon"}
}
local quest_range = {fromPos = Position(2429, 2605, 7), toPos = Position(2433, 2608, 7)} -- see image in thread for explanation

local exit_position = Position(2441, 2600, 7) -- Position completely outside the quest area

local lever = Action()

function doResetTheBossDukeKrule(position, cid_array)
 
    local tile = Tile(position)
 
    local item = tile and tile:getItemById(config.pulled_id)
    if not item then
        return
    end
 
    local monster_names = {}
    for key, value in pairs(monsters) do
        if not isInArray(monster_names, value.name) then
            monster_names[#monster_names + 1] = value.name
        end
    end
 
    for i = 1, #monsters do
        local creatures = Tile(monsters[i].pos):getCreatures()
        for key, creature in pairs(creatures) do
            if isInArray(monster_names, creature:getName()) then
                creature:remove()
            end
        end
    end
 
    for i = 1, #player_positions do
        local creatures = Tile(player_positions[i].toPos):getCreatures()
        for key, creature in pairs(creatures) do
            if isInArray(monster_names, creature:getName()) then
                creature:remove()
            end
        end
    end
 
    for key, cid in pairs(cid_array) do
        local participant = Player(cid)
    if participant and isInRange(participant:getPosition(), quest_range.fromPos, quest_range.toPos) then
            participant:teleportTo(exit_position)
            exit_position:sendMagicEffect(CONST_ME_TELEPORT)
        end
    end
 
    item:transform(config.lever_id)
end

local function removeBoss()
local specs, spec = Game.getSpectators(Position(2431, 2607, 97, false, false, 3, 3, 3, 3)
    for j = 1, #specs do
        spec = specs[j]
        if spec:getName():lower() == 'Angry Demon' then
            spec:remove()
        end
    end
end

function lever.onUse(player, item, fromPosition, target, toPosition, isHotkey)
    if player:getStorageValue(config.cooldown_storage) >= os.time() then
        player:sendTextMessage(MESSAGE_INFO_DESCR, "Try Again in 4 Hours.")
        return true
    end
 
 
    local participants, pull_player = {}, false
    for i = 1, #player_positions do
        local fromPos = player_positions[i].fromPos
        local tile = Tile(fromPos)
        if not tile then
            print(">> ERROR: Earl Osam tile does not exist for Position(" .. fromPos.x .. ", " .. fromPos.y .. ", " .. fromPos.z .. ").")
            return player:sendCancelMessage("There is an issue with this quest. Please contact an administrator.")
        end
 
        local creature = tile:getBottomCreature()
        if creature then
            local participant = creature:getPlayer()
            if not participant then
                return player:sendCancelMessage(participant:getName() .. " is not a valid participant.")
            end
 
            if participant:getLevel() < config.level_req then
                return player:sendCancelMessage(participant:getName() .. " is not the required level.")
            end
 
            if participant.uid == player.uid then
                pull_player = true
            end
 
            participants[#participants + 1] = {participant = participant, toPos = player_positions[i].toPos}
        end
    end
 
    if #participants < config.min_players then
        return player:sendCancelMessage("You do not have the required amount of participants.")
    end
 
    if not pull_player then
        return player:sendCancelMessage("You are in the wrong position.")
    end
 
    for i = 1, #monsters do
        local toPos = monsters[i].pos
        if not Tile(toPos) then
            print(">> ERROR: Earl Osam tile does not exist for Position(" .. toPos.x .. ", " .. toPos.y .. ", " .. toPos.z .. ").")
            return player:sendCancelMessage("There is an issue with this quest. Please contact an administrator.")
        end
        removeBoss()
        Game.createMonster(monsters[i].name, monsters[i].pos, false, true)
    end
 
    local cid_array = {}
    for i = 1, #participants do
        participants[i].participant:teleportTo(participants[i].toPos)
        participants[i].toPos:sendMagicEffect(CONST_ME_TELEPORT)
        cid_array[#cid_array + 1] = participants[i].participant.uid
        player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You have 20 minutes to kill and loot this boss. Otherwise you will lose that chance and will be kicked out.")
    end
 
    item:transform(config.pulled_id)
    player:setStorageValue(config.cooldown_storage, os.time() + config.cooldown)
    addEvent(doResetTheBossDukeKrule, config.duration * 60 * 2000,  toPosition, cid_array)
    return true
end

lever:uid(31033)
lever:register()


I was trying editing this to many times... thanks to @Mateus Robeerto for helping me out with this.

I am using canary based engine on 13.20 client.

Thanks in advance.

edit: or I just do not understand this option and how to add it properly.

Lua:
local function removeBoss()

local specs, spec = Game.getSpectators(Position(2431, 2607, 97, false, false, 3, 3, 3, 3)

    for j = 1, #specs do

        spec = specs[j]

        if spec:getName():lower() == 'Angry Demon' then

            spec:remove()

        end

    end

end
 

Attachments

Last edited:
Back
Top