2017-01-23 21:29:59 +01:00
|
|
|
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
|
2016-12-20 14:17:39 +01:00
|
|
|
|
2016-12-22 18:55:10 +01:00
|
|
|
advtrains.register_wagon("subway_wagon", {
|
2017-01-17 20:02:25 +01:00
|
|
|
mesh="advtrains_subway_wagon.b3d",
|
|
|
|
textures = {"advtrains_subway_wagon.png"},
|
2016-12-22 18:55:10 +01:00
|
|
|
drives_on={default=true},
|
|
|
|
max_speed=15,
|
2016-12-20 14:17:39 +01:00
|
|
|
seats = {
|
|
|
|
{
|
2017-01-25 21:23:54 +01:00
|
|
|
name="Driver stand",
|
2016-12-20 14:17:39 +01:00
|
|
|
attach_offset={x=0, y=10, z=0},
|
2017-01-17 21:59:32 +01:00
|
|
|
view_offset={x=0, y=0, z=0},
|
2016-12-20 14:17:39 +01:00
|
|
|
driving_ctrl_access=true,
|
2017-01-25 21:23:54 +01:00
|
|
|
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,
|
|
|
|
},
|
|
|
|
pass={
|
|
|
|
name = "Passenger area",
|
|
|
|
access_to = {"dstand"},
|
|
|
|
require_doors_open=true,
|
2016-12-20 14:17:39 +01:00
|
|
|
},
|
|
|
|
},
|
2017-01-29 12:37:47 +01:00
|
|
|
assign_to_seat_group = {"pass","dstand"},
|
2017-01-18 19:03:27 +01:00
|
|
|
doors={
|
|
|
|
open={
|
2017-01-24 19:09:33 +01:00
|
|
|
[-1]={frames={x=0, y=20}, time=1},
|
2017-12-06 13:23:55 +01:00
|
|
|
[1]={frames={x=40, y=60}, time=1},
|
|
|
|
sound = "advtrains_subway_dopen",
|
2017-01-18 19:03:27 +01:00
|
|
|
},
|
|
|
|
close={
|
2017-01-24 19:09:33 +01:00
|
|
|
[-1]={frames={x=20, y=40}, time=1},
|
2017-12-06 13:23:55 +01:00
|
|
|
[1]={frames={x=60, y=80}, time=1},
|
|
|
|
sound = "advtrains_subway_dclose",
|
2017-01-18 19:03:27 +01:00
|
|
|
}
|
|
|
|
},
|
2017-02-09 00:11:28 +01:00
|
|
|
door_entry={-1, 1},
|
2016-12-20 14:17:39 +01:00
|
|
|
visual_size = {x=1, y=1},
|
2017-01-17 21:59:32 +01:00
|
|
|
wagon_span=2,
|
2017-01-29 12:52:51 +01:00
|
|
|
--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},
|
2016-12-20 14:17:39 +01:00
|
|
|
is_locomotive=true,
|
|
|
|
drops={"default:steelblock 4"},
|
2017-12-06 13:23:55 +01:00
|
|
|
horn_sound = "advtrains_subway_horn",
|
|
|
|
custom_on_velocity_change = function(self, velocity, old_velocity)
|
2017-12-17 13:21:56 +01:00
|
|
|
if not velocity or not old_velocity then return end
|
2017-12-06 13:23:55 +01:00
|
|
|
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 not self.sound_loop_handle then
|
|
|
|
self.sound_loop_handle = minetest.sound_play({name="advtrains_subway_loop", gain=0.3}, {object = self.object, loop=true})
|
|
|
|
elseif velocity==0 then
|
|
|
|
if self.sound_loop_handle then
|
|
|
|
minetest.sound_stop(self.sound_loop_handle)
|
|
|
|
self.sound_loop_handle = nil
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end,
|
2017-01-23 21:29:59 +01:00
|
|
|
}, S("Subway Passenger Wagon"), "advtrains_subway_wagon_inv.png")
|
2016-12-20 14:17:39 +01:00
|
|
|
|
|
|
|
--wagons
|
|
|
|
minetest.register_craft({
|
|
|
|
output = 'advtrains:subway_wagon',
|
|
|
|
recipe = {
|
|
|
|
{'default:steelblock', 'default:steelblock', 'default:steelblock'},
|
|
|
|
{'default:steelblock', 'dye:yellow', 'default:steelblock'},
|
|
|
|
{'default:steelblock', 'default:steelblock', 'default:steelblock'},
|
|
|
|
},
|
|
|
|
})
|
2017-10-25 12:33:12 +02:00
|
|
|
|
|
|
|
minetest.register_craftitem(":advtrains:subway_train", {
|
|
|
|
description = "Subway train, will drive forward when placed",
|
|
|
|
inventory_image = "advtrains_subway_wagon_inv.png",
|
|
|
|
wield_image = "advtrains_subway_wagon_inv.png",
|
|
|
|
|
|
|
|
on_place = function(itemstack, placer, pointed_thing)
|
|
|
|
return advtrains.pcall(function()
|
|
|
|
if not pointed_thing.type == "node" then
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
local node=minetest.get_node_or_nil(pointed_thing.under)
|
|
|
|
if not node then atprint("[advtrains]Ignore at placer position") return itemstack end
|
|
|
|
local nodename=node.name
|
2017-10-25 13:31:01 +02:00
|
|
|
|
2017-10-25 12:33:12 +02:00
|
|
|
if not minetest.check_player_privs(placer, {train_place = true }) and minetest.is_protected(pointed_thing.under, placer:get_player_name()) then
|
|
|
|
minetest.record_protection_violation(pointed_thing.under, placer:get_player_name())
|
|
|
|
return
|
|
|
|
end
|
2017-12-18 21:44:36 +01:00
|
|
|
|
|
|
|
local tconns=advtrains.get_track_connections(node.name, node.param2)
|
|
|
|
local yaw = placer:get_look_horizontal() + (math.pi/2)
|
|
|
|
local plconnid = advtrains.yawToClosestConn(yaw, tconns)
|
|
|
|
|
2018-01-07 20:41:48 +01:00
|
|
|
local prevpos = advtrains.get_adjacent_rail(pointed_thing.under, tconns, plconnid, advtrains.all_tracktypes)
|
2017-12-18 21:44:36 +01:00
|
|
|
if not prevpos then return end
|
|
|
|
local id=advtrains.create_new_train_at(pointed_thing.under, prevpos)
|
2017-10-25 12:33:12 +02:00
|
|
|
|
|
|
|
for i=1,3 do
|
2017-10-25 13:31:01 +02:00
|
|
|
local ob=minetest.add_entity(pointed_thing.under, "advtrains:subway_wagon")
|
2017-10-25 12:33:12 +02:00
|
|
|
if not ob then
|
|
|
|
atprint("couldn't add_entity, aborting")
|
|
|
|
end
|
|
|
|
local le=ob:get_luaentity()
|
|
|
|
|
|
|
|
le.owner=placer:get_player_name()
|
|
|
|
|
|
|
|
local wagon_uid=le:init_new_instance(id, {})
|
|
|
|
|
|
|
|
advtrains.add_wagon_to_train(le, id)
|
|
|
|
end
|
2017-10-25 13:31:01 +02:00
|
|
|
minetest.after(1,function()
|
|
|
|
advtrains.trains[id].tarvelocity=2
|
2017-10-25 12:33:12 +02:00
|
|
|
advtrains.trains[id].velocity=2
|
2017-10-25 13:31:01 +02:00
|
|
|
advtrains.trains[id].movedir=1
|
|
|
|
end)
|
2017-10-25 12:33:12 +02:00
|
|
|
if not minetest.settings:get_bool("creative_mode") then
|
|
|
|
itemstack:take_item()
|
|
|
|
end
|
|
|
|
return itemstack
|
|
|
|
|
|
|
|
end)
|
|
|
|
end,
|
|
|
|
})
|