forked from VoxeLibre/VoxeLibre
Add Bad Omen Effect
This commit is contained in:
parent
8b6409b7f1
commit
96ac31bec3
|
@ -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", {
|
minetest.register_chatcommand("spawn_raid", {
|
||||||
privs = {
|
privs = {
|
||||||
server = true,
|
server = true,
|
||||||
},
|
},
|
||||||
func = function(name)
|
func = function(name)
|
||||||
local wave = 1
|
local wave = 1
|
||||||
local illager_count = 0
|
|
||||||
local player = minetest.get_player_by_name(name)
|
local player = minetest.get_player_by_name(name)
|
||||||
local pos = player:get_pos()
|
local pos = player:get_pos()
|
||||||
local spawnable = false
|
mcl_raids.spawn_raid(pos, wave)
|
||||||
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
|
end
|
||||||
})
|
})
|
||||||
|
|
|
@ -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["leaping"] = mcl_potions.leaping_func
|
||||||
get_chat_function["swiftness"] = mcl_potions.swiftness_func
|
get_chat_function["swiftness"] = mcl_potions.swiftness_func
|
||||||
get_chat_function["heal"] = mcl_potions.healing_func
|
get_chat_function["heal"] = mcl_potions.healing_func
|
||||||
|
get_chat_function["bad_omen"] = mcl_potions.bad_omen_func
|
||||||
|
|
||||||
minetest.register_chatcommand("effect",{
|
minetest.register_chatcommand("effect",{
|
||||||
params = S("<effect> <duration> [<factor>]"),
|
params = S("<effect> <duration> [<factor>]"),
|
||||||
|
|
|
@ -9,6 +9,7 @@ EF.leaping = {}
|
||||||
EF.swift = {} -- for swiftness AND slowness
|
EF.swift = {} -- for swiftness AND slowness
|
||||||
EF.night_vision = {}
|
EF.night_vision = {}
|
||||||
EF.fire_proof = {}
|
EF.fire_proof = {}
|
||||||
|
EF.bad_omen = {}
|
||||||
|
|
||||||
local EFFECT_TYPES = 0
|
local EFFECT_TYPES = 0
|
||||||
for _,_ in pairs(EF) do
|
for _,_ in pairs(EF) do
|
||||||
|
@ -350,6 +351,28 @@ minetest.register_globalstep(function(dtime)
|
||||||
|
|
||||||
end
|
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)
|
end)
|
||||||
|
|
||||||
-- Prevent damage to player with Fire Resistance enabled
|
-- 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.swift[player] = nil
|
||||||
EF.night_vision[player] = nil
|
EF.night_vision[player] = nil
|
||||||
EF.fire_proof[player] = nil
|
EF.fire_proof[player] = nil
|
||||||
|
EF.bad_omen[player] = nil
|
||||||
|
|
||||||
meta = player:get_meta()
|
meta = player:get_meta()
|
||||||
meta:set_int("night_vision", 0)
|
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_swift", minetest.serialize(EF.swift[player]))
|
||||||
meta:set_string("_is_cat", minetest.serialize(EF.night_vision[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("_is_fire_proof", minetest.serialize(EF.fire_proof[player]))
|
||||||
|
meta:set_string("_has_bad_omen", minetest.serialize(EF.bad_omen[player]))
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -480,6 +505,10 @@ function mcl_potions._load_player_effects(player)
|
||||||
EF.fire_proof[player] = minetest.deserialize(meta:get_string("_is_fire_proof"))
|
EF.fire_proof[player] = minetest.deserialize(meta:get_string("_is_fire_proof"))
|
||||||
end
|
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
|
end
|
||||||
|
|
||||||
-- Returns true if player has given effect
|
-- Returns true if player has given effect
|
||||||
|
@ -966,3 +995,22 @@ function mcl_potions._extinguish_nearby_fire(pos, radius)
|
||||||
end
|
end
|
||||||
return exting
|
return exting
|
||||||
end
|
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
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
name = mcl_potions
|
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
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 4.5 KiB |
Loading…
Reference in New Issue