From 96ac31bec3ff6c184ecff9825fb4f79f11db34cb Mon Sep 17 00:00:00 2001 From: PrairieWind Date: Sat, 22 Oct 2022 13:56:00 -0600 Subject: [PATCH] Add Bad Omen Effect --- mods/ENVIRONMENT/mcl_raids/init.lua | 68 +++++++++--------- mods/ITEMS/mcl_potions/commands.lua | 1 + mods/ITEMS/mcl_potions/functions.lua | 48 +++++++++++++ mods/ITEMS/mcl_potions/mod.conf | 2 +- .../textures/mcl_potions_effect_bad_omen.png | Bin 0 -> 4566 bytes 5 files changed, 86 insertions(+), 33 deletions(-) create mode 100644 mods/ITEMS/mcl_potions/textures/mcl_potions_effect_bad_omen.png diff --git a/mods/ENVIRONMENT/mcl_raids/init.lua b/mods/ENVIRONMENT/mcl_raids/init.lua index 073628a6c..8194e686a 100644 --- a/mods/ENVIRONMENT/mcl_raids/init.lua +++ b/mods/ENVIRONMENT/mcl_raids/init.lua @@ -47,45 +47,49 @@ mcl_raids.wave_definitions = { }, } +mcl_raids.spawn_raid = function(pos, wave) + 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"}) + if sn and #sn > 0 then + spawn_pos = sn[1] + if spawn_pos then + minetest.log("action", "[mcl_raids] Raid Spawn Position chosen at " .. minetest.pos_to_string(spawn_pos) .. ".") + spawnable = true + 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 + minetest.register_chatcommand("spawn_raid", { privs = { server = true, }, func = function(name) local wave = 1 - local illager_count = 0 local player = minetest.get_player_by_name(name) local pos = player:get_pos() - 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"}) - if sn and #sn > 0 then - spawn_pos = sn[1] - if spawn_pos then - minetest.log("action", "[mcl_raids] Raid Spawn Position chosen at " .. minetest.pos_to_string(spawn_pos) .. ".") - spawnable = true - 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 + mcl_raids.spawn_raid(pos, wave) end }) diff --git a/mods/ITEMS/mcl_potions/commands.lua b/mods/ITEMS/mcl_potions/commands.lua index 1fbf591d9..76ac71e72 100644 --- a/mods/ITEMS/mcl_potions/commands.lua +++ b/mods/ITEMS/mcl_potions/commands.lua @@ -19,6 +19,7 @@ get_chat_function["water_breathing"] = mcl_potions.water_breathing_func get_chat_function["leaping"] = mcl_potions.leaping_func get_chat_function["swiftness"] = mcl_potions.swiftness_func get_chat_function["heal"] = mcl_potions.healing_func +get_chat_function["bad_omen"] = mcl_potions.bad_omen_func minetest.register_chatcommand("effect",{ params = S(" []"), diff --git a/mods/ITEMS/mcl_potions/functions.lua b/mods/ITEMS/mcl_potions/functions.lua index 15be8a90c..446191c0a 100644 --- a/mods/ITEMS/mcl_potions/functions.lua +++ b/mods/ITEMS/mcl_potions/functions.lua @@ -9,6 +9,7 @@ EF.leaping = {} EF.swift = {} -- for swiftness AND slowness EF.night_vision = {} EF.fire_proof = {} +EF.bad_omen = {} local EFFECT_TYPES = 0 for _,_ in pairs(EF) do @@ -350,6 +351,28 @@ minetest.register_globalstep(function(dtime) end + -- Check for Bad Omen + for player, vals in pairs(EF.bad_omen) do + + is_player = player:is_player() + entity = player:get_luaentity() + + EF.bad_omen[player].timer = EF.bad_omen[player].timer + dtime + + if player:get_pos() then mcl_potions._add_spawner(player, "#0b6138") end + + if EF.bad_omen[player] and EF.bad_omen[player].timer >= EF.bad_omen[player].dur then + EF.bad_omen[player] = nil + mcl_raids.spawn_raid(player:get_pos(), 1) + if is_player then + meta = player:get_meta() + meta:set_string("_had_bad_omen", minetest.serialize(EF.bad_omen[player])) + potions_set_hud(player) + end + end + + end + end) -- Prevent damage to player with Fire Resistance enabled @@ -386,6 +409,7 @@ function mcl_potions._clear_cached_player_data(player) EF.swift[player] = nil EF.night_vision[player] = nil EF.fire_proof[player] = nil + EF.bad_omen[player] = nil meta = player:get_meta() meta:set_int("night_vision", 0) @@ -429,6 +453,7 @@ function mcl_potions._save_player_effects(player) meta:set_string("_is_swift", minetest.serialize(EF.swift[player])) meta:set_string("_is_cat", minetest.serialize(EF.night_vision[player])) meta:set_string("_is_fire_proof", minetest.serialize(EF.fire_proof[player])) + meta:set_string("_has_bad_omen", minetest.serialize(EF.bad_omen[player])) end @@ -480,6 +505,10 @@ function mcl_potions._load_player_effects(player) EF.fire_proof[player] = minetest.deserialize(meta:get_string("_is_fire_proof")) end + if minetest.deserialize(meta:get_string("_had_bad_omen")) then + EF.bad_omen[player] = minetest.deserialize(meta:get_string("_has_bad_omen")) + end + end -- Returns true if player has given effect @@ -966,3 +995,22 @@ function mcl_potions._extinguish_nearby_fire(pos, radius) end return exting end + +function mcl_potions.bad_omen_func(player, null, duration) + + if not EF.bad_omen[player] then + + EF.bad_omen[player] = {dur = duration, timer = 0} + + else + + local victim = EF.bad_omen[player] + victim.dur = math.max(duration, victim.dur - victim.timer) + victim.timer = 0 + end + + if player:is_player() then + potions_set_icons(player) + end + +end diff --git a/mods/ITEMS/mcl_potions/mod.conf b/mods/ITEMS/mcl_potions/mod.conf index bcb6d8ad3..c3e56fe5a 100644 --- a/mods/ITEMS/mcl_potions/mod.conf +++ b/mods/ITEMS/mcl_potions/mod.conf @@ -1,2 +1,2 @@ name = mcl_potions -depends = mcl_core, mcl_farming, mcl_mobitems, mcl_fishing, mcl_bows, mcl_end, mcl_weather, playerphysics, mcl_wip +depends = mcl_core, mcl_farming, mcl_mobitems, mcl_fishing, mcl_bows, mcl_end, mcl_weather, playerphysics, mcl_wip, mcl_raids diff --git a/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_bad_omen.png b/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_bad_omen.png new file mode 100644 index 0000000000000000000000000000000000000000..dfe8f0332605f4d3995be6ec3de58f5f00e6054c GIT binary patch literal 4566 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 AhyVZp literal 0 HcmV?d00001