From 1f18ca6aa266a41a73d1bac844d10bde75dc95b5 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 5 Jan 2017 15:23:14 +0100 Subject: [PATCH] Add basic minecarts and powered rails --- mods/default/nodes.lua | 2 +- mods/mcl_minecarts/README.txt | 31 ++ mods/mcl_minecarts/depends.txt | 2 + mods/mcl_minecarts/functions.lua | 150 ++++++++ mods/mcl_minecarts/init.lua | 290 +++++++++++++++ mods/mcl_minecarts/mod.conf | 1 + mods/mcl_minecarts/models/cart.png | Bin 0 -> 216 bytes mods/mcl_minecarts/models/cart.x | 339 ++++++++++++++++++ mods/mcl_minecarts/rails.lua | 46 +++ mods/mcl_minecarts/textures/cart_bottom.png | Bin 0 -> 114 bytes mods/mcl_minecarts/textures/cart_side.png | Bin 0 -> 147 bytes mods/mcl_minecarts/textures/cart_top.png | Bin 0 -> 131 bytes .../textures/carts_rail_crossing_pwr.png | Bin 0 -> 458 bytes .../textures/carts_rail_curved_pwr.png | Bin 0 -> 443 bytes .../mcl_minecarts/textures/carts_rail_pwr.png | Bin 0 -> 729 bytes .../textures/carts_rail_t_junction_pwr.png | Bin 0 -> 539 bytes mods/mcl_minecarts/textures/minecart.png | Bin 0 -> 7434 bytes .../mcl_minecarts/textures/rail_activator.png | Bin 0 -> 6915 bytes .../textures/rail_activator_powered.png | Bin 0 -> 6915 bytes mods/mcl_minecarts/textures/rail_detector.png | Bin 0 -> 636 bytes .../textures/rail_detector_powered.png | Bin 0 -> 3504 bytes .../textures/rail_golden_powered.png | Bin 0 -> 778 bytes mods/mcl_minecarts/textures/rail_normal.png | Bin 0 -> 357 bytes .../textures/rail_normal_turned.png | Bin 0 -> 448 bytes 24 files changed, 860 insertions(+), 1 deletion(-) create mode 100644 mods/mcl_minecarts/README.txt create mode 100644 mods/mcl_minecarts/depends.txt create mode 100644 mods/mcl_minecarts/functions.lua create mode 100644 mods/mcl_minecarts/init.lua create mode 100644 mods/mcl_minecarts/mod.conf create mode 100644 mods/mcl_minecarts/models/cart.png create mode 100644 mods/mcl_minecarts/models/cart.x create mode 100644 mods/mcl_minecarts/rails.lua create mode 100644 mods/mcl_minecarts/textures/cart_bottom.png create mode 100644 mods/mcl_minecarts/textures/cart_side.png create mode 100644 mods/mcl_minecarts/textures/cart_top.png create mode 100644 mods/mcl_minecarts/textures/carts_rail_crossing_pwr.png create mode 100644 mods/mcl_minecarts/textures/carts_rail_curved_pwr.png create mode 100644 mods/mcl_minecarts/textures/carts_rail_pwr.png create mode 100644 mods/mcl_minecarts/textures/carts_rail_t_junction_pwr.png create mode 100644 mods/mcl_minecarts/textures/minecart.png create mode 100644 mods/mcl_minecarts/textures/rail_activator.png create mode 100644 mods/mcl_minecarts/textures/rail_activator_powered.png create mode 100644 mods/mcl_minecarts/textures/rail_detector.png create mode 100644 mods/mcl_minecarts/textures/rail_detector_powered.png create mode 100644 mods/mcl_minecarts/textures/rail_golden_powered.png create mode 100644 mods/mcl_minecarts/textures/rail_normal.png create mode 100644 mods/mcl_minecarts/textures/rail_normal_turned.png diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 42a255036..927fdbc4f 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -872,7 +872,7 @@ minetest.register_node("default:rail", { fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, }, stack_max = 64, - groups = {bendy=2,dig_immediate=2,attached_node=1}, + groups = {dig_immediate=2,attached_node=1,rail=1,connect_to_raillike=1}, }) minetest.register_node("default:ladder", { diff --git a/mods/mcl_minecarts/README.txt b/mods/mcl_minecarts/README.txt new file mode 100644 index 000000000..e7873e6e7 --- /dev/null +++ b/mods/mcl_minecarts/README.txt @@ -0,0 +1,31 @@ +mcl_minecarts +============= +Based on the mod "boost_carts" by Krock. +Target: Run smoothly and do not use too much CPU. + +TODO: +- Make minecart smaller +- Minecraft-like physics +- Change minecart model and textures +- Add activator rail +- Add more rail textures +- Add loaded minecarts + +License of source code: +----------------------- +WTFPL + +License of media (textures, sounds and models): +----------------------------------------------- +CC-0 + +Authors of media files: +----------------------- +kddekadenz: + cart_bottom.png + cart_side.png + cart_top.png + +Zeg9: + cart.x + cart.png diff --git a/mods/mcl_minecarts/depends.txt b/mods/mcl_minecarts/depends.txt new file mode 100644 index 000000000..1b3c7979f --- /dev/null +++ b/mods/mcl_minecarts/depends.txt @@ -0,0 +1,2 @@ +default +mesecons? diff --git a/mods/mcl_minecarts/functions.lua b/mods/mcl_minecarts/functions.lua new file mode 100644 index 000000000..1a298841e --- /dev/null +++ b/mods/mcl_minecarts/functions.lua @@ -0,0 +1,150 @@ +function mcl_minecarts:get_sign(z) + if z == 0 then + return 0 + else + return z / math.abs(z) + end +end + +function mcl_minecarts:velocity_to_dir(v) + if math.abs(v.x) > math.abs(v.z) then + return {x=mcl_minecarts:get_sign(v.x), y=mcl_minecarts:get_sign(v.y), z=0} + else + return {x=0, y=mcl_minecarts:get_sign(v.y), z=mcl_minecarts:get_sign(v.z)} + end +end + +function mcl_minecarts:is_rail(pos, railtype) + local node = minetest.get_node(pos).name + if node == "ignore" then + local vm = minetest.get_voxel_manip() + local emin, emax = vm:read_from_map(pos, pos) + local area = VoxelArea:new{ + MinEdge = emin, + MaxEdge = emax, + } + local data = vm:get_data() + local vi = area:indexp(pos) + node = minetest.get_name_from_content_id(data[vi]) + end + if minetest.get_item_group(node, "rail") == 0 then + return false + end + if not railtype then + return true + end + return minetest.get_item_group(node, "connect_to_raillike") == railtype +end + +function mcl_minecarts:check_front_up_down(pos, dir_, check_down, railtype) + local dir = vector.new(dir_) + local cur = nil + + -- Front + dir.y = 0 + cur = vector.add(pos, dir) + if mcl_minecarts:is_rail(cur, railtype) then + return dir + end + -- Up + if check_down then + dir.y = 1 + cur = vector.add(pos, dir) + if mcl_minecarts:is_rail(cur, railtype) then + return dir + end + end + -- Down + dir.y = -1 + cur = vector.add(pos, dir) + if mcl_minecarts:is_rail(cur, railtype) then + return dir + end + return nil +end + +function mcl_minecarts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) + local pos = vector.round(pos_) + local cur = nil + local left_check, right_check = true, true + + -- 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 = mcl_minecarts:check_front_up_down(pos, left, false, railtype) + if cur then + return cur, 1 + end + left_check = false + end + if ctrl.right and right_check then + cur = mcl_minecarts:check_front_up_down(pos, right, false, railtype) + if cur then + return cur, 2 + end + right_check = true + end + end + + -- Normal + cur = mcl_minecarts:check_front_up_down(pos, dir, true, railtype) + if cur then + return cur + end + + -- Left, if not already checked + if left_check then + cur = mcl_minecarts:check_front_up_down(pos, left, false, railtype) + if cur then + return cur + end + end + + -- Right, if not already checked + if right_check then + cur = mcl_minecarts:check_front_up_down(pos, right, false, railtype) + if cur then + return cur + end + end + + -- Backwards + if not old_switch then + cur = mcl_minecarts:check_front_up_down(pos, { + x = -dir.x, + y = dir.y, + z = -dir.z + }, true, railtype) + if cur then + return cur + end + end + + return {x=0, y=0, z=0} +end + +function mcl_minecarts:boost_rail(pos, amount) + minetest.get_meta(pos):set_string("cart_acceleration", tostring(amount)) + for _,obj_ in ipairs(minetest.get_objects_inside_radius(pos, 0.5)) do + if not obj_:is_player() and + obj_:get_luaentity() and + obj_:get_luaentity().name == "mcl_minecarts:minecart" then + obj_:get_luaentity():on_punch() + end + end +end diff --git a/mods/mcl_minecarts/init.lua b/mods/mcl_minecarts/init.lua new file mode 100644 index 000000000..f6bb851aa --- /dev/null +++ b/mods/mcl_minecarts/init.lua @@ -0,0 +1,290 @@ +mcl_minecarts = {} +mcl_minecarts.modpath = minetest.get_modpath("mcl_minecarts") +mcl_minecarts.speed_max = 10 + +function vector.floor(v) + return { + x = math.floor(v.x), + y = math.floor(v.y), + z = math.floor(v.z) + } +end + +dofile(mcl_minecarts.modpath.."/functions.lua") +dofile(mcl_minecarts.modpath.."/rails.lua") + +mcl_minecarts.cart = { + physical = false, + collisionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + visual = "mesh", + mesh = "cart.x", + visual_size = {x=1, y=1}, + textures = {"cart.png"}, + + driver = nil, + punched = 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_switch = 0, + railtype = nil, +} + +function mcl_minecarts.cart:on_rightclick(clicker) + if not clicker or not clicker:is_player() then + return + end + local player_name = clicker:get_player_name() + if self.driver and player_name == self.driver then + self.driver = nil + clicker:set_detach() + elseif not self.driver then + self.driver = player_name + default.player_attached[player_name] = true + clicker:set_attach(self.object, "", {x=0, y=3, z=0}, {x=0, y=0, z=0}) + end +end + +function mcl_minecarts.cart:on_activate(staticdata, dtime_s) + self.object:set_armor_groups({immortal=1}) +end + +function mcl_minecarts.cart:on_punch(puncher, time_from_last_punch, tool_capabilities, direction) + local pos = self.object:getpos() + if not self.railtype then + local node = minetest.get_node(vector.floor(pos)).name + self.railtype = minetest.get_item_group(node, "connect_to_raillike") + end + + if not puncher or not puncher:is_player() then + local cart_dir = mcl_minecarts:get_rail_direction(pos, {x=1, y=0, z=0}, nil, nil, self.railtype) + if vector.equals(cart_dir, {x=0, y=0, z=0}) then + return + end + self.velocity = vector.multiply(cart_dir, 3) + self.old_pos = nil + self.punched = true + return + end + + if puncher:get_player_control().sneak then + if self.driver then + if self.old_pos then + self.object:setpos(self.old_pos) + end + default.player_attached[self.driver] = nil + local player = minetest.get_player_by_name(self.driver) + if player then + player:set_detach() + end + end + + self.object:remove() + puncher:get_inventory():add_item("main", "mcl_minecarts:minecart") + return + end + + local vel = self.object:getvelocity() + if puncher:get_player_name() == self.driver then + if math.abs(vel.x + vel.z) > 7 then + return + end + end + + local punch_dir = mcl_minecarts:velocity_to_dir(puncher:get_look_dir()) + punch_dir.y = 0 + local cart_dir = mcl_minecarts:get_rail_direction(pos, punch_dir, nil, nil, self.railtype) + if vector.equals(cart_dir, {x=0, y=0, z=0}) then + return + end + + time_from_last_punch = math.min(time_from_last_punch, tool_capabilities.full_punch_interval) + local f = 3 * (time_from_last_punch / tool_capabilities.full_punch_interval) + + self.velocity = vector.multiply(cart_dir, f) + self.old_pos = nil + self.punched = true +end + +function mcl_minecarts.cart:on_step(dtime) + local vel = self.object:getvelocity() + local update = {} + if self.punched then + vel = vector.add(vel, self.velocity) + self.object:setvelocity(vel) + self.old_dir.y = 0 + elseif vector.equals(vel, {x=0, y=0, z=0}) then + return + end + + local dir, last_switch = nil, nil + local pos = self.object:getpos() + if self.old_pos and not self.punched then + local flo_pos = vector.floor(pos) + local flo_old = vector.floor(self.old_pos) + if vector.equals(flo_pos, flo_old) then + return + end + end + + local ctrl, player = nil, nil + if self.driver then + 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.1 then + local expected_pos = vector.add(self.old_pos, self.old_dir) + dir, last_switch = mcl_minecarts:get_rail_direction(pos, self.old_dir, ctrl, self.old_switch, self.railtype) + if vector.equals(dir, {x=0, y=0, z=0}) then + dir = false + pos = vector.new(expected_pos) + update.pos = true + end + break + end + end + end + + if vel.y == 0 then + for _,v in ipairs({"x", "z"}) do + if vel[v] ~= 0 and math.abs(vel[v]) < 0.9 then + vel[v] = 0 + update.vel = true + end + end + end + + local cart_dir = mcl_minecarts:velocity_to_dir(vel) + local max_vel = mcl_minecarts.speed_max + if not dir then + dir, last_switch = mcl_minecarts:get_rail_direction(pos, cart_dir, ctrl, self.old_switch, self.railtype) + end + + local new_acc = {x=0, y=0, z=0} + if vector.equals(dir, {x=0, y=0, z=0}) then + vel = {x=0, y=0, z=0} + update.vel = true + else + -- If the direction changed + if dir.x ~= 0 and self.old_dir.z ~= 0 then + vel.x = dir.x * math.abs(vel.z) + vel.z = 0 + pos.z = math.floor(pos.z + 0.5) + update.pos = true + end + if dir.z ~= 0 and self.old_dir.x ~= 0 then + vel.z = dir.z * math.abs(vel.x) + vel.x = 0 + pos.x = math.floor(pos.x + 0.5) + update.pos = true + end + -- Up, down? + if dir.y ~= self.old_dir.y then + vel.y = dir.y * math.abs(vel.x + vel.z) + pos = vector.round(pos) + update.pos = true + end + + -- Slow down or speed up.. + local acc = dir.y * -1.8 + + local speed_mod = tonumber(minetest.get_meta(pos):get_string("cart_acceleration")) + if speed_mod and speed_mod ~= 0 then + if speed_mod > 0 then + for _,v in ipairs({"x","y","z"}) do + if math.abs(vel[v]) >= max_vel then + speed_mod = 0 + break + end + end + end + acc = acc + (speed_mod * 8) + else + acc = acc - 0.4 + -- Handbrake + if ctrl and ctrl.down and math.abs(vel.x + vel.z) > 1.2 then + acc = acc - 1.2 + end + end + + new_acc = vector.multiply(dir, acc) + end + + self.object:setacceleration(new_acc) + 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 + if math.abs(vel[v]) > max_vel then + vel[v] = mcl_minecarts:get_sign(vel[v]) * max_vel + update.vel = true + end + end + + if self.punched then + self.punched = false + end + + if not (update.vel or update.pos) then + return + end + + local yaw = 0 + if dir.x < 0 then + yaw = 0.5 + elseif dir.x > 0 then + yaw = 1.5 + elseif dir.z < 0 then + yaw = 1 + end + self.object:setyaw(yaw * math.pi) + + local anim = {x=0, y=0} + if dir.y == -1 then + anim = {x=1, y=1} + elseif dir.y == 1 then + anim = {x=2, y=2} + end + self.object:set_animation(anim, 1, 0) + + self.object:setvelocity(vel) + if update.pos then + self.object:setpos(pos) + end + update = nil +end + +minetest.register_entity("mcl_minecarts:minecart", mcl_minecarts.cart) +minetest.register_craftitem("mcl_minecarts:minecart", { + description = "Minecart", + inventory_image = minetest.inventorycube("cart_top.png", "cart_side.png", "cart_side.png"), + wield_image = "cart_side.png", + on_place = function(itemstack, placer, pointed_thing) + if not pointed_thing.type == "node" then + return + end + if mcl_minecarts:is_rail(pointed_thing.under) then + minetest.add_entity(pointed_thing.under, "mcl_minecarts:minecart") + elseif mcl_minecarts:is_rail(pointed_thing.above) then + minetest.add_entity(pointed_thing.above, "mcl_minecarts:minecart") + else return end + + itemstack:take_item() + return itemstack + end, +}) + +minetest.register_craft({ + output = "mcl_minecarts:minecart", + recipe = { + {"default:steel_ingot", "", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + }, +}) diff --git a/mods/mcl_minecarts/mod.conf b/mods/mcl_minecarts/mod.conf new file mode 100644 index 000000000..5661f8b9c --- /dev/null +++ b/mods/mcl_minecarts/mod.conf @@ -0,0 +1 @@ +name = mcl_minecarts diff --git a/mods/mcl_minecarts/models/cart.png b/mods/mcl_minecarts/models/cart.png new file mode 100644 index 0000000000000000000000000000000000000000..d4b12d63ca534fbd5889e2def721946927aa4e4b GIT binary patch literal 216 zcmV;}04M*6P)}mX`nj|2pibZ~y=Ra!Eu%R47wpaB*=B4GnQ| zDKD>_Idgh>IfIiD7^ncbATXW5*?<8Em`yq%0y7wb1;N0yEiDuX(lU?)zL0000c9tirE9EoR`3Of}Yx&*5n-541*?-Bof)zQtG Qfq{X+)78&qol`;+00SBysQ>@~ literal 0 HcmV?d00001 diff --git a/mods/mcl_minecarts/textures/cart_side.png b/mods/mcl_minecarts/textures/cart_side.png new file mode 100644 index 0000000000000000000000000000000000000000..1bd55e7b3f450bab2659fff09a87f10649d9d4f7 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdqsCd_r6^!o$l_Q(KCQXLNSX z?CM%FZQ85WiDwuX7;HRU978ywlMT$wczJov%+eTw6a>yZ;7V*Uu+ZdWYMjJ1fsyTo wgp)v<(nOvOja@uFO$iDO2?h-_9Jm-3CJL3W-Bk6Ofq{X+)78&qol`;+0DsXdvH$=8 literal 0 HcmV?d00001 diff --git a/mods/mcl_minecarts/textures/cart_top.png b/mods/mcl_minecarts/textures/cart_top.png new file mode 100644 index 0000000000000000000000000000000000000000..b763025e2dc7e9aacefbe2b9ec454af07fe6d27e GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdqsCd_r6`Wn@g%)g28D{q5{B z!o$l_Q~y16mtf6bOe_duVisjfXJ%7KFiYeRV_^<{W&9xQ ffNrZLGsC~7f~&W>ZE|B^U|{fc^>bP0l+XkKWOpF# literal 0 HcmV?d00001 diff --git a/mods/mcl_minecarts/textures/carts_rail_crossing_pwr.png b/mods/mcl_minecarts/textures/carts_rail_crossing_pwr.png new file mode 100644 index 0000000000000000000000000000000000000000..dc317cfb2c58a6d0e05023ddc4521a1171af8242 GIT binary patch literal 458 zcmV;*0X6=KP)B=^BF3atgtQTk!^GnBCIH_Bl?Gs zBjCrHrGMYs-+3zUfuZ%#IycMRRZV`%mBA}Cz6xx01H+HJI9cg(dwhGJOymVHvU`J%-kQfi2v>0y)1Juivl!L;wH)07*qoM6N<$f|Grv AYXATM literal 0 HcmV?d00001 diff --git a/mods/mcl_minecarts/textures/carts_rail_curved_pwr.png b/mods/mcl_minecarts/textures/carts_rail_curved_pwr.png new file mode 100644 index 0000000000000000000000000000000000000000..4aef5ddf96acf22f1d7585d4c4e20fc3548c0342 GIT binary patch literal 443 zcmV;s0Yv_ZP)Z%-X?P#thk9&u3}a!?*}Q66(rA9Pb6byFU8R3CU%A9z(Dds!rXSs{L0 zC4O8cgIyzoUnhiMCxl@uhhiv+WGRhjDUE3^kZUiIYcG;)FOqC9m2WVZaWa~6GMjTV zoOCmtbTglIG@o`ep?5W+cQm4SHKceoq-X(tbRDGfH=Cnw*UVC|Ns9w z!sE~Y0004WQchCg7y lGWvO}Y%h^&FdiyT{sAw?4r}l0JeL3f002ovPDHLkV1mMaoihLc literal 0 HcmV?d00001 diff --git a/mods/mcl_minecarts/textures/carts_rail_pwr.png b/mods/mcl_minecarts/textures/carts_rail_pwr.png new file mode 100644 index 0000000000000000000000000000000000000000..53c8c37b5f19c14d09316d7513f8021ab1fe4e7e GIT binary patch literal 729 zcmV;~0w(>5P)!R?3_>vPp0usSUilQ4w%s=#or8_x4&Oq&ATBBm6K`6|`<+Pmc^LT1s-8=IbA)YQzMm zVE)d4pmhbiG-ny??WKapz^7X^V%laPYnRr#x~S68L3xh>tP3{q<*pHY26#As17(i^ ztPAdeuhT|Aybw3!|J=!80Y66Qur9a3Yd{YN#}5v-ZXhX!KOY+b@#3f*+W7}O zHU4IxgYn=V@EQ1<3FxpcxCfSIjG%R#f9`^E<5OQxGO*?p{F*a@*7Z9*z-jpB2Dp5x zot-q$-7TN``r<=FOxq0bVE+1t`ue;*@Z*6YCb$P+K=*)-AYRSTEj}_ra1Uq$oOPc8 zrhZ^c>jsiyxHM}7Uk~UgGSGdyX9R74_Y-aD0c~Kxw&23_I`jY*I~+q@6VN4XO4r;2IN|6RGUNLPo8maKdF6Hd z{$^DO-Vfkxs15LN;F?%D7gU7c9%%J&`YJ9H^WRR#&o38Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy32;bRa{vGf5&!@T5&_cPe*6Fc00(qQO+^RY0}2rr4J^M7i2wiq z8gxZibW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE-^7j^FlWO005s*OjJbx00960|5aC0 zTtOIQM;l~F8fi)!YD*kyOdM-W9Bxh>Z%-a@PaSbk9&u3~a!?*}Q66(rA9Yh7c2pmC zRUdg)A9+?FdRHKOS0H~|A%I&VfLtPmV=IeiEs$z2k!vrNZ7`T|GMaKSoOCjrbTgfF zGoN)dqIWf;c{QYXHKchqrFu4}dpD?kH>-X)uYozRgE_Q@I=6>By1lml{{T!V!ao22 z00MMUPE!B?c9YFG0001zNkljhva7>uYr>FRp@@UYt6B216Je!Y)JwvD}R;%9_d{=89 davomq-vBv`6yjJ8pkDw0002ovPDHLkV1oU_w`c$W literal 0 HcmV?d00001 diff --git a/mods/mcl_minecarts/textures/minecart.png b/mods/mcl_minecarts/textures/minecart.png new file mode 100644 index 0000000000000000000000000000000000000000..e91f8b314670a6c5425de04d82f786402b3934ee GIT binary patch literal 7434 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 X3MgZ~D^H;S001b;s>xJISp@wbsFMaB literal 0 HcmV?d00001 diff --git a/mods/mcl_minecarts/textures/rail_activator.png b/mods/mcl_minecarts/textures/rail_activator.png new file mode 100644 index 0000000000000000000000000000000000000000..6cce149ec4bacb154902fb85f54900d1921481a8 GIT binary patch literal 6915 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 literal 0 HcmV?d00001 diff --git a/mods/mcl_minecarts/textures/rail_detector.png b/mods/mcl_minecarts/textures/rail_detector.png new file mode 100644 index 0000000000000000000000000000000000000000..e73951d73d7cf09e9e2edc91db3de94ea9e90b1d GIT binary patch literal 636 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 e{tNyE@OJ>q{K8Dtjk)>&0000 z+iy%!6vk(!cm4&Psf@YUFT40o1Z1eETq}kuz>pQ1=eS4n(5e58so<~e7l@i8| zED^M>7-Q{?#9$q)t95~52F8yz3gsGj+z}zBWCMryttUnsm^dC5o(Dt1fjz4P@6cu; z-QFr3YikjpdvZD=XalHIvVqK*CIJiY-nueZ9H6-0K&G=vDA_>k#w0P?z~uR;Fi;f~ zTGl3L?>3XimUXcl&`n;53fchblx$$yiwjs7xPaB^xNT319ao1g#rc+(6yg z>0E4hQT>8(%yaI7nZf0P)^Xt*^|dtAP)FBlsuql6Ud0S_Wv5=RtC6?BzZEm^cE|`? zH&|OOubzwd$ujxlnCF}W??;S)_CmX%|4$uk7O)wi!#w94uo=+B!Tz1iIo*ewMsUu7 z&v%S~_TpCCwP_AKHU4Ix!#w94`0>C9egl6q0o}KIMsUu7pAU^-%K_eiJ=rBZ%O?DO z-w@;61-~8{LF;(ubN{0i_4t=jLrg^ta0vCz8`0yRZX04MX5eZlAWzO|*kgGEv)QMg z9sLhE00TM)bPM8WhVJWKBRJ;(HX#<~Ubh)wQajet^&vLi%ZLh zaW;S_(K_z^bahBtkl%tHe|9cPjI#k;F13zBi2n`!!MQ-v<5QPo#5m^wuGcyT{KvBY zXol`pZ$fa+fr*Z=V7ri@sNV#1FR#P}=NuS65f*eCGHu&ee6tHBJR^wO2L=0AOwzHV5#``o2F>Q)A1p z3BakQix*+;#+$3vsF$bpsA_sz zwXFm2!tU(>0N?=t%?3!B=SFQjmMw@XbKEYKTLnl(p$I_Dnco~l44~^~naBApfw0yU zhu$hO^mr=A8iiQ^xoYR2@gNAGZ-iN)uYu4sRNvl%(3)Tr`rWk+fIl(q;)z!Rpb(mG zm}4{p06GHTyjOGYV^RviFC-z%LP-I9?jOd(aBv9(2NnUc4-y3+HE#p4(7fJfi$eH) z@{7m0WKmCk)B^I`z2UMv_E*d)W81;0rDE5sD`ggK(P qD1eposoeyC#>r7!3!v}89KbIlN7S!aFj;p10000