mirror of
https://github.com/APercy/airutils.git
synced 2025-03-15 08:01:22 +00:00
turning airutils into a lib
This commit is contained in:
parent
6979cbe027
commit
b6bca8a47a
2 changed files with 128 additions and 2 deletions
|
@ -49,8 +49,8 @@ airutils.groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}
|
|||
-- PAPI node (default left)
|
||||
minetest.register_node("airutils:papi",{
|
||||
description = "PAPI",
|
||||
inventory_image = "papi.png",
|
||||
wield_image = "papi.png",
|
||||
--inventory_image = "papi.png",
|
||||
--wield_image = "papi.png",
|
||||
tiles = {"airutils_black.png", "airutils_u_black.png", "airutils_white.png",
|
||||
"airutils_metal.png", {name = "airutils_red.png", backface_culling = true},},
|
||||
groups = airutils.groups,
|
||||
|
|
126
init.lua
126
init.lua
|
@ -20,5 +20,131 @@ function airutils.canDig(pos, player)
|
|||
and player:get_player_name() == meta:get_string("owner")
|
||||
end
|
||||
|
||||
function airutils.check_node_below(obj)
|
||||
local pos_below = obj:get_pos()
|
||||
if pos_below then
|
||||
pos_below.y = pos_below.y - 2.5
|
||||
local node_below = minetest.get_node(pos_below).name
|
||||
local nodedef = minetest.registered_nodes[node_below]
|
||||
local touching_ground = not nodedef or -- unknown nodes are solid
|
||||
nodedef.walkable or false
|
||||
local liquid_below = not touching_ground and nodedef.liquidtype ~= "none"
|
||||
return touching_ground, liquid_below
|
||||
end
|
||||
return nil, nil
|
||||
end
|
||||
|
||||
function airutils.check_is_under_water(obj)
|
||||
local pos_up = obj:get_pos()
|
||||
pos_up.y = pos_up.y + 0.1
|
||||
local node_up = minetest.get_node(pos_up).name
|
||||
local nodedef = minetest.registered_nodes[node_up]
|
||||
local liquid_up = nodedef.liquidtype ~= "none"
|
||||
return liquid_up
|
||||
end
|
||||
|
||||
function airutils.setText(self, vehicle_name)
|
||||
local properties = self.object:get_properties()
|
||||
local formatted = ""
|
||||
if self.hp_max then
|
||||
formatted = " Current hp: " .. string.format(
|
||||
"%.2f", self.hp_max
|
||||
)
|
||||
end
|
||||
if properties then
|
||||
properties.infotext = "Nice ".. vehicle_name .." of " .. self.owner .. "." .. formatted
|
||||
self.object:set_properties(properties)
|
||||
end
|
||||
end
|
||||
|
||||
function airutils.transfer_control(self, status)
|
||||
if status == false then
|
||||
self._command_is_given = false
|
||||
if self._passenger then
|
||||
minetest.chat_send_player(self._passenger,
|
||||
core.colorize('#ff0000', " >>> The captain got the control."))
|
||||
end
|
||||
if self.driver_name then
|
||||
minetest.chat_send_player(self.driver_name,
|
||||
core.colorize('#00ff00', " >>> The control is with you now."))
|
||||
end
|
||||
else
|
||||
self._command_is_given = true
|
||||
if self._passenger then
|
||||
minetest.chat_send_player(self._passenger,
|
||||
core.colorize('#00ff00', " >>> The control is with you now."))
|
||||
end
|
||||
if self.driver_name then minetest.chat_send_player(self.driver_name," >>> The control was given.") end
|
||||
end
|
||||
end
|
||||
|
||||
--returns 0 for old, 1 for new
|
||||
function airutils.detect_player_api(player)
|
||||
local player_proterties = player:get_properties()
|
||||
local mesh = "character.b3d"
|
||||
if player_proterties.mesh == mesh then
|
||||
local models = player_api.registered_models
|
||||
local character = models[mesh]
|
||||
if character then
|
||||
if character.animations.sit.eye_height then
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return 0
|
||||
end
|
||||
|
||||
--lift
|
||||
local function pitchroll2pitchyaw(aoa,roll)
|
||||
if roll == 0.0 then return aoa,0 end
|
||||
-- assumed vector x=0,y=0,z=1
|
||||
local p1 = math.tan(aoa)
|
||||
local y = math.cos(roll)*p1
|
||||
local x = math.sqrt(p1^2-y^2)
|
||||
local pitch = math.atan(y)
|
||||
local yaw=math.atan(x)*math.sign(roll)
|
||||
return pitch,yaw
|
||||
end
|
||||
|
||||
function airutils.getLiftAccel(self, velocity, accel, longit_speed, roll, curr_pos, lift, max_height)
|
||||
--lift calculations
|
||||
-----------------------------------------------------------
|
||||
max_height = max_height or 20000
|
||||
local wing_config = 0
|
||||
if self._wing_configuration then wing_config = self._wing_configuration end --flaps!
|
||||
|
||||
local retval = accel
|
||||
if longit_speed > 1 then
|
||||
local angle_of_attack = math.rad(self._angle_of_attack + wing_config)
|
||||
--local acc = 0.8
|
||||
local daoa = deg(angle_of_attack)
|
||||
|
||||
--to decrease the lift coefficient at hight altitudes
|
||||
local curr_percent_height = (100 - ((curr_pos.y * 100) / max_height))/100
|
||||
|
||||
local rotation=self.object:get_rotation()
|
||||
local vrot = mobkit.dir_to_rot(velocity,rotation)
|
||||
|
||||
local hpitch,hyaw = pitchroll2pitchyaw(angle_of_attack,roll)
|
||||
|
||||
local hrot = {x=vrot.x+hpitch,y=vrot.y-hyaw,z=roll}
|
||||
local hdir = mobkit.rot_to_dir(hrot) --(hrot)
|
||||
local cross = vector.cross(velocity,hdir)
|
||||
local lift_dir = vector.normalize(vector.cross(cross,hdir))
|
||||
|
||||
local lift_coefficient = (0.24*abs(daoa)*(1/(0.025*daoa+3))^4*math.sign(angle_of_attack))
|
||||
local lift_val = math.abs((lift*(vector.length(velocity)^2)*lift_coefficient)*curr_percent_height)
|
||||
--minetest.chat_send_all('lift: '.. lift_val)
|
||||
|
||||
local lift_acc = vector.multiply(lift_dir,lift_val)
|
||||
--lift_acc=vector.add(vector.multiply(minetest.yaw_to_dir(rotation.y),acc),lift_acc)
|
||||
|
||||
retval = vector.add(retval,lift_acc)
|
||||
end
|
||||
-----------------------------------------------------------
|
||||
-- end lift
|
||||
return retval
|
||||
end
|
||||
|
|
Loading…
Add table
Reference in a new issue