Create
Return to post

Comparing difference between and

View raw
  • settings
  • {
  • main
  • {
  • Description: "Path node builder v1.1 CODE: QRD5A Use this tool to create path nodes for your PvE modes. Build project into EXPORT VARS, copy it and paste in your mode. Read more instructions in WORKSHOP SETTINGS"
  • Mode Name: "PATH NODE BUILDER"
  • Description: "Path node builder v0.7 CODE: QRD5A Use this tool to create path nodes for your PvE modes. Build project into EXPORT VARS, copy it and paste in your mode. Read more instructions in WORKSHOP SETTINGS"
  • }
  • lobby
  • {
  • Data Center Preference: France
  • Map Rotation: After A Game
  • Max Spectators: 4
  • Max Team 1 Players: 1
  • Max Team 2 Players: 1
  • Return To Lobby: Never
  • }
  • modes
  • {
  • Assault
  • {
  • enabled maps
  • {
  • }
  • }
  • Control
  • {
  • enabled maps
  • {
  • }
  • }
  • Escort
  • {
  • enabled maps
  • {
  • Havana
  • }
  • }
  • Hybrid
  • {
  • enabled maps
  • {
  • }
  • }
  • Team Deathmatch
  • {
  • enabled maps
  • {
  • Malevento
  • }
  • }
  • General
  • {
  • Enemy Health Bars: Off
  • Game Mode Start: Manual
  • Hero Limit: Off
  • Kill Cam: Off
  • Kill Feed: Off
  • Respawn Time Scalar: 0%
  • Skins: Off
  • Spawn Health Packs: Disabled
  • }
  • }
  • heroes
  • {
  • General
  • {
  • Quick Melee: Off
  • Ultimate Ability: Off
  • enabled heroes
  • {
  • Zenyatta
  • }
  • }
  • }
  • workshop
  • {
  • PLAYER MOVEMENT SPEED: 180
  • SHOW CONNECTION EFFECTS WHEN SELECTED ONLY : Off
  • WRITE INTO INSPECTOR REQUIRED VARS ONLY : Off
  • SPAWN ROOM: [2]
  • }
  • extensions
  • {
  • Play More Effects
  • }
  • }
  • variables
  • {
  • global:
  • 0: WorkshopSettingInstructions
  • 1: PropertySpawnRoomIndex
  • 2: PropertyPlayerMovementSpeed
  • 3: PropertyBotMovementSpeed
  • 4: PropertyFreeCamera
  • 5: BuilderHudColorCurrent
  • 6: BuilderHudColorBuildMode
  • 7: BuilderHudColorEditMode
  • 8: BuilderHudColorPathFindingMode
  • 9: BuilderMode
  • 10: LoopIterator1
  • 11: LoopIterator2
  • 12: LoopIterator3
  • 13: StringConcatNodeId
  • 14: StringConcatResult
  • 15: StringConcatCountOfElements
  • 16: BuilderRayCastHitPosition
  • 17: BuilderNodePositions
  • 18: BuilderNodeConnections
  • 19: BuilderNodeEffectIdArray
  • 20: BuilderNodeConnectionEffectsId
  • 21: BuilderNodeWorldTextIdArray
  • 22: BuilderSelectedNodeEffectPos
  • 23: BuilderTrySelectNodeInLOS
  • 24: BuilderSelectedNodeId
  • 25: BuilderInnerArray
  • 26: BuilderIsNodeHaveConnection
  • 27: IsBuildingProject
  • 28: BuilderProgressBarValue
  • 29: BuilderProgressBarValueStep
  • 30: BuildProjectEmptySpace
  • 31: BuildProjectNewElementIndex
  • 32: BuildProjectOldElementIndex
  • 33: BuildProjectQueueArray
  • 34: BuildProjectVisitedNodes
  • 35: BuildProjectCurrentNodeId
  • 36: BuildProjectStartNodeId
  • 37: BuildProjectNeighborNodeId
  • 38: PathFindingStartNodeEffectPos
  • 39: PathFindingTargetNodeEffectPos
  • 40: BeamEffects
  • 41: PathFindingStartNodeId
  • 42: PathFindingTargetNodeId
  • 43: PathFindingNextNodeId
  • 43: PathFindingResultPath
  • 44: PathFindingShortestDistance
  • 45: PathFindingCurrentDistance
  • 46: PathFindingCurrentNodeId
  • 47: PathFindingBotId
  • 48: NodeTriggerRadius
  • 49: PathFindingStartPosition
  • 50: PathFindingTargetPosition
  • 51: OptimizedInspectorRecorder
  • 52: WorkshopSettingShowConnections
  • 125: NodePositions
  • 126: NodeConnections
  • 127: DistanceMatrix
  • player:
  • 0: BuilderModeInfoHudId
  • 109: BotTempVar1
  • 110: BotLoopCurrentNodeId
  • 111: BotCurrentDistanceInMeters
  • 112: BotShortestDistanceInMeters
  • 113: BotPrevNodeId
  • 114: BotMoveSpeedMultiplier
  • 115: BotCancelPathFinding
  • 116: BotLoopIterator1
  • 117: BotLoopConnectionArray
  • 117: BotTempArray
  • 118: BotTargetPlayer
  • 119: BotTargetPosition
  • 120: BotClosestNodeIdToTarget
  • 121: BotClosestNodeIdToBot
  • 122: BotTimestamp
  • 122: BotPrevNodeId
  • 123: BotNextNodeId
  • 124: BotNextNodePosition
  • 125: BotCurrentDistanceToTarget
  • 126: BotShortestDistanceToTarget
  • 127: BotIsPathFinding
  • }
  • subroutines
  • {
  • 0: BuilderSwitchMode
  • 1: BuilderEditModeSelectNode
  • 2: BuilderEditModeDeleteNode
  • 3: BuilderConcatStringConnections
  • 4: BuilderDeleteConnectionsOfNode
  • 5: BuilderConnectDisconnectSelector
  • 6: BuilderConnectNodeBackendLogic
  • 7: BuilderConnectNodeBeamEffect
  • 8: BuilderDisconnectNode
  • 9: BuilderBuildModeCreateNewNode
  • 10: BuilderDeleteAllEffects
  • 11: BuilderBuildProject
  • 12: BuilderOptimizeData
  • 13: BuilderUpdateConnectionIndexes
  • 14: BuilderInitModEffects
  • 15: BuilderBuildPreparedPathNodes
  • 16: BuilderComputeDistanceMatrix
  • 17: BuilderGetClossestNodeIdToCursor
  • 18: PathFindingModeSelectNode
  • 19: PathFindingModeReset
  • 20: DeleteNodeBeams
  • 21: CreateNodeBeams
  • 22: PathFindingDrawShortestPath
  • 22: PathFindingGetShortestPath
  • 23: PathFindingCreateBot
  • 24: PathFindingTestBotReset
  • 122: BotResetPathFinding
  • 123: BotGetTargetNodeAndPosition
  • 124: BotGetNextNodeId
  • 125: BotGetNextPosition
  • 126: BotComputeTimestamp
  • 127: BotGetRightHandPartOfFloatNumber
  • 124: BotStartPathFinding
  • 125: BotGetClosestNodeIdToTarget
  • 126: BotGetNextNodeIdAndPosition
  • 127: BotResetPathFinding
  • }
  • rule("=== PATH NODE BUILDER BY HUKUTA94#2589 ===")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • actions
  • {
  • disabled Disable Inspector Recording;
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String(
  • "WEB APP IS OPEN SOURCE PROJECT:\r\ngithub.com/HuKuTa94/path-node-builder"), Right, -1000, Color(White), Color(White), Color(
  • White), Visible To, Default Visibility);
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String("PATH NODE BUILDER V1.1 BY HUKUTA94#2589"), Right, -999, Color(
  • White), Color(White), Color(White), Visible To, Default Visibility);
  • Create HUD Text(All Players(All Teams), Custom String(
  • "TO COMPUTE DISTANCE MATRIX USE WEB APP\r\n peaceful-cove-76019.herokuapp.com"), Null, Null, Top, -99, Color(Orange), Color(
  • White), Color(White), Visible To and String, Default Visibility);
  • }
  • }
  • rule("=== PATH NODE BUILDER - EXPORT BLOCK START - COPY THESE RULES AND SUBROUTINES INTO YOUR MODE ===")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • }
  • rule("MAP: MALEVENTO")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • Current Map == Map(Malevento);
  • }
  • actions
  • {
  • Global.NodePositions = Array(Vector(-10.738, 4.425, 15.041), Vector(-17.895, 0.425, 15.639), Vector(-20.018, 1.954, 5.175), Vector(
  • -26.129, 0.327, 33.507), Vector(1.810, -3.075, -30.681), Vector(11.101, -0.575, -24.641), Vector(-2.351, -0.575, -16.396),
  • Vector(-9.130, 0.925, -12.307), Vector(0.002, 0.425, -3.019), Vector(16.802, 1.425, -0.295), Vector(22.166, 1.425, -1.879),
  • Vector(25.401, 2.438, -25.223), Vector(12.473, 3.925, 21.989), Vector(18.785, 3.425, 12.436), Vector(0.021, 1.427, 3.387),
  • Vector(-6.597, 1.427, 2.906), Vector(6.538, 1.427, 3.209), Vector(-7.694, 2.425, 42.764), Vector(-0.011, 2.178, 33.968),
  • Vector(-5.701, 7.714, 31.977), Vector(-24.570, 0.465, 43.852), Vector(-11.885, 2.425, 35.959), Vector(-20.395, 1.561, 25.748),
  • Vector(-6.042, 2.427, 19.931), Vector(-0.110, 2.427, 18.298), Vector(-32.363, -0.575, 18.321), Vector(-27.042, -0.575, 15.239),
  • Vector(-2.834, 2.785, 33.362), Vector(-2.595, 3.579, 39.484), Vector(13.931, 4.425, 34.748), Vector(4.923, 5.430, 34.610),
  • Vector(4.717, 6.328, 28.384), Vector(43.372, 7.425, 20.411), Vector(36.203, 6.425, 32.347), Vector(34.158, 5.795, 1.844),
  • Vector(23.450, 3.425, -12.552), Vector(24.162, 4.425, 36), Vector(24.309, 3.425, 25.555), Vector(20.168, 2.358, -20.795),
  • Vector(31.210, 3.425, -16.262), Vector(-12.573, 0.425, -1.478), Vector(-24.265, -2.569, -2.175), Vector(-21.261, -2.575,
  • -21.570), Vector(-31.615, -2.399, -4.360), Vector(3.017, -0.575, -10.994), Vector(9.487, 1.425, -2.375), Vector(-15.759,
  • -2.575, -19.416), Vector(-2.674, 5.426, -19.696), Vector(48.610, 4.425, 25.857), Vector(29.400, 3.425, 19.662), Vector(17.004,
  • 6.889, 4.152), Vector(5.291, 6.224, 21.467), Vector(11.113, 3.425, -17.689), Vector(-26.146, 4.425, 14.513), Vector(-26.757,
  • 3.435, -1.682), Vector(-18.687, 2.425, -16.740), Vector(0.475, 5.448, -26.518), Vector(-13.700, -2.205, -27.259), Vector(0.148,
  • 3.097, 45.533), Vector(-0.093, 9.434, 40.244), Vector(-6.460, 5.927, 3.853), Vector(6.328, 5.925, 3.277), Vector(2.876, -3.080,
  • -34.798), Vector(27.016, 6.425, 12.268), Vector(-36.013, 5.071, 21.851), Vector(-30.072, 5.071, 28.407), Vector(-34.556, 5.142,
  • 27.572), Vector(-30.720, 5.093, 19.771), Vector(-16.872, -2.575, -31.658));
  • Global.NodeConnections = Array(Array(40, 53), Array(2, 22, 26, 40), Array(1, 40, 54), Array(20, 21, 22, 25), Array(5, 6, 62, 68),
  • Array(4, 38, 11, 44), Array(4, 7, 8, 46, 44), Array(6, 8, 40, 55, 46), Array(7, 6, 14, 40, 44, 45), Array(10, 13, 45), Array(9,
  • 35), Array(38, 5, 39), Array(13, 24, 29, 37, 49), Array(12, 9, 37, 49), Array(8, 15, 16), Array(14, 24), Array(14, 24), Array(
  • 20, 21, 58), Array(27, 59, 19), Array(31, 59), Array(3, 17), Array(3, 17, 22, 27), Array(3, 21, 1, 23, 53), Array(22, 24, 60),
  • Array(23, 12, 27, 18, 16, 15), Array(26, 3), Array(1, 25, 43), Array(21, 24, 18, 28), Array(27, 30), Array(12, 30, 36, 58),
  • Array(28, 29, 31), Array(30, 19, 51), Array(33, 34, 48), Array(32, 36), Array(32, 35, 49, 50, 63), Array(34, 10, 38, 39),
  • Array(29, 33, 37), Array(12, 13, 36, 49), Array(35, 11, 52, 5), Array(11, 35), Array(41, 8, 7, 0, 2, 1), Array(40, 42, 43, 46),
  • Array(41, 43, 46, 57, 68), Array(42, 41, 26, 46), Array(6, 5, 8, 45), Array(44, 8, 9, 52), Array(43, 41, 42, 6, 57, 7, 68),
  • Array(6, 46, 52, 56, 57), Array(32, 49), Array(37, 12, 34, 48, 13, 63), Array(13, 34, 61), Array(12, 31, 24, 61), Array(45, 44,
  • 47, 38, 5), Array(22, 0, 25, 54, 67), Array(40, 2, 53, 43, 55), Array(46, 42, 43, 54, 7), Array(47, 57, 62), Array(56, 47, 42,
  • 46, 68), Array(17, 29), Array(19, 58), Array(61, 24, 23), Array(50, 24, 51, 60), Array(4), Array(34, 49, 13), Array(67, 66, 25,
  • 3), Array(66, 3, 25), Array(64, 65, 3, 25), Array(64, 25, 3, 53), Array(42, 46, 57, 4));
  • Global.DistanceMatrix = Array(Array(2.200, 2.200, 3.300, 4.400, 4.400, 3.300, 2.200, 2.200, 4.400, 5.500, 5.500, 5.500, 5.500,
  • 3.300, 4.400, 4.400, 4.400, 5.500, 6.700, 4.400, 3.300, 2.200, 3.300, 4.400, 2.400, 3.300, 4.400, 5.500, 6.600, 6.600, 7.600,
  • 8.800, 8.800, 7.700, 6.600, 7.700, 6.600, 5.500, 6.600, 1.100, 2.200, 3.300, 3.300, 3.300, 3.300, 3.300, 5.400, 7.700, 6.600,
  • 6.600, 6.500, 4.400, 1.100, 2.200, 3.300, 5.500, 4.400, 5.500, 6.600, 4.400, 5.500, 5.500, 7.600, 3.300, 5.400, 4.400, 2.200,
  • 4.400), Array(1.100, 2.200, 4.400, 4.400, 3.300, 2.200, 2.200, 4.400, 5.500, 5.500, 4.400, 5.500, 3.300, 4.400, 4.400, 3.300,
  • 4.400, 5.600, 3.300, 2.200, 1.100, 2.200, 3.300, 2.200, 1.100, 3.300, 4.400, 5.500, 5.500, 6.500, 7.700, 7.700, 6.600, 6.600,
  • 6.600, 5.500, 5.500, 6.600, 1.100, 2.200, 3.300, 2.200, 3.300, 3.300, 3.300, 5.400, 6.600, 5.500, 5.500, 5.400, 4.400, 2.200,
  • 2.200, 3.300, 5.500, 4.400, 4.400, 5.500, 3.300, 4.400, 5.500, 6.600, 4.300, 6.300, 5.300, 3.300, 4.400), Array(3.300, 4.400,
  • 4.400, 3.300, 2.200, 2.200, 4.400, 5.500, 5.500, 5.500, 5.500, 3.300, 4.400, 4.400, 4.400, 5.500, 6.700, 4.400, 3.300, 2.200,
  • 3.300, 4.400, 3.300, 2.200, 4.400, 5.500, 6.600, 6.600, 7.600, 8.800, 8.800, 7.700, 6.600, 7.700, 6.600, 5.500, 6.600, 1.100,
  • 2.200, 3.300, 2.300, 3.300, 3.300, 3.300, 5.400, 7.700, 6.600, 6.600, 6.500, 4.400, 2.200, 1.100, 2.200, 5.500, 4.400, 5.500,
  • 6.600, 4.400, 5.500, 5.500, 7.600, 4.400, 6.400, 5.400, 3.300, 4.400), Array(6.600, 6.600, 5.500, 4.400, 4.400, 6.600, 7.700,
  • 7.700, 4.400, 5.500, 5.500, 4.400, 4.400, 2.200, 3.300, 4.500, 1.100, 1.100, 1.100, 2.200, 3.300, 1.100, 2.200, 2.200, 3.300,
  • 4.400, 4.400, 5.500, 7.700, 6.600, 6.600, 7.700, 5.500, 5.500, 7.700, 8.800, 3.300, 4.400, 4.400, 3.300, 5.500, 5.500, 4.400,
  • 6.500, 6.600, 5.500, 5.500, 5.400, 6.600, 2.200, 3.300, 4.400, 6.600, 5.500, 3.300, 4.400, 3.300, 4.400, 7.700, 6.600, 4.100,
  • 6.100, 5.100, 3.100, 5.500), Array(1.100, 1.100, 2.200, 2.200, 4.400, 4.400, 2.200, 6.600, 5.500, 3.300, 4.400, 4.400, 7.700,
  • 6.700, 7.800, 7.700, 6.600, 5.500, 6.600, 5.500, 5.500, 4.400, 6.600, 7.700, 7.700, 8.800, 8.700, 5.500, 6.600, 4.400, 3.300,
  • 7.700, 6.600, 2.200, 3.300, 3.300, 3.300, 2.200, 3.300, 2.200, 3.300, 2.200, 3.200, 6.600, 5.500, 5.500, 7.600, 3.200, 5.500,
  • 4.400, 3.300, 3.200, 2.200, 8.800, 7.900, 7.600, 6.600, 1.100, 5.500, 7.600, 9.600, 8.600, 6.600, 1.100), Array(2.200, 3.300,
  • 2.200, 3.300, 3.300, 1.100, 5.500, 4.400, 3.300, 4.400, 4.400, 7.700, 6.700, 7.800, 7.700, 6.600, 5.500, 6.600, 5.500, 6.600,
  • 5.500, 6.600, 7.700, 6.600, 7.700, 7.700, 4.400, 5.500, 3.300, 2.200, 6.600, 5.500, 1.100, 2.200, 3.300, 4.400, 3.300, 4.400,
  • 1.100, 2.200, 3.300, 3.200, 5.500, 4.400, 4.400, 6.600, 2.100, 5.500, 5.400, 4.400, 4.300, 3.300, 7.700, 7.800, 6.600, 5.500,
  • 2.200, 4.400, 7.700, 9.700, 8.700, 6.600, 2.200), Array(1.100, 1.100, 3.300, 4.400, 3.300, 5.500, 4.400, 2.200, 3.300, 3.300,
  • 6.600, 5.600, 6.700, 6.600, 5.500, 4.400, 5.500, 4.400, 4.400, 3.300, 5.500, 6.600, 6.600, 7.700, 7.600, 6.600, 7.700, 5.500,
  • 4.400, 6.600, 5.500, 3.300, 4.400, 2.200, 2.200, 2.200, 2.200, 1.100, 2.200, 1.100, 3.100, 6.600, 5.500, 6.500, 8.500, 3.200,
  • 4.400, 3.300, 2.200, 3.200, 2.200, 7.700, 6.800, 6.500, 7.500, 2.200, 6.500, 6.500, 8.500, 7.500, 5.500, 2.200), Array(1.100,
  • 3.300, 4.400, 4.400, 5.500, 4.400, 2.200, 3.300, 3.300, 5.500, 5.600, 6.700, 5.500, 4.400, 3.300, 4.400, 4.400, 4.400, 3.300,
  • 5.500, 6.600, 6.600, 7.700, 7.600, 7.700, 7.700, 6.600, 5.500, 6.600, 5.500, 4.400, 5.500, 1.100, 2.200, 2.200, 2.200, 2.200,
  • 2.200, 1.100, 3.200, 6.600, 5.500, 7.500, 7.500, 3.300, 3.300, 2.200, 1.100, 3.300, 2.200, 6.600, 6.700, 5.500, 6.500, 3.300,
  • 6.500, 5.500, 7.500, 6.500, 4.400, 2.200), Array(2.200, 3.300, 3.300, 4.400, 3.300, 1.100, 2.200, 2.200, 5.500, 4.500, 5.600,
  • 5.500, 4.400, 3.300, 4.400, 3.300, 4.400, 3.300, 4.400, 5.500, 5.500, 6.600, 6.500, 6.600, 6.600, 5.500, 4.400, 5.500, 4.400,
  • 3.300, 4.400, 1.100, 2.200, 3.300, 3.300, 1.100, 1.100, 2.200, 3.200, 5.500, 4.400, 6.400, 7.400, 2.200, 3.300, 3.200, 2.200,
  • 4.300, 3.300, 6.600, 5.700, 5.400, 6.400, 3.300, 5.400, 5.500, 7.500, 6.500, 4.400, 3.300), Array(1.100, 4.400, 2.200, 1.100,
  • 3.300, 4.400, 4.400, 5.500, 4.500, 5.500, 6.600, 5.500, 5.500, 4.400, 3.300, 6.600, 5.500, 4.400, 5.500, 3.300, 4.400, 5.400,
  • 4.400, 4.400, 3.300, 2.200, 3.300, 2.200, 3.300, 3.300, 3.300, 4.400, 5.500, 5.500, 2.200, 1.100, 4.400, 3.300, 3.300, 2.200,
  • 4.200, 6.300, 2.200, 5.500, 5.400, 4.400, 4.400, 4.400, 4.400, 5.500, 5.400, 5.300, 5.500, 3.200, 7.700, 9.700, 8.700, 6.600,
  • 5.500), Array(3.300, 3.300, 2.200, 4.400, 5.500, 5.500, 6.600, 5.600, 6.600, 7.700, 6.600, 6.600, 5.500, 4.400, 7.700, 6.600,
  • 5.500, 6.600, 4.400, 5.500, 6.500, 3.300, 4.400, 2.200, 1.100, 4.400, 3.300, 2.200, 2.200, 4.400, 5.500, 6.600, 6.600, 3.300,
  • 2.200, 5.500, 4.400, 4.400, 3.300, 3.300, 5.400, 3.300, 6.600, 6.500, 5.500, 5.500, 5.500, 5.500, 6.600, 5.500, 4.400, 5.500,
  • 3.300, 8.800, 10.800, 9.800, 7.700, 5.500), Array(5.500, 5.500, 4.400, 5.500, 5.500, 8.800, 7.800, 8.800, 8.800, 7.700, 6.600,
  • 7.700, 6.600, 7.700, 6.600, 7.700, 8.800, 6.600, 7.700, 7.700, 4.400, 5.500, 3.300, 2.200, 6.600, 5.500, 1.100, 1.100, 4.400,
  • 5.500, 4.400, 5.500, 2.200, 3.300, 4.400, 3.300, 5.500, 4.400, 4.400, 6.600, 2.200, 6.600, 6.500, 5.500, 4.400, 4.400, 7.700,
  • 8.800, 6.600, 5.500, 3.300, 4.400, 8.800, 10.800, 9.800, 7.700, 3.300), Array(1.100, 3.300, 2.200, 2.200, 3.300, 2.300, 3.300,
  • 4.400, 3.300, 3.300, 2.200, 1.100, 5.500, 5.500, 2.200, 3.300, 1.100, 2.200, 3.200, 3.300, 3.300, 2.200, 3.300, 2.200, 1.100,
  • 4.400, 4.400, 5.500, 6.600, 7.700, 6.600, 4.400, 3.300, 6.600, 5.500, 2.200, 1.100, 3.200, 4.100, 4.400, 4.400, 5.500, 6.600,
  • 6.600, 6.600, 2.200, 3.300, 3.200, 4.200, 7.700, 2.200, 6.500, 8.500, 7.500, 5.500, 7.700), Array(4.400, 3.300, 3.300, 4.400,
  • 3.400, 4.400, 5.500, 4.400, 4.400, 3.300, 2.200, 6.600, 6.600, 3.300, 4.400, 2.200, 3.300, 4.300, 3.300, 3.300, 2.200, 3.300,
  • 2.200, 1.100, 4.400, 4.400, 4.400, 5.500, 6.600, 6.600, 3.300, 2.200, 5.500, 4.400, 2.200, 1.100, 3.100, 5.200, 3.300, 5.500,
  • 6.500, 5.500, 5.500, 5.500, 3.300, 4.400, 4.300, 4.200, 6.600, 2.100, 7.600, 9.600, 8.600, 6.600, 6.600), Array(1.100, 1.100,
  • 5.500, 3.400, 4.500, 6.600, 4.400, 4.400, 3.300, 2.200, 5.500, 4.400, 3.300, 4.400, 4.400, 5.500, 5.400, 6.600, 6.600, 5.500,
  • 5.500, 5.500, 4.400, 4.400, 5.500, 2.200, 3.300, 4.400, 4.400, 2.200, 2.200, 3.300, 4.300, 5.500, 4.400, 6.400, 6.300, 3.300,
  • 4.400, 4.300, 3.300, 5.400, 4.400, 5.500, 4.600, 4.300, 5.300, 4.400, 5.500, 6.600, 8.600, 7.600, 5.500, 4.400), Array(2.200,
  • 4.400, 2.300, 3.400, 5.500, 3.300, 3.300, 2.200, 1.100, 5.500, 5.500, 2.200, 3.300, 3.300, 4.400, 4.300, 5.500, 5.500, 4.400,
  • 5.500, 4.400, 3.300, 5.500, 6.600, 3.300, 4.400, 5.500, 5.500, 3.300, 3.300, 4.400, 5.400, 4.400, 3.300, 5.300, 5.200, 4.400,
  • 4.400, 5.400, 4.400, 6.500, 5.500, 4.400, 3.500, 3.200, 4.200, 5.500, 4.400, 6.500, 8.500, 7.500, 5.500, 5.500), Array(4.400,
  • 2.300, 3.400, 5.500, 3.300, 3.300, 2.200, 1.100, 5.500, 5.500, 2.200, 3.300, 3.300, 4.400, 4.300, 5.500, 5.500, 4.400, 5.500,
  • 4.400, 3.300, 5.500, 6.600, 3.300, 4.400, 5.500, 5.500, 3.300, 3.300, 4.400, 5.400, 4.400, 3.300, 5.300, 5.200, 4.400, 4.400,
  • 5.400, 4.400, 6.500, 5.500, 4.400, 3.500, 3.200, 4.200, 5.500, 4.400, 6.500, 8.500, 7.500, 5.500, 5.500), Array(3.300, 4.300,
  • 1.100, 1.100, 2.200, 3.300, 3.300, 3.300, 4.400, 2.200, 3.300, 2.200, 3.300, 4.400, 5.500, 4.400, 5.500, 6.600, 3.300, 4.400,
  • 7.700, 7.700, 4.400, 5.500, 6.600, 5.500, 6.600, 6.600, 6.600, 8.700, 5.500, 4.400, 6.500, 5.400, 7.700, 3.300, 4.400, 5.500,
  • 8.800, 7.700, 1.100, 4.200, 4.400, 5.400, 8.800, 5.500, 5.300, 7.300, 6.300, 4.300, 7.700), Array(1.400, 4.400, 2.200, 3.300,
  • 3.200, 2.100, 4.400, 5.500, 1.100, 2.200, 3.300, 3.300, 2.300, 6.500, 5.500, 5.400, 6.500, 4.400, 4.300, 7.600, 7.600, 5.500,
  • 6.600, 7.700, 6.600, 6.500, 6.500, 7.600, 8.600, 5.400, 4.300, 5.300, 3.200, 7.600, 4.400, 5.500, 6.600, 9.700, 8.700, 2.400,
  • 1.500, 4.200, 4.200, 8.700, 5.400, 6.400, 8.400, 7.400, 5.400, 8.700), Array(4.500, 4.300, 5.400, 4.300, 3.200, 6.500, 7.600,
  • 4.200, 3.300, 3.300, 2.200, 1.100, 6.600, 5.500, 5.500, 6.600, 4.400, 4.400, 7.700, 7.700, 7.600, 8.700, 9.800, 8.700, 7.600,
  • 6.600, 8.700, 8.700, 5.500, 4.400, 4.400, 2.200, 7.700, 6.500, 7.600, 8.700, 9.800, 9.800, 2.400, 1.100, 4.300, 3.300, 9.800,
  • 5.500, 8.500, 10.500, 9.500, 7.500, 9.800), Array(2.200, 2.200, 3.300, 4.400, 2.200, 3.300, 3.300, 4.400, 3.300, 4.400, 5.500,
  • 6.600, 5.500, 6.600, 7.700, 4.400, 5.500, 8.800, 8.800, 4.400, 5.500, 5.500, 4.400, 6.600, 6.600, 5.500, 7.600, 6.600, 5.500,
  • 6.600, 6.500, 7.700, 3.300, 4.400, 5.500, 7.700, 6.600, 2.200, 5.300, 4.400, 5.500, 8.800, 6.600, 5.200, 7.200, 6.200, 4.200,
  • 6.600), Array(1.100, 2.200, 2.200, 2.200, 3.300, 1.100, 2.200, 3.300, 3.300, 4.400, 6.600, 5.500, 5.500, 6.600, 4.400, 4.400,
  • 7.700, 7.700, 3.300, 4.400, 5.500, 4.400, 5.500, 5.500, 5.500, 7.600, 5.500, 4.400, 5.400, 5.300, 6.600, 2.200, 3.300, 4.400,
  • 7.700, 6.600, 2.200, 3.300, 3.300, 4.300, 7.700, 5.500, 4.200, 6.200, 5.200, 3.200, 6.600), Array(1.100, 2.200, 2.200, 2.200,
  • 2.200, 3.300, 4.400, 4.400, 5.400, 6.600, 6.600, 5.500, 6.600, 5.500, 4.400, 6.600, 7.700, 2.200, 3.300, 4.400, 3.300, 4.400,
  • 4.400, 4.400, 6.500, 5.500, 4.400, 4.400, 4.300, 5.500, 1.100, 2.200, 3.300, 6.600, 5.500, 3.300, 4.400, 2.200, 3.300, 6.600,
  • 5.500, 3.200, 5.200, 4.200, 2.200, 5.500), Array(1.100, 3.300, 3.300, 2.200, 3.300, 3.300, 4.400, 4.300, 5.500, 5.500, 4.400,
  • 5.500, 4.400, 3.300, 6.600, 6.600, 3.300, 4.400, 5.500, 4.400, 5.500, 5.500, 5.500, 7.600, 4.400, 3.300, 3.300, 3.200, 6.600,
  • 2.200, 3.300, 4.400, 7.700, 6.600, 4.400, 3.500, 1.100, 2.200, 7.700, 4.400, 4.300, 6.300, 5.300, 3.300, 6.600), Array(4.400,
  • 4.400, 1.100, 2.200, 2.200, 3.300, 3.200, 4.400, 4.400, 3.300, 4.400, 3.300, 2.200, 5.500, 5.500, 4.400, 5.500, 6.600, 5.500,
  • 4.400, 4.400, 5.500, 6.500, 3.300, 2.200, 4.200, 4.100, 5.500, 3.300, 4.400, 5.500, 7.600, 6.600, 3.300, 2.400, 2.100, 3.100,
  • 6.600, 3.300, 5.400, 7.400, 6.400, 4.400, 6.600), Array(1.100, 3.300, 4.400, 5.500, 5.500, 6.600, 8.800, 7.700, 7.700, 8.700,
  • 6.600, 6.600, 7.600, 8.800, 3.300, 3.300, 3.300, 2.200, 5.500, 5.500, 3.300, 5.400, 7.700, 6.600, 6.600, 6.500, 6.500, 3.100,
  • 4.200, 5.300, 5.500, 4.400, 4.400, 5.500, 4.400, 5.500, 6.600, 7.700, 5.100, 7.100, 6.100, 4.100, 4.400), Array(4.400, 5.500,
  • 6.600, 6.600, 7.600, 8.800, 8.800, 7.700, 7.600, 7.700, 6.600, 6.500, 7.700, 2.200, 2.200, 2.200, 1.100, 4.400, 4.400, 2.200,
  • 4.300, 7.700, 6.600, 6.600, 6.500, 5.400, 3.200, 3.200, 4.200, 4.400, 3.300, 5.500, 6.600, 4.400, 5.500, 5.500, 7.700, 5.200,
  • 7.200, 6.200, 4.200, 3.300), Array(1.100, 3.300, 2.200, 3.300, 5.500, 5.500, 4.400, 5.500, 4.400, 3.300, 6.600, 6.600, 4.400,
  • 5.500, 6.600, 5.500, 5.500, 5.500, 6.600, 7.600, 4.400, 3.300, 5.300, 4.200, 6.600, 3.300, 4.400, 5.500, 8.700, 7.700, 3.300,
  • 2.400, 3.200, 4.200, 7.700, 4.400, 5.300, 7.300, 6.300, 4.300, 7.700), Array(2.200, 1.100, 2.200, 5.500, 4.400, 5.500, 6.600,
  • 3.300, 4.400, 7.700, 7.700, 5.500, 6.600, 7.700, 6.600, 6.600, 6.600, 7.700, 8.700, 5.500, 4.400, 5.400, 3.300, 7.700, 4.400,
  • 5.500, 6.600, 9.800, 8.800, 3.300, 3.400, 4.300, 4.300, 8.800, 5.500, 6.400, 8.400, 7.400, 5.400, 8.800), Array(1.100, 2.200,
  • 3.300, 2.200, 3.300, 4.400, 1.100, 2.200, 5.500, 5.500, 6.600, 7.700, 8.800, 7.700, 5.500, 4.400, 7.700, 6.600, 3.300, 2.200,
  • 4.300, 3.200, 5.500, 5.500, 6.600, 7.700, 7.700, 7.700, 1.100, 4.200, 4.300, 4.300, 8.800, 3.300, 7.500, 9.500, 8.500, 6.500,
  • 8.800), Array(1.100, 4.400, 3.300, 4.400, 5.500, 2.200, 3.300, 6.600, 6.600, 6.600, 7.700, 8.800, 7.700, 6.600, 5.500, 8.800,
  • 7.700, 4.400, 3.300, 4.400, 2.200, 6.600, 5.500, 6.600, 7.700, 8.800, 8.800, 2.200, 3.300, 4.400, 3.300, 9.900, 4.400, 7.500,
  • 9.500, 8.500, 6.500, 9.900), Array(5.500, 4.400, 4.400, 5.500, 3.300, 3.400, 6.600, 6.600, 6.700, 7.800, 8.900, 7.800, 6.700,
  • 5.600, 7.800, 7.800, 4.500, 3.400, 3.300, 1.100, 6.700, 5.600, 6.700, 7.800, 8.900, 8.900, 3.300, 2.200, 3.300, 2.200, 8.900,
  • 4.500, 7.600, 9.600, 8.600, 6.600, 8.900), Array(1.100, 1.100, 2.200, 2.200, 3.300, 3.300, 3.300, 7.700, 7.800, 7.700, 7.800,
  • 5.500, 5.500, 6.700, 5.500, 1.100, 2.200, 2.200, 4.400, 4.400, 7.700, 8.800, 8.800, 6.600, 6.600, 4.400, 6.500, 4.400, 3.300,
  • 6.600, 2.200, 9.800, 11.800, 10.800, 8.800, 6.600), Array(2.200, 3.300, 1.100, 2.200, 4.400, 4.400, 7.700, 8.800, 8.800, 8.900,
  • 6.600, 5.500, 7.800, 6.600, 2.200, 3.300, 3.300, 5.400, 5.500, 7.700, 8.800, 8.800, 7.700, 7.700, 3.300, 6.400, 5.500, 4.400,
  • 7.700, 3.300, 9.700, 11.700, 10.700, 8.700, 7.700), Array(1.100, 3.300, 2.200, 2.200, 2.200, 6.600, 6.700, 6.600, 6.700, 4.400,
  • 4.400, 5.600, 4.400, 2.200, 1.100, 1.100, 3.300, 3.300, 6.600, 7.700, 7.700, 5.500, 5.500, 4.400, 5.500, 3.300, 2.200, 5.500,
  • 1.100, 8.700, 10.700, 9.700, 7.700, 5.500), Array(4.400, 3.300, 1.100, 1.100, 5.500, 5.600, 5.500, 5.600, 3.300, 3.300, 4.500,
  • 3.300, 3.300, 2.200, 2.200, 4.400, 2.200, 7.700, 7.600, 6.600, 4.400, 4.400, 5.500, 6.600, 4.400, 3.300, 4.400, 2.200, 9.800,
  • 11.800, 10.800, 8.800, 4.400), Array(1.100, 5.500, 5.500, 6.600, 7.700, 8.800, 8.800, 5.500, 4.400, 7.700, 6.600, 3.300, 2.200,
  • 4.300, 4.300, 5.500, 6.600, 7.700, 7.700, 7.700, 7.700, 2.200, 5.300, 5.400, 5.400, 8.800, 3.300, 8.600, 10.600, 9.600, 7.600,
  • 8.800), Array(4.400, 4.400, 5.500, 6.600, 7.700, 7.700, 4.400, 3.300, 6.600, 5.500, 2.200, 1.100, 3.200, 5.200, 4.400, 5.500,
  • 6.600, 6.600, 6.600, 6.600, 3.300, 4.400, 4.300, 4.300, 7.700, 2.200, 7.600, 9.600, 8.600, 6.600, 7.700), Array(2.200, 4.400,
  • 4.500, 4.400, 4.500, 2.200, 2.200, 3.400, 2.200, 4.400, 3.300, 3.300, 5.500, 1.100, 6.600, 6.500, 5.500, 3.300, 3.300, 6.600,
  • 7.700, 5.500, 4.400, 3.300, 3.300, 8.800, 10.800, 9.800, 7.700, 3.300), Array(5.500, 6.600, 5.500, 6.600, 3.300, 4.400, 5.500,
  • 4.400, 4.400, 3.300, 3.300, 5.500, 3.300, 7.700, 7.600, 6.600, 5.500, 5.500, 6.600, 7.700, 5.500, 4.400, 4.400, 3.300, 9.900,
  • 11.900, 10.900, 8.800, 4.400), Array(1.100, 2.200, 2.200, 2.200, 2.200, 2.200, 4.300, 6.600, 5.500, 6.500, 6.500, 3.300, 2.200,
  • 2.100, 2.200, 4.400, 3.300, 5.500, 6.600, 4.400, 5.500, 4.400, 6.500, 4.400, 6.400, 5.400, 3.300, 3.300), Array(1.100, 1.100,
  • 3.300, 3.300, 1.100, 3.200, 7.700, 6.600, 7.600, 7.600, 4.300, 3.300, 3.200, 3.200, 3.300, 2.200, 6.600, 7.700, 5.500, 6.600,
  • 4.400, 7.600, 5.400, 7.400, 6.400, 4.400, 2.200), Array(1.100, 3.300, 4.400, 1.100, 2.200, 8.800, 7.700, 7.700, 8.700, 3.300,
  • 4.300, 4.200, 3.100, 2.200, 1.100, 7.700, 8.800, 6.600, 7.700, 3.300, 7.700, 6.400, 8.400, 7.400, 5.400, 1.100), Array(3.300,
  • 4.400, 1.100, 3.200, 8.800, 7.700, 7.700, 7.600, 4.300, 4.200, 4.100, 3.100, 3.300, 2.200, 6.600, 7.700, 5.500, 6.600, 4.400,
  • 8.700, 6.300, 8.300, 7.300, 5.300, 2.200), Array(1.100, 2.200, 3.200, 5.500, 4.400, 5.400, 7.500, 2.100, 4.400, 4.300, 3.300,
  • 4.300, 3.300, 6.600, 6.700, 6.500, 6.500, 3.300, 5.400, 6.600, 8.600, 7.600, 5.500, 3.300), Array(3.300, 2.200, 4.400, 3.300,
  • 5.300, 7.400, 1.100, 4.400, 4.300, 3.300, 3.300, 3.300, 5.500, 6.600, 6.500, 6.400, 4.400, 4.300, 6.600, 8.600, 7.600, 5.500,
  • 4.400), Array(2.100, 7.700, 6.600, 7.600, 8.600, 3.200, 4.300, 3.200, 2.100, 2.200, 1.100, 7.700, 7.800, 6.600, 7.600, 3.300,
  • 7.600, 6.400, 8.400, 7.400, 5.400, 1.100), Array(6.600, 5.500, 5.500, 7.600, 1.100, 5.500, 4.400, 3.300, 1.100, 1.100, 7.700,
  • 7.800, 7.700, 6.600, 2.400, 5.500, 7.600, 9.600, 8.600, 6.600, 2.200), Array(1.100, 3.300, 5.300, 5.500, 6.600, 7.700, 7.700,
  • 7.700, 7.700, 4.400, 5.500, 5.400, 4.400, 7.700, 2.200, 8.700, 10.700, 9.700, 7.700, 7.700), Array(2.200, 4.200, 4.400, 5.500,
  • 6.600, 6.600, 6.600, 6.600, 3.300, 4.400, 4.300, 3.300, 6.600, 1.100, 7.600, 9.600, 8.600, 6.600, 6.600), Array(2.200, 4.400,
  • 5.500, 6.600, 6.700, 6.600, 6.600, 4.500, 4.500, 2.200, 1.100, 6.600, 2.200, 7.600, 9.600, 8.600, 6.600, 6.600), Array(5.600,
  • 4.500, 5.600, 6.700, 7.800, 7.800, 3.400, 3.300, 2.200, 1.100, 7.800, 3.400, 6.600, 8.600, 7.600, 5.600, 7.800), Array(5.500,
  • 5.400, 4.400, 2.200, 2.200, 6.600, 7.700, 6.600, 5.500, 3.400, 4.400, 7.700, 9.700, 8.700, 6.600, 3.300), Array(1.100, 2.200,
  • 5.600, 4.500, 4.400, 5.500, 3.300, 4.400, 6.600, 6.600, 2.200, 4.300, 3.300, 1.100, 4.500), Array(1.100, 4.500, 3.400, 5.500,
  • 6.600, 4.400, 5.500, 5.500, 7.700, 3.300, 5.400, 4.400, 2.200, 3.400), Array(3.400, 2.300, 6.600, 7.700, 5.500, 6.600, 4.400,
  • 7.600, 4.400, 6.500, 5.500, 3.300, 2.300), Array(1.100, 8.800, 8.900, 8.800, 7.700, 1.400, 6.600, 8.600, 10.600, 9.600, 7.600,
  • 2.200), Array(8.800, 8.900, 7.700, 7.700, 2.300, 6.600, 7.500, 9.500, 8.500, 6.500, 1.100), Array(5.100, 5.400, 5.400, 9.900,
  • 4.400, 6.400, 8.400, 7.400, 5.400, 8.800), Array(5.300, 4.300, 10.800, 5.500, 7.500, 9.500, 8.500, 6.500, 9.800), Array(1.100,
  • 7.800, 4.400, 5.400, 7.400, 6.400, 4.400, 7.700), Array(7.700, 3.300, 6.500, 8.500, 7.500, 5.500, 7.700), Array(6.600, 8.700,
  • 10.700, 9.700, 7.700, 2.200), Array(8.700, 10.700, 9.700, 7.700, 6.600), Array(2.200, 1.100, 1.100, 5.700), Array(1.100, 3.300,
  • 5.900), Array(2.200, 5.800), Array(5.600));
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String("PATH NODES BUILDER V{0} BY HUKUTA94#2589", 0.700), Right, -1000,
  • Color(White), Color(White), Color(White), Visible To, Default Visibility);
  • }
  • }
  • rule("MAP: WORKSHOP EXPANSE")
  • disabled rule("=== EXPORT BLOCK START - COPY THESE RULES AND SUBROUTINES INTO YOUR MODE ===")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • Current Map == Map(Workshop Expanse);
  • }
  • actions
  • {
  • Global.NodePositions = Array(Vector(3.904, 0.425, -7.896), Vector(8.067, 0.425, -3.922), Vector(11.961, 0.425, 0.067), Vector(
  • 12.029, 0.425, 4.173), Vector(12.137, 0.425, 8.009), Vector(8.182, 0.425, 12.017), Vector(3.818, 0.425, 16.022), Vector(0.192,
  • 0.425, 16.005), Vector(-4.009, 0.425, 12.065), Vector(-7.971, 0.425, 8.201), Vector(-8.013, 0.425, 4.153), Vector(-7.843,
  • 0.425, 0.121), Vector(-4.125, 0.425, -3.950), Vector(0.017, 0.425, -8.012), Vector(-0.028, 0.425, -11.951), Vector(-8.034,
  • 0.425, -12.082), Vector(-12.062, 0.425, 0.065), Vector(-12.022, 0.425, 8.054), Vector(-7.934, 0.425, 20.269), Vector(0.017,
  • 0.425, 20.126));
  • Global.NodeConnections = Array(Array(1), Array(2), Array(3), Array(4), Array(5), Array(6), Array(7), Array(8, 19), Array(9), Array(
  • 10, 17), Array(11), Array(12, 16), Array(13), Array(0, 14), Array(15), Array(16), Array(11, 17), Array(9, 18), Array(19),
  • Array(7));
  • Global.DistanceMatrix = Array(Array(1.130, 2.120, 3.110, 4.100, 5.900, 6.800, 7.700, 8.600, 9.500, 10.400, 11.300, 12.200, 13.100,
  • 14.600, 15.500, 12.400, 10.600, 11.900, 8.800), Array(1.130, 2.120, 3.110, 4.100, 5.900, 6.800, 7.700, 8.600, 9.500, 10.400,
  • 11.300, 12.200, 13.700, 14.600, 11.500, 9.700, 10.100, 7.900), Array(1.130, 2.120, 3.110, 4.100, 5.900, 6.800, 7.700, 8.600,
  • 9.500, 10.400, 11.300, 12.800, 13.700, 10.600, 8.800, 9.110, 6.100), Array(1.130, 2.120, 3.110, 4.100, 5.900, 6.800, 7.700,
  • 8.600, 9.500, 10.400, 11.900, 12.800, 9.700, 7.900, 8.120, 5.110), Array(1.130, 2.120, 3.110, 4.100, 5.900, 6.800, 7.700,
  • 8.600, 9.500, 10.100, 11.900, 8.800, 6.100, 7.130, 4.120), Array(1.130, 2.120, 3.110, 4.100, 5.900, 6.800, 7.700, 8.600, 9.110,
  • 10.100, 7.900, 5.110, 6.140, 3.130), Array(1.130, 2.120, 3.110, 4.100, 5.900, 6.800, 7.700, 8.120, 9.110, 6.100, 4.120, 5.150,
  • 2.140), Array(1.500, 2.400, 3.600, 4.500, 5.800, 6.700, 7.600, 8.500, 5.400, 3.300, 4.200, 1.100), Array(1.500, 2.700, 3.600,
  • 4.900, 5.800, 6.700, 7.600, 4.500, 2.400, 3.300, 4.200), Array(1.400, 2.300, 3.600, 4.500, 5.400, 6.300, 3.200, 1.100, 2.400,
  • 3.300), Array(1.400, 2.700, 3.600, 4.500, 5.400, 2.300, 3.200, 4.500, 5.400), Array(1.500, 2.400, 3.300, 4.200, 1.100, 2.300,
  • 3.600, 4.500), Array(1.500, 2.400, 3.300, 4.200, 5.400, 6.700, 7.600), Array(1.500, 2.400, 3.300, 4.500, 5.800, 6.700), Array(
  • 1.500, 2.400, 3.600, 4.900, 5.800), Array(1.500, 2.700, 3.100, 4.900), Array(1.400, 2.700, 3.600), Array(1.500, 2.400), Array(
  • 1.500));
  • }
  • }
  • rule("MAP: EICHENWALDE (HALLOWEEN)")
  • rule("MAP: WORKSHOP CHAMBER")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • Current Map == Map(Eichenwalde Halloween);
  • Current Map == Map(Workshop Chamber);
  • }
  • actions
  • {
  • Global.NodePositions = Array(Vector(-26.553, 1.425, -2.579), Vector(-27.111, -1.417, -14.037), Vector(-33.168, 2.368, -34.783),
  • Vector(-9.291, 0.972, -17.324), Vector(-0.337, 0.446, -9.841), Vector(8.453, 1.356, -7.307), Vector(14.221, 4.449, -21.979),
  • Vector(17.176, 4.425, -12.711), Vector(0.707, 1.425, -19.641), Vector(23.820, 6.425, -15.402), Vector(20.043, 9.425, -24.407),
  • Vector(29.181, 1.416, -12.051), Vector(-8.080, 2.252, -27.034), Vector(-18.858, 2.392, -34.532), Vector(-6.629, 2.425,
  • -37.146), Vector(8.297, 4.459, -34.978), Vector(7.354, 4.235, -27.385), Vector(13.519, 4.300, -27.258), Vector(21.499, 4.426,
  • -29.046), Vector(19.728, 4.433, -33.540), Vector(26.413, 4.301, -26.033), Vector(29.061, 4.440, -33.519), Vector(13.265, 4.606,
  • -40.179), Vector(24.483, 5.425, -42.156), Vector(9.342, 5.264, -47.028), Vector(-1.869, 6.425, -48.129), Vector(-3.153, 7.425,
  • -42.316), Vector(12.638, 10.133, -40.233), Vector(21.501, 5.425, -48.852), Vector(37.324, 9.925, -51.131), Vector(29.283,
  • 11.489, -70.455), Vector(22.276, 11.425, -72.760), Vector(0.373, 6.287, -56.703), Vector(-8.824, 5.425, -54.902), Vector(
  • -4.668, 6.424, -65.014), Vector(-11.094, 3.480, -72.167), Vector(-4.574, 3.995, -85.822), Vector(11.095, 6.425, -59.560),
  • Vector(22.209, 5.242, -61.770), Vector(15.451, 6.242, -70.038), Vector(3.435, 6.161, -80.397), Vector(6.210, 6.244, -68.303),
  • Vector(18.899, 6.423, -76.885), Vector(12.777, 6.436, -85.539), Vector(19.536, 9.436, -97.787), Vector(12.275, 11.436,
  • -100.472), Vector(11.093, 11.436, -90.444), Vector(10.714, 11.436, -84.402), Vector(7.314, 5.420, -95.630));
  • Global.NodeConnections = Array(Array(1), Array(0, 2, 3), Array(1, 13), Array(1, 4, 12), Array(8, 3, 5), Array(7, 11), Array(7, 8,
  • 17), Array(5, 6, 9, 11), Array(4, 6), Array(10, 7, 11, 20), Array(9, 20, 18), Array(5, 20), Array(13, 3, 14, 16), Array(2, 12),
  • Array(12, 15), Array(14, 16, 17, 22, 19), Array(15, 12), Array(16, 15, 6, 18, 22), Array(20, 17, 19), Array(18, 22, 21, 15),
  • Array(18, 11, 21), Array(23, 19, 20), Array(15, 19, 17, 23, 24, 28), Array(21, 22, 28), Array(25, 22, 28, 32, 38), Array(26,
  • 24, 32), Array(25, 27), Array(26, 19, 15, 24, 28), Array(23, 22, 24, 29, 38), Array(30, 28), Array(31, 29), Array(30, 42, 39),
  • Array(24, 33, 34, 37, 25), Array(32, 35), Array(32, 35, 40, 41), Array(33, 36), Array(35, 40, 48), Array(32, 38, 39, 41),
  • Array(37, 28, 24, 39), Array(38, 37, 41, 42, 40), Array(34, 36, 41, 43, 42, 39), Array(37, 34, 39, 40), Array(39, 43, 40),
  • Array(42, 40, 44, 48), Array(43, 45), Array(44, 46), Array(45, 47), Array(46, 40, 36, 42), Array(36, 43));
  • Global.DistanceMatrix = Array(Array(1.100, 2.200, 2.200, 3.300, 4.700, 5.500, 5.600, 4.400, 6.700, 7.700, 5.800, 3.300, 3.300,
  • 4.400, 5.500, 4.400, 6.500, 7.600, 6.600, 6.700, 7.700, 6.600, 7.700, 7.700, 8.800, 9.700, 10.600, 7.700, 8.800, 9.900, 10.100,
  • 8.800, 9.900, 9.900, 10.100, 11.110, 9.900, 8.800, 9.900, 10.100, 10.100, 10.100, 11.110, 12.120, 13.130, 14.120, 15.110,
  • 12.120), Array(1.100, 1.100, 2.200, 3.600, 4.400, 4.500, 3.300, 5.600, 6.600, 4.700, 2.200, 2.200, 3.300, 4.400, 3.300, 5.400,
  • 6.500, 5.500, 5.600, 6.600, 5.500, 6.600, 6.600, 7.700, 8.600, 9.500, 6.600, 7.700, 8.800, 9.900, 7.700, 8.800, 8.800, 9.900,
  • 10.100, 8.800, 7.700, 8.800, 9.900, 9.900, 9.900, 10.100, 11.110, 12.120, 13.110, 14.100, 11.110), Array(2.200, 3.300, 4.700,
  • 5.500, 5.600, 4.400, 6.700, 7.600, 5.700, 2.200, 1.100, 3.300, 4.400, 3.300, 5.400, 6.500, 5.500, 6.600, 6.600, 5.500, 6.600,
  • 6.600, 7.700, 8.600, 9.500, 6.600, 7.700, 8.800, 9.900, 7.700, 8.800, 8.800, 9.900, 10.100, 8.800, 7.700, 8.800, 9.900, 9.900,
  • 9.900, 10.100, 11.110, 12.120, 13.110, 14.100, 11.110), Array(1.100, 2.500, 3.300, 3.400, 2.200, 4.500, 5.500, 3.600, 1.100,
  • 2.200, 2.200, 3.300, 2.200, 4.300, 5.400, 4.400, 4.500, 5.500, 4.400, 5.500, 5.500, 6.600, 7.500, 8.400, 5.500, 6.600, 7.700,
  • 8.800, 6.600, 7.700, 7.700, 8.800, 9.900, 7.700, 6.600, 7.700, 8.800, 8.800, 8.800, 9.900, 10.100, 11.110, 12.100, 13.900,
  • 10.100), Array(1.400, 2.200, 2.300, 1.100, 3.400, 4.500, 2.500, 2.200, 3.300, 3.300, 4.400, 3.300, 3.300, 4.400, 5.500, 3.500,
  • 4.600, 4.400, 5.500, 5.500, 6.600, 7.600, 8.500, 5.500, 6.600, 7.700, 8.800, 6.600, 7.700, 7.700, 8.800, 9.900, 7.700, 6.600,
  • 7.700, 8.800, 8.800, 8.800, 9.900, 10.100, 11.110, 12.100, 13.900, 10.100), Array(2.200, 1.100, 3.200, 2.200, 3.300, 1.100,
  • 5.300, 6.400, 5.400, 4.400, 4.400, 3.300, 3.300, 4.400, 2.200, 3.300, 4.400, 4.400, 5.500, 6.600, 7.600, 8.500, 5.500, 6.600,
  • 7.700, 8.800, 6.600, 7.700, 7.700, 8.800, 9.900, 7.700, 6.600, 7.700, 8.800, 8.800, 8.800, 9.900, 10.100, 11.110, 12.100,
  • 13.900, 10.100), Array(1.100, 1.100, 2.200, 3.300, 2.300, 3.400, 4.500, 3.300, 2.200, 2.300, 1.100, 2.200, 3.300, 3.300, 4.400,
  • 2.200, 3.300, 3.300, 4.400, 5.400, 6.300, 3.300, 4.400, 5.500, 6.600, 4.400, 5.500, 5.500, 6.600, 7.700, 5.500, 4.400, 5.500,
  • 6.600, 6.600, 6.600, 7.700, 8.800, 9.900, 10.800, 11.700, 8.800), Array(2.200, 1.100, 2.200, 1.200, 4.400, 5.500, 4.400, 3.300,
  • 3.400, 2.200, 3.300, 4.400, 2.300, 3.400, 3.300, 4.400, 4.400, 5.500, 6.500, 7.400, 4.400, 5.500, 6.600, 7.700, 5.500, 6.600,
  • 6.600, 7.700, 8.800, 6.600, 5.500, 6.600, 7.700, 7.700, 7.700, 8.800, 9.900, 10.100, 11.900, 12.800, 9.900), Array(3.300,
  • 4.400, 3.400, 3.300, 4.400, 4.400, 3.300, 3.400, 2.200, 3.300, 4.400, 4.400, 5.500, 3.300, 4.400, 4.400, 5.500, 6.500, 7.400,
  • 4.400, 5.500, 6.600, 7.700, 5.500, 6.600, 6.600, 7.700, 8.800, 6.600, 5.500, 6.600, 7.700, 7.700, 7.700, 8.800, 9.900, 10.100,
  • 11.900, 12.800, 9.900), Array(1.100, 1.300, 5.500, 6.600, 5.500, 4.400, 4.500, 3.300, 2.400, 3.500, 1.400, 2.500, 4.400, 3.500,
  • 5.500, 6.600, 7.600, 8.500, 4.500, 5.600, 6.700, 7.800, 6.600, 7.700, 7.700, 8.800, 8.900, 6.700, 5.600, 6.700, 7.800, 7.800,
  • 7.800, 8.900, 9.100, 10.110, 11.100, 12.900, 9.100), Array(2.400, 4.600, 5.700, 4.600, 3.500, 3.600, 2.400, 1.500, 2.600,
  • 1.500, 2.600, 3.500, 3.600, 4.600, 5.700, 6.700, 7.600, 4.600, 5.700, 6.800, 7.900, 5.700, 6.800, 6.800, 7.900, 8.100, 6.800,
  • 5.700, 6.800, 7.900, 7.900, 7.900, 8.100, 9.110, 10.120, 11.110, 12.100, 9.110), Array(5.400, 6.500, 5.500, 4.400, 4.500,
  • 3.300, 2.200, 3.300, 1.100, 2.200, 4.400, 3.300, 5.500, 6.600, 7.500, 8.400, 4.400, 5.500, 6.600, 7.700, 6.600, 7.700, 7.700,
  • 8.800, 8.800, 6.600, 5.500, 6.600, 7.700, 7.700, 7.700, 8.800, 9.900, 10.100, 11.900, 12.800, 9.900), Array(1.100, 1.100,
  • 2.200, 1.100, 3.200, 4.300, 3.300, 5.400, 4.400, 3.300, 4.400, 4.400, 5.500, 6.400, 7.300, 4.400, 5.500, 6.600, 7.700, 5.500,
  • 6.600, 6.600, 7.700, 8.800, 6.600, 5.500, 6.600, 7.700, 7.700, 7.700, 8.800, 9.900, 10.100, 11.900, 12.800, 9.900), Array(
  • 2.200, 3.300, 2.200, 4.300, 5.400, 4.400, 6.500, 5.500, 4.400, 5.500, 5.500, 6.600, 7.500, 8.400, 5.500, 6.600, 7.700, 8.800,
  • 6.600, 7.700, 7.700, 8.800, 9.900, 7.700, 6.600, 7.700, 8.800, 8.800, 8.800, 9.900, 10.100, 11.110, 12.100, 13.900, 10.100),
  • Array(1.100, 2.200, 2.200, 3.300, 2.200, 4.400, 3.300, 2.200, 3.300, 3.300, 4.400, 5.300, 6.200, 3.300, 4.400, 5.500, 6.600,
  • 4.400, 5.500, 5.500, 6.600, 7.700, 5.500, 4.400, 5.500, 6.600, 6.600, 6.600, 7.700, 8.800, 9.900, 10.800, 11.700, 8.800),
  • Array(1.100, 1.100, 2.200, 1.100, 3.300, 2.200, 1.100, 2.200, 2.200, 3.300, 4.200, 5.100, 2.200, 3.300, 4.400, 5.500, 3.300,
  • 4.400, 4.400, 5.500, 6.600, 4.400, 3.300, 4.400, 5.500, 5.500, 5.500, 6.600, 7.700, 8.800, 9.700, 10.600, 7.700), Array(2.100,
  • 3.200, 2.200, 4.300, 3.300, 2.200, 3.300, 3.300, 4.400, 5.300, 6.200, 3.300, 4.400, 5.500, 6.600, 4.400, 5.500, 5.500, 6.600,
  • 7.700, 5.500, 4.400, 5.500, 6.600, 6.600, 6.600, 7.700, 8.800, 9.900, 10.800, 11.700, 8.800), Array(1.100, 2.200, 2.200, 3.300,
  • 1.100, 2.200, 2.200, 3.300, 4.300, 5.200, 2.200, 3.300, 4.400, 5.500, 3.300, 4.400, 4.400, 5.500, 6.600, 4.400, 3.300, 4.400,
  • 5.500, 5.500, 5.500, 6.600, 7.700, 8.800, 9.700, 10.600, 7.700), Array(1.100, 1.100, 2.200, 2.200, 3.300, 3.300, 4.400, 5.300,
  • 6.200, 3.300, 4.400, 5.500, 6.600, 4.400, 5.500, 5.500, 6.600, 7.700, 5.500, 4.400, 5.500, 6.600, 6.600, 6.600, 7.700, 8.800,
  • 9.900, 10.800, 11.700, 8.800), Array(2.200, 1.100, 1.100, 2.200, 2.200, 3.300, 4.200, 5.100, 2.200, 3.300, 4.400, 5.500, 3.300,
  • 4.400, 4.400, 5.500, 6.600, 4.400, 3.300, 4.400, 5.500, 5.500, 5.500, 6.600, 7.700, 8.800, 9.700, 10.600, 7.700), Array(1.100,
  • 3.300, 2.200, 4.400, 5.500, 6.400, 7.300, 3.300, 4.400, 5.500, 6.600, 5.500, 6.600, 6.600, 7.700, 7.700, 5.500, 4.400, 5.500,
  • 6.600, 6.600, 6.600, 7.700, 8.800, 9.900, 10.800, 11.700, 8.800), Array(2.200, 1.100, 3.300, 4.400, 5.300, 6.200, 2.200, 3.300,
  • 4.400, 5.500, 4.400, 5.500, 5.500, 6.600, 6.600, 4.400, 3.300, 4.400, 5.500, 5.500, 5.500, 6.600, 7.700, 8.800, 9.700, 10.600,
  • 7.700), Array(1.100, 1.100, 2.200, 3.300, 4.200, 1.100, 2.200, 3.300, 4.400, 2.200, 3.300, 3.300, 4.400, 5.500, 3.300, 2.200,
  • 3.300, 4.400, 4.400, 4.400, 5.500, 6.600, 7.700, 8.600, 9.500, 6.600), Array(2.200, 3.300, 4.300, 5.200, 1.100, 2.200, 3.300,
  • 4.400, 3.300, 4.400, 4.400, 5.500, 5.500, 3.300, 2.200, 3.300, 4.400, 4.400, 4.400, 5.500, 6.600, 7.700, 8.600, 9.500, 6.600),
  • Array(1.100, 2.200, 3.100, 1.100, 2.200, 3.300, 4.300, 1.100, 2.200, 2.200, 3.300, 4.400, 2.200, 1.100, 2.200, 3.300, 3.300,
  • 3.300, 4.400, 5.500, 6.600, 7.500, 8.400, 5.500), Array(1.100, 2.200, 2.200, 3.300, 4.400, 5.400, 1.100, 2.200, 2.200, 3.300,
  • 4.400, 2.200, 2.200, 3.300, 3.300, 3.300, 4.400, 4.400, 5.500, 6.600, 7.500, 8.400, 5.500), Array(1.100, 2.300, 3.400, 4.500,
  • 5.500, 2.200, 3.300, 3.300, 4.400, 5.500, 3.300, 3.300, 4.400, 4.400, 4.400, 5.500, 5.500, 6.600, 7.700, 8.600, 9.500, 6.600),
  • Array(1.400, 2.500, 3.600, 4.600, 2.300, 3.400, 3.400, 4.500, 5.600, 3.400, 2.400, 3.500, 4.500, 4.500, 4.600, 5.600, 6.700,
  • 7.800, 8.700, 9.600, 6.700), Array(1.100, 2.200, 3.300, 2.200, 3.300, 3.300, 4.400, 4.400, 2.200, 1.100, 2.200, 3.300, 3.300,
  • 3.300, 4.400, 5.500, 6.600, 7.500, 8.400, 5.500), Array(1.100, 2.200, 3.300, 4.400, 4.400, 5.500, 5.500, 3.300, 2.200, 3.300,
  • 4.400, 4.400, 3.400, 4.500, 5.600, 6.700, 7.600, 8.500, 5.600), Array(1.100, 4.400, 5.500, 4.500, 5.600, 4.600, 3.400, 3.300,
  • 2.400, 3.500, 3.500, 2.500, 3.600, 4.700, 5.800, 6.700, 7.600, 4.700), Array(3.500, 4.600, 3.600, 4.700, 3.700, 2.500, 2.400,
  • 1.500, 2.600, 2.600, 1.600, 2.700, 3.800, 4.900, 5.800, 6.700, 3.800), Array(1.100, 1.100, 2.200, 3.300, 1.100, 2.200, 2.200,
  • 2.200, 2.200, 3.300, 3.300, 4.400, 5.500, 6.400, 7.300, 4.400), Array(2.200, 1.100, 2.200, 2.200, 3.300, 3.300, 3.300, 3.300,
  • 4.400, 4.400, 5.500, 6.500, 7.400, 8.300, 3.300), Array(1.300, 2.200, 2.200, 3.300, 2.200, 1.100, 1.100, 2.200, 2.200, 3.300,
  • 4.400, 5.300, 6.200, 3.300), Array(1.100, 3.300, 4.400, 3.300, 2.200, 3.200, 3.300, 3.300, 4.400, 5.400, 6.300, 7.200, 2.200),
  • Array(3.300, 3.300, 2.200, 1.100, 2.200, 2.200, 2.200, 3.300, 4.300, 5.200, 6.100, 1.100), Array(1.100, 1.100, 2.200, 1.100,
  • 2.200, 3.300, 4.400, 5.500, 6.400, 7.300, 4.400), Array(1.100, 2.200, 2.200, 2.200, 3.300, 4.400, 5.500, 6.400, 7.300, 4.400),
  • Array(1.100, 1.100, 1.100, 2.200, 3.300, 4.400, 5.300, 6.200, 3.300), Array(1.100, 1.100, 1.100, 2.200, 3.300, 4.200, 5.100,
  • 2.200), Array(2.200, 2.200, 3.300, 4.400, 5.300, 6.200, 3.300), Array(1.100, 2.200, 3.300, 4.200, 5.100, 2.200), Array(1.100,
  • 2.200, 3.300, 4.200, 1.100), Array(1.100, 2.200, 3.300, 2.200), Array(1.100, 2.200, 3.300), Array(1.100, 3.400), Array(2.500));
  • Global.NodePositions = Array(Vector(-0.252, 0.425, -0.037), Vector(15.690, 0.425, 16.016), Vector(-15.527, 0.425, 15.911), Vector(
  • 15.794, 0.425, -15.756), Vector(-15.781, 0.425, -15.775), Vector(-15.802, 0.425, -0.052), Vector(-0.262, 0.425, -15.790),
  • Vector(15.637, 0.425, -0.001), Vector(0.197, 0.425, 15.665), Vector(-8.102, 0.425, -7.910), Vector(8.013, 0.425, -7.859),
  • Vector(7.978, 0.425, 8.089), Vector(-8.046, 0.425, 8.175));
  • Global.NodeConnections = Array(Array(6, 5, 7, 11, 8, 12, 9, 10), Array(7, 11, 8), Array(8, 12, 5), Array(10, 6, 7), Array(9, 6, 5),
  • Array(2, 12, 9, 4), Array(9, 4, 10, 3), Array(10, 3, 11, 1), Array(1, 11, 12, 2, 0), Array(6, 4, 5, 0), Array(6, 3, 7, 0),
  • Array(8, 7, 1, 0), Array(2, 5, 8, 0));
  • Global.DistanceMatrix = Array(Array(9999, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1), Array(2, 9999, 2, 2, 4, 3, 3, 1, 1, 3, 2, 1, 2),
  • Array(2, 2, 9999, 4, 2, 1, 3, 3, 1, 2, 3, 2, 1), Array(2, 2, 4, 9999, 2, 3, 1, 1, 3, 2, 1, 2, 3), Array(2, 4, 2, 2, 9999, 1, 1,
  • 3, 3, 1, 2, 3, 2), Array(2, 3, 1, 3, 1, 9999, 2, 3, 2, 1, 3, 3, 1), Array(2, 3, 3, 1, 1, 2, 9999, 2, 3, 1, 1, 3, 3), Array(2,
  • 1, 3, 1, 3, 3, 2, 9999, 2, 3, 1, 1, 3), Array(1, 1, 1, 3, 3, 2, 2, 2, 9999, 2, 2, 1, 1), Array(1, 3, 2, 2, 1, 1, 1, 2, 2, 9999,
  • 2, 2, 2), Array(1, 2, 3, 1, 2, 2, 1, 1, 2, 2, 9999, 2, 2), Array(1, 1, 2, 2, 3, 2, 2, 1, 1, 2, 2, 9999, 2), Array(1, 2, 1, 3,
  • 2, 1, 2, 2, 1, 2, 2, 2, 9999));
  • }
  • }
  • rule("MAP: WORKSHOP ISLAND")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • Current Map == Map(Workshop Island);
  • }
  • actions
  • {
  • Global.NodePositions = Array(Vector(-16.004, 0.350, -15.965), Vector(-15.994, 0.350, -0.043), Vector(-15.981, 0.350, 15.908),
  • Vector(15.941, 0.350, 16.021), Vector(15.980, 0.350, -15.878), Vector(-1.423, 0.350, -16.035), Vector(-1.225, 0.350, 4.747),
  • Vector(7.259, 0.350, -0.358));
  • Global.NodeConnections = Array(Array(5, 1, 6), Array(0, 2), Array(3, 1), Array(2, 6, 4), Array(5, 3, 7), Array(4, 0, 7), Array(0,
  • 3, 7), Array(6, 5, 4));
  • Global.DistanceMatrix = Array(Array(1, 2, 2, 2, 1, 1, 2), Array(1, 2, 3, 2, 2, 3), Array(1, 2, 3, 2, 3), Array(1, 2, 1, 2), Array(
  • 1, 2, 1), Array(2, 1), Array(1));
  • Global.DistanceMatrix = Array(Array(9999, 1, 2, 2, 2, 1, 1, 2), Array(1, 9999, 1, 2, 3, 2, 2, 3), Array(2, 1, 9999, 1, 2, 3, 2, 3),
  • Array(2, 2, 1, 9999, 1, 2, 1, 2), Array(2, 3, 2, 1, 9999, 1, 2, 1), Array(1, 2, 3, 2, 1, 9999, 2, 1), Array(1, 2, 2, 1, 2, 2,
  • 9999, 1), Array(2, 3, 3, 2, 1, 1, 1, 9999));
  • }
  • }
  • rule("MAP: DORADO")
  • rule("MAP: HAVANA")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • Current Map == Map(Dorado);
  • Current Map == Map(Havana);
  • }
  • actions
  • {
  • Global.NodePositions = Array(Vector(8.401, 0.380, -9.799), Vector(7.707, 0.435, 3.016), Vector(17.426, 1.429, 2.343), Vector(
  • 22.510, 1.253, 2.704), Vector(23.883, 3.942, -8.587), Vector(14.201, 1.425, -9.417), Vector(20.981, 9.925, -2.967), Vector(
  • 30.046, 1.446, 9.573), Vector(20.292, 1.253, 8.606), Vector(23.575, 1.445, 12.834), Vector(29.855, 1.446, 13.274), Vector(
  • 29.878, 1.447, 18.947), Vector(16.222, 9.925, 15.902), Vector(21.425, -1.535, 20.537), Vector(13.137, -1.555, 24.317), Vector(
  • 3.130, -1.555, 22.100), Vector(3.211, 0.235, 9.522), Vector(32.481, 4.275, -16.174), Vector(32.284, 3.372, -6.845), Vector(
  • 39.109, 3.425, -6.159), Vector(38.998, 2.425, 2.612), Vector(39.023, 2.437, 10.992), Vector(46.661, 2.425, 3.847), Vector(
  • 46.120, 2.425, 11.185), Vector(46.853, 2.425, 18.897), Vector(32.909, 10.846, 22.342), Vector(54.779, 5.425, 14.219), Vector(
  • 55.102, 9.425, 3.700), Vector(60.248, 9.425, 9.405), Vector(36.684, 10.861, -7.802), Vector(38.819, 9.425, 2.853));
  • Global.NodeConnections = Array(Array(5, 1), Array(0, 2, 16), Array(5, 1, 3, 8), Array(4, 2, 8, 7, 18), Array(5, 3, 18, 17), Array(
  • 0, 2, 4), Array(4, 3, 8, 7, 18), Array(10, 8, 3, 18), Array(9, 3, 7, 2, 16), Array(8, 10), Array(11, 9, 7), Array(13, 10, 24),
  • Array(8, 9, 11), Array(14, 11), Array(15, 13), Array(16, 14), Array(15, 8, 1), Array(18, 4), Array(7, 3, 4, 17, 19), Array(18,
  • 20), Array(22, 19, 21), Array(20, 23), Array(20, 23), Array(21, 22, 24), Array(11, 23, 26), Array(10, 24, 11), Array(27, 24,
  • 23), Array(30, 23, 26, 28), Array(27, 26, 23), Array(18, 30), Array(29, 27));
  • Global.DistanceMatrix = Array(Array(1.100, 2.200, 3.300, 2.200, 1.100, 0.300, 4.400, 3.300, 4.400, 5.500, 6.600, 0.400, 5.500,
  • 4.400, 3.300, 2.200, 3.300, 3.300, 4.400, 5.500, 6.600, 6.600, 7.700, 7.700, 0.600, 8.700, 9.600, 10.700, 11.400, 10.500),
  • Array(1.100, 2.200, 3.300, 2.200, 0.300, 3.300, 2.200, 3.300, 4.400, 5.500, 0.300, 4.400, 3.300, 2.200, 1.100, 4.400, 3.300,
  • 4.400, 5.500, 6.600, 6.600, 7.700, 6.600, 0.500, 7.700, 8.600, 9.700, 10.400, 9.500), Array(1.100, 2.200, 1.100, 0.200, 2.200,
  • 1.100, 2.200, 3.300, 4.400, 0.200, 5.500, 4.400, 3.300, 2.200, 3.300, 2.200, 3.300, 4.400, 5.500, 5.500, 6.600, 5.500, 0.400,
  • 6.600, 7.500, 8.600, 9.300, 8.400), Array(1.100, 2.200, 0.100, 1.100, 1.100, 2.200, 2.200, 3.300, 0.200, 4.400, 4.400, 3.300,
  • 2.200, 2.200, 1.100, 2.200, 3.300, 4.400, 4.400, 5.500, 4.400, 0.300, 5.500, 6.400, 7.500, 8.200, 7.300), Array(1.100, 0.100,
  • 2.200, 2.200, 3.300, 3.300, 4.400, 0.300, 5.500, 5.500, 4.400, 3.300, 1.100, 1.100, 2.200, 3.300, 4.400, 4.400, 5.500, 5.500,
  • 0.400, 6.500, 7.400, 8.500, 9.200, 8.300), Array(0.200, 3.300, 2.200, 3.300, 4.400, 5.500, 0.300, 6.600, 5.500, 4.400, 3.300,
  • 2.200, 2.200, 3.300, 4.400, 5.500, 5.500, 6.600, 6.600, 0.500, 7.600, 8.500, 9.600, 10.300, 9.400), Array(1, 1, 2, 2, 3, 0, 4,
  • 4, 3, 2, 2, 1, 2, 3, 4, 4, 5, 4, 0, 5, 6, 7, 8, 7), Array(1.100, 2.200, 1.100, 2.200, 0.200, 3.300, 4.400, 3.300, 2.200, 2.200,
  • 1.100, 2.200, 3.300, 4.400, 4.400, 4.400, 3.300, 0.200, 4.400, 5.400, 6.500, 7.200, 6.300), Array(1.100, 2.200, 3.300, 0.100,
  • 4.400, 3.300, 2.200, 1.100, 3.300, 2.200, 3.300, 4.400, 5.500, 5.500, 5.500, 4.400, 0.300, 5.500, 6.500, 7.600, 8.300, 7.400),
  • Array(1.100, 2.200, 0.100, 3.300, 4.400, 3.300, 2.200, 4.400, 3.300, 4.400, 5.500, 5.500, 5.500, 4.400, 3.300, 0.200, 4.400,
  • 5.500, 6.500, 7.400, 6.500), Array(1.100, 0.200, 2.200, 3.300, 4.400, 3.300, 3.300, 2.200, 3.300, 4.400, 4.400, 4.400, 3.300,
  • 2.200, 0.100, 3.300, 4.400, 5.400, 6.300, 5.400), Array(0.100, 1.100, 2.200, 3.300, 4.400, 4.400, 3.300, 4.400, 4.400, 3.300,
  • 3.300, 2.200, 1.100, 0.100, 2.200, 3.300, 4.300, 5.400, 4.400), Array(2, 3, 3, 2, 4, 3, 4, 5, 4, 4, 3, 2, 0, 3, 4, 5, 6, 5),
  • Array(1.100, 2.200, 3.300, 5.500, 4.400, 5.500, 5.500, 4.400, 4.400, 3.300, 2.200, 0.200, 3.300, 4.400, 5.400, 6.500, 5.500),
  • Array(1.100, 2.200, 6.600, 5.500, 6.600, 6.600, 5.500, 5.500, 4.400, 3.300, 0.300, 4.400, 5.500, 6.500, 7.600, 6.600), Array(
  • 1.100, 5.500, 4.400, 5.500, 6.600, 6.600, 6.600, 5.500, 4.400, 0.400, 5.500, 6.600, 7.600, 8.500, 7.600), Array(4.400, 3.300,
  • 4.400, 5.500, 6.600, 6.600, 6.600, 5.500, 0.400, 6.600, 7.600, 8.700, 9.400, 8.500), Array(1.100, 2.200, 3.300, 4.400, 4.400,
  • 5.500, 5.500, 0.400, 6.500, 7.400, 8.500, 9.200, 8.300), Array(1.100, 2.200, 3.300, 3.300, 4.400, 4.400, 0.300, 5.400, 6.300,
  • 7.400, 8.100, 7.200), Array(1.100, 2.200, 2.200, 3.300, 4.400, 0.400, 5.400, 6.400, 7.400, 8.200, 7.300), Array(1.100, 1.100,
  • 2.200, 3.300, 0.400, 4.300, 5.300, 6.300, 7.300, 6.400), Array(2.200, 1.100, 2.200, 0.300, 3.200, 4.200, 5.200, 6.400, 5.300),
  • Array(1.100, 2.200, 0.300, 3.200, 4.200, 5.200, 6.400, 5.300), Array(1.100, 0.200, 2.100, 3.100, 4.100, 5.300, 4.200), Array(
  • 0.100, 1.100, 2.200, 3.200, 4.400, 3.300), Array(2, 3, 4, 5, 4), Array(1.100, 2.100, 3.300, 2.200), Array(1.100, 2.200, 1.100),
  • Array(3.300, 2.200), Array(1.100));
  • Global.NodePositions = Array(Vector(113.402, 7.319, -57.302), Vector(147.588, 6.425, -46.749), Vector(136.181, 6.425, -57.159),
  • Vector(130.189, 6.425, -63.781), Vector(123.305, 6.425, -57.983), Vector(125.678, 6.504, -46.633), Vector(146.311, 9.444,
  • -61.382), Vector(114.485, 7.471, -46.699), Vector(138.743, 6.425, -32.974), Vector(126.498, 6.425, -39.920), Vector(148.529,
  • 9.425, -28.549), Vector(134.970, 10.396, -27.167), Vector(124.572, 10.434, -34.300), Vector(138.605, 5.359, -18.647), Vector(
  • 119.009, 2.331, -31.024), Vector(121.138, 5.228, -19.933), Vector(126.722, 6.425, -29.505), Vector(102.762, 3.157, -33.609),
  • Vector(76.030, 7.418, -74.087), Vector(83.720, 9.425, -33.744), Vector(97.439, 7.238, -42.379), Vector(86.252, 12.416,
  • -47.261), Vector(65.178, 11.425, -73.187), Vector(97.466, 7.269, -50.596), Vector(113.039, 7.424, -37.337), Vector(106.179,
  • 7.450, -46.143), Vector(90.086, 7.411, -44.653), Vector(78.752, 7.418, -62.140), Vector(82.124, 7.428, -44.229), Vector(90.675,
  • 7.231, -51.234), Vector(85.717, 4.692, -63.446), Vector(90.830, 4.330, -70.697), Vector(95.569, 3.646, -79.682), Vector(
  • 102.425, 2.387, -72.817), Vector(81.443, 4.425, -81.648), Vector(70.743, 6.418, -81.495), Vector(69.738, 6.419, -96.344),
  • Vector(78.682, 5.418, -96.160), Vector(153.887, 18.628, -22.387), Vector(127.586, 12.643, -63.344), Vector(118.911, 13.468,
  • -58.008), Vector(102.885, 1.092, -56.579), Vector(100.009, 2.967, -67.139), Vector(106.703, 0.465, -44.628), Vector(81.695,
  • 7.418, -52.140), Vector(125.118, 12.445, -57.134));
  • Global.NodeConnections = Array(Array(4, 7, 41), Array(2, 8, 5, 9), Array(3, 6, 1, 5, 8, 9), Array(2, 4), Array(3, 5, 1), Array(4,
  • 2, 7, 9, 8, 1), Array(2, 39), Array(5, 9, 24, 25, 23), Array(9, 10, 1, 5, 2, 13, 16), Array(5, 7, 8, 1, 2, 16), Array(8, 11),
  • Array(10, 8, 12), Array(11, 9), Array(8, 15), Array(15, 17), Array(13, 14, 17), Array(8, 14), Array(14, 20, 43), Array(22, 27,
  • 35), Array(21, 28), Array(17, 23, 26, 25, 29, 7), Array(19, 26, 20, 29, 25), Array(18), Array(20, 25, 26, 30, 31, 42, 29, 7),
  • Array(7, 17, 14), Array(23, 20, 7, 17, 26, 41), Array(20, 23, 25, 28, 29), Array(18, 29, 30), Array(26, 19, 44), Array(27, 26,
  • 23, 20, 30, 31, 42, 44), Array(29, 23, 31, 42, 34), Array(23, 30, 29, 32, 34, 42), Array(33, 31, 34), Array(32, 42, 41), Array(
  • 32, 31, 30, 35, 37), Array(34, 18, 36), Array(35, 34), Array(34), Array(), Array(6, 40, 45), Array(39, 41, 45), Array(42, 43,
  • 33), Array(33, 23, 29, 31, 30, 41), Array(17, 41), Array(29, 27, 28), Array(39, 40, 5, 2, 1, 8));
  • Global.DistanceMatrix = Array(Array(9999, 2, 3, 2, 1, 2, 4, 1, 3, 2, 4, 5, 6, 4, 3, 4, 3, 3, 5, 5, 3, 6, 6, 2, 2, 2, 3, 4, 4, 3, 3,
  • 3, 3, 2, 4, 5, 6, 5, 0, 5, 6, 1, 2, 2, 4, 6), Array(0, 9999, 1, 2, 2, 1, 2, 2, 1, 1, 2, 3, 4, 2, 3, 3, 2, 4, 6, 6, 4, 7, 7, 3,
  • 3, 3, 4, 5, 5, 4, 4, 4, 5, 5, 5, 6, 7, 6, 0, 3, 4, 4, 4, 5, 5, 4), Array(0, 1, 9999, 1, 2, 1, 1, 2, 1, 1, 2, 3, 4, 2, 3, 3, 2,
  • 4, 6, 6, 4, 7, 7, 3, 3, 3, 4, 5, 5, 4, 4, 4, 5, 5, 5, 6, 7, 6, 0, 2, 3, 4, 4, 5, 5, 3), Array(0, 2, 1, 9999, 1, 2, 2, 3, 2, 2,
  • 3, 4, 5, 3, 4, 4, 3, 5, 7, 7, 5, 8, 8, 4, 4, 4, 5, 6, 6, 5, 5, 5, 6, 6, 6, 7, 8, 7, 0, 3, 4, 5, 5, 6, 6, 4), Array(0, 1, 2, 1,
  • 9999, 1, 3, 2, 2, 2, 3, 4, 5, 3, 4, 4, 3, 4, 6, 6, 4, 7, 7, 3, 3, 3, 4, 5, 5, 4, 4, 4, 5, 5, 5, 6, 7, 6, 0, 4, 5, 4, 4, 5, 5,
  • 5), Array(0, 1, 1, 2, 1, 9999, 2, 1, 1, 1, 2, 3, 4, 2, 3, 3, 2, 3, 5, 5, 3, 6, 6, 2, 2, 2, 3, 4, 4, 3, 3, 3, 4, 4, 4, 5, 6, 5,
  • 0, 3, 4, 3, 3, 4, 4, 4), Array(0, 2, 1, 2, 3, 2, 9999, 3, 2, 2, 3, 4, 5, 3, 4, 4, 3, 5, 7, 7, 5, 8, 8, 4, 4, 4, 5, 6, 6, 5, 5,
  • 5, 5, 4, 6, 7, 8, 7, 0, 1, 2, 3, 4, 4, 6, 2), Array(0, 2, 2, 3, 2, 1, 3, 9999, 2, 1, 3, 4, 5, 3, 2, 3, 2, 2, 4, 4, 2, 5, 5, 1,
  • 1, 1, 2, 3, 3, 2, 2, 2, 3, 3, 3, 4, 5, 4, 0, 4, 5, 2, 2, 3, 3, 5), Array(0, 1, 1, 2, 2, 1, 2, 2, 9999, 1, 1, 2, 3, 1, 2, 2, 1,
  • 3, 6, 6, 4, 7, 7, 3, 3, 3, 4, 5, 5, 4, 4, 4, 5, 5, 5, 6, 7, 6, 0, 3, 4, 4, 4, 4, 5, 4), Array(0, 1, 1, 2, 2, 1, 2, 1, 1, 9999,
  • 2, 3, 4, 2, 2, 3, 1, 3, 5, 5, 3, 6, 6, 2, 2, 2, 3, 4, 4, 3, 3, 3, 4, 4, 4, 5, 6, 5, 0, 3, 4, 3, 3, 4, 4, 4), Array(0, 2, 2, 3,
  • 3, 2, 3, 3, 1, 2, 9999, 1, 2, 2, 3, 3, 2, 4, 7, 7, 5, 8, 8, 4, 4, 4, 5, 6, 6, 5, 5, 5, 6, 6, 6, 7, 8, 7, 0, 4, 5, 5, 5, 5, 6,
  • 5), Array(0, 2, 2, 3, 3, 2, 3, 3, 1, 2, 1, 9999, 1, 2, 3, 3, 2, 4, 7, 7, 5, 8, 8, 4, 4, 4, 5, 6, 6, 5, 5, 5, 6, 6, 6, 7, 8, 7,
  • 0, 4, 5, 5, 5, 5, 6, 5), Array(0, 2, 2, 3, 3, 2, 3, 2, 2, 1, 2, 1, 9999, 3, 3, 4, 2, 4, 6, 6, 4, 7, 7, 3, 3, 3, 4, 5, 5, 4, 4,
  • 4, 5, 5, 5, 6, 7, 6, 0, 4, 5, 4, 4, 5, 5, 5), Array(0, 2, 2, 3, 3, 2, 3, 3, 1, 2, 2, 3, 4, 9999, 2, 1, 2, 2, 6, 6, 3, 7, 7, 4,
  • 4, 4, 4, 5, 5, 4, 5, 5, 6, 5, 6, 7, 8, 7, 0, 4, 5, 4, 5, 3, 5, 5), Array(0, 4, 4, 5, 5, 4, 5, 3, 3, 4, 4, 5, 6, 2, 9999, 1, 4,
  • 1, 5, 5, 2, 6, 6, 3, 4, 3, 3, 4, 4, 3, 4, 4, 5, 4, 5, 6, 7, 6, 0, 6, 7, 3, 4, 2, 4, 7), Array(0, 3, 3, 4, 4, 3, 4, 3, 2, 3, 3,
  • 4, 5, 1, 1, 9999, 3, 1, 5, 5, 2, 6, 6, 3, 4, 3, 3, 4, 4, 3, 4, 4, 5, 4, 5, 6, 7, 6, 0, 5, 6, 3, 4, 2, 4, 6), Array(0, 2, 2, 3,
  • 3, 2, 3, 3, 1, 2, 2, 3, 4, 2, 1, 2, 9999, 2, 6, 6, 3, 7, 7, 4, 4, 4, 4, 5, 5, 4, 5, 5, 6, 5, 6, 7, 8, 7, 0, 4, 5, 4, 5, 3, 5,
  • 5), Array(0, 4, 4, 5, 4, 3, 5, 2, 4, 3, 5, 6, 7, 3, 1, 2, 4, 9999, 4, 4, 1, 5, 5, 2, 3, 2, 2, 3, 3, 2, 3, 3, 4, 3, 4, 5, 6, 5,
  • 0, 6, 7, 2, 3, 1, 3, 7), Array(0, 6, 6, 7, 6, 5, 7, 4, 6, 5, 7, 8, 9, 7, 5, 6, 6, 4, 9999, 5, 3, 6, 1, 3, 5, 4, 3, 1, 4, 2, 2,
  • 3, 3, 4, 2, 1, 2, 3, 0, 8, 9, 4, 3, 5, 3, 9), Array(0, 5, 5, 6, 5, 4, 6, 3, 5, 4, 6, 7, 8, 6, 4, 5, 5, 3, 4, 9999, 2, 1, 5, 3,
  • 4, 2, 2, 3, 1, 2, 3, 3, 4, 4, 4, 5, 6, 5, 0, 7, 8, 3, 3, 4, 2, 8), Array(0, 3, 3, 4, 3, 2, 4, 1, 3, 2, 4, 5, 6, 4, 2, 3, 3, 1,
  • 3, 3, 9999, 4, 4, 1, 2, 1, 1, 2, 2, 1, 2, 2, 3, 3, 3, 4, 5, 4, 0, 5, 6, 2, 2, 2, 2, 6), Array(0, 4, 4, 5, 4, 3, 5, 2, 4, 3, 5,
  • 6, 7, 5, 3, 4, 4, 2, 3, 1, 1, 9999, 4, 2, 3, 1, 1, 2, 2, 1, 2, 2, 3, 3, 3, 4, 5, 4, 0, 6, 7, 2, 2, 3, 2, 7), Array(0, 7, 7, 8,
  • 7, 6, 8, 5, 7, 6, 8, 9, 10, 8, 6, 7, 7, 5, 1, 6, 4, 7, 9999, 4, 6, 5, 4, 2, 5, 3, 3, 4, 4, 5, 3, 2, 3, 4, 0, 9, 10, 5, 4, 6, 4,
  • 10), Array(0, 3, 3, 4, 3, 2, 4, 1, 3, 2, 4, 5, 6, 4, 3, 4, 3, 2, 3, 3, 1, 4, 4, 9999, 2, 1, 1, 2, 2, 1, 1, 1, 2, 2, 2, 3, 4, 3,
  • 0, 5, 6, 2, 1, 3, 2, 6), Array(0, 3, 3, 4, 3, 2, 4, 1, 3, 2, 4, 5, 6, 3, 1, 2, 3, 1, 5, 5, 2, 6, 6, 2, 9999, 2, 3, 4, 4, 3, 3,
  • 3, 4, 4, 4, 5, 6, 5, 0, 5, 6, 3, 3, 2, 4, 6), Array(0, 3, 3, 4, 3, 2, 4, 1, 3, 2, 4, 5, 6, 4, 2, 3, 3, 1, 4, 3, 1, 4, 5, 1, 2,
  • 9999, 1, 3, 2, 2, 2, 2, 3, 2, 3, 4, 5, 4, 0, 5, 6, 1, 2, 2, 3, 6), Array(0, 4, 4, 5, 4, 3, 5, 2, 4, 3, 5, 6, 7, 5, 3, 4, 4, 2,
  • 3, 2, 1, 3, 4, 1, 3, 1, 9999, 2, 1, 1, 2, 2, 3, 3, 3, 4, 5, 4, 0, 6, 7, 2, 2, 3, 2, 7), Array(0, 5, 5, 6, 5, 4, 6, 3, 5, 4, 6,
  • 7, 8, 6, 4, 5, 5, 3, 1, 4, 2, 5, 2, 2, 4, 3, 2, 9999, 3, 1, 1, 2, 3, 3, 2, 2, 3, 3, 0, 7, 8, 3, 2, 4, 2, 8), Array(0, 5, 5, 6,
  • 5, 4, 6, 3, 5, 4, 6, 7, 8, 6, 4, 5, 5, 3, 3, 1, 2, 2, 4, 2, 4, 2, 1, 2, 9999, 2, 3, 3, 4, 4, 4, 4, 5, 5, 0, 7, 8, 3, 3, 4, 1,
  • 8), Array(0, 4, 4, 5, 4, 3, 5, 2, 4, 3, 5, 6, 7, 5, 3, 4, 4, 2, 2, 3, 1, 4, 3, 1, 3, 2, 1, 1, 2, 9999, 1, 1, 2, 2, 2, 3, 4, 3,
  • 0, 6, 7, 2, 1, 3, 1, 7), Array(0, 4, 4, 5, 4, 3, 5, 2, 4, 3, 5, 6, 7, 5, 4, 5, 4, 3, 3, 4, 2, 5, 4, 1, 3, 2, 2, 2, 3, 1, 9999,
  • 1, 2, 2, 1, 2, 3, 2, 0, 6, 7, 2, 1, 3, 2, 7), Array(0, 4, 4, 5, 4, 3, 5, 2, 4, 3, 5, 6, 7, 5, 4, 5, 4, 3, 3, 4, 2, 5, 4, 1, 3,
  • 2, 2, 2, 3, 1, 1, 9999, 1, 2, 1, 2, 3, 2, 0, 6, 7, 2, 1, 3, 2, 7), Array(0, 5, 5, 6, 5, 4, 6, 3, 5, 4, 6, 7, 8, 6, 5, 6, 5, 4,
  • 3, 5, 3, 6, 4, 2, 4, 3, 3, 3, 4, 2, 2, 1, 9999, 1, 1, 2, 3, 2, 0, 7, 8, 2, 2, 3, 3, 8), Array(0, 5, 5, 6, 5, 4, 6, 3, 5, 4, 6,
  • 7, 8, 6, 4, 5, 5, 3, 4, 5, 3, 6, 5, 2, 4, 3, 3, 3, 4, 2, 2, 2, 1, 9999, 2, 3, 4, 3, 0, 7, 8, 1, 1, 2, 3, 8), Array(0, 5, 5, 6,
  • 5, 4, 6, 3, 5, 4, 6, 7, 8, 6, 5, 6, 5, 4, 2, 5, 3, 6, 3, 2, 4, 3, 3, 3, 4, 2, 1, 1, 1, 2, 9999, 1, 2, 1, 0, 7, 8, 3, 2, 4, 3,
  • 8), Array(0, 6, 6, 7, 6, 5, 7, 4, 6, 5, 7, 8, 9, 7, 6, 7, 6, 5, 1, 6, 4, 7, 2, 3, 5, 4, 4, 2, 5, 3, 2, 2, 2, 3, 1, 9999, 1, 2,
  • 0, 8, 9, 4, 3, 5, 4, 9), Array(0, 6, 6, 7, 6, 5, 7, 4, 6, 5, 7, 8, 9, 7, 6, 7, 6, 5, 2, 6, 4, 7, 3, 3, 5, 4, 4, 3, 5, 3, 2, 2,
  • 2, 3, 1, 1, 9999, 2, 0, 8, 9, 4, 3, 5, 4, 9), Array(0, 6, 6, 7, 6, 5, 7, 4, 6, 5, 7, 8, 9, 7, 6, 7, 6, 5, 3, 6, 4, 7, 4, 3, 5,
  • 4, 4, 4, 5, 3, 2, 2, 2, 3, 1, 2, 3, 9999, 0, 8, 9, 4, 3, 5, 4, 9), Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  • 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9999), Array(0, 2, 2, 3, 3, 2, 1, 3, 2, 3, 3, 4, 5, 3, 4, 4, 3, 4,
  • 6, 7, 5, 8, 7, 4, 4, 4, 5, 5, 6, 4, 4, 4, 4, 3, 5, 6, 7, 6, 0, 9999, 1, 2, 3, 3, 5, 1), Array(0, 2, 2, 3, 3, 2, 2, 3, 2, 3, 3,
  • 4, 5, 3, 4, 4, 3, 3, 5, 6, 4, 7, 6, 3, 4, 4, 4, 4, 5, 3, 3, 3, 3, 2, 4, 5, 6, 5, 0, 1, 9999, 1, 2, 2, 4, 1), Array(0, 5, 5, 6,
  • 5, 4, 6, 3, 5, 4, 6, 7, 8, 5, 3, 4, 5, 2, 4, 5, 3, 6, 5, 2, 4, 3, 3, 3, 4, 2, 2, 2, 2, 1, 3, 4, 5, 4, 0, 7, 8, 9999, 1, 1, 3,
  • 8), Array(0, 4, 4, 5, 4, 3, 5, 2, 4, 3, 5, 6, 7, 5, 4, 5, 4, 3, 3, 4, 2, 5, 4, 1, 3, 2, 2, 2, 3, 1, 1, 1, 2, 1, 2, 3, 4, 3, 0,
  • 6, 7, 1, 9999, 2, 2, 7), Array(0, 5, 5, 6, 5, 4, 6, 3, 5, 4, 6, 7, 8, 4, 2, 3, 5, 1, 5, 5, 2, 6, 6, 3, 4, 3, 3, 4, 4, 3, 3, 3,
  • 3, 2, 4, 5, 6, 5, 0, 7, 8, 1, 2, 9999, 4, 8), Array(0, 5, 5, 6, 5, 4, 6, 3, 5, 4, 6, 7, 8, 6, 4, 5, 5, 3, 2, 2, 2, 3, 3, 2, 4,
  • 3, 2, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 0, 7, 8, 3, 2, 4, 9999, 8), Array(0, 1, 1, 2, 2, 1, 2, 2, 1, 2, 2, 3, 4, 2, 3, 3, 2, 4,
  • 6, 6, 4, 7, 7, 3, 3, 3, 4, 5, 5, 4, 4, 4, 4, 3, 5, 6, 7, 6, 0, 1, 1, 2, 3, 3, 5, 9999));
  • }
  • }
  • rule("MAP: HAVANA")
  • rule("SUBROUTINE: BOT - RESET PATH FINDING")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • Current Map == Map(Havana);
  • Subroutine;
  • BotResetPathFinding;
  • }
  • actions
  • {
  • Global.NodePositions = Array(Vector(147.588, 6.425, -46.749), Vector(136.181, 6.425, -57.159), Vector(130.189, 6.425, -63.781),
  • Vector(123.305, 6.425, -57.983), Vector(125.678, 6.504, -46.633), Vector(114.485, 7.471, -46.699), Vector(138.743, 6.425,
  • -32.974), Vector(126.498, 6.425, -39.920), Vector(124.572, 10.434, -34.300), Vector(138.605, 5.359, -18.647), Vector(119.009,
  • 2.331, -31.024), Vector(121.138, 5.228, -19.933), Vector(126.722, 6.425, -29.505), Vector(102.762, 3.157, -33.609), Vector(
  • 76.030, 7.418, -74.087), Vector(83.720, 9.425, -33.744), Vector(97.439, 7.238, -42.379), Vector(86.252, 12.416, -47.261),
  • Vector(65.178, 11.425, -73.187), Vector(97.466, 7.269, -50.596), Vector(113.039, 7.424, -37.337), Vector(106.179, 7.450,
  • -46.143), Vector(90.086, 7.411, -44.653), Vector(78.752, 7.418, -62.140), Vector(82.124, 7.428, -44.229), Vector(90.675, 7.231,
  • -51.234), Vector(85.717, 4.692, -63.446), Vector(90.830, 4.330, -70.697), Vector(102.425, 2.387, -72.817), Vector(81.443,
  • 4.425, -81.648), Vector(70.743, 6.418, -81.495), Vector(69.738, 6.419, -96.344), Vector(127.586, 12.643, -63.344), Vector(
  • 118.911, 13.468, -58.008), Vector(102.885, 1.092, -56.579), Vector(100.009, 2.967, -67.139), Vector(106.703, 0.465, -44.628),
  • Vector(81.695, 7.418, -52.140), Vector(126.979, 12.393, -55.079), Vector(133.043, 10.425, -26.625), Vector(114.646, 7.278,
  • -57.336), Vector(95.160, 3.688, -81.194), Vector(78.456, 5.418, -93.581), Vector(75.455, 5.418, -101.492), Vector(148.071,
  • 9.432, -32.123), Vector(146.706, 9.425, -27.858), Vector(144.273, 9.445, -63.119), Vector(144.278, 9.454, -58.447));
  • Global.NodeConnections = Array(Array(1, 6, 4, 7), Array(2, 1, 4, 6, 7, 0, 47), Array(1, 3), Array(2, 4, 40), Array(3, 1, 5, 7, 6,
  • 1, 0), Array(4, 7, 20, 21, 19, 16, 40), Array(7, 1, 4, 1, 9, 12, 0, 44), Array(4, 5, 6, 1, 1, 12, 0), Array(7, 39), Array(6,
  • 11), Array(11, 13), Array(9, 10, 13), Array(6, 7, 10), Array(10, 16, 36), Array(18, 23, 30), Array(17, 24), Array(13, 19, 22,
  • 21, 25, 5), Array(15, 22, 25, 23), Array(14), Array(16, 21, 22, 26, 27, 35, 25, 5), Array(5, 13, 10), Array(19, 16, 5, 13, 22,
  • 34), Array(16, 19, 21, 24, 25), Array(14, 25, 26, 37), Array(22, 15, 37), Array(23, 22, 19, 16, 26, 27, 35, 37), Array(25, 19,
  • 27, 35, 29), Array(19, 26, 25, 29, 35, 41), Array(35, 34, 41), Array(27, 26, 30, 41, 42), Array(29, 14, 31), Array(30, 29, 43),
  • Array(33, 38, 1, 46), Array(32, 38, 40), Array(35, 36, 28), Array(28, 19, 25, 27, 26, 34), Array(13, 34), Array(25, 23, 24),
  • Array(5, 4, 1, 6, 1, 32, 33, 0), Array(6, 8, 45, 44), Array(3, 5, 34), Array(28, 27, 29, 42), Array(29, 41, 43), Array(42, 31),
  • Array(6, 45), Array(44, 39), Array(47, 32), Array(1, 0, 6, 46));
  • Global.DistanceMatrix = Array(Array(1.100, 2.200, 2.200, 1.100, 2.200, 1.100, 1.100, 5.200, 2.200, 3.400, 3.300, 2.200, 4.400,
  • 6.600, 6.600, 3.300, 7.500, 7.700, 3.300, 3.300, 3.300, 4.400, 5.500, 5.500, 4.400, 4.400, 4.400, 5.500, 5.500, 6.600, 7.600,
  • 4.200, 5.200, 4.500, 4.400, 5.500, 5.500, 5.100, 4.200, 3.300, 5.500, 6.600, 7.700, 2.200, 3.300, 3.200, 2.100), Array(1.100,
  • 2.200, 1.100, 2.200, 1.100, 1.100, 5.200, 2.200, 3.400, 3.300, 2.200, 4.400, 6.600, 6.600, 3.300, 7.500, 7.700, 3.300, 3.300,
  • 3.300, 4.400, 5.500, 5.500, 4.400, 4.400, 4.400, 5.500, 5.500, 6.600, 7.600, 3.100, 4.200, 4.500, 4.400, 5.500, 5.500, 4.100,
  • 4.200, 3.300, 5.500, 6.600, 7.700, 2.200, 3.300, 2.200, 1.100), Array(1.100, 2.200, 3.300, 2.200, 2.200, 6.300, 3.300, 4.500,
  • 4.400, 3.300, 5.500, 7.700, 7.700, 4.400, 8.600, 8.800, 4.400, 4.400, 4.400, 5.500, 6.600, 6.600, 5.500, 5.500, 5.500, 4.600,
  • 6.600, 7.700, 8.700, 4.200, 5.300, 3.600, 4.500, 4.600, 6.600, 5.200, 5.300, 2.200, 5.600, 6.700, 7.800, 3.300, 4.400, 3.300,
  • 2.200), Array(1.100, 2.200, 2.200, 2.200, 6.300, 3.300, 4.500, 4.400, 3.300, 4.400, 6.600, 6.600, 3.300, 7.500, 7.700, 3.300,
  • 3.300, 3.300, 4.400, 5.500, 5.500, 4.400, 4.400, 4.400, 3.500, 5.500, 6.600, 7.600, 5.300, 6.200, 2.500, 3.400, 3.500, 5.500,
  • 6.200, 5.300, 1.100, 4.500, 5.600, 6.700, 3.300, 4.400, 4.400, 3.300), Array(1.100, 1.100, 1.100, 5.200, 2.200, 3.400, 3.300,
  • 2.200, 3.300, 5.500, 5.500, 2.200, 6.400, 6.600, 2.200, 2.200, 2.200, 3.300, 4.400, 4.400, 3.300, 3.300, 3.300, 4.400, 4.400,
  • 5.500, 6.500, 4.200, 5.200, 3.400, 3.300, 4.400, 4.400, 5.100, 4.200, 2.200, 4.400, 5.500, 6.600, 2.200, 3.300, 3.300, 2.200),
  • Array(2.200, 1.100, 6.200, 3.300, 2.300, 3.300, 2.200, 2.200, 4.400, 4.400, 1.100, 5.300, 5.500, 1.100, 1.100, 1.100, 2.200,
  • 3.300, 3.300, 2.200, 2.200, 2.200, 3.300, 3.300, 4.400, 5.400, 5.200, 6.200, 2.300, 2.200, 3.300, 3.300, 6.100, 5.300, 1.100,
  • 3.300, 4.400, 5.500, 3.300, 4.400, 4.300, 3.300), Array(1.100, 4.200, 1.100, 2.300, 2.200, 1.100, 3.400, 6.600, 6.600, 3.300,
  • 7.500, 7.700, 3.300, 3.300, 3.300, 4.400, 5.500, 5.500, 4.400, 4.400, 4.400, 5.500, 5.500, 6.600, 7.600, 4.200, 5.200, 4.500,
  • 4.400, 4.500, 5.500, 5.100, 3.100, 3.300, 5.500, 6.600, 7.700, 1.100, 2.200, 3.200, 2.100), Array(5.100, 2.200, 2.400, 3.300,
  • 1.100, 3.300, 5.500, 5.500, 2.200, 6.400, 6.600, 2.200, 2.200, 2.200, 3.300, 4.400, 4.400, 3.300, 3.300, 3.300, 4.400, 4.400,
  • 5.500, 6.500, 4.200, 5.300, 3.400, 3.300, 4.400, 4.400, 5.200, 4.200, 2.200, 4.400, 5.500, 6.600, 2.200, 3.300, 3.300, 2.200),
  • Array(3.500, 3.700, 4.600, 2.500, 4.800, 6.100, 6.100, 3.700, 7.900, 7.110, 3.700, 3.700, 3.700, 4.800, 5.900, 5.900, 4.800,
  • 4.800, 4.800, 5.900, 5.900, 6.100, 7.100, 5.600, 6.600, 4.900, 4.800, 5.900, 5.900, 6.500, 1.100, 3.700, 5.900, 6.100, 7.110,
  • 2.300, 2.200, 4.600, 3.500), Array(2.200, 1.100, 2.200, 2.300, 6.700, 6.700, 3.400, 7.600, 7.800, 4.400, 4.300, 4.400, 4.500,
  • 5.600, 5.600, 4.500, 5.500, 5.500, 5.600, 6.600, 7.700, 8.700, 5.300, 6.300, 4.500, 5.500, 3.400, 5.600, 6.200, 4.200, 4.400,
  • 6.600, 7.700, 8.800, 2.200, 3.300, 4.300, 3.200), Array(1.100, 4.100, 1.100, 5.500, 5.500, 2.200, 6.400, 6.600, 3.300, 4.100,
  • 3.200, 3.300, 4.400, 4.400, 3.300, 4.400, 4.400, 4.400, 5.500, 6.600, 7.600, 7.400, 8.400, 3.300, 4.400, 2.200, 4.400, 8.300,
  • 6.300, 4.300, 5.500, 6.600, 7.700, 4.300, 5.400, 6.400, 5.300), Array(3.200, 1.200, 5.600, 5.600, 2.300, 6.500, 6.700, 3.400,
  • 4.200, 3.300, 3.400, 4.500, 4.500, 3.400, 4.500, 4.500, 4.500, 5.600, 6.700, 7.700, 6.400, 7.400, 3.400, 4.500, 2.300, 4.500,
  • 7.300, 5.300, 4.400, 5.600, 6.700, 7.800, 3.300, 4.400, 5.400, 4.300), Array(2.400, 6.600, 6.600, 3.300, 7.500, 7.700, 3.300,
  • 3.300, 3.300, 4.400, 5.500, 5.500, 4.400, 4.400, 4.400, 5.500, 5.500, 6.600, 7.600, 5.300, 6.300, 4.500, 4.400, 3.500, 5.500,
  • 6.200, 4.200, 3.300, 5.500, 6.600, 7.700, 2.200, 3.300, 4.300, 3.200), Array(4.400, 4.400, 1.100, 5.300, 5.500, 2.200, 3.100,
  • 2.100, 2.200, 3.300, 3.300, 2.200, 3.300, 3.300, 3.300, 4.400, 5.500, 6.500, 7.400, 8.400, 2.200, 3.300, 1.100, 3.300, 8.300,
  • 7.400, 3.300, 4.400, 5.500, 6.600, 5.400, 6.500, 6.500, 5.400), Array(4.300, 3.300, 5.200, 1.100, 3.300, 5.500, 4.400, 3.300,
  • 1.100, 3.300, 2.200, 2.300, 3.300, 4.400, 2.200, 1.100, 2.200, 9.600, 10.600, 4.400, 3.300, 5.500, 2.200, 10.500, 9.700, 5.500,
  • 3.300, 3.300, 3.300, 7.700, 8.800, 8.700, 7.700), Array(3.300, 1.100, 4.500, 3.300, 5.500, 3.300, 2.200, 2.300, 1.100, 2.300,
  • 3.400, 3.400, 4.500, 4.500, 4.500, 5.600, 9.600, 10.600, 4.500, 3.400, 5.500, 2.200, 10.500, 9.700, 5.500, 4.500, 5.600, 6.700,
  • 7.700, 8.800, 8.700, 7.700), Array(4.200, 4.400, 1.100, 2.200, 1.100, 1.100, 2.200, 2.200, 1.100, 2.200, 2.200, 3.300, 3.300,
  • 4.400, 5.400, 6.300, 7.300, 2.300, 2.200, 2.200, 2.200, 7.200, 6.400, 2.200, 3.300, 4.400, 5.500, 4.400, 5.500, 5.400, 4.400),
  • Array(3.600, 2.400, 4.600, 2.400, 1.300, 1.400, 2.200, 1.400, 2.500, 2.500, 3.600, 3.600, 3.600, 4.700, 8.700, 9.700, 3.600,
  • 2.500, 4.600, 2.300, 9.600, 8.800, 4.600, 3.600, 4.700, 5.800, 6.800, 7.900, 7.800, 6.800), Array(4.400, 6.600, 5.500, 4.400,
  • 2.200, 4.400, 3.300, 3.400, 4.400, 5.500, 3.300, 2.200, 3.300, 10.700, 11.700, 5.500, 4.400, 6.600, 3.300, 11.600, 10.800,
  • 6.600, 4.400, 4.400, 4.400, 8.800, 9.900, 9.800, 8.800), Array(2.200, 1.100, 1.100, 2.200, 2.200, 1.100, 1.100, 1.100, 2.200,
  • 2.200, 3.300, 4.300, 6.300, 7.300, 2.200, 1.100, 3.300, 2.200, 7.200, 6.400, 2.200, 2.200, 3.300, 4.400, 4.400, 5.500, 5.400,
  • 4.400), Array(2.200, 3.300, 4.400, 4.400, 3.300, 3.300, 3.300, 4.400, 4.400, 5.500, 6.500, 6.300, 7.300, 3.400, 3.300, 2.400,
  • 4.400, 7.200, 6.400, 2.200, 4.400, 5.500, 6.600, 4.400, 5.500, 5.400, 4.400), Array(1.100, 3.300, 2.200, 2.200, 2.200, 2.200,
  • 2.300, 3.300, 4.400, 5.400, 6.300, 7.300, 1.300, 2.200, 2.300, 3.300, 7.200, 6.400, 2.200, 3.300, 4.400, 5.500, 4.400, 5.500,
  • 5.400, 4.400), Array(2.200, 1.100, 1.100, 2.200, 2.200, 3.300, 3.300, 4.400, 5.400, 7.400, 8.400, 2.300, 2.200, 3.300, 2.200,
  • 8.300, 7.500, 3.300, 3.300, 4.400, 5.500, 5.500, 6.600, 6.500, 5.500), Array(2.200, 1.100, 1.200, 2.200, 3.300, 2.300, 2.200,
  • 3.300, 8.500, 9.500, 3.300, 2.200, 4.400, 1.100, 9.400, 8.600, 4.400, 3.300, 3.400, 4.400, 6.600, 7.700, 7.600, 6.600), Array(
  • 2.200, 3.300, 3.300, 4.400, 4.400, 4.400, 5.500, 8.500, 9.500, 3.400, 3.300, 4.400, 1.100, 9.400, 8.600, 4.400, 4.400, 5.500,
  • 6.600, 6.600, 7.700, 7.600, 6.600), Array(1.100, 1.100, 2.200, 2.200, 3.300, 4.300, 7.400, 8.400, 2.200, 1.100, 3.300, 1.100,
  • 8.300, 7.500, 3.300, 2.200, 3.300, 4.400, 5.500, 6.600, 6.500, 5.500), Array(1.100, 2.200, 1.100, 2.200, 3.200, 7.400, 8.400,
  • 2.200, 1.100, 3.300, 2.200, 8.300, 7.500, 3.300, 2.200, 2.200, 3.300, 5.500, 6.600, 6.500, 5.500), Array(2.200, 1.100, 2.200,
  • 3.200, 7.400, 8.400, 2.200, 1.100, 3.300, 2.200, 8.300, 7.500, 3.300, 1.100, 2.200, 3.300, 5.500, 6.600, 6.500, 5.500), Array(
  • 2.200, 3.300, 4.300, 8.400, 9.300, 1.100, 1.100, 2.200, 3.300, 9.400, 8.600, 4.200, 1.100, 2.200, 3.300, 6.600, 7.700, 7.500,
  • 6.600), Array(1.100, 2.100, 8.500, 9.500, 3.300, 2.200, 4.400, 3.300, 9.400, 8.600, 4.400, 1.100, 1.100, 2.200, 6.600, 7.700,
  • 7.600, 6.600), Array(1.100, 9.600, 10.600, 4.400, 3.300, 5.500, 3.300, 10.500, 9.700, 5.500, 2.200, 2.200, 2.200, 7.700, 8.800,
  • 8.700, 7.700), Array(9.700, 10.700, 4.500, 3.400, 5.600, 4.400, 10.600, 9.800, 5.600, 2.300, 2.200, 1.100, 7.800, 8.900, 8.800,
  • 7.800), Array(1.100, 3.800, 4.700, 4.800, 5.800, 1.100, 5.500, 2.600, 5.800, 6.900, 7.100, 3.500, 4.600, 1.100, 2.200), Array(
  • 2.900, 3.800, 3.900, 5.900, 1.100, 5.600, 1.700, 4.900, 5.100, 6.110, 3.600, 4.700, 2.200, 3.300), Array(1.100, 1.100, 3.300,
  • 9.300, 8.500, 4.100, 2.200, 3.300, 4.400, 6.500, 7.600, 7.400, 6.500), Array(2.200, 2.200, 8.300, 7.500, 3.200, 2.200, 3.300,
  • 4.400, 5.500, 6.600, 6.500, 5.500), Array(4.400, 9.400, 8.500, 4.200, 3.300, 4.400, 5.500, 6.500, 7.600, 7.500, 6.500), Array(
  • 9.400, 8.600, 4.400, 3.300, 4.400, 5.500, 6.600, 7.700, 7.600, 6.600), Array(4.600, 2.700, 4.900, 5.100, 6.110, 2.600, 3.700,
  • 2.200, 2.300), Array(4.600, 6.800, 7.900, 8.100, 1.200, 1.100, 4.500, 3.400), Array(3.400, 4.500, 5.600, 4.400, 5.500, 5.300,
  • 4.400), Array(1.100, 2.200, 6.600, 7.700, 7.600, 6.600), Array(1.100, 7.700, 8.800, 8.700, 7.700), Array(8.800, 9.900, 9.800,
  • 8.800), Array(1.100, 4.300, 3.200), Array(5.400, 4.300), Array(1.100));
  • Event Player.BotTargetPlayer = -1;
  • Event Player.BotTargetPosition = -1;
  • Event Player.BotPrevNodeId = -1;
  • Event Player.BotClosestNodeIdToTarget = -1;
  • Event Player.BotNextNodeId = -1;
  • Event Player.BotNextNodePosition = -1;
  • Event Player.BotIsPathFinding = False;
  • Stop Throttle In Direction(Event Player);
  • disabled Stop Facing(Event Player);
  • }
  • }
  • rule("BOT: PATH FINDING - INIT")
  • rule("SUBROUTINE: BOT - START PATH FINDING")
  • {
  • event
  • {
  • Player Joined Match;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Subroutine;
  • BotStartPathFinding;
  • }
  • actions
  • {
  • Event Player.BotMoveSpeedMultiplier = 1;
  • Call Subroutine(BotResetPathFinding);
  • Abort If(Event Player.BotIsPathFinding == True);
  • disabled Call Subroutine(BotGetClosestNodeIdToTarget);
  • Call Subroutine(BotGetNextNodeIdAndPosition);
  • Start Facing(Event Player, Direction Towards(Position Of(Event Player), Event Player.BotNextNodePosition), 360, To World,
  • Direction and Turn Rate);
  • Start Throttle In Direction(Event Player, Direction Towards(Position Of(Event Player), Event Player.BotNextNodePosition), 1,
  • To World, Replace existing throttle, Direction and Magnitude);
  • Event Player.BotIsPathFinding = True;
  • }
  • }
  • rule("BOT: PATH FINDING - START")
  • rule("SUBROUTINE: BOT - GET CLOSEST NODE ID TO TARGET")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Has Spawned(Event Player) == True;
  • Event Player.BotIsPathFinding == False;
  • Event Player.BotCancelPathFinding == False;
  • (Event Player.BotTargetPosition != -1 || Event Player.BotTargetPlayer != -1) == True;
  • Subroutine;
  • BotGetClosestNodeIdToTarget;
  • }
  • actions
  • {
  • Event Player.BotIsPathFinding = True;
  • Call Subroutine(BotGetTargetNodeAndPosition);
  • Call Subroutine(BotGetNextNodeId);
  • Call Subroutine(BotGetNextPosition);
  • Call Subroutine(BotComputeTimestamp);
  • "FACING AND MOVEMENT DIRECTION"
  • Start Facing(Event Player, Direction Towards(Eye Position(Event Player), Event Player.BotNextNodePosition + Vector(0, 1, 0)), 450,
  • To World, Direction and Turn Rate);
  • Start Throttle In Direction(Event Player, Direction Towards(Position Of(Event Player), Event Player.BotNextNodePosition), 1,
  • To World, Replace existing throttle, Direction and Magnitude);
  • Log To Inspector(Custom String("PATH FINDING ({0}): BEGIN PATH FINDING FROM NODE #{1} TO NODE #{2}", Event Player,
  • Event Player.BotNextNodeId, Event Player.BotClosestNodeIdToTarget));
  • Event Player.BotTargetPosition = Event Player.BotTargetPlayer != -1 ? Position Of(Event Player.BotTargetPlayer)
  • : Event Player.BotTargetPosition;
  • Event Player.BotClosestNodeIdToTarget = Index Of Array Value(Global.NodePositions, Sorted Array(Filtered Array(
  • Global.NodePositions, Is In Line of Sight(Event Player.BotTargetPosition + Vector(0, 2, 0), Current Array Element,
  • Barriers Do Not Block LOS) == True), Distance Between(Event Player.BotTargetPosition, Current Array Element))[0]);
  • }
  • }
  • rule("BOT: PATH FINDING - CANCEL")
  • rule("SUBROUTINE: BOT - GET NEXT NODE ID AND POSITION")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Has Spawned(Event Player) == True;
  • Event Player.BotCancelPathFinding == True;
  • Subroutine;
  • BotGetNextNodeIdAndPosition;
  • }
  • actions
  • {
  • Start Rule(BotResetPathFinding, Restart Rule);
  • "BOT JUST START FOLLOW PATH OR LOST NEXT NODE"
  • If(Event Player.BotPrevNodeId == -1);
  • Log To Inspector(Custom String("PATH FINDING ({0}): BEGIN PATH FINDING", Event Player));
  • Event Player.BotClosestNodeIdToBot = Index Of Array Value(Global.NodePositions, Sorted Array(Filtered Array(Global.NodePositions,
  • Is In Line of Sight(Position Of(Event Player) + Vector(0, 2, 0), Current Array Element, Barriers Do Not Block LOS) == True),
  • Distance Between(Position Of(Event Player), Current Array Element))[0]);
  • Call Subroutine(BotGetClosestNodeIdToTarget);
  • End;
  • "I. FIND NEXT NODE IN PATH"
  • Log To Inspector(Custom String("PATH FINDING ({0}): BEGIN FIND NEXT NODE FROM NODE #{1}", Event Player,
  • Event Player.BotClosestNodeIdToBot));
  • "ALWAYS UPDATE CLOSEST NODE TO TARGET IF TARGET IS PLAYER (TARGET POSITION CAN CHANGE)"
  • If(Event Player.BotTargetPlayer != -1);
  • Event Player.BotTargetPosition = Position Of(Event Player.BotTargetPlayer);
  • Call Subroutine(BotGetClosestNodeIdToTarget);
  • Log To Inspector(Custom String("PATH FINDING ({0}): TARGET IS PLAYER {2}, SET TARGET NODE #{1}", Event Player,
  • Event Player.BotClosestNodeIdToTarget, Event Player.BotTargetPlayer));
  • End;
  • "NEXT NODE IS TARGET (DISTANCE TO TARGET NODE = 1)"
  • If(Global.DistanceMatrix[Event Player.BotClosestNodeIdToBot][Event Player.BotClosestNodeIdToTarget] == 1);
  • Log To Inspector(Custom String("PATH FINDING ({0}): NEXT NODE #{1} IS TARGET ", Event Player,
  • Event Player.BotClosestNodeIdToTarget));
  • Event Player.BotNextNodeId = Event Player.BotClosestNodeIdToTarget;
  • "CHECK CONNECTIONS OF REACHED NODE"
  • Else;
  • Log To Inspector(Custom String("PATH FINDING ({0}): (BEGIN LOOP) CHECK CONNECTIONS FROM NODE #{1} TO TARGET NODE #{2}",
  • Event Player, Event Player.BotClosestNodeIdToBot, Event Player.BotClosestNodeIdToTarget));
  • Event Player.BotShortestDistanceToTarget = 999;
  • Event Player.BotCurrentDistanceToTarget = Event Player.BotShortestDistanceToTarget;
  • Event Player.BotTempArray = Global.NodeConnections[Event Player.BotClosestNodeIdToBot];
  • For Player Variable(Event Player, BotLoopIterator1, 0, Count Of(Event Player.BotTempArray), 1);
  • Event Player.BotCurrentDistanceToTarget = Global.DistanceMatrix[Event Player.BotTempArray[Event Player.BotLoopIterator1]][Event Player.BotClosestNodeIdToTarget];
  • Log To Inspector(Custom String("PATH FINDING ({0}): NODE #{1}; DISTANCE TO TARGET = {2}", Event Player,
  • Event Player.BotTempArray[Event Player.BotLoopIterator1], Event Player.BotCurrentDistanceToTarget));
  • If(Event Player.BotCurrentDistanceToTarget < Event Player.BotShortestDistanceToTarget);
  • Event Player.BotShortestDistanceToTarget = Event Player.BotCurrentDistanceToTarget;
  • Event Player.BotNextNodeId = Event Player.BotTempArray[Event Player.BotLoopIterator1];
  • Log To Inspector(Custom String("PATH FINDING ({0}): SET NEXT NODE #{1}", Event Player, Event Player.BotNextNodeId));
  • End;
  • End;
  • Log To Inspector(Custom String("PATH FINDING ({0}): (END LOOP) NEXT NODE #{1}, DISTANCE TO TARGET NODE = {2}", Event Player,
  • Event Player.BotNextNodeId, Event Player.BotShortestDistanceToTarget));
  • End;
  • "II. AVAILABILITY CHECKING OF NEXT NODE"
  • Log To Inspector(Custom String("PATH FINDING ({0}): BEGIN AVAILABILITY CHECKING OF NEXT NODE #{1}", Event Player,
  • Event Player.BotNextNodeId));
  • "Y-ORD DIFF BETWEEN BOT POS AND NEXT NODE POS"
  • Log To Inspector(Custom String("PATH FINDING ({0}): Y-ORD DIFF BETWEEN BOT POS AND NEXT NODE POS = {1}", Event Player,
  • Y Component Of(Position Of(Event Player)) - Y Component Of(Global.NodePositions[Event Player.BotNextNodeId])));
  • "NEXT NODE IS HIGHER THAN BOT AND BOT DIDN'T REACH CLOSEST NODE"
  • If(Y Component Of(Position Of(Event Player)) - Y Component Of(Global.NodePositions[Event Player.BotNextNodeId])
  • < -3 && Event Player.BotPrevNodeId != Event Player.BotClosestNodeIdToBot);
  • Log To Inspector(Custom String("PATH FINDING ({0}): NEXT NODE {1} IS HIGHER THAN BOT, SET CLOSEST NODE #{2} TO BOT AS NEXT",
  • Event Player, Event Player.BotNextNodeId, Event Player.BotClosestNodeIdToBot));
  • Event Player.BotPrevNodeId = Event Player.BotClosestNodeIdToBot;
  • Event Player.BotNextNodeId = Event Player.BotClosestNodeIdToBot;
  • "BOT CAN SEE TARGET POSITION AND NEXT NODE IS TARGET"
  • Else If(
  • Global.DistanceMatrix[Event Player.BotClosestNodeIdToBot][Event Player.BotClosestNodeIdToTarget] == 1 && Is In Line of Sight(
  • Position Of(Event Player) + Vector(0, 1.600, 0), Event Player.BotTargetPosition + Vector(0, 2, 0), Barriers Do Not Block LOS));
  • Log To Inspector(Custom String(
  • "PATH FINDING ({0}): CAN SEE TARGET POSITION {1} AND DISTANCE TO TARGET NODE = 1, MOVE TO TARGET POSITION", Event Player,
  • Event Player.BotTargetPosition));
  • Event Player.BotNextNodePosition = Event Player.BotTargetPosition;
  • Abort;
  • "BOT CAN'T SEE NEXT NODE OR NODE IS LOWER THAN BOT"
  • disabled Else If(Is In Line of Sight(Position Of(Event Player) + Vector(0, 1.600, 0),
  • Global.NodePositions[Event Player.BotNextNodeId] + Vector(0, 2, 0), Barriers Do Not Block LOS) == False);
  • "BOT CAN'T SEE NEXT NODE AND PREV NODE != REACHED NODE"
  • Else If(Is In Line of Sight(Position Of(Event Player) + Vector(0, 1.600, 0),
  • Global.NodePositions[Event Player.BotNextNodeId] + Vector(0, 2, 0), Barriers Do Not Block LOS)
  • == False && Event Player.BotPrevNodeId != Event Player.BotClosestNodeIdToBot);
  • Log To Inspector(Custom String("PATH FINDING ({0}): CAN'T SEE NODE #{1}, SET CLOSEST NODE #{2} AS NEXT", Event Player,
  • Event Player.BotNextNodeId, Event Player.BotClosestNodeIdToBot));
  • Event Player.BotPrevNodeId = Event Player.BotClosestNodeIdToBot;
  • Event Player.BotNextNodeId = Event Player.BotClosestNodeIdToBot;
  • End;
  • Event Player.BotNextNodePosition = Global.NodePositions[Event Player.BotNextNodeId];
  • Log To Inspector(Custom String("PATH FINDING ({0}): MOVE TO NEXT NODE #{1}", Event Player, Event Player.BotNextNodeId));
  • Log To Inspector(Custom String("PATH FINDING ({0}): END FIND NEXT NODE", Event Player, Event Player.BotNextNodeId));
  • }
  • }
  • rule("BOT: PATH FINDING - JUMP")
  • rule("BOT: PATH FINDING - START")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Event Player.BotIsPathFinding == True;
  • Is On Ground(Event Player) == True;
  • Speed Of(Event Player) < 3 * Event Player.BotMoveSpeedMultiplier;
  • Has Spawned(Event Player) == True;
  • (Event Player.BotTargetPosition != -1 || Event Player.BotTargetPlayer != -1) == True;
  • }
  • actions
  • {
  • Press Button(Event Player, Button(Jump));
  • Press Button(Event Player, Button(Melee));
  • Start Rule(BotStartPathFinding, Restart Rule);
  • }
  • }
  • rule("BOT: PATH FINDING - TIMESTAMP TRIGGER")
  • rule("BOT: PATH FINDING - REACHED THE NODE")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Has Spawned(Event Player) == True;
  • Event Player.BotIsPathFinding == True;
  • Event Player.BotIsPathFinding == True;
  • Total Time Elapsed >= Event Player.BotTimestamp;
  • (Event Player.BotClosestNodeIdToTarget >= 0 && Distance Between(Position Of(Event Player), Event Player.BotNextNodePosition)
  • < 0.850) == True;
  • }
  • actions
  • {
  • Call Subroutine(BotGetTargetNodeAndPosition);
  • "BOT DIDNT REACH NODE - TRIGGERED TIMESTAMP"
  • If(Distance Between(Position Of(Event Player), Event Player.BotNextNodePosition) > 1.500);
  • "RESET CLOSEST NODE ID TO FIND A NEW"
  • Event Player.BotClosestNodeIdToBot = -1;
  • "BOT REACHED NODE"
  • Else;
  • Event Player.BotPrevNodeId = Event Player.BotNextNodeId;
  • "REACHED NODE IS NOT TARGET"
  • If(Event Player.BotNextNodeId != Event Player.BotClosestNodeIdToTarget);
  • Event Player.BotClosestNodeIdToBot = Event Player.BotNextNodeId;
  • "REACHED NODE IS TARGET"
  • Else;
  • "BUT BOT DIDN'T REACH TARGET POSITION"
  • If(Distance Between(Position Of(Event Player), Event Player.BotTargetPosition) > (Event Player.BotTargetPlayer != -1 ? 2 : 1.500));
  • Event Player.BotNextNodePosition = Event Player.BotTargetPosition;
  • Call Subroutine(BotComputeTimestamp);
  • Abort;
  • "BOT REACHED TARGET POSITION"
  • Else;
  • Call Subroutine(BotResetPathFinding);
  • Abort;
  • End;
  • Event Player.BotPrevNodeId = Event Player.BotNextNodeId;
  • Event Player.BotClosestNodeIdToBot = Event Player.BotNextNodeId;
  • Event Player.BotCurrentDistanceToTarget = Distance Between(Position Of(Event Player), Event Player.BotTargetPosition);
  • Log To Inspector(Custom String("PATH FINDING ({0}): REACHED NODE #{1}", Event Player, Event Player.BotNextNodeId));
  • "BOT REACHED THE TARGET NODE OR TARGET POSITION"
  • If(Event Player.BotNextNodeId == Event Player.BotClosestNodeIdToTarget || Event Player.BotCurrentDistanceToTarget <= 0.850);
  • "BOT DIDN'T REACH TARGET POSITION"
  • If(Event Player.BotCurrentDistanceToTarget > 0.850);
  • Event Player.BotNextNodePosition = Event Player.BotTargetPosition;
  • Skip(5);
  • End;
  • "BOT REACHED TARGET POSITION"
  • Call Subroutine(BotResetPathFinding);
  • Abort;
  • End;
  • Call Subroutine(BotGetNextNodeId);
  • Call Subroutine(BotGetNextPosition);
  • Call Subroutine(BotComputeTimestamp);
  • "CONTINUE FOLLOW PATH"
  • Call Subroutine(BotGetNextNodeIdAndPosition);
  • Start Facing(Event Player, Direction Towards(Position Of(Event Player), Event Player.BotNextNodePosition), 360, To World,
  • Direction and Turn Rate);
  • Start Throttle In Direction(Event Player, Direction Towards(Position Of(Event Player), Event Player.BotNextNodePosition), 1,
  • To World, Replace existing throttle, Direction and Magnitude);
  • }
  • }
  • rule("BOT: DEAD")
  • rule("BOT: PATH FINDING - LOST THE NODE")
  • {
  • event
  • {
  • Player Died;
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • actions
  • {
  • Call Subroutine(BotResetPathFinding);
  • }
  • }
  • rule("SUBROUTINE: BOT - RESET PATH FINDING")
  • {
  • event
  • conditions
  • {
  • Subroutine;
  • BotResetPathFinding;
  • Is Dummy Bot(Event Player) == True;
  • Has Spawned(Event Player) == True;
  • Event Player.BotIsPathFinding == True;
  • (Is In Line of Sight(Position Of(Event Player) + Vector(0, 1.600, 0), Event Player.BotNextNodePosition + Vector(0, 2.500, 0),
  • Barriers Do Not Block LOS) == False && Speed Of In Direction(Event Player, Throttle Of(Event Player)) < 2) == True;
  • }
  • actions
  • {
  • Wait(0.500, Abort When False);
  • Log To Inspector(Custom String("PATH FINDING ({0}): LOST NEXT NODE FROM SIGHT, BEGIN FIND CLOSEST NODE TO BOT AND NEW NEXT NODE",
  • Event Player));
  • "RESET PREV NODE ID TO INFORM BOT THAT IT LOST NEXT NODE"
  • Event Player.BotPrevNodeId = -1;
  • Event Player.BotNextNodeId = -1;
  • Event Player.BotTargetPlayer = -1;
  • Event Player.BotTargetPosition = -1;
  • Event Player.BotClosestNodeIdToBot = -1;
  • Event Player.BotClosestNodeIdToTarget = -1;
  • Event Player.BotIsPathFinding = False;
  • Event Player.BotCancelPathFinding = False;
  • Stop Facing(Event Player);
  • Stop Throttle In Direction(Event Player);
  • }
  • }
  • rule("SUBROUTINE: BOT - GET TARGET NODE AND POSITION")
  • {
  • event
  • {
  • Subroutine;
  • BotGetTargetNodeAndPosition;
  • }
  • actions
  • {
  • "DONT UPDATE TARGET IF THE TARGET IS A POSITION"
  • Abort If(Event Player.BotTargetPlayer == -1 && Event Player.BotClosestNodeIdToTarget != -1);
  • Event Player.BotTargetPosition = Event Player.BotTargetPlayer != -1 ? Position Of(Event Player.BotTargetPlayer)
  • : Event Player.BotTargetPosition;
  • Event Player.BotClosestNodeIdToTarget = Index Of Array Value(Global.NodePositions, Sorted Array(Filtered Array(
  • Global.NodePositions, Is In Line of Sight(Event Player.BotTargetPosition + Vector(0, 0.700, 0), Current Array Element,
  • Barriers Do Not Block LOS) == True), Distance Between(Event Player.BotTargetPosition, Current Array Element))[0]);
  • }
  • }
  • rule("SUBROUTINE: BOT - GET NEXT NODE ID")
  • {
  • event
  • {
  • Subroutine;
  • BotGetNextNodeId;
  • }
  • actions
  • {
  • Skip If(Event Player.BotClosestNodeIdToBot != -1, 1);
  • "FIND CLOSEST NODE TO BEGIN PATH FINDING"
  • Event Player.BotClosestNodeIdToBot = Index Of Array Value(Global.NodePositions, Sorted Array(Filtered Array(Global.NodePositions,
  • Is In Line of Sight(Position Of(Event Player) + Vector(0, 0.700, 0), Current Array Element, Barriers Do Not Block LOS)
  • == True), Distance Between(Position Of(Event Player), Current Array Element))[0]);
  • "CHECK CONNECTIONS OF REACHED NODE"
  • Log To Inspector(Custom String("PATH FINDING ({0}): (BEGIN LOOP) CHECK CONNECTIONS FROM NODE #{1} TO TARGET NODE #{2}",
  • Event Player, Event Player.BotClosestNodeIdToBot, Event Player.BotClosestNodeIdToTarget));
  • Event Player.BotLoopConnectionArray = Global.NodeConnections[Event Player.BotClosestNodeIdToBot];
  • "CONNECTION ARRAY CONTAINS TARGET NODE ID"
  • If(Event Player.BotClosestNodeIdToBot == Event Player.BotClosestNodeIdToTarget || Array Contains(
  • Event Player.BotLoopConnectionArray, Event Player.BotClosestNodeIdToTarget));
  • Event Player.BotNextNodeId = Event Player.BotClosestNodeIdToTarget;
  • "CHECK CONNECTIONS OF REACHED NODE"
  • Log To Inspector(Custom String("PATH FINDING ({0}): (END LOOP) CONNECTION ARRAY CONTAINS TARGET NODE #{2}", Event Player, Null,
  • Event Player.BotClosestNodeIdToTarget));
  • Abort;
  • End;
  • "REMOVE PREV NODE ID"
  • Modify Player Variable(Event Player, BotLoopConnectionArray, Remove From Array By Value, Event Player.BotPrevNodeId);
  • Event Player.BotShortestDistanceToTarget = 999;
  • Event Player.BotCurrentDistanceToTarget = 999;
  • Event Player.BotShortestDistanceInMeters = 999;
  • Event Player.BotCurrentDistanceInMeters = 999;
  • "FIND NEXT NODE ID"
  • For Player Variable(Event Player, BotLoopIterator1, 0, Count Of(Event Player.BotLoopConnectionArray), 1);
  • "OPTIMIZED DISTANCE MATRIX ALGORITHM"
  • Event Player.BotLoopCurrentNodeId = Event Player.BotLoopConnectionArray[Event Player.BotLoopIterator1];
  • "LOWER DIAGONAL"
  • If(Event Player.BotLoopCurrentNodeId > Event Player.BotClosestNodeIdToTarget);
  • Event Player.BotCurrentDistanceToTarget = Global.DistanceMatrix[Event Player.BotClosestNodeIdToTarget][Event Player.BotLoopCurrentNodeId - Event Player.BotClosestNodeIdToTarget - 1];
  • Call Subroutine(BotGetRightHandPartOfFloatNumber);
  • Log To Inspector(Custom String("PATH FINDING ({0}): LOWER DIAGONAL", Event Player,
  • Event Player.BotLoopConnectionArray[Event Player.BotLoopIterator1], Event Player.BotCurrentDistanceToTarget));
  • "UPPER DIAGONAL"
  • Else;
  • Event Player.BotCurrentDistanceToTarget = Global.DistanceMatrix[Event Player.BotLoopCurrentNodeId][Event Player.BotClosestNodeIdToTarget - Event Player.BotLoopCurrentNodeId - 1];
  • Log To Inspector(Custom String("PATH FINDING ({0}): UPPER DIAGONAL", Event Player,
  • Event Player.BotLoopConnectionArray[Event Player.BotLoopIterator1], Event Player.BotCurrentDistanceToTarget));
  • End;
  • Log To Inspector(Custom String("PATH FINDING ({0}): NODE #{1}; DISTANCE TO TARGET = {2}", Event Player,
  • Event Player.BotLoopCurrentNodeId, Event Player.BotCurrentDistanceToTarget));
  • If(Event Player.BotCurrentDistanceToTarget < Event Player.BotShortestDistanceToTarget);
  • Event Player.BotShortestDistanceToTarget = Event Player.BotCurrentDistanceToTarget;
  • Event Player.BotNextNodeId = Event Player.BotLoopCurrentNodeId;
  • "ONE MORE NODE HAS SAME UNIT DISTANCE TO TARGET"
  • Else If(Event Player.BotCurrentDistanceToTarget == Event Player.BotShortestDistanceToTarget);
  • "ONCE CALCULATE DISTANCE FROM NEXT NODE TO TARGET NODE"
  • If(Event Player.BotShortestDistanceInMeters == 999);
  • Event Player.BotShortestDistanceInMeters = Distance Between(Global.NodePositions[Event Player.BotNextNodeId],
  • Event Player.BotTargetPosition);
  • Log To Inspector(Custom String("PATH FINDING ({0}): DISTANCE (METERS) FROM NODE #{1} TO TARGET: {2}", Event Player,
  • Event Player.BotNextNodeId, Event Player.BotShortestDistanceInMeters));
  • End;
  • Event Player.BotCurrentDistanceInMeters = Distance Between(Global.NodePositions[Event Player.BotLoopCurrentNodeId],
  • Event Player.BotTargetPosition);
  • Log To Inspector(Custom String("PATH FINDING ({0}): DISTANCE (METERS) FROM NODE #{1} TO TARGET: {2}", Event Player,
  • Event Player.BotLoopCurrentNodeId, Event Player.BotCurrentDistanceInMeters));
  • If(Event Player.BotCurrentDistanceInMeters < Event Player.BotShortestDistanceInMeters);
  • Event Player.BotShortestDistanceInMeters = Event Player.BotCurrentDistanceInMeters;
  • Event Player.BotNextNodeId = Event Player.BotLoopCurrentNodeId;
  • End;
  • End;
  • Log To Inspector(Custom String("PATH FINDING ({0}): SET NEXT NODE #{1}", Event Player, Event Player.BotNextNodeId));
  • End;
  • Log To Inspector(Custom String("PATH FINDING ({0}): (END LOOP) NEXT NODE #{1}, DISTANCE TO TARGET NODE = {2}", Event Player,
  • Event Player.BotNextNodeId, Event Player.BotShortestDistanceToTarget));
  • }
  • }
  • rule("SUBROUTINE: BOT - GET NEXT POSITION")
  • {
  • event
  • {
  • Subroutine;
  • BotGetNextPosition;
  • }
  • actions
  • {
  • Event Player.BotNextNodePosition = Global.NodePositions[Event Player.BotNextNodeId];
  • "NEXT NODE IS TARGET AND BOT CAN SEE TARGET POSITION"
  • If(Event Player.BotNextNodeId == Event Player.BotClosestNodeIdToTarget && Is In Line of Sight(Position Of(Event Player) + Vector(0,
  • 0.700, 0), Event Player.BotTargetPosition + Vector(0, 0.700, 0), Barriers Do Not Block LOS));
  • "POSITION OF TARGET NODE IS NOT HIGHER THAN BOT POSITION"
  • If(Y Component Of(Event Player.BotNextNodePosition) - Y Component Of(Position Of(Event Player)) < 2.100);
  • "MOVE TO TARGET POSITION"
  • Event Player.BotNextNodePosition = Event Player.BotTargetPosition;
  • Abort;
  • End;
  • "2D BOT POSITION"
  • Event Player.BotTempVar1 = Vector(X Component Of(Position Of(Event Player)), 0, Z Component Of(Position Of(Event Player)));
  • "TARGET POSITION IS CLOSER THAN NEXT NODE POSITION"
  • If(Distance Between(Event Player.BotTempVar1, Vector(X Component Of(Event Player.BotTargetPosition), 0, Z Component Of(
  • Event Player.BotTargetPosition))) < Distance Between(Event Player.BotTempVar1, Vector(X Component Of(
  • Global.NodePositions[Event Player.BotClosestNodeIdToTarget]), 0, Z Component Of(
  • Global.NodePositions[Event Player.BotClosestNodeIdToTarget]))));
  • "MOVE TO TARGET POSITION"
  • Event Player.BotNextNodePosition = Event Player.BotTargetPosition;
  • Abort;
  • End;
  • "FIRST NODE IN PATH"
  • Else If(Event Player.BotPrevNodeId == -1);
  • "BOT CAN'T SEE NEXT NODE POSITION"
  • If(!Is In Line of Sight(Position Of(Event Player) + Vector(0, 0.700, 0), Event Player.BotNextNodePosition + Vector(0, 0.700, 0),
  • Barriers Do Not Block LOS));
  • "MOVE TO CLOSEST NODE TO BOT"
  • Event Player.BotNextNodeId = Event Player.BotClosestNodeIdToBot;
  • Event Player.BotNextNodePosition = Global.NodePositions[Event Player.BotNextNodeId];
  • Abort;
  • "BOT CAN SEE NEXT NODE POSITION"
  • Else;
  • "NEXT NODE IS HIGHER THAN BOT POSITION"
  • If(Y Component Of(Event Player.BotNextNodePosition) - Y Component Of(Position Of(Event Player)) > 1.300);
  • "MOVE TO CLOSEST NODE TO BOT"
  • Event Player.BotNextNodeId = Event Player.BotClosestNodeIdToBot;
  • Event Player.BotNextNodePosition = Global.NodePositions[Event Player.BotNextNodeId];
  • End;
  • End;
  • End;
  • }
  • }
  • rule("SUBROUTINE: BOT - COMPUTE TIMESTAMP")
  • {
  • event
  • {
  • Subroutine;
  • BotComputeTimestamp;
  • }
  • actions
  • {
  • "COMPUTE PATH TIME TO NEXT NODE"
  • disabled Event Player.BotTimestamp = Distance Between(Position Of(Event Player), Event Player.BotNextNodePosition) / (
  • 5.400 * Event Player.BotMoveSpeedMultiplier);
  • "NODE IS HIGHER (NEED MORE TIME FOR JUMPS)"
  • disabled If(Y Component Of(Event Player.BotNextNodePosition) - Y Component Of(Position Of(Event Player)) > 1);
  • "COMPUTE PATH TIME TO NEXT NODE (2D DISTANCE)"
  • disabled Event Player.BotTimestamp = Distance Between(Vector(X Component Of(Position Of(Event Player)), 0, Z Component Of(Position Of(
  • Event Player))), Vector(X Component Of(Event Player.BotNextNodePosition), 0, Z Component Of(Event Player.BotNextNodePosition)))
  • / (4.500 * Event Player.BotMoveSpeedMultiplier);
  • "NODE IS LOWER"
  • disabled Else;
  • "COMPUTE PATH TIME TO NEXT NODE (2D DISTANCE)"
  • Event Player.BotTimestamp = Distance Between(Vector(X Component Of(Position Of(Event Player)), 0, Z Component Of(Position Of(
  • Event Player))), Vector(X Component Of(Event Player.BotNextNodePosition), 0, Z Component Of(Event Player.BotNextNodePosition)))
  • / (5.400 * Event Player.BotMoveSpeedMultiplier);
  • disabled End;
  • Event Player.BotTimestamp = Total Time Elapsed + Event Player.BotTimestamp;
  • Log To Inspector(Custom String("PATH FINDING ({0}): {2} TIMESTAMP WHEN BOT MUST REACH THE NODE #{1}", Event Player,
  • Event Player.BotNextNodeId, Event Player.BotTimestamp));
  • }
  • }
  • rule("SUBROUTINE: BOT - GET RIGHT-HAND OF FLOAT NUMBER")
  • {
  • event
  • {
  • Subroutine;
  • BotGetRightHandPartOfFloatNumber;
  • }
  • actions
  • {
  • Log To Inspector(Custom String("PATH FINDING ({0}): RIGHT-HAND OF FLOAT NUMBER, INPUT: {1}", Event Player,
  • Event Player.BotCurrentDistanceToTarget));
  • Event Player.BotCurrentDistanceToTarget = Event Player.BotCurrentDistanceToTarget % 1 * 10;
  • While(Event Player.BotCurrentDistanceToTarget % 1 > 0.010 && Event Player.BotCurrentDistanceToTarget % 1 < 0.990);
  • Event Player.BotCurrentDistanceToTarget *= 10;
  • Log To Inspector(Custom String("PATH FINDING ({0}): (LOOP) RIGHT-HAND OF FLOAT NUMBER, NUMBER: {1}", Event Player,
  • Event Player.BotCurrentDistanceToTarget));
  • End;
  • Log To Inspector(Custom String("PATH FINDING ({0}): RIGHT-HAND OF FLOAT NUMBER, RESULT: {1}", Event Player,
  • Event Player.BotCurrentDistanceToTarget));
  • }
  • }
  • rule("=== PATH NODE BUILDER - EXPORT BLOCK END ===")
  • {
  • event
  • {
  • Ongoing - Global;
  • "TRY FIND NEW NEXT NODE"
  • Call Subroutine(BotGetNextNodeIdAndPosition);
  • Start Facing(Event Player, Direction Towards(Position Of(Event Player), Event Player.BotNextNodeId), 360, To World,
  • Direction and Turn Rate);
  • Start Throttle In Direction(Event Player, Direction Towards(Position Of(Event Player), Event Player.BotNextNodePosition), 1,
  • To World, Replace existing throttle, Direction and Magnitude);
  • }
  • }
  • disabled rule("")
  • disabled rule("=== EXPORT BLOCK END ===")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • }
  • rule("GLOBAL: INIT MOD")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • actions
  • {
  • Global.OptimizedInspectorRecorder = Workshop Setting Toggle(Custom String("MOD PROPERTIES"), Custom String(
  • "WRITE INTO INSPECTOR REQUIRED VARS ONLY "), True, 0);
  • Skip If(!Global.OptimizedInspectorRecorder, 1);
  • Disable Inspector Recording;
  • Global.IsBuildingProject = False;
  • Global.BuilderNodePositions = Empty Array;
  • Global.BuilderNodeConnections = Empty Array;
  • Global.BuilderNodeEffectIdArray = Empty Array;
  • Global.BuilderNodeWorldTextIdArray = Empty Array;
  • Global.BuilderNodeConnectionEffectsId = Empty Array;
  • Global.NodeTriggerRadius = 0.850;
  • Global.BeamEffects = Empty Array;
  • Global.NodeTriggerRadius = Workshop Setting Real(Custom String("PATH FINDING"), Custom String("NODE TRIGGER RADIUS"), 0.850, 0.500,
  • 1.500, 0);
  • Global.PropertySpawnRoomIndex = Workshop Setting Combo(Custom String("MOD PROPERTIES"), Custom String("SPAWN ROOM"), 0, Array(
  • Custom String("1"), Custom String("2"), Custom String("3")), 0);
  • Global.PropertyFreeCamera = Workshop Setting Toggle(Custom String("MOD PROPERTIES"), Custom String("FREE FLY CAMERA"), True, 1);
  • Global.PropertyPlayerMovementSpeed = Workshop Setting Integer(Custom String("MOD PROPERTIES"), Custom String(
  • "PLAYER MOVEMENT SPEED"), 150, 50, 200, 2);
  • Global.PropertyBotMovementSpeed = Workshop Setting Integer(Custom String("MOD PROPERTIES"), Custom String(
  • "TEST BOT MOVEMENT SPEED"), 100, 50, 200, 3);
  • Start Forcing Spawn Room(All Teams, Global.PropertySpawnRoomIndex);
  • Global.WorkshopSettingShowConnections = Workshop Setting Toggle(Custom String("MOD PROPERTIES"), Custom String(
  • "SHOW CONNECTION EFFECTS WHEN SELECTED ONLY "), True, 0);
  • Create HUD Text(All Players(All Teams), Custom String(""), Null, Null, Left, 0, Color(White), Color(White), Color(White),
  • Visible To and String, Default Visibility);
  • "VALUES: \"EDIT\" - EDIT EXISTING NODES; \"BUILD\"- CREATE NEW NODES; \"PATH FINDING\" - TEST COMPUTING PATHS"
  • Global.BuilderMode = Custom String("PATH FINDING");
  • Global.BuilderHudColorEditMode = Color(Yellow);
  • Global.BuilderHudColorBuildMode = Color(Red);
  • Global.BuilderHudColorPathFindingMode = Color(Purple);
  • Global.PathFindingStartNodeId = -1;
  • Global.PathFindingTargetNodeId = -1;
  • "SELECTED NODE EFFECT"
  • Call Subroutine(BuilderInitModEffects);
  • If(Global.NodePositions != Null);
  • Call Subroutine(BuilderBuildPreparedPathNodes);
  • End;
  • }
  • }
  • rule("GLOBAL: WORKSHOP SETTINGS INSTRUCTION")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • actions
  • {
  • Global.WorkshopSettingInstructions = Workshop Setting Toggle(Custom String("INSTRUCTIONS - HOW DOES IT WORKS"), Custom String(
  • "1. PLACE NODES AND CONNECT THEM HOW YOU NEED BY USING BUILDER MODES BELOW"), False, -99);
  • Global.WorkshopSettingInstructions = Workshop Setting Toggle(Custom String("INSTRUCTIONS - HOW DOES IT WORKS"), Custom String(
  • " 1.1. BUILD MODE - CREATES AND PLACES NEW NODE IN CROSSHAIR'S POSITION"), False, -98);
  • Global.WorkshopSettingInstructions = Workshop Setting Toggle(Custom String("INSTRUCTIONS - HOW DOES IT WORKS"), Custom String(
  • " 1.2. EDIT MODE - SELECTS EXISTING NODE AND ALLOWS CONNECT IT TO OTHER NODES"), False, -97);
  • Global.WorkshopSettingInstructions = Workshop Setting Toggle(Custom String("INSTRUCTIONS - HOW DOES IT WORKS"), Custom String(
  • " 1.3. PATH FINDING MODE - SETS START AND TARGET NODES TO TEST ROUTE"), False, -96);
  • Global.WorkshopSettingInstructions = Workshop Setting Toggle(Custom String("INSTRUCTIONS - HOW DOES IT WORKS"), Custom String(
  • "2. BUILD YOUR PROJECT WITH WEB APP"), False, -95);
  • "2. BUILD YOUR PROJECT TO GET EXPORT VARS"), False, -95);
  • Global.WorkshopSettingInstructions = Workshop Setting Toggle(Custom String("INSTRUCTIONS - HOW DOES IT WORKS"), Custom String(
  • " 2.1. COPY ALL ACTUAL VAR VALUES FROM INSPECTOR ('X' BUTTON)"), False, -94);
  • " 2.1. SWITCH TO BUILD MODE"), False, -94);
  • Global.WorkshopSettingInstructions = Workshop Setting Toggle(Custom String("INSTRUCTIONS - HOW DOES IT WORKS"), Custom String(
  • " 2.2. VISIT WEB APP 'PATH NODE BUILDER'"), False, -93);
  • " 2.2. HOLD 'INTERACT' BUTTON A FEW SECONDS TO RUN BUILD PROCESS"), False, -93);
  • Global.WorkshopSettingInstructions = Workshop Setting Toggle(Custom String("INSTRUCTIONS - HOW DOES IT WORKS"), Custom String(
  • " 2.3. PASTE COPIED VALUES IN FIRST FORM"), False, -92);
  • " 2.3. WAIT WHEN THE PROCESS WILL BE FINISHED"), False, -92);
  • Global.WorkshopSettingInstructions = Workshop Setting Toggle(Custom String("INSTRUCTIONS - HOW DOES IT WORKS"), Custom String(
  • " 2.3. PRESS BUTTON 'COMPUTE DISTANCE MATRIX'"), False, -91);
  • " 2.3. OPEN WORKSHOP INSPECTOR AT LAST POSITION AND SELECT 'VARIABLE TARGET' = GLOBAL"), False, -91);
  • Global.WorkshopSettingInstructions = Workshop Setting Toggle(Custom String("INSTRUCTIONS - HOW DOES IT WORKS"), Custom String(
  • " 2.4. PRESS BUTTON 'COPY TO CLIPBOARD'"), False, -90);
  • " 2.4. CLICK (X) BUTTON TO COPY VALUES OF VARS TO CLIPBOARD AND PASTE IT IN ANY TEXT EDITOR"), False, -90);
  • Global.WorkshopSettingInstructions = Workshop Setting Toggle(Custom String("INSTRUCTIONS - HOW DOES IT WORKS"), Custom String(
  • " 2.5 DELETE ALL VARS AND ACTIONS EXCEPT NEXT"), False, -89);
  • Global.WorkshopSettingInstructions = Workshop Setting Toggle(Custom String("INSTRUCTIONS - HOW DOES IT WORKS"), Custom String(
  • " Global.NodePositions, Global.NodeConnections, Global.DistanceMatrix"), False, -88);
  • Global.WorkshopSettingInstructions = Workshop Setting Toggle(Custom String("INSTRUCTIONS - HOW DOES IT WORKS"), Custom String(
  • " 2.6 COPY ALL LINES FROM TEXT EDITOR INTO CLIPBOARD"), False, -87);
  • Global.WorkshopSettingInstructions = Workshop Setting Toggle(Custom String("INSTRUCTIONS - HOW DOES IT WORKS"), Custom String(
  • "3. CREATE NEW MAP RULE INSIDE OF 'EXPORT BLOCK' AND PASTE COPIED VALUES FROM CLIPBOARD"), False, -86);
  • Global.WorkshopSettingInstructions = Workshop Setting Toggle(Custom String("INSTRUCTIONS - HOW DOES IT WORKS"), Custom String(
  • "4. COPY ALL RULES INSIDE OF 'EXPORT BLOCK' AND PUT THEM IN YOUR GAME MODE"), False, -85);
  • Global.WorkshopSettingInstructions = Workshop Setting Toggle(Custom String("INSTRUCTIONS - HOW DOES IT WORKS"), Custom String(
  • "5. PROFIT!"), False, -84);
  • }
  • }
  • rule("SUBROUTINE: INIT MOD EFFECTS")
  • {
  • event
  • {
  • Subroutine;
  • BuilderInitModEffects;
  • }
  • actions
  • {
  • "SELECTED NODE EFFECT"
  • Global.BuilderSelectedNodeEffectPos = Vector(0, -999, 0);
  • Create Effect(All Players(All Teams), Sphere, Global.BuilderHudColorEditMode, Global.BuilderSelectedNodeEffectPos,
  • Global.NodeTriggerRadius, Visible To Position and Radius);
  • "PATH FINDING EFFECTS"
  • Global.PathFindingStartNodeEffectPos = Vector(0, -999, 0);
  • Global.PathFindingTargetNodeEffectPos = Vector(0, -999, 0);
  • Create Effect(All Players(All Teams), Light Shaft, Global.BuilderHudColorPathFindingMode, Global.PathFindingStartNodeEffectPos,
  • Global.NodeTriggerRadius, Visible To Position and Radius);
  • Create Effect(All Players(All Teams), Light Shaft, Global.BuilderHudColorPathFindingMode, Global.PathFindingTargetNodeEffectPos,
  • Global.NodeTriggerRadius, Visible To Position and Radius);
  • }
  • }
  • disabled rule("=== PLAYER ===")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • }
  • rule("PLAYER: INIT")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == False;
  • Host Player == True;
  • Has Spawned(Event Player) == True;
  • }
  • actions
  • {
  • Start Forcing Player To Be Hero(Event Player, Hero(Zenyatta));
  • Disable Movement Collision With Environment(Event Player, False);
  • Call Subroutine(BuilderSwitchMode);
  • disabled Disable Text Chat(Event Player);
  • disabled Disable Hero HUD(Event Player);
  • Disable Game Mode HUD(Event Player);
  • Set Ability 1 Enabled(Event Player, False);
  • Set Ability 2 Enabled(Event Player, False);
  • Set Primary Fire Enabled(Event Player, False);
  • Set Secondary Fire Enabled(Event Player, False);
  • Set Ultimate Ability Enabled(Event Player, False);
  • Set Move Speed(Event Player, Global.PropertyPlayerMovementSpeed);
  • Set Status(Event Player, Null, Phased Out, 9999);
  • If(Global.PropertyFreeCamera == True);
  • Set Gravity(Event Player, 0);
  • Start Accelerating(Event Player, Velocity Of(Event Player) * -1, Speed Of(Event Player) * 2, 10, To World,
  • Direction Rate and Max Speed);
  • Set Move Speed(Event Player, Global.PropertyPlayerMovementSpeed * 1.300);
  • End;
  • }
  • }
  • rule("PLAYER: FREE CAMERA")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Global.PropertyFreeCamera == True;
  • Host Player == True;
  • Has Spawned(Event Player) == True;
  • (Is Button Held(Event Player, Button(Jump)) || Is Button Held(Event Player, Button(Crouch))) == True;
  • }
  • actions
  • {
  • If(Is Button Held(Event Player, Button(Jump)));
  • Apply Impulse(Event Player, Up, 0.640, To World, Incorporate Contrary Motion);
  • Wait(False, Ignore Condition);
  • Loop If Condition Is True;
  • Else If(Is Button Held(Event Player, Button(Crouch)));
  • Apply Impulse(Event Player, Down, 0.640, To World, Incorporate Contrary Motion);
  • Wait(False, Ignore Condition);
  • Loop If Condition Is True;
  • End;
  • }
  • }
  • rule("PLAYER: SWITCH BUILDER MODE")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == False;
  • Host Player == True;
  • Has Spawned(Event Player) == True;
  • Global.IsBuildingProject == False;
  • Is Button Held(Event Player, Button(Reload)) == True;
  • }
  • actions
  • {
  • Call Subroutine(BuilderSwitchMode);
  • }
  • }
  • rule("SUBROUTINE: SWITCH MODE")
  • {
  • event
  • {
  • Subroutine;
  • BuilderSwitchMode;
  • }
  • actions
  • {
  • Destroy HUD Text(Event Player.BuilderModeInfoHudId);
  • If(Global.BuilderMode == Custom String("PATH FINDING"));
  • Global.BuilderMode = Custom String("BUILD");
  • Call Subroutine(PathFindingModeReset);
  • Global.BuilderHudColorCurrent = Global.BuilderHudColorBuildMode;
  • Create HUD Text(All Players(All Teams), Custom String("[{0}] - MODE: {1}\r\n{2}", Input Binding String(Button(Reload)),
  • Global.BuilderMode, Custom String("{0} - CREATE NODE", Input Binding String(Button(Primary Fire)))), Null, Null, Left, -999,
  • Global.BuilderHudColorCurrent, Color(White), Color(White), Visible To and String, Default Visibility);
  • Global.BuilderMode, Custom String("HOLD {1} - BUILD PROJECT\r\n{0} - CREATE NODE", Input Binding String(Button(Primary Fire)),
  • Input Binding String(Button(Interact)))), Null, Null, Left, -999, Global.BuilderHudColorCurrent, Color(White), Color(White),
  • Visible To and String, Default Visibility);
  • Else If(Global.BuilderMode == Custom String("BUILD"));
  • Global.BuilderMode = Custom String("EDIT");
  • Global.BuilderHudColorCurrent = Global.BuilderHudColorEditMode;
  • Create HUD Text(All Players(All Teams), Custom String("[{0}] - MODE: {1}\r\n{2}", Input Binding String(Button(Reload)),
  • Global.BuilderMode, Custom String("SELECTED NODE - {0}\r\n{1} - SELECT\r\n{2}",
  • Global.BuilderSelectedNodeId < 0 ? Custom String("NONE") : Global.BuilderSelectedNodeId, Input Binding String(Button(
  • Primary Fire)), Custom String("{0} - CONNECT/DISCONNECT\r\n{1} - DELETE", Input Binding String(Button(Secondary Fire)),
  • Input Binding String(Button(Interact))))), Null, Null, Left, -999, Global.BuilderHudColorCurrent, Color(White), Color(White),
  • Visible To and String, Default Visibility);
  • Else If(Global.BuilderMode == Custom String("EDIT"));
  • Global.BuilderMode = Custom String("PATH FINDING");
  • Call Subroutine(DeleteNodeBeams);
  • Global.BuilderHudColorCurrent = Global.BuilderHudColorPathFindingMode;
  • Create HUD Text(All Players(All Teams), Custom String("[{0}] - MODE: {1}\r\n{2}", Input Binding String(Button(Reload)),
  • Global.BuilderMode, Custom String("{0} - SET START POS (CLOSEST NODE {1})\r\n{2}", Input Binding String(Button(Primary Fire)),
  • Global.PathFindingStartNodeId, Custom String("{0} - SET TARGET POS (CLOSEST NODE {1})\r\n{2}", Input Binding String(Button(
  • Secondary Fire)), Global.PathFindingTargetNodeId, Custom String("{0} - TEST WITH BOT\r\n{1} - BOOP BOT", Input Binding String(
  • Button(Ultimate)), Input Binding String(Button(Interact)))))), Null, Null, Left, -999, Global.BuilderHudColorCurrent, Color(
  • White), Color(White), Visible To and String, Default Visibility);
  • End;
  • Event Player.BuilderModeInfoHudId = Last Text ID;
  • Global.BuilderSelectedNodeEffectPos = Vector(0, -999, 0);
  • Global.BuilderSelectedNodeId = -1;
  • }
  • }
  • rule("SUBROUTINE: GET CLOSSEST NODE ID TO CURSOR")
  • {
  • event
  • {
  • Subroutine;
  • BuilderGetClossestNodeIdToCursor;
  • }
  • actions
  • {
  • "ANY NODE IN LINE OF SIGHT"
  • Global.BuilderTrySelectNodeInLOS = Filtered Array(Global.BuilderNodePositions, Current Array Element != False && Dot Product(
  • Facing Direction Of(Event Player), Direction Towards(Eye Position(Event Player), Current Array Element))
  • >= 0.990 && Is In Line of Sight(Eye Position(Event Player), Current Array Element, Barriers Do Not Block LOS));
  • If(Global.BuilderTrySelectNodeInLOS != Empty Array);
  • Global.BuilderTrySelectNodeInLOS = Index Of Array Value(Global.BuilderNodePositions, Global.BuilderTrySelectNodeInLOS[0]);
  • Else;
  • Global.BuilderTrySelectNodeInLOS = -1;
  • End;
  • }
  • }
  • disabled rule("=== EDIT MODE ===")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • }
  • rule("PLAYER: EDIT MODE")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == False;
  • Host Player == True;
  • Has Spawned(Event Player) == True;
  • (Is Button Held(Event Player, Button(Primary Fire)) || Is Button Held(Event Player, Button(Secondary Fire)) || Is Button Held(
  • Event Player, Button(Interact))) == True;
  • Global.BuilderMode == Custom String("EDIT");
  • }
  • actions
  • {
  • "ANY NODE IN LINE OF SIGHT"
  • Call Subroutine(BuilderGetClossestNodeIdToCursor);
  • "SELECT NODE"
  • If(Is Button Held(Event Player, Button(Primary Fire)));
  • Call Subroutine(BuilderEditModeSelectNode);
  • "CONNECT/DISCONNECT NODE"
  • Else If(Is Button Held(Event Player, Button(Secondary Fire)) && Global.BuilderSelectedNodeId != -1);
  • Call Subroutine(BuilderConnectDisconnectSelector);
  • "DELETE NODE"
  • Else If(Is Button Held(Event Player, Button(Interact)) && Global.BuilderSelectedNodeId != -1);
  • Call Subroutine(BuilderEditModeDeleteNode);
  • End;
  • }
  • }
  • rule("SUBROUTINE: SELECT NODE")
  • {
  • event
  • {
  • Subroutine;
  • BuilderEditModeSelectNode;
  • }
  • actions
  • {
  • If(Global.BuilderTrySelectNodeInLOS != -1);
  • Global.BuilderSelectedNodeEffectPos = Global.BuilderNodePositions[Global.BuilderTrySelectNodeInLOS];
  • Else;
  • Global.BuilderSelectedNodeEffectPos = Vector(0, -999, 0);
  • Call Subroutine(DeleteNodeBeams);
  • End;
  • Global.BuilderSelectedNodeId = Global.BuilderTrySelectNodeInLOS;
  • Call Subroutine(DeleteNodeBeams);
  • "DRAW CONNECTED BEAMS"
  • If(Count Of(Global.BuilderNodeConnections[Global.BuilderSelectedNodeId]) > 0);
  • Call Subroutine(CreateNodeBeams);
  • End;
  • }
  • }
  • rule("SUBROUTINE: DELETE NODE")
  • {
  • event
  • {
  • Subroutine;
  • BuilderEditModeDeleteNode;
  • }
  • actions
  • {
  • If(Global.BuilderTrySelectNodeInLOS == -1 || Global.BuilderTrySelectNodeInLOS != Global.BuilderSelectedNodeId);
  • Small Message(All Players(All Teams), Custom String("LOOK AT NODE {0} TO DELETE IT", Global.BuilderSelectedNodeId));
  • Abort;
  • End;
  • Small Message(All Players(All Teams), Custom String("NODE DELETED"));
  • Call Subroutine(DeleteNodeBeams);
  • Play Effect(Event Player, Debuff Impact Sound, Color(White), Event Player, 60);
  • Destroy Effect(Global.BuilderNodeEffectIdArray[Global.BuilderSelectedNodeId]);
  • Destroy In-World Text(Global.BuilderNodeWorldTextIdArray[Global.BuilderSelectedNodeId]);
  • Skip If(!Global.OptimizedInspectorRecorder, 1);
  • Enable Inspector Recording;
  • Global.BuilderNodePositions[Global.BuilderTrySelectNodeInLOS] = False;
  • Skip If(!Global.OptimizedInspectorRecorder, 1);
  • Disable Inspector Recording;
  • Global.BuilderSelectedNodeEffectPos = Vector(0, -999, 0);
  • Call Subroutine(BuilderDeleteConnectionsOfNode);
  • Global.BuilderSelectedNodeId = -1;
  • }
  • }
  • rule("SUBROUTINE: DELETE ALL CONNECTIONS OF DELETED NODE")
  • {
  • event
  • {
  • Subroutine;
  • BuilderDeleteConnectionsOfNode;
  • }
  • actions
  • {
  • "DELETE ALL CONNECTIONS OF THE DELETED NODE"
  • For Global Variable(LoopIterator1, 0, Count Of(Global.BuilderNodeConnections[Global.BuilderSelectedNodeId]), 1);
  • Destroy Effect(
  • Global.BuilderNodeConnectionEffectsId[Global.BuilderSelectedNodeId][Global.BuilderNodeConnections[Global.BuilderSelectedNodeId][Global.LoopIterator1]]);
  • End;
  • "CHECK OTHER NODES FOR CONNECTION WITH DELETED NODE"
  • For Global Variable(LoopIterator1, 0, Count Of(Global.BuilderNodePositions), 1);
  • disabled Global.BuilderTrySelectNodeInLOS = Global.BuilderNodeConnections[Global.LoopIterator1][Global.LoopIterator2];
  • If(Array Contains(Global.BuilderNodeConnections[Global.LoopIterator1], Global.BuilderSelectedNodeId));
  • "DELETE BEAM EFFECT"
  • Destroy Effect(Global.BuilderNodeConnectionEffectsId[Global.LoopIterator1][Global.BuilderSelectedNodeId]);
  • Global.BuilderInnerArray = Global.BuilderNodeConnectionEffectsId[Global.LoopIterator1];
  • Global.BuilderInnerArray[Global.BuilderSelectedNodeId] = False;
  • Global.BuilderNodeConnectionEffectsId[Global.LoopIterator1] = Global.BuilderInnerArray;
  • "REMOVE DELETED NODE FROM CONNECTION ARRAY"
  • Global.BuilderInnerArray = Global.BuilderNodeConnections[Global.LoopIterator1];
  • Modify Global Variable(BuilderInnerArray, Remove From Array By Value, Global.BuilderSelectedNodeId);
  • Global.BuilderNodeConnections[Global.LoopIterator1] = Global.BuilderInnerArray;
  • "UPDATE IN-WORLD TEXT OF NODE"
  • Global.StringConcatNodeId = Global.LoopIterator1;
  • Call Subroutine(BuilderConcatStringConnections);
  • End;
  • End;
  • Skip If(!Global.OptimizedInspectorRecorder, 1);
  • Enable Inspector Recording;
  • Global.BuilderNodeConnections[Global.BuilderSelectedNodeId] = False;
  • Skip If(!Global.OptimizedInspectorRecorder, 1);
  • Disable Inspector Recording;
  • Global.BuilderNodeConnectionEffectsId[Global.BuilderSelectedNodeId] = False;
  • }
  • }
  • rule("SUBROUTINE: CONNECT DISCONNECT SELECTOR")
  • {
  • event
  • {
  • Subroutine;
  • BuilderConnectDisconnectSelector;
  • }
  • actions
  • {
  • If(
  • Global.BuilderSelectedNodeId == -1 || Global.BuilderTrySelectNodeInLOS == -1 || Global.BuilderSelectedNodeId == Global.BuilderTrySelectNodeInLOS);
  • Small Message(All Players(All Teams), Custom String("LOOK AT OTHER NODE TO CONNECT/DISCONNECT IT"));
  • Abort;
  • End;
  • Global.BuilderIsNodeHaveConnection = Array Contains(Global.BuilderNodeConnections[Global.BuilderSelectedNodeId],
  • Global.BuilderTrySelectNodeInLOS);
  • If(!Global.BuilderIsNodeHaveConnection);
  • Small Message(All Players(All Teams), Custom String("NODE CONNECTED"));
  • Call Subroutine(BuilderConnectNodeBackendLogic);
  • Call Subroutine(DeleteNodeBeams);
  • Call Subroutine(CreateNodeBeams);
  • Else;
  • Small Message(All Players(All Teams), Custom String("NODE DISCONNECTED"));
  • Call Subroutine(BuilderDisconnectNode);
  • Call Subroutine(DeleteNodeBeams);
  • Call Subroutine(CreateNodeBeams);
  • End;
  • "UPDATE IN-WORLD TEXT OF CONNECTED NODE"
  • Global.StringConcatNodeId = Global.BuilderSelectedNodeId;
  • Call Subroutine(BuilderConcatStringConnections);
  • }
  • }
  • rule("SUBROUTINE: CONNECT NODE (BACK-END LOGIC)")
  • {
  • event
  • {
  • Subroutine;
  • BuilderConnectNodeBackendLogic;
  • }
  • actions
  • {
  • "GET CONNECTION ARRAY FOR SELECTED NODE AND ADD NEW CONNECTION"
  • If(Count Of(Global.BuilderNodeConnections[Global.BuilderSelectedNodeId]) > 0);
  • Global.BuilderInnerArray = Global.BuilderNodeConnections[Global.BuilderSelectedNodeId];
  • Modify Global Variable(BuilderInnerArray, Append To Array, Global.BuilderTrySelectNodeInLOS);
  • "OR CREATE NEW CONNECTION ARRAY FOR SELECTED NODE"
  • Else;
  • Global.BuilderInnerArray = Empty Array;
  • Global.BuilderInnerArray[0] = Global.BuilderTrySelectNodeInLOS;
  • End;
  • Skip If(!Global.OptimizedInspectorRecorder, 1);
  • Enable Inspector Recording;
  • "ADD CONNECTION ARRAY OF SELECTED NODE IN MATRIX 2X2 OF ALL CONNECTIONS"
  • Global.BuilderNodeConnections[Global.BuilderSelectedNodeId] = Global.BuilderInnerArray;
  • Skip If(!Global.OptimizedInspectorRecorder, 1);
  • Disable Inspector Recording;
  • Play Effect(All Players(All Teams), Buff Impact Sound, Color(White), Event Player, 60);
  • Call Subroutine(BuilderConnectNodeBeamEffect);
  • }
  • }
  • rule("SUBROUTINE: CONNECT NODE (BEAM EFFECT)")
  • {
  • event
  • {
  • Subroutine;
  • BuilderConnectNodeBeamEffect;
  • }
  • actions
  • {
  • Abort If(Global.WorkshopSettingShowConnections);
  • "'BEAM' EFFECT IS EXIST BETWEEN THESE NODES"
  • Abort If(Entity Exists(Global.BuilderNodeConnectionEffectsId[Global.BuilderTrySelectNodeInLOS][Global.BuilderSelectedNodeId]));
  • Abort If(Entity Exists(Global.BuilderNodeConnectionEffectsId[Global.BuilderSelectedNodeId][Global.BuilderTrySelectNodeInLOS]));
  • "VISUAL EFFECT OF CONNECTION"
  • Create Beam Effect(All Players(All Teams), Grapple Beam, Global.BuilderNodePositions[Global.BuilderSelectedNodeId],
  • Global.BuilderNodePositions[Global.BuilderTrySelectNodeInLOS], Color(White), Visible To);
  • "ARRAY LIKE HASH MAP (KEY : VALUE) - KEY - INDEX OF NODE, VALUE - EFFECT ID"
  • If(Count Of(Global.BuilderNodeConnectionEffectsId[Global.BuilderSelectedNodeId]) > 0);
  • Global.BuilderInnerArray = Global.BuilderNodeConnectionEffectsId[Global.BuilderSelectedNodeId];
  • Else;
  • Global.BuilderInnerArray = Empty Array;
  • End;
  • Global.BuilderInnerArray[Global.BuilderTrySelectNodeInLOS] = Last Created Entity;
  • "ADD BEAM EFFECT ARRAY IN MATRIX 2X2 OF ALL CONNECTION EFFECTS"
  • Global.BuilderNodeConnectionEffectsId[Global.BuilderSelectedNodeId] = Global.BuilderInnerArray;
  • }
  • }
  • rule("SUBROUTINE: DISCONNECT NODE")
  • {
  • event
  • {
  • Subroutine;
  • BuilderDisconnectNode;
  • }
  • actions
  • {
  • Play Effect(Event Player, Debuff Impact Sound, Color(White), Event Player, 60);
  • "GET CONNECTION ARRAY FOR SELECTED NODE"
  • Global.BuilderInnerArray = Global.BuilderNodeConnections[Global.BuilderSelectedNodeId];
  • Modify Global Variable(BuilderInnerArray, Remove From Array By Value, Global.BuilderTrySelectNodeInLOS);
  • "REMOVE CONNECTION ARRAY OF SELECTED NODE IN MATRIX 2X2 OF ALL CONNECTIONS"
  • Global.BuilderNodeConnections[Global.BuilderSelectedNodeId] = Global.BuilderInnerArray;
  • "DESTROY BEAM EFFECT"
  • Abort If(Array Contains(Global.BuilderNodeConnections[Global.BuilderTrySelectNodeInLOS], Global.BuilderSelectedNodeId));
  • Destroy Effect(Global.BuilderNodeConnectionEffectsId[Global.BuilderSelectedNodeId][Global.BuilderTrySelectNodeInLOS]);
  • Destroy Effect(Global.BuilderNodeConnectionEffectsId[Global.BuilderTrySelectNodeInLOS][Global.BuilderSelectedNodeId]);
  • Global.BuilderInnerArray = Global.BuilderNodeConnectionEffectsId[Global.BuilderSelectedNodeId];
  • Global.BuilderInnerArray[Global.BuilderTrySelectNodeInLOS] = Null;
  • Global.BuilderNodeConnectionEffectsId[Global.BuilderSelectedNodeId] = Global.BuilderInnerArray;
  • Global.BuilderInnerArray = Global.BuilderNodeConnectionEffectsId[Global.BuilderTrySelectNodeInLOS];
  • Global.BuilderInnerArray[Global.BuilderSelectedNodeId] = Null;
  • Skip If(!Global.OptimizedInspectorRecorder, 1);
  • Enable Inspector Recording;
  • Global.BuilderNodeConnectionEffectsId[Global.BuilderTrySelectNodeInLOS] = Global.BuilderInnerArray;
  • Skip If(!Global.OptimizedInspectorRecorder, 1);
  • Disable Inspector Recording;
  • }
  • }
  • rule("SUBROUTINE: CONCAT STRING CONNECTIONS")
  • {
  • event
  • {
  • Subroutine;
  • BuilderConcatStringConnections;
  • }
  • actions
  • {
  • Destroy In-World Text(Global.BuilderNodeWorldTextIdArray[Global.StringConcatNodeId]);
  • Global.StringConcatCountOfElements = Count Of(Global.BuilderNodeConnections[Global.StringConcatNodeId]);
  • If(Global.StringConcatCountOfElements > 0);
  • For Global Variable(LoopIterator3, 0, Global.StringConcatCountOfElements, 1);
  • "FIRST ELEMENT"
  • If(Global.LoopIterator3 == 0);
  • Global.StringConcatResult = Custom String("{1}", Null,
  • Global.BuilderNodeConnections[Global.StringConcatNodeId][Global.LoopIterator3]);
  • "ADD \",\" SYMBOL BETWEEN ELEMENTS"
  • Else;
  • Global.StringConcatResult = Custom String("{0}{2}{1}", Global.StringConcatResult,
  • Global.BuilderNodeConnections[Global.StringConcatNodeId][Global.LoopIterator3],
  • Global.LoopIterator3 != Global.StringConcatCountOfElements ? Custom String(", ") : Custom String(" "));
  • End;
  • End;
  • Create In-World Text(All Players(All Teams), Custom String("NODE {0}\r\n[ {1} ]", Global.StringConcatNodeId,
  • Global.StringConcatResult), Global.BuilderNodePositions[Global.StringConcatNodeId], 1.200, Do Not Clip, Visible To, Color(
  • White), Default Visibility);
  • Else;
  • Create In-World Text(All Players(All Teams), Custom String("NODE {0}", Global.StringConcatNodeId),
  • Global.BuilderNodePositions[Global.StringConcatNodeId], 1.300, Do Not Clip, Visible To, Color(White), Default Visibility);
  • End;
  • Global.BuilderNodeWorldTextIdArray[Global.StringConcatNodeId] = Last Text ID;
  • }
  • }
  • disabled rule("=== BUILD MODE ===")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • }
  • rule("PLAYER: BUILD MODE")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == False;
  • Host Player == True;
  • Has Spawned(Event Player) == True;
  • (Is Button Held(Event Player, Button(Primary Fire)) || Is Button Held(Event Player, Button(Interact))) == True;
  • Global.BuilderMode == Custom String("BUILD");
  • }
  • actions
  • {
  • "CREATE NEW NODE"
  • If(Is Button Held(Event Player, Button(Primary Fire)));
  • Call Subroutine(BuilderBuildModeCreateNewNode);
  • "OPTIMIZE DATA"
  • disabled Else If(Is Button Held(Event Player, Button(Interact)));
  • disabled Create Progress Bar HUD Text(Event Player, Global.BuilderProgressBarValue, Custom String("PREPARING TO BUILD PROJECT"), Top, 1,
  • "OPTIMIZE DATA"
  • Else If(Is Button Held(Event Player, Button(Interact)));
  • Create Progress Bar HUD Text(Event Player, Global.BuilderProgressBarValue, Custom String("PREPARING TO BUILD PROJECT"), Top, 1,
  • Global.BuilderHudColorBuildMode, Global.BuilderHudColorBuildMode, Visible To and Values, Default Visibility);
  • disabled Global.BuilderProgressBarValue = 0;
  • disabled Chase Global Variable Over Time(BuilderProgressBarValue, 100, 2, Destination and Duration);
  • Global.BuilderProgressBarValue = 0;
  • Chase Global Variable Over Time(BuilderProgressBarValue, 100, 2, Destination and Duration);
  • "HOLD BUTTON N SEC TO BEGIN PROCESS"
  • disabled While(Global.BuilderProgressBarValue != 100);
  • disabled Wait(0.100, Ignore Condition);
  • disabled If(Is Button Held(Event Player, Button(Interact)) == False);
  • disabled Destroy All Progress Bar HUD Text;
  • disabled Abort;
  • disabled End;
  • disabled End;
  • While(Global.BuilderProgressBarValue != 100);
  • Wait(0.100, Ignore Condition);
  • If(Is Button Held(Event Player, Button(Interact)) == False);
  • Destroy All Progress Bar HUD Text;
  • Abort;
  • End;
  • End;
  • "RUN BUILD PROJECT"
  • disabled Destroy All Progress Bar HUD Text;
  • disabled Call Subroutine(BuilderBuildProject);
  • Destroy All Progress Bar HUD Text;
  • Call Subroutine(BuilderBuildProject);
  • End;
  • }
  • }
  • rule("SUBROUTINE: CREATE NEW NODE")
  • {
  • event
  • {
  • Subroutine;
  • BuilderBuildModeCreateNewNode;
  • }
  • actions
  • {
  • Global.BuilderRayCastHitPosition = Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player)
  • + Facing Direction Of(Event Player) * 1000, Null, Event Player, False);
  • "NODE'S OFFSET"
  • Global.BuilderRayCastHitPosition += Ray Cast Hit Normal(Eye Position(Event Player), Eye Position(Event Player)
  • + Facing Direction Of(Event Player) * 999, Null, Event Player, False) * (Global.NodeTriggerRadius / 2);
  • "OTHER NODE IS VERY CLOSE"
  • If(Is True For Any(Filtered Array(Global.BuilderNodePositions, Current Array Element != False), Distance Between(
  • Current Array Element, Global.BuilderRayCastHitPosition) < Global.NodeTriggerRadius * 3));
  • Small Message(Event Player, Custom String("OTHER NODE VERY CLOSE!"));
  • Abort;
  • End;
  • Skip If(!Global.OptimizedInspectorRecorder, 1);
  • Enable Inspector Recording;
  • "CREATE NEW NODE"
  • Modify Global Variable(BuilderNodePositions, Append To Array, Global.BuilderRayCastHitPosition);
  • Global.BuilderInnerArray = Empty Array;
  • Global.BuilderNodeConnections[Index Of Array Value(Global.BuilderNodePositions, Global.BuilderRayCastHitPosition)
  • ] = Global.BuilderInnerArray;
  • Skip If(!Global.OptimizedInspectorRecorder, 1);
  • Disable Inspector Recording;
  • Create Effect(All Players(All Teams), Sphere, Color(Red), Global.BuilderRayCastHitPosition, Global.NodeTriggerRadius, Visible To);
  • Modify Global Variable(BuilderNodeEffectIdArray, Append To Array, Last Created Entity);
  • Create In-World Text(All Players(All Teams), Custom String("NODE {0}", Index Of Array Value(Global.BuilderNodePositions,
  • Global.BuilderRayCastHitPosition)), Global.BuilderRayCastHitPosition, 1.300, Do Not Clip, Visible To, Color(White),
  • Default Visibility);
  • Modify Global Variable(BuilderNodeWorldTextIdArray, Append To Array, Last Text ID);
  • Play Effect(Event Player, Buff Impact Sound, Color(White), Event Player, 60);
  • }
  • }
  • disabled rule("=== BUILD PROJECT ===")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • }
  • rule("SUBROUTINE: BUILD PROJECT")
  • {
  • event
  • {
  • Subroutine;
  • BuilderBuildProject;
  • }
  • actions
  • {
  • Global.IsBuildingProject = True;
  • Call Subroutine(BuilderDeleteAllEffects);
  • Call Subroutine(BuilderOptimizeData);
  • Wait(0.050, Ignore Condition);
  • "SELECTED NODE EFFECT"
  • Call Subroutine(BuilderInitModEffects);
  • Wait(0.050, Ignore Condition);
  • Call Subroutine(BuilderBuildPreparedPathNodes);
  • Call Subroutine(BuilderComputeDistanceMatrix);
  • Global.IsBuildingProject = False;
  • }
  • }
  • rule("SUBROUTINE: DELETE ALL EFFECTS")
  • {
  • event
  • {
  • Subroutine;
  • BuilderDeleteAllEffects;
  • }
  • actions
  • {
  • Destroy All Effects;
  • Destroy All In-World Text;
  • }
  • }
  • rule("SUBROUTINE: OPTIMIZE DATA")
  • {
  • event
  • {
  • Subroutine;
  • BuilderOptimizeData;
  • }
  • actions
  • {
  • Destroy All Progress Bar HUD Text;
  • Global.BuilderProgressBarValue = 0;
  • Create Progress Bar HUD Text(Event Player, Global.BuilderProgressBarValue, Custom String("OPTIMIZING DATA"), Top, 1, Color(Green),
  • Color(Green), Visible To and Values, Default Visibility);
  • Global.BuilderProgressBarValueStep = 100 / Count Of(Global.BuilderNodePositions);
  • Global.NodePositions = Empty Array;
  • Global.DistanceMatrix = Empty Array;
  • Global.NodeConnections = Empty Array;
  • Global.BuildProjectEmptySpace = 0;
  • Global.BuildProjectOldElementIndex = 0;
  • Global.BuildProjectNewElementIndex = 0;
  • For Global Variable(LoopIterator1, 0, Count Of(Global.BuilderNodePositions), 1);
  • Global.BuilderProgressBarValue += Global.BuilderProgressBarValueStep;
  • "SKIP DELETED NODE (ACCUMULATE SPACE BETWEEN INDEXES)"
  • If(Global.BuilderNodePositions[Global.LoopIterator1] == False);
  • Global.BuildProjectEmptySpace += 1;
  • Continue;
  • End;
  • Global.BuildProjectOldElementIndex = Global.LoopIterator1;
  • Global.BuildProjectNewElementIndex = Global.BuildProjectEmptySpace == 0 ? Global.LoopIterator1 : Global.LoopIterator1 - Global.BuildProjectEmptySpace;
  • "CONNECTIONS OF CURRENT NODE"
  • Global.BuilderInnerArray = Global.BuilderNodeConnections[Global.BuildProjectOldElementIndex];
  • Global.NodeConnections[Global.BuildProjectNewElementIndex] = Global.BuilderInnerArray;
  • Modify Global Variable(NodePositions, Append To Array, Global.BuilderNodePositions[Global.BuildProjectOldElementIndex]);
  • "UPDATE INDEXES IN CONNECTION ARRAY"
  • If(Global.BuildProjectEmptySpace > 0 && Count Of(Global.NodeConnections) > 1);
  • Call Subroutine(BuilderUpdateConnectionIndexes);
  • End;
  • "ANTI-CRASH DELAY"
  • Wait(0.020, Ignore Condition);
  • End;
  • Destroy All Progress Bar HUD Text;
  • }
  • }
  • rule("SUBROUTINE: UPDATE CONNECTION INDEXES")
  • {
  • event
  • {
  • Subroutine;
  • BuilderUpdateConnectionIndexes;
  • }
  • actions
  • {
  • "UPDATE CONNECTION INDEXES IN FINAL (OPTIMIZED) ARRAY"
  • For Global Variable(LoopIterator2, 0, Count Of(Global.NodeConnections), 1);
  • Global.BuilderInnerArray = Global.NodeConnections[Global.LoopIterator2];
  • For Global Variable(LoopIterator3, 0, Count Of(Global.BuilderInnerArray), 1);
  • If(Global.BuilderInnerArray[Global.LoopIterator3] == Global.BuildProjectOldElementIndex);
  • Global.BuilderInnerArray[Global.LoopIterator3] = Global.BuildProjectNewElementIndex;
  • End;
  • End;
  • "ANTI-CRASH DELAY"
  • Wait(0.050, Ignore Condition);
  • "WRITE ONLY RESULT INTO INSPECTOR"
  • Enable Inspector Recording;
  • Global.NodeConnections[Global.LoopIterator2] = Global.BuilderInnerArray;
  • "DISABLE INSPECTOR WHILE COMPILING (WRITE RESULT ONLY)"
  • Skip If(!Global.OptimizedInspectorRecorder, 1);
  • Disable Inspector Recording;
  • End;
  • "UPDATE NEXT CONNECTION INDEXES IN INPUT ARRAY"
  • For Global Variable(LoopIterator2, Global.LoopIterator1 + 1, Count Of(Global.BuilderNodeConnections), 1);
  • Global.BuilderInnerArray = Global.BuilderNodeConnections[Global.LoopIterator2];
  • For Global Variable(LoopIterator3, 0, Count Of(Global.BuilderInnerArray), 1);
  • If(Global.BuilderInnerArray[Global.LoopIterator3] == Global.BuildProjectOldElementIndex);
  • Global.BuilderInnerArray[Global.LoopIterator3] = Global.BuildProjectNewElementIndex;
  • End;
  • End;
  • "ANTI-CRASH DELAY"
  • Wait(0.050, Ignore Condition);
  • "WRITE ONLY RESULT INTO INSPECTOR"
  • Enable Inspector Recording;
  • Global.BuilderNodeConnections[Global.LoopIterator2] = Global.BuilderInnerArray;
  • "DISABLE INSPECTOR WHILE COMPILING (WRITE RESULT ONLY)"
  • Skip If(!Global.OptimizedInspectorRecorder, 1);
  • Disable Inspector Recording;
  • End;
  • }
  • }
  • rule("SUBROUTINE: BUILD PREPARED PATH NODES")
  • {
  • event
  • {
  • Subroutine;
  • BuilderBuildPreparedPathNodes;
  • }
  • actions
  • {
  • Abort If(Count Of(Global.NodePositions) == 0);
  • Global.BuilderNodeEffectIdArray = Empty Array;
  • Global.BuilderNodeWorldTextIdArray = Empty Array;
  • Global.BuilderNodeConnectionEffectsId = Empty Array;
  • Skip If(!Global.OptimizedInspectorRecorder, 1);
  • Enable Inspector Recording;
  • Global.BuilderNodePositions = Global.NodePositions;
  • Global.BuilderNodeConnections = Empty Array;
  • Skip If(!Global.OptimizedInspectorRecorder, 1);
  • Disable Inspector Recording;
  • "CREATE NODE EFFECTS"
  • For Global Variable(LoopIterator1, 0, Count Of(Global.NodePositions), 1);
  • Create Effect(All Players(All Teams), Sphere, Color(Red), Global.NodePositions[Global.LoopIterator1], Global.NodeTriggerRadius,
  • Visible To);
  • Modify Global Variable(BuilderNodeEffectIdArray, Append To Array, Last Created Entity);
  • End;
  • Wait(0.100, Ignore Condition);
  • Wait(0.050, Ignore Condition);
  • "COPY FROM NodeConnections TO BuilderNodeConnections"
  • For Global Variable(LoopIterator1, 0, Count Of(Global.NodeConnections), 1);
  • Global.BuilderInnerArray = Global.NodeConnections[Global.LoopIterator1];
  • Skip If(!Global.OptimizedInspectorRecorder, 1);
  • Enable Inspector Recording;
  • Global.BuilderNodeConnections[Global.LoopIterator1] = Global.BuilderInnerArray;
  • Skip If(!Global.OptimizedInspectorRecorder, 1);
  • Disable Inspector Recording;
  • End;
  • "ANTI-CRASH DELAY"
  • Wait(0.100, Ignore Condition);
  • Wait(0.030, Ignore Condition);
  • "CREATE BEAM EFFECTS (CONNECTIONS)"
  • For Global Variable(LoopIterator1, 0, Count Of(Global.BuilderNodeConnections), 1);
  • Global.BuilderSelectedNodeId = Global.LoopIterator1;
  • For Global Variable(LoopIterator2, 0, Count Of(Global.BuilderNodeConnections[Global.LoopIterator1]), 1);
  • Global.BuilderTrySelectNodeInLOS = Global.BuilderNodeConnections[Global.LoopIterator1][Global.LoopIterator2];
  • Call Subroutine(BuilderConnectNodeBeamEffect);
  • End;
  • End;
  • "ANTI-CRASH DELAY"
  • Wait(0.060, Ignore Condition);
  • Wait(0.030, Ignore Condition);
  • "CREATE NODE WORLD TEXTS"
  • For Global Variable(LoopIterator1, 0, Count Of(Global.NodeConnections), 1);
  • "UPDATE IN-WORLD TEXT OF CONNECTED NODE"
  • Global.StringConcatNodeId = Global.LoopIterator1;
  • Call Subroutine(BuilderConcatStringConnections);
  • End;
  • "ANTI-CRASH DELAY"
  • Wait(0.060, Ignore Condition);
  • }
  • }
  • disabled rule("SUBROUTINE: BUILD PROJECT")
  • {
  • event
  • {
  • Subroutine;
  • BuilderBuildProject;
  • }
  • actions
  • {
  • "DISABLE INSPECTOR WHILE COMPILING (WRITE RESULT ONLY)"
  • Skip If(!Global.OptimizedInspectorRecorder, 1);
  • Disable Inspector Recording;
  • "BEGIN COMPILING"
  • Global.IsBuildingProject = True;
  • Call Subroutine(BuilderDeleteAllEffects);
  • Call Subroutine(BuilderOptimizeData);
  • Wait(0.050, Ignore Condition);
  • "SELECTED NODE EFFECT"
  • Call Subroutine(BuilderInitModEffects);
  • Wait(0.050, Ignore Condition);
  • Call Subroutine(BuilderBuildPreparedPathNodes);
  • Call Subroutine(BuilderComputeDistanceMatrix);
  • Global.IsBuildingProject = False;
  • Enable Inspector Recording;
  • }
  • }
  • disabled rule("SUBROUTINE: DELETE ALL EFFECTS")
  • {
  • event
  • {
  • Subroutine;
  • BuilderDeleteAllEffects;
  • }
  • actions
  • {
  • Destroy All Effects;
  • Destroy All In-World Text;
  • }
  • }
  • disabled rule("SUBROUTINE: OPTIMIZE DATA")
  • {
  • event
  • {
  • Subroutine;
  • BuilderOptimizeData;
  • }
  • actions
  • {
  • "PREPARE TO OPTIMAZE DATA"
  • Destroy All Progress Bar HUD Text;
  • Global.BuilderProgressBarValue = 0;
  • Create Progress Bar HUD Text(Event Player, Global.BuilderProgressBarValue, Custom String("OPTIMIZING DATA"), Top, 1, Color(Green),
  • Color(Green), Visible To and Values, Default Visibility);
  • Global.BuilderProgressBarValueStep = 100 / Count Of(Global.BuilderNodePositions);
  • Global.NodePositions = Empty Array;
  • Global.DistanceMatrix = Empty Array;
  • Global.NodeConnections = Empty Array;
  • Global.BuildProjectEmptySpace = 0;
  • Global.BuildProjectOldElementIndex = 0;
  • Global.BuildProjectNewElementIndex = 0;
  • "BEGIN PROCESS"
  • For Global Variable(LoopIterator1, 0, Count Of(Global.BuilderNodePositions), 1);
  • Global.BuilderProgressBarValue += Global.BuilderProgressBarValueStep;
  • "SKIP DELETED NODE (ACCUMULATE SPACE BETWEEN INDEXES)"
  • If(Global.BuilderNodePositions[Global.LoopIterator1] == False);
  • Global.BuildProjectEmptySpace += 1;
  • "ANTI-CRASH DELAY"
  • disabled Wait(0.030, Ignore Condition);
  • Continue;
  • End;
  • Global.BuildProjectOldElementIndex = Global.LoopIterator1;
  • Global.BuildProjectNewElementIndex = Global.BuildProjectEmptySpace == 0 ? Global.LoopIterator1 : Global.LoopIterator1 - Global.BuildProjectEmptySpace;
  • "CONNECTIONS OF CURRENT NODE"
  • Global.BuilderInnerArray = Global.BuilderNodeConnections[Global.BuildProjectOldElementIndex];
  • "WRITE ONLY RESULT INTO INSPECTOR"
  • Enable Inspector Recording;
  • Global.NodeConnections[Global.BuildProjectNewElementIndex] = Global.BuilderInnerArray;
  • Modify Global Variable(NodePositions, Append To Array, Global.BuilderNodePositions[Global.BuildProjectOldElementIndex]);
  • "DISABLE INSPECTOR WHILE COMPILING (WRITE RESULT ONLY)"
  • Skip If(!Global.OptimizedInspectorRecorder, 1);
  • Disable Inspector Recording;
  • "UPDATE INDEXES IN CONNECTION ARRAY"
  • If(Global.BuildProjectEmptySpace > 0 && Count Of(Global.NodeConnections) > 1);
  • Call Subroutine(BuilderUpdateConnectionIndexes);
  • End;
  • "ANTI-CRASH DELAY"
  • Wait(0.060, Ignore Condition);
  • End;
  • Destroy All Progress Bar HUD Text;
  • Enable Inspector Recording;
  • Wait(0.030, Ignore Condition);
  • }
  • }
  • disabled rule("SUBROUTINE: COMPUTE DISTANCE MATRIX")
  • rule("SUBROUTINE: COMPUTE DISTANCE MATRIX")
  • {
  • event
  • {
  • Subroutine;
  • BuilderComputeDistanceMatrix;
  • }
  • actions
  • {
  • "INIT PROGRESS BAR"
  • Destroy All Progress Bar HUD Text;
  • Create Progress Bar HUD Text(All Players(All Teams), Global.BuilderProgressBarValue, Custom String("COMPUTING DISTANCE MATRIX..."),
  • Top, 1, Color(Purple), Color(Purple), Visible To and Values, Default Visibility);
  • Global.BuilderProgressBarValue = 0;
  • Global.BuilderProgressBarValueStep = 100 / Count Of(Global.NodeConnections);
  • "INIT DISTANCE MATRIX SIZE"
  • "INIT DISTANCE MATRIX"
  • Global.DistanceMatrix[Count Of(Global.NodeConnections) - 1] = 0;
  • "CALCULATE ALL DISTANCES FOR EACH NODE"
  • For Global Variable(BuildProjectStartNodeId, 0, Count Of(Global.NodeConnections), 1);
  • "ALL DISTANCES FROM START NODE TO OTHERS"
  • Global.BuilderInnerArray = Empty Array;
  • Global.BuilderInnerArray[0] = 0;
  • "CLEAR QUEUE AND VISITED ARRAYES FOR EACH NODE"
  • Global.BuildProjectQueueArray = Empty Array;
  • Global.BuildProjectVisitedNodes = Empty Array;
  • "PUT THE START NODE IN QUEUE AND MAKE IT VISITED"
  • Modify Global Variable(BuildProjectQueueArray, Append To Array, Global.BuildProjectStartNodeId);
  • Modify Global Variable(BuildProjectVisitedNodes, Append To Array, Global.BuildProjectStartNodeId);
  • "VISIT ALL NODES"
  • While(Count Of(Global.BuildProjectQueueArray) > 0);
  • "POP FIRST NODE FROM QUEUE"
  • Global.BuildProjectCurrentNodeId = Global.BuildProjectQueueArray[0];
  • Modify Global Variable(BuildProjectQueueArray, Remove From Array By Index, 0);
  • "VISIT NEIGHBOR NODES"
  • For Global Variable(LoopIterator1, 0, Count Of(Global.NodeConnections[Global.BuildProjectCurrentNodeId]), 1);
  • Global.BuildProjectNeighborNodeId = Global.NodeConnections[Global.BuildProjectCurrentNodeId][Global.LoopIterator1];
  • If(!Array Contains(Global.BuildProjectVisitedNodes, Global.BuildProjectNeighborNodeId));
  • "ADD NEIGHBOR IN QUEUE AND MARK IT AS VISITED"
  • Modify Global Variable(BuildProjectQueueArray, Append To Array, Global.BuildProjectNeighborNodeId);
  • Modify Global Variable(BuildProjectVisitedNodes, Append To Array, Global.BuildProjectNeighborNodeId);
  • "ACCUMULATE DISTANCE TO NEIGHBOR"
  • Global.BuilderInnerArray[Global.BuildProjectNeighborNodeId] = Global.BuilderInnerArray[Global.BuildProjectCurrentNodeId] + 1;
  • End;
  • End;
  • "ANTI-CRASH DELAY"
  • Wait(0.100, Ignore Condition);
  • Wait(0.016, Ignore Condition);
  • End;
  • "WRITE ONLY RESULT INTO INSPECTOR"
  • Enable Inspector Recording;
  • "REPLACE ZERO TO INF (9999)"
  • Global.BuilderInnerArray[Global.BuildProjectStartNodeId] = 9999;
  • "ADD RESULT IN DISTANCE MATRIX"
  • Global.DistanceMatrix[Global.BuildProjectStartNodeId] = Global.BuilderInnerArray;
  • "DISABLE INSPECTOR WHILE COMPILING (WRITE RESULT ONLY)"
  • Skip If(!Global.OptimizedInspectorRecorder, 1);
  • Disable Inspector Recording;
  • Global.BuilderProgressBarValue += Global.BuilderProgressBarValueStep;
  • End;
  • Destroy All Progress Bar HUD Text;
  • }
  • }
  • disabled rule("=== PATH FINDING MODE ===")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • }
  • rule("PLAYER: PATH FINDING MODE")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == False;
  • Host Player == True;
  • Has Spawned(Event Player) == True;
  • (Is Button Held(Event Player, Button(Primary Fire)) || Is Button Held(Event Player, Button(Secondary Fire)) || Is Button Held(
  • Event Player, Button(Ultimate)) || Is Button Held(Event Player, Button(Interact))) == True;
  • Global.BuilderMode == Custom String("PATH FINDING");
  • }
  • actions
  • {
  • "SET START OR TARGET NODE"
  • If(Is Button Held(Event Player, Button(Primary Fire)) || Is Button Held(Event Player, Button(Secondary Fire)));
  • Call Subroutine(PathFindingModeSelectNode);
  • "CREATE TEST BOT"
  • Else If(Is Button Held(Event Player, Button(Ultimate)));
  • If(Global.PathFindingStartNodeId != -1 && Global.PathFindingTargetNodeId != -1);
  • Call Subroutine(PathFindingCreateBot);
  • End;
  • "BOOP TEST BOT"
  • Else If(Is Button Held(Event Player, Button(Interact)));
  • Apply Impulse(Global.PathFindingBotId, Vector(X Component Of(Facing Direction Of(Event Player)), 0.200, Z Component Of(
  • Facing Direction Of(Event Player))), 20, To World, Cancel Contrary Motion);
  • End;
  • }
  • }
  • rule("SUBROUTINE: PATH FINDING SELECT NODE")
  • {
  • event
  • {
  • Subroutine;
  • PathFindingModeSelectNode;
  • }
  • actions
  • {
  • disabled Abort If(Global.BuilderTrySelectNodeInLOS == -1);
  • Global.BuilderRayCastHitPosition = Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player)
  • + Facing Direction Of(Event Player) * 999, Null, Event Player, False);
  • "SET START NODE"
  • If(Is Button Held(Event Player, Button(Primary Fire)));
  • Global.PathFindingStartNodeId = Index Of Array Value(Global.NodePositions, Sorted Array(Filtered Array(Global.NodePositions,
  • Is In Line of Sight(Global.BuilderRayCastHitPosition + Vector(0, 2, 0), Current Array Element, Barriers Do Not Block LOS)
  • == True), Distance Between(Global.BuilderRayCastHitPosition, Current Array Element))[0]);
  • Global.PathFindingStartPosition = Global.BuilderRayCastHitPosition;
  • Global.PathFindingStartNodeEffectPos = Global.PathFindingStartPosition;
  • "SET TARGET NODE"
  • Else If(Is Button Held(Event Player, Button(Secondary Fire)));
  • Global.PathFindingTargetNodeId = Index Of Array Value(Global.NodePositions, Sorted Array(Filtered Array(Global.NodePositions,
  • Is In Line of Sight(Global.BuilderRayCastHitPosition + Vector(0, 2, 0), Current Array Element, Barriers Do Not Block LOS)
  • == True), Distance Between(Global.BuilderRayCastHitPosition, Current Array Element))[0]);
  • Global.PathFindingTargetPosition = Global.BuilderRayCastHitPosition;
  • Global.PathFindingTargetNodeEffectPos = Global.PathFindingTargetPosition;
  • End;
  • "DRAW PATH"
  • If(Global.PathFindingStartNodeId != -1 && Global.PathFindingTargetNodeId != -1);
  • disabled Call Subroutine(DeleteNodeBeams);
  • Call Subroutine(PathFindingDrawShortestPath);
  • disabled Call Subroutine(CreateNodeBeams);
  • Call Subroutine(PathFindingGetShortestPath);
  • Call Subroutine(DeleteNodeBeams);
  • Call Subroutine(CreateNodeBeams);
  • "CLEAR PATH"
  • Else If(Global.PathFindingStartNodeId == -1 || Global.PathFindingTargetNodeId == -1);
  • Call Subroutine(DeleteNodeBeams);
  • End;
  • }
  • }
  • disabled rule("SUBROUTINE: PATH FINDING SELECT NODE !!!OLD")
  • {
  • event
  • {
  • Subroutine;
  • PathFindingModeSelectNode;
  • }
  • actions
  • {
  • disabled Abort If(Global.BuilderTrySelectNodeInLOS == -1);
  • "SET START NODE"
  • If(Is Button Held(Event Player, Button(Primary Fire)));
  • Global.PathFindingStartPosition = Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player)
  • + Facing Direction Of(Event Player) * 999, Null, Event Player, False);
  • Global.PathFindingStartNodeId = Global.BuilderTrySelectNodeInLOS;
  • "BIND EFFECT TO NODE"
  • disabled Global.PathFindingStartNodeEffectPos = Global.NodePositions[Global.BuilderTrySelectNodeInLOS];
  • "BIND EFFECT TO RAY CAST POS"
  • Global.PathFindingStartNodeEffectPos = Global.PathFindingStartPosition;
  • If(Global.PathFindingStartNodeId == Global.PathFindingTargetNodeId);
  • Global.PathFindingTargetNodeId = -1;
  • Global.PathFindingTargetNodeEffectPos = Vector(0, -999, 0);
  • End;
  • "SET TARGET NODE"
  • Else If(Is Button Held(Event Player, Button(Secondary Fire)));
  • Global.PathFindingTargetPosition = Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player)
  • + Facing Direction Of(Event Player) * 999, Null, Event Player, False);
  • Global.PathFindingTargetNodeId = Global.BuilderTrySelectNodeInLOS;
  • "BIND EFFECT TO NODE"
  • disabled Global.PathFindingTargetNodeEffectPos = Global.NodePositions[Global.BuilderTrySelectNodeInLOS];
  • "BIND EFFECT TO RAY CAST POS"
  • Global.PathFindingTargetNodeEffectPos = Global.PathFindingTargetPosition;
  • If(Global.PathFindingTargetNodeId == Global.PathFindingStartNodeId);
  • Global.PathFindingStartNodeId = -1;
  • Global.PathFindingStartNodeEffectPos = Vector(0, -999, 0);
  • End;
  • End;
  • "DRAW PATH"
  • If(Global.PathFindingStartNodeId != -1 && Global.PathFindingTargetNodeId != -1);
  • Call Subroutine(PathFindingGetShortestPath);
  • Call Subroutine(DeleteNodeBeams);
  • Call Subroutine(CreateNodeBeams);
  • "CLEAR PATH"
  • Else If(Global.PathFindingStartNodeId == -1 || Global.PathFindingTargetNodeId == -1);
  • Call Subroutine(DeleteNodeBeams);
  • End;
  • }
  • }
  • rule("SUBROUTINE: PATH FINDING MODE RESET")
  • {
  • event
  • {
  • Subroutine;
  • PathFindingModeReset;
  • }
  • actions
  • {
  • Global.PathFindingStartNodeId = -1;
  • Global.PathFindingTargetNodeId = -1;
  • Global.PathFindingStartNodeEffectPos = Vector(0, -999, 0);
  • Global.PathFindingTargetNodeEffectPos = Vector(0, -999, 0);
  • Call Subroutine(DeleteNodeBeams);
  • }
  • }
  • rule("SUBROUTINE: DELETE NODE BEAM EFFECTS")
  • {
  • event
  • {
  • Subroutine;
  • DeleteNodeBeams;
  • }
  • actions
  • {
  • If(Count Of(Global.BeamEffects) > 0);
  • For Global Variable(LoopIterator1, 0, Count Of(Global.BeamEffects), 1);
  • Destroy Effect(Global.BeamEffects[Global.LoopIterator1]);
  • End;
  • Global.BeamEffects = Empty Array;
  • End;
  • }
  • }
  • rule("SUBROUTINE: CREATE NODE BEAM EFFECTS")
  • {
  • event
  • {
  • Subroutine;
  • CreateNodeBeams;
  • }
  • actions
  • {
  • If(Global.BuilderMode == Custom String("PATH FINDING"));
  • disabled For Global Variable(LoopIterator1, 0, Count Of(Global.PathFindingNextNodeId) - 1, 1);
  • disabled Create Beam Effect(All Players(All Teams), Bad Beam, Global.NodePositions[Global.PathFindingNextNodeId[Global.LoopIterator1]],
  • Global.NodePositions[Global.PathFindingNextNodeId[Global.LoopIterator1 + 1]], Global.BuilderHudColorCurrent, Visible To);
  • disabled Modify Global Variable(BeamEffects, Append To Array, Last Created Entity);
  • disabled End;
  • For Global Variable(LoopIterator1, 0, Count Of(Global.PathFindingResultPath) - 1, 1);
  • Create Beam Effect(All Players(All Teams), Bad Beam, Global.NodePositions[Global.PathFindingResultPath[Global.LoopIterator1]],
  • Global.NodePositions[Global.PathFindingResultPath[Global.LoopIterator1 + 1]], Global.BuilderHudColorCurrent, Visible To);
  • Modify Global Variable(BeamEffects, Append To Array, Last Created Entity);
  • End;
  • Else If(Global.BuilderMode == Custom String("EDIT"));
  • For Global Variable(LoopIterator1, 0, Count Of(Global.BuilderNodeConnections[Global.BuilderSelectedNodeId]), 1);
  • Create Beam Effect(All Players(All Teams), Good Beam, Global.BuilderNodePositions[Global.BuilderSelectedNodeId],
  • Global.BuilderNodePositions[Global.BuilderNodeConnections[Global.BuilderSelectedNodeId][Global.LoopIterator1]],
  • Global.BuilderHudColorEditMode, Visible To);
  • Modify Global Variable(BeamEffects, Append To Array, Last Created Entity);
  • End;
  • End;
  • }
  • }
  • disabled rule("SUBROUTINE: PATH FINDING DRAW SHORTEST PATH")
  • rule("SUBROUTINE: PATH FINDING GET SHORTEST PATH")
  • {
  • event
  • {
  • Subroutine;
  • PathFindingDrawShortestPath;
  • PathFindingGetShortestPath;
  • }
  • actions
  • {
  • Call Subroutine(DeleteNodeBeams);
  • Global.BeamEffects = Empty Array;
  • Create Beam Effect(All Players(All Teams), Good Beam, Global.PathFindingStartNodeEffectPos,
  • Global.NodePositions[Global.PathFindingStartNodeId], Color(Purple), Visible To);
  • Modify Global Variable(BeamEffects, Append To Array, Last Created Entity);
  • Call Subroutine(BotResetPathFinding);
  • Global.PathFindingResultPath = Empty Array;
  • Global.BuildProjectVisitedNodes = Empty Array;
  • Global.PathFindingCurrentNodeId = Global.PathFindingStartNodeId;
  • Event Player.BotClosestNodeIdToBot = Global.PathFindingStartNodeId;
  • Event Player.BotClosestNodeIdToTarget = Global.PathFindingTargetNodeId;
  • While(Global.PathFindingCurrentNodeId != Event Player.BotClosestNodeIdToTarget);
  • Event Player.BotPrevNodeId = Global.PathFindingCurrentNodeId;
  • Call Subroutine(BotGetNextNodeId);
  • Create Beam Effect(All Players(All Teams), Good Beam, Global.NodePositions[Global.PathFindingCurrentNodeId],
  • Global.NodePositions[Event Player.BotNextNodeId], Color(Purple), Visible To);
  • Modify Global Variable(BeamEffects, Append To Array, Last Created Entity);
  • Global.PathFindingCurrentNodeId = Event Player.BotNextNodeId;
  • Event Player.BotClosestNodeIdToBot = Event Player.BotNextNodeId;
  • While(Global.PathFindingCurrentNodeId != Global.PathFindingTargetNodeId);
  • Modify Global Variable(PathFindingResultPath, Append To Array, Global.PathFindingCurrentNodeId);
  • Global.PathFindingShortestDistance = 999;
  • Global.BuilderInnerArray = Global.NodeConnections[Global.PathFindingCurrentNodeId];
  • For Global Variable(LoopIterator1, 0, Count Of(Global.BuilderInnerArray), 1);
  • If(Array Contains(Global.PathFindingResultPath, Global.BuilderInnerArray[Global.LoopIterator1]));
  • Continue;
  • Else If(Global.BuilderInnerArray[Global.LoopIterator1] == Global.PathFindingTargetNodeId);
  • Modify Global Variable(PathFindingResultPath, Append To Array, Global.PathFindingTargetNodeId);
  • Global.PathFindingCurrentNodeId = Global.PathFindingTargetNodeId;
  • Break;
  • End;
  • Global.PathFindingCurrentDistance = Global.DistanceMatrix[Global.BuilderInnerArray[Global.LoopIterator1]][Global.PathFindingTargetNodeId];
  • If(Global.PathFindingCurrentDistance < Global.PathFindingShortestDistance);
  • Global.PathFindingShortestDistance = Global.PathFindingCurrentDistance;
  • Global.PathFindingCurrentNodeId = Global.BuilderInnerArray[Global.LoopIterator1];
  • End;
  • End;
  • "IMPOSSIBLE TO REACH TARGET NODE"
  • If(Count Of(Global.PathFindingResultPath) > 1 && Global.PathFindingResultPath[Count Of(Global.PathFindingResultPath)
  • - 1] == Global.PathFindingResultPath[Count Of(Global.PathFindingResultPath) - 2]);
  • Small Message(All Players(All Teams), Custom String("IMPOSSIBLE TO REACH TARGET NODE {0}", Global.PathFindingTargetNodeId));
  • Global.PathFindingResultPath = Empty Array;
  • Abort;
  • End;
  • "ANTI-CRASH DELAY"
  • Wait(0.020, Ignore Condition);
  • Wait(0.016, Ignore Condition);
  • End;
  • Create Beam Effect(All Players(All Teams), Good Beam, Global.NodePositions[Event Player.BotClosestNodeIdToTarget],
  • Global.PathFindingTargetNodeEffectPos, Color(Purple), Visible To);
  • Modify Global Variable(BeamEffects, Append To Array, Last Created Entity);
  • }
  • }
  • rule("SUBROUTINE: PATH FINDING CREATE TEST BOT")
  • {
  • event
  • {
  • Subroutine;
  • PathFindingCreateBot;
  • }
  • actions
  • {
  • If(!Entity Exists(Global.PathFindingBotId));
  • Create Dummy Bot(Random Value In Array(All Heroes), Opposite Team Of(Team Of(Event Player)), -1, Global.PathFindingStartPosition,
  • Vector(0, 0, 0));
  • Global.PathFindingBotId = Last Created Entity;
  • Set Move Speed(Global.PathFindingBotId, Global.PropertyBotMovementSpeed);
  • Start Forcing Dummy Bot Name(Global.PathFindingBotId, Custom String("TEST BOT"));
  • Else;
  • Start Forcing Player To Be Hero(Global.PathFindingBotId, Random Value In Array(All Heroes));
  • Teleport(Global.PathFindingBotId, Global.PathFindingStartPosition);
  • End;
  • Call Subroutine(PathFindingTestBotReset);
  • "ANTI-BUG DELAY"
  • Wait(0.100, Ignore Condition);
  • Global.PathFindingBotId.BotTargetPosition = Global.PathFindingTargetPosition;
  • disabled Global.PathFindingBotId.BotTargetPlayer = Event Player;
  • }
  • }
  • disabled rule("=== TEST BOT ===")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • }
  • rule("BOT: INIT")
  • {
  • event
  • {
  • Player Joined Match;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • }
  • actions
  • {
  • Call Subroutine(BotResetPathFinding);
  • "LINE OF SIGHT TO NEXT NODE"
  • Create Beam Effect(All Players(All Teams), Good Beam, Update Every Frame(Position Of(Event Player) + Vector(0, 0.700, 0)),
  • Update Every Frame(Event Player.BotNextNodePosition + Vector(0, 0.700, 0)), Color(Green), Visible To Position and Radius);
  • Create Effect(All Players(All Teams), Sphere, Color(Green), Event Player.BotNextNodePosition + Vector(0, 0.700, 0), 0.150,
  • Visible To Position and Radius);
  • Create Beam Effect(All Players(All Teams), Good Beam, Update Every Frame(Position Of(Event Player) + Vector(0, 1.600, 0)),
  • Update Every Frame(Event Player.BotNextNodePosition + Vector(0, 2, 0)), Color(Green), Visible To Position and Radius);
  • "Y DIFF BETWEEN BOT POS AND NODE POS"
  • Create Beam Effect(All Players(All Teams), Good Beam, Update Every Frame(Position Of(Event Player)), Update Every Frame(
  • Position Of(Event Player) + Vector(0, 2, 0)), Color(Red), Visible To Position and Radius);
  • Create HUD Text(All Players(All Teams), Custom String("TEST BOT INFO\r\nCLOSEST NODE: {0}\r\nCLOSEST NODE IN LOS: {1}\r\n{2}",
  • Index Of Array Value(Global.NodePositions, Sorted Array(Global.NodePositions, Distance Between(Position Of(Event Player),
  • Current Array Element))[0]), Index Of Array Value(Global.NodePositions, Sorted Array(Filtered Array(Global.NodePositions,
  • Is In Line of Sight(Eye Position(Event Player), Current Array Element, Barriers Do Not Block LOS) == True), Distance Between(
  • Position Of(Event Player), Current Array Element))[0]), Custom String("PREV NODE {0}\r\nNEXT NODE {1}\r\n{2}",
  • Global.PathFindingBotId.BotTimestamp, Global.PathFindingBotId.BotNextNodeId, Custom String(
  • Global.PathFindingBotId.BotPrevNodeId, Global.PathFindingBotId.BotNextNodeId, Custom String(
  • "TARGET NODE {0}\r\nY DIFF {1}\r\nSEE NEXT NODE {2}", Event Player.BotClosestNodeIdToTarget, Y Component Of(Position Of(
  • Event Player)) - Y Component Of(Global.NodePositions[Event Player.BotNextNodeId]), Is In Line of Sight(Position Of(
  • Event Player) + Vector(0, 1.600, 0), Global.NodePositions[Event Player.BotNextNodeId] + Vector(0, 2, 0),
  • Barriers Do Not Block LOS)))), Null, Null, Right, -1, Color(Purple), Color(White), Color(White), Visible To and String,
  • Default Visibility);
  • }
  • }
  • rule("SUBROUTINE: TEST BOT RESET")
  • {
  • event
  • {
  • Subroutine;
  • PathFindingTestBotReset;
  • }
  • actions
  • {
  • Global.PathFindingBotId.BotPrevNodeId = -1;
  • Global.PathFindingBotId.BotTargetPlayer = -1;
  • Global.PathFindingBotId.BotTargetPosition = -1;
  • Global.PathFindingBotId.BotPrevNodeId = -1;
  • Global.PathFindingBotId.BotClosestNodeIdToTarget = -1;
  • Global.PathFindingBotId.BotNextNodeId = -1;
  • Global.PathFindingBotId.BotNextNodePosition = -1;
  • Global.PathFindingBotId.BotIsPathFinding = False;
  • Global.PathFindingBotId.BotCancelPathFinding = False;
  • Stop Facing(Global.PathFindingBotId);
  • Stop Throttle In Direction(Global.PathFindingBotId);
  • }
  • }
  • }
Join the Workshop.codes Discord