diff --git a/advtrains/settingtypes.txt b/advtrains/settingtypes.txt index 6acff80..2b627cb 100644 --- a/advtrains/settingtypes.txt +++ b/advtrains/settingtypes.txt @@ -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 + diff --git a/advtrains/trainlogic.lua b/advtrains/trainlogic.lua index 7093929..0f2a66e 100644 --- a/advtrains/trainlogic.lua +++ b/advtrains/trainlogic.lua @@ -1368,17 +1368,61 @@ function advtrains.invalidate_path(id) end --not blocking trains group -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 + +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 - return false + + 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