129 lines
3.4 KiB
Lua
129 lines
3.4 KiB
Lua
bvav_settings = {}
|
|
bvav_settings.attach_scaling = -30
|
|
bvav_settings.scaling = 0.667
|
|
|
|
math.randomseed( os.time() )
|
|
minetest.register_entity("bvav:bvav_element", {
|
|
initial_properties = {
|
|
physical = true,
|
|
collide_with_objects = true,
|
|
collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
|
|
visual = "wielditem",
|
|
textures = {},
|
|
automatic_face_movement_dir = 0.0,
|
|
},
|
|
|
|
node = {},
|
|
|
|
set_node = function(self, node)
|
|
self.node = node
|
|
local prop = {
|
|
is_visible = true,
|
|
textures = {node.name},
|
|
}
|
|
self.object:set_properties(prop)
|
|
end,
|
|
|
|
get_staticdata = function(self)
|
|
return self.node.name
|
|
end,
|
|
|
|
on_activate = function(self, staticdata)
|
|
self.object:set_armor_groups({immortal=1})
|
|
if staticdata then
|
|
self:set_node({name=staticdata})
|
|
end
|
|
minetest.after(0,function()
|
|
if self.parent ~= nil and self.relative ~= nil then
|
|
self.object:set_attach(self.parent, "", {x=self.relative.x,y=self.relative.y,z=self.relative.z}, {x=0,y=0,z=0})
|
|
self.object:set_properties({visual_size = {x=bvav_settings.scaling*3, y=bvav_settings.scaling*3}})
|
|
else
|
|
--this fixes issues with scaling
|
|
self.object:set_properties({visual_size = {x=bvav_settings.scaling, y=bvav_settings.scaling}})
|
|
end
|
|
end)
|
|
end,
|
|
|
|
-- maybe have cannons, anchors, trolling lines, etc
|
|
on_step = function(self, dtime)
|
|
if self.parent ~= nil then
|
|
|
|
else
|
|
--self.object:setvelocity({x=math.random(-1,1)*math.random(),y=0,z=math.random(-1,1)*math.random()})
|
|
end
|
|
end,
|
|
--
|
|
})
|
|
|
|
|
|
function spawn_bvav_element(p, node)
|
|
local obj = core.add_entity(p, "bvav:bvav_element")
|
|
obj:get_luaentity():set_node(node)
|
|
return obj
|
|
end
|
|
|
|
minetest.register_chatcommand("bvav", {
|
|
params = "",
|
|
description = "Send text to chat",
|
|
func = function(name)
|
|
pos = minetest.get_player_by_name(name):getpos()
|
|
local parent = spawn_bvav_element(pos, {name="default:wood"})
|
|
local basepos = parent:getpos()
|
|
|
|
pos.y = pos.y + 1
|
|
local child = spawn_bvav_element(pos, {name="default:wood"})
|
|
child:get_luaentity().parent = parent
|
|
child:get_luaentity().relative = {x=(basepos.x - pos.x) * bvav_settings.attach_scaling,y=(basepos.y - pos.y) * bvav_settings.attach_scaling,z= (basepos.z - pos.z) * bvav_settings.attach_scaling}
|
|
|
|
end,
|
|
})
|
|
|
|
function bvav_create_vessel(pos)
|
|
|
|
local parent = spawn_bvav_element(pos, {name="default:wood"})
|
|
local basepos = parent:getpos()
|
|
|
|
local range = 2
|
|
|
|
|
|
|
|
local min = {x=pos.x-range,y=pos.y-range,z=pos.z-range}
|
|
local max = {x=pos.x+range,y=pos.y+range,z=pos.z+range}
|
|
local vm = minetest.get_voxel_manip()
|
|
local emin, emax = vm:read_from_map(min,max)
|
|
local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax}
|
|
local data = vm:get_data()
|
|
|
|
|
|
--build the air ship
|
|
for x = range*-1,range do
|
|
for y = range*-1,range do
|
|
for z = range*-1,range do
|
|
local node = vm:get_node_at({x=pos.x+x,y=pos.y+y,z=pos.z+z}).name
|
|
|
|
local child = spawn_bvav_element(pos, {name=node})
|
|
child:get_luaentity().parent = parent
|
|
child:get_luaentity().relative = {x=(basepos.x - pos.x) * bvav_settings.attach_scaling,y=(basepos.y - pos.y) * bvav_settings.attach_scaling,z= (basepos.z - pos.z) * bvav_settings.attach_scaling}
|
|
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
|
|
vm:set_data(data)
|
|
vm:calc_lighting()
|
|
vm:write_to_map()
|
|
vm:update_map()
|
|
end
|
|
|
|
|
|
minetest.register_node("bvav:control_node", {
|
|
description = "Control Node",
|
|
tiles = {"default_stone.png"},
|
|
groups = {cracky=3, stone=1},
|
|
on_rightclick = function(pos, node, player, itemstack, pointed_thing)
|
|
bvav_create_vessel(pos)
|
|
end,
|
|
})
|