update todo list and server-hosting guide. remove previous git attributes from pryamids mod.

master
FreeGamers 2020-06-18 21:16:54 -05:00
parent 6367c3e3e7
commit 20261b5081
67 changed files with 479 additions and 674 deletions

View File

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

View File

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

View File

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

View File

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

8
mods_disabled/clothing/.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
## Generic ignorable patterns and files
*~
.*.swp
*bak*
tags
*.vim
clothing.conf

View File

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

View File

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

View 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

View File

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

View File

@ -0,0 +1,6 @@
multiskin?
sfinv?
creative?
inventory_plus?
unified_inventory?
wool?

View File

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

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 245 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 489 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 336 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 345 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 624 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 873 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 B

View File

@ -1,5 +1,4 @@
default
stairs?
intllib?
lucky_block?
toolranks?
toolranks?

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 222 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 278 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 173 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 821 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 856 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 370 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 894 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 986 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 962 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 220 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 218 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 220 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 220 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 220 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 374 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 376 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 195 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 211 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 216 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 198 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 216 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 234 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 198 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 191 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 220 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 216 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 611 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 354 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 435 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 358 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB