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 000000000..dfe8f0332 Binary files /dev/null and b/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_bad_omen.png differ