local S if minetest.get_modpath("intllib") then S = intllib.Getter() else S = function(s,a,...)a={a,...}return s:gsub("@(%d+)",function(n)return a[tonumber(n)]end)end end function round_down(pos) return {x=math.floor(pos.x), y=math.floor(pos.y), z=math.floor(pos.z)} end function round_new(vec) return {x=math.floor(vec.x+0.5), y=math.floor(vec.y+0.3), z=math.floor(vec.z+0.5)} end advtrains.register_wagon("construction_train", { mesh="advtrains_subway_wagon.b3d", textures = {"advtrains_subway_wagon.png"}, drives_on={default=true}, max_speed=2, seats = { { name="Driver stand", attach_offset={x=0, y=10, z=0}, view_offset={x=0, y=0, z=0}, group="dstand", }, { name="1", attach_offset={x=-4, y=8, z=8}, view_offset={x=0, y=0, z=0}, group="pass", }, { name="2", attach_offset={x=4, y=8, z=8}, view_offset={x=0, y=0, z=0}, group="pass", }, { name="3", attach_offset={x=-4, y=8, z=-8}, view_offset={x=0, y=0, z=0}, group="pass", }, { name="4", attach_offset={x=4, y=8, z=-8}, view_offset={x=0, y=0, z=0}, group="pass", }, }, seat_groups = { dstand={ name = "Driver Stand", access_to = {"pass"}, require_doors_open=true, driving_ctrl_access=true, }, pass={ name = "Passenger area", access_to = {"dstand"}, require_doors_open=true, }, }, assign_to_seat_group = {"pass", "dstand"}, doors={ open={ [-1]={frames={x=0, y=20}, time=1}, [1]={frames={x=40, y=60}, time=1}, sound = "advtrains_subway_dopen", }, close={ [-1]={frames={x=20, y=40}, time=1}, [1]={frames={x=60, y=80}, time=1}, sound = "advtrains_subway_dclose", } }, door_entry={-1, 1}, visual_size = {x=1, y=1}, wagon_span=2, --collisionbox = {-1.0,-0.5,-1.8, 1.0,2.5,1.8}, collisionbox = {-1.0,-0.5,-1.0, 1.0,2.5,1.0}, is_locomotive=true, drops={"default:steelblock 4"}, horn_sound = "advtrains_subway_horn", custom_on_step = function (self, dtime ) if self:train().velocity == 0 then return end local rpos = round_new(self.object:getpos()) rpos.y = rpos.y -1 -- Find train tracks, if we find train tracks, we will only replace blocking nodes local tracks_below = false for y =-1,0 do for x = -2,2 do for z = -2,2 do local ps = {x=rpos.x+x, y=rpos.y+y, z=rpos.z+z} if minetest.get_item_group(minetest.get_node(ps).name, "advtrains_track") > 0 then tracks_below = true break end end end end for x = -1,1 do for z = -1,1 do local ps = {x=rpos.x+x, y=rpos.y, z=rpos.z+z} local name = minetest.get_node(ps).name if (not tracks_below) or (minetest.get_item_group(name, "not_blocking_trains") == 0 and minetest.registered_nodes[name].walkable ) then minetest.set_node(ps, {name = "default:gravel"}) ps.y = ps.y-1 if not minetest.registered_nodes[minetest.get_node(ps).name].walkable then minetest.set_node(ps, {name = "default:cobble"}) end end end end end, custom_on_velocity_change = function(self, velocity, old_velocity, dtime) if not velocity or not old_velocity then return end if old_velocity == 0 and velocity > 0 then minetest.sound_play("advtrains_subway_depart", {object = self.object}) end if velocity < 2 and (old_velocity >= 2 or old_velocity == velocity) and not self.sound_arrive_handle then self.sound_arrive_handle = minetest.sound_play("advtrains_subway_arrive", {object = self.object}) elseif (velocity > old_velocity) and self.sound_arrive_handle then minetest.sound_stop(self.sound_arrive_handle) self.sound_arrive_handle = nil end if velocity > 0 and (self.sound_loop_tmr or 0)<=0 then self.sound_loop_handle = minetest.sound_play({name="advtrains_subway_loop", gain=0.3}, {object = self.object}) self.sound_loop_tmr=3 elseif velocity>0 then self.sound_loop_tmr = self.sound_loop_tmr - dtime elseif velocity==0 then if self.sound_loop_handle then minetest.sound_stop(self.sound_loop_handle) self.sound_loop_handle = nil end self.sound_loop_tmr=0 end end, }, S("Construction train"), "advtrains_subway_wagon_inv.png")