MineClone2/mods/ENVIRONMENT/mcl_raids/init.lua

192 lines
5.1 KiB
Lua
Raw Normal View History

2022-10-24 17:05:09 +02:00
-- mcl_raids
mcl_raids = {}
-- Define the amount of illagers to spawn each wave.
2022-10-24 00:10:17 +02:00
local waves = {
2022-10-24 17:05:09 +02:00
{
2022-10-24 00:10:17 +02:00
["mobs_mc:pillager"] = 5,
["mobs_mc:vindicator"] = 1,
2022-10-24 17:05:09 +02:00
},
{
2022-10-24 00:10:17 +02:00
["mobs_mc:pillager"] = 4,
["mobs_mc:vindicator"] = 3,
2022-10-24 17:05:09 +02:00
},
{
2022-10-24 00:10:17 +02:00
["mobs_mc:pillager"] = 4,
["mobs_mc:vindicator"] = 1,
["mobs_mc:witch"] = 1,
--["mobs_mc:ravager"] = 1,
2022-10-24 17:05:09 +02:00
},
{
2022-10-24 00:10:17 +02:00
["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,
2022-10-24 17:05:09 +02:00
},
}
2022-10-24 00:10:17 +02:00
local extra_wave = {
["mobs_mc:pillager"] = 5,
["mobs_mc:vindicator"] = 5,
["mobs_mc:witch"] = 1,
["mobs_mc:evoker"] = 1,
--["mobs_mc:ravager"] = 2,
}
local oban_def = minetest.registered_entities["mcl_banners:standing_banner"]
oban_def.visual_size = { x=1, y=1 }
minetest.register_entity(":mcl_raids:ominous_banner",oban_def)
function mcl_raids.spawn_raidcaptain(pos)
local c = minetest.add_entity(pos,"mobs_mc:pillager")
local b = minetest.add_entity(pos,"mcl_raids:ominous_banner")
--TODO: add actual banner pattern
--b:set_properties({textures = {mcl_banners.make_banner_texture(self._base_color, self._layers)}})
b:get_luaentity()
b:set_attach(c,"",vector.new(-1.75,5.5,-0.5),vector.new(0,0,0),true)
end
minetest.register_chatcommand("raidcap",{
privs = {debug = true},
func = function(pname,param)
mcl_raids.spawn_raidcaptain(minetest.get_player_by_name(pname):get_pos())
end,
})
function mcl_raids.spawn_raid(event)
2022-10-24 00:10:17 +02:00
local pos = event.pos
local wave = event.stage
2022-10-22 21:56:00 +02:00
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)))
2022-10-24 00:10:17 +02:00
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"})
mcl_bells.ring_once(pos)
2022-10-22 21:56:00 +02:00
if sn and #sn > 0 then
2022-10-24 00:10:17 +02:00
local spawn_pos = sn[math.random(#sn)]
2022-10-22 21:56:00 +02:00
if spawn_pos then
minetest.log("action", "[mcl_raids] Raid Spawn Position chosen at " .. minetest.pos_to_string(spawn_pos) .. ".")
2022-10-24 00:10:17 +02:00
event.health_max = 0
local w
if event.stage <= #waves then
w= waves[event.stage]
else
w = extra_wave
end
for m,c in pairs(w) do
2022-10-24 00:10:17 +02:00
for i=1,c do
local p = vector.offset(spawn_pos,0,1,0)
local mob = mcl_mobs.spawn(p,m)
2022-10-24 00:10:17 +02:00
local l = mob:get_luaentity()
if l then
event.health_max = event.health_max + l.health
table.insert(event.mobs,mob)
mcl_mobs:gopath(l,pos)
2022-10-24 00:10:17 +02:00
end
end
end
minetest.log("action", "[mcl_raids] Raid Spawned. Illager Count: " .. #event.mobs .. ".")
2022-10-22 21:56:00 +02:00
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
end
function mcl_raids.find_villager(pos)
2022-10-23 00:41:53 +02:00
local obj = minetest.get_objects_inside_radius(pos, 8)
for _, objects in ipairs(obj) do
local object = objects:get_luaentity()
if object then
if object.name ~= "mobs_mc:villager" then
return
elseif object.name == "mobs_mc:villager" then
2022-11-06 11:49:39 +01:00
--minetest.log("action", "[mcl_raids] Villager Found.")
2022-10-23 00:41:53 +02:00
return true
else
2022-11-06 11:49:39 +01:00
--minetest.log("action", "[mcl_raids] No Villager Found.")
2022-10-23 00:41:53 +02:00
return false
end
2022-10-23 00:04:58 +02:00
end
end
end
function mcl_raids.find_bed(pos)
return minetest.find_node_near(pos,128,{"mcl_beds:bed_red_bottom"})
2022-10-23 00:04:58 +02:00
end
function mcl_raids.find_village(pos)
2022-10-23 00:04:58 +02:00
local bed = mcl_raids.find_bed(pos)
if bed and mcl_raids.find_villager(bed) then
return bed
2022-10-23 00:04:58 +02:00
end
end
2022-10-24 00:10:17 +02:00
mcl_events.register_event("raid",{
readable_name = "Raid",
2022-10-24 00:10:17 +02:00
max_stage = 5,
health = 1,
health_max = 1,
exclusive_to_area = 128,
enable_bossbar = true,
2022-10-24 00:10:17 +02:00
cond_start = function(self)
local r = {}
for _,p in pairs(minetest.get_connected_players()) do
if mcl_potions.player_has_effect(p,"bad_omen") then
local raid_pos = mcl_raids.find_village(p:get_pos())
if raid_pos then
table.insert(r,{ player = p:get_player_name(), pos = raid_pos })
end
2022-10-24 00:10:17 +02:00
end
2022-10-23 00:04:58 +02:00
end
2022-10-24 00:10:17 +02:00
if #r > 0 then return r end
end,
on_start = function(self)
self.mobs = {}
self.health_max = 1
self.health = 0
2022-11-03 14:10:30 +01:00
local lv = mcl_potions.player_get_effect(minetest.get_player_by_name(self.player), "bad_omen")
if lv and lv.factor and lv.factor > 1 then self.max_stage = 6 end
2022-10-24 00:10:17 +02:00
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")
2022-10-25 01:20:09 +02:00
awards.unlock(self.player,"mcl:hero_of_the_village")
2022-10-24 00:10:17 +02:00
end,
})