From 744055b1039a9c2b340d29b9341dfe8839a6a4b5 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Thu, 30 Apr 2015 14:09:53 +0200 Subject: [PATCH] Added @ObaniGemini 's boats - Added nboats with their special properties. The code has been cleaned and optimized --- .../mods/boats/boat_inventory.png | Bin 851 -> 0 bytes minetestforfun_game/mods/boats/boat_wield.png | Bin 546 -> 0 bytes minetestforfun_game/mods/boats/init.lua | 432 +++++++++++------- .../boats/textures/boats_boat_inventory.png | Bin 0 -> 1495 bytes .../{boat_wield.png => boats_boat_wield.png} | Bin .../textures/boats_expert_race_inventory.png | Bin 0 -> 1545 bytes .../textures/boats_expert_race_wield.png | Bin 0 -> 1256 bytes ...boat_inventory.png => boats_inventory.png} | Bin .../mods/boats/textures/boats_moon.png | Bin 0 -> 4148 bytes .../boats/textures/boats_moon_inventory.png | Bin 0 -> 1495 bytes .../mods/boats/textures/boats_moon_wield.png | Bin 0 -> 847 bytes .../boats/textures/boats_race_inventory.png | Bin 0 -> 1527 bytes .../mods/boats/textures/boats_race_wield.png | Bin 0 -> 1218 bytes .../boats/textures/boats_water_inventory.png | Bin 0 -> 1495 bytes .../mods/boats/textures/boats_water_wield.png | Bin 0 -> 985 bytes .../mods/boats/textures/mboat_inventory.png | Bin 0 -> 1495 bytes .../mods/boats/textures/mboat_wield.png | Bin 0 -> 985 bytes minetestforfun_game/mods/init.lua | 211 +++++++++ 18 files changed, 469 insertions(+), 174 deletions(-) delete mode 100644 minetestforfun_game/mods/boats/boat_inventory.png delete mode 100644 minetestforfun_game/mods/boats/boat_wield.png create mode 100644 minetestforfun_game/mods/boats/textures/boats_boat_inventory.png rename minetestforfun_game/mods/boats/textures/{boat_wield.png => boats_boat_wield.png} (100%) create mode 100644 minetestforfun_game/mods/boats/textures/boats_expert_race_inventory.png create mode 100644 minetestforfun_game/mods/boats/textures/boats_expert_race_wield.png rename minetestforfun_game/mods/boats/textures/{boat_inventory.png => boats_inventory.png} (100%) create mode 100644 minetestforfun_game/mods/boats/textures/boats_moon.png create mode 100644 minetestforfun_game/mods/boats/textures/boats_moon_inventory.png create mode 100644 minetestforfun_game/mods/boats/textures/boats_moon_wield.png create mode 100644 minetestforfun_game/mods/boats/textures/boats_race_inventory.png create mode 100644 minetestforfun_game/mods/boats/textures/boats_race_wield.png create mode 100644 minetestforfun_game/mods/boats/textures/boats_water_inventory.png create mode 100644 minetestforfun_game/mods/boats/textures/boats_water_wield.png create mode 100644 minetestforfun_game/mods/boats/textures/mboat_inventory.png create mode 100644 minetestforfun_game/mods/boats/textures/mboat_wield.png create mode 100644 minetestforfun_game/mods/init.lua diff --git a/minetestforfun_game/mods/boats/boat_inventory.png b/minetestforfun_game/mods/boats/boat_inventory.png deleted file mode 100644 index f9d082e31625c099490403a56906e922e2ea9e72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 851 zcmV-Z1FZasP)>bI*)Nhm3B#3M=*L}JA!9HRz@*?WkF_AHc>+{j&Vqga7ao&Fo0-9c3?qe zR6TE8K~_mQd16INLponkKt(}5WKJ!rg-)P-N|<*>n|VftYCWQVN|tp)lXF9CR4=E3 zOr(KKj&DGUY(02gHk*4$o_j}wXFGsoI(Az!X;LqbaYBP;IB-`nU`i^CZ9s@>J9}X` zfn+vxTQz)OGkIP!b6GQIP%D~uM3QnrjBPxHXgYjiIcifdYEmsuJRy~ILX>krh-o=* zRxVvgDOf}&RYE14TQCv;002C6QchCF4C!)z#F_%)z?4wzjROrk zg#{I`ySuwv-~76p?lSrRYdN5Rg6?&ebLY%6bI z-nq};QSUzDun5`WTPSq6&@T6!4T~zlRFQC4DK5=Fe3b*&Ya)cAoQkrdfMie}9i0xe zz~?6l6eFw~7^$inDe-2?0((6T_%UzsiV=4?0YXMn^bDJenO^0@Ux!aE$C4=nlr4i( z(PP4u1SpW_7tagT{`IYM^0Q2Yu*Js)!RYZ%-d*VW}xw7 zaApN-Y~D;pq@3fvR?>;w(8Xe_NsBv}aFJ|=eSC6WN`O!7e>1udibU2qhRMiIzEB)* zz?%b_L?gY|lx( dAMEQD2kZ(bZYdv#XGG|aNV@)bxN++y^OPh8>jBr72S2Jx@ zEq`V`bXzl5Ml)+vF{gq~lypUiY(0~3JcMdHePla>X*qgeIeTF;sDn>~YCw8oK3YX8 zrGQMLeMpvbK#FcWQA99aNi0-BCX#bOh-W%uPB2P9FlkXKY*si?Jt3KPNPu87y7d!z z00001bW%=J06^y0W&i*IG)Y83R5;7+kXv?xAQVLd0)l9aK=G|HzG95cYyNX9w)v3N zA++~>xdBdTSqmSkCILNo9`d~K_;lU?lIGZh zQFU*qD3P!_$ZW(2`cRN^UHThnhBcH6gwu5h7)qtBnMH~{9t1b9 k#*!tWkz&lBcYo-<03BBywb>I+MgRZ+07*qoM6N<$f=^K0k^lez diff --git a/minetestforfun_game/mods/boats/init.lua b/minetestforfun_game/mods/boats/init.lua index 12126988..ecad2552 100644 --- a/minetestforfun_game/mods/boats/init.lua +++ b/minetestforfun_game/mods/boats/init.lua @@ -3,12 +3,14 @@ -- Helper functions -- -local function is_water(pos) +boats = {} + +function boats.is_water(pos) local nn = minetest.get_node(pos).name return minetest.get_item_group(nn, "water") ~= 0 end -local function get_sign(i) +function boats.get_sign(i) if i == 0 then return 0 else @@ -16,196 +18,278 @@ local function get_sign(i) end end -local function get_velocity(v, yaw, y) +function boats.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) +function boats.get_v(v) return math.sqrt(v.x ^ 2 + v.z ^ 2) end --- --- Boat entity --- +boats.register_boat = function(parameters) + local boat = { + physical = true, + collisionbox = {-0.6, -0.4, -0.6, 0.6, 0.3, 0.6}, + visual = "mesh", + mesh = "boat.x", + textures = {parameters.texture or "default_wood.png"}, + driver = nil, + v = 0, + last_v = 0, + removed = false + } -local boat = { - physical = true, - collisionbox = {-0.6, -0.4, -0.6, 0.6, 0.3, 0.6}, - visual = "mesh", - mesh = "boat.x", - textures = {"default_wood.png"}, - - 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 + 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() + 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 = -3}, {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 - 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 = -3}, {x = 0, y = 0, z = 0}) - default.player_attached[name] = true - minetest.after(0.2, function() - default.player_set_animation(clicker, "sit" , 30) + + 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, 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) - self.object:setyaw(clicker:get_look_yaw() - math.pi / 2) - 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, 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:boat") - 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 - 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:boat", boat) - - -minetest.register_craftitem("boats:boat", { - description = "Boat", - inventory_image = "boat_inventory.png", - wield_image = "boat_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:boat") if not minetest.setting_getbool("creative_mode") then - itemstack:take_item() + puncher:get_inventory():add_item("main", "boats:" .. parameters.name) end - return itemstack - end, + end + + function boat.on_step(self, dtime) + self.v = boats.get_v(self.object:getvelocity()) * boats.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 + parameters.controls.up or 0.1 + end + if ctrl.down then + self.v = self.v - parameters.controls.down or 0.08 + end + if ctrl.left then + if ctrl.down then + self.object:setyaw(yaw - (1 + dtime) * (0.03 * (parameters.controls.rotate or 1))) + else + self.object:setyaw(yaw + (1 + dtime) * (0.03 * (parameters.controls.rotate or 1))) + end + end + if ctrl.right then + if ctrl.down then + self.object:setyaw(yaw + (1 + dtime) * (0.03 * (parameters.controls.rotate or 1))) + else + self.object:setyaw(yaw - (1 + dtime) * (0.03 * (parameters.controls.rotate or 1))) + 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 = boats.get_sign(self.v) + self.v = self.v - 0.02 * s + if s ~= boats.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 * boats.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 boats.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 = boats.get_velocity(self.v, self.object:getyaw(), self.object:getvelocity().y) + else + p.y = p.y + 1 + if boats.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 = boats.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 = boats.get_velocity(self.v, self.object:getyaw(), 0) + else + new_velo = boats.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:"..parameters.name, boat) + + minetest.register_craftitem("boats:"..parameters.name, { + description = parameters.description or "Boat", + inventory_image = "boats_"..parameters.name.."_inventory.png", + wield_image = "boats_"..parameters.name.."_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 boats.is_water(pointed_thing.under) then + return + end + pointed_thing.under.y = pointed_thing.under.y+0.5 + minetest.env:add_entity(pointed_thing.under, "boats:"..parameters.name) + itemstack:take_item() + return itemstack + end, + }) +end + +boats.register_boat({ + name = "boat", + texture = "default_wood.png", + controls = { + up = 0.1, + down = 0.08, + rotate = 0.75 + }, + description = "Boat" +}) + +boats.register_boat({ + name = "race", + texture = "default_gravel.png", + controls = { + up = 0.2, + down = 0.18, + rotate = 1 + }, + description = "Race boat" +}) + +boats.register_boat({ + name = "expert_race", + texture = "default_desert_stone.png", + controls = { + up = 0.25, + down = 0.25, + rotate = 2 + }, + description = "Expert race boat" +}) + + +boats.register_boat({ + name = "water", + texture = "default_water.png", + controls = { + up = 0.3, + down = 0.24, + rotate = 4 + }, + description = "Water boat" +}) + +boats.register_boat({ + name = "moon", + texture = "boats_moon.png", + controls = { + up = 0.5, + down = 0.1, + rotate = 8 + }, + description = "Moon boat" +}) + +-- Craft registrations + +minetest.register_craft({ + output = "boats:moon", + recipe = { + {"default:obsidian", "", "default:obsidian"}, + {"default:dirt", "default:leaves", "default:dirt"}, + }, +}) + +minetest.register_craft({ + output = "boats:expert_race", + recipe = { + {"default:desert_stone", "", "default:desert_stone"}, + {"default:desert_stone", "default:mese", "default:desert_stone"}, + }, +}) + +minetest.register_craft({ + output = "boats:race", + recipe = { + {"default:gravel", "", "default:gravel"}, + {"default:gravel", "default:steelblock", "default:gravel"}, + }, +}) + +minetest.register_craft({ + output = "boats:water", + recipe = { + {"default:glass", "", "default:glass"}, + {"default:glass", "bucket:bucket_water", "default:glass"}, + }, }) minetest.register_craft({ output = "boats:boat", recipe = { - {"", "", "" }, - {"group:wood", "", "group:wood"}, + {"group:wood", "", "group:wood"}, {"group:wood", "group:wood", "group:wood"}, }, }) diff --git a/minetestforfun_game/mods/boats/textures/boats_boat_inventory.png b/minetestforfun_game/mods/boats/textures/boats_boat_inventory.png new file mode 100644 index 0000000000000000000000000000000000000000..854da84f1236c0b1884c22e4025fd04c3d35c4eb GIT binary patch literal 1495 zcmV;|1t|K7P)(=iKwX_sc<= z(p#~{kTxJ)qYpNG>$m@Vt^Znb=FA!HWhm}(ybEy80nFX_Nqob%ypsweE9j@zeLSS#dWjgOTygX)9q|BRv-C4`5?%A33-JYF%F{

Ls0)f z4uY7sEU*A&#_IbH%a`7NH2Ki4@t`Gr23KgpXF2(R_e>L@(A zT69mQYIw}M$aJn5Y(h79ns&fC&#B{wSX~^E8ify$-a59Y4I4W(3*&^3zV|Rb1nO>} z=`2;_*qU~D>pnhK@@?xU=OWUYTWtj}$-;*|u+CG9g+CjEEVjMIy2!$~;Ogd_t-YG{ z)dkj9#(+@wmcc2irstnq`_!G~fg?+-uPmUI;Jqg?8s`GNZHX~Z76}3Osd*DuU6d;Z zAOI&0sYgzq(7!Y~u6F}C7b&uYrG+tNkuuH`j8+(}nAZb7M6%RSH$Ag?OF2rpZ@ENk zL)|&DL=$7A={(LyRwe~yk+NTVrVZC4w67OojF2aiA6_ojt#ueJq)CC+n!a~bZI6=3 zWNhedplW)yrwu*?^3*UcQbH7(&LPrcohQVI0FzP5!YH9`d$y(xotGE4`}~_OsBMwg z0F*#I#Mxfu|2Qf1$40rJM6qA@%<3NJJ*g4O!ceyjn|l>$lCUt&0BAZ(mMDZk@Q%4C zMtREW(uk#n9OoPx)Be)s?d<%GN?#bfOqIOR2?chWusICjrS&CwLPQV&t%R<(SQn_< zfsNf7>mnzQEwi>j{RWy0RLm`AhYlRktb)L3&jB~@$)sk|Qk{ZEiaNaX-2I|&QWQL_Oqa3C9 zAno>Cethw-!{`5e-TmAKskQodH+;PfMPS~?{a1E)?#Lm|rbd=yi1-juN^yK`kt|X8 z5P(Ps&~yVK1ju76@KLDyetX&#KiF)NXKhfMBA{<`GdaL00`1_b zT1(S81{bIr%hkR3i{D+*pS`jjo)y$AO$FS>T?oO+pk4X5{%l7-%r~cwc9!S4YHE!kdCeQqRH(rQQ(09079RSb@ z_A0lj39oL<`02I%wg{E7!v>h002ovPDHLkV1nTL+hYI# literal 0 HcmV?d00001 diff --git a/minetestforfun_game/mods/boats/textures/boat_wield.png b/minetestforfun_game/mods/boats/textures/boats_boat_wield.png similarity index 100% rename from minetestforfun_game/mods/boats/textures/boat_wield.png rename to minetestforfun_game/mods/boats/textures/boats_boat_wield.png diff --git a/minetestforfun_game/mods/boats/textures/boats_expert_race_inventory.png b/minetestforfun_game/mods/boats/textures/boats_expert_race_inventory.png new file mode 100644 index 0000000000000000000000000000000000000000..891fd2970244b4ed2c12561360a4e4dff25d3c6e GIT binary patch literal 1545 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 SHKkVo0000I4GU_Lc?19e02y>e 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

Ls0)f z4uY7sEU*A&#_IbH%a`7NH2Ki4@t`Gr23KgpXF2(R_e>L@(A zT69mQYIw}M$aJn5Y(h79ns&fC&#B{wSX~^E8ify$-a59Y4I4W(3*&^3zV|Rb1nO>} z=`2;_*qU~D>pnhK@@?xU=OWUYTWtj}$-;*|u+CG9g+CjEEVjMIy2!$~;Ogd_t-YG{ z)dkj9#(+@wmcc2irstnq`_!G~fg?+-uPmUI;Jqg?8s`GNZHX~Z76}3Osd*DuU6d;Z zAOI&0sYgzq(7!Y~u6F}C7b&uYrG+tNkuuH`j8+(}nAZb7M6%RSH$Ag?OF2rpZ@ENk zL)|&DL=$7A={(LyRwe~yk+NTVrVZC4w67OojF2aiA6_ojt#ueJq)CC+n!a~bZI6=3 zWNhedplW)yrwu*?^3*UcQbH7(&LPrcohQVI0FzP5!YH9`d$y(xotGE4`}~_OsBMwg z0F*#I#Mxfu|2Qf1$40rJM6qA@%<3NJJ*g4O!ceyjn|l>$lCUt&0BAZ(mMDZk@Q%4C zMtREW(uk#n9OoPx)Be)s?d<%GN?#bfOqIOR2?chWusICjrS&CwLPQV&t%R<(SQn_< zfsNf7>mnzQEwi>j{RWy0RLm`AhYlRktb)L3&jB~@$)sk|Qk{ZEiaNaX-2I|&QWQL_Oqa3C9 zAno>Cethw-!{`5e-TmAKskQodH+;PfMPS~?{a1E)?#Lm|rbd=yi1-juN^yK`kt|X8 z5P(Ps&~yVK1ju76@KLDyetX&#KiF)NXKhfMBA{<`GdaL00`1_b zT1(S81{bIr%hkR3i{D+*pS`jjo)y$AO$FS>T?oO+pk4X5{%l7-%r~cwc9!S4YHE!kdCeQqRH(rQQ(09079RSb@ z_A0lj39oL<`02I%wg{E7!v>h002ovPDHLkV1nTL+hYI# literal 0 HcmV?d00001 diff --git a/minetestforfun_game/mods/boats/textures/boats_moon_wield.png b/minetestforfun_game/mods/boats/textures/boats_moon_wield.png new file mode 100644 index 0000000000000000000000000000000000000000..ca62b14129a7cd2bede4b75c874097a4cae77ddf GIT binary patch literal 847 zcmV-V1F-ywP)&Q$Q(HK`K;2FjYY$RY^5hMKV}KCs;=`Sw$#XM=x7O zDqTn`UPvZhNi1JVEnrG0VM{1sOfO?iDq~JCWKJt(P%>suEoV?JXi+a|Q7LIsFKSXM zYEv+4R55E+H*8caY*jLCRV{5+Gj3NjZdf{RS1xZ@HFH`rbXzlZTr_oEI(A(&cU>=c zUNv`MLU>;`cwjwwU^jYTF?wM*dSX9&VKRGTKYU^{d}BI&UN?PXG<{?{ePuy@WHo+e zJbz_2e`Y;^U^9SbH-Tq3foML0XgPvuKZ9vHgK9v8YCD8$L4|8Og=|8GW;uv#J&9;L ziETcLX*`Nd`6phM4Wg54s!t=ag~{Qp0aIr*jde*zvSI@x@Q;l=e0q}d{Cb5qa?kAU=OZ5$6LR}qAx zu)u7a7~2E9s12m_!YG!)k|~Ay^DU{U)MOKtgivg|SK3`l8IZOI zEOncjf~RH`GqKa&*v>w3L;5DqM(>s~BD}zY=PS-nW1c^F2BaI^O+wjBEmsINK>h7*tXd%6ct1RF%=^H_mH=MY_sWe-RoUGFplS+b(KRC>Kgi^}$Z*T4QR Zz5zQWte-ybS3m#&002ovPDHLkV1k1%QIr4x literal 0 HcmV?d00001 diff --git a/minetestforfun_game/mods/boats/textures/boats_race_inventory.png b/minetestforfun_game/mods/boats/textures/boats_race_inventory.png new file mode 100644 index 0000000000000000000000000000000000000000..fbe0281b50ffbf5c96d4bf7c68644caecb15cae4 GIT binary patch literal 1527 zcmV zS-KL$xDiozx)8)w;zBTju5=+9i3k$Z%$PCLlb)`r>iVvFANStlq9?;7F`5jCvzfDc zya)IE-v8Y5KljS{^XIvfVYtI_7vPQqL?6T=ddsu?KNV0QC`5#NTDJOJX52Z|w*q}A z3aB0@PHouf=Jf>=7SE2BbiLCuG0`uHTTfSNUY8FVKmi{hGMcw-@yzxrUq2lC?W+Uu z3TL_|O-%Xur3)i5t?$)p{~nO#e*>|*ySwixc^#C=Xw>XB(QQu{M{7-;zL+&$c_JNP?q(8YjSUy#GPG1|= zOctK)Zp>`q>Ey89$q*A$dlRj%M2QA}wk+mf0`rHKGC z{hikii~AR)H{L^cC8pan91JVc2qsII6rS?<#PUW7yLsSG#W1go1KJC!$R=%CJq-sF|-?&q6+M7=X5gY zPb*>zK~m}2^RV3!`jd*29Ya++CWUZnBW1jRwH0t)iLBs)GF~X9vm~)OE{n<=3d@^5 zpbA+m*?8_(dlN@Hx43W&FkAZLO%@a%Km-!2T<+B? zVm6wr`Tf0EuXc2nD zanU?;BL38VzhE%&v~$BwH=>aUNAqxV?8MfP#g=9YJ_vaXE1A-tDjO}K@gd{evQfk+=DP07ir~jsJ4*dK_gj=PK{xqgkMtS`J2zRw@LAb}npo zBAi$HGe~0yAuubHW(vc(VP`#Ny&ct!EPbIri@)%X>*1$$khwMQbiNm{*PuZOD#Vc>VmZ+fM9d|p*;g+1&9`Qy zjv^z7yoYftz{7jlQC!2KSxp>4D-+h55s@+U#-7PSab6iO1Je?m8oDjReJ9K- z#x@=wR?Ua5&FzcUfHm)98hQm(V`~k2>k0FsrjZ)D&E!|8F3)bsBd;D5-P0#xu8(Vm zbH!TW!BfeksO=9fPvY;^!SqDH%59tnL||EY8mVwNtZ6rd@yxNP;^z;h_Q#*t%b#3r z#?KYC&$C$AAJpO8eJd~g>qwp(EaWA*vBqtmhz!DPS&J1Vs3!#7kK+77e_@|jB>e7T z{ryo9eKJep-;CyA|Ln=mV=wQUFZSp1l9BhH{2dBd1H+l?H4+Ywrsj{svhl>yNl)b1 zD@5Spb^mf6%V(T6<4XeyYmUF&Zpf`SBULa$6d7$)UM6sRe|6gmh=78tgG@f`#CItSP)yIPSVMQZ~E4xBpkKTx3mrhlctkyK?XuxKxrTrP|S z29KG+eYFCRDg|p56sgL!9d^~NI(_cxb6URn+n4;2W%z^Z3BVJ8CjjoTW-PBXro^^Q zr-mw}g~cc{8Ck?uh!GYe$8sB4?E^6>y-&oXj4NSWDy0NsR78YU2b5_oX92idA5jHs zp(?u-Rv}hsP{&;O$26(cn-3#`a7A zpDhaNQaHxUwoBv;0|!2WvtSXX!-A@`)Rm!WGwm@_IpJn?V&%Wvh<+HR9)ci{&jfHe zadbYAV!{UyfuVy*C9DsMj}hk#^BS5qQaZz8WclgdGbn{!uUt+FR5MpoL-2w71I)~s z0B)8?>Pm?jrd6c#uR41F||P99&w zpSH8Ffbx3U{P3|k9Xj5w13tm5c0B*Y(jA4EL5$#2#yYtEyynN-mc^uCQCpmWsx%bN z;cVpfeMicci*aI92+2Rfz+YZfKh8(y``%pY;_`*Qc=1x#hs5R7VXa~`vupxBD4$N0 z&gYX51-^g1=hdeJrbEkp6X-+c-8v9rrt_I+^MZLTR8D!f)5o1~zj-g4HoJG5aQXLt z?XPZc-^jCtr8`EP2z|^WCSQJ^fBSHuL)y`8D z1}jQY8FsC3Ie~2$8rNl#xfuPs-zf;SHyLHT5C z`18w(5aD71O{ajIv~w;4eavKq!k%2PFd%?x1`P9BnGPM+8s2XrcQ=uXX+h~AWccS> zPl%aSfYAr>9lSC=*9k*}*~qXM2~C&q5w(=iKwX_sc<= z(p#~{kTxJ)qYpNG>$m@Vt^Znb=FA!HWhm}(ybEy80nFX_Nqob%ypsweE9j@zeLSS#dWjgOTygX)9q|BRv-C4`5?%A33-JYF%F{

Ls0)f z4uY7sEU*A&#_IbH%a`7NH2Ki4@t`Gr23KgpXF2(R_e>L@(A zT69mQYIw}M$aJn5Y(h79ns&fC&#B{wSX~^E8ify$-a59Y4I4W(3*&^3zV|Rb1nO>} z=`2;_*qU~D>pnhK@@?xU=OWUYTWtj}$-;*|u+CG9g+CjEEVjMIy2!$~;Ogd_t-YG{ z)dkj9#(+@wmcc2irstnq`_!G~fg?+-uPmUI;Jqg?8s`GNZHX~Z76}3Osd*DuU6d;Z zAOI&0sYgzq(7!Y~u6F}C7b&uYrG+tNkuuH`j8+(}nAZb7M6%RSH$Ag?OF2rpZ@ENk zL)|&DL=$7A={(LyRwe~yk+NTVrVZC4w67OojF2aiA6_ojt#ueJq)CC+n!a~bZI6=3 zWNhedplW)yrwu*?^3*UcQbH7(&LPrcohQVI0FzP5!YH9`d$y(xotGE4`}~_OsBMwg z0F*#I#Mxfu|2Qf1$40rJM6qA@%<3NJJ*g4O!ceyjn|l>$lCUt&0BAZ(mMDZk@Q%4C zMtREW(uk#n9OoPx)Be)s?d<%GN?#bfOqIOR2?chWusICjrS&CwLPQV&t%R<(SQn_< zfsNf7>mnzQEwi>j{RWy0RLm`AhYlRktb)L3&jB~@$)sk|Qk{ZEiaNaX-2I|&QWQL_Oqa3C9 zAno>Cethw-!{`5e-TmAKskQodH+;PfMPS~?{a1E)?#Lm|rbd=yi1-juN^yK`kt|X8 z5P(Ps&~yVK1ju76@KLDyetX&#KiF)NXKhfMBA{<`GdaL00`1_b zT1(S81{bIr%hkR3i{D+*pS`jjo)y$AO$FS>T?oO+pk4X5{%l7-%r~cwc9!S4YHE!kdCeQqRH(rQQ(09079RSb@ z_A0lj39oL<`02I%wg{E7!v>h002ovPDHLkV1nTL+hYI# literal 0 HcmV?d00001 diff --git a/minetestforfun_game/mods/boats/textures/boats_water_wield.png b/minetestforfun_game/mods/boats/textures/boats_water_wield.png new file mode 100644 index 0000000000000000000000000000000000000000..f45a78ddffb3b11bd92d704b6fac88d25fd6d23c GIT binary patch literal 985 zcmV;~119{5P)>mSiznJ3M9tYGt=GE)x}~Q z$0W9N!zLS-)ap{TW_0S*sjilve)xiqX^xL~OFQh8b#3HgT%9u0 zqD0?0?gJOcBgaGFlQAG7WNj?fn5LO&QF`wzrIT|dS3^XYZ6N7uISYVyO7b1S=$aYh ziuF$Lf!*LZ>^&Fz$RP>NIrd#BK^TH@Jgk^OsW8uu)3lPSq0KNolL7A?gA>#`Ap}x{ zrn>nlGDbKC7>9uvI!zOh@h%_|aZYGWxr&0wf=ny52lBZk=)GeGW}E+*nc07K0Oy3= zIBsRAhWF*eH2|Pe8R;~A`*RV&%EJWorn+(%DE-@^RG-kQ~*j9rbQ{W5JSW{M+lAHJLA%DtQ#mVcuRmXFV~b6USH>p z!3wJVd=2DMa42irM0A=~mR#|^k*iTkCHU>ijWLj7;t&iOBCR!4mDAMt=Tx|v8{Im^ zJ!3c*z>8;lK0OFkjHaIBe&#dcrc&+UhHGi}c=6-Lgjpy!UwTNih;bCx(6(3tsU~@!lhkwB&=) zAsM3!IOkB+dqb+>oV(kDSDbS=ckjmQZ%OSI|KEEcgs^4BdY7#kc(*Z(=iKwX_sc<= z(p#~{kTxJ)qYpNG>$m@Vt^Znb=FA!HWhm}(ybEy80nFX_Nqob%ypsweE9j@zeLSS#dWjgOTygX)9q|BRv-C4`5?%A33-JYF%F{

Ls0)f z4uY7sEU*A&#_IbH%a`7NH2Ki4@t`Gr23KgpXF2(R_e>L@(A zT69mQYIw}M$aJn5Y(h79ns&fC&#B{wSX~^E8ify$-a59Y4I4W(3*&^3zV|Rb1nO>} z=`2;_*qU~D>pnhK@@?xU=OWUYTWtj}$-;*|u+CG9g+CjEEVjMIy2!$~;Ogd_t-YG{ z)dkj9#(+@wmcc2irstnq`_!G~fg?+-uPmUI;Jqg?8s`GNZHX~Z76}3Osd*DuU6d;Z zAOI&0sYgzq(7!Y~u6F}C7b&uYrG+tNkuuH`j8+(}nAZb7M6%RSH$Ag?OF2rpZ@ENk zL)|&DL=$7A={(LyRwe~yk+NTVrVZC4w67OojF2aiA6_ojt#ueJq)CC+n!a~bZI6=3 zWNhedplW)yrwu*?^3*UcQbH7(&LPrcohQVI0FzP5!YH9`d$y(xotGE4`}~_OsBMwg z0F*#I#Mxfu|2Qf1$40rJM6qA@%<3NJJ*g4O!ceyjn|l>$lCUt&0BAZ(mMDZk@Q%4C zMtREW(uk#n9OoPx)Be)s?d<%GN?#bfOqIOR2?chWusICjrS&CwLPQV&t%R<(SQn_< zfsNf7>mnzQEwi>j{RWy0RLm`AhYlRktb)L3&jB~@$)sk|Qk{ZEiaNaX-2I|&QWQL_Oqa3C9 zAno>Cethw-!{`5e-TmAKskQodH+;PfMPS~?{a1E)?#Lm|rbd=yi1-juN^yK`kt|X8 z5P(Ps&~yVK1ju76@KLDyetX&#KiF)NXKhfMBA{<`GdaL00`1_b zT1(S81{bIr%hkR3i{D+*pS`jjo)y$AO$FS>T?oO+pk4X5{%l7-%r~cwc9!S4YHE!kdCeQqRH(rQQ(09079RSb@ z_A0lj39oL<`02I%wg{E7!v>h002ovPDHLkV1nTL+hYI# literal 0 HcmV?d00001 diff --git a/minetestforfun_game/mods/boats/textures/mboat_wield.png b/minetestforfun_game/mods/boats/textures/mboat_wield.png new file mode 100644 index 0000000000000000000000000000000000000000..f45a78ddffb3b11bd92d704b6fac88d25fd6d23c GIT binary patch literal 985 zcmV;~119{5P)>mSiznJ3M9tYGt=GE)x}~Q z$0W9N!zLS-)ap{TW_0S*sjilve)xiqX^xL~OFQh8b#3HgT%9u0 zqD0?0?gJOcBgaGFlQAG7WNj?fn5LO&QF`wzrIT|dS3^XYZ6N7uISYVyO7b1S=$aYh ziuF$Lf!*LZ>^&Fz$RP>NIrd#BK^TH@Jgk^OsW8uu)3lPSq0KNolL7A?gA>#`Ap}x{ zrn>nlGDbKC7>9uvI!zOh@h%_|aZYGWxr&0wf=ny52lBZk=)GeGW}E+*nc07K0Oy3= zIBsRAhWF*eH2|Pe8R;~A`*RV&%EJWorn+(%DE-@^RG-kQ~*j9rbQ{W5JSW{M+lAHJLA%DtQ#mVcuRmXFV~b6USH>p z!3wJVd=2DMa42irM0A=~mR#|^k*iTkCHU>ijWLj7;t&iOBCR!4mDAMt=Tx|v8{Im^ zJ!3c*z>8;lK0OFkjHaIBe&#dcrc&+UhHGi}c=6-Lgjpy!UwTNih;bCx(6(3tsU~@!lhkwB&=) zAsM3!IOkB+dqb+>oV(kDSDbS=ckjmQZ%OSI|KEEcgs^4BdY7#kc(*Z 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:boat", boat) + + +minetest.register_craftitem("boats:boat", { + description = "Boat", + inventory_image = "boat_inventory.png", + wield_image = "boat_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:boat") + if not minetest.setting_getbool("creative_mode") then + itemstack:take_item() + end + return itemstack + end, +}) + +minetest.register_craft({ + output = "boats:boat", + recipe = { + {"", "", "" }, + {"group:wood", "", "group:wood"}, + {"group:wood", "group:wood", "group:wood"}, + }, +})