Иконка ресурса

FREE NPCTaxi : 0.1.15 0.1.15

Нет прав для скачивания
C#:
using Facepunch;
using Newtonsoft.Json;
using Oxide.Core.Plugins;
using Oxide.Ext.AStar;
using ProtoBuf;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using UnityEngine;
namespace Oxide.Plugins {
    [Info("NPCTaxi", "k1lly0u", "0.1.15")]
    [Description("Allow players to call NPC driven taxi's to drive them around")]
    class NPCTaxi : RustPlugin, IPathFinder {
#region Fields
        [PluginReference]
        Plugin ServerRewards, Economics, Friends, Clans;
        private Telephone _telephone;
        private List<GridNode> _roadNodes = ListPool.Get<GridNode>();
        private static Hash<ulong, float> _cooldowns = new Hash<ulong, float>();
        private static int _scrapItemID;
        private static NPCTaxi Instance;
        private static Oxide.Ext.AStar.PathFinder PathFinder;
        private static List<BasePlayer> PathRequests;
        private static List<VehicleAI> ActiveVehicles;
        private const string SCIENTIST_PREFAB = "assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_heavy.prefab";
        private const string PHONE_PREFAB = "assets/prefabs/voiceaudio/telephone/telephone.deployed.prefab";
        private const string PERMISSION_USE = "npctaxi.use";
        private const string PERMISSION_NOCOST = "npctaxi.nocost";
        private const string PERMISSION_NOCOOLDOWN = "npctaxi.nocooldown";
        private const float MAXIMUM_CALL_DISTANCE_FROM_ROAD = 20;
        private const float WORLD_GRID_SIZE = 2f;
        public bool DebugMode => Configuration.PathfinderDebug;
        private bool DrawSensors => false;
        private PurchaseType _purchaseType;
        private enum PurchaseType {
            Scrap, ServerRewards, Economics
        }
#endregion
#region Oxide Hooks
        private void Loaded() {
            Instance = this;
            PathRequests = ListPool.Get<BasePlayer>();
            ActiveVehicles = ListPool.Get<VehicleAI>();
            permission.RegisterPermission(PERMISSION_USE, this);
            permission.RegisterPermission(PERMISSION_NOCOST, this);
            permission.RegisterPermission(PERMISSION_NOCOOLDOWN, this);
            for (int i = 0; i < Configuration.Costs.Count; i++) {
                if (!permission.PermissionExists(Configuration.Costs[i].Permission)) permission.RegisterPermission(Configuration.Costs[i].Permission, this);
            }
        }
        protected override void LoadDefaultMessages() => lang.RegisterMessages(Messages, this);
        private void OnServerInitialized() {
            _purchaseType = ParseType<PurchaseType>(Configuration.CostType);
            _scrapItemID = ItemManager.FindItemDefinition("scrap").itemid;
            if (!Configuration.Invincible) Unsubscribe(nameof(OnEntityTakeDamage));
            if (!Configuration.UseTelephone) Unsubscribe(nameof(OnPhoneDial));
            else SpawnTelephone();
            PathFinder = PathManager.RegisterPathFinder(this, new PathFinderConfig {
                NodeEvaluator = EvaluateNode, WorldSize = World.Size, CellSize = WORLD_GRID_SIZE, PathInterval = 10f, BlurRate = 2
            }
            );
        }
        private void OnEntityTakeDamage(BaseVehicleModule baseVehicleModule, HitInfo hitInfo) {
            if (baseVehicleModule.GetParentEntity()?.GetComponent<VehicleAI>() != null) {
                hitInfo.damageTypes.Clear();
                hitInfo.HitEntity = null;
                hitInfo.HitMaterial = 0;
                hitInfo.PointStart = Vector3.zero;
            }
        }
        private void OnEntityTakeDamage(ScientistNPC scientistNPC, HitInfo hitInfo) {
            if (scientistNPC.GetMountedVehicle()?.GetComponent<VehicleAI>() != null) {
                hitInfo.damageTypes.Clear();
                hitInfo.HitEntity = null;
                hitInfo.HitMaterial = 0;
                hitInfo.PointStart = Vector3.zero;
            }
        }
        private object OnTurretTarget(AutoTurret autoTurret, ScientistNPC scientistNPC) {
            if (ActiveVehicles.Count == 0) return null;
            if (scientistNPC?.GetMountedVehicle()?.GetComponent<VehicleAI>() != null) return true;
            return null;
        }
        private void OnLootEntity(BasePlayer player, Rust.Modular.EngineStorage engineStorage) {
            if (engineStorage.GetComponentInParent<VehicleAI>() != null) NextTick(player.EndLooting);
        }
        private void OnEntityKill(ModularCar modularCar) => UnityEngine.Object.Destroy(modularCar.GetComponent<VehicleAI>());
        private void OnMapMarkerAdd(BasePlayer player, MapNote mapNote) {
            VehicleAI vehicleAI = player.GetMountedVehicle()?.GetComponent<VehicleAI>();
            if (vehicleAI != null && vehicleAI.Caller == player && vehicleAI.State == VehicleAI.TaxiState.WaitingForInput) {
                int topology = TerrainMeta.TopologyMap.GetTopology(mapNote.worldPosition, MAXIMUM_CALL_DISTANCE_FROM_ROAD);
                if (!ContainsTopology(topology, TerrainTopology.Enum.Road)) {
                    player.ChatMessage(Message("Error.TooFarAway", player.userID, true));
                    return;
                }
                Vector3 closestNode = FindClosestNodeTo(mapNote.worldPosition);
                vehicleAI.OnMarkerPlaced(closestNode);
            }
        }
        private object CanMountEntity(BasePlayer player, BaseMountable mountable) {
            if (player.IsNpc) return null;
            VehicleAI vehicleAI = mountable.VehicleParent()?.GetComponent<VehicleAI>();
            if (vehicleAI != null) {
                if (vehicleAI.State == VehicleAI.TaxiState.WaitingForInput) {
                    if (player == vehicleAI.Caller) {
                        vehicleAI.OnCallerEnteredVehicle();
                        return null;
                    }
                    if (player.currentTeam != 0UL && player.currentTeam.Equals(vehicleAI.Caller.currentTeam)) return null;
                    if (IsFriend(vehicleAI.Caller.userID, player.userID)) return null;
                    if (IsClanmate(vehicleAI.Caller.userID, player.userID)) return null;
                }
                return false;
            }
            return null;
        }
        private void OnEntityDismounted(BaseMountable mountable, BasePlayer player) {
            VehicleAI vehicleAI = mountable.VehicleParent()?.GetComponent<VehicleAI>();
            if (vehicleAI != null) {
                if (player == vehicleAI.Caller) {
                    player.SendConsoleCommand("gametip.hidegametip");
                    player.ChatMessage(Message("Notification.Goodbye", player.userID, true));
                    vehicleAI.CancelService();
                    _cooldowns[player.userID] = Time.time + Configuration.CooldownTime;
                }
            }
        }
        private object OnPhoneDial(PhoneController callerPhone, PhoneController receiverPhone, BasePlayer player) {
            if ((receiverPhone.ParentEntity as Telephone) == _telephone) {
                receiverPhone.OnDialFailed(Telephone.DialFailReason.RemoteHangUp);
                callerPhone.ServerHangUp();
                callerPhone.ClearCurrentUser();
                RequestTaxi(player, true);
                return true;
            }
            return null;
        }
        private object OnServerCommand(ConsoleSystem.Arg arg) {
            const string VEHICLE_SWAP_SEAT = "vehicle.swapseats";
            const string PLAYER_SWAP_SEAT = "player.swapseat";
            BasePlayer player = arg.Player();
            if (player != null && (arg.cmd.FullName.Equals(PLAYER_SWAP_SEAT, StringComparison.OrdinalIgnoreCase) || arg.cmd.FullName.Equals(VEHICLE_SWAP_SEAT, StringComparison.OrdinalIgnoreCase))) {
                if (player.GetMountedVehicle()?.GetComponent<VehicleAI>() != null) {
                    player.ChatMessage(Message("Notification.NoSwappingSeats", player.userID, true));
                    return false;
                }
            }
            return null;
        }
        private void Unload() {
            if (_telephone != null && !_telephone.IsDestroyed) {
                TelephoneManager.DeregisterTelephone(_telephone.Controller);
                _telephone.Kill(BaseNetworkable.DestroyMode.None);
            }
            for (int i = ActiveVehicles.Count - 1; i >= 0; i--) {
                UnityEngine.Object.Destroy(ActiveVehicles[i]);
            }
            ListPool.Free(ref ActiveVehicles);
            ListPool.Free(ref PathRequests);
            ListPool.Free(ref _roadNodes);
            PathManager.Unload(this);
            Instance = null;
            Configuration = null;
            PathFinder = null;
        }
#endregion
#region Path Generator Callbacks
        private void OnPathGenerated(PathCompletedResult pathResult) {
            if (DebugMode) Debug.Log("Path Generated");
            List<Vector3> results = pathResult.Results;
            PathRequests.Remove(pathResult.Requester);
            pathResult.Requester.ChatMessage(Message("Notification.Inbound", pathResult.Requester.userID, true));
            SendMapMarker(pathResult.Requester, results[results.Count - 1]);
            VehicleAI vehicleAI = CreateTaxiVehicle(results[0] + Vector3.up, Quaternion.LookRotation((results[1] - results[0]).normalized));
            vehicleAI.InitializeVehicle(pathResult.Requester, results);
            ActiveVehicles.Add(vehicleAI);
            _cooldowns[pathResult.Requester.userID] = Time.time + Configuration.CooldownTime;
            if (DebugMode) Debug.Log($"Taxi spawned at {results[0]}");
        }
        private void OnPathFailed(PathFailedResult pathResult) {
            if (DebugMode) Debug.Log("Path Generation Failed");
            pathResult.Requester.ChatMessage(string.Format(Message("Error.PathFail", pathResult.Requester.userID), pathResult.Reason));
            PathRequests.Remove(pathResult.Requester);
        }
#endregion
#region Node Helpers
        private Vector3 FindClosestNodeTo(Vector3 position) {
            Vector3 closestNode = position;
            float closestDistance = float.MaxValue;
            for (int i = 0; i < _roadNodes.Count; i++) {
                GridNode node = _roadNodes[i];
                float distance = Vector3.Distance(position, node.Position);
                if (distance < closestDistance) {
                    closestNode = node.Position;
                    closestDistance = distance;
                }
            }
            return closestNode;
        }
        private Vector3 FindNodeAtDistance(Vector3 position, float range, float threshold) {
            Vector3 closestNode = position;
            float closestDistance = float.MaxValue;
            for (int i = 0; i < _roadNodes.Count; i++) {
                GridNode node = _roadNodes[i];
                float distance = Vector3.Distance(position, node.Position);
                if (distance.Approximately(range, threshold)) return node.Position;
                if (distance < closestDistance) {
                    closestNode = node.Position;
                    closestDistance = distance;
                }
            }
            return closestNode;
        }
#endregion
#region Map Markers
        private static void SendMapMarker(BasePlayer player, Vector3 position) {
            if (player.ServerCurrentMapNote != null) player.ServerCurrentMapNote.Dispose();
            MapNote mapNote = Pool.Get<MapNote>();
            mapNote.noteType = 1;
            mapNote.worldPosition = position;
            player.ServerCurrentMapNote = mapNote;
            using (MapNoteList list = Pool.Get<MapNoteList>()) {
                list.notes = Pool.GetList<MapNote>();
                if (player.ServerCurrentDeathNote != null) list.notes.Add(player.ServerCurrentDeathNote);
                list.notes.Add(mapNote);
                player.ClientRPCPlayer<MapNoteList>(null, player, "Client_ReceiveMarkers", list);
                list.notes.Clear();
            }
        }
#endregion
#region Telephone
        private void SpawnTelephone() {
            _telephone = GameManager.server.CreateEntity(PHONE_PREFAB) as Telephone;
            _telephone.enableSaving = false;
            _telephone.limitNetworking = true;
            UnityEngine.Object.Destroy(_telephone.GetComponent<Collider>());
            UnityEngine.Object.Destroy(_telephone.GetComponent<GroundWatch>());
            UnityEngine.Object.Destroy(_telephone.GetComponent<DestroyOnGroundMissing>());
            _telephone.Spawn();
            NextTick(() => {
                _telephone.Controller.PhoneName = "Taxi Service";
                _telephone.Controller.RequirePower = false;
                _telephone.SendNetworkUpdate(BasePlayer.NetworkQueue.Update);
            }
            );
        }
#endregion
#region Helpers
        private T ParseType<T>(string type) {
            try {
                return (T)Enum.Parse(typeof(T), type, true);
            }
            catch {
                return default(T);
            }
        }
        private int GetFareCost(string playerId) {
            int cost = int.MaxValue;
            for (int i = 0; i < Configuration.Costs.Count; i++) {
                ConfigData.CostEntry costEntry = Configuration.Costs[i];
                if (permission.UserHasPermission(playerId, costEntry.Permission)) cost = Mathf.Min(cost, costEntry.Cost);
            }
            return cost;
        }
        private int GetAmount(BasePlayer player) {
            switch (_purchaseType) {
                case PurchaseType.Scrap : return player.inventory.GetAmount(_scrapItemID);
                case PurchaseType.ServerRewards : return (int)ServerRewards?.Call("CheckPoints", player.userID);
                case PurchaseType.Economics : return (int)((double)Economics?.Call("Balance", player.UserIDString));
            }
            return 0;
        }
        private void SubtractFareCost(BasePlayer player, int fareCost) {
            switch (_purchaseType) {
                case PurchaseType.Scrap : player.inventory.Take(null, _scrapItemID, fareCost);
                return;
                case PurchaseType.ServerRewards : ServerRewards?.Call("TakePoints", player.userID, fareCost);
                return;
                case PurchaseType.Economics : Economics?.Call("Withdraw", player.UserIDString, (double)fareCost);
                return;
            }
        }
        private void RefundFareCost(BasePlayer player, int refundFare) {
            switch (_purchaseType) {
                case PurchaseType.Scrap : player.GiveItem(ItemManager.CreateByItemID(_scrapItemID, refundFare), BaseEntity.GiveItemReason.PickedUp);
                return;
                case PurchaseType.ServerRewards : ServerRewards?.Call("AddPoints", player.userID, refundFare);
                return;
                case PurchaseType.Economics : Economics?.Call("Deposit", player.UserIDString, (double)refundFare);
                return;
            }
        }
        private bool IsClanmate(ulong playerId, ulong friendId) {
            if (!Clans) return false;
            string playerTag = Clans?.Call<string>("GetClanOf", playerId);
            string friendTag = Clans?.Call<string>("GetClanOf", friendId);
            if (!string.IsNullOrEmpty(playerTag) && playerTag == friendTag) return true;
            return false;
        }
        private bool IsFriend(ulong playerID, ulong friendID) {
            if (!Friends) return false;
            return (bool)Friends?.Call("AreFriends", playerID, friendID);
        }
        private static bool ContainsTopologyAtPoint(TerrainTopology.Enum mask, Vector3 position) => (TerrainMeta.TopologyMap.GetTopology(position) & (int)mask) != 0;
        private static bool ContainsTopology(int topology, TerrainTopology.Enum mask) => (topology & (int)mask) != 0;
#endregion
#region Node Evaluator
        public void EvaluateNode(GridNode gridNode, Vector3 position) {
            position.y = TerrainMeta.HeightMap.GetHeight(position);
            gridNode.Position = position;
            if (position.y < 0) {
                gridNode.C_Cost = 1000;
                gridNode.IsBlocked = true;
                return;
            }
            int topologyInRadius = TerrainMeta.TopologyMap.GetTopology(position, gridNode.CellSize * 0.5f);
            if (topologyInRadius.ContainsTopology(TerrainTopology.Enum.Road)) {
                _roadNodes.Add(gridNode);
                gridNode.C_Cost = 0;
                return;
            }
            if (topologyInRadius.ContainsTopology(TerrainTopology.Enum.Ocean | TerrainTopology.Enum.River | TerrainTopology.Enum.Lake | TerrainTopology.Enum.Cliff | TerrainTopology.Enum.Swamp | TerrainTopology.Enum.Decor | TerrainTopology.Enum.Building)) {
                gridNode.C_Cost = 1000;
                gridNode.IsBlocked = true;
                return;
            }
            gridNode.C_Cost = 50;
            if (topologyInRadius.ContainsTopology(TerrainTopology.Enum.Roadside)) return;
            if (topologyInRadius.ContainsTopology(TerrainTopology.Enum.Monument | TerrainTopology.Enum.Forest | TerrainTopology.Enum.Forestside | TerrainTopology.Enum.Cliffside)) gridNode.C_Cost = 750;
            float slope = TerrainMeta.HeightMap.GetSlope(position);
            float maxSlope = Configuration.Taxi.Tier == 3 ? 60 : Configuration.Taxi.Tier == 2 ? 50 : 40;
            if (slope > maxSlope) {
                gridNode.C_Cost = 1000;
                gridNode.IsBlocked = true;
            }
            else gridNode.C_Cost += Mathf.RoundToInt((slope / maxSlope) * 1000f);
        }
        public void OnGridProcessed() {
        }
#endregion
#region Road Prefabs
        public IEnumerator OnCostMapGenerated() {
            Debug.Log("[NPCTaxi] Processing road prefabs...");
            _roadPrefabs = JsonConvert.DeserializeObject<Dictionary<string, List<SerializedVector3>>>(SERIALIZED_ROAD_NODES);
            GameObject[] gameObjects = UnityEngine.Object.FindObjectsOfType<GameObject>();
            int prefabCount = 0;
            for (int i = 0; i < gameObjects.Length; i++) {
                GameObject gameObject = gameObjects[i];
                if (gameObject.name.Contains("road_")) {
                    string name = Core.Utility.GetFileNameWithoutExtension(gameObject.name);
                    List<SerializedVector3> list = FindPrefab(name);
                    if (list != null) {
                        prefabCount++;
                        Transform tr = gameObject.transform;
                        for (int y = 0; y < list.Count; y++) {
                            SerializedVector3 vector3 = list[y];
                            Vector3 v = tr.TransformPoint(vector3.X, vector3.Y, vector3.Z);
                            GridNode node = PathFinder.FindOrCreateCell(v);
                            node.Position = new Vector3(node.Position.x, v.y, node.Position.z);
                            node.C_Cost = 0;
                            node.IsBlocked = false;
                        }
                        yield return null;
                    }
                }
            }
            Debug.Log($"[NPCTaxi] Processed {prefabCount} road prefabs");
        }
        private Dictionary<string, List<SerializedVector3>> _roadPrefabs = new Dictionary<string, List<SerializedVector3>>();
        private struct SerializedVector3 {
            public float X, Y, Z;
        }
        private List<SerializedVector3> FindPrefab(string name) {
            foreach(KeyValuePair<string, List<SerializedVector3>> kvp in _roadPrefabs) {
                if (name.StartsWith(kvp.Key, StringComparison.OrdinalIgnoreCase)) return kvp.Value;
            }
            return null;
        }
#region Road Node Json
        private const string SERIALIZED_ROAD_NODES = @"{'road_18x15':[{'X':-5.1,'Y':0,'Z':-10},{'X':-3.1,'Y':0,'Z':-10},{'X':-1.1,'Y':0,'Z':-10},{'X':0.9,'Y':0,'Z':-10},{'X':2.9,'Y':0,'Z':-10},{'X':4.9,'Y':0,'Z':-10},{'X':-5.1,'Y':0,'Z':-8},{'X':-3.1,'Y':0,'Z':-8},{'X':-1.1,'Y':0,'Z':-8},{'X':0.9,'Y':0,'Z':-8},{'X':2.9,'Y':0,'Z':-8},{'X':4.9,'Y':0,'Z':-8},{'X':-5.1,'Y':0,'Z':-6},{'X':-3.1,'Y':0,'Z':-6},{'X':-1.1,'Y':0,'Z':-6},{'X':0.9,'Y':0,'Z':-6},{'X':2.9,'Y':0,'Z':-6},{'X':4.9,'Y':0,'Z':-6},{'X':-5.1,'Y':0,'Z':-4},{'X':-3.1,'Y':0,'Z':-4},{'X':-1.1,'Y':0,'Z':-4},{'X':0.9,'Y':0,'Z':-4},{'X':2.9,'Y':0,'Z':-4},{'X':4.9,'Y':0,'Z':-4},{'X':-5.1,'Y':0,'Z':-2},{'X':-3.1,'Y':0,'Z':-2},{'X':-1.1,'Y':0,'Z':-2},{'X':0.9,'Y':0,'Z':-2},{'X':2.9,'Y':0,'Z':-2},{'X':4.9,'Y':0,'Z':-2},{'X':-5.1,'Y':0,'Z':0},{'X':-3.1,'Y':0,'Z':0},{'X':-1.1,'Y':0,'Z':0},{'X':0.9,'Y':0,'Z':0},{'X':2.9,'Y':0,'Z':0},{'X':4.9,'Y':0,'Z':0},{'X':-5.1,'Y':0,'Z':2},{'X':-3.1,'Y':0,'Z':2},{'X':-1.1,'Y':0,'Z':2},{'X':0.9,'Y':0,'Z':2},{'X':2.9,'Y':0,'Z':2},{'X':4.9,'Y':0,'Z':2},{'X':-5.1,'Y':0,'Z':4},{'X':-3.1,'Y':0,'Z':4},{'X':-1.1,'Y':0,'Z':4},{'X':0.9,'Y':0,'Z':4},{'X':2.9,'Y':0,'Z':4},{'X':4.9,'Y':0,'Z':4},{'X':-5.1,'Y':0,'Z':6},{'X':-3.1,'Y':0,'Z':6},{'X':-1.1,'Y':0,'Z':6},{'X':0.9,'Y':0,'Z':6},{'X':2.9,'Y':0,'Z':6},{'X':4.9,'Y':0,'Z':6},{'X':-5.1,'Y':0,'Z':8},{'X':-3.1,'Y':0,'Z':8},{'X':-1.1,'Y':0,'Z':8},{'X':0.9,'Y':0,'Z':8},{'X':2.9,'Y':0,'Z':8},{'X':4.9,'Y':0,'Z':8},{'X':-5.1,'Y':0,'Z':10},{'X':-3.1,'Y':0,'Z':10},{'X':-1.1,'Y':0,'Z':10},{'X':0.9,'Y':0,'Z':10},{'X':2.9,'Y':0,'Z':10},{'X':4.9,'Y':0,'Z':10}],'road_27x15':[{'X':-4.9,'Y':0,'Z':-14},{'X':-2.9,'Y':0,'Z':-14},{'X':-0.9,'Y':0,'Z':-14},{'X':1.1,'Y':0,'Z':-14},{'X':3,'Y':0,'Z':-14},{'X':5.1,'Y':0,'Z':-14},{'X':-4.9,'Y':0,'Z':-12},{'X':-2.9,'Y':0,'Z':-12},{'X':-0.9,'Y':0,'Z':-12},{'X':1.1,'Y':0,'Z':-12},{'X':3.1,'Y':0,'Z':-12},{'X':5.1,'Y':0,'Z':-12},{'X':-4.9,'Y':0,'Z':-10},{'X':-2.9,'Y':0,'Z':-10},{'X':-0.9,'Y':0,'Z':-10},{'X':1.1,'Y':0,'Z':-10},{'X':3.1,'Y':0,'Z':-10},{'X':5.1,'Y':0,'Z':-10},{'X':-4.9,'Y':0,'Z':-8},{'X':-2.9,'Y':0,'Z':-8},{'X':-0.9,'Y':0,'Z':-8},{'X':1.1,'Y':0,'Z':-8},{'X':3.1,'Y':0,'Z':-8},{'X':5.1,'Y':0,'Z':-8},{'X':-4.9,'Y':0,'Z':-6},{'X':-2.9,'Y':0,'Z':-6},{'X':-0.9,'Y':0,'Z':-6},{'X':1.1,'Y':0,'Z':-6},{'X':3.1,'Y':0,'Z':-6},{'X':5.1,'Y':0,'Z':-6},{'X':-4.9,'Y':0,'Z':-4},{'X':-2.9,'Y':0,'Z':-4},{'X':-0.9,'Y':0,'Z':-4},{'X':1.1,'Y':0,'Z':-4},{'X':3.1,'Y':0,'Z':-4},{'X':5.1,'Y':0,'Z':-4},{'X':-4.9,'Y':0,'Z':-2},{'X':-2.9,'Y':0,'Z':-2},{'X':-0.9,'Y':0,'Z':-2},{'X':1.1,'Y':0,'Z':-2},{'X':3.1,'Y':0,'Z':-2},{'X':5.1,'Y':0,'Z':-2},{'X':-4.9,'Y':0,'Z':0},{'X':-2.9,'Y':0,'Z':0},{'X':-0.9,'Y':0,'Z':0},{'X':1.1,'Y':0,'Z':0},{'X':3.1,'Y':0,'Z':0},{'X':5.1,'Y':0,'Z':0},{'X':-4.9,'Y':0,'Z':2},{'X':-2.9,'Y':0,'Z':2},{'X':-0.9,'Y':0,'Z':2},{'X':1.1,'Y':0,'Z':2},{'X':3.1,'Y':0,'Z':2},{'X':5.1,'Y':0,'Z':2},{'X':-4.9,'Y':0,'Z':4},{'X':-2.9,'Y':0,'Z':4},{'X':-0.9,'Y':0,'Z':4},{'X':1.1,'Y':0,'Z':4},{'X':3.1,'Y':0,'Z':4},{'X':5.1,'Y':0,'Z':4},{'X':-4.9,'Y':0,'Z':6},{'X':-2.9,'Y':0,'Z':6},{'X':-0.9,'Y':0,'Z':6},{'X':1.1,'Y':0,'Z':6},{'X':3.1,'Y':0,'Z':6},{'X':5.1,'Y':0,'Z':6},{'X':-4.9,'Y':0,'Z':8},{'X':-2.9,'Y':0,'Z':8},{'X':-0.9,'Y':0,'Z':8},{'X':1.1,'Y':0,'Z':8},{'X':3.1,'Y':0,'Z':8},{'X':5.1,'Y':0,'Z':8},{'X':-4.9,'Y':0,'Z':10},{'X':-2.9,'Y':0,'Z':10},{'X':-0.9,'Y':0,'Z':10},{'X':1.1,'Y':0,'Z':10},{'X':3.1,'Y':0,'Z':10},{'X':5.1,'Y':0,'Z':10},{'X':-4.9,'Y':0,'Z':12},{'X':-2.9,'Y':0,'Z':12},{'X':-0.9,'Y':0,'Z':12},{'X':1.1,'Y':0,'Z':12},{'X':3.1,'Y':0,'Z':12},{'X':5.1,'Y':0,'Z':12},{'X':-4.9,'Y':0,'Z':14},{'X':-2.9,'Y':0,'Z':14},{'X':-0.9,'Y':0,'Z':14},{'X':1.1,'Y':0,'Z':14},{'X':3.1,'Y':0,'Z':14},{'X':5.1,'Y':0,'Z':14}],'road_36x15':[{'X':-5,'Y':0,'Z':-18.9},{'X':-3,'Y':0,'Z':-18.9},{'X':-1,'Y':0,'Z':-18.9},{'X':1,'Y':0,'Z':-18.9},{'X':3,'Y':0,'Z':-18.9},{'X':5,'Y':0,'Z':-18.9},{'X':-5,'Y':0,'Z':-16.9},{'X':-3,'Y':0,'Z':-16.9},{'X':-1,'Y':0,'Z':-16.9},{'X':1,'Y':0,'Z':-16.9},{'X':3,'Y':0,'Z':-16.9},{'X':5,'Y':0,'Z':-16.9},{'X':-5,'Y':0,'Z':-14.9},{'X':-3,'Y':0,'Z':-14.9},{'X':-1,'Y':0,'Z':-14.9},{'X':1,'Y':0,'Z':-14.9},{'X':3,'Y':0,'Z':-14.9},{'X':5,'Y':0,'Z':-14.9},{'X':-5,'Y':0,'Z':-12.9},{'X':-3,'Y':0,'Z':-12.9},{'X':-1,'Y':0,'Z':-12.9},{'X':1,'Y':0,'Z':-12.9},{'X':3,'Y':0,'Z':-12.9},{'X':5,'Y':0,'Z':-12.9},{'X':-5,'Y':0,'Z':-10.9},{'X':-3,'Y':0,'Z':-10.9},{'X':-1,'Y':0,'Z':-10.9},{'X':1,'Y':0,'Z':-10.9},{'X':3,'Y':0,'Z':-10.9},{'X':5,'Y':0,'Z':-10.9},{'X':-5,'Y':0,'Z':-8.9},{'X':-3,'Y':0,'Z':-8.9},{'X':-1,'Y':0,'Z':-8.9},{'X':1,'Y':0,'Z':-8.9},{'X':3,'Y':0,'Z':-8.9},{'X':5,'Y':0,'Z':-8.9},{'X':-5,'Y':0,'Z':-6.9},{'X':-3,'Y':0,'Z':-6.9},{'X':-1,'Y':0,'Z':-6.9},{'X':1,'Y':0,'Z':-6.9},{'X':3,'Y':0,'Z':-6.9},{'X':5,'Y':0,'Z':-6.9},{'X':-5,'Y':0,'Z':-4.9},{'X':-3,'Y':0,'Z':-4.9},{'X':-1,'Y':0,'Z':-4.9},{'X':1,'Y':0,'Z':-4.9},{'X':3,'Y':0,'Z':-4.9},{'X':5,'Y':0,'Z':-4.9},{'X':-5,'Y':0,'Z':-2.9},{'X':-3,'Y':0,'Z':-2.9},{'X':-1,'Y':0,'Z':-2.9},{'X':1,'Y':0,'Z':-2.9},{'X':3,'Y':0,'Z':-2.9},{'X':5,'Y':0,'Z':-2.9},{'X':-5,'Y':0,'Z':-0.9},{'X':-3,'Y':0,'Z':-0.9},{'X':-1,'Y':0,'Z':-0.9},{'X':1,'Y':0,'Z':-0.9},{'X':3,'Y':0,'Z':-0.9},{'X':5,'Y':0,'Z':-0.9},{'X':-5,'Y':0,'Z':1.1},{'X':-3,'Y':0,'Z':1.1},{'X':-1,'Y':0,'Z':1.1},{'X':1,'Y':0,'Z':1.1},{'X':3,'Y':0,'Z':1.1},{'X':5,'Y':0,'Z':1.1},{'X':-5,'Y':0,'Z':3.1},{'X':-3,'Y':0,'Z':3.1},{'X':-1,'Y':0,'Z':3.1},{'X':1,'Y':0,'Z':3.1},{'X':3,'Y':0,'Z':3.1},{'X':5,'Y':0,'Z':3.1},{'X':-5,'Y':0,'Z':5.1},{'X':-3,'Y':0,'Z':5.1},{'X':-1,'Y':0,'Z':5.1},{'X':1,'Y':0,'Z':5.1},{'X':3,'Y':0,'Z':5.1},{'X':5,'Y':0,'Z':5.1},{'X':-5,'Y':0,'Z':7.1},{'X':-3,'Y':0,'Z':7.1},{'X':-1,'Y':0,'Z':7.1},{'X':1,'Y':0,'Z':7.1},{'X':3,'Y':0,'Z':7.1},{'X':5,'Y':0,'Z':7.1},{'X':-5,'Y':0,'Z':9.1},{'X':-3,'Y':0,'Z':9.1},{'X':-1,'Y':0,'Z':9.1},{'X':1,'Y':0,'Z':9.1},{'X':3,'Y':0,'Z':9.1},{'X':5,'Y':0,'Z':9.1},{'X':-5,'Y':0,'Z':11.1},{'X':-3,'Y':0,'Z':11.1},{'X':-1,'Y':0,'Z':11.1},{'X':1,'Y':0,'Z':11.1},{'X':3,'Y':0,'Z':11.1},{'X':5,'Y':0,'Z':11.1},{'X':-5,'Y':0,'Z':13.1},{'X':-3,'Y':0,'Z':13.1},{'X':-1,'Y':0,'Z':13.1},{'X':1,'Y':0,'Z':13.1},{'X':3,'Y':0,'Z':13.1},{'X':5,'Y':0,'Z':13.1},{'X':-5,'Y':0,'Z':15.1},{'X':-3,'Y':0,'Z':15.1},{'X':-1,'Y':0,'Z':15.1},{'X':1,'Y':0,'Z':15.1},{'X':3,'Y':0,'Z':15.1},{'X':5,'Y':0,'Z':15.1},{'X':-5,'Y':0,'Z':17.1},{'X':-3,'Y':0,'Z':17.1},{'X':-1,'Y':0,'Z':17.1},{'X':1,'Y':0,'Z':17.1},{'X':3,'Y':0,'Z':17.1},{'X':5,'Y':0,'Z':17.1}],'road_9x15':[{'X':-4.9,'Y':0,'Z':-5.5},{'X':-2.9,'Y':0,'Z':-5.5},{'X':-0.9,'Y':0,'Z':-5.5},{'X':1.1,'Y':0,'Z':-5.5},{'X':3.1,'Y':0,'Z':-5.5},{'X':5.1,'Y':0,'Z':-5.5},{'X':-4.9,'Y':0,'Z':-3.5},{'X':-2.9,'Y':0,'Z':-3.5},{'X':-0.9,'Y':0,'Z':-3.5},{'X':1.1,'Y':0,'Z':-3.5},{'X':3.1,'Y':0,'Z':-3.5},{'X':5.1,'Y':0,'Z':-3.5},{'X':-4.9,'Y':0,'Z':-1.5},{'X':-2.9,'Y':0,'Z':-1.5},{'X':-0.9,'Y':0,'Z':-1.5},{'X':1.1,'Y':0,'Z':-1.5},{'X':3.1,'Y':0,'Z':-1.5},{'X':5.1,'Y':0,'Z':-1.5},{'X':-4.9,'Y':0,'Z':0.5},{'X':-2.9,'Y':0,'Z':0.5},{'X':-0.9,'Y':0,'Z':0.5},{'X':1.1,'Y':0,'Z':0.5},{'X':3.1,'Y':0,'Z':0.5},{'X':5.1,'Y':0,'Z':0.5},{'X':-4.9,'Y':0,'Z':2.5},{'X':-2.9,'Y':0,'Z':2.5},{'X':-0.9,'Y':0,'Z':2.5},{'X':1.1,'Y':0,'Z':2.5},{'X':3.1,'Y':0,'Z':2.5},{'X':5.1,'Y':0,'Z':2.5},{'X':-4.9,'Y':0,'Z':4.5},{'X':-2.9,'Y':0,'Z':4.5},{'X':-0.9,'Y':0,'Z':4.5},{'X':1.1,'Y':0,'Z':4.5},{'X':3.1,'Y':0,'Z':4.5},{'X':5.1,'Y':0,'Z':4.5}],'road_9x15_end':[{'X':-5,'Y':0,'Z':-9.6},{'X':-3,'Y':0,'Z':-9.6},{'X':-1,'Y':0,'Z':-9.6},{'X':1,'Y':0,'Z':-9.6},{'X':3,'Y':0,'Z':-9.6},{'X':5,'Y':0,'Z':-9.6},{'X':-5,'Y':0,'Z':-7.6},{'X':-3,'Y':0,'Z':-7.6},{'X':-1,'Y':0,'Z':-7.6},{'X':1,'Y':0,'Z':-7.6},{'X':3,'Y':0,'Z':-7.6},{'X':5,'Y':0,'Z':-7.6},{'X':-5,'Y':0,'Z':-5.6},{'X':-3,'Y':0,'Z':-5.6},{'X':-1,'Y':0,'Z':-5.6},{'X':1,'Y':0,'Z':-5.6},{'X':3,'Y':0,'Z':-5.6},{'X':5,'Y':0,'Z':-5.6},{'X':-5,'Y':0,'Z':-3.6},{'X':-3,'Y':0,'Z':-3.6},{'X':-1,'Y':0,'Z':-3.6},{'X':1,'Y':0,'Z':-3.6},{'X':3,'Y':0,'Z':-3.6},{'X':5,'Y':0,'Z':-3.6},{'X':-5,'Y':0,'Z':-1.6},{'X':-3,'Y':0,'Z':-1.6},{'X':-1,'Y':0,'Z':-1.6},{'X':1,'Y':0,'Z':-1.6},{'X':3,'Y':0,'Z':-1.6},{'X':5,'Y':0,'Z':-1.6},{'X':-5,'Y':0,'Z':0.4},{'X':-3,'Y':0,'Z':0.4},{'X':-1,'Y':0,'Z':0.4},{'X':1,'Y':0,'Z':0.4},{'X':3,'Y':0,'Z':0.4},{'X':5,'Y':0,'Z':0.4},{'X':-5,'Y':0,'Z':2.4},{'X':-3,'Y':0,'Z':2.4},{'X':-1,'Y':0,'Z':2.4},{'X':1,'Y':0,'Z':2.4},{'X':3,'Y':0,'Z':2.4},{'X':5,'Y':0,'Z':2.4},{'X':-5,'Y':0,'Z':4.4},{'X':-3,'Y':0,'Z':4.4},{'X':-1,'Y':0,'Z':4.4},{'X':1,'Y':0,'Z':4.4},{'X':3,'Y':0,'Z':4.4},{'X':5,'Y':0,'Z':4.4}],'road_9x15_railway':[{'X':-5,'Y':0,'Z':-5.1},{'X':-3,'Y':0,'Z':-5.1},{'X':-1,'Y':0,'Z':-5.1},{'X':1,'Y':0,'Z':-5.1},{'X':3,'Y':0,'Z':-5.1},{'X':5,'Y':0,'Z':-5.1},{'X':-5,'Y':0,'Z':-3.1},{'X':-3,'Y':0,'Z':-3.1},{'X':-1,'Y':0,'Z':-3.1},{'X':1,'Y':0,'Z':-3.1},{'X':3,'Y':0,'Z':-3.1},{'X':5,'Y':0,'Z':-3.1},{'X':-5,'Y':0,'Z':-1.1},{'X':-3,'Y':0,'Z':-1.1},{'X':-1,'Y':0,'Z':-1.1},{'X':1,'Y':0,'Z':-1.1},{'X':3,'Y':0,'Z':-1.1},{'X':5,'Y':0,'Z':-1.1},{'X':-5,'Y':0,'Z':0.9},{'X':-3,'Y':0,'Z':0.9},{'X':-1,'Y':0,'Z':0.9},{'X':1,'Y':0,'Z':0.9},{'X':3,'Y':0,'Z':0.9},{'X':5,'Y':0,'Z':0.9},{'X':-5,'Y':0,'Z':2.9},{'X':-3,'Y':0,'Z':2.9},{'X':-1,'Y':0,'Z':2.9},{'X':1,'Y':0,'Z':2.9},{'X':3,'Y':0,'Z':2.9},{'X':5,'Y':0,'Z':2.9},{'X':-5,'Y':0,'Z':4.9},{'X':-3,'Y':0,'Z':4.9},{'X':-1,'Y':0,'Z':4.9},{'X':1,'Y':0,'Z':4.9},{'X':3,'Y':0,'Z':4.9},{'X':5,'Y':0,'Z':4.9}],'road_9x18_broken':[{'X':-4.9,'Y':0,'Z':-9.1},{'X':-2.9,'Y':0,'Z':-9.1},{'X':-0.9,'Y':0,'Z':-9.1},{'X':1.1,'Y':0,'Z':-9.1},{'X':3.1,'Y':0,'Z':-9.1},{'X':5.1,'Y':0,'Z':-9.1},{'X':-4.9,'Y':0,'Z':-7.1},{'X':-2.9,'Y':0,'Z':-7.1},{'X':-0.9,'Y':0,'Z':-7.1},{'X':1.1,'Y':0,'Z':-7.1},{'X':3.1,'Y':0,'Z':-7.1},{'X':5.1,'Y':0,'Z':-7.1},{'X':-4.9,'Y':0,'Z':-5.1},{'X':-2.9,'Y':0,'Z':-5.1},{'X':-0.9,'Y':0,'Z':-5.1},{'X':1.1,'Y':0,'Z':-5.1},{'X':3.1,'Y':0,'Z':-5.1},{'X':5.1,'Y':0,'Z':-5.1},{'X':-4.9,'Y':0,'Z':-3.1},{'X':-2.9,'Y':0,'Z':-3.1},{'X':-0.9,'Y':0,'Z':-3.1},{'X':1.1,'Y':0,'Z':-3.1},{'X':3.1,'Y':0,'Z':-3.1},{'X':5.1,'Y':0,'Z':-3.1},{'X':-4.9,'Y':0,'Z':-1.1},{'X':-2.9,'Y':0,'Z':-1.1},{'X':-0.9,'Y':0,'Z':-1.1},{'X':1.1,'Y':0,'Z':-1.1},{'X':3.1,'Y':0,'Z':-1.1},{'X':5.1,'Y':0,'Z':-1.1},{'X':-4.9,'Y':0,'Z':0.9},{'X':-2.9,'Y':0,'Z':0.9},{'X':-0.9,'Y':0,'Z':0.9},{'X':1.1,'Y':0,'Z':0.9},{'X':3.1,'Y':0,'Z':0.9},{'X':5.1,'Y':0,'Z':0.9},{'X':-4.9,'Y':0,'Z':2.9},{'X':-2.9,'Y':0,'Z':2.9},{'X':-0.9,'Y':0,'Z':2.9},{'X':1.1,'Y':0,'Z':2.9},{'X':3.1,'Y':0,'Z':2.9},{'X':5.1,'Y':0,'Z':2.9},{'X':-4.9,'Y':0,'Z':4.9},{'X':-2.9,'Y':0,'Z':4.9},{'X':-0.9,'Y':0,'Z':4.9},{'X':1.1,'Y':0,'Z':4.9},{'X':3.1,'Y':0,'Z':4.9},{'X':5.1,'Y':0,'Z':4.9},{'X':-4.9,'Y':0,'Z':6.9},{'X':-2.9,'Y':0,'Z':6.9},{'X':-0.9,'Y':0,'Z':6.9},{'X':1.1,'Y':0,'Z':6.9},{'X':3.1,'Y':0,'Z':6.9},{'X':5.1,'Y':0,'Z':6.9},{'X':-4.9,'Y':0,'Z':8.9},{'X':-2.9,'Y':0,'Z':8.9},{'X':-0.9,'Y':0,'Z':8.9},{'X':1.1,'Y':0,'Z':8.9},{'X':3.1,'Y':0,'Z':8.9},{'X':5.1,'Y':0,'Z':8.9}],'road_bend_15x15':[{'X':3,'Y':0,'Z':-1},{'X':5,'Y':0,'Z':-1},{'X':7,'Y':0,'Z':-1},{'X':9,'Y':0,'Z':-1},{'X':11,'Y':0,'Z':-1},{'X':13,'Y':0,'Z':-1},{'X':3,'Y':0,'Z':1},{'X':5,'Y':0,'Z':1},{'X':7,'Y':0,'Z':1},{'X':9,'Y':0,'Z':1},{'X':11,'Y':0,'Z':1},{'X':13,'Y':0,'Z':1},{'X':-1,'Y':0,'Z':3},{'X':1,'Y':0,'Z':3},{'X':3,'Y':0,'Z':3},{'X':5,'Y':0,'Z':3},{'X':7,'Y':0,'Z':3},{'X':9,'Y':0,'Z':3},{'X':11,'Y':0,'Z':3},{'X':13,'Y':0,'Z':3},{'X':-1,'Y':0,'Z':5},{'X':1,'Y':0,'Z':5},{'X':3,'Y':0,'Z':5},{'X':5,'Y':0,'Z':5},{'X':7,'Y':0,'Z':5},{'X':9,'Y':0,'Z':5},{'X':11,'Y':0,'Z':5},{'X':-1,'Y':0,'Z':7},{'X':1,'Y':0,'Z':7},{'X':3,'Y':0,'Z':7},{'X':5,'Y':0,'Z':7},{'X':7,'Y':0,'Z':7},{'X':9,'Y':0,'Z':7},{'X':11,'Y':0,'Z':7},{'X':-1,'Y':0,'Z':9},{'X':1,'Y':0,'Z':9},{'X':3,'Y':0,'Z':9},{'X':5,'Y':0,'Z':9},{'X':7,'Y':0,'Z':9},{'X':9,'Y':0,'Z':9},{'X':-1,'Y':0,'Z':11},{'X':1,'Y':0,'Z':11},{'X':3,'Y':0,'Z':11},{'X':5,'Y':0,'Z':11},{'X':7,'Y':0,'Z':11},{'X':-1,'Y':0,'Z':13},{'X':1,'Y':0,'Z':13},{'X':3,'Y':0,'Z':13}],'road_junction_15x15':[{'X':-4,'Y':0,'Z':-8},{'X':-2,'Y':0,'Z':-8},{'X':0,'Y':0,'Z':-8},{'X':2,'Y':0,'Z':-8},{'X':4,'Y':0,'Z':-8},{'X':-4,'Y':0,'Z':-6},{'X':-2,'Y':0,'Z':-6},{'X':0,'Y':0,'Z':-6},{'X':2,'Y':0,'Z':-6},{'X':4,'Y':0,'Z':-6},{'X':-8,'Y':0,'Z':-4},{'X':-6,'Y':0,'Z':-4},{'X':-4,'Y':0,'Z':-4},{'X':-2,'Y':0,'Z':-4},{'X':0,'Y':0,'Z':-4},{'X':2,'Y':0,'Z':-4},{'X':4,'Y':0,'Z':-4},{'X':6,'Y':0,'Z':-4},{'X':8,'Y':0,'Z':-4},{'X':-8,'Y':0,'Z':-2},{'X':-6,'Y':0,'Z':-2},{'X':-4,'Y':0,'Z':-2},{'X':-2,'Y':0,'Z':-2},{'X':0,'Y':0,'Z':-2},{'X':2,'Y':0,'Z':-2},{'X':4,'Y':0,'Z':-2},{'X':6,'Y':0,'Z':-2},{'X':8,'Y':0,'Z':-2},{'X':-8,'Y':0,'Z':0},{'X':-6,'Y':0,'Z':0},{'X':-4,'Y':0,'Z':0},{'X':-2,'Y':0,'Z':0},{'X':0,'Y':0,'Z':0},{'X':2,'Y':0,'Z':0},{'X':4,'Y':0,'Z':0},{'X':6,'Y':0,'Z':0},{'X':8,'Y':0,'Z':0},{'X':-8,'Y':0,'Z':2},{'X':-6,'Y':0,'Z':2},{'X':-4,'Y':0,'Z':2},{'X':-2,'Y':0,'Z':2},{'X':0,'Y':0,'Z':2},{'X':2,'Y':0,'Z':2},{'X':4,'Y':0,'Z':2},{'X':6,'Y':0,'Z':2},{'X':8,'Y':0,'Z':2},{'X':-8,'Y':0,'Z':4},{'X':-6,'Y':0,'Z':4},{'X':-4,'Y':0,'Z':4},{'X':-2,'Y':0,'Z':4},{'X':0,'Y':0,'Z':4},{'X':2,'Y':0,'Z':4},{'X':4,'Y':0,'Z':4},{'X':6,'Y':0,'Z':4},{'X':8,'Y':0,'Z':4},{'X':-4,'Y':0,'Z':6},{'X':-2,'Y':0,'Z':6},{'X':0,'Y':0,'Z':6},{'X':2,'Y':0,'Z':6},{'X':4,'Y':0,'Z':6},{'X':-4,'Y':0,'Z':8},{'X':-2,'Y':0,'Z':8},{'X':0,'Y':0,'Z':8},{'X':2,'Y':0,'Z':8},{'X':4,'Y':0,'Z':8}],'road_junctiont_15x15':[{'X':-4.5,'Y':0,'Z':-8.5},{'X':-2.5,'Y':0,'Z':-8.5},{'X':-0.5,'Y':0,'Z':-8.5},{'X':1.5,'Y':0,'Z':-8.5},{'X':3.5,'Y':0,'Z':-8.5},{'X':-4.5,'Y':0,'Z':-6.5},{'X':-2.5,'Y':0,'Z':-6.5},{'X':-0.5,'Y':0,'Z':-6.5},{'X':1.5,'Y':0,'Z':-6.5},{'X':3.5,'Y':0,'Z':-6.5},{'X':-8.5,'Y':0,'Z':-4.5},{'X':-6.5,'Y':0,'Z':-4.5},{'X':-4.5,'Y':0,'Z':-4.5},{'X':-2.5,'Y':0,'Z':-4.5},{'X':-0.5,'Y':0,'Z':-4.5},{'X':1.5,'Y':0,'Z':-4.5},{'X':3.5,'Y':0,'Z':-4.5},{'X':5.5,'Y':0,'Z':-4.5},{'X':7.5,'Y':0,'Z':-4.5},{'X':-8.5,'Y':0,'Z':-2.5},{'X':-6.5,'Y':0,'Z':-2.5},{'X':-4.5,'Y':0,'Z':-2.5},{'X':-2.5,'Y':0,'Z':-2.5},{'X':-0.5,'Y':0,'Z':-2.5},{'X':1.5,'Y':0,'Z':-2.5},{'X':3.5,'Y':0,'Z':-2.5},{'X':5.5,'Y':0,'Z':-2.5},{'X':7.5,'Y':0,'Z':-2.5},{'X':-8.5,'Y':0,'Z':-0.5},{'X':-6.5,'Y':0,'Z':-0.5},{'X':-4.5,'Y':0,'Z':-0.5},{'X':-2.5,'Y':0,'Z':-0.5},{'X':-0.5,'Y':0,'Z':-0.5},{'X':1.5,'Y':0,'Z':-0.5},{'X':3.5,'Y':0,'Z':-0.5},{'X':5.5,'Y':0,'Z':-0.5},{'X':7.5,'Y':0,'Z':-0.5},{'X':-8.5,'Y':0,'Z':1.5},{'X':-6.5,'Y':0,'Z':1.5},{'X':-4.5,'Y':0,'Z':1.5},{'X':-2.5,'Y':0,'Z':1.5},{'X':-0.5,'Y':0,'Z':1.5},{'X':1.5,'Y':0,'Z':1.5},{'X':3.5,'Y':0,'Z':1.5},{'X':5.5,'Y':0,'Z':1.5},{'X':7.5,'Y':0,'Z':1.5},{'X':-8.5,'Y':0,'Z':3.5},{'X':-6.5,'Y':0,'Z':3.5},{'X':-4.5,'Y':0,'Z':3.5},{'X':-2.5,'Y':0,'Z':3.5},{'X':-0.5,'Y':0,'Z':3.5},{'X':1.5,'Y':0,'Z':3.5},{'X':3.5,'Y':0,'Z':3.5},{'X':5.5,'Y':0,'Z':3.5},{'X':7.5,'Y':0,'Z':3.5},{'X':-8.5,'Y':0,'Z':5.5},{'X':-6.5,'Y':0,'Z':5.5},{'X':-4.5,'Y':0,'Z':5.5},{'X':-2.5,'Y':0,'Z':5.5},{'X':-0.5,'Y':0,'Z':5.5},{'X':1.5,'Y':0,'Z':5.5},{'X':3.5,'Y':0,'Z':5.5},{'X':5.5,'Y':0,'Z':5.5},{'X':7.5,'Y':0,'Z':5.5}],'road_nopavement_18x15':[{'X':-5.1,'Y':0,'Z':-10},{'X':-3,'Y':0,'Z':-10},{'X':-1,'Y':0,'Z':-10},{'X':1,'Y':0,'Z':-10},{'X':3,'Y':0,'Z':-10},{'X':-5,'Y':0,'Z':-8},{'X':-3,'Y':0,'Z':-8},{'X':-1,'Y':0,'Z':-8},{'X':1,'Y':0,'Z':-8},{'X':3,'Y':0,'Z':-8},{'X':-5,'Y':0,'Z':-6},{'X':-3,'Y':0,'Z':-6},{'X':-1,'Y':0,'Z':-6},{'X':1,'Y':0,'Z':-6},{'X':3,'Y':0,'Z':-6},{'X':-5,'Y':0,'Z':-4},{'X':-3,'Y':0,'Z':-4},{'X':-1,'Y':0,'Z':-4},{'X':1,'Y':0,'Z':-4},{'X':3,'Y':0,'Z':-4},{'X':-5,'Y':0,'Z':-2},{'X':-3,'Y':0,'Z':-2},{'X':-1,'Y':0,'Z':-2},{'X':1,'Y':0,'Z':-2},{'X':3,'Y':0,'Z':-2},{'X':-5,'Y':0,'Z':0},{'X':-3,'Y':0,'Z':0},{'X':-1,'Y':0,'Z':0},{'X':1,'Y':0,'Z':0},{'X':3,'Y':0,'Z':0},{'X':-5,'Y':0,'Z':2},{'X':-3,'Y':0,'Z':2},{'X':-1,'Y':0,'Z':2},{'X':1,'Y':0,'Z':2},{'X':3,'Y':0,'Z':2},{'X':-5,'Y':0,'Z':4},{'X':-3,'Y':0,'Z':4},{'X':-1,'Y':0,'Z':4},{'X':1,'Y':0,'Z':4},{'X':3,'Y':0,'Z':4},{'X':-5,'Y':0,'Z':6},{'X':-3,'Y':0,'Z':6},{'X':-1,'Y':0,'Z':6},{'X':1,'Y':0,'Z':6},{'X':3,'Y':0,'Z':6},{'X':-5,'Y':0,'Z':8},{'X':-3,'Y':0,'Z':8},{'X':-1,'Y':0,'Z':8},{'X':1,'Y':0,'Z':8},{'X':3,'Y':0,'Z':8},{'X':-5,'Y':0,'Z':10},{'X':-3,'Y':0,'Z':10},{'X':-1,'Y':0,'Z':10},{'X':1,'Y':0,'Z':10},{'X':3,'Y':0,'Z':10},{'X':5,'Y':0,'Z':-10},{'X':5,'Y':0,'Z':-8},{'X':5,'Y':0,'Z':-6},{'X':5,'Y':0,'Z':-4},{'X':5,'Y':0,'Z':-2},{'X':5,'Y':0,'Z':0},{'X':5,'Y':0,'Z':2},{'X':5,'Y':0,'Z':4},{'X':5,'Y':0,'Z':6},{'X':5,'Y':0,'Z':8},{'X':5,'Y':0,'Z':10}],'road_nopavement_27x15':[{'X':-3,'Y':0,'Z':-13.3},{'X':-1,'Y':0,'Z':-13.3},{'X':1,'Y':0,'Z':-13.3},{'X':3,'Y':0,'Z':-13.3},{'X':5,'Y':0,'Z':-13.3},{'X':-3,'Y':0,'Z':-11.3},{'X':-1,'Y':0,'Z':-11.3},{'X':1,'Y':0,'Z':-11.3},{'X':3,'Y':0,'Z':-11.3},{'X':5,'Y':0,'Z':-11.3},{'X':-3,'Y':0,'Z':-9.3},{'X':-1,'Y':0,'Z':-9.3},{'X':1,'Y':0,'Z':-9.3},{'X':3,'Y':0,'Z':-9.3},{'X':5,'Y':0,'Z':-9.3},{'X':-3,'Y':0,'Z':-7.3},{'X':-1,'Y':0,'Z':-7.3},{'X':1,'Y':0,'Z':-7.3},{'X':3,'Y':0,'Z':-7.3},{'X':5,'Y':0,'Z':-7.3},{'X':-3,'Y':0,'Z':-5.3},{'X':-1,'Y':0,'Z':-5.3},{'X':1,'Y':0,'Z':-5.3},{'X':3,'Y':0,'Z':-5.3},{'X':5,'Y':0,'Z':-5.3},{'X':-3,'Y':0,'Z':-3.3},{'X':-1,'Y':0,'Z':-3.3},{'X':1,'Y':0,'Z':-3.3},{'X':3,'Y':0,'Z':-3.3},{'X':5,'Y':0,'Z':-3.3},{'X':-3,'Y':0,'Z':-1.3},{'X':-1,'Y':0,'Z':-1.3},{'X':1,'Y':0,'Z':-1.3},{'X':3,'Y':0,'Z':-1.3},{'X':5,'Y':0,'Z':-1.3},{'X':-3,'Y':0,'Z':0.7},{'X':-1,'Y':0,'Z':0.7},{'X':1,'Y':0,'Z':0.7},{'X':3,'Y':0,'Z':0.7},{'X':5,'Y':0,'Z':0.7},{'X':-3,'Y':0,'Z':2.7},{'X':-1,'Y':0,'Z':2.7},{'X':1,'Y':0,'Z':2.7},{'X':3,'Y':0,'Z':2.7},{'X':5,'Y':0,'Z':2.7},{'X':-3,'Y':0,'Z':4.7},{'X':-1,'Y':0,'Z':4.7},{'X':1,'Y':0,'Z':4.7},{'X':3,'Y':0,'Z':4.7},{'X':5,'Y':0,'Z':4.7},{'X':-3,'Y':0,'Z':6.7},{'X':-1,'Y':0,'Z':6.7},{'X':1,'Y':0,'Z':6.7},{'X':3,'Y':0,'Z':6.7},{'X':5,'Y':0,'Z':6.7},{'X':-3,'Y':0,'Z':8.7},{'X':-1,'Y':0,'Z':8.7},{'X':1,'Y':0,'Z':8.7},{'X':3,'Y':0,'Z':8.7},{'X':5,'Y':0,'Z':8.7},{'X':-3,'Y':0,'Z':10.7},{'X':-1,'Y':0,'Z':10.7},{'X':1,'Y':0,'Z':10.7},{'X':3,'Y':0,'Z':10.7},{'X':5,'Y':0,'Z':10.7},{'X':-3,'Y':0,'Z':12.7},{'X':-1,'Y':0,'Z':12.7},{'X':1,'Y':0,'Z':12.7},{'X':3,'Y':0,'Z':12.7},{'X':5,'Y':0,'Z':12.7},{'X':-3,'Y':0,'Z':14.7},{'X':-1,'Y':0,'Z':14.7},{'X':1,'Y':0,'Z':14.7},{'X':3,'Y':0,'Z':14.7},{'X':5,'Y':0,'Z':14.7},{'X':-5,'Y':0,'Z':-13.3},{'X':-5,'Y':0,'Z':-11.3},{'X':-5,'Y':0,'Z':-9.3},{'X':-5,'Y':0,'Z':-7.3},{'X':-5,'Y':0,'Z':-5.3},{'X':-5,'Y':0,'Z':-3.3},{'X':-5,'Y':0,'Z':-1.3},{'X':-5,'Y':0,'Z':0.7},{'X':-5,'Y':0,'Z':2.7},{'X':-5,'Y':0,'Z':4.7},{'X':-5,'Y':0,'Z':6.7},{'X':-5,'Y':0,'Z':8.7},{'X':-5,'Y':0,'Z':10.7},{'X':-5,'Y':0,'Z':12.7},{'X':-5,'Y':0,'Z':14.7}],'road_nopavement_36x15':[{'X':-5.1,'Y':0,'Z':-18.9},{'X':-3.1,'Y':0,'Z':-18.9},{'X':-1.1,'Y':0,'Z':-18.9},{'X':0.9,'Y':0,'Z':-18.9},{'X':2.9,'Y':0,'Z':-18.9},{'X':4.9,'Y':0,'Z':-18.9},{'X':-5.1,'Y':0,'Z':-16.9},{'X':-3.1,'Y':0,'Z':-16.9},{'X':-1.1,'Y':0,'Z':-16.9},{'X':0.9,'Y':0,'Z':-16.9},{'X':2.9,'Y':0,'Z':-16.9},{'X':4.9,'Y':0,'Z':-16.9},{'X':-5.1,'Y':0,'Z':-14.9},{'X':-3.1,'Y':0,'Z':-14.9},{'X':-1.1,'Y':0,'Z':-14.9},{'X':0.9,'Y':0,'Z':-14.9},{'X':2.9,'Y':0,'Z':-14.9},{'X':4.9,'Y':0,'Z':-14.9},{'X':-5.1,'Y':0,'Z':-12.9},{'X':-3.1,'Y':0,'Z':-12.9},{'X':-1.1,'Y':0,'Z':-12.9},{'X':0.9,'Y':0,'Z':-12.9},{'X':2.9,'Y':0,'Z':-12.9},{'X':4.9,'Y':0,'Z':-12.9},{'X':-5.1,'Y':0,'Z':-10.9},{'X':-3.1,'Y':0,'Z':-10.9},{'X':-1.1,'Y':0,'Z':-10.9},{'X':0.9,'Y':0,'Z':-10.9},{'X':2.9,'Y':0,'Z':-10.9},{'X':4.9,'Y':0,'Z':-10.9},{'X':-5.1,'Y':0,'Z':-8.9},{'X':-3.1,'Y':0,'Z':-8.9},{'X':-1.1,'Y':0,'Z':-8.9},{'X':0.9,'Y':0,'Z':-8.9},{'X':2.9,'Y':0,'Z':-8.9},{'X':4.9,'Y':0,'Z':-8.9},{'X':-5.1,'Y':0,'Z':-6.9},{'X':-3.1,'Y':0,'Z':-6.9},{'X':-1.1,'Y':0,'Z':-6.9},{'X':0.9,'Y':0,'Z':-6.9},{'X':2.9,'Y':0,'Z':-6.9},{'X':4.9,'Y':0,'Z':-6.9},{'X':-5.1,'Y':0,'Z':-4.9},{'X':-3.1,'Y':0,'Z':-4.9},{'X':-1.1,'Y':0,'Z':-4.9},{'X':0.9,'Y':0,'Z':-4.9},{'X':2.9,'Y':0,'Z':-4.9},{'X':4.9,'Y':0,'Z':-4.9},{'X':-5.1,'Y':0,'Z':-2.9},{'X':-3.1,'Y':0,'Z':-2.9},{'X':-1.1,'Y':0,'Z':-2.9},{'X':0.9,'Y':0,'Z':-2.9},{'X':2.9,'Y':0,'Z':-2.9},{'X':4.9,'Y':0,'Z':-2.9},{'X':-5.1,'Y':0,'Z':-0.9},{'X':-3.1,'Y':0,'Z':-0.9},{'X':-1.1,'Y':0,'Z':-0.9},{'X':0.9,'Y':0,'Z':-0.9},{'X':2.9,'Y':0,'Z':-0.9},{'X':4.9,'Y':0,'Z':-0.9},{'X':-5.1,'Y':0,'Z':1.1},{'X':-3.1,'Y':0,'Z':1.1},{'X':-1.1,'Y':0,'Z':1.1},{'X':0.9,'Y':0,'Z':1.1},{'X':2.9,'Y':0,'Z':1.1},{'X':4.9,'Y':0,'Z':1.1},{'X':-5.1,'Y':0,'Z':3.1},{'X':-3.1,'Y':0,'Z':3.1},{'X':-1.1,'Y':0,'Z':3.1},{'X':0.9,'Y':0,'Z':3.1},{'X':2.9,'Y':0,'Z':3.1},{'X':4.9,'Y':0,'Z':3.1},{'X':-5.1,'Y':0,'Z':5.1},{'X':-3.1,'Y':0,'Z':5.1},{'X':-1.1,'Y':0,'Z':5.1},{'X':0.9,'Y':0,'Z':5.1},{'X':2.9,'Y':0,'Z':5.1},{'X':4.9,'Y':0,'Z':5.1},{'X':-5.1,'Y':0,'Z':7.1},{'X':-3.1,'Y':0,'Z':7.1},{'X':-1.1,'Y':0,'Z':7.1},{'X':0.9,'Y':0,'Z':7.1},{'X':2.9,'Y':0,'Z':7.1},{'X':4.9,'Y':0,'Z':7.1},{'X':-5.1,'Y':0,'Z':9.1},{'X':-3.1,'Y':0,'Z':9.1},{'X':-1.1,'Y':0,'Z':9.1},{'X':0.9,'Y':0,'Z':9.1},{'X':2.9,'Y':0,'Z':9.1},{'X':4.9,'Y':0,'Z':9.1},{'X':-5.1,'Y':0,'Z':11.1},{'X':-3.1,'Y':0,'Z':11.1},{'X':-1.1,'Y':0,'Z':11.1},{'X':0.9,'Y':0,'Z':11.1},{'X':2.9,'Y':0,'Z':11.1},{'X':4.9,'Y':0,'Z':11.1},{'X':-5.1,'Y':0,'Z':13.1},{'X':-3.1,'Y':0,'Z':13.1},{'X':-1.1,'Y':0,'Z':13.1},{'X':0.9,'Y':0,'Z':13.1},{'X':2.9,'Y':0,'Z':13.1},{'X':4.9,'Y':0,'Z':13.1},{'X':-5.1,'Y':0,'Z':15.1},{'X':-3.1,'Y':0,'Z':15.1},{'X':-1.1,'Y':0,'Z':15.1},{'X':0.9,'Y':0,'Z':15.1},{'X':2.9,'Y':0,'Z':15.1},{'X':4.9,'Y':0,'Z':15.1},{'X':-5.1,'Y':0,'Z':17.1},{'X':-3.1,'Y':0,'Z':17.1},{'X':-1.1,'Y':0,'Z':17.1},{'X':0.9,'Y':0,'Z':17.1},{'X':2.9,'Y':0,'Z':17.1},{'X':4.9,'Y':0,'Z':17.1}],'road_nopavement_9x15':[{'X':-5.1,'Y':0,'Z':-5.5},{'X':-3.1,'Y':0,'Z':-5.5},{'X':-1.1,'Y':0,'Z':-5.5},{'X':0.9,'Y':0,'Z':-5.5},{'X':2.9,'Y':0,'Z':-5.5},{'X':4.9,'Y':0,'Z':-5.5},{'X':-5.1,'Y':0,'Z':-3.5},{'X':-3.1,'Y':0,'Z':-3.5},{'X':-1.1,'Y':0,'Z':-3.5},{'X':0.9,'Y':0,'Z':-3.5},{'X':2.9,'Y':0,'Z':-3.5},{'X':4.9,'Y':0,'Z':-3.5},{'X':-5.1,'Y':0,'Z':-1.5},{'X':-3.1,'Y':0,'Z':-1.5},{'X':-1.1,'Y':0,'Z':-1.5},{'X':0.9,'Y':0,'Z':-1.5},{'X':2.9,'Y':0,'Z':-1.5},{'X':4.9,'Y':0,'Z':-1.5},{'X':-5.1,'Y':0,'Z':0.5},{'X':-3.1,'Y':0,'Z':0.5},{'X':-1.1,'Y':0,'Z':0.5},{'X':0.9,'Y':0,'Z':0.5},{'X':2.9,'Y':0,'Z':0.5},{'X':4.9,'Y':0,'Z':0.5},{'X':-5.1,'Y':0,'Z':2.5},{'X':-3.1,'Y':0,'Z':2.5},{'X':-1.1,'Y':0,'Z':2.5},{'X':0.9,'Y':0,'Z':2.5},{'X':2.9,'Y':0,'Z':2.5},{'X':4.9,'Y':0,'Z':2.5},{'X':-5.1,'Y':0,'Z':4.5},{'X':-3.1,'Y':0,'Z':4.5},{'X':-1.1,'Y':0,'Z':4.5},{'X':0.9,'Y':0,'Z':4.5},{'X':2.9,'Y':0,'Z':4.5},{'X':4.9,'Y':0,'Z':4.5}],'road_nopavement_9x15_end':[{'X':-5.1,'Y':0,'Z':-9.6},{'X':-3.1,'Y':0,'Z':-9.6},{'X':-1.1,'Y':0,'Z':-9.6},{'X':0.9,'Y':0,'Z':-9.6},{'X':2.9,'Y':0,'Z':-9.6},{'X':4.9,'Y':0,'Z':-9.6},{'X':-5.1,'Y':0,'Z':-7.6},{'X':-3.1,'Y':0,'Z':-7.6},{'X':-1.1,'Y':0,'Z':-7.6},{'X':0.9,'Y':0,'Z':-7.6},{'X':2.9,'Y':0,'Z':-7.6},{'X':4.9,'Y':0,'Z':-7.6},{'X':-5.1,'Y':0,'Z':-5.6},{'X':-3.1,'Y':0,'Z':-5.6},{'X':-1.1,'Y':0,'Z':-5.6},{'X':0.9,'Y':0,'Z':-5.6},{'X':2.9,'Y':0,'Z':-5.6},{'X':4.9,'Y':0,'Z':-5.6},{'X':-5.1,'Y':0,'Z':-3.6},{'X':-3.1,'Y':0,'Z':-3.6},{'X':-1.1,'Y':0,'Z':-3.6},{'X':0.9,'Y':0,'Z':-3.6},{'X':2.9,'Y':0,'Z':-3.6},{'X':4.9,'Y':0,'Z':-3.6},{'X':-5.1,'Y':0,'Z':-1.6},{'X':-3.1,'Y':0,'Z':-1.6},{'X':-1.1,'Y':0,'Z':-1.6},{'X':0.9,'Y':0,'Z':-1.6},{'X':2.9,'Y':0,'Z':-1.6},{'X':4.9,'Y':0,'Z':-1.6},{'X':-5.1,'Y':0,'Z':0.4},{'X':-3.1,'Y':0,'Z':0.4},{'X':-1.1,'Y':0,'Z':0.4},{'X':0.9,'Y':0,'Z':0.4},{'X':2.9,'Y':0,'Z':0.4},{'X':4.9,'Y':0,'Z':0.4},{'X':-5.1,'Y':0,'Z':2.4},{'X':-3.1,'Y':0,'Z':2.4},{'X':-1.1,'Y':0,'Z':2.4},{'X':0.9,'Y':0,'Z':2.4},{'X':2.9,'Y':0,'Z':2.4},{'X':4.9,'Y':0,'Z':2.4},{'X':-5.1,'Y':0,'Z':4.4},{'X':-3.1,'Y':0,'Z':4.4},{'X':-1.1,'Y':0,'Z':4.4},{'X':0.9,'Y':0,'Z':4.4},{'X':2.9,'Y':0,'Z':4.4},{'X':4.9,'Y':0,'Z':4.4}],'road_nopavement_9x15_railway':[{'X':-5,'Y':0,'Z':-5.5},{'X':-3,'Y':0,'Z':-5.5},{'X':-1,'Y':0,'Z':-5.5},{'X':1,'Y':0,'Z':-5.5},{'X':3,'Y':0,'Z':-5.5},{'X':5,'Y':0,'Z':-5.5},{'X':-5,'Y':0,'Z':-3.5},{'X':-3,'Y':0,'Z':-3.5},{'X':-1,'Y':0,'Z':-3.5},{'X':1,'Y':0,'Z':-3.5},{'X':3,'Y':0,'Z':-3.5},{'X':5,'Y':0,'Z':-3.5},{'X':-5,'Y':0,'Z':-1.5},{'X':-3,'Y':0,'Z':-1.5},{'X':-1,'Y':0,'Z':-1.5},{'X':1,'Y':0,'Z':-1.5},{'X':3,'Y':0,'Z':-1.5},{'X':5,'Y':0,'Z':-1.5},{'X':-5,'Y':0,'Z':0.5},{'X':-3,'Y':0,'Z':0.5},{'X':-1,'Y':0,'Z':0.5},{'X':1,'Y':0,'Z':0.5},{'X':3,'Y':0,'Z':0.5},{'X':5,'Y':0,'Z':0.5},{'X':-5,'Y':0,'Z':2.5},{'X':-3,'Y':0,'Z':2.5},{'X':-1,'Y':0,'Z':2.5},{'X':1,'Y':0,'Z':2.5},{'X':3,'Y':0,'Z':2.5},{'X':5,'Y':0,'Z':2.5},{'X':-5,'Y':0,'Z':4.5},{'X':-3,'Y':0,'Z':4.5},{'X':-1,'Y':0,'Z':4.5},{'X':1,'Y':0,'Z':4.5},{'X':3,'Y':0,'Z':4.5},{'X':5,'Y':0,'Z':4.5}],'road_nopavement_9x36_slope_600':[{'X':-37,'Y':-5.9,'Z':-5},{'X':-35,'Y':-5.8,'Z':-5},{'X':-33,'Y':-5.5,'Z':-5},{'X':-31,'Y':-5.3,'Z':-5},{'X':-29,'Y':-4.8,'Z':-5},{'X':-27,'Y':-4.4,'Z':-5},{'X':-25,'Y':-4,'Z':-5},{'X':-23,'Y':-3.5,'Z':-5},{'X':-21,'Y':-3,'Z':-5},{'X':-19,'Y':-2.6,'Z':-5},{'X':-17,'Y':-2.2,'Z':-5},{'X':-15,'Y':-1.8,'Z':-5},{'X':-13,'Y':-1.4,'Z':-5},{'X':-11,'Y':-0.9,'Z':-5},{'X':-9,'Y':-0.5,'Z':-5},{'X':-7,'Y':-0.1,'Z':-5},{'X':-5,'Y':0,'Z':-5},{'X':-3,'Y':0,'Z':-5},{'X':-1,'Y':0,'Z':-5},{'X':1,'Y':0,'Z':-5},{'X':-37,'Y':-5.9,'Z':-3},{'X':-35,'Y':-5.8,'Z':-3},{'X':-33,'Y':-5.5,'Z':-3},{'X':-31,'Y':-5.3,'Z':-3},{'X':-29,'Y':-4.8,'Z':-3},{'X':-27,'Y':-4.4,'Z':-3},{'X':-25,'Y':-4,'Z':-3},{'X':-23,'Y':-3.5,'Z':-3},{'X':-21,'Y':-3.1,'Z':-3},{'X':-19,'Y':-2.6,'Z':-3},{'X':-17,'Y':-2.2,'Z':-3},{'X':-15,'Y':-1.8,'Z':-3},{'X':-13,'Y':-1.4,'Z':-3},{'X':-11,'Y':-0.9,'Z':-3},{'X':-9,'Y':-0.5,'Z':-3},{'X':-7,'Y':-0.1,'Z':-3},{'X':-5,'Y':0,'Z':-3},{'X':-3,'Y':0,'Z':-3},{'X':-1,'Y':0,'Z':-3},{'X':1,'Y':0,'Z':-3},{'X':-37,'Y':-5.9,'Z':-1},{'X':-35,'Y':-5.8,'Z':-1},{'X':-33,'Y':-5.5,'Z':-1},{'X':-31,'Y':-5.3,'Z':-1},{'X':-29,'Y':-4.8,'Z':-1},{'X':-27,'Y':-4.4,'Z':-1},{'X':-25,'Y':-4,'Z':-1},{'X':-23,'Y':-3.5,'Z':-1},{'X':-21,'Y':-3.1,'Z':-1},{'X':-19,'Y':-2.6,'Z':-1},{'X':-17,'Y':-2.2,'Z':-1},{'X':-15,'Y':-1.8,'Z':-1},{'X':-13,'Y':-1.4,'Z':-1},{'X':-11,'Y':-0.9,'Z':-1},{'X':-9,'Y':-0.5,'Z':-1},{'X':-7,'Y':-0.1,'Z':-1},{'X':-5,'Y':0,'Z':-1},{'X':-3,'Y':0,'Z':-1},{'X':-1,'Y':0,'Z':-1},{'X':1,'Y':0,'Z':-1},{'X':-37,'Y':-5.9,'Z':1},{'X':-35,'Y':-5.8,'Z':1},{'X':-33,'Y':-5.5,'Z':1},{'X':-31,'Y':-5.3,'Z':1},{'X':-29,'Y':-4.8,'Z':1},{'X':-27,'Y':-4.4,'Z':1},{'X':-25,'Y':-4,'Z':1},{'X':-23,'Y':-3.5,'Z':1},{'X':-21,'Y':-3.1,'Z':1},{'X':-19,'Y':-2.6,'Z':1},{'X':-17,'Y':-2.2,'Z':1},{'X':-15,'Y':-1.8,'Z':1},{'X':-13,'Y':-1.4,'Z':1},{'X':-11,'Y':-0.9,'Z':1},{'X':-9,'Y':-0.5,'Z':1},{'X':-7,'Y':-0.1,'Z':1},{'X':-5,'Y':0,'Z':1},{'X':-3,'Y':0,'Z':1},{'X':-1,'Y':0,'Z':1},{'X':1,'Y':0,'Z':1},{'X':-37,'Y':-5.9,'Z':3},{'X':-35,'Y':-5.8,'Z':3},{'X':-33,'Y':-5.5,'Z':3},{'X':-31,'Y':-5.3,'Z':3},{'X':-29,'Y':-4.8,'Z':3},{'X':-27,'Y':-4.4,'Z':3},{'X':-25,'Y':-4,'Z':3},{'X':-23,'Y':-3.5,'Z':3},{'X':-21,'Y':-3.1,'Z':3},{'X':-19,'Y':-2.6,'Z':3},{'X':-17,'Y':-2.2,'Z':3},{'X':-15,'Y':-1.8,'Z':3},{'X':-13,'Y':-1.4,'Z':3},{'X':-11,'Y':-0.9,'Z':3},{'X':-9,'Y':-0.5,'Z':3},{'X':-7,'Y':-0.1,'Z':3},{'X':-5,'Y':0,'Z':3},{'X':-3,'Y':0,'Z':3},{'X':-1,'Y':0,'Z':3},{'X':1,'Y':0,'Z':3},{'X':-37,'Y':-5.9,'Z':5},{'X':-35,'Y':-5.8,'Z':5},{'X':-33,'Y':-5.5,'Z':5},{'X':-31,'Y':-5.3,'Z':5},{'X':-29,'Y':-4.8,'Z':5},{'X':-27,'Y':-4.4,'Z':5},{'X':-25,'Y':-4,'Z':5},{'X':-23,'Y':-3.5,'Z':5},{'X':-21,'Y':-3.1,'Z':5},{'X':-19,'Y':-2.6,'Z':5},{'X':-17,'Y':-2.2,'Z':5},{'X':-15,'Y':-1.8,'Z':5},{'X':-13,'Y':-1.4,'Z':5},{'X':-11,'Y':-0.9,'Z':5},{'X':-9,'Y':-0.5,'Z':5},{'X':-7,'Y':-0.1,'Z':5},{'X':-5,'Y':0,'Z':5},{'X':-3,'Y':0,'Z':5},{'X':-1,'Y':0,'Z':5},{'X':1,'Y':0,'Z':5}],'road_nopavement_bend_15x15':[{'X':3.6,'Y':0,'Z':-0.3},{'X':5.6,'Y':0,'Z':-0.3},{'X':7.6,'Y':0,'Z':-0.3},{'X':9.6,'Y':0,'Z':-0.3},{'X':11.6,'Y':0,'Z':-0.3},{'X':1.6,'Y':0,'Z':1.7},{'X':3.6,'Y':0,'Z':1.7},{'X':5.6,'Y':0,'Z':1.7},{'X':7.6,'Y':0,'Z':1.7},{'X':9.6,'Y':0,'Z':1.7},{'X':11.6,'Y':0,'Z':1.7},{'X':-0.4,'Y':0,'Z':3.7},{'X':1.6,'Y':0,'Z':3.7},{'X':3.6,'Y':0,'Z':3.7},{'X':5.6,'Y':0,'Z':3.7},{'X':7.6,'Y':0,'Z':3.7},{'X':9.6,'Y':0,'Z':3.7},{'X':11.6,'Y':0,'Z':3.7},{'X':-0.4
// ... [Code preview truncated due to length. Full source in attached file] ...

Автор
15FPS
Скачиваний
0
Просмотры
1
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок

Другие ресурсы пользователя 15FPS

Сверху