From 0434f6b325e2b8c9d55bf4ada4c984c808586340 Mon Sep 17 00:00:00 2001 From: Joachim Stolberg Date: Fri, 14 May 2021 19:19:09 +0200 Subject: [PATCH] built on 14/05/2021 19:19:09 --- minecart/README.md | 152 +++++ minecart/api.lua | 52 ++ minecart/baselib.lua | 360 ++++++++++++ minecart/buffer.lua | 162 ++++++ minecart/depends.txt | 4 + minecart/doc.lua | 131 +++++ minecart/entitylib.lua | 318 ++++++++++ minecart/hopper.lua | 172 ++++++ minecart/hopper.png | Bin 0 -> 123622 bytes minecart/hopperlib.lua | 141 +++++ minecart/i18n.py | 469 +++++++++++++++ minecart/init.lua | 49 ++ minecart/license.txt | 54 ++ minecart/locale/minecart.de.tr | 58 ++ minecart/locale/template.txt | 53 ++ minecart/minecart.lua | 107 ++++ minecart/mod.conf | 4 + minecart/mods_support.lua | 131 +++++ minecart/monitoring.lua | 356 ++++++++++++ minecart/nodelib.lua | 139 +++++ minecart/protection.lua | 205 +++++++ minecart/pusher.lua | 67 +++ minecart/rails.lua | 548 ++++++++++++++++++ minecart/recording.lua | 185 ++++++ minecart/screenshot.png | Bin 0 -> 157572 bytes minecart/settingtypes.txt | 3 + minecart/signs.lua | 107 ++++ minecart/storage.lua | 120 ++++ minecart/terminal.lua | 90 +++ minecart/textures/minecart_appl_cart_top.png | Bin 0 -> 108 bytes minecart/textures/minecart_appl_hopper.png | Bin 0 -> 138 bytes .../textures/minecart_appl_hopper_right.png | Bin 0 -> 148 bytes .../textures/minecart_appl_hopper_top.png | Bin 0 -> 182 bytes minecart/textures/minecart_ballast.png | Bin 0 -> 572 bytes minecart/textures/minecart_buffer.png | Bin 0 -> 222 bytes minecart/textures/minecart_cart.png | Bin 0 -> 264 bytes minecart/textures/minecart_doc_image.png | Bin 0 -> 10813 bytes minecart/textures/minecart_logo.png | Bin 0 -> 201 bytes minecart/textures/minecart_marker_cube.png | Bin 0 -> 195 bytes minecart/textures/minecart_protect.png | Bin 0 -> 128 bytes minecart/textures/minecart_pusher.png | Bin 0 -> 111 bytes minecart/textures/minecart_pusher_top.png | Bin 0 -> 126 bytes minecart/textures/minecart_sign1.png | Bin 0 -> 141 bytes minecart/textures/minecart_sign2.png | Bin 0 -> 154 bytes minecart/textures/minecart_sign4.png | Bin 0 -> 151 bytes minecart/textures/minecart_sign8.png | Bin 0 -> 174 bytes minecart/textures/minecart_terminal_back.png | Bin 0 -> 123 bytes minecart/textures/minecart_terminal_front.png | Bin 0 -> 263 bytes minecart/textures/minecart_terminal_side.png | Bin 0 -> 166 bytes minecart/textures/minecart_terminal_top.png | Bin 0 -> 126 bytes minecart/textures/minecart_tool.png | Bin 0 -> 202 bytes minecart/textures/minecart_waypoint.png | Bin 0 -> 111 bytes minecart/textures/shrink.sh | 2 + minecart/tool.lua | 101 ++++ 54 files changed, 4340 insertions(+) create mode 100644 minecart/README.md create mode 100644 minecart/api.lua create mode 100644 minecart/baselib.lua create mode 100644 minecart/buffer.lua create mode 100644 minecart/depends.txt create mode 100644 minecart/doc.lua create mode 100644 minecart/entitylib.lua create mode 100644 minecart/hopper.lua create mode 100644 minecart/hopper.png create mode 100644 minecart/hopperlib.lua create mode 100755 minecart/i18n.py create mode 100644 minecart/init.lua create mode 100644 minecart/license.txt create mode 100644 minecart/locale/minecart.de.tr create mode 100644 minecart/locale/template.txt create mode 100644 minecart/minecart.lua create mode 100644 minecart/mod.conf create mode 100644 minecart/mods_support.lua create mode 100644 minecart/monitoring.lua create mode 100644 minecart/nodelib.lua create mode 100644 minecart/protection.lua create mode 100644 minecart/pusher.lua create mode 100644 minecart/rails.lua create mode 100644 minecart/recording.lua create mode 100644 minecart/screenshot.png create mode 100644 minecart/settingtypes.txt create mode 100644 minecart/signs.lua create mode 100644 minecart/storage.lua create mode 100644 minecart/terminal.lua create mode 100644 minecart/textures/minecart_appl_cart_top.png create mode 100644 minecart/textures/minecart_appl_hopper.png create mode 100644 minecart/textures/minecart_appl_hopper_right.png create mode 100644 minecart/textures/minecart_appl_hopper_top.png create mode 100644 minecart/textures/minecart_ballast.png create mode 100644 minecart/textures/minecart_buffer.png create mode 100644 minecart/textures/minecart_cart.png create mode 100644 minecart/textures/minecart_doc_image.png create mode 100644 minecart/textures/minecart_logo.png create mode 100644 minecart/textures/minecart_marker_cube.png create mode 100644 minecart/textures/minecart_protect.png create mode 100644 minecart/textures/minecart_pusher.png create mode 100644 minecart/textures/minecart_pusher_top.png create mode 100644 minecart/textures/minecart_sign1.png create mode 100644 minecart/textures/minecart_sign2.png create mode 100644 minecart/textures/minecart_sign4.png create mode 100644 minecart/textures/minecart_sign8.png create mode 100644 minecart/textures/minecart_terminal_back.png create mode 100644 minecart/textures/minecart_terminal_front.png create mode 100644 minecart/textures/minecart_terminal_side.png create mode 100644 minecart/textures/minecart_terminal_top.png create mode 100644 minecart/textures/minecart_tool.png create mode 100644 minecart/textures/minecart_waypoint.png create mode 100755 minecart/textures/shrink.sh create mode 100644 minecart/tool.lua diff --git a/minecart/README.md b/minecart/README.md new file mode 100644 index 0000000..0a9f5c2 --- /dev/null +++ b/minecart/README.md @@ -0,0 +1,152 @@ +Minecart +======== + +**Minecart, the lean railway transportation automation system** + + +Browse on: [GitHub](https://github.com/joe7575/minecart) + +Download: [GitHub](https://github.com/joe7575/minecart/archive/master.zip) + +![minecart](https://github.com/joe7575/minecart/blob/master/screenshot.png) + + +Minecart is based on carts, which is +based almost entirely on the mod boost_cart [1], which +itself is based on (and fully compatible with) the carts mod [2]. + +The model was originally designed by stujones11 [3] (CC-0). + +Cart textures are based on original work from PixelBOX by Gambit (permissive +license). + + +1. https://github.com/SmallJoker/boost_cart/ +2. https://github.com/PilzAdam/carts/ +3. https://github.com/stujones11/railcart/ + + +Minecart Features +----------------- + +The mod Minecart has its own cart (called Minecart) in addition to the standard cart. +Minecarts are used for automated item transport on private and public rail networks. +The mod features are: +- a fast cart for your railway or roller coaster (up to 8 m/s!) +- boost rails and speed limit signs +- rail junction switching with the 'right-left' walking keys +- configurable timetables and routes for Minecarts +- automated loading/unloading of Minecarts by means of a Minecart Hopper +- rail network protection based on protection blocks called Land Marks +- protection of minecarts and cargo +- Minecarts run through unloaded areas (only the stations/hopper have to be loaded) +- Extra Minecart privs for rail workers +- Ingame documentation (German and English), based on the mod "doc" +- API to register carts from other mods +- chat command '/mycart ' to output cart state and location + + +Technical Background +-------------------- + +The Minecart can "run" through unloaded areas. This is done by means of recorded +and stored routes. If the area is unloaded the cart will simply follow the +predefined route until an area is loaded again. In this case the cart will be +spawned and run as usual. + + +Introduction +------------ + +1. Place your rails and build a route with two endpoints. Junctions are allowed + as long as each route has its own start and endpoint. +2. Place a Railway Buffer at both endpoints. (buffers are always needed, + they store the route and timing information) +3. Give both Railway Buffers unique station names, like Oxford and Cambridge +4. Place a Minecart at a buffer and give it a cart number (1..999) +5. Drive from buffer to buffer in both directions using the Minecart(!) to record the + routes (use 'right-left' keys to control the Minecart) +6. Punch the buffers to check the connection data (e.g. "Oxford: connected to Cambridge") +7. Optional: Configure the Minecart waiting time in both buffers. The Minecart + will then start automatically after the configured time +8. Optional: Protect your rail network with the Protection Landmarks (one Landmark + at least every 16 nodes/meters) +9. Place a Minecart in front of the buffer and check whether it starts after the + configured time +10. Check the cart state via the chat command: /mycart + '' is the cart number, or get a list of carts with /mycart +11. Drop items into the Minecart and punch the cart to start it, or "sneak+click" the + Minecart to get cart and items back + + +Hopper +------ + +![hopper](https://github.com/joe7575/minecart/blob/master/hopper.png) + +The Hopper is used to load/unload Minecarts. +The Hopper can pull and push items into/out off chests and can drop/pick up items +to/from Minecarts. To unload a Minecart place the hopper below the rail. +To load the Minecart, place the hopper right next to the Minecart. + + +Cart Pusher +----------- + +Used to push a cart if the cart does not stop directly at a buffer. +The block has to be placed below the rail. + + +Cart Speed / Speed Limit Signs +------------------------------ + +As before, the speed of the carts is also influenced by power rails. +Brake rails are irrelevant, the cart does not brake here. +The maximum speed is 8 m/s. This assumes a ratio of power rails +to normal rails of 1 to 4 on a flat section of rail. A rail section is a +series of rail nodes without a change of direction. After every curve / kink, +the speed for the next section of the route is newly determined, +taking into account the swing of the cart. This means that a cart can +roll over short rail sections without power rails. + +In order to additionally brake the cart at certain points +(at switches or in front of a buffer), speed limit signs can be placed +on the track. With these signs the speed can be reduced to 4, 2, or 1 m / s. +The "No speed limit" sign can be used to remove the speed limit. + +The speed limit signs must be placed next to the track so that they can +be read from the cart. This allows different speeds in each direction of travel. + + +Migration to v2 +--------------- + +The way how carts are monitored and the cart speed is calculated has changed. +Therefore, it is necessary that all carts are repositioned and the +recording is repeated. +Rails and buffers are not affected and can be kept unchanged. + + +History +------- + +2019-04-19 v0.01 first commit +2019-04-21 v0.02 functional, with junctions support +2019-04-23 v0.03 bug fixes and improvements +2019-04-25 v0.04 Landmarks and Minecart protection added +2019-05-04 v0.05 Route recording protection added +2019-05-22 v0.06 Pick up items from a cart improved +2019-06-23 v0.07 'doc' mod support and German translation added +2020-01-04 v1.00 Hopper added, buffer improved +2020-02-09 v1.01 cart loading bugfix +2020-02-24 v1.02 Hopper improved +2020-03-05 v1.03 Hopper again improved +2020-03-28 v1.04 cart unloading bugfix +2020-05-14 v1.05 API changed to be able to register carts +2020-06-14 v1.06 API changed and chat command added +2020-06-27 v1.07 Route storage and cart command bugfixes +2020-07-24 V1.08 Adapted to new techage ICTA style +2020-08-14 V1.09 Hopper support for digtron, protector:chest and default:furnace added +2020-11-12 V1.10 Make carts more robust against server lag +2021-04-10 V2.00 Complete revision to make carts robust against server load/lag, + Speed limit signs and cart terminal added diff --git a/minecart/api.lua b/minecart/api.lua new file mode 100644 index 0000000..d93e188 --- /dev/null +++ b/minecart/api.lua @@ -0,0 +1,52 @@ +--[[ + + Minecart + ======== + + Copyright (C) 2019-2021 Joachim Stolberg + + MIT + See license.txt for more information + +]]-- + +-- +-- API functions +-- + +-- 'pos' is the position of the puncher/sensor, the cart +-- position will be determined by means of 'param2' and 'radius' +function minecart.is_cart_available(pos, param2, radius) + local pos2 = minecart.get_nodecart_nearby(pos, param2, radius) + if pos2 then + return true + end + -- The entity check is needed for a cart with driver + local entity = minecart.get_entitycart_nearby(pos, param2, radius) + if entity then + return true + end +end + +function minecart.is_nodecart_available(pos, param2, radius) + local pos2 = minecart.get_nodecart_nearby(pos, param2, radius) + if pos2 then + return true + end +end + +-- 'pos' is the position of the puncher/sensor, the cart +-- position will be determined by means of 'param2' and 'radius' +function minecart.punch_cart(pos, param2, radius, punch_dir) + local pos2, node = minecart.get_nodecart_nearby(pos, param2, radius) + if pos2 then + minecart.start_nodecart(pos2, node.name, nil, punch_dir) + return true + end + -- The entity check is needed for a cart with driver + local entity = minecart.get_entitycart_nearby(pos, param2, radius) + if entity and entity.driver then + minecart.push_entitycart(entity, punch_dir) + return true + end +end \ No newline at end of file diff --git a/minecart/baselib.lua b/minecart/baselib.lua new file mode 100644 index 0000000..d0c035a --- /dev/null +++ b/minecart/baselib.lua @@ -0,0 +1,360 @@ +--[[ + + Minecart + ======== + + Copyright (C) 2019-2020 Joachim Stolberg + + MIT + See license.txt for more information + +]]-- + +-- for lazy programmers +local M = minetest.get_meta +local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local S2P = minetest.string_to_pos +local P2H = minetest.hash_node_position +local H2P = minetest.get_position_from_hash + +local param2_to_dir = {[0]= + {x=0, y=0, z=1}, + {x=1, y=0, z=0}, + {x=0, y=0, z=-1}, + {x=-1, y=0, z=0}, + {x=0, y=-1, z=0}, + {x=0, y=1, z=0} +} + +-- Registered carts +minecart.tNodeNames = {} -- [] = +minecart.tEntityNames = {} -- [] = true +minecart.lCartNodeNames = {} -- {, , ...} +minecart.tCartTypes = {} + +function minecart.param2_to_dir(param2) + return param2_to_dir[param2 % 6] +end + +function minecart.get_node_lvm(pos) + local node = minetest.get_node_or_nil(pos) + if node then + return node + end + local vm = minetest.get_voxel_manip() + local MinEdge, MaxEdge = vm:read_from_map(pos, pos) + local data = vm:get_data() + local param2_data = vm:get_param2_data() + local area = VoxelArea:new({MinEdge = MinEdge, MaxEdge = MaxEdge}) + local idx = area:indexp(pos) + if data[idx] and param2_data[idx] then + return { + name = minetest.get_name_from_content_id(data[idx]), + param2 = param2_data[idx] + } + end + return {name="ignore", param2=0} +end + +function minecart.find_node_near_lvm(pos, radius, items) + local npos = minetest.find_node_near(pos, radius, items) + if npos then + return npos + end + local tItems = {} + for _,v in ipairs(items) do + tItems[v] = true + end + local pos1 = {x = pos.x - radius, y = pos.y - radius, z = pos.z - radius} + local pos2 = {x = pos.x + radius, y = pos.y + radius, z = pos.z + radius} + local vm = minetest.get_voxel_manip() + local MinEdge, MaxEdge = vm:read_from_map(pos1, pos2) + local data = vm:get_data() + local area = VoxelArea:new({MinEdge = MinEdge, MaxEdge = MaxEdge}) + for x = pos1.x, pos2.x do + for y = pos1.y, pos2.y do + for z = pos1.z, pos2.z do + local idx = area:indexp({x = x, y = y, z = z}) + if minetest.get_name_from_content_id(data[idx]) then + return {x = x, y = y, z = z} + end + end + end + end +end + +-- Marker entities for debugging purposes +function minecart.set_marker(pos, text, size, ttl) + local marker = minetest.add_entity(pos, "minecart:marker_cube") + if marker ~= nil then + marker:set_nametag_attributes({color = "#FFFFFF", text = text}) + size = size or 1 + marker:set_properties({visual_size = {x = size, y = size}}) + if ttl then + minetest.after(ttl, marker.remove, marker) + end + end +end + +minetest.register_entity(":minecart:marker_cube", { + initial_properties = { + visual = "cube", + textures = { + "minecart_marker_cube.png", + "minecart_marker_cube.png", + "minecart_marker_cube.png", + "minecart_marker_cube.png", + "minecart_marker_cube.png", + "minecart_marker_cube.png", + }, + physical = false, + visual_size = {x = 1, y = 1}, + collisionbox = {-0.25,-0.25,-0.25, 0.25,0.25,0.25}, + glow = 8, + static_save = false, + }, + on_punch = function(self) + self.object:remove() + end, +}) + +function minecart.is_air_like(name) + local ndef = minetest.registered_nodes[name] + if ndef and ndef.buildable_to then + return true + end + return false +end + +function minecart.range(val, min, max) + val = tonumber(val) + if val < min then return min end + if val > max then return max end + return val +end + +function minecart.get_next_node(pos, param2) + local pos2 = param2 and vector.add(pos, param2_to_dir[param2]) or pos + local node = minetest.get_node(pos2) + return pos2, node +end + +function minecart.get_object_id(object) + for id, entity in pairs(minetest.luaentities) do + if entity.object == object then + return id + end + end +end + +function minecart.is_owner(player, owner) + if not player or not player:is_player() or not owner or owner == "" then + return true + end + + local name = player:get_player_name() + if minetest.check_player_privs(name, "minecart") then + return true + end + return name == owner +end + +function minecart.get_buffer_pos(pos, player_name) + local pos1 = minecart.find_node_near_lvm(pos, 1, {"minecart:buffer"}) + if pos1 then + local meta = minetest.get_meta(pos1) + if player_name == nil or player_name == meta:get_string("owner") then + return pos1 + end + end +end + +function minecart.get_buffer_name(pos) + local pos1 = minecart.find_node_near_lvm(pos, 1, {"minecart:buffer"}) + if pos1 then + local name = M(pos1):get_string("name") + if name ~= "" then + return name + end + return P2S(pos1) + end +end + +function minecart.manage_attachment(player, entity, get_on) + if not player then + return + end + local player_name = player:get_player_name() + if player_api.player_attached[player_name] == get_on then + return + end + player_api.player_attached[player_name] = get_on + + local obj = entity.object + if get_on then + player:set_attach(obj, "", {x=0, y=-4.5, z=-4}, {x=0, y=0, z=0}) + player:set_eye_offset({x=0, y=-6, z=0},{x=0, y=-6, z=0}) + player:set_properties({visual_size = {x = 2.5, y = 2.5}}) + player_api.set_animation(player, "sit") + entity.driver = player:get_player_name() + else + player:set_detach() + player:set_eye_offset({x=0, y=0, z=0},{x=0, y=0, z=0}) + player:set_properties({visual_size = {x = 1, y = 1}}) + player_api.set_animation(player, "stand") + entity.driver = nil + end +end + +function minecart.register_cart_names(node_name, entity_name, cart_type) + minecart.tNodeNames[node_name] = entity_name + minecart.tEntityNames[entity_name] = true + minecart.lCartNodeNames[#minecart.lCartNodeNames+1] = node_name + minecart.add_raillike_nodes(node_name) + minecart.tCartTypes[node_name] = cart_type +end + +function minecart.add_nodecart(pos, node_name, param2, cargo, owner, userID) + if pos and node_name and param2 and cargo and owner and userID then + local pos2 + if not minecart.is_rail(pos) then + pos2 = minetest.find_node_near(pos, 1, minecart.lRails) + if not pos2 or not minecart.is_rail(pos2) then + pos2 = minetest.find_node_near(pos, 2, minecart.lRails) + if not pos2 or not minecart.is_rail(pos2) then + pos2 = minetest.find_node_near(pos, 2, {"air"}) + end + end + else + pos2 = vector.new(pos) + end + if pos2 then + local node = minetest.get_node(pos2) + local ndef = minetest.registered_nodes[node_name] + local rail = node.name + minetest.swap_node(pos2, {name = node_name, param2 = param2}) + local meta = M(pos2) + meta:set_string("removed_rail", rail) + meta:set_string("owner", owner) + meta:set_int("userID", userID) + meta:set_string("infotext", owner .. ": " .. userID) + + if cargo and ndef.set_cargo then + ndef.set_cargo(pos2, cargo) + end + if ndef.after_place_node then + ndef.after_place_node(pos2) + end + return pos2 + else + minetest.add_item(pos, ItemStack({name = node_name})) + end + end +end + +function minecart.add_entitycart(pos, node_name, entity_name, vel, cargo, owner, userID) + local obj = minetest.add_entity(pos, entity_name) + local objID = minecart.get_object_id(obj) + + if objID then + local entity = obj:get_luaentity() + entity.start_pos = pos + entity.owner = owner + entity.node_name = node_name + entity.userID = userID + entity.objID = objID + entity.cargo = cargo + obj:set_nametag_attributes({color = "#ffff00", text = owner..": "..userID}) + obj:set_velocity(vel) + return obj + end +end + +function minecart.start_entitycart(self, pos) + local route = {} + + self.is_running = true + self.arrival_time = 0 + self.start_pos = minecart.get_buffer_pos(pos, self.owner) + if self.start_pos then + -- Read buffer route for the junction info + route = minecart.get_route(self.start_pos) or {} + self.junctions = route and route.junctions + end + -- If set the start waypoint will be deleted + self.no_normal_start = self.start_pos == nil + if self.driver == nil then + minecart.start_monitoring(self.owner, self.userID, pos, self.objID, + route.checkpoints, route.junctions, self.cargo or {}) + end +end + +function minecart.remove_nodecart(pos) + local node = minetest.get_node(pos) + local ndef = minetest.registered_nodes[node.name] + local meta = M(pos) + local rail = meta:get_string("removed_rail") + if rail == "" then rail = "air" end + local userID = meta:get_int("userID") + local owner = meta:get_string("owner") + meta:set_string("infotext", "") + meta:set_string("formspec", "") + local cargo = ndef.get_cargo and ndef.get_cargo(pos) or {} + minetest.swap_node(pos, {name = rail}) + return cargo, owner, userID +end + +function minecart.node_to_entity(pos, node_name, entity_name) + -- Remove node + local cargo, owner, userID = minecart.remove_nodecart(pos) + local obj = minecart.add_entitycart(pos, node_name, entity_name, + {x = 0, y = 0, z = 0}, cargo, owner, userID) + if obj then + return obj + else + print("Entity has no ID") + end +end + +function minecart.entity_to_node(pos, entity) + -- Stop sound + if entity.sound_handle then + minetest.sound_stop(entity.sound_handle) + entity.sound_handle = nil + end + + local rot = entity.object:get_rotation() + local dir = minetest.yaw_to_dir(rot.y) + local facedir = minetest.dir_to_facedir(dir) + minecart.stop_recording(entity, pos) + entity.object:remove() + local pos2 = minecart.add_nodecart(pos, entity.node_name, facedir, entity.cargo, entity.owner, entity.userID) + minecart.stop_monitoring(entity.owner, entity.userID, pos2) +end + +function minecart.add_node_to_player_inventory(pos, player, node_name) + local inv = player:get_inventory() + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(player:get_player_name())) + or not inv:contains_item("main", node_name) then + local leftover = inv:add_item("main", node_name) + -- If no room in inventory, drop the cart + if not leftover:is_empty() then + minetest.add_item(pos, leftover) + end + end +end + +-- Player removes the node +function minecart.remove_entity(self, pos, player) + -- Stop sound + if self.sound_handle then + minetest.sound_stop(self.sound_handle) + self.sound_handle = nil + end + minecart.add_node_to_player_inventory(pos, player, self.node_name or "minecart:cart") + minecart.stop_monitoring(self.owner, self.userID, pos) + minecart.stop_recording(self, pos) + minecart.monitoring_remove_cart(self.owner, self.userID) + self.object:remove() +end diff --git a/minecart/buffer.lua b/minecart/buffer.lua new file mode 100644 index 0000000..3c2100c --- /dev/null +++ b/minecart/buffer.lua @@ -0,0 +1,162 @@ +--[[ + + Minecart + ======== + + Copyright (C) 2019-2021 Joachim Stolberg + + MIT + See license.txt for more information + +]]-- + +-- for lazy programmers +local M = minetest.get_meta +local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local S2P = minetest.string_to_pos +local S = minecart.S + +local CYCLE_TIME = 2 + +local StopTime = {} + +local function formspec(pos) + local name = M(pos):get_string("name") + local time = M(pos):get_int("time") + return "size[4,4.2]" .. + "label[0,0;Configuration]" .. + "field[0.5,1.2;3.6,1;name;"..S("Station name")..":;"..name.."]".. + "button_exit[1,3.4;2,1;exit;Save]".. + "field[0.5,2.5;3.6,1;time;"..S("Waiting time/sec")..":;"..time.."]" +end + +local function remote_station_name(pos) + local route = minecart.get_route(pos) + if route and route.dest_pos then + return M(route.dest_pos):get_string("name") + end + return "none" +end + +local function on_punch(pos, node, puncher) + local name = M(pos):get_string("name") + M(pos):set_string("infotext", name..": "..S("connected to").." "..remote_station_name(pos)) + M(pos):set_string("formspec", formspec(pos)) + minetest.get_node_timer(pos):start(CYCLE_TIME) + + -- Optional Teleport function + if not minecart.teleport_enabled then return end + local route = minecart.get_route(pos) + if route and route.dest_pos and puncher and puncher:is_player() then + + -- only teleport if the user is not pressing shift + if not puncher:get_player_control()['sneak'] then + local playername = puncher:get_player_name() + + local teleport = function() + -- Make sure the player object still exists + local player = minetest.get_player_by_name(playername) + if player then player:set_pos(route.dest_pos) end + end + minetest.after(0.25, teleport) + end + end +end + +minetest.register_node("minecart:buffer", { + description = S("Minecart Railway Buffer"), + tiles = { + 'default_junglewood.png', + 'default_junglewood.png', + 'default_junglewood.png', + 'default_junglewood.png', + 'default_junglewood.png', + 'default_junglewood.png^minecart_buffer.png', + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-8/16, -8/16, -8/16, 8/16, -4/16, 8/16}, + {-8/16, -4/16, -8/16, 8/16, 0/16, 4/16}, + {-8/16, 0/16, -8/16, 8/16, 4/16, 0/16}, + {-8/16, 4/16, -8/16, 8/16, 8/16, -4/16}, + }, + }, + selection_box = { + type = "fixed", + fixed = {-8/16, -8/16, -8/16, 8/16, 8/16, 8/16}, + }, + after_place_node = function(pos, placer) + M(pos):set_string("owner", placer:get_player_name()) + minecart.del_route(pos) + M(pos):set_string("formspec", formspec(pos)) + minetest.get_node_timer(pos):start(CYCLE_TIME) + end, + on_timer = function(pos, elapsed) + local time = M(pos):get_int("time") + if time > 0 then + local hash = minetest.hash_node_position(pos) + local param2 = (minetest.get_node(pos).param2 + 2) % 4 + if minecart.is_cart_available(pos, param2, 0.5) then + if StopTime[hash] then + if StopTime[hash] < minetest.get_gametime() then + StopTime[hash] = nil + local dir = minetest.facedir_to_dir(param2) + minecart.punch_cart(pos, param2, 0.5, dir) + end + else + StopTime[hash] = minetest.get_gametime() + time + end + else + StopTime[hash] = nil + end + end + return true + end, + after_dig_node = function(pos) + minecart.del_route(pos) + local hash = minetest.hash_node_position(pos) + StopTime[hash] = nil + end, + on_receive_fields = function(pos, formname, fields, player) + if M(pos):get_string("owner") ~= player:get_player_name() then + return + end + if (fields.key_enter == "true" or fields.exit == "Save") and fields.name ~= "" then + M(pos):set_string("name", fields.name) + M(pos):set_int("time", tonumber(fields.time) or 0) + M(pos):set_string("formspec", formspec(pos)) + M(pos):set_string("infotext", fields.name.." "..S("connected to").." "..remote_station_name(pos)) + minetest.get_node_timer(pos):start(CYCLE_TIME) + end + end, + on_punch = on_punch, + paramtype = "light", + sunlight_propagates = true, + on_rotate = screwdriver.disallow, + paramtype2 = "facedir", + groups = {cracky=2, crumbly=2, choppy=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "minecart:buffer", + recipe = { + {"dye:red", "", "dye:white"}, + {"default:steel_ingot", "default:junglewood", "default:steel_ingot"}, + }, +}) + +minetest.register_lbm({ + label = "Delete waiting times", + name = "minecart:del_time", + nodenames = {"minecart:buffer"}, + run_at_every_load = false, + action = function(pos, node) + -- delete old data + minecart.get_route(pos) + M(pos):set_string("formspec", formspec(pos)) + end, +}) diff --git a/minecart/depends.txt b/minecart/depends.txt new file mode 100644 index 0000000..923877d --- /dev/null +++ b/minecart/depends.txt @@ -0,0 +1,4 @@ +default +carts +screwdriver +doc? diff --git a/minecart/doc.lua b/minecart/doc.lua new file mode 100644 index 0000000..3f43b37 --- /dev/null +++ b/minecart/doc.lua @@ -0,0 +1,131 @@ +--[[ + + Minecart + ======== + + Copyright (C) 2019-2021 Joachim Stolberg + + MIT + See license.txt for more information + +]]-- + + +minecart.doc = {} + +if not minetest.get_modpath("doc") then + return +end + +local S = minecart.S + +local summary_doc = table.concat({ + S("Summary"), + "------------", + "", + S("1. Place your rails and build a route with two endpoints. Junctions are allowed as long as each route has its own start and endpoint."), + S("2. Place a Railway Buffer at both endpoints (buffers are always needed, they store the route and timing information)."), + S("3. Give both Railway Buffers unique station names, like Oxford and Cambridge."), + S("4. Place a Minecart at a buffer and give it a cart number (1..999)"), + S("5. Drive from buffer to buffer in both directions using the Minecart(!) to record the routes (use 'right-left' keys to control the Minecart)."), + S("6. Punch the buffers to check the connection data (e.g. 'Oxford: connected to Cambridge')."), + S("7. Optional: Configure the Minecart waiting time in both buffers. The Minecart will then start automatically after the configured time."), + S("8. Optional: Protect your rail network with the Protection Landmarks (one Landmark at least every 16 nodes/meters)."), + S("9. Place a Minecart in front of the buffer and check whether it starts after the configured time."), + S("10. Check the cart state via the chat command: /mycart \n '' is the cart number"), + S("11. Drop items into the Minecart and punch the cart to start it."), + S("12. Dig the cart with 'sneak+click' (as usual). The items will be drop down."), +}, "\n") + +local cart_doc = S("Primary used to transport items. You can drop items into the Minecart and punch the cart to get started. Sneak+click the cart to get cart and items back") + +local buffer_doc = S("Used as buffer on both rail ends. Needed to be able to record the cart routes") + +local landmark_doc = S("Protect your rails with the Landmarks (one Landmark at least every 16 blocks near the rail)") + +local hopper_doc = S("Used to load/unload Minecart. The Hopper can push/pull items to/from chests and drop/pickup items to/from Minecarts. To unload a Minecart place the hopper below the rail. To load the Minecart, place the hopper right next to the Minecart.") + +local pusher_doc = S([[If several carts are running on one route, +it can happen that a buffer position is already occupied and one cart therefore stops earlier. +In this case, the cart pusher is used to push the cart towards the buffer again. +This block must be placed under the rail at a distance of 2 m in front of the buffer.]]) + +local speed_doc = S([[Limit the cart speed with speed limit signs. + +As before, the speed of the carts is also influenced by power rails. +Brake rails are irrelevant, the cart does not brake here. +The maximum speed is 8 m/s. This assumes a ratio of power rails +to normal rails of 1 to 4 on a flat section of rail. A rail section is a +series of rail nodes without a change of direction. After every curve / kink, +the speed for the next section of the route is newly determined, +taking into account the swing of the cart. This means that a cart can +roll over short rail sections without power rails. + +In order to additionally brake the cart at certain points +(at switches or in front of a buffer), speed limit signs can be placed +on the track. With these signs the speed can be reduced to 4, 2, or 1 m / s. +The "No speed limit" sign can be used to remove the speed limit. + +The speed limit signs must be placed next to the track so that they can +be read from the cart. This allows different speeds in each direction of travel.]]) + +local function formspec(data) + if data.image then + local image = "image["..(doc.FORMSPEC.ENTRY_WIDTH - 3)..",0;3,2;"..data.image.."]" + local formstring = doc.widgets.text(data.text, doc.FORMSPEC.ENTRY_START_X, doc.FORMSPEC.ENTRY_START_Y+1.6, doc.FORMSPEC.ENTRY_WIDTH, doc.FORMSPEC.ENTRY_HEIGHT - 1.6) + return image..formstring + elseif data.item then + local box = "box["..(doc.FORMSPEC.ENTRY_WIDTH - 1.6)..",0;1,1.1;#BBBBBB]" + local image = "item_image["..(doc.FORMSPEC.ENTRY_WIDTH - 1.5)..",0.1;1,1;"..data.item.."]" + local formstring = doc.widgets.text(data.text, doc.FORMSPEC.ENTRY_START_X, doc.FORMSPEC.ENTRY_START_Y+0.8, doc.FORMSPEC.ENTRY_WIDTH, doc.FORMSPEC.ENTRY_HEIGHT - 0.8) + return box..image..formstring + else + return doc.entry_builders.text(data.text) + end +end + +doc.add_category("minecart", +{ + name = S("Minecart"), + description = S("Minecart, the lean railway transportation automation system"), + sorting = "custom", + sorting_data = {"summary", "cart"}, + build_formspec = formspec, +}) + +doc.add_entry("minecart", "summary", { + name = S("Summary"), + data = {text=summary_doc, image="minecart_doc_image.png"}, +}) + +doc.add_entry("minecart", "cart", { + name = S("Minecart Cart"), + data = {text=cart_doc, item="minecart:cart"}, +}) + +doc.add_entry("minecart", "buffer", { + name = S("Minecart Railway Buffer"), + data = {text=buffer_doc, item="minecart:buffer"}, +}) + +doc.add_entry("minecart", "landmark", { + name = S("Minecart Landmark"), + data = {text = landmark_doc, item="minecart:landmark"}, +}) + +doc.add_entry("minecart", "speed signs", { + name = S("Minecart Speed Signs"), + data = {text = speed_doc, item="minecart:speed4"}, +}) + +doc.add_entry("minecart", "cart pusher", { + name = S("Cart Pusher"), + data = {text = pusher_doc, item="minecart:cart_pusher"}, +}) + +if minecart.hopper_enabled then + doc.add_entry("minecart", "hopper", { + name = S("Minecart Hopper"), + data = {text=hopper_doc, item="minecart:hopper"}, + }) +end diff --git a/minecart/entitylib.lua b/minecart/entitylib.lua new file mode 100644 index 0000000..bf20953 --- /dev/null +++ b/minecart/entitylib.lua @@ -0,0 +1,318 @@ +--[[ + + Minecart + ======== + + Copyright (C) 2019-2021 Joachim Stolberg + + MIT + See license.txt for more information + +]]-- + +local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P2H = minetest.hash_node_position +local H2P = minetest.get_position_from_hash +local MAX_SPEED = minecart.MAX_SPEED +local dot2dir = minecart.dot2dir +local get_waypoint = minecart.get_waypoint +local recording_waypoints = minecart.recording_waypoints +local recording_junctions = minecart.recording_junctions +local set_junctions = minecart.set_junctions +local player_ctrl = minecart.player_ctrl +local tEntityNames = minecart.tEntityNames + +local function stop_cart(self, cart_pos) + self.is_running = false + self.arrival_time = 0 + + if self.driver then + local player = minetest.get_player_by_name(self.driver) + if player then + minecart.stop_recording(self, cart_pos) + minecart.manage_attachment(player, self, false) + end + end + if not minecart.get_buffer_pos(cart_pos, self.owner) then + -- Probably somewhere in the pampas + minecart.delete_cart_waypoint(cart_pos) + end + minecart.entity_to_node(cart_pos, self) +end + +local function get_ctrl(self, pos) + -- Use player ctrl or junction data from recorded routes + return (self.driver and self.ctrl) or (self.junctions and self.junctions[P2H(pos)]) or {} +end + +local function new_speed(self, new_dir) + self.cart_speed = self.cart_speed or 0 + local rail_speed = (self.waypoint.speed or 0) / 10 + + if rail_speed <= 0 then + rail_speed = math.max(self.cart_speed + rail_speed, 0) + elseif rail_speed <= self.cart_speed then + rail_speed = math.max((self.cart_speed + rail_speed) / 2, 0) + end + + -- Speed corrections + if new_dir.y == 1 then + if rail_speed < 1 then rail_speed = 0 end + else + if rail_speed < 0.4 then rail_speed = 0 end + end + + self.cart_speed = rail_speed -- store for next cycle + return rail_speed +end + +local function running(self) + local rot = self.object:get_rotation() + local dir = minetest.yaw_to_dir(rot.y) + dir.y = math.floor((rot.x / (math.pi/4)) + 0.5) + dir = vector.round(dir) + local facedir = minetest.dir_to_facedir(dir) + local cart_pos, wayp_pos, is_junction + + if self.reenter then -- through monitoring + cart_pos = H2P(self.reenter[1]) + wayp_pos = cart_pos + is_junction = false + self.waypoint = {pos = H2P(self.reenter[2]), power = 0, dot = self.reenter[4]} + self.cart_speed = self.reenter[3] + self.speed_limit = MAX_SPEED + self.reenter = nil + elseif not self.waypoint then + -- get waypoint + cart_pos = vector.round(self.object:get_pos()) + wayp_pos = cart_pos + is_junction = false + self.waypoint = get_waypoint(cart_pos, facedir, get_ctrl(self, cart_pos), true) + if self.no_normal_start then + -- Probably somewhere in the pampas + minecart.delete_waypoint(cart_pos) + self.no_normal_start = nil + end + self.cart_speed = 2 -- push speed + self.speed_limit = MAX_SPEED + else + -- next waypoint + cart_pos = vector.new(self.waypoint.cart_pos or self.waypoint.pos) + wayp_pos = self.waypoint.pos + local vel = self.object:get_velocity() + self.waypoint, is_junction = get_waypoint(wayp_pos, facedir, get_ctrl(self, wayp_pos), self.cart_speed < 0.1) + end + + if not self.waypoint then + stop_cart(self, wayp_pos) + return + end + + if is_junction then + if self.is_recording then + set_junctions(self, wayp_pos) + end + self.ctrl = nil + end + + --print("dist", P2S(cart_pos), P2S(self.waypoint.pos), P2S(self.waypoint.cart_pos), self.waypoint.dot) + local dist = vector.distance(cart_pos, self.waypoint.cart_pos or self.waypoint.pos) + local new_dir = dot2dir(self.waypoint.dot) + local new_speed = new_speed(self, new_dir) + local straight_ahead = vector.equals(new_dir, dir) + -- If straight_ahead, then it's probably a speed limit sign + if straight_ahead then + self.speed_limit = minecart.get_speedlimit(wayp_pos, facedir) or self.speed_limit + end + new_speed = math.min(new_speed, self.speed_limit) + + local new_cart_pos, extra_cycle = minecart.get_current_cart_pos_correction( + wayp_pos, facedir, dir.y, self.waypoint.dot) -- TODO: Why has self.waypoint no dot? + if extra_cycle and not vector.equals(cart_pos, new_cart_pos) then + self.waypoint = {pos = wayp_pos, cart_pos = new_cart_pos} + new_dir = vector.direction(cart_pos, new_cart_pos) + dist = vector.distance(cart_pos, new_cart_pos) + --print("extra_cycle", P2S(cart_pos), P2S(wayp_pos), P2S(new_cart_pos), new_speed) + end + + -- Slope corrections + --print("Slope corrections", P2S(new_dir), P2S(cart_pos)) + if new_dir.y ~= 0 then + cart_pos.y = cart_pos.y + 0.2 + end + + -- Calc velocity, rotation and arrival_time + local yaw = minetest.dir_to_yaw(new_dir) + local pitch = new_dir.y * math.pi/4 + --print("new_speed", new_speed / (new_dir.y ~= 0 and 1.41 or 1)) + local vel = vector.multiply(new_dir, new_speed / ((new_dir.y ~= 0) and 1.41 or 1)) + self.arrival_time = self.timebase + (dist / new_speed) + -- needed for recording + self.curr_speed = new_speed + self.num_sections = (self.num_sections or 0) + 1 + + -- Got stuck somewhere + if new_speed < 0.1 or dist < 0 then + print("Got stuck somewhere", new_speed, dist) + stop_cart(self, wayp_pos) + return + end + + self.object:set_pos(cart_pos) + self.object:set_rotation({x = pitch, y = yaw, z = 0}) + self.object:set_velocity(vel) + return +end + +local function play_sound(self) + if self.sound_handle then + local handle = self.sound_handle + self.sound_handle = nil + minetest.after(0.2, minetest.sound_stop, handle) + end + if self.object then + self.sound_handle = minetest.sound_play( + "carts_cart_moving", { + object = self.object, + gain = self.curr_speed / MAX_SPEED, + }) + end +end + +local function on_step(self, dtime) + self.timebase = (self.timebase or 0) + dtime + + if self.is_running then + if self.arrival_time <= self.timebase then + running(self) + end + + if (self.sound_ttl or 0) <= self.timebase then + play_sound(self) + self.sound_ttl = self.timebase + 1.0 + end + else + if self.sound_handle then + minetest.sound_stop(self.sound_handle) + self.sound_handle = nil + end + end + + if self.driver then + if self.is_recording then + if self.rec_time <= self.timebase then + recording_waypoints(self) + self.rec_time = self.rec_time + 2.0 + end + recording_junctions(self) + else + player_ctrl(self) + end + end +end + +local function on_entitycard_activate(self, staticdata, dtime_s) + self.object:set_armor_groups({immortal=1}) +end + +-- Start the entity cart (or dig by shift+leftclick) +local function on_entitycard_punch(self, puncher, time_from_last_punch, tool_capabilities, dir) + if minecart.is_owner(puncher, self.owner) then + if puncher:get_player_control().sneak then + if not self.only_dig_if_empty or not next(self.cargo) then + -- drop items + local pos = vector.round(self.object:get_pos()) + for _,item in ipairs(self.cargo or {}) do + minetest.add_item(pos, ItemStack(item)) + end + -- Dig cart + if self.driver then + -- remove cart as driver + minecart.stop_recording(self, pos) + minecart.monitoring_remove_cart(self.owner, self.userID) + minecart.remove_entity(self, pos, puncher) + minecart.manage_attachment(puncher, self, false) + else + -- remove cart from outside + minecart.monitoring_remove_cart(self.owner, self.userID) + minecart.remove_entity(self, pos, puncher) + end + end + elseif not self.is_running then + -- start the cart + local pos = vector.round(self.object:get_pos()) + if puncher then + local yaw = puncher:get_look_horizontal() + self.object:set_rotation({x = 0, y = yaw, z = 0}) + end + minecart.start_entitycart(self, pos) + minecart.start_recording(self, pos) + end + end +end + +-- Player get on / off +local function on_entitycard_rightclick(self, clicker) + if clicker and clicker:is_player() and self.driver_allowed then + -- Get on / off + if self.driver then + -- get off + local pos = vector.round(self.object:get_pos()) + minecart.manage_attachment(clicker, self, false) + minecart.entity_to_node(pos, self) + else + -- get on + local pos = vector.round(self.object:get_pos()) + minecart.stop_recording(self, pos) + minecart.manage_attachment(clicker, self, true) + end + end +end + +local function on_entitycard_detach_child(self, child) + if child and child:get_player_name() == self.driver then + self.driver = nil + end +end + +function minecart.get_entitycart_nearby(pos, param2, radius) + local pos2 = param2 and vector.add(pos, minecart.param2_to_dir(param2)) or pos + for _, object in pairs(minetest.get_objects_inside_radius(pos2, radius or 0.5)) do + local entity = object:get_luaentity() + if entity and entity.name and tEntityNames[entity.name] then + local vel = object:get_velocity() + if vector.equals(vel, {x=0, y=0, z=0}) then -- still standing? + return entity + end + end + end +end + +function minecart.push_entitycart(self, punch_dir) + --print("push_entitycart") + local vel = self.object:get_velocity() + punch_dir.y = 0 + local yaw = minetest.dir_to_yaw(punch_dir) + self.object:set_rotation({x = 0, y = yaw, z = 0}) + self.is_running = true + self.arrival_time = 0 +end + +function minecart.register_cart_entity(entity_name, node_name, cart_type, entity_def) + entity_def.entity_name = entity_name + entity_def.node_name = node_name + entity_def.on_activate = on_entitycard_activate + entity_def.on_punch = on_entitycard_punch + entity_def.on_step = on_step + entity_def.on_rightclick = on_entitycard_rightclick + entity_def.on_detach_child = on_entitycard_detach_child + + entity_def.owner = nil + entity_def.driver = nil + entity_def.cargo = {} + + minetest.register_entity(entity_name, entity_def) + -- register node for punching + minecart.register_cart_names(node_name, entity_name, cart_type) +end + diff --git a/minecart/hopper.lua b/minecart/hopper.lua new file mode 100644 index 0000000..7b7fbbf --- /dev/null +++ b/minecart/hopper.lua @@ -0,0 +1,172 @@ +--[[ + + Minecart + ======== + + Copyright (C) 2019-2021 Joachim Stolberg + + MIT + See license.txt for more information + +]]-- + +local NUM_ITEMS = 4 + +-- for lazy programmers +local M = minetest.get_meta +local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local S2P = minetest.string_to_pos +local S = minecart.S + +local function scan_for_objects(pos, inv) + for _, object in pairs(minetest.get_objects_inside_radius(pos, 1)) do + local lua_entity = object:get_luaentity() + if not object:is_player() and lua_entity and lua_entity.name == "__builtin:item" then + if lua_entity.itemstring ~= "" then + local stack = ItemStack(lua_entity.itemstring) + if inv:room_for_item("main", stack) then + inv:add_item("main", stack) + object:remove() + end + end + end + end +end + +local function pull_push_item(pos, param2) + local items = minecart.take_items(pos, param2, NUM_ITEMS) + if items then + local leftover = minecart.put_items(pos, param2, items) + if leftover then + -- place item back + minecart.untake_items(pos, param2, leftover) + return false + end + return true + else + items = minecart.take_items({x=pos.x, y=pos.y+1, z=pos.z}, nil, NUM_ITEMS) + if items then + local leftover = minecart.put_items(pos, param2, items) + if leftover then + -- place item back + minecart.untake_items({x=pos.x, y=pos.y+1, z=pos.z}, nil, leftover) + return false + end + return true + end + end + return false +end + +local function push_item(pos, inv, param2) + local taken = minecart.inv_take_items(inv, "main", NUM_ITEMS) + if taken then + local leftover = minecart.put_items(pos, param2, taken) + if leftover then + inv:add_item("main", leftover) + end + end +end + +local formspec = "size[8,6.5]".. + "list[context;main;3,0;2,2;]".. + "list[current_player;main;0,2.7;8,4;]".. + "listring[context;main]".. + "listring[current_player;main]" + +minetest.register_node("minecart:hopper", { + description = S("Minecart Hopper"), + tiles = { + -- up, down, right, left, back, front + "default_cobble.png^minecart_appl_hopper_top.png", + "default_cobble.png^minecart_appl_hopper.png", + "default_cobble.png^minecart_appl_hopper_right.png", + "default_cobble.png^minecart_appl_hopper.png", + "default_cobble.png^minecart_appl_hopper.png", + "default_cobble.png^minecart_appl_hopper.png", + }, + + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-8/16, 2/16, -8/16, 8/16, 8/16, -6/16}, + {-8/16, 2/16, 6/16, 8/16, 8/16, 8/16}, + {-8/16, 2/16, -8/16, -6/16, 8/16, 8/16}, + { 6/16, 2/16, -8/16, 8/16, 8/16, 8/16}, + {-6/16, 0/16, -6/16, 6/16, 3/16, 6/16}, + {-5/16, -4/16, -5/16, 5/16, 0/16, 5/16}, + { 0/16, -4/16, -3/16, 11/16, 2/16, 3/16}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-8/16, 2/16, -8/16, 8/16, 8/16, 8/16}, + {-5/16, -4/16, -5/16, 5/16, 0/16, 5/16}, + { 0/16, -4/16, -3/16, 11/16, 2/16, 3/16}, + }, + }, + + on_construct = function(pos) + local inv = M(pos):get_inventory() + inv:set_size('main', 4) + end, + + after_place_node = function(pos, placer) + local meta = M(pos) + meta:set_string("owner", placer:get_player_name()) + meta:set_string("formspec", formspec) + minetest.get_node_timer(pos):start(2) + end, + + on_timer = function(pos, elapsed) + local inv = M(pos):get_inventory() + local param2 = minetest.get_node(pos).param2 + param2 = (param2 + 1) % 4 -- output is on the right + if not pull_push_item(pos, param2) then + scan_for_objects({x=pos.x, y=pos.y+1, z=pos.z}, inv) + push_item(pos, inv, param2) + end + return true + end, + + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + minetest.get_node_timer(pos):start(2) + return stack:get_count() + end, + + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + return stack:get_count() + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + for _,stack in ipairs(oldmetadata.inventory.main) do + minetest.add_item(pos, stack) + end + end, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + use_texture_alpha = minecart.CLIP, + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + + +minetest.register_craft({ + output = "minecart:hopper", + recipe = { + {"default:stone", "", "default:stone"}, + {"default:stone", "default:gold_ingot", "default:stone"}, + {"", "default:stone", ""}, + }, +}) diff --git a/minecart/hopper.png b/minecart/hopper.png new file mode 100644 index 0000000000000000000000000000000000000000..a773f9693c25e59b01bb8b9ff3f68ae546819103 GIT binary patch literal 123622 zcmV)EK)}C=P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+MSqLk|eneME`jT9f2FT90wplGu=SP*F#p-sCzV$ z$&}T(bYw&j1RU;;O#Y9*zw|dAElW>b<{Ep9%%ktVtMXyxuSa|~o|WhQIXZc#KeLaQ!yvqXGBvf^Ip&s)j$>x+MF?K>;&_v1gs_<5vH zc#VVYmz#~huFQWcO!{w?`E2W#MECyvss4Ukd)D-8c<6mRvE%Nm^c|No``^~Cp1q^Lwg zN0rv6)-}pfIa(69;*Hb#r>tK|l|K^v?+^K$(a7zfcJu4X)>HW^XMEK@7?w{Ze!bBT zwmVA-L6lac&@bdX(_fP$Ye}S;EN{vYi7LH_R4FVEdmQEy^D&N}wYy zV}UQc^go{8z4puF`^E)K5NC}DQ$$Kk#2|Hif;?pG1~;DX7$TXG$=qI`_)QjclVbA9 zd7>r1+0vQU+u44%dhyxbp7T{baK)o-cqsC)AYO>Aw*jN@ZoO^@58-0 zTY)?D+zs^SSZ%vbP<);q*+*J)H(PwWswdj3&I%@8S7)<@hUg}wBCmI>?oL-0fg7JG z9Q4HVXy!xJ?rZz3dfDZI*ogZ+xrQkD1zMM0JYZ>`afP7TE417pp%A?qAg@YG`Xo1$ z`92OVss??ET3PqxD|Bgb&A^IUWvj)v&)Xf^oObRj?x)Ckl-E18crWfW?wcvPXV=j- z71z26xuOT!Cn+mp6uwaK|oPF8$@QeEPX}Audn-4j`y^qO?yJ8|b56l{F4{cm>QJ-X(JSV9N4rw+W;~A!(=e(lZEQR_$%TW9J_*VrJXekPb6EJ7{Tg0qL*Gr_=J@+hpbA$LdwHd%D_ zq$p*yzKotZq-k{0ycOlFi{yZ)o=>6I8X0Otq?hhLQ_gy|Y^7pnk32Ul*v_axI5&E0 z%Jg!FAqZf5Xqn)d;1hwd{Jp-HXJR?D66E)~lW0ODEi`c*#6vscLCS_0F(GC9^VtWD zHP;ya23Q2dy-W^=Z~7Hbrtj(n(R_t01hSgSBq%0Q`2uE7dZ4fAuvg zOip1tUxaiWNgQB@Ou!SZO_U9~s&w}uW@&Cys}OAimZv3>DyMaWJ8H86&Y?)U*&AtZ zLeRGYy|y_ZTo+T&q#KlrLFLHtEW;N~0eM|=M*Zi4XFHm0blEW_ zN%x*4w=Bm9=A&h;sH4*mBqkwsadGLY;76rsQ*w?)sr0sB_8n z1OW=gco{fBfqqT~2Zto1#^r+ zpwl>9dQF;;+d0%&*@c)}=S(+wbK1-^S&7C=ayXHA?& zG};WH;1KS*sGQEJd*X@d*g|*E!f5$G&q5$^BUk{;O*MFYjSBOkYse39^ky;!JL}wu zeIS)^AOu7wBXP7vNCrK-Nrk>napzG3{A7yT?gU=o<597GLtsXZH7&tT-XLRI(#}~2 zPxZpgOqY%XVp&Yqrah4;=zmCBLt?VppiwH81jxIPvOefMFu-yjgkjl15fW6VL#YS| zkrwQh6R_u+!tFpL9Xo~}fgNE)EP`N1;rwP`6`Zt-pTW$4(0m&NvmO=$W!~uCpj&%# zWU3)?pk<=Hl#Q5UPNe+W;r@!z!am?i!p=-Rz?TVyN-0wXrvM-5BCQrX!_%Efu5lYs z+rcA1K>O4Z6vEi+^*LAHgY7!(NH^WD!S5vPsnE1L_zfSrxHSu}wtz6AYR_*J02W>q z#DD_l7#M*nYg^Hlh!uT<{E?X?oux=>-jlu4jtiyqLL<4wNF9CZU=Z;~x^3WX8NR}4 z3h?Uw!Z7#tQbs!$#(0phnZiGbju;jae@>`f?pdyTn7Gsh}*wUnXMmEDCbR-y@ zhFD{&GyF}x;gpQad)P>_YFJK~iX}C65n91~xmYSmBj=lWVj;_cn|`c(q-rm%jXlQ}f#kW?xd#skzF!z8R_IL(#mPADuPqN8P~aYmzr@jDOQLX<#u{Kl}d zXLtl_8{A=uxJ&%vg!jg{ z(SBJ+5Ef+h$yPuyVeVNQ;5_)EhE4>(zo^=nJL|(E#O49JF(Oe9S_;bXeJA~i=WX#5 z)55STY}6NaR|^*ulIEnxLf_|Py6*c#5M zK?UFi`Wu?#2O5SXrflW{K0;@d;_;R29p+k~w$51LPUV5(i^5ZUGAk`(12PB8eV@gI&D$hERf`Tet-b z%KgACCO8(R6GINzbZ8tTHL0=0U^STb6Wp;rKS8dFgf04Y$K=XXL%{qWg<}iM@o4G; zm7h!Vh#;6CXowR7d$}oo$-v}Z`b!Tc`+?;oTT|JLaA`pb=;fKKI%-0Ld-kgoo6f@JfgxO5&CzuWVdx|F){l=9CZg{#Kaq$$KAapNx2-?$~b|GhC7)aFFRo} z0tRbixA2f5iJF~Kt}~c`X^>_n`h-H>o&E`@97N3D zi23~h000AXLP=Bz2ngHZPv8ImAOJ~3K~#9!w7qGpB}aB9_C-W4H}Ce=dbO~MYmuxX zo6TO-)9RKq+T2#FwOAe*G9(YiBS0`<8!%uDj2T=0=^6Wvf5+T;}3xKZ*0Fq3G&#WP`1i%=+LU-J~1o%@SL~}YU{uk~$ z08}i(L2GRIlz^ozJ%NNIs`g*+TP!~&p$tP z@<|Xbf4Bvpmo4+bVxj>&^IXmU{OF@tMa^2ti0_W_ateU<3v$cvUelSAuE8@MKQSkJ%eF5~@o_5rN)GTG}1fpWCX*N`n| z{DrdMH>47&3ky(0nm?LP+?#Bm0LWqLEK5hQEwU9~fBA0eRHp0}?Doya}(+Llw(mTjRLX-c|ka=#>?yXS<_}9R@bkSIKyNi(S#~loyEWrCDuqy^eYgHEetL!9TzYGt-<&wJ1|SdkTPY5{)Pk#<)AurA@l3y#l7D%&j?QyLCC$0EVYJZYi`aC+-%aj+g;(_ejMqi0uVw(Ad+vu+B#Y{6;R_%B z@;?jjpZU-J2mer-)BedX{cw2S`}A)E=r2bAw%;oNJo7`HE5Da7uO;op+`sZ;;r-h1 z2gCc>+5fivwdtLD>G>4E{*}`2CcN;);Q`^?-|>%dr#UF21uF*FZj(1FGP6QD~fx~b0s1Goh1d3kfNGtw+jhUfeZkWkpMv@0hg9@D9lEtR1S zfbMEl09141 z9J?gqZ=QU{DWLIg4IrQFMT3>SB4zV=@Ff63vexY*r?yeT(ceAr%J-|dBb|Urs902a z?e=!<#KY9KF0_mRpe{84Q&~P&+EeAslyeIKSXgVlWwju5S7W0|B?OQziM()T!w7(` zEQ?v(RmE5f!=B#`9q{dUWA}{aySq*s4m<4a3_AjVT+Xmx4f^hf zqiv@^haCVI7tnCeAj>Zhxk~p>8QQtbkNkb z4CjMR;teOCV{M}Ypf={-8+oHc&PDmnBc5;8je0M~2M#{>pZ_MmnQR#Vo4@nZ_x66r zefF<@iofvw`+EP|b^BMl+l@|m=0EHMh{{O~kV>VHAQbxNeX0wmp}aRBgg{-?EyF?p@=3+&z#5x$ zWr$ewu@`qi&VO_pfy!AOtYg|2fB+OgM%yML_W!BM2}cG=rcl=uC(((%-kKRx*hG=0 zww7`3l=hMM)LYBJF1-fODtQRt(adVdwUA<&-;XWhJ1$JImnUmk zwUeWHRHEFT0~DWPpO;p=Hrt7v7rfGSmpwKa2=h_Sp{Fi&wwy*Cm5*v7(iMb4(p6IN zauJ&-Q+Zh`7rbU&3za~{4#Hs}t4rsVvW`A`dK7NtgAWD(=A+7Qz2+Y0yA^=XzvA!f z32e>40_nt(AS9~70;r0*yOQYAa9r!wT#9T(`Pi%KtvX34r!_kP!72pt01#!tHbgki zH)(#wMq0oel!PR&ibq!8!wys`;#62miFMc9U3dEQ{w*DZw0|Pe{!(R(5N=xIaWAh~ zlD^O-O}9$`gY^W!=uQEM03$`ItP55J1R#nfk!AAfQ%`>H`)_^&ANTdw|HqdAy!s3O#BJMHKGx4){?X1y-!z-w zvWKkaqrHy$Rjd>MoIu-r@|*2H{?U_P{)2G*=GUfSbDFAz`fe5vop=g-+Mbh^@%JZn7AX2aW1(vq+-Y@=yM`KB|;^_gA$bVBtSmA zLtU6Si~ak$o?9pM00Gw8;MOI5Io}OnYy=?RubUu-n*TWzR5FU?th!hJ0w55Qt|E5K z+5XiwEOgpeRs*0Q%`$4#P`Rf85=z)$O(bfM8buumP?cMFn3n+dF4>>x3?c{++2DG+ z#UTQak2OO&A=)N#1~MNTo!g|Z`1;GaVI)n+MmwBD5UTR-5QP% z*(erA?y$5k>cZBAHTv*5j`&Fy5Au4l0RAwFwH)mvLw#@ZXnTF(%-M3bv=#%H<<)Gr z1R$k*1W6`Amd#Z;a~qI@&fw>;yC@{-$^y_8I)gZD#-uL+?B6ZeIap9GnFwe{a6qkb zpvd=rZs7($y547Br?(c3ZWa7Z055%#eeD^58+Qh}Gz|Rc+UQ*!WPY|&05BD)lr6ep ztR?P9;iZ6rdns}E>e#9Hu|B<#9tzh9KsrGm^VWtjF=T^JP$shWcT##=?)3BH1gJcc>jt05qz zAPYv4WK6s)G6q?}=PakjDH(F^xHaZcgzPW=os-7Te&sI!MCuFSqfh_69|kbrtB!&{ z0HAZ$NlX2K4e0dan$iHYUi|t0@gcU4cxzV&G0*eA*_f!!UwT~gx#05FEHe>+lVAP= z@^?Oczf3b3!1lZUz5(j8GpgEZ&?A+w$9B{ozh`4K`)hx*2JpenS(Nl-G1U|jZ$Rz5 zOHz>}AWlWqIP4^2QA~~BT@)o!rHv=mB=G76ZVom^ms)w~zns?$tTn)?a8L>BcK~TW zB7m=rz{yU(wfc(v*(j4B0Z=(Jy|oaYTa{qCU8ihR2;_iP_J0K+{D#r3XG|=+rXm+o zOA$15+GD6o%tsXmtWr69EF}jf*4yP zjtThY6|H0t26& z053d!_B-$F0NCEUzrJ$P=aw2}G|q3X&rh#y@a?L}`1)jwZWrSmgN)-3+TD?>Ym^RT z0N;X2in^#~Cgh5ujuf08Cc6K@g#X0cA%2v3hgvRoK!9x=y`|M?X?69^mEHE~UHlGA zW~Sdg)}qeu6)Wen$^Gh(`9Qv3u`H=Xr2VM37HwZETQRH1_gRV4aMcCAo0lRG*4Dk% zT#9xQ7f?p02KwHVe^}oe$ESuz8sGzF)H_``bGEm+J@Zi`ddqRhW$MZb0SE-6$Yz6c z1ohmq8czobfYI7$loJzVNJE<%Ypq8TL z9(;^A<1=&?pL9ovS<7oNN~lG9kPf7b6adT@o|k}N&`VcN*-8l+i8yn2#EwD|2`L2x zs+lRLxAPF1KoRz~RM(ANf8N0TAE% z?f>@??U^=zuD$ZK)|68tBIcT4k#B%by0Cg|xvT0S2K&`t`2FKPdhh@KpInac@BicX z|Mi!T`AK{~Xy(nM+WT#@z8Gq-uoNbGY)rTh`fyh$c10Uv|4mVoB!lvZ%2z@q%j{=Yyeqe z;*PXBI93ku1z<~b1`%hQbWINO6(a4qRp3+;YX_ID6bPYt(i4Fd#Wq9Nu*NtSn~;wU zyPrh1oVio!(u9)>0jY$Fi1VZD$cH#SPB{@N9!W|BUB5Ly>u^``?8Q?6K6vjgfa|v> zZ58t2Wm#^xa+{u0OzV$uv17xQ7Ty@>taFubq1WPtAtxIN;>MPC+630cPCrrfm^Po zS|xJ2RT7{gQRl`H23MQ!)P>=wkrOLSM5uFnz-d;A%qNwHE>+Zc1Co<6Et0{p0KoAd z2!NK?<9qw2{p7^r!#f}(y41Wk_kGr&-mX0jLI6m+3c&u|lBrAq3-v&^2ox>rMM5f( zc3E_pqSYiy8vc}Qv9t=y={Fa9D`B)Vxhj&%N2^mu)Dmo>U;V-F2k_=^|1oDtAJL9} z>sSA%i9vtz2h?Litbdc&3xEIj_|5fiSOC$9kNKy|twun|SSQeM~tV+)QN_FdJfA<%E+&!-semUQ(J!dUFmMf%76D97kGaZrf_ZBY{ z<=kgYa&~6`P%*7}_r|FVa$ZbpX8}ckXclr9B*Gq3Z17Y|@`DWVMwJRi+t~AljBaRz zEX3tZgU}g9tSXIe<8^9szx3$@hn@C3*=N32G0i~;8123=8#R||YnzWO-*VtYG*@c8 zk#Fr;MwxQ7@`Ot7k^jwGZ&zv)z+x z2?3is6@X$^1K6J)pst7yH|MgYQ!ZcI9CSCug2r_3KmEy#`;%P=fW%?Nm8^A8miO-M zo;Z;m!cho-jHsNOx^inQBflu-fc6sy{sqF)dOW|ifRf~+JX!BP*2Z{%)vadQ8q4dS zbX8!qP3N}Xl@B=I(ptQ~vyh!#JLaM`){@PgiXLQ-#dp&sz5M? z05Tq-NqQ|-9Z01x6`%;fyoDzxJ;nN+h#>LdjSlY`08c$J3C8dJD@odQT9a*L=sbP4ym~DLAk;#(vdu~1tI-u_2jj_B1yB4E0-e4BP)uEPRp%zj z92cR=Z7{Cgm3Zs60nlsqi#YBnisO%&NC3F{?cEbkEgkZx9#L>m=Ap5)x<_@2tAq_^4_{?I3N^v*Z`oI)GR`sK@>1s zYZ0fCg)$#ke)F3UPzu3`)gXR|Iw&j>Xx6& zJV2%`)N@nkNc)Ofh=wj*LObdR=J7@y1p*!1*)DIyS^8|*<%jeA=Bdl5v5P+NwZ?CZ z{zd}ObhB#Pp(vJNt%bnm_6R@}r(T&-IW@75=r-1py)g9jiS_`1+fKag^7a zIRLS-NUwjGihs~&MjIAjpX{LEH9E`$6u0>2ai*AeTIZ&_8acPj@4;fM&S|HV%IFUX{%KudXkrE2?QI&f3cyJLofeN554qn4-$Lp)gsz}Pn znQ%@{w|spGV6u6HwOBftoPGYg(tac(Q5S!8+}%C-o6{;Df0 ze4hBTU+I7PKj{K^>#GEUK>6@cIRBG_j)k!{iUbROHP`IvSWUWeT1G|!jqM;JL>=k* zd(_73bV+r|%veeX%9mi85G-`t+^+7xj@JqxK0V}Y+j^G(Y;zitu-bFN zvu`q%(x0-RXa$g1_;?o1kiN5u1f=;oam)9 z9rg~bCaxv~5Oq{F)26m@M@DG~L!M!0w z0A0~4_->&lCR>gfonve)1n5%}aW+xyR9aC4g`IU+%ZPLCa+y9Q}vB=jVpU8qPko zEoeG?_+`@}SN4^k5O4gtTV#6R87{qkkSZ9(S;Nrjt|}r(iK1**bh&yG6$zFMAt`Qg zHv$x9jRgo2aU#P(A&9v}AVisLXgPUPO|KFWZmKToy09VT36Rx>V_)WQMyV815G?l- zh%!hKB1bBwRooLQksJaFu+b6$Vik&57clfhzP=?auTbt!a{+*^tuZ2iD$I47+%Ey@ zdFQuoD(Z;$1NT_4UX;t34hj2g7?r+MF-j!!gmuXnFO!wH*c9Mm6^Gbl<=hcfHioO4 z<6QtNPte{iQ58BE)%`nrfMC_ok9OMZk@?61xP!X~C17QIh;}Px`=+;~0L*tjnpc^s zZH{<-jboHiciB~oX3L5LP3;7RjBbLAYP4|DtM5(DUtHKC`@R&f+@7cFPQ$G&M_3+i z&!O)=h}XK_#r7Nkwr5!HdCj}X1?jDa8g|FP;tm+b+WvYn*(!Y+4rxyj6v$QAt@k28 zTyDd^^YN{@gB$_WyCx(K01P%#mN!!yB7#5^OJZBXY1-O;>-F1BS|1=wDpmO;xLQv9 zs=VgRR@zslwsBX?MZ@7FjdSGvXSJmri72R^zq*>dawWYfk}q;f@N03vTHxUAEC$88Sc@U%0C0zh&+ zK>JAMbF^I}Qftfc-Re@*~g2@fR zL`8`-r7M0*x@xvp*JYy<*u8GHVJg$EYWcLd{KmKV%_o223*Y(bpD%7&*26Za*?$HZozY^Blf;kEQD}Y(1Jpp6M)`Y%mk1+qzySS*|0GjIGHW0CVHFO z0ClDVPKHw``z3POJ`gd_o*^t&MlwQ_G@(&3HLbAE89b{Sns}1QI(GpRw+*tnk*ZxL zuS!p{4e&^uNo&{_H zDt;jWA`wBCmMI~{OedN2mel$tFDg`g1~`aKcvVas=Qjd?OPgarRHHqgZX8-o_iou! zXQQ@qSzdRl>%~tzcm4YN0Or*L7&uF$_5pO4)O_F2A$4XF8CCYMrkn1T&Sr^51vC#! zxfm|gV$S#X0mKoyOG^ND7xAd*%c;((HEeX_I`@9)%S&NjeZFT=GD62Ekf zlO*}sapk^yYQz>xMtI`vLa}LKr{pnwCY}ID2hQ7zQaRhLXL}_;amG-dg|DmAl`dzl z-dQTHxuT}jiY((F!3Jl`NidVTGHlrQ@07#SZUyVPsd8gW2o(%70J?C&-Qc@#JJ@h% zWLpMOnMz!I30JNiwoe4$`#&E8IN?tiTFk_$sAe_S9AiVa-R0@F3EP%$R>*et(i^9a z1W{F(D%YV5)W}fv8yvg6MN|X#-gdfmc*ZF*$A1N2tM!!_z^k8H1Mub>J1ubh@q*X+ zUddbp9jNvEc!cn+Q5^9{NY_e&@o-a9(rbC#hJ27JX1f&tGN@W1CMUwc1u8z76`D>6 zAnnWJF227WfAQ!4?(X$@XZRj~o0m*?SH)?sox5d(mJ2+MlHz^-%upQJ#$m@}tzj#JRB#e?aXP5JhF%t&1M|-OK|kb;v-wl^X8*UD8!j` z^m-Bi8DpIv&ke##r2QylG63k>a*sMMVYbe#&$~GEmGdb4ccr3yU&mQ!Cq&iE2HGue z%e1d}uL?jUP+qpJu@EFcQVDVnJPFw_k94JVWw?h!oP|bxHWa9+Sg_}>D=Vbar^cbp zL_pFPDghwMnNf+*h2brhWQzQ=;5{QHLgWgT+wRxHb2b|udP@^ zO?MKBx^QNRy?ZihwolRB_XuP|ZSBPXW_Bl9Idp1C0Hi=&*cV?kH}0iA<7io)nO~+NnREq! z>1N%!DtqJlc94(&h%qg*oEsHMT{)t-F36ShM=mz4=B6%;kZvjC4(}ilM5VW$R8t#r z{R_?V1*Uzg8YnH7emuzYHG0iJs#M4Nk^@`Lnm{ zFMh(qm{Y?$t1is>3lV&5{{B@PoDXgxQWvCBp$26u1C*JXT>2lFZr2kZ8ZJMPu~E0R zJu1Q!Em!IB?BA=OS_|o0K-}AMytPh{@SeN1JJ+3G_54#FyguV_y8BxbM#UL_jxyO< zk}bfqZY84yFM=K~*p*P7qGG9Q1GQi|xZFj!jIZU=-ni4;dmGC=1h*C(nXt||cR^kL zKYzwKTR-&QKcYPY-VTWG1HRc`UkC>ipKa-%PXO#*&DYL#9{tf6V_*4PlaBf3dnF$K zRaAeokhCRDpZ-!0z=yy5&#wMU066~-e=&S??z^JI6O!Nf&e3N&b-MH6M-AgQ@||=j z7!ocTa|{c2Ix@9m5P+J7v2jPbWF*1X#!j~m6mb+AvR{eotB1gnP5V;CF5yaK;|v7YnusV)7Zl&diE3)P{HK|M zL=HJaluB--pes*?b+lMYm%8v2K>({8Lu(5Fv(X+P;*J22&j6siBoVwIsu8yiUA?pkpxa#nQ22B&GyVyf?^kSKd?SXV72?u*EO12M)cf1jNgp@Q%$=S( z^RYM1sgnZ$y=*rCaohkliUcpEHKYq`w3A+bvTt461i*PjT@&|Sh*QCykjpQUWj#wo zai)Aw!s#&!FvrdLOni?r7Mw3&u@{oKizK)sCalqpqsL5Fm5N>(`3R|QG82T}ngTG{ z8(uD<+>j_6TJvijI9TXnMRPJq88~x;OD|_nsCIZ0z?E+(j zG)-Ml2&s8ZI3zvH(c|aneJl~W8(NLHar98ktnpnKLnbIVZKG{*0Qof98e`Mw2!C|% zdUZf)Km1Ocjs!>WX1U!U4z+=G>g9Y^Tyu9F8Z124>)9_l=k@+uk8Ke{8{Po(h8mdO z$@pVj%+-JSPXV0!q5tlYcu9w9gd$FyEYen8coC&=y#*XtYeAIsqtG#@KKybS{!QKA zNG6*lDD)xoAalzqN8Tssx*~3}8ouu!Wy{KcpUR2xg`vcKYmGL(qp!Pujy$4P7nL-Y z^PQT}8C^PW-PY8uOeX}6aiiL#YOYx*Vk63=q+pxZx^(S^V?Uc>yR{PzKHVzU07;ox zTLZ91N&94C27{cAS2cs|$PhsQG&~bCMyFeOmujZtECQ%^!X0E%D*!J1Gd1mu++{y; zZh`3(<@NpC1!vvP*4!Kc13uT+I&ix%hQUu{oG69f`oBq90iZHzZK(Sw=RWb-bCZgD{SuMFZh=FA_vev2>|cDTZft!wrzexHAzk0Q*8|nU~BFuxWm&)d%>cPC}*Z(BNw8d zy^@IOcn}g~kF0jL&aG_qTi2C4&;ISAyBf!t%vOkjiV{v6?pF~*d|MxG`V5>?9rJyr zV#H*p4&+>20&wa?^2U|>pL+h}F%SIl1cn>z>B6X3$_S7seR4+#(Q5OAI(K+gpgZKP z@SrnPVOaucu74saCJmm^Y63;gmRaonG1?Y^=DNP3<4jKO7lRWIx`p(dJMGoi>hqs{ zJX?}({;vSajepcxRsdfA^}k*SMlT-WqZGGHFvHxi{-G}wwF2?hds>IN=ax7$uYV+a z=Ch=`_j33y_6;TC#SZ?KUS_NyaP^x-+Cfz)?EaWs{f&qtr>>{1fDQ zhpLBSzVpNrr>|WacLs+|=7QfBFRk%a4ZtB9jXl+1rGKnN+P|HLM`VrlQ)s9uP8Co} zM3JjnOESsBG>oc1=DqB-X)iVfD&Navdb1WxGPwn3>TKbe0 zRVr~!7oVh=^CLya*IlsRrV%PE`86FqEkVJIwsVq9;{LPd6@OQQ}2IiWr+=_*r)y;dbFjS?(Fe~+$WYgBvp zr!!PC!gQ+%YXaOLBdIGJ#SEnT`&EH$ggQ5qEyKe`+R<>7inniU29S(ducmg_F!PN7 zr?(sgz2aM*zJA#aR0$-(C`DaZmCCfY5N(@^La_>f$#zvtHGq|~j{IzD3XVIkQeYhi z$ZE1xhRWUES~9woH_2dsvoOa>@9M@i0D}Sk+-@5YEOd! zu<{5&r{1HRS91XADOC3q09ySG01-Q$p+u61gyIAnmD36UJ4AJ(BpIW1iN!dR%n7P< zQ_49GC38Xqcl>nYgiV@fmS!aVIY**r%A`P@Q{&eb{9y<208H<3x!!i zrna4-+P~vQdIj^JbS3jwZEXltPK+CuCY#wWdRK=~EFagQP33%~0i51wg^!Y|T*HKD z(fbudpMUiT`P<3U(FD^x5mJOfG_!H9H=F|K4FTZh-603E*^06aRzLwBc<#dKYnSc- zP?a@_1aRe}-RGZP4Xd}G+vE04JY0hSraNsrx^g@}dv992`0VP&1_=FY?``@Ea6a(% zZVrGOnSwCet2__JyJ8keS2BM}SD-}{@wnIZ54SE}^yPyII*AKh2+*Y&o=gE$g<(0X zD-A&$+-%KpqP2NHxa>M8z4EEp$vL4ITh?3z=-dL>88>NZ#_&VY9yc9~T%Tb=nC(-w z<9kPNbqzxdwK5S5)9Daq_%>-|EzL(3p#F)(t2qkgfGp3+qAKsNNBQU=RG1DV2u71G zjqxLV+WifpPU9uGh|?zsc~j^XCFDErZKp}bPUM|?TP-?F-(QadTB_W3mQ=ajl$^ct zstX$4c`xS`PKN=Ol)Y58d~1I(7N)X;jRe5>eid>DfeBSiOq9xMuFJU{tS10%^rNkr zz5Y?-zxLPCddKXu#%PF6EiMlcgkyuJeK!bbx>MQ3q7G|N&6@NiUtUONnVQm}%9a)2 zOlx}dJDs99`I_nWxw@n|I6Volt-QC*_S>6 zfe+q!d-v)Q8tKUMeCDUKx4-#uXv{}8tbg#Ux}{T(aLj?5U;PY#?1euC@Z>YSqoacS z;mdXNIsw@H#+UDZLY-QG4!PbIt8DgaSk z8V-+m7qPG8`q$Z3pFBYT@i$wPAIx2gKIed2O~jP>Qi*Kk;Y=CcVCPPc0bG8! zbN1}Qr*pS6o%xOy0B78~xf>^LzVU#+Tr+a!Kyi1aVloE+wfWeLB>V%<1H#C=ENr=0PnnALpqbWphE#q z)+Yc{i zMUjj|2-)x6-wp5sfNECrTo*DF>a~hlYwl^L7=_LTkqZ+Ah)A@kc>shBt}k({Y+EY2 zyAp?BId~gn;rYL!p6e>t94CbCF-irX-h~Igq*!!U9R`(;YiH?&YsC5}(c9Ud`6qAw ziywy{miZvA(Cr++`ug+ptM9tSfqw8$+J>{;B%#-T2pZfroVv2Dp7jpDx^-Ct$Xa># z^WXQWE8l$Mh-}g6_{y7&i`qG>idzOB>lOOfALn*_^l$$we)Hs4{6H$E z_V@($WaC7IvQ&=0-S}}sRep3r??f+N|2xnA*|$CnpT7U$?)j$%;~YY`c0%=dhY{Mr zK)ShIyjJ@=kDES(@42WeCe%15gJb2Sr|QzwWhiD9i>);m&U5$P4tIr&I+6k2_pjoG z^UhZbEo`DhxQXkG5K0U;oE6#puxwlSw0{KssneGLu?#SYY_e(E`Tl0`PAsJie~Unf z5@{WtF98&}Mi|=FNFeI1aB}DLL}}A9Lzl$RJ=96{K|bhC{f|&`8{>aV+Nx#+8M(MU01U+ah@7$M-p9;|e|7wm;l* zxVz9=4{?Y@U5MhQ&E#g{yS8S-*hvT-jNbI#!#Opx*MGd{hhrZZce2>D*QbN%&42MD z4&fX=h7mI4G{DkJ@$6kcOl|*>m|36u**<{N&*P0>pSLM%p&49TB^-IiN0|U~AnSRY z+re-C>Ysn!Y5v}0+v7+^)ES0m#KcYMbZvv*r)zWu5k#Y0RP0QMn;S<2kgjwn3bw{W zbF#_q1bx8^Av0(Ge(gqfYw5 zsUgY!T@{pnl1YxHjWJH(1cn<<#%0_zQ{o<$Q7l*1d9xV+w>Ov1ovPV(K6Q2s;QFlr zKv5?GF-7@7$%Z6*P|*^%vLx7G*Y|D~)-**#gA-|48FDvsbPP8e89=n#5sdSu8(+P@ zvy`bL?V^kau2c5@{(-i=m2UwN+6=w$yqM0H0J?c&pS`O<3SgCybcLS{PHt{1q005> zK9*Z^%2?M332SUPi&jKFh!P)7g{qIiiFg2cK!(4*rvsHHN@ZsdhDNcsVT?8bg0AM~^(%L| zxGI$L6rs2E?ED_59S=cHx3Js%Fh&#`)4Wp(rg7Dplj#33HGK6lA^zsc!Ui|XQ*Z$~TpH0^S zZU*=f_~*h5lZWtYq79HITAX~T3!)p}oTiz2^j7t5Sz1o#d{ng+ShW7l;Zt#&r*<^+ zsO77fj~R}B%vZ!MK|D_4fLVrKV<@il;Qr18QhtcEod*xv0K^_2h+E;X_ZNA5h5!^J z?d!eB&(0<1QxhVt1(y^O40GSpLB%3=h4v&>lh=$=$pLXWH;|CZ72XBFM>rBJkG!^` z^)Y%Dut5>rI zcUsIX@$0>JJgjymD4m04PcJ-|z4P`MKzBtYDK}~mfHJj>GsQfkBngJ|V9)jQ7f%4V z`d*W)dhyxS_dnbPAmV`l>iylrR`a;Io=1VT&5`MRso&iPaPfiw#CP7Pmd|to)W3hb z3{N~;ik^QqbkC3g-n~=<=&vVPmkH0VOR$Xb!m|+&z5jvs&yfy{I5nC=AIm6{h$N%vp;&{Pp>@rJTc;| z^60JVIY0gW*WU~)_R7z{_TE>Iia66_P3gyI;P69`v%e7-yrM322<1xDTt7SlWZ53%(nL;zTn~B>ASldvAXux(XhN@HxMwR75eX@hfjifD zA_fD$Z3bM=*K3>47U)OD9JHF=C%}h&2pv=L9$2J-#y$TOT=`$)TIST z#!|)z^VAM22wto4{lfUcPeP(DY={(xOK!D`UKD(tq!$$vEhLI@-C1?{xu{iraqU*E z3)ju3-G$rf5i4tn zY{<6YFbd7_u1bYtTEXdu$m2J!4p56u z|E9isbP3I0{qyfS?pM>%L0SFiFC_$uT!)FgTti79M5*9loRN2-$Wh&>X=UD7iX4rF z``Z<|GmP92yUHO&<*@WrVL9f+FnOHkNLod$<-iF$HBZ+IL$C;9drhV2A^7hh~ptjm`R0+LLQM&M?y zy0TY40DxzoURd=0iMVBMsw1rnCyaMSVVubRiIpV)SFWn(&l>>RjE>E1>{Wr>-xLcG zwKGr7UAnk&^}Vh7_{zYS?Yoo_ruTc~$0Jm=KFn*q;=nNuL(Vm06 zXlu0n@=Hyq@zP82JMUKA6?NdRwi?K_lD^Y=`H4<2qOt}urB zo-Z@HmB$@Lz?0`<05@(_?HuI2odqqQttb^sT^bO2enfK!0$iI5g08J@^#SOv#J0B1 znrg=qiZjJ*fGkmLw`3&TAUt0VC8cAyFuNq}snD{KEvQPQt_(M=bg|=F5)4B%Hx_u~ zJ;&;bMZ&6Zx?P@o+8M&H|NHmDb#82&1Tft$0GvD-16W@fZ0}8OPHF&??P4sNo`s_s zPH(t*+6!)6%WETvzBhWXr1 z*vkaM$A#?%ej(Tm1EFZzVyKCR(BMz2u%xP1@>NA5n4g`ShsdtI1!v{L&%F!a@*f^# z7^Ojx(t&BF1Ry^1TL9`i|Iu+fuCwHLg)jg3MF7{nb_Jl*pO*l}n`W{Xp6Nquo3+m2 zxP8Mu@#I6k+#dYmZvUMEz{@|_z5JVBe(2zr2bj;+(j5`6FZVt-n*9}k)i3_}bOZqV z?>ji*l`kzMLc2qo@B7n+;-sh(aTcMR*(i}vg4>jLhSB^^8B`ckz&XN8G8sk?_*^Eb z6h`YXXu4JG(UkqE1l+94<(VYH@a=NiDnSwO#V)=mn?ER+SnrfFfuxdcycckUK(2-0 z#2f2J)e&ykXGMl9wB|0078Gb`%iiejnFdic#mk?v0Ipn#3AlJ61IU;KHtLzx>0UK> zkbFE{UC}B^B~64FEEw0oD2ddvHVd%o0MeDTX!`?TmOoxFyM*s&!_iqH7-R9S#M{R znq@Y%5t0}O<{IUsn=C|=5~+^?xiPdqw;~JHTmW50nquvU-D(%zVS#SUm9_`QGM^vEdkiOTf?`W2k`1I z{Ql&FN3xm+#;Bn+Ne#f-cexJxJAeHM=Q^ZGBWql6XKi@og4uM#Qwaw;TyPCygCu=Z zY^rkY{SFF!={f_|f=FStr7&#W2Xb8O5#r8rYC_H_AGr*wl(M_ps$s89Xgd&K79KYU zB3pBCpcu0PFkDIa?Bk|^FNKULwU99epW}|;Iyomg6Mgl=;`}omA9koHl~0`(468o> zJnyK?n6XmB%UAN1)kd)D0f?KZ(IYyX!G8Cc;ypo2PNQM zZZ*BQo&mV{Vsz>Ky0;p;LLh2}<)(dUG@V@UADdl|Kz8DjTU5>JVr;lPpY;(BGMw#| zE`Q^nqcz;lmvp6zaZ^wvkLrm=uwk4b$S$8vj*EPGdq*j!;=Erp)|Wq^7oR;eYMY2! zSeBn*2bHA&Is+3b0iHaUZjNeBgPnVM$>ik$2c_6=M#d(61qhy_>B^dCmUUuVXu|Z2 zgYLFyQ0*j>y6fXqEfb+9rka@(t%2Rs?NV_xY0zLEz-+s`y|uG)YW>K)%XW|e z03ZNKL_t&swA^dVXKy{`09r-j$>$nKX6MGvVz9!KNlYM)aiCnzh#Qh*L)98J(d=cH zzOjeqz>rOSuOin?zUh^(S`e#84rZGDFt7TBcYj-Rd~33GQwiE%OQJ-9C?D&%qXKh+ zh=Q0^Q^NyyMHDQG7jfGlx}4-<@^CQ?*;ea@_Oxc+sYD9FSIhS#=z(dwFzRIa6Un`| z=kVnWa*>l*S6YnenICv|ynW-bg0uc|wBsA{rJcx>M%QlU-2>93=|GJ~`swc(w7S;02|FzGLNw`<&{5YG3(u#VhhziIcB?Rz#dA{-#i~`t7y9lxS?8P? z69jZ^+mAf#Oer&;l_X>K8+`bf#9(N;eZUO7xXMeK0l0L>i4J!I;D~dyqg^`)nGk8A zur<>HxO8)j40S0(?FR@+&+#daB=>TYx!$VOHFsAa7hwyeL)lI^_0xE|S#kVYP8{cx z!_diA>8Z>}drf^&F)`oy&a9dn5Qe8xfPVN33!L|F{MDFS8SLK3_in(pCMi7gOb5VC zk7^K6oXDihbJ=ijXTjz%OVB+zL-nSPI&$??H>f8Sw=;H@3_WpS>421L?Q#O1hY z+U0>0QEus{&UZX#rzXN-e7;dho_yu7U=j%Ut#NrIQ0nFd{Tqk z(@zQOM^`XAT(_elZ`!N5DVWOFk-gUN@bUd3++)(>d+*;{c<4)~(tyN99l3w6VB;Mo zGVvA;_9H;PLP9ASa*#<^1rk|kuA)-OtSi14#~}*XPb$ezATQ@SEUbz|(`0RKgoKI} zr-uS&wosN+bH{AI=^9H!?L>y_Z`F$d%xCq3pT((9bVHsV5bym?6Il*U#DLhll}FzB zEL(ZpD0-x>1!bY{T>Hog(y7k;+C#1190(s4vwse%88~{)f&T7`*(9V{vnk!6TpxF zO+aw{vP(J^4UZrYvRy*4F5K)b;+Ew;l!?+tjBI5A%7!rj%qY-D+4^!XI^G6;5SR!} zQdA<^B$T?at%Lajn zW5zF>A8zh0xK1yuJgB2pI$WeR+7hY@;KMuOnKSNQme-;Y&zBd%&rNI9z}cA^KoluJ zQKk;iIvSj<0|8OzMz~2VZqQP@{cJgdiUr6YY=M(pmd-``X-_h5E9pwWhH|60BZL%5 zS2FvzJT&J>MwsptG7_HIFPUc%5UO)$+`hVby9l0BFq|A#0+2}#KOqWH(>50ExNtcE zP=Z3Qy9YSDb!9q>9kkj1;Hm@09+}_ax!HmMQ#Re5xEb=!2NhcFYyhmD%S?;=$J#&c zs(`6ZwoI7N$5nH{V7p6UQFYT$;a9P*%PRfIdWyyy}ouOhAu1ovw8yt+@z4-YT z;7dG5xwD=8|7;OW^>B?NB6qb(rjAcb>+t{Wf+GHB)iMbk-=r{%_G2$3uxA;Zx5kDU zv8|ja+Hh+Cc&A&X>t-bYBeV%@SY@;kibp=7H6+SLorRrP7sjOta~rxJ3{R%rbir5H zyO9G}I+F!dcDhpro7m|`0EOBWQ-#ofAwknyPXhhw00Q6b#XFY@0BaW>STW)Y#=89& zzS0GW$T7Xz4qZYTgD!7Lc zftnctlg*0#I0jq#CsN^Fs3d_W#C(eiqEvKgk%H2 ziTyI|scL558STIH(h?w6v)O6}0N?yb`=Jve>ehN5Z(h$go;t#OUc0h4FVx8=93^UErKsXo*%s9mtq*bi z`WE{uVSczvk4c*bVsThWRL zNhVwVCB*;7+ndH(cAZyZYoGDX_r7=ERC5)FVsR>xk|;}*rIzGDmgR0shS5NR1n8iH z{Ad_$1aTU1jG*%;3D6Ue2J)jD36h4}abl<2vJAk8q4|g8U zxbx%Nd!K!Vd*3UHo%4ez-gn1y_Sx$j*0+|$Y)5c0#DrBTY0s15N00=I+QMNx(}c@L za(-kOm~=xUw|feyru3>TFPOap*cD@aJt^@Gj}qW-E$TNNEY~PCt-*n))7F>Tg;{Sf zQ3^dtP##R9iYB==*bgi>>3fmJHO+DMxBYOc&XrcOHVrTl)~In+Vx4=VP!)#+&D&rE zQ7Xgk?|6w@Lyc59IkjDrM7->HqezW@8IGvuGhotpG|xQ`p!4pGg6-$Tw*UV3b;rFZ0$_q{dm{jGl;T(` zp&`ytZQ1Hlg+8Qgxso${=qajh)16 z(5eIgj`oACZKKpMTdS2tH|cRc_L%7O9CQY|hnuVI#5PM;SS11O#&U5uv{1A2)ZE?O z18+1lHuO`vj@&L8o7)E@tx#%MDmzqEi&EWmMNY;{2a{f)5+HvZC&b;D$-sp>RThPb zAig4<8$OpbFiw(egf!oI{@^QLO!{ZNT~7gkH-cRf6#P6hqGg#|`xAS{07e+b<)*EY z1}cpnZ1t8-Hz7<*u+teYEM$Y5a8w!FKO_f|eUk8BmbpWruwlBUL2j@K9 zOrj#2Qj6u4MMoLDgua#>#o)5ePxq8J4l{i+!!q>oN18GWM7h-=l$!J+HDV~!N+Swl z&4{C*YC7qLhON94l4Et*UB4~vG=-FdJ+HQC9<7g^+A%vIkGNenze# zmEAj=0Bn;1Xr3+xC%O=n?^2En;PO`<{NOt`PXdRx{wj%L+t1yHT}fx%SAH+v-TRx% zobR4S$JH;D!SLbt1EfV6k#mEY>;&Fk3}C_o0?t@cQ&iG9htTxkFS?dLjw%Zl)p>|G zBTT_KIJmBg7e}1txCy_B=0$yAg4D3~H6Pz0CI|0s)^a#hiwwcoing&c&SzctoeQsO0{7M0*;w(X6ZlMClv z!dRt)7x*C`@YX5-9C_9LX8+;?=6qJxewHFvJo*VhSKn4eTI#)Bduss417mL0*6BZj z6>JEMOs17x7E2nDVZfiph5=^4ABLr-rKWN-na#8xTDFj+U^Wq*G3f?OgC8FAX=41# zN#=s8;<|`|-gr~qTRetgV3u8I;1%Ca%N1;p^vslmMlI^Kll{QX?ITsdFTU#>7RYtw z^+P%4$N{|e`rao$kx2V1QJXmAgM&crw#`!|Rehyp%z@taG)hm+Mq#Y1&6uHjZ$clA zioMiR7)tVpT9#J2{brR++hw#LZ%DTgr&PB~MxGgQco??ZWGWdj6Q<2{L7(@2`oZd{ zc6-$^ZH6g^M^SAtk-A~J^!c2_5H7iuMJp*pW}aejUqTwQpaNOqejja20o0fDEsPKM ze65#Zg2C%YDIj5}wvz==G} zs^4U!*N-ul8r>8C1=Dakj4UTniwwp>Y)>wG8-P=B{ZZ(TBW-e*JMy#;_1YT+^;HLe z*N>O3t{z<5oqrvubOgX%iw*mjqGWF?pd`}U3Gk5cWb+Rc2-~h{6n|CNExQScY<} zGy|cx5C)N98j#B7l?9vTL8;9~Q_q~kEgMmofV4jjs0-zktw}GGoJm7(u`poV_f&t8 zYPk$x45LF&&wJcT@!lbTGxOjD6b?8g114a?8;5!uKINXqd8ug{HUQ>YEcBx1-#8?8OsQd7 zE?ZbmhITeTJW6J9IgsWQI~5}ixh^`YQg*klru5*AL(?>vfv2yw-@JC9h}^@YaB;Cx z1j(VQk(ZjLmukGFF8$+|+t=RRrbx zg>hnS8ZG4PnwwdAZaj}6Nt&vQkCGEAl$VrSr!Qo-e=M&N~DPyngN5UnbP z8XYH?gl-*%b-ZJSHwdYxJMQ`!>jLcrBqTxZX|}1O5P<1`F*cF%d(^vis-_Axy^*et ztEC7X!Az{Jx~?sybbFd>X48VE;G=gIO`9pfKjAAbd*S5T6i1Pq0yh-{h;u=kh&<9~ zjtzqxs(nwsn_IUMMR?9(vM7w4ia{B${#%qTsarESxM6`Y=8q#a?;d)wQ#Q&i1Hid2 zoKgbxAAWZpSJrgJ6!_@&Z&WWGBM0xUS>SRRu^_`#67SRX)H!_S3nI50j6&Ns0Bqbo z9&D84I_^^@_r`0%2_4h&f=XmQDv$r_<0T4_!OQ+mK}o=31`qrgoL3iZ4ostjBwlJ* zLV%Q3fF(GnObS|3G8p{p&GPCQ5%JZUfgBcNRAXTh z%KdTZkHaX4FRmmjl(wN@8tOR*wV?b_M0924gApgJRV8Q0NLZ`XG8G-B)G(8tjRC}o z5jSn+Lh{$Pl8HJ4!9?gGk9#q|7nW0LDA)ExFP)^?71p`yp@-(frGxz;fVH-(QqoU6 zQ(*pUI!TsaD;HO&boJnNyVjqKWW_Sbx0>iAP)U%wZp2KXa-wM_I#qELmn=(TtdJ~i z;FMY5DQW;WELK}`)aP`!r;Ld;uM5^k0Uz%B3WV#cZo;RPKWjSbhX?L_mPg=6PT7c~ z0)@p<*SFIJwm6C>T{DV<+M@PNisE%Kf5HKvGfwW8yMmDf0FIk{CBtU6)@=$k!x?G~ zQo)RW`>u@q%-qP)0q-1si}}wt{gSg-O0^*@oWw z?QeT(CW=|fdcO3=xBqrp!I0s(XDt9$=tV>}>21?YrwgI%#YK3|MKz4Egil2LC5pboVn8bFONykcNl?}s4x{y&%MR}O?0+nCJ0oT2+Etd+v z9Gn_#2Eg+@wrbm+^a3JMTCNd#@wK=2u0FYDsa#1#uWe z;35^^fMGGa%nHlb&4tG8YrBHFlq(f>HYQZ~+Fb9lG)c~yB}Au83w&N`n4SI*fNiGU z*&BzJZ7A;Ua#=L@{AxEpy=J=bhLKYgH0*jhHz8FrwtiC0UsvSI}!{x;&h7 z8ty{5Sn0vmmK@79sT}H*%w$P$PIve=;usjrPr{Tf~_i*uFOgjO9$(^WFw~jSUD>xO4T9xSN7;@9{LzVrvv*p1IaP~h; z4|#i|Q122A4m=h6(9D}E{p%D&szOk(MujF-_lp9tWkVC;W8kC10N`rI%NvF&5|6@I z=0nuLXJW{58gs67JGK9zot>7WVKR!)xloyx)MQ3)9vK!B0z+aR2X4&_{e+0Y0k>i> z#%|u|0Jv}|wZ*jBPOII1Z{sl6(d79)WvdoR_{`&_7R9%_*?J|gTC-N4Tz&DaYip~i zdPn0dA8p0}KXb+vJhBK!>l2ZSYgE;tHWNuTL(4Jah---#3&x?IJ1U+6O-yQ7WhmMX z2PZ~i9C53}^cH$B4OJZ;CKzLkBaUKk2vM=j*E+Pf&HU-ppIv+FoqcujB0qlp_1#Z= zVij_FvfvIe0glM$tE&u%_x9s*j-y*&aRA;M51N%!Dd5af3&6`i-PDIwIAuTbB!1>| z=k%An{>GO2(lxPZ3aOCf`=rV7R@sy>C&ryn-X>5xIDw@i;*!sNscCW1*T+OtZwW`@ z4qwwmFkJ2P&Yl*FM|DX7v{#+Mft1qMDM1zJ0-@7?Ha20W|a&sry(i(7lYS9>{QH1o2`U!mWDr#R8z(vN%^mBE0hhUF~FFCa!U{@0T%nQU1p@ZM>%fdOKK(TeTtk~=ca8=GN z7XSdnFQtL-S!?C&XzyNC_W(Z3u4H?BbW(~9>G@Sx>~O*}Wte=2yWQ&K-(fIYbHG{< z@9@&M2A}y_{e)jhw@VAhCqiHP>LqDf_SXOWm8bsG?|cLtRT@K!PnEmZJdyh`)Zw^i ztvS$Ie=wW=-hD3wV3DXlPwHC9=&n<>)aFJGM6zTP*FsRK}1bO1is^8s#;O|CUYQxQ_6JVaHaLKa=4q$ou$9C99p3w3x%Nn1G#T5j32 zh^6X%f`4KbKG*kYwF@%A53V0xzLFr{J1_5DdOZ7__g+2x?3WhiT+SE2fB4*&#ha|O zQ8zjtrb3RnR#7uNuXR!bmdgISd%KWU`1l zlN@^E35`DVqtHjSCHYDwGc|iSDB04IX_rjRHiVnP+8Qby%qB)924LI?YD>=H;h^2F z>$O>MUP;adKfE=OMYCca0%_*i6@$t(p&t$QqNRE!ogLGcXkMuop)aT8Lp5{_1GB~k z+@={$l)Y3WTN|)kv7sxB=ZTA7tbVmyW8jFwl#wJ|HOl*y{EasX8Doa|ktWnc_gC9w z&r>-%&`~qBpDrX7mnQb|PkubLCkW57=qIF8|-;nvBVJ-g1;Jw!BJ$oaD7P%t^D{yK!nK>GI7+4oj%(KsuU=`-jDu<}6Lbp( z@P&r)*t3i8y>fK%@i>)~YWVSqryhL$t!(Pq(8AuOh1x-9IOp1z1IsHH-*~lUdwAfJ zFDAIk&e2$PK;x2JAOzLI)j!*k+e|Kt?%y#-rQ!7_p-%`^e0l6zrugxe?8UXi(A(l-@ zP2gKMb{}{s5nA2b^-iBJ^BHicQ#t`4<|?_-4WtxoFcSdx$1$Diao1PX6t`}gmXJXZ zCB9AoaJ{)j?aQN$iEjAJC1->E=Zb#BTO7dN|ZgKEY$1fs$WzMQ1_F%gY{+W|N!2!J{|u3Uj6)K_i_ ze~WU{q!nnUBy(AM3X{{ta%-ki`>M4afH&7%JrIW$+!Hm@8%EH^D=8|SeCPN;=Rf)S zrw8c<#Bcwakgv;tC|-^Sm;l&}L9CoulL^lRQvM3Yy*cMJbUH0*AISn(&eYj zNArp73Ifk4Zl=1?3=GRZ#2NO>GG0Nr~NL)i5}W1w)$G4UeE?L+V3)eR4=FV&;7KC+LO0luAd;Wpdjaz=~b5_8h z6kq%9U20;nGY^VB+{(Gu?%ktUGt3$ucyXB6wwTh<0kTU*)wrO|HpMLy| z__sEWa_zmO&3RQOh3~$(twvUwP1En}5qvhArW|hh7!K1G=g^hkSuty-gOGlRLb51` zgGod;FVTYBx)F!5KZ$jEyr9@{o-~hvddZpgLW=g1%+EkeM9JuFPt{Fhn9S8H0lm=I z+ITJLX*%wRe!t3zTW3lKx5jd*%Tk16$btj|z+V(!Y=U48SY~lcRgxu$mTUm{kN&0r z(SQAar$F?a*_NF)(Ewd};+U+?oEiYaNn#N{69abt34lB6zYpNz1ydDlXC3-S7g(ef z9VJI>R{O7w3z@pzL$CXz?1Syguk2qFP(9CfwCHG_u>p*ZA^_nep504j0K6;z<;wMc z4xqd8pC9|qfy^5&PMY$sp#FcXsfKz(*d;@d5(V^faB;H*$@$`jrHbZUb>N6T zJ`^T@oCAR;`z1+h23N0$#PQM-l@coVItLj`Gv!k@(8yt0@m_(wr3(UgTjYzeDK04Td=e_OPu zBa6sA+KprjDp2T0ZcUM%_~al^tTD?mf^lTJhVrqfEjc-i5hu{8Wc`M`QP5a*<0$qt zOO}^ky8G$RoFmjsHEhzd;~RIT0M1`b6=y8R$n%q=TYvi znq-o2o=E086@x72h;^?C5%Xjf#Q-qaow`*+>JP}d((lI5hUf~9-}ZV?h+}VXJlopirqURRNlC0B4?9+}t{zPJL%RYP1{x{qBim4ibyB z?~PBm2#Ki+DI$2n<9OTABFke6aqX(%Jm|L1IslYS_o=V^I{?EjJbddUUm#J0mAk!V zm|XS$N)1B=cpho83mvgRE(7=zPn>$^oo&o~Hk~ncIJa5#vsZeLKifRv>RGK7XjIB_3IOH} z0$GCQcEvEl(CFA2xKiiDAf|HxX_Ohg<%t>qXyWSHwxZ< zf9J_Zl9r^@Uj#VMh{S&WOBdhz*%mWVY8iSe_S)=U50h3x2+X$soXD z<_hpq-JJBovnx(I3rtN_0$5vW+`4&CUnw4!93A?tvjk(D7yzkeJUGqs(8^c3k7RGI zSF_WtVnKB|I+`FY{bg7*%)p51m^* zO4}B|!`cG4b!%4%`e*?S&+w&5)*zV1`h}*AQjx<++YbQg@A%_b7bVbV{0*^F!Ks-2 z-DLNl4#HC1WQ@^Rog!pWf0PRT#Dt0?9%`x%PQ@UwoPYf07avOf%t%TPYUVyqUpcRp zUb64`&>69OuYGv05QhKlU%i)k$?4%D0Ia>xdtd;d_u|*))h7@A)?;-UksM!GCImhB zU`u_LC3D4_Z)t~zpV&!NB*f9b(vH(;cwxJCOv@gGM42+%rb5UJyxf$Eh zS?MKbyua-OSiI~4FrNH(^Ix&`?cWh!`0PIeFnRy;<>!Rir#g2QvxLHnRWfA1jQf*F zWFy3^jAQUbeOq?XIb+PJ7`igcWDo}9NY!lXOAh&t`NN2rDVQ-Grm`PhEzh(VOO^7u zX;E^?AUXXU7#++~?v^E#eyHvuW|IA$_@$GcUuqA|Tx0?<_w*{|jPWJ4Ft`=vF z+^rB?D02V!;7;Z2CESDW9wr$i00)BL2t4)J`M2Ipsf4tu80z`uh4Z=|cm5dO8I;cz zeF1GI4W-VO&=O9d?1ok8H% zO}B1lIMU^YSz?t^3!{S(q^&m{&t6&C8Kkxkr()0(CY`X0yH~Cxb19EMasK)TcOeKb z+^HA~ga_DV)(B?*%3HDNIpPJ5ySHAkW2U45^nuN(Y zx9fPRA1YCfqd4OW_K8QS(uCLFTTk`%FN?+h>Id0r{pPJYfacl@H~#pSMRa)fFS7Ba z(mw%v^P6Jd3Hv{2H@iA}*Y9DKkCgP#0MZ{q88Jz=Z$zAq0RbS?v%@^-u znbqV#S{_8l9j(EyVT$2K@+C5uzW$G8aWPqGE5Gv30etYy&(Dk|{gLSW3h!%nHi1IKl?_{2hrc2B&B}wFT7=okJG&R>PrA{6Q&kYX1m<%E&l-{_Sj|RC@o5>3Y z2dQ}&(`5<_I498@CU-;iZw~O*IadP!7Wk2R8=BCvD+bkj{c&ioMWTNK9Cjz|RvEzC zKRsM~5^!gdwvT#2ZAFw@RatC(edEG~^9n5U$*KMX9adG@_O17}pAvkfnfY*MW2~QC zrL5$QL#4{Z0UnWNI@3$LBEqPes^CUxsM5T(OXlb((D?VF9YxL2X)j1bHMJi|87&D9 zO$XUqZhRERx|XIF)4lBtqn+LUrL!XM+}Z7izIprhmb@twyiC8F51>&gr*F*E%A~P` zQ_igRjI`ZoTX9ZBofbUj+^rbXWEux*c%OM3iX|>*pLh&f%v=k9X)#l_O*aLX-P7hN z7m6YPjE;iEbK)1dRZ$Vu#i6Lb@cPXi0G`&-DI3Ww?7MGm0;n%LI&aAGeqM}x=9$xP zysJ+DhIO7pSq~0^}5n(NU0wUYIs(NI<2SBlLN5O;|9g z*uu1#X&bt+E1mgZ8qtTkH8c3ZiGK1|KAXBpNZpoU%OUmeK={BWq$=dqKxOK(NbvBES)>r=< z+F#%O*TRML^4I_QF}J{PRV@|tQ4U8k0*V|<*n1D(P0owB2i&X>QORq?oPJe9|PEV`*7{ac3~IFnfTBMK~xqyel4~mXr>m$ z-cRzlIqu>ETv(L+coTk9Pa15o?$@RPBo`$?68aCk6fsASkPJf%j|)N0VW`xIlyXW^ zVCaP$Tn(Y;HL2UJ#hvXv+8HOkd|icC+tyQ$o&)g8Ya+g$bc6b;!)3jT`jO0lVIJed zM;r9r>Cw5x#Z0Rs`QL#7;N_RZ4&~dyLzh>yr5n%Ekq5v-HO3GEXq`=M9Nq0Hoit`3 zqY>KOOhGj!p>I@4Wb9u@8(=>Du|#nhv6pbO`{TdqOPu zAHS3CW&T7gl7-JWGSh`O3f-!;{c@-9_ul*FuZk@8;p6*%%6jGCy#jwUeH!)VpFWes zxa)DHW{+hBsJ>=TZbx(0kT(sLZ`#IR-_N903)PlQ_79_tAO)gDha2BFUGCnE$YLfK zIPIbSB%*3=QaRx~3L+~J<7Af2WVQzYK_^mTK+H^8VwpCJrpW{`8HEDyM-c}sU%5qs zlk~HMU0Lnn{y6f+VY0uI7np6RY)McIIO;2oTXm$xyvSG`=`;l3XnidED>PEgRbJcQ z^T_;}Nl5`JAs%^%gP*K%IIX|a_%}muy8tg@OGQSjM_V?Pd)7_e?7uqGWo#w+P za;&++SGi>na61wwOfS6#*8q5Y9_P8;jS`0#wYVD8qf8G2_osYxi?;Z9gf4?i#i zH*f68_74X~;K3V&L=e3`Sce=L47}*MUrdRV{q&U^+As;q4U5u2g*WQU)K}an;7Ug+ zj)eb=k{wS{RogVv@dt_5(0sFwpivm}SSv_|ab>|8cS10c-l=HVu9$pwt8O}uYLZ-5 zD-r;qU*VL=o+Z?SElPPS5`a|(+1ox)_)P(gJ~ynRW-7lLMmq3Q`#>>f^GCve_LD4D zwJ^1ojgXsn-*F5akC(ssg$w%s4sztoAmjk9KD1h`WYHoFgA9V6DM~I=4ahJA@Y3tA zg<*E%u2m};5G4lu#Zw}i+&;{f!9VxJqFb&4`2H&?durpQlDY$X^}$K@nbprWC~(>N zY5ye8fAgDT0C|fvb)5Z`R{-4m%TFy{ei@P?B%R12$XTQL2f23dee)kOuwmo(@1u8c z-hSw+_-=1}cho-Xs)B9r1G&#!uuk}Hd=Jn3R#jkU=tY!lnYJM(c(~FHvC9Utj5z6< zab_@olx$Q?{)sl($WKl~S9DyW{!UT_R^#m*dviajMGh(4z?5gYQ4I{&bYA4gl z(5tE5C@FMjbiAg6z^~#*G0Y0?xt{uN3eHyMf;LR9~iWMg?*TGs8wvXG!M$$!I?Q+MsIv|KapE{@eGzmz0iG9(+up^;fF^uD^DFJ&V?}FZMq4$rih{l%%j$ zwQT`BmmLTl8Ll;TRCOzrrj!kUml`&K*+iS~gbgd{eJ0M1T-=k%luH~!<~Iz|*3NRt z8;|P~Bc{ugd%NW8S}G_`?j?>Wic9IK0IOv9qljk0oU)-50}O*z(^*51B+IsB-)A#T+GD6QcD z7B7||{b7^^t7<#xlG#p~kvLiU-7J~utI=B_X=`boB!APdk#!fZ?IHx}bN^;Wll6AKjS%SU6ii7uxt)XBdtFES*h}mWd@)cr;cW zm59%wqUhVV26d(cFjLPmbv6nuV4|X^IxU;A3MTznC3Dk3G#x~VGHNyT5tKerGB-L3 zh^$M|Br`D`M2f9SFC-zl`ie_z*f-wTdghtarj5u?q>iZ1P2W&GsGv8Fc)k`Lhp=2m z^$GRNOx7zxpEUm{qpw!g@?An%#W2$Q%5K%tExpQ3YtjqVGeeJue@!u!al)Qu$<1ME zVyYgTSx(hYd|#{t$4RAD=gyp!k7rAQUKlA5{plNTq@yd;LRTvna}B^n}Mr^aWGk#8Z%Y z{tNEL3m!hEYU6ff#Mzk^k!cMNJzagxb`8S@IFtSrNndk%qnD3mpMHAn z%{O;SEfYZNzV$~_>s0A<>muFj>)RJDoCeUUpfipZibf0Qm%0sBU368qud(JzRg@H& zg#du|BX1l5+^|z=glQVm{zAq#fl#Uo`%z6R#EnJ13jpiy-?{L}MLj<#w=8cMIwqc>C?`C!ah8DXH2V*q-HaaP>j{VYIW8+AJ*hn0+%- zwv7T#JF=etsW6eKC>rrK+v|lSc4nw31U70`l32B>KgS~=Cj_Aeto>o6Bn9YOu^GRK z8l1vnMK<+ySWyf^mT{2bHs}d0&rPvn!1eKOG z>8qBCSY4Fh`#gQ&$P7C1Q6!lkTGL8nm`+9NpRdSbjWNq zldl&>^2DZv-X1#LXf$d7UcbI|au8J&-Ni3_TOu)o*5E>?P zDonvAfgC~0bP(z!loU=&wvMWE5EVsrG3jO-r$3a=yuz)dOkFWE_G*Fzlv0vQifNhN zq?(M30IN=mGr zpG7ZI7G0N@as}Ioz;zu&Ke%~g{>Kr54u-@0h_;#mRUq1^*N)#eq7Xo{)il#}kxyJn zW|kC=K6&L~^pu@lN3bF?|RG^Hz-*{p2=x2^03cdZK(Y(BdrJ&)? z3%dZytJY{gw492OO?_lNhc-v4yaTddUXXL*ghs(Mob*JFpI{hA=ttg=Cn*s}ZQ1GE zO|~|21Li<)d!p@(9N7x85P}C6RK{}4&^=dzX>2+Q3X<@d?o6Iqs$BSb>eV?entzr? zfC4z>zQZj|R8P9JpK@xl<>@=7YQKvTmXYf^M{{Wk_hkb0>|>{2d3UQ2p2xjOO?E*D zIOWi%IhGfQRP_xrDMK>AG!s#tD2x*6Z3CvmG66(1j_FEq&b487KIsS5g={{4@ydhy zdmG8(=@$cMzNR-l3@Q7Z)e+2NWa!o1-?Q`2f=FFb!e6%(Wzt9IF> zk|}kGc$5N5{h-^5YMbSzp{oRhUSd~CzMF(tDy>v0*YMD{97COaRX0{~kNVu!>5>|2 z0Z=V7ZxktS77BwhDWFPxr-O*_HSi);Y9>FlNN)f2*bzN0tro?xq_o|k#X5{jx z-#yU<{o*H54gsD_DBWCDRtL-M9xaQpo*%3(uM|Ef!)Mvt+C1Sh8w`hOq?D&94WhMb z87LQ)b5o&YD=Vd<+@y36y>RZL`Y(VRcT*h0-~Erjtp1(BQS0^ODzrXT1<<`d0$@5u zc+|6j?He(GwTBw1g3XETMMeB^`!`C5Ujjf*-LsA}k7+4BKamJgW)$U_FO-#ynypRW zcHZ?IY4)B`Jxj%!=N$mOcY6RzRa5z>h;udV2l@yaE#kvFV=X_EBY-ulR5O*PHozy{ z$Sx3U25z6;*x(tiy zx~ciqqW$Xhg)G6enKl6>#}?z_i>Y9bdZ^?y5(P0~m`VgEy^wRR(n`vAgQ?%p+Oet& z>*VV81Xp>NQ-ZXkNebISFQH076Ye2U)Y(#uu_Emr@g36IJrQa5polG%M@K(x-+00~ z%Zw-ifXSp_NqC-r`COaInDdWTbKyj*g|XfJJ>NfGsqXM7I|Pzxl#1UQcmNh!1zOFS zp6KF2!E>SVf4fK~ zmk^Z9UJB-<^S|^2PThH2Tx@)v*ZvZ~C~fR<_XQuoFZ}J|iyj0qq2~SWtHXX!s+vWc zRn_nY3Fd`CJn8vrfHDkXQ+D8;GE=-+!S^XMe;g)rCX%LWIVQlUk;9Yrr#?x{6*;Kf zFabX4N4iL4#_NhajA|>6DkrM%5c;tmrYUZ1Fb$DNl8f#N`F}9WjHbtJ-e&Cjd5gy39&OFA7_p`p}3H({U<>p1~Lv ztEGnrCjCHVqs$bIIu1_ypSt&;+zqfB8(`+2fv+uxhH zvia;uutqOD^RZNfJ`+@UXAsM>=Qu%-NQ>{JX* zphrBXvFcEMtZVlu;HTQpEW#9f>7?bB=boN7xL+;{-r2dOZ0OYQi=0mf(Q2i3!q45^ z-^-z(BYT|5#ogLW#d&VIly8*k{Y(AmbVW5w2hoLA`M&?g@eA@0!%Az$_Pyy_3|D!MH8}4A=*Sq=> zEI9|9ish#^N1l-HIXHOar_5lr(w5+7+O8%F$CDDVG)&gE@@{JAu)6F>{k&NFt6Z#g zBhy&o(vS#1IE~VXS#V*fLYrn(3O)M4ev(Lqz%d2!001BWNklo!b%1O(O#(<|nyCHBau$-dio(ted|rK2;Oi{+#Gk#kEo*LSSTi&DnELH3 z-9HMZk>2!5(?_9CA9};6vQRt`m63>h<^8R3H=&b+2bSK3RR6y8=-Qo~d(cRmWyO&m zh}&br#DzFrssXs2M&jmbK%`A~M{~?r47^PSIi`{s@#Kv_B}U3KS*1{mXV2)59Nf95 z;yJzHH|~bYU|co}n10UnHeTkW5tgWOv0ezxDEv|1IWZ4_4m^eyS`C-cwQzVX^efXrsq0kB*z*x5>MLHe?|*aF}> zGcz08wgKGP*q8y&rCc;DvbWArcV;QLT=FKxvlDi%r2N3e6Lo55WyyI29cY4|N&+x{ ztZ(hj`coc6lN;pe2>>JVhqoEhVhFm!s6KqM`-5Lgigsxsz~0L5CUB_9u!LKj%(?;W z-1HP+_iuTPX7Y(o{`$Oxb&w9|U;RHsIF+f{UjB4x{pAoq{XscSwrBwuz8emuikYg} z+6Dt)F_zj=%Pq5WR|T_NIA3xA7#(;#ZMIZynes;B0P{v7cT8?<4YEp(sa5|H&Low0 zGRm|tQz?|3N95CC1PJkZ_1=E50lG9Tat-atJWfBC)OJ+uE(&6q{c?XCanAL+YpYsZ zT%9EZstU6TI6synn29);d!{(RLJiytn1G&XhV6ZAfl? zQnO}iC@SEzT{HAjWy$J7_U90AazT~y^npcx66xV)lC4I<^FYmsYSyPfdSoSzIJFpc zWU`#(wVApx{jcg)(n-rSeM3JcOr?^8dUAiytF@hEO44Lbh56%H>Pe;QtA&KANiWpP z-Lp7TjaygKtD)d3oO&fH}7Q-lpu5dG4-YZPM<1pO80!RbaW8Cy?!U1Sr$-B zCX?x4IChmWK9Ce(w)hBy^R{p@}9cfavW%xwVw>o;G{1}JZqMTq-Ej{}=O9-aAI_2fI) z!q@(w^R53b51jdf%(?-XYsLxRT=!7>+<(}Z51bD?BUTgvXKGj9@ByF(Xp$1f`@cI_ z6ymp*6xnU6}zZiC;Je43iBHyv+V0!~`@+FnVy(Ph36#rnHI- z69CKgX}D8P?3YOpl>@e80L)K6*)UUKuiS39;)dyOTW*><{Dpo@9V!~}?C*L~Gl2uB zH0>(vgY8MWFq^#o?mb`4Zq^pfyLb1yBMunNO03{>7N8dX^?r|c-`rNI=M$eiy?%G! zuu@-=f&+yU2}_fsR5$euNf9;aGG&OGL^H{xAnI%@qGm>&oGPNWYx?8Jat-~m(a^{z zeo=(mFTMPs44dGMB4@_T2?2l(kfQ$EbsEdTV9ztO9a;frttd+-s387}8_U=;vjJ@J( zM_58YqHskPqOSrtT)#F8LGx`+0Q&1qiM-t}8S$qN-?)!S&^zm5 zvZ}qL3A0$JE!y|B%}zEy55Vm{o4VbEAiKoF>3}oFHRCWqNnyt@%X+5}qeFo-JgIz& z5;2dJVy&1SQNz^qpyo!)P1mTncDfoI+FB`0HJmtj=tt=a8xMW16ZxoS3os5oJ_%xGDs7(?O_r=}0U)k0{i+EH^D(>ddJadS(+xoREx^&y=8@F4V5rH_W8a zYG&}L>&!uukWF@K>Ap_D*(#%(ZuTiB*KB#MA2l0h;V0^-PkA9TQAl#62laH5UZtO( z;gR1um24a}tu9BLsf9CT?d8@$i#wT-)Qv62v{H^{FfAkB38pWgs@$q{JUj^eaip(X z8uJ#!}Ms*FY>0M%+iidHF?^MF@)1VI5Oz|2);<2c9!D5>X51}1@MyOorJ zm9pmh>j!xd-Pu3TFNb~zZ_y6~h~fkW-H;yL0HRWSk}dAxXYAYW{$naWg{!}JLhw60 zU?>`bm~%9woz%vw&jDyvpUsA5^`O$fbEL2W;0c9U}#YEC%O;124C6 z@;Kr;O;qHgB~x``$Q)D<9GVtjYD#Q;c<7btR*pK!8cS~fAiIJ&j~Fwbe54KF+I!h9 zg5TM57FMX2xiHr^G4^{pe2VLorhv{eP&~cd27qM%*zG3r(1fPd8PQfI2hwvX!(=+v z=7tRzQ8X3VB-5z7eC5>o-Q-k+^K^ex6N=qlD3bDeKrK(zTrVUNv}W9-z5dK%aqD!l zEq1j0$uLLX;008AstvX)iZC_bq$S*vl3bMPYEMqSnAffWfQ>0x1XK)>7HiECZ%>b zGZ{E)Dud>9uTGPolP3nk>h@0Fij&Dnitj@zMNWkgnszrQ`YxC;;-Ki*ku>Ny)IOMV zoxcM~ATqUWT`L!Jfa|7-0Q34GN!HOL{as&a6;&2&4M;f1PQ-;ug2%mZ);!7ZD0=Ma zY*SMisu)gFCjp%__E}r(?;PdJvnL9*(j-j9&&-oEG22p+fO8f<6KRU3T{80u2Hr?d zYi82c+|Z2?lpCvox398%5lG2>WZVgviINaT&f?{yA7&^&^Ha~s2Fm9}RH2L8K~6WO z@`)99u;(d%Y#ygbKpDw8R59*^Ix}djvD>H&P^fYTIp}q)&|N+QR*gno=&rHm_IJEY z%tR~Pty;?3OjTKs8%r%;e>@MC+3Ghl0JNILd-3VhXEF$S{!*#{yK%eN5rIIo5J8`R zeJ6vU4_-)ajR9#O7l~<9D&?b2XF4rN-7GnJSqP#;k)4I0moAOgdSsXye z!FV!(rgod!@#08FP|q*=IYlo#7BAItTcb^#UlDcwjiQ0Q-S7-+fmtFb=3>WW8u%r8 z3S5lVyERjhZX#_^Bo4S?v!v0&MGcMTl#@881}Dm?Rv(`XqLf@w*&urh+M%+0;*>)p z%o;W$<4+a-YUN^<2sp_Udhucj(lilZm4(zdQJWf-_nZ zc_rL*4ff+YPGX>#K|~!g^E)!&pq-O61`~DndyG%}8k>U?@-Uz64q*3~IkP>%- zE|inF6FFk~R1q6XXrSu@qjLS9Q0Q)S=!YIxJ|v`drwiRd)4EgHry4?C+p3dWA z!7_jR^^bl8APU1@{mNJJeq`;BMve^m&2)X5H9mP%qVXF!w$5C|ai z^CbF%4?b|QU=7zQc?6~Lm z!YUBmFDmC81ELflJ@+jDH~#o*5B&$>cKTU?r)&w561JvKb0l|Xq_&pAHo41X+2Jfr=0V{+hcklmMkY; zkc1_Uo;0~{nqtysP8N9e(UoiO?aeY7CQVv$Pb9XE+W17pc$}15$v`oj?Gte0uJ_P6 z_t;d@E}6QLYMzz}jhRVsqCY>5xL!XrOh(F!VqMRkT4~Di=A;)k9%TKS*$;jFM;khJ z2GfWcs5i_(|Ndn0MFxC7H5*z*sy*z6E|=TvPCZk>CY7I5pg^djHw*o7oGELot57I$ z2Vf!X21?keRPOZjw9>LNhM@i^Y@I3Td>_?<>26LD00%BK^Hc!o-|^6Dg{yN zX@+VZEc3^Azw;dcI)cuE%shg&mzM8c|7qc0X_`Vu(1Sy92T_-xSt(werIH&)k?$Au z1v8?u0G@dCk!$ays%Fuj@`R&CBbgTUC9%jUdaaI^ z*&?dUYx5wwEUP$$AUe;>12IWilSq++9?&zHy<;_0PEUA1(8Q%c>@i>-z9U+1x6c6N47_*J|8ln7D1HZyzv@Lq4u`{Y41wf5w+=gxI)c;J7CCzDAbBexhq)8D5$ zdrtJRN3P7bVpbrUPZ?DyIDZ@+b*;I0ra+V?H4F2<>=kJ>kv7~ef>`mPH*#wAwQ4aC z?(FT&|1Anc-@aX}3sEX++{}khv4%e*etT!#KlNx+aoM(hT8y3QI4jN6bnMiD^CZ|= zT{OuJ5K{eM4t6d+=2)f;4xW~yV*reR16&)sOv%~>UhI^0-(!S6H?;*h)is$ z&JsL5P@n7qoZD41y$y-9RSWi66o{=N^2n^i0#CtbW~@^}GS@0;35A$*ReluxQ3agM zQ!aq+)p`t&-(_KS4S=Q!edjT_4`^gOB1g7_mJ?P|0u&PI02AmG&TGIbuh4(DF2 z?GPRlImqAWWZ*NOH;bEOu8@M;S{d%_=vYPksadosy^5IPv9Iq`RqWJ?B3 zy;cC~s(V^0xkov@p;?_v08?*DWFp%x076wVH4Sqirvas)HH~< zP4AK@7jsO9Q5?m(IG|H8LNAsYbqwH|05=~U1;P-MCHa9$3kC;==gvAe?q*9mr2a$x zLb}y3CGM*DNsnjX4LPMARk@`x+5Gb}iL7E8Q++sJvu$50rvZMZ^YARqApQBN3@k0M zZnP`&Q%@Z=?`zTLM?CEkfx4k*v`=cC%WLW9TSb)PnUy6utE01yN&hxeafR0Av`Z<# zquf!QA~idtnxGlM3W`eX}WSBS0Lc=)6zO&0gM-A>^Xu3vu_03qm~{F^_;zyE^+ zAATry`G+5Va8@Z&pC>sXf&%#S7q{{Vy0~)o*l%UXNd5Nudj7AZc$Yy?l`>AIQ)Vze zLkyijR5@{`Zd*B#se@?7?|NoJ90maHZf+J9rRhN(LB~=ra6FmLp+^yj-rOD(2RFlR z21HMemkDIfKDK|@0Z^)1)6wxZXKTOuebcP~@P`oqZ+G6d^T3yvHh)r_H`_V0ySv{J z>Ja5~KLil^J^<@TLMFIWGvGi@i_*^37&&+pY6VrU*e)F4rEIN_i&Rd&A_@#?ctUOx zVFvu{)RxT|)ltd*IuUP>xnro;tT+Jfq)Ztz(u4juQp)vOr8{{-rtF!ApL3^|^})*g zad&IKzLE_v)h3u>)-=~#orI~1d#Z?+QGFxrx}-8A^$j$pv6=Z?y{1QvF}-Q0k1-G- zQ>S7QJm@t;{rRS4m=;DFv&{bal9Niy)=4gE#IvB-YiDBu*0+KCz+iRin2~**Jx(|p{bM*9 z;Q#mI!w+wcM#C?E@rwmtSkihGh%T)pBVkJ`zYO60SH3p~L6tsE=D2z92*8791w_65 z?)Ch0YSnTff?Bg{;7TuAfoS2lXJIW@<(IPxwyCXVGsX8IfGk8%l}#3A)fsx!EW9i{ z?mNYtdt};{1fOCVeEqvB%gp8*vY%3J82~1C<>a&@Zk|)0X=*pVxH?L}Ruyc;GTZfP zSAQ&W^lP6Jx1MH0W{J089AKPtTh;@^AWnl#s8ERm^<_6o7j;8FPDEqD4Le)w34JuW6p86hul2hEix_;v(04G=O`xq?oevbG0{`1cRC`8akquFRQ z0gQ`q=#giI$wncFDoMFKh;DCfY;TFUp;;>!74M84#s= zFc@dY{Vm^E`BX#IfhaB9c%k@iAKdbd`iwC2Q!l2@Fx{NgH6+BUwrzm-cT-d#9`mY3 z#3hF>fr6b7;I`H}VqoB0vV_EI8ml(_^JsknpuX%Xq@+A+n4wxUPO&sxQKg!p2Rlqga^YrwtzU<^n!TO0}V2U700sFnwSyu+$Xq9!&P2q~7eIsoh!)o)XXMY?Bp&zVzy=9}~cx2rn;QOlV5p zbPC|!=G_y%2O;R!|JH977bo0O9zkzQMvSv~5rBVmr|`7|qQCa(wZgylhSLm!wwkq* z|8&Q3lyXpEeyM|Kp=SLo1XUuvCwb>W$SefW+gmd!vW`rh6^MT9c&YzSXI(&mrMoQ8 zrjjgv;oJ0&qZhtPo4euYs&m>2^p$d4lAh|v-kUS009Dc{PQ`9auALU$$x7Che$Vdv z!_3cHyik#P2pl|d0pk+zHLY6OCOD7`xrftO8(HL5$rS7xb&*O20H#rKr)ft|xq~yN zC7SXyv9v)7ryMK8=<&yq?pLgn9tq^~jGK(ZaA6(>VEe$YmKoh7b18>RYHK9~&6JKSElcaX`||d+U$4{4^fH6lFc@qHAV`9g2#_{OQ8Z1` z7D0=qNLwT=fABf_VxMDMlqibwITS@(f{!g3lt_Z0B!Jjv27^XpF#Ak*Pw(BY`|WG( zdsg^EWJX2CmRVIS=cO~IZ|?-(I3O>bdB$2X;Fho4=)-v%#3k$d#&uF|N_|BOa#9S@ z+P+1OTe=}w>}(V}xJzQ~trI^!2>@^Ze_~~ucs{}yovlr8MQ7}ct-BHoq<%6LVUG)E zx+UN%Hju?g${&jmqW%rdYA>@>(=^j#!{Oyh1Z(Z zDV;kfu4Be4%MX8;OiYcJ!i$Aph2$JLf21aH)boepjw}`|H zEDS3%69J%FtCILq-qx&DD>8h({?=OnU_~t$Wg}gEes-Q;TB}woNx|jyY6+iv^a239 zbLFi82&#Z3-_q#}q*cL0n4lPKFf$?Uc`X@T}0(?hUn>87QVs7rce zXI!by@tyTZoq0Y?UOxdRQMX~d$INBW?=+rmw5px^SN0D*njdUjjvmSj)elHp{Wo`+ z(8KYu%R5H%VG&E=t;X z!Uh~;L5?rQcO_X0*nP^caWY050VnaDGLBY0Acz>dbZIc}F1pbCC1x>an|3@=sV>au zY96G}2Twlwz8L))Un8FO-!i2@BTWx@WO70PppWqn=_sZFbAf zJ#MTyyNu1J0O0o5dcmH@J~a*i%P%@3kC}I#)%>{}0Ia?2nCvKl+Iw99Fg1-Vdi4T% z@}810$Q>6b?e9FcQ=JvQPQ_)d>u9w*HVw~2E{Y`x$i&=*3L^Mql*R}+wO&w+I4F_r zGc~Cnj3F5TrzcT?evjQ+hU_Tdu3#}D>FtKi%I;9P3PSrhITm4phU_+C%4*U{3mE^X z>oY;4P047&s2AG22a?e-C-;somEmaDM$9LS@QoSOn1#K8TlBRcu@pv4>qZY*DaR#4bW32ro z(_ovLp1FAG5?!%!)a{WIr#3cL`r2hk`(kc(9smeIecSf#J^(ZtjmOTN6?-p4MYb6; zR7TJ*eDfXveCFfF#h%ZVJsP43Zu)}5Vub`H{#bR`EruxOrRV+cxHZu@h~8S=W9(o- z&vHY4BD(hKd+L%sf9enbynT&bYH4lSV<#;Ds03K|F^^+cP;|}PtZgn0dB1Qo7d3WH+-U~_Yu zp8@cVK=jV0V7-%gj~R%D9VOe}FMa;h61_bG&UW786iK-u6agW6=WDwFaN^UG;EIHk zLiF`@_C_L>QQI#Oa0=}K+?Jjk+g~jMw?vp-ifTXnJCD=~o|=?+6sENTbc3#b>^e)S zhlZ8C=zyRWWv7}kgZD#5VmjlJWmM4_Npx)F5nVcqKTA{HmJW!`5? z`HCy9OLG+fV(~aV!zMmkXVCDfzkcYMrxlN#At>)BU%v7k#qM;$XTC86efP#qW`kTd zBb`lFs>PyD0U#Qp*B`La0KBAdud6LL`sxv(o0w-GaYUVT?{F+*=NOe8zI&~A@m9=a ze71Dkd#iWZAN-kgvDJG~>+Ac(?wptc0BCTlIuSQ6@BX(6*kRk*M*uK(#(A)Xcb$Fg zF2d|IYlSvta3D-ggxr#yUA)ppJuw_4t9zE1&6w^4+qxF4$-$B_0b?mw(45pxvDlwK z>aE2{bm?$-s;09_<${$$H(Q_JiV1rW7@9bPP$Z8obRF}^Uh2?EERlr4 zSCV5&S2EB-2+?j{?CIrw$aLOLENzyzTZ}1>kjI*Alsn|9;v3|Bxw@eV|z1{$Tmo8o$ z-r3n|He~qZTRxY!#2XK1I&zz~+bx1j!N$Q{2H1g#U;z>^<%O!#ds zn{BpQh9RAmE}=E-Snl1?V+O2!`PTtp>QnzrwmlyD?tiOb%@_dC z+^}V1j`M5YYnqx)MCmj)QPR7tl`>cp&=r6q12L16(5iMaGnNn@ydJtUIbCTmh$7`g za7G<)D}@ouU{uiw)o6V?FMg0fIW}(47TESJ&&|fNCIiBHsT0qbboL07+|sOegln-( zmIC9{jd%}&6D4Kqn)q2U_$+NUGt(AdWs`n-%r5E4XnDKEL?DxS1|4QhUu~l-^`f*J zUER>)uk^ZNv8>8Do5&>|Y?k`!LbGH2WnTn@C2lv@D5ut1C7QJkEl3kpo6WkS@W|xE zBty{WUwlF6wHs;6=ki1CA9%oQw_CnPB4S{>d)wncwiix41M*5|n4korn3o>N-QQOblvH2QC0Z*OqL`p}H!6MoRyWqW070oa zim0DqkU8^oM$@$Qmjh&-wsip5e!DXHM8bF5!$-TX|KYFuOq7!;0I-q<2B)GO`bZvw zX5~`BWQval459QRk&75Kb)>$MgDsX5W9pA ziQmZGy=?%%1f@UsBWTd}>g#WoN`>b>^dYI=!nQF%ZISe=nxF)tk1mOg{_Ad__{l?g zT~yi=i{bGEr6mip>14574ZzFy(!_l9n3K1o8AHtlu|&zCkL8zN*aLv^Q|yCX`uG?j zjuFwep|bs&^9CBGHrPqmUu^@xp^y69ua!X4PeeZU$;ScU;>8;nQl>{J5kYDq0tj0k z-g3L{i_O$|=vgpSxM{Ou(?DX@;bfoFsL*tA`3@%Fg|{ymb2gGN7}L$SqDW@OvbhK& zVrjYg2^}Fzgx=s@xR*DeiuW)x`$ppibHA)ex`>)g>JI91C0X2XGBN{TkX+hqF#%A_ z<4wNa0B8wGDQpZZ1rsJOKIbM_c%yFjU|=b1zW4;H@+Ds>`d9zX=K|q#P~Rvu^-evL0KgFRJ?A9=oIEmV60v)~sSgT#9-?4_S30d3v$^5M zJw=H1xZefdD)I&8^eCk7|)9PM4q)<-wD000jCSTAtzx#u1MfajhA6M5x( zXsHE0hmW>3W#H6wF)SHxA-xTDU}}1Yxf2F^w0I2@b4#N_*6{9p1dT$dme^ZNQ4uR? zGT0_7uOtAfQEm$zt)!K=TX^x6o-{CpsbvY5BnY{(+hP`dHG{pQR;|lR8hI&h@Sk9O z;u%)=VhI2;$)GEXeI<>YKI%xW>=mR`({!B>^Z;PVdm8U8uN+=d6|TB@>-y7AeNgu8 zul}9S0f2y@gYt56VyfSv5DheJGIgnhCe+~kbl=lVCZhoqOC`jA$+2{Dd=da$f(BYX z#RUDKPkutS0Y)i9P+Fnl%u}BNfUB>3O+ioqxNuyYr+ag?$P;vZw}&)b`&yQygb6wV z;e!5N!IMWOgYVhz5;|V_!bYcOu$?h^|DP-!4ny?YzyHY(|K>OFC$InEui!tnzV;i= z&-yWT)iX0?(T+pi)UZ3B{xPu8={Xml@n={Y{oV%tTxmYMR?1Mcg(8mig0%-u1Xz=>3k*$le!a$ds0rVq|vpJ z@J*6s?|?jS)w!2%70I&?GQaJMlr$`vHkL~X@i~_3jYo#&KTr+{OIf?OyaE6Uf`0Fn z?+Wqxy;r`A|9Jeu`8VEryT4J(-DYxfYG5B}zYSL(>vp>^>PCSNxdbI~wnze6nxOYr z?+1@0x_HU49iMyl85uzr7Y=P~NVRs=1O+z`Xjm4Qg8NzThq zjrcjq@-S0}$h0&WUujg+>#w-PCiB4CjV_bDW0?NgJHRck`X=yTeBwDx^*`;o=ACK) zDpgz9^z0XwCzr-$?gt@0X;`v9G(tQ+M*>SE9uBTtz4qvtQwn^lkNWt9^8nx>sFIhV z_(lB&OmqOHIw!`bjvqhq)?2T$*hK6#;?yI-61eF4Po6jp0M~E68$6PTK$H-4alun! zU}k0p02BmG&71&$%Erxr1g&uc!&a%KAn3!u%j1XgLFTE!-Y+=4G<9cfkKX9@tE?(Q zWw&KU^~I0mAH1~BTb#r&#U=q>;Iun}b2hI2L|>O}#f;@w_W&T0H2T`n^v$?ngE_aF zOb{snC)u(iSTAImNBBzg&>3@3R!9WAkvoi6lZo#IHx!807GV6kMnsdX$kK@-^xvq< zRuloZo(4VrH6l8*ml-o;Q!4T|$=)H)gvs8CXCn1dn@-?~#!Wi*wcWJ&1Rm4U$TX<* zB?o>Cgi#j>@ww`T!UjxPr(wxk!#q9}-dZ6(@2poL^oD#4qk#Af(mwd~GvEE5VEyd) zu}1))#@d%CTlC#jwZ86Xznt&(lm`{ziDaop%_J;P7?{EkihFkW)@#{ zLldr~vdga29bjuuSW$$z3)-004Xsve(>i}nSGmXf>!R}}?FJA^;o}^h{XgC6W3cTa z-_RbxOe@mIl&x!{f--uLH$Crej6jZV5cTpNJ|mIHBPWjaF}?LBgMRSoXI_2nH4Mw} zysgy8o=jCLo*9W+GB=bqHr`tg)8+G#3l~1{#+$E3dj302eD@j{x>hLc=TvDny`Sgg ziPPCk769IQ`whQey?4ex|I(KLKuAzuFG3JA^yYo%R}ez<=Kadehrq<7c0p*E?t|dW zkr{U+>GpLHKHT!iGfrUb-Iw?9-$b^|c(Z3|rnG>v%q?tU*3d#gZ7v^!1dy4h7A z4Jl#-jBxCX0-Vii$4VM>u}{))5iZ>5Qd}71@tokM7&kI)8DpE6Nh5I%z9P-j!tpzd z=N#wuV$W^;t9#(7n(Wj1h2_bm@w;mU#RhlR3XG`UezDBi^s1T+Bx77F|LM3R{di^B`&A0L>Y0eR^e=u#N~NFRR!0M>84Cff`{^u(bQq3J_n zVtSOwN#0VzjB5Qp3t9%wrVaYAB1EX%kl-$Ct#_5bR#hW5ALlyw`KncI( zN!#Ge%4@4;%d$9V?=BzQBn-jj!gh4Vt`#cSc}!t%DX!{XI~r&C+9=yh4v&>IXm+Nj zEYt-i&%|ya#%WADtI1dV5-he~$!aC=sWaihvOi~CE>W(vI_;*?!0pobY@;ZI-uj0n z-ww?$-d}wX1fLj|Z10d4+Qe*2rBW*^p6a`ac(PWnqCxMl>?&WU)9GOD+rFP>ZZN$C z23QE%?G9)V@oGe{LAGwg1l4q1X{!QF(B=Dg?%!Vy{`CIj-~W41hJ!J@qG4Iq4po*4FF2Yshj_xt=%pxD)oCJOd^dRJejz5?W)HU({4v15sc4cM-D3v zLgQ0t2rewl0su`=x#5ZUZ3rxbJ`WW9`LWeG15r~1H=?zmApi{?fBeZe-guQ5prv9l zlg)}eQKQ*RCd$DW?+0j~}dbbEUn0tc61f+@R%IIyPa7?}ZgLtP}>uGtoh{CsMLVz?#{P2|j@ zpBe{%;seKyNKPdrj>cX)^{FXpaQ2kzsO@*62_u=#Gfq5YmT?IzY_N^B<4vfUy$r>c zz)#CyAT=J9t%=I2ZsC(>*Yp5ptwYdurycMzk1QPpfV<0g)C8q} z#FYmR0AOKpQL%k0o$A_M(~@Q=o)i&uL`9^XT+AVS4@^6AbQautY6JJtyK8$iGB4lo zhyXACOp=VoWMI@ysU69u^=B88t{2er)g~3GJNraNW~$lkE=gr<)$C-Ndo4Fxym@1$ zCL**!>fumMTJVKVnq-vFJFTwFl}fLzGNGh})rPF<7A^0`tV+_BHFZ6DtJbAWJ%0Ta z0FbCMEk9RaW+*}@Hj`aLNAchZ0grQ>=Zohn?H39FQ19ox91$$(wpVKOyGzT~0}TN~ zyLmKSLn7*8UXH?)B_EzTb>_9#z9-xF+Krp19yy`LCpJKtAXw6JxikROYE>9vWUS{F ztJNw(-4Q%90I!B$B$6fgRJShbV%r+zdT)fF5z}l3&9OlWg3e4z7xghg8Hjf6u6Hip z1OPQbzxn+0mR%Xvr-s| z8HH8x&`g)Srl~2kGVvwh+oqkpriGX%D_er49k7gJ*^KHz%8hY%-HB&e4F_DK9AA9% z8&2kLJMfD*fDaaH_w<$BeDJUweyJoBSoV7*3-gNrup$Z|N+wg+ZrlU_o}jTr&&6FT zmuS=K?W>mo;QX0h_2&7xnPRCD>fIn3mSGOt+`i3*Y96?J|1JP59XcWv({sP*Qbd<+ zj2s7v2>^*iDxiI>xdfe=VI{8C)>Jvn7@~7?^Rf+if`0S)=SSp{JvyI>1T4i97@0j@ zN`0>W2b;>~w!NiNk>5_TidZ0uG9eMUOw~o8G)?#JHvnK_DMiG|Nw$UQ7U3XKr6d(z zSpTY8-pAH3lUHfdg(`6)xtKgTcxDiA(%|9MeB?5?BW}Qn@`SsuVgM){qjG&ua z8)^fT<|S`hU4GZ&{(bxE<@0CGUO0b&{_tDhzSz$-BiSdT<0Swz8ufm6!2~5lWYH)R zv{eU%Y5>Jz0RXbuoch%9cr=%lN+M$}stJm}RTK2DzW()iA~A|L@#uV}zc<|P498~k zj&i-bWi%3DmPnan2+OxkWpjWAxu;GOb($U8<7z~7EEq1dUWle?$1Q+EG-r5Eui-j@ znYvXpyy~Tnl~kESobiND>KbHyi2;!#`WC8W@5EgSjc^!N_>Jg=U&i!gDptx6%Nwjr z(MkYFjzus&g>@?(dw;nu`$}`=t%% znp6MyUk)&=r~dK3#7mw7KcS zifumn;pbkY@Y&bH<71lonp{MpR=YKLfK|W0yTCV#m{b)l$Z>=Oof!AHGz-Nd0H_IC zC>CqV2gnojufG2E5zX9A9+?dCTLeGuvDtiB*OyJD0l?CYVOLfG8s!dl-jaMgVi(!% zF0(Yo*O#Pyxg=JmQL>pzS)|IO8P)M%P8J!Rf|B)pS_1(4Ea@PdLaYI_&z1)-y-Fvm zQVE=rDu}9X@yu7qxPzozC4r^v(G!<4uQnjG4zWQ=ufhf?UCBJ3^y|*x9=yopz@!w| zj&k+aVzotVoQDvWvh9C%Ib?BKH1z%hqh5{0lYaieKqXTMLF@GrgG{Cg30k0>jU=;30nxR! z)th(jHX4mlypK%XlHredVsQchy52-&G*Dl{$aIE2K_pQhN7YSelx>;_yeOLy(Xnww z+>?BLNn-3V5UuXEl2qhMX2!zSU8hO5HwnCPB8in`jZU%>M;yE+174S-;wqKAO-6f1 zF*3Uy@l*3HSIN^fJsDLj-YQmM`P0!ds_=~o~TNKgN`g7 z`u4?_KK$HA_^-Zw@g-;A&;S7Jt|&HpsA?z3_o)rb%l`4H-oI2T0zf7sH5u#mULnkK zxdZ^|bVg0kTsB)Ms?uFBL}`NFymPlVWCsK%0;}sk4lK=&A%J+)2=P_N$Yi!Be@7x_ zz%z~Ia>HH~f0%3Eb5wzRt2!l0q!gG|c+fWPtK z?|$(cPmz%yyB6ZG!=l}@KUqE{0m6Z*`mRkTMAIlo

@%jP475quW5L+9NhDKZ^b-={2kMwNHjW+hEhbP|uix}g#0C;=p2bdqK# zwwG%A9b);A7|>!lc>n+)07*naR8>-U@?YOMk6A`DYwtlFBY;?3WFZnmG-4SZO+MNV zK!5wH-7^D%zuPOH1J zQ(Krw3{1-4u%xx?d{;O5MvA11a^~Kzuskqc0>GzVx%B0yp2dB8duNmWYHMp_YO0s7 zIXAbUz~}bvex>FyJMKQXe`N8H;q@!nN-j=Li~+#r)=ub;O}(5p@JiOXN6#>yEZ<*M z@2l$?0Cc-ZjZa4RXK85(0MrCEbX^hPBO~aQcdrfbpyTmGz<2b}{1~7?kZFp7YzZ={ zk$k`(GnaJ)goA+-2|v2`V0m@NGbLKx7QAV~eD~aJ3;;@$stK{>2t>&rgq?(rw6Hl5 zJSPw>Z#4nHN*P2UwMRD%c*~X4pws}DKkJ&UwANT%W`Tw3jnrX$I2$7#Pn>m z0*`^Cgyk>)#_!SY)=)6nx6aLI0IM51liNq*^XAQKt`o8ri+dt1Q;9SH&;-5v;QsNY z!{nd0mhUn4Xzxv!nx_AL=kgWb$EErGp7na2a!hDpA@ft8`~?0(SORnD(0q@eUL5)o zG?z_}jj4iMmX?-yeA2TM-w;_$&=X{8L;(a0r0QYIfZCN=6c zHG{Y%o!F=S4lg;E$jyfcUvJ9!hf?W)ewiUfR}XCCU&xPwmx@PJc=pc|iT%QTW{ zJ5o{-ShCMb(-io;y;=l-R3h%*c@7Ge?}be{LRbPIK$=fBVh^A5>I?@{k94~1TaBqn zfQku<{~#Ye^F*)k{kgM`0su`=6zoAZ8;!wbgyk~3gqL)inVI47i3?$B8jO!+clV0D zhbW4r)paeG^{Bk;?d|*G6DTzUVG|Pcg>StCBWp8L(+HrjQ6A!<55P-kckG}ej})0m zj!d?_ed8JcG+QnIvMe+LJG~T4#VBnh4ZJc+hHFAQyNwvPC2gCu#0+PmoCCFA5&vRP2!+2tbZmtcxK^Jb!q*7T1=QaS0; zC<^ZOJa29~tljD6vdKcRIto~-8-^v*Dz&;ApIroc*gnsIyd;St?;lwD9vJnCGHJZ^ z>60U9>XE~Xo`L)L(qW9x$IhPbeM+&D1}9BWj8FB|HXDtho`A&sv?4mbc`IUFx^(f` zXP*<|6Xb<3S$tB@b9!1@HhFJv9{_lQ*6Y379G{p3fZd&KUxMDab!XJb?Dsv5TZY0# zbYwOk){CFZoSHApOzKh*w_MqW5DlWsE8G$VXlh~# z+|b;i41Dj-1es{)_ZcG-sh2{Lzm<9O-tFOgEiVSZRGD_@H5~k5`0#O1r+V_bU@9a*Oq@a)>9s*HZ*V+BH>oM09g`I`AUGKz{@iZ zDm*i*r$$6)Dm;T*I5NPYUQ^+m-^j5>UXcy@BUHcw?8-JCC$z(tZxYH$eq1y4PbnHQfPsm zJ#+5z)pr#5j7Fo6C^IOU%_aa~g3`;A9-H;pQ2@9@Wle

)g9{=cK&EH-k^bw|2*- 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 LNkvXXu0mjfI67m_ literal 0 HcmV?d00001 diff --git a/minecart/hopperlib.lua b/minecart/hopperlib.lua new file mode 100644 index 0000000..6f2a583 --- /dev/null +++ b/minecart/hopperlib.lua @@ -0,0 +1,141 @@ +--[[ + + Minecart + ======== + + Copyright (C) 2019-2020 Joachim Stolberg + + MIT + See license.txt for more information + +]]-- + +-- for lazy programmers +local M = minetest.get_meta + +local RegisteredInventories = {} + +-- Take the given number of items from the inv. +-- Returns nil if ItemList is empty. +function minecart.inv_take_items(inv, listname, num) + if inv:is_empty(listname) then + return nil + end + local size = inv:get_size(listname) + for idx = 1, size do + local items = inv:get_stack(listname, idx) + if items:get_count() > 0 then + local taken = items:take_item(num) + inv:set_stack(listname, idx, items) + return taken + end + end + return nil +end + +function minecart.take_items(pos, param2, num) + local npos, node + if param2 then + npos, node = minecart.get_next_node(pos, (param2 + 2) % 4) + else + npos, node = pos, minetest.get_node(pos) + end + local def = RegisteredInventories[node.name] + local owner = M(pos):get_string("owner") + local inv = minetest.get_inventory({type="node", pos=npos}) + + if def and inv and def.take_listname and (not def.allow_take or def.allow_take(npos, nil, owner)) then + return minecart.inv_take_items(inv, def.take_listname, num) + elseif def and def.take_item then + return def.take_item(npos, num, owner) + else + local ndef = minetest.registered_nodes[node.name] + if ndef and ndef.minecart_hopper_takeitem then + return ndef.minecart_hopper_takeitem(npos, num) + end + end +end + +function minecart.put_items(pos, param2, stack) + local npos, node = minecart.get_next_node(pos, param2) + local def = RegisteredInventories[node.name] + local owner = M(pos):get_string("owner") + local inv = minetest.get_inventory({type="node", pos=npos}) + + if def and inv and def.put_listname and (not def.allow_put or def.allow_put(npos, stack, owner)) then + local leftover = inv:add_item(def.put_listname, stack) + if leftover:get_count() > 0 then + return leftover + end + elseif def and def.put_item then + return def.put_item(npos, stack, owner) + elseif minecart.is_air_like(node.name) or minecart.is_nodecart_available(npos) then + minetest.add_item(npos, stack) + else + local ndef = minetest.registered_nodes[node.name] + if ndef and ndef.minecart_hopper_additem then + local leftover = ndef.minecart_hopper_additem(npos, stack) + if leftover:get_count() > 0 then + return leftover + end + else + return stack + end + end +end + +function minecart.untake_items(pos, param2, stack) + local npos, node + if param2 then + npos, node = minecart.get_next_node(pos, (param2 + 2) % 4) + else + npos, node = pos, minetest.get_node(pos) + end + local def = RegisteredInventories[node.name] + local inv = minetest.get_inventory({type="node", pos=npos}) + + if def and inv and def.put_listname then + return inv:add_item(def.put_listname, stack) + elseif def and def.untake_item then + return def.untake_item(npos, stack) + else + local ndef = minetest.registered_nodes[node.name] + if ndef and ndef.minecart_hopper_untakeitem then + return ndef.minecart_hopper_untakeitem(npos, stack) + end + end +end + +-- Register inventory node for hopper access +-- (for example, see below) +function minecart.register_inventory(node_names, def) + for _, name in ipairs(node_names) do + RegisteredInventories[name] = { + allow_put = def.put and def.put.allow_inventory_put, + put_listname = def.put and def.put.listname, + allow_take = def.take and def.take.allow_inventory_take, + take_listname = def.take and def.take.listname, + put_item = def.put and def.put.put_item, + take_item = def.take and def.take.take_item, + untake_item = def.take and def.take.untake_item, + } + end +end + +-- Allow the hopper the access to itself +minecart.register_inventory({"minecart:hopper"}, { + put = { + allow_inventory_put = function(pos, stack, player_name) + local owner = M(pos):get_string("owner") + return owner == player_name + end, + listname = "main", + }, + take = { + allow_inventory_take = function(pos, stack, player_name) + local owner = M(pos):get_string("owner") + return owner == player_name + end, + listname = "main", + }, +}) diff --git a/minecart/i18n.py b/minecart/i18n.py new file mode 100755 index 0000000..3c6ce1b --- /dev/null +++ b/minecart/i18n.py @@ -0,0 +1,469 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Script to generate the template file and update the translation files. +# Copy the script into the mod or modpack root folder and run it there. +# +# Copyright (C) 2019 Joachim Stolberg, 2020 FaceDeer, 2020 Louis Royer +# LGPLv2.1+ +# +# See https://github.com/minetest-tools/update_translations for +# potential future updates to this script. + +from __future__ import print_function +import os, fnmatch, re, shutil, errno +from sys import argv as _argv +from sys import stderr as _stderr + +# Running params +params = {"recursive": False, + "help": False, + "mods": False, + "verbose": False, + "folders": [], + "no-old-file": False, + "break-long-lines": False, + "sort": False, + "print-source": False +} +# Available CLI options +options = {"recursive": ['--recursive', '-r'], + "help": ['--help', '-h'], + "mods": ['--installed-mods', '-m'], + "verbose": ['--verbose', '-v'], + "no-old-file": ['--no-old-file', '-O'], + "break-long-lines": ['--break-long-lines', '-b'], + "sort": ['--sort', '-s'], + "print-source": ['--print-source', '-p'] +} + +# Strings longer than this will have extra space added between +# them in the translation files to make it easier to distinguish their +# beginnings and endings at a glance +doublespace_threshold = 80 + +def set_params_folders(tab: list): + '''Initialize params["folders"] from CLI arguments.''' + # Discarding argument 0 (tool name) + for param in tab[1:]: + stop_param = False + for option in options: + if param in options[option]: + stop_param = True + break + if not stop_param: + params["folders"].append(os.path.abspath(param)) + +def set_params(tab: list): + '''Initialize params from CLI arguments.''' + for option in options: + for option_name in options[option]: + if option_name in tab: + params[option] = True + break + +def print_help(name): + '''Prints some help message.''' + print(f'''SYNOPSIS + {name} [OPTIONS] [PATHS...] +DESCRIPTION + {', '.join(options["help"])} + prints this help message + {', '.join(options["recursive"])} + run on all subfolders of paths given + {', '.join(options["mods"])} + run on locally installed modules + {', '.join(options["no-old-file"])} + do not create *.old files + {', '.join(options["sort"])} + sort output strings alphabetically + {', '.join(options["break-long-lines"])} + add extra line breaks before and after long strings + {', '.join(options["verbose"])} + add output information +''') + + +def main(): + '''Main function''' + set_params(_argv) + set_params_folders(_argv) + if params["help"]: + print_help(_argv[0]) + elif params["recursive"] and params["mods"]: + print("Option --installed-mods is incompatible with --recursive") + else: + # Add recursivity message + print("Running ", end='') + if params["recursive"]: + print("recursively ", end='') + # Running + if params["mods"]: + print(f"on all locally installed modules in {os.path.expanduser('~/.minetest/mods/')}") + run_all_subfolders(os.path.expanduser("~/.minetest/mods")) + elif len(params["folders"]) >= 2: + print("on folder list:", params["folders"]) + for f in params["folders"]: + if params["recursive"]: + run_all_subfolders(f) + else: + update_folder(f) + elif len(params["folders"]) == 1: + print("on folder", params["folders"][0]) + if params["recursive"]: + run_all_subfolders(params["folders"][0]) + else: + update_folder(params["folders"][0]) + else: + print("on folder", os.path.abspath("./")) + if params["recursive"]: + run_all_subfolders(os.path.abspath("./")) + else: + update_folder(os.path.abspath("./")) + +#group 2 will be the string, groups 1 and 3 will be the delimiters (" or ') +#See https://stackoverflow.com/questions/46967465/regex-match-text-in-either-single-or-double-quote +pattern_lua_s = re.compile(r'[\.=^\t,{\(\s]N?S\(\s*(["\'])((?:\\\1|(?:(?!\1)).)*)(\1)[\s,\)]', re.DOTALL) +pattern_lua_fs = re.compile(r'[\.=^\t,{\(\s]N?FS\(\s*(["\'])((?:\\\1|(?:(?!\1)).)*)(\1)[\s,\)]', re.DOTALL) +pattern_lua_bracketed_s = re.compile(r'[\.=^\t,{\(\s]N?S\(\s*\[\[(.*?)\]\][\s,\)]', re.DOTALL) +pattern_lua_bracketed_fs = re.compile(r'[\.=^\t,{\(\s]N?FS\(\s*\[\[(.*?)\]\][\s,\)]', re.DOTALL) + +# Handles "concatenation" .. " of strings" +pattern_concat = re.compile(r'["\'][\s]*\.\.[\s]*["\']', re.DOTALL) + +pattern_tr = re.compile(r'(.*?[^@])=(.*)') +pattern_name = re.compile(r'^name[ ]*=[ ]*([^ \n]*)') +pattern_tr_filename = re.compile(r'\.tr$') +pattern_po_language_code = re.compile(r'(.*)\.po$') + +#attempt to read the mod's name from the mod.conf file or folder name. Returns None on failure +def get_modname(folder): + try: + with open(os.path.join(folder, "mod.conf"), "r", encoding='utf-8') as mod_conf: + for line in mod_conf: + match = pattern_name.match(line) + if match: + return match.group(1) + except FileNotFoundError: + if not os.path.isfile(os.path.join(folder, "modpack.txt")): + folder_name = os.path.basename(folder) + # Special case when run in Minetest's builtin directory + if folder_name == "builtin": + return "__builtin" + else: + return folder_name + else: + return None + return None + +#If there are already .tr files in /locale, returns a list of their names +def get_existing_tr_files(folder): + out = [] + for root, dirs, files in os.walk(os.path.join(folder, 'locale/')): + for name in files: + if pattern_tr_filename.search(name): + out.append(name) + return out + +# A series of search and replaces that massage a .po file's contents into +# a .tr file's equivalent +def process_po_file(text): + # The first three items are for unused matches + text = re.sub(r'#~ msgid "', "", text) + text = re.sub(r'"\n#~ msgstr ""\n"', "=", text) + text = re.sub(r'"\n#~ msgstr "', "=", text) + # comment lines + text = re.sub(r'#.*\n', "", text) + # converting msg pairs into "=" pairs + text = re.sub(r'msgid "', "", text) + text = re.sub(r'"\nmsgstr ""\n"', "=", text) + text = re.sub(r'"\nmsgstr "', "=", text) + # various line breaks and escape codes + text = re.sub(r'"\n"', "", text) + text = re.sub(r'"\n', "\n", text) + text = re.sub(r'\\"', '"', text) + text = re.sub(r'\\n', '@n', text) + # remove header text + text = re.sub(r'=Project-Id-Version:.*\n', "", text) + # remove double-spaced lines + text = re.sub(r'\n\n', '\n', text) + return text + +# Go through existing .po files and, if a .tr file for that language +# *doesn't* exist, convert it and create it. +# The .tr file that results will subsequently be reprocessed so +# any "no longer used" strings will be preserved. +# Note that "fuzzy" tags will be lost in this process. +def process_po_files(folder, modname): + for root, dirs, files in os.walk(os.path.join(folder, 'locale/')): + for name in files: + code_match = pattern_po_language_code.match(name) + if code_match == None: + continue + language_code = code_match.group(1) + tr_name = f'{modname}.{language_code}.tr' + tr_file = os.path.join(root, tr_name) + if os.path.exists(tr_file): + if params["verbose"]: + print(f"{tr_name} already exists, ignoring {name}") + continue + fname = os.path.join(root, name) + with open(fname, "r", encoding='utf-8') as po_file: + if params["verbose"]: + print(f"Importing translations from {name}") + text = process_po_file(po_file.read()) + with open(tr_file, "wt", encoding='utf-8') as tr_out: + tr_out.write(text) + +# from https://stackoverflow.com/questions/600268/mkdir-p-functionality-in-python/600612#600612 +# Creates a directory if it doesn't exist, silently does +# nothing if it already exists +def mkdir_p(path): + try: + os.makedirs(path) + except OSError as exc: # Python >2.5 + if exc.errno == errno.EEXIST and os.path.isdir(path): + pass + else: raise + +# Converts the template dictionary to a text to be written as a file +# dKeyStrings is a dictionary of localized string to source file sets +# dOld is a dictionary of existing translations and comments from +# the previous version of this text +def strings_to_text(dkeyStrings, dOld, mod_name, header_comments): + lOut = [f"# textdomain: {mod_name}"] + if header_comments is not None: + lOut.append(header_comments) + + dGroupedBySource = {} + + for key in dkeyStrings: + sourceList = list(dkeyStrings[key]) + if params["sort"]: + sourceList.sort() + sourceString = "\n".join(sourceList) + listForSource = dGroupedBySource.get(sourceString, []) + listForSource.append(key) + dGroupedBySource[sourceString] = listForSource + + lSourceKeys = list(dGroupedBySource.keys()) + lSourceKeys.sort() + for source in lSourceKeys: + localizedStrings = dGroupedBySource[source] + if params["sort"]: + localizedStrings.sort() + if params["print-source"]: + if lOut[-1] != "": + lOut.append("") + lOut.append(source) + for localizedString in localizedStrings: + val = dOld.get(localizedString, {}) + translation = val.get("translation", "") + comment = val.get("comment") + if params["break-long-lines"] and len(localizedString) > doublespace_threshold and not lOut[-1] == "": + lOut.append("") + if comment != None and comment != "" and not comment.startswith("# textdomain:"): + lOut.append(comment) + lOut.append(f"{localizedString}={translation}") + if params["break-long-lines"] and len(localizedString) > doublespace_threshold: + lOut.append("") + + + unusedExist = False + for key in dOld: + if key not in dkeyStrings: + val = dOld[key] + translation = val.get("translation") + comment = val.get("comment") + # only keep an unused translation if there was translated + # text or a comment associated with it + if translation != None and (translation != "" or comment): + if not unusedExist: + unusedExist = True + lOut.append("\n\n##### not used anymore #####\n") + if params["break-long-lines"] and len(key) > doublespace_threshold and not lOut[-1] == "": + lOut.append("") + if comment != None: + lOut.append(comment) + lOut.append(f"{key}={translation}") + if params["break-long-lines"] and len(key) > doublespace_threshold: + lOut.append("") + return "\n".join(lOut) + '\n' + +# Writes a template.txt file +# dkeyStrings is the dictionary returned by generate_template +def write_template(templ_file, dkeyStrings, mod_name): + # read existing template file to preserve comments + existing_template = import_tr_file(templ_file) + + text = strings_to_text(dkeyStrings, existing_template[0], mod_name, existing_template[2]) + mkdir_p(os.path.dirname(templ_file)) + with open(templ_file, "wt", encoding='utf-8') as template_file: + template_file.write(text) + + +# Gets all translatable strings from a lua file +def read_lua_file_strings(lua_file): + lOut = [] + with open(lua_file, encoding='utf-8') as text_file: + text = text_file.read() + #TODO remove comments here + + text = re.sub(pattern_concat, "", text) + + strings = [] + for s in pattern_lua_s.findall(text): + strings.append(s[1]) + for s in pattern_lua_bracketed_s.findall(text): + strings.append(s) + for s in pattern_lua_fs.findall(text): + strings.append(s[1]) + for s in pattern_lua_bracketed_fs.findall(text): + strings.append(s) + + for s in strings: + s = re.sub(r'"\.\.\s+"', "", s) + s = re.sub("@[^@=0-9]", "@@", s) + s = s.replace('\\"', '"') + s = s.replace("\\'", "'") + s = s.replace("\n", "@n") + s = s.replace("\\n", "@n") + s = s.replace("=", "@=") + lOut.append(s) + return lOut + +# Gets strings from an existing translation file +# returns both a dictionary of translations +# and the full original source text so that the new text +# can be compared to it for changes. +# Returns also header comments in the third return value. +def import_tr_file(tr_file): + dOut = {} + text = None + header_comment = None + if os.path.exists(tr_file): + with open(tr_file, "r", encoding='utf-8') as existing_file : + # save the full text to allow for comparison + # of the old version with the new output + text = existing_file.read() + existing_file.seek(0) + # a running record of the current comment block + # we're inside, to allow preceeding multi-line comments + # to be retained for a translation line + latest_comment_block = None + for line in existing_file.readlines(): + line = line.rstrip('\n') + if line.startswith("###"): + if header_comment is None and not latest_comment_block is None: + # Save header comments + header_comment = latest_comment_block + # Strip textdomain line + tmp_h_c = "" + for l in header_comment.split('\n'): + if not l.startswith("# textdomain:"): + tmp_h_c += l + '\n' + header_comment = tmp_h_c + + # Reset comment block if we hit a header + latest_comment_block = None + continue + elif line.startswith("#"): + # Save the comment we're inside + if not latest_comment_block: + latest_comment_block = line + else: + latest_comment_block = latest_comment_block + "\n" + line + continue + match = pattern_tr.match(line) + if match: + # this line is a translated line + outval = {} + outval["translation"] = match.group(2) + if latest_comment_block: + # if there was a comment, record that. + outval["comment"] = latest_comment_block + latest_comment_block = None + dOut[match.group(1)] = outval + return (dOut, text, header_comment) + +# Walks all lua files in the mod folder, collects translatable strings, +# and writes it to a template.txt file +# Returns a dictionary of localized strings to source file sets +# that can be used with the strings_to_text function. +def generate_template(folder, mod_name): + dOut = {} + for root, dirs, files in os.walk(folder): + for name in files: + if fnmatch.fnmatch(name, "*.lua"): + fname = os.path.join(root, name) + found = read_lua_file_strings(fname) + if params["verbose"]: + print(f"{fname}: {str(len(found))} translatable strings") + + for s in found: + sources = dOut.get(s, set()) + sources.add(f"### {os.path.basename(fname)} ###") + dOut[s] = sources + + if len(dOut) == 0: + return None + templ_file = os.path.join(folder, "locale/template.txt") + write_template(templ_file, dOut, mod_name) + return dOut + +# Updates an existing .tr file, copying the old one to a ".old" file +# if any changes have happened +# dNew is the data used to generate the template, it has all the +# currently-existing localized strings +def update_tr_file(dNew, mod_name, tr_file): + if params["verbose"]: + print(f"updating {tr_file}") + + tr_import = import_tr_file(tr_file) + dOld = tr_import[0] + textOld = tr_import[1] + + textNew = strings_to_text(dNew, dOld, mod_name, tr_import[2]) + + if textOld and textOld != textNew: + print(f"{tr_file} has changed.") + if not params["no-old-file"]: + shutil.copyfile(tr_file, f"{tr_file}.old") + + with open(tr_file, "w", encoding='utf-8') as new_tr_file: + new_tr_file.write(textNew) + +# Updates translation files for the mod in the given folder +def update_mod(folder): + modname = get_modname(folder) + if modname is not None: + process_po_files(folder, modname) + print(f"Updating translations for {modname}") + data = generate_template(folder, modname) + if data == None: + print(f"No translatable strings found in {modname}") + else: + for tr_file in get_existing_tr_files(folder): + update_tr_file(data, modname, os.path.join(folder, "locale/", tr_file)) + else: + print(f"\033[31mUnable to find modname in folder {folder}.\033[0m", file=_stderr) + exit(1) + +# Determines if the folder being pointed to is a mod or a mod pack +# and then runs update_mod accordingly +def update_folder(folder): + is_modpack = os.path.exists(os.path.join(folder, "modpack.txt")) or os.path.exists(os.path.join(folder, "modpack.conf")) + if is_modpack: + subfolders = [f.path for f in os.scandir(folder) if f.is_dir() and not f.name.startswith('.')] + for subfolder in subfolders: + update_mod(subfolder) + else: + update_mod(folder) + print("Done.") + +def run_all_subfolders(folder): + for modfolder in [f.path for f in os.scandir(folder) if f.is_dir() and not f.name.startswith('.')]: + update_folder(modfolder) + + +main() diff --git a/minecart/init.lua b/minecart/init.lua new file mode 100644 index 0000000..b1e66b1 --- /dev/null +++ b/minecart/init.lua @@ -0,0 +1,49 @@ +--[[ + + Minecart + ======== + + Copyright (C) 2019-2021 Joachim Stolberg + + MIT + See license.txt for more information + +]]-- + +minecart = {} + +-- Version for compatibility checks, see readme.md/history +minecart.version = 2.00 + +minecart.hopper_enabled = minetest.settings:get_bool("minecart_hopper_enabled") ~= false +minecart.teleport_enabled = minetest.settings:get_bool("minecart_teleport_enabled") == true +-- Test for MT 5.4 new string mode +minecart.CLIP = minetest.features.use_texture_alpha_string_modes and "clip" or false + + +minecart.S = minetest.get_translator("minecart") +local MP = minetest.get_modpath("minecart") +dofile(MP .. "/baselib.lua") +dofile(MP .. "/storage.lua") +dofile(MP .. "/rails.lua") +dofile(MP .. "/monitoring.lua") +dofile(MP .. "/recording.lua") +dofile(MP .. "/hopperlib.lua") +dofile(MP .. "/nodelib.lua") +dofile(MP .. "/entitylib.lua") +dofile(MP .. "/api.lua") +dofile(MP .. "/minecart.lua") +dofile(MP .. "/buffer.lua") +dofile(MP .. "/protection.lua") +--dofile(MP .. "/tool.lua") # for debugging only +dofile(MP .. "/signs.lua") +dofile(MP .. "/terminal.lua") +dofile(MP .. "/pusher.lua") + +if minecart.hopper_enabled then + dofile(MP .. "/hopper.lua") + dofile(MP .. "/mods_support.lua") +end + +dofile(MP .. "/doc.lua") +minetest.log("info", "[MOD] Minecart loaded") diff --git a/minecart/license.txt b/minecart/license.txt new file mode 100644 index 0000000..6c5beb4 --- /dev/null +++ b/minecart/license.txt @@ -0,0 +1,54 @@ + +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2014-2016 SmallJoker +Copyright (C) 2012-2016 Various Minetest developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media +----------------- + +CC-0, see: https://creativecommons.org/share-your-work/public-domain/cc0/, except +if other license is mentioned. + + +Authors +--------- +Originally from PixelBOX (Gambit): + carts_cart_side.png + carts_cart_top.png + carts_cart_front.png* + carts_cart.png* + +sofar + stujones11: + carts_cart.b3d and carts_cart.blend + +hexafraction, modified by sofar + carts_rail_*.png + +http://www.freesound.org/people/YleArkisto/sounds/253159/ - YleArkisto - CC-BY-3.0 + carts_cart_moving.*.ogg diff --git a/minecart/locale/minecart.de.tr b/minecart/locale/minecart.de.tr new file mode 100644 index 0000000..615b0cc --- /dev/null +++ b/minecart/locale/minecart.de.tr @@ -0,0 +1,58 @@ +# textdomain: minecart +Station name=Stationsname +Waiting time/sec=Wartezeit/s +connected to=verbunden mit +Minecart Railway Buffer=Minecart Prellbock +Summary=Zusammenfassung +1. Place your rails and build a route with two endpoints. Junctions are allowed as long as each route has its own start and endpoint.=1. Baue eine Schienenstrecke mit zwei Enden. Kreuzungen sind zulässig, solange jede Route ihre eigenen Start- und Endpunkte hat. +2. Place a Railway Buffer at both endpoints (buffers are always needed, they store the route and timing information).=2. Platziere einen Prellbock an beide Schienenenden (Prellböcke sind zwingend notwendig, sie speichern die Routen- und Zeit-Informationen). +3. Give both Railway Buffers unique station names, like Oxford and Cambridge.=3. Gib beiden Prellböcken eindeutige Stationsnamen wie: Stuttgart und München. +4. Place a Minecart at a buffer and give it a cart number (1..999)=4. Platziere einen Minecart Wagen an einem Prellbock und gib dem Wagen eine Wagennummer (1..999) +5. Drive from buffer to buffer in both directions using the Minecart(!) to record the routes (use 'right-left' keys to control the Minecart).=5. Um eine Route aufzuzeichnen, fahre die Route in beide Richtungen von Prellbock zu Prellbock mit dem Minecart Wagen(!). Nutze 'links-rechts' Tasten zur Steuerung. +6. Punch the buffers to check the connection data (e.g. 'Oxford: connected to Cambridge').=6. Schlage auf die Prellböcke um die Verbindungsdaten zu prüfen (bspw.: 'München: verbunden mit Stuttgart') +7. Optional: Configure the Minecart waiting time in both buffers. The Minecart will then start automatically after the configured time.=7. Optional: Konfiguriere die Wagenwartezeit in beiden Prellböcken. Der Wagen startet dann nach dieser Zeit automatisch. +8. Optional: Protect your rail network with the Protection Landmarks (one Landmark at least every 16 nodes/meters).=8. Optional: Schütze deine Schienen mit Hilfe der Meilensteine (ein Meilenstein mindestens alle 16 Blöcke). +9. Place a Minecart in front of the buffer and check whether it starts after the configured time.=9. Platziere einen Wagen direkt vor einem Prellbock und prüfe, ob er nach der konfigurierten Zeit startet. +10. Check the cart state via the chat command: /mycart @n '' is the cart number=Prüfe den Status des Wagen mit dem Chat Kommando: /mycart @n ist die Wagennummer +11. Drop items into the Minecart and punch the cart to start it.=11: Lege Gegenstände in ein Wagen (Taste Q) und starte dann den Wagen durch Anklicken. +12. Dig the cart with 'sneak+click' (as usual). The items will be drop down.=10. Klicke mit gedrückter Shift-Taste auf den Wagen, um diesen zu entfernen. Die Gegenstände fallen dann zu Boden. +Primary used to transport items. You can drop items into the Minecart and punch the cart to get started. Sneak+click the cart to get cart and items back=Primär für den Transport von Gegenständen genutzt. Du kannst Gegenstände in ein Cart legen (Taste Q) und dann den Wagen durch Anklicken starten. Klicke mit gedrückter Shift-Taste auf den Wagen, um Cart und Gegenstände zurückzuerhalten +Used as buffer on both rail ends. Needed to be able to record the cart routes=Preckblöcke müssen an beiden Schienenenden platziert sein, so dass Aufzeichnungen der Strecke gemacht werden können. +Protect your rails with the Landmarks (one Landmark at least every 16 blocks near the rail)=Schütze deine Schienen mit Hilfe der Meilensteine (ein Meilenstein mindestens alle 16 Blöcke der Strecke entlang) +Used to load/unload Minecart. The Hopper can push/pull items to/from chests and drop/pickup items to/from Minecarts. To unload a Minecart place the hopper below the rail. To load the Minecart, place the hopper right next to the Minecart.=Um Wagen zu be- und entladen. Der Hopper kann Gegenstände aus Kisten Holen und legen, sowie diese in Wagen fallen lassen bzw. aus Wagen entnehmen. Um einen Wagen zu entladen, muss der Hopper unter die Schiene platziert werden. Um einen Wagen zu beladen, muss der Hopper direkt neben die Schiene platziert werden. +Minecart=Minecart +Minecart, the lean railway transportation automation system=Minecart, das schlanke Schienentransport Automatisierungssystem +Minecart Cart=Wagen +Minecart Speed Signs=Geschwindigkeitsbegrenzungszeichen +If several carts are running on one route,@nit can happen that a buffer position is already occupied and one cart therefore stops earlier.@nIn this case, the cart pusher is used to push the cart towards the buffer again.@nThis block must be placed under the rail at a distance of 2 m in front of the buffer.=Wenn mehrere Wagen auf einer Route fahren, kann es vorkommen,@ndass eine Prellbock Position bereits belegt ist und ein Wagen daher früher anhält.@nDer Cart Anschieber dient in diesem Fall dazu, die Wagen wieder in Richtung Prellbock anzuschieben.@nDieser Block muss unter der Schiene mit 2 m Abstand vor dem Prellbock platziert werden. +Limit the cart speed with speed limit signs.@n@nAs before, the speed of the carts is also influenced by power rails.@nBrake rails are irrelevant, the cart does not brake here.@nThe maximum speed is 8 m/s. This assumes a ratio of power rails@nto normal rails of 1 to 4 on a flat section of rail. A rail section is a@nseries of rail nodes without a change of direction. After every curve / kink,@nthe speed for the next section of the route is newly determined,@ntaking into account the swing of the cart. This means that a cart can@nroll over short rail sections without power rails.@n@nIn order to additionally brake the cart at certain points@n(at switches or in front of a buffer), speed limit signs can be placed@non the track. With these signs the speed can be reduced to 4, 2, or 1 m / s.@nThe "No speed limit" sign can be used to remove the speed limit.@n@nThe speed limit signs must be placed next to the track so that they can@nbe read from the cart. This allows different speeds in each direction of travel.=Begrenze die Geschwindigkeit der Wagen mit Geschwindigkeitsbegrenzungszeichen@n@nDie Geschwindigkeit der Carts wird wie bisher auch über "power rails" beeinflusst. "Brake rails" sind ohne Bedeutung, das Cart bremst hier nicht. Die maximale Geschwindigkeit beträgt 8 m/s. Dies setzt eine Verhältnis von "power rails" zu "normal rails" von 1 zu 4 auf einem ebenen Streckenabschnitt voraus. Ein Streckenabschnitt ist dabei ein Reihe von Schienenblöcken ohne Richtungsänderung. Nach jeder Kurve/Knick wird die Geschwindigkeit für den nächsten Streckenabschnitt neu bestimmt, wobei hier der Schwung des Carts mit berücksichtigt wird. So kann ein Cart auch über kurze Streckenabschnitt ohne "power rails" rollen.@n@nUm das Cart zusätzlich an bestimmten Stellen abzubremsen (an Weichen oder vor einen Puffer), können Geschwindigkeitsbegrenzungszeichen an der Strecke platziert werden. Durch diese Zeichen kann die Geschwindigkeit auf 4, 2, oder 1 m/s reduziert werden. Durch das Aufhebungszeichen kann die Geschwindigkeitsbegrenzung wieder aufgehoben werden.@n@nDie Geschwindigkeitsbegrenzungszeichen müssen so neben die Strecke platziert werden, dass sie vom Cart ablesbar sind. Dies erlaubt damit unterschiedliche Geschwindigkeiten pro Fahrtrichtung. +Minecart Hopper=Minecart Hopper +Minecart (Sneak+Click to pick up)=Minecart (Shift+Klick zum Entfernen des Carts) +Output cart state and position, or a list of carts, if no cart number is given.=Gibt Status und Position des Wagens, oder eine Liste aller Wagen aus, wenn keine Wagennummer angegeben ist. +List of carts=Liste aller Wagen +Enter cart number=Gebe Cart Nummer ein +Save=Speichern +[minecart] Area is protected!=[minecart] Bereich ist geschützt! +Allow to dig/place rails in Minecart Landmark areas=Erlaubt dir, Schienen in Meilensteinbereichen zu setzen/zu entfernen +Minecart Landmark=Minecart Meilenstein +Cart Pusher=Wagen Anschieber +left=links +right=rechts +straight=geradeaus +Recording=Aufzeichnung +speed=Tempo +next junction=nächste Weiche +Travel time=Fahrzeit +[minecart] Route stored!=[minecart] Strecke gespeichert +[minecart] Speed @= %u m/s, Time @= %u s, Route length @= %u m=[minecart] Geschw. @= %u m/s, Zeit @= %u s, Routenlänge @= %u m +Speed "1"=Tempo "1" +Speed "2"=Tempo "2" +Speed "4"=Tempo "4" +No speed limit=Keine Geschwindigkeitsbegrenzung +Cart List=Cart Liste +Cart Terminal=Cart Terminal + + +##### not used anymore ##### + +Used to push a cart if the cart does not stop directly at a buffer. Block has to be placed below the rail.=Wird verwendet, um einen Wagen anzuschieben, wenn der Wagen nicht direkt an einem Puffer anhält. Der Block muss unter der Schiene platziert werden. diff --git a/minecart/locale/template.txt b/minecart/locale/template.txt new file mode 100644 index 0000000..b9a4ae5 --- /dev/null +++ b/minecart/locale/template.txt @@ -0,0 +1,53 @@ +# textdomain: minecart +Station name= +Waiting time/sec= +connected to= +Minecart Railway Buffer= +Summary= +1. Place your rails and build a route with two endpoints. Junctions are allowed as long as each route has its own start and endpoint.= +2. Place a Railway Buffer at both endpoints (buffers are always needed, they store the route and timing information).= +3. Give both Railway Buffers unique station names, like Oxford and Cambridge.= +4. Place a Minecart at a buffer and give it a cart number (1..999)= +5. Drive from buffer to buffer in both directions using the Minecart(!) to record the routes (use 'right-left' keys to control the Minecart).= +6. Punch the buffers to check the connection data (e.g. 'Oxford: connected to Cambridge').= +7. Optional: Configure the Minecart waiting time in both buffers. The Minecart will then start automatically after the configured time.= +8. Optional: Protect your rail network with the Protection Landmarks (one Landmark at least every 16 nodes/meters).= +9. Place a Minecart in front of the buffer and check whether it starts after the configured time.= +10. Check the cart state via the chat command: /mycart @n '' is the cart number= +11. Drop items into the Minecart and punch the cart to start it.= +12. Dig the cart with 'sneak+click' (as usual). The items will be drop down.= +Primary used to transport items. You can drop items into the Minecart and punch the cart to get started. Sneak+click the cart to get cart and items back= +Used as buffer on both rail ends. Needed to be able to record the cart routes= +Protect your rails with the Landmarks (one Landmark at least every 16 blocks near the rail)= +Used to load/unload Minecart. The Hopper can push/pull items to/from chests and drop/pickup items to/from Minecarts. To unload a Minecart place the hopper below the rail. To load the Minecart, place the hopper right next to the Minecart.= +Minecart= +Minecart, the lean railway transportation automation system= +Minecart Cart= +Minecart Speed Signs= +If several carts are running on one route,@nit can happen that a buffer position is already occupied and one cart therefore stops earlier.@nIn this case, the cart pusher is used to push the cart towards the buffer again.@nThis block must be placed under the rail at a distance of 2 m in front of the buffer.= +Limit the cart speed with speed limit signs.@n@nAs before, the speed of the carts is also influenced by power rails.@nBrake rails are irrelevant, the cart does not brake here.@nThe maximum speed is 8 m/s. This assumes a ratio of power rails@nto normal rails of 1 to 4 on a flat section of rail. A rail section is a@nseries of rail nodes without a change of direction. After every curve / kink,@nthe speed for the next section of the route is newly determined,@ntaking into account the swing of the cart. This means that a cart can@nroll over short rail sections without power rails.@n@nIn order to additionally brake the cart at certain points@n(at switches or in front of a buffer), speed limit signs can be placed@non the track. With these signs the speed can be reduced to 4, 2, or 1 m / s.@nThe "No speed limit" sign can be used to remove the speed limit.@n@nThe speed limit signs must be placed next to the track so that they can@nbe read from the cart. This allows different speeds in each direction of travel.= +Minecart Hopper= +Minecart (Sneak+Click to pick up)= +Output cart state and position, or a list of carts, if no cart number is given.= +List of carts= +Enter cart number= +Save= +[minecart] Area is protected!= +Allow to dig/place rails in Minecart Landmark areas= +Minecart Landmark= +Cart Pusher= +left= +right= +straight= +Recording= +speed= +next junction= +Travel time= +[minecart] Route stored!= +[minecart] Speed @= %u m/s, Time @= %u s, Route length @= %u m= +Speed "1"= +Speed "2"= +Speed "4"= +No speed limit= +Cart List= +Cart Terminal= diff --git a/minecart/minecart.lua b/minecart/minecart.lua new file mode 100644 index 0000000..1237019 --- /dev/null +++ b/minecart/minecart.lua @@ -0,0 +1,107 @@ +--[[ + + Minecart + ======== + + Copyright (C) 2019-2021 Joachim Stolberg + + MIT + See license.txt for more information + +]]-- + +local S = minecart.S +local M = minetest.get_meta + +minetest.register_node("minecart:cart", { + description = S("Minecart (Sneak+Click to pick up)"), + tiles = { + -- up, down, right, left, back, front + "carts_cart_top.png^minecart_appl_cart_top.png", + "carts_cart_top.png", + "carts_cart_side.png^minecart_logo.png", + "carts_cart_side.png^minecart_logo.png", + "carts_cart_side.png^minecart_logo.png", + "carts_cart_side.png^minecart_logo.png", + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-8/16,-8/16,-8/16, 8/16, 8/16,-7/16}, + {-8/16,-8/16, 7/16, 8/16, 8/16, 8/16}, + {-8/16,-8/16,-8/16, -7/16, 8/16, 8/16}, + { 7/16,-8/16,-8/16, 8/16, 8/16, 8/16}, + {-8/16,-8/16,-8/16, 8/16,-6/16, 8/16}, + }, + }, +-- collision_box = { +-- type = "fixed", +-- fixed = { +-- {-8/16,-8/16,-8/16, 8/16,-4/16, 8/16}, +-- }, +-- }, + paramtype2 = "facedir", + paramtype = "light", + use_texture_alpha = minecart.CLIP, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 2, crumbly = 2, choppy = 2}, + node_placement_prediction = "", + diggable = false, + + on_place = minecart.on_nodecart_place, + on_punch = minecart.on_nodecart_punch, + + on_rightclick = function(pos, node, clicker) + if clicker and clicker:is_player() then + if M(pos):get_int("userID") ~= 0 then + -- enter the cart + local object = minecart.node_to_entity(pos, "minecart:cart", "minecart:cart_entity") + minecart.manage_attachment(clicker, object:get_luaentity(), true) + else + minecart.show_formspec(pos, clicker) + end + end + end, + + set_cargo = function(pos, data) + for _,item in ipairs(data or {}) do + minetest.add_item(pos, ItemStack(item)) + end + end, + + get_cargo = function(pos) + local data = {} + for _, obj in pairs(minetest.get_objects_inside_radius(pos, 1)) do + local entity = obj:get_luaentity() + if not obj:is_player() and entity and entity.name == "__builtin:item" then + obj:remove() + data[#data + 1] = entity.itemstring + end + end + return data + end, +}) + +minecart.register_cart_entity("minecart:cart_entity", "minecart:cart", "default", { + initial_properties = { + physical = false, + collisionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + visual = "wielditem", + textures = {"minecart:cart"}, + visual_size = {x=0.66, y=0.66, z=0.66}, + static_save = false, + }, + driver_allowed = true, +}) + + +minetest.register_craft({ + output = "minecart:cart", + recipe = { + {"default:steel_ingot", "default:cobble", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + }, +}) + diff --git a/minecart/mod.conf b/minecart/mod.conf new file mode 100644 index 0000000..7b9a9ac --- /dev/null +++ b/minecart/mod.conf @@ -0,0 +1,4 @@ +name=minecart +depends = default,carts +optional_depends = doc +description = Minecart, the lean railway transportation automation system diff --git a/minecart/mods_support.lua b/minecart/mods_support.lua new file mode 100644 index 0000000..cebb9ea --- /dev/null +++ b/minecart/mods_support.lua @@ -0,0 +1,131 @@ +--[[ + + Minecart + ======== + + Copyright (C) 2019-2021 Joachim Stolberg + + MIT + See license.txt for more information + + Wrapper functions to get hopper support for other mods + +]]-- + +-- for lazy programmers +local M = minetest.get_meta + +local CacheForFuelNodeNames = {} + +local function is_fuel(stack) + local name = stack:get_name() + if CacheForFuelNodeNames[name] then + return true + end + if minetest.get_craft_result({method="fuel", width=1, items={stack}}).time ~= 0 then + CacheForFuelNodeNames[name] = true + end + return CacheForFuelNodeNames[name] +end + +------------------------------------------------------------------------------ +-- default +------------------------------------------------------------------------------ + +minecart.register_inventory({"default:chest", "default:chest_open"}, { + put = { + listname = "main", + }, + take = { + listname = "main", + }, +}) + +minecart.register_inventory({"default:chest_locked", "default:chest_locked_open"}, { + put = { + allow_inventory_put = function(pos, stack, player_name) + local owner = M(pos):get_string("owner") + return owner == player_name + end, + listname = "main", + }, + take = { + allow_inventory_take = function(pos, stack, player_name) + local owner = M(pos):get_string("owner") + return owner == player_name + end, + listname = "main", + }, +}) + +minecart.register_inventory({"default:furnace", "default:furnace_active"}, { + put = { + -- distinguish between fuel and other items + put_item = function(pos, stack, player_name) + local inv = minetest.get_inventory({type="node", pos=pos}) + local listname = is_fuel(stack) and "fuel" or "src" + local leftover = inv:add_item(listname, stack) + minetest.get_node_timer(pos):start(1.0) + if leftover:get_count() > 0 then + return leftover + end + end, + }, + take = { + -- fuel can't be taken + listname = "dst", + }, +}) + +------------------------------------------------------------------------------ +-- digtron +------------------------------------------------------------------------------ + +minecart.register_inventory({"digtron:inventory"}, { + put = { + listname = "main", + }, + take = { + listname = "main", + }, +}) + +minecart.register_inventory({"digtron:fuelstore"}, { + put = { + listname = "fuel", + }, + take = { + listname = "fuel", + }, +}) + +minecart.register_inventory({"digtron:combined_storage"}, { + put = { + -- distinguish between fuel and other items + put_item = function(pos, stack, player_name) + local inv = minetest.get_inventory({type="node", pos=pos}) + local listname = is_fuel(stack) and "fuel" or "main" + local leftover = inv:add_item(listname, stack) + if leftover:get_count() > 0 then + return leftover + end + end, + }, + take = { + -- fuel can't be taken + listname = "main", + }, +}) + +------------------------------------------------------------------------------ +-- protector +------------------------------------------------------------------------------ + +minecart.register_inventory({"protector:chest"}, { + put = { + listname = "main", + }, + take = { + listname = "main", + }, +}) diff --git a/minecart/monitoring.lua b/minecart/monitoring.lua new file mode 100644 index 0000000..4d66b5e --- /dev/null +++ b/minecart/monitoring.lua @@ -0,0 +1,356 @@ +--[[ + + Minecart + ======== + + Copyright (C) 2019-2021 Joachim Stolberg + + MIT + See license.txt for more information + +]]-- + +-- for lazy programmers +local M = minetest.get_meta +local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local S2P = minetest.string_to_pos +local P2H = minetest.hash_node_position +local H2P = minetest.get_position_from_hash +local S = minecart.S + +local tCartsOnRail = minecart.CartsOnRail +local Queue = {} +local first = 0 +local last = -1 + +local function push(cycle, item) + last = last + 1 + item.cycle = cycle + Queue[last] = item +end + +local function pop(cycle) + if first > last then return end + local item = Queue[first] + if item.cycle < cycle then + Queue[first] = nil -- to allow garbage collection + first = first + 1 + return item + end +end + +local function is_player_nearby(pos) + for _, object in pairs(minetest.get_objects_inside_radius(pos, 64)) do + if object:is_player() then + return true + end + end +end + +local function zombie_to_entity(pos, cart, checkpoint) + local vel = {x = 0, y = 0, z = 0} + local obj = minecart.add_entitycart(pos, cart.node_name, cart.entity_name, + vel, cart.cargo, cart.owner, cart.userID) + if obj then + local entity = obj:get_luaentity() + entity.reenter = checkpoint + entity.junctions = cart.junctions + entity.is_running = true + entity.arrival_time = 0 + cart.objID = entity.objID + end +end + +local function get_checkpoint(cart) + local cp = cart.checkpoints[cart.idx] + if not cp then + cart.idx = #cart.checkpoints + cp = cart.checkpoints[cart.idx] + end + local pos = H2P(cp[1]) +-- if M(pos):contains("waypoints") then +-- print("get_checkpoint", P2S(H2P(cp[1])), P2S(H2P(cp[2]))) +-- end + return cp, cart.idx == #cart.checkpoints +end + +-- Function returns the cart state ("running" / "stopped") and +-- the station name or position string, or if cart is running, +-- the distance to the query_pos. +local function get_cart_state_and_loc(name, userID, query_pos) + if tCartsOnRail[name] and tCartsOnRail[name][userID] then + local cart = tCartsOnRail[name][userID] + local pos = cart.last_pos or cart.pos + local loc = minecart.get_buffer_name(cart.pos) or + math.floor(vector.distance(pos, query_pos)) + if cart.objID == 0 then + return "stopped", minecart.get_buffer_name(cart.pos) or + math.floor(vector.distance(pos, query_pos)), cart.node_name + else + return "running", math.floor(vector.distance(pos, query_pos)), cart.node_name + end + end + return "unknown", 0, "unknown" +end + +local function get_cart_info(owner, userID, query_pos) + local state, loc, name = get_cart_state_and_loc(owner, userID, query_pos) + local cart_type = minecart.tCartTypes[name] or "unknown" + if type(loc) == "number" then + return "Cart #" .. userID .. " (" .. cart_type .. ") " .. state .. " " .. loc .. " m away " + else + return "Cart #" .. userID .. " (" .. cart_type .. ") " .. state .. " at ".. loc .. " " + end +end + +local function monitoring(cycle) + local cart = pop(cycle) + + while cart do + -- All running cars + if cart.objID and cart.objID ~= 0 then + cart.idx = cart.idx + 1 + local entity = minetest.luaentities[cart.objID] + if entity then -- cart entity running + local pos = entity.object:get_pos() + if pos then + cart.last_pos = vector.round(pos) + --print("entity card " .. cart.userID .. " at " .. P2S(cart.last_pos)) + else + print("entity card without pos!") + end + push(cycle, cart) + elseif cart.checkpoints then + local cp, last_cp = get_checkpoint(cart) + if cp then + cart.last_pos = H2P(cp[1]) + --print("zombie " .. cart.userID .. " at " .. P2S(cart.last_pos)) + if is_player_nearby(cart.last_pos) or last_cp then + zombie_to_entity(cart.last_pos, cart, cp) + end + push(cycle, cart) + else + print("zombie got lost") + end + else + local pos = cart.last_pos or cart.pos + pos = minecart.add_nodecart(pos, cart.node_name, 0, cart.cargo, cart.owner, cart.userID) + cart.objID = 0 + cart.pos = pos + --print("cart to node", cycle, cart.userID, P2S(pos)) + end + elseif cart and not cart.objID and tCartsOnRail[cart.owner] then + -- Delete carts marked as "to be deleted" + tCartsOnRail[cart.owner][cart.userID] = nil + end + cart = pop(cycle) + end + minetest.after(2, monitoring, cycle + 1) +end + +minetest.after(5, monitoring, 2) + + +function minecart.monitoring_add_cart(owner, userID, pos, node_name, entity_name) + --print("monitoring_add_cart", owner, userID) + tCartsOnRail[owner] = tCartsOnRail[owner] or {} + tCartsOnRail[owner][userID] = { + owner = owner, + userID = userID, + objID = 0, + pos = pos, + idx = 0, + node_name = node_name, + entity_name = entity_name, + } + minecart.store_carts() +end + +function minecart.start_monitoring(owner, userID, pos, objID, checkpoints, junctions, cargo) + --print("start_monitoring", owner, userID) + if tCartsOnRail[owner] and tCartsOnRail[owner][userID] then + tCartsOnRail[owner][userID].pos = pos + tCartsOnRail[owner][userID].objID = objID + tCartsOnRail[owner][userID].checkpoints = checkpoints + tCartsOnRail[owner][userID].junctions = junctions + tCartsOnRail[owner][userID].cargo = cargo + tCartsOnRail[owner][userID].idx = 0 + push(0, tCartsOnRail[owner][userID]) + minecart.store_carts() + end +end + +function minecart.stop_monitoring(owner, userID, pos) + --print("stop_monitoring", owner, userID) + if tCartsOnRail[owner] and tCartsOnRail[owner][userID] then + tCartsOnRail[owner][userID].pos = pos + tCartsOnRail[owner][userID].objID = 0 + minecart.store_carts() + end +end + +function minecart.monitoring_remove_cart(owner, userID) + --print("monitoring_remove_cart", owner, userID) + if tCartsOnRail[owner] and tCartsOnRail[owner][userID] then + tCartsOnRail[owner][userID].objID = nil + tCartsOnRail[owner][userID] = nil + minecart.store_carts() + end +end + +function minecart.monitoring_valid_cart(owner, userID, pos, node_name) + if tCartsOnRail[owner] and tCartsOnRail[owner][userID] then + return vector.equals(tCartsOnRail[owner][userID].pos, pos) and + tCartsOnRail[owner][userID].node_name == node_name + end +end + +function minecart.userID_available(owner, userID) + return not tCartsOnRail[owner] or tCartsOnRail[owner][userID] == nil +end + +function minecart.get_cart_monitoring_data(owner, userID) + if tCartsOnRail[owner] then + return tCartsOnRail[owner][userID] + end +end + + +-- +-- API functions +-- + +-- Needed by storage to re-construct the queue after server start +minecart.push = push + +minetest.register_chatcommand("mycart", { + params = "", + description = S("Output cart state and position, or a list of carts, if no cart number is given."), + func = function(owner, param) + local userID = tonumber(param) + local query_pos = minetest.get_player_by_name(owner):get_pos() + + if userID then + return true, get_cart_info(owner, userID, query_pos) + elseif tCartsOnRail[owner] then + -- Output a list with all numbers + local tbl = {} + for userID, cart in pairs(tCartsOnRail[owner]) do + tbl[#tbl + 1] = userID + end + return true, S("List of carts") .. ": "..table.concat(tbl, ", ").." " + end + end +}) + +function minecart.cmnd_cart_state(name, userID) + local state, loc = get_cart_state_and_loc(name, userID, {x=0, y=0, z=0}) + return state +end + +function minecart.cmnd_cart_location(name, userID, query_pos) + local state, loc = get_cart_state_and_loc(name, userID, query_pos) + return loc +end + +function minecart.get_cart_list(pos, name) + local userIDs = {} + local carts = {} + + for userID, cart in pairs(tCartsOnRail[name] or {}) do + userIDs[#userIDs + 1] = userID + end + + table.sort(userIDs, function(a,b) return a < b end) + + for _, userID in ipairs(userIDs) do + carts[#carts + 1] = get_cart_info(name, userID, pos) + end + + return table.concat(carts, "\n") +end + +minetest.register_on_mods_loaded(function() + if minetest.global_exists("techage") then + techage.icta_register_condition("cart_state", { + title = "read cart state", + formspec = { + { + type = "digits", + name = "number", + label = "cart number", + default = "", + }, + { + type = "label", + name = "lbl", + label = "Read state from one of your carts", + }, + }, + button = function(data, environ) -- default button label + local number = tonumber(data.number) or 0 + return 'cart_state('..number..')' + end, + code = function(data, environ) + local condition = function(env, idx) + local number = tonumber(data.number) or 0 + return minecart.cmnd_cart_state(environ.owner, number) + end + local result = function(val) + return val ~= 0 + end + return condition, result + end, + }) + techage.icta_register_condition("cart_location", { + title = "read cart location", + formspec = { + { + type = "digits", + name = "number", + label = "cart number", + default = "", + }, + { + type = "label", + name = "lbl", + label = "Read location from one of your carts", + }, + }, + button = function(data, environ) -- default button label + local number = tonumber(data.number) or 0 + return 'cart_loc('..number..')' + end, + code = function(data, environ) + local condition = function(env, idx) + local number = tonumber(data.number) or 0 + return minecart.cmnd_cart_location(environ.owner, number, env.pos) + end + local result = function(val) + return val ~= 0 + end + return condition, result + end, + }) + techage.lua_ctlr.register_function("cart_state", { + cmnd = function(self, num) + num = tonumber(num) or 0 + return minecart.cmnd_cart_state(self.meta.owner, num) + end, + help = " $cart_state(num)\n".. + " Read state from one of your carts.\n".. + ' "num" is the cart number\n'.. + ' example: sts = $cart_state(2)' + }) + techage.lua_ctlr.register_function("cart_location", { + cmnd = function(self, num) + num = tonumber(num) or 0 + return minecart.cmnd_cart_location(self.meta.owner, num, self.meta.pos) + end, + help = " $cart_location(num)\n".. + " Read location from one of your carts.\n".. + ' "num" is the cart number\n'.. + ' example: sts = $cart_location(2)' + }) + end +end) diff --git a/minecart/nodelib.lua b/minecart/nodelib.lua new file mode 100644 index 0000000..efb540c --- /dev/null +++ b/minecart/nodelib.lua @@ -0,0 +1,139 @@ +--[[ + + Minecart + ======== + + Copyright (C) 2019-2021 Joachim Stolberg + + MIT + See license.txt for more information + +]]-- + +-- for lazy programmers +local M = minetest.get_meta +local S = minecart.S +local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local S2P = minetest.string_to_pos + +function minecart.get_nodecart_nearby(pos, param2, radius) + local pos2 = param2 and vector.add(pos, minecart.param2_to_dir(param2)) or pos + local pos3 = minetest.find_node_near(pos2, radius or 0.5, minecart.lCartNodeNames, true) + if pos3 then + return pos3, minetest.get_node(pos3) + end +end + +-- Convert node to entity and start cart +function minecart.start_nodecart(pos, node_name, puncher, punch_dir) + local owner = M(pos):get_string("owner") + local userID = M(pos):get_int("userID") + -- check if valid cart + if not minecart.monitoring_valid_cart(owner, userID, pos, node_name) then + --print("invalid cart", owner, userID, P2S(pos), node_name) + M(pos):set_string("infotext", + minetest.get_color_escape_sequence("#FFFF00") .. owner .. ": 0") + return + end + -- Only the owner or a noplayer can start the cart, but owner has to be online + if minecart.is_owner(puncher, owner) and minetest.get_player_by_name(owner) and + userID ~= 0 then + local entity_name = minecart.tNodeNames[node_name] + local obj = minecart.node_to_entity(pos, node_name, entity_name) + if obj then + local entity = obj:get_luaentity() + if puncher then + local yaw = puncher:get_look_horizontal() + entity.object:set_rotation({x = 0, y = yaw, z = 0}) + elseif punch_dir then + local yaw = minetest.dir_to_yaw(punch_dir) + entity.object:set_rotation({x = 0, y = yaw, z = 0}) + end + minecart.start_entitycart(entity, pos) + end + end +end + +function minecart.show_formspec(pos, clicker) + local owner = M(pos):get_string("owner") + if minecart.is_owner(clicker, owner) then + clicker:get_meta():set_string("cart_pos", P2S(pos)) + minetest.show_formspec(owner, "minecart:userID_node", + "size[4,3]" .. + "label[0,0;" .. S("Enter cart number") .. ":]" .. + "field[1,1;3,1;userID;;]" .. + "button_exit[1,2;2,1;exit;" .. S("Save") .. "]") + end +end + +-- Player places the node +function minecart.on_nodecart_place(itemstack, placer, pointed_thing) + local node_name = itemstack:get_name() + local param2 = minetest.dir_to_facedir(placer:get_look_dir()) + local owner = placer:get_player_name() + + -- Add node + if minecart.is_rail(pointed_thing.under) then + minecart.add_nodecart(pointed_thing.under, node_name, param2, {}, owner, 0) + placer:get_meta():set_string("cart_pos", P2S(pointed_thing.under)) + minecart.show_formspec(pointed_thing.under, placer) + elseif minecart.is_rail(pointed_thing.above) then + minecart.add_nodecart(pointed_thing.above, node_name, param2, {}, owner, 0) + placer:get_meta():set_string("cart_pos", P2S(pointed_thing.above)) + minecart.show_formspec(pointed_thing.above, placer) + else + return itemstack + end + + minetest.sound_play({name = "default_place_node_metal", gain = 0.5}, + {pos = pointed_thing.above}) + + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(placer:get_player_name())) then + itemstack:take_item() + end + + return itemstack +end + +-- Start the node cart (or dig by shift+leftclick) +function minecart.on_nodecart_punch(pos, node, puncher, pointed_thing) + --print("on_nodecart_punch") + local owner = M(pos):get_string("owner") + local userID = M(pos):get_int("userID") + if minecart.is_owner(puncher, owner) then + if puncher:get_player_control().sneak then + local ndef = minetest.registered_nodes[node.name] + if not ndef.has_cargo or not ndef.has_cargo(pos) then + minecart.remove_nodecart(pos) + minecart.add_node_to_player_inventory(pos, puncher, node.name) + minecart.monitoring_remove_cart(owner, userID) + end + else + minecart.start_nodecart(pos, node.name, puncher) + end + end +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname == "minecart:userID_node" then + if fields.exit or fields.key_enter == "true" then + local cart_pos = S2P(player:get_meta():get_string("cart_pos")) + local owner = M(cart_pos):get_string("owner") + if minecart.is_owner(player, owner) then + local userID = tonumber(fields.userID) or 0 + if minecart.userID_available(owner, userID) then + M(cart_pos):set_int("userID", userID) + M(cart_pos):set_string("infotext", + minetest.get_color_escape_sequence("#FFFF00") .. + player:get_player_name() .. ": " .. userID) + local node = minetest.get_node(cart_pos) + local entity_name = minecart.tNodeNames[node.name] + minecart.monitoring_add_cart(owner, userID, cart_pos, node.name, entity_name) + end + end + end + return true + end + return false +end) diff --git a/minecart/protection.lua b/minecart/protection.lua new file mode 100644 index 0000000..6d4a542 --- /dev/null +++ b/minecart/protection.lua @@ -0,0 +1,205 @@ +--[[ + + Minecart + ======== + + Copyright (C) 2019-2021 Joachim Stolberg + + MIT + See license.txt for more information + +]]-- + +local S = minecart.S +local RANGE = 8 + +local IsNodeUnderObservation = {} + +-- Register all nodes, which should be protected by the "minecart:landmark" +function minecart.register_protected_node(name) + IsNodeUnderObservation[name] = true +end + +local function landmark_found(pos, name, range) + local pos1 = {x=pos.x-range, y=pos.y-range, z=pos.z-range} + local pos2 = {x=pos.x+range, y=pos.y+range, z=pos.z+range} + for _,npos in ipairs(minetest.find_nodes_in_area(pos1, pos2, {"minecart:landmark"})) do + if minetest.get_meta(npos):get_string("owner") ~= name then + return true + end + end + return false +end + +local function is_protected(pos, name, range) + if minetest.check_player_privs(name, "minecart") + or not landmark_found(pos, name, range) then + return false + end + return true +end + +local old_is_protected = minetest.is_protected + +function minetest.is_protected(pos, name) + if pos and name then + local node = minetest.get_node(pos) + if IsNodeUnderObservation[node.name] and is_protected(pos, name, RANGE) then + return true + end + end + return old_is_protected(pos, name) +end + +minetest.register_node("minecart:landmark", { + description = S("Minecart Landmark"), + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-3/16, -8/16, -3/16, 3/16, 4/16, 3/16}, + {-2/16, 4/16, -3/16, 2/16, 5/16, 3/16}, + }, + }, + tiles = { + 'default_mossycobble.png', + 'default_mossycobble.png', + 'default_mossycobble.png', + 'default_mossycobble.png', + 'default_mossycobble.png^minecart_protect.png', + 'default_mossycobble.png^minecart_protect.png', + }, + after_place_node = function(pos, placer, itemstack, pointed_thing) + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name()) + if is_protected(pos, placer:get_player_name(), RANGE+3) then + minetest.remove_node(pos) + return true + end + end, + + can_dig = function(pos, digger) + local meta = minetest.get_meta(pos) + if meta:get_string("owner") == digger:get_player_name() then + return true + end + if minetest.check_player_privs(digger:get_player_name(), "minecart") then + return true + end + minetest.chat_send_player(digger:get_player_name(), + S("[minecart] Area is protected!").." (owner: "..meta:get_string("owner")..")") + return false + end, + + paramtype2 = "facedir", + sunlight_propagates = true, + groups = {cracky = 3, stone = 1}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "minecart:landmark 6", + recipe = { + {"", "default:mossycobble", ""}, + {"", "default:mossycobble", ""}, + {"", "default:mossycobble", ""}, + }, +}) + +minetest.register_node("minecart:ballast", { + description = "Minecart Ballast", + tiles = {"minecart_ballast.png"}, + groups = {crumbly = 1, cracky = 3}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("minecart:ballast_slope", { + description = "Minecart Ballast Slope", + tiles = {"minecart_ballast.png"}, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-8/16, -8/16, -8/16, 8/16, -4/16, 8/16}, + {-8/16, -4/16, -4/16, 8/16, 0/16, 8/16}, + {-8/16, 0/16, 0/16, 8/16, 4/16, 8/16}, + {-8/16, 4/16, 4/16, 8/16, 8/16, 8/16}, + }, + }, + selection_box = { + type = "fixed", + fixed = {-8/16, -8/16, -8/16, 8/16, 8/16, 8/16}, + }, + paramtype2 = "facedir", + groups = {crumbly = 1, cracky = 3}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("minecart:ballast_ramp", { + description = "Minecart Ballast Ramp", + tiles = {"minecart_ballast.png"}, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-8/16, -8/16, -8/16, 8/16, 8/16, 8/16}, + {-8/16, -4/16, -4/16, 8/16, 12/16, 8/16}, + {-8/16, 0/16, 0/16, 8/16, 16/16, 8/16}, + {-8/16, 4/16, 4/16, 8/16, 20/16, 8/16}, + }, + }, + selection_box = { + type = "fixed", + fixed = {-8/16, -8/16, -8/16, 8/16, 8/16, 8/16}, + }, + paramtype2 = "facedir", + groups = {crumbly = 1, cracky = 3}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "minecart:ballast 6", + recipe = { + {"", "", ""}, + {"default:cobble", "default:stone", "default:cobble"}, + {"default:cobble", "default:stone", "default:cobble"}, + }, +}) + +minetest.register_craft({ + output = "minecart:ballast_slope 6", + recipe = { + {"", "", "default:cobble"}, + {"", "default:stone", "default:cobble"}, + {"default:cobble", "default:stone", "default:cobble"}, + }, +}) + +minetest.register_craft({ + output = "minecart:ballast_ramp 2", + recipe = { + {"", "", ""}, + {"minecart:ballast_slope", "", ""}, + {"minecart:ballast", "", ""}, + }, +}) + +minetest.register_privilege("minecart", { + description = S("Allow to dig/place rails in Minecart Landmark areas"), + give_to_singleplayer = false, + give_to_admin = true, +}) + +minecart.register_protected_node("carts:rail") +minecart.register_protected_node("carts:powerrail") +minecart.register_protected_node("carts:brakerail") +minecart.register_protected_node("minecart:buffer") +minecart.register_protected_node("minecart:ballast") +minecart.register_protected_node("minecart:ballast_slope") +minecart.register_protected_node("minecart:ballast_ramp") +minecart.register_protected_node("minecart:speed1") +minecart.register_protected_node("minecart:speed2") +minecart.register_protected_node("minecart:speed4") +minecart.register_protected_node("minecart:speed8") + diff --git a/minecart/pusher.lua b/minecart/pusher.lua new file mode 100644 index 0000000..bc49ad5 --- /dev/null +++ b/minecart/pusher.lua @@ -0,0 +1,67 @@ +--[[ + + Minecart + ======== + + Copyright (C) 2019-2021 Joachim Stolberg + + MIT + See license.txt for more information + +]]-- + +-- for lazy programmers +local M = minetest.get_meta +local S = minecart.S +local CYCLE_TIME = 4 + +local function node_timer(pos) + local node = minetest.get_node(pos) + local dir = minetest.facedir_to_dir(node.param2) + minecart.punch_cart({x = pos.x, y = pos.y + 1, z = pos.z}, nil, 1, dir) + return true +end + + +local function after_dig_node(pos, oldnode, oldmetadata, digger) + techage.remove_node(pos, oldnode, oldmetadata) +end + +minetest.register_node("minecart:cart_pusher", { + description = S("Cart Pusher"), + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-8/16,-8/16,-8/16, 8/16, 8/16, 8/16}, + {-1/16, 8/16,-4/16, 1/16, 10/16, 4/16}, + }, + }, + tiles = { + -- up, down, right, left, back, front + "default_steel_block.png^minecart_pusher_top.png", + "default_steel_block.png", + "default_steel_block.png^minecart_pusher.png", + "default_steel_block.png^minecart_pusher.png", + "default_steel_block.png^minecart_pusher.png", + "default_steel_block.png^minecart_pusher.png", + }, + after_place_node = function(pos) + minetest.get_node_timer(pos):start(CYCLE_TIME) + end, + + on_timer = node_timer, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = true, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_craft({ + output = "minecart:cart_pusher", + recipe = { + {"dye:black", "default:steel_ingot", "dye:yellow"}, + {"default:steel_ingot", "default:mese_crystal", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + }, +}) diff --git a/minecart/rails.lua b/minecart/rails.lua new file mode 100644 index 0000000..b7b5622 --- /dev/null +++ b/minecart/rails.lua @@ -0,0 +1,548 @@ +--[[ + + Minecart + ======== + + Copyright (C) 2019-2021 Joachim Stolberg + + MIT + See license.txt for more information + +]]-- + +-- for lazy programmers +local M = minetest.get_meta +local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P2H = minetest.hash_node_position + +local get_node_lvm = minecart.get_node_lvm + +local MAX_SPEED = 8 +local SLOWDOWN = 0.3 +local MAX_NODES = 100 + +--waypoint = { +-- dot = travel direction, +-- pos = destination pos, +-- speed = 10 times the section speed (as int), +-- limit = 10 times the speed limit (as int), +--} +-- +-- waypoints = {facedir = waypoint,...} + +local tWaypoints = {} -- {pos_hash = waypoints, ...} + +local tRailsPower = { + ["carts:rail"] = 0, + ["carts:powerrail"] = 1, + ["minecart:rail"] = 0, + ["minecart:powerrail"] = 1, + ["carts:brakerail"] = 0, +} +-- Real rails from the mod carts +local tRails = { + ["carts:rail"] = true, + ["carts:powerrail"] = true, + ["carts:brakerail"] = true, + ["minecart:rail"] = true, + ["minecart:powerrail"] = true, +} +-- Rails plus node carts. Used to find waypoints. Added via add_raillike_nodes +local tRailsExt = { + ["carts:rail"] = true, + ["carts:powerrail"] = true, + ["carts:brakerail"] = true, + ["minecart:rail"] = true, + ["minecart:powerrail"] = true, +} + +local tSigns = { + ["minecart:speed1"] = 1, + ["minecart:speed2"] = 2, + ["minecart:speed4"] = 4, + ["minecart:speed8"] = 8, +} + +-- Real rails from the mod carts +local lRails = {"carts:rail", "carts:powerrail", "carts:brakerail", "minecart:rail", "minecart:powerrail"} +-- Rails plus node carts used to find waypoints, , added via add_raillike_nodes +local lRailsExt = {"carts:rail", "carts:powerrail", "carts:brakerail", "minecart:rail", "minecart:powerrail"} + +minecart.MAX_SPEED = MAX_SPEED +minecart.lRails = lRails +minecart.tRails = tRails +minecart.tRailsExt = tRailsExt +minecart.lRailsExt = lRailsExt + +local Dot2Dir = {} +local Dir2Dot = {} +local Facedir2Dir = {[0] = + {x= 0, y=0, z= 1}, + {x= 1, y=0, z= 0}, + {x= 0, y=0, z=-1}, + {x=-1, y=0, z= 0}, + {x= 0, y=-1, z= 0}, + {x= 0, y=1, z= 0}, +} + +local flip = { + [0] = 2, + [1] = 3, + [2] = 0, + [3] = 1, + [4] = 5, + [5] = 4, +} + +-- facedir = math.floor(dot / 4) +-- y = (dot % 4) - 1 + +-- Create helper tables +for facedir = 0,3 do + for y = -1,1 do + local dot = 1 + facedir * 4 + y + local dir = vector.new(Facedir2Dir[facedir]) + dir.y = y + Dot2Dir[dot] = dir + Dir2Dot[P2H(dir)] = dot + end +end + +local function dot2dir(dot) return vector.new(Dot2Dir[dot]) end +local function facedir2dir(fd) return vector.new(Facedir2Dir[fd]) end + +minecart.dot2dir = dot2dir +minecart.facedir2dir = facedir2dir + +------------------------------------------------------------------------------- +-- waypoint metadata +------------------------------------------------------------------------------- +local function has_metadata(pos) + return M(pos):contains("waypoints") +end + +local function get_metadata(pos) + local hash = P2H(pos) + if tWaypoints[hash] then + return tWaypoints[hash] + end + local s = M(pos):get_string("waypoints") + if s ~= "" then + tWaypoints[hash] = minetest.deserialize(s) + return tWaypoints[hash] + end +end + +local function get_oldmetadata(meta) + local s = meta:get_string("waypoints") + if s ~= "" then + return minetest.deserialize(s) + end +end + +local function set_metadata(pos, t) + local hash = P2H(pos) + tWaypoints[hash] = t + local s = minetest.serialize(t) + M(pos):set_string("waypoints", s) + -- visualization + local name = get_node_lvm(pos).name + if name == "carts:rail" then + minetest.swap_node(pos, {name = "minecart:rail"}) + elseif name == "carts:powerrail" then + minetest.swap_node(pos, {name = "minecart:powerrail"}) + end +end + +local function del_metadata(pos) + local hash = P2H(pos) + tWaypoints[hash] = nil + local meta = M(pos) + if meta:contains("waypoints") then + meta:set_string("waypoints", "") + -- visualization + local name = get_node_lvm(pos).name + if name == "minecart:rail" then + minetest.swap_node(pos, {name = "carts:rail"}) + elseif name == "minecart:powerrail" then + minetest.swap_node(pos, {name = "carts:powerrail"}) + end + end +end + +------------------------------------------------------------------------------- +-- find_next_waypoint +------------------------------------------------------------------------------- +local function check_right(pos, facedir) + local fdr = (facedir + 1) % 4 -- right + local new_pos = vector.add(pos, facedir2dir(fdr)) + + local name = get_node_lvm(new_pos).name + if tRailsExt[name] or tSigns[name] then + return true + end + new_pos.y = new_pos.y - 1 + if tRailsExt[get_node_lvm(new_pos).name] then + return true + end +end + +local function check_left(pos, facedir) + local fdl = (facedir + 3) % 4 -- left + local new_pos = vector.add(pos, facedir2dir(fdl)) + + local name = get_node_lvm(new_pos).name + if tRailsExt[name] or tSigns[name] then + return true + end + new_pos.y = new_pos.y - 1 + if tRailsExt[get_node_lvm(new_pos).name] then + return true + end +end + +local function get_next_pos(pos, facedir, y) + local new_pos = vector.add(pos, facedir2dir(facedir)) + new_pos.y = new_pos.y + y + local name = get_node_lvm(new_pos).name + return tRailsExt[name] ~= nil, new_pos, tRailsPower[name] or 0 +end + +local function is_ramp(pos) + return tRailsExt[get_node_lvm({x = pos.x, y = pos.y + 1, z = pos.z}).name] ~= nil +end + +-- Check also the next position to detect a ramp +local function slope_detection(pos, facedir) + local is_rail, new_pos = get_next_pos(pos, facedir, 0) + if not is_rail then + return is_ramp(new_pos) + end +end + +local function find_next_waypoint(pos, facedir, y) + local cnt = 0 + local name = get_node_lvm(pos).name + local speed = tRailsPower[name] or 0 + local is_rail, new_pos, _speed + + while cnt < MAX_NODES do + is_rail, new_pos, _speed = get_next_pos(pos, facedir, y) + speed = speed + _speed + if not is_rail then + return pos, y == 0 and is_ramp(new_pos), speed + end + if y == 0 then -- no slope + if check_right(new_pos, facedir) then + return new_pos, slope_detection(new_pos, facedir), speed + elseif check_left(new_pos, facedir) then + return new_pos, slope_detection(new_pos, facedir), speed + end + end + pos = new_pos + cnt = cnt + 1 + end + return new_pos, false, speed +end + +------------------------------------------------------------------------------- +-- find_all_next_waypoints +------------------------------------------------------------------------------- +local function check_front_up_down(pos, facedir) + local new_pos = vector.add(pos, facedir2dir(facedir)) + + if tRailsExt[get_node_lvm(new_pos).name] then + return 0 + end + new_pos.y = new_pos.y - 1 + if tRailsExt[get_node_lvm(new_pos).name] then + return -1 + end + new_pos.y = new_pos.y + 2 + if tRailsExt[get_node_lvm(new_pos).name] then + return 1 + end +end + +-- Search for rails in all 4 directions +local function find_all_rails_nearby(pos) + --print("find_all_rails_nearby") + local tbl = {} + for fd = 0, 3 do + tbl[#tbl + 1] = check_front_up_down(pos, fd, true) + end + return tbl +end + +-- Recalc the value based on waypoint length and slope +local function recalc_speed(num_pow_rails, pos1, pos2, y) + local num_norm_rails = vector.distance(pos1, pos2) - num_pow_rails + local ratio, speed + + if y ~= 0 then + num_norm_rails = math.floor(num_norm_rails / 1.41 + 0.5) + end + + if y ~= -1 then + if num_pow_rails == 0 then + return num_norm_rails * -SLOWDOWN + else + ratio = math.floor(num_norm_rails / num_pow_rails) + ratio = minecart.range(ratio, 0, 11) + end + else + ratio = 3 + num_norm_rails * SLOWDOWN + num_pow_rails + end + + if y == 1 then + speed = 7 - ratio + elseif y == -1 then + speed = 15 - ratio + else + speed = 11 - ratio + end + + return minecart.range(speed, 0, 8) +end + +local function find_all_next_waypoints(pos) + local wp = {} + local dots = {} + + for facedir = 0,3 do + local y = check_front_up_down(pos, facedir) + if y then + local new_pos, is_ramp, speed = find_next_waypoint(pos, facedir, y) + --print("find_all_next_waypoints", P2S(new_pos), is_ramp, speed) + local dot = 1 + facedir * 4 + y + speed = recalc_speed(speed, pos, new_pos, y) * 10 + wp[facedir] = {dot = dot, pos = new_pos, speed = speed, is_ramp = is_ramp} + end + end + + return wp +end + +------------------------------------------------------------------------------- +-- get_waypoint +------------------------------------------------------------------------------- +-- If ramp, stop 0.5 nodes earlier or later +local function ramp_correction(pos, wp, facedir) + if wp.is_ramp or pos.y < wp.pos.y then -- ramp detection + local dir = facedir2dir(facedir) + local pos = wp.pos + + wp.cart_pos = { + x = pos.x - dir.x / 2, + y = pos.y, + z = pos.z - dir.z / 2} + elseif pos.y > wp.pos.y then + local dir = facedir2dir(facedir) + local pos = wp.pos + + wp.cart_pos = { + x = pos.x + dir.x / 2, + y = pos.y, + z = pos.z + dir.z / 2} + end + return wp +end + +-- Returns waypoint and is_junction +function minecart.get_waypoint(pos, facedir, ctrl, uturn) + local t = get_metadata(pos) + if not t then + t = find_all_next_waypoints(pos) + set_metadata(pos, t) + end + + local left = (facedir + 3) % 4 + local right = (facedir + 1) % 4 + local back = (facedir + 2) % 4 + + if ctrl.right and t[right] then return t[right], t[facedir] ~= nil or t[left] ~= nil end + if ctrl.left and t[left] then return t[left] , t[facedir] ~= nil or t[right] ~= nil end + + if t[facedir] then return ramp_correction(pos, t[facedir], facedir), false end + if t[right] then return ramp_correction(pos, t[right], right), false end + if t[left] then return ramp_correction(pos, t[left], left), false end + + if uturn and t[back] then return t[back], false end +end + +------------------------------------------------------------------------------- +-- delete waypoints +------------------------------------------------------------------------------- +local function delete_counterpart_metadata(pos, wp) + for facedir = 0,3 do + if wp[facedir] then + del_metadata(wp[facedir].pos) + end + end + del_metadata(pos) +end + +local function delete_next_metadata(pos, facedir, y) + local cnt = 0 + while cnt <= MAX_NODES do + local is_rail, new_pos = get_next_pos(pos, facedir, y) + if not is_rail then + return + end + + if has_metadata(new_pos) then + del_metadata(new_pos) + end + + pos = new_pos + cnt = cnt + 1 + end + if has_metadata(pos) then + del_metadata(pos) + end +end + +function minecart.delete_waypoint(pos) + if has_metadata(pos) then + local wp = get_metadata(pos) + delete_counterpart_metadata(pos, wp) + return + end + + for facedir = 0,3 do + local y = check_front_up_down(pos, facedir) + if y then + local new_pos = vector.add(pos, facedir2dir(facedir)) + new_pos.y = new_pos.y + y + if has_metadata(new_pos) then + local wp = get_metadata(new_pos) + delete_counterpart_metadata(new_pos, wp) + else + delete_next_metadata(pos, facedir, y) + end + end + end +end + +carts:register_rail("minecart:rail", { + description = "Rail", + tiles = { + "carts_rail_straight.png^minecart_waypoint.png", "carts_rail_curved.png^minecart_waypoint.png", + "carts_rail_t_junction.png^minecart_waypoint.png", "carts_rail_crossing.png^minecart_waypoint.png" + }, + inventory_image = "carts_rail_straight.png", + wield_image = "carts_rail_straight.png", + groups = carts:get_rail_groups({not_in_creative_inventory = 1}), + drop = "carts:rail", +}, {}) + +carts:register_rail("minecart:powerrail", { + description = "Powered Rail", + tiles = { + "carts_rail_straight_pwr.png^minecart_waypoint.png", "carts_rail_curved_pwr.png^minecart_waypoint.png", + "carts_rail_t_junction_pwr.png^minecart_waypoint.png", "carts_rail_crossing_pwr.png^minecart_waypoint.png" + }, + inventory_image = "carts_rail_straight.png", + wield_image = "carts_rail_straight.png", + groups = carts:get_rail_groups({not_in_creative_inventory = 1}), + drop = "carts:powerrail", +}, {}) + +for name,_ in pairs(tRails) do + minetest.override_item(name, { + after_destruct = minecart.delete_waypoint, + after_place_node = minecart.delete_waypoint, + }) +end + +------------------------------------------------------------------------------- +-- API functions +------------------------------------------------------------------------------- +-- Return new cart pos and if an extra move cycle is needed +function minecart.get_current_cart_pos_correction(curr_pos, curr_fd, curr_y, new_dot) + if new_dot then + local new_y = (new_dot % 4) - 1 + local new_fd = math.floor(new_dot / 4) + + if curr_y == -1 or new_y == -1 then + local new_fd = math.floor(new_dot / 4) + local dir = facedir2dir(new_fd) + return { + x = curr_pos.x + dir.x / 2, + y = curr_pos.y, + z = curr_pos.z + dir.z / 2}, new_y == -1 + elseif curr_y == 1 and curr_fd ~= new_fd then + local dir = facedir2dir(new_fd) + return { + x = curr_pos.x + dir.x / 2, + y = curr_pos.y, + z = curr_pos.z + dir.z / 2}, true + elseif curr_y == 1 or new_y == 1 then + local dir = facedir2dir(curr_fd) + return { + x = curr_pos.x - dir.x / 2, + y = curr_pos.y, + z = curr_pos.z - dir.z / 2}, false + end + end + return curr_pos, false +end + +-- Called by carts, returns the speed value or nil +function minecart.get_speedlimit(pos, facedir) + local fd = (facedir + 1) % 4 -- right + local new_pos = vector.add(pos, facedir2dir(fd)) + local node = get_node_lvm(new_pos) + if tSigns[node.name] and node.param2 == facedir then + return tSigns[node.name] + end + + fd = (facedir + 3) % 4 -- left + new_pos = vector.add(pos, facedir2dir(fd)) + node = get_node_lvm(new_pos) + if tSigns[node.name] and node.param2 == facedir then + return tSigns[node.name] + end +end + +-- Called by carts, to delete temporarily created waypoints +function minecart.delete_cart_waypoint(pos) + del_metadata(pos) +end + +-- Called by signs, to delete the rail waypoints nearby +function minecart.delete_signs_waypoint(pos) + local node = minetest.get_node(pos) + local facedir = (node.param2 + 1) % 4 -- right + local new_pos = vector.add(pos, facedir2dir(facedir)) + if tRailsExt[get_node_lvm(new_pos).name] then + minecart.delete_waypoint(new_pos) + end + + facedir = (node.param2 + 3) % 4 -- left + new_pos = vector.add(pos, facedir2dir(facedir)) + if tRailsExt[get_node_lvm(new_pos).name] then + minecart.delete_waypoint(new_pos) + end +end + +function minecart.is_rail(pos) + return tRails[get_node_lvm(pos).name] ~= nil +end + +-- To register node cart names +function minecart.add_raillike_nodes(name) + tRailsExt[name] = true + lRailsExt[#lRailsExt + 1] = name +end + +--minetest.register_lbm({ +-- label = "Delete waypoints", +-- name = "minecart:del_meta", +-- nodenames = {"carts:brakerail"}, +-- run_at_every_load = true, +-- action = function(pos, node) +-- del_metadata(pos) +-- end, +--}) + diff --git a/minecart/recording.lua b/minecart/recording.lua new file mode 100644 index 0000000..d516a47 --- /dev/null +++ b/minecart/recording.lua @@ -0,0 +1,185 @@ +--[[ + + Minecart + ======== + + Copyright (C) 2019-2021 Joachim Stolberg + + MIT + See license.txt for more information + +]]-- + +-- for lazy programmers +local M = minetest.get_meta +local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local S2P = minetest.string_to_pos +local P2H = minetest.hash_node_position +local H2P = minetest.get_position_from_hash +local S = minecart.S + +local function dashboard_destroy(self) + if self.driver and self.hud_id then + local player = minetest.get_player_by_name(self.driver) + if player then + player:hud_remove(self.hud_id) + self.hud_id = nil + end + end +end + +local function dashboard_create(self) + if self.driver then + local player = minetest.get_player_by_name(self.driver) + if player then + dashboard_destroy(self) + self.hud_id = player:hud_add({ + name = "minecart", + hud_elem_type = "text", + position = {x = 0.4, y = 0.25}, + scale = {x=100, y=100}, + text = "Recording:", + number = 0xFFFFFF, + size = {x = 1}, + }) + end + end +end + +local function dashboard_update(self) + if self.driver and self.hud_id then + local player = minetest.get_player_by_name(self.driver) + if player then + local time = self.runtime or 0 + local dir = (self.ctrl and self.ctrl.left and S("left")) or + (self.ctrl and self.ctrl.right and S("right")) or S("straight") + local speed = math.floor((self.curr_speed or 0) + 0.5) + local s = string.format(S("Recording") .. + " | " .. S("speed") .. + ": %.1f | " .. S("next junction") .. + ": %-8s | " .. S("Travel time") .. ": %.1f s", + speed, dir, time) + player:hud_change(self.hud_id, "text", s) + end + end +end + +local function check_waypoint(self, pos) + -- If next waypoint already reached but not handled + -- determine next waypoint + if vector.equals(pos, self.waypoint.pos) then + local rot = self.object:get_rotation() + local dir = minetest.yaw_to_dir(rot.y) + dir.y = math.floor((rot.x / (math.pi/4)) + 0.5) + local facedir = minetest.dir_to_facedir(dir) + local waypoint = minecart.get_waypoint(pos, facedir, self.ctrl or {}, false) + if waypoint then + return waypoint.pos + end + end + return self.waypoint.pos +end + +-- +-- Route recording +-- +function minecart.start_recording(self, pos) + --print("start_recording") + if self.driver then + self.start_pos = minecart.get_buffer_pos(pos, self.driver) + if self.start_pos then + self.checkpoints = {} -- {cart_pos, next_waypoint_pos, speed, dot} + self.junctions = {} + self.is_recording = true + self.rec_time = self.timebase + self.hud_time = self.timebase + self.runtime = 0 + self.num_sections = 0 + self.sum_speed = 0 + self.ctrl = {} + dashboard_create(self) + dashboard_update(self, 0) + end + end +end + +function minecart.stop_recording(self, pos) + --print("stop_recording") + if self.driver and self.is_recording then + local dest_pos = minecart.get_buffer_pos(pos, self.driver) + local player = minetest.get_player_by_name(self.driver) + if dest_pos and player and #self.checkpoints > 3 then + -- Remove last checkpoint, because it is potentially too close to the dest_pos + table.remove(self.checkpoints) + if self.start_pos then + local route = { + dest_pos = dest_pos, + checkpoints = self.checkpoints, + junctions = self.junctions, + } + minecart.store_route(self.start_pos, route) + minetest.chat_send_player(self.driver, S("[minecart] Route stored!")) + local speed = self.sum_speed / #self.checkpoints + local length = speed * self.runtime + local fmt = S("[minecart] Speed = %u m/s, Time = %u s, Route length = %u m") + minetest.chat_send_player(self.driver, string.format(fmt, speed, self.runtime, length)) + end + end + dashboard_destroy(self) + end + self.is_recording = false + self.checkpoints = nil + self.waypoints = nil + self.junctions = nil +end + +function minecart.recording_waypoints(self) + local pos = vector.round(self.object:get_pos()) + -- hier müsste überprüfung dest_pos rein + self.sum_speed = self.sum_speed + self.curr_speed + local wp_pos = check_waypoint(self, pos) + self.checkpoints[#self.checkpoints+1] = { + -- cart_pos, next_waypoint_pos, speed, dot + P2H(pos), + P2H(wp_pos), + math.floor(self.curr_speed + 0.5), + self.waypoint.dot + } +end + +function minecart.recording_junctions(self) + local player = minetest.get_player_by_name(self.driver) + if player then + local ctrl = player:get_player_control() + if ctrl.left then + self.ctrl = {left = true} + elseif ctrl.right then + self.ctrl = {right = true} + elseif ctrl.up or ctrl.down then + self.ctrl = nil + end + end + if self.hud_time <= self.timebase then + dashboard_update(self) + self.hud_time = self.timebase + 0.5 + self.runtime = self.runtime + 0.5 + end +end + +function minecart.set_junctions(self, wayp_pos) + if self.ctrl then + self.junctions[P2H(wayp_pos)] = self.ctrl + end +end + +function minecart.player_ctrl(self) + local player = minetest.get_player_by_name(self.driver) + if player then + local ctrl = player:get_player_control() + if ctrl.left then + self.ctrl = {left = true} + elseif ctrl.right then + self.ctrl = {right = true} + end + end +end diff --git a/minecart/screenshot.png b/minecart/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..247e4623dc3936c1a992c5487c2ff010905f0370 GIT binary patch literal 157572 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�} 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

d!95J^4yXbU_u{kK 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 B8~^|S literal 0 HcmV?d00001 diff --git a/minecart/textures/minecart_appl_hopper.png b/minecart/textures/minecart_appl_hopper.png new file mode 100644 index 0000000000000000000000000000000000000000..7eaf8a28e88462a1505b5204880f96e26d3237f2 GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?smO1^9%xx)=BWne(+;0)Z4$NswPKL;W_*g;Rk%5l@v1;LQ7N9(Xr>mdKI;Vst03I+R5dZ)H literal 0 HcmV?d00001 diff --git a/minecart/textures/minecart_appl_hopper_right.png b/minecart/textures/minecart_appl_hopper_right.png new file mode 100644 index 0000000000000000000000000000000000000000..48e10370fc8ad25c94742069834f9f365d769009 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wF?gc(TCJ=~ab4~_QOeH~n!3_1=G#5?<@}xao977~7Cv&tiu~{@n lF|0r7vpUT5LYreO1H-NmnZJHJLXLqnd%F6$taD0e0sxNQBdh=b literal 0 HcmV?d00001 diff --git a/minecart/textures/minecart_appl_hopper_top.png b/minecart/textures/minecart_appl_hopper_top.png new file mode 100644 index 0000000000000000000000000000000000000000..4c2fb4d8b89a4c157aeb918b3e3b74ce4073aad6 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wF?gc(dDoWON*1KAFe+Q{33GxeOaCmkj4al+cba4!kxSX7@Kk}@P)K(8n5%V0a)ASWk9>mHPWYrN=&QMk%x0I>quBvQVP$6lZG zQjZ;*V3YPXsEM*?2J)y)z@y9EhYKllpYK?AE`yczDq^?ws@+2J%_JNM&073lrb&7& zU#$@ZPTJ`rLoBLdWj|RvuqyJ9L1-e}w0Sq;Ko2|>SHq#Np>8>nCNM=FLkSwbAn1ii z@c{vkkPE_&uut>E=m4fDkaCLO-*J2M^Uww4i;a#E0{`a7(o&MZ6|04VRgv`*jtby_ zsUKx4Ei)E#LW*bynzt(&6s;3z=6Yy_6)bLt(s~ZApmL*9N#GxoW^S&%o`u-}0000< KMNUMnLSTZDQvfdj literal 0 HcmV?d00001 diff --git a/minecart/textures/minecart_buffer.png b/minecart/textures/minecart_buffer.png new file mode 100644 index 0000000000000000000000000000000000000000..19ff9a073f03c4ca0cc9efc3d433a06cefa09d1a GIT binary patch literal 222 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 Hu0mjf^FQiA literal 0 HcmV?d00001 diff --git a/minecart/textures/minecart_logo.png b/minecart/textures/minecart_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..17ff7b2d2b4a78c51e3049ce85d0a212228c4cee GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIID%0X`wF?gc&`E>7FGZVd|yn>b;Dx}ElSkh+o}zhDN3XE)M-9B)q-#}JM4 z$q5V86I`Bib1wQgbqdSH9~w#t`zB3dh;a~D#H6T@!(nuo)$_oO0FMi-t_N;hXuZYM tb4Y!lvI6;x#X;^) z4C~IxyaaMM1AIbUh3qG|7x=j4?=t-zdIl)SToU9L+{w_{@a=vmkn8E`;uyklo%fg_ zSA&57%YnZ~SaVqC3uP;BXMZ_)Imb4qcl+OkG{=6JAa3^Qh?2OD?S!q?Yr@Y4b6>u7 mCGE0~Osme16OGM#KAz&&>J+uCj?@P^j=|H_&t;ucLK6UT20xVm literal 0 HcmV?d00001 diff --git a/minecart/textures/minecart_protect.png b/minecart/textures/minecart_protect.png new file mode 100644 index 0000000000000000000000000000000000000000..6ca8308217b5951362fb64f0de870e8512eae0ff GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VWbuaMI)YMc|R5Ua+%rH^% z*U{0pxgiUbWh@Eu3ubV5b|VeQk@0kK4B@z*oS-1c!RaWu$S$J literal 0 HcmV?d00001 diff --git a/minecart/textures/minecart_pusher.png b/minecart/textures/minecart_pusher.png new file mode 100644 index 0000000000000000000000000000000000000000..12704ed6821d78e8b458bc31893f3583750c0586 GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|uI>dsK<4i^%ttILegIjF zB|(0{3=Yq3qyaf1o-U3d9M_XQn3>vUIvjA|Y?#f&V6Dvlb7krOqd<8EPgg&ebxsLQ E087mr>Hq)$ literal 0 HcmV?d00001 diff --git a/minecart/textures/minecart_pusher_top.png b/minecart/textures/minecart_pusher_top.png new file mode 100644 index 0000000000000000000000000000000000000000..f0c4179545aacf476a6cce04486be0e3a5559a08 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9JOMr-uI>ds{=U9I-tRZe{#}cB zfGoz6AirP+hi5m^fE)!+7sn8e>&XcTB?&;l%OJE!ktg859R`ⅆ%$nObop9*hK9A Sbu|LjGI+ZBxvXnE##Uv(aQ>>*;?(9lAAq_UJYD@<);T3K0RVJCC;R{a literal 0 HcmV?d00001 diff --git a/minecart/textures/minecart_sign2.png b/minecart/textures/minecart_sign2.png new file mode 100644 index 0000000000000000000000000000000000000000..adf879d9be1658b5d2596c866f62d88f95509e7f GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H$efSN8&+Ck%r3?%nIUlivyy zWGo5t3ubV5b|VeQvG;Uw43W5;oRGlF+Qh)drgBV6!68|vx5;Q(o1^6AWe2Z3NIX!o yw#9H-+Choc7kFEY4RVebC^9o&XJTWkGGOSFw(grh{rpd$Q4F50elF{r5}E)m11|9Z literal 0 HcmV?d00001 diff --git a/minecart/textures/minecart_sign4.png b/minecart/textures/minecart_sign4.png new file mode 100644 index 0000000000000000000000000000000000000000..f981cc703f6f8f21bd011816ac194ea021c1e0bf GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H$efSN8&+Ck%r3?%nIUlivyy zWGo5t3ubV5b|VeQvGH_q43W5;oRGlF+Qh)drgBV6!6DtJ+3?VUo~Z`Mf-IPqrAe_V un~2P9G!U5Fm}lL_Eh(`>%)sD6Gb2N+ly#hW?JG8*ISihzelF{r5}E+#Ybd<{ literal 0 HcmV?d00001 diff --git a/minecart/textures/minecart_sign8.png b/minecart/textures/minecart_sign8.png new file mode 100644 index 0000000000000000000000000000000000000000..7190be371e04e424eadf2d971a8e28471b5d2df8 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H$efSN8&+Ck%r3?%nIUlivyy zWGo5t3ubV5b|VeQ3HEex43W6J_uN9>0}edSfs-fsg->dbe)x@3-?CulripJnrk;}i zB2t_1V8br%3Pt0^7w6xN&^scKBXoNbgq|t@h8&s|k2ecgk literal 0 HcmV?d00001 diff --git a/minecart/textures/minecart_terminal_back.png b/minecart/textures/minecart_terminal_back.png new file mode 100644 index 0000000000000000000000000000000000000000..daeff713a382ef1c0236d6cc72809d1745fdcff8 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?smO1^9%xX5@zTPw3Wni!KF<2z$CXhHzX@PGD&K_5c5WUOOfhhF;%{?DISN Q+JMpwp00i_>zopr0MJJvqyPW_ literal 0 HcmV?d00001 diff --git a/minecart/textures/minecart_terminal_front.png b/minecart/textures/minecart_terminal_front.png new file mode 100644 index 0000000000000000000000000000000000000000..c6bf65894c16d593dfe4ab0111c058ef5e99cbe2 GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvxd5LK*X!4=O`SGLS4Sr`B?Txp z(cgc=`qi$ku2GSZ2lwt_GM6g=iZ1bVaSYKofA-u)u4V%Pwg>XwyN>^2n6cNE7TRDV~mw)9cZakfLU_wTB*@3p+asGgmBHe0ollVOGa0mn%kt5mm` zt0lJ_=nJ$uw4q_rL~F-H*2Eu&Oun`}ZoaTQobP0l+XkK^oVF2 literal 0 HcmV?d00001 diff --git a/minecart/textures/minecart_terminal_side.png b/minecart/textures/minecart_terminal_side.png new file mode 100644 index 0000000000000000000000000000000000000000..61024047f1a9c2ec0bda0f358032f5f81d846e1b GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4*Noh-{t4Z?ckiAyb!t;X zLzmOsLqMq@PZ!4!jq}L~4(vTm2?`90GgTI_urV3TY79IYc!NV_fl>yK;DLaJZ*o|~ z0t~|rEj@JP2#d;sH*emw#I|;A-rTuS@B)u;a(eO_trw5~9@J{!W7zOU<KtBbBuVFVdQ&MBb@08(iqkN^Mx literal 0 HcmV?d00001 diff --git a/minecart/textures/minecart_tool.png b/minecart/textures/minecart_tool.png new file mode 100644 index 0000000000000000000000000000000000000000..4fddeb2eb84ce948a8a225f8ad0b7a40bf178cce GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFdsx;i?)-!M`F@)oKa)JVrfh7ayF}9>BOboJT7>>A#*gpcwGkCiCxvX old_pos.y and 1 or pos.y < old_pos.y and -1 or 0 + + local cart_pos, extra_cycle = minecart.get_current_cart_pos_correction(pos, facedir, curr_y, route.dot) + minecart.set_marker(cart_pos, "curr", 0.3, 10) + old_pos = pos + print(string.format("Route: dist = %u, dot = %u, speed = %d, extra cycle = %s", + vector.distance(pos, route.pos), route.dot, route.speed or 0, extra_cycle)) + end +end + +local function test_get_connections(pos, node, player, ctrl) + local wp = minecart.get_waypoints(pos) + for i = 0,3 do + if wp[i] then + local dir = minecart.Dot2Dir[ wp[i].dot] + print(sDir[i], vector.distance(pos, wp[i].pos), dir.y) + end + end + print(dump(M(pos):to_table())) +end + +local function click_left(itemstack, placer, pointed_thing) + if pointed_thing.type == "node" then + local pos = pointed_thing.under + local node = minetest.get_node(pos) + if node.name == "carts:rail" or node.name == "carts:powerrail" then + test_get_route(pos, node, placer) + end + end +end + +local function click_right(itemstack, placer, pointed_thing) + if pointed_thing.type == "node" then + local pos = pointed_thing.under + local node = minetest.get_node(pos) + if node.name == "carts:rail" or node.name == "carts:powerrail" then + test_get_connections(pos, node, placer) + elseif node.name == "minecart:buffer" then + local route = minecart.get_route(P2S(pos)) + print(dump(route)) + end + end +end + +minetest.register_node("minecart:tool", { + description = "Tool", + inventory_image = "minecart_tool.png", + wield_image = "minecart_tool.png", + liquids_pointable = true, + use_texture_alpha = true, + groups = {cracky=1, book=1}, + on_use = click_left, + on_place = click_right, + node_placement_prediction = "", + stack_max = 1, +})