From cbf33a3a6373073107def7dc17b6bf05549c0c47 Mon Sep 17 00:00:00 2001 From: Alexsandro Percy Date: Sun, 3 Sep 2023 21:03:59 -0300 Subject: [PATCH] updated trike mechanics --- crafts.lua | 69 +++ depends.txt | 3 - entities.lua | 56 +++ init.lua | 273 +++++++++--- models/trike_body.b3d | Bin 79701 -> 70258 bytes models/trike_front_wheel.b3d | Bin 19454 -> 0 bytes models/{pointer.b3d => trike_pointer.b3d} | Bin models/trike_propeller.b3d | Bin 8806 -> 0 bytes models/trike_seat_base.b3d | Bin 311 -> 0 bytes models/trike_wheels.b3d | Bin 0 -> 40093 bytes sounds/trike_collision.ogg | Bin 9748 -> 0 bytes sounds/trike_touch.ogg | Bin 17479 -> 0 bytes textures/repair_tool.png | Bin 6218 -> 0 bytes textures/{icon1.png => trike.png} | Bin textures/{icon2.png => trike_body.png} | Bin textures/trike_hud_panel.png | Bin 35718 -> 0 bytes textures/trike_ind_box.png | Bin 4864 -> 0 bytes textures/{icon3.png => trike_wing_ico.png} | Bin trike_control.lua | 160 ------- trike_crafts.lua | 80 ---- trike_custom_physics.lua | 40 -- trike_entities.lua | 445 ------------------- trike_forms.lua | 57 --- trike_fuel_management.lua | 48 --- trike_global_definitions.lua | 13 - trike_hud.lua | 354 --------------- trike_utilities.lua | 477 --------------------- 27 files changed, 333 insertions(+), 1742 deletions(-) create mode 100755 crafts.lua delete mode 100644 depends.txt create mode 100644 entities.lua mode change 100644 => 100755 init.lua delete mode 100644 models/trike_front_wheel.b3d rename models/{pointer.b3d => trike_pointer.b3d} (100%) delete mode 100644 models/trike_propeller.b3d delete mode 100755 models/trike_seat_base.b3d create mode 100755 models/trike_wheels.b3d delete mode 100644 sounds/trike_collision.ogg delete mode 100644 sounds/trike_touch.ogg delete mode 100644 textures/repair_tool.png rename textures/{icon1.png => trike.png} (100%) rename textures/{icon2.png => trike_body.png} (100%) delete mode 100644 textures/trike_hud_panel.png delete mode 100644 textures/trike_ind_box.png rename textures/{icon3.png => trike_wing_ico.png} (100%) delete mode 100644 trike_control.lua delete mode 100644 trike_crafts.lua delete mode 100644 trike_custom_physics.lua delete mode 100644 trike_entities.lua delete mode 100644 trike_forms.lua delete mode 100644 trike_fuel_management.lua delete mode 100644 trike_global_definitions.lua delete mode 100755 trike_hud.lua delete mode 100644 trike_utilities.lua diff --git a/crafts.lua b/crafts.lua new file mode 100755 index 0000000..ea3904c --- /dev/null +++ b/crafts.lua @@ -0,0 +1,69 @@ +-- wing +minetest.register_craftitem("trike:wing",{ + description = "trike wing", + inventory_image = "trike_wing_ico.png", +}) +-- fuselage +minetest.register_craftitem("trike:fuselage",{ + description = "trike fuselage", + inventory_image = "trike_body.png", +}) + +-- trike +minetest.register_craftitem("trike:trike", { + description = "Ultralight Trike", + inventory_image = "trike.png", + liquids_pointable = true, + + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return + end + + local pointed_pos = pointed_thing.under + --local node_below = minetest.get_node(pointed_pos).name + --local nodedef = minetest.registered_nodes[node_below] + + pointed_pos.y=pointed_pos.y+0.5 + local trike = minetest.add_entity(pointed_pos, "trike:trike") + if trike and placer then + local ent = trike:get_luaentity() + local owner = placer:get_player_name() + ent.owner = owner + trike:set_yaw(placer:get_look_horizontal()) + itemstack:take_item() + end + + return itemstack + end, +}) + +-- +-- crafting +-- + +if not minetest.settings:get_bool('trike.disable_craftitems') and minetest.get_modpath("default") then + minetest.register_craft({ + output = "trike:wing", + recipe = { + {"", "wool:white", "" }, + {"wool:white", "default:steel_ingot", "wool:white"}, + {"farming:string", "wool:white", "farming:string"}, + } + }) + minetest.register_craft({ + output = "trike:fuselage", + recipe = { + {"", "default:diamondblock", ""}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:mese_block", "default:steel_ingot"}, + } + }) + minetest.register_craft({ + output = "trike:trike", + recipe = { + {"", ""}, + {"trike:fuselage", "trike:wing"}, + } + }) +end diff --git a/depends.txt b/depends.txt deleted file mode 100644 index 59ac2cb..0000000 --- a/depends.txt +++ /dev/null @@ -1,3 +0,0 @@ -mobkit -default -biofuel diff --git a/entities.lua b/entities.lua new file mode 100644 index 0000000..9704af2 --- /dev/null +++ b/entities.lua @@ -0,0 +1,56 @@ + +-- +-- entity +-- + +trike.vector_up = vector.new(0, 1, 0) + +minetest.register_entity('trike:pointer',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + visual = "mesh", + mesh = "trike_pointer.b3d", + visual_size = {x = 0.4, y = 0.4, z = 0.4}, + textures = {"trike_grey.png"}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, +}) + +minetest.register_entity('trike:wheels',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + visual = "mesh", + backface_culling = false, + mesh = "trike_wheels.b3d", + --visual_size = {x = 3, y = 3, z = 3}, + textures = {"trike_black.png", "trike_metal.png", "trike_black.png", "trike_metal.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity("trike:trike", + airutils.properties_copy(trike.plane_properties) +) diff --git a/init.lua b/init.lua old mode 100644 new mode 100755 index a38e0e3..848c902 --- a/init.lua +++ b/init.lua @@ -1,39 +1,206 @@ -trike={} -trike.gravity = tonumber(minetest.settings:get("movement_gravity")) or 9.8 -trike.colors ={ - black='#2b2b2b', - blue='#0063b0', - brown='#8c5922', - cyan='#07B6BC', - dark_green='#567a42', - dark_grey='#6d6d6d', - green='#4ee34c', - grey='#9f9f9f', - magenta='#ff0098', - orange='#ff8b0e', - pink='#ff62c6', - red='#dc1818', - violet='#a437ff', - white='#FFFFFF', - yellow='#ffe400', + +trike={} + +local TRIKE_GAUGE_FUEL_POSITION = {x=1.5,y=6.2,z=15.2} +local TRIKE_GAUGE_POWER_POSITION = {x=1.5,y=7.7,z=15.2} +local TRIKE_GAUGE_CLIMBER_POSITION = {x=-1.2,y=7.55,z=15.2} + +function trike.register_parts_method(self) + local pos = self.object:get_pos() + + local wheels=minetest.add_entity(pos,'trike:wheels') + wheels:set_attach(self.object,'',{x=0,y=0,z=0},{x=0,y=0,z=0}) + self.wheels = wheels + + local fuel_gauge=minetest.add_entity(pos,'trike:pointer') + local fuel_percentage = (self._energy*100)/self._max_fuel + local fuel_angle = -(fuel_percentage*180)/100 + fuel_gauge:set_attach(self.object,'',TRIKE_GAUGE_FUEL_POSITION,{x=0,y=0,z=fuel_angle}) + self.fuel_gauge = fuel_gauge + + local power_gauge=minetest.add_entity(pos,'trike:pointer') + local power_indicator_angle = airutils.get_gauge_angle(self._power_lever/6.5) + power_gauge:set_attach(self.object,'',TRIKE_GAUGE_POWER_POSITION,{x=0,y=0,z=power_indicator_angle}) + self.power_gauge = power_gauge + + local climb_gauge=minetest.add_entity(pos,'trike:pointer') + local climb_angle = airutils.get_gauge_angle(0) + climb_gauge:set_attach(self.object,'',TRIKE_GAUGE_CLIMBER_POSITION,{x=0,y=0,z=climb_angle}) + self.climb_gauge = climb_gauge +end + +function trike.destroy_parts_method(self) + if self.wheels then self.wheels:remove() end + if self.fuel_gauge then self.fuel_gauge:remove() end + if self.power_gauge then self.power_gauge:remove() end + if self.climb_gauge then self.climb_gauge:remove() end + + local pos = self.object:get_pos() + + pos.y=pos.y+2 + minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'trike:wing') + + for i=1,6 do + minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'default:mese_crystal') + minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'default:diamond') + end + + for i=1,3 do + minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'default:steel_ingot') + end + +end + +function trike.step_additional_function(self) + self.object:set_bone_position("wing", {x=0,y=29,z=0}, {x=-self._elevator_angle/2.5,y=0,z=(self._rudder_angle/2.5)}) + if (self.driver_name==nil) and (self.co_pilot==nil) then --pilot or copilot + return + end + local pos = self.object:get_pos() + + local fuel_percentage = (self._energy*100)/self._max_fuel + local fuel_angle = -(fuel_percentage*180)/100 + self.fuel_gauge:set_attach(self.object,'',TRIKE_GAUGE_FUEL_POSITION,{x=0,y=0,z=fuel_angle}) + + local power_indicator_angle = airutils.get_gauge_angle(self._power_lever/6.5) + self.power_gauge:set_attach(self.object,'',TRIKE_GAUGE_POWER_POSITION,{x=0,y=0,z=power_indicator_angle}) + + local climb_angle = airutils.get_gauge_angle(self._climb_rate) + self.climb_gauge:set_attach(self.object,'',TRIKE_GAUGE_CLIMBER_POSITION,{x=0,y=0,z=climb_angle}) +end + +trike.plane_properties = { + initial_properties = { + physical = true, + collide_with_objects = true, + collisionbox = {-1.2, 0.0, -1.2, 1.2, 3, 1.2}, --{-1,0,-1, 1,0.3,1}, + selectionbox = {-2, 0, -2, 2, 1, 2}, + visual = "mesh", + backface_culling = false, + mesh = "trike_body.b3d", + stepheight = 0.5, + textures = { + "trike_black.png", --bancos + "airutils_metal.png", + "airutils_metal.png", + "airutils_metal.png", + "airutils_metal.png", + "airutils_metal.png", + "trike_painting.png", --pintura + "trike_grey.png", --motor + "airutils_metal.png", --trem nariz + "trike_white.png", --tanque + "trike_black.png", --tampa do tanque + "trike_black.png", --carburador + "trike_black.png", --escape + "trike_grey.png", --interior + "trike_metal.png", --estrutura asa + "trike_black.png", -- cabos + "trike_wing.png", --bordo de fuga + "trike_painting.png", --bordo de ataque + "trike_panel.png", --painel + "trike_rotor.png", --helice + "trike_black.png", --cubo helice + "airutils_red.png", + "airutils_green.png", + "airutils_blue.png", + "airutils_metal.png", + }, + }, + textures = {}, + _anim_frames = 11, + driver_name = nil, + sound_handle = nil, + owner = "", + static_save = true, + infotext = "", + hp_max = 50, + shaded = true, + show_on_minimap = true, + springiness = 0.1, + buoyancy = 1.02, + physics = airutils.physics, + _vehicle_name = "trike", + _use_camera_relocation = false, + _seats = {{x=0,y=7,z=8},{x=0,y=9,z=1.6},}, + _seats_rot = {0,0}, --necessary when using reversed seats + _have_copilot = false, --wil use the second position of the _seats list + _max_plane_hp = 50, + _enable_fire_explosion = false, + _longit_drag_factor = 0.13*0.13, + _later_drag_factor = 2.0, + _wing_angle_of_attack = 2.5, + _wing_span = 12, --meters + _min_speed = 3, + _max_speed = 8, + _max_fuel = 5, + _fuel_consumption_divisor = 1600000, + _speed_not_exceed = 14, + _damage_by_wind_speed = 4, + _hard_damage = true, + _min_attack_angle = 0.2, + _max_attack_angle = 90, + _elevator_auto_estabilize = 100, + _tail_lift_min_speed = 3, + _tail_lift_max_speed = 5, + _max_engine_acc = 7.5, + _tail_angle = 0, --degrees + _lift = 18, + _trunk_slots = 2, --the trunk slots + _rudder_limit = 30.0, + _elevator_limit = 40.0, + _elevator_response_attenuation = 10, + _pitch_intensity = 0.8, + _yaw_intensity = 40, + _yaw_turn_rate = 12, + _elevator_pos = {x=0, y=0, z=0}, + _rudder_pos = {x=0,y=0,z=0}, + _aileron_r_pos = {x=0,y=0,z=0}, + _aileron_l_pos = {x=0,y=0,z=0}, + _color = "#0063b0", + _color_2 = "#0063b0", + _rudder_angle = 0, + _acceleration = 0, + _engine_running = false, + _angle_of_attack = 0, + _elevator_angle = 0, + _power_lever = 0, + _last_applied_power = 0, + _energy = 1.0, + _last_vel = {x=0,y=0,z=0}, + _longit_speed = 0, + _show_hud = true, + _instruction_mode = false, --flag to intruction mode + _command_is_given = false, --flag to mark the "owner" of the commands now + _autopilot = false, + _auto_pilot_altitude = 0, + _last_accell = {x=0,y=0,z=0}, + _last_time_command = 1, + _inv = nil, + _inv_id = "", + _collision_sound = "airutils_collision", --the col sound + _engine_sound = "trike_engine", + _painting_texture = {"trike_painting.png",}, --the texture to paint + _painting_texture_2 = {"airutils_painting_2.png",}, --the texture to paint + _mask_painting_associations = {}, + _register_parts_method = trike.register_parts_method, --the method to register plane parts + _destroy_parts_method = trike.destroy_parts_method, + _plane_y_offset_for_bullet = 1, + _custom_step_additional_function = trike.step_additional_function, + _inverted_pitch_reaction = true, + + get_staticdata = airutils.get_staticdata, + on_deactivate = airutils.on_deactivate, + on_activate = airutils.on_activate, + logic = airutils.logic, + on_step = airutils.on_step, + on_punch = airutils.on_punch, + on_rightclick = airutils.on_rightclick, } -trike.trunk_slots = 3 - -dofile(minetest.get_modpath("trike") .. DIR_DELIM .. "trike_global_definitions.lua") -dofile(minetest.get_modpath("trike") .. DIR_DELIM .. "trike_crafts.lua") -dofile(minetest.get_modpath("trike") .. DIR_DELIM .. "trike_control.lua") -dofile(minetest.get_modpath("trike") .. DIR_DELIM .. "trike_fuel_management.lua") -dofile(minetest.get_modpath("trike") .. DIR_DELIM .. "trike_custom_physics.lua") -dofile(minetest.get_modpath("trike") .. DIR_DELIM .. "trike_utilities.lua") -dofile(minetest.get_modpath("trike") .. DIR_DELIM .. "trike_entities.lua") -dofile(minetest.get_modpath("trike") .. DIR_DELIM .. "trike_hud.lua") -dofile(minetest.get_modpath("trike") .. DIR_DELIM .. "trike_forms.lua") - --- --- helpers and co. --- +dofile(minetest.get_modpath("trike") .. DIR_DELIM .. "crafts.lua") +dofile(minetest.get_modpath("trike") .. DIR_DELIM .. "entities.lua") -- -- items @@ -45,37 +212,13 @@ local function fetch_setting(name) return settings and settings:get(sname) or minetest.settings:get(sname) end -trike.restricted = fetch_setting("restricted") - -minetest.register_privilege("flight_licence", { - description = "Gives a flight licence to the player", - give_to_singleplayer = true -}) +local old_entities = {"trike:seat_base","trike:engine"} +for _,entity_name in ipairs(old_entities) do + minetest.register_entity(":"..entity_name, { + on_activate = function(self, staticdata) + self.object:remove() + end, + }) +end --- add chatcommand to eject from trike - -minetest.register_chatcommand("trike_eject", { - params = "", - description = "Ejects from trike", - privs = {interact = true}, - func = function(name, param) - local colorstring = core.colorize('#ff0000', " >>> you are not inside your ultralight trike") - local player = minetest.get_player_by_name(name) - local attached_to = player:get_attach() - - if attached_to ~= nil then - local parent = attached_to:get_attach() - if parent ~= nil then - local entity = parent:get_luaentity() - if entity.driver_name == name and entity.name == "trike:trike" then - trike.dettachPlayer(entity, player) - else - minetest.chat_send_player(name,colorstring) - end - end - else - minetest.chat_send_player(name,colorstring) - end - end -}) diff --git a/models/trike_body.b3d b/models/trike_body.b3d index 02d9b47a718a94e56fc9d75e599b9a36996a39b5..4c51e6cb75bab0f7f176ae3e4d9794906fd6c606 100755 GIT binary patch delta 14376 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 delta 22095 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 JZkau`;D4dsV3Gg; diff --git a/models/trike_front_wheel.b3d b/models/trike_front_wheel.b3d deleted file mode 100644 index 50387ff72a812b878da9bc089365846101ee1ff4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19454 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 UrmV)6{PnEHYnfXz*MwZ}f9wY|DF6Tf diff --git a/models/pointer.b3d b/models/trike_pointer.b3d similarity index 100% rename from models/pointer.b3d rename to models/trike_pointer.b3d diff --git a/models/trike_propeller.b3d b/models/trike_propeller.b3d deleted file mode 100644 index bdecbc6d21cfed7e882d62d7365b89d21814c915..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8806 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 Sw8$^wXB&RjX|!~D-~R*6Bgmcr diff --git a/models/trike_seat_base.b3d b/models/trike_seat_base.b3d deleted file mode 100755 index ccf1db3b63c52f5ffee961c2f279d43cd0feec26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 311 zcmZ>AGIr5tWMBXy2B)CVU@agGVkhM!CTBC8J>z2!!wd`!_CN`+EQtOO1b+T5t{;JH z=gOSSyp+@;Jp%(nkQ@?duxA8n1mRCCruJWe7$)iK8tkzJ$N?D?78DZP0+j$+&jc2) z-*;NNVW0J!&s)=U3yoYSC))r2UvHOvqTUW9R=mu}4kiXu7iyem3l-Z3Qx|Cb4km_8 cFNPf|KJ^$F7w63$CV zNT}AJal=I*^R2tKYSX1;>C$BqwrsBBnGzCw5C0jfL7qYC)~;`>uIE(Kwt34rZ}Z=4 z)~jE=#?Gk;2@UGkZ^S(cCGKiifBqMpdfc3l(7tz%?tKeB*s)!^u7Cb#EEo0*4%sTy ztvBk-lRdJhKnu<{)e5G3CiyS-%CD#~Wti?-qNwKlr8AC4IWsx5s_v^+%g+FWQF7m)H0X^i?U0g_R2y zRJHzNpK^TAX4{Ll;qs*|GzJrGd!ezFXxodnabnJBZ`15G-i(veQ>MLgxA$zrLSA?b zHdx)lo4he+%=Tv+$zJnkGkNr-ZA!D5v2nCwCD7$FW+mOB;{lmD{uNJGbW`-1h=ov<>=3_l34W*uP-~N2heh z{_&V?|9Jgz|9H%xpgh8t46w8=Y##`?58 zjyXIAdHg(PR~xQm~`j6wIHMYfVhR5I{Y-=jE>1xBZFSJF+%wNZEFt%K6xb`K}+|k}8 zv(|XsaelWSc_nE?zoOnRXk$>K@0G_nYPEP{()Jx?Vm7v$8U5UM@?_kvljGJ~^-Uv> z^-9**l~^EMnu{}IjN`o^m_7550@w)029M?2C3(v>LDM`HU zF`|PSm zo9jA_wu|dNtu5NHIicfO=Gn6>I@hD`A>4QQT(x9V%(l*<8NXMtDAH`_e^oOxqs!Ic#(J(&m`!#rlu)I-7UmKK?hG z%a=CCTrYMmZH~$PE}P4j zw&+}szLPM=tbj3X^G=t|(Az$^kx5XzQ(x~=WDJu zT)yG4YV%I|vhP0%%_m)LxO~H7)#jb_{TlP3?VN*_YnGzlc?Tdc5hF zbFq!k95c;jbG4fTb3Gn!XpWiYvblV(#vC&?Z~t?SndY*&eAx!yAwqM^Si4bM)R))L zyEtB6LpH~B*)ZSz+jYfy++OF<9Mffs=Nr9t8#Soia7Y$Dy@Gfpym6^{2T>#~V@~X`IMbL#%KImeVna>Yh3Ndtgnaa!~teS8IbUAdD z%FJH_T@4k0u2q@&>!3nVL8vgqGV?b;*F#01qAD|A47v%r5h|`S^Ch7Y5JJKUrBr7A z7N`tV8cI}|`SMUXs4P@LW#%hGm7t1H6_uH1Ft93gE5!IY%gk4UQlMn$Hi%{BYeF@k z>QF6}nZE<74c!jisWS8Rpt?{UsJ_a~H-PSj?t&Vs%zP85G1LfZsxtHULia$;p!-y2 zz6EqY)Es(1W#)%MPeMbWr&MNs1T-8P28~pi`DdV~p;6GYDl&`Ri4m6?AXdJS3)tx=izRA?>q29%~U^KU}y zpmgXhh-KzCKyO3qp?6efek1fA^e(hXW#+d+TcFL*`zkZP9r^&;27Rb9^B+Mwp&igJ zm6_iIeGKh}K2e$Zz0haSr_kprGyfIzCG-Wf4`P{l-iwNyrv)dJTR|+n8TuXi4f+*20Ud|_fKEfF zpp(#f=mV~)odL3dnW0Qjb|@Q^6-udByKZj$KU1#QzdfsQ9cy_O^h2vYecSPXE#*t+ z($ims+ryEPWm%(I{dzUXJ8Rt2@RCfyEgmf}`LTZ!oc_M~!-dI@{rfLZv!nyUCE+0SG{6C*#URq6YqFZAb z_<`O%`u6CZ@a|8!R&?adb<1Ylr2f3Tj%6w5wW?Wjs;#Eed}E6+I{O>>e_wlTs;#Eed}E6+I{O>>e_wlTs;#Eed}E6+I{O>>hi)Gj~!|MK=4_IzjJ?LPu#RB z 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 bOms~u{KwRIlQ;eM2lM#X#Q*>LgL(f4B{7ok literal 0 HcmV?d00001 diff --git a/sounds/trike_collision.ogg b/sounds/trike_collision.ogg deleted file mode 100644 index b15fbb1e32a9d835cafc186d1565eac3d63d41ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9748 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 KXtVn2mH!9hX=}d# diff --git a/sounds/trike_touch.ogg b/sounds/trike_touch.ogg deleted file mode 100644 index 90d35c428fda608680896dfbaa3257332f2db61b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17479 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 diff --git a/textures/icon1.png b/textures/trike.png similarity index 100% rename from textures/icon1.png rename to textures/trike.png diff --git a/textures/icon2.png b/textures/trike_body.png similarity index 100% rename from textures/icon2.png rename to textures/trike_body.png diff --git a/textures/trike_hud_panel.png b/textures/trike_hud_panel.png deleted file mode 100644 index 85d5cef2926aec5252f3269f0a97993261d1a700..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35718 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 PK+t3%5y891CeHs0(y>1Z diff --git a/textures/icon3.png b/textures/trike_wing_ico.png similarity index 100% rename from textures/icon3.png rename to textures/trike_wing_ico.png diff --git a/trike_control.lua b/trike_control.lua deleted file mode 100644 index 18fe52a..0000000 --- a/trike_control.lua +++ /dev/null @@ -1,160 +0,0 @@ ---global constants -trike.trike_last_time_command = 0 -trike.vector_up = vector.new(0, 1, 0) -trike.max_engine_acc = 4.5 -trike.ideal_step = 0.02 - -dofile(minetest.get_modpath("trike") .. DIR_DELIM .. "trike_utilities.lua") - -function trike.check_node_below(obj) - local pos_below = obj:get_pos() - pos_below.y = pos_below.y - 0.1 - 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 - -function trike.control(self, dtime, hull_direction, longit_speed, - longit_drag, later_speed, later_drag, accel, player, is_flying) - - trike.trike_last_time_command = trike.trike_last_time_command + self.dtime - if trike.trike_last_time_command > 1 then trike.trike_last_time_command = 1 end - if self.driver_name == nil then return end - local retval_accel = accel - - local rudder_limit = 30 - local stop = false - - -- player control - if player then - local ctrl = player:get_player_control() - - --engine and power control - if ctrl.aux1 and trike.trike_last_time_command > 0.3 then - trike.trike_last_time_command = 0 - if self._engine_running then - self._engine_running = false - -- sound and animation - if self.sound_handle then - minetest.sound_stop(self.sound_handle) - self.sound_handle = nil - end - self.engine:set_animation_frame_speed(0) - elseif self._engine_running == false and self._energy > 0 then - self._engine_running = true - -- sound and animation - self.sound_handle = minetest.sound_play({name = "trike_engine"}, - {object = self.object, gain = 2.0, - pitch = 0.5 + ((self._power_lever/100)/2),max_hear_distance = 32, - loop = true,}) - self.engine:set_animation_frame_speed(60) - end - end - - self._acceleration = 0 - if self._engine_running then - --engine acceleration calc - local engineacc = (self._power_lever * trike.max_engine_acc) / 100; - self.engine:set_animation_frame_speed(60 + self._power_lever) - - local add_factor = 1 - add_factor = add_factor * (dtime/trike.ideal_step) --adjusting the command speed by dtime - - --increase power lever - if ctrl.jump then - if self._power_lever < 100 then - self._power_lever = self._power_lever + add_factor - end - if self._power_lever > 100 then - self._power_lever = 100 - engineacc = trike.max_engine_acc - else - --sound - if self.sound_handle then - minetest.sound_stop(self.sound_handle) - self.sound_handle = minetest.sound_play({name = "trike_engine"}, - {object = self.object, gain = 2.0, - pitch = 0.5 + ((self._power_lever/100)/2),max_hear_distance = 32, - loop = true,}) - end - end - end - --decrease power lever - if ctrl.sneak then - if self._power_lever > 0 then - self._power_lever = self._power_lever - add_factor - if self._power_lever < 0 then self._power_lever = 0 end - end - if self._power_lever <= 0 and is_flying == false then - --break - if longit_speed > 0 then - engineacc = -1 - if (longit_speed + engineacc) < 0 then engineacc = longit_speed * -1 end - end - if longit_speed < 0 then - engineacc = 1 - if (longit_speed + engineacc) > 0 then engineacc = longit_speed * -1 end - end - if abs(longit_speed) < 0.1 then - stop = true - end - else - --sound - minetest.sound_stop(self.sound_handle) - self.sound_handle = minetest.sound_play({name = "trike_engine"}, - {object = self.object, gain = 2.0, - pitch = 0.5 + ((self._power_lever/100)/2), - max_hear_distance = 32, loop = true,}) - end - end - --do not exceed - local max_speed = 6 - if longit_speed > max_speed then - engineacc = engineacc - (longit_speed-max_speed) - if engineacc < 0 then engineacc = 0 end - end - self._acceleration = engineacc - else - local pushacc = 0 - if longit_speed < 1.0 then - if ctrl.jump then pushacc = 0.5 end - end - if longit_speed > -1.0 then - if ctrl.sneak then pushacc = -0.5 end - end - self._acceleration = pushacc - end - - local hull_acc = vector.multiply(hull_direction,self._acceleration) - retval_accel=vector.add(retval_accel,hull_acc) - - --wing - local wing_limit = 10 - if ctrl.down then - self._angle_of_attack = math.max(self._angle_of_attack-10*self.dtime,2) - elseif ctrl.up then - self._angle_of_attack = math.min(self._angle_of_attack+10*self.dtime,wing_limit) - end - - -- yaw - if ctrl.right then - self._rudder_angle = math.max(self._rudder_angle-30*self.dtime,-rudder_limit) - elseif ctrl.left then - self._rudder_angle = math.min(self._rudder_angle+30*self.dtime,rudder_limit) - end - end - - if longit_speed > 0 then - local factor = 1 - if self._rudder_angle > 0 then factor = -1 end - local correction = (rudder_limit*(longit_speed/1000)) * factor - self._rudder_angle = self._rudder_angle + correction - end - - return retval_accel, stop -end - - diff --git a/trike_crafts.lua b/trike_crafts.lua deleted file mode 100644 index f727c1b..0000000 --- a/trike_crafts.lua +++ /dev/null @@ -1,80 +0,0 @@ --- engine -minetest.register_craftitem("trike:wing",{ - description = "Trike wing", - inventory_image = "icon3.png", -}) --- hull -minetest.register_craftitem("trike:fuselage",{ - description = "Trike body", - inventory_image = "icon2.png", -}) - - --- trike -minetest.register_craftitem("trike:trike", { - description = "Ultralight Trike", - inventory_image = "icon1.png", - liquids_pointable = false, - - on_place = function(itemstack, placer, pointed_thing) - if pointed_thing.type ~= "node" then - return - end - - local pointed_pos = pointed_thing.under - local node_below = minetest.get_node(pointed_pos).name - local nodedef = minetest.registered_nodes[node_below] - if nodedef.liquidtype == "none" then - pointed_pos.y=pointed_pos.y+1.5 - local new_trike = minetest.add_entity(pointed_pos, "trike:trike") - if new_trike and placer then - local ent = new_trike:get_luaentity() - local owner = placer:get_player_name() - ent.owner = owner - new_trike:set_yaw(placer:get_look_horizontal()) - itemstack:take_item() - airutils.create_inventory(ent, trike.trunk_slots, owner) - end - end - - return itemstack - end, -}) - --- --- crafting --- - -if minetest.get_modpath("default") then - minetest.register_craft({ - output = "trike:wing", - recipe = { - {"", "wool:white", "" }, - {"wool:white", "default:steel_ingot", "wool:white"}, - {"farming:string", "wool:white", "farming:string"}, - } - }) - minetest.register_craft({ - output = "trike:fuselage", - recipe = { - {"", "default:diamondblock", ""}, - {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, - {"default:steel_ingot", "default:mese_block", "default:steel_ingot"}, - } - }) - minetest.register_craft({ - output = "trike:trike", - recipe = { - {"", ""}, - {"trike:fuselage", "trike:wing"}, - } - }) - minetest.register_craft({ - output = "trike:repair_tool", - recipe = { - {"default:steel_ingot", "", "default:steel_ingot"}, - {"", "default:steel_ingot", ""}, - {"", "default:steel_ingot", ""}, - }, - }) -end diff --git a/trike_custom_physics.lua b/trike_custom_physics.lua deleted file mode 100644 index 84bd1b1..0000000 --- a/trike_custom_physics.lua +++ /dev/null @@ -1,40 +0,0 @@ -local abs = math.abs - -function trike.physics(self) - local friction = 0.99 - local vel=self.object:get_velocity() - -- dumb friction - if self.isonground and not self.isinliquid then - --minetest.chat_send_all('okay') - vel = {x=vel.x*friction, y=vel.y, z=vel.z*friction} - self.object:set_velocity(vel) - end - - -- bounciness - if self.springiness and self.springiness > 0 then - vel=self.object:get_velocity() - local vnew = vector.new(vel) - - if not self.collided then -- ugly workaround for inconsistent collisions - for _,k in ipairs({'y','z','x'}) do - if vel[k]==0 and abs(self.lastvelocity[k])> 0.1 then - vnew[k]=-self.lastvelocity[k]*self.springiness - end - end - end - - if not vector.equals(vel,vnew) then - self.collided = true - else - if self.collided then - vnew = vector.new(self.lastvelocity) - end - self.collided = false - end - - self.object:set_velocity(vnew) - end - - --local accel = self._last_accell - --self.object:set_acceleration(accel) -end diff --git a/trike_entities.lua b/trike_entities.lua deleted file mode 100644 index e6a95a2..0000000 --- a/trike_entities.lua +++ /dev/null @@ -1,445 +0,0 @@ -dofile(minetest.get_modpath("trike") .. DIR_DELIM .. "trike_global_definitions.lua") - --- --- entity --- - -trike.vector_up = vector.new(0, 1, 0) - -minetest.register_entity('trike:engine',{ -initial_properties = { - physical = false, - collide_with_objects=false, - pointable=false, - visual = "mesh", - mesh = "trike_propeller.b3d", - --visual_size = {x = 3, y = 3, z = 3}, - textures = {"trike_rotor.png", "trike_black.png",}, - }, - - on_activate = function(self,std) - self.sdata = minetest.deserialize(std) or {} - if self.sdata.remove then self.object:remove() end - end, - - get_staticdata=function(self) - self.sdata.remove=true - return minetest.serialize(self.sdata) - end, - -}) - -minetest.register_entity('trike:front_wheel',{ -initial_properties = { - physical = false, - collide_with_objects=false, - pointable=false, - visual = "mesh", - mesh = "trike_front_wheel.b3d", - --visual_size = {x = 3, y = 3, z = 3}, - textures = {"trike_metal.png", "trike_black.png", "trike_metal.png",}, - }, - - on_activate = function(self,std) - self.sdata = minetest.deserialize(std) or {} - if self.sdata.remove then self.object:remove() end - end, - - get_staticdata=function(self) - self.sdata.remove=true - return minetest.serialize(self.sdata) - end, - -}) - --- --- fuel --- -minetest.register_entity('trike:pointer',{ -initial_properties = { - physical = false, - collide_with_objects=false, - pointable=false, - visual = "mesh", - mesh = "pointer.b3d", - visual_size = {x = 0.4, y = 0.4, z = 0.4}, - textures = {"trike_grey.png"}, - }, - - on_activate = function(self,std) - self.sdata = minetest.deserialize(std) or {} - if self.sdata.remove then self.object:remove() end - end, - - get_staticdata=function(self) - self.sdata.remove=true - return minetest.serialize(self.sdata) - end, -}) - --- --- seat pivot --- -minetest.register_entity('trike:seat_base',{ -initial_properties = { - physical = false, - collide_with_objects=false, - pointable=false, - visual = "mesh", - mesh = "trike_seat_base.b3d", - textures = {"trike_black.png",}, - }, - - on_activate = function(self,std) - self.sdata = minetest.deserialize(std) or {} - if self.sdata.remove then self.object:remove() end - end, - - get_staticdata=function(self) - self.sdata.remove=true - return minetest.serialize(self.sdata) - end, - -}) - -minetest.register_entity("trike:trike", { - initial_properties = { - physical = true, - collide_with_objects = true, - collisionbox = {-1.2, 0.0, -1.2, 1.2, 3, 1.2}, --{-1,0,-1, 1,0.3,1}, - selectionbox = {-2, 0, -2, 2, 1, 2}, - visual = "mesh", - mesh = "trike_body.b3d", - backface_culling = false, - stepheight = 0.5, - textures = { - "trike_black.png", --bancos - "trike_metal.png", --freios - "trike_metal.png", --montante trem - "trike_metal.png", --haste trem - "trike_metal.png", --suporte asa - "trike_metal.png", --haste trem - "trike_painting.png", --pintura - "trike_grey.png", --motor - "trike_white.png", --tanque - "trike_black.png", --tampa do tanque - "trike_black.png", --carburador - "trike_black.png", --escape - "trike_grey.png", --interior - "trike_metal.png", --estrutura asa - "trike_black.png", -- cabos - "trike_wing.png", --bordo de fuga - "trike_painting.png", --bordo de ataque - "trike_panel.png", --painel - "trike_black.png", --pneus - "trike_metal.png", --rodas - } - }, - textures = {}, - driver_name = nil, - sound_handle = nil, - owner = "", - static_save = true, - infotext = "A nice ultralight", - hp_max = 50, - shaded = true, - show_on_minimap = true, - buoyancy = 2, - physics = trike.physics, - springiness = 0.3, - _passenger = nil, - _color = "#0063b0", - _rudder_angle = 0, - _acceleration = 0, - _engine_running = false, - _angle_of_attack = 2, - _power_lever = 0, - _energy = 0.001, - _longit_speed = 0, - _lastrot = {x=0,y=0,z=0}, - _last_accell = {x=0,y=0,z=0}, - _show_hud = false, - lastvelocity = nil, - _inv = nil, - _inv_id = "", - - _change_color = function(self, colstr) - airutils.paint(self, colstr, "trike_painting.png") - end, - - get_staticdata = function(self) -- unloaded/unloads ... is now saved - return minetest.serialize({ - stored_energy = self._energy, - stored_owner = self.owner, - stored_hp = self.hp_max, - stored_color = self._color, - stored_power_lever = self._power_lever, - stored_driver_name = self.driver_name, - stored_inv_id = self._inv_id, - }) - end, - - on_deactivate = function(self) - airutils.save_inventory(self) - end, - - on_activate = function(self, staticdata, dtime_s) - airutils.actfunc(self, staticdata, dtime_s) - if staticdata ~= "" and staticdata ~= nil then - local data = minetest.deserialize(staticdata) or {} - self._energy = data.stored_energy - self.owner = data.stored_owner - self.hp_max = data.stored_hp - self._color = data.stored_color - self._power_lever = data.stored_power_lever - self.driver_name = data.stored_driver_name - self._inv_id = data.stored_inv_id - --minetest.debug("loaded: ", self._energy) - end - airutils.setText(self, "ultralight trike") - self.object:set_animation({x = 1, y = 12}, 0, 0, true) - - local pos = self.object:get_pos() - - local engine=minetest.add_entity(pos,'trike:engine') - engine:set_attach(self.object,'',{x=0,y=0,z=0},{x=0,y=0,z=0}) - -- set the animation once and later only change the speed - engine:set_animation({x = 1, y = 12}, 0, 0, true) - self.engine = engine - - local wheel=minetest.add_entity(pos,'trike:front_wheel') - wheel:set_attach(self.object,'',{x=0,y=0,z=0},{x=0,y=0,z=0}) - -- set the animation once and later only change the speed - wheel:set_animation({x = 1, y = 12}, 0, 0, true) - self.wheel = wheel - - local fuel_gauge=minetest.add_entity(pos,'trike:pointer') - local energy_indicator_angle = trike.get_gauge_angle(self._energy) - fuel_gauge:set_attach(self.object,'',TRIKE_GAUGE_FUEL_POSITION,{x=0,y=0,z=energy_indicator_angle}) - self.fuel_gauge = fuel_gauge - - local power_gauge=minetest.add_entity(pos,'trike:pointer') - local power_indicator_angle = trike.get_gauge_angle(self._power_lever) - power_gauge:set_attach(self.object,'',TRIKE_GAUGE_POWER_POSITION,{x=0,y=0,z=power_indicator_angle}) - self.power_gauge = power_gauge - - local climb_gauge=minetest.add_entity(pos,'trike:pointer') - local climb_angle = trike.get_gauge_angle(0) - climb_gauge:set_attach(self.object,'',TRIKE_GAUGE_CLIMBER_POSITION,{x=0,y=0,z=climb_angle}) - self.climb_gauge = climb_gauge - - local pilot_seat_base=minetest.add_entity(pos,'trike:seat_base') - pilot_seat_base:set_attach(self.object,'',{x=0,y=7,z=8},{x=0,y=0,z=0}) - self.pilot_seat_base = pilot_seat_base - - local passenger_seat_base=minetest.add_entity(pos,'trike:seat_base') - passenger_seat_base:set_attach(self.object,'',{x=0,y=9,z=1.6},{x=0,y=0,z=0}) - self.passenger_seat_base = passenger_seat_base - - airutils.paint(self, self._color, "trike_painting.png") - - self.object:set_armor_groups({immortal=1}) - - local inv = minetest.get_inventory({type = "detached", name = self._inv_id}) - -- if the game was closed the inventories have to be made anew, instead of just reattached - if not inv then - airutils.create_inventory(self, trike.trunk_slots) - else - self.inv = inv - end - end, - - --on_step = airutils.stepfunc, - on_step = function(self,dtime,colinfo) - self.dtime = math.min(dtime,0.2) - self.colinfo = colinfo - self.height = airutils.get_box_height(self) - - -- physics comes first - local vel = self.object:get_velocity() - - if colinfo then - self.isonground = colinfo.touching_ground - else - if self.lastvelocity.y==0 and vel.y==0 then - self.isonground = true - else - self.isonground = false - end - end - - self:physics() - - if self.logic then - self:logic() - end - - self.lastvelocity = self.object:get_velocity() - self.time_total=self.time_total+self.dtime - end, - - logic = trike.flightstep, - - on_punch = function(self, puncher, ttime, toolcaps, dir, damage) - if self.hp_max <= 0 then - trike.destroy(self) - end - - if not puncher or not puncher:is_player() then - return - end - local is_admin = false - is_admin = minetest.check_player_privs(puncher, {server=true}) - local name = puncher:get_player_name() - if self.owner and self.owner ~= name and self.owner ~= "" then - if is_admin == false then return end - end - if self.owner == nil then - self.owner = name - end - - if self.driver_name and self.driver_name ~= name then - -- do not allow other players to remove the object while there is a driver - return - end - - local is_attached = false - if puncher:get_attach() == self.object then is_attached = true end - - local itmstck=puncher:get_wielded_item() - local item_name = "" - if itmstck then item_name = itmstck:get_name() end - - if is_attached == false then - if trike.loadFuel(self, puncher:get_player_name()) then - return - end - - --repair - if item_name == "airutils:repair_tool" and self._engine_running == false then - if self.hp_max < 50 then - local inventory_item = "default:steel_ingot" - local inv = puncher:get_inventory() - if inv:contains_item("main", inventory_item) then - local stack = ItemStack(inventory_item .. " 1") - inv:remove_item("main", stack) - self.hp_max = self.hp_max + 10 - if self.hp_max > 50 then self.hp_max = 50 end - airutils.setText(self,"ultralight trike") - else - minetest.chat_send_player(puncher:get_player_name(), "You need steel ingots in your inventory to perform this repair.") - end - end - return - end - - -- deal with painting or destroying - if itmstck then - if airutils.set_paint(self, puncher, itmstck, "trike_painting.png") == false then - -- deal damage - if not self.driver and toolcaps and toolcaps.damage_groups and - toolcaps.damage_groups.fleshy and item_name ~= airutils.fuel then - --airutils.hurt(self,toolcaps.damage_groups.fleshy - 1) - --airutils.make_sound(self,'hit') - self.hp_max = self.hp_max - 10 - minetest.sound_play("trike_collision", { - object = self.object, - max_hear_distance = 5, - gain = 1.0, - fade = 0.0, - pitch = 1.0, - }) - airutils.setText(self,"ultralight trike") - end - end - end - - if self.hp_max <= 0 then - trike.destroy(self) - end - - end - - end, - - on_rightclick = function(self, clicker) - if not clicker or not clicker:is_player() then - return - end - - local name = clicker:get_player_name() - - if self.owner == "" then - self.owner = name - end - - local passenger_name = nil - if self._passenger then - passenger_name = self._passenger - end - - local touching_ground, liquid_below = trike.check_node_below(self.object) - local is_on_ground = self.isinliquid or touching_ground or liquid_below - local is_under_water = airutils.check_is_under_water(self.object) - - --minetest.chat_send_all('name '.. dump(name) .. ' - pilot: ' .. dump(self.driver_name) .. ' - pax: ' .. dump(passenger_name)) - --========================= - -- detach pilot - --========================= - if name == self.driver_name then - trike.pilot_formspec(name) - --========================= - -- detach passenger - --========================= - elseif name == passenger_name then - if is_on_ground or clicker:get_player_control().sneak then - trike.dettach_pax(self, clicker) - else - minetest.chat_send_player(name, "Hold sneak and right-click to disembark while flying") - end - - --========================= - -- attach pilot - --========================= - elseif not self.driver_name then - if self.owner == name or minetest.check_player_privs(clicker, {protection_bypass=true}) then - if clicker:get_player_control().aux1 == true then --lets see the inventory - airutils.show_vehicle_trunk_formspec(self, clicker, trike.trunk_slots) - else - if trike.restricted == "true" and not minetest.check_player_privs(clicker, {flight_licence=true}) then - minetest.show_formspec(name, "trike:flightlicence", - "size[4,2]" .. - "label[0.0,0.0;Sorry ...]".. - "label[0.0,0.7;You need a flight licence to fly it.]" .. - "label[0.0,1.0;You must obtain it from server admin.]" .. - "button_exit[1.5,1.9;0.9,0.1;e;Exit]") - return - end - - if is_under_water then return end - --remove pax to prevent bug - if self._passenger then - local pax_obj = minetest.get_player_by_name(self._passenger) - trike.dettach_pax(self, pax_obj) - end - - --attach player - -- no driver => clicker is new driver - trike.attach(self, clicker) - end - else - minetest.chat_send_player(name, core.colorize('#ff0000', " >>> You aren't the owner of this ultralight.")) - end - - --========================= - -- attach passenger - --========================= - elseif self.driver_name and not self._passenger then - trike.attach_pax(self, clicker) - - else - minetest.chat_send_player(name, core.colorize('#ff0000', " >>> Can't enter airplane.")) - end - end, - -}) diff --git a/trike_forms.lua b/trike_forms.lua deleted file mode 100644 index be23556..0000000 --- a/trike_forms.lua +++ /dev/null @@ -1,57 +0,0 @@ -dofile(minetest.get_modpath("trike") .. DIR_DELIM .. "trike_global_definitions.lua") - --------------- --- Manual -- --------------- - -function trike.getPlaneFromPlayer(player) - local seat = player:get_attach() - if seat then - local plane = seat:get_attach() - return plane - end - return nil -end - -function trike.pilot_formspec(name) - local basic_form = table.concat({ - "formspec_version[3]", - "size[6,4.5]", - }, "") - - basic_form = basic_form.."button[1,1.0;4,1;go_out;Go Offboard]" - basic_form = basic_form.."button[1,2.5;4,1;hud;Show/Hide Gauges]" - - minetest.show_formspec(name, "trike:pilot_main", basic_form) -end - -minetest.register_on_player_receive_fields(function(player, formname, fields) - if formname == "trike:pilot_main" then - local name = player:get_player_name() - local plane_obj = trike.getPlaneFromPlayer(player) - if plane_obj == nil then - minetest.close_formspec(name, "trike:pilot_main") - return - end - local ent = plane_obj:get_luaentity() - if fields.hud then - if ent._show_hud == true then - ent._show_hud = false - else - ent._show_hud = true - end - end - if fields.go_out then - -- eject passenger if the plane is on ground - local touching_ground, liquid_below = trike.check_node_below(plane_obj) - if ent.isinliquid or touching_ground or liquid_below then --isn't flying? - if ent._passenger then - local passenger = minetest.get_player_by_name(ent._passenger) - if passenger then trike.dettach_pax(ent, passenger) end - end - end - trike.dettachPlayer(ent, player) - end - minetest.close_formspec(name, "trike:pilot_main") - end -end) diff --git a/trike_fuel_management.lua b/trike_fuel_management.lua deleted file mode 100644 index f8e9857..0000000 --- a/trike_fuel_management.lua +++ /dev/null @@ -1,48 +0,0 @@ -function trike.contains(table, val) - for k,v in pairs(table) do - if k == val then - return v - end - end - return false -end - -function trike.loadFuel(self, player_name) - local player = minetest.get_player_by_name(player_name) - local inv = player:get_inventory() - - local itmstck=player:get_wielded_item() - local item_name = "" - if itmstck then item_name = itmstck:get_name() end - - local fuel = trike.contains(airutils.fuel, item_name) - if fuel then - if self._energy < 10 then - itmstck:set_count(1) - inv:remove_item("main", itmstck) - self._energy = self._energy + fuel - if self._energy > 10 then self._energy = 10 end - - local energy_indicator_angle = trike.get_gauge_angle(self._energy) - self.fuel_gauge:set_attach(self.object,'',TRIKE_GAUGE_FUEL_POSITION,{x=0,y=0,z=energy_indicator_angle}) - end - - return true - end - - return false -end - -function trike.consumptionCalc(self, accel) - if accel == nil then return end - if self._energy > 0 and self._engine_running and accel ~= nil then - local consumed_power = self._power_lever/700000 - --minetest.chat_send_all('consumed: '.. consumed_power) - self._energy = self._energy - consumed_power; - end - if self._energy <= 0 and self._engine_running and accel ~= nil then - self._engine_running = false - if self.sound_handle then minetest.sound_stop(self.sound_handle) end - self.engine:set_animation_frame_speed(0) - end -end diff --git a/trike_global_definitions.lua b/trike_global_definitions.lua deleted file mode 100644 index 3f2d442..0000000 --- a/trike_global_definitions.lua +++ /dev/null @@ -1,13 +0,0 @@ --- --- constants --- -LONGIT_DRAG_FACTOR = 0.13*0.13 -LATER_DRAG_FACTOR = 2.0 - -deg = math.deg -abs = math.abs - -TRIKE_GAUGE_FUEL_POSITION = {x=1.5,y=6.2,z=15.2} -TRIKE_GAUGE_POWER_POSITION = {x=1.5,y=7.7,z=15.2} -TRIKE_GAUGE_CLIMBER_POSITION = {x=-1.2,y=7.55,z=15.2} - diff --git a/trike_hud.lua b/trike_hud.lua deleted file mode 100755 index 03488b2..0000000 --- a/trike_hud.lua +++ /dev/null @@ -1,354 +0,0 @@ -trike.hud_list = {} - -function trike.animate_gauge(player, ids, prefix, x, y, angle) - local angle_in_rad = math.rad(angle + 180) - local dim = 10 - local pos_x = math.sin(angle_in_rad) * dim - local pos_y = math.cos(angle_in_rad) * dim - player:hud_change(ids[prefix .. "2"], "offset", {x = pos_x + x, y = pos_y + y}) - dim = 20 - pos_x = math.sin(angle_in_rad) * dim - pos_y = math.cos(angle_in_rad) * dim - player:hud_change(ids[prefix .. "3"], "offset", {x = pos_x + x, y = pos_y + y}) - dim = 30 - pos_x = math.sin(angle_in_rad) * dim - pos_y = math.cos(angle_in_rad) * dim - player:hud_change(ids[prefix .. "4"], "offset", {x = pos_x + x, y = pos_y + y}) - dim = 40 - pos_x = math.sin(angle_in_rad) * dim - pos_y = math.cos(angle_in_rad) * dim - player:hud_change(ids[prefix .. "5"], "offset", {x = pos_x + x, y = pos_y + y}) - dim = 50 - pos_x = math.sin(angle_in_rad) * dim - pos_y = math.cos(angle_in_rad) * dim - player:hud_change(ids[prefix .. "6"], "offset", {x = pos_x + x, y = pos_y + y}) - dim = 60 - pos_x = math.sin(angle_in_rad) * dim - pos_y = math.cos(angle_in_rad) * dim - player:hud_change(ids[prefix .. "7"], "offset", {x = pos_x + x, y = pos_y + y}) -end - -function trike.update_hud(player, climb, speed, power, fuel) - local player_name = player:get_player_name() - - local screen_pos_y = -150 - local screen_pos_x = 10 - - local clb_gauge_x = screen_pos_x + 75 - local clb_gauge_y = screen_pos_y + 1 - local sp_gauge_x = screen_pos_x + 170 - local sp_gauge_y = clb_gauge_y - - local pwr_gauge_x = screen_pos_x + 330 - local pwr_gauge_y = clb_gauge_y - - local fu_gauge_x = screen_pos_x + 340 - local fu_gauge_y = clb_gauge_y - - local ids = trike.hud_list[player_name] - if ids then - trike.animate_gauge(player, ids, "clb_pt_", clb_gauge_x, clb_gauge_y, climb) - trike.animate_gauge(player, ids, "sp_pt_", sp_gauge_x, sp_gauge_y, speed) - trike.animate_gauge(player, ids, "pwr_pt_", pwr_gauge_x, pwr_gauge_y, power) - trike.animate_gauge(player, ids, "fu_pt_", fu_gauge_x, fu_gauge_y, fuel) - else - ids = {} - - ids["title"] = player:hud_add({ - hud_elem_type = "text", - position = {x = 0, y = 1}, - offset = {x = screen_pos_x +140, y = screen_pos_y -100}, - text = "Flight Information", - alignment = 0, - scale = { x = 100, y = 30}, - number = 0xFFFFFF, - }) - - ids["bg"] = player:hud_add({ - hud_elem_type = "image", - position = {x = 0, y = 1}, - offset = {x = screen_pos_x, y = screen_pos_y}, - text = "trike_hud_panel.png", - scale = { x = 0.5, y = 0.5}, - alignment = { x = 1, y = 0 }, - }) - - ids["clb_pt_1"] = player:hud_add({ - hud_elem_type = "image", - position = {x = 0, y = 1}, - offset = {x = clb_gauge_x, y = clb_gauge_y}, - text = "trike_ind_box.png", - scale = { x = 6, y = 6}, - alignment = { x = 1, y = 0 }, - }) - - ids["clb_pt_2"] = player:hud_add({ - hud_elem_type = "image", - position = {x = 0, y = 1}, - offset = {x = clb_gauge_x, y = clb_gauge_y}, - text = "trike_ind_box.png", - scale = { x = 6, y = 6}, - alignment = { x = 1, y = 0 }, - }) - ids["clb_pt_3"] = player:hud_add({ - hud_elem_type = "image", - position = {x = 0, y = 1}, - offset = {x = clb_gauge_x, y = clb_gauge_y}, - text = "trike_ind_box.png", - scale = { x = 6, y = 6}, - alignment = { x = 1, y = 0 }, - }) - ids["clb_pt_4"] = player:hud_add({ - hud_elem_type = "image", - position = {x = 0, y = 1}, - offset = {x = clb_gauge_x, y = clb_gauge_y}, - text = "trike_ind_box.png", - scale = { x = 6, y = 6}, - alignment = { x = 1, y = 0 }, - }) - ids["clb_pt_5"] = player:hud_add({ - hud_elem_type = "image", - position = {x = 0, y = 1}, - offset = {x = clb_gauge_x, y = clb_gauge_y}, - text = "trike_ind_box.png", - scale = { x = 6, y = 6}, - alignment = { x = 1, y = 0 }, - }) - ids["clb_pt_6"] = player:hud_add({ - hud_elem_type = "image", - position = {x = 0, y = 1}, - offset = {x = clb_gauge_x, y = clb_gauge_y}, - text = "trike_ind_box.png", - scale = { x = 6, y = 6}, - alignment = { x = 1, y = 0 }, - }) - ids["clb_pt_7"] = player:hud_add({ - hud_elem_type = "image", - position = {x = 0, y = 1}, - offset = {x = clb_gauge_x, y = clb_gauge_y}, - text = "trike_ind_box.png", - scale = { x = 6, y = 6}, - alignment = { x = 1, y = 0 }, - }) - - ids["sp_pt_1"] = player:hud_add({ - hud_elem_type = "image", - position = {x = 0, y = 1}, - offset = {x = sp_gauge_x, y = sp_gauge_y}, - text = "trike_ind_box.png", - scale = { x = 6, y = 6}, - alignment = { x = 1, y = 0 }, - }) - ids["sp_pt_2"] = player:hud_add({ - hud_elem_type = "image", - position = {x = 0, y = 1}, - offset = {x = sp_gauge_x, y = sp_gauge_y}, - text = "trike_ind_box.png", - scale = { x = 6, y = 6}, - alignment = { x = 1, y = 0 }, - }) - ids["sp_pt_3"] = player:hud_add({ - hud_elem_type = "image", - position = {x = 0, y = 1}, - offset = {x = sp_gauge_x, y = sp_gauge_y}, - text = "trike_ind_box.png", - scale = { x = 6, y = 6}, - alignment = { x = 1, y = 0 }, - }) - ids["sp_pt_4"] = player:hud_add({ - hud_elem_type = "image", - position = {x = 0, y = 1}, - offset = {x = sp_gauge_x, y = sp_gauge_y}, - text = "trike_ind_box.png", - scale = { x = 6, y = 6}, - alignment = { x = 1, y = 0 }, - }) - ids["sp_pt_5"] = player:hud_add({ - hud_elem_type = "image", - position = {x = 0, y = 1}, - offset = {x = sp_gauge_x, y = sp_gauge_y}, - text = "trike_ind_box.png", - scale = { x = 6, y = 6}, - alignment = { x = 1, y = 0 }, - }) - ids["sp_pt_6"] = player:hud_add({ - hud_elem_type = "image", - position = {x = 0, y = 1}, - offset = {x = sp_gauge_x, y = sp_gauge_y}, - text = "trike_ind_box.png", - scale = { x = 6, y = 6}, - alignment = { x = 1, y = 0 }, - }) - ids["sp_pt_7"] = player:hud_add({ - hud_elem_type = "image", - position = {x = 0, y = 1}, - offset = {x = sp_gauge_x, y = sp_gauge_y}, - text = "trike_ind_box.png", - scale = { x = 6, y = 6}, - alignment = { x = 1, y = 0 }, - }) - - ids["pwr_pt_1"] = player:hud_add({ - hud_elem_type = "image", - position = {x = 0, y = 1}, - offset = {x = pwr_gauge_x, y = pwr_gauge_y}, - text = "trike_ind_box.png", - scale = { x = 6, y = 6}, - alignment = { x = 1, y = 0 }, - }) - - ids["pwr_pt_2"] = player:hud_add({ - hud_elem_type = "image", - position = {x = 0, y = 1}, - offset = {x = pwr_gauge_x, y = pwr_gauge_y}, - text = "trike_ind_box.png", - scale = { x = 6, y = 6}, - alignment = { x = 1, y = 0 }, - }) - ids["pwr_pt_3"] = player:hud_add({ - hud_elem_type = "image", - position = {x = 0, y = 1}, - offset = {x = pwr_gauge_x, y = pwr_gauge_y}, - text = "trike_ind_box.png", - scale = { x = 6, y = 6}, - alignment = { x = 1, y = 0 }, - }) - ids["pwr_pt_4"] = player:hud_add({ - hud_elem_type = "image", - position = {x = 0, y = 1}, - offset = {x = pwr_gauge_x, y = pwr_gauge_y}, - text = "trike_ind_box.png", - scale = { x = 6, y = 6}, - alignment = { x = 1, y = 0 }, - }) - ids["pwr_pt_5"] = player:hud_add({ - hud_elem_type = "image", - position = {x = 0, y = 1}, - offset = {x = pwr_gauge_x, y = pwr_gauge_y}, - text = "trike_ind_box.png", - scale = { x = 6, y = 6}, - alignment = { x = 1, y = 0 }, - }) - ids["pwr_pt_6"] = player:hud_add({ - hud_elem_type = "image", - position = {x = 0, y = 1}, - offset = {x = pwr_gauge_x, y = pwr_gauge_y}, - text = "trike_ind_box.png", - scale = { x = 6, y = 6}, - alignment = { x = 1, y = 0 }, - }) - ids["pwr_pt_7"] = player:hud_add({ - hud_elem_type = "image", - position = {x = 0, y = 1}, - offset = {x = pwr_gauge_x, y = pwr_gauge_y}, - text = "trike_ind_box.png", - scale = { x = 6, y = 6}, - alignment = { x = 1, y = 0 }, - }) - - ids["fu_pt_1"] = player:hud_add({ - hud_elem_type = "image", - position = {x = 0, y = 1}, - offset = {x = fu_gauge_x, y = fu_gauge_y}, - text = "trike_ind_box.png", - scale = { x = 6, y = 6}, - alignment = { x = 1, y = 0 }, - }) - - ids["fu_pt_2"] = player:hud_add({ - hud_elem_type = "image", - position = {x = 0, y = 1}, - offset = {x = fu_gauge_x, y = fu_gauge_y}, - text = "trike_ind_box.png", - scale = { x = 6, y = 6}, - alignment = { x = 1, y = 0 }, - }) - ids["fu_pt_3"] = player:hud_add({ - hud_elem_type = "image", - position = {x = 0, y = 1}, - offset = {x = fu_gauge_x, y = fu_gauge_y}, - text = "trike_ind_box.png", - scale = { x = 6, y = 6}, - alignment = { x = 1, y = 0 }, - }) - ids["fu_pt_4"] = player:hud_add({ - hud_elem_type = "image", - position = {x = 0, y = 1}, - offset = {x = fu_gauge_x, y = fu_gauge_y}, - text = "trike_ind_box.png", - scale = { x = 6, y = 6}, - alignment = { x = 1, y = 0 }, - }) - ids["fu_pt_5"] = player:hud_add({ - hud_elem_type = "image", - position = {x = 0, y = 1}, - offset = {x = fu_gauge_x, y = fu_gauge_y}, - text = "trike_ind_box.png", - scale = { x = 6, y = 6}, - alignment = { x = 1, y = 0 }, - }) - ids["fu_pt_6"] = player:hud_add({ - hud_elem_type = "image", - position = {x = 0, y = 1}, - offset = {x = fu_gauge_x, y = fu_gauge_y}, - text = "trike_ind_box.png", - scale = { x = 6, y = 6}, - alignment = { x = 1, y = 0 }, - }) - ids["fu_pt_7"] = player:hud_add({ - hud_elem_type = "image", - position = {x = 0, y = 1}, - offset = {x = fu_gauge_x, y = fu_gauge_y}, - text = "trike_ind_box.png", - scale = { x = 6, y = 6}, - alignment = { x = 1, y = 0 }, - }) - - trike.hud_list[player_name] = ids - end -end - - -function trike.remove_hud(player) - if player then - local player_name = player:get_player_name() - --minetest.chat_send_all(player_name) - local ids = trike.hud_list[player_name] - if ids then - --player:hud_remove(ids["altitude"]) - --player:hud_remove(ids["time"]) - player:hud_remove(ids["title"]) - player:hud_remove(ids["bg"]) - player:hud_remove(ids["clb_pt_7"]) - player:hud_remove(ids["clb_pt_6"]) - player:hud_remove(ids["clb_pt_5"]) - player:hud_remove(ids["clb_pt_4"]) - player:hud_remove(ids["clb_pt_3"]) - player:hud_remove(ids["clb_pt_2"]) - player:hud_remove(ids["clb_pt_1"]) - player:hud_remove(ids["sp_pt_7"]) - player:hud_remove(ids["sp_pt_6"]) - player:hud_remove(ids["sp_pt_5"]) - player:hud_remove(ids["sp_pt_4"]) - player:hud_remove(ids["sp_pt_3"]) - player:hud_remove(ids["sp_pt_2"]) - player:hud_remove(ids["sp_pt_1"]) - player:hud_remove(ids["pwr_pt_7"]) - player:hud_remove(ids["pwr_pt_6"]) - player:hud_remove(ids["pwr_pt_5"]) - player:hud_remove(ids["pwr_pt_4"]) - player:hud_remove(ids["pwr_pt_3"]) - player:hud_remove(ids["pwr_pt_2"]) - player:hud_remove(ids["pwr_pt_1"]) - player:hud_remove(ids["fu_pt_7"]) - player:hud_remove(ids["fu_pt_6"]) - player:hud_remove(ids["fu_pt_5"]) - player:hud_remove(ids["fu_pt_4"]) - player:hud_remove(ids["fu_pt_3"]) - player:hud_remove(ids["fu_pt_2"]) - player:hud_remove(ids["fu_pt_1"]) - end - trike.hud_list[player_name] = nil - end - -end diff --git a/trike_utilities.lua b/trike_utilities.lua deleted file mode 100644 index f16efdb..0000000 --- a/trike_utilities.lua +++ /dev/null @@ -1,477 +0,0 @@ -dofile(minetest.get_modpath("trike") .. DIR_DELIM .. "trike_global_definitions.lua") - -function trike.get_hipotenuse_value(point1, point2) - return math.sqrt((point1.x - point2.x) ^ 2 + (point1.y - point2.y) ^ 2 + (point1.z - point2.z) ^ 2) -end - -function trike.dot(v1,v2) - return v1.x*v2.x+v1.y*v2.y+v1.z*v2.z -end - -function trike.sign(n) - return n>=0 and 1 or -1 -end - -function trike.minmax(v,m) - return math.min(math.abs(v),m)*trike.sign(v) -end - -function trike.get_gauge_angle(value) - local angle = value * 18 - angle = angle - 90 - angle = angle * -1 - return angle -end - --- attach player -function trike.attach(self, player) - local name = player:get_player_name() - self.driver_name = name - - -- attach the driver - player:set_attach(self.pilot_seat_base, "", {x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) - local eye_y = -6 - if airutils.detect_player_api(player) == 1 then - eye_y = 0.5 - end - player:set_eye_offset({x = 0, y = eye_y, z = 2}, {x = 0, y = 1, z = -30}) - player_api.player_attached[name] = true - player_api.set_animation(player, "sit") - -- make the driver sit - minetest.after(1, function() - player = minetest.get_player_by_name(name) - if player then - airutils.sit(player) - --apply_physics_override(player, {speed=0,gravity=0,jump=0}) - end - end) -end - --- attach passenger -function trike.attach_pax(self, player) - local name = player:get_player_name() - self._passenger = name - - -- attach the driver - player:set_attach(self.passenger_seat_base, "", {x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) - local eye_y = -3 - if airutils.detect_player_api(player) == 1 then - eye_y = 3.5 - end - player:set_eye_offset({x = 0, y = eye_y, z = 3}, {x = 0, y = 3, z = -30}) - player_api.player_attached[name] = true - player_api.set_animation(player, "sit") - -- make the driver sit - minetest.after(1, function() - player = minetest.get_player_by_name(name) - if player then - airutils.sit(player) - --apply_physics_override(player, {speed=0,gravity=0,jump=0}) - end - end) -end - -function trike.dettachPlayer(self, player) - local name = self.driver_name - airutils.setText(self,"ultralight trike") - - trike.remove_hud(player) - self._engine_running = false - - -- driver clicked the object => driver gets off the vehicle - self.driver_name = nil - -- sound and animation - if self.sound_handle then - minetest.sound_stop(self.sound_handle) - self.sound_handle = nil - end - - self.engine:set_animation_frame_speed(0) - - -- detach the player - if player then - player:set_detach() - player_api.player_attached[name] = nil - player:set_eye_offset({x=0,y=0,z=0},{x=0,y=0,z=0}) - player_api.set_animation(player, "stand") - end - self.driver = nil - --remove_physics_override(player, {speed=1,gravity=1,jump=1}) -end - -function trike.dettach_pax(self, player) - local name = self._passenger - - -- passenger clicked the object => driver gets off the vehicle - self._passenger = nil - - -- detach the player - if player then - player:set_detach() - player_api.player_attached[name] = nil - player_api.set_animation(player, "stand") - player:set_eye_offset({x=0,y=0,z=0},{x=0,y=0,z=0}) - --remove_physics_override(player, {speed=1,gravity=1,jump=1}) - end -end - -function trike.checkAttach(self, player) - if player then - local player_attach = player:get_attach() - if player_attach then - if player_attach == self.pilot_seat_base then - return true - end - end - end - return false -end - --- destroy the boat -function trike.destroy(self) - if self.sound_handle then - minetest.sound_stop(self.sound_handle) - self.sound_handle = nil - end - - if self._passenger then - -- detach the passenger - local passenger = minetest.get_player_by_name(self._passenger) - if passenger then - trike.dettach_pax(self, passenger) - end - end - - if self.driver_name then - -- detach the driver - local player = minetest.get_player_by_name(self.driver_name) - trike.dettachPlayer(self, player) - end - - local pos = self.object:get_pos() - if self.fuel_gauge then self.fuel_gauge:remove() end - if self.power_gauge then self.power_gauge:remove() end - if self.climb_gauge then self.climb_gauge:remove() end - if self.engine then self.engine:remove() end - if self.wheel then self.wheel:remove() end - if self.pilot_seat_base then self.pilot_seat_base:remove() end - if self.passenger_seat_base then self.passenger_seat_base:remove() end - - airutils.destroy_inventory(self) - self.object:remove() - - pos.y=pos.y+2 - minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'trike:wing') - - for i=1,6 do - minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'default:mese_crystal') - minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'default:diamond') - end - - for i=1,3 do - minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'default:steel_ingot') - end - - --minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'trike:trike') - - --local total_biofuel = math.floor(self._energy) - 1 - --for i=0,total_biofuel do - --minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'biofuel:biofuel') - --end -end - -function trike.check_node_below(obj) - local pos_below = obj:get_pos() - if pos_below then - pos_below.y = pos_below.y - 0.1 - 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 trike.testImpact(self, velocity) - local p = self.object:get_pos() - local collision = false - if self.lastvelocity == nil then return end - --lets calculate the vertical speed, to avoid the bug on colliding on floor with hard lag - if abs(velocity.y - self.lastvelocity.y) > 2 then - local noded = airutils.nodeatpos(airutils.pos_shift(p,{y=-1})) - if (noded and noded.drawtype ~= 'airlike') then - collision = true - else - self.object:set_velocity(self.lastvelocity) - self.object:set_acceleration(self._last_accell) - end - end - local impact = abs(trike.get_hipotenuse_value(velocity, self.lastvelocity)) - if impact > 2 then - --minetest.chat_send_all('impact: '.. impact .. ' - hp: ' .. self.hp_max) - if self.colinfo then - collision = self.colinfo.collides - end - end - - if impact > 0.5 and self._longit_speed > 2 then - local noded = airutils.nodeatpos(airutils.pos_shift(p,{y=-0.1})) - if (noded and noded.drawtype ~= 'airlike') then - minetest.sound_play("trike_touch", { - --to_player = self.driver_name, - object = self.object, - max_hear_distance = 15, - gain = 1.0, - fade = 0.0, - pitch = 1.0, - }, true) - end - end - - if collision then - --self.object:set_velocity({x=0,y=0,z=0}) - local damage = impact / 2 - self.hp_max = self.hp_max - damage --subtract the impact value directly to hp meter - - if self.driver_name then - minetest.sound_play("trike_collision", { - to_player = self.driver_name, - --pos = curr_pos, - --max_hear_distance = 5, - gain = 1.0, - fade = 0.0, - pitch = 1.0, - }) - - local player_name = self.driver_name - airutils.setText(self,"ultralight trike") - - --minetest.chat_send_all('damage: '.. damage .. ' - hp: ' .. self.hp_max) - if self.hp_max < 0 then --if acumulated damage is greater than 50, adieu - trike.destroy(self) - end - - local player = minetest.get_player_by_name(player_name) - if player then - if player:get_hp() > 0 then - player:set_hp(player:get_hp()-(damage/2)) - end - end - if self._passenger ~= nil then - local passenger = minetest.get_player_by_name(self._passenger) - if passenger then - if passenger:get_hp() > 0 then - passenger:set_hp(passenger:get_hp()-(damage/2)) - end - end - end - end - end -end - -function trike.checkattachBug(self) - -- for some engine error the player can be detached from the submarine, so lets set him attached again - local can_stop = true - if self.owner and self.driver_name then - -- attach the driver again - local player = minetest.get_player_by_name(self.owner) - if player then - if player:get_hp() > 0 then - trike.attach(self, player) - can_stop = false - else - trike.dettachPlayer(self, player) - end - end - end - - if can_stop then - --detach player - if self.sound_handle ~= nil then - minetest.sound_stop(self.sound_handle) - self.sound_handle = nil - end - end -end - -function trike.flightstep(self) - local accel_y = self.object:get_acceleration().y - local rotation = airutils.normalize_rotations(self.object:get_rotation()) - local yaw = rotation.y - local newyaw=yaw - local pitch = rotation.x - local roll = rotation.z - - local velocity = self.object:get_velocity() - --self.object:set_velocity(velocity) --hack to avoid glitches - local hull_direction = airutils.rot_to_dir(rotation) --minetest.yaw_to_dir(yaw) - local nhdir = {x=hull_direction.z,y=0,z=-hull_direction.x} -- lateral unit vector - - local longit_speed = vector.dot(velocity,hull_direction) - self._longit_speed = longit_speed - local longit_drag = vector.multiply(hull_direction,longit_speed*longit_speed*LONGIT_DRAG_FACTOR* - -1*trike.sign(longit_speed)) - local later_speed = trike.dot(velocity,nhdir) - --minetest.chat_send_all('later_speed: '.. later_speed) - local later_drag = vector.multiply(nhdir,later_speed*later_speed*LATER_DRAG_FACTOR*-1*trike.sign(later_speed)) - local accel = vector.add(longit_drag,later_drag) - local stop = false - - local player = nil - if self.driver_name then player = minetest.get_player_by_name(self.driver_name) end - - local curr_pos = self.object:get_pos() - self.object:move_to(curr_pos) - - local node_bellow = airutils.nodeatpos(airutils.pos_shift(curr_pos,{y=-1})) - local is_flying = true - if self.colinfo then - is_flying = not self.colinfo.touching_ground - end - - local is_attached = trike.checkAttach(self, player) - - if not is_attached then - -- for some engine error the player can be detached from the machine, so lets set him attached again - trike.checkattachBug(self) - end - - if longit_speed == 0 and is_flying == false and is_attached == false and self._engine_running == false then - return - end - - if is_attached then - --control - accel, stop = trike.control(self, self.dtime, hull_direction, - longit_speed, longit_drag, later_speed, later_drag, accel, player, is_flying) - end - trike.testImpact(self, velocity) - - -- new yaw - if math.abs(self._rudder_angle)>5 then - local turn_rate = math.rad(24) - newyaw = yaw + self.dtime*(1 - 1 / (math.abs(longit_speed) + 1)) * - self._rudder_angle / 30 * turn_rate * trike.sign(longit_speed) - end - - -- calculate energy consumption -- - trike.consumptionCalc(self, accel) - - --roll adjust - --------------------------------- - local sdir = minetest.yaw_to_dir(newyaw) - local snormal = {x=sdir.z,y=0,z=-sdir.x} -- rightside, dot is negative - local prsr = trike.dot(snormal,nhdir) - local rollfactor = -20 - local newroll = (prsr*math.rad(rollfactor))*(later_speed) - --minetest.chat_send_all('newroll: '.. newroll) - --------------------------------- - -- end roll - - -- pitch - local newpitch = self._angle_of_attack/200 --(velocity.y * math.rad(6)) - - -- adjust pitch by velocity - if is_flying == false then --isn't flying? - if newpitch < 0 then newpitch = 0 end - newroll = 0 - - local min_speed = 4 - if longit_speed < min_speed then - if newpitch > 0 then - local percentage = ((longit_speed * 100)/min_speed)/100 - newpitch = newpitch * percentage - if newpitch < 0 then newpitch = 0 end - end - end - - --animate wheels - self.object:set_animation_frame_speed(longit_speed * 10) - self.wheel:set_animation_frame_speed(longit_speed * 10) - else - --stop wheels - self.object:set_animation_frame_speed(0) - self.wheel:set_animation_frame_speed(0) - end - - local indicated_speed = longit_speed - if indicated_speed < 0 then indicated_speed = 0 end - local speed_angle = trike.get_gauge_angle(indicated_speed, -45) - - --adjust power indicator - local power_indicator_angle = trike.get_gauge_angle(self._power_lever/10) - self.power_gauge:set_attach(self.object,'',TRIKE_GAUGE_POWER_POSITION,{x=0,y=0,z=power_indicator_angle}) - - --lift calculation - accel.y = accel.y + airutils.gravity --accel_y - local new_accel = accel - if longit_speed > 2 then - local lift = 10 - new_accel = airutils.getLiftAccel(self, velocity, new_accel, longit_speed, roll, curr_pos, lift, 2500) - end - - if self.isinliquid then self._engine_running = false end - - --added accell check to avoid mercurio server problem - if new_accel then - if new_accel.x ~= nil and new_accel.y ~= nil and new_accel.z ~= nil then - self.object:set_acceleration(new_accel) - end - end - -- end lift - - --wind effects - if longit_speed > 1.5 and airutils.wind then - local wind = airutils.get_wind(curr_pos, 0.1) - new_accel = vector.add(new_accel, wind) - end - - --adjust wing pitch (3d model) - self.object:set_bone_position("wing", {x=0,y=29,z=0}, {x=-self._angle_of_attack,y=0,z=(self._rudder_angle/3)}) - - if is_flying == false then - -- new yaw - local turn_rate = math.rad(30) - local yaw_turn = self.dtime * math.rad(self._rudder_angle) * turn_rate * - trike.sign(longit_speed) * math.abs(longit_speed/2) - newyaw = yaw + yaw_turn - end - - if newyaw~=yaw or newpitch~=pitch or newroll~=roll then - self.object:set_rotation({x=newpitch,y=newyaw,z=newroll}) - end - - - if stop ~= true then - self._last_accell = new_accel - elseif stop == false then - self.object:set_velocity({x=0,y=0,z=0}) - end - - --adjust climb indicator - local climb_rate = velocity.y * 1.5 - if climb_rate > 5 then climb_rate = 5 end - if climb_rate < -5 then climb_rate = -5 end - --minetest.chat_send_all('rate '.. climb_rate) - local climb_angle = trike.get_gauge_angle(climb_rate) - self.climb_gauge:set_attach(self.object,'',TRIKE_GAUGE_CLIMBER_POSITION,{x=0,y=0,z=climb_angle}) - - local energy_indicator_angle = trike.get_gauge_angle(self._energy) - if self.fuel_gauge:get_luaentity() then - self.fuel_gauge:set_attach(self.object,'',TRIKE_GAUGE_FUEL_POSITION,{x=0,y=0,z=energy_indicator_angle}) - end - - if is_attached then - if self._show_hud then - trike.update_hud(player, climb_angle, speed_angle - 130, power_indicator_angle - 270, (energy_indicator_angle*-1)-90) - else - trike.remove_hud(player) - end - end - - --saves last velocity for collision detection (abrupt stop) - self.lastvelocity = self.object:get_velocity() -end -