Initial version with template textures

This commit is contained in:
paramat 2018-06-10 05:17:40 +01:00
commit 9ad3e78889
11 changed files with 303 additions and 0 deletions

7
README.txt Normal file
View File

@ -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

2
depends.txt Normal file
View File

@ -0,0 +1,2 @@
default
player_api

236
init.lua Normal file
View File

@ -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},
})

58
license.txt Normal file
View File

@ -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/

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 B