RevScript Arena Monster/Boss System

Alex

Miembro del equipo
Webdesigner
LV
58
 
Awards
38
Hola a todos

Hoy les comparto el sistema de Arena, Dungeon o como le quieran llamar,
Es un sistema basado en el cual en un determinado Sitio, ya puede ser una Spawn Entera o en todo el mapa tibia si quieren, pero seria muy grande como para encontrar los monsters/bosses,

Deben de anadir la ActionID en el lever, al termina las Waves, que pueden añadir mas y mas monsters si quieren, aparece el Teleport en el sitio de la palanca,

Video password: lepiigortv

Video link:

Código:
local event = {
    monsters = {
        {"demon", "infernal demon", "branchy crawler"},                  -- wave 1
        {"many faces", "cloak of terror", "rotten golem"},   -- wave 2 -- you can add infinite waves.
        {"ferumbras", "the nightmare beast", "the dread maiden"},            -- wave 3
        {"the fear feaster", "drume", "goshnar megalomania"} -- wave final. (boss?)
    },
    spawnArea = {Position(32390, 32189, 7), Position(32402, 32197, 7)}, -- {top_Left_Corner, bottom_Right_Corner}
    leverIds = {1945, 1946}, -- left, right
    leverActionId = 38177,
    teleportTimer = 30, -- how long the teleport stays
    teleportDestination = Position(32396, 32199, 7),

    creatures = {}, -- don't touch
    currentWave = 0 -- don't touch
}

local function verifyEventCreatures()
    if #event.creatures > 0 then
        local creature = nil
        for pid = #event.creatures, 1, -1 do
            creature = Creature(event.creatures[pid][1])
            if not creature then
                table.remove(event.creatures, pid)
            end
        end
    end
end

local function spawnEventCreatures(wave, indexTracker)
    local attempts = 0
    local randomPosition = nil
    local creature = nil
    while attempts < 20 do
        randomPosition = Position(math.random(event.spawnArea[1].x, event.spawnArea[2].x), math.random(event.spawnArea[1].y, event.spawnArea[2].y), math.random(event.spawnArea[1].z, event.spawnArea[2].z))
        creature = Game.createMonster(event.monsters[wave][indexTracker], randomPosition, false, false)
        if not creature then
            tile = Tile(randomPosition)
            if tile and tile:isWalkable() and not Creature(tile:getTopCreature()) then
                creature = Game.createMonster(event.monsters[wave][indexTracker], randomPosition, false, true)
            end
        end
        if creature then
            indexTracker = indexTracker + 1
            table.insert(event.creatures, {creature:getId()})
            break
        end
        attempts = attempts + 1
    end
    if indexTracker <= #event.monsters[wave] then
        addEvent(spawnEventCreatures, 333, wave, indexTracker)
    end
end

local function flopLever(position, leverId, transformTo)
    Tile(position):getItemById(leverId):transform(transformTo)
end

local function removeLever(position, leverId)
    Tile(position):getItemById(leverId):remove()
end

local function createLever(position, leverId, actionId)
    local lever = Game.createItem(leverId, 1, position)
    lever:setActionId(actionId)
end

local function removeMagicForcefield(position)
    Tile(position):getItemById(1387):remove()
end

local function createMagicForcefield(position, destination)
    local magicForcefield = Game.createItem(1387, 1, position)
    magicForcefield:setDestination(destination)
end

local function countDown(timer, position)
    if timer % 5 == 0 and timer ~= 0 then
        for _, creature in pairs(Game.getPlayers()) do
            creature:say(timer, TALKTYPE_MONSTER_SAY, false, nil, position)
            break
        end
    end
    if timer > 0 then
        addEvent(countDown, 1000, timer - 1, position)
    end
end

local function monitorEvent(leverPosition)
    verifyEventCreatures()
    if #event.creatures > 0 then
        addEvent(monitorEvent, 1000, leverPosition)
        return
    end
    addEvent(Position.sendMagicEffect, 500, leverPosition, CONST_ME_POFF)
    addEvent(Position.sendMagicEffect, 1500, leverPosition, CONST_ME_POFF)
    addEvent(createLever, 2500, leverPosition, event.leverIds[1], event.leverActionId)
    addEvent(Position.sendMagicEffect, 2500, leverPosition, CONST_ME_MORTAREA)
end

local function eventManager(leverPosition)
    flopLever(leverPosition, event.leverIds[1], event.leverIds[2])
    addEvent(Position.sendMagicEffect, 500, leverPosition, CONST_ME_POFF)
    addEvent(Position.sendMagicEffect, 1500, leverPosition, CONST_ME_POFF)
    addEvent(removeLever, 2500, leverPosition, event.leverIds[2])
    if event.currentWave + 1 > #event.monsters then
        addEvent(createMagicForcefield, 2500, leverPosition, event.teleportDestination)
        addEvent(countDown, 2500, event.teleportTimer, leverPosition)
        addEvent(removeMagicForcefield, (1000 * event.teleportTimer) + 2500, leverPosition)
        addEvent(createLever, (1000 * event.teleportTimer) + 2500, leverPosition, event.leverIds[1], event.leverActionId)
        addEvent(Position.sendMagicEffect, (1000 * event.teleportTimer) + 2500, leverPosition, CONST_ME_MORTAREA)
        event.creatures = {}
        event.currentWave = 0
        return
    end
    event.currentWave = event.currentWave + 1
    addEvent(Position.sendMagicEffect, 2500, leverPosition, CONST_ME_FIREAREA)
    addEvent(spawnEventCreatures, 5000, event.currentWave, 1)
    addEvent(monitorEvent, 7500, leverPosition)
end


local monsterWaveEvent = Action()

function monsterWaveEvent.onUse(player, item, fromPosition, target, toPosition, isHotkey)
    if item.itemid == event.leverIds[1] then
        eventManager(toPosition)
    end
    return true
end

monsterWaveEvent:aid(event.leverActionId)
monsterWaveEvent:register()
 

Alex

Miembro del equipo
Webdesigner
LV
58
 
Awards
38
se ve interesante que pena que no se pueda reproducir el video T_T
Hola,
Si se puede reproducir, escribe lepiigortv en minúsculas, todo.
Es debido a un Addon que hace que algunas palabras las detecta y las escribe en mayúsculas.
 
Última edición:

Ethaanks123

Miembro
LV
7
 
Awards
6
alex muchas gracias por fin pude crearlo pero ahora me pregunto le falta una parte donde tenga un creanzone que cuando otro jugado intente ir al evento salga la sala limpia sin criaturas ni nada en el suelo como podria agregar eso _?
 

Alex

Miembro del equipo
Webdesigner
LV
58
 
Awards
38
alex muchas gracias por fin pude crearlo pero ahora me pregunto le falta una parte donde tenga un creanzone que cuando otro jugado intente ir al evento salga la sala limpia sin criaturas ni nada en el suelo como podria agregar eso _?
No sabría agregarlo.
Pero en teoría si alguien lo lanza mata a todo , no hay que poner algo muy duro, no es para eso, a menos que el server sea high exp.
 

jackye

Miembro
LV
24
 
Awards
20
alex muchas gracias por fin pude crearlo pero ahora me pregunto le falta una parte donde tenga un creanzone que cuando otro jugado intente ir al evento salga la sala limpia sin criaturas ni nada en el suelo como podria agregar eso _?
Para eso necesitas agregar al script un clean zone para ello es un evento que cuando termine al momento de darle click de nuevo limpie la sala deseas o donde fue creado tu weave

Position(32390, 32189, 7), Position(32402, 32197, 7) --- depende de la pocision de tu respawn
 
Arriba