From 329172f96a1d80da7963755bc9a91972a643cfc5 Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 14 Feb 2024 00:19:45 -0300 Subject: [PATCH 1/5] feat: implement monster respawn in Grimvale - Adds logic for monster respawn in a specific area - Day-based configuration to determine which monsters to respawn - Event registered to occur at server startup Lua code format - (Stylua) revert rashid spawn --- .../globalevents/others/raids_schedule.lua | 55 ++++++++++++++++ .../globalevents/spawn/grimvale_respawn.lua | 59 ----------------- .../scripts/globalevents/spawn/mawhawk.lua | 18 ----- .../scripts/globalevents/spawn/raids.lua | 65 ------------------- .../spawn/thawing_dragon_lord.lua | 17 ----- .../scripts/globalevents/spawn/tyrn.lua | 18 ----- .../world_changes/grimvale_respawn_event.lua | 48 ++++++++++++++ 7 files changed, 103 insertions(+), 177 deletions(-) create mode 100644 data-otservbr-global/scripts/globalevents/others/raids_schedule.lua delete mode 100644 data-otservbr-global/scripts/globalevents/spawn/grimvale_respawn.lua delete mode 100644 data-otservbr-global/scripts/globalevents/spawn/mawhawk.lua delete mode 100644 data-otservbr-global/scripts/globalevents/spawn/raids.lua delete mode 100644 data-otservbr-global/scripts/globalevents/spawn/thawing_dragon_lord.lua delete mode 100644 data-otservbr-global/scripts/globalevents/spawn/tyrn.lua create mode 100644 data-otservbr-global/scripts/world_changes/grimvale_respawn_event.lua 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..5dfb5e7b5e9 --- /dev/null +++ b/data-otservbr-global/scripts/globalevents/others/raids_schedule.lua @@ -0,0 +1,55 @@ +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 + return true + end + + 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 + 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..0a72db503a7 --- /dev/null +++ b/data-otservbr-global/scripts/world_changes/grimvale_respawn_event.lua @@ -0,0 +1,48 @@ +local grimvaleConfig = { + position = { fromPosition = Position(33330, 31670, 7), toPosition = Position(33350, 31690, 7) }, + spawnDay = 13, + currentDay = tonumber(os.date("%d")), + monsterList = {}, +} + +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 + return + end + end + end + end +end + +local grimvaleRespawnEvent = GlobalEvent("GrimvaleRespawnEvent") + +function grimvaleRespawnEvent.onStartup() + if grimvaleConfig.currentDay == grimvaleConfig.spawnDay then + grimvaleConfig.monsterList = { "wereboar", "werebadger" } + else + grimvaleConfig.monsterList = { "bandit", "badger", "blue butterfly", "yellow butterfly" } + end + + spawnMonsters(grimvaleConfig.monsterList) + return true +end + +grimvaleRespawnEvent:register() From a86092dc9905947296857e8871c74f74ea03ec88 Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 14 Feb 2024 12:54:49 -0300 Subject: [PATCH 2/5] resolve conversation --- .../globalevents/others/raids_schedule.lua | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/data-otservbr-global/scripts/globalevents/others/raids_schedule.lua b/data-otservbr-global/scripts/globalevents/others/raids_schedule.lua index 5dfb5e7b5e9..be6070d857a 100644 --- a/data-otservbr-global/scripts/globalevents/others/raids_schedule.lua +++ b/data-otservbr-global/scripts/globalevents/others/raids_schedule.lua @@ -37,15 +37,13 @@ function spawnRaidsEvent.onThink(interval, lastExecution, thinkInterval) raidsToSpawn[#raidsToSpawn + 1] = raidSchedule[currentDate] end - if #raidsToSpawn == 0 then - return true - end - - for i = 1, #raidsToSpawn do - local currentRaidSchedule = raidsToSpawn[i][getRealTime()] - if currentRaidSchedule and not currentRaidSchedule.alreadyExecuted then - Game.startRaid(currentRaidSchedule.raidName) - currentRaidSchedule.alreadyExecuted = true + 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 From 8648dc81002b59d128caee2bbd42807507182de3 Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 14 Feb 2024 12:57:01 -0300 Subject: [PATCH 3/5] remove unsed files --- data-otservbr-global/raids/darashia/tyrn.xml | 7 ------- data-otservbr-global/raids/roshamuul/mawhawk.xml | 6 ------ 2 files changed, 13 deletions(-) delete mode 100644 data-otservbr-global/raids/darashia/tyrn.xml delete mode 100644 data-otservbr-global/raids/roshamuul/mawhawk.xml 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 @@ - - - - - - From 4048e5fe708c1577b6d46b7dfaa1365a90abad57 Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 14 Feb 2024 22:11:41 -0300 Subject: [PATCH 4/5] resolve conversation --- .../scripts/world_changes/grimvale_respawn_event.lua | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/data-otservbr-global/scripts/world_changes/grimvale_respawn_event.lua b/data-otservbr-global/scripts/world_changes/grimvale_respawn_event.lua index 0a72db503a7..b7d406c2f99 100644 --- a/data-otservbr-global/scripts/world_changes/grimvale_respawn_event.lua +++ b/data-otservbr-global/scripts/world_changes/grimvale_respawn_event.lua @@ -1,8 +1,6 @@ local grimvaleConfig = { position = { fromPosition = Position(33330, 31670, 7), toPosition = Position(33350, 31690, 7) }, spawnDay = 13, - currentDay = tonumber(os.date("%d")), - monsterList = {}, } local function createRandomMonster(position, availableMonsters) @@ -35,13 +33,7 @@ end local grimvaleRespawnEvent = GlobalEvent("GrimvaleRespawnEvent") function grimvaleRespawnEvent.onStartup() - if grimvaleConfig.currentDay == grimvaleConfig.spawnDay then - grimvaleConfig.monsterList = { "wereboar", "werebadger" } - else - grimvaleConfig.monsterList = { "bandit", "badger", "blue butterfly", "yellow butterfly" } - end - - spawnMonsters(grimvaleConfig.monsterList) + spawnMonsters(grimvaleConfig.spawnDay == tonumber(os.date("%d")) and { "wereboar", "werebadger" } or { "bandit", "badger", "blue butterfly", "yellow butterfly" }) return true end From 3a17c05e9b5509dffb634c55e712d0c0abbf4410 Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 14 Feb 2024 23:10:31 -0300 Subject: [PATCH 5/5] resolve conversation --- .../scripts/world_changes/grimvale_respawn_event.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data-otservbr-global/scripts/world_changes/grimvale_respawn_event.lua b/data-otservbr-global/scripts/world_changes/grimvale_respawn_event.lua index b7d406c2f99..b1cea5504e9 100644 --- a/data-otservbr-global/scripts/world_changes/grimvale_respawn_event.lua +++ b/data-otservbr-global/scripts/world_changes/grimvale_respawn_event.lua @@ -23,7 +23,7 @@ local function spawnMonsters(monstersToSpawn) 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 - return + break end end end