diff --git a/README.md b/README.md index 460a6da..f8148a2 100644 --- a/README.md +++ b/README.md @@ -1 +1,21 @@ -This MOD for Minetest adds obsidian and mese tools and items. +# [Mod] Obsidian-Mese [obsidianmese] + +This MOD for Minetest adds more use for Mese and Obsidian. Add more variety of tools and blocks. + +## Boat + +* Originally by PilzAdam (MIT) +* Various Minetest developers and contributors (MIT) +* SaKeL (2018) + +### Textures + +* SaKeL (CC BY-SA 3.0) + +### Mesh model + +Boat mesh (`models/mcl_boats_boat.b3d`) created by 22i. +Source: https://github.com/22i/minecraft-voxel-blender-models + +License of boat model: +GNU GPLv3 diff --git a/boat.lua b/boat.lua new file mode 100644 index 0000000..05dc5d7 --- /dev/null +++ b/boat.lua @@ -0,0 +1,286 @@ +-- +-- Helper functions +-- + +local function is_lava(pos) + local nn = minetest.get_node(pos).name + return minetest.get_item_group(nn, "lava") ~= 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 boat_visual_size = {x = 3, y = 3} +local driver_visual_size = { + x = 1 / boat_visual_size.x, + y = 1 / boat_visual_size.y +} +local boat_y_offset = 0.35 + +-- +-- Boat entity +-- + +local boat = { + physical = true, + -- Warning: Do not change the position of the collisionbox top surface, + -- lowering it causes the boat to fall through the world if underwater + collisionbox = {-0.5, -0.01, -0.5, 0.5, 0.6, 0.5}, + visual = "mesh", + mesh = "obsidianmese_boat.obj", + textures = {"obsidianmese_boat.png"}, + visual_size = boat_visual_size, + + driver = nil, + v = 0, + last_v = 0, + removed = false +} + + +function 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() + clicker:set_properties({visual_size = {x=1, y=1}}) + default.player_attached[name] = false + default.player_set_animation(clicker, "stand" , 30) + local pos = clicker:getpos() + pos = {x = pos.x, y = pos.y + 0.2, z = pos.z} + minetest.after(0.1, function() + clicker:setpos(pos) + end) + elseif not self.driver then + local attach = clicker:get_attach() + if attach and attach:get_luaentity() then + local luaentity = attach:get_luaentity() + if luaentity.driver then + luaentity.driver = nil + end + clicker:set_detach() + clicker:set_properties({visual_size = {x=1, y=1}}) + end + self.driver = clicker + clicker:set_attach(self.object, "", + {x = 0, y = 3.75, z = -1}, {x = 0, y = 0, z = 0}) + clicker:set_properties({ visual_size = driver_visual_size }) + default.player_attached[name] = true + minetest.after(0.2, function() + default.player_set_animation(clicker, "sit" , 30) + end) + clicker:set_look_horizontal(self.object:getyaw()) + end +end + + +function 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 boat.get_staticdata(self) + return tostring(self.v) +end + + +function boat.on_punch(self, puncher) + if not puncher or not puncher:is_player() or self.removed then + return + end + if self.driver and puncher == self.driver then + self.driver = nil + puncher:set_detach() + puncher:set_properties({visual_size = {x=1, y=1}}) + default.player_attached[puncher:get_player_name()] = false + end + if not self.driver then + self.removed = true + local inv = puncher:get_inventory() + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(puncher:get_player_name())) + or not inv:contains_item("main", "obsidianmese:boat") then + local leftover = inv:add_item("main", "obsidianmese:boat") + -- if no room in inventory add a replacement boat to the world + if not leftover:is_empty() then + minetest.add_item(self.object:getpos(), leftover) + end + end + -- delay remove to ensure player is detached + minetest.after(0.1, function() + self.object:remove() + end) + end +end + + +function 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 + elseif ctrl.down then + self.v = self.v - 0.1 + end + if ctrl.left then + if self.v < 0 then + self.object:setyaw(yaw - (1 + dtime) * 0.03) + else + self.object:setyaw(yaw + (1 + dtime) * 0.03) + end + elseif ctrl.right then + if self.v < 0 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 + 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) > 5 then + self.v = 5 * get_sign(self.v) + end + + local p = self.object:getpos() + p.y = p.y - boat_y_offset + 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:getyaw(), + self.object:getvelocity().y) + self.object:setpos(self.object:getpos()) + else + p.y = p.y + 1 + if is_lava(p) then + local y = self.object:getvelocity().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: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) + boat_y_offset + 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 + + +minetest.register_entity("obsidianmese:boat", boat) + + +minetest.register_craftitem("obsidianmese:boat", { + description = "ObsidianMese Boat", + inventory_image = "obsidianmese_boat_inventory.png", + wield_image = "obsidianmese_boat_inventory.png", + wield_scale = {x = 2, y = 2, z = 1}, + liquids_pointable = true, + + 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 is_lava(pointed_thing.under) then + return itemstack + end + pointed_thing.under.y = pointed_thing.under.y + boat_y_offset + boat = minetest.add_entity(pointed_thing.under, "obsidianmese:boat") + if boat then + if placer then + boat:setyaw(placer:get_look_horizontal()) + end + local player_name = placer and placer:get_player_name() or "" + if not (creative and creative.is_enabled_for and + creative.is_enabled_for(player_name)) then + itemstack:take_item() + end + end + return itemstack + end, +}) + + +-- minetest.register_craft({ +-- output = "obsidianmese:boat", +-- recipe = { +-- {"", "", "" }, +-- {"group:wood", "", "group:wood"}, +-- {"group:wood", "group:wood", "group:wood"}, +-- }, +-- }) + +-- minetest.register_craft({ +-- type = "fuel", +-- recipe = "obsidianmese:boat", +-- burntime = 20, +-- }) diff --git a/init.lua b/init.lua index babcf1e..ef0288d 100644 --- a/init.lua +++ b/init.lua @@ -6,6 +6,7 @@ dofile(minetest.get_modpath("obsidianmese").."/api.lua") dofile(minetest.get_modpath("obsidianmese").."/tools.lua") dofile(minetest.get_modpath("obsidianmese").."/nodes.lua") dofile(minetest.get_modpath("obsidianmese").."/obsidianmese_chest.lua") +dofile(minetest.get_modpath("obsidianmese").."/boat.lua") dofile(minetest.get_modpath("obsidianmese").."/crafting.lua") obsidianmese.register_capitator() diff --git a/license.txt b/license.txt index 5c93f45..d4afe75 100644 --- a/license.txt +++ b/license.txt @@ -1,13 +1,63 @@ - DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE - Version 2, December 2004 +License of source code +---------------------- - Copyright (C) 2004 Sam Hocevar +The MIT License (MIT) +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2012-2016 Various Minetest developers and contributors - Everyone is permitted to copy and distribute verbatim or modified - copies of this license document, and changing it is allowed as long - as the name is changed. +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: - DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. - 0. You just DO WHAT THE FUCK YOU WANT TO. +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. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures and model) +-------------------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2012-2016 Zeg9 +Copyright (C) 2012-2016 thetoon +Copyright (C) 2012-2016 PavelS(SokolovPavel) +Copyright (C) 2016 sofar (sofar@foo-projects.org) + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/models/obsidianmese_boat.obj b/models/obsidianmese_boat.obj new file mode 100644 index 0000000..0137bc2 --- /dev/null +++ b/models/obsidianmese_boat.obj @@ -0,0 +1,400 @@ +# Blender v2.79 (sub 0) OBJ File: 'boat.obj.blend' +# www.blender.org +mtllib boats_boat.mtl +o Cube.001 +v 1.799999 0.582797 2.797272 +v 1.799999 1.782797 2.797272 +v 1.799999 1.782797 3.197272 +v 1.799999 0.582797 3.197272 +v -1.800001 1.782797 3.197270 +v -1.800001 0.582797 3.197270 +v -1.800001 1.782797 2.797270 +v -1.800001 0.582797 2.797271 +v -0.766034 2.408931 0.223191 +v -0.939240 2.755342 0.323191 +v -3.639240 0.955341 1.882035 +v -3.466035 0.608931 1.782035 +v -3.839240 0.955341 1.535625 +v -3.666035 0.608931 1.435625 +v -1.139240 2.755342 -0.023219 +v -0.966034 2.408931 -0.123219 +v 3.480489 0.591197 1.782555 +v 3.653695 0.937607 1.882555 +v 0.953695 2.737608 0.323709 +v 0.780490 2.391198 0.223709 +v 1.153696 2.737608 -0.022701 +v 0.980491 2.391198 -0.122702 +v 3.853695 0.937607 1.536145 +v 3.680490 0.591197 1.436145 +v -3.340612 1.756106 1.244961 +v -2.820996 0.716876 0.944960 +v -3.870996 0.016875 1.551177 +v -4.390612 1.056105 1.851178 +v -3.770997 0.016875 1.724382 +v -4.290612 1.056105 2.024383 +v -2.720996 0.716876 1.118165 +v -3.240612 1.756106 1.418166 +v 2.833230 0.697151 0.946050 +v 3.352845 1.736382 1.246050 +v 4.402844 1.036381 1.852268 +v 3.883229 -0.002849 1.552268 +v 4.302845 1.036381 2.025473 +v 3.783229 -0.002849 1.725473 +v 3.252845 1.736382 1.419255 +v 2.733229 0.697152 1.119255 +v 1.981681 0.577115 2.799682 +v 1.981681 1.777115 2.799682 +v 1.581681 1.777115 2.799682 +v 1.581681 0.577115 2.799682 +v 1.581683 1.777115 -2.800318 +v 1.581683 0.577115 -2.800318 +v 1.981683 1.777115 -2.800318 +v 1.981683 0.577115 -2.800318 +v -1.595103 0.579000 2.803530 +v -1.595103 1.779000 2.803530 +v -1.995103 1.778999 2.803530 +v -1.995103 0.579000 2.803530 +v -1.995101 1.779000 -2.796470 +v -1.995101 0.579000 -2.796470 +v -1.595101 1.779000 -2.796469 +v -1.595101 0.579000 -2.796469 +v 1.800001 0.582797 -3.195406 +v 1.800001 1.782797 -3.195406 +v 1.800001 1.782797 -2.795406 +v 1.800001 0.582797 -2.795406 +v -1.799999 1.782797 -2.795407 +v -1.799999 0.582797 -2.795407 +v -1.799999 1.782797 -3.195407 +v -1.799999 0.582797 -3.195407 +v 1.600001 0.001312 -2.799999 +v -1.599999 0.001312 -2.800000 +v -1.599999 0.601312 -2.800000 +v 1.600001 0.601312 -2.799999 +v -1.600001 0.601309 2.799999 +v 1.599999 0.601309 2.800001 +v -1.600001 0.001309 2.799999 +v 1.599999 0.001309 2.800000 +vt 0.015625 0.578125 +vt 0.015625 0.671875 +vt -0.000000 0.671875 +vt -0.000000 0.578125 +vt 0.281109 0.452559 +vt 0.281109 0.546309 +vt 0.149010 0.546309 +vt 0.149010 0.452559 +vt 0.171875 0.578125 +vt 0.171875 0.671875 +vt 0.156250 0.671875 +vt 0.156250 0.578125 +vt 0.156250 0.671875 +vt 0.296875 0.671875 +vt 0.296875 0.703125 +vt 0.156250 0.703125 +vt 0.156250 0.703125 +vt 0.015625 0.703125 +vt 0.625000 0.687500 +vt 0.625000 0.718750 +vt 0.484375 0.718750 +vt 0.484375 0.687500 +vt 0.796875 0.687500 +vt 0.796875 0.718750 +vt 0.781250 0.718750 +vt 0.781250 0.687500 +vt 0.640625 0.718750 +vt 0.640625 0.687500 +vt 0.656250 1.000000 +vt 0.640625 1.000000 +vt 0.640625 0.718750 +vt 0.656250 0.718750 +vt 0.640625 1.000000 +vt 0.625000 1.000000 +vt 0.484375 0.406250 +vt 0.484375 0.375000 +vt 0.625000 0.375000 +vt 0.625000 0.406250 +vt 0.640735 0.375000 +vt 0.640735 0.406250 +vt 0.625110 0.406250 +vt 0.625110 0.375000 +vt 0.640625 0.406250 +vt 0.640625 0.375000 +vt 0.781250 0.375000 +vt 0.781250 0.406250 +vt 0.796882 0.375000 +vt 0.796882 0.406250 +vt 0.781257 0.406250 +vt 0.781257 0.375000 +vt 0.640625 0.406250 +vt 0.656250 0.406250 +vt 0.656250 0.687500 +vt 0.640625 0.687500 +vt 0.625000 0.406250 +vt 0.640625 0.406250 +vt 0.640625 0.687500 +vt 0.625000 0.687500 +vt 0.539062 0.484375 +vt 0.539062 0.578125 +vt 0.484375 0.578125 +vt 0.484375 0.484375 +vt 0.609375 0.484375 +vt 0.609375 0.578125 +vt 0.601562 0.578125 +vt 0.601562 0.484375 +vt 0.546875 0.578125 +vt 0.546875 0.484375 +vt 0.554688 0.687500 +vt 0.546875 0.687500 +vt 0.546875 0.578125 +vt 0.554688 0.578125 +vt 0.546875 0.687500 +vt 0.539062 0.687500 +vt 0.539062 0.796875 +vt 0.539062 0.890625 +vt 0.484375 0.890625 +vt 0.484375 0.796875 +vt 0.609375 0.796875 +vt 0.609375 0.890625 +vt 0.601562 0.890625 +vt 0.601562 0.796875 +vt 0.546875 0.890625 +vt 0.546875 0.796875 +vt 0.554688 1.000000 +vt 0.546875 1.000000 +vt 0.546875 0.890625 +vt 0.554688 0.890625 +vt 0.546875 1.000000 +vt 0.539062 1.000000 +vt 0.000000 0.296875 +vt -0.000000 0.203125 +vt 0.015625 0.203125 +vt 0.015625 0.296875 +vt 0.468750 0.203125 +vt 0.468750 0.296875 +vt 0.250000 0.296875 +vt 0.250000 0.203125 +vt 0.234375 0.296875 +vt 0.234375 0.203125 +vt 0.015625 0.296875 +vt 0.015625 0.203125 +vt 0.453125 0.328125 +vt 0.234375 0.328125 +vt 0.234375 0.296875 +vt 0.453125 0.296875 +vt 0.234375 0.328125 +vt 0.015625 0.328125 +vt 0.015625 0.328125 +vt 0.015625 0.421875 +vt -0.000000 0.421875 +vt -0.000000 0.328125 +vt 0.468750 0.328125 +vt 0.468750 0.421875 +vt 0.250000 0.421875 +vt 0.250000 0.328125 +vt 0.234375 0.421875 +vt 0.234375 0.328125 +vt 0.250000 0.328125 +vt 0.250000 0.421875 +vt 0.234375 0.328125 +vt 0.234375 0.421875 +vt 0.453125 0.453125 +vt 0.234375 0.453125 +vt 0.234375 0.421875 +vt 0.453125 0.421875 +vt 0.234375 0.453125 +vt 0.015625 0.453125 +vt 0.000000 0.671875 +vt -0.000000 0.578125 +vt 0.015625 0.578125 +vt 0.015625 0.671875 +vt 0.312500 0.578125 +vt 0.312500 0.671875 +vt 0.171875 0.671875 +vt 0.171875 0.578125 +vt 0.156250 0.671875 +vt 0.156250 0.578125 +vt 0.171875 0.578125 +vt 0.171875 0.671875 +vt 0.156250 0.452559 +vt 0.156250 0.546309 +vt 0.015625 0.546309 +vt 0.015625 0.452559 +vt 0.265747 0.577881 +vt 0.140869 0.577881 +vt 0.140869 0.546631 +vt 0.265747 0.546631 +vt 0.140503 0.578125 +vt 0.015625 0.546875 +vt 0.140503 0.546875 +vt 0.023438 0.703125 +vt 0.023438 0.953125 +vt 0.000000 0.953125 +vt 0.000000 0.703125 +vt 0.484375 0.703125 +vt 0.484375 0.953125 +vt 0.265625 0.953125 +vt 0.265625 0.703125 +vt 0.242188 0.953125 +vt 0.242188 0.703125 +vt 0.460938 1.000000 +vt 0.242188 1.000000 +vt 0.242188 0.953125 +vt 0.460938 0.953125 +vt 0.242188 1.000000 +vt 0.023438 1.000000 +vn -0.5774 -0.5774 0.5773 +vn -0.5774 -0.5773 -0.5773 +vn 0.5773 -0.5774 -0.5774 +vn 0.5773 -0.5774 0.5774 +vn 0.5774 0.5773 -0.5773 +vn 0.5774 0.5773 0.5773 +vn -0.5773 0.5773 -0.5774 +vn -0.5773 0.5773 0.5774 +vn 0.1835 -0.9799 0.0787 +vn 0.3470 -0.4428 -0.8267 +vn 0.9591 0.2774 -0.0568 +vn 0.4191 -0.3127 0.8524 +vn -0.1835 0.9799 -0.0787 +vn -0.3469 0.4428 0.8268 +vn -0.4191 0.3126 -0.8524 +vn -0.9591 -0.2773 0.0568 +vn 0.4201 0.3122 0.8521 +vn 0.9591 -0.2774 -0.0568 +vn 0.3469 0.4428 -0.8268 +vn 0.1835 0.9799 0.0787 +vn -0.4191 -0.3126 -0.8524 +vn -0.9591 0.2774 0.0568 +vn -0.1835 -0.9799 -0.0787 +vn -0.3470 -0.4428 0.8268 +vn -0.1835 0.9799 -0.0786 +vn 0.4190 -0.3127 0.8524 +vn 0.3470 -0.4429 -0.8267 +vn -0.9591 0.2773 0.0568 +vn -0.4190 -0.3126 -0.8525 +vn -0.3470 -0.4428 0.8267 +vn 0.4191 0.3126 0.8524 +vn 0.5774 -0.5774 0.5774 +vn 0.5774 -0.5773 -0.5774 +vn 0.5773 0.5774 -0.5774 +vn -0.5774 0.5774 -0.5774 +vn -0.5773 -0.5774 -0.5774 +vn 0.5773 -0.5773 -0.5774 +vn 0.5774 0.5774 -0.5773 +vn -0.5774 0.5773 -0.5774 +vn -0.5774 -0.5774 -0.5773 +vn -0.5773 0.5774 -0.5774 +vn -0.5774 -0.5773 0.5773 +vn -0.5773 0.5774 0.5773 +vn -0.5773 -0.5774 -0.5773 +vn 0.5773 0.5773 -0.5774 +vn 0.5773 0.5774 0.5773 +vn 0.5774 -0.5774 0.5773 +usemtl Brush.001 +s 1 +f 1/1/1 2/2/2 3/3/3 +f 1/1/1 3/3/3 4/4/4 +f 4/5/4 3/6/3 5/7/5 +f 4/5/4 5/7/5 6/8/6 +f 6/9/6 5/10/5 7/11/7 +f 6/9/6 7/11/7 8/12/8 +f 2/2/2 1/1/1 8/12/8 +f 2/2/2 8/12/8 7/11/7 +f 8/13/8 1/14/1 4/15/4 +f 8/13/8 4/15/4 6/16/6 +f 5/17/5 3/18/3 2/2/2 +f 5/17/5 2/2/2 7/11/7 +f 9/19/9 10/20/10 11/21/11 +f 9/19/9 11/21/11 12/22/12 +f 12/23/12 11/24/11 13/25/13 +f 12/23/12 13/25/13 14/26/14 +f 14/26/14 13/25/13 15/27/15 +f 14/26/14 15/27/15 16/28/16 +f 16/28/16 15/27/15 10/20/10 +f 16/28/16 10/20/10 9/19/9 +f 12/29/12 14/30/14 16/31/16 +f 12/29/12 16/31/16 9/32/9 +f 13/33/13 11/34/11 10/20/10 +f 13/33/13 10/20/10 15/27/15 +f 17/35/17 18/36/18 19/37/19 +f 17/35/17 19/37/19 20/38/20 +f 20/39/20 19/40/19 21/41/21 +f 20/39/20 21/41/21 22/42/22 +f 22/43/22 21/44/21 23/45/23 +f 22/43/22 23/45/23 24/46/24 +f 24/47/24 23/48/23 18/49/18 +f 24/47/24 18/49/18 17/50/17 +f 20/51/20 22/52/22 24/53/24 +f 20/51/20 24/53/24 17/54/17 +f 21/55/21 19/56/19 18/57/18 +f 21/55/21 18/57/18 23/58/23 +f 25/59/15 26/60/16 27/61/14 +f 25/59/15 27/61/14 28/62/25 +f 28/63/25 27/64/14 29/65/26 +f 28/63/25 29/65/26 30/66/11 +f 30/66/11 29/65/26 31/67/9 +f 30/66/11 31/67/9 32/68/27 +f 32/68/27 31/67/9 26/60/16 +f 32/68/27 26/60/16 25/59/15 +f 28/69/25 30/70/11 32/71/27 +f 28/69/25 32/71/27 25/72/15 +f 29/73/26 27/74/14 26/60/16 +f 29/73/26 26/60/16 31/67/9 +f 33/75/28 34/76/29 35/77/23 +f 33/75/28 35/77/23 36/78/30 +f 36/79/30 35/80/23 37/81/18 +f 36/79/30 37/81/18 38/82/31 +f 38/82/31 37/81/18 39/83/19 +f 38/82/31 39/83/19 40/84/20 +f 40/84/20 39/83/19 34/76/29 +f 40/84/20 34/76/29 33/75/28 +f 36/85/30 38/86/31 40/87/20 +f 36/85/30 40/87/20 33/88/28 +f 37/89/18 35/90/23 34/76/29 +f 37/89/18 34/76/29 39/83/19 +f 41/91/32 42/92/33 43/93/34 +f 41/91/32 43/93/34 44/94/6 +f 44/95/6 43/96/34 45/97/35 +f 44/95/6 45/97/35 46/98/8 +f 46/98/8 45/97/35 47/99/36 +f 46/98/8 47/99/36 48/100/1 +f 48/100/1 47/99/36 42/101/33 +f 48/100/1 42/101/33 41/102/32 +f 44/103/6 46/104/8 48/105/1 +f 44/103/6 48/105/1 41/106/32 +f 45/107/35 43/108/34 42/101/33 +f 45/107/35 42/101/33 47/99/36 +f 49/109/32 50/110/37 51/111/38 +f 49/109/32 51/111/38 52/112/6 +f 52/113/6 51/114/38 53/115/39 +f 52/113/6 53/115/39 54/116/8 +f 54/117/8 53/118/39 55/119/40 +f 54/117/8 55/119/40 56/120/1 +f 56/121/1 55/122/40 50/110/37 +f 56/121/1 50/110/37 49/109/32 +f 52/123/6 54/124/8 56/125/1 +f 52/123/6 56/125/1 49/126/32 +f 53/127/39 51/128/38 50/110/37 +f 53/127/39 50/110/37 55/122/40 +f 57/129/1 58/130/2 59/131/3 +f 57/129/1 59/131/3 60/132/32 +f 60/133/32 59/134/3 61/135/5 +f 60/133/32 61/135/5 62/136/6 +f 62/137/6 61/138/5 63/139/41 +f 62/137/6 63/139/41 64/140/8 +f 64/141/8 63/142/41 58/143/2 +f 64/141/8 58/143/2 57/144/1 +f 60/145/32 62/146/6 64/147/8 +f 60/145/32 64/147/8 57/148/1 +f 61/149/5 59/131/3 58/150/2 +f 61/149/5 58/150/2 63/151/41 +f 65/152/42 66/153/43 67/154/41 +f 65/152/42 67/154/41 68/155/44 +f 68/156/44 67/157/41 69/158/45 +f 68/156/44 69/158/45 70/159/37 +f 70/159/37 69/158/45 71/160/46 +f 70/159/37 71/160/46 72/161/47 +f 72/161/47 71/160/46 66/153/43 +f 72/161/47 66/153/43 65/152/42 +f 68/162/44 70/163/37 72/164/47 +f 68/162/44 72/164/47 65/165/42 +f 69/166/45 67/167/41 66/153/43 +f 69/166/45 66/153/43 71/160/46 diff --git a/textures/obsidianmese_boat.png b/textures/obsidianmese_boat.png new file mode 100644 index 0000000..e1e02f3 Binary files /dev/null and b/textures/obsidianmese_boat.png differ diff --git a/textures/obsidianmese_boat_inventory.png b/textures/obsidianmese_boat_inventory.png new file mode 100644 index 0000000..b527ea9 Binary files /dev/null and b/textures/obsidianmese_boat_inventory.png differ