Add 'boats2' mod:

master
AntumDeluge 2017-07-07 16:26:45 -07:00
parent a15ad8ca36
commit 50cb2f3885
14 changed files with 457 additions and 0 deletions

View File

@ -101,6 +101,7 @@ The game includes the mods from the default [minetest_game](https://github.com/m
* [tools_obsidian][] ([LGPL / CC BY-SA][lic.tools_obsidian]) -- version: [f77fd79][ver.tools_obsidian] *2016-03-19* ([patched][patch.tools_obsidian])
* [workbench][] ([GPL / WTFPL](mods/tools/workbench/LICENSE)) -- version: [74dd1af Git][ver.workbench] *2017-02-07* ([patched][patch.workbench])
* transport/
* [boats][boats2] ([LGPL][lic.lgpl3.0] / [CC BY-SA][lic.ccbysa3.0]) -- version [b83231e Git][ver.boats2] *2016-10-14* ([patched][patch.boats2])
* [helicopter][] ([GPL][lic.gpl2.0]) -- version: [10f1433 Git][ver.helicopter] *2015-07-15* ([patched][patch.helicopter])
* [hovercraft][] ([LGPL / CC BY-SA / CC0][lic.hovercraft]) -- version: [4d50e68 Git][ver.hovercraft] *2017-05-14* ([patched][patch.hovercraft])
* ui/
@ -199,6 +200,7 @@ The game includes the mods from the default [minetest_game](https://github.com/m
[bags]: http://cornernote.github.io/minetest-bags/
[bedrock2]: https://forum.minetest.net/viewtopic.php?t=11271
[biome_lib]: https://forum.minetest.net/viewtopic.php?f=11&t=12999
[boats2]: https://github.com/amadin/boats
[bookmarks_gui]: http://cornernote.github.io/minetest-bookmarks_gui/
[bridges]: https://forum.minetest.net/viewtopic.php?t=3488
[campfire]: https://forum.minetest.net/viewtopic.php?t=10569
@ -417,6 +419,7 @@ The game includes the mods from the default [minetest_game](https://github.com/m
[ver.bags]: https://github.com/cornernote/minetest-bags/tree/f17d829
[ver.bedrock2]: http://repo.or.cz/minetest_bedrock2.git/tree/5fe9e87
[ver.biome_lib]: https://github.com/minetest-mods/biome_lib/tree/7f54d95
[ver.boats2]: https://github.com/amadin/boats/tree/b83231e
[ver.bookmarks_gui]: https://github.com/cornernote/minetest-bookmarks_gui/tree/d369dba
[ver.bridges]: https://github.com/Sokomine/bridges/tree/5b5f475
[ver.campfire]: https://github.com/Napiophelios/campfire/tree/04b4ea5
@ -524,6 +527,7 @@ The game includes the mods from the default [minetest_game](https://github.com/m
[patch.bags]: https://github.com/AntumMT/mtmod-bags/tree/4363284
[patch.bedrock2]: https://github.com/AntumMT/mtmod-bedrock2/tree/51b25b6
[patch.biome_lib]: https://github.com/AntumMT/mod-biome_lib/tree/83c9426
[patch.boats2]: https://github.com/AntumMT/mod-boats2/tree/ccd7f2d
[patch.bridges]: https://github.com/AntumMT/mtmod-bridges/tree/ba8f71a
[patch.castle_gates]: https://github.com/AntumMT/mtmod-castle_gates/tree/465ad4f
[patch.castle_lighting]: https://github.com/AntumMT/mtmod-castle_lighting/tree/b360c54

View File

@ -0,0 +1,2 @@
# boats
Minetest row boat and sail boat

View File

@ -0,0 +1,38 @@
--[[ LICENSE HEADER
This file is part of boats2 mod for Minetest.
boats2 is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
boats2 is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with boats2. If not, see
<http://www.gnu.org/licenses/>.
]]
minetest.register_craft({
output = "boats:row_boat",
recipe = {
{"", "", "" },
{"group:wood", "", "group:wood"},
{"group:wood", "boats:boat", "group:wood"},
},
})
minetest.register_craft({
output = "boats:sail_boat",
recipe = {
{"", "group:wool", ""},
{"group:wood", "group:wool", "group:wood"},
{"group:tree", "boats:row_boat", "group:tree"},
},
})

View File

@ -0,0 +1,3 @@
boats
default
wool

View File

@ -0,0 +1 @@
Row boat and sail boat.

View File

@ -0,0 +1,406 @@
--[[ LICENSE HEADER
This file is part of boats2 mod for Minetest.
boats2 is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
boats2 is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with boats2. If not, see
<http://www.gnu.org/licenses/>.
]]
boats2 = {}
boats2.modname = minetest.get_current_modname()
boats2.modpath = minetest.get_modpath(boats2.modname)
--
-- Helper functions
--
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
--
-- Row boat entity
--
local row_boat = {
physical = true,
collisionbox = {-1,-0.5,-1, 1,0.5,1},
visual = "mesh",
mesh = "rowboat.b3d",
textures = {"default_wood.png"},
driver = nil,
v = 0,
stepcount = 0,
unattended = 0
}
function row_boat.on_rightclick(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)
elseif not self.driver then
self.driver = clicker
clicker:set_attach(self.object, "", {x=0,y=11,z=-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)
self.object:setyaw(clicker:get_look_yaw() - math.pi / 2)
end
end
function row_boat.on_activate(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
function row_boat.get_staticdata(self)
return tostring(self.v)
end
function row_boat.on_punch(self, puncher, time_from_last_punch, tool_capabilities, direction)
if not puncher or not puncher:is_player() or self.removed then
return
end
puncher:set_detach()
default.player_attached[puncher:get_player_name()] = false
self.removed = true
-- delay remove to ensure player is detached
minetest.after(0.1, function()
self.object:remove()
end)
if not minetest.setting_getbool("creative_mode") then
puncher:get_inventory():add_item("main", "boats:row_boat")
end
end
function row_boat.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
end
if ctrl.down then
self.v = self.v - 0.08
end
if ctrl.left then
if ctrl.down then
self.object:setyaw(yaw - (1 + dtime) * 0.03)
else
self.object:setyaw(yaw + (1 + dtime) * 0.03)
end
end
if ctrl.right then
if ctrl.down then
self.object:setyaw(yaw + (1 + dtime) * 0.03)
else
self.object:setyaw(yaw - (1 + dtime) * 0.03)
end
end
end
local velo = self.object:getvelocity()
if self.v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then
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} -- freefall in air -9.81
end
new_velo = get_velocity(self.v, self.object:getyaw(), self.object:getvelocity().y)
else
p.y = p.y + 1
if is_water(p) then
new_acce = {x = 0, y = 3, z = 0}
local y = self.object:getvelocity().y
if y > 2 then
y = 2
end
if y < 0 then
self.object:setacceleration({x = 0, y = 10, z = 0})
end
new_velo = get_velocity(self.v, self.object:getyaw(), y)
else
new_acce = {x = 0, y = 0, z = 0}
if math.abs(self.object:getvelocity().y) <= 2 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)
end
end
end
self.object:setvelocity(new_velo)
self.object:setacceleration(new_acce)
end
minetest.register_entity(":boats:row_boat", row_boat)
minetest.register_alias("boats:rowboat", "boats:row_boat")
minetest.register_craftitem(":boats:row_boat", {
description = "Row Boat",
inventory_image = "rowboat_inventory.png",
wield_image = "rowboat_wield.png",
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
minetest.add_entity(pointed_thing.under, "boats:row_boat")
if not minetest.setting_getbool("creative_mode") then
itemstack:take_item()
end
return itemstack
end,
})
local sail_boat = {
physical = true,
collisionbox = {-1,-0.5,-1, 1,2,1},
visual = "mesh",
mesh = "sailboat.b3d",
textures = {"sailboat.png"},
driver = nil,
v = 0,
stepcount = 0,
unattended = 0
}
function sail_boat.on_rightclick(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)
elseif not self.driver then
self.driver = clicker
clicker:set_attach(self.object, "", {x=0,y=11,z=0}, {x=0,y=0,z=0})
default.player_attached[name] = true
minetest.after(0.2, function()
default.player_set_animation(clicker, "sit" , 30)
end)
self.object:setyaw(clicker:get_look_yaw() - math.pi / 2)
end
end
function sail_boat.on_activate(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
function sail_boat.get_staticdata(self)
return tostring(self.v)
end
function sail_boat.on_punch(self, puncher, time_from_last_punch, tool_capabilities, direction)
if not puncher or not puncher:is_player() or self.removed then
return
end
puncher:set_detach()
default.player_attached[puncher:get_player_name()] = false
self.removed = true
-- delay remove to ensure player is detached
minetest.after(0.1, function()
self.object:remove()
end)
if not minetest.setting_getbool("creative_mode") then
puncher:get_inventory():add_item("main", "boats:sail_boat")
end
end
function sail_boat.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
end
if ctrl.down then
self.v = self.v - 0.08
end
if ctrl.left then
if ctrl.down then
self.object:setyaw(yaw - (1 + dtime) * 0.03)
else
self.object:setyaw(yaw + (1 + dtime) * 0.03)
end
end
if ctrl.right then
if ctrl.down then
self.object:setyaw(yaw + (1 + dtime) * 0.03)
else
self.object:setyaw(yaw - (1 + dtime) * 0.03)
end
end
end
local velo = self.object:getvelocity()
if self.v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then
return
end
local s = get_sign(self.v)
self.v = self.v - 0.015 * 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} -- freefall in air -9.81
end
new_velo = get_velocity(self.v, self.object:getyaw(), self.object:getvelocity().y)
else
p.y = p.y + 1
if is_water(p) then
new_acce = {x = 0, y = 3, z = 0}
local y = self.object:getvelocity().y
if y > 2 then
y = 2
end
if y < 0 then
self.object:setacceleration({x = 0, y = 10, z = 0})
end
new_velo = get_velocity(self.v, self.object:getyaw(), y)
else
new_acce = {x = 0, y = 0, z = 0}
if math.abs(self.object:getvelocity().y) <= 2 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)
end
end
end
self.object:setvelocity(new_velo)
self.object:setacceleration(new_acce)
end
minetest.register_entity(":boats:sail_boat", sail_boat)
minetest.register_alias("boats:sailboat", "boats:sail_boat")
minetest.register_craftitem(":boats:sail_boat", {
description = "Sail Boat",
inventory_image = "sailboat_inventory.png",
wield_image = "sailboat_wield.png",
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
minetest.add_entity(pointed_thing.under, "boats:sail_boat")
if not minetest.setting_getbool("creative_mode") then
itemstack:take_item()
end
return itemstack
end,
})
local scripts = {
"crafting",
}
for index, script in ipairs(scripts) do
dofile(boats2.modpath .. "/" .. script .. ".lua")
end

View File

@ -0,0 +1,3 @@
name = boats2
author = amadin
license = lgpl

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 444 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 366 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 889 B