develop #35

Merged
milan merged 16 commits from develop into master 2021-07-24 12:49:35 +02:00
146 changed files with 2111 additions and 1206 deletions
Showing only changes of commit 709c185915 - Show all commits

View file

@ -529,12 +529,14 @@ armor.remove_all = function(self, player)
self:save_armor_inventory(player)
end
local skin_mod
armor.get_player_skin = function(self, name)
if (self.skin_mod == "skins" or self.skin_mod == "simple_skins") and skins.skins[name] then
if (skin_mod == "skins" or skin_mod == "simple_skins") and skins.skins[name] then
return skins.skins[name]..".png"
elseif self.skin_mod == "u_skins" and u_skins.u_skins[name] then
elseif skin_mod == "u_skins" and u_skins.u_skins[name] then
return u_skins.u_skins[name]..".png"
elseif self.skin_mod == "wardrobe" and wardrobe.playerSkins and wardrobe.playerSkins[name] then
elseif skin_mod == "wardrobe" and wardrobe.playerSkins and wardrobe.playerSkins[name] then
return wardrobe.playerSkins[name]
end
return armor.default_skin..".png"
@ -678,5 +680,5 @@ end
--
-- Useful for skin mod forks that do not use the same name.
armor.set_skin_mod = function(mod)
armor.skin_mod = mod
skin_mod = mod
end

View file

@ -96,7 +96,7 @@ for _, mod in pairs(skin_mods) do
armor:add_preview(fn)
end
end
armor.skin_mod = mod
armor.set_skin_mod(mod)
end
end
if not minetest.get_modpath("moreores") then

View file

@ -11,6 +11,7 @@ local gui_count2 = {} --mapping of player names to a quantity (arbitrary strings
local gui_count3 = {} --mapping of player names to a quantity (arbitrary strings may also appear as values)
local gui_angle = {} --mapping of player names to an angle (one of 90, 180, 270, representing the angle in degrees clockwise)
local gui_filename = {} --mapping of player names to file names
local gui_param2 = {} --mapping of player names to param2 values
--set default values
setmetatable(gui_nodename1, {__index = function() return "Cobblestone" end})
@ -25,6 +26,7 @@ setmetatable(gui_count2, {__index = function() return "6" end})
setmetatable(gui_count3, {__index = function() return "4" end})
setmetatable(gui_angle, {__index = function() return 90 end})
setmetatable(gui_filename, {__index = function() return "building" end})
setmetatable(gui_param2, {__index = function() return "0" end})
local axis_indices = {["X axis"]=1, ["Y axis"]=2, ["Z axis"]=3, ["Look direction"]=4}
local axis_values = {"x", "y", "z", "?"}
@ -904,3 +906,31 @@ worldedit.register_gui_function("worldedit_gui_clearobjects", {
execute_worldedit_command("clearobjects", name, "")
end,
})
worldedit.register_gui_function("worldedit_gui_param2", {
name = "Set Param2",
privs = we_privs("param2"),
get_formspec = function(name)
local value = gui_param2[name] or "0"
return "size[6.5,3]" .. worldedit.get_formspec_header("worldedit_gui_param2") ..
"textarea[0.5,1;5,2;;;Some values may break the node!]"..
string.format("field[0.5,2.5;2,0.8;worldedit_gui_param2_value;New Param2;%s]", minetest.formspec_escape(value)) ..
"field_close_on_enter[worldedit_gui_param2_value;false]" ..
"button_exit[3.5,2.5;3,0.8;worldedit_gui_param2_submit;Set Param2]"
end,
})
worldedit.register_gui_handler("worldedit_gui_param2", function(name, fields)
local cg = {
worldedit_gui_param2_value = gui_param2,
}
local ret = handle_changes(name, "worldedit_gui_param2", fields, cg)
if fields.worldedit_gui_param2_submit then
copy_changes(name, fields, cg)
worldedit.show_page(name, "worldedit_gui_param2")
execute_worldedit_command("param2", name, gui_param2[name])
return true
end
return ret
end)

View file

@ -1,14 +1,290 @@
--couple.lua
--defines couple entities.
--Handles coupling and discoupling of trains, and defines the coupling entities
--Rework June 2021 - some functions from trainlogic.lua have been moved here
--advtrains:discouple
--set into existing trains to split them when punched.
--they are attached to the wagons.
--[[fields
wagon
-- COUPLING --
-- During coupling rework, the behavior of coupling was changed to make automation easier. It is now as follows:
-- Coupling is only ever initiated when a train is standing somewhere (not moving) and another train drives onto one of its ends
-- with a speed greater than 0
-- "stationary" train is the one standing there - in old code called "train2"
-- "initiating" train is the one that approached it and bumped into it - typically an engine - in old code called "train1"
-- When the initiating train has autocouple set, trains are immediately coupled
-- When not, a couple entity is spawned and coupling commences on click
-- Coupling MUST preserve the train ID of the initiating train, so it is done like this:
-- initiating train is reversed
-- stationary train is reversed if required, so that it points towards the initiating train
-- do_connect_trains(initiating, stationary)
-- As a result, the coupled train is reversed in direction. Alternative way of doing things (might be considered later):
-- stationary train is reversed if required, so that it points away from the initiating train
-- index of initiating train is set so that it matches the front pos of stationary train
-- wagons of stationary train are inserted at the beginning of initiating train
-- remove stationary train
wagons keep their couple entity minetest-internal id inside the field discouple_id. if it refers to nowhere, they will spawn a new one if player is near
]]
-- train.couple_* contain references to ObjectRefs of couple objects, which contain all relevant information
-- These objectRefs will delete themselves once the couples no longer match (see below)
local function create_couple_entity(pos, train1, t1_is_front, train2, t2_is_front)
local id1 = train1.id
local id2 = train2.id
-- delete previous couple entities
if t1_is_front then
if train1.cpl_front then train1.cpl_front:remove() end
else
if train1.cpl_back then train1.cpl_back:remove() end
end
if t2_is_front then
if train2.cpl_front then train2.cpl_front:remove() end
else
if train2.cpl_back then train2.cpl_back:remove() end
end
local obj=minetest.add_entity(pos, "advtrains:couple")
if not obj then error("Failed creating couple object!") return end
local le=obj:get_luaentity()
le.train_id_1=id1
le.t1_is_front=t1_is_front
le.train_id_2=id2
le.t2_is_front=t2_is_front
--atdebug("created couple between",train1.id,train2.id,t2_is_front)
if t1_is_front then
train1.cpl_front = obj
else
train2.cpl_back = obj
end
if t2_is_front then
train2.cpl_front = obj
else
train2.cpl_back = obj
end
end
-- Old static couple checking. Never used for autocouple, only used for standing trains if train did not approach
local CPL_CHK_DST = -1
local CPL_ZONE = 2
function advtrains.train_check_couples(train)
--atdebug("rechecking couples")
if train.cpl_front then
if not train.cpl_front:get_yaw() then
-- objectref is no longer valid. reset.
train.cpl_front = nil
end
end
if not train.cpl_front then
-- recheck front couple
local front_trains, pos = advtrains.occ.get_occupations(train, atround(train.index) + CPL_CHK_DST)
if advtrains.is_node_loaded(pos) then -- if the position is loaded...
for tid, idx in pairs(front_trains) do
local other_train = advtrains.trains[tid]
if not advtrains.train_ensure_init(tid, other_train) then
atwarn("Train",tid,"is not initialized! Couldn't check couples!")
return
end
--atdebug(train.id,"front: ",idx,"on",tid,atround(other_train.index),atround(other_train.end_index))
if other_train.velocity == 0 then
if idx>=other_train.index and idx<=other_train.index + CPL_ZONE then
create_couple_entity(pos, train, true, other_train, true)
break
end
if idx<=other_train.end_index and idx>=other_train.end_index - CPL_ZONE then
create_couple_entity(pos, train, true, other_train, false)
break
end
end
end
end
end
if train.cpl_back then
if not train.cpl_back:get_yaw() then
-- objectref is no longer valid. reset.
train.cpl_back = nil
end
end
if not train.cpl_back then
-- recheck back couple
local back_trains, pos = advtrains.occ.get_occupations(train, atround(train.end_index) - CPL_CHK_DST)
if advtrains.is_node_loaded(pos) then -- if the position is loaded...
for tid, idx in pairs(back_trains) do
local other_train = advtrains.trains[tid]
if not advtrains.train_ensure_init(tid, other_train) then
atwarn("Train",tid,"is not initialized! Couldn't check couples!")
return
end
--atdebug(train.id,"back: ",idx,"on",tid,atround(other_train.index),atround(other_train.end_index))
if other_train.velocity == 0 then
if idx>=other_train.index and idx<=other_train.index + CPL_ZONE then
create_couple_entity(pos, train, false, other_train, true)
break
end
if idx<=other_train.end_index and idx>=other_train.end_index - CPL_ZONE then
create_couple_entity(pos, train, false, other_train, false)
break
end
end
end
end
end
end
-- Deletes couple entities from the train
function advtrains.couple_invalidate(train)
if train.cpl_back then
train.cpl_back:remove()
train.cpl_back = nil
end
if train.cpl_front then
train.cpl_front:remove()
train.cpl_front = nil
end
train.couples_up_to_date = nil
end
-- Called from train_step_b() when the current train (init_train) just stopped at one of the end indices of another train (stat_train)
-- Depending on autocouple, either couples immediately or spawns a couple entity
function advtrains.couple_initiate_with(init_train, stat_train, stat_is_front)
--atdebug("Initiating couplign between init=",init_train.id,"stat=",stat_train.id,"backside=",stat_is_backside)
if init_train.autocouple then
advtrains.couple_trains(init_train, true, stat_train, stat_is_front)
else
local pos = advtrains.path_get_interpolated(init_train, init_train.index)
create_couple_entity(pos, init_train, true, stat_train, stat_is_front)
end
end
-- check if the player has permission for the first/last wagon of the train
local function check_twagon_owner(train, b_first, pname)
local wtp = b_first and 1 or #train.trainparts
local wid = train.trainparts[wtp]
local wdata = advtrains.wagons[wid]
if wdata then
return advtrains.check_driving_couple_protection(pname, wdata.owner, wdata.whitelist)
end
return false
end
-- Perform coupling, but check if the player is authorized to couple
function advtrains.safe_couple_trains(train1, t1_is_front, train2, t2_is_front, pname)
if pname and not minetest.check_player_privs(pname, "train_operator") then
minetest.chat_send_player(pname, "Missing train_operator privilege")
return false
end
local wck_t1, wck_t2
if pname then
wck_t1 = check_twagon_owner(train1, t1_is_front, pname)
wck_t2 = check_twagon_owner(train2, t2_is_front, pname)
end
if (wck_t1 or wck_t2) or not pname then
advtrains.couple_trains(train1, t1_is_front, train2, t2_is_front)
end
end
-- Actually performs the train coupling. Always retains train ID of train1
function advtrains.couple_trains(train1, t1_is_front, train2, t2_is_front)
--atdebug("Couple trains init=",init_train.id,"stat=",stat_train.id,"statreverse=",stat_must_reverse)
-- see comment on top of file
if t1_is_front then
advtrains.invert_train(train1.id)
end
if not t2_is_front then
advtrains.invert_train(train2.id)
end
advtrains.do_connect_trains(train1, train2)
end
-- Adds the wagons of first to second and deletes second_id afterwards
-- Assumes that second_id stands right behind first_id and both trains point to the same direction
function advtrains.do_connect_trains(first, second)
if not advtrains.train_ensure_init(first.id, first) then
atwarn("Coupling: first train",first.id,"is not initialized! Operation aborted!")
return
end
if not advtrains.train_ensure_init(second.id, second) then
atwarn("Coupling: second train",second.id,"is not initialized! Operation aborted!")
return
end
local first_wagoncnt=#first.trainparts
local second_wagoncnt=#second.trainparts
for _,v in ipairs(second.trainparts) do
table.insert(first.trainparts, v)
end
advtrains.remove_train(second.id)
first.velocity = 0
advtrains.update_trainpart_properties(first.id)
advtrains.couple_invalidate(first)
return true
end
-- DECOUPLING --
function advtrains.split_train_at_fc(train, count_empty, length_limit)
-- splits train at first different current FC by convention,
-- locomotives have empty FC so are ignored
-- count_empty is used to split off locomotives
-- length_limit limits the length of the first train to length_limit wagons
local train_id = train.id
local fc = false
local ind = 0
for i = 1, #train.trainparts do
local w_id = train.trainparts[i]
local data = advtrains.wagons[w_id]
if length_limit and i > length_limit then
ind = i
break
end
if data then
local wfc = advtrains.get_cur_fc(data)
if wfc ~= "" or count_empty then
if fc then
if fc ~= wfc then
ind = i
break
end
else
fc = wfc
end
end
end
end
if ind > 0 then
return advtrains.split_train_at_index(train, ind), fc
end
if fc then
return nil, fc
end
end
function advtrains.train_step_fc(train)
for i=1,#train.trainparts do
local w_id = train.trainparts[i]
local data = advtrains.wagons[w_id]
if data then
advtrains.step_fc(data)
end
end
end
-- split_train_at_index() is in trainlogic.lua because it needs access to two local functions
function advtrains.split_train_at_wagon(wagon_id)
--get train
local data = advtrains.wagons[wagon_id]
advtrains.split_train_at_index(advtrains.trains[data.train_id], data.pos_in_trainparts)
end
-- COUPLE ENTITIES --
local couple_max_dist=3
@ -36,8 +312,6 @@ minetest.register_entity("advtrains:discouple", {
if pname and pname~="" and self.wagon then
if advtrains.safe_decouple_wagon(self.wagon.id, pname) then
self.object:remove()
else
minetest.add_entity(self.object:getpos(), "advtrains:lockmarker")
end
end
end,
@ -60,10 +334,6 @@ minetest.register_entity("advtrains:discouple", {
-- advtrains:couple
-- Couple entity
local function lockmarker(obj)
minetest.add_entity(obj:get_pos(), "advtrains:lockmarker")
obj:remove()
end
minetest.register_entity("advtrains:couple", {
visual="sprite",
@ -75,107 +345,71 @@ minetest.register_entity("advtrains:couple", {
is_couple=true,
static_save = false,
on_activate=function(self, staticdata)
if staticdata=="COUPLE" then
--couple entities have no right to exist further...
atprint("Couple loaded from staticdata, destroying")
self.object:remove()
return
end
self.object:set_armor_groups({immmortal=1})
if staticdata=="COUPLE" then
--couple entities have no right to exist further...
--atdebug("Couple loaded from staticdata, destroying")
self.object:remove()
return
end
self.object:set_armor_groups({immmortal=1})
end,
get_staticdata=function(self) return "COUPLE" end,
on_rightclick=function(self, clicker)
if not self.train_id_1 or not self.train_id_2 then return end
if not self.train_id_1 or not self.train_id_2 then return end
local pname=clicker
if type(clicker)~="string" then pname=clicker:get_player_name() end
local pname=clicker
if type(clicker)~="string" then pname=clicker:get_player_name() end
if advtrains.safe_couple_trains(self.train_id_1, self.train_id_2, self.t1_is_front, self.t2_is_front, pname) then
self.object:remove()
else
lockmarker(self.object)
end
local train1=advtrains.trains[self.train_id_1]
local train2=advtrains.trains[self.train_id_2]
advtrains.safe_couple_trains(train1, self.t1_is_front, train2, self.t2_is_front, pname)
self.object:remove()
end,
on_step=function(self, dtime)
if advtrains.wagon_outside_range(self.object:getpos()) then
self.object:remove()
return
end
if not self.train_id_1 or not self.train_id_2 then atprint("Couple: train ids not set!") self.object:remove() return end
local train1=advtrains.trains[self.train_id_1]
local train2=advtrains.trains[self.train_id_2]
if not train1 or not train2 then
atprint("Couple: trains missing, destroying")
self.object:remove()
return
end
--shh, silence here, this is an on-step callback!
if not advtrains.train_ensure_init(self.train_id_1, train1) then
--atwarn("Train",self.train_id_1,"is not initialized! Operation aborted!")
return
end
if not advtrains.train_ensure_init(self.train_id_2, train2) then
--atwarn("Train",self.train_id_2,"is not initialized! Operation aborted!")
return
end
if train1.velocity>0 or train2.velocity>0 then
if not self.position_set then --ensures that train stands a single time before check fires. Using flag below
return
end
atprint("Couple: train is moving, destroying")
self.object:remove()
return
end
if not self.position_set then
local tp1
if self.t1_is_front then
tp1=advtrains.path_get_interpolated(train1, train1.index)
else
tp1=advtrains.path_get_interpolated(train1, train1.end_index)
end
local tp2
if self.t2_is_front then
tp2=advtrains.path_get_interpolated(train2, train2.index)
else
tp2=advtrains.path_get_interpolated(train2, train2.end_index)
end
local pos_median=advtrains.pos_median(tp1, tp2)
if not vector.equals(pos_median, self.object:getpos()) then
self.object:set_pos(pos_median)
end
self.position_set=true
end
advtrains.atprint_context_tid=nil
end,
})
minetest.register_entity("advtrains:lockmarker", {
visual="sprite",
textures = {"advtrains_cpl_lock.png"},
collisionbox = {-0.3,-0.3,-0.3, 0.3,0.3,0.3},
visual_size = {x=0.7, y=0.7},
initial_sprite_basepos = {x=0, y=0},
is_lockmarker=true,
static_save = false,
on_activate=function(self, staticdata)
if staticdata=="COUPLE" then
--couple entities have no right to exist further...
atprint("Couple loaded from staticdata, destroying")
self.object:remove()
return
end
self.object:set_armor_groups({immmortal=1})
self.life=5
end,
get_staticdata=function(self) return "COUPLE" end,
on_step=function(self, dtime)
self.life=(self.life or 5)-dtime
if self.life<0 then
if advtrains.wagon_outside_range(self.object:getpos()) then
--atdebug("Couple Removing outside range")
self.object:remove()
return
end
if not self.train_id_1 or not self.train_id_2 then
--atdebug("Couple Removing ids missing")
self.object:remove()
return
end
local train1=advtrains.trains[self.train_id_1]
local train2=advtrains.trains[self.train_id_2]
if not train1 or not train2 then
--atdebug("Couple Removing trains missing")
self.object:remove()
return
end
if self.position_set and train1.velocity>0 or train2.velocity>0 then
--atdebug("Couple: train is moving, destroying")
self.object:remove()
return
end
if not self.position_set then
local tp1
if self.t1_is_front then
tp1=advtrains.path_get_interpolated(train1, train1.index)
else
tp1=advtrains.path_get_interpolated(train1, train1.end_index)
end
local tp2
if self.t2_is_front then
tp2=advtrains.path_get_interpolated(train2, train2.index)
else
tp2=advtrains.path_get_interpolated(train2, train2.end_index)
end
local pos_median=advtrains.pos_median(tp1, tp2)
if not vector.equals(pos_median, self.object:getpos()) then
self.object:set_pos(pos_median)
end
self.position_set=true
end
end,
})

View file

@ -569,11 +569,13 @@ advtrains.mainloop_runcnt=0
advtrains.global_slowdown = 1
local t = 0
local within_mainstep = false
minetest.register_globalstep(function(dtime_mt)
if no_action then
-- the advtrains globalstep is skipped by command. Return immediately
return
end
within_mainstep = true
advtrains.mainloop_runcnt=advtrains.mainloop_runcnt+1
--atprint("Running the main loop, runcnt",advtrains.mainloop_runcnt)
@ -586,6 +588,7 @@ minetest.register_globalstep(function(dtime_mt)
if GENERATE_ATRICIFIAL_LAG then
dtime = HOW_MANY_LAG
if os.clock()<t then
within_mainstep = false
return
end
@ -626,6 +629,9 @@ minetest.register_globalstep(function(dtime_mt)
save_timer = advtrains.SAVE_INTERVAL
atprintbm("saving", t)
end
within_mainstep = false
end)
--if something goes wrong in these functions, there is no help. no pcall here.
@ -678,7 +684,13 @@ function advtrains.save(remove_players_from_wagons)
--TODO very simple yet hacky workaround for the "green signals" bug
advtrains.invalidate_all_paths()
end
minetest.register_on_shutdown(advtrains.save)
minetest.register_on_shutdown(function()
if within_mainstep then
atwarn("Crash during advtrains main step - skipping the shutdown save operation to not save inconsistent data!")
else
advtrains.save()
end
end)
-- This chat command provides a solution to the problem known on the LinuxWorks server
-- There are many players that joined a single time, got on a train and then left forever

View file

@ -417,3 +417,42 @@ function advtrains.path_lookup(train, pos)
end
return nil
end
-- Projects the path of "train" onto the path of "onto_train_id", and returns the index on onto_train's path
-- that corresponds to "index" on "train"'s path, as well as whether both trains face each other
-- index may be fractional
-- returns: res_index, trains_facing
-- returns nil when path can not be projected, either because trains are on different tracks or
-- node at "index" happens to be on a turnout and it's the wrong direction
-- Note - duplicate with similar functionality is in train_step_b() - that code combines train detection with projecting
function advtrains.path_project(train, index, onto_train_id)
local base_idx = atfloor(index)
local frac_part = index - base_idx
local base_pos = advtrains.path_get(train, base_idx)
local base_cn = train.path_cn[base_idx]
local otrn = advtrains.trains[onto_train_id]
-- query occupation
local occ = advtrains.occ.get_trains_over(base_pos)
-- is wanted train id contained?
local ob_idx = occ[onto_train_id]
if not ob_idx then
return nil
end
-- retrieve other train's cn and cp
local ocn = otrn.path_cn[ob_idx]
local ocp = otrn.path_cp[ob_idx]
if base_cn == ocn then
-- same direction
return ob_idx + frac_part, false
elseif base_cn == ocp then
-- facing trains - subtract index frac
return ob_idx - frac_part, true
else
-- same path item but no common connections - deny
return nil
end
end

View file

@ -56,3 +56,8 @@ advtrains_dtime_limit (DTime Limit for slow-down) float 0.2 0 5
# Time interval in seconds in which advtrains stores its save data to disk
# Nevertheless, advtrains saves all data when shutting down the server.
advtrains_save_interval (Save Interval) int 60 20 3600
# Enable forgiving collision mode
# If enabled, trains only collide with nodes with "normal" drawtype.
advtrains_forgiving_collision (Forgiving Collision mode) bool false

View file

@ -139,6 +139,7 @@ minetest.register_on_joinplayer(function(player)
advtrains.hhud[player:get_player_name()] = nil
--independent of this, cause all wagons of the train which are loaded to reattach their players
--needed because already loaded wagons won't call reattach_all()
local pname = player:get_player_name()
local id=advtrains.player_to_train_mapping[pname]
if id then
for _,wagon in pairs(minetest.luaentities) do
@ -394,7 +395,7 @@ function advtrains.train_step_b(id, train, dtime)
local back_off_track=train.end_index<train.path_trk_b
train.off_track = front_off_track or back_off_track
if back_off_track and (not v_cap or v_cap > 1) then
if back_off_track and (not sit_v_cap or sit_v_cap > 1) then
--atprint("in train_step_b: applying back_off_track")
sit_v_cap = 1
elseif front_off_track then
@ -593,6 +594,70 @@ function advtrains.train_step_b(id, train, dtime)
--atprint("in train_step_b: Zero barrier hit, clipping to newidx_tv=",new_index_curr_tv, "zb_idx=",lzb_next_zero_barrier)
new_index_curr_tv = lzb_next_zero_barrier
end
-- New same-track collision system - check for any other trains within the range we're going to move
-- do the checks if we either are moving or about to start moving
if new_index_curr_tv > train.index or accelerating then -- only if train is actually advancing
-- Note: duplicate code from path_project() because of subtle differences: no frac processing and scanning all occupations
--[[train.debug = ""
local atdebug = function(t, ...)
local text=advtrains.print_concat_table({t, ...})
train.debug = train.debug..text.."\n"
end]]
local base_idx = atfloor(new_index_curr_tv + 1)
local base_pos = advtrains.path_get(train, base_idx)
local base_cn = train.path_cn[base_idx]
--atdebug(id,"Begin Checking for on-track collisions new_idx=",new_index_curr_tv,"base_idx=",base_idx,"base_pos=",base_pos,"base_cn=",base_cn)
-- query occupation
local occ = advtrains.occ.get_trains_over(base_pos)
-- iterate other trains
for otid, ob_idx in pairs(occ) do
if otid ~= id then
--atdebug(id,"Found other train",otid," with matching index ",ob_idx)
-- Phase 1 - determine if trains are facing and which is the relefant stpo index
local otrn = advtrains.trains[otid]
-- retrieve other train's cn and cp
local ocn = otrn.path_cn[ob_idx]
local ocp = otrn.path_cp[ob_idx]
local target_is_inside, ref_index, facing
if base_cn == ocn then
-- same direction
ref_index = otrn.end_index
same_dir = true
target_is_inside = (ob_idx >= ref_index)
--atdebug("Same direction: ref_index",ref_index,"inside=",target_is_inside)
elseif base_cn == ocp then
-- facing trains - subtract index frac
ref_index = otrn.index
same_dir = false
target_is_inside = (ob_idx <= ref_index)
--atdebug("Facing direction: ref_index",ref_index,"inside=",target_is_inside)
end
-- Phase 2 - project ref_index back onto our path and check again (necessary because there might be a turnout on the way and we are driving into the flank
if target_is_inside then
local our_index = advtrains.path_project(otrn, ref_index, id)
--atdebug("Backprojected our_index",our_index)
if our_index and our_index <= new_index_curr_tv then
-- ON_TRACK COLLISION IS HAPPENING
-- the actual collision is handled in train_step_c, so set appropriate signal variables
train.ontrack_collision_info = {
otid = otid,
same_dir = same_dir,
}
-- clip newindex
--atdebug("-- Collision detected!")
new_index_curr_tv = our_index
end
end
end
end
end
-- ## Movement happens here ##
train.index = new_index_curr_tv
recalc_end_index(train)
@ -639,20 +704,41 @@ function advtrains.train_step_c(id, train, dtime)
train.check_trainpartload=2
end
--- 8. check for collisions with other trains and damage players ---
local train_moves=(train.velocity~=0)
local very_short_train = train.trainlen < 3
--- Check whether this train can be coupled to another, and set couple entities accordingly
if not train.was_standing and not train_moves then
advtrains.train_check_couples(train)
--- On-track collision handling - detected in train_step_b, but handled here so all other train movements have already happened.
if train.ontrack_collision_info then
train.velocity = 0
train.acceleration = 0
advtrains.atc.train_reset_command(train)
local otrn = advtrains.trains[train.ontrack_collision_info.otid]
if otrn.velocity == 0 then -- other train must be standing, else don't initiate coupling
advtrains.couple_initiate_with(train, otrn, not train.ontrack_collision_info.same_dir)
end
train.ontrack_collision_info = nil
train.couples_up_to_date = true
end
train.was_standing = not train_moves
-- handle couples if on_track collision handling did not fire
if train_moves then
train.couples_up_to_date = nil
elseif not train.couples_up_to_date then
if not very_short_train then -- old coupling system is buggy for short trains
advtrains.train_check_couples(train) -- no guarantee for train order here
end
train.couples_up_to_date = true
end
--- 8. check for collisions with other trains and damage players ---
if train_moves then
-- Note: this code handles collisions with trains that are not on the same path as the current train
-- The same-track collisions and coupling handling is found in couple.lua and handled from train_step_b() and code 2 blocks above.
local collided = false
local coll_grace=1
local coll_grace=2
local collindex = advtrains.path_get_index_by_offset(train, train.index, -coll_grace)
local collpos = advtrains.path_get(train, atround(collindex))
if collpos then
@ -663,13 +749,14 @@ function advtrains.train_step_c(id, train, dtime)
local testpos=vector.add(rcollpos, {x=x, y=0, z=z})
--- 8a Check collision ---
if not collided then
local col_tr = advtrains.occ.check_collision(testpos, id)
if col_tr then
advtrains.train_check_couples(train)
train.velocity = 0
advtrains.atc.train_reset_command(train)
collided = true
if not very_short_train then -- position collision system is buggy for short trains
local col_tr = advtrains.occ.check_collision(testpos, id)
if col_tr then
train.velocity = 0
train.acceleration = 0
advtrains.atc.train_reset_command(train)
collided = true
end
end
--- 8b damage players ---
@ -703,7 +790,7 @@ function advtrains.train_step_c(id, train, dtime)
local objs = minetest.get_objects_inside_radius(rcollpos, 2)
for _,obj in ipairs(objs) do
if not obj:is_player() and obj:get_armor_groups().fleshy and obj:get_armor_groups().fleshy > 0
and obj:get_luaentity() and obj:get_luaentity().name~="signs:text" then
and obj:get_luaentity() and obj:get_luaentity().name~="signs_lib:text" then
obj:punch(obj, 1, { full_punch_interval = 1.0, damage_groups = {fleshy = 1000}, }, nil)
end
end
@ -899,7 +986,7 @@ function advtrains.remove_train(id)
run_callbacks_remove(id, train)
advtrains.path_invalidate(train)
advtrains.path_invalidate(train, true)
advtrains.couple_invalidate(train)
local tp = train.trainparts
@ -1019,53 +1106,6 @@ function advtrains.spawn_wagons(train_id)
end
end
function advtrains.split_train_at_fc(train, count_empty, length_limit)
-- splits train at first different current FC by convention,
-- locomotives have empty FC so are ignored
-- count_empty is used to split off locomotives
-- length_limit limits the length of the first train to length_limit wagons
local train_id = train.id
local fc = false
local ind = 0
for i = 1, #train.trainparts do
local w_id = train.trainparts[i]
local data = advtrains.wagons[w_id]
if length_limit and i > length_limit then
ind = i
break
end
if data then
local wfc = advtrains.get_cur_fc(data)
if wfc ~= "" or count_empty then
if fc then
if fc ~= wfc then
ind = i
break
end
else
fc = wfc
end
end
end
end
if ind > 0 then
return advtrains.split_train_at_index(train, ind), fc
end
if fc then
return nil, fc
end
end
function advtrains.train_step_fc(train)
for i=1,#train.trainparts do
local w_id = train.trainparts[i]
local data = advtrains.wagons[w_id]
if data then
advtrains.step_fc(data)
end
end
end
function advtrains.split_train_at_index(train, index)
-- this function splits a train at index, creating a new train from the back part of the train.
@ -1121,167 +1161,6 @@ function advtrains.split_train_at_index(train, index)
end
function advtrains.split_train_at_wagon(wagon_id)
--get train
local data = advtrains.wagons[wagon_id]
advtrains.split_train_at_index(advtrains.trains[data.train_id], data.pos_in_trainparts)
end
-- coupling
local CPL_CHK_DST = -1
local CPL_ZONE = 2
-- train.couple_* contain references to ObjectRefs of couple objects, which contain all relevant information
-- These objectRefs will delete themselves once the couples no longer match
local function createcouple(pos, train1, t1_is_front, train2, t2_is_front)
local id1 = train1.id
local id2 = train2.id
if train1.autocouple or train2.autocouple then
-- couple trains
train1.autocouple = nil
train2.autocouple = nil
minetest.after(0, advtrains.safe_couple_trains, id1, id2, t1_is_front, t2_is_front, false, false, train1.velocity, train2.velocity)
return
end
local obj=minetest.add_entity(pos, "advtrains:couple")
if not obj then error("Failed creating couple object!") return end
local le=obj:get_luaentity()
le.train_id_1=id1
le.train_id_2=id2
le.t1_is_front=t1_is_front
le.t2_is_front=t2_is_front
--atdebug("created couple between",train1.id,t1_is_front,train2.id,t2_is_front)
if t1_is_front then
train1.cpl_front = obj
else
train1.cpl_back = obj
end
if t2_is_front then
train2.cpl_front = obj
else
train2.cpl_back = obj
end
end
function advtrains.train_check_couples(train)
--atdebug("rechecking couples")
if train.cpl_front then
if not train.cpl_front:get_yaw() then
-- objectref is no longer valid. reset.
train.cpl_front = nil
end
end
if not train.cpl_front then
-- recheck front couple
local front_trains, pos = advtrains.occ.get_occupations(train, atround(train.index) + CPL_CHK_DST)
if advtrains.is_node_loaded(pos) then -- if the position is loaded...
for tid, idx in pairs(front_trains) do
local other_train = advtrains.trains[tid]
if not advtrains.train_ensure_init(tid, other_train) then
atwarn("Train",tid,"is not initialized! Couldn't check couples!")
return
end
--atdebug(train.id,"front: ",idx,"on",tid,atround(other_train.index),atround(other_train.end_index))
if other_train.velocity == 0 then
if idx>=other_train.index and idx<=other_train.index + CPL_ZONE then
createcouple(pos, train, true, other_train, true)
break
end
if idx<=other_train.end_index and idx>=other_train.end_index - CPL_ZONE then
createcouple(pos, train, true, other_train, false)
break
end
end
end
end
end
if train.cpl_back then
if not train.cpl_back:get_yaw() then
-- objectref is no longer valid. reset.
train.cpl_back = nil
end
end
if not train.cpl_back then
-- recheck back couple
local back_trains, pos = advtrains.occ.get_occupations(train, atround(train.end_index) - CPL_CHK_DST)
if advtrains.is_node_loaded(pos) then -- if the position is loaded...
for tid, idx in pairs(back_trains) do
local other_train = advtrains.trains[tid]
if not advtrains.train_ensure_init(tid, other_train) then
atwarn("Train",tid,"is not initialized! Couldn't check couples!")
return
end
if other_train.velocity == 0 then
if idx>=other_train.index and idx<=other_train.index + CPL_ZONE then
createcouple(pos, train, false, other_train, true)
break
end
if idx<=other_train.end_index and idx>=other_train.end_index - CPL_ZONE then
createcouple(pos, train, false, other_train, false)
break
end
end
end
end
end
end
function advtrains.couple_invalidate(train)
if train.cpl_back then
train.cpl_back:remove()
train.cpl_back = nil
end
if train.cpl_front then
train.cpl_front:remove()
train.cpl_front = nil
end
train.was_standing = nil
end
-- relevant code for this comment is in couple.lua
--there are 4 cases:
--1/2. F<->R F<->R regular, put second train behind first
--->frontpos of first train will match backpos of second
--3. F<->R R<->F flip one of these trains, take the other as new train
--->backpos's will match
--4. R<->F F<->R flip one of these trains and take it as new parent
--->frontpos's will match
function advtrains.do_connect_trains(first_id, second_id, vel)
local first, second=advtrains.trains[first_id], advtrains.trains[second_id]
if not advtrains.train_ensure_init(first_id, first) then
atwarn("Train",first_id,"is not initialized! Operation aborted!")
return
end
if not advtrains.train_ensure_init(second_id, second) then
atwarn("Train",second_id,"is not initialized! Operation aborted!")
return
end
local first_wagoncnt=#first.trainparts
local second_wagoncnt=#second.trainparts
for _,v in ipairs(second.trainparts) do
table.insert(first.trainparts, v)
end
advtrains.remove_train(second_id)
if vel < 0 then
advtrains.invert_train(first_id)
vel = -vel
end
first.velocity= vel or 0
advtrains.update_trainpart_properties(first_id)
advtrains.couple_invalidate(first)
return true
end
function advtrains.invert_train(train_id)
local train=advtrains.trains[train_id]
@ -1368,44 +1247,61 @@ function advtrains.invalidate_path(id)
end
--not blocking trains group
function advtrains.train_collides(node)
if node and minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].walkable then
if minetest.settings:get_bool("advtrains_forgiving_collision") then
function advtrains.train_collides(node)
if node and minetest.registered_nodes[node.name] then
local ndef = minetest.registered_nodes[node.name]
-- if the node is drawtype normal (that is a full cube) then it does collide
if ndef.drawtype == "normal" then
-- except if it is not_blocking_trains
if ndef.groups.not_blocking_trains and ndef.groups.not_blocking_trains ~= 0 then
return false
end
return true
end
end
return false
end
else
function advtrains.train_collides(node)
if node and minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].walkable then
if not minetest.registered_nodes[node.name].groups.not_blocking_trains then
return true
end
end
return false
end
local nonblocknodes={
"default:fence_wood",
"default:fence_acacia_wood",
"default:fence_aspen_wood",
"default:fence_pine_wood",
"default:fence_junglewood",
"default:torch",
"bones:bones",
"default:sign_wall",
"signs:sign_wall",
"signs:sign_wall_blue",
"signs:sign_wall_brown",
"signs:sign_wall_orange",
"signs:sign_wall_green",
"signs:sign_yard",
"signs:sign_wall_white_black",
"signs:sign_wall_red",
"signs:sign_wall_white_red",
"signs:sign_wall_yellow",
"signs:sign_post",
"signs:sign_hanging",
}
minetest.after(0, function()
for _,name in ipairs(nonblocknodes) do
if minetest.registered_nodes[name] then
minetest.registered_nodes[name].groups.not_blocking_trains=1
end
return false
end
end)
local nonblocknodes={
"default:fence_wood",
"default:fence_acacia_wood",
"default:fence_aspen_wood",
"default:fence_pine_wood",
"default:fence_junglewood",
"default:torch",
"bones:bones",
"default:sign_wall",
"signs:sign_wall",
"signs:sign_wall_blue",
"signs:sign_wall_brown",
"signs:sign_wall_orange",
"signs:sign_wall_green",
"signs:sign_yard",
"signs:sign_wall_white_black",
"signs:sign_wall_red",
"signs:sign_wall_white_red",
"signs:sign_wall_yellow",
"signs:sign_post",
"signs:sign_hanging",
}
minetest.after(0, function()
for _,name in ipairs(nonblocknodes) do
if minetest.registered_nodes[name] then
minetest.registered_nodes[name].groups.not_blocking_trains=1
end
end
end)
end

View file

@ -1240,70 +1240,6 @@ function wagon:reattach_all()
end
end
local function check_twagon_owner(train, b_first, pname)
local wtp = b_first and 1 or #train.trainparts
local wid = train.trainparts[wtp]
local wdata = advtrains.wagons[wid]
if wdata then
return advtrains.check_driving_couple_protection(pname, wdata.owner, wdata.whitelist)
end
return false
end
function advtrains.safe_couple_trains(id1, id2, t1f, t2f, pname, try_run,v1,v2)
if pname and not minetest.check_player_privs(pname, "train_operator") then
minetest.chat_send_player(pname, "Missing train_operator privilege")
return false
end
local train1=advtrains.trains[id1]
local train2=advtrains.trains[id2]
if not advtrains.train_ensure_init(id1, train1)
or not advtrains.train_ensure_init(id2, train2) then
return false
end
local wck_t1, wck_t2
if pname then
wck_t1 = check_twagon_owner(train1, t1f, pname)
wck_t2 = check_twagon_owner(train2, t2f, pname)
end
if (wck_t1 or wck_t2) or not pname then
if not v1 then
v1 = 0
end
if not v2 then
v2 = 0
end
if try_run then
return true
end
if t1f then
if t2f then
v1 = -v1
advtrains.invert_train(id1)
advtrains.do_connect_trains(id1, id2, v1+v2)
else
advtrains.do_connect_trains(id2, id1, v1+v2)
end
else
if t2f then
advtrains.do_connect_trains(id1, id2, v1+v2)
else
v2 = -v2
advtrains.invert_train(id2)
advtrains.do_connect_trains(id1, id2, v1+v2)
end
end
return true
else
minetest.chat_send_player(pname, "You must be authorized for at least one wagon.")
return false
end
end
function advtrains.safe_decouple_wagon(w_id, pname, try_run)
if not minetest.check_player_privs(pname, "train_operator") then
minetest.chat_send_player(pname, "Missing train_operator privilege")

View file

@ -104,7 +104,8 @@ end)
local get_ambience = function(player, tod, name)
-- play server or local music if music enabled and music not already playing
if play_music and MUSICVOLUME > 0 and playing[name].music < 0 then
if play_music and MUSICVOLUME > 0
and playing[name] and playing[name].music < 0 then
-- count backwards
playing[name].music = playing[name].music -1

View file

@ -139,7 +139,7 @@ ambience.add_set("lava", {
})
else
print ("[Ambience] found env_sounds, flowing water sounds disabled.")
print ("[Ambience] found env_sounds, flowing water and lava sounds disabled.")
end
-- Only add fire sounds set if flame_sound is disabled or fire redo active
@ -238,7 +238,7 @@ ambience.add_set("ice", {
frequency = 250,
sounds = {
{name = "icecrack", length = 23},
{name = "icecrack", length = 23, gain = 0.7},
{name = "desertwind", length = 8},
{name = "wind", length = 9}
},
@ -280,7 +280,7 @@ ambience.add_set("desert", {
end
})
-- Cave sounds play when below player position Y -25
-- Cave sounds play when below player position Y -25 and water nearby
ambience.add_set("cave", {
@ -293,7 +293,9 @@ ambience.add_set("cave", {
sound_check = function(def)
if def.pos.y < -25 then
local c = (def.totals["default:water_source"] or 0)
if c > 0 and def.pos.y < -25 then
return "cave"
end
end

View file

@ -2,11 +2,13 @@ Baked Clay
This mod lets the player bake clay into hardened blocks and colour them with
dye (8x baked clay and 1x dye in centre), stairs and slabs are also available.
Cooking baked clay turns it into glazed terracotta blocks.
https://forum.minetest.net/viewtopic.php?id=8890
Changelog:
- 1.0 - Added glazed terracotta blocks when you cook baked clay in furnace (thanks D3monPixel)
- 0.9 - Baked clay now works in the technic cnc machine
- 0.8 - Cooking clay block in furnace gives natural baked clay which you can dye
- 0.7 - Added support for stairsplus so that stairs are registered properly
@ -17,7 +19,7 @@ Changelog:
- 0.2 - Any colour of baked clay can be re-dyed into another colour
- 0.1 - Initial Release
Lucky Blocks: 9
Lucky Blocks: 10
Note: Under settings you will find 'colored_clay_compatibility' switch that when enabled will register aliases for the older colored clay mod and it's stairplus stairs.

View file

@ -17,7 +17,7 @@ local clay = {
{"brown", "Brown"},
{"pink", "Pink"},
{"dark_grey", "Dark Grey"},
{"dark_green", "Dark Green"},
{"dark_green", "Dark Green"}
}
local techcnc_mod = minetest.get_modpath("technic_cnc")
@ -27,42 +27,50 @@ local stairsplus_mod = minetest.get_modpath("moreblocks")
for _, clay in pairs(clay) do
-- node definition
-- node
minetest.register_node("bakedclay:" .. clay[1], {
description = clay[2] .. " Baked Clay",
tiles = {"baked_clay_" .. clay[1] ..".png"},
groups = {cracky = 3, bakedclay = 1},
sounds = default.node_sound_stone_defaults(),
sounds = default.node_sound_stone_defaults()
})
-- craft from dye and any baked clay
-- craft recipe
if clay[1] ~= "natural" then
minetest.register_craft({
output = "bakedclay:" .. clay[1] .. " 8",
recipe = {
{"group:bakedclay", "group:bakedclay", "group:bakedclay"},
{"group:bakedclay", "dye:" .. clay[1], "group:bakedclay"},
{"group:bakedclay", "group:bakedclay", "group:bakedclay"}
},
}
})
end
-- register stairsplus stairs if found
-- stairs plus
if stairsplus_mod then
stairsplus:register_all("bakedclay", "baked_clay_" .. clay[1], "bakedclay:" .. clay[1], {
stairsplus:register_all("bakedclay", "baked_clay_" .. clay[1],
"bakedclay:" .. clay[1], {
description = clay[2] .. " Baked Clay",
tiles = {"baked_clay_" .. clay[1] .. ".png"},
groups = {cracky = 3},
sounds = default.node_sound_stone_defaults(),
sounds = default.node_sound_stone_defaults()
})
stairsplus:register_alias_all("bakedclay", clay[1], "bakedclay", "baked_clay_" .. clay[1])
minetest.register_alias("stairs:slab_bakedclay_".. clay[1], "bakedclay:slab_baked_clay_" .. clay[1])
minetest.register_alias("stairs:stair_bakedclay_".. clay[1], "bakedclay:stair_baked_clay_" .. clay[1])
stairsplus:register_alias_all("bakedclay", clay[1],
"bakedclay", "baked_clay_" .. clay[1])
-- register all stair types for stairs redo
minetest.register_alias("stairs:slab_bakedclay_".. clay[1],
"bakedclay:slab_baked_clay_" .. clay[1])
minetest.register_alias("stairs:stair_bakedclay_".. clay[1],
"bakedclay:stair_baked_clay_" .. clay[1])
-- stairs redo
elseif stairs_mod and stairs.mod then
stairs.register_all("bakedclay_" .. clay[1], "bakedclay:" .. clay[1],
@ -71,7 +79,7 @@ for _, clay in pairs(clay) do
clay[2] .. " Baked Clay",
default.node_sound_stone_defaults())
-- register stair and slab using default stairs
-- default stairs
elseif stairs_mod then
stairs.register_stair_and_slab("bakedclay_".. clay[1], "bakedclay:".. clay[1],
@ -92,6 +100,56 @@ for _, clay in pairs(clay) do
end
end
-- Terracotta blocks (textures by D3monPixel, thanks for use :)
for _, clay in pairs(clay) do
if clay[1] ~= "natural" then
local texture = "baked_clay_terracotta_" .. clay[1] ..".png"
minetest.register_node("bakedclay:terracotta_" .. clay[1], {
description = clay[2] .. " Glazed Terracotta",
tiles = {
texture .. "",
texture .. "",
texture .. "^[transformR180",
texture .. "",
texture .. "^[transformR270",
texture .. "^[transformR90",
},
paramtype2 = "facedir",
groups = {cracky = 3, terracotta = 1},
sounds = default.node_sound_stone_defaults(),
on_place = minetest.rotate_node
})
minetest.register_craft({
type = "cooking",
output = "bakedclay:terracotta_" .. clay[1],
recipe = "bakedclay:" .. clay[1]
})
end
end
-- special light blue glazed terracotta block
local texture = "baked_clay_terracotta_light_blue.png"
minetest.register_node("bakedclay:terracotta_light_blue", {
description = "Light Blue Glazed Terracotta",
tiles = {
texture .. "",
texture .. "",
texture .. "^[transformR180",
texture .. "",
texture .. "^[transformR270",
texture .. "^[transformR90",
},
paramtype2 = "facedir",
groups = {cracky = 3, terracotta = 1},
sounds = default.node_sound_stone_defaults(),
on_place = minetest.rotate_node
})
-- cook clay block into white baked clay
minetest.register_craft({
@ -108,34 +166,29 @@ minetest.register_craft( {
recipe = {"dye:black", "dye:black", "dye:white"}
})
-- only add light grey recipe if unifieddye mod isnt present (conflict)
if not minetest.get_modpath("unifieddyes") then
minetest.register_craft( {
type = "shapeless",
output = "dye:grey 3",
recipe = {"dye:black", "dye:white", "dye:white"}
})
end
minetest.register_craft( {
type = "shapeless",
output = "dye:green 4",
recipe = {"default:cactus"}
})
minetest.register_craft( {
type = "shapeless",
output = "dye:black 4",
recipe = {"default:coal_lump"}
})
minetest.register_craft( {
type = "shapeless",
output = "dye:brown 4",
recipe = {"default:dry_shrub"}
})
-- 2x2 red bakedclay makes 16x clay brick
-- only add light grey recipe if unifieddye mod isnt present (conflict)
if not minetest.get_modpath("unifieddyes") then
minetest.register_craft( {
type = "shapeless",
output = "dye:grey 3",
recipe = {"dye:black", "dye:white", "dye:white"}
})
end
-- 2x2 red baked clay makes 16x clay brick
minetest.register_craft( {
output = "default:clay_brick 16",
recipe = {
@ -176,10 +229,17 @@ local function add_simple_flower(name, desc, box, f_groups)
end
local flowers = {
{"delphinium", "Blue Delphinium", {-0.15, -0.5, -0.15, 0.15, 0.3, 0.15}, {color_cyan = 1}},
{"thistle", "Thistle", {-0.15, -0.5, -0.15, 0.15, 0.2, 0.15}, {color_magenta = 1}},
{"lazarus", "Lazarus Bell", {-0.15, -0.5, -0.15, 0.15, 0.2, 0.15}, {color_pink = 1}},
{"mannagrass", "Reed Mannagrass", {-0.15, -0.5, -0.15, 0.15, 0.2, 0.15}, {color_dark_green = 1}},
{"delphinium", "Blue Delphinium",
{-0.15, -0.5, -0.15, 0.15, 0.3, 0.15}, {color_cyan = 1}},
{"thistle", "Thistle",
{-0.15, -0.5, -0.15, 0.15, 0.2, 0.15}, {color_magenta = 1}},
{"lazarus", "Lazarus Bell",
{-0.15, -0.5, -0.15, 0.15, 0.2, 0.15}, {color_pink = 1}},
{"mannagrass", "Reed Mannagrass",
{-0.15, -0.5, -0.15, 0.15, 0.2, 0.15}, {color_dark_green = 1}}
}
for _,item in pairs(flowers) do
@ -202,7 +262,7 @@ minetest.register_decoration({
},
y_min = 10,
y_max = 90,
decoration = "bakedclay:delphinium",
decoration = "bakedclay:delphinium"
})
minetest.register_decoration({
@ -219,7 +279,7 @@ minetest.register_decoration({
},
y_min = 15,
y_max = 90,
decoration = "bakedclay:thistle",
decoration = "bakedclay:thistle"
})
minetest.register_decoration({
@ -238,7 +298,7 @@ minetest.register_decoration({
y_max = 90,
decoration = "bakedclay:lazarus",
spawn_by = "default:jungletree",
num_spawn_by = 1,
num_spawn_by = 1
})
minetest.register_decoration({
@ -257,13 +317,15 @@ minetest.register_decoration({
y_max = 15,
decoration = "bakedclay:mannagrass",
spawn_by = "group:water",
num_spawn_by = 1,
num_spawn_by = 1
})
-- add lucky blocks
-- lucky blocks
if minetest.get_modpath("lucky_block") then
local p = "bakedclay:"
lucky_block:add_blocks({
{"dro", {"bakedclay:"}, 10, true},
{"fal", {p.."black", p.."blue", p.."brown", p.."cyan", p.."dark_green",
@ -295,13 +357,36 @@ lucky_block:add_blocks({
{name = p.."red", max = 30},
{name = p.."violet", max = 30},
{name = p.."white", max = 30},
{name = p.."yellow", max = 30},
{name = p.."yellow", max = 30}
}},
})
p = "bakedclay:terracotta_"
lucky_block:add_blocks({
{"nod", "default:chest", 0, {
{name = p.."light_blue", max = 20},
{name = p.."black", max = 20},
{name = p.."blue", max = 20},
{name = p.."brown", max = 20},
{name = p.."cyan", max = 20},
{name = p.."dark_green", max = 20},
{name = p.."dark_grey", max = 20},
{name = p.."green", max = 20},
{name = p.."grey", max = 20},
{name = p.."magenta", max = 20},
{name = p.."orange", max = 20},
{name = p.."pink", max = 20},
{name = p.."red", max = 20},
{name = p.."violet", max = 20},
{name = p.."white", max = 20},
{name = p.."yellow", max = 20}
}}
})
end
-- colored clay compatibility
if minetest.settings:get_bool("colored_clay_compatibility") == true then
local cc = {

View file

@ -19,3 +19,7 @@ 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.
Textures by D3monPixel (https://mcpedl.com/better-glazed-terracotta-pack)
baked_clay_terracotta*.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 328 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 718 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 661 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 714 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 328 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 575 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 659 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 275 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 606 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 409 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 292 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 619 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 512 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 676 B

15
mods/bridger/.luacheckrc Normal file
View file

@ -0,0 +1,15 @@
globals = {
"minetest",
}
read_globals = {
-- Builtin
"vector",
-- Mod Deps
"default",
"stairsplus",
"stairs",
"mesecon",
}

7
mods/bridger/README.md Normal file
View file

@ -0,0 +1,7 @@
# Bridger [bridger]
[![luacheck](https://github.com/v-rob/bridger/workflows/luacheck/badge.svg)](https://github.com/v-rob/bridger/actions)
Adds a large number of advanced nodes conducive to building large, industrial bridges to [Minetest](https://www.minetest.net). Also see the [forum post](https://forum.minetest.net/viewtopic.php?t=18243).
![](screenshot.png?raw=true)

View file

@ -61,7 +61,8 @@ for _, color in pairs(bridger_colors) do
minetest.register_alias("bridges:" .. prefix .. oldname, "bridger:" .. prefix .. "_" .. newname)
end
minetest.register_alias("bridges:truss_superstructure_simple_end" .. oldname, "bridger:truss_superstructure_simple_end_left_" .. newname)
minetest.register_alias("bridges:truss_superstructure_simple_end" .. oldname,
"bridger:truss_superstructure_simple_end_left_" .. newname)
minetest.register_alias("bridges:girder_left_end" .. oldname, "bridger:girder_left_" .. newname)
end

View file

@ -28,7 +28,7 @@ minetest.register_craft({
}
})
if minetest.settings:get_bool("bridger_enable_trusses") then
if minetest.settings:get_bool("bridger_enable_trusses", true) then
minetest.register_craftitem("bridger:bridges_steel_rod", {
description = "Steel Rod",
inventory_image = "bridges_steel_rod.png",
@ -174,7 +174,11 @@ if minetest.settings:get_bool("bridger_enable_trusses") then
minetest.register_craft({
output = "bridger:corrugated_steel_ceiling_" .. bridge_color .. " 3",
recipe = {
{"bridger:corrugated_steel" .. bridge_color, "bridger:corrugated_steel" .. bridge_color, "bridger:corrugated_steel" .. bridge_color},
{
"bridger:corrugated_steel" .. bridge_color,
"bridger:corrugated_steel" .. bridge_color,
"bridger:corrugated_steel" .. bridge_color
},
}
})
@ -204,7 +208,11 @@ if minetest.settings:get_bool("bridger_enable_trusses") then
minetest.register_craft({
output = "bridger:corrugated_steel_ceiling_" .. bridge_color .. " 3",
recipe = {
{"bridger:corrugated_steel" .. bridge_color, "bridger:corrugated_steel" .. bridge_color, "bridger:corrugated_steel" .. bridge_color},
{
"bridger:corrugated_steel" .. bridge_color,
"bridger:corrugated_steel" .. bridge_color,
"bridger:corrugated_steel" .. bridge_color
},
}
})
@ -324,13 +332,19 @@ if minetest.settings:get_bool("bridger_enable_trusses") then
minetest.register_craft({
output = "bridger:truss_superstructure_mid_" .. bridge_color,
type = "shapeless",
recipe = {"bridger:truss_superstructure_left_slant_" .. bridge_color, "bridger:truss_superstructure_right_slant_" .. bridge_color},
recipe = {
"bridger:truss_superstructure_left_slant_" .. bridge_color,
"bridger:truss_superstructure_right_slant_" .. bridge_color
},
})
minetest.register_craft({
output = "bridger:truss_superstructure_tall_mid_" .. bridge_color,
type = "shapeless",
recipe = {"bridger:truss_superstructure_tall_left_slant_" .. bridge_color, "bridger:truss_superstructure_tall_right_slant_" .. bridge_color},
recipe = {
"bridger:truss_superstructure_tall_left_slant_" .. bridge_color,
"bridger:truss_superstructure_tall_right_slant_" .. bridge_color
},
})
minetest.register_craft({
@ -405,7 +419,10 @@ if minetest.settings:get_bool("bridger_enable_trusses") then
minetest.register_craft({
output = "bridger:truss_substructure_mid_" .. bridge_color,
type = "shapeless",
recipe = {"bridger:truss_substructure_left_slant_" .. bridge_color, "bridger:truss_substructure_right_slant_" .. bridge_color},
recipe = {
"bridger:truss_substructure_left_slant_" .. bridge_color,
"bridger:truss_substructure_right_slant_" .. bridge_color
},
})
minetest.register_craft({
@ -684,161 +701,161 @@ if minetest.settings:get_bool("bridger_enable_trusses") then
}
for c in ipairs(bridge_nodes) do
local bridge_nodes = bridge_nodes[c]
local bridge_node = bridge_nodes[c]
minetest.register_craft({
output = "bridger:" .. bridge_nodes .. "white",
output = "bridger:" .. bridge_node .. "white",
type = "shapeless",
recipe = {"bridger:" .. bridge_nodes .. "yellow", "dye:white"},
recipe = {"bridger:" .. bridge_node .. "yellow", "dye:white"},
})
minetest.register_craft({
output = "bridger:" .. bridge_nodes .. "white",
output = "bridger:" .. bridge_node .. "white",
type = "shapeless",
recipe = {"bridger:" .. bridge_nodes .. "steel", "dye:white"},
recipe = {"bridger:" .. bridge_node .. "steel", "dye:white"},
})
minetest.register_craft({
output = "bridger:" .. bridge_nodes .. "white",
output = "bridger:" .. bridge_node .. "white",
type = "shapeless",
recipe = {"bridger:" .. bridge_nodes .. "green", "dye:white"},
recipe = {"bridger:" .. bridge_node .. "green", "dye:white"},
})
minetest.register_craft({
output = "bridger:" .. bridge_nodes .. "white",
output = "bridger:" .. bridge_node .. "white",
type = "shapeless",
recipe = {"bridger:" .. bridge_nodes .. "red", "dye:white"},
recipe = {"bridger:" .. bridge_node .. "red", "dye:white"},
})
minetest.register_craft({
output = "bridger:" .. bridge_nodes .. "red",
output = "bridger:" .. bridge_node .. "red",
type = "shapeless",
recipe = {"bridger:" .. bridge_nodes .. "white", "dye:red"},
recipe = {"bridger:" .. bridge_node .. "white", "dye:red"},
})
minetest.register_craft({
output = "bridger:" .. bridge_nodes .. "red",
output = "bridger:" .. bridge_node .. "red",
type = "shapeless",
recipe = {"bridger:" .. bridge_nodes .. "steel", "dye:red"},
recipe = {"bridger:" .. bridge_node .. "steel", "dye:red"},
})
minetest.register_craft({
output = "bridger:" .. bridge_nodes .. "red",
output = "bridger:" .. bridge_node .. "red",
type = "shapeless",
recipe = {"bridger:" .. bridge_nodes .. "green", "dye:red"},
recipe = {"bridger:" .. bridge_node .. "green", "dye:red"},
})
minetest.register_craft({
output = "bridger:" .. bridge_nodes .. "red",
output = "bridger:" .. bridge_node .. "red",
type = "shapeless",
recipe = {"bridger:" .. bridge_nodes .. "yellow", "dye:red"},
recipe = {"bridger:" .. bridge_node .. "yellow", "dye:red"},
})
minetest.register_craft({
output = "bridger:" .. bridge_nodes .. "green",
output = "bridger:" .. bridge_node .. "green",
type = "shapeless",
recipe = {"bridger:" .. bridge_nodes .. "white", "dye:green"},
recipe = {"bridger:" .. bridge_node .. "white", "dye:green"},
})
minetest.register_craft({
output = "bridger:" .. bridge_nodes .. "green",
output = "bridger:" .. bridge_node .. "green",
type = "shapeless",
recipe = {"bridger:" .. bridge_nodes .. "steel", "dye:green"},
recipe = {"bridger:" .. bridge_node .. "steel", "dye:green"},
})
minetest.register_craft({
output = "bridger:" .. bridge_nodes .. "green",
output = "bridger:" .. bridge_node .. "green",
type = "shapeless",
recipe = {"bridger:" .. bridge_nodes .. "yellow", "dye:green"},
recipe = {"bridger:" .. bridge_node .. "yellow", "dye:green"},
})
minetest.register_craft({
output = "bridger:" .. bridge_nodes .. "green",
output = "bridger:" .. bridge_node .. "green",
type = "shapeless",
recipe = {"bridger:" .. bridge_nodes .. "red", "dye:green"},
recipe = {"bridger:" .. bridge_node .. "red", "dye:green"},
})
minetest.register_craft({
output = "bridger:" .. bridge_nodes .. "steel",
output = "bridger:" .. bridge_node .. "steel",
type = "shapeless",
recipe = {"bridger:" .. bridge_nodes .. "white", "dye:black"},
recipe = {"bridger:" .. bridge_node .. "white", "dye:black"},
})
minetest.register_craft({
output = "bridger:" .. bridge_nodes .. "steel",
output = "bridger:" .. bridge_node .. "steel",
type = "shapeless",
recipe = {"bridger:" .. bridge_nodes .. "yellow", "dye:black"},
recipe = {"bridger:" .. bridge_node .. "yellow", "dye:black"},
})
minetest.register_craft({
output = "bridger:" .. bridge_nodes .. "steel",
output = "bridger:" .. bridge_node .. "steel",
type = "shapeless",
recipe = {"bridger:" .. bridge_nodes .. "green", "dye:black"},
recipe = {"bridger:" .. bridge_node .. "green", "dye:black"},
})
minetest.register_craft({
output = "bridger:" .. bridge_nodes .. "steel",
output = "bridger:" .. bridge_node .. "steel",
type = "shapeless",
recipe = {"bridger:" .. bridge_nodes .. "red", "dye:black"},
recipe = {"bridger:" .. bridge_node .. "red", "dye:black"},
})
minetest.register_craft({
output = "bridger:" .. bridge_nodes .. "steel",
output = "bridger:" .. bridge_node .. "steel",
type = "shapeless",
recipe = {"bridger:" .. bridge_nodes .. "white", "dye:dark_grey"},
recipe = {"bridger:" .. bridge_node .. "white", "dye:dark_grey"},
})
minetest.register_craft({
output = "bridger:" .. bridge_nodes .. "steel",
output = "bridger:" .. bridge_node .. "steel",
type = "shapeless",
recipe = {"bridger:" .. bridge_nodes .. "yellow", "dye:dark_grey"},
recipe = {"bridger:" .. bridge_node .. "yellow", "dye:dark_grey"},
})
minetest.register_craft({
output = "bridger:" .. bridge_nodes .. "steel",
output = "bridger:" .. bridge_node .. "steel",
type = "shapeless",
recipe = {"bridger:" .. bridge_nodes .. "green", "dye:dark_grey"},
recipe = {"bridger:" .. bridge_node .. "green", "dye:dark_grey"},
})
minetest.register_craft({
output = "bridger:" .. bridge_nodes .. "steel",
output = "bridger:" .. bridge_node .. "steel",
type = "shapeless",
recipe = {"bridger:" .. bridge_nodes .. "red", "dye:dark_grey"},
recipe = {"bridger:" .. bridge_node .. "red", "dye:dark_grey"},
})
minetest.register_craft({
output = "bridger:" .. bridge_nodes .. "yellow",
output = "bridger:" .. bridge_node .. "yellow",
type = "shapeless",
recipe = {"bridger:" .. bridge_nodes .. "white", "dye:yellow"},
recipe = {"bridger:" .. bridge_node .. "white", "dye:yellow"},
})
minetest.register_craft({
output = "bridger:" .. bridge_nodes .. "yellow",
output = "bridger:" .. bridge_node .. "yellow",
type = "shapeless",
recipe = {"bridger:" .. bridge_nodes .. "steel", "dye:yellow"},
recipe = {"bridger:" .. bridge_node .. "steel", "dye:yellow"},
})
minetest.register_craft({
output = "bridger:" .. bridge_nodes .. "yellow",
output = "bridger:" .. bridge_node .. "yellow",
type = "shapeless",
recipe = {"bridger:" .. bridge_nodes .. "green", "dye:yellow"},
recipe = {"bridger:" .. bridge_node .. "green", "dye:yellow"},
})
minetest.register_craft({
output = "bridger:" .. bridge_nodes .. "yellow",
output = "bridger:" .. bridge_node .. "yellow",
type = "shapeless",
recipe = {"bridger:" .. bridge_nodes .. "red", "dye:yellow"},
recipe = {"bridger:" .. bridge_node .. "red", "dye:yellow"},
})
minetest.register_craft({
output = "bridger:" .. bridge_nodes .. "red",
output = "bridger:" .. bridge_node .. "red",
type = "shapeless",
recipe = {"bridger:" .. bridge_nodes .. "yellow", "dye:red"},
recipe = {"bridger:" .. bridge_node .. "yellow", "dye:red"},
})
end
end
if minetest.settings:get_bool("bridger_enable_trestles") then
if minetest.settings:get_bool("bridger_enable_trestles", true) then
minetest.register_craft({
output = "bridger:trestle_support_small",
recipe = {
@ -908,7 +925,7 @@ if minetest.settings:get_bool("bridger_enable_trestles") then
})
end
if minetest.settings:get_bool("bridger_enable_wooden_bridges") then
if minetest.settings:get_bool("bridger_enable_wooden_bridges", true) then
minetest.register_craft({
output = "bridger:small_beam",
recipe = {

View file

@ -1 +1 @@
A mod that adds various bridge nodes to Minetest.
Adds a large number of advanced nodes conducive to building large, industrial bridges.

View file

@ -23,7 +23,7 @@ local function rotate_and_place(itemstack, placer, pointed_thing)
return minetest.item_place(itemstack, placer, pointed_thing, param2)
end
if not minetest.settings:get_bool("bridger_disable_trusses") then
if minetest.settings:get_bool("bridger_enable_trusses", true) then
local bridge_colors = {
{"Green", "green"},
{"Red", "red"},
@ -34,7 +34,7 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
for _, row in ipairs(bridge_colors) do
local bridge_desc = row[1]
local bridge_colors = row[2]
local bridge_color = row[2]
minetest.register_node("bridger:foundation", {
description = "Bridge Foundation",
@ -61,39 +61,39 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_stone_defaults(),
})
minetest.register_node("bridger:block_" .. bridge_colors, {
minetest.register_node("bridger:block_" .. bridge_color, {
description = bridge_desc .. " Block",
drawtype = "normal",
tiles = {"bridges_" .. bridge_colors .. ".png"},
tiles = {"bridges_" .. bridge_color .. ".png"},
paramtype = "light",
groups = {cracky=3},
sounds = default.node_sound_metal_defaults(),
})
if minetest.get_modpath("moreblocks") then
stairsplus:register_all("bridger", "block_" .. bridge_colors, "bridger:block_" .. bridge_colors, {
stairsplus:register_all("bridger", "block_" .. bridge_color, "bridger:block_" .. bridge_color, {
description = bridge_desc,
tiles = {"bridges_" .. bridge_colors .. ".png"},
tiles = {"bridges_" .. bridge_color .. ".png"},
groups = {cracky=3},
sounds = default.node_sound_metal_defaults(),
})
minetest.register_alias("bridger:step_" .. bridge_colors, "bridger:panel_block_" .. bridge_colors)
minetest.register_alias("bridger:step_" .. bridge_color, "bridger:panel_block_" .. bridge_color)
elseif minetest.get_modpath("stairs") then
stairs.register_stair_and_slab(
"block_" .. bridge_colors,
"bridger:block_" .. bridge_colors,
"block_" .. bridge_color,
"bridger:block_" .. bridge_color,
{cracky=3},
{"bridges_" .. bridge_colors .. ".png"},
{"bridges_" .. bridge_color .. ".png"},
bridge_desc .. " Stair",
bridge_desc .. " Slab",
default.node_sound_metal_defaults()
)
minetest.register_node("bridger:step_" .. bridge_colors, {
minetest.register_node("bridger:step_" .. bridge_color, {
description = bridge_desc .. " Step",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
tiles = {"bridges_" .. bridge_color .. ".png"},
paramtype = "light",
paramtype2 = "facedir",
node_box = {
@ -113,10 +113,10 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
})
end
minetest.register_node("bridger:suspension_top_" .. bridge_colors, {
minetest.register_node("bridger:suspension_top_" .. bridge_color, {
description = bridge_desc .. " Cable Top",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
tiles = {"bridges_" .. bridge_color .. ".png"},
paramtype = "light",
paramtype2 = "facedir",
node_box = {
@ -136,10 +136,10 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
end,
})
minetest.register_node("bridger:suspension_cable_" .. bridge_colors, {
minetest.register_node("bridger:suspension_cable_" .. bridge_color, {
description = bridge_desc .. " Cable",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
tiles = {"bridges_" .. bridge_color .. ".png"},
paramtype = "light",
node_box = {
type = "fixed",
@ -151,10 +151,10 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:deck_" .. bridge_colors, {
minetest.register_node("bridger:deck_" .. bridge_color, {
description = bridge_desc .. " Deck",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
tiles = {"bridges_" .. bridge_color .. ".png"},
paramtype = "light",
sunlight_propagates = true,
node_box = {
@ -173,10 +173,10 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:deck_edge_" .. bridge_colors, {
minetest.register_node("bridger:deck_edge_" .. bridge_color, {
description = bridge_desc .. " Deck Edge",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
tiles = {"bridges_" .. bridge_color .. ".png"},
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -197,10 +197,10 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:train_deck_" .. bridge_colors, {
minetest.register_node("bridger:train_deck_" .. bridge_color, {
description = bridge_desc .. " Train Deck",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
tiles = {"bridges_" .. bridge_color .. ".png"},
paramtype = "light",
sunlight_propagates = true,
node_box = {
@ -247,10 +247,10 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:girder_mid_" .. bridge_colors, {
minetest.register_node("bridger:girder_mid_" .. bridge_color, {
description = bridge_desc .. " Girder Middle",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
tiles = {"bridges_" .. bridge_color .. ".png"},
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -275,10 +275,10 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:girder_right_" .. bridge_colors, {
minetest.register_node("bridger:girder_right_" .. bridge_color, {
description = bridge_desc .. " Girder Right End",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
tiles = {"bridges_" .. bridge_color .. ".png"},
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -315,10 +315,10 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:girder_left_" .. bridge_colors, {
minetest.register_node("bridger:girder_left_" .. bridge_color, {
description = bridge_desc .. " Girder Left End",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
tiles = {"bridges_" .. bridge_color .. ".png"},
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -355,12 +355,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:truss_superstructure_right_slant_" .. bridge_colors, {
minetest.register_node("bridger:truss_superstructure_right_slant_" .. bridge_color, {
description = bridge_desc .. " Truss Superstructure Right Slant",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_right_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_right_slant.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_right_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_right_slant.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -420,12 +422,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:truss_superstructure_left_slant_" .. bridge_colors, {
minetest.register_node("bridger:truss_superstructure_left_slant_" .. bridge_color, {
description = bridge_desc .. " Truss Superstructure Left Slant",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_left_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_left_slant.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_left_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_left_slant.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -485,12 +489,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:truss_superstructure_end_right_slant_" .. bridge_colors, {
minetest.register_node("bridger:truss_superstructure_end_right_slant_" .. bridge_color, {
description = bridge_desc .. " Truss Superstructure End Right Slant",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_end_right_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_end_right_slant.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_end_right_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_end_right_slant.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -548,12 +554,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:truss_superstructure_end_left_slant_" .. bridge_colors, {
minetest.register_node("bridger:truss_superstructure_end_left_slant_" .. bridge_color, {
description = bridge_desc .. " Truss Superstructure End Left Slant",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_end_left_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_end_left_slant.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_end_left_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_end_left_slant.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -611,12 +619,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:truss_superstructure_mid_" .. bridge_colors, {
minetest.register_node("bridger:truss_superstructure_mid_" .. bridge_color, {
description = bridge_desc .. " Truss Superstructure Middle",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_mid.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_mid.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_mid.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_mid.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -707,12 +717,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:truss_superstructure_tall_right_slant_" .. bridge_colors, {
minetest.register_node("bridger:truss_superstructure_tall_right_slant_" .. bridge_color, {
description = bridge_desc .. " Tall Truss Superstructure Right Slant",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_tall_right_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_tall_right_slant.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_tall_right_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_tall_right_slant.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -770,12 +782,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:truss_superstructure_tall_left_slant_" .. bridge_colors, {
minetest.register_node("bridger:truss_superstructure_tall_left_slant_" .. bridge_color, {
description = bridge_desc .. " Tall Truss Superstructure Left Slant",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_tall_left_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_tall_left_slant.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_tall_left_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_tall_left_slant.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -833,12 +847,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:truss_superstructure_tall_mid_" .. bridge_colors, {
minetest.register_node("bridger:truss_superstructure_tall_mid_" .. bridge_color, {
description = bridge_desc .. " Tall Truss Superstructure Middle",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_tall_mid.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_tall_mid.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_tall_mid.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_tall_mid.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -925,12 +941,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:truss_superstructure_tall_simple_" .. bridge_colors, {
minetest.register_node("bridger:truss_superstructure_tall_simple_" .. bridge_color, {
description = bridge_desc .. " Tall Truss Superstructure Middle Simple",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_tall_simple.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_tall_simple.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_tall_simple.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_tall_simple.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -1016,12 +1034,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:truss_superstructure_tall_simple_end_left_" .. bridge_colors, {
minetest.register_node("bridger:truss_superstructure_tall_simple_end_left_" .. bridge_color, {
description = bridge_desc .. " Tall Truss Superstructure Simple Left End",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_tall_simple_end_left.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_tall_simple_end_left.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_tall_simple_end_left.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_tall_simple_end_left.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -1035,12 +1055,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:truss_superstructure_tall_simple_end_right_" .. bridge_colors, {
minetest.register_node("bridger:truss_superstructure_tall_simple_end_right_" .. bridge_color, {
description = bridge_desc .. " Tall Truss Superstructure Simple Right End",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_tall_simple_end_right.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_tall_simple_end_right.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_tall_simple_end_right.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_tall_simple_end_right.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -1054,12 +1076,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:truss_superstructure_simple_" .. bridge_colors, {
minetest.register_node("bridger:truss_superstructure_simple_" .. bridge_color, {
description = bridge_desc .. " Truss Superstructure Middle Simple",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_simple.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_simple.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_simple.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_simple.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -1150,12 +1174,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:truss_superstructure_simple_end_left_" .. bridge_colors, {
minetest.register_node("bridger:truss_superstructure_simple_end_left_" .. bridge_color, {
description = bridge_desc .. " Truss Superstructure Simple Left End",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_simple_end_left.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_simple_end_left.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_simple_end_left.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_simple_end_left.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -1169,12 +1195,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:truss_superstructure_simple_end_right_" .. bridge_colors, {
minetest.register_node("bridger:truss_superstructure_simple_end_right_" .. bridge_color, {
description = bridge_desc .. " Truss Superstructure Simple Right End",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_simple_end_right.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_simple_end_right.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_simple_end_right.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_simple_end_right.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -1188,12 +1216,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:truss_superstructure_up_right_slant_" .. bridge_colors, {
minetest.register_node("bridger:truss_superstructure_up_right_slant_" .. bridge_color, {
description = bridge_desc .. " Truss Superstructure Up Right Slant",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_up_right_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_up_right_slant.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_up_right_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_up_right_slant.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -1268,12 +1298,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:truss_superstructure_up_left_slant_" .. bridge_colors, {
minetest.register_node("bridger:truss_superstructure_up_left_slant_" .. bridge_color, {
description = bridge_desc .. " Truss Superstructure Up Left Slant",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_up_left_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_up_left_slant.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_up_left_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_up_left_slant.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -1346,12 +1378,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:truss_superstructure_up_mid_" .. bridge_colors, {
minetest.register_node("bridger:truss_superstructure_up_mid_" .. bridge_color, {
description = bridge_desc .. " Truss Superstructure Up Middle",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_up_mid.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_up_mid.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_up_mid.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_up_mid.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -1455,12 +1489,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:truss_superstructure_up_simple_" .. bridge_colors, {
minetest.register_node("bridger:truss_superstructure_up_simple_" .. bridge_color, {
description = bridge_desc .. " Truss Superstructure Up Simple",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_up_simple.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_up_simple.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_up_simple.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_up_simple.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -1562,12 +1598,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:truss_superstructure_down_right_slant_" .. bridge_colors, {
minetest.register_node("bridger:truss_superstructure_down_right_slant_" .. bridge_color, {
description = bridge_desc .. " Truss Superstructure Down Right Slant",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_down_right_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_down_right_slant.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_down_right_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_down_right_slant.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -1640,12 +1678,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:truss_superstructure_down_left_slant_" .. bridge_colors, {
minetest.register_node("bridger:truss_superstructure_down_left_slant_" .. bridge_color, {
description = bridge_desc .. " Truss Superstructure Down Left Slant",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_down_left_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_down_left_slant.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_down_left_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_down_left_slant.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -1720,12 +1760,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:truss_superstructure_down_mid_" .. bridge_colors, {
minetest.register_node("bridger:truss_superstructure_down_mid_" .. bridge_color, {
description = bridge_desc .. " Truss Superstructure Down Middle",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_down_mid.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_down_mid.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_down_mid.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_down_mid.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -1829,12 +1871,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:truss_superstructure_down_simple_" .. bridge_colors, {
minetest.register_node("bridger:truss_superstructure_down_simple_" .. bridge_color, {
description = bridge_desc .. " Truss Superstructure Down Simple",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_down_simple.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_down_simple.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_down_simple.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color ..
".png^bridges_superstructure_down_simple.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -1936,12 +1980,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:truss_substructure_end_right_slant_" .. bridge_colors, {
minetest.register_node("bridger:truss_substructure_end_right_slant_" .. bridge_color, {
description = bridge_desc .. " Truss Substructure End Right Slant",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_substructure_end_right_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_substructure_end_right_slant.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color ..
".png^bridges_substructure_end_right_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color ..
".png^bridges_substructure_end_right_slant.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -1998,12 +2044,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:truss_substructure_end_left_slant_" .. bridge_colors, {
minetest.register_node("bridger:truss_substructure_end_left_slant_" .. bridge_color, {
description = bridge_desc .. " Truss Substructure End Left Slant",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_substructure_end_left_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_substructure_end_left_slant.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color ..
".png^bridges_substructure_end_left_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color ..
".png^bridges_substructure_end_left_slant.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -2060,12 +2108,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:truss_substructure_right_slant_" .. bridge_colors, {
minetest.register_node("bridger:truss_substructure_right_slant_" .. bridge_color, {
description = bridge_desc .. " Truss Substructure Right Slant",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_substructure_right_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_substructure_right_slant.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color .. ".png^bridges_substructure_right_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color .. ".png^bridges_substructure_right_slant.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -2123,12 +2171,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:truss_substructure_left_slant_" .. bridge_colors, {
minetest.register_node("bridger:truss_substructure_left_slant_" .. bridge_color, {
description = bridge_desc .. " Truss Substructure Left Slant",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_substructure_left_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_substructure_left_slant.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color .. ".png^bridges_substructure_left_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color .. ".png^bridges_substructure_left_slant.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -2187,12 +2235,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:truss_substructure_simple_" .. bridge_colors, {
minetest.register_node("bridger:truss_substructure_simple_" .. bridge_color, {
description = bridge_desc .. " Truss Substructure Simple",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_substructure_simple.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_substructure_simple.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color .. ".png^bridges_substructure_simple.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color .. ".png^bridges_substructure_simple.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -2275,12 +2323,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:truss_substructure_mid_" .. bridge_colors, {
minetest.register_node("bridger:truss_substructure_mid_" .. bridge_color, {
description = bridge_desc .. " Truss Substructure Middle",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_substructure_mid.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_substructure_mid.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color .. ".png^bridges_substructure_mid.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color .. ".png^bridges_substructure_mid.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -2365,12 +2413,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:small_upper_chord_" .. bridge_colors, {
minetest.register_node("bridger:small_upper_chord_" .. bridge_color, {
description = bridge_desc .. " Small Upper Chord",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_small_upper_chord.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_small_upper_chord.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color .. ".png^bridges_small_upper_chord.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color .. ".png^bridges_small_upper_chord.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -2418,12 +2466,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:small_upper_chord_slanted_" .. bridge_colors, {
minetest.register_node("bridger:small_upper_chord_slanted_" .. bridge_color, {
description = bridge_desc .. " Small Slanted Upper Chord",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_small_upper_chord_slanted.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_small_upper_chord_slanted.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color .. ".png^bridges_small_upper_chord_slanted.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color .. ".png^bridges_small_upper_chord_slanted.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -2522,12 +2570,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:medium_upper_chord_" .. bridge_colors, {
minetest.register_node("bridger:medium_upper_chord_" .. bridge_color, {
description = bridge_desc .. " Medium Upper Chord",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_medium_upper_chord.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_medium_upper_chord.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color .. ".png^bridges_medium_upper_chord.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color .. ".png^bridges_medium_upper_chord.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -2607,12 +2655,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:medium_upper_chord_slanted_" .. bridge_colors, {
minetest.register_node("bridger:medium_upper_chord_slanted_" .. bridge_color, {
description = bridge_desc .. " Medium Slanted Upper Chord",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_medium_upper_chord_slanted.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_medium_upper_chord_slanted.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color .. ".png^bridges_medium_upper_chord_slanted.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color .. ".png^bridges_medium_upper_chord_slanted.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -2723,12 +2771,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:large_upper_chord_" .. bridge_colors, {
minetest.register_node("bridger:large_upper_chord_" .. bridge_color, {
description = bridge_desc .. " Large Upper Chord",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_large_upper_chord.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_large_upper_chord.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color .. ".png^bridges_large_upper_chord.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color .. ".png^bridges_large_upper_chord.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -2804,12 +2852,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:large_upper_chord_slanted_" .. bridge_colors, {
minetest.register_node("bridger:large_upper_chord_slanted_" .. bridge_color, {
description = bridge_desc .. " Large Slanted Upper Chord",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_large_upper_chord_slanted.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_large_upper_chord_slanted.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color .. ".png^bridges_large_upper_chord_slanted.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color .. ".png^bridges_large_upper_chord_slanted.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -2920,12 +2968,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:small_support_" .. bridge_colors, {
minetest.register_node("bridger:small_support_" .. bridge_color, {
description = bridge_desc .. " Small Support",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_small_support.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_small_support.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color .. ".png^bridges_small_support.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color .. ".png^bridges_small_support.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -3032,12 +3080,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:small_support_top_" .. bridge_colors, {
minetest.register_node("bridger:small_support_top_" .. bridge_color, {
description = bridge_desc .. " Small Support Top",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_small_support_top.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_small_support_top.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color .. ".png^bridges_small_support_top.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color .. ".png^bridges_small_support_top.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -3228,12 +3276,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:medium_support_" .. bridge_colors, {
minetest.register_node("bridger:medium_support_" .. bridge_color, {
description = bridge_desc .. " Medium Support",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_medium_support.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_medium_support.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color .. ".png^bridges_medium_support.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color .. ".png^bridges_medium_support.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -3339,12 +3387,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:medium_support_bot_" .. bridge_colors, {
minetest.register_node("bridger:medium_support_bot_" .. bridge_color, {
description = bridge_desc .. " Bottom Medium Support",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_medium_support_bot.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_medium_support_bot.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color .. ".png^bridges_medium_support_bot.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color .. ".png^bridges_medium_support_bot.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -3365,12 +3413,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:large_support_" .. bridge_colors, {
minetest.register_node("bridger:large_support_" .. bridge_color, {
description = bridge_desc .. " Large Support",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_large_support.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_large_support.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color .. ".png^bridges_large_support.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color .. ".png^bridges_large_support.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -3483,12 +3531,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:large_support_bot_" .. bridge_colors, {
minetest.register_node("bridger:large_support_bot_" .. bridge_color, {
description = bridge_desc .. " Bottom Large Support",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_large_support_bot.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_large_support_bot.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color .. ".png^bridges_large_support_bot.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color .. ".png^bridges_large_support_bot.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -3509,12 +3557,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:truss_superstructure_right_slant_" .. bridge_colors, {
minetest.register_node("bridger:truss_superstructure_right_slant_" .. bridge_color, {
description = bridge_desc .. " Truss Superstructure Right Slant",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_right_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_right_slant.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color .. ".png^bridges_superstructure_right_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color .. ".png^bridges_superstructure_right_slant.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -3574,12 +3622,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:truss_superstructure_left_slant_" .. bridge_colors, {
minetest.register_node("bridger:truss_superstructure_left_slant_" .. bridge_color, {
description = bridge_desc .. " Truss Superstructure Left Slant",
drawtype = "nodebox",
tiles = {"bridges_" .. bridge_colors .. ".png"},
inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_left_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_left_slant.png^[makealpha:255,126,126",
tiles = {"bridges_" .. bridge_color .. ".png"},
inventory_image = "bridges_" .. bridge_color .. ".png^bridges_superstructure_left_slant.png^[makealpha:255,126,126",
wield_image = "bridges_" .. bridge_color .. ".png^bridges_superstructure_left_slant.png^[makealpha:255,126,126",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -3639,10 +3687,10 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:corrugated_steel_" .. bridge_colors, {
minetest.register_node("bridger:corrugated_steel_" .. bridge_color, {
description = bridge_desc .. " Corrugated Steel",
drawtype = "nodebox",
tiles = {"bridges_corrugated_steel_" .. bridge_colors .. ".png"},
tiles = {"bridges_corrugated_steel_" .. bridge_color .. ".png"},
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -3662,10 +3710,10 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("bridger:corrugated_steel_ceiling_" .. bridge_colors, {
minetest.register_node("bridger:corrugated_steel_ceiling_" .. bridge_color, {
description = bridge_desc .. " Corrugated Steel Deck",
drawtype = "nodebox",
tiles = {"bridges_corrugated_steel_" .. bridge_colors .. ".png^[transformR90"},
tiles = {"bridges_corrugated_steel_" .. bridge_color .. ".png^[transformR90"},
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
@ -3681,7 +3729,7 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then
end
end
if not minetest.settings:get_bool("bridger_disable_trestles") then
if minetest.settings:get_bool("bridger_enable_trestles", true) then
minetest.register_node("bridger:trestle_support", {
description = "Trestle Support",
drawtype = "nodebox",
@ -4092,7 +4140,7 @@ if not minetest.settings:get_bool("bridger_disable_trestles") then
})
end
if not minetest.settings:get_bool("bridger_disable_wooden_bridges") then
if minetest.settings:get_bool("bridger_enable_wooden_bridges", true) then
minetest.register_node("bridger:small_beam", {
description = "Small Wooden Beam Bridge",
drawtype = "nodebox",
@ -4453,7 +4501,7 @@ if not minetest.settings:get_bool("bridger_disable_wooden_bridges") then
local mesecon_on_blastnode = nil
if minetest.get_modpath("mesecons") then
mesecons_on_blastnode = mesecon.on_blastnode
mesecon_on_blastnode = mesecon.on_blastnode
end
minetest.register_node("bridger:large_beam_swivel_normal", {

View file

@ -441,7 +441,10 @@ core.register_entity(":__builtin:item", {
step_gravity = function(self)
if self.falling_state then
local vel = self.object:get_velocity()
-- apply gravity if falling or Y velocity not 0 (just incase)
if self.falling_state or (vel and vel.y ~= 0) then
self.accel.y = self.accel.y - gravity
end
end,

View file

@ -138,7 +138,8 @@ function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities,
end
local punch_interval = 1
if tool_capabilities and tool_capabilities.full_punch_interval then
-- Faulty tool registrations may cause the interval to be set to 0 !
if tool_capabilities and (tool_capabilities.full_punch_interval or 0) > 0 then
punch_interval = tool_capabilities.full_punch_interval
end
time_from_last_punch = math.min(time_from_last_punch or punch_interval, punch_interval)

View file

@ -135,15 +135,11 @@ local def = {
tiles = {"farming_cocoa_1.png"},
paramtype = "light",
walkable = false,
drop = {
items = {
{items = {"farming:cocoa_beans 1"}, rarity = 2},
}
},
selection_box = {
type = "fixed",
fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3}
},
drop = {},
groups = {
snappy = 3, flammable = 2, plant = 1, growing = 1,
not_in_creative_inventory = 1, leafdecay = 1, leafdecay_drop = 1

View file

@ -18,6 +18,10 @@ minetest.override_item("farming:rye", {
groups = {food_rye = 1, flammable = 4}
})
minetest.override_item("farming:rye_1", {drop = {}})
minetest.override_item("farming:rye_2", {drop = {}})
minetest.override_item("farming:rye_3", {drop = {}})
minetest.register_craft({
output = "farming:flour",
recipe = {
@ -42,6 +46,10 @@ minetest.override_item("farming:oat", {
groups = {food_oats = 1, flammable = 4}
})
minetest.override_item("farming:oat_1", {drop = {}})
minetest.override_item("farming:oat_2", {drop = {}})
minetest.override_item("farming:oat_3", {drop = {}})
minetest.register_craft({
output = "farming:flour",
recipe = {
@ -66,6 +74,10 @@ minetest.override_item("farming:rice", {
groups = {food_rice = 1, flammable = 4}
})
minetest.override_item("farming:rice_1", {drop = {}})
minetest.override_item("farming:rice_2", {drop = {}})
minetest.override_item("farming:rice_3", {drop = {}})
minetest.register_craftitem("farming:rice_bread", {
description = S("Rice Bread"),
inventory_image = "farming_rice_bread.png",

View file

@ -1,6 +1,34 @@
local S = farming.intllib
--= filter sea water into river water
minetest.register_craft({
output = "bucket:bucket_river_water",
recipe = {
{"farming:hemp_fibre"},
{"farming:hemp_fibre"},
{"bucket:bucket_water"}
}
})
--= glass of water
minetest.register_craftitem("farming:glass_water", {
description = S("Glass of Water"),
inventory_image = "farming_water_glass.png",
groups = {food_water_glass = 1, flammable = 3, vessel = 1}
})
minetest.register_craft({
output = "farming:glass_water 4",
recipe = {
{"vessels:drinking_glass", "vessels:drinking_glass"},
{"vessels:drinking_glass", "vessels:drinking_glass"},
{"bucket:bucket_river_water", ""}
},
replacements = {{"bucket:bucket_river_water", "bucket:bucket_empty"}}
})
--= Sugar
minetest.register_craftitem("farming:sugar", {

View file

@ -176,3 +176,6 @@ Created by sirrobzeroone (CC0)
Created by TechM8 (https://www.deviantart.com/techm8)
farming_popcorn.png
Created by RZR0 (CC-BY-NC-SA)
farming_blueberry_pie.png

View file

@ -21,7 +21,7 @@ Bottle of Hemp Oil=Flasche mit Hanföl
Bowl of Chili=Chili Schale
Bread=Brot
Bronze Hoe=Bronzehacke
Cabbage=Salat
Cabbage=Weißkohl
Cactus Juice=Kaktussaft
Carrot=Möhre
Carrot Juice=Möhrensaft
@ -61,7 +61,7 @@ Hemp Seed=Hanfsamen
Hoe=Hacke
Hoe Bomb (use or throw on grassy areas to hoe land)=Hackbombe (Auf Grasland werfen oder benutzen)
Jack 'O Lantern (punch to turn on and off)=Kürbislaterne (Punch zum Ein- und Ausschalten)
Jaffa Cake=Jaffa-Torte
Jaffa Cake=Jaffakeks
Juicer=Entsafter
Melon=Melone
Melon Slice=Melonenscheibe
@ -88,7 +88,7 @@ Pineapple=Ananas
Pineapple Juice=Ananassaft
Pineapple Ring=Ananasscheibe
Pineapple Top=Ananasdeckel
Porridge=Brei
Porridge=Haferbrei
Potato=Kartoffel
Pumpkin=Kürbis
Pumpkin Bread=Kürbisbrot

View file

@ -60,7 +60,7 @@ Hemp Rope=麻绳
Hemp Seed=大麻籽
Hoe=锄头
Hoe Bomb (use or throw on grassy areas to hoe land)=锄弹(在草地上使用或扔在锄地上)
Jack 'O Lantern (punch to turn on and off)=杰克灯(按一下开关)
Jack 'O Lantern (punch to turn on and off)=南瓜灯(按一下开关)
Jaffa Cake=佳发饼
Juicer=榨汁机
Melon=甜瓜
@ -118,7 +118,7 @@ Steel Hoe=钢锄头
Stone Hoe=石锄
Straw=稻草
Strawberry=草莓
String=字符串
String=线
Sugar=糖
Toast=烤面包片
Toast Sandwich=三明治面包

View file

@ -60,7 +60,7 @@ Hemp Rope=麻繩
Hemp Seed=大麻籽
Hoe=鋤頭
Hoe Bomb (use or throw on grassy areas to hoe land)=鋤彈(在草地上使用或扔在鋤地上)
Jack 'O Lantern (punch to turn on and off)=傑克燈(按一下開關)
Jack 'O Lantern (punch to turn on and off)=南瓜燈(按一下開關)
Jaffa Cake=佳發餅
Juicer=榨汁機
Melon=甜瓜
@ -118,7 +118,7 @@ Steel Hoe=鋼鋤頭
Stone Hoe=石鋤
Straw=稻草
Strawberry=草莓
String=字符串
String=
Sugar=糖
Toast=烤麵包片
Toast Sandwich=三明治麵包

View file

@ -72,6 +72,8 @@ if minetest.get_modpath("lucky_block") then
{name = "farming:seed_rice", max = 15},
{name = "farming:seed_oat", max = 15},
{name = "farming:soil_wet", max = 10},
{name = "farming:cotton_wild", max = 5},
{name = "farming:grapebush", max = 5},
}},
})
end

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 B

View file

@ -102,7 +102,7 @@ function flowerpot.register_node(nodename)
local dropname = nodename:gsub("grass_%d", "grass_1")
minetest.register_node("flowerpot:" .. name, {
minetest.register_node(":flowerpot:" .. name, {
description = S("Flowerpot with @1", desc),
drawtype = "mesh",
mesh = "flowerpot.obj",

View file

@ -8,7 +8,7 @@ local use_cmi = minetest.global_exists("cmi")
mobs = {
mod = "redo",
version = "20210614",
version = "20210722",
intllib = S,
invis = minetest.global_exists("invisibility") and invisibility or {}
}
@ -56,6 +56,7 @@ local disable_blood = settings:get_bool("mobs_disable_blood")
local mobs_drop_items = settings:get_bool("mobs_drop_items") ~= false
local mobs_griefing = settings:get_bool("mobs_griefing") ~= false
local spawn_protected = settings:get_bool("mobs_spawn_protected") ~= false
local spawn_monster_protected = settings:get_bool("mobs_spawn_monster_protected") ~= false
local remove_far = settings:get_bool("remove_far_mobs") ~= false
local mob_area_spawn = settings:get_bool("mob_area_spawn")
local difficulty = tonumber(settings:get("mob_difficulty")) or 1.0
@ -82,7 +83,7 @@ local aoc_range = tonumber(settings:get("active_block_range")) * 16
-- pathfinding settings
local enable_pathfinding = true
local stuck_timeout = 3 -- how long before stuck mod starts searching
local stuck_path_timeout = 10 -- how long will mob follow path before giving up
local stuck_path_timeout = 5 -- how long will mob follow path before giving up
-- default nodes
local node_fire = "fire:basic_flame"
@ -273,7 +274,9 @@ function mob_class:set_velocity(v)
-- halt mob if it has been ordered to stay
if self.order == "stand" then
self.object:set_velocity({x = 0, y = 0, z = 0})
local vel = self.object:get_velocity() or {y = 0}
self.object:set_velocity({x = 0, y = vel.y, z = 0})
return
end
@ -1651,6 +1654,8 @@ local can_dig_drop = function(pos)
return false
end
local pathfinder_mod = minetest.get_modpath("pathfinder")
-- path finding and smart mob routine by rnd,
-- line_of_sight and other edits by Elkien3
function mob_class:smart_mobs(s, p, dist, dtime)
@ -1779,13 +1784,18 @@ function mob_class:smart_mobs(s, p, dist, dtime)
jumpheight = 1
end
self.path.way = minetest.find_path(s, p1, 16, jumpheight,
dropheight, "Dijkstra")
if pathfinder_mod then
self.path.way = pathfinder.find_path(s, p1, self, dtime)
else
self.path.way = minetest.find_path(s, p1, 16, jumpheight,
dropheight, "Dijkstra")
end
--[[
-- show path using particles
if self.path.way and #self.path.way > 0 then
print("-- path length:" .. tonumber(#self.path.way))
for _,pos in pairs(self.path.way) do
minetest.add_particle({
pos = pos,
@ -3956,8 +3966,10 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, inter
return
end
-- mobs cannot spawn in protected areas when enabled
if not spawn_protected
-- check if mob can spawn inside protected areas
if (spawn_protected == false
or (spawn_monster_protected == false
and minetest.registered_entities[name].type == "monster"))
and minetest.is_protected(pos, "") then
--print("--- inside protected area", name)
return

View file

@ -699,6 +699,8 @@ External Settings for "minetest.conf"
is false)
'mobs_spawn_protected' if set to false then mobs will not spawn in protected
areas (default is true)
'mobs_spawn_monster_protected' if set to false then monsters will not spawn in
protected areas (default is true)
'remove_far_mobs' if true then untamed mobs that are outside players
visual range will be removed (default is true)
'mobname' can change specific mob chance rate (0 to disable) and

View file

@ -10,7 +10,6 @@ minetest.register_craftitem("mobs:nametag", {
if minetest.get_modpath("dye") and minetest.get_modpath("farming") then
minetest.register_craft({
-- type = "shapeless",
output = "mobs:nametag",
recipe = {{"default:paper", "dye:black", "farming:string"}}
})
@ -149,7 +148,7 @@ minetest.register_craft({
-- make sure we can register fences
if default.register_fence then
if minetest.get_modpath("default") and default.register_fence then
-- mob fence (looks like normal fence but collision is 2 high)
default.register_fence("mobs:fence_wood", {
@ -165,6 +164,7 @@ default.register_fence("mobs:fence_wood", {
}
}
})
end
-- mob fence top (has enlarged collisionbox to stop mobs getting over)
minetest.register_node("mobs:fence_top", {
@ -197,8 +197,6 @@ minetest.register_craft({
}
})
end
-- items that can be used as fuel
minetest.register_craft({
@ -361,9 +359,9 @@ minetest.register_node("mobs:meatblock", {
tiles = {"mobs_meat_top.png", "mobs_meat_bottom.png", "mobs_meat_side.png"},
paramtype2 = "facedir",
groups = {choppy = 1, oddly_breakable_by_hand = 1, flammable = 2},
sounds = default.node_sound_leaves_defaults(),
sounds = default and default.node_sound_leaves_defaults(),
on_place = minetest.rotate_node,
on_use = minetest.item_eat(20),
on_use = minetest.item_eat(20)
})
minetest.register_craft({

View file

@ -1,4 +1,4 @@
default
default?
tnt?
dye?
farming?
@ -7,3 +7,4 @@ intllib?
lucky_block?
cmi?
toolranks?
pathfinder?

View file

@ -1,4 +1,4 @@
name = mobs
depends = default
optional_depends = tnt, dye, farming, invisibility, intllib, lucky_block, cmi, toolranks
depends =
optional_depends = default, tnt, dye, farming, invisibility, intllib, lucky_block, cmi, toolranks, pathfinder
description = Adds a mob api for mods to add animals or monsters etc.

View file

@ -23,7 +23,7 @@ Lucky Blocks: 9
Changelog:
- 1.55 - Add 'peaceful_player' privelage and setting so mobs don't attack specific players (thanks sfence)
- 1.55 - Add 'peaceful_player' privelage and setting so mobs don't attack specific players (thanks sfence), add support for MarkBu's pathfinder mod, remove need for default mod
- 1.54 - Simplified animal breeding function, added editable settings (thanks Wuzzy), Child mobs now take 20 mins to grow up, reverted to simple mob spawning with setting to use area checks, on_flop added, air_damage added.
- 1.53 - Added 'on_map_load' settings to mobs:spawn so that mobs will only spawn when new areas of map are loaded.
- 1.52 - Added 'mob_active_limit' in settings to set number of mobs in game,

View file

@ -13,6 +13,9 @@ mobs_griefing (Griefing Mobs) bool true
# If false then Mobs no longer spawn inside player protected areas
mobs_spawn_protected (Spawn Mobs in protected areas) bool true
# If false then Monsters no longer spawn inside player protected areas
mobs_spawn_monster_protected (Spawn Monsters in protected areas) bool true
# If true Mobs will be removed once a map chunk is out of view
remove_far_mobs (Remove far Mobs) bool true

View file

@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
## [Unreleased]
## [2.2.0] - 2021-06-28
### Changed
- Refactored recipe override mechanism to avoid re-coding recipes
@ -131,7 +133,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
- Initial versioned release.
[Unreleased]: https://github.com/minetest-mods/moreblocks/compare/v2.1.0...HEAD
[Unreleased]: https://github.com/minetest-mods/moreblocks/compare/v2.2.0...HEAD
[2.2.0]: https://github.com/minetest-mods/moreblocks/compare/v2.1.0...v2.2.0
[2.1.0]: https://github.com/minetest-mods/moreblocks/compare/v2.0.0...v2.1.0
[2.0.0]: https://github.com/minetest-mods/moreblocks/compare/v1.3.0...v2.0.0
[1.3.0]: https://github.com/minetest-mods/moreblocks/compare/v1.2.0...v1.3.0

View file

@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
## [Unreleased]
## [2.1.0] - 2021-06-28
### Added
- More Ores tools now have [`toolranks`](https://github.com/lisacvuk/minetest-toolranks) support.
@ -61,6 +63,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
- Initial versioned release.
[Unreleased]: https://github.com/minetest-mods/moreores/compare/v2.0.0...HEAD
[Unreleased]: https://github.com/minetest-mods/moreores/compare/v2.1.0...HEAD
[2.1.0]: https://github.com/minetest-mods/moreores/compare/v2.0.0...v2.1.0
[2.0.0]: https://github.com/minetest-mods/moreores/compare/v1.1.0...v2.0.0
[1.1.0]: https://github.com/minetest-mods/moreores/compare/v1.0.0...v1.1.0

View file

@ -199,7 +199,7 @@ abstract_bushes.grow_bush_node = function(pos,dir, leaf_type)
end
biome_lib:register_generate_plant({
biome_lib.register_on_generate({
surface = {
"default:dirt_with_grass",
"stoneage:grass_with_silex",
@ -244,7 +244,7 @@ abstract_bushes.grow_youngtree_node2 = function(pos, height)
end
biome_lib:register_generate_plant({
biome_lib.register_on_generate({
surface = {
"default:dirt_with_grass",
"stoneage:grass_with_silex",

View file

@ -30,7 +30,7 @@ local modpath = minetest.get_modpath('bushes_classic')
dofile(modpath..'/cooking.lua')
dofile(modpath..'/nodes.lua')
biome_lib:spawn_on_surfaces({
biome_lib.register_active_spawner({
spawn_delay = 3600,
spawn_plants = bushes_classic.spawn_list,
avoid_radius = 10,

View file

@ -1,6 +1,6 @@
--Map Generation Stuff
biome_lib:register_generate_plant(
biome_lib.register_on_generate(
{
surface = {
"default:dirt_with_grass",
@ -20,7 +20,7 @@ biome_lib:register_generate_plant(
}
)
biome_lib:register_generate_plant(
biome_lib.register_on_generate(
{
surface = {
"default:desert_sand",

View file

@ -92,7 +92,7 @@ minetest.register_node("dryplants:juncus_02", {
-- GENERATE SMALL JUNCUS
-----------------------------------------------------------------------------------------------
-- near water or swamp
biome_lib:register_generate_plant({
biome_lib.register_on_generate({
surface = {
"default:dirt_with_grass",
--"default:desert_sand",
@ -113,7 +113,7 @@ biome_lib:register_generate_plant({
abstract_dryplants.grow_juncus
)
-- at dunes/beach
biome_lib:register_generate_plant({
biome_lib.register_on_generate({
surface = {
--"default:dirt_with_grass",
--"default:desert_sand",

View file

@ -12,7 +12,7 @@ abstract_dryplants.grow_grass_variation = function(pos)
minetest.swap_node(right_here, {name="dryplants:grass_short"})
end
biome_lib:register_generate_plant({
biome_lib.register_on_generate({
surface = {
"default:dirt_with_grass",
},

View file

@ -7,7 +7,7 @@
-- Looked at code from: default
-----------------------------------------------------------------------------------------------
biome_lib:register_generate_plant(
biome_lib.register_on_generate(
{
surface = {
"default:dirt_with_grass",

View file

@ -327,7 +327,7 @@ minetest.register_entity("dryplants:reedmace_water_entity",{
-----------------------------------------------------------------------------------------------
-- SPAWN REEDMACE
-----------------------------------------------------------------------------------------------
--[[biome_lib:spawn_on_surfaces({
--[[biome_lib.register_active_spawner({
spawn_delay = 1200,
spawn_plants = {"dryplants:reedmace_sapling"},
spawn_chance = 400,
@ -348,7 +348,7 @@ minetest.register_entity("dryplants:reedmace_water_entity",{
-- GENERATE REEDMACE
-----------------------------------------------------------------------------------------------
-- near water or swamp
biome_lib:register_generate_plant({
biome_lib.register_on_generate({
surface = {
"default:dirt_with_grass",
"default:desert_sand",
@ -369,7 +369,7 @@ biome_lib:register_generate_plant({
abstract_dryplants.grow_reedmace
)
-- in water
biome_lib:register_generate_plant({
biome_lib.register_on_generate({
surface = {
"default:dirt",
"default:dirt_with_grass",
@ -392,7 +392,7 @@ biome_lib:register_generate_plant({
abstract_dryplants.grow_reedmace_water
)
-- for oases & tropical beaches & tropical swamps
biome_lib:register_generate_plant({
biome_lib.register_on_generate({
surface = {
"default:sand",
"sumpf:sumpf"

View file

@ -87,7 +87,7 @@ end
-----------------------------------------------------------------------------------------------
if abstract_ferns.config.lady_ferns_near_tree == true then
biome_lib:register_generate_plant({ -- near trees (woodlands)
biome_lib.register_on_generate({ -- near trees (woodlands)
surface = {
"default:dirt_with_grass",
"default:mossycobble",
@ -116,7 +116,7 @@ if abstract_ferns.config.lady_ferns_near_tree == true then
end
if abstract_ferns.config.lady_ferns_near_rock == true then
biome_lib:register_generate_plant({ -- near stone (mountains)
biome_lib.register_on_generate({ -- near stone (mountains)
surface = {
"default:dirt_with_grass",
"default:mossycobble",
@ -143,7 +143,7 @@ if abstract_ferns.config.lady_ferns_near_rock == true then
end
if abstract_ferns.config.lady_ferns_near_ores == true then -- this one causes a huge fps drop
biome_lib:register_generate_plant({ -- near ores (potential mining sites)
biome_lib.register_on_generate({ -- near ores (potential mining sites)
surface = {
"default:dirt_with_grass",
"default:mossycobble",
@ -183,7 +183,7 @@ if abstract_ferns.config.lady_ferns_near_ores == true then -- this one causes a
end
if abstract_ferns.config.lady_ferns_in_groups == true then -- this one is meant as a replacement of Ferns_near_Ores
biome_lib:register_generate_plant({
biome_lib.register_on_generate({
surface = {
"default:dirt_with_grass",
"default:mossycobble",

View file

@ -295,7 +295,7 @@ minetest.register_abm({
-- in jungles
if abstract_ferns.config.enable_giant_treeferns_in_jungle == true then
biome_lib:register_generate_plant({
biome_lib.register_on_generate({
surface = {
"default:dirt_with_grass",
"default:dirt_with_rainforest_litter", -- minetest >= 0.4.16
@ -321,7 +321,7 @@ end
-- for oases & tropical beaches
if abstract_ferns.config.enable_giant_treeferns_in_oases == true then
biome_lib:register_generate_plant({
biome_lib.register_on_generate({
surface = {
"default:sand"--,
--"default:desert_sand"

View file

@ -75,7 +75,7 @@ create_nodes()
-- Spawning
-----------------------------------------------------------------------------------------------
if abstract_ferns.config.enable_horsetails_spawning == true then
biome_lib:spawn_on_surfaces({
biome_lib.register_active_spawner({
spawn_delay = 1200,
spawn_plants = node_names,
spawn_chance = 400,
@ -104,7 +104,7 @@ end
-----------------------------------------------------------------------------------------------
if abstract_ferns.config.enable_horsetails_on_grass == true then
biome_lib:register_generate_plant({
biome_lib.register_on_generate({
surface = {
"default:dirt_with_grass",
"default:dirt_with_coniferous_litter", -- minetest >= 0.5
@ -137,7 +137,7 @@ if abstract_ferns.config.enable_horsetails_on_grass == true then
end
if abstract_ferns.config.enable_horsetails_on_stones == true then
biome_lib:register_generate_plant({
biome_lib.register_on_generate({
surface = {
"default:gravel", -- roots go deep
"default:mossycobble",

View file

@ -181,7 +181,7 @@ minetest.register_abm({
-- in jungles
if abstract_ferns.config.enable_treeferns_in_jungle == true then
biome_lib:register_generate_plant({
biome_lib.register_on_generate({
surface = {
"default:dirt_with_grass",
"default:dirt_with_rainforest_litter", -- minetest >= 0.4.16
@ -210,7 +210,7 @@ end
-- for oases & tropical beaches
if abstract_ferns.config.enable_treeferns_in_oases == true then
biome_lib:register_generate_plant({
biome_lib.register_on_generate({
surface = {
"default:sand"--,
--"default:desert_sand"

View file

@ -78,16 +78,16 @@ for i in ipairs(lilies_list) do
local above_node = minetest.get_node(pt.above)
local top_node = minetest.get_node(top_pos)
if biome_lib:get_nodedef_field(under_node.name, "buildable_to") then
if biome_lib.get_nodedef_field(under_node.name, "buildable_to") then
if under_node.name ~= "default:water_source" then
place_pos = pt.under
elseif top_node.name ~= "default:water_source"
and biome_lib:get_nodedef_field(top_node.name, "buildable_to") then
and biome_lib.get_nodedef_field(top_node.name, "buildable_to") then
place_pos = top_pos
else
return
end
elseif biome_lib:get_nodedef_field(above_node.name, "buildable_to") then
elseif biome_lib.get_nodedef_field(above_node.name, "buildable_to") then
place_pos = pt.above
end
@ -178,18 +178,19 @@ for i in ipairs(algae_list) do
local above_node = minetest.get_node(pt.above)
local top_node = minetest.get_node(top_pos)
if biome_lib:get_nodedef_field(under_node.name, "buildable_to") then
if biome_lib.get_nodedef_field(under_node.name, "buildable_to") then
if under_node.name ~= "default:water_source" then
place_pos = pt.under
elseif top_node.name ~= "default:water_source"
and biome_lib:get_nodedef_field(top_node.name, "buildable_to") then
and biome_lib.get_nodedef_field(top_node.name, "buildable_to") then
place_pos = top_pos
else
return
end
elseif biome_lib:get_nodedef_field(above_node.name, "buildable_to") then
elseif biome_lib.get_nodedef_field(above_node.name, "buildable_to") then
place_pos = pt.above
end
if not place_pos then return end -- something went wrong :P
if not minetest.is_protected(place_pos, placer:get_player_name()) then
@ -243,7 +244,7 @@ minetest.register_node(":flowers:sunflower", {
walkable = false,
buildable_to = true,
is_ground_content = true,
groups = { dig_immediate=3, flora=1, flammable=3 },
groups = { dig_immediate=3, flora=1, flammable=3, attached_node=1 },
sounds = default.node_sound_leaves_defaults(),
selection_box = box,
collision_box = box,
@ -299,7 +300,7 @@ flowers_plus.grow_waterlily = function(pos)
end
end
biome_lib:register_generate_plant({
biome_lib.register_on_generate({
surface = {"default:water_source"},
max_count = lilies_max_count,
rarity = lilies_rarity,
@ -321,7 +322,7 @@ flowers_plus.grow_seaweed = function(pos)
minetest.swap_node(right_here, {name="along_shore:seaweed_"..math.random(1,4), param2=math.random(1,3)})
end
biome_lib:register_generate_plant({
biome_lib.register_on_generate({
surface = {"default:water_source"},
max_count = seaweed_max_count,
rarity = seaweed_rarity,
@ -338,7 +339,7 @@ biome_lib:register_generate_plant({
-- seaweed at beaches
-- MM: not satisfied with it, but IMHO some beaches should have some algae
biome_lib:register_generate_plant({
biome_lib.register_on_generate({
surface = {"default:water_source"},
max_count = seaweed_max_count,
rarity = seaweed_rarity,
@ -354,7 +355,7 @@ biome_lib:register_generate_plant({
},
flowers_plus.grow_seaweed
)
biome_lib:register_generate_plant({
biome_lib.register_on_generate({
surface = {"default:sand"},
max_count = seaweed_max_count*2,
rarity = seaweed_rarity/2,
@ -371,7 +372,7 @@ biome_lib:register_generate_plant({
flowers_plus.grow_seaweed
)
biome_lib:register_generate_plant({
biome_lib.register_on_generate({
surface = {"default:dirt_with_grass"},
avoid_nodes = { "flowers:sunflower" },
max_count = sunflowers_max_count,
@ -386,7 +387,7 @@ biome_lib:register_generate_plant({
-- spawn ABM registrations
biome_lib:spawn_on_surfaces({
biome_lib.register_active_spawner({
spawn_delay = SPAWN_DELAY/2,
spawn_plants = {
"flowers:waterlily",
@ -408,7 +409,7 @@ biome_lib:spawn_on_surfaces({
random_facedir = {0,3}
})
biome_lib:spawn_on_surfaces({
biome_lib.register_active_spawner({
spawn_delay = SPAWN_DELAY*2,
spawn_plants = {"flowers:seaweed"},
spawn_chance = SPAWN_CHANCE*2,
@ -421,7 +422,7 @@ biome_lib:spawn_on_surfaces({
facedir = 1
})
biome_lib:spawn_on_surfaces({
biome_lib.register_active_spawner({
spawn_delay = SPAWN_DELAY*2,
spawn_plants = {"flowers:seaweed"},
spawn_chance = SPAWN_CHANCE*2,
@ -435,7 +436,7 @@ biome_lib:spawn_on_surfaces({
facedir = 1
})
biome_lib:spawn_on_surfaces({
biome_lib.register_active_spawner({
spawn_delay = SPAWN_DELAY*2,
spawn_plants = {"flowers:seaweed"},
spawn_chance = SPAWN_CHANCE*2,
@ -449,7 +450,7 @@ biome_lib:spawn_on_surfaces({
facedir = 1
})
biome_lib:spawn_on_surfaces({
biome_lib.register_active_spawner({
spawn_delay = SPAWN_DELAY*2,
spawn_plants = {"flowers:sunflower"},
spawn_chance = SPAWN_CHANCE*2,

View file

@ -62,7 +62,7 @@ abstract_molehills.place_molehill = function(pos)
end
end
biome_lib:register_generate_plant({
biome_lib.register_on_generate({
surface = {"default:dirt_with_grass"},
max_count = Molehills_Max_Count,
rarity = Molehills_Rarity,

View file

@ -70,7 +70,7 @@ minetest.register_node('poisonivy:climbing', {
buildable_to = true,
})
biome_lib:spawn_on_surfaces({
biome_lib.register_active_spawner({
spawn_delay = SPAWN_DELAY,
spawn_plants = {"poisonivy:seedling"},
avoid_radius = 10,
@ -83,7 +83,7 @@ biome_lib:spawn_on_surfaces({
verticals_list = walls_list
})
biome_lib:grow_plants({
biome_lib.update_plant({
grow_delay = SPAWN_DELAY,
grow_chance = GROW_CHANCE,
grow_plant = "poisonivy:seedling",
@ -91,7 +91,7 @@ biome_lib:grow_plants({
grow_nodes = {"default:dirt_with_grass"}
})
biome_lib:grow_plants({
biome_lib.update_plant({
grow_delay = GROW_DELAY,
grow_chance = GROW_CHANCE*2,
grow_plant = "poisonivy:climbing",

View file

@ -169,7 +169,7 @@ abstract_trunks.place_twig = function(pos)
end
if Twigs_on_ground == true then
biome_lib:register_generate_plant({
biome_lib.register_on_generate({
surface = {"default:dirt_with_grass"},
max_count = Twigs_on_ground_Max_Count,
rarity = Twigs_on_ground_Rarity,
@ -186,7 +186,7 @@ biome_lib:register_generate_plant({
end
if Twigs_on_water == true then
biome_lib:register_generate_plant({
biome_lib.register_on_generate({
surface = {"default:water_source"},
max_count = Twigs_on_water_Max_Count,
rarity = Twigs_on_water_Rarity,
@ -348,7 +348,7 @@ abstract_trunks.place_trunk = function(pos)
end
end
biome_lib:register_generate_plant({
biome_lib.register_on_generate({
surface = {"default:dirt_with_grass"},
max_count = Trunks_Max_Count, -- 320,
rarity = Trunks_Rarity, -- 99,
@ -382,7 +382,7 @@ abstract_trunks.grow_moss_on_ground = function(pos)
end
biome_lib:register_generate_plant({
biome_lib.register_on_generate({
surface = {"default:dirt_with_grass"},
max_count = Moss_on_ground_Max_Count,
rarity = Moss_on_ground_Rarity,
@ -471,7 +471,7 @@ abstract_trunks.grow_moss_on_trunk = function(pos)
--end
end
biome_lib:register_generate_plant({
biome_lib.register_on_generate({
surface = {
"default:tree",
"default:jungletree",
@ -548,7 +548,7 @@ abstract_trunks.grow_roots = function(pos)
end
end
biome_lib:register_generate_plant({
biome_lib.register_on_generate({
surface = {"group:tree"},
max_count = 1000,
rarity = 1,

View file

@ -95,6 +95,7 @@ for r = 0, 3 do
sunlight_propagates = true,
walkable = false,
node_box = cbox,
buildable_to = true,
groups = {snappy = 3, flammable = 3, attached_node=1, not_in_creative_inventory = r},
sounds = default.node_sound_leaves_defaults(),
drop = "trunks:moss_plain_0",
@ -114,6 +115,7 @@ for r = 0, 3 do
sunlight_propagates = true,
walkable = false,
node_box = cbox,
buildable_to = true,
groups = {snappy = 3, flammable = 3, attached_node=1, not_in_creative_inventory = r},
sounds = default.node_sound_leaves_defaults(),
drop = "trunks:moss_with_fungus_0",

View file

@ -133,7 +133,7 @@ vines.register_vine = function( name, defs, biome )
end,
})
biome_lib:spawn_on_surfaces(biome)
biome_lib.register_active_spawner(biome)
end
-- ALIASES

View file

@ -73,7 +73,7 @@ abstract_woodsoils.place_soil = function(pos)
end
end
biome_lib:register_generate_plant({
biome_lib.register_on_generate({
surface = {
"group:tree",
"ferns:fern_03",
@ -94,7 +94,7 @@ biome_lib:register_generate_plant({
"abstract_woodsoils.place_soil"
)
biome_lib:register_generate_plant({
biome_lib.register_on_generate({
surface = {
"moretrees:apple_tree_sapling_ongen",
"moretrees:beech_sapling_ongen",

View file

@ -133,7 +133,7 @@ abstract_youngtrees.grow_youngtree_node = function(pos, height)
end
biome_lib:register_generate_plant({
biome_lib.register_on_generate({
surface = {
"default:dirt_with_grass",
"stoneage:grass_with_silex",

View file

@ -291,13 +291,15 @@ local punchy = function(
end
-- END tool damage
-- print ("---", player:get_player_name(), damage)
local kb = math.min(32, damage * 2)
-- print ("---", player:get_player_name(), damage, kb)
-- knock back player
player:add_velocity({
x = dir.x * (damage * 2),
x = dir.x * kb,
y = -1,
z = dir.z * (damage * 2)
z = dir.z * kb
})
end

View file

@ -69,7 +69,7 @@ minetest.register_chatcommand("protector_replace", {
minetest.register_abm({
nodenames = {"protector:protect", "protector:protect2", "protector:protect_hidden"},
interval = 8,
interval = 6,
chance = 1,
catch_up = false,
action = function(pos, node)

View file

@ -625,14 +625,17 @@ minetest.register_node("protector:chest", {
local spos = pos.x .. "," .. pos.y .. "," ..pos.z
local formspec = "size[8,9]"
-- .. default.gui_bg
-- .. default.gui_bg_img
-- .. default.gui_slots
.. "list[nodemeta:".. spos .. ";main;0,0.3;8,4;]"
.. "button[0,4.5;2,0.25;toup;" .. F(S("To Chest")) .. "]"
.. "field[2.3,4.8;4,0.25;chestname;;"
.. "image_button[-0.01,4.26;1.05,0.8;protector_up_icon.png;protect_up;]"
.. "image_button[0.98,4.26;1.05,0.8;protector_down_icon.png;protect_down;]"
.. "tooltip[protect_up;" .. S("To Chest") .. "]"
.. "tooltip[protect_down;" .. S("To Inventory") .. "]"
.. "field[2.3,4.8;4,0.25;protect_name;;"
.. meta:get_string("name") .. "]"
.. "button[6,4.5;2,0.25;todn;" .. F(S("To Inventory")) .. "]"
.. "button[5.99,4.5;2.05,0.25;protect_rename;" .. S("Rename") .. "]"
.. "list[current_player;main;0,5;8,1;]"
.. "list[current_player;main;0,6.08;8,3;8]"
.. "listring[nodemeta:" .. spos .. ";main]"
@ -691,22 +694,22 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
local player_inv = player:get_inventory()
-- copy contents of player inventory to chest
if fields.toup then
if fields.protect_up then
to_from(player_inv, chest_inv)
-- copy contents of chest to player inventory
elseif fields.todn then
elseif fields.protect_down then
to_from(chest_inv, player_inv)
elseif fields.chestname then
elseif fields.protect_name or fields.protect_rename then
-- change chest infotext to display name
if fields.chestname ~= "" then
if fields.protect_name ~= "" then
meta:set_string("name", fields.chestname)
meta:set_string("infotext", fields.chestname)
meta:set_string("name", fields.protect_name)
meta:set_string("infotext", fields.protect_name)
else
meta:set_string("name", S("Protected Chest"))
meta:set_string("infotext", S("Protected Chest"))

View file

@ -5,7 +5,7 @@ default = default or {
node_sound_wood_defaults = function(table) end,
gui_bg = "",
gui_bg_img = "",
gui_slots = "",
gui_slots = ""
}
-- Load support for intllib.
@ -374,9 +374,9 @@ function minetest.is_protected(pos, digger)
if protector_hurt > 0 and player:get_hp() > 0 then
-- This delay fixes item duplication bug (thanks luk3yx)
minetest.after(0.1, function()
minetest.after(0.1, function(player)
player:set_hp(player:get_hp() - protector_hurt)
end)
end, player)
end
-- flip player when protection violated
@ -651,15 +651,13 @@ minetest.register_node("protector:protect2", {
-- recipes to switch between protectors
minetest.register_craft({
type = "shapeless",
output = "protector:protect",
recipe = {"protector:protect2"}
recipe = {{"protector:protect2"}}
})
minetest.register_craft({
type = "shapeless",
output = "protector:protect2",
recipe = {"protector:protect"}
recipe = {{"protector:protect"}}
})

View file

@ -28,3 +28,7 @@ following textures by TenPlus1 (CC BY-SA 3.0):
protector_logo.png
protector_display.png
protector_overlay.png
following textures by Kilbith (CC BY-SA 3.0):
protector_up_icon.png
protector_down_icon.png (both rotated)

Binary file not shown.

After

Width:  |  Height:  |  Size: 481 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 478 B

View file

@ -950,7 +950,7 @@ local use_glow = function(pos, node, puncher, pointed_thing)
end
local glow_drops = function(pos, oldnode, oldmetadata, digger)
if minetest.is_creative_enabled(digger:get_player_name()) then
if digger and minetest.is_creative_enabled(digger:get_player_name()) then
return
end
local glow = oldmetadata and oldmetadata.fields and oldmetadata.fields.glow

View file

@ -5,7 +5,7 @@ function skins.get_player_skin(player)
local meta = player:get_meta()
if meta:get("skinsdb:skin_key") then
-- Move player data prior July 2018 to mod storage
storage:set_string(player:get_player_name(), player:get_string("skinsdb:skin_key"))
storage:set_string(player:get_player_name(), meta:get_string("skinsdb:skin_key"))
meta:set_string("skinsdb:skin_key", "")
end
local skin = storage:get_string(player:get_player_name())

View file

@ -0,0 +1,3 @@
character_yellow_sam
sam_0
CC BY-NC-SA 3.0

View file

@ -0,0 +1,3 @@
Steve Final Smash
GreninjaGamer230
CC BY-NC-SA 3.0

View file

@ -0,0 +1,3 @@
Luigi poltergust
GreninjaGamer230
CC BY-NC-SA 3.0

View file

@ -0,0 +1,3 @@
Iron Man Mk.50
GreninjaGamer230
CC BY-SA 3.0

View file

@ -0,0 +1,3 @@
Shark Boy
GreninjaGamer230
CC BY-NC-SA 3.0

View file

@ -0,0 +1,3 @@
Steve in final smash phase
GreninjaGamer230
CC BY-NC-SA 3.0

View file

@ -0,0 +1,3 @@
Mario Mash-up pack (Wii U-Switch Pack)
GreninjaGamer230
CC BY-SA 3.0

View file

@ -0,0 +1,3 @@
Ash Greninja
GreninjaGamer230
CC BY-SA 3.0

View file

@ -0,0 +1,3 @@
Lint BOTW
GreninjaGamer230
CC BY-NC-SA 3.0

View file

@ -0,0 +1,3 @@
Lloyd Ninjago
GreninjaGamer230
CC BY-NC-SA 3.0

View file

@ -0,0 +1,3 @@
MUD1
MUD1
CC BY-SA 3.0

View file

@ -0,0 +1,3 @@
Gamingoont
Gamingoont
CC BY-SA 3.0

View file

@ -0,0 +1,3 @@
rudzik8
rudzik8
CC BY 4.0

View file

@ -0,0 +1,3 @@
Pharaoh Farao Faraon
Ezequiel Gustavo Martinez
CC BY-SA 3.0

View file

@ -0,0 +1,3 @@
Vlad
ElVladiskov-Meteorofbullshit
CC BY-NC-SA 3.0

Some files were not shown because too many files have changed in this diff Show more