mirror of
https://github.com/minetest-mods/nether.git
synced 2024-12-27 19:30:28 +01:00
Update copyrights & require Minetest v0.4.16 or greater
Also adds nether.register_wormhole_node(), moving the wormhole node template into portal_api.lua, and allowing wormhole nodes with custom post_effect_color to be more easily created.
This commit is contained in:
parent
3945467152
commit
1d19546345
82
nodes.lua
82
nodes.lua
@ -1,70 +1,40 @@
|
||||
--[[
|
||||
|
||||
Nether mod for minetest
|
||||
|
||||
Copyright (C) 2013 PilzAdam
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for
|
||||
any purpose with or without fee is hereby granted, provided that the
|
||||
above copyright notice and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
|
||||
WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR
|
||||
BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
|
||||
OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
SOFTWARE.
|
||||
|
||||
]]--
|
||||
|
||||
local S = nether.get_translator
|
||||
|
||||
-- Portal node
|
||||
-- Portal/wormhole node
|
||||
|
||||
minetest.register_node("nether:portal", {
|
||||
nether.register_wormhole_node("nether:portal", {
|
||||
description = S("Nether Portal"),
|
||||
tiles = {
|
||||
"nether_transparent.png",
|
||||
"nether_transparent.png",
|
||||
"nether_transparent.png",
|
||||
"nether_transparent.png",
|
||||
{
|
||||
name = "nether_portal.png",
|
||||
animation = {
|
||||
type = "vertical_frames",
|
||||
aspect_w = 16,
|
||||
aspect_h = 16,
|
||||
length = 0.5,
|
||||
},
|
||||
},
|
||||
{
|
||||
name = "nether_portal.png",
|
||||
animation = {
|
||||
type = "vertical_frames",
|
||||
aspect_w = 16,
|
||||
aspect_h = 16,
|
||||
length = 0.5,
|
||||
},
|
||||
},
|
||||
},
|
||||
drawtype = "nodebox",
|
||||
paramtype = "light",
|
||||
paramtype2 = "colorfacedir",
|
||||
palette = "nether_portals_palette.png",
|
||||
post_effect_color = {
|
||||
-- post_effect_color can't be changed dynamically in Minetest like the portal colour is.
|
||||
-- If you need a different post_effect_color then create a custom node and set it as the
|
||||
-- wormhole_node_name in your portaldef.
|
||||
-- If you need a different post_effect_color then use register_wormhole_node to create
|
||||
-- another wormhole node and set it as the wormhole_node_name in your portaldef.
|
||||
-- Hopefully this colour is close enough to magenta to work with the traditional magenta
|
||||
-- portals, close enough to red to work for a red portal, and also close enough to red to
|
||||
-- work with blue & cyan portals - since blue portals are sometimes portrayed as being red
|
||||
-- from the opposite side / from the inside.
|
||||
a = 160, r = 128, g = 0, b = 80
|
||||
},
|
||||
sunlight_propagates = true,
|
||||
use_texture_alpha = true,
|
||||
walkable = false,
|
||||
diggable = false,
|
||||
pointable = false,
|
||||
buildable_to = false,
|
||||
is_ground_content = false,
|
||||
drop = "",
|
||||
light_source = 5,
|
||||
alpha = 192,
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.1, 0.5, 0.5, 0.1},
|
||||
},
|
||||
},
|
||||
groups = {not_in_creative_inventory = 1},
|
||||
mesecons = {receptor = {
|
||||
state = "on",
|
||||
rules = function(node)
|
||||
return nether.get_mesecon_emission_rules_from_colorfacedir(node.param2)
|
||||
end
|
||||
}}
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
|
117
portal_api.lua
117
portal_api.lua
@ -1,6 +1,30 @@
|
||||
-- see portal_api.txt for documentation
|
||||
--[[
|
||||
|
||||
Portal API for Minetest
|
||||
|
||||
See portal_api.txt for documentation
|
||||
|
||||
--
|
||||
|
||||
Copyright (C) 2020 Treer
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for
|
||||
any purpose with or without fee is hereby granted, provided that the
|
||||
above copyright notice and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
|
||||
WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR
|
||||
BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
|
||||
OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
SOFTWARE.
|
||||
|
||||
]]--
|
||||
|
||||
local DEBUG = false
|
||||
local IGNORE_MODSTORAGE_PORTALS = false -- set true if you don't want portals to remember where they were linked - sometimes it's handy for debugging to have the portal always recalculate its target
|
||||
local DEBUG_IGNORE_MODSTORAGE = false -- setting true prevents portals from knowing where other portals are, forcing find_realm_anchorpos() etc. to be executed every time
|
||||
|
||||
nether.registered_portals = {}
|
||||
|
||||
@ -18,6 +42,10 @@ nether.portals_palette = {
|
||||
}
|
||||
|
||||
|
||||
if minetest.get_mod_storage == nil then
|
||||
error(nether.modname .. " does not support Minetest versions earlier than 0.4.16", 0)
|
||||
end
|
||||
|
||||
--[[
|
||||
|
||||
Positions
|
||||
@ -619,7 +647,7 @@ end
|
||||
-- Add portal information to mod storage, so new portals may find existing portals near the target location.
|
||||
-- Do this whenever a portal is created or changes its ignition state
|
||||
local function store_portal_location_info(portal_name, anchorPos, orientation, ignited)
|
||||
if not IGNORE_MODSTORAGE_PORTALS then
|
||||
if not DEBUG_IGNORE_MODSTORAGE then
|
||||
mod_storage:set_string(
|
||||
minetest.pos_to_string(anchorPos) .. " is " .. portal_name,
|
||||
minetest.serialize({orientation = orientation, active = ignited})
|
||||
@ -630,7 +658,7 @@ end
|
||||
-- Remove portal information from mod storage.
|
||||
-- Do this if a portal frame is destroyed such that it cannot be ignited anymore.
|
||||
local function remove_portal_location_info(portal_name, anchorPos)
|
||||
if not IGNORE_MODSTORAGE_PORTALS then
|
||||
if not DEBUG_IGNORE_MODSTORAGE then
|
||||
mod_storage:set_string(minetest.pos_to_string(anchorPos) .. " is " .. portal_name, "")
|
||||
end
|
||||
end
|
||||
@ -649,7 +677,7 @@ local function list_closest_portals(portal_definition, anchorPos, distance_limit
|
||||
|
||||
local result = {}
|
||||
|
||||
if not IGNORE_MODSTORAGE_PORTALS then
|
||||
if not DEBUG_IGNORE_MODSTORAGE then
|
||||
|
||||
local isRealm = portal_definition.is_within_realm(anchorPos)
|
||||
if distance_limit == nil then distance_limit = -1 end
|
||||
@ -1618,6 +1646,85 @@ minetest.register_lbm({
|
||||
-- ==================== --
|
||||
|
||||
|
||||
-- the fallback defaults for wormhole nodedefs
|
||||
local wormhole_nodedef_default = {
|
||||
description = S("Portal wormhole"),
|
||||
tiles = {
|
||||
"nether_transparent.png",
|
||||
"nether_transparent.png",
|
||||
"nether_transparent.png",
|
||||
"nether_transparent.png",
|
||||
{
|
||||
name = "nether_portal.png",
|
||||
animation = {
|
||||
type = "vertical_frames",
|
||||
aspect_w = 16,
|
||||
aspect_h = 16,
|
||||
length = 0.5,
|
||||
},
|
||||
},
|
||||
{
|
||||
name = "nether_portal.png",
|
||||
animation = {
|
||||
type = "vertical_frames",
|
||||
aspect_w = 16,
|
||||
aspect_h = 16,
|
||||
length = 0.5,
|
||||
},
|
||||
},
|
||||
},
|
||||
drawtype = "nodebox",
|
||||
paramtype = "light",
|
||||
paramtype2 = "colorfacedir",
|
||||
palette = "nether_portals_palette.png",
|
||||
post_effect_color = {
|
||||
-- post_effect_color can't be changed dynamically in Minetest like the portal colour is.
|
||||
-- If you need a different post_effect_color then use register_wormhole_node() to create
|
||||
-- another wormhole node with the right post_effect_color and set it as the wormhole_node_name
|
||||
-- in your portaldef.
|
||||
-- Hopefully this colour is close enough to magenta to work with the traditional magenta
|
||||
-- portals, close enough to red to work for a red portal, and also close enough to red to
|
||||
-- work with blue & cyan portals - since blue portals are sometimes portrayed as being red
|
||||
-- from the opposite side / from the inside.
|
||||
a = 160, r = 128, g = 0, b = 80
|
||||
},
|
||||
sunlight_propagates = true,
|
||||
use_texture_alpha = true,
|
||||
walkable = false,
|
||||
diggable = false,
|
||||
pointable = false,
|
||||
buildable_to = false,
|
||||
is_ground_content = false,
|
||||
drop = "",
|
||||
light_source = 5,
|
||||
alpha = 192,
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.1, 0.5, 0.5, 0.1},
|
||||
},
|
||||
},
|
||||
groups = {not_in_creative_inventory = 1},
|
||||
mesecons = {receptor = {
|
||||
state = "on",
|
||||
rules = function(node)
|
||||
return nether.get_mesecon_emission_rules_from_colorfacedir(node.param2)
|
||||
end
|
||||
}}
|
||||
}
|
||||
|
||||
-- Call only at load time
|
||||
function nether.register_wormhole_node(name, nodedef)
|
||||
assert(name ~= nil, "Unable to register wormhole node: Name is nil")
|
||||
assert(nodedef ~= nil, "Unable to register wormhole node ''" .. name .. "'': nodedef is nil")
|
||||
|
||||
for key, value in pairs(wormhole_nodedef_default) do
|
||||
if nodedef[key] == nil then nodedef[key] = value end
|
||||
end
|
||||
minetest.register_node(name, nodedef)
|
||||
end
|
||||
|
||||
|
||||
-- The fallback defaults for registered portaldef tables
|
||||
local portaldef_default = {
|
||||
shape = nether.PortalShape_Traditional,
|
||||
|
@ -74,18 +74,28 @@ Call these functions only at load time:
|
||||
clashes with a portal already registered by another mod, e.g. if the size
|
||||
and frame node is not unique.
|
||||
A false return value should be handled, you could:
|
||||
* Fall back to using a secondary material for portals to be built with.
|
||||
* 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).
|
||||
* Fall back to using a secondary material for portals to be built with.
|
||||
* 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
|
||||
* register_portal_ignition_item(name, ignition_failure_sound)
|
||||
* 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.
|
||||
|
||||
* `nether.register_wormhole_node(name, nodedef_overrides)`
|
||||
* Can be used to register wormhole nodes with a different post_effect_color
|
||||
from the "nether:portal" node. "Post effect color" is the tint the world
|
||||
takes on when you are standing inside a portal. `post_effect_color` is the
|
||||
only key/value that is needed in the nodedef_overrides table to achieve that,
|
||||
but the function allows any nodedef key/value to be specified/overridden.
|
||||
* Invokes `minetest.register_node()`, so can only be called at mod 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.
|
||||
|
||||
|
||||
Portal definition
|
||||
|
@ -1,13 +1,16 @@
|
||||
--[[
|
||||
|
||||
Nether mod portal examples for Minetest
|
||||
|
||||
These portal API examples work independently of the Nether realm and Nether portal.
|
||||
To try these examples, enable them in Mintest -> Settings -> All settings -> Mods -> nether
|
||||
Once enabled, their shapes/plans will be shown in the book of portals.
|
||||
These portal API examples work independently of the Nether realm
|
||||
and Nether portal. To try these examples, enable them in:
|
||||
Mintest -> Settings -> All settings -> Mods -> nether
|
||||
Once enabled, details on how to build them can be found in dungeon
|
||||
chests in the book of portals.
|
||||
|
||||
--
|
||||
|
||||
Copyright (C) 2019 Treer
|
||||
Copyright (C) 2020 Treer
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for
|
||||
any purpose with or without fee is hereby granted, provided that the
|
||||
@ -61,7 +64,7 @@ if minetest.settings:get_bool("nether_enable_portal_example_floatlands", ENABLE_
|
||||
nether.register_portal("floatlands_portal", {
|
||||
shape = nether.PortalShape_Platform,
|
||||
frame_node_name = "default:ice",
|
||||
wormhole_node_color = 7, -- 2 is blue
|
||||
wormhole_node_color = 7, -- 7 is white
|
||||
particle_texture = {
|
||||
name = "nether_particle_anim1.png",
|
||||
animation = {
|
||||
@ -146,7 +149,7 @@ if minetest.settings:get_bool("nether_enable_portal_example_surfacetravel", ENAB
|
||||
|
||||
is_within_realm = function(pos)
|
||||
-- Always return true, because these portals always just take you around the surface
|
||||
-- rather than taking you to a realm
|
||||
-- rather than taking you to a different realm
|
||||
return true
|
||||
end,
|
||||
|
||||
@ -185,7 +188,8 @@ if minetest.settings:get_bool("nether_enable_portal_example_surfacetravel", ENAB
|
||||
-- use the existing portal that was found near target_x, target_z
|
||||
return existing_portal_location, existing_portal_orientation
|
||||
else
|
||||
-- find a good location for the new portal
|
||||
-- find a good location for the new portal, or if that isn't possible then at
|
||||
-- least adjust the coords a little so portals don't line up in a grid
|
||||
local adj_x, adj_z = 0, 0
|
||||
|
||||
if minetest.get_spawn_level ~= nil then -- older versions of Minetest don't have this
|
||||
@ -198,7 +202,7 @@ if minetest.settings:get_bool("nether_enable_portal_example_surfacetravel", ENAB
|
||||
minetest.get_mapgen_setting("seed") * 3
|
||||
)
|
||||
|
||||
local attemptLimit = 12 -- how many attempts we'll make at finding a good location
|
||||
local attemptLimit = 15 -- how many attempts we'll make at finding a good location
|
||||
for attempt = 1, attemptLimit do
|
||||
adj_x = math.floor(prng:rand_normal_dist(-search_radius, search_radius, 2) + 0.5)
|
||||
adj_z = math.floor(prng:rand_normal_dist(-search_radius, search_radius, 2) + 0.5)
|
||||
|
Loading…
Reference in New Issue
Block a user