Untitled

mail@pastecode.io avatar
unknown
lua
a year ago
11 kB
2
Indexable
Never
<config name="ultimatelib"><![CDATA[
USurvival = {
   posi = {x=1489, y=897, z=5}, -- parte esquerda superior da arena
   posf = {x=1503, y=909, z=5}, -- parte direita inferior da arena
   posc = {x=1496, y=903, z=5}, -- onde o player entra na arena
   
   waves = {
   [1] = {monsters = {'dragon', 'dragon lord'}, count = 30, reward = {exp = 0, item = 2148, amount = 1, money = 100}},
   [2] = {monsters = {'dragon lord', 'frost dragon'}, count = 6, reward = {exp = 0, item = 2152, amount = 1, money = 1000}},
   [3] = {monsters = {'hydra', 'serpent spawn'}, count = 10, reward = {exp = 0, item = 2160, amount = 1, money = 10000}},
   },
   exhaust = 1 * 24 * 60 * 60, -- Tempo em segundos ate poder entrar novamente na arena (1 * 24 * 60 * 60 = 1 dia)
   
   final_reward = {item = 2160, amount = 100, exp = 10000, money = 100000},
   
   storage_ex = 607069,
   storage_wave = 607089,
   min_level = 2000,
   posenter = {x=1526,y=899,z=5}, -- posição onde ele transporta o jogador
   tpPos = {x=716, y=1029, z=4}, -- onde o teleport aparece
   limit_Time = 2 -- em minutos -- tempo que o teleport fica aberto
}

function removeBattleTp()
local t = getTileItemById(USurvival.tpPos, 1387).uid
return t > 0 and doRemoveItem(t) and doSendMagicEffect(USurvival.tpPos, CONST_ME_POFF)
end

function CheckEvent(delay)
if delay > 0 and getGlobalStorageValue(USurvival.storage_count) > 0 then
doBroadcastMessage("[BattleField Event] We are waiting "..getGlobalStorageValue(USurvival.storage_count).." players to Battlefield starts", MESSAGE_STATUS_CONSOLE_RED)
elseif delay == 0 and getGlobalStorageValue(USurvival.storage_count) > 0 then
for _, cid in pairs(getPlayersOnline()) do
end
doBroadcastMessage("The event cannot be started because not had enough players.", MESSAGE_STATUS_CONSOLE_RED)
setGlobalStorageValue(USurvival.storage_count, 0)
resetBattle()
removeBattleTp()
end
addEvent(CheckEvent, 60000, delay-1)
end

function isWalkable(pos)-- by Nord / editado por Omega
    if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then
        return false
    elseif isCreature(getTopCreature(pos).uid) then
        return false
    elseif getTileInfo(pos).protection then
        return false
    elseif hasProperty(getThingFromPos(pos).uid, 3) or hasProperty(getThingFromPos(pos).uid, 7) then
        return false
    end
return true
end

function doSpawnMonsters(monsters, pos, radius, limit)
   if not pos.x or not pos.y or not pos.z or not type(monsters) == 'table' then
      return false
   end
      local radius = tonumber(radius)
   if radius > 5 then
      radius = 5
   elseif radius < 2 then
      radius = 2
   end
   if not limit or limit < 1 then
      limit = 1
   elseif limit > radius ^ 2 then
      limit = math.floor((radius*1.5) ^ 2)
   end
   
   local k = 0
   local tries = 0
   repeat
      for x = pos.x - radius, pos.x + radius do
         for y = pos.y - radius, pos.y + radius do
            if isWalkable({x=x, y=y, z=pos.z}) then
               local monster = monsters[math.random(1, #monsters)]
               local chance = math.random(1, 100)
               if k == limit then
                  break
               elseif chance <= 8 and doCreateMonster(monster, {x=x, y=y, z=pos.z}) then
                  k = k + 1
               end
            end
         end
      end
      tries = tries + 1
   until k >= limit or tries >= 500
   return k >= limit and true or false
end

function getPlayersInArea(pos1,pos2)
   local players = {}
   if pos1.x and pos1.y and pos2.x and pos2.y and pos1.z == pos2.z then
      for a = pos1.x, pos2.x do
         for b = pos1.y,pos2.y do
            local pos = {x=a,y=b,z=pos1.z}
            if isPlayer(getTopCreature(pos).uid) then
               table.insert(players,getTopCreature(pos).uid)
            end
         end
      end
      return players
   else
      return false
   end
end   

function getMonstersInArea(pos1,pos2)
   local players = {}
   if pos1.x and pos1.y and pos2.x and pos2.y and pos1.z == pos2.z then
      for a = pos1.x, pos2.x do
         for b = pos1.y,pos2.y do
            local pos = {x=a,y=b,z=pos1.z}
            if isMonster(getTopCreature(pos).uid) then
               table.insert(players,getTopCreature(pos).uid)
            end
         end
      end
      return players
   else
      return false
   end
end

function doCleanArena()
   local monsters = getMonstersInArea(USurvival.posi, USurvival.posf)
   for _, cid in pairs(monsters) do
      doRemoveCreature(cid)
   end
end

function doStartWave(waveID, cid)
   if not isCreature(cid) then return false end
   if USurvival.waves[waveID] then
      wave = USurvival.waves[waveID]
      doSpawnMonsters(wave.monsters, USurvival.posc, 5, wave.count)
      doPlayerSendTextMessage(cid, 21, 'Wave '..waveID..' has started! FIGHT!')
   end
end
]]></config>

<action actionid="4599" event="script" override="yes"><![CDATA[
domodlib('ultimatelib')
function onUse(cid, item)
   if getPlayerStorageValue(cid, USurvival.storage_ex) <= os.time() then
      if #getPlayersInArea(USurvival.posi, USurvival.posf) == 0 then
         doCleanArena()
         doTeleportThing(cid, USurvival.posc)
         doPlayerSendTextMessage(cid, 21, 'The Ultimate Survival will Start in 10 seconds! Be ready to face your destiny!')
         addEvent(doStartWave, 10000, 1, cid)
         setPlayerStorageValue(cid, USurvival.storage_wave, 1)
         setPlayerStorageValue(cid, USurvival.storage_ex, os.time() + USurvival.exhaust)
         if item.itemid % 2 == 1 then
            doTransformItem(item.uid, item.itemid+1)
         else
            doTransformItem(item.uid, item.itemid-1)
         end
      else
         doPlayerSendCancel(cid, 'Someone is already in the arena.')
         doSendMagicEffect(getThingPos(cid), 2)
      end
   else
      local left = getPlayerStorageValue(cid, USurvival.storage_ex) - os.time()
      left = {hour = math.floor(left/3600), minutes = math.ceil((left % 3600)/60)}
      doPlayerSendCancel(cid, 'You have to wait '.. left.hour ..'h and '..left.minutes..'min.')
      doSendMagicEffect(getThingPos(cid), 2)
   end
   return true
end
]]></action>

<event type="login" name="US Login" event="script"><![CDATA[
domodlib('ultimatelib')
function onLogin(cid)
   registerCreatureEvent(cid,'UltimateSurvival1')
   registerCreatureEvent(cid,'UltimateSurvival2')
   if isInArea(getThingPos(cid), USurvival.posi, USurvival.posf) then
      doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))
      doSendMagicEffect(getThingPos(cid), 10)
   end
   return true
end
]]></event>

<event type="kill" name="UltimateSurvival1" event="script"><![CDATA[
domodlib('ultimatelib')
function onKill(cid, target)
   if isInArea(getThingPos(cid), USurvival.posi, USurvival.posf) then
      if #getMonstersInArea(USurvival.posi, USurvival.posf) == 1 then
         local wave = getPlayerStorageValue(cid, USurvival.storage_wave)
         if USurvival.waves[wave+1] then
            setPlayerStorageValue(cid, USurvival.storage_wave, wave + 1)
            addEvent(doStartWave, 5000, wave + 1, cid)
            doPlayerSendTextMessage(cid, 22, 'Congratulations! Next wave will start in 5 seconds!')
         else
            doPlayerSendTextMessage(cid, 22, 'CONGRATULATIONS! YOU HAVE BEATEN THE ULTIMATE SURVIVAL!')
            local reward = USurvival.final_reward
            if reward.item then
               doPlayerAddItem(cid, reward.item, (reward.amount or 1), false)
            end
            if reward.exp then
               doPlayerAddExp(cid, reward.exp)
            end
            if reward.money then
               doPlayerAddMoney(cid, reward.money)
            end
            local medal = doPlayerAddItem(cid, 5785, 1, false)
            if medal then
               doItemSetAttribute(medal, 'description', 'This was awarded to '..getCreatureName(cid)..' for completing the Ultimate Survival.')
               doItemSetAttribute(medal,'name', 'Ultimate Survival Medal')
            end
            doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))
         end
      end
   end
   return true
end

]]></event>

<event type="preparedeath" name="UltimateSurvival2" event="script"><![CDATA[
domodlib('ultimatelib')
function onPrepareDeath(cid, killers)
   if isInArea(getThingPos(cid), USurvival.posi, USurvival.posf) then
      doCreatureAddHealth(cid, getCreatureMaxHealth(cid), 65535, 256, true)
      doRemoveConditions(cid, false)
      doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))
      doPlayerSendTextMessage(cid, 21, 'Too bad, you couldn\'t defeat the Ultimate Survival... Better luck next time.')
      local reward = USurvival.waves[getPlayerStorageValue(cid, USurvival.storage_wave)].reward
      if reward.item then
         doPlayerAddItem(cid, reward.item, reward.amount or 1)
      end
      if reward.exp then
         doPlayerAddExp(cid, reward.exp)
      end
      if reward.money then
         doPlayerAddMoney(cid, reward.money)
      end
      return false
   end
   return true
end
]]></event>

<globalevent name="UltimateSurvival" interval="60000" event="script"><![CDATA[
domodlib('ultimatelib')
function onThink(interval, lastExecution)
USurvivalDays = {
["Sunday"] = {
["16:00"] = {players = 12},
["19:00"] = {players = 12}
},
["Monday"] = {
["16:00"] = {players = 12},
["19:00"] = {players = 12}
},
["Tuesday"] = {
["20:23"] = {players = 12},
["19:00"] = {players = 12}
},
["Wednesday"] = {
["16:00"] = {players = 12},
["19:00"] = {players = 12}
},
["Thursday"] = {
["16:00"] = {players = 12},
["19:00"] = {players = 12}
},
["Friday"] = {
["00:06"] = {players = 2},
["19:00"] = {players = 12}
},
["Saturday"] = {
["00:06"] = {players = 2},
["19:00"] = {players = 12}
},
}
if USurvivalDays[os.date("%A")] then
hours = tostring(os.date("%X")):sub(1, 5)
tb = USurvivalDays[os.date("%A")][hours]
if tb and (tb.players % 2 == 0) then
local tp = doCreateItem(1387, 1, USurvival.tpPos)
doItemSetAttribute(tp, "aid", 48000)
CheckEvent(USurvival.limit_Time)
doBroadcastMessage("The Ultimate Survival Event was opened", MESSAGE_STATUS_CONSOLE_BLUE)
return setGlobalStorageValue(USurvival.storage_count, tb.players)
end
end
return true
end
]]></globalevent>

<globalevent name="Ultimatestart" type="start" event="script"><![CDATA[
domodlib('ultimatelib')
function onStartup()
setGlobalStorageValue(USurvival.posenter.storage, 0)
setGlobalStorageValue(USurvival.storage_count, 0)
return true
end
]]></globalevent>
<movevent type="StepIn" actionid="48000" event="script"><![CDATA[
domodlib('ultimatelib')

function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor)
        if getStorage(Event_Tile_Close) > 0 then
                if getPlayerLevel(cid) < min_level then
                   doTeleportThing(cid, USurvival.posenter, true)
                        doSendMagicEffect(fromPosition,10)
                        doPlayerSendTextMessage(cid,21,"Only players of level "..min_level.." are allowed to pass.")
                else
                        doTeleportThing(cid, USurvival.posenter, true)
                        doSendMagicEffect(posenter,10)
                end
        else
                doTeleportThing(cid,fromPosition,false)
                doSendMagicEffect(fromPosition,10)
                doPlayerSendTextMessage(cid,21,"Come back later, event is closed now.")
        end
return true
end
]]></movevent>
</mod>