Short check for stationary players

~ Players not moving now just have a short check performed
~ Cleanup to help with performance
~ Terminal Velocity set to 150kph, players now die on fall
master
Sirrobzeroone 2022-08-20 16:59:37 +10:00
parent 98dbe16550
commit df687d604e
4 changed files with 344 additions and 248 deletions

View File

@ -91,9 +91,9 @@ Crouching under - Simply walk through a gap 1.5 nodes tall. Player/character mus
--------------------------- ---------------------------
From MT Main Menu go to "Settings" then "All Settings" then "Mods" then "3d_armor_flyswim" From MT Main Menu go to "Settings" then "All Settings" then "Mods" then "3d_armor_flyswim"
**capes_add_to_3darmor** - Default is enabled - Makes capes an armor item avaliable via 3d_armor (1 test cape included) **capes_add_to_3darmor** - Default is disabled- Makes capes an armor item avaliable via 3d_armor (1 test cape included)
**example_cape** - Default is enabled - The example cape "Someones Cape" is avaliable which grants fly_privs when worn and a 100% speed increase **example_cape** - Default is disabled- The example cape "Someones Cape" is avaliable which grants fly_privs when worn and a 100% speed increase
**fly_anim** - Default is enabled - Will show the flying animation **fly_anim** - Default is enabled - Will show the flying animation

View File

@ -41,7 +41,7 @@ function armor_fly_swim.get_player_model()
"3d_armor_trans.png"} "3d_armor_trans.png"}
end end
-- skins_db with 3d_armor or without -- skins_db with 3d_armor or without (clothes_2 uses)
if armor_fly_swim.is_skinsdb then if armor_fly_swim.is_skinsdb then
player_mod = "skinsdb_3d_armor_character_5.b3d" player_mod = "skinsdb_3d_armor_character_5.b3d"
texture = {"blank.png", texture = {"blank.png",
@ -72,71 +72,81 @@ function armor_fly_swim.get_wasd_state(controls)
end end
---------------------------------------- ----------------------------------------
-- Check specific node fly/swim -- Node above solid
-- 1=player feet, 2=one below feet,
-- Thanks Gundul
function node_fsable(pos,num,type) function armor_fly_swim.node_above_solid(pos)
local draw_ta = {"airlike"} local node_check = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z})
local draw_tl = {"liquid","flowingliquid"} local rtn = false
local compare = draw_ta
local node = minetest.get_node({x=pos.x,y=pos.y-(num-1),z=pos.z}) if minetest.registered_nodes[node_check.name] then
local n_draw
if minetest.registered_nodes[node.name] then local nc_draw = minetest.registered_nodes[node_check.name].drawtype
n_draw = minetest.registered_nodes[node.name].drawtype
else if nc_draw ~= "liquid" and
n_draw = "normal" nc_draw ~= "flowingliquid" and
nc_draw ~= "airlike" then
rtn = true
end
end end
if type == "s" then return rtn
compare = draw_tl
end
for k,v in ipairs(compare) do
if n_draw == v then
return true
end
end
return false
end end
----------------------------------------------- -----------------------------------------------
-- Check X number nodes down fly/Swimmable -- Get X number nodes down drawtype and return
-- Thanks Gundul
function armor_fly_swim.get_node_down_drawtype(pos,num)
function node_down_fsable(pos,num,type)
local draw_ta = {"airlike"}
local draw_tl = {"liquid","flowingliquid"}
local i = 0 local i = 0
local nodes = {} local nodes = {}
local result ={} local result ={}
local compare = draw_ta
while (i < num ) do while (i < num ) do
table.insert(nodes, minetest.get_node({x=pos.x,y=pos.y-i,z=pos.z})) table.insert(nodes, minetest.get_node({x=pos.x,y=pos.y-i,z=pos.z}))
i=i+1 i=i+1
end end
if type == "s" then
compare = draw_tl
end
local n_draw local n_draw
for k,v in pairs(nodes) do
for k,node in pairs(nodes) do
local n_draw local n_draw
if minetest.registered_nodes[v.name] then if minetest.registered_nodes[node.name] then
n_draw = minetest.registered_nodes[v.name].drawtype n_draw = minetest.registered_nodes[node.name].drawtype
else else
n_draw = "normal" n_draw = "normal"
end end
table.insert(result, n_draw)
end
return result
end
-----------------------------------------------
-- Check X number nodes down fly/swimmable
function armor_fly_swim.node_down_check(nodes,num,type)
local draw_ta = {"airlike"}
local draw_tl = {"liquid","flowingliquid"}
local compare = draw_ta
local result = {}
local i = 1
if type == "s" then
compare = draw_tl
end
while (i <= num) do
local n_draw = nodes[i]
for k2,v2 in ipairs(compare) do for k2,v2 in ipairs(compare) do
if n_draw == v2 then if n_draw == v2 then
table.insert(result,"t") table.insert(result,"t")
end end
end end
i = i+1
end end
if #result == num then if #result == num then
@ -146,6 +156,7 @@ local compare = draw_ta
end end
end end
------------------------------------------ ------------------------------------------
-- Workaround for slab edge crouch -- Workaround for slab edge crouch

491
init.lua
View File

@ -26,7 +26,7 @@ armor_fly_swim.example_cape = minetest.settings:get_bool("example_cape" ,false)
local fly_anim = minetest.settings:get_bool("fly_anim" ,true) local fly_anim = minetest.settings:get_bool("fly_anim" ,true)
local fall_anim = minetest.settings:get_bool("fall_anim" ,true) local fall_anim = minetest.settings:get_bool("fall_anim" ,true)
local fall_tv = tonumber(minetest.settings:get("fall_tv" ,true)) or 100 local fall_tv = tonumber(minetest.settings:get("fall_tv" ,true)) or 150
-- Convert kp/h back to number of -y blocks per 0.05 of a second. -- Convert kp/h back to number of -y blocks per 0.05 of a second.
fall_tv = -1*(fall_tv/3.7) fall_tv = -1*(fall_tv/3.7)
local swim_anim = minetest.settings:get_bool("swim_anim" ,true) local swim_anim = minetest.settings:get_bool("swim_anim" ,true)
@ -108,258 +108,335 @@ end)
------------------------------------------------ ------------------------------------------------
minetest.register_globalstep(function() minetest.register_globalstep(function()
for _, player in pairs(minetest.get_connected_players()) do for _, player in pairs(minetest.get_connected_players()) do
local controls = player:get_player_control() --local start = minetest.get_us_time()
local controls_wasd = armor_fly_swim.get_wasd_state(controls) local pmeta = player:get_meta()
local attached_to = player:get_attach() local pos = player:get_pos()
local privs = minetest.get_player_privs(player:get_player_name()) local stg_old_pos = pmeta:get_string("flyswim_old_pos")
local pos = player:get_pos() local old_anim = pmeta:get_string("flyswim_old_anim")
local pmeta = player:get_meta() local stg_pos = minetest.pos_to_string(pos, 5)
local cur_anim = player_api.get_animation(player)
local ladder = {}
ladder.n = {is = false, pos = pos}
ladder.n_a = {is = false, pos = {x=pos.x,y=pos.y +1,z=pos.z}}
ladder.n_b = {is = false, pos = {x=pos.x,y=pos.y -1,z=pos.z}}
local is_slab = crouch_wa(player,pos)
local attack = ""
local ani_spd = 30 local ani_spd = 30
local offset = 0 local offset = 0
local tdebug = false local controls = player:get_player_control()
local controls_wasd = armor_fly_swim.get_wasd_state(controls)
-- reset player collisionbox, eye height, speed override local cur_anim = player:get_animation()
player:set_properties({collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3}}) local is_node_a_solid = armor_fly_swim.node_above_solid(pos)
player:set_properties({eye_height = 1.47}) local tdebug = false
local animation = ""
-- used to store and reset the players physics.speed settings local play_s = 0
-- back to what they were before fly_swim adjusted them
if pmeta:get_int("flyswim_std_under_slab") == 1 then
player:set_physics_override({speed = pmeta:get_float("flyswim_org_phy_or")})
pmeta:set_int("flyswim_std_under_slab", 0)
end
local vel = player:get_velocity() local vel = player:get_velocity()
-- basically 3D Pythagorean Theorem km/h -- basically 3D Pythagorean Theorem km/h
local play_s = (math.sqrt(math.pow(math.abs(vel.x),2) + play_s = (math.sqrt(math.pow(math.abs(vel.x),2) +
math.pow(math.abs(vel.y),2) + math.pow(math.abs(vel.y),2) +
math.pow(math.abs(vel.z),2) ))*3.6 math.pow(math.abs(vel.z),2) ))*3.6
-- Sets terminal velocity to about 100Km/hr beyond
-- this speed chunk load issues become more noticable -- Sets terminal velocity to about 150Km/hr beyond
-- this speed chunk load issues become more noticable
--(-1*(vel.y+1)) - catch those holding shift and over --(-1*(vel.y+1)) - catch those holding shift and over
-- acceleratering when falling so dynamic end point -- acceleratering when falling so dynamic end point
-- so player dosent bounce back up -- so player dosent bounce back up
if vel.y < fall_tv and controls.sneak ~= true then if vel.y < fall_tv and controls.sneak ~= true then
local tv_offset_y = -1*((-1*(vel.y+1)) + vel.y) local tv_offset_y = -1*((-1*(vel.y+1)) + vel.y)
player:add_player_velocity({x=0, y=tv_offset_y, z=0}) player:add_velocity({x=0, y=tv_offset_y, z=0})
end end
-- Check for Swinging/attacking and set string
if controls.LMB or controls.RMB then
attack = "_atk"
end
-- get ladder pos node ----------------------------------
local t_node = minetest.registered_nodes[minetest.get_node(ladder.n.pos).name] -- Light Check Inactive Player
if t_node and t_node.climbable then
ladder.n.is = true
end
--------------------------------------------------------- -- and no controls being pressed,
-- Start of Animation Cases -- -- serialized string compare on old and new pos
--------------------------------------------------------- -- reset no player properties
------------------------------------- -- Note: player_api code runs first so animation
-- Crouch Slab/Node Exception Case -- range from this mod has always been cleared
if not controls_wasd and
-- If player still udner slab/swimming in tunnel not controls.jump and
-- and they let go of shift this stops them
-- standing up
local node_check = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z})
local nc_draw = "normal"
local nc_slab = 0
local nc_node = 0
if minetest.registered_nodes[node_check.name] then
nc_slab = minetest.get_item_group(node_check.name, "slab")
nc_draw = minetest.registered_nodes[node_check.name].drawtype
if nc_draw ~= "liquid" and
nc_draw ~= "flowingliquid" and
nc_draw ~= "airlike" then
nc_node = 1
end
end
if crouch_sneak and
nc_slab == 1 and
not attached_to and
not controls.sneak and not controls.sneak and
not node_fsable(pos,2,"a") then not controls.LMB and
not controls.RMB and
stg_old_pos == stg_pos then
local animiation = "duck_std" if cur_anim then
-- when player moving -- Swim Through, Just Keep Swimming
if controls_wasd then if is_node_a_solid and
local play_or_2 =player:get_physics_override() (old_anim == "swim" or
pmeta:set_int("flyswim_std_under_slab", 1) old_anim == "swim_atk") then
pmeta:set_float("flyswim_org_phy_or", play_or_2.speed)
player:set_physics_override({speed = play_or_2.speed*0.2})
animation = "duck" animation = "swim"
player_api.set_animation(player, animation, ani_spd)
offset = 90
if tdebug then minetest.debug("light swim") end
-- Crouch, Just Keep Crouching
elseif old_anim == "duck_std" or
old_anim == "duck" then
animation = "duck_std"
player_api.set_animation(player, animation, ani_spd/2)
if tdebug then minetest.debug("light crouch") end
-- Fall, Just Keep Falling
elseif old_anim == "fall_atk" or
old_anim == "fall" then
animation = "fall"
player_api.set_animation(player, animation, ani_spd)
offset = 90
if tdebug then minetest.debug("light fall") end
end
end
----------------------------------
-- Full Check Active Player
else
local attached_to = player:get_attach()
local privs = minetest.get_player_privs(player:get_player_name())
local ladder = {}
ladder.n = {is = false, pos = pos}
ladder.n_a = {is = false, pos = {x=pos.x,y=pos.y +1,z=pos.z}}
ladder.n_b = {is = false, pos = {x=pos.x,y=pos.y -1,z=pos.z}}
local is_slab = crouch_wa(player,pos)
local nodes_down = armor_fly_swim.get_node_down_drawtype(pos,5)
local check_fsable = armor_fly_swim.node_down_check
local attack = ""
-- reset player collisionbox, eye height, speed override
player:set_properties({collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3}})
player:set_properties({eye_height = 1.47})
-- used to store and reset the players physics.speed settings
-- back to what they were before fly_swim adjusted them
if pmeta:get_int("flyswim_std_under_slab") == 1 then
player:set_physics_override({speed = pmeta:get_float("flyswim_org_phy_or")})
pmeta:set_int("flyswim_std_under_slab", 0)
end
-- Check for Swinging/attacking and set string
if controls.LMB or controls.RMB then
attack = "_atk"
end
-- get ladder pos node
local t_node = minetest.registered_nodes[minetest.get_node(ladder.n.pos).name]
if t_node and t_node.climbable then
ladder.n.is = true
end end
if crouch_anim == true then ---------------------------------------------------------
player_api.set_animation(player, animation ,ani_spd/2) -- Start of Animation Cases --
end ---------------------------------------------------------
-------------------------------------
-- Crouch Slab/Node Exception Case
player:set_properties({collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.45, 0.3}}) -- If player still under slab/swimming in tunnel
player:set_properties({eye_height = 1.27}) -- and they let go of shift this stops them
if tdebug then minetest.debug("crouch catch") end -- standing up
-- uses is_node_a_solid
local node_check = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z})
local nc_draw = "normal"
local nc_slab = 0
elseif swim_sneak and if minetest.registered_nodes[node_check.name] then
nc_node == 1 and nc_slab = minetest.get_item_group(node_check.name, "slab")
node_down_fsable(pos,1,"s") and end
not attached_to and
not controls.sneak then
player_api.set_animation(player, "swim",ani_spd) if crouch_sneak and
player:set_properties({collisionbox = {-0.4, 0, -0.4, 0.4, 0.5, 0.4}}) nc_slab >= 1 and
player:set_properties({eye_height = 0.7}) not attached_to and
offset = 90 not controls.sneak and
if tdebug then minetest.debug("swim through catch") end not check_fsable(nodes_down,2,"a") then
----------------------------- animation = "duck_std"
-- Climb
elseif climb_anim and
ladder.n.is and
(controls.jump or controls.sneak) then
-- Moved inside climb to save unessecary node checking -- when player moving
for k,def in pairs(ladder) do if controls_wasd then
if k ~= "n" then local play_or_2 =player:get_physics_override()
local node = minetest.registered_nodes[minetest.get_node(def.pos).name] pmeta:set_int("flyswim_std_under_slab", 1)
if node and node.climbable then pmeta:set_float("flyswim_org_phy_or", play_or_2.speed)
def.is = true player:set_physics_override({speed = play_or_2.speed*0.2})
animation = "duck"
end
if crouch_anim == true then
player_api.set_animation(player, animation ,ani_spd/2)
end
player:set_properties({collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.45, 0.3}})
player:set_properties({eye_height = 1.27})
if tdebug then minetest.debug("crouch catch") end
elseif swim_sneak and
is_node_a_solid and
check_fsable(nodes_down,1,"s") and
not attached_to and
not controls.sneak then
animation = "swim"
player_api.set_animation(player, animation, ani_spd)
player:set_properties({collisionbox = {-0.4, 0, -0.4, 0.4, 0.5, 0.4}})
player:set_properties({eye_height = 0.7})
offset = 90
if tdebug then minetest.debug("swim through catch") end
-----------------------------
-- Swim
elseif swim_anim == true and
controls_wasd and
check_fsable(nodes_down,2,"s") and
not attached_to then
animation = "swim"
player_api.set_animation(player,animation..attack ,ani_spd)
offset = 90
if tdebug then minetest.debug("swim") end
elseif swim_sneak == true and
swim_anim == true and
controls.sneak and
check_fsable(nodes_down,1,"s") and
not attached_to then
animation = "swim"
player_api.set_animation(player, animation, ani_spd)
player:set_properties({collisionbox = {-0.4, 0, -0.4, 0.4, 0.5, 0.4}})
player:set_properties({eye_height = 0.7})
offset = 90
if tdebug then minetest.debug("swim through") end
-----------------------------
-- Climb
-- Must be above sneak, saves a check
elseif climb_anim and
not attached_to and
ladder.n.is and
(controls.jump or controls.sneak) then
-- Moved inside climb to save unessecary node checking
for k,def in pairs(ladder) do
if k ~= "n" then
local node = minetest.registered_nodes[minetest.get_node(def.pos).name]
if node and node.climbable then
def.is = true
end
end end
end end
end
if (controls.sneak and ladder.n_b.is) or if (controls.sneak and ladder.n_b.is) or
(controls.jump and ladder.n_a.is) then (controls.jump and ladder.n_a.is) then
player_api.set_animation(player, "climb",ani_spd) animation = "climb"
if tdebug then minetest.debug("climb") end
end
----------------------------- player_api.set_animation(player, animation, ani_spd)
-- Swim if tdebug then minetest.debug("climb") end
end
elseif swim_anim == true and -----------------------------
controls_wasd and -- Sneak
node_down_fsable(pos,2,"s") and
not attached_to then
player_api.set_animation(player,"swim"..attack ,ani_spd) -- first elseif Crouch-walk workaround.
offset = 90 -- First slab player enters counts as a true slab
if tdebug then minetest.debug("swim") end -- and has an edge. As such the shift edge detection
-- kicks in and player can't move forwards. This
-- case sets the player collision box to 1 high for that first slab
elseif swim_sneak == true and elseif crouch_anim and
swim_anim == true and controls.sneak and
controls.sneak and controls.up and
node_down_fsable(pos,1,"s") and not check_fsable(nodes_down,2,"a") and
not attached_to then not attached_to and
play_s <= 1 and is_slab == 1 then
player_api.set_animation(player, "swim",ani_spd) animation = "duck"
player:set_properties({collisionbox = {-0.4, 0, -0.4, 0.4, 0.5, 0.4}})
player:set_properties({eye_height = 0.7})
offset = 90
if tdebug then minetest.debug("swim through") end
-----------------------------
-- Sneak
-- first elseif Crouch-walk workaround. if crouch_anim == true then
-- First slab player enters counts as a true slab player_api.set_animation(player, animation, ani_spd/2)
-- and has an edge. As such the shift edge detection player:set_properties({eye_height = 1.27})
-- kicks in and player can't move forwards. This end
-- case sets the player collision box to 1 high for that first slab
elseif crouch_anim and if crouch_sneak == true then
controls.sneak and -- Workaround set collision box to 1 high
controls.up and player:set_properties({collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.0, 0.3}})
not node_fsable(pos,2,"a") and end
not attached_to and if tdebug then minetest.debug("crouch_1") end
play_s <= 1 and is_slab == 1 then
if crouch_anim == true then elseif crouch_anim and
player_api.set_animation(player, "duck",ani_spd/2) controls.sneak and
not check_fsable(nodes_down,2,"a") and
not attached_to then
animation = "duck_std"
if controls_wasd then animation = "duck" end
player_api.set_animation(player, animation, ani_spd/2)
player:set_properties({eye_height = 1.27}) player:set_properties({eye_height = 1.27})
end
if crouch_sneak == true then if crouch_sneak == true then
-- Workaround set collision box to 1 high player:set_properties({collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.45, 0.3}})
player:set_properties({collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.0, 0.3}}) end
end if tdebug then minetest.debug("crouch_2") end
if tdebug then minetest.debug("crouch_1") end
elseif crouch_anim and -----------------------------
controls.sneak and -- Flying
not node_fsable(pos,2,"a") and
not attached_to then
local animation = "duck_std" elseif fly_anim == true and
if controls_wasd then animation = "duck" end privs.fly == true and
check_fsable(nodes_down,3,"a") and
not attached_to then
player_api.set_animation(player, animation, ani_spd/2) -- Vel.y value is a compromise for code simplicity,
player:set_properties({eye_height = 1.27}) -- Flyers wont get fall animation until faster than -18m/s
if crouch_sneak == true then if controls_wasd then
player:set_properties({collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.45, 0.3}})
end
if tdebug then minetest.debug("crouch_2") end
----------------------------- animation = "fly"
-- Flying player_api.set_animation(player, animation..attack, ani_spd)
elseif fly_anim == true and
privs.fly == true and
node_down_fsable(pos,3,"a") and
not attached_to then
-- Vel.y value is a compromise for code simplicity,
-- Flyers wont get fall animation until below -18m/s
if controls_wasd then
player_api.set_animation(player, "fly"..attack, ani_spd)
offset = 90
if tdebug then minetest.debug("fly") end
elseif fall_anim == true and
vel.y < -18.0 then
player_api.set_animation(player, "fall"..attack, ani_spd)
offset = 90 offset = 90
if tdebug then minetest.debug("fly_fall") end if tdebug then minetest.debug("fly") end
end
----------------------------- elseif fall_anim == true and
-- Falling vel.y < -18.0 then
elseif fall_anim == true and animation = "fall"
node_down_fsable(pos,5,"a") and player_api.set_animation(player, animation..attack, ani_spd)
vel.y < -0.5 and offset = 90
not attached_to then if tdebug then minetest.debug("fly_fall") end
end
-----------------------------
-- Falling
elseif fall_anim == true and
check_fsable(nodes_down,5,"a") and
vel.y < -0.5 and
not attached_to then
animation = "fall"
player_api.set_animation(player, animation..attack, ani_spd)
offset = 90
if tdebug then minetest.debug("fall") end
end
player_api.set_animation(player, "fall"..attack, ani_spd)
offset = 90
if tdebug then minetest.debug("fall") end
end end
--------------------------------------------------------- ---------------------------------------------------------
-- Post MT 5.3 Head Animation -- -- Post MT 5.3 Head Animation --
--------------------------------------------------------- ---------------------------------------------------------
-- this function was added in 5.3 which has the bone position -- this function was added in 5.3 which has the bone position
-- change break animations fix - i think (MT #9807) -- change break animations fix - i think (MT #9807)
-- I'm not too sure how to directly test for the bone fix/ MT version -- I'm not too sure how to directly test for the bone fix/ MT version
-- so I simply check for this function. -- so I simply check for this function.
local check_v = minetest.is_creative_enabled local check_v = minetest.is_creative_enabled
if check_v ~= nil then if check_v ~= nil then
@ -380,7 +457,15 @@ minetest.register_globalstep(function()
player:set_bone_position("Head", vector.new(0, 6.35, 0),vector.new(look_degree + offset, 0, 0)) 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 -- -- Code by LoneWolfHT - Headanim mod MIT Licence --
end end
--minetest.chat_send_all(play_s.." km/h") -- for diagnosing chunk emerge issues when falling currently unsolved
-----------------------------
-- Update player meta
pmeta:set_string("flyswim_old_anim", animation)
pmeta:set_string("flyswim_old_pos",minetest.pos_to_string(pos, 5))
--minetest.debug(play_s.." km/h")
--minetest.debug(dump(minetest.get_us_time()-start))
end end
end) end)

View File

@ -1,8 +1,8 @@
# Make capes part of 3d Armor when enabled # Make capes part of 3d Armor when enabled
capes_add_to_3darmor (Add Capes to 3d Armor) bool true capes_add_to_3darmor (Add Capes to 3d Armor) bool false
# Disable the Example Cape "Someones Cape" # Enable/Disable the Example Cape "Someones Cape"
example_cape (The Example Cape "Someones Cape" which grants fly_privs when worn and a 100% speed increase) bool true example_cape (The Example Cape "Someones Cape" which grants fly_privs when worn and a 100% speed increase) bool false
# Enable Fly Animation # Enable Fly Animation
fly_anim (Enable fly animation) bool true fly_anim (Enable fly animation) bool true
@ -11,7 +11,7 @@ fly_anim (Enable fly animation) bool true
fall_anim (Enable fall animation) bool true fall_anim (Enable fall animation) bool true
# Terminal Velocity Speed kp/h # Terminal Velocity Speed kp/h
fall_tv (Set terminal velocity speed - recommend not exceeding 100 kp/h) int 100 fall_tv (Set terminal velocity speed - recommend not exceeding 150 kp/h) int 150
# Enable Swim Animation # Enable Swim Animation
swim_anim (Enable swim animation) bool true swim_anim (Enable swim animation) bool true