From 7eb17b323322aaf0c9d57c66079465a8df3bae10 Mon Sep 17 00:00:00 2001 From: orwell96 Date: Thu, 24 Nov 2016 20:25:07 +0100 Subject: [PATCH] change train controlling system and keybindings also, fix various small bugs --- advtrains.zip | Bin 1575449 -> 1575848 bytes init.lua | 14 +++---- trainhud.lua | 97 +++++++++++++++++++++++++++++++++++++------------ trainlogic.lua | 44 ++++++++++++++-------- wagons.lua | 28 +++++--------- 5 files changed, 118 insertions(+), 65 deletions(-) diff --git a/advtrains.zip b/advtrains.zip index a3c834de30f2fd67e156f95db405d23cf98371e6..e79b3c0daaf4f20af48cb4c27a9d1d4ef0614ea4 100644 GIT binary patch delta 16169 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

YNt%$+V||zudJk{xDNgnP!t)v7C?zDYcA?NJ)d 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 diff --git a/init.lua b/init.lua index 37904e6..41b624e 100644 --- a/init.lua +++ b/init.lua @@ -26,17 +26,17 @@ advtrains.meseconrules = {x=0, y=1, z=-1}, {x=0, y=-1, z=-1}, {x=0, y=-2, z=0}} -dofile(advtrains.modpath.."/trainlogic.lua"); +dofile(advtrains.modpath.."/trainlogic.lua") dofile(advtrains.modpath.."/trainhud.lua") dofile(advtrains.modpath.."/trackplacer.lua") dofile(advtrains.modpath.."/tracks.lua") dofile(advtrains.modpath.."/atc.lua") dofile(advtrains.modpath.."/wagons.lua") -dofile(advtrains.modpath.."/pseudoload.lua"); -dofile(advtrains.modpath.."/couple.lua"); -dofile(advtrains.modpath.."/damage.lua"); +dofile(advtrains.modpath.."/pseudoload.lua") +dofile(advtrains.modpath.."/couple.lua") +dofile(advtrains.modpath.."/damage.lua") -dofile(advtrains.modpath.."/signals.lua"); -dofile(advtrains.modpath.."/misc_nodes.lua"); -dofile(advtrains.modpath.."/crafting.lua"); +dofile(advtrains.modpath.."/signals.lua") +dofile(advtrains.modpath.."/misc_nodes.lua") +dofile(advtrains.modpath.."/crafting.lua") diff --git a/trainhud.lua b/trainhud.lua index 81b9e94..610412a 100644 --- a/trainhud.lua +++ b/trainhud.lua @@ -1,10 +1,70 @@ - +--trainhud.lua: holds all the code for train controlling + advtrains.hud = {} minetest.register_on_leaveplayer(function(player) advtrains.hud[player:get_player_name()] = nil end) +local mletter={[1]="F", [-1]="R", [0]="N"} + +function advtrains.on_control_change(pc, train, flip) + if pc.sneak then + if pc.up then + train.tarvelocity = advtrains.all_traintypes[train.traintype].max_speed or 10 + end + if pc.down then + train.tarvelocity = 0 + end + if pc.left then + train.tarvelocity = 4 + end + if pc.right then + train.tarvelocity = 8 + end + if pc.jump then + train.brake = true + --0: released, 1: brake and pressed, 2: released and brake, 3: pressed and brake + if not train.brake_hold_state or train.brake_hold_state==0 then + train.brake_hold_state = 1 + elseif train.brake_hold_state==2 then + train.brake_hold_state = 3 + end + elseif train.brake_hold_state==1 then + train.brake_hold_state = 2 + elseif train.brake_hold_state==3 then + train.brake = false + train.brake_hold_state = 0 + end + else + if pc.up then + train.tarvelocity = train.tarvelocity + 1 + end + if pc.down then + if train.velocity>0 then + train.tarvelocity = math.max(train.tarvelocity - 1, 0) + else + train.movedir = -train.movedir + end + end + if train.brake_hold_state~=2 then + train.brake = false + end + if pc.jump then + train.brake = true + end + if pc.aux1 then + --horn + end + end +end +function advtrains.update_driver_hud(pname, train, flip) + advtrains.set_trainhud(pname, advtrains.hud_train_format(train, flip)) +end +function advtrains.clear_driver_hud(pname) + advtrains.set_trainhud(pname, "") +end + function advtrains.set_trainhud(name, text) local hud = advtrains.hud[name] local player=minetest.get_player_by_name(name) @@ -32,28 +92,17 @@ function advtrains.set_trainhud(name, text) end end function advtrains.hud_train_format(train, flip) - local fct=1 - if flip then fct=-1 end - if not train then return "" end + local fct=flip and -1 or 1 + if not train or not train.traintype then return "" end + local max=advtrains.all_traintypes[train.traintype].max_speed or 10 - local vel=advtrains.abs_ceil(train.velocity)*fct - local tvel=advtrains.abs_ceil(train.tarvelocity)*fct - local firstLine, secondLine - if vel<0 then - firstLine="Speed: <"..string.rep("_", vel+max)..string.rep("+", -vel).."|"..string.rep("_", max)..">" - else - firstLine="Speed: <"..string.rep("_", max).."|"..string.rep("+", vel)..string.rep("_", max-vel)..">" - end - if tvel<0 then - secondLine="Target: <"..string.rep("_", tvel+max)..string.rep("+", -tvel).."|"..string.rep("_", max)..">" - else - secondLine="Target: <"..string.rep("_", max).."|"..string.rep("+", tvel)..string.rep("_", max-tvel)..">" - end - if vel==0 then - return firstLine.."\n"..secondLine.."\nup for forward, down for backward, use to get off train. " - elseif vel<0 then - return firstLine.."\n"..secondLine.."\nPress up to decelerate, down to accelerate, sneak to stop." - elseif vel>0 then - return firstLine.."\n"..secondLine.."\nPress up to accelerate, down to decelerate, sneak to stop." - end + local vel=advtrains.abs_ceil(train.velocity) + local tvel=advtrains.abs_ceil(train.tarvelocity) + local topLine, firstLine, secondLine + + topLine=train.traintype.." ["..mletter[fct*train.movedir].."] "..(train.brake and "="..( train.brake_hold_state==2 and "^" or "" ).."B=" or "") + firstLine="Speed: |"..string.rep("+", vel)..string.rep("_", max-vel)..">" + secondLine="Target: |"..string.rep("+", tvel)..string.rep("_", max-tvel)..">" + + return topLine.."\n"..firstLine.."\n"..secondLine end diff --git a/trainlogic.lua b/trainlogic.lua index 5b9390c..11849fd 100644 --- a/trainlogic.lua +++ b/trainlogic.lua @@ -34,8 +34,10 @@ function endstep() end end +--TODO: these values need to be integrated when i remove traintypes. advtrains.train_accel_force=2--per second and divided by number of wagons advtrains.train_brake_force=3--per second, not divided by number of wagons +advtrains.train_roll_force=0.5--per second, not divided by number of wagons, acceleration when rolling without brake advtrains.train_emerg_force=10--for emergency brakes(when going off track) advtrains.audit_interval=30 @@ -171,6 +173,9 @@ function advtrains.train_step(id, train, dtime) if not train.velocity then train.velocity=0 end + if not train.movedir or (train.movedir~=1 and train.movedir~=-1) then + train.movedir=1 + end --very unimportant thing: check if couple is here if train.couple_eid_front and (not minetest.luaentities[train.couple_eid_front] or not minetest.luaentities[train.couple_eid_front].is_couple) then train.couple_eid_front=nil end if train.couple_eid_back and (not minetest.luaentities[train.couple_eid_back] or not minetest.luaentities[train.couple_eid_back].is_couple) then train.couple_eid_back=nil end @@ -201,13 +206,12 @@ function advtrains.train_step(id, train, dtime) local back_off_track=train.min_index_on_track and train_end_index1 then train.tarvelocity=1 end - if train.tarvelocity<-1 then train.tarvelocity=-1 end elseif front_off_track then--allow movement only backward - if train.tarvelocity>0 then train.tarvelocity=0 end - if train.tarvelocity<-1 then train.tarvelocity=-1 end + if train.movedir==1 and train.tarvelocity>0 then train.tarvelocity=0 end + if train.movedir==-1 and train.tarvelocity>1 then train.tarvelocity=1 end elseif back_off_track then--allow movement only forward - if train.tarvelocity>1 then train.tarvelocity=1 end - if train.tarvelocity<0 then train.tarvelocity=0 end + if train.movedir==-1 and train.tarvelocity>0 then train.tarvelocity=0 end + if train.movedir==1 and train.tarvelocity>1 then train.tarvelocity=1 end end --update advtrains.detector @@ -269,9 +273,9 @@ function advtrains.train_step(id, train, dtime) --this time, based on NODES and the advtrains.detector.on_node table. local collpos local coll_grace=1 - if train.velocity>0 then + if train.movedir==1 then collpos=advtrains.get_real_index_position(path, train.index-coll_grace) - elseif train.velocity<0 then + else collpos=advtrains.get_real_index_position(path, train_end_index+coll_grace) end if collpos then @@ -282,7 +286,8 @@ function advtrains.train_step(id, train, dtime) if advtrains.detector.on_node[testpts] and advtrains.detector.on_node[testpts]~=id then --collides train.recently_collided_with_env=true - train.velocity=-0.5*train.velocity + train.velocity=0.5*train.velocity + train.movedir=train.movedir*-1 train.tarvelocity=0 end end @@ -345,32 +350,41 @@ function advtrains.train_step(id, train, dtime) if train.locomotives_in_train==0 then train.tarvelocity=0 end + --make brake adjust the tarvelocity if necessary + if train.brake and (math.ceil(train.velocity)-1)0 then--accelerating, force will be brought on only by locomotives. --print("accelerating with default force") applydiff=(math.min((advtrains.train_accel_force*train.locomotives_in_train*dtime)/mass, math.abs(diff))) else--decelerating if front_off_track or back_off_track or train.recently_collided_with_env then --every wagon has a brake, so not divided by mass. --print("braking with emergency force") - applydiff=(math.min((advtrains.train_emerg_force*dtime), math.abs(diff))) - else + applydiff= -(math.min((advtrains.train_emerg_force*dtime), math.abs(diff))) + elseif train.brake then --print("braking with default force") - applydiff=(math.min((advtrains.train_brake_force*dtime), math.abs(diff))) + --no math.min, because it can grow beyond tarvelocity, see up there + --dont worry, it will never fall below zero. + applydiff= -((advtrains.train_brake_force*dtime)) + else + --print("roll") + applydiff= -(math.min((advtrains.train_roll_force*dtime), math.abs(diff))) end end - train.last_accel=(applydiff*math.sign(train.tarvelocity-train.velocity)) - train.velocity=train.velocity+train.last_accel + train.last_accel=(applydiff*train.movedir) + train.velocity=math.min(math.max( train.velocity+applydiff , 0), advtrains.all_traintypes[train.traintype].max_speed) else train.last_accel=0 end --move --TODO 3,5 + 0.7 - train.index=train.index and train.index+((train.velocity/(train.path_dist[math.floor(train.index)] or 1))*dtime) or 0 + train.index=train.index and train.index+(((train.velocity*train.movedir)/(train.path_dist[math.floor(train.index)] or 1))*dtime) or 0 end diff --git a/wagons.lua b/wagons.lua index 7a99bca..296bc54 100644 --- a/wagons.lua +++ b/wagons.lua @@ -259,24 +259,13 @@ function wagon:on_step(dtime) local driver=self.seatp[seatno] and minetest.get_player_by_name(self.seatp[seatno]) if driver and driver:get_player_control_bits()~=self.old_player_control_bits then local pc=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 - self:get_off(seatno) - return - else - minetest.chat_send_player(driver:get_player_name(), "Can't get off driving train!") - end - end + + advtrains.on_control_change(pc, self:train(), self.wagon_flipped) + self.old_player_control_bits=driver:get_player_control_bits() end if driver then - advtrains.set_trainhud(driver:get_player_name(), advtrains.hud_train_format(self:train(), self.wagon_flipped)) + advtrains.update_driver_hud(driver:get_player_name(), self:train(), self.wagon_flipped) end end end @@ -310,7 +299,8 @@ function wagon:on_step(dtime) return end if not self.pos_in_train then - print("["..self.unique_id.."][fatal] no pos_in_train set.") + --why ever. but better continue next step... + advtrains.update_trainpart_properties(self.train_id) return end @@ -347,7 +337,7 @@ function wagon:on_step(dtime) end --FIX: use index of the wagon, not of the train. - local velocity=gp.velocity/(gp.path_dist[math.floor(index)] or 1) + local velocity=(gp.velocity*gp.movedir)/(gp.path_dist[math.floor(index)] or 1) local acceleration=(gp.last_accel or 0)/(gp.path_dist[math.floor(index)] or 1) local factor=index-math.floor(index) local actual_pos={x=first_pos.x-(first_pos.x-second_pos.x)*factor, y=first_pos.y-(first_pos.y-second_pos.y)*factor, z=first_pos.z-(first_pos.z-second_pos.z)*factor,} @@ -414,7 +404,7 @@ function wagon:get_on(clicker, seatno) self.seatp={} end if not self.seats[seatno] then return end - if self.seatp[seatno] then + if self.seatp[seatno] and self.seatp[seatno]~=clicker:get_player_name() then self:get_off(seatno) end self.seatp[seatno] = clicker:get_player_name() @@ -441,7 +431,7 @@ function wagon:get_off(seatno) local pname = self.seatp[seatno] local clicker = minetest.get_player_by_name(pname) advtrains.player_to_wagon_mapping[pname]=nil - advtrains.set_trainhud(pname, "") + advtrains.clear_driver_hud(pname) if clicker then clicker:set_detach() clicker:set_eye_offset({x=0,y=0,z=0}, {x=0,y=0,z=0})