From b6bca8a47aee05f9ab352878c8fefd7f6834817c Mon Sep 17 00:00:00 2001 From: Alexsandro Percy Date: Mon, 31 Jan 2022 16:57:14 -0300 Subject: [PATCH] turning airutils into a lib --- airutils_papi.lua | 4 +- init.lua | 126 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 128 insertions(+), 2 deletions(-) diff --git a/airutils_papi.lua b/airutils_papi.lua index ad56d93..b840c0c 100644 --- a/airutils_papi.lua +++ b/airutils_papi.lua @@ -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, diff --git a/init.lua b/init.lua index 7053e3c..368609c 100644 --- a/init.lua +++ b/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