fix more mod.conf's and update fireplus to support 3d_armor

master
MeseCraft 2022-08-09 12:59:44 -05:00
parent f5e5ddf55a
commit 56b1d787a5
12 changed files with 226 additions and 185 deletions

View File

@ -0,0 +1,125 @@
local armor_mod = minetest.get_modpath("3d_armor")
-- Replace min/max table with random value from min to max
local function get_val(val)
if type(val) == "table" then
val = math.random(val.min or 1, val.max or 5)
end
return val
end
function fire_plus.burn_player(player, burns, damage, not_initial)
if not player then
minetest.log("warning", "[Fire Plus] (burn_player): player is nil")
end
local name = player
if type(player) == "string" then
player = minetest.get_player_by_name(player)
end
if not player or player:get_hp() <= 0 then
fire_plus.extinguish_player(name)
return
end
name = player:get_player_name()
-- 3d_armor fire protection puts out flames
if armor_mod and armor.def[name].fire > 1 then
fire_plus.extinguish_player(name)
end
-- Fire was extinguished
if not fire_plus.burning[name] and not_initial then
return
end
if not fire_plus.burning[name] then
burns = get_val(burns)
fire_plus.burning[name] = {
burns_left = burns,
hud_id = player:hud_add({
hud_elem_type = "image",
position = {x = 0.5, y = 0.95},
offset = {x = 0, y = 0},
text = "fire_basic_flame.png",
alignment = -1,
scale = {x = 100, y = 32},
number = 0xFFFFFF,
}),
sound_id = minetest.sound_play("fire_fire", {
to_player = name,
gain = 1.0,
loop = true,
}),
particlespawner_id = minetest.add_particlespawner({
amount = 10,
time = 0,
minpos = vector.new(-0.3, 0.5, -0.3),
maxpos = vector.new( 0.3, 2, 0.3),
minvel = {x = -1, y = 0, z = -1},
maxvel = {x = 1, y = 1, z = 1},
minacc = {x = 0, y = 2, z = 0},
maxacc = {x = 0, y = 3, z = 0},
minexptime = 0.5,
maxexptime = 1,
minsize = 3,
maxsize = 3,
texture = "fire_basic_flame.png",
collisiondetection = true,
glow = minetest.LIGHT_MAX,
attached = player,
})
}
else
player:set_hp(player:get_hp() - get_val(damage), {type = "set_hp", fire_plus = true})
if minetest.get_modpath("tnt") then
local tntpos = minetest.find_node_near(player:get_pos(), fire_plus.tnt_explode_radius, {"tnt:tnt"}, true)
if tntpos then
tnt.boom(tntpos, {radius = fire_plus.tnt_explode_radius, damage_radius = fire_plus.tnt_explode_radius})
end
end
if not_initial then
fire_plus.burning[name].burns_left = fire_plus.burning[name].burns_left - 1
else
fire_plus.burning[name].burns_left = burns
end
end
if fire_plus.burning[name].burns_left > 0 then
minetest.after(fire_plus.burn_interval, function()
fire_plus.burn_player(name, burns, damage, true)
end)
else
fire_plus.extinguish_player(name)
end
end
function fire_plus.extinguish_player(player)
local name = player
if player then
if type(name) ~= "string" then
name = player:get_player_name()
else
player = minetest.get_player_by_name(name)
end
end
if not fire_plus.burning[name] then return end
if player then
player:hud_remove(fire_plus.burning[name].hud_id)
minetest.sound_fade(fire_plus.burning[name].sound_id, 1, 0)
end
minetest.delete_particlespawner(fire_plus.burning[name].particlespawner_id)
fire_plus.burning[name] = nil
end

View File

@ -1,185 +1,92 @@
fire_plus = {
burn_interval = 1,
tnt_explode_radius = 1.5,
burning = {--[[
["playername"] = {
burns_left = <number>,
hud_id = <hud id>,
sound_id = <sound id>,
particlespawner_id = <particlespawner id>
}
]]},
ignition_nodes = {
--["nodename"] = {burns = <table with min/max or number>, damage = <table with min/max or number>}
["default:lava"] = {burns = 2, damage = 4},
["fire:"] = {burns = 4, damage = 2},
},
extinguishers = {
"default:water",
"default:river_water",
"default:snow"
}
}
fire_plus.ignition_nodes = {
"default:lava",
"fire:",
}
dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/api.lua")
fire_plus.put_outs = { -- Couldn't thnk of a better name
"default:water",
"default:river_water",
"default:snow"
}
local time = 0
minetest.register_globalstep(function(dtime)
time = time + dtime
local firehud = {}
local firesound = {}
local callbacks = {}
local function make_registration()
local registerfunc = function(func)
callbacks[#callbacks + 1] = func
if time < 0.1 then
return
else
time = 0
end
return(registerfunc)
end
-- Put out players in extinguisher nodes
for _, player in pairs(minetest.get_connected_players()) do
minetest.register_on_player_hpchange(function(player, hp_change)
local pos = player:get_pos()
local node = minetest.get_node(pos)
local name = player:get_player_name()
for id, string in ipairs(fire_plus.ignition_nodes) do
if node.name:find(string) then
fire_plus.burnplayer(player)
break
if fire_plus.burning[name] then
local nodename = minetest.get_node(player:get_pos()).name
local nodename_head = minetest.get_node(vector.add(player:get_pos(),
vector.new(0, 1, 0))).name
for _, extinguisher in pairs(fire_plus.extinguishers) do
if nodename:find(extinguisher) or nodename_head:find(extinguisher) then
minetest.sound_play("fire_extinguish_flame", {
to_player = name,
gain = 1.0,
})
fire_plus.extinguish_player(name)
return
end
end
end
end
end)
-- Ignite players in ignition nodes
minetest.register_on_player_hpchange(function(player, _, reason)
if reason.type == "node_damage" and reason.node then
for igniter, def in pairs(fire_plus.ignition_nodes) do
if reason.node:find(igniter) then
fire_plus.burn_player(player, def.burns or 4, def.damage or 2)
break
end
end
end
end)
minetest.register_on_punchplayer(function(player, hitter, _, toolcaps, _, dmg)
if hitter and hitter:is_player() and toolcaps.damage_groups.burns and player and player:get_hp() - dmg > 0 then
fire_plus.burn_player(player, toolcaps.damage_groups.burn_time or 4, toolcaps.damage_groups.burns)
end
return false
end)
minetest.register_on_respawnplayer(function(player)
local name = player:get_player_name()
if firehud[name] then
player:hud_remove(firehud[name])
firehud[name] = nil
end
if firesound[name] then
minetest.sound_stop(firesound[name])
firesound[name] = nil
if fire_plus.burning[name] then
fire_plus.extinguish_player(name)
end
end)
fire_plus.on_burn = make_registration()
function fire_plus.get_burn_dmg(player)
local dmg = 1
for id, func in ipairs(callbacks) do
local rval = callbacks[k](player)
if type(rval) == "number" then
dmg = rval
break
end
end
return(dmg)
end
function fire_plus.burnplayer(player)
if not player then return end
local name = player:get_player_name()
if firehud[name] then
return
end
firehud[name] = player:hud_add({
hud_elem_type = "image",
position = {x = 0.5, y = 0.95},
offset = {x = 0, y = 0},
text = "fire_basic_flame.png",
alignment = -1,
scale = {x = 100, y = 32},
number = 0xFFFFFF,
})
firesound[name] = minetest.sound_play("fire_fire", {
to_player = name,
gain = 1.0,
loop = true,
})
for i=1, 4, 1 do
minetest.after(i, function()
if not player or firehud[player:get_player_name()] == nil then
return
end
local pos = player:get_pos()
local pname = player:get_player_name()
local name = minetest.get_node(pos).name
local remove_burn = false
for id, string in ipairs(fire_plus.put_outs) do
if name:find(string) then
remove_burn = true
break
end
end
if remove_burn == true then
player:hud_remove(firehud[pname])
minetest.sound_stop(firesound[pname])
firehud[pname] = nil
firesound[pname] = nil
minetest.sound_play("fire_extinguish_flame", {
to_player = pname,
gain = 1.0,
})
return
end
-- Detonate any nearby TNT if player is on fire
local tntpos = minetest.find_node_near(player:get_pos(), fire_plus.tnt_explode_radius, {"tnt:tnt"}, true)
if player:get_hp() > 0 then
player:set_hp(player:get_hp()-fire_plus.get_burn_dmg(player))
end
if tntpos then
tnt.boom(tntpos, {radius = tnt_radius, damage_radius = tnt_radius})
end
minetest.add_particlespawner({
amount = 20,
time = 0.1,
minpos = vector.subtract(pos, 0.5),
maxpos = vector.add(pos, 0.5),
minvel = {x = -1, y = 0, z = -1},
maxvel = {x = 1, y = 1, z = 1},
minacc = {x = 0, y = 2, z = 0},
maxacc = {x = 0, y = 3, z = 0},
minexptime = 0.5,
maxexptime = 1,
minsize = 5 * 0.66,
maxsize = 5 * 0.66,
texture = "fire_basic_flame.png",
collisiondetection = true,
})
end)
end
minetest.after(4.5, function()
if not player then
return
end
local name = player:get_player_name()
if firehud[name] then
player:hud_remove(firehud[name])
firehud[name] = nil
end
if firesound[name] then
minetest.sound_stop(firesound[name])
firesound[name] = nil
end
end)
end
minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_ca, dir, dmg)
if hitter:is_player() and tool_ca.damage_groups.burns == 1 and
(player:get_hp()-dmg) > 0 then
fire_plus.burnplayer(player)
end
return(false)
end)

View File

@ -0,0 +1,6 @@
name = fire_plus
description = Some cool fire interactions.
depends = fire
optional_depends = default, tnt, 3d_armor
author = LoneWolfHT
title = Fire Plus

View File

@ -0,0 +1,6 @@
name = floodables
description = Liquid uprooting, liquid erosion.
depends =
optional_depends = default, farming, flowers
author = tacotexmex
title = Floodables

View File

@ -1,2 +0,0 @@
default
tnt?

View File

@ -1 +0,0 @@
Have torches go out after a while and drop when in water.

View File

@ -1 +1,6 @@
name = real_torch
description = Have torches go out after a while and drop when in water.
depends = default
optional_depends = tnt
author = TenPlus1
title = Real Torch

View File

@ -1,3 +0,0 @@
default
stairs
intllib?

View File

@ -1,12 +0,0 @@
With this mod, you are able to compost grass, leaves, flowers...
Crafting:
Wood barrel:
W W
W W
W S W
W : wood
S : wood slab
created by cd2 (cdqwertz) - cdqwertz.github.io

View File

@ -0,0 +1,6 @@
name = compost
description = With this mod, you are able to compost grass, leaves, flowers.
depends = default, stairs
optional_depends = intllib
author = cdqwertz
title = Compost

View File

@ -1,2 +0,0 @@
default
tnt

View File

@ -0,0 +1,6 @@
name = stm_nodes
description = Some steam-punk nodes. Trimmed by MeseCraft, will be gone soon.
depends = default, tnt
optional_depends =
author = D00Med
title = Steampunk Nodes