commit 9ad3e788893952fd2dde2a3aa7a5c0735b8a2d7f Author: paramat Date: Sun Jun 10 05:17:40 2018 +0100 Initial version with template textures diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..6a2e7f6 --- /dev/null +++ b/README.txt @@ -0,0 +1,7 @@ +airboat 0.1.0 by paramat +For Minetest 0.5.0dev (of 10/06/18) and later +Depends default + +Licenses: +Source code: MIT by paramat +Media: Textures CC0 diff --git a/depends.txt b/depends.txt new file mode 100644 index 0000000..8e482ce --- /dev/null +++ b/depends.txt @@ -0,0 +1,2 @@ +default +player_api diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..2ced97d --- /dev/null +++ b/init.lua @@ -0,0 +1,236 @@ +local function is_water(pos) + local nn = minetest.get_node(pos).name + return minetest.get_item_group(nn, "water") ~= 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 airboat = { + physical = true, + collisionbox = {-0.85, -1.5, -0.85, 0.85, 1.5, 0.85}, + visual = "wielditem", + visual_size = {x = 2.0, y = 2.0}, -- Scale up of nodebox is these * 1.5 + textures = {"airboat:airboat_nodebox"}, + + driver = nil, + v = 0, + vy = 0, + removed = false +} + + +function airboat.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() + player_api.player_attached[name] = false + player_api.set_animation(clicker, "stand" , 30) + local pos = clicker:getpos() + 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() + end + self.driver = clicker + clicker:set_attach(self.object, "", + {x = 0, y = -1, z = 0}, {x = 0, y = 0, z = 0}) + 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:getyaw()) + end +end + + +function airboat.on_activate(self, staticdata, dtime_s) + self.object:set_armor_groups({immortal = 1}) +end + + +function airboat.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() + player_api.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", "airboat:airboat") then + local leftover = inv:add_item("main", "airboat:airboat") + 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 airboat.on_step(self, dtime) + self.v = get_v(self.object:getvelocity()) * get_sign(self.v) + self.vy = self.object:getvelocity().y + 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 + self.object:setyaw(yaw + (1 + dtime) * 0.02) + elseif ctrl.right then + self.object:setyaw(yaw - (1 + dtime) * 0.02) + end + if ctrl.jump then + self.vy = self.vy + 0.075 + elseif ctrl.sneak then + self.vy = self.vy - 0.075 + end + end + local velo = self.object:getvelocity() + if self.v == 0 and self.vy == 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.v = 0 + end + if math.abs(self.v) > 6 then + self.v = 6 * get_sign(self.v) + end + + local sy = get_sign(self.vy) + self.vy = self.vy - 0.04 * sy + if sy ~= get_sign(self.vy) then + self.vy = 0 + end + if math.abs(self.vy) > 4 then + self.vy = 4 * get_sign(self.vy) + end + + local new_acce = {x = 0, y = 0, z = 0} + local p = self.object:getpos() + p.y = p.y - 1.5 + if is_water(p) then + new_acce = {x = 0, y = 20, z = 0} + end + + self.object:setpos(self.object:getpos()) + local new_velo = get_velocity(self.v, self.object:getyaw(), self.vy) + self.object:setvelocity(new_velo) + self.object:setacceleration(new_acce) +end + + +minetest.register_entity("airboat:airboat", airboat) + + +minetest.register_craftitem("airboat:airboat", { + description = "Airboat", + inventory_image = "airboat_airboat_inv.png", + wield_scale = {x = 4, y = 4, z = 4}, + 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 + pointed_thing.under.y = pointed_thing.under.y + 2 + boat = minetest.add_entity(pointed_thing.under, "airboat:airboat") + 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_node("airboat:airboat_nodebox", { + description = "Airboat Nodebox", + tiles = { -- top base right left front back + "airboat_airboat_top.png", + "airboat_airboat_base.png", + "airboat_airboat_right.png", + "airboat_airboat_left.png", + "airboat_airboat_front.png", + "airboat_airboat_back.png", + }, + paramtype = "light", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { -- widmin heimin lenmin widmax heimax lenmax + {-0.271, -0.167, -0.5, 0.271, 0.375, 0.5}, -- Envelope + {-0.167, -0.5, -0.25, 0.167, -0.167, 0.25}, -- Gondola + {-0.021, 0.375, -0.5, 0.021, 0.5, -0.25}, -- Top fin + {-0.021, -0.292, -0.5, 0.021, -0.167, -0.25}, -- Base fin + {-0.396, 0.083, -0.5, -0.271, 0.125, -0.25}, -- Left fin + {0.271, 0.083, -0.5, 0.396, 0.125, -0.25}, -- Right fin + }, + }, + groups = {not_in_creative_inventory = 1}, +}) diff --git a/license.txt b/license.txt new file mode 100644 index 0000000..42a1f50 --- /dev/null +++ b/license.txt @@ -0,0 +1,58 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2017 paramat + +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. + +For more details: +https://opensource.org/licenses/MIT + + +License of media (textures) +--------------------------- + +CC0 1.0 Universal (CC0 1.0) Public Domain Dedication + +Paramat + +No Copyright + +The person who associated a work with this deed has dedicated the work to the +public domain by waiving all of his or her rights to the work worldwide under +copyright law, including all related and neighboring rights, to the extent +allowed by law. + +You can copy, modify, distribute and perform the work, even for commercial +purposes, all without asking permission. See Other Information below. + +Other Information: + +In no way are the patent or trademark rights of any person affected by CC0, nor +are the rights that other persons may have in the work or in how the work is +used, such as publicity or privacy rights. + +Unless expressly stated otherwise, the person who associated a work with this +deed makes no warranties about the work, and disclaims liability for all uses +of the work, to the fullest extent permitted by applicable law. + +When using or citing the work, you should not imply endorsement by the author +or the affirmer. + +For more details: +https://creativecommons.org/publicdomain/zero/1.0/ diff --git a/textures/airboat_airboat_back.png b/textures/airboat_airboat_back.png new file mode 100644 index 0000000..4dcc55f Binary files /dev/null and b/textures/airboat_airboat_back.png differ diff --git a/textures/airboat_airboat_base.png b/textures/airboat_airboat_base.png new file mode 100644 index 0000000..1e866e8 Binary files /dev/null and b/textures/airboat_airboat_base.png differ diff --git a/textures/airboat_airboat_front.png b/textures/airboat_airboat_front.png new file mode 100644 index 0000000..22d9ac8 Binary files /dev/null and b/textures/airboat_airboat_front.png differ diff --git a/textures/airboat_airboat_inv.png b/textures/airboat_airboat_inv.png new file mode 100644 index 0000000..6ecb317 Binary files /dev/null and b/textures/airboat_airboat_inv.png differ diff --git a/textures/airboat_airboat_left.png b/textures/airboat_airboat_left.png new file mode 100644 index 0000000..b051f28 Binary files /dev/null and b/textures/airboat_airboat_left.png differ diff --git a/textures/airboat_airboat_right.png b/textures/airboat_airboat_right.png new file mode 100644 index 0000000..2a54b3a Binary files /dev/null and b/textures/airboat_airboat_right.png differ diff --git a/textures/airboat_airboat_top.png b/textures/airboat_airboat_top.png new file mode 100644 index 0000000..e4ce3f6 Binary files /dev/null and b/textures/airboat_airboat_top.png differ