Noch mehr mods

This commit is contained in:
N-Nachtigal 2025-05-18 04:02:23 +02:00
parent a063db5d3b
commit cf017b2ca1
527 changed files with 21113 additions and 181 deletions

21
mods/more_boats/LICENSE Normal file
View 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.

View 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
View 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
View 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

View 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

View 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

View file

@ -0,0 +1,6 @@
# textdomain: more_boats
Aspen Boat=Лодка из осины
Acacia Boat=Лодка из Акации
Jungle Wood Boat=Лодка из дерева джунглей
Pine Boat=Сосновая лодка
Obsidian Boat=Обсидиановая лодка

View 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
View file

@ -0,0 +1,7 @@
name = more_boats
description = Adds more boat variants!
depends = default, boats
author = SkyBuilder1717
title = More Boats
release = 26081

View file

@ -0,0 +1,2 @@
# Adds an additional protected boats for the game
more_boats_protected (Protected Boats) bool false

View 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)

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,012 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 759 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 597 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 450 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 979 B