Identification of flyable and swimmable nodes improved

Uses node drawtype now, with "liquid", "liquidflowing" and "airlike" for swimmable and flyable respectively
master
Sirrobzeroone 2020-11-30 14:59:02 +11:00
parent 5e0cea6483
commit 33993562d4
5 changed files with 46 additions and 98 deletions

View File

@ -5,5 +5,6 @@ Licence code LGPL v2.1
Cape Textures - CC0
Blender Model/B3Ds as per base MTG - CC BY-SA 3.0
"3d_armor_trans.png" CC-BY-SA 3.0
"Headanim" code by LoneWolfHT MIT Licence

View File

@ -49,33 +49,6 @@ Capes provide minimal additional armor, about half as much as wooden boots by de
---------------------------
## What nodes are set as Flyable/Swimmable?
---------------------------
### Flyable
"air"
"default:cloud"
Any node which has the drawtype set as "airlike", "liquid" and "flowingliquid" will automatically be flyable or swimmable.
### Swimmable
"default:water_source"
"default:water_flowing"
"default:river_water_source"
"default:river_water_flowing"
"default:lava_source"
"default:lava_flowing"
Given the way the checks are done there is no need to remove these names if they don't exist in your game/world, simply make sure to add the
flyable and swimmable blocks for your game/world.
---------------------------
## How to add more Flyable/Swimmable Node Types?
---------------------------
To add additional nodes that are swimmable or flyable either add there names directly to "i_nodes_fly_swim.lua"
or if I've written them correctly you should be able to use these directly in your mod:
### For flyable
armor_sf.add_flyable("modname:nodename")
eg armor_sf.add_flyable("gases:hydrogen")
### For Swimmable
armor_sf.add_swimmable("modname:nodename")
eg armor_sf.add_swimmable("color_water:green_water")
Big thanks to Gundul for pointing out a better way to do this.

View File

@ -7,32 +7,20 @@
-- \/ \/ \/ \/ \/ --
------------------------------------------------------------------
armor_sf={}
----------------------------
-- add swimmable block --
----------------------------
armor_sf.add_swimmable = function(name)
table.insert(swimmable, name)
end
----------------------------
-- add flyable block --
----------------------------
armor_sf.add_flyable = function(name)
table.insert(flyable, name)
end
----------------------------
-- Check node fly/swim --
----------------------------
function node_fsable(n_name,type)
local compare = flyable
----------------------------------------
-- Check node fly/swim by drawtype --
-- Thanks Gundul --
----------------------------------------
function node_fsable(n_draw,type)
local draw_ta = {"airlike"}
local draw_tl = {"liquid","flowingliquid"}
local compare = draw_ta
if type == "s" then
compare = swimmable
end
compare = draw_tl
end
for k,v in ipairs(compare) do
if n_name == v then
if n_draw == v then
return true
end
end
@ -42,5 +30,3 @@ end

View File

@ -1,17 +0,0 @@
--------------------------------
-- Initial swimmable blocks --
--------------------------------
swimmable = {"default:water_source",
"default:water_flowing",
"default:river_water_source",
"default:river_water_flowing",
"default:lava_source",
"default:lava_flowing"
}
--------------------------------
-- Initial flyable blocks --
--------------------------------
flyable = {"air",
"default:cloud"
}

View File

@ -46,7 +46,6 @@ end
----------------------------
-- Initiate files --
----------------------------
dofile(modpath .. "/i_nodes_fly_swim.lua") -- Initial swimmable/flyable nodes
dofile(modpath .. "/i_functions.lua") -- Functions
if add_capes == true then
@ -113,24 +112,29 @@ minetest.register_globalstep(function()
local privs = minetest.get_player_privs(player:get_player_name())-- Privs crude attempt to differentiate potenital flying from falling
local pos = player:get_pos()
local node = minetest.get_node(pos) -- Node player is in (lower legs)
node = minetest.registered_nodes[node.name].drawtype -- Set node to node drawtype
local node_b = minetest.get_node({x=pos.x,y=pos.y -1,z=pos.z}) -- Node below players feet
node_b = minetest.registered_nodes[node_b.name].drawtype -- Set node to node drawtype
local node_bb = minetest.get_node({x=pos.x,y=pos.y -2,z=pos.z}) -- Next node down
node_bb = minetest.registered_nodes[node_bb.name].drawtype -- Set node to node drawtype
local node_bbb = minetest.get_node({x=pos.x,y=pos.y -3,z=pos.z}) -- Next node down (falling starts later)
node_bbb = minetest.registered_nodes[node_bbb.name].drawtype-- Set node to node drawtype
local node_bbbb = minetest.get_node({x=pos.x,y=pos.y -4,z=pos.z})-- Next node down (falling starts later)
node_bbbb = minetest.registered_nodes[node_bbbb.name].drawtype-- Set node to node drawtype
local offset = 0 -- Used for Headanim
if (controls.up or controls.down or
controls.left or controls.right) and -- Must be moving in a direction
(controls.LMB or controls.RMB) and -- Must be swinging
node_fsable(node.name,"s") == true and -- Node player standing in must be swimmable
node_fsable(node_b.name,"s") == true then -- Node below must be swimmable
node_fsable(node,"s") == true and -- Node player standing in must be swimmable
node_fsable(node_b,"s") == true then -- Node below must be swimmable
player_api.set_animation(player,"swim_atk",ani_spd) -- Set to swimming attack animation
offset = 90 -- Offset for Headanim
elseif (controls.up or controls.down or
controls.left or controls.right) and -- Must be moving in a direction
node_fsable(node.name,"s") == true and -- Node player standing in must be swimmable
node_fsable(node_b.name,"s") == true then -- Node below must be swimmable
node_fsable(node,"s") == true and -- Node player standing in must be swimmable
node_fsable(node_b,"s") == true then -- Node below must be swimmable
player_api.set_animation(player, "swim",ani_spd) -- Set to swimming animation
offset = 90 -- Offset for Headanim
@ -138,52 +142,53 @@ minetest.register_globalstep(function()
if(controls.up or controls.down or -- must also have fly privs or we should definitly be falling.
controls.left or controls.right) and -- Must be moving in a direction
(controls.LMB or controls.RMB) and -- Must be swinging
node_fsable(node.name,"a") == true and -- Node player is standing in must be flyable
node_fsable(node_b.name,"a") == true and -- node below must be flyable
node_fsable(node_bb.name,"a") == true then -- node 2 down must be flyable
node_fsable(node,"a") == true and -- Node player is standing in must be flyable
node_fsable(node_b,"a") == true and -- node below must be flyable
node_fsable(node_bb,"a") == true then -- node 2 down must be flyable
player_api.set_animation(player, "fly_atk",ani_spd) -- Show fly attack animation
offset = 90 -- Offset for Headanim
elseif(controls.up or controls.down or
controls.left or controls.right) and -- Must be moving in a direction
node_fsable(node.name,"a") == true and -- Node player is standing in must be flyable
node_fsable(node_b.name,"a") == true and -- node below must be flyable
node_fsable(node_bb.name,"a") == true then -- node 2 down must be flyable
node_fsable(node,"a") == true and -- Node player is standing in must be flyable
node_fsable(node_b,"a") == true and -- node below must be flyable
node_fsable(node_bb,"a") == true then -- node 2 down must be flyable
player_api.set_animation(player, "fly",ani_spd) -- Show fly animation or swan dive if falling
offset = 90 -- Offset for Headanim
end
elseif not attached_to then -- If player attached to something dont do falling animation
if(controls.LMB or controls.RMB) and -- Must be swinging
node_fsable(node.name,"a") == true and -- Node player is standing in must be flyable/fallable
node_fsable(node_b.name,"a") == true and -- node below must be flyable/fallable
node_fsable(node_bb.name,"a") == true and -- node 2 down must be flyable/fallable
node_fsable(node_bbb.name,"a") == true and -- node 3 down must be flyable/fallable
node_fsable(node_bbbb.name,"a") == true then -- node 4 down must be flyable/fallable
node_fsable(node,"a") == true and -- Node player is standing in must be flyable/fallable
node_fsable(node_b,"a") == true and -- node below must be flyable/fallable
node_fsable(node_bb,"a") == true and -- node 2 down must be flyable/fallable
node_fsable(node_bbb,"a") == true and -- node 3 down must be flyable/fallable
node_fsable(node_bbbb,"a") == true then -- node 4 down must be flyable/fallable
player_api.set_animation(player, "fall_atk",ani_spd) -- falling and flailing around
offset = 90 -- Offset for Headanim
elseif node_fsable(node.name,"a") == true and -- Node player is standing in must be flyable/fallable
node_fsable(node_b.name,"a") == true and -- node below must be flyable/fallable
node_fsable(node_bb.name,"a") == true and -- node 2 down must be flyable/fallable
node_fsable(node_bbb.name,"a") == true and -- node 3 down must be flyable/fallable
node_fsable(node_bbbb.name,"a") == true then -- node 4 down must be flyable/fallable
elseif node_fsable(node,"a") == true and -- Node player is standing in must be flyable/fallable
node_fsable(node_b,"a") == true and -- node below must be flyable/fallable
node_fsable(node_bb,"a") == true and -- node 2 down must be flyable/fallable
node_fsable(node_bbb,"a") == true and -- node 3 down must be flyable/fallable
node_fsable(node_bbbb,"a") == true then -- node 4 down must be flyable/fallable
player_api.set_animation(player, "fall",ani_spd) -- falling
offset = 90 -- Offset for Headanim
end
end
local look_degree = -math.deg(player:get_look_vertical()) -- Kept this near headanim code
local look_degree = -math.deg(player:get_look_vertical()) -- Kept this near code
if look_degree > 29 and offset ~= 0 then -- When looking up and fly/Swim head will only tilt back 30degrees
if look_degree > 29 and offset ~= 0 then
offset = offset - (look_degree-30)
elseif look_degree > 60 and offset == 0 then -- When standing etc looking up stops at 60 degrees
elseif look_degree > 60 and offset == 0 then
offset = offset - (look_degree-60)
elseif look_degree < -60 and offset == 0 then -- When standing etc looking down stops at -60 degrees
elseif look_degree < -60 and offset == 0 then
offset = offset - (look_degree+60)
end
end
-- Code by LoneWolfHT - Headanim mod MIT Licence --
player:set_bone_position("Head", vector.new(0, 6.35, 0),vector.new(look_degree + offset, 0, 0))
-- Code by LoneWolfHT - Headanim mod MIT Licence --