From 59b1512cc30dec8560108ee16cf4c6ec9d495e97 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sat, 9 Aug 2014 17:37:02 +0200 Subject: [PATCH] Allow switching with keys --- README.txt | 2 +- functions.lua | 99 ++++++++++++------------- init.lua | 26 +++++-- textures/carts_rail_brk.png | Bin 524 -> 577 bytes textures/carts_rail_cp.png | Bin 521 -> 522 bytes textures/carts_rail_crossing_brk.png | Bin 498 -> 549 bytes textures/carts_rail_crossing_cp.png | Bin 496 -> 495 bytes textures/carts_rail_curved_brk.png | Bin 555 -> 544 bytes textures/carts_rail_curved_cp.png | Bin 487 -> 490 bytes textures/carts_rail_t_junction_brk.png | Bin 548 -> 554 bytes textures/carts_rail_t_junction_cp.png | Bin 506 -> 514 bytes textures/carts_rail_t_junction_pwr.png | Bin 584 -> 561 bytes textures/default_rail_t_junction.png | Bin 0 -> 495 bytes 13 files changed, 69 insertions(+), 58 deletions(-) create mode 100644 textures/default_rail_t_junction.png diff --git a/README.txt b/README.txt index 4ec9bb8..b67ba19 100644 --- a/README.txt +++ b/README.txt @@ -20,4 +20,4 @@ kddekadenz: Zeg9: cart.x - cart.png + cart.png \ No newline at end of file diff --git a/functions.lua b/functions.lua index b6bab4e..32b7e9f 100644 --- a/functions.lua +++ b/functions.lua @@ -19,10 +19,45 @@ function boost_cart:is_rail(pos) return minetest.get_item_group(node, "rail") ~= 0 end -function boost_cart:get_rail_direction(pos_, dir_) +function boost_cart:get_rail_direction(pos_, dir_, ctrl, old_switch) local pos = vector.round(pos_) local dir = vector.new(dir_) local cur = nil + local left_check, right_check = true, true + old_switch = old_switch or 0 + + -- Check left and right + local left = {x=0, y=0, z=0} + local right = {x=0, y=0, z=0} + if dir.z ~= 0 and dir.x == 0 then + left.x = -dir.z + right.x = dir.z + elseif dir.x ~= 0 and dir.z == 0 then + left.z = dir.x + right.z = -dir.x + end + + if ctrl then + if old_switch == 1 then + left_check = false + elseif old_switch == 2 then + right_check = false + end + if ctrl.left and left_check then + cur = vector.add(pos, left) + if boost_cart:is_rail(cur) then + return left, 1 + end + left_check = false + end + if ctrl.right and right_check then + cur = vector.add(pos, right) + if boost_cart:is_rail(cur) then + return right, 2 + end + right_check = true + end + end -- Front dir.y = 0 @@ -45,58 +80,20 @@ function boost_cart:get_rail_direction(pos_, dir_) return dir end - -- Left, right - dir.y = 0 - - -- Check left and right - local view, opposite, val - - if dir.x == 0 and dir.z ~= 0 then - view = "z" - other = "x" - if dir.z < 0 then - val = {1, -1} - else - val = {-1, 1} + -- Left, if not already checked + if left_check then + cur = vector.add(pos, left) + if boost_cart:is_rail(cur) then + return left end - elseif dir.z == 0 and dir.x ~= 0 then - view = "x" - other = "z" - if dir.x > 0 then - val = {1, -1} - else - val = {-1, 1} + end + + -- Right, if not already checked + if right_check then + cur = vector.add(pos, right) + if boost_cart:is_rail(cur) then + return right end - else - return {x=0, y=0, z=0} - end - - dir[view] = 0 - dir[other] = val[1] - cur = vector.add(pos, dir) - if boost_cart:is_rail(cur) then - return dir - end - - -- Down - dir.y = -1 - cur = vector.add(pos, dir) - if boost_cart:is_rail(cur) then - return dir - end - dir.y = 0 - - dir[other] = val[2] - cur = vector.add(pos, dir) - if boost_cart:is_rail(cur) then - return dir - end - - -- Down - dir.y = -1 - cur = vector.add(pos, dir) - if boost_cart:is_rail(cur) then - return dir end return {x=0, y=0, z=0} diff --git a/init.lua b/init.lua index 9c56ae4..6e86bfa 100644 --- a/init.lua +++ b/init.lua @@ -29,7 +29,8 @@ boost_cart.cart = { punch = false, -- used to re-send velocity and position velocity = {x=0, y=0, z=0}, -- only used on punch old_dir = {x=0, y=0, z=0}, - old_pos = nil + old_pos = nil, + old_switch = nil } function boost_cart.cart:on_rightclick(clicker) @@ -42,7 +43,7 @@ function boost_cart.cart:on_rightclick(clicker) clicker:set_detach() elseif not self.driver then self.driver = player_name - clicker:set_attach(self.object, "", {x=0, y=5, z=0}, {x=0, y=0, z=0}) + clicker:set_attach(self.object, "", {x=0,y=0.5,z=0}, {x=0,y=0,z=0}) end end @@ -57,6 +58,7 @@ function boost_cart.cart:on_punch(puncher, time_from_last_punch, tool_capabiliti if puncher:get_player_control().sneak then if self.driver then + default.player_attached[self.driver] = nil local player = minetest.get_player_by_name(self.driver) if player then player:set_detach() @@ -111,7 +113,7 @@ function boost_cart.cart:on_step(dtime) return end - local dir = false + local dir, last_switch = nil, nil local pos = self.object:getpos() if self.old_pos and not self.punch then local flo_pos = vector.floor(pos) @@ -120,12 +122,19 @@ function boost_cart.cart:on_step(dtime) return end end + local ctrl = nil + if self.driver then + local player = minetest.get_player_by_name(self.driver) + if player then + ctrl = player:get_player_control() + end + end if self.old_pos then local diff = vector.subtract(self.old_pos, pos) for _,v in ipairs({"x","y","z"}) do if math.abs(diff[v]) > 1.2 then local expected_pos = vector.add(self.old_pos, self.old_dir) - dir = boost_cart:get_rail_direction(pos, self.old_dir) + dir, last_switch = boost_cart:get_rail_direction(pos, self.old_dir, ctrl, self.old_switch) if vector.equals(dir, {x=0, y=0, z=0}) then dir = false pos = vector.new(expected_pos) @@ -154,7 +163,7 @@ function boost_cart.cart:on_step(dtime) local max_vel = boost_cart.speed_max if not dir then - dir = boost_cart:get_rail_direction(pos, cart_dir) + dir, last_switch = boost_cart:get_rail_direction(pos, cart_dir, ctrl, self.old_switch) end if vector.equals(dir, {x=0, y=0, z=0}) then vel = {x=0, y=0, z=0} @@ -194,9 +203,13 @@ function boost_cart.cart:on_step(dtime) end end end - acc = acc + (speed_mod * 7) + acc = acc + (speed_mod * 8) else acc = acc - 0.4 + -- Handbrake + if ctrl and ctrl.down then + acc = acc - 0.8 + end end local new_acc = { @@ -210,6 +223,7 @@ function boost_cart.cart:on_step(dtime) self.old_pos = vector.new(pos) self.old_dir = vector.new(dir) + self.old_switch = last_switch -- Limits for _,v in ipairs({"x","y","z"}) do diff --git a/textures/carts_rail_brk.png b/textures/carts_rail_brk.png index f3e0ff9827359b670d25f3add9c2fb6f109397d7..2717bd5a30b53acc572db8050d97a961e89de748 100644 GIT binary patch delta 552 zcmV+@0@wYF1i=K5B!2;OQb$4nuFf3k00004XF*Lt006O%3;baP0000WV@Og>004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00009a7bBm000XT000XT0n*)m z`~Uy|2XskIMF-sh2^2LtT@KU30000QbVXQnQ*UN;cVTj60Dn+nX>N2bPDNB8b~7$D zE-^7j^FlWO00D7HL_t(IPtB9dO9D|8#{DxQ$I;wYWaBHXO{>BlR;Dg=mk}yDzMnmm zLWwp-C}o9IMn#K)!XW5x`#N`MuDEDr3ol&moSDPN{J!&DjplcKeRtvYdq5@Ie=Vhl z_4YM<*5{O$?0@4~bPCrQGdcw;?($YV?b((3A}OJ^HO>XvSxZkOvLtYUqEC;|;wZ8n zJ@Q^XQtKjQw}>R2m7tLe#8!3ve=!gO;~7ZczG&qLmnjL2xCw8E4!j>Zag{dXdDo8H zoCU|*6CB~A=IkLH1je{P#v>x^5|G}|BSStE$cN;bh=1s^fH-lhQ>X-t!{ot3$;J_y z@-*66GtOfsw9*o~^;tA!6JZhg=pzQks_R38(Y*S zB*8*jMC%rYg5WA?<75hsAVy4)_{z}{o!7iKbMHGXX68|gHr2up&gO9Wedm1K18prW zF9^`7KS=;-zXiYmEIz!RHJ*%KBp(>*Hh-E_!1pz^y2U!-@Hn9`R|4S0y&<{%sHhCU z{7RXT;T9m=KVtv5$+>(NT0_$cE(NXOY~Ey}tZje$eYU?{LGzC?052!6WW?EtL99)s z??Qm56k#=?CosefM_7%y|9lgGH&fT-R^eSMgO6V-^tJ&zpDRT5luuthlmeq6X@3e0 zo8oDeITuUeY0BVLVK^hsj9nt|wbWuq&e!yx4=9HbewU{9!!bUy0l?hd%W~)O`&I_4 zr9E!mXaTm%6^y5;HyoaVz0fC09M%fyFV4lSQ~y1~R<;uuFGNQ%_RP`_b+wC9DA7w1N?8$=QPD#|QGedonWY`+r5Af}U^qK7XFm4# zoihf*&nQQOnD&f;hT*Tta#*f@Pm5oTNo|uIo+hlg%GuE=IdNBX;%V2dtKns< zS`N#-$ve6t@i~DDs38f_*+Jxk5{hdQwwFaH0TCIB)rf@)Bo|G;|Dq=ZhS8J2z3Su$ z7uzzLDI4Anym&wK;WBH-^Nt(01qY5cM>xVq-Pc9f4-avHTu?;JFCe=jAxA!x$cN05 zh{U{r6mjb&R>PKl^5CKD;s`BeoN8=;$63;bc2>q`V*)M3M!g{8ByQyh*VG%lnbH9h z7f|S%@yCfdxgelMtc6wT2l63JQ}-a|H};bUZK}QANUt?7I;snd@px+#FMA$5R@~Yf zX_7BG0$Xzr7^5!0Sj+2Xt@ag)YRIhBpS_3ZjFAgOrUw4UgKush;6(MYYOeqb0000< KMNUMnLSTYaX~Ag# delta 415 zcmV;Q0bu@$1c?NYJPHv201FWTe`H^gkw!d!a!Eu%R5(w~lgmp2Q544gGa|3LV^&xwCmNetKU_-Csz zdsy#n(LNAKEDBse2}_7AjH4KmP~MP`3yP2fBC=HLQ4<$Ptr&j)#ZU+gV<>?K#laCS zb5^v|7Q7$2@p0tARo;e|T^H_3cIuhp2%k;Q0O24q!37E-5plnO{F;OU`A{Jrva2GJ zO9Ilwt(jPlm`2Hi$EuSfbmSSDu?^>cDGR!JE52G@bYu%7MZ?h&i<^ph2vqb;<+zkYQf*gB17cN6CXO&0Y)ATf>c>;sj$n*_p=c{w$tqF7=GG z$rlZQ?YRexQ4?US)lH*1`x;dxY*gpZ&O^+n=K|6BvH$Vl2Mh}8WN?+{xc~qP002ov JPDHLkV1h-S#7Y1F diff --git a/textures/carts_rail_crossing_brk.png b/textures/carts_rail_crossing_brk.png index 3ace508bb5f94d0200a43e87cacb9969f7b9b58f..f9ce303a36fc09ad1dadb55c916c9b91f1aa7205 100644 GIT binary patch delta 524 zcmV+n0`vXy1EmCzB!2;OQb$4nuFf3k00004XF*Lt006O%3;baP0000WV@Og>004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00009a7bBm000XT000XT0n*)m z`~Uy|2XskIMF-sh2^2LI_TTQB0000QbVXQnQ*UN;cVTj60Dn+nX>N2bPDNB8b~7$D zE-^7j^FlWO00C7=L_t(IPh((!f?a#J{SOTf{tx7WFfIUA15%5j0NH@@AgTY$s!ZXE za=j&hd^51&7zThe!Z1t{SqzM2vKMNA26m_E!W9(xOZ=Y= zGyrQXU`q!Dz7qfE0-X+%1G#WUAsz#kR3gFvi_0DlDeeMzP1|LzRk|5I`e{!hr( z2V+m1^|C3zHf2ah=c$D O002ovP6b4+LSTaX#K}+q delta 455 zcmV;&0XY7p1o8urBqRo6OGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEVXR z6@LMLNkl;6Ff#LgQna@&~Z6 zQWKHyjkSgHA6OwW!ZgMpg@q)|cr0+|rPoKCx{LeVb5Hkq&bjc0&8-aq-q%+UK;F0j zSj<=>zCu|IcoeCx)h4R}uc@$RRBLK%VSjULgYWQ}qy6yYA7L@fKoxtMt;`P9sC}@b zh^0{vW?T!Ptp&ZRFx_8GeRT;rSvqt68s`0OoaGMg9}}zuQoO}cH-M%C92~`|Yj{04 ziC*!H;I4467rx*rkt91)r?j|$?Y%Q4up5ql?8Rtfu+t$ET~0Nd!8V)B47udjHhW|xH#kC<`)9VFct xioZnJ)JDJ0E|c8`8{6%&K3;2TBN+ev&M(oXzde{#DX9Pe002ovPDHLkV1kjL)UyBp diff --git a/textures/carts_rail_crossing_cp.png b/textures/carts_rail_crossing_cp.png index 6b55059b6eda77004d449679e05212b4ad0f9cbe..b04aa638245ea9d5d691114c13a679cbf3a00218 100644 GIT binary patch delta 388 zcmV-~0ek-N1MdTnJPHs101FTSts}j4kw!d!SV=@dR5(wiQ*BPdKoIRIv>#jnKY#)U z@Q)!{LQvfMShu)NOQ8`}L{RMx2YE itNik9Ty&qK=HM5Wp|2Z+#|#l7s6dg# z0~kZJKoq@zN`e?#DHLh&x4|Ep7?t2h1e9pJ<2bXj+l3ZG(k7E`cV=JTdo!yj)93nl z8>+=Ez=v;z-jt&nstqM&fL2L|&r4Gj)$%HSXBl`1fDZEDNqKL6Jzv8R3CxE**vItOSVX&<+6P3TpUa9>-8+v*w%?m^#4Ngf;p9&`>2pdiyXs0BCX#qS{Ew{**H1ZA*jq)`B+186rB%1}N4jN8LsjwcngdZN$0w jxymiy#zprzY7Tw@{Jp{V^_~Ic00000NkvXXu0mjfd|004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00009a7bBm000XT000XT0n*)m z`~Uy|2XskIMF-sh2^2ODAdo~O0000QbVXQnQ*UN;cVTj60Dn+nX>N2bPDNB8b~7$D zE-^7j^FlWO00B@*L_t(IPh()9CumR7_`j&!& zpaJL_ivs2TPs%X>c>{(q&8Uu4`M;#X6zo)(Z7>blJ~IE8RGQ%rhtgmI_ zU;<0ve2NDA*))%`oFDLgoM0#i;(DQHXFhC^mXC^&p1U z#i;#nNz_IUI27j<2g!rIvj`YFAn)b)$|4Lb3z3IwUVqbI@qb~t>Hqm<2q(i#0@>P` zq6tg~`pD4>k%l=RqzDvMIleOgSJasQpI>V7e>sqb8uGs)Q~|6RmcZc7#OD88pdlGv zGXL}ZWdEOV delta 512 zcmV+b0{{J>1giv)BqRo6OGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEVXR z6@LM^NklNEq}Vs0b>IWagb|?tGjUI=30UhHg5$_dT5F`8^yC z{LgxE=aS5hU6Ja)z;OiDH*LCZPhrMzMSs*$hfT{6fLKrO@vu$HkiB66M2|=0?V}F& z?HOUb|AJhOo}%&QvjdL#LYaoJ=F&L1hSq=qlbT(VpC_n!~8 z$OpYsJPAz8kcx9=E64K2Pu@IiuMye&xPty3msNCc~*>>jp z%l@xQ2}Z$08wS(pVxjkusn%=%&knQ(W4I+S=Ytf1qAJH%=KqQs^Z)ZpP5v(j(y(Z( z2vq=UgryG*1Cafm3p6CdOXh!`pX~qDb>{zP7aPMh7Y53LU5eKL@P2>Oo delta 168 zcmV;Z09XI&1Lp&fJPHv201FWTe`H^gkw!cxP)S5VR5(v#V4x>xPty3msNCc~*>>jp z%l_|7bw|NO8wS&u9ccZLsn%%2qZe)o%=sWips336mHEG-#{B>MQj`D7fix@{D?$~( znqdhH!vJKz=K>AM@RIqT=O_Drb)EVD*~P|i&4q!oV3*=G067dm842V%nC)|*u>t_U WE*`wO_ub_H0000004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00009a7bBm000XT000XT0n*)m z`~Uy|2XskIMF-sj3K1D7`8fAL0000QbVXQnQ*UN;cVTj60Dn+nX>N2bPDNB8b~7$D zE-^7j^FlWO00CM_L_t(IPh((!f?a#J{SOTf{tx7WFfIUA15%5kV0*g_SP&#RFzODatNFDf_vzoOP0%%4$c^uH}x8*ae-QWJzBS>7^m11iJh|EG9J{Vxrc|6d*| z|Gy|u?ti|&+<*T!TInieWB6izDFK<hJ!+#hBBm&w}G!GK;I>*!LRRAUjZ_Ci!SET_y zuWnGe{|E5R+2&H4W_vf{;(3i9#ZKHk4ORJOn;&%G7T$JuMyBUSff-dGxqQ%OVyrZhkuQL ztiP=tALr*T)6cr(%z&(>KCG$DEswqZfcY2qFv6LAI22USqzMQQQ4H*jY_&XNN<nu*Vw7h-eor@43bAs3j002ovPDHK)LSTY% Ca=Cc` delta 399 zcmV;A0dW3;1o{JzJPHv201FWTe`H^gkw!d!V@X6oR5(wSli5ncKoo}i9%iYc7H_mQ zmKJ;faW~cq#e&{Q)wZUwixD*ndgFzN3tDg~f}mjE@pn#e#tCUj92f>>&V2KqGyjRj ze#h1J49ey-*x*}%mCh)JVtt37CmC;(4%@X9-Wmq(t4Tbtc~?o|(MsXAJb@>+a=^`h z-uNG6cU}>I15?A<#tf#){=^&^*HPm4W-!u0iXwcO2Sg$7f69TMJoLOy)M!o z)x%dW8E{+}#)p#@Y4PIrEh5Q~0nMByF3T@P25{KrRsvl&E2004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00009a7bBm000XT000XT0n*)m z`~Uy|2XskIMF-sj3K16#EWZwk0000QbVXQnQ*UN;cVTj60Dn+nX>N2bPDNB8b~7$D zE-^7j^FlWO00Ci1L_t(IPh((!f?a#J{SOTf{{R0!!+)3%QvXYX z<^Pw5%KtA4lz;o5?=Sbi5J)$~D8UT?S%~5iWG{gHfev6AK(0i_aCI;PAmM;80GmdT z7$`j8;kCHZ6z&C(0U$qbXtqQVgK2;T;+8fmge~>aig3j+m!Nuy;eWP|%>O(;S$G&U zL@S~C6IlbUD8(6#pn#yrfTdMt1idh)#OVKoEPc2a=6?di2_6Fl{<0_mRvaY%KMUw* z)R=*UIxG+~y`-^+0Z0LI8Xzhf(Zc{+Ucj4>W)&I1ox8r#^8b=bv;QDJcBkw9UtMSM ze|fbzIFC%tHNc*f%R=Pg1{4Lz{jUmF_+JR5tATW7m;yNdLHQxYT^epcjH3kZbU;dW a1_0b9%MtwylOVb_NAq(zbH)aEet)amY)lTF;7Ky1#j1}0bp_iJYHM{Su7-@* z_~3CJdh|(bfOj7YTs*g4_~I_HyTfK_*<)9`O}XmR5w@s!bxKtq_8bD>m@`V=L1kkL z=~Ra4sVpMMX8R4>=~Sj^-{wCEBK8mT5j}sQwZP5ZBieOfFP+g5L!6$<0uW0$0Ds11 zpn&IjhTI^EAVCuf1qnn4CrGC3DV98nrE*iORnZVY zrBXG8cvpdEH%{~Pdb8!RSyu`_i*9BeOE|<54*w)^zxRQiVT)g@HO@x%QLg%gcUbh^ zc`vGHBM1EheZfH*o1HiP3uw)UHd~k(?$*c2HA8;=@G|2s7G%pPKX~=kI21vxkU-nP f_0M#;6IkF66tvBi8)$xS00000NkvXXu0mjf68H6T diff --git a/textures/default_rail_t_junction.png b/textures/default_rail_t_junction.png new file mode 100644 index 0000000000000000000000000000000000000000..a72d7ab8d164d7c96f05f8abc19171d7cb78c895 GIT binary patch literal 495 zcmVN2bPDNB8 zb~7$DE-^7j^FlWO00C=BL_t(IPh((!f?a#J{SOTf{tx5hqCsjvYEk63x7&aPL6Q@* z_5aT)G5)`#!u0>5a?}4SYR$p?8HGmw+mf}xYCvk|mzp39$?}$g8&DZ0|3Ae;>VIjl z{QvS$`Ts?Ma{u%F<^C4}>4q33xB(zTP+S6Y!TcG9QrOgWA%=&0WxMG+~U~~mA90~*E{%8Bh z{Lk}~g&WWit%T}N5gwq6AoRko^BFpr4UrrU)1g1wah*LZ+8A_Ao$C&O}8cav0#s19%hCtRf@0bJsUo z{$EmQ_8;WO?sVP%tLrTOFRwNS=aH$o2H2BwS%^H`0FYm+!WF=AUk#)y!xX^r56TZI l?$U4rVjLx~hXJYC82}{#ozK=q!#w~1002ovPDHLkV1lG<)Aj%W literal 0 HcmV?d00001