From 61bfb3ae5544276bc6e18e64d8f623ae082ec365 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Tue, 3 Nov 2015 21:50:48 +0100 Subject: [PATCH] [boats] Define custom callback only once - boats: Update, move the callback functions out of register_boat - default: Update character.png --- minetestforfun_game/mods/boats/init.lua | 293 ++++++++++-------- .../mods/default/models/character.png | Bin 1848 -> 2754 bytes 2 files changed, 162 insertions(+), 131 deletions(-) mode change 100755 => 100644 minetestforfun_game/mods/boats/init.lua mode change 100755 => 100644 minetestforfun_game/mods/default/models/character.png diff --git a/minetestforfun_game/mods/boats/init.lua b/minetestforfun_game/mods/boats/init.lua old mode 100755 new mode 100644 index 2ed2d62e..043c008c --- a/minetestforfun_game/mods/boats/init.lua +++ b/minetestforfun_game/mods/boats/init.lua @@ -27,62 +27,65 @@ function boats.get_v(v) return math.sqrt(v.x ^ 2 + v.z ^ 2) end -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.obj", - textures = {parameters.texture or "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 - 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 - if not default.player_attached[name] == true 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) - else - minetest.chat_send_player(name, "You're already on a boat") +function boats.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) + 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 end + clicker:set_detach() end + 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 - 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 + +function boats.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) + +function boats.get_staticdata(self) + return tostring(self.v) +end + + +function boats.on_punch(self, puncher) + if not puncher or not puncher:is_player() or self.removed then + return 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 + if self.driver and puncher == self.driver then + self.driver = nil puncher:set_detach() default.player_attached[puncher:get_player_name()] = false + end + if not self.driver then self.removed = true -- delay remove to ensure player is detached minetest.after(0.1, function() @@ -90,103 +93,127 @@ boats.register_boat = function(parameters) end) if not minetest.setting_getbool("creative_mode") then local inv = puncher:get_inventory() - if inv:room_for_item("main", "boats:" .. parameters.name) then - inv:add_item("main", "boats:" .. parameters.name) + if inv:room_for_item("main", "boats:" .. self.parameters.name) then + inv:add_item("main", "boats:" .. self.parameters.name) else - minetest.add_item(self.object:getpos(), "boats:" .. parameters.name) + minetest.add_item(self.object:getpos(), "boats:" .. self.parameters.name) end end 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 +function boats.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 + self.parameters.controls.up or 0.1 + elseif ctrl.down then + self.v = self.v - self.parameters.controls.down or 0.08 + end + if ctrl.left then + if self.v < 0 then + self.object:setyaw(yaw - (1 + dtime) * (0.03 * (self.parameters.controls.rotate or 1))) + else + self.object:setyaw(yaw + (1 + dtime) * (0.03 * (self.parameters.controls.rotate or 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 + elseif ctrl.right then + if self.v < 0 then + self.object:setyaw(yaw + (1 + dtime) * (0.03 * (self.parameters.controls.rotate or 1))) + else + self.object:setyaw(yaw - (1 + dtime) * (0.03 * (self.parameters.controls.rotate or 1))) 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}) + 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 = 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 - 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) + new_acce = {x = 0, y = 1, z = 0} 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) + 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) + self.object:setpos(self.object:getpos()) + else + p.y = p.y + 1 + if boats.is_water(p) then + local y = self.object:getvelocity().y + if y >= 4.5 then + y = 4.5 + elseif y < 0 then + new_acce = {x = 0, y = 20, z = 0} 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 + 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) + 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) + self.object:setpos(self.object:getpos()) end end - self.object:setvelocity(new_velo) - self.object:setacceleration(new_acce) end + self.object:setvelocity(new_velo) + self.object:setacceleration(new_acce) +end - minetest.register_entity("boats:"..parameters.name, boat) +boats.register_boat = function(parameters) + minetest.register_entity("boats:" .. parameters.name, { + physical = true, + collisionbox = {-0.5, -0.35, -0.5, 0.5, 0.3, 0.5}, + visual = "mesh", + mesh = "boat.obj", + textures = {parameters.texture or "default_wood.png"}, - minetest.register_craftitem("boats:"..parameters.name, { + parameters = parameters, + driver = nil, + v = 0, + last_v = 0, + removed = false, + + on_rightclick = boats.on_rightclick, + on_activate = boats.on_activate, + get_staticdata = boats.get_staticdata, + on_punch = boats.on_punch, + on_step = boats.on_step + }) + + 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}, + 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) @@ -196,14 +223,17 @@ boats.register_boat = function(parameters) 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() + pointed_thing.under.y = pointed_thing.under.y + 0.5 + minetest.add_entity(pointed_thing.under, "boats:"..parameters.name) + if not minetest.setting_getbool("creative_mode") then + itemstack:take_item() + end return itemstack end, }) end + boats.register_boat({ name = "boat", texture = "default_wood.png", @@ -298,7 +328,8 @@ minetest.register_craft({ 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/default/models/character.png b/minetestforfun_game/mods/default/models/character.png old mode 100755 new mode 100644 index 321f9fb2b2b0b31a8087e8c781cfee2b1fa76c79..05021781e03fbb71cb309d5ac233c6c90f332fda GIT binary patch literal 2754 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 iZmC5klf;LiQ2RHy1z#|{W8SU+0000wqc3@