diff --git a/api/main_api.lua b/api/main_api.lua index 994530b..b0eed79 100644 --- a/api/main_api.lua +++ b/api/main_api.lua @@ -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) diff --git a/api/settings.lua b/api/settings.lua index 77625a6..3b35fbb 100644 --- a/api/settings.lua +++ b/api/settings.lua @@ -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) ) diff --git a/materials/energy_globes.lua b/materials/energy_globes.lua index 8d964fa..b3bc120 100644 --- a/materials/energy_globes.lua +++ b/materials/energy_globes.lua @@ -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") diff --git a/materials/materials.lua b/materials/materials.lua index ef37584..c7c3e4e 100644 --- a/materials/materials.lua +++ b/materials/materials.lua @@ -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) diff --git a/mobs/morde.lua b/mobs/morde.lua index 34ca8ee..e1019a0 100644 --- a/mobs/morde.lua +++ b/mobs/morde.lua @@ -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 diff --git a/settingtypes.txt b/settingtypes.txt index e706f66..06ee8c2 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -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 diff --git a/todo.txt b/todo.txt index d07e6cd..60deab9 100644 --- a/todo.txt +++ b/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 diff --git a/tools/weapons.lua b/tools/weapons.lua index 8c860f0..246afcc 100644 --- a/tools/weapons.lua +++ b/tools/weapons.lua @@ -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