diff --git a/LICENSE b/LICENSE new file mode 100755 index 0000000..0db227f --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2022 APercy - Alexsandro Percy +Copyright (c) 2019 TheTermos (for code from mobkit at physics_lib.lua) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/LICENSE.txt b/LICENSE.txt deleted file mode 100644 index 1bd5d3d..0000000 --- a/LICENSE.txt +++ /dev/null @@ -1,167 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. - -Copyright Alexsandro Percy - 2021 diff --git a/init.lua b/init.lua index d96067f..92c7c14 100644 --- a/init.lua +++ b/init.lua @@ -28,6 +28,7 @@ dofile(minetest.get_modpath("airutils") .. DIR_DELIM .. "airutils_tug.lua") dofile(minetest.get_modpath("airutils") .. DIR_DELIM .. "airutils_repair.lua") dofile(minetest.get_modpath("airutils") .. DIR_DELIM .. "inventory_management.lua") dofile(minetest.get_modpath("airutils") .. DIR_DELIM .. "light.lua") +dofile(minetest.get_modpath("airutils") .. DIR_DELIM .. "physics_lib.lua") if player_api then dofile(minetest.get_modpath("airutils") .. DIR_DELIM .. "pilot_skin_manager.lua") @@ -184,7 +185,7 @@ function airutils.get_ground_effect_lift(self, curr_pos, lift, wingspan) if self._extra_lift == nil then self._extra_lift = 0 end if self._last_ground_effect_eval == nil then self._last_ground_effect_eval = 0 end - self._last_ground_effect_eval = self._last_ground_effect_eval + self.dtime --dtime cames from mobkit + self._last_ground_effect_eval = self._last_ground_effect_eval + self.dtime --dtime cames from airutils local ground_distance = wingspan if self._last_ground_effect_eval >= 0.25 then @@ -245,12 +246,12 @@ function airutils.getLiftAccel(self, velocity, accel, longit_speed, roll, curr_p 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 vrot = airutils.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 hdir = airutils.rot_to_dir(hrot) --(hrot) local cross = vector.cross(velocity,hdir) local lift_dir = vector.normalize(vector.cross(cross,hdir)) diff --git a/physics_lib.lua b/physics_lib.lua new file mode 100755 index 0000000..df92c39 --- /dev/null +++ b/physics_lib.lua @@ -0,0 +1,175 @@ +airutils.gravity = -9.8 + +local abs = math.abs +local pi = math.pi +local floor = math.floor +local ceil = math.ceil +local random = math.random +local sqrt = math.sqrt +local max = math.max +local min = math.min +local tan = math.tan +local pow = math.pow + +function airutils.rot_to_dir(rot) -- keep rot within <-pi/2,pi/2> + local dir = minetest.yaw_to_dir(rot.y) + dir.y = dir.y+tan(rot.x)*vector.length(dir) + return vector.normalize(dir) +end + +function airutils.dir_to_rot(v,rot) + rot = rot or {x=0,y=0,z=0} + return {x = (v.x==0 and v.y==0 and v.z==0) and rot.x or math.atan2(v.y,vector.length({x=v.x,y=0,z=v.z})), + y = (v.x==0 and v.z==0) and rot.y or minetest.dir_to_yaw(v), + z=rot.z} +end + +function airutils.pos_shift(pos,vec) -- vec components can be omitted e.g. vec={y=1} + vec.x=vec.x or 0 + vec.y=vec.y or 0 + vec.z=vec.z or 0 + return {x=pos.x+vec.x, + y=pos.y+vec.y, + z=pos.z+vec.z} +end + +function airutils.get_stand_pos(thing) -- thing can be luaentity or objectref. + local pos = {} + local colbox = {} + if type(thing) == 'table' then + pos = thing.object:get_pos() + colbox = thing.object:get_properties().collisionbox + elseif type(thing) == 'userdata' then + pos = thing:get_pos() + colbox = thing:get_properties().collisionbox + else + return false + end + return airutils.pos_shift(pos,{y=colbox[2]+0.01}), pos +end + +function airutils.get_node_pos(pos) + return { + x=floor(pos.x+0.5), + y=floor(pos.y+0.5), + z=floor(pos.z+0.5), + } +end + +function airutils.nodeatpos(pos) + local node = minetest.get_node_or_nil(pos) + if node then return minetest.registered_nodes[node.name] end +end + +function airutils.minmax(v,m) + return min(abs(v),m)*sign(v) +end + +function airutils.set_acceleration(thing,vec,limit) + limit = limit or 100 + if type(thing) == 'table' then thing=thing.object end + vec.x=airutils.minmax(vec.x,limit) + vec.y=airutils.minmax(vec.y,limit) + vec.z=airutils.minmax(vec.z,limit) + + thing:set_acceleration(vec) +end + +function airutils.actfunc(self, staticdata, dtime_s) + + self.logic = self.logic or self.brainfunc + self.physics = self.physics or airutils.physics + + self.lqueue = {} + self.hqueue = {} + self.nearby_objects = {} + self.nearby_players = {} + self.pos_history = {} + self.path_dir = 1 + self.time_total = 0 + self.water_drag = self.water_drag or 1 + + local sdata = minetest.deserialize(staticdata) + if sdata then + for k,v in pairs(sdata) do + self[k] = v + end + end + + if self.textures==nil then + local prop_tex = self.object:get_properties().textures + if prop_tex then self.textures=prop_tex end + end + + if not self.memory then -- this is the initial activation + self.memory = {} + + -- texture variation + if #self.textures > 1 then self.texture_no = random(#self.textures) end + end + + if self.timeout and ((self.timeout>0 and dtime_s > self.timeout and next(self.memory)==nil) or + (self.timeout<0 and dtime_s > abs(self.timeout))) then + self.object:remove() + end + + -- apply texture + if self.textures and self.texture_no then + local props = {} + props.textures = {self.textures[self.texture_no]} + self.object:set_properties(props) + end + +--hp + self.max_hp = self.max_hp or 10 + self.hp = self.hp or self.max_hp +--armor + if type(self.armor_groups) ~= 'table' then + self.armor_groups={} + end + self.armor_groups.immortal = 1 + self.object:set_armor_groups(self.armor_groups) + + self.buoyancy = self.buoyancy or 0 + self.oxygen = self.oxygen or self.lung_capacity + self.lastvelocity = {x=0,y=0,z=0} +end + +function airutils.get_box_height(self) + if type(self) == 'table' then self = self.object end + local colbox = self:get_properties().collisionbox + local height = 0.1 + if colbox then height = colbox[5]-colbox[2] end + + return height > 0 and height or 0.1 +end + +function airutils.stepfunc(self,dtime,colinfo) + self.dtime = 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 + if self.view_range then self:sensefunc() end + self:logic() + execute_queues(self) + end + + self.lastvelocity = self.object:get_velocity() + self.time_total=self.time_total+self.dtime +end