From 9ad3e788893952fd2dde2a3aa7a5c0735b8a2d7f Mon Sep 17 00:00:00 2001 From: paramat Date: Sun, 10 Jun 2018 05:17:40 +0100 Subject: [PATCH] Initial version with template textures --- README.txt | 7 + depends.txt | 2 + init.lua | 236 +++++++++++++++++++++++++++++ license.txt | 58 +++++++ textures/airboat_airboat_back.png | Bin 0 -> 127 bytes textures/airboat_airboat_base.png | Bin 0 -> 114 bytes textures/airboat_airboat_front.png | Bin 0 -> 122 bytes textures/airboat_airboat_inv.png | Bin 0 -> 146 bytes textures/airboat_airboat_left.png | Bin 0 -> 114 bytes textures/airboat_airboat_right.png | Bin 0 -> 112 bytes textures/airboat_airboat_top.png | Bin 0 -> 100 bytes 11 files changed, 303 insertions(+) create mode 100644 README.txt create mode 100644 depends.txt create mode 100644 init.lua create mode 100644 license.txt create mode 100644 textures/airboat_airboat_back.png create mode 100644 textures/airboat_airboat_base.png create mode 100644 textures/airboat_airboat_front.png create mode 100644 textures/airboat_airboat_inv.png create mode 100644 textures/airboat_airboat_left.png create mode 100644 textures/airboat_airboat_right.png create mode 100644 textures/airboat_airboat_top.png 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 0000000000000000000000000000000000000000..4dcc55f7f82a8b980a5d7f313285c5c731f1a2a4 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDD3?#L31Vw-pXMj(LE0AtzX!!sC|G`Ul7Xvwl zo-U3d8t0QaSQ|I2Oz3LlnzJD^!Jt&2Xj7QuL9dc?31y}l5i_ME9who&vU9NYFf&A4 Wc{R6M?z0e3GlQqApUXO@geCwM<0Y2> literal 0 HcmV?d00001 diff --git a/textures/airboat_airboat_base.png b/textures/airboat_airboat_base.png new file mode 100644 index 0000000000000000000000000000000000000000..1e866e84b2ca2dc96d18a10280848f9c18f340c0 GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDD3?#L31Vw-pXMj(LE0AtzX!!sC|G`Ul7Xvve zo-U3d8t0Qa&PK7aYCB7^NvoUWh%yVTnI&a)N^v4HTXR1%!-l}Gnhy{1)B@Erc)I$z JtaD0e0sybV9jpKV literal 0 HcmV?d00001 diff --git a/textures/airboat_airboat_front.png b/textures/airboat_airboat_front.png new file mode 100644 index 0000000000000000000000000000000000000000..22d9ac8416013a1a5b58724895e6dd01964bafa8 GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDD3?#L31Vw-pXMj(LE0AtzX!!sC|G`Ul7Xvvu zo-U3d8t0QaSQ|I2Oz3LlnzJD^!Jt&2Xj7QuL9dc?31y}l5seIT*PLfFGlaW5pE!N; RbxWW=22WQ%mvv4FO#o?CB(4Ae literal 0 HcmV?d00001 diff --git a/textures/airboat_airboat_inv.png b/textures/airboat_airboat_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..6ecb317a99182d8cfb7af52be082529fd7d4d7e7 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VWP0r5&G9Ns6@cQ-ZuV26Z z|Np=D@{MaiA;yv*zhDN3XE)M-96e7L#}JO|$q5du3mG}svNa?G4h94@81?Wj;1OqU pkz!+WRA5-;nB4HT(O7|jq3FKI##vjmjDb2CJYD@<);T3K0RX-cE(QPq literal 0 HcmV?d00001 diff --git a/textures/airboat_airboat_left.png b/textures/airboat_airboat_left.png new file mode 100644 index 0000000000000000000000000000000000000000..b051f282023704691727543d53955a97d65bd01b GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDD3?#L31Vw-pXMj(LE0AtzX!!sC|G`Ul7Xvve zo-U3d8t0QaS{p-GhZzQ(iEL$Yv%Kb|!m;u!@c)I$z JtaD0e0sskR9_9c5 literal 0 HcmV?d00001 diff --git a/textures/airboat_airboat_right.png b/textures/airboat_airboat_right.png new file mode 100644 index 0000000000000000000000000000000000000000..2a54b3a28e22e8efdaafc5b04cd1b6bcb9a0896a GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDD3?#L31Vw-pXMj(LE0AtzX!!sC|G`Ul7Xvv; zo-U3d8t0QEwq}KD@E8O%GqW$2(JGWUz#z3}N})rAgC)ak2cbV~iIW!rRWo?H`njxg HN@xNAtxO&) literal 0 HcmV?d00001 diff --git a/textures/airboat_airboat_top.png b/textures/airboat_airboat_top.png new file mode 100644 index 0000000000000000000000000000000000000000..e4ce3f614f9d732d95d3f99245cabe65762e46ec GIT binary patch literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDH3?y^UWFG-iYymzYt_=+h|NsAgeyw*6P(;$x v#W6(Ua&p21pcp&z;f^IY{xctBUKPZU%&~IjdEF!NKt&9mu6{1-oD!M