diff --git a/data-otservbr-global/raids/darashia/tyrn.xml b/data-otservbr-global/raids/darashia/tyrn.xml
deleted file mode 100644
index 21b39dda549..00000000000
--- a/data-otservbr-global/raids/darashia/tyrn.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/data-otservbr-global/raids/roshamuul/mawhawk.xml b/data-otservbr-global/raids/roshamuul/mawhawk.xml
deleted file mode 100644
index db48081d57a..00000000000
--- a/data-otservbr-global/raids/roshamuul/mawhawk.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/data-otservbr-global/scripts/globalevents/others/raids_schedule.lua b/data-otservbr-global/scripts/globalevents/others/raids_schedule.lua
new file mode 100644
index 00000000000..be6070d857a
--- /dev/null
+++ b/data-otservbr-global/scripts/globalevents/others/raids_schedule.lua
@@ -0,0 +1,53 @@
+local raidSchedule = {
+ ["Tuesday"] = {
+ ["16:00"] = { raidName = "Midnight Panther" },
+ },
+ ["Wednesday"] = {
+ ["12:00"] = { raidName = "Draptor" },
+ },
+ ["Thursday"] = {
+ ["19:00"] = { raidName = "Undead Cavebear" },
+ },
+ ["Friday"] = {
+ ["06:00"] = { raidName = "Titanica" },
+ },
+ ["Saturday"] = {
+ ["20:00"] = { raidName = "Draptor" },
+ },
+ ["Sunday"] = {
+ ["15:00"] = { raidName = "Midnight Panther" },
+ ["13:00"] = { raidName = "Orc Backpack" },
+ },
+ ["31/10"] = {
+ ["16:00"] = { raidName = "Halloween Hare" },
+ },
+}
+
+local spawnRaidsEvent = GlobalEvent("SpawnRaidsEvent")
+
+function spawnRaidsEvent.onThink(interval, lastExecution, thinkInterval)
+ local currentDayOfWeek, currentDate = os.date("%A"), getRealDate()
+ local raidsToSpawn = {}
+
+ if raidSchedule[currentDayOfWeek] then
+ raidsToSpawn[#raidsToSpawn + 1] = raidSchedule[currentDayOfWeek]
+ end
+
+ if raidSchedule[currentDate] then
+ raidsToSpawn[#raidsToSpawn + 1] = raidSchedule[currentDate]
+ end
+
+ if #raidsToSpawn > 0 then
+ for i = 1, #raidsToSpawn do
+ local currentRaidSchedule = raidsToSpawn[i][getRealTime()]
+ if currentRaidSchedule and not currentRaidSchedule.alreadyExecuted then
+ Game.startRaid(currentRaidSchedule.raidName)
+ currentRaidSchedule.alreadyExecuted = true
+ end
+ end
+ end
+ return true
+end
+
+spawnRaidsEvent:interval(60000)
+spawnRaidsEvent:register()
diff --git a/data-otservbr-global/scripts/globalevents/spawn/grimvale_respawn.lua b/data-otservbr-global/scripts/globalevents/spawn/grimvale_respawn.lua
deleted file mode 100644
index aff3f6e3fa0..00000000000
--- a/data-otservbr-global/scripts/globalevents/spawn/grimvale_respawn.lua
+++ /dev/null
@@ -1,59 +0,0 @@
-local config = {
- position = { fromPosition = Position(33330, 31670, 7), toPosition = Position(33350, 31690, 7) },
-}
-local spawnDay = 13
-local currentDay = os.date("%d")
-local monsters = {}
-
-function Game.createRandom(position)
- local tile = Tile(position)
- if not tile or Tile(position):getItemById(486) then
- return false
- end
-
- local ground = tile:getGround()
- if not ground or ground:hasProperty(CONST_PROP_BLOCKSOLID) or tile:getTopCreature() then
- return false
- end
- local monsterName = monsters[math.random(#monsters)]
- local monster = Game.createMonster(monsterName, position)
- if monster then
- monster:setSpawnPosition()
- monster:remove()
- end
- return true
-end
-
-local grimvaleRespawn = GlobalEvent("grimvale respawn")
-function grimvaleRespawn.onStartup()
- if spawnDay == tonumber(currentDay) then
- table.insert(monsters, "wereboar")
- table.insert(monsters, "werebadger")
- for x = config.position.fromPosition.x, config.position.toPosition.x do
- for y = config.position.fromPosition.y, config.position.toPosition.y do
- if math.random(1000) >= 983 then
- if Game.createRandom(Position(x, y, 7)) then
- return
- end
- end
- end
- end
- else
- table.insert(monsters, "bandit")
- table.insert(monsters, "badger")
- table.insert(monsters, "blue butterfly")
- table.insert(monsters, "yellow butterfly")
- for x = config.position.fromPosition.x, config.position.toPosition.x do
- for y = config.position.fromPosition.y, config.position.toPosition.y do
- if math.random(1000) >= 983 then
- if Game.createRandom(Position(x, y, 7)) then
- return
- end
- end
- end
- end
- end
- return true
-end
-
-grimvaleRespawn:register()
diff --git a/data-otservbr-global/scripts/globalevents/spawn/mawhawk.lua b/data-otservbr-global/scripts/globalevents/spawn/mawhawk.lua
deleted file mode 100644
index e34657d211c..00000000000
--- a/data-otservbr-global/scripts/globalevents/spawn/mawhawk.lua
+++ /dev/null
@@ -1,18 +0,0 @@
-local config = {
- monsterName = "Mawhawk",
- bossPosition = Position(33703, 32461, 7),
- centerPosition = Position(33703, 32461, 7),
- rangeX = 50,
- rangeY = 50,
-}
-
-local mawhawk = GlobalEvent("mawhawk")
-function mawhawk.onThink(interval, lastExecution)
- if not checkBoss(config.centerPosition, config.rangeX, config.rangeY, config.monsterName, config.bossPosition) then
- addEvent(Game.broadcastMessage, 150, "Beware! Mawhawk!", MESSAGE_EVENT_ADVANCE)
- end
- return true
-end
-
-mawhawk:interval(10 * 60 * 60 * 1000) -- spawns every 10 hours
-mawhawk:register()
diff --git a/data-otservbr-global/scripts/globalevents/spawn/raids.lua b/data-otservbr-global/scripts/globalevents/spawn/raids.lua
deleted file mode 100644
index 83d065349dd..00000000000
--- a/data-otservbr-global/scripts/globalevents/spawn/raids.lua
+++ /dev/null
@@ -1,65 +0,0 @@
-local raids = {
- --Terça-Feira
- ["Tuesday"] = {
- ["16:00"] = { raidName = "Midnight Panther" },
- },
-
- --Quarta-Feira
- ["Wednesday"] = {
- ["12:00"] = { raidName = "Draptor" },
- },
-
- --Quinta-Feira
- ["Thursday"] = {
- ["19:00"] = { raidName = "Undead Cavebear" },
- },
-
- --Sexta-feira
- ["Friday"] = {
- ["06:00"] = { raidName = "Titanica" },
- },
-
- --Sábado
- ["Saturday"] = {
- ["20:00"] = { raidName = "Draptor" },
- },
-
- --Domingo
- ["Sunday"] = {
- ["15:00"] = { raidName = "Midnight Panther" },
- ["13:00"] = { raidName = "Orc Backpack" },
- },
-
- -- By date (Day/Month)
- ["31/10"] = {
- ["16:00"] = { raidName = "Halloween Hare" },
- },
-}
-
-local spawnRaids = GlobalEvent("spawn raids")
-function spawnRaids.onThink(interval, lastExecution, thinkInterval)
- local day, date = os.date("%A"), getRealDate()
-
- local raidDays = {}
- if raids[day] then
- raidDays[#raidDays + 1] = raids[day]
- end
- if raids[date] then
- raidDays[#raidDays + 1] = raids[date]
- end
- if #raidDays == 0 then
- return true
- end
-
- for i = 1, #raidDays do
- local settings = raidDays[i][getRealTime()]
- if settings and not settings.alreadyExecuted then
- Game.startRaid(settings.raidName)
- settings.alreadyExecuted = true
- end
- end
- return true
-end
-
-spawnRaids:interval(60000)
-spawnRaids:register()
diff --git a/data-otservbr-global/scripts/globalevents/spawn/thawing_dragon_lord.lua b/data-otservbr-global/scripts/globalevents/spawn/thawing_dragon_lord.lua
deleted file mode 100644
index eecbd29022b..00000000000
--- a/data-otservbr-global/scripts/globalevents/spawn/thawing_dragon_lord.lua
+++ /dev/null
@@ -1,17 +0,0 @@
-local config = {
- monsterName = "Thawing Dragon Lord",
- bossPosition = Position(33361, 31316, 5),
- centerPosition = Position(33361, 31316, 5),
- rangeX = 50,
- rangeY = 50,
-}
-
-local thawingDragonLord = GlobalEvent("thawing dragon lord")
-
-function thawingDragonLord.onThink(interval, lastExecution)
- checkBoss(config.centerPosition, config.rangeX, config.rangeY, config.monsterName, config.bossPosition)
- return true
-end
-
-thawingDragonLord:interval(900000)
-thawingDragonLord:register()
diff --git a/data-otservbr-global/scripts/globalevents/spawn/tyrn.lua b/data-otservbr-global/scripts/globalevents/spawn/tyrn.lua
deleted file mode 100644
index 47e7756f2ba..00000000000
--- a/data-otservbr-global/scripts/globalevents/spawn/tyrn.lua
+++ /dev/null
@@ -1,18 +0,0 @@
-local config = {
- monsterName = "Tyrn",
- bossPosition = Position(33056, 32393, 14),
- centerPosition = Position(33056, 32393, 14),
- rangeX = 50,
- rangeY = 50,
-}
-
-local tyrn = GlobalEvent("tyrn")
-function tyrn.onThink(interval, lastExecution)
- if not checkBoss(config.centerPosition, config.rangeX, config.rangeY, config.monsterName, config.bossPosition) then
- addEvent(Game.broadcastMessage, 150, "Beware of Tyrn!", MESSAGE_EVENT_ADVANCE)
- end
- return true
-end
-
-tyrn:interval(9 * 60 * 60 * 1000) -- spawns every 9 hours
-tyrn:register()
diff --git a/data-otservbr-global/scripts/world_changes/grimvale_respawn_event.lua b/data-otservbr-global/scripts/world_changes/grimvale_respawn_event.lua
new file mode 100644
index 00000000000..b1cea5504e9
--- /dev/null
+++ b/data-otservbr-global/scripts/world_changes/grimvale_respawn_event.lua
@@ -0,0 +1,40 @@
+local grimvaleConfig = {
+ position = { fromPosition = Position(33330, 31670, 7), toPosition = Position(33350, 31690, 7) },
+ spawnDay = 13,
+}
+
+local function createRandomMonster(position, availableMonsters)
+ local tile = Tile(position)
+ if not tile or tile:getItemById(486) or tile:hasProperty(CONST_PROP_BLOCKSOLID) or tile:getTopCreature() then
+ return false
+ end
+
+ local monsterName = availableMonsters[math.random(#availableMonsters)]
+ local monster = Game.createMonster(monsterName, position)
+ if monster then
+ monster:setSpawnPosition()
+ monster:remove()
+ end
+ return true
+end
+
+local function spawnMonsters(monstersToSpawn)
+ for x = grimvaleConfig.position.fromPosition.x, grimvaleConfig.position.toPosition.x do
+ for y = grimvaleConfig.position.fromPosition.y, grimvaleConfig.position.toPosition.y do
+ if math.random(1000) >= 983 then
+ if createRandomMonster(Position(x, y, 7), monstersToSpawn) then
+ break
+ end
+ end
+ end
+ end
+end
+
+local grimvaleRespawnEvent = GlobalEvent("GrimvaleRespawnEvent")
+
+function grimvaleRespawnEvent.onStartup()
+ spawnMonsters(grimvaleConfig.spawnDay == tonumber(os.date("%d")) and { "wereboar", "werebadger" } or { "bandit", "badger", "blue butterfly", "yellow butterfly" })
+ return true
+end
+
+grimvaleRespawnEvent:register()