remove safe fire, add energy boosts

This commit is contained in:
Tai Kedzierski 2018-12-23 23:43:17 +00:00
parent 8b277a7771
commit 09923bb402
8 changed files with 129 additions and 62 deletions

View File

@ -624,7 +624,7 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast)
local drops = {} local drops = {}
local on_blast_queue = {} local on_blast_queue = {}
local c_fire = minetest.get_content_id(nssm.fire_node) local c_fire = minetest.get_content_id("fire:basic_flame")
for z = -radius, radius do for z = -radius, radius do
for y = -radius, radius do for y = -radius, radius do
local vi = a:index(pos.x + (-radius), pos.y + y, pos.z + z) local vi = a:index(pos.x + (-radius), pos.y + y, pos.z + z)

View File

@ -2,13 +2,6 @@ nssm.mymapgenis = tonumber(minetest.settings:get('nssm.mymapgenis')) or 7
nssm.multimobs = tonumber(minetest.settings:get('nssm.multimobs')) or 1000 nssm.multimobs = tonumber(minetest.settings:get('nssm.multimobs')) or 1000
-- Server safe setting - allow a non-griefing rainbow tool -- Server safe setting - allow a non-griefing rainbow tool
nssm.init_rainbow_staff = minetest.settings:get_bool('nssm.classic_rainbow_staff') nssm.init_rainbow_staff = minetest.settings:get_bool('nssm.classic_rainbow_staff', false)
-- Server safe setting - fire-placing mobs do not cause havoc on server minetest.debug( dump(nssm) )
nssm.normal_fire = minetest.settings:get_bool('nssm.normal_fire')
-- Safe fire
nssm.fire_node = "nssm:squib_fire"
if nssm.normal_fire then
nssm.fire_node = "fire:basic_flame"
end

View File

@ -1,14 +1,108 @@
function nssm:eat_energy(nutrition, speed) local life_energy_ratings = {}
minetest.item_eat(nutrition) local coefficients = {
-- TODO - add speed, gravity = floor(2/speed)+0.5, protection = protection + 1.5*speed gravity = 1.4,
-- Something like that ... speed = 1.8
}
local function tell_player_physics(playername, physics)
minetest.chat_send_player(playername, "Speed: "..physics.speed..", Gravity: "..physics.gravity)
end end
function nssm:register_energy(name, descr, nutrition, speed) local function round_epsilon(num)
if math.sqrt(math.pow(1 - num, 2)) <= 0.1 then
return 1
end
return num
end
local function round_physics(physics)
local gravity = math.floor(physics.gravity*100)/100
local speed = math.floor(physics.speed*100)/100
-- Prevent infinitessimal derivations due to
-- floating point math
gravity = round_epsilon(gravity)
speed = round_epsilon(speed)
-- FIXME
-- If a player dies when in overpowered mode, diferential restores will mess
-- up their respawned, restored state.
-- This is a kludge to prevent that problem
if speed < 1 then speed = 1 end
if gravity > 1 then gravity = 1 end
return {gravity = gravity, speed = speed}
end
local function set_player_boost(user, power)
--[[ FIXME
There is still a problem here:
- if the player uses a ton of life energy, they'll enter a super-powered state
- maybe this can be construed as a feature, as it is hard to control...
- if the player uses lots of them, their stats may not quite return to origin - specifically, gravity tends
to remain low (last I tried, my base state became 0.7 gravity
It may be judicious to in fact see about possibly stacking time, not power... but that would make this more complex still I think...?
--]]
phys = round_physics(user:get_physics_override() )
local newphys = {
speed = phys.speed * coefficients.speed,
gravity = phys.gravity/(coefficients.gravity*power),
}
newphys = round_physics(newphys)
local diff = {
speed = newphys.speed - phys.speed,
gravity = newphys.gravity - phys.gravity,
}
user:set_physics_override(newphys)
tell_player_physics(user:get_player_name(), newphys)
minetest.after(power * 2.5, function()
-- By the time we run the boost removal function, the player's physics
-- may have been further modified - get the current state of the player
local boosted_phys = round_physics(user:get_physics_override() )
-- Remove the value of the boost when it was set, leaving the additional boost in place
local restored_phys = {
speed = boosted_phys.speed - diff.speed,
gravity = boosted_phys.gravity - diff.gravity,
}
restored_phys = round_physics(restored_phys)
user:set_physics_override(restored_phys)
tell_player_physics(user:get_player_name(), restored_phys)
end)
end
local function eat_energy(itemstack, user, pointedthing)
local nutrition = life_energy_ratings[itemstack:get_name()].nutrition
local power = life_energy_ratings[itemstack:get_name()].powerup
local hp = user:get_hp()
hp = hp + nutrition
if hp > 20 then hp = 20 end
user:set_hp(hp)
set_player_boost(user, power )
itemstack:take_item()
return itemstack
end
local function register_energy(name, descr, nutrition, powerup)
life_energy_ratings["nssm:"..name] = {nutrition = nutrition, powerup = powerup}
minetest.register_craftitem("nssm:"..name, { minetest.register_craftitem("nssm:"..name, {
description = descr, description = descr,
image = name..".png", image = name..".png",
on_use = nssm:eat_energy(nutrition, speed), on_use = eat_energy,
}) })
end end
@ -16,23 +110,23 @@ local function register_energy_craft(smaller,bigger)
minetest.register_craft({ minetest.register_craft({
output = bigger, output = bigger,
recipe = { recipe = {
smaller,smaller,smaller, {smaller,smaller,smaller},
smaller,smaller,smaller, {smaller,smaller,smaller},
smaller,smaller,smaller, {smaller,smaller,smaller},
} }
}) })
minetest.register_craft({ minetest.register_craft({
output = smaller.." 9", output = smaller.." 9",
type = shapeless, type = "shapeless",
recipe = {bigger} recipe = {bigger}
}) })
end end
nssm:register_energy('life_energy', 'Life Energy', 1) register_energy('life_energy', 'Life Energy', 1, 1)
nssm:register_energy('energy_globe', 'Energy Sphere', 2) register_energy('energy_globe', 'Energy Sphere', 2, 1.2)
nssm:register_energy('great_energy_globe', 'Great Energy Sphere', 5) register_energy('great_energy_globe', 'Great Energy Sphere', 5, 1.5)
nssm:register_energy('superior_energy_globe', 'Awesome Energy Sphere', 12) register_energy('superior_energy_globe', 'Awesome Energy Sphere', 12, 1.9)
register_energy_craft("nssm:life_energy", "nssm:energy_globe") register_energy_craft("nssm:life_energy", "nssm:energy_globe")
register_energy_craft("nssm:energy_globe", "nssm:great_energy_globe") register_energy_craft("nssm:energy_globe", "nssm:great_energy_globe")

View File

@ -1,8 +1,6 @@
nssm:load("materials/craft_items.lua") nssm:load("materials/craft_items.lua")
--ore generation
nssm:load("materials/ores.lua") nssm:load("materials/ores.lua")
nssm:load("materials/energy_globes.lua")
--nodes --nodes
@ -166,31 +164,6 @@ minetest.register_node("nssm:dragons_mese", {
light_source = 7, light_source = 7,
}) })
minetest.register_node("nssm:squib_fire", {
description = "Fire!",
drawtype = "firelike",
tiles = {
{
name = "fire_basic_flame_animated.png",
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 1
},
},
},
inventory_image = "fire_basic_flame.png",
paramtype = "light",
light_source = 13,
walkable = false,
buildable_to = true,
sunlight_propagates = true,
damage_per_second = 4,
groups = {dig_immediate = 3},
drop = "",
})
--abms --abms
@ -207,11 +180,11 @@ minetest.register_abm({
--local under = {x=pos.x, y=pos.y-1, z=pos.z} --local under = {x=pos.x, y=pos.y-1, z=pos.z}
--local n = minetest.env:get_node(under).name --local n = minetest.env:get_node(under).name
--if n~= "air" then --if n~= "air" then
minetest.set_node({x=pos.x+1, y=pos.y, z=pos.z}, {name = nssm.fire_node}) minetest.set_node({x=pos.x+1, y=pos.y, z=pos.z}, {name = "fire:basic_flame"})
minetest.set_node({x=pos.x-1, y=pos.y, z=pos.z}, {name = nssm.fire_node}) minetest.set_node({x=pos.x-1, y=pos.y, z=pos.z}, {name = "fire:basic_flame"})
minetest.set_node({x=pos.x, y=pos.y, z=pos.z-1}, {name = nssm.fire_node}) minetest.set_node({x=pos.x, y=pos.y, z=pos.z-1}, {name = "fire:basic_flame"})
minetest.set_node({x=pos.x, y=pos.y, z=pos.z+1}, {name = nssm.fire_node}) minetest.set_node({x=pos.x, y=pos.y, z=pos.z+1}, {name = "fire:basic_flame"})
minetest.set_node({x=pos.x, y=pos.y+1, z=pos.z}, {name = nssm.fire_node}) minetest.set_node({x=pos.x, y=pos.y+1, z=pos.z}, {name = "fire:basic_flame"})
end end
}) })
@ -310,7 +283,7 @@ minetest.register_tool('nssm:sun_sword', {
minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing) minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing)
if puncher:get_wielded_item():get_name() == 'nssm:sun_sword' then if puncher:get_wielded_item():get_name() == 'nssm:sun_sword' then
if node.name ~= "air" and not minetest.is_protected(pos, "") then if node.name ~= "air" and not minetest.is_protected(pos, "") then
minetest.add_node(pointed_thing.above, {name = nssm.fire_node}) minetest.add_node(pointed_thing.above, {name = "fire:basic_flame"})
end end
end end
end) end)

View File

@ -131,7 +131,7 @@ minetest.register_entity("nssm:mortick", {
]] ]]
--The mortick dies when he finds himself in the fire --The mortick dies when he finds himself in the fire
local name = minetest.env:get_node(s1).name local name = minetest.env:get_node(s1).name
if name == "fire:basic_flame" or name == "fire:permanent_flame" or name == nssm.fire_node then if name == "fire:basic_flame" or name == "fire:permanent_flame" then
self.object:remove() self.object:remove()
end end

View File

@ -14,4 +14,4 @@ nssm.multimobs (Multimobs) int 1000
# Multiplier to raise life and damage of the mobs # Multiplier to raise life and damage of the mobs
nssm.mob_difficulty (Mob difficulty) int 1 nssm.mob_difficulty (Mob difficulty) int 1
nssm.classic_rainbow_staff (Use the classical rainbow staff) bool true nssm.classic_rainbow_staff (Use the classical rainbow staff) bool false

View File

@ -2,7 +2,14 @@ Mobs bugs + changes
* Check why ice snake and snow biter are not placing ice * Check why ice snake and snow biter are not placing ice
* Check why lava titan is not placing lava * Check why lava titan is not placing lava
Server-oriented changes
* Ensure the masticone can be defeated by just klilling (use spawn 5, chance 1/6) * Ensure the masticone can be defeated by just klilling (use spawn 5, chance 1/6)
* Find a way to ensure that fire does spread, without changing external mods...
* exploding mobs use generic mobs_redo explode attack
* mobs_redo uses tnt.explode which determines the fire type on its own
* for now, this is on an ABM in fire mod - it may be that for NSSM deployment we will need to add a fire override mod...
API refactoring API refactoring

View File

@ -809,7 +809,7 @@ nssm_register_throwitem("fire", "Fire Bomb", {
for dz = -1,1 do for dz = -1,1 do
local pos1 = {x = pos.x+dx, y=pos.y+dy, z=pos.z+dz} local pos1 = {x = pos.x+dx, y=pos.y+dy, z=pos.z+dz}
if not minetest.is_protected(pos1, "") or not minetest.get_item_group(minetest.get_node(pos1).name, "unbreakable") == 1 then if not minetest.is_protected(pos1, "") or not minetest.get_item_group(minetest.get_node(pos1).name, "unbreakable") == 1 then
minetest.set_node(pos1, {name=nssm.fire_node}) minetest.set_node(pos1, {name="fire:basic_flame"})
end end
end end
end end
@ -1092,7 +1092,7 @@ nssm_register_throwitem("fire_ring", "Fire Ring Bomb", {
for dz = -2,2 do for dz = -2,2 do
local pos1 = {x = pos.x+dx, y=pos.y+dy, z=pos.z+dz} local pos1 = {x = pos.x+dx, y=pos.y+dy, z=pos.z+dz}
if not minetest.is_protected(pos1, "") or not minetest.get_item_group(minetest.get_node(pos1).name, "unbreakable") == 1 then if not minetest.is_protected(pos1, "") or not minetest.get_item_group(minetest.get_node(pos1).name, "unbreakable") == 1 then
minetest.set_node(pos1, {name=nssm.fire_node}) minetest.set_node(pos1, {name="fire:basic_flame"})
for dx = -1,1 do for dx = -1,1 do
for dy = 1,2 do for dy = 1,2 do
for dz = -1,1 do for dz = -1,1 do