mirror of
https://github.com/ErikasKontenis/SabrehavenServer.git
synced 2025-04-30 09:39:20 +02:00
279 lines
8.6 KiB
Lua
279 lines
8.6 KiB
Lua
local area = {
|
|
fromPos = {x = 33140, y = 32859, z = 7},
|
|
toPos = {x = 33155, y = 32874, z = 4}
|
|
}
|
|
|
|
local availablePlayerTeleportPositions = {
|
|
Position(33139, 32859, 7),
|
|
Position(33139, 32860, 7),
|
|
Position(33139, 32861, 7),
|
|
Position(33139, 32862, 7),
|
|
Position(33139, 32863, 7),
|
|
Position(33139, 32864, 7),
|
|
Position(33139, 32865, 7),
|
|
Position(33139, 32866, 7),
|
|
Position(33139, 32867, 7),
|
|
Position(33139, 32868, 7),
|
|
Position(33139, 32869, 7),
|
|
Position(33139, 32870, 7),
|
|
Position(33139, 32871, 7),
|
|
Position(33139, 32872, 7),
|
|
Position(33139, 32873, 7),
|
|
Position(33139, 32874, 7),
|
|
Position(33139, 32875, 7),
|
|
Position(33140, 32875, 7),
|
|
Position(33143, 32875, 7),
|
|
Position(33144, 32875, 7),
|
|
Position(33146, 32875, 7),
|
|
Position(33148, 32875, 7),
|
|
Position(33149, 32875, 7),
|
|
Position(33150, 32875, 7),
|
|
Position(33155, 32875, 7),
|
|
Position(33156, 32875, 7),
|
|
Position(33156, 32874, 7),
|
|
Position(33156, 32873, 7),
|
|
Position(33156, 32872, 7),
|
|
Position(33156, 32871, 7),
|
|
Position(33156, 32870, 7),
|
|
Position(33156, 32869, 7),
|
|
Position(33156, 32868, 7),
|
|
Position(33156, 32867, 7),
|
|
Position(33156, 32866, 7),
|
|
Position(33156, 32865, 7),
|
|
Position(33156, 32864, 7),
|
|
Position(33156, 32863, 7),
|
|
Position(33156, 32862, 7),
|
|
Position(33156, 32861, 7),
|
|
Position(33156, 32860, 7),
|
|
Position(33156, 32859, 7),
|
|
Position(33156, 32858, 7)
|
|
}
|
|
|
|
local downstairsIds = {451, 466, 465, 467}
|
|
|
|
local earthquakeEffects = {CONST_ME_POFF, CONST_ME_EXPLOSIONHIT, CONST_ME_EXPLOSIONAREA, CONST_ME_FIREAREA, CONST_ME_ENERGYHIT, CONST_ME_BLOCKHIT}
|
|
|
|
function onSay(player, words, param)
|
|
if not player:getGroup():getAccess() then
|
|
return true
|
|
end
|
|
|
|
if player:getAccountType() < ACCOUNT_TYPE_GOD then
|
|
return false
|
|
end
|
|
|
|
teleportPlayersToSerpentineTower()
|
|
addEvent(wave1, 20000)
|
|
addEvent(wave2, 40000)
|
|
addEvent(wave3, 100000)
|
|
addEvent(wave4, 160000)
|
|
addEvent(wave5, 170000)
|
|
addEvent(wave6, 175000)
|
|
addEvent(wave7, 180000)
|
|
addEvent(wave8, 195000)
|
|
addEvent(wave9, 205000)
|
|
|
|
return false
|
|
end
|
|
|
|
function teleportPlayersToSerpentineTower()
|
|
for _, player in ipairs(Game.getPlayers()) do
|
|
player:setStorageValue(17596, 1)
|
|
local teleportPosition = availablePlayerTeleportPositions[math.random(#availablePlayerTeleportPositions)]
|
|
player:teleportTo(teleportPosition)
|
|
player:getPosition():sendMonsterSay("accersi " .. player:getName())
|
|
end
|
|
end
|
|
|
|
function wave1()
|
|
broadcastMessage("LOOK AT MY EYES! ... THE EYES! ... LET ME OUT! ...", MESSAGE_STATUS_WARNING)
|
|
earthquakeTower(area.fromPos, area.toPos)
|
|
end
|
|
|
|
function wave2()
|
|
broadcastMessage("Ankrahmun: The Academy of Magic Arts are reporting that Ankrahmun city is experiencing issues! Please stay safe in the protection zones, NOW!", MESSAGE_STATUS_WARNING)
|
|
earthquakeTower(area.fromPos, area.toPos)
|
|
end
|
|
|
|
function wave3()
|
|
broadcastMessage("Ankrahmun: All Sabrehaven PEOPLE. THIS IS NOT A PRACTICE. Leave our city NOW!", MESSAGE_STATUS_WARNING)
|
|
earthquakeTower(area.fromPos, area.toPos)
|
|
end
|
|
|
|
function wave4()
|
|
broadcastMessage("THE EYES ARE EVERYWHERE!", MESSAGE_STATUS_WARNING)
|
|
earthquakeTower(area.fromPos, area.toPos)
|
|
end
|
|
|
|
function wave5()
|
|
Position(33149, 32868, 7):sendMonsterSay("accersi Tothdral")
|
|
local tothdral = Creature("Tothdral")
|
|
tothdral:teleportTo(Position(33149, 32867, 7))
|
|
tothdral:getPosition():sendMagicEffect(CONST_ME_TELEPORT)
|
|
end
|
|
|
|
function wave6()
|
|
Position(33147, 32870, 7):sendMonsterSay("The Serpentine Tower Secret Is Real!")
|
|
Position(33151, 32870, 7):sendMonsterSay("The Serpentine Tower Secret Is Real!")
|
|
Position(33151, 32866, 7):sendMonsterSay("The Serpentine Tower Secret Is Real!")
|
|
Position(33147, 32866, 7):sendMonsterSay("The Serpentine Tower Secret Is Real!")
|
|
|
|
local tile = Tile(Position(33149, 32868, 7))
|
|
if tile then
|
|
local obelisk = tile:getItemById(2199)
|
|
if obelisk ~= nil then
|
|
obelisk:getPosition():sendMagicEffect(CONST_ME_TELEPORT)
|
|
obelisk:remove()
|
|
local hole = Game.createItem(5731, 1, tile:getPosition())
|
|
hole:setAttribute(ITEM_ATTRIBUTE_MOVEMENTID, 17596)
|
|
end
|
|
end
|
|
end
|
|
|
|
function wave7()
|
|
Position(33147, 32870, 7):sendMonsterSay("The Serpentine Tower Secret Is Real!")
|
|
Position(33151, 32870, 7):sendMonsterSay("The Serpentine Tower Secret Is Real!")
|
|
Position(33151, 32866, 7):sendMonsterSay("The Serpentine Tower Secret Is Real!")
|
|
Position(33147, 32866, 7):sendMonsterSay("The Serpentine Tower Secret Is Real!")
|
|
Position(33149, 32868, 7):sendMonsterSay("LET ME OUT!")
|
|
end
|
|
|
|
function wave8()
|
|
broadcastMessage("Ankrahmun: WE ARE LOST FOREVER!", MESSAGE_STATUS_WARNING)
|
|
for xx = area.fromPos.x, area.toPos.x do
|
|
for yy = area.fromPos.y, area.toPos.y do
|
|
local position = Position(xx, yy, 7)
|
|
local tile = Tile(position)
|
|
if tile then
|
|
local ground = tile:getGround()
|
|
if ground ~= nil and ground:getId() == 231 then
|
|
ground:transform(2144)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
Game.createItem(2199, 1, Position(33140, 32859, 7))
|
|
Position(33140, 32859, 7):sendMagicEffect(CONST_ME_TELEPORT)
|
|
Game.createItem(2199, 1, Position(33140, 32874, 7))
|
|
Position(33140, 32874, 7):sendMagicEffect(CONST_ME_TELEPORT)
|
|
Game.createItem(2199, 1, Position(33155, 32874, 7))
|
|
Position(33155, 32874, 7):sendMagicEffect(CONST_ME_TELEPORT)
|
|
Game.createItem(2199, 1, Position(33155, 32859, 7))
|
|
Position(33155, 32859, 7):sendMagicEffect(CONST_ME_TELEPORT)
|
|
Game.createItem(2199, 1, Position(33149, 32863, 7))
|
|
Position(33149, 32863, 7):sendMagicEffect(CONST_ME_TELEPORT)
|
|
Game.createItem(2199, 1, Position(33153, 32866, 7))
|
|
Position(33153, 32866, 7):sendMagicEffect(CONST_ME_TELEPORT)
|
|
Game.createItem(2199, 1, Position(33153, 32871, 7))
|
|
Position(33153, 32871, 7):sendMagicEffect(CONST_ME_TELEPORT)
|
|
Game.createItem(2199, 1, Position(33149, 32873, 7))
|
|
Position(33149, 32873, 7):sendMagicEffect(CONST_ME_TELEPORT)
|
|
Game.createItem(2199, 1, Position(33145, 32871, 7))
|
|
Position(33145, 32871, 7):sendMagicEffect(CONST_ME_TELEPORT)
|
|
Game.createItem(2199, 1, Position(33145, 32866, 7))
|
|
Position(33145, 32866, 7):sendMagicEffect(CONST_ME_TELEPORT)
|
|
end
|
|
|
|
function wave9()
|
|
broadcastMessage("Ankrahmun: PROTEGO MAXIMA!", MESSAGE_STATUS_WARNING)
|
|
|
|
for _, player in ipairs(Game.getPlayers()) do
|
|
player:teleportTo(player:getTown():getTemplePosition())
|
|
end
|
|
end
|
|
|
|
function earthquakeTower(frompos, topos)
|
|
for zz = frompos.z, topos.z, -1 do
|
|
if zz == 6 then
|
|
topos.x = topos.x + 1
|
|
topos.y = topos.y + 1
|
|
end
|
|
|
|
for xx = frompos.x, topos.x do
|
|
for yy = frompos.y, topos.y do
|
|
local position = Position(xx, yy, zz)
|
|
removeFloorItems(position)
|
|
copyHigherFloorItems(position)
|
|
end
|
|
end
|
|
|
|
if zz == 6 then
|
|
topos.x = topos.x - 1
|
|
topos.y = topos.y - 1
|
|
end
|
|
end
|
|
end
|
|
|
|
function removeFloorItems(position)
|
|
local tile = Tile(position)
|
|
if tile then
|
|
-- If any creature is in area then teleport it to safe zone to properly work with tile items
|
|
local creature = tile:getTopCreature()
|
|
if creature then
|
|
local teleportPosition = availablePlayerTeleportPositions[math.random(#availablePlayerTeleportPositions)]
|
|
creature:teleportTo(teleportPosition)
|
|
creature:getPosition():sendMonsterSay("The Gods Protecting You!")
|
|
Game.sendMagicEffect(teleportPosition, 11)
|
|
if creature:isPlayer() then
|
|
if creature:getStorageValue(17596) ~= 2 then
|
|
creature:setStorageValue(17596, 2)
|
|
end
|
|
end
|
|
end
|
|
|
|
local currentFloorItem = tile:getItemByType(0)
|
|
while currentFloorItem ~= nil do
|
|
currentFloorItem:remove()
|
|
currentFloorItem = tile:getItemByType(0)
|
|
end
|
|
|
|
local items = tile:getItems()
|
|
if items ~= nil then
|
|
for _, item in pairs(items) do
|
|
item:remove()
|
|
end
|
|
end
|
|
|
|
-- Create sand floor only for ground level
|
|
if position.z == 7 then
|
|
Game.createTile(position)
|
|
Game.createItem(231, 1, position)
|
|
end
|
|
end
|
|
end
|
|
|
|
function copyHigherFloorItems(position)
|
|
local higherFloorPosition = {x = position.x, y = position.y, z = position.z - 1}
|
|
local tile = Tile(higherFloorPosition)
|
|
if tile then
|
|
local higherFloorItem = tile:getItemByType(0)
|
|
while(higherFloorItem ~= nil) do
|
|
if position.z ~= 7 or isInArray(downstairsIds, higherFloorItem:getId()) == false then
|
|
Game.createItem(higherFloorItem:getId(), 1, position)
|
|
end
|
|
|
|
higherFloorItem:remove()
|
|
higherFloorItem = tile:getItemByType(0)
|
|
end
|
|
|
|
local items = tile:getItems()
|
|
if items ~= nil then
|
|
for _, item in pairs(items) do
|
|
if position.z ~= 7 or isInArray(downstairsIds, item:getId()) == false then
|
|
Game.createItem(item:getId(), 1, position)
|
|
end
|
|
|
|
item:remove()
|
|
end
|
|
end
|
|
|
|
local effectRandomness = math.random(5)
|
|
if effectRandomness == 5 then
|
|
local earthquakeEffect = earthquakeEffects[math.random(#earthquakeEffects)]
|
|
tile:getPosition():sendMagicEffect(earthquakeEffect)
|
|
end
|
|
end
|
|
end
|
|
|
|
-- TODO: Implement that bitch npc is busy and says that I don't understand what is happening. The Academy of Magic Arts are not commenting the current situation. |