update todo list and server-hosting guide. remove previous git attributes from pryamids mod.
|
@ -1,10 +1,13 @@
|
|||
How to host a dedicated server.
|
||||
server hardware
|
||||
domain name or dynamic dns
|
||||
|
||||
hardware: dual core or greater. pi possible without dfcaverns and maybe without mobs.
|
||||
|
||||
network: domain name or dynamic dns service
|
||||
port forwards and firewalls
|
||||
operating system.
|
||||
how to install
|
||||
daemonize
|
||||
|
||||
administration fundamentals
|
||||
|
||||
|
||||
How to host a listen (local LAN) server.
|
||||
How to host a listen (local LAN) server.
|
|
@ -12,27 +12,27 @@ fridges aren't protected.
|
|||
################################## HIGHER PRIORITY ##################################
|
||||
change blueberry respawn rate
|
||||
Add more toolranks levels
|
||||
Make ovens comppatible with other food items.
|
||||
Make ovens compatible with other food items.
|
||||
After crops is implemented, rain ABM's can grow crops and grass, wash out footprints.
|
||||
Add weeds to crops (use nettles and ABM)
|
||||
Split mobs_creatures and create dfcaverns_mobs to be shared with FaceDeer's dfcaverns modpack.
|
||||
fire-imps do not fly in lava, they do not float.
|
||||
unknown items in lootchests underground.
|
||||
shift+click doesnt work on lootchests
|
||||
Clothes mod but add more variations and integrate with base skins and preview system.
|
||||
|
||||
Armor: add cosmetic slots vs actual slots to use with costumes and skins.
|
||||
"3d_armor" on death, armor peices have a chance of being completely destroyed.
|
||||
|
||||
################################## LOWER PRIORITY ##################################
|
||||
re-add leaves in the wind from piezo's repo.
|
||||
add steel sound to ingot piles when walking on it.
|
||||
why is there a steel bar *and* and steel rod?
|
||||
Change the "settlements" bell to be 2d of good quality.
|
||||
"3d_armor" on death, armor peices have a chance of being completely destroyed.
|
||||
converge papyrus stuff into a single papyrus stuff mod.
|
||||
"drinks" mod makes eating noise instead of sipping noise. (share sounds with "hbthirsty"?).
|
||||
"drinks" mod makes eating noise instead of sipping noise. (share sounds with "thirsty"?).
|
||||
lightning flash can happen in space, lower effect to just earth height.
|
||||
Laxative to make player poop (like in pooper mod)
|
||||
drawer upgrades
|
||||
burnable: chairs, benches, tables, chests, apple wood planks, etc..
|
||||
add doors with mesecons support to ts_furniture? (ethereal)
|
||||
|
||||
|
||||
################################## IDEAS ##################################
|
||||
|
|
|
@ -1,22 +0,0 @@
|
|||
# Auto detect text files and perform LF normalization
|
||||
* text=auto
|
||||
|
||||
# Custom for Visual Studio
|
||||
*.cs diff=csharp
|
||||
*.sln merge=union
|
||||
*.csproj merge=union
|
||||
*.vbproj merge=union
|
||||
*.fsproj merge=union
|
||||
*.dbproj merge=union
|
||||
|
||||
# Standard to msysgit
|
||||
*.doc diff=astextplain
|
||||
*.DOC diff=astextplain
|
||||
*.docx diff=astextplain
|
||||
*.DOCX diff=astextplain
|
||||
*.dot diff=astextplain
|
||||
*.DOT diff=astextplain
|
||||
*.pdf diff=astextplain
|
||||
*.PDF diff=astextplain
|
||||
*.rtf diff=astextplain
|
||||
*.RTF diff=astextplain
|
|
@ -1,215 +0,0 @@
|
|||
#################
|
||||
## Eclipse
|
||||
#################
|
||||
|
||||
*.pydevproject
|
||||
.project
|
||||
.metadata
|
||||
bin/
|
||||
tmp/
|
||||
*.tmp
|
||||
*.bak
|
||||
*.swp
|
||||
*~.nib
|
||||
local.properties
|
||||
.classpath
|
||||
.settings/
|
||||
.loadpath
|
||||
|
||||
# External tool builders
|
||||
.externalToolBuilders/
|
||||
|
||||
# Locally stored "Eclipse launch configurations"
|
||||
*.launch
|
||||
|
||||
# CDT-specific
|
||||
.cproject
|
||||
|
||||
# PDT-specific
|
||||
.buildpath
|
||||
|
||||
|
||||
#################
|
||||
## Visual Studio
|
||||
#################
|
||||
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
|
||||
# User-specific files
|
||||
*.suo
|
||||
*.user
|
||||
*.sln.docstates
|
||||
|
||||
# Build results
|
||||
|
||||
[Dd]ebug/
|
||||
[Rr]elease/
|
||||
x64/
|
||||
build/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
*_i.c
|
||||
*_p.c
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.tmp_proj
|
||||
*.log
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
.builds
|
||||
*.pidb
|
||||
*.log
|
||||
*.scc
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.cachefile
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
*.vspx
|
||||
|
||||
# Guidance Automation Toolkit
|
||||
*.gpState
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
*.dotCover
|
||||
|
||||
# NCrunch
|
||||
*.ncrunch*
|
||||
.*crunch*.local.xml
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress/
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish/
|
||||
|
||||
# Publish Web Output
|
||||
*.Publish.xml
|
||||
*.pubxml
|
||||
|
||||
# NuGet Packages Directory
|
||||
## TODO: If you have NuGet Package Restore enabled, uncomment the next line
|
||||
#packages/
|
||||
|
||||
# Windows Azure Build Output
|
||||
csx
|
||||
*.build.csdef
|
||||
|
||||
# Windows Store app package directory
|
||||
AppPackages/
|
||||
|
||||
# Others
|
||||
sql/
|
||||
*.Cache
|
||||
ClientBin/
|
||||
[Ss]tyle[Cc]op.*
|
||||
~$*
|
||||
*~
|
||||
*.dbmdl
|
||||
*.[Pp]ublish.xml
|
||||
*.pfx
|
||||
*.publishsettings
|
||||
|
||||
# RIA/Silverlight projects
|
||||
Generated_Code/
|
||||
|
||||
# Backup & report files from converting an old project file to a newer
|
||||
# Visual Studio version. Backup files are not needed, because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
UpgradeLog*.htm
|
||||
|
||||
# SQL Server files
|
||||
App_Data/*.mdf
|
||||
App_Data/*.ldf
|
||||
|
||||
#############
|
||||
## Windows detritus
|
||||
#############
|
||||
|
||||
# Windows image file caches
|
||||
Thumbs.db
|
||||
ehthumbs.db
|
||||
|
||||
# Folder config file
|
||||
Desktop.ini
|
||||
|
||||
# Recycle Bin used on file shares
|
||||
$RECYCLE.BIN/
|
||||
|
||||
# Mac crap
|
||||
.DS_Store
|
||||
|
||||
|
||||
#############
|
||||
## Python
|
||||
#############
|
||||
|
||||
*.py[co]
|
||||
|
||||
# Packages
|
||||
*.egg
|
||||
*.egg-info
|
||||
dist/
|
||||
build/
|
||||
eggs/
|
||||
parts/
|
||||
var/
|
||||
sdist/
|
||||
develop-eggs/
|
||||
.installed.cfg
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
|
||||
# Unit test / coverage reports
|
||||
.coverage
|
||||
.tox
|
||||
|
||||
#Translations
|
||||
*.mo
|
||||
|
||||
#Mr Developer
|
||||
.mr.developer.cfg
|
|
@ -0,0 +1,8 @@
|
|||
## Generic ignorable patterns and files
|
||||
*~
|
||||
.*.swp
|
||||
*bak*
|
||||
tags
|
||||
*.vim
|
||||
clothing.conf
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
Clothing - Visible Player Clothing
|
||||
==================================
|
||||
|
||||
Source Code: Stuart Jones - LGPL v2.1
|
||||
|
||||
Wool Textures: Based on minetest_game wool - CC BY-SA 3.0
|
||||
|
||||
Other Textures: Stuart Jones - CC-BY-SA 3.0
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
Wool Clothing - Wool Clothing [WIP] [clothing]
|
||||
==============================================
|
||||
|
||||
Depends: multiskin
|
||||
|
||||
Recommends: sfinv, inventory_plus or unified_inventory (use only one)
|
||||
|
||||
Adds simple clothing that can be crafted from coloured wool using a loom.
|
||||
Requires the wool mod for craft registration.
|
||||
|
||||
Crafting
|
||||
--------
|
||||
|
||||
S = [group:stick]
|
||||
W = [default:pinewood]
|
||||
|
||||
+---+---+---+
|
||||
| S | W | S |
|
||||
+---+---+---+
|
||||
| S | W | S |
|
||||
+---+---+---+
|
||||
| W | W | W |
|
||||
+---+---+---+
|
||||
|
||||
Output = [clothing:loom]
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
|
||||
Craft registration can disabled by adding `clothing_enable_craft = false` to
|
||||
your minetest.conf file.
|
|
@ -0,0 +1,101 @@
|
|||
clothing = {
|
||||
formspec = "size[8,8.5]"..
|
||||
default.gui_bg..
|
||||
default.gui_bg_img..
|
||||
default.gui_slots..
|
||||
"list[current_player;main;0,4.7;8,1;]"..
|
||||
"list[current_player;main;0,5.85;8,3;8]"..
|
||||
default.get_hotbar_bg(0,4.7),
|
||||
registered_callbacks = {
|
||||
on_update = {},
|
||||
on_equip = {},
|
||||
on_unequip = {},
|
||||
},
|
||||
player_textures = {},
|
||||
}
|
||||
|
||||
-- CLothing callbacks
|
||||
|
||||
clothing.register_on_update = function(self, func)
|
||||
if type(func) == "function" then
|
||||
table.insert(self.registered_callbacks.on_update, func)
|
||||
end
|
||||
end
|
||||
|
||||
clothing.register_on_equip = function(self, func)
|
||||
if type(func) == "function" then
|
||||
table.insert(self.registered_callbacks.on_equip, func)
|
||||
end
|
||||
end
|
||||
|
||||
clothing.register_on_unequip = function(self, func)
|
||||
if type(func) == "function" then
|
||||
table.insert(self.registered_callbacks.on_unequip, func)
|
||||
end
|
||||
end
|
||||
|
||||
clothing.run_callbacks = function(self, callback, player, index, stack)
|
||||
if stack then
|
||||
local def = stack:get_definition() or {}
|
||||
if type(def[callback]) == "function" then
|
||||
def[callback](player, index, stack)
|
||||
end
|
||||
end
|
||||
local callbacks = self.registered_callbacks[callback]
|
||||
if callbacks then
|
||||
for _, func in pairs(callbacks) do
|
||||
func(player, index, stack)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
clothing.set_player_clothing = function(self, player)
|
||||
if not player then
|
||||
return
|
||||
end
|
||||
local name = player:get_player_name()
|
||||
|
||||
local layer = {
|
||||
clothing = {},
|
||||
cape = {},
|
||||
}
|
||||
|
||||
local clothing_meta = player:get_attribute("clothing:inventory")
|
||||
local clothes = clothing_meta and minetest.deserialize(clothing_meta) or {}
|
||||
|
||||
local capes = {}
|
||||
for i=1, 6 do
|
||||
local stack = ItemStack(clothes[i])
|
||||
if stack:get_count() == 1 then
|
||||
local def = stack:get_definition()
|
||||
if def.uv_image then
|
||||
if def.groups.clothing == 1 then
|
||||
table.insert(layer.clothing, def.uv_image)
|
||||
elseif def.groups.cape == 1 then
|
||||
table.insert(layer.cape, def.uv_image)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
local clothing_out = table.concat(layer.clothing, "^")
|
||||
local cape_out = table.concat(layer.cape, "^")
|
||||
if clothing_out == "" then
|
||||
clothing_out = "blank.png"
|
||||
end
|
||||
if cape_out == "" then
|
||||
cape_out = "blank.png"
|
||||
end
|
||||
if minetest.global_exists("multiskin") then
|
||||
local skin = multiskin.skins[name]
|
||||
if skin then
|
||||
skin.clothing = clothing_out
|
||||
skin.cape = cape_out
|
||||
multiskin.update_player_visuals(player)
|
||||
end
|
||||
else
|
||||
clothing.player_textures[name] = clothing.player_textures[name] or {}
|
||||
clothing.player_textures[name].clothing = clothing_out
|
||||
clothing.player_textures[name].cape = cape_out
|
||||
end
|
||||
self:run_callbacks("on_update", player)
|
||||
end
|
|
@ -0,0 +1,54 @@
|
|||
if minetest.settings:get_bool("clothing_enable_craft") == false or
|
||||
not minetest.get_modpath("wool") then
|
||||
return
|
||||
end
|
||||
local modpath = minetest.get_modpath(minetest.get_current_modname())
|
||||
|
||||
dofile(modpath.."/loom.lua")
|
||||
|
||||
local colors = {
|
||||
white = "FFFFFF",
|
||||
grey = "C0C0C0",
|
||||
black = "232323",
|
||||
red = "FF0000",
|
||||
yellow = "FFEE00",
|
||||
green = "32CD32",
|
||||
cyan = "00959D",
|
||||
blue = "003376",
|
||||
magenta = "D80481",
|
||||
orange = "E0601A",
|
||||
violet = "480080",
|
||||
brown = "391A00",
|
||||
pink = "FFA5A5",
|
||||
dark_grey = "696969",
|
||||
dark_green = "154F00",
|
||||
}
|
||||
|
||||
for color, hex in pairs(colors) do
|
||||
local desc = color:gsub("%a", string.upper, 1)
|
||||
desc = desc:gsub("_", " ")
|
||||
minetest.register_craftitem("clothing:hat_"..color, {
|
||||
description = desc.." Cotton Hat",
|
||||
inventory_image = "clothing_inv_hat.png^[multiply:#"..hex,
|
||||
uv_image = "(clothing_uv_hat.png^[multiply:#"..hex..")",
|
||||
groups = {clothing=1},
|
||||
})
|
||||
minetest.register_craftitem("clothing:shirt_"..color, {
|
||||
description = desc.." Cotton Shirt",
|
||||
inventory_image = "clothing_inv_shirt.png^[multiply:#"..hex,
|
||||
uv_image = "(clothing_uv_shirt.png^[multiply:#"..hex..")",
|
||||
groups = {clothing=1},
|
||||
})
|
||||
minetest.register_craftitem("clothing:pants_"..color, {
|
||||
description = desc.." Cotton Pants",
|
||||
inventory_image = "clothing_inv_pants.png^[multiply:#"..hex,
|
||||
uv_image = "(clothing_uv_pants.png^[multiply:#"..hex..")",
|
||||
groups = {clothing=1},
|
||||
})
|
||||
minetest.register_craftitem("clothing:cape_"..color, {
|
||||
description = desc.." Cotton Cape",
|
||||
inventory_image = "clothing_inv_cape.png^[multiply:#"..hex,
|
||||
uv_image = "(clothing_uv_cape.png^[multiply:#"..hex..")",
|
||||
groups = {cape=1},
|
||||
})
|
||||
end
|
|
@ -0,0 +1,6 @@
|
|||
multiskin?
|
||||
sfinv?
|
||||
creative?
|
||||
inventory_plus?
|
||||
unified_inventory?
|
||||
wool?
|
|
@ -0,0 +1,128 @@
|
|||
-- Get the path to the working directory.
|
||||
local modpath = minetest.get_modpath(minetest.get_current_modname())
|
||||
|
||||
-- Execute other modules.
|
||||
dofile(modpath.."/api.lua")
|
||||
dofile(modpath.."/clothing.lua")
|
||||
|
||||
-- sfinv detection and compatability.
|
||||
if minetest.get_modpath("sfinv") then
|
||||
clothing.inv_mod = "sfinv"
|
||||
sfinv.register_page("clothing:clothing", {
|
||||
title = "Clothing",
|
||||
get = function(self, player, context)
|
||||
local name = player:get_player_name()
|
||||
local formspec = clothing.formspec..
|
||||
"list[detached:"..name.."_clothing;clothing;0,0.5;2,3;]"..
|
||||
"listring[current_player;main]"..
|
||||
"listring[detached:"..name.."_clothing;clothing]"
|
||||
return sfinv.make_formspec(player, context,
|
||||
formspec, false)
|
||||
end
|
||||
})
|
||||
end
|
||||
|
||||
-- Get player data.
|
||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
local name = player:get_player_name()
|
||||
end)
|
||||
|
||||
local function is_clothing(item)
|
||||
return minetest.get_item_group(item, "clothing") > 0 or
|
||||
minetest.get_item_group(item, "cape") > 0
|
||||
end
|
||||
|
||||
local function save_clothing_metadata(player, clothing_inv)
|
||||
local player_inv = player:get_inventory()
|
||||
local is_empty = true
|
||||
local clothes = {}
|
||||
for i = 1, 6 do
|
||||
local stack = clothing_inv:get_stack("clothing", i)
|
||||
-- Move all non-clothes back to the player inventory
|
||||
if not stack:is_empty() and not is_clothing(stack:get_name()) then
|
||||
player_inv:add_item("main",
|
||||
clothing_inv:remove_item("clothing", stack))
|
||||
stack:clear()
|
||||
end
|
||||
if not stack:is_empty() then
|
||||
clothes[i] = stack:to_string()
|
||||
is_empty = false
|
||||
end
|
||||
end
|
||||
if is_empty then
|
||||
player:set_attribute("clothing:inventory", nil)
|
||||
else
|
||||
player:set_attribute("clothing:inventory",
|
||||
minetest.serialize(clothes))
|
||||
end
|
||||
end
|
||||
|
||||
local function load_clothing_metadata(player, clothing_inv)
|
||||
local player_inv = player:get_inventory()
|
||||
local clothing_meta = player:get_attribute("clothing:inventory")
|
||||
local clothes = clothing_meta and minetest.deserialize(clothing_meta) or {}
|
||||
local dirty_meta = false
|
||||
if not clothing_meta then
|
||||
-- Backwards compatiblity
|
||||
for i = 1, 6 do
|
||||
local stack = player_inv:get_stack("clothing", i)
|
||||
if not stack:is_empty() then
|
||||
clothes[i] = stack:to_string()
|
||||
dirty_meta = true
|
||||
end
|
||||
end
|
||||
end
|
||||
-- Fill detached slots
|
||||
clothing_inv:set_size("clothing", 6)
|
||||
for i = 1, 6 do
|
||||
clothing_inv:set_stack("clothing", i, clothes[i] or "")
|
||||
end
|
||||
|
||||
if dirty_meta then
|
||||
-- Requires detached inventory to be set up
|
||||
save_clothing_metadata(player, clothing_inv)
|
||||
end
|
||||
|
||||
-- Clean up deprecated garbage after saving
|
||||
player_inv:set_size("clothing", 0)
|
||||
end
|
||||
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
local name = player:get_player_name()
|
||||
local player_inv = player:get_inventory()
|
||||
local clothing_inv = minetest.create_detached_inventory(name.."_clothing",{
|
||||
on_put = function(inv, listname, index, stack, player)
|
||||
save_clothing_metadata(player, inv)
|
||||
clothing:run_callbacks("on_equip", player, index, stack)
|
||||
clothing:set_player_clothing(player)
|
||||
end,
|
||||
on_take = function(inv, listname, index, stack, player)
|
||||
save_clothing_metadata(player, inv)
|
||||
clothing:run_callbacks("on_unequip", player, index, stack)
|
||||
clothing:set_player_clothing(player)
|
||||
end,
|
||||
on_move = function(inv, from_list, from_index, to_list, to_index, count, player)
|
||||
save_clothing_metadata(player, inv)
|
||||
clothing:set_player_clothing(player)
|
||||
end,
|
||||
allow_put = function(inv, listname, index, stack, player)
|
||||
local item = stack:get_name()
|
||||
if is_clothing(item) then
|
||||
return 1
|
||||
end
|
||||
return 0
|
||||
end,
|
||||
allow_take = function(inv, listname, index, stack, player)
|
||||
return stack:get_count()
|
||||
end,
|
||||
allow_move = function(inv, from_list, from_index, to_list, to_index, count, player)
|
||||
return count
|
||||
end,
|
||||
}, name)
|
||||
|
||||
load_clothing_metadata(player, clothing_inv)
|
||||
minetest.after(1, function(name)
|
||||
-- Ensure the ObjectRef is valid after 1s
|
||||
clothing:set_player_clothing(minetest.get_player_by_name(name))
|
||||
end, name)
|
||||
end)
|
|
@ -0,0 +1,127 @@
|
|||
minetest.register_node("clothing:loom", {
|
||||
description = "Loom",
|
||||
tiles = {
|
||||
"clothing_loom_top.png",
|
||||
"clothing_loom_bottom.png",
|
||||
"clothing_loom_side2.png",
|
||||
"clothing_loom_side1.png",
|
||||
"clothing_loom_front.png",
|
||||
"clothing_loom_front.png",
|
||||
},
|
||||
drawtype = "nodebox",
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
groups = {choppy=2, oddly_breakable_by_hand=1},
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.125, -0.375, 0.5, 0.1875}, -- NodeBox1
|
||||
{0.375, -0.5, -0.125, 0.5, 0.5, 0.1875}, -- NodeBox3
|
||||
{-0.375, -0.5, -0.5, 0.375, -0.4375, 0.5}, -- NodeBox4
|
||||
{-0.5, 0, -0.125, 0.5, 0.0625, 0.1875}, -- NodeBox5
|
||||
{-0.5, 0.3125, 0.1875, 0.5, 0.5, 0.25}, -- NodeBox6
|
||||
{-0.5, 0.3125, -0.1875, 0.5, 0.5, -0.125}, -- NodeBox7
|
||||
{-0.375, -0.1875, -0.5, -0.3125, -0.125, 0.5}, -- NodeBox8
|
||||
{0.3125, -0.1875, -0.5, 0.375, -0.125, 0.5}, -- NodeBox9
|
||||
{-0.4375, -0.1875, -0.5, 0.4375, -0.125, -0.4375}, -- NodeBox10
|
||||
{-0.4375, -0.1875, 0.4375, 0.4375, -0.125, 0.5}, -- NodeBox11
|
||||
{-0.375, -0.5, 0.375, -0.3125, -0.125, 0.4375}, -- NodeBox12
|
||||
{0.3125, -0.5, 0.375, 0.375, -0.125, 0.4375}, -- NodeBox13
|
||||
{-0.375, -0.5, -0.4375, -0.3125, -0.125, -0.375}, -- NodeBox14
|
||||
{0.3125, -0.5, -0.4375, 0.375, -0.125, -0.375}, -- NodeBox15
|
||||
{-0.3125, -0.4375, -0.25, 0.3125, 0, 0.25}, -- NodeBox16
|
||||
}
|
||||
},
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5,-0.5,-0.5,0.5,0.5,0.5}
|
||||
},
|
||||
},
|
||||
after_place_node = function(pos, placer)
|
||||
local meta = minetest.env:get_meta(pos)
|
||||
meta:set_string("owner", (placer:get_player_name() or ""))
|
||||
meta:set_string("infotext", "Loom (owned by " .. (placer:get_player_name() or "") .. ")")
|
||||
end,
|
||||
can_dig = function(pos,player)
|
||||
local meta = minetest.env:get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
if not inv:is_empty("input") or not inv:is_empty("output") then
|
||||
return false
|
||||
end
|
||||
return true
|
||||
end,
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.env:get_meta(pos)
|
||||
meta:set_string("formspec", "invsize[10,11;]"..
|
||||
"background[-0.15,-0.25;10.40,11.75;clothing_loom_background.png]"..
|
||||
"list[current_name;input;7,2;1,1;]"..
|
||||
"list[current_name;output;7,4;1,1;]"..
|
||||
"label[7,1.5;Input Wool:]"..
|
||||
"label[7,3.5;Output:]"..
|
||||
"label[0,0;Clothing Loom:]"..
|
||||
"label[1.5,1.5;Hat]"..
|
||||
"item_image_button[1.5,2;1,1;clothing:hat_grey;hat; ]"..
|
||||
"label[4,1.5;Shirt]"..
|
||||
"item_image_button[4,2;1,1;clothing:shirt_grey;shirt; ]"..
|
||||
"label[1.5,3;Pants]"..
|
||||
"item_image_button[1.5,3.5;1,1;clothing:pants_grey;pants; ]"..
|
||||
"label[4,3;Cape]"..
|
||||
"item_image_button[4,3.5;1,1;clothing:cape_grey;cape; ]"..
|
||||
"list[current_player;main;1,7;8,4;]")
|
||||
meta:set_string("infotext", "Loom")
|
||||
local inv = meta:get_inventory()
|
||||
inv:set_size("input", 1)
|
||||
inv:set_size("output", 1)
|
||||
end,
|
||||
on_receive_fields = function(pos, formname, fields, sender)
|
||||
local meta = minetest.env:get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
if inv:is_empty("input") then
|
||||
return
|
||||
end
|
||||
local output = nil
|
||||
local qty = nil
|
||||
|
||||
if fields["hat"] then
|
||||
output = "clothing:hat_"
|
||||
qty = "1"
|
||||
elseif fields["shirt"] then
|
||||
output = "clothing:shirt_"
|
||||
qty = "1"
|
||||
elseif fields["pants"] then
|
||||
output = "clothing:pants_"
|
||||
qty = "1"
|
||||
elseif fields["cape"] then
|
||||
output = "clothing:cape_"
|
||||
qty = "1"
|
||||
end
|
||||
|
||||
if output and qty then
|
||||
local inputstack = inv:get_stack("input", 1)
|
||||
local outputstack = inv:get_stack("output", 1)
|
||||
local woolcol = inputstack:get_name()
|
||||
if woolcol then
|
||||
local color = woolcol:gsub("wool:", "")
|
||||
local stack = output..color.." "..qty
|
||||
if minetest.registered_items[output..color] and
|
||||
inv:room_for_item("output", stack) then
|
||||
inv:add_item("output", stack)
|
||||
inputstack:take_item()
|
||||
inv:set_stack("input", 1, inputstack)
|
||||
end
|
||||
end
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
--Craft
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'clothing:loom',
|
||||
recipe = {
|
||||
{'group:stick', 'default:pinewood', 'group:stick'},
|
||||
{'group:stick', 'default:pinewood', 'group:stick'},
|
||||
{'default:pinewood', "default:pinewood", 'default:pinewood'},
|
||||
},
|
||||
})
|
After Width: | Height: | Size: 227 B |
After Width: | Height: | Size: 232 B |
After Width: | Height: | Size: 245 B |
After Width: | Height: | Size: 225 B |
After Width: | Height: | Size: 489 B |
After Width: | Height: | Size: 336 B |
After Width: | Height: | Size: 368 B |
After Width: | Height: | Size: 368 B |
After Width: | Height: | Size: 368 B |
After Width: | Height: | Size: 359 B |
After Width: | Height: | Size: 7.7 KiB |
After Width: | Height: | Size: 345 B |
After Width: | Height: | Size: 624 B |
After Width: | Height: | Size: 873 B |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 219 B |
|
@ -1,5 +1,4 @@
|
|||
default
|
||||
stairs?
|
||||
intllib?
|
||||
lucky_block?
|
||||
toolranks?
|
||||
toolranks?
|
|
@ -1,89 +1,5 @@
|
|||
local pgad_rules={{x = 1, y = 0, z = 0},{x =-1, y = 0, z = 0},{x = 0, y = 1, z = 0},{x = 0, y =-1, z = 0},{x = 0, y = 0, z = 1},{x = 0, y = 0, z =-1}}
|
||||
|
||||
|
||||
minetest.register_node("portalgun:cplps1", {
|
||||
description = "Close player portal",
|
||||
tiles = {"portalgun_gray.png"},
|
||||
groups = {mesecon=2,snappy = 3, not_in_creative_inventory=0},
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
is_ground_content = false,
|
||||
mesecons = {effector = {
|
||||
action_on = function (pos, node)
|
||||
for i, ob in pairs(minetest.get_objects_inside_radius(pos, 6)) do
|
||||
if ob and ob:is_player() then
|
||||
portal_delete(ob:get_player_name(),0)
|
||||
end
|
||||
end
|
||||
minetest.swap_node(pos, {name="portalgun:cplps2"})
|
||||
minetest.after((2), function(pos)
|
||||
minetest.swap_node(pos, {name="portalgun:cplps1"})
|
||||
end, pos)
|
||||
|
||||
|
||||
return false
|
||||
end,
|
||||
}}
|
||||
})
|
||||
|
||||
|
||||
|
||||
minetest.register_node("portalgun:cplps2", {
|
||||
description = "Close player portal",
|
||||
tiles = {"portalgun_gray.png^[colorize:#ffe85977"},
|
||||
groups = {mesecon=2,snappy = 3, not_in_creative_inventory=1},
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
is_ground_content = false,
|
||||
paramtype = "light",
|
||||
light_source = 4,
|
||||
})
|
||||
|
||||
|
||||
|
||||
minetest.register_node("portalgun:sign_v", {
|
||||
description = "Sign V",
|
||||
tiles = {"portalgun_v.png"},
|
||||
inventory_image = "portalgun_v.png",
|
||||
drop="portalgun:sign_x",
|
||||
drawtype = "nodebox",
|
||||
groups = {mesecon=2,snappy = 3, not_in_creative_inventory=1},
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
is_ground_content = false,
|
||||
paramtype2 = "facedir",
|
||||
paramtype = "light",
|
||||
light_source = 5,
|
||||
node_box = {
|
||||
type="fixed",
|
||||
fixed={-0.5,-0.5,0.45,0.5,0.5,0.5}},
|
||||
mesecons = {effector = {
|
||||
action_off = function (pos, node)
|
||||
minetest.swap_node(pos, {name="portalgun:sign_x", param2=minetest.get_node(pos).param2})
|
||||
end,
|
||||
}}
|
||||
})
|
||||
|
||||
|
||||
minetest.register_node("portalgun:sign_x", {
|
||||
description = "Sign X",
|
||||
tiles = {"portalgun_x.png"},
|
||||
inventory_image = "portalgun_x.png",
|
||||
drawtype = "nodebox",
|
||||
groups = {mesecon=2,snappy = 3, not_in_creative_inventory=0},
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
is_ground_content = false,
|
||||
paramtype2 = "facedir",
|
||||
paramtype = "light",
|
||||
light_source = 3,
|
||||
node_box = {
|
||||
type="fixed",
|
||||
fixed={-0.5,-0.5,0.45,0.5,0.5,0.5}},
|
||||
mesecons = {effector = {
|
||||
action_on = function (pos, node)
|
||||
minetest.swap_node(pos, {name="portalgun:sign_v", param2=minetest.get_node(pos).param2})
|
||||
end,
|
||||
}}
|
||||
})
|
||||
|
||||
|
||||
local portaltarget_sig={
|
||||
{1,"portalgun_blue.png"},
|
||||
{2,"portalgun_orange.png"},
|
||||
|
@ -118,84 +34,6 @@ minetest.register_node("portalgun:portaltarget_" .. portaltarget_sig[ii][1], {
|
|||
})
|
||||
end
|
||||
|
||||
|
||||
|
||||
minetest.register_node("portalgun:button", {
|
||||
description = "Button",
|
||||
tiles = {"portalgun_bu.png"},
|
||||
groups = {cracky = 3,mesecon=1},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
sunlight_propagates = true,
|
||||
selection_box = {type = "fixed",fixed = { -0.2, -0.5, -0.2, 0.2, 0.85, 0.2 }},
|
||||
sounds = default.node_sound_defaults(),
|
||||
mesecons = {receptor = {state = "off"}},
|
||||
on_rightclick = function(pos, node, clicker)
|
||||
mesecon.receptor_on(pos)
|
||||
minetest.get_node_timer(pos):start(2)
|
||||
minetest.sound_play("default_dig_dig_immediate", {pos=pos,max_hear_distance = 10, gain = 1})
|
||||
end,
|
||||
on_timer = function (pos, elapsed)
|
||||
mesecon.receptor_off(pos)
|
||||
end,
|
||||
drawtype = "nodebox",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.25, -0.5, -0.25, 0.25, 0.7, 0.25},
|
||||
{-0.125, 0.5, -0.125, 0.125, 0.77, 0.125},
|
||||
}}
|
||||
|
||||
|
||||
|
||||
})
|
||||
|
||||
minetest.register_node("portalgun:dmgblock_1", {
|
||||
description = "Damage block (hurts when not active)",
|
||||
tiles = {"portalgun_powerwall.png"},
|
||||
groups = {cracky = 1,mesecon=2},
|
||||
drawtype="glasslike",
|
||||
paramtype="light",
|
||||
alpha = 50,
|
||||
sunlight_propagates = true,
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
walkable=false,
|
||||
damage_per_second = 5,
|
||||
mesecons = {conductor = {
|
||||
state = mesecon.state.off,
|
||||
onstate = "portalgun:dmgblock_2",
|
||||
rules = pgad_rules
|
||||
}},
|
||||
})
|
||||
minetest.register_node("portalgun:dmgblock_2", {
|
||||
description = "Damage block",
|
||||
tiles = {"portalgun_gravity.png"},
|
||||
groups = {mesecon=2,not_in_creative_inventory=1},
|
||||
drawtype="airlike",
|
||||
pointable=false,
|
||||
sunlight_propagates = true,
|
||||
drop="portalgun:dmgblock_1",
|
||||
paramtype="light",
|
||||
walkable=false,
|
||||
mesecons = {conductor = {
|
||||
state = mesecon.state.on,
|
||||
offstate = "portalgun:dmgblock_1",
|
||||
rules = pgad_rules
|
||||
}},
|
||||
})
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
minetest.register_on_respawnplayer(function(player)
|
||||
local name=player:get_player_name()
|
||||
minetest.after(1, function(name)
|
||||
|
@ -205,48 +43,6 @@ minetest.register_on_respawnplayer(function(player)
|
|||
end, name)
|
||||
|
||||
end)
|
||||
minetest.register_on_leaveplayer(function(player)
|
||||
local name=player:get_player_name()
|
||||
if portalgun.checkpoints[name]~=nil then
|
||||
portalgun.checkpoints[name]=nil
|
||||
end
|
||||
end)
|
||||
minetest.register_node("portalgun:autocheckpoint", {
|
||||
description = "Checkpoint (teleports to here on death)",
|
||||
tiles = {"portalgun_checkpoint.png"},
|
||||
groups = {cracky = 3,not_in_creative_inventory=0},
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
light_source = 5,
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
drawtype="nodebox",
|
||||
node_box = {
|
||||
type="fixed",
|
||||
fixed={-0.5,-0.5,-0.5,0.5,-0.4,0.5}},
|
||||
on_construct = function(pos)
|
||||
minetest.get_meta(pos):set_string("infotext","Checkpoint")
|
||||
minetest.get_node_timer(pos):start(2)
|
||||
end,
|
||||
on_timer = function (pos, elapsed)
|
||||
for i, ob in pairs(minetest.get_objects_inside_radius(pos, 1.5)) do
|
||||
if ob:is_player() then
|
||||
local name=ob:get_player_name()
|
||||
if portalgun.checkpoints[name]~=nil then
|
||||
local cp=portalgun.checkpoints[name]
|
||||
if cp.x==pos.x and cp.y==pos.y and cp.z==pos.z then
|
||||
return true
|
||||
end
|
||||
end
|
||||
portal_delete(name,0)
|
||||
portalgun_portal[name]=nil
|
||||
portalgun.checkpoints[name]=pos
|
||||
minetest.sound_play("portalgun_checkpoint", {pos=pos,max_hear_distance = 5, gain = 1})
|
||||
minetest.chat_send_player(name, "<Portalgun> You will spawn here next time you die")
|
||||
end
|
||||
end
|
||||
return true
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_node("portalgun:powerdoor1_1", {
|
||||
description = "Power door",
|
||||
|
@ -380,224 +176,4 @@ minetest.register_node("portalgun:powerdoor2_2", {
|
|||
offstate = "portalgun:powerdoor1_2",
|
||||
rules = pgad_rules
|
||||
}},
|
||||
})
|
||||
|
||||
|
||||
minetest.register_node("portalgun:delayer", {
|
||||
description = "Delayer (Punsh to change time)",
|
||||
tiles = {"portalgun_delayer.png","portalgun_testblock.png"},
|
||||
groups = {dig_immediate = 2,mesecon=1},
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
drawtype="nodebox",
|
||||
node_box = {
|
||||
type="fixed",
|
||||
fixed={-0.5,-0.5,-0.5,0.5,-0.4,0.5}},
|
||||
on_punch = function(pos, node, player, pointed_thing)
|
||||
if minetest.is_protected(pos, player:get_player_name())==false then
|
||||
local meta = minetest.get_meta(pos)
|
||||
local time=meta:get_int("time")
|
||||
if time>=10 then time=0 end
|
||||
meta:set_int("time",time+1)
|
||||
meta:set_string("infotext","Delayer (" .. (time+1) ..")")
|
||||
end
|
||||
end,
|
||||
|
||||
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_int("time",1)
|
||||
meta:set_string("infotext","Delayer (1)")
|
||||
meta:set_int("case",0)
|
||||
end,
|
||||
on_timer = function (pos, elapsed)
|
||||
local meta = minetest.get_meta(pos)
|
||||
if meta:get_int("case")==2 then
|
||||
meta:set_int("case",0)
|
||||
mesecon.receptor_off(pos)
|
||||
end
|
||||
if meta:get_int("case")==1 then
|
||||
meta:set_int("case",2)
|
||||
mesecon.receptor_on(pos)
|
||||
minetest.get_node_timer(pos):start(meta:get_int("time"))
|
||||
end
|
||||
return false
|
||||
end,
|
||||
|
||||
mesecons = {effector = {
|
||||
action_on = function (pos, node)
|
||||
local meta = minetest.get_meta(pos)
|
||||
if meta:get_int("case")==0 then
|
||||
meta:set_int("case",1)
|
||||
minetest.get_node_timer(pos):start(meta:get_int("time"))
|
||||
end
|
||||
|
||||
end,
|
||||
}}
|
||||
})
|
||||
|
||||
|
||||
minetest.register_node("portalgun:testblocks", {
|
||||
description = "Trapblock",
|
||||
tiles = {"portalgun_testblock.png"},
|
||||
groups = {cracky = 1,mesecon=2},
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
mesecons = {conductor = {
|
||||
state = mesecon.state.off,
|
||||
onstate = "portalgun:testblocks2",
|
||||
rules = pgad_rules
|
||||
}},
|
||||
})
|
||||
minetest.register_node("portalgun:testblocks2", {
|
||||
description = "Damage block",
|
||||
tiles = {"portalgun_gravity.png"},
|
||||
groups = {mesecon=2,not_in_creative_inventory=1},
|
||||
drawtype="airlike",
|
||||
pointable=false,
|
||||
sunlight_propagates = true,
|
||||
drop="portalgun:testblocks",
|
||||
paramtype="light",
|
||||
walkable=false,
|
||||
mesecons = {conductor = {
|
||||
state = mesecon.state.on,
|
||||
offstate = "portalgun:testblocks",
|
||||
rules = pgad_rules
|
||||
}},
|
||||
})
|
||||
|
||||
minetest.register_node("portalgun:door_1", {
|
||||
description = "Mesecon Door",
|
||||
drop="portalgun:door_1",
|
||||
drawtype = "nodebox",
|
||||
paramtype = "light",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.125, 0.5, 0.5, 0.125},
|
||||
}
|
||||
},
|
||||
tiles = {"portalgun_testblock.png"},
|
||||
groups = {mesecon=1,cracky = 1, level = 2, not_in_creative_inventory=0},
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
sunlight_propagates = true,
|
||||
is_ground_content = false,
|
||||
after_place_node = function(pos, placer, itemstack, pointed_thing)
|
||||
local p={x=pos.x,y=pos.y+1,z=pos.z}
|
||||
if minetest.registered_nodes[minetest.get_node(p).name].walkable then
|
||||
return false
|
||||
else
|
||||
minetest.set_node(p, {name = "portalgun:door_2",param2=minetest.get_node(pos).param2})
|
||||
end
|
||||
end,
|
||||
|
||||
|
||||
|
||||
mesecons = {effector = {
|
||||
action_on = function (pos, node)
|
||||
local p={x=pos.x,y=pos.y+1,z=pos.z}
|
||||
minetest.swap_node(p, {name="portalgun:door_open_2", param2=minetest.get_node(pos).param2})
|
||||
minetest.swap_node(pos, {name="portalgun:door_open_1", param2=minetest.get_node(pos).param2})
|
||||
minetest.sound_play("portalgun_door", {pos=pos, gain = 1, max_hear_distance = 5})
|
||||
end,
|
||||
}},
|
||||
after_dig_node = function (pos, name, digger)
|
||||
minetest.set_node({x=pos.x,y=pos.y+1,z=pos.z}, {name = "air"})
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_node("portalgun:door_2", {
|
||||
description = "Door 2-1",
|
||||
drawtype = "nodebox",
|
||||
drop="portalgun:door_1",
|
||||
paramtype = "light",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.125, 0.5, 0.5, 0.125},
|
||||
}
|
||||
},
|
||||
tiles = {"portalgun_testblock.png"},
|
||||
groups = {mesecon=1,cracky = 1, level = 2, not_in_creative_inventory=1},
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
sunlight_propagates = true,
|
||||
is_ground_content = false,
|
||||
mesecons = {effector = {
|
||||
action_on = function (pos, node)
|
||||
local p={x=pos.x,y=pos.y-1,z=pos.z}
|
||||
minetest.swap_node(p, {name="portalgun:door_open_1", param2=minetest.get_node(pos).param2})
|
||||
minetest.swap_node(pos, {name="portalgun:door_open_2", param2=minetest.get_node(pos).param2})
|
||||
minetest.sound_play("portalgun_door", {pos=pos, gain = 1, max_hear_distance = 5})
|
||||
|
||||
end,
|
||||
}},
|
||||
after_dig_node = function (pos, name, digger)
|
||||
minetest.set_node({x=pos.x,y=pos.y-1,z=pos.z}, {name = "air"})
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_node("portalgun:door_open_1", {
|
||||
description = "Door (open) 2-o-1",
|
||||
drop="portalgun:door_1",
|
||||
drawtype = "nodebox",
|
||||
paramtype = "light",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{0.41, -0.5, -0.124, 1.41, 0.5, 0.125},
|
||||
}
|
||||
},
|
||||
tiles = {"portalgun_testblock.png"},
|
||||
groups = {mesecon=1,cracky = 1, level = 2, not_in_creative_inventory=1},
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
sunlight_propagates = true,
|
||||
is_ground_content = false,
|
||||
after_dig_node = function (pos, name, digger)
|
||||
minetest.set_node({x=pos.x,y=pos.y+1,z=pos.z}, {name = "air"})
|
||||
end,
|
||||
mesecons = {effector = {
|
||||
action_off = function (pos, node)
|
||||
local p={x=pos.x,y=pos.y+1,z=pos.z}
|
||||
minetest.sound_play("portalgun_door", {pos=pos, gain = 1, max_hear_distance = 5})
|
||||
minetest.swap_node(p, {name="portalgun:door_2", param2=minetest.get_node(pos).param2})
|
||||
minetest.swap_node(pos, {name="portalgun:door_1", param2=minetest.get_node(pos).param2})
|
||||
end,
|
||||
}}
|
||||
})
|
||||
|
||||
minetest.register_node("portalgun:door_open_2", {
|
||||
description = "Door (open) 2-o-1",
|
||||
drawtype = "nodebox",
|
||||
drop="portalgun:door_1",
|
||||
paramtype = "light",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{0.41, -0.5, -0.124, 1.41, 0.5, 0.125},
|
||||
}
|
||||
},
|
||||
tiles = {"portalgun_testblock.png"},
|
||||
groups = {mesecon=1,cracky = 1, level = 2, not_in_creative_inventory=1},
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
sunlight_propagates = true,
|
||||
is_ground_content = false,
|
||||
after_dig_node = function (pos, name, digger)
|
||||
minetest.set_node({x=pos.x,y=pos.y-1,z=pos.z}, {name = "air"})
|
||||
end,
|
||||
mesecons = {effector = {
|
||||
action_off = function (pos, node)
|
||||
local p={x=pos.x,y=pos.y-1,z=pos.z}
|
||||
minetest.sound_play("portalgun_door", {pos=pos, gain = 1, max_hear_distance = 5})
|
||||
minetest.swap_node(p, {name="portalgun:door_1", param2=minetest.get_node(pos).param2})
|
||||
minetest.swap_node(pos, {name="portalgun:door_2", param2=minetest.get_node(pos).param2})
|
||||
end,
|
||||
}}
|
||||
})
|
||||
})
|
Before Width: | Height: | Size: 222 B |
Before Width: | Height: | Size: 278 B |
Before Width: | Height: | Size: 173 B |
Before Width: | Height: | Size: 821 B |
Before Width: | Height: | Size: 856 B |
Before Width: | Height: | Size: 370 B |
Before Width: | Height: | Size: 894 B |
Before Width: | Height: | Size: 986 B |
Before Width: | Height: | Size: 962 B |
Before Width: | Height: | Size: 220 B |
Before Width: | Height: | Size: 218 B |
Before Width: | Height: | Size: 220 B |
Before Width: | Height: | Size: 220 B |
Before Width: | Height: | Size: 220 B |
Before Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 374 B |
Before Width: | Height: | Size: 376 B |
Before Width: | Height: | Size: 214 B |
Before Width: | Height: | Size: 195 B |
Before Width: | Height: | Size: 211 B |
Before Width: | Height: | Size: 216 B |
Before Width: | Height: | Size: 198 B |
Before Width: | Height: | Size: 216 B |
Before Width: | Height: | Size: 234 B |
Before Width: | Height: | Size: 198 B |
Before Width: | Height: | Size: 191 B |
Before Width: | Height: | Size: 220 B |
Before Width: | Height: | Size: 216 B |
Before Width: | Height: | Size: 611 B |
Before Width: | Height: | Size: 4.9 KiB |
Before Width: | Height: | Size: 354 B |
Before Width: | Height: | Size: 435 B |
Before Width: | Height: | Size: 358 B |
Before Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 3.0 KiB |