/src/

er then advtrains.player_to_wagon_mapping[self.driver:get_player_name()]=nil advtrains.set_trainhud(self.driver:get_player_name(), "") self.driver = nil self.driver_name = nil clicker:set_detach() clicker:set_eye_offset({x=0,y=0,z=0}, {x=0,y=0,z=0}) elseif not self.driver then self.driver = clicker advtrains.player_to_wagon_mapping[clicker:get_player_name()]=self clicker:set_attach(self.object, "", self.attach_offset, {x=0,y=0,z=0}) clicker:set_eye_offset(self.view_offset, self.view_offset) end end function wagon:train() return advtrains.trains[self.train_id] end function wagon:on_activate(staticdata, dtime_s) --print("[advtrains][wagon "..(self.unique_id or "no-id").."] activated") self.object:set_armor_groups({immortal=1}) if staticdata then local tmp = minetest.deserialize(staticdata) if tmp then self.unique_id=tmp.unique_id self.train_id=tmp.train_id self.wagon_flipped=tmp.wagon_flipped end end self.old_pos = self.object:getpos() self.old_velocity = self.velocity self.initialized_pre=true self.entity_name=self.name --same code is in on_step --does this object already have an ID? if not self.unique_id then self.unique_id=os.time()..os.clock()--should be random enough. else for _,wagon in pairs(minetest.luaentities) do if wagon.is_wagon and wagon.initialized and wagon.unique_id==self.unique_id then--i am a duplicate! self.object:remove() return end end end --is my train still here if not self.train_id or not self:train() then if self.initialized then print("[advtrains][wagon "..self.unique_id.."] missing train_id, destroying") self.object:remove() return end print("[advtrains][wagon "..self.unique_id.."] missing train_id, but not yet initialized, returning") return elseif not self.initialized then self.initialized=true end advtrains.update_trainpart_properties(self.train_id) end function wagon:get_staticdata() --save to table before being unloaded advtrains.wagon_save[self.unique_id]=advtrains.merge_tables(self) return minetest.serialize({ unique_id=self.unique_id, train_id=self.train_id, wagon_flipped=self.wagon_flipped, }) end -- Remove the wagon function wagon:on_punch(puncher, time_from_last_punch, tool_capabilities, direction) if not puncher or not puncher:is_player() then return end self.object:remove() if not self.initialized then return end local inv = puncher:get_inventory() if minetest.setting_getbool("creative_mode") then if not inv:contains_item("main", self.name) then inv:add_item("main", self.name) end else inv:add_item("main", self.name) end table.remove(self:train().trainparts, self.pos_in_trainparts) advtrains.update_trainpart_properties(self.train_id) advtrains.wagon_save[self.unique_id]=nil if self.discouple then self.discouple.object:remove() end--will have no effect on unloaded objects return end function wagon:on_step(dtime) local t=os.clock() local pos = self.object:getpos() if not self.initialized_pre then print("[advtrains] wagon stepping while not yet initialized_pre, returning") self.object:setvelocity({x=0,y=0,z=0}) return end self.entity_name=self.name --does this object already have an ID? if not self.unique_id then self.unique_id=os.time()..os.clock()--should be random enough. end --is my train still here if not self.train_id or not self:train() then print("[advtrains][wagon "..self.unique_id.."] missing train_id, destroying") self.object:remove() return elseif not self.initialized then self.initialized=true end --re-attach driver if he got lost if not self.driver and self.driver_name then local clicker=minetest.get_player_by_name(self.driver_name) if clicker then self.driver = clicker advtrains.player_to_wagon_mapping[clicker:get_player_name()]=self clicker:set_attach(self.object, "", self.attach_offset, {x=0,y=0,z=0}) clicker:set_eye_offset(self.view_offset, self.view_offset) end end --driver control if self.driver and self.is_locomotive then if self.driver:get_player_control_bits()~=self.old_player_control_bits then local pc=self.driver:get_player_control() if pc.sneak then --stop self:train().tarvelocity=0 elseif (not self.wagon_flipped and pc.up) or (self.wagon_flipped and pc.down) then --faster self:train().tarvelocity=math.min(self:train().tarvelocity+1, advtrains.all_traintypes[self:train().traintype].max_speed or 10) elseif (not self.wagon_flipped and pc.down) or (self.wagon_flipped and pc.up) then --slower self:train().tarvelocity=math.max(self:train().tarvelocity-1, -(advtrains.all_traintypes[self:train().traintype].max_speed or 10)) elseif pc.aux1 then --slower if true or math.abs(self:train().velocity)<=3 then--TODO debug advtrains.player_to_wagon_mapping[self.driver:get_player_name()]=nil self.driver:set_detach() self.driver:set_eye_offset({x=0,y=0,z=0}, {x=0,y=0,z=0}) advtrains.set_trainhud(self.driver:get_player_name(), "") self.driver = nil self.driver_name = nil return--(don't let it crash because of statement below) else minetest.chat_send_player(self.driver:get_player_name(), "Can't get off driving train!") end end self.old_player_control_bits=self.driver:get_player_control_bits() end advtrains.set_trainhud(self.driver:get_player_name(), advtrains.hud_train_format(self:train(), self.wagon_flipped)) end local gp=self:train() --DisCouple if self.pos_in_trainparts and self.pos_in_trainparts>1 then if gp.velocity==0 then if not self.discouple or not self.discouple.object:getyaw() then local object=minetest.add_entity(pos, "advtrains:discouple") if object then local le=object:get_luaentity() le.wagon=self --box is hidden when attached, so unuseful. --object:set_attach(self.object, "", {x=0, y=0, z=self.wagon_span*10}, {x=0, y=0, z=0}) self.discouple=le else print("Couldn't spawn DisCouple") end end else if self.discouple and self.discouple.object:getyaw() then self.discouple.object:remove() end end end --for path to be available. if not, skip step if not advtrains.get_or_create_path(self.train_id, gp) then self.object:setvelocity({x=0, y=0, z=0}) return end local index=advtrains.get_real_path_index(self:train(), self.pos_in_train) --print("trainindex "..gp.index.." wagonindex "..index) --position recalculation