diff options
Diffstat (limited to 'advtrains')
-rw-r--r-- | advtrains/api_doc.txt | 9 | ||||
-rw-r--r-- | advtrains/wagons.lua | 77 |
2 files changed, 54 insertions, 32 deletions
diff --git a/advtrains/api_doc.txt b/advtrains/api_doc.txt index c944e30..e34b32a 100644 --- a/advtrains/api_doc.txt +++ b/advtrains/api_doc.txt @@ -31,14 +31,15 @@ advtrains.register_wagon(name, prototype, description, inventory_image) ^- this value is passed to 'set_attach' view_offset={x=0, y=6, z=0}, ^- player:set_eye_offset is called with this parameter. - driving_ctrl_access=false, - ^- If the seat is a driver stand, and players sitting here should get access to the train's driving control. group="default" ^- optional. Defines the seat group. See 'seat_groups' below + -!- Note: driving_ctrl_access field has moved to seat group definition, + -!- but is still partwise supported here. If you don't use seat groups yet, + -!- you really should change NOW! }, }, seat_groups = { - ^- optional. If defined, activates advanced seating behavior. See "seating behavior". + ^- If defined, activates advanced seating behavior. See "seating behavior". default = { name = "Seats" ^- name of this seat group, to be shown in get-on menu. @@ -46,6 +47,8 @@ advtrains.register_wagon(name, prototype, description, inventory_image) ^- List of seat groups you can access from this seat using the menu when sitting inside the train. require_doors_open = true ^- Only allow getting on and off if doors are open. + driving_ctrl_access=false, + ^- If the seat is a driver stand, and players sitting here should get access to the train's driving control. } } assign_to_seat_group = {"default"}, diff --git a/advtrains/wagons.lua b/advtrains/wagons.lua index 0616f9f..11a9099 100644 --- a/advtrains/wagons.lua +++ b/advtrains/wagons.lua @@ -163,27 +163,22 @@ function wagon:on_punch(puncher, time_from_last_punch, tool_capabilities, direct minetest.chat_send_player(puncher:get_player_name(), attrans("This wagon is owned by @1, you can't destroy it.", self.owner));
return
end
+ if #(self:train().trainparts)>1 then
+ minetest.chat_send_player(puncher:get_player_name(), attrans("Wagon needs to be decoupled from other wagons in order to destroy it."));
+ return
+ end
- if minetest.settings:get_bool("creative_mode") then
- if not self:destroy() then return end
-
- local inv = puncher:get_inventory()
- if not inv:contains_item("main", self.name) then
- inv:add_item("main", self.name)
- end
- else
- local pc=puncher:get_player_control()
- if not pc.sneak then
- minetest.chat_send_player(puncher:get_player_name(), attrans("Warning: If you destroy this wagon, you only get some steel back! If you are sure, hold Sneak and left-click the wagon."))
- return
- end
+ local pc=puncher:get_player_control()
+ if not pc.sneak then
+ minetest.chat_send_player(puncher:get_player_name(), attrans("Warning: If you destroy this wagon, you only get some steel back! If you are sure, hold Sneak and left-click the wagon."))
+ return
+ end
- if not self:destroy() then return end
+ if not self:destroy() then return end
- local inv = puncher:get_inventory()
- for _,item in ipairs(self.drops or {self.name}) do
- inv:add_item("main", item)
- end
+ local inv = puncher:get_inventory()
+ for _,item in ipairs(self.drops or {self.name}) do
+ inv:add_item("main", item)
end
end)
end
@@ -245,9 +240,6 @@ function wagon:on_step(dtime) if not self.seatpc then
self.seatpc={}
end
-
- --Legacy: remove infotext since it does not work this way anyways
- self.infotext=nil
--custom on_step function
if self.custom_on_step then
@@ -257,7 +249,12 @@ function wagon:on_step(dtime) --driver control
for seatno, seat in ipairs(self.seats) do
local driver=self.seatp[seatno] and minetest.get_player_by_name(self.seatp[seatno])
- local has_driverstand=seat.driving_ctrl_access and self.seatp[seatno] and minetest.check_player_privs(self.seatp[seatno], {train_operator=true})
+ local has_driverstand = self.seatp[seatno] and minetest.check_player_privs(self.seatp[seatno], {train_operator=true})
+ if self.seat_groups then
+ has_driverstand = has_driverstand and (seat.driving_ctrl_access or self.seat_groups[seat.group].driving_ctrl_access)
+ else
+ has_driverstand = has_driverstand and (seat.driving_ctrl_access)
+ end
if has_driverstand and driver then
advtrains.update_driver_hud(driver:get_player_name(), self:train(), self.wagon_flipped)
elseif driver then
@@ -589,6 +586,9 @@ function wagon:on_rightclick(clicker) if self.has_inventory and self.get_inventory_formspec then
poss[#poss+1]={name=attrans("Show Inventory"), key="inv"}
end
+ if self.seat_groups[sgr].driving_ctrl_access and minetest.check_player_privs(pname, "train_operator") then
+ poss[#poss+1]={name=attrans("Bord Computer"), key="bordcom"}
+ end
if self.owner==pname then
poss[#poss+1]={name=attrans("Wagon properties"), key="prop"}
end
@@ -627,18 +627,27 @@ function wagon:on_rightclick(clicker) end
local doors_open = self:train().door_open~=0 or clicker:get_player_control().sneak
+ local allow, rsn=false, "unknown reason"
for _,sgr in ipairs(self.assign_to_seat_group) do
- if self:check_seat_group_access(pname, sgr) then
+ allow, rsn = self:check_seat_group_access(pname, sgr)
+ if allow then
for seatid, seatdef in ipairs(self.seats) do
- if seatdef.group==sgr and not self.seatp[seatid] and (not self.seat_groups[sgr].require_doors_open or doors_open) then
- self:get_on(clicker, seatid)
- return
+ if seatdef.group==sgr then
+ if (not self.seat_groups[sgr].require_doors_open or doors_open) then
+ if not self.seatp[seatid] then
+ self:get_on(clicker, seatid)
+ return
+ else
+ rsn="Wagon is full."
+ end
+ else
+ rsn="Doors are closed! (try holding sneak key!)"
+ end
end
end
end
end
- minetest.chat_send_player(pname, attrans("Can't get on: wagon full or doors closed!"))
- minetest.chat_send_player(pname, attrans("Use Sneak+rightclick to bypass closed doors!"))
+ minetest.chat_send_player(pname, attrans("Can't get on: "..rsn))
else
self:show_get_on_form(pname)
end
@@ -787,6 +796,10 @@ function wagon:show_wagon_properties(pname) form=form.."button_exit[0.5,"..(3+at*1.5)..";4,1;save;"..attrans("Save wagon properties").."]"
minetest.show_formspec(pname, "advtrains_prop_"..self.unique_id, form)
end
+function wagon:show_bordcom(pname)
+
+ minetest.show_formspec(pname, "advtrains_bordcom_"..self.unique_id, "field[irrel;Not yet implemented;We normally would show the bord computer now.]")
+end
minetest.register_on_player_receive_fields(function(player, formname, fields)
return advtrains.pcall(function()
local uid=string.match(formname, "^advtrains_geton_(.+)$")
@@ -880,6 +893,9 @@ function wagon:seating_from_key_helper(pname, fields, no) if fields.prop and self.owner==pname then
self:show_wagon_properties(pname)
end
+ if fields.bordcom and self.seat_groups[sgr].driving_ctrl_access and minetest.check_player_privs(pname, "train_operator") then
+ self:show_bordcom(pname)
+ end
if fields.dcwarn then
minetest.chat_send_player(pname, attrans("Doors are closed! Use Sneak+rightclick to ignore the closed doors and get off!"))
end
@@ -888,6 +904,9 @@ function wagon:seating_from_key_helper(pname, fields, no) end
end
function wagon:check_seat_group_access(pname, sgr)
+ if self.seat_groups[sgr].driving_ctrl_access and not minetest.check_player_privs(pname, "train_operator") then
+ return false, "Missing train_operator privilege."
+ end
if not self.seat_access then
return true
end
@@ -900,7 +919,7 @@ function wagon:check_seat_group_access(pname, sgr) return true
end
end
- return false
+ return false, "Blacklisted by owner."
end
function wagon:reattach_all()
if not self.seatp then self.seatp={} end
|