mirror of
https://codeberg.org/SumianVoice/sum_airship.git
synced 2025-03-22 15:42:21 +00:00
add balloon
This commit is contained in:
parent
44b15d648f
commit
4b7f8811e3
2 changed files with 41 additions and 148 deletions
181
balloon.lua
181
balloon.lua
|
@ -1,7 +1,7 @@
|
||||||
local mod_name = minetest.get_current_modname()
|
local mod_name = minetest.get_current_modname()
|
||||||
local mod_path = minetest.get_modpath(mod_name)
|
local mod_path = minetest.get_modpath(mod_name)
|
||||||
|
|
||||||
local me = sum_hot_air_balloon
|
local me = sum_airship
|
||||||
|
|
||||||
me.vars = {
|
me.vars = {
|
||||||
lift = 4,
|
lift = 4,
|
||||||
|
@ -9,153 +9,10 @@ me.vars = {
|
||||||
fuel_time = 30,
|
fuel_time = 30,
|
||||||
}
|
}
|
||||||
|
|
||||||
local ship = {
|
|
||||||
physical = true,
|
|
||||||
pointable = true,
|
|
||||||
collisionbox = {-0.6, -0.2, -0.6, 0.6, 0.3, 0.6},
|
|
||||||
selectionbox = {-0.7, -0.35, -0.7, 0.7, 0.3, 0.7},
|
|
||||||
hp_max = 3,
|
|
||||||
visual = "mesh",
|
|
||||||
backface_culling = false,
|
|
||||||
mesh = "sum_airship_boat.b3d",
|
|
||||||
textures = {"sum_airship_texture.png"},
|
|
||||||
animations = {
|
|
||||||
idle = {x= 10, y= 90},
|
|
||||||
fly = {x= 91, y= 170},
|
|
||||||
boost = {x= 91, y= 170},
|
|
||||||
},
|
|
||||||
on_rightclick = me.on_rightclick,
|
|
||||||
on_activate = me.on_activate,
|
|
||||||
get_staticdata = me.get_staticdata,
|
|
||||||
on_death = me.on_death,
|
|
||||||
on_step = me.on_step,
|
|
||||||
_driver = nil,
|
|
||||||
_removed = false,
|
|
||||||
_flags = {},
|
|
||||||
_itemstring = "sum_hot_air_balloon:balloon_item",
|
|
||||||
}
|
|
||||||
|
|
||||||
local sounds = {
|
|
||||||
engine_idle = {
|
|
||||||
sound_name = "sum_airship_lip_trill",
|
|
||||||
gain = 1.4,
|
|
||||||
max_hear_distance = 10,
|
|
||||||
loop = false,
|
|
||||||
pitch = 0.75,
|
|
||||||
},
|
|
||||||
engine_stop = {
|
|
||||||
sound_name = "sum_airship_lip_trill_end",
|
|
||||||
gain = 2.2,
|
|
||||||
max_hear_distance = 10,
|
|
||||||
loop = false,
|
|
||||||
pitch = 1,
|
|
||||||
},
|
|
||||||
engine_boost = {
|
|
||||||
sound_name = "sum_airship_lip_trill",
|
|
||||||
gain = 40,
|
|
||||||
max_hear_distance = 10,
|
|
||||||
loop = false,
|
|
||||||
pitch = 1,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
function ship.sound_play(self, sound_obj, sound_instance)
|
|
||||||
sound_instance.handle = minetest.sound_play(sound_obj.sound_name, {
|
|
||||||
gain = sound_obj.gain,
|
|
||||||
max_hear_distance = sound_obj.max_hear_distance,
|
|
||||||
loop = sound_obj.loop,
|
|
||||||
pitch = sound_obj.pitch or 1,
|
|
||||||
object = self.object,
|
|
||||||
})
|
|
||||||
sound_instance.playing = true
|
|
||||||
sound_instance.time_elapsed = 0
|
|
||||||
end
|
|
||||||
|
|
||||||
function ship.sound_stop(sound_instance)
|
|
||||||
if sound_instance.handle then
|
|
||||||
minetest.sound_stop(sound_instance.handle)
|
|
||||||
end
|
|
||||||
sound_instance.playing = false
|
|
||||||
sound_instance.time_elapsed = 0
|
|
||||||
sound_instance.handle = nil
|
|
||||||
end
|
|
||||||
|
|
||||||
function ship.update_sound(self, dtime, forward)
|
|
||||||
local fuel = self._fuel
|
|
||||||
local is_thrust = forward ~= 0 and self._driver
|
|
||||||
if not fuel or not type(fuel) == "number" then self._fuel = 0 end
|
|
||||||
|
|
||||||
if self._sounds.engine.time_elapsed > 2.1
|
|
||||||
and self._sounds.engine.handle
|
|
||||||
and self._sounds.engine.playing then
|
|
||||||
ship.sound_stop(self._sounds.engine)
|
|
||||||
end
|
|
||||||
if not self._sounds.engine.playing then
|
|
||||||
if self._fuel > 1 then
|
|
||||||
ship.sound_play(self, sounds.engine_boost, self._sounds.engine)
|
|
||||||
elseif is_thrust then
|
|
||||||
ship.sound_play(self, sounds.engine_idle, self._sounds.engine)
|
|
||||||
end
|
|
||||||
if self._fuel > 1 and self._sounds.engine_stop.playing then
|
|
||||||
ship.sound_stop(self._sounds.engine_stop)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if self._fuel <= 1 and self._sounds.engine.playing then
|
|
||||||
if self._fuel > 0 and not self._sounds.engine_stop.playing
|
|
||||||
and self._sounds.engine_stop.time_elapsed == 0 then
|
|
||||||
ship.sound_play(self, sounds.engine_stop, self._sounds.engine_stop)
|
|
||||||
end
|
|
||||||
if not is_thrust
|
|
||||||
or (self._sounds.engine_stop.time_elapsed == 0
|
|
||||||
and self._sounds.engine_stop.playing) then
|
|
||||||
ship.sound_stop(self._sounds.engine)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
minetest.register_on_respawnplayer(detach_object)
|
|
||||||
|
|
||||||
function ship.on_rightclick(self, clicker)
|
|
||||||
local item = clicker:get_wielded_item()
|
|
||||||
local item_name = item:get_name()
|
|
||||||
if clicker and (string.find(item_name, ":coal")
|
|
||||||
or string.find(item_name, ":charcoal")) then
|
|
||||||
if not minetest.is_creative_enabled(clicker:get_player_name()) then
|
|
||||||
item:take_item()
|
|
||||||
clicker:set_wielded_item(item)
|
|
||||||
end
|
|
||||||
self._fuel = self._fuel + sum_airship.fuel_time
|
|
||||||
ship.sound_stop(self._sounds.engine)
|
|
||||||
minetest.sound_play("sum_airship_fire", {
|
|
||||||
gain = 1,
|
|
||||||
object = self.object,
|
|
||||||
})
|
|
||||||
else
|
|
||||||
attach_object(self, clicker)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
ship.chimney_dist = -1.0
|
|
||||||
ship.chimney_yaw = 0.13
|
|
||||||
ship.chimney_height = 0.9
|
|
||||||
function ship.get_chimney_pos(self)
|
|
||||||
local p = self.object:get_pos()
|
|
||||||
local yaw = self.object:get_yaw()
|
|
||||||
local ret = {
|
|
||||||
x = p.x + (ship.chimney_dist * math.sin(-yaw + ship.chimney_yaw)),
|
|
||||||
y = p.y + ship.chimney_height,
|
|
||||||
z = p.z + (ship.chimney_dist * math.cos(-yaw + ship.chimney_yaw))}
|
|
||||||
return ret
|
|
||||||
end
|
|
||||||
|
|
||||||
function me.on_activate(self, staticdata, dtime_s)
|
function me.on_activate(self, staticdata, dtime_s)
|
||||||
local data = minetest.deserialize(staticdata)
|
local data = minetest.deserialize(staticdata)
|
||||||
if type(data) == "table" then
|
if type(data) == "table" then
|
||||||
self._v = data.v
|
|
||||||
self._last_v = self._v
|
|
||||||
self._itemstring = data.itemstring
|
self._itemstring = data.itemstring
|
||||||
self._fuel = data.fuel
|
|
||||||
if data._driver then
|
if data._driver then
|
||||||
self._driver = minetest.get_player_by_name((data._driver:get_player_name()))
|
self._driver = minetest.get_player_by_name((data._driver:get_player_name()))
|
||||||
else
|
else
|
||||||
|
@ -359,11 +216,39 @@ function me.on_step(self, dtime, moveresult)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
minetest.register_entity("sum_hot_air_balloon:balloon_ENTITY", ship)
|
minetest.register_entity("sum_airship:balloon_ENTITY", {
|
||||||
|
physical = true,
|
||||||
|
pointable = true,
|
||||||
|
collisionbox = {-0.5, -0.5, -0.5, 0.5, 0.2, 0.5},
|
||||||
|
selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.2, 0.5},
|
||||||
|
hp_max = 3,
|
||||||
|
visual = "mesh",
|
||||||
|
mesh = "sum_airship.b3d",
|
||||||
|
backface_culling = false,
|
||||||
|
textures = {
|
||||||
|
"sum_airship_canvas.png", -- balloon
|
||||||
|
"sum_wood_ash_planks.png", -- cradle
|
||||||
|
"sum_wood_oak_plank.png", -- lining
|
||||||
|
"sum_wood_oak_plank.png", -- strut
|
||||||
|
"sum_wood_oak_plank.png", -- strut
|
||||||
|
"sum_airship_canvas.png", -- burner
|
||||||
|
"sum_wood_oak_plank.png", -- small strut
|
||||||
|
"sum_wood_oak_plank.png", -- small strut
|
||||||
|
},
|
||||||
|
on_rightclick = me.on_rightclick,
|
||||||
|
on_activate = me.on_activate,
|
||||||
|
get_staticdata = me.get_staticdata,
|
||||||
|
on_death = me.on_death,
|
||||||
|
on_step = me.on_step,
|
||||||
|
_driver = nil,
|
||||||
|
_removed = false,
|
||||||
|
_flags = {},
|
||||||
|
_itemstring = "sum_airship:balloon_item",
|
||||||
|
})
|
||||||
|
|
||||||
minetest.register_craftitem("sum_hot_air_balloon:balloon_item", {
|
minetest.register_craftitem("sum_airship:balloon_item", {
|
||||||
description = "Hot air balloon",
|
description = "Hot air balloon",
|
||||||
inventory_image = "sum_hot_air_balloon_item.png",
|
inventory_image = "sum_airship_item.png",
|
||||||
groups = { vehicle = 1, airship = 1, transport = 1},
|
groups = { vehicle = 1, airship = 1, transport = 1},
|
||||||
on_place = function(itemstack, placer, pointed_thing)
|
on_place = function(itemstack, placer, pointed_thing)
|
||||||
if pointed_thing.type ~= "node" then
|
if pointed_thing.type ~= "node" then
|
||||||
|
@ -376,7 +261,7 @@ minetest.register_craftitem("sum_hot_air_balloon:balloon_item", {
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
local pos = vector.offset(pointed_thing.above, 0, 0.5, 0)
|
local pos = vector.offset(pointed_thing.above, 0, 0.5, 0)
|
||||||
local self = minetest.add_entity(pos, "sum_hot_air_balloon:balloon_ENTITY"):get_luaentity()
|
local self = minetest.add_entity(pos, "sum_airship:balloon_ENTITY"):get_luaentity()
|
||||||
if not minetest.is_creative_enabled(placer:get_player_name()) then
|
if not minetest.is_creative_enabled(placer:get_player_name()) then
|
||||||
itemstack:take_item()
|
itemstack:take_item()
|
||||||
end
|
end
|
||||||
|
|
8
init.lua
Normal file
8
init.lua
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
local mod_name = minetest.get_current_modname()
|
||||||
|
local mod_path = minetest.get_modpath(mod_name)
|
||||||
|
|
||||||
|
|
||||||
|
sum_airship = {}
|
||||||
|
|
||||||
|
|
||||||
|
dofile(mod_path .. DIR_DELIM .. "balloon.lua")
|
Loading…
Add table
Reference in a new issue