From 32e5d818e85c931f39af2b7b9173262b20b10bc8 Mon Sep 17 00:00:00 2001 From: Treer Date: Sat, 8 Feb 2020 17:15:33 +1100 Subject: [PATCH] Use lua schematics instead of .mts files when building portals Removes the need for the get_malleated_schematic_filename hack --- portal_api.lua | 192 +++++++++++++++++++------- portal_api.txt | 14 +- schematics/nether_portal.mts | Bin 87 -> 0 bytes schematics/nether_portal_circular.mts | Bin 128 -> 0 bytes schematics/nether_portal_platform.mts | Bin 88 -> 0 bytes 5 files changed, 147 insertions(+), 59 deletions(-) delete mode 100644 schematics/nether_portal.mts delete mode 100644 schematics/nether_portal_circular.mts delete mode 100644 schematics/nether_portal_platform.mts diff --git a/portal_api.lua b/portal_api.lua index 9abe801..6671ba1 100644 --- a/portal_api.lua +++ b/portal_api.lua @@ -113,6 +113,9 @@ metadata). ]] +local __ = {name = "air", prob = 0} +local AA = {name = "air", prob = 255, force_place = true} +local OO = {name = "default:obsidian", prob = 255, force_place = true} -- This object defines a portal's shape, segregating the shape logic code from portal behaviour code. -- You can create a new "PortalShape" definition object which implements the same @@ -123,7 +126,6 @@ nether.PortalShape_Traditional = { name = "Traditional", size = vector.new(4, 5, 1), -- size of the portal, and not necessarily the size of the schematic, -- which may clear area around the portal. - schematic_filename = nether.path .. "/schematics/nether_portal.mts", is_horizontal = false, -- whether the wormhole is a vertical or horizontal surface diagram_image = { image = "nether_book_diagram_traditional.png", -- The diagram to be shown in the Book of Portals @@ -267,7 +269,42 @@ nether.PortalShape_Traditional = { -- wait in a portal long enough you teleport again. So a trap portal would have to link -- to one of two blocked-in portals which link to each other - which is possible, but -- quite extreme. - end + end, + + schematic = { + size = {x = 4, y = 5, z = 5}, + data = { -- note that data is upside down + __,__,__,__, + AA,AA,AA,AA, + AA,AA,AA,AA, + AA,AA,AA,AA, + AA,AA,AA,AA, + + __,__,__,__, + AA,AA,AA,AA, + AA,AA,AA,AA, + AA,AA,AA,AA, + AA,AA,AA,AA, + + OO,OO,OO,OO, + OO,AA,AA,OO, + OO,AA,AA,OO, + OO,AA,AA,OO, + OO,OO,OO,OO, + + __,__,__,__, + AA,AA,AA,AA, + AA,AA,AA,AA, + AA,AA,AA,AA, + AA,AA,AA,AA, + + __,__,__,__, + AA,AA,AA,AA, + AA,AA,AA,AA, + AA,AA,AA,AA, + AA,AA,AA,AA, + } + } } -- End of PortalShape_Traditional class @@ -276,7 +313,6 @@ nether.PortalShape_Circular = { name = "Circular", size = vector.new(7, 7, 1), -- size of the portal, and not necessarily the size of the schematic, -- which may clear area around the portal. - schematic_filename = nether.path .. "/schematics/nether_portal_circular.mts", is_horizontal = false, -- whether the wormhole is a vertical or horizontal surface diagram_image = { image = "nether_book_diagram_circular.png", -- The diagram to be shown in the Book of Portals @@ -401,7 +437,68 @@ nether.PortalShape_Circular = { assert(orientation, "no orientation passed") -- Not implemented. - end + end, + + schematic = { + size = {x = 7, y = 7, z = 7}, + data = { -- note that data is upside down + __,__,__,__,__,__,__, + __,__,__,__,__,__,__, + __,__,AA,AA,AA,__,__, + __,__,AA,AA,AA,__,__, + __,__,AA,AA,AA,__,__, + __,__,__,__,__,__,__, + __,__,__,__,__,__,__, + + __,__,__,__,__,__,__, + __,AA,AA,AA,AA,AA,__, + __,AA,AA,AA,AA,AA,__, + __,AA,AA,AA,AA,AA,__, + __,AA,AA,AA,AA,AA,__, + __,AA,AA,AA,AA,AA,__, + __,__,__,__,__,__,__, + + __,__,__,__,__,__,__, + __,AA,AA,AA,AA,AA,__, + AA,AA,AA,AA,AA,AA,AA, + AA,AA,AA,AA,AA,AA,AA, + AA,AA,AA,AA,AA,AA,AA, + __,AA,AA,AA,AA,AA,__, + __,__,AA,AA,AA,__,__, + + __,__,OO,OO,OO,__,__, + __,OO,AA,AA,AA,OO,__, + OO,AA,AA,AA,AA,AA,OO, + OO,AA,AA,AA,AA,AA,OO, + OO,AA,AA,AA,AA,AA,OO, + __,OO,AA,AA,AA,OO,__, + __,__,OO,OO,OO,__,__, + + __,__,__,__,__,__,__, + __,AA,AA,AA,AA,AA,__, + AA,AA,AA,AA,AA,AA,AA, + AA,AA,AA,AA,AA,AA,AA, + AA,AA,AA,AA,AA,AA,AA, + __,AA,AA,AA,AA,AA,__, + __,__,AA,AA,AA,__,__, + + __,__,__,__,__,__,__, + __,AA,AA,AA,AA,AA,__, + __,AA,AA,AA,AA,AA,__, + __,AA,AA,AA,AA,AA,__, + __,AA,AA,AA,AA,AA,__, + __,AA,AA,AA,AA,AA,__, + __,__,__,__,__,__,__, + + __,__,__,__,__,__,__, + __,__,__,__,__,__,__, + __,__,AA,AA,AA,__,__, + __,__,AA,AA,AA,__,__, + __,__,AA,AA,AA,__,__, + __,__,__,__,__,__,__, + __,__,__,__,__,__,__, + } + } } -- End of PortalShape_Circular class @@ -411,7 +508,6 @@ nether.PortalShape_Platform = { name = "Platform", size = vector.new(5, 2, 5), -- size of the portal, and not necessarily the size of the schematic, -- which may clear area around the portal. - schematic_filename = nether.path .. "/schematics/nether_portal_platform.mts", is_horizontal = true, -- whether the wormhole is a vertical or horizontal surface diagram_image = { image = "nether_book_diagram_platform.png", -- The diagram to be shown in the Book of Portals @@ -495,7 +591,42 @@ nether.PortalShape_Platform = { disable_portal_trap = function(anchorPos, orientation) -- Not implemented. - end + end, + + schematic = { + size = {x = 5, y = 5, z = 5}, + data = { -- note that data is upside down + __,__,__,__,__, + OO,OO,OO,OO,OO, + __,AA,AA,AA,__, + __,AA,AA,AA,__, + __,__,__,__,__, + + __,OO,OO,OO,__, + OO,AA,AA,AA,OO, + AA,AA,AA,AA,AA, + AA,AA,AA,AA,AA, + __,AA,AA,AA,__, + + __,OO,OO,OO,__, + OO,AA,AA,AA,OO, + AA,AA,AA,AA,AA, + AA,AA,AA,AA,AA, + __,AA,AA,AA,__, + + __,OO,OO,OO,__, + OO,AA,AA,AA,OO, + AA,AA,AA,AA,AA, + AA,AA,AA,AA,AA, + __,AA,AA,AA,__, + + __,__,__,__,__, + OO,OO,OO,OO,OO, + __,AA,AA,AA,__, + __,AA,AA,AA,__, + __,__,__,__,__, + } + } } -- End of PortalShape_Platform class @@ -512,7 +643,6 @@ nether.PortalShape_Platform = { local ignition_item_name local S = nether.get_translator local mod_storage = minetest.get_mod_storage() -local malleated_filenames = {} local meseconsAvailable = minetest.get_modpath("mesecon") ~= nil and minetest.global_exists("mesecon") local book_added_as_treasure = false @@ -1011,11 +1141,10 @@ local function build_portal(portal_definition, anchorPos, orientation, destinati minetest.place_schematic( portal_definition.shape.get_schematicPos_from_anchorPos(anchorPos, orientation), - portal_definition.schematic_filename, + portal_definition.shape.schematic, orientation, { -- node replacements ["default:obsidian"] = portal_definition.frame_node_name, - ["nether:portal"] = portal_definition.wormhole_node_name }, true ) @@ -1100,7 +1229,8 @@ local function locate_or_build_portal(portal_definition, suggested_wormholePos, local result_target_str = minetest.get_meta(result_anchorPos):get_string("target") local result_target = minetest.string_to_pos(result_target_str) if result_target ~= nil and vector.equals(result_target, destination_wormholePos) then - -- don't extinguish the portal the player is teleporting from + -- It already links back to the portal the player is teleporting from, so don't + -- extinguish it or the player's portal will also extinguish. if DEBUG then minetest.chat_send_all(" Build unnecessary: already a lit portal that links back here at " .. minetest.pos_to_string(found_anchorPos) .. ", orientation " .. result_orientation) end else if DEBUG then minetest.chat_send_all(" Build unnecessary: already a lit portal at " .. minetest.pos_to_string(found_anchorPos) .. ", orientation " .. result_orientation .. ", linking to " .. result_target_str .. ". Extinguishing...") end @@ -1626,46 +1756,6 @@ local function create_book_of_portals() end end --- This is hack to work around how place_schematic() never invalidates its cache. --- A unique schematic filename is generated for each unique set of node replacements -function get_malleated_schematic_filename(portal_definition) - - local result - - if portal_definition.shape ~= nil and portal_definition.shape.schematic_filename ~= nil then - - local schematicFileName = portal_definition.shape.schematic_filename - local uniqueId = portal_definition.frame_node_name .. " " .. portal_definition.wormhole_node_name - - if malleated_filenames[schematicFileName] == nil then malleated_filenames[schematicFileName] = {} end - local filenamesForSchematic = malleated_filenames[schematicFileName] - - -- Split the schematic's filename into the path and filename - local lastSlashPos, _ = schematicFileName:find("/[^/]+$") -- find the rightmost slash - local lastBackslashPos, _ = schematicFileName:find("\\[^\\]+$") -- find the rightmost backslash - if lastSlashPos == nil then lastSlashPos = -1 end - if lastBackslashPos ~= nil then lastSlashPos = math.max(lastSlashPos, lastBackslashPos) end - local part_path = schematicFileName:sub(0, math.max(0, lastSlashPos - 1)) - local part_filename = schematicFileName:sub(lastSlashPos + 1) - - if filenamesForSchematic[uniqueId] == nil then - - local malleationCount = 0 - for _ in pairs(filenamesForSchematic) do malleationCount = malleationCount + 1 end - - local malleatedFilename = part_path .. DIR_DELIM - for i = 1, malleationCount do - malleatedFilename = malleatedFilename .. '.' .. DIR_DELIM -- should work on both Linux and Windows - end - malleatedFilename = malleatedFilename .. part_filename - filenamesForSchematic[uniqueId] = malleatedFilename - end - result = filenamesForSchematic[uniqueId] - end - - return result -end - function register_frame_node(frame_node_name) @@ -1916,8 +2006,6 @@ function nether.register_portal(name, portaldef) if portaldef.sounds ~= nil then setmetatable(portaldef.sounds, {__index = portaldef_default.sounds}) end setmetatable(portaldef, {__index = portaldef_default}) - portaldef.schematic_filename = get_malleated_schematic_filename(portaldef) - if portaldef.particle_color == nil then -- default the particle colours to be the same as the wormhole colour assert(portaldef.wormhole_node_color >= 0 and portaldef.wormhole_node_color < 8, "portaldef.wormhole_node_color must be between 0 and 7 (inclusive)") diff --git a/portal_api.txt b/portal_api.txt index a7f27c8..e60ba43 100644 --- a/portal_api.txt +++ b/portal_api.txt @@ -31,11 +31,11 @@ docoration functions without triggering the node's `on_destruct` handler. Realms ------ -This API uses the concept of a "realm" for each type of portal. If a portal is +This API uses the concept of a realm for each type of portal. If a portal is outside its realm then it links to a portal inside the realm, if a portal is inside its realm then it links to the outside. -You get to decide what consitutes your realm by implementing the function +You get to decide what constitutes your realm by implementing the function `is_within_realm(position)`. For example, the Nether realm is defined as existing at a certain depth and @@ -91,11 +91,6 @@ Call these functions only at load time: * Use error() to exit lua with a message explaining how two mods are clashing and how it can be resolved. * Continue without a portal (the reason will be logged for the user). -* `nether.unregister_portal(name)` - * Unregisters the portal from the engine, and deletes the entry with key - `name` from `nether.registered_portals` and associated internal tables. - * Returns true on success - * You will probably never need to call this, it exists only for completeness. * `nether.register_portal_ignition_item(name, ignition_failure_sound)` * ignition_failure_sound is optional, it plays any time an attempt to use the item occurs if a portal is not ignited. @@ -108,6 +103,11 @@ Call these functions only at load time: * After `register_wormhole_node()`, invoke `register_portal()` and include `wormhole_node_name` in the portal_definition, assigning it the name of the new wormhole node. +* `nether.unregister_portal(name)` + * Unregisters the portal from the engine, and deletes the entry with key + `name` from `nether.registered_portals` and associated internal tables. + * Returns true on success + * You will probably never need to call this, it exists only for completeness. Portal definition diff --git a/schematics/nether_portal.mts b/schematics/nether_portal.mts deleted file mode 100644 index 4c38fd5cb6469ddecf9c9df866451fb453a54ec0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87 zcmeYb3HD`R0YX*=)_M?NU}j)W%q(IMNJ&jgEX^sg%1cZq^(6VvnfeC`0ybm8gUiiw{yjWxc&%giw`#m29a7;Slo_P6#ymUjh b!^UYWyehXHmdShYEe&)CWneJyTGIyr+E*`C diff --git a/schematics/nether_portal_platform.mts b/schematics/nether_portal_platform.mts deleted file mode 100644 index 4f510d0aed756464f37492f3456c670ae3ed97d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88 zcmeYb3HD`RVPFNpdJte>Vqi|pEMgEyNli;E%_*_UPb$t#$xO_vn3J5~z|@oAA#vb} o;h~?+j_k|gln(s=|9>LqjvMtM4FOKGSp2Nngcul7?*tqL0L;7}zyJUM