SabrehavenServer/data/talkactions/scripts/serpentine_tower_event.lua
2020-03-20 00:17:07 +02:00

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.