Compare commits

..

17 Commits

Author SHA1 Message Date
loosewheel
2b61dfb872 Add files via upload 2021-11-29 11:29:56 +10:00
loosewheel
1459dc2029 Add files via upload 2021-11-29 11:27:33 +10:00
loosewheel
a3f6a4d203 Add files via upload 2021-11-29 11:25:24 +10:00
loosewheel
6c8a60c3f7 Add files via upload 2021-11-29 11:24:38 +10:00
loosewheel
be384872dd Add files via upload 2021-11-29 11:22:46 +10:00
loosewheel
ec08eebfd3 Add files via upload 2021-11-25 07:15:45 +10:00
loosewheel
cf8c44cb80 Add files via upload 2021-11-25 07:06:57 +10:00
loosewheel
46d8b2fcff Update readme.txt 2021-11-24 19:53:05 +10:00
loosewheel
2dabff4239 Add files via upload 2021-11-24 19:36:15 +10:00
loosewheel
b931c3105c Add files via upload 2021-11-24 19:35:15 +10:00
loosewheel
61825c93af Add files via upload 2021-11-24 19:33:57 +10:00
loosewheel
bd75cddfc8 Add files via upload 2021-11-24 19:31:55 +10:00
loosewheel
1c2486c938 Add files via upload 2021-11-24 19:30:03 +10:00
loosewheel
a45734b65a Add files via upload 2021-11-24 19:28:47 +10:00
loosewheel
16db2b969f Add files via upload 2021-11-24 19:28:07 +10:00
loosewheel
e845b002b4 Create lwcomponents_cannon_barrel.obj 2021-11-24 19:27:35 +10:00
loosewheel
17d23114fc Add files via upload 2021-11-23 04:48:27 +10:00
36 changed files with 2918 additions and 13 deletions

View File

@@ -138,9 +138,9 @@ local function can_break_node (pos, breakpos)
if node_def then if node_def then
-- try tool first -- try tool first
local tool = get_tool (pos) local tool = get_tool (pos)
local dig_params = nil
if tool then if tool then
local dig_params = nil
local tool_def = minetest.registered_items[tool:get_name ()] local tool_def = minetest.registered_items[tool:get_name ()]
if tool_def then if tool_def then
@@ -356,7 +356,7 @@ local function after_place_node_locked (pos, placer, itemstack, pointed_thing)
local meta = minetest.get_meta (pos) local meta = minetest.get_meta (pos)
meta:set_string ("owner", placer:get_player_name ()) meta:set_string ("owner", placer:get_player_name ())
meta:set_string ("infotext", "Dropper (owned by "..placer:get_player_name ()..")") meta:set_string ("infotext", "Breaker (owned by "..placer:get_player_name ()..")")
end end
-- If return true no item is taken from itemstack -- If return true no item is taken from itemstack

1068
cannon.lua Normal file

File diff suppressed because it is too large Load Diff

293
cannon_shell.lua Normal file
View File

@@ -0,0 +1,293 @@
local utils = ...
local S = utils.S
--[[
on_step info
info.touching_ground = bool
info.standing_on_object = bool
info.collides = bool
info.collisions[n].type = "node"
info.collisions[n].node_pos = vector
info.collisions[n].old_velocity = vector
info.collisions[n].now_velocity = vector
info.collisions[n].axis = "x" | "y" | "z" - axis hit
or
info.collisions[n].type = "object"
info.collisions[n].object = userdata
info.collisions[n].old_velocity = vector
info.collisions[n].now_velocity = vector
info.collisions[n].axis = "x" | "y" | "z" - axis hit
]]
local function get_adjacent_node (collision_info, spawn_pos)
if vector.equals (collision_info.node_pos, spawn_pos) then
return collision_info.node_pos
end
local adj = { x = 0, y = 0, z = 0 }
if collision_info.axis == "x" then
adj.x = (collision_info.old_velocity.x > 0 and -1) or 1
elseif collision_info.axis == "y" then
adj.y = (collision_info.old_velocity.y > 0 and -1) or 1
elseif collision_info.axis == "z" then
adj.z = (collision_info.old_velocity.z > 0 and -1) or 1
end
local pos = vector.new (collision_info.node_pos)
local node = utils.get_far_node (pos)
local def = minetest.registered_nodes[node and node.name or nil]
while (node and node.name ~= "air") and (def and not def.buildable_to) do
local next_pos = vector.add (pos, adj)
if vector.equals (next_pos, spawn_pos) then
return pos
end
pos = next_pos
node = utils.get_far_node (pos)
def = minetest.registered_nodes[node and node.name or nil]
end
return pos
end
local function register_shell (name, description, texture, inventory_image,
stack_max, shell_speed, explode_func)
minetest.register_entity (name.."_entity", {
initial_properties = {
physical = true,
collide_with_objects = true,
collisionbox = { -0.25, -0.125, -0.25, 0.25, 0.125, 0.25 },
pointable = false,
visual_size = { x = 0.7, y = 0.7, z = 0.7 },
visual = "mesh",
mesh = "lwcomponents_shell.obj",
textures = { texture },
use_texture_alpha = false,
is_visible = true,
makes_footstep_sound = false,
automatic_face_movement_dir = false,
automatic_face_movement_max_rotation_per_sec = false,
automatic_rotate = 0,
backface_culling = true,
damage_texture_modifier = "",
glow = 0,
static_save = false,
shaded = true,
show_on_minimap = false,
},
on_activate = function (self, staticdata, dtime_s)
if not self.spawn_pos then
self.spawn_pos = vector.new (self.object:get_pos ())
end
if not self.time_lived then
self.time_lived = 0
end
if not self.shell_speed then
self.shell_speed = shell_speed
end
self.staticdata = staticdata
end,
get_staticdata = function (self)
return self.staticdata
end,
on_step = function (self, dtime, info)
local explode_pos = nil
self.object:set_rotation (vector.dir_to_rotation (self.object:get_velocity ()))
if self.time_lived then
self.time_lived = self.time_lived + dtime
if self.time_lived > self.shell_speed then
self.object:remove ()
return
end
end
if info.collides then
--For each collision that was found in reverse order
for i = #info.collisions, 1, -1 do
local c = info.collisions[i]
if c.type == "node" then
local node = utils.get_far_node (c.node_pos)
if node and node.name ~= "air" then
local def = minetest.registered_nodes[node.name]
if def and def.walkable then
-- adjacent for explosion
explode_pos = get_adjacent_node (c, self.spawn_pos)
--minetest.log ("action", "Shell on node "..node.name.." at "..minetest.pos_to_string (explode_pos)..
--" node at "..minetest.pos_to_string (c.node_pos))
break
end
end
if not explode_pos then
self.object:set_velocity (c.old_velocity)
end
elseif c.type == "object" then
-- explode at this pos
if c.object:get_armor_groups ().immortal then
self.object:set_velocity (c.old_velocity)
else
explode_pos = vector.new (c.object:get_pos ())
--minetest.log ("action", "Shell on entity "..c.object:get_luaentity ().name.." at "..minetest.pos_to_string (explode_pos))
break
end
end
end
end
if explode_pos then
self.object:remove ()
explode_func (explode_pos)
end
end,
on_punch = function (self, puncher, time_from_last_punch, tool_capabilities, dir)
return true
end,
})
minetest.register_craftitem (name, {
description = description,
short_description = description,
groups = { },
inventory_image = inventory_image,
wield_image = inventory_image,
stack_max = stack_max,
})
lwcomponents.register_spawner (name,
function (spawn_pos, itemstack, owner, spawner_pos, spawner_dir, force)
if not itemstack:is_empty() then
local def = minetest.registered_entities[name.."_entity"]
if def then
local obj = minetest.add_entity (spawn_pos, name.."_entity")
if obj then
obj:set_armor_groups ({ immortal = 1 })
obj:set_acceleration ({ x = 0, y = -9.81, z = 0 })
obj:set_rotation (vector.dir_to_rotation (vector.multiply (spawner_dir, shell_speed)))
obj:set_velocity (vector.multiply (spawner_dir, shell_speed))
local luaent = obj:get_luaentity ()
if luaent then
luaent.spawn_pos = { x = spawn_pos.x, y = spawn_pos.y, z = spawn_pos.z }
luaent.time_lived = 0
luaent.shell_speed = shell_speed
end
return obj, false
end
end
end
return nil, false
end)
end
register_shell ("lwcomponents:cannon_shell",
S("Shell"),
"lwcannon_shell.png",
"lwcannon_shell_item.png",
99,
25,
function (pos)
utils.boom (pos,
2, -- node_radius
70, -- node_chance in 100
2, -- fire_radius
5, -- fire_chance in 100
4, -- entity_radius
20, -- entity_damage
false, -- disable_drops
nil, -- node_filter
false, -- burn_all
nil) -- sound
end)
register_shell ("lwcomponents:cannon_soft_shell",
S("Soft Shell"),
"lwcannon_soft_shell.png",
"lwcannon_soft_shell_item.png",
99,
25,
function (pos)
utils.boom (pos,
2, -- node_radius
50, -- node_chance in 100
2, -- fire_radius
5, -- fire_chance in 100
4, -- entity_radius
20, -- entity_damage
false, -- disable_drops
{
buildable_to = true,
buildable_to_undefined = false,
}, -- node_filter
false, -- burn_all
nil) -- sound
end)
if minetest.global_exists ("fire") then
register_shell ("lwcomponents:cannon_fire_shell",
S("Fire Shell"),
"lwcannon_fire_shell.png",
"lwcannon_fire_shell_item.png",
99,
25,
function (pos)
utils.boom (pos,
2, -- node_radius
0, -- node_chance in 100
2, -- fire_radius
70, -- fire_chance in 100
4, -- entity_radius
20, -- entity_damage
false, -- disable_drops
nil, -- node_filter
true, -- burn_all
nil) -- sound
end)
end
--

View File

@@ -54,3 +54,23 @@ v0.1.8
must now set velocity, can use force parameter. must now set velocity, can use force parameter.
* Removed spawning from this mod. Created lwcomponents_spawners to * Removed spawning from this mod. Created lwcomponents_spawners to
register spawers. register spawers.
v0.1.9
* Fixed infotext on various nodes.
v0.1.10
* Added cannons.
v0.1.11
* Fix to breakers (?).
* Added position aiming to cannons.
v0.1.12
* Added sensitivity option for game controller in cannons.
* Added cannon shells.
* Fixed bug in utils.is_creative.
* Increased cannon pitch to -20 to 70.

View File

@@ -396,7 +396,7 @@ local function after_place_node_locked (pos, placer, itemstack, pointed_thing)
local meta = minetest.get_meta (pos) local meta = minetest.get_meta (pos)
meta:set_string ("owner", placer:get_player_name ()) meta:set_string ("owner", placer:get_player_name ())
meta:set_string ("infotext", "Dropper (owned by "..placer:get_player_name ()..")") meta:set_string ("infotext", "Conduit (owned by "..placer:get_player_name ()..")")
end end
-- If return true no item is taken from itemstack -- If return true no item is taken from itemstack

View File

@@ -3,6 +3,56 @@ local S = utils.S
minetest.register_craft( {
output = "lwcomponents:cannon",
recipe = {
{ "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" },
{ "default:chest", "default:wood", "" },
{ "default:copper_ingot", "default:stone", "" },
},
})
minetest.register_craft( {
output = "lwcomponents:cannon_locked",
recipe = {
{ "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" },
{ "default:chest_locked", "default:wood", "" },
{ "default:copper_ingot", "default:stone", "" },
},
})
minetest.register_craft( {
output = "lwcomponents:cannon_shell 10",
recipe = {
{ "default:steel_ingot", "default:steel_ingot" },
{ "", "default:coalblock" },
},
})
minetest.register_craft( {
output = "lwcomponents:cannon_soft_shell 10",
recipe = {
{ "default:steel_ingot", "default:steel_ingot" },
{ "default:copper_lump", "default:coalblock" },
},
})
if minetest.global_exists ("fire") then
minetest.register_craft( {
output = "lwcomponents:cannon_fire_shell 10",
recipe = {
{ "default:steel_ingot", "default:steel_ingot" },
{ "default:iron_lump", "default:coalblock" },
},
})
end
if utils.digilines_supported or utils.mesecon_supported then if utils.digilines_supported or utils.mesecon_supported then
minetest.register_craft( { minetest.register_craft( {

View File

@@ -158,11 +158,12 @@ local function dispense_item (pos, node, slot)
if not obj then if not obj then
obj = minetest.add_item (spawn_pos, item) obj = minetest.add_item (spawn_pos, item)
obj:set_velocity (dispense_velocity (node)) if obj then
obj:set_velocity (dispense_velocity (node))
end
end end
if obj then if obj then
stack:set_count (stack:get_count () - 1) stack:set_count (stack:get_count () - 1)
inv:set_stack ("main", slot, stack) inv:set_stack ("main", slot, stack)

103
docs/cannon.txt Normal file
View File

@@ -0,0 +1,103 @@
Cannon
------
This item is available without digilines or mesecons as it can be used
manually.
Contains a single inventory slot and shoots an item on command.
If the hopper mod is loaded, will take items from the top and sides, and
release them from the bottom.
Cannon rotation range:
side to side - +/-60 degrees (- = left, + = right)
down to up: -20 to 70 degrees (- = down, + = up)
To spawn entities from cannons include the lwcomponents_spawners mod.
Only the owner can dig or access the form of the locked version.
UI
Channel - digilines channel of cannon.
Hide - hides the form so the cannon can be used manually, double right click
any other face besides the rear to bring up the form.
Controller - digistuff game controller digilines channel.
Sensitive - if checked game controller movements have a x3 sensitivity.
Top 1 slot inventory - storage of items to shoot.
Bottom 32 slot inventory - player's inventory.
Manual control
Place some items in the single slot, and click the Hide button. On the
rear panel their are 4 gray buttons. Right clicking them turns the barrel
in that direction 10 degrees. aux + right click turns 1 degree. Clicking
the red button fires an item. To bring up the form again double right click
any other face besides the rear.
Digistuff game controller
Connect a game controller to the cannon with digilines cable. Enter the
game controller's channel in the Controller field of the cannon's form
(click Set). Your turning movements turn the cannon's barrel in the
direction the cannon is facing. If Sensitive is checked the movements
have an increased sensitivity (x3) to try and keep the target in your view,
otherwise x1. Punching shoots an item. The game controller updates every
0.2 seconds, so a quick punch may not register. A locked cannon can only
be controlled by it's owner with a game controller.
Mesecons
Shoots an item when power is turned on.
Digilines messages
"pitch <n>"
Sets the pitch of the barrel. n should be between -20 to 70, and will
be clipped to this range.
eg. "pitch 22"
"rotation <n>"
Sets the rotation of the barrel. n should be between -60 to 60, and will
be clipped to this range.
eg. "rotation 45"
table - aim position
{
action = "aim",
aim = { x, y, z }
}
x is the horizontal left (negative) to right. 0 is straight ahead.
y is the vertical down (negative) to up. 0 is straight ahead.
z is the depth. Must be > 0 or ignored. 1 is the position directly in
front of the cannon.
* The cannon barrel's height is 0.65 above the cannon's placed position.
When aiming for height, if the cannon's base height is taken as -0.5,
and consider height from there. This allows for the barrel height
and a little drop in the projectile at close range.
"fire"
Shoots an item.
* Note: turning the barrel is animated and takes 0.1 seconds per 10
degrees of movement. A fire command while moving is ignored.
Three shells are provided for cannons.
Shell
This shell has a 70% chance of destroying a node within a radius of 2 from
the impact, a 5% chance a flammable node will be set on fire within a
radius of 2 (if fire is installed), and damages players and entities within
a radius of 4 with a maximum of 20 damage points.
Soft Shell
This shell has a 50% chance of destroying only soft (buildable_to) nodes,
such as grass, within a radius of 2 from the impact, a 5% chance a flammable
node will be set on fire within a radius of 2 (if fire is installed), and
damages players and entities within a radius of 4 with a maximum of 20
damage points.
Fire Shell
* This item is only available if fire is installed.
This shell does not destroying nodes, has a 70% chance of setting a node
on fire, whether its flammable or not within a radius of 2, and damages
players and entities within a radius of 4 with a maximum of 20 damage
points.

512
explode.lua Normal file
View File

@@ -0,0 +1,512 @@
local utils = ...
local S = utils.S
local explode = { }
if minetest.global_exists ("fire") then
explode.fire_supported = true
function explode.set_fire (pos, burn_all)
local node = utils.get_far_node (pos)
if not node then
return
end
if node.name ~= "air" then
local def = minetest.registered_nodes[node.name]
if not def or not def.buildable_to then
return
end
end
local dirs =
{
{ x = 0, y = -1, z = 0 },
{ x = -1, y = 0, z = 0 },
{ x = 0, y = 0, z = -1 },
{ x = 1, y = 0, z = 0 },
{ x = 0, y = 0, z = 1 }
}
for i = 1, #dirs do
node = utils.get_far_node (vector.add (pos, dirs[i]))
if node and node.name ~= "air" and node.name ~= "fire:basic_flame" then
local def = minetest.registered_nodes[node.name]
if def and def.liquidtype == "none" then
if (def.groups and def.groups.flammable) or burn_all then
minetest.set_node (pos, { name = "fire:basic_flame" })
return
end
end
end
end
end
else
explode.fire_supported = false
function explode.set_fire (pos, burn_all)
end
end
local function is_same_item (stack1, stack2)
local copy1 = ItemStack (stack1)
local copy2 = ItemStack (stack2)
if copy1 and copy2 then
copy1:set_count (1)
copy2:set_count (1)
if copy1:to_string () == copy2:to_string () then
return true
end
end
return false
end
local function dig_node (pos, toolname)
local node = utils.get_far_node (pos)
local dig = false
local drops = nil
if toolname == true then
dig = true
toolname = nil
end
if node and node.name ~= "air" then
local def = utils.find_item_def (node.name)
if not dig then
if def and def.can_dig then
local result, can_dig = pcall (def.can_dig, pos)
dig = ((not result) or (result and (can_dig == nil or can_dig == true)))
else
dig = true
end
end
if dig then
local items = minetest.get_node_drops (node, toolname)
if items then
drops = { }
for i = 1, #items do
drops[i] = ItemStack (items[i])
end
if def and def.preserve_metadata then
def.preserve_metadata (pos, node, minetest.get_meta (pos), drops)
end
end
minetest.remove_node (pos)
end
end
return drops
end
local function add_drops (drops, drop)
if drops and drop then
for i = 1, #drop do
local item = ItemStack (drop[i])
if item and not item:is_empty () then
local existing = drops[item:get_name ()]
if existing and is_same_item (item, existing) then
existing:set_count (existing:get_count () + item:get_count ())
else
drops[item:get_name ()] = item
end
end
end
end
end
local function explode_node (pos, dig_chance, intensity, drops, filter)
if not utils.is_protected (pos, nil) then
dig_chance = math.min (math.max (dig_chance, 0), 100)
if math.random (100) <= dig_chance then
local node = utils.get_far_node (pos)
local blasted = false
if node and node.name ~= "air" then
local def = minetest.registered_nodes[node.name]
if def then
if def.diggable == false then
return false
end
for k, v in pairs (filter) do
if def[k] == nil then
if filter[k.."_undefined"] == false then
return false
end
elseif def[k] ~= v then
return false
end
end
if def.on_blast then
def.on_blast (pos, intensity)
blasted = true
end
end
if not blasted then
local drop = dig_node (pos, true)
add_drops (drops, drop)
end
minetest.check_for_falling ({ x = pos.x, y = pos.y + 1, z = pos.z })
return true
end
end
end
return false
end
local function burn_node (pos, fire_chance, burn_all)
if not utils.is_protected (pos, nil) then
fire_chance = math.min (math.max (fire_chance, 0), 100)
if math.random (100) <= fire_chance then
explode.set_fire (pos, burn_all)
end
end
end
local function entity_is_drop (obj)
return obj.get_luaentity and obj:get_luaentity () and
obj:get_luaentity ().name and
obj:get_luaentity ().name == "__builtin:item"
end
local function explode_entities (pos, radius, damage, drops)
local objs = minetest.get_objects_inside_radius (pos, radius)
for _, obj in pairs (objs) do
local obj_pos = obj:get_pos ()
local dir = vector.direction (pos, obj_pos)
local dist = vector.length (vector.subtract (obj_pos, pos))
local vel = vector.multiply (dir, ((radius + 1) - dist) / (radius + 1) * damage * 5)
if entity_is_drop (obj) then
obj:add_velocity (vel)
elseif not obj:get_armor_groups ().immortal then
local ent_damage = ((radius - dist) / radius * damage / 2) + (damage / 2)
local reason = { type = "set_hp", from = "lwcomponents" }
if obj:is_player() then
obj:add_velocity (vel)
obj:set_hp (obj:get_hp() - ent_damage, reason)
else
local luaobj = obj:get_luaentity()
-- object might have disappeared somehow
if luaobj then
local do_damage = true
local do_knockback = true
local entity_drops = {}
local objdef = minetest.registered_entities[luaobj.name]
if objdef and objdef.on_blast then
do_damage, do_knockback, entity_drops = objdef.on_blast (luaobj, ent_damage)
end
if do_knockback then
obj:add_velocity (vel)
end
if do_damage then
obj:set_hp (obj:get_hp() - ent_damage, reason)
end
add_drops (drops, entity_drops)
end
end
end
end
end
local function spray_drops (pos, drops, damage)
local max_vel = damage * 2.5
for k, stack in pairs (drops) do
local vel =
{
x = math.random (max_vel) - (max_vel / 2),
y = math.random (max_vel) - (max_vel / 2),
z = math.random (max_vel) - (max_vel / 2)
}
local drop = minetest.add_item (pos, stack)
if drop then
drop:set_velocity (vel)
end
end
end
local function add_effects (pos, radius, drops)
minetest.add_particle ({
pos = pos,
velocity = vector.new (),
acceleration = vector.new (),
expirationtime = 0.4,
size = 30, -- radius * 10,
collisiondetection = false,
vertical = false,
texture = "lwcomponents_boom.png",
glow = 15,
})
minetest.add_particlespawner ({
amount = 64,
time = 0.5,
minpos = vector.subtract (pos, radius / 2),
maxpos = vector.add (pos, radius / 2),
minvel = {x = -10, y = -10, z = -10},
maxvel = {x = 10, y = 10, z = 10},
minacc = vector.new (),
maxacc = vector.new (),
minexptime = 1,
maxexptime = 2.5,
minsize = 9, -- radius * 3,
maxsize = 15, -- radius * 5,
texture = "lwcomponents_smoke.png",
})
-- we just dropped some items. Look at the items entities and pick
-- one of them to use as texture
local texture = "lwcomponents_blast.png" --fallback texture
local node
local most = 0
if drops then
for name, stack in pairs (drops) do
local count = stack:get_count()
if count > most then
most = count
local def = minetest.registered_nodes[name]
if def then
node = { name = name }
end
if def and def.tiles and def.tiles[1] then
if type (def.tiles[1]) == "table" then
texture = def.tiles[1].name or "lwcomponents_blast.png"
elseif type (def.tiles[1]) == "string" then
texture = def.tiles[1]
end
end
end
end
end
minetest.add_particlespawner ({
amount = 64,
time = 0.1,
minpos = vector.subtract (pos, radius / 2),
maxpos = vector.add (pos, radius / 2),
minvel = {x = -3, y = 0, z = -3},
maxvel = {x = 3, y = 5, z = 3},
minacc = {x = 0, y = -10, z = 0},
maxacc = {x = 0, y = -10, z = 0},
minexptime = 0.8,
maxexptime = 2.0,
minsize = 1, -- radius * 0.33,
maxsize = 3, -- radius,
texture = texture,
-- ^ only as fallback for clients without support for `node` parameter
node = node,
collisiondetection = true,
})
end
function utils.boom (pos, -- center of explosion
node_radius, node_chance, -- radius and chance in 100
fire_radius, fire_chance, -- radius and chance in 100
entity_radius, entity_damage, -- radius and max damage applied
disable_drops, -- true to disable drops
node_filter, -- node filter table as { buildable_to = true, buildable_to_undefined = false, ... }
burn_all, -- true to set fire to anything, otherwise only flammable
sound) -- sound on blast, if nil plays default
pos = vector.round (pos)
node_radius = math.floor (node_radius or 1)
fire_radius = math.floor (fire_radius or node_radius)
entity_radius = math.floor (entity_radius or node_radius * 2)
node_chance = node_chance or 80
fire_chance = fire_chance or 30
entity_damage = math.floor (entity_damage or entity_radius)
disable_drops = disable_drops == true
node_filter = node_filter or { }
burn_all = burn_all == true
sound = sound or "lwcannon"
local drops = { }
local effects_radius = (node_radius > 0 and node_radius) or entity_radius
local center_free = false
if not utils.is_protected (pos, nil) then
local center_node = utils.get_far_node (pos)
if not node or node.name == "air" then
center_free = true
end
end
if node_radius > 0 and node_chance > 0 then
local extents = node_radius * 2
for y = -extents, extents, 1 do
for z = -extents, extents, 1 do
for x = -extents, extents, 1 do
local node_pos = { x = x + pos.x, y = y + pos.y, z = z + pos.z }
local length = vector.length ({ x = x, y = y, z = z })
if node_chance > 0 and length <= node_radius then
if explode_node (node_pos, node_chance, 1.0, drops, node_filter) then
if vector.equals (pos, node_pos) then
center_free = true
end
end
end
end
end
end
end
if fire_radius > 0 and fire_chance > 0 then
local extents = fire_radius * 2
for y = -extents, extents, 1 do
for z = -extents, extents, 1 do
for x = -extents, extents, 1 do
local node_pos = { x = x + pos.x, y = y + pos.y, z = z + pos.z }
local length = vector.length ({ x = x, y = y, z = z })
if fire_chance > 0 and length <= fire_radius then
burn_node (node_pos, fire_chance, burn_all)
end
end
end
end
end
minetest.sound_play (sound,
{
pos = pos,
gain = 2.5,
max_hear_distance = math.min (effects_radius * 20, 128)
},
true)
if center_free then
minetest.set_node (pos, { name = "lwcomponents:boom" })
end
explode_entities (pos, entity_radius, entity_damage, drops)
if not disable_drops then
spray_drops (pos, drops, entity_damage)
end
add_effects (pos, effects_radius, drops)
minetest.log ("action", "A Shell explosion occurred at " .. minetest.pos_to_string (pos) ..
" with radius " .. entity_radius)
end
minetest.register_node ("lwcomponents:boom", {
description = S("Boom"),
drawtype = "airlike",
tiles = { "lwcomponents_boom.png" },
inventory_image = "lwcomponents_boom.png",
wield_image = "lwcomponents_boom.png",
light_source = default.LIGHT_MAX,
use_texture_alpha = "blend",
sunlight_propagates = true,
walkable = false,
pointable = false,
diggable = false,
climbable = false,
buildable_to = true,
floodable = true,
is_ground_content = false,
drop = "",
paramtype = "light",
param1 = 255,
post_effect_color = { a = 128, r = 255, g = 0, b = 0 },
groups = { dig_immediate = 3, not_in_creative_inventory = 1 },
on_construct = function (pos)
minetest.get_node_timer (pos):start (0.5)
end,
on_timer = function (pos, elapsed)
minetest.remove_node (pos)
return false
end,
-- unaffected by explosions
on_blast = function() end,
})
--

View File

@@ -170,7 +170,7 @@ local function after_place_node_locked (pos, placer, itemstack, pointed_thing)
local meta = minetest.get_meta (pos) local meta = minetest.get_meta (pos)
meta:set_string ("owner", placer:get_player_name ()) meta:set_string ("owner", placer:get_player_name ())
meta:set_string ("infotext", "Hologram (owned by "..placer:get_player_name ()..")") meta:set_string ("infotext", "Fan (owned by "..placer:get_player_name ()..")")
end end
-- If return true no item is taken from itemstack -- If return true no item is taken from itemstack

View File

@@ -1,4 +1,4 @@
local version = "0.1.8" local version = "0.1.12"
local mod_storage = minetest.get_mod_storage () local mod_storage = minetest.get_mod_storage ()
@@ -15,8 +15,9 @@ end
local utils = { } local utils = { }
local modpath = minetest.get_modpath ("lwcomponents") local modpath = minetest.get_modpath ("lwcomponents")
loadfile (modpath.."/utils.lua") (utils, mod_storage)
loadfile (modpath.."/settings.lua") (utils) loadfile (modpath.."/settings.lua") (utils)
loadfile (modpath.."/utils.lua") (utils, mod_storage)
loadfile (modpath.."/explode.lua") (utils)
loadfile (modpath.."/api.lua") (utils) loadfile (modpath.."/api.lua") (utils)
utils.connections = loadfile (modpath.."/connections.lua") () utils.connections = loadfile (modpath.."/connections.lua") ()
loadfile (modpath.."/dropper.lua") (utils) loadfile (modpath.."/dropper.lua") (utils)
@@ -31,6 +32,8 @@ loadfile (modpath.."/breaker.lua") (utils)
loadfile (modpath.."/deployer.lua") (utils) loadfile (modpath.."/deployer.lua") (utils)
loadfile (modpath.."/fan.lua") (utils) loadfile (modpath.."/fan.lua") (utils)
loadfile (modpath.."/conduit.lua") (utils, mod_storage) loadfile (modpath.."/conduit.lua") (utils, mod_storage)
loadfile (modpath.."/cannon.lua") (utils)
loadfile (modpath.."/cannon_shell.lua") (utils)
loadfile (modpath.."/extras.lua") (utils) loadfile (modpath.."/extras.lua") (utils)
loadfile (modpath.."/digiswitch.lua") (utils) loadfile (modpath.."/digiswitch.lua") (utils)
loadfile (modpath.."/movefloor.lua") (utils) loadfile (modpath.."/movefloor.lua") (utils)

View File

@@ -69,6 +69,11 @@ public domain.
player button images derived from mesecons button image. player button images derived from mesecons button image.
cannon firing and explosion sound from tnt (TumeniNodes/steveygos93),
released under CC0 1.0 (originally from https://freesound.org/s/80401/)
boom image from tnt, released under CC BY-SA 3.0.
All other media, or media not covered by a licence, is licensed All other media, or media not covered by a licence, is licensed
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)

View File

@@ -0,0 +1,625 @@
# Blender v2.82 (sub 7) OBJ File: 'canon.blend'
# www.blender.org
mtllib lwcomponents_cannon_barrel.mtl
o Canon
v 0.999994 -2.037148 -0.790288
v 0.999994 -0.938179 -2.111386
v 0.999994 -1.251549 1.868645
v 0.999994 -2.145818 0.243561
v 0.999994 -1.824579 1.232245
v 0.999994 -1.517369 -1.690576
v -0.837650 -1.110379 -1.986275
v -0.999994 -1.517369 -1.690576
v -0.999994 -0.938179 -2.111386
v -0.437400 -1.222309 -1.904956
v 0.000000 -1.344629 -1.816076
v 0.437400 -1.222309 -1.904956
v 0.837650 -1.110379 -1.986275
v -0.999994 -2.037148 -0.790289
v -0.999994 -2.145818 0.243560
v -0.999994 -1.824579 1.232244
v -0.000000 -1.538639 1.549804
v 0.089079 -1.516209 1.574724
v 0.947191 -1.300109 1.814725
v -0.089079 -1.516209 1.574724
v -0.947191 -1.300109 1.814724
v -0.999994 -1.251549 1.868644
v 1.673030 -0.625437 3.499885
v 1.414210 0.340481 4.396455
v 1.224740 -0.366620 4.396455
v 1.673030 1.306400 3.499885
v 1.931850 0.340481 3.499885
v -0.517635 0.340481 4.914094
v -0.448284 0.599299 4.914094
v -1.414210 0.340481 4.396455
v 1.673030 1.306400 2.464605
v 0.749998 1.639521 -5.027746
v 0.965919 2.013511 2.464605
v 1.299040 1.090479 -5.027746
v -0.000000 2.272331 2.464605
v 0.965919 -1.332548 3.499884
v -0.000000 -1.591369 2.464605
v 0.965919 -1.332548 2.464605
v -0.000000 -1.591369 3.499884
v -1.673030 -0.625437 3.499884
v -1.224740 -0.366620 4.396455
v -0.000000 -1.073729 4.396455
v 0.258818 -0.107803 4.914094
v -0.000000 -0.177154 4.914094
v -0.965919 2.013511 3.499884
v -0.000000 1.754691 4.396455
v -0.000000 2.272331 3.499884
v -1.299040 -0.409517 -5.027746
v -1.673030 -0.625437 2.464605
v -0.749998 -0.958559 -5.027746
v -0.965919 -1.332548 2.464605
v 1.500000 0.340481 -5.027746
v 1.931850 0.340481 2.464605
v 1.299040 -0.409517 -5.027746
v 1.224740 1.047583 4.396455
v -1.500000 0.340481 -5.027746
v -1.931850 0.340481 2.464605
v -1.299040 1.090479 -5.027746
v 0.965919 2.013511 3.499884
v -0.965919 2.013511 2.464605
v -0.749998 1.639521 -5.027746
v -0.258818 -0.107803 4.914094
v 0.448284 0.081663 4.914094
v -0.965919 -1.332548 3.499884
v -0.707102 -0.884259 4.396455
v 0.000000 1.840482 -5.027746
v -1.673030 1.306400 2.464605
v 0.448284 0.599299 4.914094
v 0.707102 1.565221 4.396455
v -1.673030 1.306400 3.499884
v -0.999994 0.340481 -5.027746
v -0.866022 0.840474 -5.027746
v -0.499992 1.206504 -5.027746
v 0.000000 1.340475 -5.027746
v 0.499992 1.206504 -5.027746
v 0.866022 0.840474 -5.027746
v 0.999994 0.340481 -5.027746
v -0.866022 -0.159511 -5.027746
v -0.499992 -0.525541 -5.027746
v 0.000000 -0.659513 -5.027746
v 0.000000 -1.159519 -5.027746
v 0.499992 -0.525541 -5.027746
v 0.749998 -0.958559 -5.027746
v 0.866022 -0.159511 -5.027746
v 0.258818 0.788765 4.914094
v -0.707102 1.565221 4.396455
v -1.224740 1.047583 4.396455
v -0.258818 0.788765 4.914094
v 0.707102 -0.884259 4.396455
v 1.673030 -0.625437 2.464605
v -0.448284 0.081663 4.914094
v -1.931850 0.340481 3.499884
v -0.000000 0.858117 4.914094
v 0.517635 0.340481 4.914094
v 0.499992 1.206504 -0.017755
v 0.000000 1.340475 -0.017755
v -0.866022 -0.159511 -0.017756
v -0.999994 0.340481 -0.017756
v 0.999994 0.340481 -0.017755
v 0.866022 -0.159511 -0.017755
v 0.000000 -0.659513 -0.017755
v 0.499992 -0.525541 -0.017755
v -0.866022 0.840474 -0.017756
v -0.499992 1.206504 -0.017756
v -0.499992 -0.525541 -0.017756
v 0.866022 0.840474 -0.017755
vt 0.898722 0.101473
vt 0.949058 0.000000
vt 0.949058 0.291647
vt 0.897343 0.177359
vt 0.917533 0.247935
vt 0.921432 0.033397
vt 0.644810 0.718620
vt 0.656466 0.688883
vt 0.656466 0.731202
vt 0.938458 0.774110
vt 0.917273 0.733004
vt 0.946494 0.744866
vt 0.929676 0.806070
vt 0.917273 0.879136
vt 0.938458 0.838029
vt 0.946494 0.867274
vt 0.958858 0.879136
vt 0.720513 0.816705
vt 0.809535 0.875496
vt 0.700708 0.883794
vt 0.829340 0.808407
vt 0.720513 0.741037
vt 0.829340 0.732739
vt 0.829340 0.985218
vt 0.900553 0.888939
vt 0.900554 1.000000
vt 0.829340 0.874157
vt 1.000000 0.879136
vt 0.979470 0.806070
vt 1.000000 0.733004
vt 0.977860 0.812578
vt 0.962344 0.875278
vt 0.958858 0.879136
vt 0.977860 0.799561
vt 0.962344 0.736862
vt 0.333921 0.730752
vt 0.330130 0.692431
vt 0.333921 0.688883
vt 0.900071 0.556676
vt 0.950406 0.658149
vt 0.922781 0.624752
vt 0.950406 0.366502
vt 0.898691 0.480790
vt 0.918881 0.410213
vt 0.255350 0.066011
vt 0.224399 0.000000
vt 0.267734 0.000231
vt 0.463512 0.067703
vt 0.499410 0.000000
vt 0.525690 0.066413
vt 0.258332 0.815437
vt 0.267951 0.798482
vt 0.303850 0.861759
vt 0.463512 0.143300
vt 0.399738 0.689322
vt 0.391714 0.143300
vt 0.455487 0.689322
vt 0.656641 0.142072
vt 0.718822 0.143213
vt 0.728112 0.689215
vt 0.196154 0.065695
vt 0.326930 0.066054
vt 0.391714 0.141456
vt 0.326930 0.141696
vt 0.391714 0.065814
vt 0.584886 0.622872
vt 0.597270 0.688652
vt 0.553935 0.688883
vt 0.442482 0.882141
vt 0.461064 0.811564
vt 0.474668 0.825408
vt 0.062178 0.621619
vt 0.026280 0.689322
vt 0.000000 0.622909
vt 0.595217 0.000034
vt 0.636204 0.213000
vt 0.584886 0.547230
vt 0.650796 0.000000
vt 0.653098 0.222127
vt 0.650827 0.503665
vt 0.656466 0.547187
vt 0.655974 0.499724
vt 0.219718 0.688604
vt 0.196154 0.141337
vt 0.265682 0.688849
vt 0.453892 0.000944
vt 0.174230 0.001002
vt 0.196154 0.547312
vt 0.125951 0.000000
vt 0.656466 0.066476
vt 0.682592 0.000000
vt 0.718647 0.067616
vt 0.062178 0.546022
vt 0.000000 0.547312
vt 0.070203 0.000000
vt 0.493250 0.830475
vt 0.405317 0.740987
vt 0.456085 0.792653
vt 0.391714 0.792653
vt 0.172450 0.755310
vt 0.129645 0.690784
vt 0.177048 0.689322
vt 0.525690 0.547546
vt 0.549254 0.000279
vt 0.679831 0.688329
vt 0.525690 0.142010
vt 0.503765 0.688320
vt 0.133976 0.546022
vt 0.493250 0.895984
vt 0.442482 0.703166
vt 0.474668 0.759899
vt 0.728112 0.000835
vt 0.021924 0.001002
vt 0.133976 0.621619
vt 0.571208 0.835015
vt 0.540118 0.853282
vt 0.525690 0.798482
vt 0.579538 0.893399
vt 0.561589 0.798483
vt 0.540119 0.743682
vt 0.571208 0.761949
vt 0.579538 0.703566
vt 0.597488 0.735205
vt 0.633386 0.725417
vt 0.633386 0.688883
vt 0.107696 0.908522
vt 0.071797 0.862198
vt 0.107697 0.871988
vt 0.053848 0.893838
vt 0.045518 0.835455
vt 0.597487 0.861759
vt 0.633386 0.908082
vt 0.633386 0.871549
vt 0.071798 0.735645
vt 0.107696 0.689322
vt 0.107696 0.725856
vt 0.053848 0.704005
vt 0.045519 0.762388
vt 0.014429 0.744121
vt 0.035899 0.798922
vt 0.000000 0.798922
vt 0.014428 0.853721
vt 0.303850 0.715627
vt 0.241672 0.752160
vt 0.258332 0.688883
vt 0.401333 0.000944
vt 0.391714 0.067703
vt 0.330130 0.761949
vt 0.330130 0.815437
vt 0.267951 0.778904
vt 0.071797 0.688378
vt 0.124357 0.688378
vt 0.649670 0.688620
vt 0.656466 0.622829
vt 0.405317 0.844319
vt 0.169874 0.689322
vt 0.306668 0.475883
vt 0.321261 0.688883
vt 0.255350 0.141653
vt 0.321291 0.185217
vt 0.323562 0.466756
vt 0.326439 0.189159
vt 0.320134 0.000263
vt 0.367559 0.000087
vt 0.493250 0.689322
vt 0.493250 0.754831
vt 0.383346 0.206474
vt 0.389253 0.208272
vt 0.350625 0.460717
vt 0.371562 0.688696
vt 0.380200 0.454116
vt 0.114908 0.899599
vt 0.110220 0.832906
vt 0.120752 0.897599
vt 0.391714 0.690986
vt 0.362403 0.918008
vt 0.341454 0.688883
vt 0.391714 0.925731
vt 0.205773 0.888503
vt 0.241672 0.825226
vt 0.258333 0.888503
vt 0.222434 0.825226
vt 0.196154 0.622909
vt 0.525690 0.623188
vt 0.107697 0.757308
vt 0.174974 0.830908
vt 0.258332 0.761949
vt 0.461064 0.773742
vt 0.205773 0.815437
vt 0.196154 0.798482
vt 0.196154 0.778904
vt 0.222434 0.752160
vt 0.205773 0.761949
vt 0.177048 0.878327
vt 0.335581 0.910942
vt 0.982592 0.366176
vt 0.949058 0.000000
vt 0.982592 0.000124
vt 0.949058 0.366052
vt 0.861526 0.366502
vt 0.829340 0.733004
vt 0.829340 0.367170
vt 0.861526 0.732336
vt 0.760297 0.000668
vt 0.728112 0.365834
vt 0.728112 0.000000
vt 0.760297 0.366502
vt 0.829648 0.365834
vt 0.797463 0.000668
vt 0.829648 0.000000
vt 0.797463 0.366502
vt 0.798698 0.366524
vt 0.761646 0.732553
vt 0.761646 0.366502
vt 0.798699 0.732576
vt 0.829340 0.366688
vt 0.829340 0.732739
vt 0.982592 0.733004
vt 0.950406 0.366502
vt 0.982592 0.367170
vt 0.950406 0.732336
vt 0.898691 0.366502
vt 0.898691 0.732336
vt 0.728112 0.366626
vt 0.728112 0.732678
vt 0.649940 0.784405
vt 0.668522 0.854981
vt 0.649940 0.822226
vt 0.668523 0.751650
vt 0.700708 0.873892
vt 0.700708 0.732739
vt 0.917273 0.874157
vt 0.880109 0.733004
vt 0.917273 0.733004
vt 0.880109 0.874156
vt 0.847923 0.751914
vt 0.847923 0.855245
vt 0.829340 0.784669
vt 0.829340 0.822491
vt 0.866701 0.000163
vt 0.829648 0.366237
vt 0.829648 0.000186
vt 0.866701 0.366215
vt 0.897343 0.000000
vt 0.897343 0.366052
vn 1.0000 0.0000 0.0000
vn -0.0000 -0.5878 -0.8090
vn 0.0000 -0.8660 -0.5000
vn 0.0000 -0.9945 -0.1045
vn -0.0000 -0.9511 0.3090
vn -0.0000 -0.7431 0.6691
vn -0.0000 -0.7432 0.6691
vn 0.0001 -0.7431 0.6691
vn -0.0001 -0.7431 0.6691
vn -1.0000 -0.0000 -0.0000
vn 0.8436 -0.2260 0.4871
vn 0.8436 0.2260 0.4871
vn -0.4956 0.1328 0.8584
vn 0.7060 0.7060 -0.0556
vn 0.2584 0.9644 -0.0556
vn 0.2588 -0.9659 0.0000
vn -0.8436 -0.2260 0.4871
vn 0.1328 -0.4956 0.8584
vn -0.2260 0.8436 0.4871
vn -0.7060 -0.7060 -0.0556
vn 0.9644 -0.2584 -0.0556
vn -0.9644 0.2584 -0.0556
vn 0.2260 0.8436 0.4871
vn -0.2584 0.9644 -0.0556
vn -0.1328 -0.4956 0.8584
vn 0.4956 -0.1328 0.8584
vn -0.2260 -0.8436 0.4871
vn -0.9644 -0.2584 -0.0556
vn 0.9644 0.2584 -0.0556
vn -0.7060 0.7060 -0.0556
vn 0.2588 0.9659 0.0000
vn 0.4956 0.1328 0.8584
vn -0.7071 0.7071 -0.0000
vn 0.9659 0.2588 0.0000
vn 0.0000 0.0000 -1.0000
vn -0.2588 0.9659 0.0000
vn 0.1328 0.4956 0.8584
vn 0.6176 0.6176 0.4871
vn -0.3628 0.3628 0.8584
vn -0.1328 0.4956 0.8584
vn -0.6176 0.6176 0.4871
vn -0.6176 -0.6176 0.4871
vn 0.3628 -0.3628 0.8584
vn -0.8436 0.2260 0.4871
vn 0.7060 -0.7060 -0.0556
vn 0.2260 -0.8436 0.4871
vn 0.9659 -0.2588 0.0000
vn 0.7071 0.7071 0.0000
vn 0.3628 0.3628 0.8584
vn 0.2584 -0.9644 -0.0556
vn -0.2584 -0.9644 -0.0556
vn -0.3628 -0.3628 0.8584
vn -0.4956 -0.1328 0.8584
vn -0.9659 0.2588 -0.0000
vn -0.9659 -0.2588 -0.0000
vn 0.7071 -0.7071 -0.0000
vn 0.6176 -0.6176 0.4871
vn -0.2588 -0.9659 -0.0000
vn 0.0000 0.0000 1.0000
vn -0.7071 -0.7071 0.0000
usemtl None
s off
f 1/1/1 2/2/1 3/3/1
f 4/4/1 3/3/1 5/5/1
f 2/2/1 1/1/1 6/6/1
f 3/3/1 4/4/1 1/1/1
f 7/7/2 8/8/2 9/9/2
f 10/10/2 8/11/2 7/12/2
f 11/13/2 8/11/2 10/10/2
f 11/13/2 6/14/2 8/11/2
f 12/15/2 6/14/2 11/13/2
f 13/16/2 6/14/2 12/15/2
f 6/14/2 13/16/2 2/17/2
f 1/18/3 8/19/3 6/20/3
f 8/19/3 1/18/3 14/21/3
f 4/22/4 14/21/4 1/18/4
f 14/21/4 4/22/4 15/23/4
f 5/24/5 15/25/5 4/26/5
f 15/25/5 5/24/5 16/27/5
f 5/28/6 17/29/6 16/30/6
f 5/28/7 18/31/7 17/29/7
f 5/28/6 19/32/6 18/31/6
f 19/32/8 5/28/8 3/33/8
f 20/34/7 16/30/7 17/29/7
f 21/35/6 16/30/6 20/34/6
f 16/36/9 21/37/9 22/38/9
f 14/39/10 9/40/10 8/41/10
f 9/40/10 14/39/10 22/42/10
f 15/43/10 22/42/10 14/39/10
f 22/42/10 15/43/10 16/44/10
f 23/45/11 24/46/11 25/47/11
f 26/48/12 24/49/12 27/50/12
f 28/51/13 29/52/13 30/53/13
f 31/54/14 32/55/14 33/56/14
f 32/55/14 31/54/14 34/57/14
f 35/58/15 33/59/15 32/60/15
f 27/61/11 24/46/11 23/45/11
f 36/62/16 37/63/16 38/64/16
f 37/63/16 36/62/16 39/65/16
f 40/66/17 41/67/17 30/68/17
f 42/69/18 43/70/18 44/71/18
f 45/72/19 46/73/19 47/74/19
f 48/75/20 9/76/20 49/77/20
f 50/78/20 9/76/20 48/75/20
f 9/76/20 50/78/20 7/79/20
f 22/80/20 49/77/20 9/76/20
f 22/80/20 51/81/20 49/77/20
f 51/81/20 22/80/20 21/82/20
f 52/83/21 53/84/21 54/85/21
f 55/86/12 24/49/12 26/48/12
f 56/87/22 57/88/22 58/89/22
f 47/90/23 46/91/23 59/92/23
f 60/93/24 35/94/24 61/95/24
f 42/69/25 44/71/25 62/96/25
f 24/97/26 63/98/26 25/99/26
f 64/100/27 42/101/27 65/102/27
f 48/75/28 57/103/28 56/104/28
f 66/105/15 35/58/15 32/60/15
f 34/57/29 53/106/29 52/107/29
f 60/93/30 58/89/30 67/108/30
f 58/89/30 60/93/30 61/95/30
f 47/90/31 33/59/31 35/58/31
f 33/59/31 47/90/31 59/92/31
f 42/69/25 62/96/25 65/109/25
f 55/110/32 68/111/32 24/97/32
f 46/91/23 69/112/23 59/92/23
f 61/95/24 35/94/24 66/113/24
f 67/108/33 45/72/33 60/93/33
f 45/72/33 67/108/33 70/114/33
f 27/50/34 31/54/34 26/48/34
f 31/54/34 27/50/34 53/106/34
f 31/54/29 53/106/29 34/57/29
f 71/115/35 56/116/35 58/117/35
f 56/116/35 71/115/35 48/118/35
f 58/117/35 72/119/35 71/115/35
f 61/120/35 72/119/35 58/117/35
f 61/120/35 73/121/35 72/119/35
f 66/122/35 73/121/35 61/120/35
f 66/122/35 74/123/35 73/121/35
f 66/122/35 75/124/35 74/123/35
f 32/125/35 75/124/35 66/122/35
f 32/126/35 76/127/35 75/128/35
f 34/129/35 76/127/35 32/126/35
f 76/127/35 34/129/35 77/130/35
f 78/131/35 48/118/35 71/115/35
f 78/131/35 50/132/35 48/118/35
f 79/133/35 50/132/35 78/131/35
f 80/134/35 50/135/35 79/136/35
f 80/134/35 81/137/35 50/135/35
f 82/138/35 81/137/35 80/134/35
f 82/138/35 83/139/35 81/137/35
f 84/140/35 83/139/35 82/138/35
f 54/141/35 84/140/35 77/130/35
f 52/142/35 77/130/35 34/129/35
f 84/140/35 54/141/35 83/139/35
f 77/130/35 52/142/35 54/141/35
f 45/72/36 35/94/36 60/93/36
f 35/94/36 45/72/36 47/74/36
f 46/143/37 85/144/37 69/145/37
f 69/146/38 26/48/38 59/147/38
f 26/48/38 69/146/38 55/86/38
f 29/52/39 86/148/39 87/149/39
f 86/148/39 29/52/39 88/150/39
f 86/148/40 88/150/40 46/143/40
f 86/151/19 46/73/19 45/72/19
f 70/114/41 86/151/41 45/72/41
f 86/151/41 70/114/41 87/152/41
f 40/66/42 65/153/42 41/67/42
f 65/153/42 40/66/42 64/154/42
f 89/155/43 63/98/43 43/70/43
f 63/98/43 89/155/43 25/99/43
f 30/53/13 29/52/13 87/149/13
f 30/156/44 87/152/44 70/114/44
f 54/85/45 2/157/45 83/158/45
f 90/159/45 2/157/45 54/85/45
f 2/157/45 90/159/45 3/160/45
f 83/158/45 2/157/45 13/161/45
f 3/160/45 38/64/45 19/162/45
f 38/64/45 3/160/45 90/159/45
f 36/62/46 89/163/46 42/164/46
f 54/85/21 53/84/21 90/159/21
f 23/45/47 53/84/47 27/61/47
f 53/84/47 23/45/47 90/159/47
f 26/48/48 33/56/48 59/147/48
f 33/56/48 26/48/48 31/54/48
f 68/111/49 69/165/49 85/166/49
f 69/165/49 68/111/49 55/110/49
f 18/167/50 37/63/50 17/168/50
f 12/169/50 81/170/50 83/158/50
f 81/170/50 12/169/50 11/171/50
f 17/172/51 37/173/51 20/174/51
f 81/175/51 10/176/51 50/177/51
f 10/176/51 81/175/51 11/178/51
f 65/179/52 91/180/52 41/181/52
f 91/180/52 65/179/52 62/182/52
f 30/53/53 91/180/53 28/51/53
f 92/183/44 30/156/44 70/114/44
f 37/63/50 19/162/50 38/64/50
f 19/162/50 37/63/50 18/167/50
f 13/161/50 12/169/50 83/158/50
f 89/155/18 43/70/18 42/69/18
f 41/181/53 91/180/53 30/53/53
f 57/88/54 70/114/54 67/108/54
f 70/114/54 57/88/54 92/183/54
f 57/88/22 67/108/22 58/89/22
f 49/77/55 92/184/55 57/103/55
f 92/184/55 49/77/55 40/66/55
f 40/66/17 30/68/17 92/184/17
f 36/62/56 90/159/56 23/45/56
f 90/159/56 36/62/56 38/64/56
f 89/163/57 23/45/57 25/47/57
f 23/45/57 89/163/57 36/62/57
f 39/185/58 51/186/58 37/173/58
f 51/186/58 39/185/58 64/100/58
f 93/187/37 85/144/37 46/143/37
f 68/111/32 94/188/32 24/97/32
f 88/150/40 93/187/40 46/143/40
f 48/75/28 49/77/28 57/103/28
f 36/62/46 42/164/46 39/65/46
f 39/185/27 42/101/27 64/100/27
f 91/180/59 29/52/59 28/51/59
f 62/182/59 29/52/59 91/180/59
f 62/182/59 88/150/59 29/52/59
f 44/189/59 88/150/59 62/182/59
f 44/189/59 93/187/59 88/150/59
f 43/190/59 93/187/59 44/189/59
f 43/190/59 85/144/59 93/187/59
f 63/191/59 85/144/59 43/190/59
f 63/191/59 68/192/59 85/144/59
f 68/192/59 63/191/59 94/193/59
f 24/97/26 94/188/26 63/98/26
f 51/81/60 40/66/60 49/77/60
f 40/66/60 51/81/60 64/154/60
f 37/173/51 21/194/51 20/174/51
f 21/194/51 37/173/51 51/186/51
f 50/177/51 10/176/51 7/195/51
f 95/196/58 74/197/58 75/198/58
f 74/197/58 95/196/58 96/199/58
f 97/200/34 71/201/34 98/202/34
f 71/201/34 97/200/34 78/203/34
f 84/204/54 99/205/54 77/206/54
f 99/205/54 84/204/54 100/207/54
f 101/208/36 82/209/36 80/210/36
f 82/209/36 101/208/36 102/211/36
f 103/212/56 73/213/56 104/214/56
f 73/213/56 103/212/56 72/215/56
f 98/216/47 72/215/47 103/212/47
f 72/215/47 98/216/47 71/217/47
f 105/218/31 80/219/31 79/220/31
f 80/219/31 105/218/31 101/221/31
f 105/222/48 78/203/48 97/200/48
f 78/203/48 105/222/48 79/223/48
f 96/224/16 73/213/16 74/225/16
f 73/213/16 96/224/16 104/214/16
f 82/209/33 100/207/33 84/204/33
f 100/207/33 82/209/33 102/211/33
f 103/226/35 97/227/35 98/228/35
f 104/229/35 97/227/35 103/226/35
f 104/229/35 105/230/35 97/227/35
f 96/231/35 105/230/35 104/229/35
f 96/232/35 101/233/35 105/234/35
f 95/235/35 101/233/35 96/232/35
f 95/235/35 102/236/35 101/233/35
f 106/237/35 102/236/35 95/235/35
f 106/237/35 100/238/35 102/236/35
f 100/238/35 106/237/35 99/239/35
f 76/240/60 95/241/60 75/242/60
f 95/241/60 76/240/60 106/243/60
f 77/244/55 106/243/55 76/240/55
f 106/243/55 77/244/55 99/245/55

View File

@@ -0,0 +1,162 @@
# Blender v2.82 (sub 7) OBJ File: 'shell.blend'
# www.blender.org
mtllib shell.mtl
o Sell
v 1.188815 0.386266 -2.500000
v 1.188815 -0.386266 -0.000000
v 1.188815 -0.386266 -2.500000
v -1.188815 -0.386266 0.000000
v -1.188815 0.386266 -2.500000
v -1.188815 -0.386266 -2.500000
v 1.188815 0.386266 -0.000000
v 0.951055 -0.309014 0.499997
v 0.734730 -1.011265 -0.000000
v -0.734730 -1.011265 -2.500000
v -0.734730 -1.011265 0.000000
v -0.951055 0.309014 0.499997
v -1.188815 0.386266 0.000000
v 0.237761 -0.077252 2.000000
v 0.440836 -0.606760 1.000000
v 0.713290 -0.231762 1.000000
v 0.734730 1.011265 -2.500000
v 0.146942 0.202250 2.000000
v 0.146942 -0.202250 2.000000
v 0.951055 0.309014 0.499997
v -0.000000 -1.250000 -2.500000
v 0.000000 -1.250000 0.000000
v -0.587785 -0.809015 0.499997
v -0.734730 1.011265 0.000000
v -0.587785 0.809015 0.499997
v 0.000000 1.250000 0.000000
v 0.734730 -1.011265 -2.500000
v 0.734730 1.011265 -0.000000
v -0.000000 1.250000 -2.500000
v -0.146942 -0.202250 2.000000
v -0.237760 -0.077252 2.000000
v -0.951055 -0.309014 0.499997
v -0.734730 1.011265 -2.500000
v -0.237760 0.077252 2.000000
v 0.000000 -0.249996 2.000000
v -0.440836 -0.606760 1.000000
v 0.587785 -0.809015 0.499997
v 0.713290 0.231762 1.000000
v 0.237761 0.077252 2.000000
v 0.587785 0.809015 0.499997
v 0.440836 0.606760 1.000000
v -0.713290 0.231762 1.000000
v -0.440836 0.606760 1.000000
v -0.713290 -0.231762 1.000000
v 0.000000 0.249996 2.000000
v -0.146942 0.202250 2.000000
vn 1.0000 0.0000 0.0000
vn -1.0000 0.0000 0.0000
vn 0.7306 -0.5308 0.4294
vn -0.8090 -0.5878 0.0000
vn -0.9031 0.0000 0.4294
vn 0.8090 0.5878 0.0000
vn 0.0000 0.0000 1.0000
vn 0.9031 0.0000 0.4294
vn 0.0000 0.0000 -1.0000
vn -0.2791 -0.8589 0.4294
vn -0.2791 0.8589 0.4294
vn -0.3090 -0.9511 0.0000
vn 0.7306 0.5308 0.4294
vn 0.3090 0.9511 0.0000
vn -0.8090 0.5878 0.0000
vn -0.3090 0.9511 0.0000
vn 0.3090 -0.9511 0.0000
vn -0.7306 -0.5308 0.4294
vn 0.2791 -0.8589 0.4294
vn 0.8090 -0.5878 0.0000
vn 0.2791 0.8589 0.4294
vn -0.7306 0.5308 0.4294
usemtl None
s off
f 1//1 2//1 3//1
f 4//2 5//2 6//2
f 7//1 2//1 1//1
f 2//3 8//3 9//3
f 4//4 10//4 11//4
f 4//5 12//5 13//5
f 14//3 15//3 16//3
f 1//6 17//6 7//6
f 14//7 18//7 19//7
f 8//8 20//8 16//8
f 10//9 5//9 21//9
f 6//4 10//4 4//4
f 22//10 23//10 11//10
f 24//11 25//11 26//11
f 3//9 5//9 1//9
f 21//9 5//9 27//9
f 11//12 10//12 22//12
f 28//13 20//13 7//13
f 17//14 26//14 28//14
f 7//6 17//6 28//6
f 29//14 26//14 17//14
f 24//15 5//15 13//15
f 29//16 24//16 26//16
f 22//17 27//17 9//17
f 30//7 18//7 31//7
f 11//18 32//18 4//18
f 33//15 5//15 24//15
f 29//9 5//9 33//9
f 31//7 18//7 34//7
f 15//19 19//19 35//19
f 33//16 24//16 29//16
f 27//9 5//9 3//9
f 22//12 10//12 21//12
f 21//17 27//17 22//17
f 13//2 5//2 4//2
f 6//9 5//9 10//9
f 2//20 27//20 3//20
f 9//20 27//20 2//20
f 31//18 36//18 30//18
f 32//5 12//5 4//5
f 17//9 5//9 29//9
f 1//9 5//9 17//9
f 35//7 18//7 30//7
f 16//3 37//3 9//3
f 14//8 38//8 39//8
f 26//21 40//21 28//21
f 41//13 18//13 39//13
f 24//22 42//22 25//22
f 25//11 43//11 26//11
f 31//5 34//5 44//5
f 30//10 36//10 35//10
f 34//22 43//22 42//22
f 44//18 32//18 11//18
f 45//21 18//21 41//21
f 16//8 38//8 14//8
f 9//3 8//3 16//3
f 22//19 15//19 35//19
f 15//3 37//3 16//3
f 16//8 20//8 38//8
f 38//13 20//13 28//13
f 32//5 42//5 12//5
f 13//22 12//22 24//22
f 12//22 42//22 24//22
f 42//22 43//22 25//22
f 46//22 43//22 34//22
f 26//21 45//21 41//21
f 14//3 19//3 15//3
f 35//10 36//10 22//10
f 22//19 37//19 15//19
f 9//19 37//19 22//19
f 44//5 34//5 42//5
f 39//7 18//7 14//7
f 2//8 20//8 8//8
f 7//8 20//8 2//8
f 38//13 41//13 39//13
f 41//21 40//21 26//21
f 44//5 42//5 32//5
f 19//7 18//7 35//7
f 34//7 18//7 46//7
f 46//7 18//7 45//7
f 44//18 36//18 31//18
f 36//10 23//10 22//10
f 38//13 40//13 41//13
f 28//13 40//13 38//13
f 44//18 23//18 36//18
f 11//18 23//18 44//18
f 45//11 43//11 46//11
f 26//11 43//11 45//11

View File

@@ -95,6 +95,7 @@ minetest.register_node ("lwcomponents:player_button", {
"lwplayer_button_side.png", "lwplayer_button_side.png",
"lwplayer_button.png" "lwplayer_button.png"
}, },
use_texture_alpha = "clip",
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
legacy_wallmounted = true, legacy_wallmounted = true,
@@ -143,6 +144,7 @@ minetest.register_node ("lwcomponents:player_button_off", {
"lwplayer_button_side.png", "lwplayer_button_side.png",
"lwplayer_button.png" "lwplayer_button.png"
}, },
use_texture_alpha = "clip",
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
legacy_wallmounted = true, legacy_wallmounted = true,
@@ -192,6 +194,7 @@ minetest.register_node ("lwcomponents:player_button_on", {
"lwplayer_button_side.png", "lwplayer_button_side.png",
"lwplayer_button_on.png" "lwplayer_button_on.png"
}, },
use_texture_alpha = "clip",
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
legacy_wallmounted = true, legacy_wallmounted = true,

View File

@@ -13,7 +13,7 @@ CC BY-SA 3.0
Version Version
======= =======
0.1.8 0.1.12
Minetest Version Minetest Version
@@ -63,12 +63,14 @@ Various components for mesecons and digilines.
* Hologram, projects a hologram above the hologram node. * Hologram, projects a hologram above the hologram node.
* Fan, blows any entity, player or drop in front of the fan. * Fan, blows any entity, player or drop in front of the fan.
* Conduit, connected in a circuit to move items. * Conduit, connected in a circuit to move items.
* Cannon, shoots an item on command with directional aiming (plus 3 shells).
* Digiswitch, digilines controlled mesecons power. * Digiswitch, digilines controlled mesecons power.
* Movefloor, similar to vertical mesecons movestone. * Movefloor, similar to vertical mesecons movestone.
* Solid color conductor blocks, same as Solid Color Block but also mesecons * Solid color conductor blocks, same as Solid Color Block but also mesecons
and digilines conductor. and digilines conductor.
To spawn entities from dispensers include the lwcomponents_spawners mod. To spawn entities from dispensers and cannons include the
lwcomponents_spawners mod.
See the docs folder for details on each item. See the docs folder for details on each item.
@@ -84,7 +86,7 @@ the relevant mod is loaded.
The mod supports the following settings: The mod supports the following settings:
Spawn mobs Spawn mobs
Allow dispensers to spawn mobs instead of spawners. Allow dispensers and cannons to spawn mobs instead of spawners.
Default: true Default: true
Alert handler errors Alert handler errors

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 65 KiB

View File

@@ -1,4 +1,4 @@
# Allow dispensers to spawn mobs instead of spawners. # Allow dispensers and cannons to spawn mobs instead of spawners.
lwcomponents_spawn_mobs (Spawn mobs) bool true lwcomponents_spawn_mobs (Spawn mobs) bool true
# Issue errors when handler's of other mods fail. # Issue errors when handler's of other mods fail.

View File

@@ -269,7 +269,7 @@ local function after_place_node_locked (pos, placer, itemstack, pointed_thing)
local meta = minetest.get_meta (pos) local meta = minetest.get_meta (pos)
meta:set_string ("owner", placer:get_player_name ()) meta:set_string ("owner", placer:get_player_name ())
meta:set_string ("infotext", "Detector (owned by "..placer:get_player_name ()..")") meta:set_string ("infotext", "Siren (owned by "..placer:get_player_name ()..")")
end end
-- If return true no item is taken from itemstack -- If return true no item is taken from itemstack

BIN
sounds/lwcannon.ogg Normal file

Binary file not shown.

BIN
textures/lwcannon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
textures/lwcannon_face.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

BIN
textures/lwcannon_item.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
textures/lwcannon_shell.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

BIN
textures/lwcannon_top.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 472 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 B

View File

@@ -271,4 +271,62 @@ end
function utils.can_place (pos)
local node = minetest.get_node_or_nil (pos)
if node and node.name ~= "air" then
local def = minetest.registered_nodes[node.name]
if not def or not def.buildable_to then
return false
end
end
return true
end
function utils.is_protected (pos, player)
local name = (player and player:get_player_name ()) or ""
return minetest.is_protected (pos, name)
end
function utils.get_on_rightclick (pos, player)
local node = minetest.get_node_or_nil (pos)
if node then
local def = minetest.registered_nodes[node.name]
if def and def.on_rightclick and
not (player and player:is_player () and
player:get_player_control ().sneak) then
return def.on_rightclick
end
end
return nil
end
function utils.is_creative (player)
if minetest.settings:get_bool ("creative_mode") then
return true
end
if player and player:is_player () then
return minetest.is_creative_enabled (player:get_player_name ()) or
minetest.check_player_privs (player, "creative")
end
return false
end
-- --