Remove saplings, doors, stairs, tnt, cactus growing
|
@ -41,7 +41,6 @@ minetest.register_alias("mossycobble", "default:mossycobble")
|
||||||
minetest.register_alias("steelblock", "default:steelblock")
|
minetest.register_alias("steelblock", "default:steelblock")
|
||||||
minetest.register_alias("nyancat", "default:nyancat")
|
minetest.register_alias("nyancat", "default:nyancat")
|
||||||
minetest.register_alias("nyancat_rainbow", "default:nyancat_rainbow")
|
minetest.register_alias("nyancat_rainbow", "default:nyancat_rainbow")
|
||||||
minetest.register_alias("sapling", "default:sapling")
|
|
||||||
minetest.register_alias("apple", "default:apple")
|
minetest.register_alias("apple", "default:apple")
|
||||||
|
|
||||||
minetest.register_alias("WPick", "default:pick_wood")
|
minetest.register_alias("WPick", "default:pick_wood")
|
||||||
|
|
|
@ -776,12 +776,6 @@ minetest.register_craft({
|
||||||
burntime = 1,
|
burntime = 1,
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
type = "fuel",
|
|
||||||
recipe = "default:sapling",
|
|
||||||
burntime = 10,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
type = "fuel",
|
type = "fuel",
|
||||||
recipe = "default:apple",
|
recipe = "default:apple",
|
||||||
|
@ -800,20 +794,8 @@ minetest.register_craft({
|
||||||
burntime = 370,
|
burntime = 370,
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
type = "fuel",
|
|
||||||
recipe = "default:junglesapling",
|
|
||||||
burntime = 10,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
type = "fuel",
|
type = "fuel",
|
||||||
recipe = "default:grass_1",
|
recipe = "default:grass_1",
|
||||||
burntime = 2,
|
burntime = 2,
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
type = "fuel",
|
|
||||||
recipe = "default:pine_sapling",
|
|
||||||
burntime = 10,
|
|
||||||
})
|
|
||||||
|
|
|
@ -170,27 +170,6 @@ function default.grow_papyrus(pos, node)
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
minetest.register_abm({
|
|
||||||
nodenames = {"default:cactus"},
|
|
||||||
neighbors = {"group:sand"},
|
|
||||||
interval = 50,
|
|
||||||
chance = 20,
|
|
||||||
action = function(...)
|
|
||||||
default.grow_cactus(...)
|
|
||||||
end
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_abm({
|
|
||||||
nodenames = {"default:papyrus"},
|
|
||||||
neighbors = {"default:dirt", "default:dirt_with_grass"},
|
|
||||||
interval = 50,
|
|
||||||
chance = 20,
|
|
||||||
action = function(...)
|
|
||||||
default.grow_papyrus(...)
|
|
||||||
end
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- dig upwards
|
-- dig upwards
|
||||||
--
|
--
|
||||||
|
@ -342,4 +321,3 @@ minetest.register_abm({
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@ minetest.register_alias("mapgen_stair_sandstonebrick", "stairs:stair_sandstonebr
|
||||||
-- Blob ore first to avoid other ores inside blobs
|
-- Blob ore first to avoid other ores inside blobs
|
||||||
|
|
||||||
function default.register_ores()
|
function default.register_ores()
|
||||||
minetest.register_ore({
|
minetest.register_ore({
|
||||||
ore_type = "blob",
|
ore_type = "blob",
|
||||||
ore = "default:clay",
|
ore = "default:clay",
|
||||||
wherein = {"default:sand"},
|
wherein = {"default:sand"},
|
||||||
|
@ -62,7 +62,7 @@ function default.register_ores()
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_ore({
|
minetest.register_ore({
|
||||||
ore_type = "blob",
|
ore_type = "blob",
|
||||||
ore = "default:sand",
|
ore = "default:sand",
|
||||||
wherein = {"default:stone"},
|
wherein = {"default:stone"},
|
||||||
|
@ -449,7 +449,7 @@ function default.register_decorations()
|
||||||
y_max = 31000,
|
y_max = 31000,
|
||||||
decoration = "flowers:rose",
|
decoration = "flowers:rose",
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_decoration({
|
minetest.register_decoration({
|
||||||
deco_type = "simple",
|
deco_type = "simple",
|
||||||
place_on = {"default:dirt_with_grass"},
|
place_on = {"default:dirt_with_grass"},
|
||||||
|
@ -467,7 +467,7 @@ function default.register_decorations()
|
||||||
y_max = 31000,
|
y_max = 31000,
|
||||||
decoration = "flowers:tulip",
|
decoration = "flowers:tulip",
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_decoration({
|
minetest.register_decoration({
|
||||||
deco_type = "simple",
|
deco_type = "simple",
|
||||||
place_on = {"default:dirt_with_grass"},
|
place_on = {"default:dirt_with_grass"},
|
||||||
|
@ -485,7 +485,7 @@ function default.register_decorations()
|
||||||
y_max = 31000,
|
y_max = 31000,
|
||||||
decoration = "flowers:dandelion_yellow",
|
decoration = "flowers:dandelion_yellow",
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_decoration({
|
minetest.register_decoration({
|
||||||
deco_type = "simple",
|
deco_type = "simple",
|
||||||
place_on = {"default:dirt_with_grass"},
|
place_on = {"default:dirt_with_grass"},
|
||||||
|
@ -503,7 +503,7 @@ function default.register_decorations()
|
||||||
y_max = 31000,
|
y_max = 31000,
|
||||||
decoration = "flowers:geranium",
|
decoration = "flowers:geranium",
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_decoration({
|
minetest.register_decoration({
|
||||||
deco_type = "simple",
|
deco_type = "simple",
|
||||||
place_on = {"default:dirt_with_grass"},
|
place_on = {"default:dirt_with_grass"},
|
||||||
|
@ -521,7 +521,7 @@ function default.register_decorations()
|
||||||
y_max = 31000,
|
y_max = 31000,
|
||||||
decoration = "flowers:viola",
|
decoration = "flowers:viola",
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_decoration({
|
minetest.register_decoration({
|
||||||
deco_type = "simple",
|
deco_type = "simple",
|
||||||
place_on = {"default:dirt_with_grass"},
|
place_on = {"default:dirt_with_grass"},
|
||||||
|
@ -559,7 +559,7 @@ function default.register_decorations()
|
||||||
y_max = 31000,
|
y_max = 31000,
|
||||||
decoration = "default:grass_1",
|
decoration = "default:grass_1",
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_decoration({
|
minetest.register_decoration({
|
||||||
deco_type = "simple",
|
deco_type = "simple",
|
||||||
place_on = {"default:dirt_with_grass"},
|
place_on = {"default:dirt_with_grass"},
|
||||||
|
@ -577,7 +577,7 @@ function default.register_decorations()
|
||||||
y_max = 31000,
|
y_max = 31000,
|
||||||
decoration = "default:grass_2",
|
decoration = "default:grass_2",
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_decoration({
|
minetest.register_decoration({
|
||||||
deco_type = "simple",
|
deco_type = "simple",
|
||||||
place_on = {"default:dirt_with_grass"},
|
place_on = {"default:dirt_with_grass"},
|
||||||
|
@ -595,7 +595,7 @@ function default.register_decorations()
|
||||||
y_max = 31000,
|
y_max = 31000,
|
||||||
decoration = "default:grass_3",
|
decoration = "default:grass_3",
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_decoration({
|
minetest.register_decoration({
|
||||||
deco_type = "simple",
|
deco_type = "simple",
|
||||||
place_on = {"default:dirt_with_grass"},
|
place_on = {"default:dirt_with_grass"},
|
||||||
|
@ -613,7 +613,7 @@ function default.register_decorations()
|
||||||
y_max = 31000,
|
y_max = 31000,
|
||||||
decoration = "default:grass_4",
|
decoration = "default:grass_4",
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_decoration({
|
minetest.register_decoration({
|
||||||
deco_type = "simple",
|
deco_type = "simple",
|
||||||
place_on = {"default:dirt_with_grass"},
|
place_on = {"default:dirt_with_grass"},
|
||||||
|
|
|
@ -388,24 +388,6 @@ minetest.register_node("default:wood", {
|
||||||
sounds = default.node_sound_wood_defaults(),
|
sounds = default.node_sound_wood_defaults(),
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_node("default:sapling", {
|
|
||||||
description = "Sapling",
|
|
||||||
drawtype = "plantlike",
|
|
||||||
visual_scale = 1.0,
|
|
||||||
tiles = {"default_sapling.png"},
|
|
||||||
inventory_image = "default_sapling.png",
|
|
||||||
wield_image = "default_sapling.png",
|
|
||||||
paramtype = "light",
|
|
||||||
sunlight_propagates = true,
|
|
||||||
walkable = false,
|
|
||||||
selection_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
|
|
||||||
},
|
|
||||||
groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1},
|
|
||||||
sounds = default.node_sound_leaves_defaults(),
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_node("default:leaves", {
|
minetest.register_node("default:leaves", {
|
||||||
description = "Leaves",
|
description = "Leaves",
|
||||||
drawtype = "allfaces_optional",
|
drawtype = "allfaces_optional",
|
||||||
|
@ -418,11 +400,6 @@ minetest.register_node("default:leaves", {
|
||||||
drop = {
|
drop = {
|
||||||
max_items = 1,
|
max_items = 1,
|
||||||
items = {
|
items = {
|
||||||
{
|
|
||||||
-- player will get sapling with 1/20 chance
|
|
||||||
items = {'default:sapling'},
|
|
||||||
rarity = 20,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
-- player will get leaves only if he get no saplings,
|
-- player will get leaves only if he get no saplings,
|
||||||
-- this is because max_items is 1
|
-- this is because max_items is 1
|
||||||
|
@ -493,11 +470,6 @@ minetest.register_node("default:jungleleaves", {
|
||||||
drop = {
|
drop = {
|
||||||
max_items = 1,
|
max_items = 1,
|
||||||
items = {
|
items = {
|
||||||
{
|
|
||||||
-- player will get sapling with 1/20 chance
|
|
||||||
items = {'default:junglesapling'},
|
|
||||||
rarity = 20,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
-- player will get leaves only if he get no saplings,
|
-- player will get leaves only if he get no saplings,
|
||||||
-- this is because max_items is 1
|
-- this is because max_items is 1
|
||||||
|
@ -510,25 +482,6 @@ minetest.register_node("default:jungleleaves", {
|
||||||
after_place_node = default.after_place_leaves,
|
after_place_node = default.after_place_leaves,
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_node("default:junglesapling", {
|
|
||||||
description = "Jungle Sapling",
|
|
||||||
drawtype = "plantlike",
|
|
||||||
visual_scale = 1.0,
|
|
||||||
tiles = {"default_junglesapling.png"},
|
|
||||||
inventory_image = "default_junglesapling.png",
|
|
||||||
wield_image = "default_junglesapling.png",
|
|
||||||
paramtype = "light",
|
|
||||||
sunlight_propagates = true,
|
|
||||||
walkable = false,
|
|
||||||
selection_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
|
|
||||||
},
|
|
||||||
groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1},
|
|
||||||
sounds = default.node_sound_leaves_defaults(),
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
minetest.register_node("default:pinetree", {
|
minetest.register_node("default:pinetree", {
|
||||||
description = "Pine Tree",
|
description = "Pine Tree",
|
||||||
|
@ -561,11 +514,6 @@ minetest.register_node("default:pine_needles",{
|
||||||
drop = {
|
drop = {
|
||||||
max_items = 1,
|
max_items = 1,
|
||||||
items = {
|
items = {
|
||||||
{
|
|
||||||
-- player will get sapling with 1/20 chance
|
|
||||||
items = {"default:pine_sapling"},
|
|
||||||
rarity = 20,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
-- player will get leaves only if he get no saplings,
|
-- player will get leaves only if he get no saplings,
|
||||||
-- this is because max_items is 1
|
-- this is because max_items is 1
|
||||||
|
@ -578,23 +526,6 @@ minetest.register_node("default:pine_needles",{
|
||||||
after_place_node = default.after_place_leaves,
|
after_place_node = default.after_place_leaves,
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_node("default:pine_sapling", {
|
|
||||||
description = "Pine Sapling",
|
|
||||||
drawtype = "plantlike",
|
|
||||||
visual_scale = 1.0,
|
|
||||||
tiles = {"default_pine_sapling.png"},
|
|
||||||
inventory_image = "default_pine_sapling.png",
|
|
||||||
wield_image = "default_pine_sapling.png",
|
|
||||||
paramtype = "light",
|
|
||||||
walkable = false,
|
|
||||||
selection_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
|
|
||||||
},
|
|
||||||
groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1},
|
|
||||||
sounds = default.node_sound_leaves_defaults(),
|
|
||||||
})
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Ores
|
-- Ores
|
||||||
--
|
--
|
||||||
|
|
|
@ -17,53 +17,6 @@ local function can_grow(pos)
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Sapling ABMs
|
|
||||||
|
|
||||||
minetest.register_abm({
|
|
||||||
nodenames = {"default:sapling"},
|
|
||||||
interval = 10,
|
|
||||||
chance = 50,
|
|
||||||
action = function(pos, node)
|
|
||||||
if not can_grow(pos) then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
minetest.log("action", "A sapling grows into a tree at "..
|
|
||||||
minetest.pos_to_string(pos))
|
|
||||||
default.grow_tree(pos, random(1, 4) == 1)
|
|
||||||
end
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_abm({
|
|
||||||
nodenames = {"default:junglesapling"},
|
|
||||||
interval = 11,
|
|
||||||
chance = 50,
|
|
||||||
action = function(pos, node)
|
|
||||||
if not can_grow(pos) then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
minetest.log("action", "A jungle sapling grows into a tree at "..
|
|
||||||
minetest.pos_to_string(pos))
|
|
||||||
default.grow_jungle_tree(pos)
|
|
||||||
end
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_abm({
|
|
||||||
nodenames = {"default:pine_sapling"},
|
|
||||||
interval = 12,
|
|
||||||
chance = 50,
|
|
||||||
action = function(pos, node)
|
|
||||||
if not can_grow(pos) then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
minetest.log("action", "A pine sapling grows into a tree at "..
|
|
||||||
minetest.pos_to_string(pos))
|
|
||||||
default.grow_pine_tree(pos)
|
|
||||||
end
|
|
||||||
})
|
|
||||||
|
|
||||||
-- Appletree, jungletree function
|
-- Appletree, jungletree function
|
||||||
|
|
||||||
local function add_trunk_and_leaves(data, a, pos, tree_cid, leaves_cid,
|
local function add_trunk_and_leaves(data, a, pos, tree_cid, leaves_cid,
|
||||||
|
@ -345,4 +298,3 @@ function default.grow_pine_tree(pos)
|
||||||
vm:write_to_map()
|
vm:write_to_map()
|
||||||
vm:update_map()
|
vm:update_map()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -1,46 +0,0 @@
|
||||||
Minetest 0.4 mod: doors
|
|
||||||
=======================
|
|
||||||
version: 1.3
|
|
||||||
|
|
||||||
License of source code:
|
|
||||||
-----------------------
|
|
||||||
Copyright (C) 2012 PilzAdam
|
|
||||||
modified by BlockMen (added sounds, glassdoors[glass, obsidian glass], trapdoor)
|
|
||||||
|
|
||||||
This program is free software. It comes without any warranty, to
|
|
||||||
the extent permitted by applicable law. You can redistribute it
|
|
||||||
and/or modify it under the terms of the Do What The Fuck You Want
|
|
||||||
To Public License, Version 2, as published by Sam Hocevar. See
|
|
||||||
http://sam.zoy.org/wtfpl/COPYING for more details.
|
|
||||||
|
|
||||||
License of textures
|
|
||||||
--------------------------------------
|
|
||||||
following Textures created by Fernando Zapata (CC BY-SA 3.0):
|
|
||||||
door_wood.png
|
|
||||||
door_wood_a.png
|
|
||||||
door_wood_a_r.png
|
|
||||||
door_wood_b.png
|
|
||||||
door_wood_b_r.png
|
|
||||||
|
|
||||||
following Textures created by BlockMen (WTFPL):
|
|
||||||
door_trapdoor.png
|
|
||||||
door_obsidian_glass_side.png
|
|
||||||
|
|
||||||
following textures created by celeron55 (CC BY-SA 3.0):
|
|
||||||
door_trapdoor_side.png
|
|
||||||
door_glass_a.png
|
|
||||||
door_glass_b.png
|
|
||||||
|
|
||||||
following Textures created by PenguinDad (CC BY-SA 4.0):
|
|
||||||
door_glass.png
|
|
||||||
door_obsidian_glass.png
|
|
||||||
|
|
||||||
All other textures (created by PilzAdam): WTFPL
|
|
||||||
|
|
||||||
|
|
||||||
License of sounds
|
|
||||||
--------------------------------------
|
|
||||||
Opening-Sound created by CGEffex (CC BY 3.0), modified by BlockMen
|
|
||||||
door_open.ogg
|
|
||||||
Closing-Sound created by bennstir (CC BY 3.0)
|
|
||||||
door_close.ogg
|
|
|
@ -1,2 +0,0 @@
|
||||||
default
|
|
||||||
screwdriver?
|
|
|
@ -1,502 +0,0 @@
|
||||||
doors = {}
|
|
||||||
|
|
||||||
-- Registers a door
|
|
||||||
function doors.register_door(name, def)
|
|
||||||
def.groups.not_in_creative_inventory = 1
|
|
||||||
|
|
||||||
local box = {{-0.5, -0.5, -0.5, 0.5, 0.5, -0.5+1.5/16}}
|
|
||||||
|
|
||||||
if not def.node_box_bottom then
|
|
||||||
def.node_box_bottom = box
|
|
||||||
end
|
|
||||||
if not def.node_box_top then
|
|
||||||
def.node_box_top = box
|
|
||||||
end
|
|
||||||
if not def.selection_box_bottom then
|
|
||||||
def.selection_box_bottom= box
|
|
||||||
end
|
|
||||||
if not def.selection_box_top then
|
|
||||||
def.selection_box_top = box
|
|
||||||
end
|
|
||||||
|
|
||||||
if not def.sound_close_door then
|
|
||||||
def.sound_close_door = "doors_door_close"
|
|
||||||
end
|
|
||||||
if not def.sound_open_door then
|
|
||||||
def.sound_open_door = "doors_door_open"
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
minetest.register_craftitem(name, {
|
|
||||||
description = def.description,
|
|
||||||
inventory_image = def.inventory_image,
|
|
||||||
|
|
||||||
on_place = function(itemstack, placer, pointed_thing)
|
|
||||||
if not pointed_thing.type == "node" then
|
|
||||||
return itemstack
|
|
||||||
end
|
|
||||||
|
|
||||||
local ptu = pointed_thing.under
|
|
||||||
local nu = minetest.get_node(ptu)
|
|
||||||
if minetest.registered_nodes[nu.name].on_rightclick then
|
|
||||||
return minetest.registered_nodes[nu.name].on_rightclick(ptu, nu, placer, itemstack)
|
|
||||||
end
|
|
||||||
|
|
||||||
local pt = pointed_thing.above
|
|
||||||
local pt2 = {x=pt.x, y=pt.y, z=pt.z}
|
|
||||||
pt2.y = pt2.y+1
|
|
||||||
if
|
|
||||||
not minetest.registered_nodes[minetest.get_node(pt).name].buildable_to or
|
|
||||||
not minetest.registered_nodes[minetest.get_node(pt2).name].buildable_to or
|
|
||||||
not placer or
|
|
||||||
not placer:is_player()
|
|
||||||
then
|
|
||||||
return itemstack
|
|
||||||
end
|
|
||||||
|
|
||||||
if minetest.is_protected(pt, placer:get_player_name()) or
|
|
||||||
minetest.is_protected(pt2, placer:get_player_name()) then
|
|
||||||
minetest.record_protection_violation(pt, placer:get_player_name())
|
|
||||||
return itemstack
|
|
||||||
end
|
|
||||||
|
|
||||||
local p2 = minetest.dir_to_facedir(placer:get_look_dir())
|
|
||||||
local pt3 = {x=pt.x, y=pt.y, z=pt.z}
|
|
||||||
if p2 == 0 then
|
|
||||||
pt3.x = pt3.x-1
|
|
||||||
elseif p2 == 1 then
|
|
||||||
pt3.z = pt3.z+1
|
|
||||||
elseif p2 == 2 then
|
|
||||||
pt3.x = pt3.x+1
|
|
||||||
elseif p2 == 3 then
|
|
||||||
pt3.z = pt3.z-1
|
|
||||||
end
|
|
||||||
if minetest.get_item_group(minetest.get_node(pt3).name, "door") == 0 then
|
|
||||||
minetest.set_node(pt, {name=name.."_b_1", param2=p2})
|
|
||||||
minetest.set_node(pt2, {name=name.."_t_1", param2=p2})
|
|
||||||
else
|
|
||||||
minetest.set_node(pt, {name=name.."_b_2", param2=p2})
|
|
||||||
minetest.set_node(pt2, {name=name.."_t_2", param2=p2})
|
|
||||||
minetest.get_meta(pt):set_int("right", 1)
|
|
||||||
minetest.get_meta(pt2):set_int("right", 1)
|
|
||||||
end
|
|
||||||
|
|
||||||
if def.only_placer_can_open then
|
|
||||||
local pn = placer:get_player_name()
|
|
||||||
local meta = minetest.get_meta(pt)
|
|
||||||
meta:set_string("doors_owner", pn)
|
|
||||||
meta:set_string("infotext", "Owned by "..pn)
|
|
||||||
meta = minetest.get_meta(pt2)
|
|
||||||
meta:set_string("doors_owner", pn)
|
|
||||||
meta:set_string("infotext", "Owned by "..pn)
|
|
||||||
end
|
|
||||||
|
|
||||||
if not minetest.setting_getbool("creative_mode") then
|
|
||||||
itemstack:take_item()
|
|
||||||
end
|
|
||||||
return itemstack
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
||||||
local tt = def.tiles_top
|
|
||||||
local tb = def.tiles_bottom
|
|
||||||
|
|
||||||
local function after_dig_node(pos, name, digger)
|
|
||||||
local node = minetest.get_node(pos)
|
|
||||||
if node.name == name then
|
|
||||||
minetest.node_dig(pos, node, digger)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function check_and_blast(pos, name)
|
|
||||||
local node = minetest.get_node(pos)
|
|
||||||
if node.name == name then
|
|
||||||
minetest.remove_node(pos)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function make_on_blast(base_name, dir, door_type, other_door_type)
|
|
||||||
if def.only_placer_can_open then
|
|
||||||
return function() end
|
|
||||||
else
|
|
||||||
return function(pos, intensity)
|
|
||||||
check_and_blast(pos, base_name .. door_type)
|
|
||||||
pos.y = pos.y + dir
|
|
||||||
check_and_blast(pos, base_name .. other_door_type)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function on_rightclick(pos, dir, check_name, replace, replace_dir, params)
|
|
||||||
pos.y = pos.y+dir
|
|
||||||
if not minetest.get_node(pos).name == check_name then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
local p2 = minetest.get_node(pos).param2
|
|
||||||
p2 = params[p2+1]
|
|
||||||
|
|
||||||
minetest.swap_node(pos, {name=replace_dir, param2=p2})
|
|
||||||
|
|
||||||
pos.y = pos.y-dir
|
|
||||||
minetest.swap_node(pos, {name=replace, param2=p2})
|
|
||||||
|
|
||||||
local snd_1 = def.sound_close_door
|
|
||||||
local snd_2 = def.sound_open_door
|
|
||||||
if params[1] == 3 then
|
|
||||||
snd_1 = def.sound_open_door
|
|
||||||
snd_2 = def.sound_close_door
|
|
||||||
end
|
|
||||||
|
|
||||||
if minetest.get_meta(pos):get_int("right") ~= 0 then
|
|
||||||
minetest.sound_play(snd_1, {pos = pos, gain = 0.3, max_hear_distance = 10})
|
|
||||||
else
|
|
||||||
minetest.sound_play(snd_2, {pos = pos, gain = 0.3, max_hear_distance = 10})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function check_player_priv(pos, player)
|
|
||||||
if not def.only_placer_can_open then
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
local meta = minetest.get_meta(pos)
|
|
||||||
local pn = player:get_player_name()
|
|
||||||
return meta:get_string("doors_owner") == pn
|
|
||||||
end
|
|
||||||
|
|
||||||
local function on_rotate(pos, node, dir, user, check_name, mode, new_param2)
|
|
||||||
if not check_player_priv(pos, user) then
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
if mode ~= screwdriver.ROTATE_FACE then
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
pos.y = pos.y + dir
|
|
||||||
if not minetest.get_node(pos).name == check_name then
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
if minetest.is_protected(pos, user:get_player_name()) then
|
|
||||||
minetest.record_protection_violation(pos, user:get_player_name())
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
local node2 = minetest.get_node(pos)
|
|
||||||
node2.param2 = (node2.param2 + 1) % 4
|
|
||||||
minetest.swap_node(pos, node2)
|
|
||||||
|
|
||||||
pos.y = pos.y - dir
|
|
||||||
node.param2 = (node.param2 + 1) % 4
|
|
||||||
minetest.swap_node(pos, node)
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
minetest.register_node(name.."_b_1", {
|
|
||||||
tiles = {tb[2], tb[2], tb[2], tb[2], tb[1], tb[1].."^[transformfx"},
|
|
||||||
paramtype = "light",
|
|
||||||
paramtype2 = "facedir",
|
|
||||||
is_ground_content = false,
|
|
||||||
drop = name,
|
|
||||||
drawtype = "nodebox",
|
|
||||||
node_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = def.node_box_bottom
|
|
||||||
},
|
|
||||||
selection_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = def.selection_box_bottom
|
|
||||||
},
|
|
||||||
groups = def.groups,
|
|
||||||
|
|
||||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
|
||||||
pos.y = pos.y+1
|
|
||||||
after_dig_node(pos, name.."_t_1", digger)
|
|
||||||
end,
|
|
||||||
|
|
||||||
on_rightclick = function(pos, node, clicker)
|
|
||||||
if check_player_priv(pos, clicker) then
|
|
||||||
on_rightclick(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2", {1,2,3,0})
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
|
|
||||||
on_rotate = function(pos, node, user, mode, new_param2)
|
|
||||||
return on_rotate(pos, node, 1, user, name.."_t_1", mode)
|
|
||||||
end,
|
|
||||||
|
|
||||||
can_dig = check_player_priv,
|
|
||||||
sounds = def.sounds,
|
|
||||||
sunlight_propagates = def.sunlight,
|
|
||||||
on_blast = make_on_blast(name, 1, "_b_1", "_t_1")
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_node(name.."_t_1", {
|
|
||||||
tiles = {tt[2], tt[2], tt[2], tt[2], tt[1], tt[1].."^[transformfx"},
|
|
||||||
paramtype = "light",
|
|
||||||
paramtype2 = "facedir",
|
|
||||||
is_ground_content = false,
|
|
||||||
drop = "",
|
|
||||||
drawtype = "nodebox",
|
|
||||||
node_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = def.node_box_top
|
|
||||||
},
|
|
||||||
selection_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = def.selection_box_top
|
|
||||||
},
|
|
||||||
groups = def.groups,
|
|
||||||
|
|
||||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
|
||||||
pos.y = pos.y-1
|
|
||||||
after_dig_node(pos, name.."_b_1", digger)
|
|
||||||
end,
|
|
||||||
|
|
||||||
on_rightclick = function(pos, node, clicker)
|
|
||||||
if check_player_priv(pos, clicker) then
|
|
||||||
on_rightclick(pos, -1, name.."_b_1", name.."_t_2", name.."_b_2", {1,2,3,0})
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
|
|
||||||
on_rotate = function(pos, node, user, mode, new_param2)
|
|
||||||
return on_rotate(pos, node, -1, user, name.."_b_1", mode)
|
|
||||||
end,
|
|
||||||
|
|
||||||
can_dig = check_player_priv,
|
|
||||||
sounds = def.sounds,
|
|
||||||
sunlight_propagates = def.sunlight,
|
|
||||||
on_blast = make_on_blast(name, -1, "_t_1", "_b_1")
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_node(name.."_b_2", {
|
|
||||||
tiles = {tb[2], tb[2], tb[2], tb[2], tb[1].."^[transformfx", tb[1]},
|
|
||||||
paramtype = "light",
|
|
||||||
paramtype2 = "facedir",
|
|
||||||
is_ground_content = false,
|
|
||||||
drop = name,
|
|
||||||
drawtype = "nodebox",
|
|
||||||
node_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = def.node_box_bottom
|
|
||||||
},
|
|
||||||
selection_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = def.selection_box_bottom
|
|
||||||
},
|
|
||||||
groups = def.groups,
|
|
||||||
|
|
||||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
|
||||||
pos.y = pos.y+1
|
|
||||||
after_dig_node(pos, name.."_t_2", digger)
|
|
||||||
end,
|
|
||||||
|
|
||||||
on_rightclick = function(pos, node, clicker)
|
|
||||||
if check_player_priv(pos, clicker) then
|
|
||||||
on_rightclick(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1", {3,0,1,2})
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
|
|
||||||
on_rotate = function(pos, node, user, mode, new_param2)
|
|
||||||
return on_rotate(pos, node, 1, user, name.."_t_2", mode)
|
|
||||||
end,
|
|
||||||
|
|
||||||
can_dig = check_player_priv,
|
|
||||||
sounds = def.sounds,
|
|
||||||
sunlight_propagates = def.sunlight,
|
|
||||||
on_blast = make_on_blast(name, 1, "_b_2", "_t_2")
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_node(name.."_t_2", {
|
|
||||||
tiles = {tt[2], tt[2], tt[2], tt[2], tt[1].."^[transformfx", tt[1]},
|
|
||||||
paramtype = "light",
|
|
||||||
paramtype2 = "facedir",
|
|
||||||
is_ground_content = false,
|
|
||||||
drop = "",
|
|
||||||
drawtype = "nodebox",
|
|
||||||
node_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = def.node_box_top
|
|
||||||
},
|
|
||||||
selection_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = def.selection_box_top
|
|
||||||
},
|
|
||||||
groups = def.groups,
|
|
||||||
|
|
||||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
|
||||||
pos.y = pos.y-1
|
|
||||||
after_dig_node(pos, name.."_b_2", digger)
|
|
||||||
end,
|
|
||||||
|
|
||||||
on_rightclick = function(pos, node, clicker)
|
|
||||||
if check_player_priv(pos, clicker) then
|
|
||||||
on_rightclick(pos, -1, name.."_b_2", name.."_t_1", name.."_b_1", {3,0,1,2})
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
|
|
||||||
on_rotate = function(pos, node, user, mode, new_param2)
|
|
||||||
return on_rotate(pos, node, -1, user, name.."_b_2", mode)
|
|
||||||
end,
|
|
||||||
|
|
||||||
can_dig = check_player_priv,
|
|
||||||
sounds = def.sounds,
|
|
||||||
sunlight_propagates = def.sunlight,
|
|
||||||
on_blast = make_on_blast(name, -1, "_t_2", "_b_2")
|
|
||||||
})
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
doors.register_door("doors:door_wood", {
|
|
||||||
description = "Wooden Door",
|
|
||||||
inventory_image = "doors_wood.png",
|
|
||||||
groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=2,door=1},
|
|
||||||
tiles_bottom = {"doors_wood_b.png", "doors_brown.png"},
|
|
||||||
tiles_top = {"doors_wood_a.png", "doors_brown.png"},
|
|
||||||
sounds = default.node_sound_wood_defaults(),
|
|
||||||
sunlight = false,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
output = "doors:door_wood",
|
|
||||||
recipe = {
|
|
||||||
{"group:wood", "group:wood"},
|
|
||||||
{"group:wood", "group:wood"},
|
|
||||||
{"group:wood", "group:wood"}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
doors.register_door("doors:door_steel", {
|
|
||||||
description = "Steel Door",
|
|
||||||
inventory_image = "doors_steel.png",
|
|
||||||
groups = {snappy=1,bendy=2,cracky=1,melty=2,level=2,door=1},
|
|
||||||
tiles_bottom = {"doors_steel_b.png", "doors_grey.png"},
|
|
||||||
tiles_top = {"doors_steel_a.png", "doors_grey.png"},
|
|
||||||
only_placer_can_open = true,
|
|
||||||
sounds = default.node_sound_wood_defaults(),
|
|
||||||
sunlight = false,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
output = "doors:door_steel",
|
|
||||||
recipe = {
|
|
||||||
{"default:steel_ingot", "default:steel_ingot"},
|
|
||||||
{"default:steel_ingot", "default:steel_ingot"},
|
|
||||||
{"default:steel_ingot", "default:steel_ingot"}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
doors.register_door("doors:door_glass", {
|
|
||||||
description = "Glass Door",
|
|
||||||
inventory_image = "doors_glass.png",
|
|
||||||
groups = {snappy=1,cracky=1,oddly_breakable_by_hand=3,door=1},
|
|
||||||
tiles_bottom = {"doors_glass_b.png", "doors_glass_side.png"},
|
|
||||||
tiles_top = {"doors_glass_a.png", "doors_glass_side.png"},
|
|
||||||
sounds = default.node_sound_glass_defaults(),
|
|
||||||
sunlight = true,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
output = "doors:door_glass",
|
|
||||||
recipe = {
|
|
||||||
{"default:glass", "default:glass"},
|
|
||||||
{"default:glass", "default:glass"},
|
|
||||||
{"default:glass", "default:glass"}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
doors.register_door("doors:door_obsidian_glass", {
|
|
||||||
description = "Obsidian Glass Door",
|
|
||||||
inventory_image = "doors_obsidian_glass.png",
|
|
||||||
groups = {snappy=1,cracky=1,oddly_breakable_by_hand=3,door=1},
|
|
||||||
tiles_bottom = {"doors_obsidian_glass_b.png", "doors_obsidian_glass_side.png"},
|
|
||||||
tiles_top = {"doors_obsidian_glass_a.png", "doors_obsidian_glass_side.png"},
|
|
||||||
sounds = default.node_sound_glass_defaults(),
|
|
||||||
sunlight = true,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
output = "doors:door_obsidian_glass",
|
|
||||||
recipe = {
|
|
||||||
{"default:obsidian_glass", "default:obsidian_glass"},
|
|
||||||
{"default:obsidian_glass", "default:obsidian_glass"},
|
|
||||||
{"default:obsidian_glass", "default:obsidian_glass"}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
----trapdoor----
|
|
||||||
|
|
||||||
function doors.register_trapdoor(name, def)
|
|
||||||
local name_closed = name
|
|
||||||
local name_opened = name.."_open"
|
|
||||||
|
|
||||||
def.on_rightclick = function (pos, node)
|
|
||||||
local newname = node.name == name_closed and name_opened or name_closed
|
|
||||||
local sound = false
|
|
||||||
if node.name == name_closed then sound = def.sound_open end
|
|
||||||
if node.name == name_opened then sound = def.sound_close end
|
|
||||||
if sound then
|
|
||||||
minetest.sound_play(sound, {pos = pos, gain = 0.3, max_hear_distance = 10})
|
|
||||||
end
|
|
||||||
minetest.set_node(pos, {name = newname, param1 = node.param1, param2 = node.param2})
|
|
||||||
end
|
|
||||||
|
|
||||||
def.on_rotate = minetest.get_modpath("screwdriver") and screwdriver.rotate_simple
|
|
||||||
|
|
||||||
-- Common trapdoor configuration
|
|
||||||
def.drawtype = "nodebox"
|
|
||||||
def.paramtype = "light"
|
|
||||||
def.paramtype2 = "facedir"
|
|
||||||
def.is_ground_content = false
|
|
||||||
|
|
||||||
local def_opened = table.copy(def)
|
|
||||||
local def_closed = table.copy(def)
|
|
||||||
|
|
||||||
def_closed.node_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = {-0.5, -0.5, -0.5, 0.5, -0.4, 0.5}
|
|
||||||
}
|
|
||||||
def_closed.selection_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = {-0.5, -0.5, -0.5, 0.5, -0.4, 0.5}
|
|
||||||
}
|
|
||||||
def_closed.tiles = { def.tile_front, def.tile_front, def.tile_side, def.tile_side,
|
|
||||||
def.tile_side, def.tile_side }
|
|
||||||
|
|
||||||
def_opened.node_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = {-0.5, -0.5, 0.4, 0.5, 0.5, 0.5}
|
|
||||||
}
|
|
||||||
def_opened.selection_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = {-0.5, -0.5, 0.4, 0.5, 0.5, 0.5}
|
|
||||||
}
|
|
||||||
def_opened.tiles = { def.tile_side, def.tile_side, def.tile_side, def.tile_side,
|
|
||||||
def.tile_front, def.tile_front }
|
|
||||||
def_opened.drop = name_closed
|
|
||||||
def_opened.groups.not_in_creative_inventory = 1
|
|
||||||
|
|
||||||
minetest.register_node(name_opened, def_opened)
|
|
||||||
minetest.register_node(name_closed, def_closed)
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
doors.register_trapdoor("doors:trapdoor", {
|
|
||||||
description = "Trapdoor",
|
|
||||||
inventory_image = "doors_trapdoor.png",
|
|
||||||
wield_image = "doors_trapdoor.png",
|
|
||||||
tile_front = "doors_trapdoor.png",
|
|
||||||
tile_side = "doors_trapdoor_side.png",
|
|
||||||
groups = {snappy=1, choppy=2, oddly_breakable_by_hand=2, flammable=2, door=1},
|
|
||||||
sounds = default.node_sound_wood_defaults(),
|
|
||||||
sound_open = "doors_door_open",
|
|
||||||
sound_close = "doors_door_close"
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
output = 'doors:trapdoor 2',
|
|
||||||
recipe = {
|
|
||||||
{'group:wood', 'group:wood', 'group:wood'},
|
|
||||||
{'group:wood', 'group:wood', 'group:wood'},
|
|
||||||
{'', '', ''},
|
|
||||||
}
|
|
||||||
})
|
|
Before Width: | Height: | Size: 109 B |
Before Width: | Height: | Size: 128 B |
Before Width: | Height: | Size: 158 B |
Before Width: | Height: | Size: 158 B |
Before Width: | Height: | Size: 82 B |
Before Width: | Height: | Size: 105 B |
Before Width: | Height: | Size: 130 B |
Before Width: | Height: | Size: 128 B |
Before Width: | Height: | Size: 128 B |
Before Width: | Height: | Size: 82 B |
Before Width: | Height: | Size: 132 B |
Before Width: | Height: | Size: 273 B |
Before Width: | Height: | Size: 260 B |
Before Width: | Height: | Size: 257 B |
Before Width: | Height: | Size: 173 B |
Before Width: | Height: | Size: 130 B |
Before Width: | Height: | Size: 294 B |
Before Width: | Height: | Size: 291 B |
|
@ -1,26 +0,0 @@
|
||||||
Minetest 0.4 mod: stairs
|
|
||||||
=========================
|
|
||||||
|
|
||||||
License of source code:
|
|
||||||
-----------------------
|
|
||||||
Copyright (C) 2011-2012 Kahrl <kahrl@gmx.net>
|
|
||||||
Copyright (C) 2011-2012 celeron55, Perttu Ahola <celeron55@gmail.com>
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
http://www.gnu.org/licenses/lgpl-2.1.html
|
|
||||||
|
|
||||||
License of media (textures and sounds)
|
|
||||||
--------------------------------------
|
|
||||||
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
|
|
||||||
http://creativecommons.org/licenses/by-sa/3.0/
|
|
||||||
|
|
||||||
Authors of media files
|
|
||||||
-----------------------
|
|
||||||
Everything not listed in here:
|
|
||||||
Copyright (C) 2010-2012 celeron55, Perttu Ahola <celeron55@gmail.com>
|
|
||||||
|
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
default
|
|
|
@ -1,319 +0,0 @@
|
||||||
-- Minetest 0.4 mod: stairs
|
|
||||||
-- See README.txt for licensing and other information.
|
|
||||||
|
|
||||||
stairs = {}
|
|
||||||
|
|
||||||
-- Node will be called stairs:stair_<subname>
|
|
||||||
function stairs.register_stair(subname, recipeitem, groups, images, description, sounds)
|
|
||||||
minetest.register_node(":stairs:stair_" .. subname, {
|
|
||||||
description = description,
|
|
||||||
drawtype = "mesh",
|
|
||||||
mesh = "stairs_stair.obj",
|
|
||||||
tiles = images,
|
|
||||||
paramtype = "light",
|
|
||||||
paramtype2 = "facedir",
|
|
||||||
is_ground_content = false,
|
|
||||||
groups = groups,
|
|
||||||
sounds = sounds,
|
|
||||||
selection_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = {
|
|
||||||
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
|
|
||||||
{-0.5, 0, 0, 0.5, 0.5, 0.5},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
collision_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = {
|
|
||||||
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
|
|
||||||
{-0.5, 0, 0, 0.5, 0.5, 0.5},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
on_place = function(itemstack, placer, pointed_thing)
|
|
||||||
if pointed_thing.type ~= "node" then
|
|
||||||
return itemstack
|
|
||||||
end
|
|
||||||
|
|
||||||
local p0 = pointed_thing.under
|
|
||||||
local p1 = pointed_thing.above
|
|
||||||
local param2 = 0
|
|
||||||
|
|
||||||
local placer_pos = placer:getpos()
|
|
||||||
if placer_pos then
|
|
||||||
local dir = {
|
|
||||||
x = p1.x - placer_pos.x,
|
|
||||||
y = p1.y - placer_pos.y,
|
|
||||||
z = p1.z - placer_pos.z
|
|
||||||
}
|
|
||||||
param2 = minetest.dir_to_facedir(dir)
|
|
||||||
end
|
|
||||||
|
|
||||||
if p0.y-1 == p1.y then
|
|
||||||
param2 = param2 + 20
|
|
||||||
if param2 == 21 then
|
|
||||||
param2 = 23
|
|
||||||
elseif param2 == 23 then
|
|
||||||
param2 = 21
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return minetest.item_place(itemstack, placer, pointed_thing, param2)
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
||||||
-- for replace ABM
|
|
||||||
minetest.register_node(":stairs:stair_" .. subname.."upside_down", {
|
|
||||||
replace_name = "stairs:stair_" .. subname,
|
|
||||||
groups = {slabs_replace=1},
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
output = 'stairs:stair_' .. subname .. ' 6',
|
|
||||||
recipe = {
|
|
||||||
{recipeitem, "", ""},
|
|
||||||
{recipeitem, recipeitem, ""},
|
|
||||||
{recipeitem, recipeitem, recipeitem},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
-- Flipped recipe for the silly minecrafters
|
|
||||||
minetest.register_craft({
|
|
||||||
output = 'stairs:stair_' .. subname .. ' 6',
|
|
||||||
recipe = {
|
|
||||||
{"", "", recipeitem},
|
|
||||||
{"", recipeitem, recipeitem},
|
|
||||||
{recipeitem, recipeitem, recipeitem},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Node will be called stairs:slab_<subname>
|
|
||||||
function stairs.register_slab(subname, recipeitem, groups, images, description, sounds)
|
|
||||||
minetest.register_node(":stairs:slab_" .. subname, {
|
|
||||||
description = description,
|
|
||||||
drawtype = "nodebox",
|
|
||||||
tiles = images,
|
|
||||||
paramtype = "light",
|
|
||||||
paramtype2 = "facedir",
|
|
||||||
is_ground_content = false,
|
|
||||||
groups = groups,
|
|
||||||
sounds = sounds,
|
|
||||||
node_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
|
|
||||||
},
|
|
||||||
on_place = function(itemstack, placer, pointed_thing)
|
|
||||||
if pointed_thing.type ~= "node" then
|
|
||||||
return itemstack
|
|
||||||
end
|
|
||||||
|
|
||||||
-- If it's being placed on an another similar one, replace it with
|
|
||||||
-- a full block
|
|
||||||
local slabpos = nil
|
|
||||||
local slabnode = nil
|
|
||||||
local p0 = pointed_thing.under
|
|
||||||
local p1 = pointed_thing.above
|
|
||||||
local n0 = minetest.get_node(p0)
|
|
||||||
local n1 = minetest.get_node(p1)
|
|
||||||
local param2 = 0
|
|
||||||
|
|
||||||
local n0_is_upside_down = (n0.name == "stairs:slab_" .. subname and
|
|
||||||
n0.param2 >= 20)
|
|
||||||
|
|
||||||
if n0.name == "stairs:slab_" .. subname and not n0_is_upside_down and p0.y+1 == p1.y then
|
|
||||||
slabpos = p0
|
|
||||||
slabnode = n0
|
|
||||||
elseif n1.name == "stairs:slab_" .. subname then
|
|
||||||
slabpos = p1
|
|
||||||
slabnode = n1
|
|
||||||
end
|
|
||||||
if slabpos then
|
|
||||||
-- Remove the slab at slabpos
|
|
||||||
minetest.remove_node(slabpos)
|
|
||||||
-- Make a fake stack of a single item and try to place it
|
|
||||||
local fakestack = ItemStack(recipeitem)
|
|
||||||
fakestack:set_count(itemstack:get_count())
|
|
||||||
|
|
||||||
pointed_thing.above = slabpos
|
|
||||||
local success
|
|
||||||
fakestack, success = minetest.item_place(fakestack, placer, pointed_thing)
|
|
||||||
-- If the item was taken from the fake stack, decrement original
|
|
||||||
if success then
|
|
||||||
itemstack:set_count(fakestack:get_count())
|
|
||||||
-- Else put old node back
|
|
||||||
else
|
|
||||||
minetest.set_node(slabpos, slabnode)
|
|
||||||
end
|
|
||||||
return itemstack
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Upside down slabs
|
|
||||||
if p0.y-1 == p1.y then
|
|
||||||
-- Turn into full block if pointing at a existing slab
|
|
||||||
if n0_is_upside_down then
|
|
||||||
-- Remove the slab at the position of the slab
|
|
||||||
minetest.remove_node(p0)
|
|
||||||
-- Make a fake stack of a single item and try to place it
|
|
||||||
local fakestack = ItemStack(recipeitem)
|
|
||||||
fakestack:set_count(itemstack:get_count())
|
|
||||||
|
|
||||||
pointed_thing.above = p0
|
|
||||||
local success
|
|
||||||
fakestack, success = minetest.item_place(fakestack, placer, pointed_thing)
|
|
||||||
-- If the item was taken from the fake stack, decrement original
|
|
||||||
if success then
|
|
||||||
itemstack:set_count(fakestack:get_count())
|
|
||||||
-- Else put old node back
|
|
||||||
else
|
|
||||||
minetest.set_node(p0, n0)
|
|
||||||
end
|
|
||||||
return itemstack
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Place upside down slab
|
|
||||||
param2 = 20
|
|
||||||
end
|
|
||||||
|
|
||||||
-- If pointing at the side of a upside down slab
|
|
||||||
if n0_is_upside_down and p0.y+1 ~= p1.y then
|
|
||||||
param2 = 20
|
|
||||||
end
|
|
||||||
|
|
||||||
return minetest.item_place(itemstack, placer, pointed_thing, param2)
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
||||||
-- for replace ABM
|
|
||||||
minetest.register_node(":stairs:slab_" .. subname.."upside_down", {
|
|
||||||
replace_name = "stairs:slab_"..subname,
|
|
||||||
groups = {slabs_replace=1},
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
output = 'stairs:slab_' .. subname .. ' 6',
|
|
||||||
recipe = {
|
|
||||||
{recipeitem, recipeitem, recipeitem},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Replace old "upside_down" nodes with new param2 versions
|
|
||||||
minetest.register_abm({
|
|
||||||
nodenames = {"group:slabs_replace"},
|
|
||||||
interval = 1,
|
|
||||||
chance = 1,
|
|
||||||
action = function(pos, node)
|
|
||||||
node.name = minetest.registered_nodes[node.name].replace_name
|
|
||||||
node.param2 = node.param2 + 20
|
|
||||||
if node.param2 == 21 then
|
|
||||||
node.param2 = 23
|
|
||||||
elseif node.param2 == 23 then
|
|
||||||
node.param2 = 21
|
|
||||||
end
|
|
||||||
minetest.set_node(pos, node)
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
||||||
-- Nodes will be called stairs:{stair,slab}_<subname>
|
|
||||||
function stairs.register_stair_and_slab(subname, recipeitem, groups, images, desc_stair, desc_slab, sounds)
|
|
||||||
stairs.register_stair(subname, recipeitem, groups, images, desc_stair, sounds)
|
|
||||||
stairs.register_slab(subname, recipeitem, groups, images, desc_slab, sounds)
|
|
||||||
end
|
|
||||||
|
|
||||||
stairs.register_stair_and_slab("wood", "default:wood",
|
|
||||||
{snappy=2,choppy=2,oddly_breakable_by_hand=2,flammable=3},
|
|
||||||
{"default_wood.png"},
|
|
||||||
"Wooden Stair",
|
|
||||||
"Wooden Slab",
|
|
||||||
default.node_sound_wood_defaults())
|
|
||||||
|
|
||||||
stairs.register_stair_and_slab("stone", "default:stone",
|
|
||||||
{cracky=3},
|
|
||||||
{"default_stone.png"},
|
|
||||||
"Stone Stair",
|
|
||||||
"Stone Slab",
|
|
||||||
default.node_sound_stone_defaults())
|
|
||||||
|
|
||||||
stairs.register_stair_and_slab("cobble", "default:cobble",
|
|
||||||
{cracky=3},
|
|
||||||
{"default_cobble.png"},
|
|
||||||
"Cobblestone Stair",
|
|
||||||
"Cobblestone Slab",
|
|
||||||
default.node_sound_stone_defaults())
|
|
||||||
|
|
||||||
stairs.register_stair_and_slab("desert_stone", "default:desert_stone",
|
|
||||||
{cracky=3},
|
|
||||||
{"default_desert_stone.png"},
|
|
||||||
"Desertstone Stair",
|
|
||||||
"Desertstone Slab",
|
|
||||||
default.node_sound_stone_defaults())
|
|
||||||
|
|
||||||
stairs.register_stair_and_slab("desert_cobble", "default:desert_cobble",
|
|
||||||
{cracky=3},
|
|
||||||
{"default_desert_cobble.png"},
|
|
||||||
"Desert Cobblestone Stair",
|
|
||||||
"Desert Cobblestone Slab",
|
|
||||||
default.node_sound_stone_defaults())
|
|
||||||
|
|
||||||
stairs.register_stair_and_slab("desert_stonebrick", "default:desert_stonebrick",
|
|
||||||
{cracky=3},
|
|
||||||
{"default_desert_stone_brick.png"},
|
|
||||||
"Desert Stone Brick Stair",
|
|
||||||
"Desert Stone Brick Slab",
|
|
||||||
default.node_sound_stone_defaults())
|
|
||||||
|
|
||||||
stairs.register_stair_and_slab("brick", "default:brick",
|
|
||||||
{cracky=3},
|
|
||||||
{"default_brick.png"},
|
|
||||||
"Brick Stair",
|
|
||||||
"Brick Slab",
|
|
||||||
default.node_sound_stone_defaults())
|
|
||||||
|
|
||||||
stairs.register_stair_and_slab("sandstone", "default:sandstone",
|
|
||||||
{crumbly=2,cracky=2},
|
|
||||||
{"default_sandstone.png"},
|
|
||||||
"Sandstone Stair",
|
|
||||||
"Sandstone Slab",
|
|
||||||
default.node_sound_stone_defaults())
|
|
||||||
|
|
||||||
stairs.register_stair_and_slab("sandstonebrick", "default:sandstonebrick",
|
|
||||||
{crumbly=2,cracky=2},
|
|
||||||
{"default_sandstone_brick.png"},
|
|
||||||
"Sandstone Brick Stair",
|
|
||||||
"Sandstone Brick Slab",
|
|
||||||
default.node_sound_stone_defaults())
|
|
||||||
|
|
||||||
stairs.register_stair_and_slab("junglewood", "default:junglewood",
|
|
||||||
{snappy=2,choppy=2,oddly_breakable_by_hand=2,flammable=3},
|
|
||||||
{"default_junglewood.png"},
|
|
||||||
"Junglewood Stair",
|
|
||||||
"Junglewood Slab",
|
|
||||||
default.node_sound_wood_defaults())
|
|
||||||
|
|
||||||
stairs.register_stair_and_slab("stonebrick", "default:stonebrick",
|
|
||||||
{cracky=3},
|
|
||||||
{"default_stone_brick.png"},
|
|
||||||
"Stone Brick Stair",
|
|
||||||
"Stone Brick Slab",
|
|
||||||
default.node_sound_stone_defaults())
|
|
||||||
|
|
||||||
stairs.register_stair_and_slab("pinewood", "default:pinewood",
|
|
||||||
{snappy=2,choppy=2,oddly_breakable_by_hand=2,flammable=3},
|
|
||||||
{"default_pinewood.png"},
|
|
||||||
"Pinewood Stair",
|
|
||||||
"Pinewood Slab",
|
|
||||||
default.node_sound_wood_defaults())
|
|
||||||
|
|
||||||
stairs.register_stair_and_slab("obsidian", "default:obsidian",
|
|
||||||
{cracky=1,level=2},
|
|
||||||
{"default_obsidian.png"},
|
|
||||||
"Obsidian Stair",
|
|
||||||
"Obsidian Slab",
|
|
||||||
default.node_sound_stone_defaults())
|
|
||||||
|
|
||||||
stairs.register_stair_and_slab("obsidianbrick", "default:obsidianbrick",
|
|
||||||
{cracky=1,level=2},
|
|
||||||
{"default_obsidian_brick.png"},
|
|
||||||
"Obsidian Brick Stair",
|
|
||||||
"Obsidian Brick Slab",
|
|
||||||
default.node_sound_stone_defaults())
|
|
|
@ -1,43 +0,0 @@
|
||||||
v -.5 0 -.5
|
|
||||||
v -.5 -.5 -.5
|
|
||||||
v -.5 0 0
|
|
||||||
v .5 0 0
|
|
||||||
v .5 -.5 -.5
|
|
||||||
v .5 0 -.5
|
|
||||||
v -.5 -.5 .5
|
|
||||||
v .5 -.5 .5
|
|
||||||
v -.5 .5 0
|
|
||||||
v .5 .5 0
|
|
||||||
v -.5 .5 .5
|
|
||||||
v .5 .5 .5
|
|
||||||
vt 0 .5
|
|
||||||
vt 0 0
|
|
||||||
vt .5 .5
|
|
||||||
vt 1 0
|
|
||||||
vt 1 .5
|
|
||||||
vt 1 1
|
|
||||||
vt 0 1
|
|
||||||
vt .5 1
|
|
||||||
vt 1 0
|
|
||||||
vt 1 1
|
|
||||||
vt 0 1
|
|
||||||
vt 0 0
|
|
||||||
vn -1 0 0
|
|
||||||
vn 1 0 0
|
|
||||||
vn 0 0 -1
|
|
||||||
vn 0 -1 0
|
|
||||||
vn 0 1 0
|
|
||||||
vn 0 0 1
|
|
||||||
s off
|
|
||||||
f 1/1/1 2/2/1 3/3/1
|
|
||||||
f 4/3/2 5/4/2 6/5/2
|
|
||||||
f 2/4/3 1/5/3 6/1/3 5/2/3
|
|
||||||
f 7/4/4 2/6/4 5/7/4 8/2/4
|
|
||||||
f 6/2/5 1/4/5 3/5/5 4/1/5
|
|
||||||
f 3/5/3 9/6/3 10/7/3 4/1/3
|
|
||||||
f 11/6/5 12/7/5 10/1/5 9/5/5
|
|
||||||
f 4/3/2 10/8/2 12/7/2
|
|
||||||
f 8/9/6 12/10/6 11/11/6 7/12/6
|
|
||||||
f 3/3/1 11/6/1 9/8/1
|
|
||||||
f 2/2/1 7/4/1 11/6/1
|
|
||||||
f 5/4/2 12/7/2 8/2/2
|
|
|
@ -1,36 +0,0 @@
|
||||||
=== TNT mod for Minetest ===
|
|
||||||
by PilzAdam and ShadowNinja
|
|
||||||
|
|
||||||
Introduction:
|
|
||||||
This mod adds TNT to Minetest. TNT is a tool to help the player
|
|
||||||
in mining.
|
|
||||||
|
|
||||||
How to use the mod:
|
|
||||||
Craft gunpowder by placing coal and gravel in the crafting area. The
|
|
||||||
gunpowder can be used to craft TNT or as fuze for TNT. To craft TNT
|
|
||||||
surround gunpowder with 4 wood in a + shape.
|
|
||||||
There are different ways to blow up TNT:
|
|
||||||
1. Hit it with a torch.
|
|
||||||
2. Hit a gunpowder fuze that leads to a TNT block with a torch.
|
|
||||||
3. Activate it with mesecons (fastest way)
|
|
||||||
Be aware of the damage radius of 7 blocks!
|
|
||||||
|
|
||||||
License:
|
|
||||||
WTFPL (see below)
|
|
||||||
|
|
||||||
See also:
|
|
||||||
http://minetest.net/
|
|
||||||
|
|
||||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
|
||||||
Version 2, December 2004
|
|
||||||
|
|
||||||
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
|
|
||||||
|
|
||||||
Everyone is permitted to copy and distribute verbatim or modified
|
|
||||||
copies of this license document, and changing it is allowed as long
|
|
||||||
as the name is changed.
|
|
||||||
|
|
||||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. You just DO WHAT THE FUCK YOU WANT TO.
|
|
|
@ -1,3 +0,0 @@
|
||||||
default
|
|
||||||
fire
|
|
||||||
|
|
|
@ -1,390 +0,0 @@
|
||||||
|
|
||||||
-- Default to enabled in singleplayer and disabled in multiplayer
|
|
||||||
local singleplayer = minetest.is_singleplayer()
|
|
||||||
local setting = minetest.setting_getbool("enable_tnt")
|
|
||||||
if (not singleplayer and setting ~= true) or
|
|
||||||
(singleplayer and setting == false) then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
-- loss probabilities array (one in X will be lost)
|
|
||||||
local loss_prob = {}
|
|
||||||
|
|
||||||
loss_prob["default:cobble"] = 3
|
|
||||||
loss_prob["default:dirt"] = 4
|
|
||||||
|
|
||||||
local radius = tonumber(minetest.setting_get("tnt_radius") or 3)
|
|
||||||
|
|
||||||
-- Fill a list with data for content IDs, after all nodes are registered
|
|
||||||
local cid_data = {}
|
|
||||||
minetest.after(0, function()
|
|
||||||
for name, def in pairs(minetest.registered_nodes) do
|
|
||||||
cid_data[minetest.get_content_id(name)] = {
|
|
||||||
name = name,
|
|
||||||
drops = def.drops,
|
|
||||||
flammable = def.groups.flammable,
|
|
||||||
on_blast = def.on_blast,
|
|
||||||
}
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
local function rand_pos(center, pos, radius)
|
|
||||||
pos.x = center.x + math.random(-radius, radius)
|
|
||||||
pos.z = center.z + math.random(-radius, radius)
|
|
||||||
end
|
|
||||||
|
|
||||||
local function eject_drops(drops, pos, radius)
|
|
||||||
local drop_pos = vector.new(pos)
|
|
||||||
for _, item in pairs(drops) do
|
|
||||||
local count = item:get_count()
|
|
||||||
local max = item:get_stack_max()
|
|
||||||
if count > max then
|
|
||||||
item:set_count(max)
|
|
||||||
end
|
|
||||||
while count > 0 do
|
|
||||||
if count < max then
|
|
||||||
item:set_count(count)
|
|
||||||
end
|
|
||||||
rand_pos(pos, drop_pos, radius)
|
|
||||||
local obj = minetest.add_item(drop_pos, item)
|
|
||||||
if obj then
|
|
||||||
obj:get_luaentity().collect = true
|
|
||||||
obj:setacceleration({x=0, y=-10, z=0})
|
|
||||||
obj:setvelocity({x=math.random(-3, 3), y=10,
|
|
||||||
z=math.random(-3, 3)})
|
|
||||||
end
|
|
||||||
count = count - max
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function add_drop(drops, item)
|
|
||||||
item = ItemStack(item)
|
|
||||||
local name = item:get_name()
|
|
||||||
if loss_prob[name] ~= nil and math.random(1, loss_prob[name]) == 1 then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local drop = drops[name]
|
|
||||||
if drop == nil then
|
|
||||||
drops[name] = item
|
|
||||||
else
|
|
||||||
drop:set_count(drop:get_count() + item:get_count())
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local fire_node = {name="fire:basic_flame"}
|
|
||||||
|
|
||||||
local function destroy(drops, pos, cid)
|
|
||||||
if minetest.is_protected(pos, "") then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
local def = cid_data[cid]
|
|
||||||
if def and def.on_blast then
|
|
||||||
def.on_blast(vector.new(pos), 1)
|
|
||||||
return
|
|
||||||
end
|
|
||||||
if def and def.flammable then
|
|
||||||
minetest.set_node(pos, fire_node)
|
|
||||||
else
|
|
||||||
minetest.remove_node(pos)
|
|
||||||
if def then
|
|
||||||
local node_drops = minetest.get_node_drops(def.name, "")
|
|
||||||
for _, item in ipairs(node_drops) do
|
|
||||||
add_drop(drops, item)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
local function calc_velocity(pos1, pos2, old_vel, power)
|
|
||||||
local vel = vector.direction(pos1, pos2)
|
|
||||||
vel = vector.normalize(vel)
|
|
||||||
vel = vector.multiply(vel, power)
|
|
||||||
|
|
||||||
-- Divide by distance
|
|
||||||
local dist = vector.distance(pos1, pos2)
|
|
||||||
dist = math.max(dist, 1)
|
|
||||||
vel = vector.divide(vel, dist)
|
|
||||||
|
|
||||||
-- Add old velocity
|
|
||||||
vel = vector.add(vel, old_vel)
|
|
||||||
return vel
|
|
||||||
end
|
|
||||||
|
|
||||||
local function entity_physics(pos, radius)
|
|
||||||
-- Make the damage radius larger than the destruction radius
|
|
||||||
radius = radius * 2
|
|
||||||
local objs = minetest.get_objects_inside_radius(pos, radius)
|
|
||||||
for _, obj in pairs(objs) do
|
|
||||||
local obj_pos = obj:getpos()
|
|
||||||
local obj_vel = obj:getvelocity()
|
|
||||||
local dist = math.max(1, vector.distance(pos, obj_pos))
|
|
||||||
|
|
||||||
if obj_vel ~= nil then
|
|
||||||
obj:setvelocity(calc_velocity(pos, obj_pos,
|
|
||||||
obj_vel, radius * 10))
|
|
||||||
end
|
|
||||||
|
|
||||||
local damage = (4 / dist) * radius
|
|
||||||
obj:set_hp(obj:get_hp() - damage)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function add_effects(pos, radius)
|
|
||||||
minetest.add_particlespawner({
|
|
||||||
amount = 128,
|
|
||||||
time = 1,
|
|
||||||
minpos = vector.subtract(pos, radius / 2),
|
|
||||||
maxpos = vector.add(pos, radius / 2),
|
|
||||||
minvel = {x=-20, y=-20, z=-20},
|
|
||||||
maxvel = {x=20, y=20, z=20},
|
|
||||||
minacc = vector.new(),
|
|
||||||
maxacc = vector.new(),
|
|
||||||
minexptime = 1,
|
|
||||||
maxexptime = 3,
|
|
||||||
minsize = 8,
|
|
||||||
maxsize = 16,
|
|
||||||
texture = "tnt_smoke.png",
|
|
||||||
})
|
|
||||||
end
|
|
||||||
|
|
||||||
local function burn(pos)
|
|
||||||
local name = minetest.get_node(pos).name
|
|
||||||
if name == "tnt:tnt" then
|
|
||||||
minetest.sound_play("tnt_ignite", {pos=pos})
|
|
||||||
minetest.set_node(pos, {name="tnt:tnt_burning"})
|
|
||||||
minetest.get_node_timer(pos):start(1)
|
|
||||||
elseif name == "tnt:gunpowder" then
|
|
||||||
minetest.sound_play("tnt_gunpowder_burning", {pos=pos, gain=2})
|
|
||||||
minetest.set_node(pos, {name="tnt:gunpowder_burning"})
|
|
||||||
minetest.get_node_timer(pos):start(1)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function explode(pos, radius)
|
|
||||||
local pos = vector.round(pos)
|
|
||||||
local vm = VoxelManip()
|
|
||||||
local pr = PseudoRandom(os.time())
|
|
||||||
local p1 = vector.subtract(pos, radius)
|
|
||||||
local p2 = vector.add(pos, radius)
|
|
||||||
local minp, maxp = vm:read_from_map(p1, p2)
|
|
||||||
local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp})
|
|
||||||
local data = vm:get_data()
|
|
||||||
|
|
||||||
local drops = {}
|
|
||||||
local p = {}
|
|
||||||
|
|
||||||
local c_air = minetest.get_content_id("air")
|
|
||||||
|
|
||||||
for z = -radius, radius do
|
|
||||||
for y = -radius, radius do
|
|
||||||
local vi = a:index(pos.x + (-radius), pos.y + y, pos.z + z)
|
|
||||||
for x = -radius, radius do
|
|
||||||
if (x * x) + (y * y) + (z * z) <=
|
|
||||||
(radius * radius) + pr:next(-radius, radius) then
|
|
||||||
local cid = data[vi]
|
|
||||||
p.x = pos.x + x
|
|
||||||
p.y = pos.y + y
|
|
||||||
p.z = pos.z + z
|
|
||||||
if cid ~= c_air then
|
|
||||||
destroy(drops, p, cid)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
vi = vi + 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return drops
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
local function boom(pos)
|
|
||||||
minetest.sound_play("tnt_explode", {pos=pos, gain=1.5, max_hear_distance=2*64})
|
|
||||||
minetest.set_node(pos, {name="tnt:boom"})
|
|
||||||
minetest.get_node_timer(pos):start(0.5)
|
|
||||||
|
|
||||||
local drops = explode(pos, radius)
|
|
||||||
entity_physics(pos, radius)
|
|
||||||
eject_drops(drops, pos, radius)
|
|
||||||
add_effects(pos, radius)
|
|
||||||
end
|
|
||||||
|
|
||||||
minetest.register_node("tnt:tnt", {
|
|
||||||
description = "TNT",
|
|
||||||
tiles = {"tnt_top.png", "tnt_bottom.png", "tnt_side.png"},
|
|
||||||
is_ground_content = false,
|
|
||||||
groups = {dig_immediate=2, mesecon=2},
|
|
||||||
sounds = default.node_sound_wood_defaults(),
|
|
||||||
on_punch = function(pos, node, puncher)
|
|
||||||
if puncher:get_wielded_item():get_name() == "default:torch" then
|
|
||||||
minetest.sound_play("tnt_ignite", {pos=pos})
|
|
||||||
minetest.set_node(pos, {name="tnt:tnt_burning"})
|
|
||||||
minetest.get_node_timer(pos):start(4)
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
on_blast = function(pos, intensity)
|
|
||||||
burn(pos)
|
|
||||||
end,
|
|
||||||
mesecons = {effector = {action_on = boom}},
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_node("tnt:tnt_burning", {
|
|
||||||
tiles = {
|
|
||||||
{
|
|
||||||
name = "tnt_top_burning_animated.png",
|
|
||||||
animation = {
|
|
||||||
type = "vertical_frames",
|
|
||||||
aspect_w = 16,
|
|
||||||
aspect_h = 16,
|
|
||||||
length = 1,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"tnt_bottom.png", "tnt_side.png"},
|
|
||||||
light_source = 5,
|
|
||||||
drop = "",
|
|
||||||
sounds = default.node_sound_wood_defaults(),
|
|
||||||
on_timer = boom,
|
|
||||||
-- unaffected by explosions
|
|
||||||
on_blast = function() end,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_node("tnt:boom", {
|
|
||||||
drawtype = "plantlike",
|
|
||||||
tiles = {"tnt_boom.png"},
|
|
||||||
light_source = default.LIGHT_MAX,
|
|
||||||
walkable = false,
|
|
||||||
drop = "",
|
|
||||||
groups = {dig_immediate=3},
|
|
||||||
on_timer = function(pos, elapsed)
|
|
||||||
minetest.remove_node(pos)
|
|
||||||
end,
|
|
||||||
-- unaffected by explosions
|
|
||||||
on_blast = function() end,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_node("tnt:gunpowder", {
|
|
||||||
description = "Gun Powder",
|
|
||||||
drawtype = "raillike",
|
|
||||||
paramtype = "light",
|
|
||||||
is_ground_content = false,
|
|
||||||
sunlight_propagates = true,
|
|
||||||
walkable = false,
|
|
||||||
tiles = {"tnt_gunpowder_straight.png", "tnt_gunpowder_curved.png", "tnt_gunpowder_t_junction.png", "tnt_gunpowder_crossing.png"},
|
|
||||||
inventory_image = "tnt_gunpowder_inventory.png",
|
|
||||||
wield_image = "tnt_gunpowder_inventory.png",
|
|
||||||
selection_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
|
|
||||||
},
|
|
||||||
groups = {dig_immediate=2,attached_node=1,connect_to_raillike=minetest.raillike_group("gunpowder")},
|
|
||||||
sounds = default.node_sound_leaves_defaults(),
|
|
||||||
|
|
||||||
on_punch = function(pos, node, puncher)
|
|
||||||
if puncher:get_wielded_item():get_name() == "default:torch" then
|
|
||||||
burn(pos)
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
on_blast = function(pos, intensity)
|
|
||||||
burn(pos)
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_node("tnt:gunpowder_burning", {
|
|
||||||
drawtype = "raillike",
|
|
||||||
paramtype = "light",
|
|
||||||
sunlight_propagates = true,
|
|
||||||
walkable = false,
|
|
||||||
light_source = 5,
|
|
||||||
tiles = {{
|
|
||||||
name = "tnt_gunpowder_burning_straight_animated.png",
|
|
||||||
animation = {
|
|
||||||
type = "vertical_frames",
|
|
||||||
aspect_w = 16,
|
|
||||||
aspect_h = 16,
|
|
||||||
length = 1,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name = "tnt_gunpowder_burning_curved_animated.png",
|
|
||||||
animation = {
|
|
||||||
type = "vertical_frames",
|
|
||||||
aspect_w = 16,
|
|
||||||
aspect_h = 16,
|
|
||||||
length = 1,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name = "tnt_gunpowder_burning_t_junction_animated.png",
|
|
||||||
animation = {
|
|
||||||
type = "vertical_frames",
|
|
||||||
aspect_w = 16,
|
|
||||||
aspect_h = 16,
|
|
||||||
length = 1,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name = "tnt_gunpowder_burning_crossing_animated.png",
|
|
||||||
animation = {
|
|
||||||
type = "vertical_frames",
|
|
||||||
aspect_w = 16,
|
|
||||||
aspect_h = 16,
|
|
||||||
length = 1,
|
|
||||||
}
|
|
||||||
}},
|
|
||||||
selection_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
|
|
||||||
},
|
|
||||||
drop = "",
|
|
||||||
groups = {dig_immediate=2,attached_node=1,connect_to_raillike=minetest.raillike_group("gunpowder")},
|
|
||||||
sounds = default.node_sound_leaves_defaults(),
|
|
||||||
on_timer = function(pos, elapsed)
|
|
||||||
for dx = -1, 1 do
|
|
||||||
for dz = -1, 1 do
|
|
||||||
for dy = -1, 1 do
|
|
||||||
if not (dx == 0 and dz == 0) then
|
|
||||||
burn({
|
|
||||||
x = pos.x + dx,
|
|
||||||
y = pos.y + dy,
|
|
||||||
z = pos.z + dz,
|
|
||||||
})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
minetest.remove_node(pos)
|
|
||||||
end,
|
|
||||||
-- unaffected by explosions
|
|
||||||
on_blast = function() end,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_abm({
|
|
||||||
nodenames = {"tnt:tnt", "tnt:gunpowder"},
|
|
||||||
neighbors = {"fire:basic_flame", "default:lava_source", "default:lava_flowing"},
|
|
||||||
interval = 1,
|
|
||||||
chance = 1,
|
|
||||||
action = burn,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
output = "tnt:gunpowder",
|
|
||||||
type = "shapeless",
|
|
||||||
recipe = {"default:coal_lump", "default:gravel"}
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
output = "tnt:tnt",
|
|
||||||
recipe = {
|
|
||||||
{"", "group:wood", ""},
|
|
||||||
{"group:wood", "tnt:gunpowder", "group:wood"},
|
|
||||||
{"", "group:wood", ""}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
if minetest.setting_get("log_mods") then
|
|
||||||
minetest.debug("[TNT] Loaded!")
|
|
||||||
end
|
|
||||||
|
|
Before Width: | Height: | Size: 178 B |
Before Width: | Height: | Size: 99 B |
Before Width: | Height: | Size: 612 B |
Before Width: | Height: | Size: 432 B |
Before Width: | Height: | Size: 461 B |
Before Width: | Height: | Size: 672 B |
Before Width: | Height: | Size: 245 B |
Before Width: | Height: | Size: 268 B |
Before Width: | Height: | Size: 301 B |
Before Width: | Height: | Size: 225 B |
Before Width: | Height: | Size: 328 B |
Before Width: | Height: | Size: 128 B |
Before Width: | Height: | Size: 202 B |
Before Width: | Height: | Size: 148 B |
Before Width: | Height: | Size: 159 B |
Before Width: | Height: | Size: 238 B |