Initial commit
commit
e4a1eea649
|
@ -0,0 +1,15 @@
|
|||
|
||||
# Sailing
|
||||
|
||||
|
||||
# License
|
||||
|
||||
LGPL
|
||||
|
||||
Originally based on minetest_game boats mod by PilzAdam (WTFPL)
|
||||
|
||||
## Media
|
||||
|
||||
textures: Zeg9 (WTFPL)
|
||||
model: thetoon and Zeg9, modified by PavelS(SokolovPavel) (WTFPL)
|
||||
|
|
@ -0,0 +1 @@
|
|||
default
|
|
@ -0,0 +1,254 @@
|
|||
|
||||
local function is_water(pos)
|
||||
local nn = minetest.get_node(pos).name
|
||||
return minetest.get_item_group(nn, "water") ~= 0
|
||||
end
|
||||
|
||||
local function get_sign(i)
|
||||
if i == 0 then
|
||||
return 0
|
||||
else
|
||||
return i / math.abs(i)
|
||||
end
|
||||
end
|
||||
|
||||
local function get_velocity(v, yaw, y)
|
||||
local x = -math.sin(yaw) * v
|
||||
local z = math.cos(yaw) * v
|
||||
return {x = x, y = y, z = z}
|
||||
end
|
||||
|
||||
local function get_v(v)
|
||||
return math.sqrt(v.x ^ 2 + v.z ^ 2)
|
||||
end
|
||||
|
||||
|
||||
local function on_step(self, dtime)
|
||||
self.v = get_v(self.object:getvelocity()) * get_sign(self.v)
|
||||
if self.driver then
|
||||
local ctrl = self.driver:get_player_control()
|
||||
local yaw = self.object:getyaw()
|
||||
if ctrl.up then
|
||||
self.v = self.v + 0.1
|
||||
elseif ctrl.down then
|
||||
self.v = self.v - 0.1
|
||||
end
|
||||
if ctrl.left then
|
||||
self.object:setyaw(yaw + (1 + dtime) * 0.03)
|
||||
elseif ctrl.right then
|
||||
self.object:setyaw(yaw - (1 + dtime) * 0.03)
|
||||
end
|
||||
end
|
||||
local velo = self.object:getvelocity()
|
||||
if self.v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then
|
||||
self.object:setpos(self.object:getpos())
|
||||
return
|
||||
end
|
||||
local s = get_sign(self.v)
|
||||
self.v = self.v - 0.02 * s
|
||||
if s ~= get_sign(self.v) then
|
||||
self.object:setvelocity({x = 0, y = 0, z = 0})
|
||||
self.v = 0
|
||||
return
|
||||
end
|
||||
if math.abs(self.v) > 4.5 then
|
||||
self.v = 4.5 * get_sign(self.v)
|
||||
end
|
||||
|
||||
local p = self.object:getpos()
|
||||
p.y = p.y - 0.5
|
||||
local new_velo = {x = 0, y = 0, z = 0}
|
||||
local new_acce = {x = 0, y = 0, z = 0}
|
||||
if not is_water(p) then
|
||||
local nodedef = minetest.registered_nodes[minetest.get_node(p).name]
|
||||
if (not nodedef) or nodedef.walkable then
|
||||
self.v = 0
|
||||
new_acce = {x = 0, y = 1, z = 0}
|
||||
else
|
||||
new_acce = {x = 0, y = -9.8, z = 0}
|
||||
end
|
||||
new_velo = get_velocity(self.v, self.object:getyaw(), self.object:getvelocity().y)
|
||||
self.object:setpos(self.object:getpos())
|
||||
else
|
||||
p.y = p.y + 1
|
||||
if is_water(p) then
|
||||
local y = self.object:getvelocity().y
|
||||
if y >= 4.5 then
|
||||
y = 4.5
|
||||
elseif y < 0 then
|
||||
new_acce = {x = 0, y = 20, z = 0}
|
||||
else
|
||||
new_acce = {x = 0, y = 5, z = 0}
|
||||
end
|
||||
new_velo = get_velocity(self.v, self.object:getyaw(), y)
|
||||
self.object:setpos(self.object:getpos())
|
||||
else
|
||||
new_acce = {x = 0, y = 0, z = 0}
|
||||
if math.abs(self.object:getvelocity().y) < 1 then
|
||||
local pos = self.object:getpos()
|
||||
pos.y = math.floor(pos.y) + 0.5
|
||||
self.object:setpos(pos)
|
||||
new_velo = get_velocity(self.v, self.object:getyaw(), 0)
|
||||
else
|
||||
new_velo = get_velocity(self.v, self.object:getyaw(), self.object:getvelocity().y)
|
||||
self.object:setpos(self.object:getpos())
|
||||
end
|
||||
end
|
||||
end
|
||||
self.object:setvelocity(new_velo)
|
||||
self.object:setacceleration(new_acce)
|
||||
end
|
||||
|
||||
local function register_vessel(name, data)
|
||||
|
||||
local def = {
|
||||
physical = true,
|
||||
collisionbox = data.collisionbox,
|
||||
visual = "mesh",
|
||||
mesh = data.mesh,
|
||||
textures = data.textures,
|
||||
driver = nil,
|
||||
passenger = nil,
|
||||
v = 0,
|
||||
last_v = 0,
|
||||
removed = false
|
||||
}
|
||||
|
||||
def.on_rightclick = function(self, clicker)
|
||||
if not clicker or not clicker:is_player() then
|
||||
return
|
||||
end
|
||||
local name = clicker:get_player_name()
|
||||
if self.driver and clicker == self.driver then
|
||||
self.driver = nil
|
||||
clicker:set_detach()
|
||||
default.player_attached[name] = false
|
||||
default.player_set_animation(clicker, "stand" , 30)
|
||||
clicker:setpos(vector.add(clicker:getpos(), {x=0, y=2, z=0}))
|
||||
elseif self.passenger and clicker == self.passenger then
|
||||
self.passenger = nil
|
||||
clicker:set_detach()
|
||||
clicker:set_eye_offset({x=0,y=0,z=0},{x=0,y=0,z=0})
|
||||
default.player_attached[name] = false
|
||||
default.player_set_animation(clicker, "stand" , 30)
|
||||
clicker:setpos(vector.add(clicker:getpos(), {x=0, y=2, z=0}))
|
||||
elseif not self.driver then
|
||||
self.driver = clicker
|
||||
clicker:set_attach(self.object, "", data.attachpos, {x = 0, y = 0, z = 0})
|
||||
default.player_attached[name] = true
|
||||
minetest.after(0.2, function()
|
||||
default.player_set_animation(clicker, "sit" , 30)
|
||||
end)
|
||||
elseif not self.passenger and data.attachpos2 then
|
||||
self.passenger = clicker
|
||||
clicker:set_attach(self.object, "", data.attachpos2, {x = 0, y = 0, z = 0})
|
||||
clicker:set_eye_offset({x=0,y=0,z=-1.5},{x=0,y=0,z=0})
|
||||
default.player_attached[name] = true
|
||||
minetest.after(0.2, function()
|
||||
default.player_set_animation(clicker, "sit" , 30)
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
def.on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, direction)
|
||||
if not puncher or not puncher:is_player() or self.driver or self.passenger then
|
||||
return
|
||||
end
|
||||
self.object:remove()
|
||||
puncher:get_inventory():add_item("main", self.name)
|
||||
end
|
||||
|
||||
def.on_activate = function(self, staticdata, dtime_s)
|
||||
self.object:set_armor_groups({immortal = 1})
|
||||
if staticdata then
|
||||
self.v = tonumber(staticdata)
|
||||
end
|
||||
self.last_v = self.v
|
||||
end
|
||||
|
||||
def.get_staticdata = function(self)
|
||||
return tostring(self.v)
|
||||
end
|
||||
|
||||
def.on_step = on_step
|
||||
|
||||
minetest.register_entity(name, def)
|
||||
|
||||
minetest.register_craft({
|
||||
output = name,
|
||||
recipe = data.recipe})
|
||||
|
||||
minetest.register_craftitem(name, {
|
||||
description = data.description,
|
||||
inventory_image = data.inventory_image,
|
||||
wield_image = data.wield_image,
|
||||
wield_scale = {x = 2, y = 2, z = 1},
|
||||
liquids_pointable = true,
|
||||
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
if pointed_thing.type ~= "node" then
|
||||
return
|
||||
end
|
||||
if not is_water(pointed_thing.under) then
|
||||
return
|
||||
end
|
||||
pointed_thing.under.y = pointed_thing.under.y + 0.5
|
||||
local obj = minetest.add_entity(pointed_thing.under, name)
|
||||
if obj then
|
||||
obj:setyaw(placer:get_look_yaw() - math.pi / 2)
|
||||
itemstack:take_item()
|
||||
end
|
||||
return itemstack
|
||||
end,
|
||||
})
|
||||
|
||||
end
|
||||
|
||||
|
||||
register_vessel("sailing:raft", {
|
||||
collisionbox = {-0.5, -0.4, -0.5, 0.5, 0.3, 0.5},
|
||||
mesh = "sailing_raft.x",
|
||||
textures = {"default_wood.png"},
|
||||
attachpos = {x = 0, y = 11, z = -3},
|
||||
recipe = {
|
||||
{"", "", "" },
|
||||
{"group:wood", "", "group:wood"},
|
||||
{"group:wood", "group:wood", "group:wood"},
|
||||
},
|
||||
description = "Raft",
|
||||
wield_image = "sailing_raft_wield.png",
|
||||
inventory_image = "sailing_raft_inventory.png",
|
||||
})
|
||||
|
||||
register_vessel("sailing:sailboat", {
|
||||
collisionbox = {-1, -0.5, -1, 1, 0.5, 1},
|
||||
mesh = "sailing_sailboat.x",
|
||||
textures = {"sailing_sailboat.png"},
|
||||
attachpos = {x = 0, y = 11, z = 0},
|
||||
recipe = {
|
||||
{"", "wool:white", "" },
|
||||
{"group:wood", "default:stick", "group:wood"},
|
||||
{"group:wood", "group:wood", "group:wood"},
|
||||
},
|
||||
description = "Sailing Boat",
|
||||
wield_image = "sailing_sailboat_wield.png",
|
||||
inventory_image = "sailing_sailboat_inventory.png",
|
||||
})
|
||||
|
||||
register_vessel("sailing:twinboat", {
|
||||
collisionbox = {-1, -0.5, -1, 1, 0.5, 1},
|
||||
mesh = "sailing_twinboat.b3d",
|
||||
textures = {"sailing_sailboat.png"},
|
||||
attachpos = {x = 0, y = 11, z = 3},
|
||||
attachpos2 = {x = 0, y = 11, z = -10},
|
||||
recipe = {
|
||||
{"", "default:stick", "" },
|
||||
{"group:wood", "default:stick", "group:wood"},
|
||||
{"group:wood", "group:wood", "group:wood"},
|
||||
},
|
||||
description = "Twin Boat",
|
||||
wield_image = "sailing_sailboat_wield.png",
|
||||
inventory_image = "sailing_sailboat_inventory.png",
|
||||
})
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 1.4 KiB |
Binary file not shown.
After Width: | Height: | Size: 847 B |
Binary file not shown.
After Width: | Height: | Size: 1.6 KiB |
Binary file not shown.
After Width: | Height: | Size: 1.2 KiB |
Binary file not shown.
After Width: | Height: | Size: 889 B |
Loading…
Reference in New Issue