Wagon iterator, lookup by id, and use them in code
This commit is contained in:
parent
96f4ac7f6c
commit
6d3c5a5f38
|
@ -142,13 +142,8 @@ minetest.register_on_joinplayer(function(player)
|
||||||
local pname = player:get_player_name()
|
local pname = player:get_player_name()
|
||||||
local id=advtrains.player_to_train_mapping[pname]
|
local id=advtrains.player_to_train_mapping[pname]
|
||||||
if id then
|
if id then
|
||||||
for _,wagon in pairs(minetest.luaentities) do
|
for _, wagon in advtrains.wagon_entity_pairs_in_train(id) do
|
||||||
if wagon.is_wagon and wagon.initialized and wagon.id then
|
wagon:reattach_all()
|
||||||
local wdata = advtrains.wagons[wagon.id]
|
|
||||||
if wdata and wdata.train_id == id then
|
|
||||||
wagon:reattach_all()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
@ -160,12 +155,10 @@ minetest.register_on_dieplayer(function(player)
|
||||||
if id then
|
if id then
|
||||||
local train=advtrains.trains[id]
|
local train=advtrains.trains[id]
|
||||||
if not train then advtrains.player_to_train_mapping[pname]=nil return end
|
if not train then advtrains.player_to_train_mapping[pname]=nil return end
|
||||||
for _,wagon in pairs(minetest.luaentities) do
|
for _, wagon in advtrains.wagon_entity_pairs_in_train(id) do
|
||||||
if wagon.is_wagon and wagon.initialized and wagon.train_id==id then
|
--when player dies, detach him from the train
|
||||||
--when player dies, detach him from the train
|
--call get_off_plr on every wagon since we don't know which one he's on.
|
||||||
--call get_off_plr on every wagon since we don't know which one he's on.
|
wagon:get_off_plr(pname)
|
||||||
wagon:get_off_plr(pname)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
-- just in case no wagon felt responsible for this player: clear train mapping
|
-- just in case no wagon felt responsible for this player: clear train mapping
|
||||||
advtrains.player_to_train_mapping[pname] = nil
|
advtrains.player_to_train_mapping[pname] = nil
|
||||||
|
|
|
@ -1103,12 +1103,11 @@ function wagon:handle_bordcom_fields(pname, formname, fields)
|
||||||
for i, tpid in ipairs(train.trainparts) do
|
for i, tpid in ipairs(train.trainparts) do
|
||||||
if fields["dcpl_"..i] then
|
if fields["dcpl_"..i] then
|
||||||
advtrains.safe_decouple_wagon(tpid, pname)
|
advtrains.safe_decouple_wagon(tpid, pname)
|
||||||
elseif fields["wgprp"..i] then
|
elseif fields["wgprp"..i] and data.owner==pname then
|
||||||
for _,wagon in pairs(minetest.luaentities) do
|
local wagon = advtrains.get_wagon_entity(tpid)
|
||||||
if wagon.is_wagon and wagon.initialized and wagon.id==tpid and data.owner==pname then
|
if wagon then
|
||||||
wagon:show_wagon_properties(pname)
|
wagon:show_wagon_properties(pname)
|
||||||
return
|
return
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -1154,44 +1153,48 @@ end
|
||||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||||
local uid=string.match(formname, "^advtrains_geton_(.+)$")
|
local uid=string.match(formname, "^advtrains_geton_(.+)$")
|
||||||
if uid then
|
if uid then
|
||||||
for _,wagon in pairs(minetest.luaentities) do
|
local wagon = advtrains.get_wagon_entity(uid)
|
||||||
if wagon.is_wagon and wagon.initialized and wagon.id==uid then
|
if wagon then
|
||||||
local data = advtrains.wagons[wagon.id]
|
local data = advtrains.wagons[wagon.id]
|
||||||
if fields.inv then
|
if fields.inv then
|
||||||
if wagon.has_inventory and wagon.get_inventory_formspec then
|
if wagon.has_inventory and wagon.get_inventory_formspec then
|
||||||
minetest.show_formspec(player:get_player_name(), "advtrains_inv_"..uid, wagon:get_inventory_formspec(player:get_player_name(), make_inv_name(uid)))
|
minetest.show_formspec(player:get_player_name(), "advtrains_inv_"..uid, wagon:get_inventory_formspec(player:get_player_name(), make_inv_name(uid)))
|
||||||
end
|
end
|
||||||
elseif fields.seat then
|
elseif fields.seat then
|
||||||
local val=minetest.explode_textlist_event(fields.seat)
|
local val=minetest.explode_textlist_event(fields.seat)
|
||||||
if val and val.type~="INV" and not data.seatp[player:get_player_name()] then
|
if val and val.type~="INV" and not data.seatp[player:get_player_name()] then
|
||||||
--get on
|
--get on
|
||||||
wagon:get_on(player, val.index)
|
wagon:get_on(player, val.index)
|
||||||
--will work with the new close_formspec functionality. close exactly this formspec.
|
--will work with the new close_formspec functionality. close exactly this formspec.
|
||||||
minetest.show_formspec(player:get_player_name(), formname, "")
|
minetest.show_formspec(player:get_player_name(), formname, "")
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
uid=string.match(formname, "^advtrains_seating_(.+)$")
|
uid=string.match(formname, "^advtrains_seating_(.+)$")
|
||||||
if uid then
|
if uid then
|
||||||
for _,wagon in pairs(minetest.luaentities) do
|
local wagon = advtrains.get_wagon_entity(uid)
|
||||||
if wagon.is_wagon and wagon.initialized and wagon.id==uid then
|
if wagon then
|
||||||
local pname=player:get_player_name()
|
local pname=player:get_player_name()
|
||||||
local no=wagon:get_seatno(pname)
|
local no=wagon:get_seatno(pname)
|
||||||
if no then
|
if no then
|
||||||
if wagon.seat_groups then
|
if wagon.seat_groups then
|
||||||
wagon:seating_from_key_helper(pname, fields, no)
|
wagon:seating_from_key_helper(pname, fields, no)
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
uid=string.match(formname, "^advtrains_prop_(.+)$")
|
uid=string.match(formname, "^advtrains_prop_(.+)$")
|
||||||
if uid then
|
if uid then
|
||||||
local pname=player:get_player_name()
|
local pname=player:get_player_name()
|
||||||
local data = advtrains.wagons[uid]
|
local data = advtrains.wagons[uid]
|
||||||
if pname~=data.owner and not minetest.check_player_privs(pname, {train_admin = true}) then
|
if not data then
|
||||||
|
return true
|
||||||
|
elseif pname~=data.owner and not minetest.check_player_privs(pname, {train_admin = true}) then
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
if fields.save or not fields.quit then
|
if fields.save or not fields.quit then
|
||||||
|
@ -1213,29 +1216,32 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||||
wagon.show_wagon_properties({id=uid}, pname)
|
wagon.show_wagon_properties({id=uid}, pname)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
return true
|
||||||
end
|
end
|
||||||
uid=string.match(formname, "^advtrains_bordcom_(.+)$")
|
uid=string.match(formname, "^advtrains_bordcom_(.+)$")
|
||||||
if uid then
|
if uid then
|
||||||
for _,wagon in pairs(minetest.luaentities) do
|
local wagon = advtrains.get_wagon_entity(uid)
|
||||||
if wagon.is_wagon and wagon.initialized and wagon.id==uid then
|
if wagon then
|
||||||
wagon:handle_bordcom_fields(player:get_player_name(), formname, fields)
|
wagon:handle_bordcom_fields(player:get_player_name(), formname, fields)
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
uid=string.match(formname, "^advtrains_inv_(.+)$")
|
uid=string.match(formname, "^advtrains_inv_(.+)$")
|
||||||
if uid then
|
if uid then
|
||||||
local pname=player:get_player_name()
|
local pname=player:get_player_name()
|
||||||
local data = advtrains.wagons[uid]
|
local data = advtrains.wagons[uid]
|
||||||
if fields.prop and data.owner==pname then
|
if fields.prop and data.owner==pname then
|
||||||
for _,wagon in pairs(minetest.luaentities) do
|
local wagon = advtrains.get_wagon_entity(uid)
|
||||||
if wagon.is_wagon and wagon.initialized and wagon.id==uid and data.owner==pname then
|
if wagon then
|
||||||
wagon:show_wagon_properties(pname)
|
wagon:show_wagon_properties(pname)
|
||||||
--wagon:handle_bordcom_fields(player:get_player_name(), formname, fields)
|
--wagon:handle_bordcom_fields(player:get_player_name(), formname, fields)
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
return true
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
function wagon:seating_from_key_helper(pname, fields, no)
|
function wagon:seating_from_key_helper(pname, fields, no)
|
||||||
local data = advtrains.wagons[self.id]
|
local data = advtrains.wagons[self.id]
|
||||||
local sgr=self.seats[no].group
|
local sgr=self.seats[no].group
|
||||||
|
@ -1507,3 +1513,27 @@ function advtrains.get_wagon_at_index(train_id, w_index)
|
||||||
-- nothing found, dist must be further back
|
-- nothing found, dist must be further back
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function advtrains.get_wagon_entity(wagon_id)
|
||||||
|
if not advtrains.wagons[wagon_id] then return end
|
||||||
|
local object = advtrains.wagon_objects[wagon_id]
|
||||||
|
if object then
|
||||||
|
return object:get_luaentity()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function advtrains.next_wagon_entity_in_train(train, i)
|
||||||
|
local wagon_id = train.trainparts[i + 1]
|
||||||
|
if wagon_id then
|
||||||
|
local wagon = advtrains.get_wagon_entity(wagon_id)
|
||||||
|
if wagon then
|
||||||
|
return i + 1, wagon
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function advtrains.wagon_entity_pairs_in_train(train_id)
|
||||||
|
local train = advtrains.trains[train_id]
|
||||||
|
if not train then return function() end end
|
||||||
|
return advtrains.next_wagon_entity_in_train, train, 0
|
||||||
|
end
|
||||||
|
|
Loading…
Reference in New Issue