Noch mehr mods
21
mods/more_boats/LICENSE
Normal file
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2023 SkyBuilder1717
|
||||
|
||||
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.
|
6
mods/more_boats/README.md
Normal file
|
@ -0,0 +1,6 @@
|
|||
# more-boats
|
||||
More Boats — Minetest mod, which adds more boat variants based on original Minetest Game materials and other stuff.
|
||||
|
||||
[Authors profile](https://content.minetest.net/users/SkyBuilder1717/)
|
||||
[Mod on ContentDB](https://content.minetest.net/packages/SkyBuilder1717/more_boats/)
|
||||
[Mod on MultiCraft](https://content.multicraft.world/packages/SkyBuilder1717/more_boats/)
|
276
mods/more_boats/api.lua
Normal file
|
@ -0,0 +1,276 @@
|
|||
more_boat = {
|
||||
LAVA = {}
|
||||
}
|
||||
local S = minetest.get_translator("boats")
|
||||
local function is_lava(pos)
|
||||
local nn = minetest.get_node(pos).name
|
||||
return minetest.get_item_group(nn, "lava") ~= 0
|
||||
end
|
||||
local function is_water(pos)
|
||||
local nn = minetest.get_node(pos).name
|
||||
return minetest.get_item_group(nn, "water") ~= 0
|
||||
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
|
||||
function more_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 name == self.driver then
|
||||
clicker:set_detach()
|
||||
|
||||
player_api.set_animation(clicker, "stand", 30)
|
||||
local pos = clicker:get_pos()
|
||||
pos = {x = pos.x, y = pos.y + 0.2, z = pos.z}
|
||||
minetest.after(0.1, function()
|
||||
clicker:set_pos(pos)
|
||||
end)
|
||||
elseif not self.driver then
|
||||
clicker:set_attach(self.object, "",
|
||||
{x = 0.5, y = 1, z = -3}, {x = 0, y = 0, z = 0})
|
||||
|
||||
self.driver = name
|
||||
player_api.player_attached[name] = true
|
||||
|
||||
minetest.after(0.2, function()
|
||||
player_api.set_animation(clicker, "sit", 30)
|
||||
end)
|
||||
clicker:set_look_horizontal(self.object:get_yaw())
|
||||
end
|
||||
end
|
||||
function more_boat.on_detach_child(self, child)
|
||||
if child and child:get_player_name() == self.driver then
|
||||
player_api.player_attached[child:get_player_name()] = false
|
||||
|
||||
self.driver = nil
|
||||
self.auto = false
|
||||
end
|
||||
end
|
||||
function more_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 more_boat.get_staticdata(self)
|
||||
return tostring(self.v)
|
||||
end
|
||||
function more_boat.on_punch(self, puncher)
|
||||
if not puncher or not puncher:is_player() or self.removed then
|
||||
return
|
||||
end
|
||||
local name = puncher:get_player_name()
|
||||
if self.driver and name == self.driver then
|
||||
self.driver = nil
|
||||
puncher:set_detach()
|
||||
player_api.player_attached[name] = false
|
||||
end
|
||||
if not self.driver then
|
||||
self.removed = true
|
||||
local inv = puncher:get_inventory()
|
||||
local luamob = self.object:get_luaentity().name
|
||||
if not minetest.is_creative_enabled(name) --then
|
||||
or not inv:contains_item("main", luamob) then
|
||||
local leftover = inv:add_item("main", luamob)
|
||||
if not leftover:is_empty() then
|
||||
minetest.add_item(self.object:get_pos(), leftover)
|
||||
end
|
||||
end
|
||||
local name = puncher:get_player_name()
|
||||
minetest.after(0.1, function()
|
||||
self.object:remove()
|
||||
end)
|
||||
end
|
||||
end
|
||||
function more_boat.on_step(self, dtime)
|
||||
self.v = get_v(self.object:get_velocity()) * math.sign(self.v)
|
||||
if self.driver then
|
||||
local driver_objref = minetest.get_player_by_name(self.driver)
|
||||
if driver_objref then
|
||||
local ctrl = driver_objref:get_player_control()
|
||||
if ctrl.up and ctrl.down then
|
||||
if not self.auto then
|
||||
self.auto = true
|
||||
minetest.chat_send_player(self.driver, S("Boat cruise mode on"))
|
||||
end
|
||||
elseif ctrl.down then
|
||||
self.v = self.v - dtime * 2.0
|
||||
if self.auto then
|
||||
self.auto = false
|
||||
minetest.chat_send_player(self.driver, S("Boat cruise mode off"))
|
||||
end
|
||||
elseif ctrl.up or self.auto then
|
||||
self.v = self.v + dtime * 2.0
|
||||
end
|
||||
if ctrl.left then
|
||||
if self.v < -0.001 then
|
||||
self.object:set_yaw(self.object:get_yaw() - dtime * 0.9)
|
||||
else
|
||||
self.object:set_yaw(self.object:get_yaw() + dtime * 0.9)
|
||||
end
|
||||
elseif ctrl.right then
|
||||
if self.v < -0.001 then
|
||||
self.object:set_yaw(self.object:get_yaw() + dtime * 0.9)
|
||||
else
|
||||
self.object:set_yaw(self.object:get_yaw() - dtime * 0.9)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
local velo = self.object:get_velocity()
|
||||
if not self.driver and
|
||||
self.v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then
|
||||
self.object:set_pos(self.object:get_pos())
|
||||
return
|
||||
end
|
||||
local drag = dtime * math.sign(self.v) * (0.01 + 0.0796 * self.v * self.v)
|
||||
if math.abs(self.v) <= math.abs(drag) then
|
||||
self.v = 0
|
||||
else
|
||||
self.v = self.v - drag
|
||||
end
|
||||
local p = self.object:get_pos()
|
||||
p.y = p.y - 0.5
|
||||
local new_velo
|
||||
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:get_yaw(),
|
||||
self.object:get_velocity().y)
|
||||
self.object:set_pos(self.object:get_pos())
|
||||
else
|
||||
p.y = p.y + 1
|
||||
if is_water(p) then
|
||||
local y = self.object:get_velocity().y
|
||||
if y >= 5 then
|
||||
y = 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:get_yaw(), y)
|
||||
self.object:set_pos(self.object:get_pos())
|
||||
else
|
||||
new_acce = {x = 0, y = 0, z = 0}
|
||||
if math.abs(self.object:get_velocity().y) < 1 then
|
||||
local pos = self.object:get_pos()
|
||||
pos.y = math.floor(pos.y) + 0.5
|
||||
self.object:set_pos(pos)
|
||||
new_velo = get_velocity(self.v, self.object:get_yaw(), 0)
|
||||
else
|
||||
new_velo = get_velocity(self.v, self.object:get_yaw(),
|
||||
self.object:get_velocity().y)
|
||||
self.object:set_pos(self.object:get_pos())
|
||||
end
|
||||
end
|
||||
end
|
||||
self.object:set_velocity(new_velo)
|
||||
self.object:set_acceleration(new_acce)
|
||||
end
|
||||
function more_boat.LAVA.on_step(self, dtime)
|
||||
self.v = get_v(self.object:get_velocity()) * math.sign(self.v)
|
||||
if self.driver then
|
||||
local driver_objref = minetest.get_player_by_name(self.driver)
|
||||
if driver_objref then
|
||||
local ctrl = driver_objref:get_player_control()
|
||||
if ctrl.up and ctrl.down then
|
||||
if not self.auto then
|
||||
self.auto = true
|
||||
minetest.chat_send_player(self.driver, S("Boat cruise mode on"))
|
||||
end
|
||||
elseif ctrl.down then
|
||||
self.v = self.v - dtime * 2.0
|
||||
if self.auto then
|
||||
self.auto = false
|
||||
minetest.chat_send_player(self.driver, S("Boat cruise mode off"))
|
||||
end
|
||||
elseif ctrl.up or self.auto then
|
||||
self.v = self.v + dtime * 2.0
|
||||
end
|
||||
if ctrl.left then
|
||||
if self.v < -0.001 then
|
||||
self.object:set_yaw(self.object:get_yaw() - dtime * 0.9)
|
||||
else
|
||||
self.object:set_yaw(self.object:get_yaw() + dtime * 0.9)
|
||||
end
|
||||
elseif ctrl.right then
|
||||
if self.v < -0.001 then
|
||||
self.object:set_yaw(self.object:get_yaw() + dtime * 0.9)
|
||||
else
|
||||
self.object:set_yaw(self.object:get_yaw() - dtime * 0.9)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
local velo = self.object:get_velocity()
|
||||
if not self.driver and
|
||||
self.v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then
|
||||
self.object:set_pos(self.object:get_pos())
|
||||
return
|
||||
end
|
||||
local drag = dtime * math.sign(self.v) * (0.01 + 0.0796 * self.v * self.v)
|
||||
if math.abs(self.v) <= math.abs(drag) then
|
||||
self.v = 0
|
||||
else
|
||||
self.v = self.v - drag
|
||||
end
|
||||
local p = self.object:get_pos()
|
||||
p.y = p.y - 0.5
|
||||
local new_velo
|
||||
local new_acce = {x = 0, y = 0, z = 0}
|
||||
if not is_lava(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:get_yaw(),
|
||||
self.object:get_velocity().y)
|
||||
self.object:set_pos(self.object:get_pos())
|
||||
else
|
||||
p.y = p.y + 1
|
||||
if is_lava(p) then
|
||||
local y = self.object:get_velocity().y
|
||||
if y >= 5 then
|
||||
y = 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:get_yaw(), y)
|
||||
self.object:set_pos(self.object:get_pos())
|
||||
else
|
||||
new_acce = {x = 0, y = 0, z = 0}
|
||||
if math.abs(self.object:get_velocity().y) < 1 then
|
||||
local pos = self.object:get_pos()
|
||||
pos.y = math.floor(pos.y) + 0.5
|
||||
self.object:set_pos(pos)
|
||||
new_velo = get_velocity(self.v, self.object:get_yaw(), 0)
|
||||
else
|
||||
new_velo = get_velocity(self.v, self.object:get_yaw(),
|
||||
self.object:get_velocity().y)
|
||||
self.object:set_pos(self.object:get_pos())
|
||||
end
|
||||
end
|
||||
end
|
||||
self.object:set_velocity(new_velo)
|
||||
self.object:set_acceleration(new_acce)
|
||||
end
|
164
mods/more_boats/init.lua
Normal file
|
@ -0,0 +1,164 @@
|
|||
|
||||
more_boats = {}
|
||||
more_boats.boats = {
|
||||
{
|
||||
"Aspen Boat",
|
||||
"more_boats:aspen_boat",
|
||||
"more_boats_aspen_inv.png",
|
||||
"more_boats_aspen_wield.png",
|
||||
{"default_aspen_wood.png"},
|
||||
"default:aspen_wood"
|
||||
},
|
||||
{
|
||||
"Acacia Boat",
|
||||
"more_boats:acacia_boat",
|
||||
"more_boats_acacia_inv.png",
|
||||
"more_boats_acacia_wield.png",
|
||||
{"default_acacia_wood.png"},
|
||||
"default:acacia_wood"
|
||||
},
|
||||
{
|
||||
"Pine Boat",
|
||||
"more_boats:pine_boat",
|
||||
"more_boats_pine_inv.png",
|
||||
"more_boats_pine_wield.png",
|
||||
{"default_pine_wood.png"},
|
||||
"default:pine_wood"
|
||||
},
|
||||
{
|
||||
"Jungle Wood Boat",
|
||||
"more_boats:jungle_boat",
|
||||
"more_boats_jungle_inv.png",
|
||||
"more_boats_jungle_wield.png",
|
||||
{"default_junglewood.png"},
|
||||
"default:junglewood"
|
||||
},
|
||||
{
|
||||
"Obsidian Boat",
|
||||
"more_boats:obsidian_boat",
|
||||
"more_boats_obsidian_inv.png",
|
||||
"more_boats_obsidian_wield.png",
|
||||
{"default_obsidian.png"},
|
||||
"default:obsidian",
|
||||
true
|
||||
}
|
||||
}
|
||||
local S = minetest.get_translator("more_boats")
|
||||
local modpath = minetest.get_modpath("more_boats")
|
||||
dofile(modpath .."/api.lua")
|
||||
minetest.clear_craft({
|
||||
output = "boats:boat",
|
||||
recipe = {
|
||||
{"", "", "" },
|
||||
{"group:wood", "", "group:wood"},
|
||||
{"group:wood", "group:wood", "group:wood"},
|
||||
},
|
||||
})
|
||||
minetest.register_craft({
|
||||
output = "boats:boat",
|
||||
recipe = {
|
||||
{"", "", ""},
|
||||
{"default:wood", "", "default:wood"},
|
||||
{"default:wood", "default:wood", "default:wood"},
|
||||
},
|
||||
})
|
||||
local function is_water(pos)
|
||||
local nn = minetest.get_node(pos).name
|
||||
return minetest.get_item_group(nn, "water") ~= 0
|
||||
end
|
||||
local function is_lava(pos)
|
||||
local nn = minetest.get_node(pos).name
|
||||
return minetest.get_item_group(nn, "lava") ~= 0
|
||||
end
|
||||
for i, def in ipairs(more_boats.boats) do
|
||||
local desc = def[1]
|
||||
local name = def[2]
|
||||
local texture_inv = def[3]
|
||||
local texture_wield = def[4]
|
||||
local texture_boat = def[5]
|
||||
local material = def[6]
|
||||
local isnt_lava = def[7]
|
||||
local boat_def = {
|
||||
initial_properties = {
|
||||
physical = true,
|
||||
collisionbox = {-0.5, -0.35, -0.5, 0.5, 0.3, 0.5},
|
||||
visual = "mesh",
|
||||
mesh = "boats_boat.obj",
|
||||
textures = texture_boat,
|
||||
},
|
||||
driver = nil,
|
||||
v = 0,
|
||||
last_v = 0,
|
||||
removed = false,
|
||||
auto = false
|
||||
}
|
||||
boat_def.on_rightclick = more_boat.on_rightclick
|
||||
boat_def.on_detach_child = more_boat.on_detach_child
|
||||
boat_def.on_activate = more_boat.on_step
|
||||
boat_def.get_staticdata = more_boat.get_staticdata
|
||||
boat_def.on_punch = more_boat.on_punch
|
||||
if not isnt_lava then
|
||||
boat_def.on_step = more_boat.on_step
|
||||
else
|
||||
boat_def.on_step = more_boat.LAVA.on_step
|
||||
end
|
||||
minetest.register_entity(name, boat_def)
|
||||
minetest.register_craftitem(name, {
|
||||
description = S(desc),
|
||||
inventory_image = texture_inv,
|
||||
wield_image = texture_wield,
|
||||
wield_scale = {x = 2, y = 2, z = 1},
|
||||
liquids_pointable = true,
|
||||
groups = {flammable = 2},
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
local under = pointed_thing.under
|
||||
local node = minetest.get_node(under)
|
||||
local udef = minetest.registered_nodes[node.name]
|
||||
if udef and udef.on_rightclick and
|
||||
not (placer and placer:is_player() and
|
||||
placer:get_player_control().sneak) then
|
||||
return udef.on_rightclick(under, node, placer, itemstack,
|
||||
pointed_thing) or itemstack
|
||||
end
|
||||
if pointed_thing.type ~= "node" then
|
||||
return itemstack
|
||||
end
|
||||
if not isnt_lava then
|
||||
if not is_water(pointed_thing.under) then
|
||||
return itemstack
|
||||
end
|
||||
else
|
||||
if not is_lava(pointed_thing.under) then
|
||||
return itemstack
|
||||
end
|
||||
end
|
||||
pointed_thing.under.y = pointed_thing.under.y + 0.5
|
||||
boat = minetest.add_entity(pointed_thing.under, name)
|
||||
if boat then
|
||||
if placer then
|
||||
boat:set_yaw(placer:get_look_horizontal())
|
||||
end
|
||||
local player_name = placer and placer:get_player_name() or ""
|
||||
if not minetest.is_creative_enabled(player_name) then
|
||||
itemstack:take_item()
|
||||
end
|
||||
end
|
||||
return itemstack
|
||||
end,
|
||||
})
|
||||
minetest.register_craft({
|
||||
output = name,
|
||||
recipe = {
|
||||
{"", "", ""},
|
||||
{material, "", material},
|
||||
{material, material, material},
|
||||
}
|
||||
})
|
||||
if not is_lava then
|
||||
minetest.register_craft({
|
||||
type = "fuel",
|
||||
recipe = name,
|
||||
burntime = 20,
|
||||
})
|
||||
end
|
||||
end
|
6
mods/more_boats/locale/more_boats.de.tr
Normal file
|
@ -0,0 +1,6 @@
|
|||
# textdomain: more_boats
|
||||
Aspen Boat=Aspen Boot
|
||||
Acacia Boat=Akazienboot
|
||||
Jungle Wood Boat=Dschungelholzboot
|
||||
Pine Boat=Kiefernboot
|
||||
Obsidian Boat=Obsidian-Boot
|
6
mods/more_boats/locale/more_boats.es.tr
Normal file
|
@ -0,0 +1,6 @@
|
|||
# textdomain: more_boats
|
||||
Aspen Boat=Bote de Aspen
|
||||
Acacia Boat=Barco de Acacia
|
||||
Jungle Wood Boat=Bote de Madera de Jungla
|
||||
Pine Boat=Barco de Pino
|
||||
Obsidian Boat=Barco de Obsidiana
|
6
mods/more_boats/locale/more_boats.ru.tr
Normal file
|
@ -0,0 +1,6 @@
|
|||
# textdomain: more_boats
|
||||
Aspen Boat=Лодка из осины
|
||||
Acacia Boat=Лодка из Акации
|
||||
Jungle Wood Boat=Лодка из дерева джунглей
|
||||
Pine Boat=Сосновая лодка
|
||||
Obsidian Boat=Обсидиановая лодка
|
6
mods/more_boats/locale/more_boats.uk.tr
Normal file
|
@ -0,0 +1,6 @@
|
|||
# textdomain: more_boats
|
||||
Aspen Boat=Човен з осики
|
||||
Acacia Boat=Човен з акації
|
||||
Jungle Wood Boat=Човен з дерева джунглів
|
||||
Pine Boat=Сосновий човен
|
||||
Obsidian Boat=Обсидіановий човен
|
7
mods/more_boats/mod.conf
Normal file
|
@ -0,0 +1,7 @@
|
|||
name = more_boats
|
||||
description = Adds more boat variants!
|
||||
depends = default, boats
|
||||
author = SkyBuilder1717
|
||||
title = More Boats
|
||||
|
||||
release = 26081
|
2
mods/more_boats/settingtypes.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
# Adds an additional protected boats for the game
|
||||
more_boats_protected (Protected Boats) bool false
|
10
mods/more_boats/textures/README.TXT
Normal file
|
@ -0,0 +1,10 @@
|
|||
-Boat creators-
|
||||
Originally by PilzAdam (MIT)
|
||||
Various Minetest developers and contributors (MIT)
|
||||
Textures: Zeg9 (CC BY-SA 3.0)
|
||||
Model: thetoon and Zeg9 (CC BY-SA 3.0)
|
||||
modified by PavelS(SokolovPavel) (CC BY-SA 3.0)
|
||||
modified by sofar (CC BY-SA 3.0)
|
||||
--
|
||||
|
||||
Changed textures: SkyBuilder1717 (MIT)
|
BIN
mods/more_boats/textures/more_boats_acacia_inv.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
mods/more_boats/textures/more_boats_acacia_wield.png
Normal file
After Width: | Height: | Size: 1 KiB |
BIN
mods/more_boats/textures/more_boats_aspen_inv.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
mods/more_boats/textures/more_boats_aspen_wield.png
Normal file
After Width: | Height: | Size: 1,012 B |
BIN
mods/more_boats/textures/more_boats_jungle_inv.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
mods/more_boats/textures/more_boats_jungle_wield.png
Normal file
After Width: | Height: | Size: 759 B |
BIN
mods/more_boats/textures/more_boats_obsidian_inv.png
Normal file
After Width: | Height: | Size: 597 B |
BIN
mods/more_boats/textures/more_boats_obsidian_wield.png
Normal file
After Width: | Height: | Size: 450 B |
BIN
mods/more_boats/textures/more_boats_pine_inv.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
mods/more_boats/textures/more_boats_pine_wield.png
Normal file
After Width: | Height: | Size: 979 B |