mirror of
https://github.com/APercy/ap_airship.git
synced 2025-03-15 07:51:20 +00:00
added air capture
This commit is contained in:
parent
e57d36d299
commit
a405b75b51
3 changed files with 70 additions and 2 deletions
|
@ -528,9 +528,11 @@ minetest.register_entity("ap_airship:airship", {
|
||||||
_disconnection_check_time = 0,
|
_disconnection_check_time = 0,
|
||||||
_inv = nil,
|
_inv = nil,
|
||||||
_inv_id = "",
|
_inv_id = "",
|
||||||
|
_rescue_plane = false,
|
||||||
_name_color = 0,
|
_name_color = 0,
|
||||||
_name_hor_aligment = 3.0,
|
_name_hor_aligment = 3.0,
|
||||||
_simple_attach_pos = {x=0,y=-35,z=-70},
|
_simple_attach_pos = {x=0,y=-35,z=-70},
|
||||||
|
_simple_attach_ent_list = {"albatros_d5:albatros_d5","sopwith_f1_camel:sopwith_f1_camel","supercub:supercub"},
|
||||||
|
|
||||||
item = "ap_airship:airship",
|
item = "ap_airship:airship",
|
||||||
|
|
||||||
|
@ -552,6 +554,7 @@ minetest.register_entity("ap_airship:airship", {
|
||||||
stored_passengers_locked = self._passengers_locked,
|
stored_passengers_locked = self._passengers_locked,
|
||||||
stored_vehicle_custom_data = self._vehicle_custom_data or {},
|
stored_vehicle_custom_data = self._vehicle_custom_data or {},
|
||||||
stored_ship_name = self._ship_name,
|
stored_ship_name = self._ship_name,
|
||||||
|
stored_rescue_plane = self._rescue_plane,
|
||||||
})
|
})
|
||||||
end,
|
end,
|
||||||
|
|
||||||
|
@ -582,6 +585,7 @@ minetest.register_entity("ap_airship:airship", {
|
||||||
self._passengers = data.stored_passengers or ap_airship.copy_vector({[1]=nil, [2]=nil, [3]=nil, [4]=nil, [5]=nil, [6]=nil, [7]=nil, [8]=nil, [9]=nil, [10]=nil, [11]=nil, [12]=nil})
|
self._passengers = data.stored_passengers or ap_airship.copy_vector({[1]=nil, [2]=nil, [3]=nil, [4]=nil, [5]=nil, [6]=nil, [7]=nil, [8]=nil, [9]=nil, [10]=nil, [11]=nil, [12]=nil})
|
||||||
self._passengers_locked = data.stored_passengers_locked
|
self._passengers_locked = data.stored_passengers_locked
|
||||||
self._ship_name = data.stored_ship_name
|
self._ship_name = data.stored_ship_name
|
||||||
|
self._rescue_plane = data.stored_rescue_plane or false
|
||||||
|
|
||||||
local custom_data = data.stored_vehicle_custom_data or nil
|
local custom_data = data.stored_vehicle_custom_data or nil
|
||||||
if custom_data then
|
if custom_data then
|
||||||
|
@ -829,6 +833,10 @@ minetest.register_entity("ap_airship:airship", {
|
||||||
self.object:set_bone_position("door", {x=0,y=-13.1266,z=54.1922}, {x=-28,y=0,z=0})
|
self.object:set_bone_position("door", {x=0,y=-13.1266,z=54.1922}, {x=-28,y=0,z=0})
|
||||||
else
|
else
|
||||||
self.object:set_bone_position("door", {x=0,y=-13.1266,z=54.1922}, {x=0,y=0,z=0})
|
self.object:set_bone_position("door", {x=0,y=-13.1266,z=54.1922}, {x=0,y=0,z=0})
|
||||||
|
|
||||||
|
if self._rescue_plane then
|
||||||
|
ap_airship.timed_anchor_entity(self, curr_pos, yaw, 3, self.dtime)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
--saves last velocy for collision detection (abrupt stop)
|
--saves last velocy for collision detection (abrupt stop)
|
||||||
|
|
14
forms.lua
14
forms.lua
|
@ -62,7 +62,17 @@ function ap_airship.external_attach(name)
|
||||||
"size[6,4]",
|
"size[6,4]",
|
||||||
}, "")
|
}, "")
|
||||||
|
|
||||||
local entities = "albatros_d5:albatros_d5,sopwith_f1_camel:sopwith_f1_camel,supercub:supercub"
|
local player = minetest.get_player_by_name(name)
|
||||||
|
local plane_obj = ap_airship.getPlaneFromPlayer(player)
|
||||||
|
if plane_obj == nil then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local ent = plane_obj:get_luaentity()
|
||||||
|
|
||||||
|
local entities = ""
|
||||||
|
for k, v in pairs(ent._simple_attach_ent_list) do
|
||||||
|
entities = entities .. v .. ","
|
||||||
|
end
|
||||||
|
|
||||||
basic_form = basic_form.."label[1,1.0;Attach Outside:]"
|
basic_form = basic_form.."label[1,1.0;Attach Outside:]"
|
||||||
basic_form = basic_form.."dropdown[1,1.6;4,0.6;entity;"..entities..";1;false]"
|
basic_form = basic_form.."dropdown[1,1.6;4,0.6;entity;"..entities..";1;false]"
|
||||||
|
@ -159,7 +169,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||||
local name = player:get_player_name()
|
local name = player:get_player_name()
|
||||||
local plane_obj = ap_airship.getPlaneFromPlayer(player)
|
local plane_obj = ap_airship.getPlaneFromPlayer(player)
|
||||||
if plane_obj == nil then
|
if plane_obj == nil then
|
||||||
minetest.close_formspec(name, "ap_airship:logo_main")
|
minetest.close_formspec(name, "ap_airship:attach_main")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
local ent = plane_obj:get_luaentity()
|
local ent = plane_obj:get_luaentity()
|
||||||
|
|
|
@ -464,3 +464,53 @@ function ap_airship.copy_vector(original_vector)
|
||||||
return tablecopy
|
return tablecopy
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function ap_airship.eval_interception(initial_pos, end_pos, target_list)
|
||||||
|
target_list = target_list or {}
|
||||||
|
--minetest.chat_send_all(dump(end_pos))
|
||||||
|
local ret_y = nil
|
||||||
|
local cast = minetest.raycast(initial_pos, end_pos, true, false)
|
||||||
|
local thing = cast:next()
|
||||||
|
while thing do
|
||||||
|
if thing.type == "object" then
|
||||||
|
local object = thing.ref
|
||||||
|
local ent = object:get_luaentity()
|
||||||
|
if ent then
|
||||||
|
for k, v in pairs(target_list) do
|
||||||
|
--minetest.chat_send_all(ent.name)
|
||||||
|
if v == ent.name then
|
||||||
|
return ent, object
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
thing = cast:next()
|
||||||
|
end
|
||||||
|
return nil, nil
|
||||||
|
end
|
||||||
|
|
||||||
|
function ap_airship.timed_anchor_entity(self, curr_pos, yaw, time, dtime)
|
||||||
|
local time = time or 0
|
||||||
|
if self._vehicle_custom_data.simple_external_attach_entity ~= nil then return end
|
||||||
|
if not self._timed_anchor_counter then self._timed_anchor_counter = time end
|
||||||
|
self._timed_anchor_counter = self._timed_anchor_counter + dtime
|
||||||
|
if self._timed_anchor_counter < time then return nil, nil end --go out before the right time
|
||||||
|
|
||||||
|
if self._timed_anchor_counter >= time then
|
||||||
|
self._timed_anchor_counter = 0
|
||||||
|
local relative_pos = vector.new(self._simple_attach_pos)
|
||||||
|
local rel_pos = vector.divide(relative_pos,10)
|
||||||
|
local move = -1*rel_pos.z
|
||||||
|
local raycast_pos = vector.new(curr_pos)
|
||||||
|
raycast_pos.x = raycast_pos.x + move * math.sin(yaw)
|
||||||
|
raycast_pos.z = raycast_pos.z - move * math.cos(yaw)
|
||||||
|
raycast_pos.y = raycast_pos.y + rel_pos.y
|
||||||
|
local ent, obj = ap_airship.eval_interception(raycast_pos, {x=raycast_pos.x, y=raycast_pos.y-4, z=raycast_pos.z}, self._simple_attach_ent_list)
|
||||||
|
if ent then
|
||||||
|
local dest_pos = vector.add(vector.new(curr_pos), relative_pos)
|
||||||
|
--airutils.attach_external_object(self, object, ent, destination_pos, relative_pos, attach_up)
|
||||||
|
airutils.attach_external_object(self, obj, ent, dest_pos, relative_pos, true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue