From 390aec5d7a388e867a732b65be3e383ade8e9df5 Mon Sep 17 00:00:00 2001 From: cora Date: Mon, 24 Oct 2022 00:10:17 +0200 Subject: [PATCH] Integrate raids with mcl_events --- mods/CORE/mcl_events/init.lua | 2 +- mods/ENVIRONMENT/mcl_raids/init.lua | 167 ++++++++++++++++------------ mods/ENVIRONMENT/mcl_raids/mod.conf | 4 +- 3 files changed, 101 insertions(+), 72 deletions(-) diff --git a/mods/CORE/mcl_events/init.lua b/mods/CORE/mcl_events/init.lua index 62ddd0363..4718dd8df 100644 --- a/mods/CORE/mcl_events/init.lua +++ b/mods/CORE/mcl_events/init.lua @@ -138,7 +138,7 @@ mcl_events.register_event("infestation",{ return true end end, on_stage_begin = function(self) - self.health_max = 1 + self.health_max = 0 for i=1,15 * self.stage do local m = mcl_mobs.spawn(vector.add(self.pos,vector.new(math.random(20)-10,0,math.random(20)-10)),"mobs_mc:silverfish") local l = m:get_luaentity() diff --git a/mods/ENVIRONMENT/mcl_raids/init.lua b/mods/ENVIRONMENT/mcl_raids/init.lua index 2c4adf003..f76c26151 100644 --- a/mods/ENVIRONMENT/mcl_raids/init.lua +++ b/mods/ENVIRONMENT/mcl_raids/init.lua @@ -3,83 +3,74 @@ mcl_raids = {} -- Define the amount of illagers to spawn each wave. -mcl_raids.wave_definitions = { - -- Pillager +local waves = { { - illager_name = "mobs_mc:pillager", - wave_1 = 5, - wave_2 = 4, - wave_3 = 4, - wave_4 = 5, - wave_5 = 5, - extra_wave = 5, + ["mobs_mc:pillager"] = 5, + ["mobs_mc:vindicator"] = 1, }, - -- Vindicator aka Angry Axeman { - illager_name = "mobs_mc:vindicator", - wave_1 = 1, - wave_2 = 3, - wave_3 = 1, - wave_4 = 2, - wave_5 = 5, - extra_wave = 5, + ["mobs_mc:pillager"] = 4, + ["mobs_mc:vindicator"] = 3, }, - --{"mobs_mc:ravager", 0, 0, 1, 0, 0, 2}, - -- Witch { - illager_name = "mobs_mc:witch", - wave_1 = 0, - wave_2 = 0, - wave_3 = 1, - wave_4 = 3, - wave_5 = 1, - extra_wave = 1, + ["mobs_mc:pillager"] = 4, + ["mobs_mc:vindicator"] = 1, + ["mobs_mc:witch"] = 1, + --["mobs_mc:ravager"] = 1, }, - -- Evoker { - illager_name = "mobs_mc:evoker", - wave_1 = 0, - wave_2 = 0, - wave_3 = 0, - wave_4 = 0, - wave_5 = 1, - extra_wave = 1, + ["mobs_mc:pillager"] = 5, + ["mobs_mc:vindicator"] = 2, + ["mobs_mc:witch"] = 3, + }, + { + ["mobs_mc:pillager"] = 5, + ["mobs_mc:vindicator"] = 5, + ["mobs_mc:witch"] = 1, + ["mobs_mc:evoker"] = 1, }, } -mcl_raids.spawn_raid = function(pos, wave) +local extra_wave = { + ["mobs_mc:pillager"] = 5, + ["mobs_mc:vindicator"] = 5, + ["mobs_mc:witch"] = 1, + ["mobs_mc:evoker"] = 1, + --["mobs_mc:ravager"] = 2, +} + +mcl_raids.spawn_raid = function(event) + local pos = event.pos + local wave = event.stage local illager_count = 0 local spawnable = false local r = 32 local n = 12 local i = math.random(1, n) local raid_pos = vector.offset(pos,r * math.cos(((i-1)/n) * (2*math.pi)),0, r * math.sin(((i-1)/n) * (2*math.pi))) - local sn = minetest.find_nodes_in_area_under_air(vector.offset(raid_pos,0,100,0), vector.offset(raid_pos,0,-100,0), {"group:grass_block", "group:grass_block_snow", "group:snow_cover", "group:sand"}) + local sn = minetest.find_nodes_in_area_under_air(vector.offset(raid_pos,-5,-50,-5), vector.offset(raid_pos,5,50,5), {"group:grass_block", "group:grass_block_snow", "group:snow_cover", "group:sand"}) if sn and #sn > 0 then - local spawn_pos = sn[1] + local spawn_pos = sn[math.random(#sn)] if spawn_pos then minetest.log("action", "[mcl_raids] Raid Spawn Position chosen at " .. minetest.pos_to_string(spawn_pos) .. ".") - spawnable = true + event.health_max = 0 + for m,c in pairs(waves[event.stage]) do + for i=1,c do + local mob = mcl_mobs.spawn(spawn_pos,m) + local l = mob:get_luaentity() + if l then + event.health_max = event.health_max + l.health + table.insert(event.mobs,mob) + end + end + end + minetest.log("action", "[mcl_raids] Raid Spawned. Illager Count: " .. #event.mobs .. ".") else minetest.log("action", "[mcl_raids] Raid Spawn Postion not chosen.") end elseif not sn then minetest.log("action", "[mcl_raids] Raid Spawn Position error, no appropriate site found.") end - if spawnable and spawn_pos then - for _, raiddefs in pairs(mcl_raids.wave_definitions) do - local wave_count = raiddefs.wave_1 - for i = 0, wave_count do - local entity = minetest.add_entity(spawn_pos, raiddefs.illager_name) - if entity then - local l = entity:get_luaentity() - l.raidmember = true - illager_count = illager_count + 1 - end - end - end - minetest.log("action", "[mcl_raids] Raid Spawned. Illager Count: " .. illager_count .. ".") - end end mcl_raids.find_villager = function(pos) @@ -115,7 +106,7 @@ mcl_raids.find_village = function(pos) local bed = mcl_raids.find_bed(pos) local villager = mcl_raids.find_villager(pos) local raid_started = false - + if (bed and villager) and raid_started == false then local raid = mcl_raids.spawn_raid(pos, 1) if raid then @@ -136,26 +127,62 @@ end minetest.register_chatcommand("spawn_raid", { privs = { - server = true, + debug = true, }, func = function(name) - local wave = 1 - local player = minetest.get_player_by_name(name) - local pos = player:get_pos() - mcl_raids.spawn_raid(pos, wave) + local m = minetest.get_player_by_name(name):get_meta() + m:set_string("_has_bad_omen","yes") end }) -local etime = 0 -minetest.register_globalstep(function(dtime) - etime = dtime + etime - if etime < 10 then return end - etime = 0 - for _,pl in pairs(minetest.get_connected_players()) do - if pl:get_meta():get_string("_has_bad_omen") then - mcl_raids.find_village(pl:get_pos()) - else - return +mcl_events.register_event("raid",{ + max_stage = 5, + health = 1, + health_max = 1, + cond_start = function(self) + local r = {} + for _,p in pairs(minetest.get_connected_players()) do + local m=p:get_meta() + if m:get_string("_has_bad_omen") == "yes" then + m:set_string("_has_bad_omen","") + table.insert(r,p:get_pos()) + end end - end -end) + if #r > 0 then return r end + end, + on_start = function(self) + self.mobs = {} + self.health_max = 1 + self.health = 0 + end, + cond_progress = function(self) + local m = {} + local h = 0 + for k,o in pairs(self.mobs) do + if o and o:get_pos() then + local l = o:get_luaentity() + h = h + l.health + table.insert(m,o) + end + end + self.mobs = m + self.health = h + self.percent = math.max(0,(self.health / self.health_max ) * 100) + if #m < 1 then + return true end + end, + on_stage_begin = mcl_raids.spawn_raid, + cond_complete = function(self) + local m = {} + for k,o in pairs(self.mobs) do + if o and o:get_pos() then + local l = o:get_luaentity() + table.insert(m,o) + end + end + return self.stage >= self.max_stage and #m < 1 + end, + on_complete = function(self) + --minetest.log("RAID complete") + end, +}) diff --git a/mods/ENVIRONMENT/mcl_raids/mod.conf b/mods/ENVIRONMENT/mcl_raids/mod.conf index f04ef142a..694520114 100644 --- a/mods/ENVIRONMENT/mcl_raids/mod.conf +++ b/mods/ENVIRONMENT/mcl_raids/mod.conf @@ -1 +1,3 @@ -name = mcl_raids \ No newline at end of file +name = mcl_raids +author = PrairieWind +depends = mcl_events, mcl_mobs