forked from VoxeLibre/VoxeLibre
Update railcorridors, enable chest minecarts (#4620)
Minecart chests seem to work by now. Reviewed-on: VoxeLibre/VoxeLibre#4620 Reviewed-by: Mikita Wiśniewski <rudzik8@protonmail.com> Co-authored-by: kno10 <erich.schubert@gmail.com> Co-committed-by: kno10 <erich.schubert@gmail.com>
This commit is contained in:
parent
2dadfda76b
commit
ecfa42d51d
|
@ -0,0 +1,9 @@
|
|||
Copyright © 2023 Wuzzy, joz
|
||||
|
||||
The MIT License
|
||||
|
||||
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.
|
|
@ -1,7 +1,7 @@
|
|||
# Railway corridors [`tsm_railcorridors`]
|
||||
VoxeLibre adaption. NO TREASURER SUPPORT!
|
||||
|
||||
* Current version 0.14.0
|
||||
* Current version 0.14.5
|
||||
|
||||
Minetest mod for adding underground corridors with rails and wood constructions with a few treasure chests now and then.
|
||||
Optional support for the Treasurer mod is available for adding treasures from various mods.
|
||||
|
@ -10,7 +10,7 @@ Cobwebs are added if the `mobs_monster` mod is found.
|
|||
Use the advanced settings to finetune the railway corridors.
|
||||
|
||||
* Forum thread: https://forum.minetest.net/viewtopic.php?t=10339
|
||||
* License: MIT License.
|
||||
* License: MIT License (see `LICENSE.txt`).
|
||||
|
||||
## Info for game makers
|
||||
Want to include this mod in a game, but you have problems with the dependencies?
|
||||
|
|
|
@ -27,7 +27,7 @@ if mg_name == "v6" then
|
|||
}
|
||||
else
|
||||
-- This generates dark oak wood in mesa biomes and oak wood everywhere else.
|
||||
function tsm_railcorridors.nodes.corridor_woods_function(pos, node)
|
||||
function tsm_railcorridors.nodes.corridor_woods_function(_, node)
|
||||
if minetest.get_item_group(node.name, "hardened_clay") ~= 0 then
|
||||
return "mcl_core:darkwood", "mcl_fences:dark_oak_fence"
|
||||
else
|
||||
|
@ -36,34 +36,36 @@ else
|
|||
end
|
||||
end
|
||||
|
||||
tsm_railcorridors.carts = { "mcl_minecarts:chest_minecart" }
|
||||
|
||||
-- TODO: Use minecart with chest instead of normal minecart
|
||||
tsm_railcorridors.carts = { "mcl_minecarts:minecart" }
|
||||
-- This is called after a spawner has been placed by the game.
|
||||
-- Use this to properly set up the metadata and stuff.
|
||||
-- This is needed for games if they include mob spawners.
|
||||
-- All spawners spawn cave spiders
|
||||
function tsm_railcorridors.on_construct_spawner(pos)
|
||||
mcl_mobspawners.setup_spawner(pos, "mobs_mc:cave_spider", 0, 7)
|
||||
end
|
||||
|
||||
function tsm_railcorridors.on_construct_cart(pos, cart)
|
||||
-- TODO: Fill cart with treasures
|
||||
|
||||
-- This is it? There's this giant hack announced in
|
||||
-- the other file and I grep for the function and it's
|
||||
-- a stub? :)
|
||||
|
||||
-- The path here using some minetest.after hackery was
|
||||
-- deactivated in init.lua - reactivate when this does
|
||||
-- something the function is called RecheckCartHack.
|
||||
-- This is called after a cart has been placed by the game.
|
||||
-- Use this to properly set up entity metadata and stuff.
|
||||
-- * pos: Position of cart
|
||||
-- * cart: Cart entity
|
||||
function tsm_railcorridors.on_construct_cart(_, cart, pr_carts)
|
||||
local l = cart:get_luaentity()
|
||||
local inv = mcl_entity_invs.load_inv(l,27)
|
||||
local items = tsm_railcorridors.get_treasures(pr_carts)
|
||||
mcl_loot.fill_inventory(inv, "main", items, pr_carts)
|
||||
mcl_entity_invs.save_inv(l)
|
||||
end
|
||||
|
||||
-- Fallback function. Returns a random treasure. This function is called for chests
|
||||
-- only if the Treasurer mod is not found.
|
||||
-- pr: A PseudoRandom object
|
||||
function tsm_railcorridors.get_default_treasure(pr)
|
||||
function tsm_railcorridors.get_default_treasure(_)
|
||||
-- UNUSED IN MINECLONE 2!
|
||||
end
|
||||
|
||||
-- All spawners spawn cave spiders
|
||||
function tsm_railcorridors.on_construct_spawner(pos)
|
||||
mcl_mobspawners.setup_spawner(pos, "mobs_mc:cave_spider", 0, 7)
|
||||
end
|
||||
|
||||
-- MineClone 2's treasure function. Gets all treasures for a single chest.
|
||||
-- Based on information from Minecraft Wiki.
|
||||
function tsm_railcorridors.get_treasures(pr)
|
||||
|
|
|
@ -10,8 +10,7 @@ dofile(minetest.get_modpath(minetest.get_current_modname()).."/gameconfig.lua")
|
|||
local setting
|
||||
|
||||
-- Probability function
|
||||
-- TODO: Check if this is correct
|
||||
local function P(float)
|
||||
local P = function (float)
|
||||
return math.floor(32767 * float)
|
||||
end
|
||||
|
||||
|
@ -27,8 +26,8 @@ elseif setting then
|
|||
end
|
||||
|
||||
-- Minimal and maximal value of path length (forks don't look up this value)
|
||||
local way_min = 4;
|
||||
local way_max = 7;
|
||||
local way_min = 4
|
||||
local way_max = 7
|
||||
setting = tonumber(minetest.settings:get("tsm_railcorridors_way_min"))
|
||||
if setting then
|
||||
way_min = setting
|
||||
|
@ -74,7 +73,7 @@ if setting then
|
|||
end
|
||||
|
||||
-- Probability for a rail corridor system to be damaged
|
||||
local probability_damage = P(1.0)
|
||||
local probability_damage = P(0.55)
|
||||
setting = tonumber(minetest.settings:get("tsm_railcorridors_probability_damage"))
|
||||
if setting then
|
||||
probability_damage = P(setting)
|
||||
|
@ -83,14 +82,14 @@ end
|
|||
-- Enable cobwebs
|
||||
local place_cobwebs = true
|
||||
setting = minetest.settings:get_bool("tsm_railcorridors_place_cobwebs")
|
||||
if setting then
|
||||
if setting ~= nil then
|
||||
place_cobwebs = setting
|
||||
end
|
||||
|
||||
-- Enable mob spawners
|
||||
local place_mob_spawners = true
|
||||
setting = minetest.settings:get_bool("tsm_railcorridors_place_mob_spawners")
|
||||
if setting then
|
||||
if setting ~= nil then
|
||||
place_mob_spawners = setting
|
||||
end
|
||||
|
||||
|
@ -153,17 +152,17 @@ local function SetNodeIfCanBuild(pos, node, check_above, can_replace_rail)
|
|||
if check_above then
|
||||
local abovename = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}).name
|
||||
local abovedef = minetest.registered_nodes[abovename]
|
||||
if abovename == "unknown" or abovename == "ignore" or
|
||||
(abovedef and abovedef.groups and abovedef.groups.attached_node) or
|
||||
if (not abovedef) or abovename == "unknown" or abovename == "ignore" or
|
||||
(abovedef.groups and abovedef.groups.attached_node) or
|
||||
-- This is done because cobwebs are often fake liquids
|
||||
(abovedef and abovedef.liquidtype ~= "none" and abovename ~= tsm_railcorridors.nodes.cobweb) then
|
||||
(abovedef.liquidtype ~= "none" and abovename ~= tsm_railcorridors.nodes.cobweb) then
|
||||
return false
|
||||
end
|
||||
end
|
||||
local name = minetest.get_node(pos).name
|
||||
local def = minetest.registered_nodes[name]
|
||||
if name ~= "unknown" and name ~= "ignore" and
|
||||
((def and def.is_ground_content and def.liquidtype == "none") or
|
||||
if name ~= "unknown" and name ~= "ignore" and def and
|
||||
((def.is_ground_content and def.liquidtype == "none") or
|
||||
name == tsm_railcorridors.nodes.cobweb or
|
||||
name == tsm_railcorridors.nodes.torch_wall or
|
||||
name == tsm_railcorridors.nodes.torch_floor or
|
||||
|
@ -178,7 +177,7 @@ end
|
|||
|
||||
-- Tries to place a rail, taking the damage chance into account
|
||||
local function PlaceRail(pos, damage_chance)
|
||||
if damage_chance and damage_chance > 0 then
|
||||
if damage_chance ~= nil and damage_chance > 0 then
|
||||
local x = pr:next(0,100)
|
||||
if x <= damage_chance then
|
||||
return false
|
||||
|
@ -211,7 +210,7 @@ local function NeedsPlatform(pos)
|
|||
local falling = minetest.get_item_group(node.name, "falling_node") == 1
|
||||
return
|
||||
-- Node can be replaced if ground content or rail
|
||||
(node.name ~= "ignore" and node.name ~= "unknown" and nodedef and nodedef.is_ground_content) and
|
||||
(nodedef and node.name ~= "ignore" and node.name ~= "unknown" and nodedef.is_ground_content) and
|
||||
-- Node needs platform if node below is not walkable.
|
||||
-- Unless 2 nodes below there is dirt: This is a special case for the starter cube.
|
||||
((nodedef.walkable == false and node2.name ~= tsm_railcorridors.nodes.dirt) or
|
||||
|
@ -237,7 +236,7 @@ end
|
|||
local function Cube(p, radius, node, replace_air_only, wood, post)
|
||||
local y_top = p.y+radius
|
||||
local nodedef = minetest.registered_nodes[node.name]
|
||||
local solid = nodedef.walkable and (nodedef.node_box == nil or nodedef.node_box.type == "regular") and nodedef.liquidtype == "none"
|
||||
local solid = nodedef and nodedef.walkable and (nodedef.node_box == nil or nodedef.node_box.type == "regular") and nodedef.liquidtype == "none"
|
||||
-- Check if all the nodes could be set
|
||||
local built_all = true
|
||||
|
||||
|
@ -253,7 +252,7 @@ local function Cube(p, radius, node, replace_air_only, wood, post)
|
|||
if yi == y_top then
|
||||
local topnode = minetest.get_node({x=xi,y=yi+1,z=zi})
|
||||
local topdef = minetest.registered_nodes[topnode.name]
|
||||
if minetest.get_item_group(topnode.name, "attached_node") ~= 1 and topdef and topdef.liquidtype == "none" then
|
||||
if topdef and minetest.get_item_group(topnode.name, "attached_node") ~= 1 and topdef.liquidtype == "none" then
|
||||
ok = true
|
||||
end
|
||||
elseif column_last_attached and yi == column_last_attached - 1 then
|
||||
|
@ -364,8 +363,7 @@ local function Platform(p, radius, node, node2)
|
|||
if not node2 then
|
||||
node2 = { name = tsm_railcorridors.nodes.dirt }
|
||||
end
|
||||
local n1 = {}
|
||||
local n2 = {}
|
||||
local n1, n2 = {}, {}
|
||||
for zi = p.z-radius, p.z+radius do
|
||||
for xi = p.x-radius, p.x+radius do
|
||||
local np, np2 = NeedsPlatform({x=xi,y=p.y,z=zi})
|
||||
|
@ -394,33 +392,26 @@ local function PlaceChest(pos, param2)
|
|||
end
|
||||
end
|
||||
|
||||
|
||||
-- This function checks if a cart has ACTUALLY been spawned.
|
||||
-- To be calld by minetest.after.
|
||||
-- This is a workaround thanks to the fact that minetest.add_entity is unreliable as fuck
|
||||
-- See: https://github.com/minetest/minetest/issues/4759
|
||||
-- FIXME: Kill this horrible hack with fire as soon you can.
|
||||
|
||||
-- Why did anyone activate it in the first place? It doesn't
|
||||
-- have a function seeing as there are no chest minecarts yet.
|
||||
--[[
|
||||
local function RecheckCartHack(params)
|
||||
local pos = params[1]
|
||||
local cart_id = params[2]
|
||||
-- Find cart
|
||||
for _, obj in pairs(minetest.get_objects_inside_radius(pos, 1)) do
|
||||
if obj and obj:get_luaentity().name == cart_id then
|
||||
for _, obj in ipairs(minetest.get_objects_inside_radius(pos, 1)) do
|
||||
if obj ~= nil and obj:get_luaentity().name == cart_id then
|
||||
-- Cart found! We can now safely call the callback func.
|
||||
-- (calling it earlier has the danger of failing)
|
||||
minetest.log("info", "[tsm_railcorridors] Cart spawn succeeded: "..minetest.pos_to_string(pos))
|
||||
tsm_railcorridors.on_construct_cart(pos, obj)
|
||||
tsm_railcorridors.on_construct_cart(pos, obj, pr_carts)
|
||||
return
|
||||
end
|
||||
end
|
||||
minetest.log("info", "[tsm_railcorridors] Cart spawn FAILED: "..minetest.pos_to_string(pos))
|
||||
end
|
||||
--]]
|
||||
|
||||
|
||||
-- Try to place a cobweb.
|
||||
-- pos: Position of cobweb
|
||||
|
@ -627,7 +618,7 @@ local function create_corridor_section(waypoint, axis, sign, up_or_down, up_or_d
|
|||
if sign then
|
||||
segamount = 0-segamount
|
||||
end
|
||||
local vek = {x=0,y=0,z=0};
|
||||
local vek = {x=0,y=0,z=0}
|
||||
local start = table.copy(waypoint)
|
||||
if axis == "x" then
|
||||
vek.x=segamount
|
||||
|
@ -714,7 +705,7 @@ local function create_corridor_section(waypoint, axis, sign, up_or_down, up_or_d
|
|||
end
|
||||
|
||||
if (minetest.get_node({x=p.x,y=p.y-1,z=p.z}).name=="air" and minetest.get_node({x=p.x,y=p.y-3,z=p.z}).name~=tsm_railcorridors.nodes.rail) then
|
||||
p.y = p.y - 1;
|
||||
p.y = p.y - 1
|
||||
if i == chestplace then
|
||||
chestplace = chestplace + 1
|
||||
end
|
||||
|
@ -840,7 +831,7 @@ local function create_corridor_line(waypoint, axis, sign, length, wood, post, da
|
|||
local s = sign
|
||||
local ud = false -- Up or down
|
||||
local udn = false -- Up or down is next
|
||||
local udp -- Up or down was previous
|
||||
local udp = false -- Up or down was previous
|
||||
local up = false -- true if going up
|
||||
local upp = false -- true if was going up previously
|
||||
for i=1,length do
|
||||
|
@ -891,7 +882,7 @@ local function create_corridor_line(waypoint, axis, sign, length, wood, post, da
|
|||
wp, no_spawner = create_corridor_section(wp,a,s, ud, udn, udp, up, wood, post, first_or_final, damage, no_spawner)
|
||||
if wp == false then return end
|
||||
-- Fork in the road? If so, starts 2-3 new corridor lines and terminates the current one.
|
||||
if pr:next() < probability_fork then
|
||||
if wp and pr:next() < probability_fork then
|
||||
-- 75% chance to fork off in 3 directions (making a crossing)
|
||||
-- 25% chance to fork off in 2 directions (making a t-junction)
|
||||
local is_crossing = pr:next(0, 3) < 3
|
||||
|
@ -911,7 +902,7 @@ local function create_corridor_line(waypoint, axis, sign, length, wood, post, da
|
|||
{a2, not s}, -- to the other side
|
||||
{a, s}, -- straight ahead
|
||||
}
|
||||
for f=1, forks do
|
||||
for _= 1, forks do
|
||||
local r = pr:next(1, #fork_dirs)
|
||||
create_corridor_line(wp, fork_dirs[r][1], fork_dirs[r][2], pr:next(way_min,way_max), wood, post, damage, no_spawner)
|
||||
table.remove(fork_dirs, r)
|
||||
|
@ -928,7 +919,7 @@ local function create_corridor_line(waypoint, axis, sign, length, wood, post, da
|
|||
a="z"
|
||||
elseif a=="z" then
|
||||
a="x"
|
||||
end;
|
||||
end
|
||||
s = pr:next(1, 2) == 1
|
||||
end
|
||||
end
|
||||
|
@ -949,11 +940,8 @@ local function spawn_carts()
|
|||
-- This checks if the cart is actually spawned, it's a giant hack!
|
||||
-- Note that the callback function is also called there.
|
||||
-- TODO: Move callback function to this position when the
|
||||
-- minetest.add_entity bug has been fixed.
|
||||
|
||||
-- minetest.after(3, RecheckCartHack, {cpos, cart_id})
|
||||
-- This whole recheck logic leads to a stub right now
|
||||
-- it can be reenabled when chest carts are a thing.
|
||||
-- minetest.add_entity bug has been fixed (supposedly in 5.9.0?)
|
||||
minetest.after(3, RecheckCartHack, {cpos, cart_id})
|
||||
end
|
||||
end
|
||||
carts_table = {}
|
||||
|
@ -1115,7 +1103,7 @@ mcl_structures.register_structure("mineshaft",{
|
|||
sidelen = 32,
|
||||
y_max = 40,
|
||||
y_min = mcl_vars.mg_overworld_min,
|
||||
place_func = function(pos,def,pr,blockseed)
|
||||
place_func = function(pos,_,pr,blockseed)
|
||||
local r = pr:next(-50,-10)
|
||||
local p = vector.offset(pos,0,r,0)
|
||||
if p.y < mcl_vars.mg_overworld_min + 5 then
|
||||
|
@ -1123,7 +1111,7 @@ mcl_structures.register_structure("mineshaft",{
|
|||
end
|
||||
if p.y > -10 then return true end
|
||||
InitRandomizer(blockseed)
|
||||
create_corridor_system(p, pr)
|
||||
create_corridor_system(p)
|
||||
return true
|
||||
end,
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
name = tsm_railcorridors
|
||||
title = Rail Corridors
|
||||
author = UgnilJoZ
|
||||
description = Adds simple underground mines with railways and occasional treasure chests.
|
||||
depends = mcl_init, mcl_worlds, mcl_core, mcl_mapgen_core, mcl_loot, mcl_tnt, mcl_farming, mcl_mobspawners, mcl_minecarts, mcl_structures
|
||||
|
|
|
@ -25,14 +25,14 @@ tsm_railcorridors_probability_chest (Chest probability) float 0.05 0.0 1.0
|
|||
#of finding a cart in rail corridors with high rail damage will be lower.
|
||||
#NOTE: Due to a bug in Minetest <https://github.com/minetest/minetest/issues/4759>
|
||||
#carts often fail to spawn even if they should.
|
||||
tsm_railcorridors_probability_cart (Cart probability) float 0.0 0.0 1.0
|
||||
tsm_railcorridors_probability_cart (Cart probability) float 0.05 0.0 1.0
|
||||
|
||||
#If enabled, cobwebs may be placed in some corridors.
|
||||
#Currently, cobwebs are only supported with the Mobs Redo mod.
|
||||
tsm_railcorridors_place_cobwebs (Cobwebs) bool true
|
||||
|
||||
#Probability (0.0 to 1.0) for a rail corridor system to have damaged/incomplete railways
|
||||
tsm_railcorridors_probability_damage (Damaged railway probability) float 1.0 0.0 1.0
|
||||
tsm_railcorridors_probability_damage (Damaged railway probability) float 0.55 0.0 1.0
|
||||
|
||||
#If enabled, rail corridors continue to generate through obstacles such
|
||||
#as other rail corridors (without destroying them, mostly). This may lead
|
||||
|
|
Loading…
Reference in New Issue