From 0606c2635f8b44b16af0800eb7357405f0a7a5ec Mon Sep 17 00:00:00 2001 From: oilboi <47129783+oilboi@users.noreply.github.com> Date: Sat, 4 Jul 2020 21:42:43 -0400 Subject: [PATCH] Add functioning rail coupling --- mods/minecart/init.lua | 174 ++++++++++++++++++----------------------- 1 file changed, 76 insertions(+), 98 deletions(-) diff --git a/mods/minecart/init.lua b/mods/minecart/init.lua index 4b90705..4cf4acd 100644 --- a/mods/minecart/init.lua +++ b/mods/minecart/init.lua @@ -34,6 +34,21 @@ local function data_injection(pos,data) end end +local function speed_limiter(self,speed) + local test = self.object:get_velocity()--vector.multiply(self.velocity,new_vel) + + if test.x > speed then + test.x = speed + elseif test.x < -speed then + test.x = -speed + end + if test.z > speed then + test.z = speed + elseif test.z < -speed then + test.z = -speed + end + self.object:set_velocity(test) +end local function create_axis(pos) local possible_dirs = {} @@ -54,13 +69,13 @@ local function collision_detect(self) local pos2 = object:get_pos() if self.axis_lock == "x" then - local velocity = (1-vector.distance(vector.new(pos.x,0,0),vector.new(pos2.x,0,0))) + local velocity = (1-vector.distance(vector.new(pos.x,0,0),vector.new(pos2.x,0,0)))*5 local dir = vector.direction(vector.new(pos2.x,0,0),vector.new(pos.x,0,0)) local new_vel = vector.multiply(dir,velocity) self.object:add_velocity(new_vel) self.dir = dir elseif self.axis_lock == "z" then - local velocity = (1-vector.distance(vector.new(0,0,pos.z),vector.new(0,0,pos2.z))) + local velocity = (1-vector.distance(vector.new(0,0,pos.z),vector.new(0,0,pos2.z)))*5 local dir = vector.direction(vector.new(0,0,pos2.z),vector.new(0,0,pos.z)) local new_vel = vector.multiply(dir,velocity) self.object:add_velocity(new_vel) @@ -162,146 +177,111 @@ local function straight_snap(pos,self,dir) return(false) end + +local function coupling_logic(self) + + if not self.axis_lock then return end + + if not self.coupler1 then return end + + if self.dir.y ~= 0 then return end + + local pos = self.object:get_pos() + + local pos2 = self.coupler1:get_pos() + + if self.axis_lock == "x" then + local velocity_real = self.object:get_velocity() + local distance = vector.distance(pos,pos2) + local new_vel = vector.new(0,0,0) + if distance > 1.5 then + local velocity = (distance-1) + local dir = vector.direction(vector.new(pos.x,0,0),vector.new(pos2.x,0,0)) + self.dir = dir + new_vel = vector.multiply(dir,velocity) + else + new_vel = vector.multiply(velocity_real,-1) + end + self.object:add_velocity(new_vel) + elseif self.axis_lock == "z" then + local velocity_real = self.object:get_velocity() + local distance = vector.distance(pos,pos2) + local new_vel = vector.new(0,0,0) + if distance > 1.5 then + local velocity = (distance-1) + local dir = vector.direction(vector.new(0,0,pos.z),vector.new(0,0,pos2.z)) + self.dir = dir + new_vel = vector.multiply(dir,velocity) + else + new_vel = vector.multiply(velocity_real,-1) + end + self.object:add_velocity(new_vel) + end + + return +end + + local function rail_brain(self,pos) - if not self.dir then return end - --if self.dir then print(dump(self.dir)) end + + if not self.dir then self.dir = vector.new(0,0,0) end local pos2 = self.object:get_pos() local dir = self.dir - local triggered = false - - if dir.x < 0 and pos2.x < pos.x then - triggered = true - elseif dir.x > 0 and pos2.x > pos.x then - triggered = true - elseif dir.z < 0 and pos2.z < pos.z then - triggered = true - elseif dir.z > 0 and pos2.z > pos.z then - triggered = true - end + speed_limiter(self,6) - if triggered and not pool[minetest.hash_node_position(vector.add(pos,dir))] then + if not pool[minetest.hash_node_position(vector.add(pos,dir))] then if straight_snap(pos,self,dir) then return end local possible_dirs = create_axis(pos) - + if table.getn(possible_dirs) == 0 then - --print("train fails") - --stop slow down become physical, something + --stop slow down become physical else for _,dir2 in pairs(possible_dirs) do - if climb_snap(pos,self,dir,dir2) then + if turn_snap(pos,self,dir,dir2) then return end - end - - for _,dir2 in pairs(possible_dirs) do - if turn_snap(pos,self,dir,dir2) then + if climb_snap(pos,self,dir,dir2) then return end end end + else + coupling_logic(self) end -end - - -local function coupling_logic(self) - - if not self.axis_lock then return end - - if not self.coupler1 then return end - - if not self.dir.y == 0 then print("failing") return end - - local pos = self.object:get_pos() - - local pos2 = self.coupler1:get_pos() - - if self.axis_lock == "x" then - --local velocity = self.object:get_velocity() - local distance = 1-vector.distance(pos,pos2) - - local dir = vector.direction(vector.new(pos2.x,0,0),vector.new(pos.x,0,0)) - - local new_vel = vector.multiply(dir,distance) - self.object:add_velocity(new_vel) - --self.dir = dir - --[[ - elseif self.axis_lock == "z" then - local velocity = self.object:get_velocity() - local velocity = (1-vector.distance(pos,pos2)) - local dir = vector.direction(vector.new(0,0,pos2.z),vector.new(0,0,pos.z)) - local new_vel = vector.multiply(dir,velocity) - self.object:add_velocity(new_vel) - --self.dir = dir - ]]-- - end - return end - local minecart = {} minecart.on_step = function(self,dtime) - local float_pos = self.object:get_pos() - local pos = vector.round(float_pos) - - --if self.velocity then - --local new_vel = dtime*1000 - local test = self.object:get_velocity()--vector.multiply(self.velocity,new_vel) - - if test.x > 10 then - test.x = 10 - print("slowing down 1") - elseif test.x < -10 then - test.x = -10 - print("slowing down 2") - end - if test.z > 10 then - test.z = 10 - print("slowing down 3") - elseif test.z < -10 then - test.z = -10 - print("slowing down 4") - - end - self.object:set_velocity(test) - --self.object:move_to(vector.add(float_pos,test)) - --end - + local pos = vector.round(self.object:get_pos()) if not self.axis_lock then local possible_dirs = create_axis(pos) for _,dir in pairs(possible_dirs) do if dir.x ~=0 then self.axis_lock = "x" - self.dir = vector.new(1,0,0) - --self.velocity = vector.new(0,0,0) + self.dir = dir direction_snap(self) break elseif dir.z ~= 0 then self.axis_lock = "z" - self.dir = vector.new(0,0,1) - --self.velocity = vector.new(0,0,0) + self.dir = dir direction_snap(self) break end end else - - collision_detect(self) - - coupling_logic(self) - rail_brain(self,pos) + collision_detect(self) end - self.old_pos = float_pos end minecart.on_rightclick = function(self,clicker) @@ -312,7 +292,6 @@ minecart.on_rightclick = function(self,clicker) self.coupler1 = pool[name] --pool[name]:get_luaentity().coupler1 = self.object pool[name] = nil - print("coupled") end end @@ -441,7 +420,6 @@ minetest.register_lbm({ run_at_every_load = true, action = function(pos) data_injection(pos,true) - --print("buildin dat cashay") end, }) -- 2.44.0