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 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 y = -radius, radius do
|
||||
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
|
||||
|
||||
-- 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
|
||||
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
|
||||
minetest.debug( dump(nssm) )
|
||||
|
@ -1,14 +1,108 @@
|
||||
function nssm:eat_energy(nutrition, speed)
|
||||
minetest.item_eat(nutrition)
|
||||
-- TODO - add speed, gravity = floor(2/speed)+0.5, protection = protection + 1.5*speed
|
||||
-- Something like that ...
|
||||
local life_energy_ratings = {}
|
||||
local coefficients = {
|
||||
gravity = 1.4,
|
||||
speed = 1.8
|
||||
}
|
||||
|
||||
local function tell_player_physics(playername, physics)
|
||||
minetest.chat_send_player(playername, "Speed: "..physics.speed..", Gravity: "..physics.gravity)
|
||||
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, {
|
||||
description = descr,
|
||||
image = name..".png",
|
||||
on_use = nssm:eat_energy(nutrition, speed),
|
||||
on_use = eat_energy,
|
||||
})
|
||||
end
|
||||
|
||||
@ -16,23 +110,23 @@ local function register_energy_craft(smaller,bigger)
|
||||
minetest.register_craft({
|
||||
output = bigger,
|
||||
recipe = {
|
||||
smaller,smaller,smaller,
|
||||
smaller,smaller,smaller,
|
||||
smaller,smaller,smaller,
|
||||
{smaller,smaller,smaller},
|
||||
{smaller,smaller,smaller},
|
||||
{smaller,smaller,smaller},
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = smaller.." 9",
|
||||
type = shapeless,
|
||||
type = "shapeless",
|
||||
recipe = {bigger}
|
||||
})
|
||||
end
|
||||
|
||||
nssm:register_energy('life_energy', 'Life Energy', 1)
|
||||
nssm:register_energy('energy_globe', 'Energy Sphere', 2)
|
||||
nssm:register_energy('great_energy_globe', 'Great Energy Sphere', 5)
|
||||
nssm:register_energy('superior_energy_globe', 'Awesome Energy Sphere', 12)
|
||||
register_energy('life_energy', 'Life Energy', 1, 1)
|
||||
register_energy('energy_globe', 'Energy Sphere', 2, 1.2)
|
||||
register_energy('great_energy_globe', 'Great Energy Sphere', 5, 1.5)
|
||||
register_energy('superior_energy_globe', 'Awesome Energy Sphere', 12, 1.9)
|
||||
|
||||
register_energy_craft("nssm:life_energy", "nssm:energy_globe")
|
||||
register_energy_craft("nssm:energy_globe", "nssm:great_energy_globe")
|
||||
|
@ -1,8 +1,6 @@
|
||||
nssm:load("materials/craft_items.lua")
|
||||
|
||||
--ore generation
|
||||
|
||||
nssm:load("materials/ores.lua")
|
||||
nssm:load("materials/energy_globes.lua")
|
||||
|
||||
--nodes
|
||||
|
||||
@ -166,31 +164,6 @@ minetest.register_node("nssm:dragons_mese", {
|
||||
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
|
||||
@ -207,11 +180,11 @@ minetest.register_abm({
|
||||
--local under = {x=pos.x, y=pos.y-1, z=pos.z}
|
||||
--local n = minetest.env:get_node(under).name
|
||||
--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 = nssm.fire_node})
|
||||
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 = nssm.fire_node})
|
||||
minetest.set_node({x=pos.x, y=pos.y+1, 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 = "fire:basic_flame"})
|
||||
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 = "fire:basic_flame"})
|
||||
minetest.set_node({x=pos.x, y=pos.y+1, z=pos.z}, {name = "fire:basic_flame"})
|
||||
|
||||
end
|
||||
})
|
||||
@ -310,7 +283,7 @@ minetest.register_tool('nssm:sun_sword', {
|
||||
minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing)
|
||||
if puncher:get_wielded_item():get_name() == 'nssm:sun_sword' 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)
|
||||
|
@ -131,7 +131,7 @@ minetest.register_entity("nssm:mortick", {
|
||||
]]
|
||||
--The mortick dies when he finds himself in the fire
|
||||
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()
|
||||
end
|
||||
|
||||
|
@ -14,4 +14,4 @@ nssm.multimobs (Multimobs) int 1000
|
||||
# Multiplier to raise life and damage of the mobs
|
||||
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 lava titan is not placing lava
|
||||
|
||||
Server-oriented changes
|
||||
|
||||
* 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
|
||||
|
||||
|
@ -809,7 +809,7 @@ nssm_register_throwitem("fire", "Fire Bomb", {
|
||||
for dz = -1,1 do
|
||||
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
|
||||
minetest.set_node(pos1, {name=nssm.fire_node})
|
||||
minetest.set_node(pos1, {name="fire:basic_flame"})
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1092,7 +1092,7 @@ nssm_register_throwitem("fire_ring", "Fire Ring Bomb", {
|
||||
for dz = -2,2 do
|
||||
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
|
||||
minetest.set_node(pos1, {name=nssm.fire_node})
|
||||
minetest.set_node(pos1, {name="fire:basic_flame"})
|
||||
for dx = -1,1 do
|
||||
for dy = 1,2 do
|
||||
for dz = -1,1 do
|
||||
|
Loading…
x
Reference in New Issue
Block a user