Форк для mtsr

This commit is contained in:
n0m 2024-08-19 11:32:14 +02:00
commit 73c488e9f9
25 changed files with 1625 additions and 0 deletions

21
LICENSE Normal file
View File

@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2017 Minetest Mods Team
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

38
README.md Normal file
View File

@ -0,0 +1,38 @@
## Castle Masonry
by: Philipbenr, DanDuncombe, FaceDeer
Licence: MIT
This is a mod all about creating castles and castle dungeons. Many of the nodes are used for the outer-walls or dungeons.
Contains:
* Walls, Corner-walls,
* Castlestone Stairs, Slabs, and Pillars
* Arrowslits and embrasures
* Rubble (to fill the interior of thick castle walls)
* Murder holes and machicolations
* Pillars and crossbraces
* Roof slate
* Paving stone
* Dungeon stone
Mod settings can allow for the basic castle masonry forms to be made for the following material types (all optional):
* Cobble
* Desert stone
* Desert stone brick
* Sandstone
* Sandstone brick
* Desert Sandstone
* Desert Sandstone brick
* Silver Sandstone
* Silver Sandstone brick
* Stone
* Stone brick
* Castle wall
* Wood
* Snow
* Ice
* Obsidian Brick

174
arrow_slits.lua Normal file
View File

@ -0,0 +1,174 @@
local S = minetest.get_translator("castle_masonry")
castle_masonry.register_arrowslit = function(material)
local composition_def, burn_time, tile, desc = castle_masonry.get_material_properties(material)
local mod_name = minetest.get_current_modname()
-- Node Definition
minetest.register_node(mod_name..":arrowslit_"..material.name, {
drawtype = "nodebox",
description = S("@1 Arrowslit", desc),
tiles = tile,
groups = composition_def.groups,
_mcl_hardness = composition_def._mcl_hardness or 0.8,
_mcl_blast_resistance = composition_def._mcl_blast_resistance or 1,
sounds = composition_def.sounds,
paramtype = "light",
paramtype2 = "facedir",
node_box = {
type = "fixed",
fixed = {
{-0.5, -0.375, 0.5, -0.0625, 0.375, 0.3125},
{0.0625, -0.375, 0.5, 0.5, 0.375, 0.3125},
{-0.5, 0.375, 0.5, 0.5, 0.5, 0.3125},
{-0.5, -0.5, 0.5, 0.5, -0.375, 0.3125},
{0.25, -0.5, 0.3125, 0.5, 0.5, 0.125},
{-0.5, -0.5, 0.3125, -0.25, 0.5, 0.125},
},
},
})
minetest.register_node(mod_name..":arrowslit_"..material.name.."_cross", {
drawtype = "nodebox",
description = S("@1 Arrowslit with Cross", desc),
tiles = tile,
groups = composition_def.groups,
_mcl_hardness = composition_def._mcl_hardness or 0.8,
_mcl_blast_resistance = composition_def._mcl_blast_resistance or 1,
sounds = composition_def.sounds,
paramtype = "light",
paramtype2 = "facedir",
node_box = {
type = "fixed",
fixed = {
{-0.5, -0.125, 0.5, -0.0625, 0.375, 0.3125},
{0.0625, -0.125, 0.5, 0.5, 0.375, 0.3125},
{-0.5, 0.375, 0.5, 0.5, 0.5, 0.3125},
{-0.5, -0.5, 0.5, 0.5, -0.375, 0.3125},
{0.0625, -0.375, 0.5, 0.5, -0.25, 0.3125},
{-0.5, -0.375, 0.5, -0.0625, -0.25, 0.3125},
{-0.5, -0.25, 0.5, -0.1875, -0.125, 0.3125},
{0.1875, -0.25, 0.5, 0.5, -0.125, 0.3125},
{0.25, -0.5, 0.3125, 0.5, 0.5, 0.125},
{-0.5, -0.5, 0.3125, -0.25, 0.5, 0.125},
},
},
})
minetest.register_node(mod_name..":arrowslit_"..material.name.."_hole", {
drawtype = "nodebox",
description = S("@1 Arrowslit with Hole", desc),
tiles = tile,
groups = composition_def.groups,
_mcl_hardness = composition_def._mcl_hardness or 0.8,
_mcl_blast_resistance = composition_def._mcl_blast_resistance or 1,
sounds = composition_def.sounds,
paramtype = "light",
paramtype2 = "facedir",
node_box = {
type = "fixed",
fixed = {
{-0.5, -0.375, 0.5, -0.125, 0.375, 0.3125},
{0.125, -0.375, 0.5, 0.5, 0.375, 0.3125},
{-0.5, -0.5, 0.5, 0.5, -0.375, 0.3125},
{0.0625, -0.125, 0.5, 0.125, 0.375, 0.3125},
{-0.125, -0.125, 0.5, -0.0625, 0.375, 0.3125},
{-0.5, 0.375, 0.5, 0.5, 0.5, 0.3125},
{0.25, -0.5, 0.3125, 0.5, 0.5, 0.125},
{-0.5, -0.5, 0.3125, -0.25, 0.5, 0.125},
},
},
})
minetest.register_node(mod_name..":arrowslit_"..material.name.."_embrasure", {
drawtype = "nodebox",
description = S("@1 Embrasure", desc),
tiles = tile,
groups = composition_def.groups,
_mcl_hardness = composition_def._mcl_hardness or 0.8,
_mcl_blast_resistance = composition_def._mcl_blast_resistance or 1,
sounds = composition_def.sounds,
paramtype = "light",
paramtype2 = "facedir",
node_box = {
type = "fixed",
fixed = {
{-0.25, -0.5, 0.375, -0.125, 0.5, 0.5},
{0.125, -0.5, 0.375, 0.25, 0.5, 0.5},
{0.25, -0.5, 0.25, 0.5, 0.5, 0.5},
{0.375, -0.5, 0.125, 0.5, 0.5, 0.25},
{-0.5, -0.5, 0.25, -0.25, 0.5, 0.5},
{-0.5, -0.5, 0.125, -0.375, 0.5, 0.25},
},
},
})
minetest.register_craft({
output = mod_name..":arrowslit_"..material.name.." 6",
recipe = {
{material.craft_material,"", material.craft_material},
{material.craft_material,"", material.craft_material},
{material.craft_material,"", material.craft_material} },
})
minetest.register_craft({
output = mod_name..":arrowslit_"..material.name.."_cross",
recipe = {
{mod_name..":arrowslit_"..material.name} },
})
minetest.register_craft({
output = mod_name..":arrowslit_"..material.name.."_hole",
recipe = {
{mod_name..":arrowslit_"..material.name.."_cross"} },
})
minetest.register_craft({
output = mod_name..":arrowslit_"..material.name.."_embrasure",
recipe = {
{mod_name..":arrowslit_"..material.name.."_hole"} },
})
minetest.register_craft({
output = mod_name..":arrowslit_"..material.name,
recipe = {
{mod_name..":arrowslit_"..material.name.."_embrasure"} },
})
if burn_time > 0 then
minetest.register_craft({
type = "fuel",
recipe = mod_name..":arrowslit_"..material.name,
burntime = burn_time,
})
minetest.register_craft({
type = "fuel",
recipe = mod_name..":arrowslit_"..material.name.."_cross",
burntime = burn_time,
})
minetest.register_craft({
type = "fuel",
recipe = mod_name..":arrowslit_"..material.name.."_hole",
burntime = burn_time,
})
minetest.register_craft({
type = "fuel",
recipe = mod_name..":arrowslit_"..material.name.."_embrasure",
burntime = burn_time,
})
end
end
castle_masonry.register_arrowslit_alias = function(old_mod_name, old_material_name, new_mod_name, new_material_name)
minetest.register_alias(old_mod_name..":arrowslit_"..old_material_name, new_mod_name..":arrowslit_"..new_material_name)
minetest.register_alias(old_mod_name..":arrowslit_"..old_material_name.."_cross", new_mod_name..":arrowslit_"..new_material_name.."_cross")
minetest.register_alias(old_mod_name..":arrowslit_"..old_material_name.."_hole", new_mod_name..":arrowslit_"..new_material_name.."_hole")
minetest.register_alias(old_mod_name..":arrowslit_"..old_material_name.."_embrasure", new_mod_name..":arrowslit_"..new_material_name.."_embrasure")
end
castle_masonry.register_arrowslit_alias_force = function(old_mod_name, old_material_name, new_mod_name, new_material_name)
minetest.register_alias_force(old_mod_name..":arrowslit_"..old_material_name, new_mod_name..":arrowslit_"..new_material_name)
minetest.register_alias_force(old_mod_name..":arrowslit_"..old_material_name.."_cross", new_mod_name..":arrowslit_"..new_material_name.."_cross")
minetest.register_alias_force(old_mod_name..":arrowslit_"..old_material_name.."_hole", new_mod_name..":arrowslit_"..new_material_name.."_hole")
minetest.register_alias_force(old_mod_name..":arrowslit_"..old_material_name.."_embrasure", new_mod_name..":arrowslit_"..new_material_name.."_embrasure")
end

218
i18n.py Normal file
View File

@ -0,0 +1,218 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Script to generate the template file and update the translation files.
# Copy the script into the mod or modpack root folder and run it there.
#
# Copyright (C) 2019 Joachim Stolberg
# LGPLv2.1+
from __future__ import print_function
import os, fnmatch, re, shutil, errno
#group 2 will be the string, groups 1 and 3 will be the delimiters (" or ')
#See https://stackoverflow.com/questions/46967465/regex-match-text-in-either-single-or-double-quote
#TODO: support [[]] delimiters
pattern_lua = re.compile(r'[\.=^\t,{\(\s]N?S\(\s*(["\'])((?:\\\1|(?:(?!\1)).)*)(\1)[\s,\)]', re.DOTALL)
# Handles "concatenation" .. " of strings"
pattern_concat = re.compile(r'["\'][\s]*\.\.[\s]*["\']', re.DOTALL)
pattern_tr = re.compile(r'(.+?[^@])=(.+)')
pattern_name = re.compile(r'^name[ ]*=[ ]*([^ \n]*)')
pattern_tr_filename = re.compile(r'\.tr$')
pattern_po_language_code = re.compile(r'(.*)\.po$')
#attempt to read the mod's name from the mod.conf file. Returns None on failure
def get_modname(folder):
try:
with open(folder + "mod.conf", "r", encoding='utf-8') as mod_conf:
for line in mod_conf:
match = pattern_name.match(line)
if match:
return match.group(1)
except FileNotFoundError:
pass
return None
#If there are already .tr files in /locale, returns a list of their names
def get_existing_tr_files(folder):
out = []
for root, dirs, files in os.walk(folder + 'locale/'):
for name in files:
if pattern_tr_filename.search(name):
out.append(name)
return out
# A series of search and replaces that massage a .po file's contents into
# a .tr file's equivalent
def process_po_file(text):
# The first three items are for unused matches
text = re.sub(r'#~ msgid "', "", text)
text = re.sub(r'"\n#~ msgstr ""\n"', "=", text)
text = re.sub(r'"\n#~ msgstr "', "=", text)
# comment lines
text = re.sub(r'#.*\n', "", text)
# converting msg pairs into "=" pairs
text = re.sub(r'msgid "', "", text)
text = re.sub(r'"\nmsgstr ""\n"', "=", text)
text = re.sub(r'"\nmsgstr "', "=", text)
# various line breaks and escape codes
text = re.sub(r'"\n"', "", text)
text = re.sub(r'"\n', "\n", text)
text = re.sub(r'\\"', '"', text)
text = re.sub(r'\\n', '@n', text)
# remove header text
text = re.sub(r'=Project-Id-Version:.*\n', "", text)
# remove double-spaced lines
text = re.sub(r'\n\n', '\n', text)
return text
# Go through existing .po files and, if a .tr file for that language
# *doesn't* exist, convert it and create it.
# The .tr file that results will subsequently be reprocessed so
# any "no longer used" strings will be preserved.
# Note that "fuzzy" tags will be lost in this process.
def process_po_files(folder, modname):
for root, dirs, files in os.walk(folder + 'locale/'):
for name in files:
code_match = pattern_po_language_code.match(name)
if code_match == None:
continue
language_code = code_match.group(1)
tr_name = modname + "." + language_code + ".tr"
tr_file = os.path.join(root, tr_name)
if os.path.exists(tr_file):
print(tr_name + " already exists, ignoring " + name)
continue
fname = os.path.join(root, name)
with open(fname, "r", encoding='utf-8') as po_file:
print("Importing translations from " + name)
text = process_po_file(po_file.read())
with open(tr_file, "wt", encoding='utf-8') as tr_out:
tr_out.write(text)
# from https://stackoverflow.com/questions/600268/mkdir-p-functionality-in-python/600612#600612
# Creates a directory if it doesn't exist, silently does
# nothing if it already exists
def mkdir_p(path):
try:
os.makedirs(path)
except OSError as exc: # Python >2.5
if exc.errno == errno.EEXIST and os.path.isdir(path):
pass
else: raise
# Writes a template.txt file
def write_template(templ_file, lkeyStrings):
lOut = []
lkeyStrings.sort()
for s in lkeyStrings:
lOut.append("%s=" % s)
mkdir_p(os.path.dirname(templ_file))
with open(templ_file, "wt", encoding='utf-8') as template_file:
template_file.write("\n".join(lOut))
# Gets all translatable strings from a lua file
def read_lua_file_strings(lua_file):
lOut = []
with open(lua_file, encoding='utf-8') as text_file:
text = text_file.read()
text = re.sub(pattern_concat, "", text)
for s in pattern_lua.findall(text):
s = s[1]
s = re.sub(r'"\.\.\s+"', "", s)
s = re.sub("@[^@=0-9]", "@@", s)
s = s.replace('\\"', '"')
s = s.replace("\\'", "'")
s = s.replace("\n", "@n")
s = s.replace("\\n", "@n")
s = s.replace("=", "@=")
lOut.append(s)
return lOut
# Gets strings from an existing translation file
def import_tr_file(tr_file):
dOut = {}
if os.path.exists(tr_file):
with open(tr_file, "r", encoding='utf-8') as existing_file :
for line in existing_file.readlines():
s = line.strip()
if s == "" or s[0] == "#":
continue
match = pattern_tr.match(s)
if match:
dOut[match.group(1)] = match.group(2)
return dOut
# Walks all lua files in the mod folder, collects translatable strings,
# and writes it to a template.txt file
def generate_template(folder):
lOut = []
for root, dirs, files in os.walk(folder):
for name in files:
if fnmatch.fnmatch(name, "*.lua"):
fname = os.path.join(root, name)
found = read_lua_file_strings(fname)
print(fname + ": " + str(len(found)) + " translatable strings")
lOut.extend(found)
lOut = list(set(lOut))
lOut.sort()
if len(lOut) == 0:
return None
templ_file = folder + "locale/template.txt"
write_template(templ_file, lOut)
return lOut
# Updates an existing .tr file, copying the old one to a ".old" file
def update_tr_file(lNew, mod_name, tr_file):
print("updating " + tr_file)
lOut = ["# textdomain: %s\n" % mod_name]
#TODO only make a .old if there are actual changes from the old file
if os.path.exists(tr_file):
shutil.copyfile(tr_file, tr_file+".old")
dOld = import_tr_file(tr_file)
for key in lNew:
val = dOld.get(key, "")
lOut.append("%s=%s" % (key, val))
lOut.append("##### not used anymore #####")
for key in dOld:
if key not in lNew:
lOut.append("%s=%s" % (key, dOld[key]))
with open(tr_file, "w", encoding='utf-8') as new_tr_file:
new_tr_file.write("\n".join(lOut))
# Updates translation files for the mod in the given folder
def update_mod(folder):
modname = get_modname(folder)
if modname is not None:
process_po_files(folder, modname)
print("Updating translations for " + modname)
data = generate_template(folder)
if data == None:
print("No translatable strings found in " + modname)
else:
for tr_file in get_existing_tr_files(folder):
update_tr_file(data, modname, folder + "locale/" + tr_file)
else:
print("Unable to find modname in folder " + folder)
def update_folder(folder):
is_modpack = os.path.exists(folder+"modpack.txt") or os.path.exists(folder+"modpack.conf")
if is_modpack:
subfolders = [f.path for f in os.scandir(folder) if f.is_dir()]
for subfolder in subfolders:
update_mod(subfolder + "/")
else:
update_mod(folder)
print("Done.")
update_folder("./")
# Runs this script on each sub-folder in the parent folder.
# I'm using this for testing this script on all installed mods.
#for modfolder in [f.path for f in os.scandir("../") if f.is_dir()]:
# update_folder(modfolder + "/")

170
init.lua Normal file
View File

@ -0,0 +1,170 @@
castle_masonry = {}
castle_masonry.sounds = {}
if minetest.get_modpath("default") then
castle_masonry.sounds = default
end
if minetest.get_modpath("mcl_sounds") then
castle_masonry.sounds = mcl_sounds
end
local MP = minetest.get_modpath(minetest.get_current_modname())
dofile(MP.."/pillars.lua")
dofile(MP.."/arrow_slits.lua")
dofile(MP.."/murder_holes.lua")
dofile(MP.."/stone_wall.lua")
dofile(MP.."/paving.lua")
local S = minetest.get_translator("castle_masonry")
local read_setting = function(name, default)
local setting = minetest.settings:get_bool(name)
if not setting then return default end
return setting
end
-- Material definition:
-- {
-- name=, -- the name that will be part of the resulting node names
-- desc=, -- Player-facing name of the material
-- tile=, -- Optional - the texture tile to use for the resulting blocks (can be a single texture or a table, as a normal node definition's tile def). If not set this will be taken from the material it's made out of.
-- craft_material=, -- What source block is used to craft these blocks.
-- composition_material=, -- Optional, this will override the properties of the product with a specific material. Useful if you want to use a group for the craft material (eg, "group:wood")
--}
castle_masonry.materials = {}
local function register_material(def, setting_default)
if read_setting("castle_masonry_" .. def.name, setting_default) then
table.insert(castle_masonry.materials, def)
end
end
-- castle masonry materials
register_material({name="stonewall", desc=S("Stonewall"), tile="castle_stonewall.png", craft_material="castle_masonry:stonewall"}, true)
-- MTG materials
if minetest.get_modpath("default") then
register_material({name="cobble", desc=S("Cobble"), tile="default_cobble.png", craft_material="default:cobble"}, true)
register_material({name="stonebrick", desc=S("Stonebrick"), tile="default_stone_brick.png", craft_material="default:stonebrick"}, true)
register_material({name="stone", desc=S("Stone"), tile="default_stone.png", craft_material="default:stone"}, true)
register_material({name="wood", desc=S("Wood"), tile="default_wood.png", craft_material="group:wood", composition_material="default:wood"})
register_material({name="ice", desc=S("Ice"), tile="default_ice.png", craft_material="default:ice"})
register_material({name="snow", desc=S("Snow"), tile="default_snow.png", craft_material="default:snow"})
register_material({name="sandstone", desc=S("Sandstone"), tile="default_sandstone.png", craft_material="default:sandstone"}, true)
register_material({name="sandstonebrick", desc=S("Sandstone Brick"), tile="default_sandstone_brick.png", craft_material="default:sandstonebrick"}, true)
register_material({name="desertstonebrick", desc=S("Desert Stone Brick"), tile="default_desert_stone_brick.png", craft_material="default:desert_stonebrick"}, true)
register_material({name="desertsandstonebrick", desc=S("Desert Sandstone Brick"), tile="default_desert_sandstone_brick.png", craft_material="default:desert_sandstone_brick"}, true)
register_material({name="silversandstonebrick", desc=S("Silver Sandstone Brick"), tile="default_silver_sandstone_brick.png", craft_material="default:silver_sandstone_brick"}, true)
register_material({name="desertstone", desc=S("Desert Stone"), tile="default_desert_stone.png", craft_material="default:desert_stone"}, true)
register_material({name="desertsandstone", desc=S("Desert Sandstone"), tile="default_desert_sandstone.png", craft_material="default:desert_sandstone"}, true)
register_material({name="silversandstone", desc=S("Silver Sandstone"), tile="default_silver_sandstone.png", craft_material="default:silver_sandstone"}, true)
register_material({name="obsidianbrick", desc=S("Obsidian Brick"), tile="default_obsidian_brick.png", craft_material="default:obsidianbrick"})
end
-- MCL materials
if minetest.get_modpath("mcl_core") then
register_material({name="cobble", desc=S("Cobble"), craft_material="group:cobble", composition_material="mcl_core:cobble"}, true)
register_material({name="stonebrick", desc=S("Stonebrick"), craft_material="mcl_core:stonebrick"}, true)
register_material({name="stone", desc=S("Stone"), craft_material="group:stone", composition_material="mcl_core:stone"}, true)
register_material({name="ice", desc=S("Ice"), craft_material="mcl_core:ice"})
register_material({name="snow", desc=S("Snow"), craft_material="mcl_core:snowblock"})
register_material({name="sandstone", desc=S("Sandstone"), craft_material="mcl_core:sandstone"}, true)
register_material({name="redsandstone", desc=S("Red Sandstone"), craft_material="mcl_core:redsandstone"}, true)
end
-- wood ids are different in MineClonia and Mineclone2, mcl_trees is part of MineClonia
if minetest.get_modpath("mcl_trees") then
register_material({name="wood", desc=S("Wood"), craft_material="group:wood", composition_material="mcl_trees:wood_oak"})
elseif minetest.get_modpath("mcl_core") then
register_material({name="wood", desc=S("Wood"), craft_material="group:wood", composition_material="mcl_core:wood"})
end
if minetest.get_modpath("mcl_nether") then
register_material({name="quartz", desc=S("Quartz"), craft_material="mcl_nether:quartz_block"}, true)
end
if minetest.get_modpath("mcl_blackstone") then
register_material({name="blackstone", desc=S("Blackstone"), craft_material="mcl_blackstone:blackstone_brick_polished"}, true)
end
if minetest.get_modpath("mcl_deepslate") then
register_material({name="deepslate_bricks", desc=S("Deepslate Bricks"), craft_material="mcl_deepslate:deepslate_bricks"}, true)
register_material({name="deepslate_tiles", desc=S("Deepslate Tiles"), craft_material="mcl_deepslate:deepslate_tiles"}, true)
end
castle_masonry.get_material_properties = function(material)
local composition_def
local burn_time
if material.composition_material ~= nil then
composition_def = minetest.registered_nodes[material.composition_material]
burn_time = minetest.get_craft_result({method="fuel", width=1, items={ItemStack(material.composition_material)}}).time
else
composition_def = minetest.registered_nodes[material.craft_material]
burn_time = minetest.get_craft_result({method="fuel", width=1, items={ItemStack(material.craft_material)}}).time
end
local tiles = material.tile
if tiles == nil then
tiles = composition_def.tiles
elseif type(tiles) == "string" then
tiles = {tiles}
end
local desc = material.desc
if desc == nil then
desc = composition_def.description
end
return composition_def, burn_time, tiles, desc
end
if read_setting("castle_masonry_pillar", true) then
for _, material in pairs(castle_masonry.materials) do
castle_masonry.register_pillar(material)
end
end
if read_setting("castle_masonry_arrowslit", true) then
for _, material in pairs(castle_masonry.materials) do
castle_masonry.register_arrowslit(material)
end
end
if read_setting("castle_masonry_murderhole", true) then
for _, material in pairs(castle_masonry.materials) do
castle_masonry.register_murderhole(material)
end
end
minetest.register_alias("castle:pillars_bottom", "castle_masonry:pillars_stonewall_bottom")
minetest.register_alias("castle:pillars_top", "castle_masonry:pillars_stonewall_top")
minetest.register_alias("castle:pillars_middle", "castle_masonry:pillars_stonewall_middle")
minetest.register_alias("castle:arrowslit", "castle_masonry:arrowslit_stonewall")
minetest.register_alias("castle:arrowslit_hole", "castle_masonry:arrowslit_stonewall_hole")
minetest.register_alias("castle:arrowslit_cross", "castle_masonry:arrowslit_stonewall_cross")
for _, material in pairs(castle_masonry.materials) do
castle_masonry.register_murderhole_alias("castle", material.name, "castle_masonry", material.name)
castle_masonry.register_pillar_alias("castle", material.name, "castle_masonry", material.name)
-- Arrowslit upgrade has special handling because the castle mod arrow slit is reversed relative to current build-from-inside standard
local lbm_def = {
name = "castle_masonry:arrowslit_flip_front_to_back"..material.name,
run_at_every_load = false,
nodenames = {
"castle:arrowslit_"..material.name,
"castle:arrowslit_"..material.name.."_cross",
"castle:arrowslit_"..material.name.."_hole",
},
action = function(pos, node)
local flip_front_to_back = {[0]=2, 3, 0, 1, 6, 7, 4, 5, 10, 7, 8, 9, 14, 15, 12, 13, 18, 19, 16, 17, 22, 23, 20, 21}
node.param2 = flip_front_to_back[node.param2]
node.name = "castle_masonry" .. string.sub(node.name, 7, -1)
minetest.swap_node(pos, node)
end
}
minetest.register_lbm(lbm_def)
end

View File

@ -0,0 +1,48 @@
# textdomain: castle_masonry
@1 Arrowslit=Aspillera de @1
@1 Arrowslit with Cross=Aspillera con Cruz de @1
@1 Arrowslit with Hole=Aspillera con Agujero de @1
@1 Embrasure=Aféizar de @1
Stonewall=Pared de piedra
Cobble=Roca
Stonebrick=Ladrillo de Piedra
Sandstone Brick=Ladrillo de Arenisca
Desert Stone Brick=Ladrillo de Piedra del Desierto
Desert Sandstone Brick=Ladrillo de Arenisca del Desierto
Silver Sandstone Brick=Ladrillo de Arenisca Plateada
Stone=Piedra
Sandstone=Arenisca
Desert Stone=Piedra del Desierto
Desert Sandstone=Arenisca del Desierto
Silver Sandstone=Arenisca Plateada
Wood=Madera
Ice=Hielo
Snow=Nieve
Obsidian Brick=Ladrillo de Obsidiana
@1 Murder Hole=Agujero de @1
@1 Machicolation=Matacán de @1
Paving Stone=Pavimento de Piedra
Pavement Brick=Pavimento de Ladrillo
Castle Pavement Stair=Escalera de Pavimento de Castillo
Castle Pavement Slab=Losa de Pavimento de Castillo
Roof Slates=Techo de Pizarra
@1 Pillar Base=Base de Pilar de @1
@1 Half Pillar Base=Media Base de Pilar de @1
@1 Pillar Top=Parte Superior de Pilar de @1
@1 Half Pillar Top=Superior de Medio Pilar @1
@1 Pillar Middle=Medio Pilar de @1
@1 Half Pillar Middle=Mitad del Medio Pilar de @1
@1 Crossbrace=Viga de @1
@1 Extended Crossbrace=Viga Extendida de @1
Castle Wall=Muro de Castillo
Castle Rubble=Escombros de Castillo
Castle Corner=Esquina de Castillo
Stone Wall=Pared de Piedra
Rubble=Escombros
Castle Stonewall Stair=Escalera de Pared de Castillo
Castle Stonewall Slab=Losa de Pared de Castillo
Castle Rubble Stair=Escalera de Escombro de Castillo
Castle Rubble Slab=Losa de Escombro de Castillo
Dungeon Stone=Piedra de Mazmorra
Dungeon Stone Stair=Escalera de Piedra de Mazmorra
Dungeon Stone Slab=Losa de Piedra de Mazmorra

View File

@ -0,0 +1,49 @@
# textdomain: castle_masonry
@1 Arrowslit=Meurtrière en @1
@1 Arrowslit with Cross=Meurtrière en croix en @1
@1 Arrowslit with Hole=Meurtrière avec trou en @1
@1 Crossbrace=Travers en @1
@1 Embrasure=Embrasure en @1
@1 Extended Crossbrace=Travers étendu en @1
@1 Half Pillar Base=Base de demi pilier en @1
@1 Half Pillar Middle=Milieu de demi pilier en @1
@1 Half Pillar Top=Haut de demi pilier en @1
@1 Machicolation=Machicoulis en @1
@1 Murder Hole=Trou en @1
@1 Pillar Base=Base de pilier en @1
@1 Pillar Middle=Milieu de pilier en @1
@1 Pillar Top=Haut de pilier en @1
Castle Corner=Angle de chateau
Castle Pavement Slab=Dalle de chateau pavé
Castle Pavement Stair=Escaliers de chateau pavé
Castle Rubble=Gravats de chateau
Castle Rubble Slab=Dalle en gravats de chateau
Castle Rubble Stair=Escalier en gravats de chateau
Castle Stonewall Slab=Dalle en pierre brune
Castle Stonewall Stair=Escalier en pierre brune
Castle Wall=Pierre brune
Cobble=Pavé
Desert Sandstone=Pierre du désert
Desert Sandstone Brick=Brique de pierre du désert
Desert Stone=Pierre du désert
Desert Stone Brick=Brique de pierre du désert
Dungeon Stone=Pierre de donjon
Dungeon Stone Slab=Dalle en pierre de donjon
Dungeon Stone Stair=Escalier en pierre de donjon
Ice=Glace
Obsidian Brick=Brique d'obsidienne
Pavement Brick=Brique de pavage
Paving Stone=Pierre de pavage
Roof Slates=Toiture en ardoise
Rubble=Décombre
Sandstone=Grès
Sandstone Brick=Brique de grès
Silver Sandstone=Grès
Silver Sandstone Brick=Brique de grès
Snow=Neige
Stone=Pierre
Stone Wall=Mur de pierre
Stonebrick=Brique de pierre
Stonewall=Pierre brune
Wood=Bois

View File

@ -0,0 +1,50 @@
# textdomain: castle_masonry
@1 Arrowslit=Feritoia per frecce di @1
@1 Arrowslit with Cross=Feritoia a croce per frecce di @1
@1 Arrowslit with Hole=Feritoia a foro per frecce di @1
@1 Crossbrace=Costolone di @1
@1 Embrasure=Feritoia di @1
@1 Extended Crossbrace=Costolone esteso di @1
@1 Half Pillar Base=Mezza base della colonna di @1
@1 Half Pillar Middle=Mezzo fusto della colonna di @1
@1 Half Pillar Top=Mezzo capitello di @1
@1 Machicolation=Caditoia di @1
@1 Murder Hole=Buca assassina di @1
@1 Pillar Base=Base della colonna di @1
@1 Pillar Middle=Fusto della colonna di @1
@1 Pillar Top=Capitello di @1
Castle Corner=Angolo del castello
Castle Pavement Slab=Lastra pavimentale del castello
Castle Pavement Stair=Scala pavimentale del castello
Castle Rubble=Detriti del castello
Castle Rubble Slab=Lastra del castello in detriti
Castle Rubble Stair=Scala del castello in detriti
Castle Stonewall Slab=Lastra del castello in muro di pietra
Castle Stonewall Stair=Scala del castello in muro di pietra
Castle Wall=Muro del castello
Cobble=ciottoli
Desert Sandstone=arenaria del deserto
Desert Sandstone Brick=mattone d'arenaria del deserto
Desert Stone=pietra del deserto
Desert Stone Brick=mattone di pietra del deserto
Dungeon Stone=Pietra del sotterraneo
Dungeon Stone Slab=Lastra di pietra del sotterraneo
Dungeon Stone Stair=Scala di pietra del sotterraneo
Ice=ghiaccio
Obsidian Brick=mattone d'ossidiana
Pavement Brick=Mattone pavimentale
Paving Stone=Pietra pavimentale
Roof Slates=Tegole d'ardesia
Rubble=Detriti
Sandstone=arenaria
Sandstone Brick=mattone d'arenaria del deserto
Silver Sandstone=arenaria argentata
Silver Sandstone Brick=mattone d'arenaria argentata
Snow=neve
Stone=pietra
Stone Wall=Muro di pietra
Stonebrick=mattone di pietra
Stonewall=muro di pietra
Wood=legno
##### not used anymore #####

49
locale/template.txt Normal file
View File

@ -0,0 +1,49 @@
# textdomain:castle_masonry
@1 Arrowslit=
@1 Arrowslit with Cross=
@1 Arrowslit with Hole=
@1 Embrasure=
Stonewall=
Cobble=
Stonebrick=
Sandstone Brick=
Desert Stone Brick=
Desert Sandstone Brick=
Silver Sandstone Brick=
Stone=
Sandstone=
Desert Stone=
Desert Sandstone=
Silver Sandstone=
Wood=
Ice=
Snow=
Obsidian Brick=
@1 Murder Hole=
@1 Machicolation=
Paving Stone=
Pavement Brick=
Castle Pavement Stair=
Castle Pavement Slab=
Roof Slates=
@1 Pillar Base=
@1 Half Pillar Base=
@1 Pillar Top=
@1 Half Pillar Top=
@1 Pillar Middle=
@1 Half Pillar Middle=
@1 Crossbrace=
@1 Extended Crossbrace=
Castle Wall=
Castle Rubble=
Castle Corner=
Stone Wall=
Rubble=
Castle Stonewall Stair=
Castle Stonewall Slab=
Castle Rubble Stair=
Castle Rubble Slab=
Dungeon Stone=
Dungeon Stone Stair=
Dungeon Stone Slab=

7
mod.conf Normal file
View File

@ -0,0 +1,7 @@
name = castle_masonry
depends =
optional_depends = default, mcl_core, mcl_sounds, mcl_nether, mcl_deepslate, mcl_blackstone, mcl_stairs, mcl_trees, moreblocks, stairs, building_blocks, asphalt, streets
description = """
This is a mod all about creating castles and castle dungeons.
Many of the nodes are used for the outer-walls or dungeons.
"""

94
murder_holes.lua Normal file
View File

@ -0,0 +1,94 @@
local S = minetest.get_translator("castle_masonry")
-------------------------------------------------------------------------------------
castle_masonry.register_murderhole = function(material)
local composition_def, burn_time, tile, desc = castle_masonry.get_material_properties(material)
local mod_name = minetest.get_current_modname()
-- Node Definition
minetest.register_node(mod_name..":hole_"..material.name, {
drawtype = "nodebox",
description = S("@1 Murder Hole", desc),
tiles = tile,
groups = composition_def.groups,
_mcl_hardness = composition_def._mcl_hardness or 0.8,
_mcl_blast_resistance = composition_def._mcl_blast_resistance or 1,
sounds = composition_def.sounds,
paramtype = "light",
paramtype2 = "facedir",
node_box = {
type = "fixed",
fixed = {
{-8/16,-8/16,-8/16,-4/16,8/16,8/16},
{4/16,-8/16,-8/16,8/16,8/16,8/16},
{-4/16,-8/16,-8/16,4/16,8/16,-4/16},
{-4/16,-8/16,8/16,4/16,8/16,4/16},
},
},
})
minetest.register_node(mod_name..":machicolation_"..material.name, {
drawtype = "nodebox",
description = S("@1 Machicolation", desc),
tiles = tile,
groups = composition_def.groups,
_mcl_hardness = composition_def._mcl_hardness or 0.8,
_mcl_blast_resistance = composition_def._mcl_blast_resistance or 1,
sounds = composition_def.sounds,
paramtype = "light",
paramtype2 = "facedir",
node_box = {
type = "fixed",
fixed = {
{-0.5, 0, -0.5, 0.5, 0.5, 0},
{-0.5, -0.5, 0, -0.25, 0.5, 0.5},
{0.25, -0.5, 0, 0.5, 0.5, 0.5},
},
},
})
minetest.register_craft({
output = mod_name..":hole_"..material.name.." 4",
recipe = {
{"",material.craft_material, "" },
{material.craft_material,"", material.craft_material},
{"",material.craft_material, ""}
},
})
minetest.register_craft({
output = mod_name..":machicolation_"..material.name,
type="shapeless",
recipe = {mod_name..":hole_"..material.name},
})
minetest.register_craft({
output = mod_name..":hole_"..material.name,
type="shapeless",
recipe = {mod_name..":machicolation_"..material.name},
})
if burn_time > 0 then
minetest.register_craft({
type = "fuel",
recipe = mod_name..":hole_"..material.name,
burntime = burn_time,
})
minetest.register_craft({
type = "fuel",
recipe = mod_name..":machicolation_"..material.name,
burntime = burn_time,
})
end
end
castle_masonry.register_murderhole_alias = function(old_mod_name, old_material_name, new_mod_name, new_material_name)
minetest.register_alias(old_mod_name..":hole_"..old_material_name, new_mod_name..":hole_"..new_material_name)
minetest.register_alias(old_mod_name..":machicolation_"..old_material_name, new_mod_name..":machicolation_"..new_material_name)
end
castle_masonry.register_murderhole_alias_force = function(old_mod_name, old_material_name, new_mod_name, new_material_name)
minetest.register_alias_force(old_mod_name..":hole_"..old_material_name, new_mod_name..":hole_"..new_material_name)
minetest.register_alias_force(old_mod_name..":machicolation_"..old_material_name, new_mod_name..":machicolation_"..new_material_name)
end

124
paving.lua Normal file
View File

@ -0,0 +1,124 @@
minetest.register_alias("castle:pavement", "castle_masonry:pavement_brick")
minetest.register_alias("castle:pavement_brick", "castle_masonry:pavement_brick")
minetest.register_alias("castle:roofslate", "castle_masonry:roofslate")
local S = minetest.get_translator("castle_masonry")
local has_mcl = minetest.get_modpath("mcl_core")
local cobble = has_mcl and "mcl_core:cobble" or "default:cobble"
minetest.register_node("castle_masonry:pavement_brick", {
description = S("Paving Stone"),
drawtype = "normal",
tiles = {"castle_pavement_brick.png"},
groups = {cracky=2, pickaxey=2},
_mcl_hardness = 1,
_mcl_blast_resistance = 1,
paramtype = "light",
sounds = castle_masonry.sounds.node_sound_stone_defaults(),
})
minetest.register_craft({
output = "castle_masonry:pavement_brick 4",
recipe = {
{"group:stone", cobble},
{cobble, "group:stone"},
}
})
if minetest.get_modpath("moreblocks") then
stairsplus:register_all("castle_masonry", "pavement_brick", "castle_masonry:pavement_brick", {
description = S("Pavement Brick"),
tiles = {"castle_pavement_brick.png"},
groups = {cracky=2, pickaxey=2, not_in_creative_inventory=1},
sounds = castle_masonry.sounds.node_sound_stone_defaults(),
sunlight_propagates = true,
})
stairsplus:register_alias_all("castle", "pavement_brick", "castle_masonry", "pavement_brick")
elseif minetest.get_modpath("mcl_stairs") then
mcl_stairs.register_stair_and_slab("pavement_brick", "castle_masonry:pavement_brick",
{pickaxey=2},
{"castle_pavement_brick.png"},
S("Castle Pavement Stair"),
S("Castle Pavement Slab"),
castle_masonry.sounds.node_sound_stone_defaults()
)
elseif minetest.get_modpath("stairs") then
stairs.register_stair_and_slab("pavement_brick", "castle_masonry:pavement_brick",
{cracky=2},
{"castle_pavement_brick.png"},
S("Castle Pavement Stair"),
S("Castle Pavement Slab"),
castle_masonry.sounds.node_sound_stone_defaults()
)
end
minetest.register_node("castle_masonry:roofslate", {
drawtype = "raillike",
description = S("Roof Slates"),
inventory_image = "castle_slate.png",
paramtype = "light",
walkable = false,
tiles = {'castle_slate.png'},
climbable = true,
selection_box = {
type = "fixed",
fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
},
groups = {cracky=3, pickaxey=1, attached_node=1},
_mcl_hardness = 0.8,
_mcl_blast_resistance = 1,
sounds = castle_masonry.sounds.node_sound_stone_defaults(),
})
local mod_building_blocks = minetest.get_modpath("building_blocks")
local mod_streets = minetest.get_modpath("streets") or minetest.get_modpath("asphalt")
local has_mcl = minetest.get_modpath("mcl_core")
local gravel = has_mcl and "mcl_core:gravel" or "default:gravel"
if mod_building_blocks then
minetest.register_craft({
output = "castle_masonry:roofslate 4",
recipe = {
{ "building_blocks:Tar" , gravel },
{ gravel, "building_blocks:Tar" }
}
})
minetest.register_craft( {
output = "castle_masonry:roofslate 4",
recipe = {
{ gravel, "building_blocks:Tar" },
{ "building_blocks:Tar" , gravel }
}
})
end
if mod_streets then
minetest.register_craft( {
output = "castle_masonry:roofslate 4",
recipe = {
{ "streets:asphalt" , gravel },
{ gravel, "streets:asphalt" }
}
})
minetest.register_craft( {
output = "castle_masonry:roofslate 4",
recipe = {
{ gravel, "streets:asphalt" },
{ "streets:asphalt" , gravel }
}
})
end
if not (mod_building_blocks or mod_streets) then
minetest.register_craft({
type = "cooking",
output = "castle_masonry:roofslate",
recipe = gravel,
})
end

330
pillars.lua Normal file
View File

@ -0,0 +1,330 @@
local S = minetest.get_translator("castle_masonry")
castle_masonry.register_pillar = function(material)
local composition_def, burn_time, tile, desc = castle_masonry.get_material_properties(material)
local crossbrace_connectable_groups = {}
for group, val in pairs(composition_def.groups) do
crossbrace_connectable_groups[group] = val
end
crossbrace_connectable_groups.crossbrace_connectable = 1
local mod_name = minetest.get_current_modname()
-- Node Definition
minetest.register_node(mod_name..":pillar_"..material.name.."_bottom", {
drawtype = "nodebox",
description = S("@1 Pillar Base", desc),
tiles = tile,
groups = crossbrace_connectable_groups,
_mcl_hardness = composition_def._mcl_hardness or 0.8,
_mcl_blast_resistance = composition_def._mcl_blast_resistance or 1,
sounds = composition_def.sounds,
paramtype = "light",
paramtype2 = "facedir",
node_box = {
type = "fixed",
fixed = {
{-0.5,-0.5,-0.5,0.5,-0.375,0.5},
{-0.375,-0.375,-0.375,0.375,-0.125,0.375},
{-0.25,-0.125,-0.25,0.25,0.5,0.25},
},
},
})
minetest.register_node(mod_name..":pillar_"..material.name.."_bottom_half", {
drawtype = "nodebox",
description = S("@1 Half Pillar Base", desc),
tiles = tile,
groups = composition_def.groups,
_mcl_hardness = composition_def._mcl_hardness or 0.8,
_mcl_blast_resistance = composition_def._mcl_blast_resistance or 1,
sounds = composition_def.sounds,
paramtype = "light",
paramtype2 = "facedir",
node_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, 0, 0.5, -0.375, 0.5},
{-0.375, -0.375, 0.125, 0.375, -0.125, 0.5},
{-0.25, -0.125, 0.25, 0.25, 0.5, 0.5},
},
},
})
minetest.register_node(mod_name..":pillar_"..material.name.."_top", {
drawtype = "nodebox",
description = S("@1 Pillar Top", desc),
tiles = tile,
groups = crossbrace_connectable_groups,
_mcl_hardness = composition_def._mcl_hardness or 0.8,
_mcl_blast_resistance = composition_def._mcl_blast_resistance or 1,
sounds = composition_def.sounds,
paramtype = "light",
paramtype2 = "facedir",
node_box = {
type = "fixed",
fixed = {
{-0.5,0.3125,-0.5,0.5,0.5,0.5},
{-0.375,0.0625,-0.375,0.375,0.3125,0.375},
{-0.25,-0.5,-0.25,0.25,0.0625,0.25},
},
},
})
minetest.register_node(mod_name..":pillar_"..material.name.."_top_half", {
drawtype = "nodebox",
description = S("@1 Half Pillar Top", desc),
tiles = tile,
groups = composition_def.groups,
_mcl_hardness = composition_def._mcl_hardness or 0.8,
_mcl_blast_resistance = composition_def._mcl_blast_resistance or 1,
sounds = composition_def.sounds,
paramtype = "light",
paramtype2 = "facedir",
node_box = {
type = "fixed",
fixed = {
{-0.5, 0.3125, 0, 0.5, 0.5, 0.5},
{-0.375, 0.0625, 0.125, 0.375, 0.3125, 0.5},
{-0.25, -0.5, 0.25, 0.25, 0.0625, 0.5},
},
},
})
minetest.register_node(mod_name..":pillar_"..material.name.."_middle", {
drawtype = "nodebox",
description = S("@1 Pillar Middle", desc),
tiles = tile,
groups = crossbrace_connectable_groups,
_mcl_hardness = composition_def._mcl_hardness or 0.8,
_mcl_blast_resistance = composition_def._mcl_blast_resistance or 1,
sounds = composition_def.sounds,
paramtype = "light",
paramtype2 = "facedir",
node_box = {
type = "fixed",
fixed = {
{-0.25,-0.5,-0.25,0.25,0.5,0.25},
},
},
})
minetest.register_node(mod_name..":pillar_"..material.name.."_middle_half", {
drawtype = "nodebox",
description = S("@1 Half Pillar Middle", desc),
tiles = tile,
groups = composition_def.groups,
_mcl_hardness = composition_def._mcl_hardness or 0.8,
_mcl_blast_resistance = composition_def._mcl_blast_resistance or 1,
sounds = composition_def.sounds,
paramtype = "light",
paramtype2 = "facedir",
node_box = {
type = "fixed",
fixed = {
{-0.25, -0.5, 0.25, 0.25, 0.5, 0.5},
},
},
})
minetest.register_node(mod_name..":pillar_"..material.name.."_crossbrace",
{
drawtype = "nodebox",
description = S("@1 Crossbrace", desc),
tiles = tile,
groups = composition_def.groups,
_mcl_hardness = composition_def._mcl_hardness or 0.8,
_mcl_blast_resistance = composition_def._mcl_blast_resistance or 1,
sounds = composition_def.sounds,
paramtype = "light",
paramtype2 = "facedir",
node_box = {
type = "connected",
fixed = {-0.25,0.25,-0.25,0.25,0.5,0.25},
connect_front = {-0.25,0.25,-0.75,0.25,0.5,-0.25}, -- -Z
connect_left = {-0.25,0.25,-0.25,-0.75,0.5,0.25}, -- -X
connect_back = {-0.25,0.25,0.25,0.25,0.5,0.75}, -- +Z
connect_right = {0.25,0.25,-0.25,0.75,0.5,0.25}, -- +X
},
connects_to = {
mod_name..":pillar_"..material.name.."_crossbrace",
mod_name..":pillar_"..material.name.."_extended_crossbrace",
"group:crossbrace_connectable"},
connect_sides = { "front", "left", "back", "right" },
})
minetest.register_node(mod_name..":pillar_"..material.name.."_extended_crossbrace",
{
drawtype = "nodebox",
description = S("@1 Extended Crossbrace", desc),
tiles = tile,
groups = composition_def.groups,
_mcl_hardness = composition_def._mcl_hardness or 0.8,
_mcl_blast_resistance = composition_def._mcl_blast_resistance or 1,
sounds = composition_def.sounds,
paramtype = "light",
paramtype2 = "facedir",
node_box = {
type = "fixed",
fixed = {-1.25,0.25,-0.25,1.25,0.5,0.25},
},
})
minetest.register_craft({
output = mod_name..":pillar_"..material.name.."_bottom 4",
recipe = {
{"",material.craft_material,""},
{"",material.craft_material,""},
{material.craft_material,material.craft_material,material.craft_material} },
})
minetest.register_craft({
output = mod_name..":pillar_"..material.name.."_top 4",
recipe = {
{material.craft_material,material.craft_material,material.craft_material},
{"",material.craft_material,""},
{"",material.craft_material,""} },
})
minetest.register_craft({
output = mod_name..":pillar_"..material.name.."_middle 2",
recipe = {
{material.craft_material},
{material.craft_material},
{material.craft_material} },
})
minetest.register_craft({
output = mod_name..":pillar_"..material.name.."_crossbrace 10",
recipe = {
{material.craft_material,"",material.craft_material},
{"",material.craft_material,""},
{material.craft_material,"",material.craft_material} },
})
minetest.register_craft({
output = mod_name..":pillar_"..material.name.."_middle_half 2",
type="shapeless",
recipe = {mod_name..":pillar_"..material.name.."_middle"},
})
minetest.register_craft({
output = mod_name..":pillar_"..material.name.."_middle",
type="shapeless",
recipe = {mod_name..":pillar_"..material.name.."_middle_half", mod_name..":pillar_"..material.name.."_middle_half"},
})
minetest.register_craft({
output = mod_name..":pillar_"..material.name.."_top_half 2",
type="shapeless",
recipe = {mod_name..":pillar_"..material.name.."_top"},
})
minetest.register_craft({
output = mod_name..":pillar_"..material.name.."_top",
type="shapeless",
recipe = {mod_name..":pillar_"..material.name.."_top_half", mod_name..":pillar_"..material.name.."_top_half"},
})
minetest.register_craft({
output = mod_name..":pillar_"..material.name.."_bottom_half 2",
type="shapeless",
recipe = {mod_name..":pillar_"..material.name.."_bottom"},
})
minetest.register_craft({
output = mod_name..":pillar_"..material.name.."_bottom",
type="shapeless",
recipe = {mod_name..":pillar_"..material.name.."_bottom_half", mod_name..":pillar_"..material.name.."_bottom_half"},
})
minetest.register_craft({
output = mod_name..":pillar_"..material.name.."_extended_crossbrace",
type="shapeless",
recipe = {mod_name..":pillar_"..material.name.."_crossbrace"},
})
minetest.register_craft({
output = mod_name..":pillar_"..material.name.."_crossbrace",
type="shapeless",
recipe = {mod_name..":pillar_"..material.name.."_extended_crossbrace"},
})
if burn_time > 0 then
minetest.register_craft({
type = "fuel",
recipe = mod_name..":pillar_"..material.name.."_top",
burntime = burn_time*5/4,
})
minetest.register_craft({
type = "fuel",
recipe = mod_name..":pillar_"..material.name.."_top_half",
burntime = burn_time*5/8,
})
minetest.register_craft({
type = "fuel",
recipe = mod_name..":pillar_"..material.name.."_bottom",
burntime = burn_time*5/4,
})
minetest.register_craft({
type = "fuel",
recipe = mod_name..":pillar_"..material.name.."_bottom_half",
burntime = burn_time*5/8,
})
minetest.register_craft({
type = "fuel",
recipe = mod_name..":pillar_"..material.name.."_middle",
burntime = burn_time*6/4,
})
minetest.register_craft({
type = "fuel",
recipe = mod_name..":pillar_"..material.name.."_middle_half",
burntime = burn_time*6/8,
})
minetest.register_craft({
type = "fuel",
recipe = mod_name..":pillar_"..material.name.."_crossbrace",
burntime = burn_time*5/10,
})
minetest.register_craft({
type = "fuel",
recipe = mod_name..":pillar_"..material.name.."_extended_crossbrace",
burntime = burn_time*5/10,
})
end
end
-- The original castle mod had "pillars_", plural, which didn't match the arrowslit and murderhole standard.
castle_masonry.register_pillar_alias = function(old_mod_name, old_material_name, new_mod_name, new_material_name)
minetest.register_alias(old_mod_name..":pillars_"..old_material_name.."_bottom", new_mod_name..":pillar_"..new_material_name.."_bottom")
minetest.register_alias(old_mod_name..":pillars_"..old_material_name.."_bottom_half", new_mod_name..":pillar_"..new_material_name.."_bottom_half")
minetest.register_alias(old_mod_name..":pillars_"..old_material_name.."_crossbrace", new_mod_name..":pillar_"..new_material_name.."_crossbrace")
minetest.register_alias(old_mod_name..":pillars_"..old_material_name.."_middle", new_mod_name..":pillar_"..new_material_name.."_middle")
minetest.register_alias(old_mod_name..":pillars_"..old_material_name.."_middle_half", new_mod_name..":pillar_"..new_material_name.."_middle_half")
minetest.register_alias(old_mod_name..":pillars_"..old_material_name.."_top", new_mod_name..":pillar_"..new_material_name.."_top")
minetest.register_alias(old_mod_name..":pillars_"..old_material_name.."_top_half", new_mod_name..":pillar_"..new_material_name.."_top_half")
minetest.register_alias(old_mod_name..":pillar_"..old_material_name.."_bottom", new_mod_name..":pillar_"..new_material_name.."_bottom")
minetest.register_alias(old_mod_name..":pillar_"..old_material_name.."_bottom_half", new_mod_name..":pillar_"..new_material_name.."_bottom_half")
minetest.register_alias(old_mod_name..":pillar_"..old_material_name.."_crossbrace", new_mod_name..":pillar_"..new_material_name.."_crossbrace")
minetest.register_alias(old_mod_name..":pillar_"..old_material_name.."_middle", new_mod_name..":pillar_"..new_material_name.."_middle")
minetest.register_alias(old_mod_name..":pillar_"..old_material_name.."_middle_half", new_mod_name..":pillar_"..new_material_name.."_middle_half")
minetest.register_alias(old_mod_name..":pillar_"..old_material_name.."_top", new_mod_name..":pillar_"..new_material_name.."_top")
minetest.register_alias(old_mod_name..":pillar_"..old_material_name.."_top_half", new_mod_name..":pillar_"..new_material_name.."_top_half")
end
castle_masonry.register_arrowslit_alias_force = function(old_mod_name, old_material_name, new_mod_name, new_material_name)
minetest.register_alias_force(old_mod_name..":pillars_"..old_material_name.."_bottom", new_mod_name..":pillar_"..new_material_name.."_bottom")
minetest.register_alias_force(old_mod_name..":pillars_"..old_material_name.."_bottom_half", new_mod_name..":pillar_"..new_material_name.."_bottom_half")
minetest.register_alias_force(old_mod_name..":pillars_"..old_material_name.."_crossbrace", new_mod_name..":pillar_"..new_material_name.."_crossbrace")
minetest.register_alias_force(old_mod_name..":pillars_"..old_material_name.."_middle", new_mod_name..":pillar_"..new_material_name.."_middle")
minetest.register_alias_force(old_mod_name..":pillars_"..old_material_name.."_middle_half", new_mod_name..":pillar_"..new_material_name.."_middle_half")
minetest.register_alias_force(old_mod_name..":pillars_"..old_material_name.."_top", new_mod_name..":pillar_"..new_material_name.."_top")
minetest.register_alias_force(old_mod_name..":pillars_"..old_material_name.."_top_half", new_mod_name..":pillar_"..new_material_name.."_top_half")
minetest.register_alias_force(old_mod_name..":pillar_"..old_material_name.."_bottom", new_mod_name..":pillar_"..new_material_name.."_bottom")
minetest.register_alias_force(old_mod_name..":pillar_"..old_material_name.."_bottom_half", new_mod_name..":pillar_"..new_material_name.."_bottom_half")
minetest.register_alias_force(old_mod_name..":pillar_"..old_material_name.."_crossbrace", new_mod_name..":pillar_"..new_material_name.."_crossbrace")
minetest.register_alias_force(old_mod_name..":pillar_"..old_material_name.."_middle", new_mod_name..":pillar_"..new_material_name.."_middle")
minetest.register_alias_force(old_mod_name..":pillar_"..old_material_name.."_middle_half", new_mod_name..":pillar_"..new_material_name.."_middle_half")
minetest.register_alias_force(old_mod_name..":pillar_"..old_material_name.."_top", new_mod_name..":pillar_"..new_material_name.."_top")
minetest.register_alias_force(old_mod_name..":pillar_"..old_material_name.."_top_half", new_mod_name..":pillar_"..new_material_name.."_top_half")
end

BIN
screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 281 KiB

31
settingtypes.txt Normal file
View File

@ -0,0 +1,31 @@
[Materials]
castle_masonry_stonewall (Stonewall) bool true
castle_masonry_cobble (Cobble) bool true
castle_masonry_stonebrick (Stone Brick) bool true
castle_masonry_stone (Stone) bool true
castle_masonry_sandstone (Sandstone) bool true
castle_masonry_wood (Wood) bool false
castle_masonry_ice (Ice) bool false
castle_masonry_snow (Snow) bool false
[Materials MTG]
castle_masonry_sandstonebrick (Sandstone Brick) bool true
castle_masonry_desertstonebrick (Desert Stone Brick) bool true
castle_masonry_desertsandstonebrick (Desert Sandstone Brick) bool true
castle_masonry_silversandstonebrick (Silver Sandstone Brick) bool true
castle_masonry_desertstone (Desert Stone) bool true
castle_masonry_desertsandstone (Desert Sandstone) bool true
castle_masonry_silversandstone (Silver Sandstone) bool true
castle_masonry_obsidianbrick (Obsidian Brick) bool false
[Materials MCL]
castle_masonry_redsandstone (Red Sandstone) bool true
castle_masonry_quartz (Quartz) bool true
castle_masonry_blackstone (Blackstone) bool true
castle_masonry_deepslate_bricks (Deepslate Bricks) bool true
castle_masonry_deepslate_tiles (Deepslate Tiles) bool true
[Forms]
castle_masonry_pillar (Pillars) bool true
castle_masonry_arrowslit (Arrow slits) bool true
castle_masonry_murderhole (Murder holes and machicolations) bool true

201
stone_wall.lua Normal file
View File

@ -0,0 +1,201 @@
local S = minetest.get_translator("castle_masonry")
local has_mcl = minetest.get_modpath("mcl_core")
local gravel = has_mcl and "mcl_core:gravel" or "default:gravel"
local desert_stone = has_mcl and "mcl_core:redsandstone" or "default:desert_stone"
local sandstone = has_mcl and "mcl_core:sandstone" or "default:sandstone"
local stonebrick = has_mcl and "mcl_core:stonebrick" or "default:stonebrick"
local obsidian = has_mcl and "mcl_core:obsidian" or "default:obsidian"
local cobble = has_mcl and "mcl_core:cobble" or "default:cobble"
minetest.register_alias("castle:stonewall", "castle_masonry:stonewall")
minetest.register_alias("castle:dungeon_stone", "castle_masonry:dungeon_stone")
minetest.register_alias("castle:rubble", "castle_masonry:rubble")
minetest.register_alias("castle:stonewall_corner", "castle_masonry:stonewall_corner")
minetest.register_node("castle_masonry:stonewall", {
description = S("Castle Wall"),
drawtype = "normal",
tiles = {"castle_stonewall.png"},
paramtype = "light",
drop = "castle_masonry:stonewall",
groups = {cracky=3, pickaxey=1},
_mcl_hardness = 1,
_mcl_blast_resistance = 1,
sunlight_propagates = false,
sounds = castle_masonry.sounds.node_sound_stone_defaults(),
})
minetest.register_node("castle_masonry:rubble", {
description = S("Castle Rubble"),
drawtype = "normal",
tiles = {"castle_rubble.png"},
paramtype = "light",
groups = {crumbly=3, shovely=1, falling_node=1},
_mcl_hardness = 0.8,
_mcl_blast_resistance = 1,
sounds = castle_masonry.sounds.node_sound_gravel_defaults(),
})
minetest.register_craft({
output = "castle_masonry:stonewall",
recipe = {
{cobble},
{desert_stone},
}
})
minetest.register_craft({
output = "castle_masonry:rubble",
recipe = {
{"castle_masonry:stonewall"},
}
})
minetest.register_craft({
output = "castle_masonry:rubble 2",
recipe = {
{gravel},
{desert_stone},
}
})
minetest.register_node("castle_masonry:stonewall_corner", {
drawtype = "normal",
paramtype = "light",
paramtype2 = "facedir",
description = S("Castle Corner"),
tiles = {"castle_corner_stonewall_tb.png^[transformR90",
"castle_corner_stonewall_tb.png^[transformR180",
"castle_corner_stonewall1.png",
"castle_stonewall.png",
"castle_stonewall.png",
"castle_corner_stonewall2.png"},
groups = {cracky=3, pickaxey=1},
_mcl_hardness = 1,
_mcl_blast_resistance = 1,
sounds = castle_masonry.sounds.node_sound_stone_defaults(),
})
minetest.register_craft({
output = "castle_masonry:stonewall_corner",
recipe = {
{"", "castle_masonry:stonewall"},
{"castle_masonry:stonewall", sandstone},
}
})
if minetest.get_modpath("moreblocks") then
stairsplus:register_all("castle_masonry", "stonewall", "castle_masonry:stonewall", {
description = S("Stone Wall"),
tiles = {"castle_stonewall.png"},
groups = {cracky=3, pickaxey=1, not_in_creative_inventory=1},
_mcl_hardness = 0.8,
_mcl_blast_resistance = 1,
sounds = castle_masonry.sounds.node_sound_stone_defaults(),
sunlight_propagates = true,
})
stairsplus:register_all("castle_masonry", "rubble", "castle_masonry:rubble", {
description = S("Rubble"),
tiles = {"castle_rubble.png"},
groups = {cracky=3, pickaxey=1, not_in_creative_inventory=1},
sounds = castle_masonry.sounds.node_sound_gravel_defaults(),
sunlight_propagates = true,
})
stairsplus:register_alias_all("castle", "stonewall", "castle_masonry", "stonewall")
stairsplus:register_alias_all("castle", "rubble", "castle_masonry", "rubble")
elseif minetest.get_modpath("mcl_stairs") then
mcl_stairs.register_stair_and_slab("stonewall", "castle_masonry:stonewall",
{pickaxey=1},
{"castle_stonewall.png"},
S("Castle Stonewall Stair"),
S("Castle Stonewall Slab"),
castle_masonry.sounds.node_sound_stone_defaults()
)
mcl_stairs.register_stair_and_slab("rubble", "castle_masonry:rubble",
{shovely=1},
{"castle_rubble.png"},
S("Castle Rubble Stair"),
S("Castle Rubble Slab"),
castle_masonry.sounds.node_sound_gravel_defaults()
)
elseif minetest.get_modpath("stairs") then
stairs.register_stair_and_slab("stonewall", "castle_masonry:stonewall",
{cracky=3, pickaxey=1},
{"castle_stonewall.png"},
S("Castle Stonewall Stair"),
S("Castle Stonewall Slab"),
castle_masonry.sounds.node_sound_stone_defaults()
)
stairs.register_stair_and_slab("rubble", "castle_masonry:rubble",
{cracky=3},
{"castle_rubble.png"},
S("Castle Rubble Stair"),
S("Castle Rubble Slab"),
castle_masonry.sounds.node_sound_stone_defaults()
)
end
--------------------------------------------------------------------------------------------------------------
minetest.register_node("castle_masonry:dungeon_stone", {
description = S("Dungeon Stone"),
drawtype = "normal",
tiles = {"castle_dungeon_stone.png"},
groups = {cracky=2, pickaxey=2},
_mcl_hardness = 1,
_mcl_blast_resistance = 1,
paramtype = "light",
sounds = castle_masonry.sounds.node_sound_stone_defaults(),
})
minetest.register_craft({
output = "castle_masonry:dungeon_stone 2",
recipe = {
{stonebrick, obsidian},
}
})
minetest.register_craft({
output = "castle_masonry:dungeon_stone 2",
recipe = {
{stonebrick},
{obsidian},
}
})
if minetest.get_modpath("moreblocks") then
stairsplus:register_all("castle_masonry", "dungeon_stone", "castle_masonry:dungeon_stone", {
description = S("Dungeon Stone"),
tiles = {"castle_dungeon_stone.png"},
groups = {cracky=2, pickaxey=2, not_in_creative_inventory=1},
sounds = castle_masonry.sounds.node_sound_stone_defaults(),
sunlight_propagates = true,
})
stairsplus:register_alias_all("castle", "dungeon_stone", "castle_masonry", "dungeon_stone")
elseif minetest.get_modpath("mcl_stairs") then
mcl_stairs.register_stair_and_slab("dungeon_stone", "castle_masonry:dungeon_stone",
{pickaxey=2},
{"castle_dungeon_stone.png"},
S("Dungeon Stone Stair"),
S("Dungeon Stone Slab"),
castle_masonry.sounds.node_sound_stone_defaults()
)
elseif minetest.get_modpath("stairs") then
stairs.register_stair_and_slab("dungeon_stone", "castle_masonry:dungeon_stone",
{cracky=2, pickaxey=2},
{"castle_dungeon_stone.png"},
S("Dungeon Stone Stair"),
S("Dungeon Stone Slab"),
castle_masonry.sounds.node_sound_stone_defaults()
)
end

21
textures/LICENSE.txt Normal file
View File

@ -0,0 +1,21 @@
--------------------------------------------
License Textures: Philipner - CC-BY-SA 3.0
-castle_corner_stonewall_tb.png
-castle_corner_stonewall1.png
-castle_corner_stonewall2.png
--------------------------------------------
16 px textures based on Castle mod
original textures by Philipner
License Textures: Napiophelios - CC-BY-SA 3.0
-castle_pavement_brick.png
-castle_rubble.png
-castle_slate.png
-castle_stonewall.png
--------------------------------------------

Binary file not shown.

After

Width:  |  Height:  |  Size: 696 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 672 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 682 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 543 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 691 B

BIN
textures/castle_rubble.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 557 B

BIN
textures/castle_slate.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 659 B