remove safe fire, add energy boosts
This commit is contained in:
parent
8b277a7771
commit
09923bb402
@ -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)
|
||||||
|
@ -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
|
|
||||||
|
@ -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")
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
7
todo.txt
7
todo.txt
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user