Return to post
settings
{
main
{
Description: "Path node builder v1.2 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"
}
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
{
Capture the Flag
{
enabled maps
{
}
}
Escort
{
enabled maps
{
}
}
Hybrid
{
enabled maps
{
}
}
Team Deathmatch
{
enabled maps
{
Workshop Expanse
}
}
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
}
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: PathFindingResultPath
44: PathFindingShortestDistance
45: PathFindingCurrentDistance
43: PathFindingNextNodeId
46: PathFindingCurrentNodeId
47: PathFindingBotId
48: NodeTriggerRadius
49: PathFindingStartPosition
50: PathFindingTargetPosition
51: OptimizedInspectorRecorder
52: WorkshopSettingShowConnections
125: NodePositions
126: NodeConnections
127: DistanceMatrix
player:
0: BuilderModeInfoHudId
119: BotLoopIterator1
120: BotTempArray
121: BotTargetPlayer
122: BotTargetPosition
123: BotTargetNodeId
124: BotCurrentNodeId
125: BotCurrentDistance
126: BotShortestDistance
109: BotTempVar1
110: BotLoopCurrentNodeId
111: BotCurrentDistanceInMeters
112: BotShortestDistanceInMeters
113: BotPrevNodeId
114: BotMoveSpeedMultiplier
115: BotCancelPathFinding
116: BotLoopIterator1
117: BotLoopConnectionArray
118: BotTargetPlayer
119: BotTargetPosition
120: BotClosestNodeIdToTarget
121: BotClosestNodeIdToBot
122: BotTimestamp
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: PathFindingGetShortestPath
22: PathFindingDrawShortestPath
23: PathFindingCreateBot
24: PathFindingResetBot
124: BotGetCurrentNodeId
125: BotGetTargetNodeId
126: BotGetNextNodeId
127: BotResetPathFinding
24: PathFindingTestBotReset
122: BotResetPathFinding
123: BotGetTargetNodeAndPosition
124: BotGetNextNodeId
125: BotGetNextPosition
126: BotComputeTimestamp
127: BotGetRightHandPartOfFloatNumber
}
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("PATH NODES BUILDER V{0} BY HUKUTA94#2589", 0.630), Right, -1000,
Color(White), Color(White), Color(White), Visible To, Default Visibility);
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.2 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);
}
}
disabled rule("=== EXPORT BLOCK START - COPY THESE RULES AND SUBROUTINES INTO YOUR MODE ===")
rule("=== PATH NODE BUILDER - EXPORT BLOCK START - COPY THESE RULES AND SUBROUTINES INTO YOUR MODE ===")
{
event
{
Ongoing - Global;
}
}
rule("MAP: WORKSHOP CHAMBER")
rule("MAP: AYUTTHAYA")
{
event
{
Ongoing - Global;
}
conditions
{
Current Map == Map(Workshop Chamber);
Current Map == Map(Ayutthaya);
}
actions
{
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));
Global.NodePositions = Array(Vector(-6.651, 5.425, 13.629), Vector(-10.881, 4.425, 8.373), Vector(16.012, 1.425, 22.821), Vector(
20.097, 0.425, 14.688), Vector(12.073, 0.425, 14.524), Vector(37.780, -0.575, 20.159), Vector(37.938, -2.575, 27.722), Vector(
1.993, -2.575, 28.895), Vector(2.196, -1.575, 22.262), Vector(-5.931, 5.425, 21.822), Vector(30.731, -2.575, 28.813), Vector(
40.258, 6.425, 46.573), Vector(40.250, 6.425, 35.155), Vector(40.442, 6.425, 24.787), Vector(33.741, 6.425, 22.676), Vector(
16.022, 6.425, 21.885), Vector(33.485, 0.425, 13.716), Vector(34.029, 5.425, 10.129), Vector(23.958, 3.425, 10.030), Vector(
0.506, 0.426, -7.211), Vector(33.909, 0.425, -6.433), Vector(30.936, 0.425, -19.278), Vector(10.683, -0.577, -1.908), Vector(
3.361, 0.428, 5.628), Vector(22.625, -0.575, -2.360), Vector(22.632, -0.575, -12.587), Vector(11.042, -0.575, -12.389), Vector(
10.044, 3.425, -23.823), Vector(45.752, 4.425, -21.864), Vector(40.346, 5.420, -26.974), Vector(0.367, 0.425, -28.522), Vector(
14.458, 0.425, -28.321), Vector(21.565, 0.425, -28.369), Vector(-0.068, 5.425, -23.937), Vector(18.093, 1.425, -36.987),
Vector(-3.805, -0.575, -33.903), Vector(31.927, -1.575, -36.096), Vector(31.941, -2.575, -43), Vector(4.376, -2.575, -42.417),
Vector(39.708, 3.425, -46.896), Vector(17.903, 1.425, -51.176), Vector(9.704, 1.425, -73.848), Vector(-6.654, 6.425, -49.481),
Vector(-6.911, 6.425, -37.334), Vector(1.157, 6.425, -36.046), Vector(39.635, 5.425, -36.130), Vector(-3.512, 3.425, 60.161),
Vector(-4.188, -2.575, -42.257), Vector(18.225, -2.575, -44.040), Vector(16.055, 1.432, 30.092), Vector(15.956, -2.575,
30.017), Vector(26.010, 1.425, -73.337), Vector(39.345, 3.425, -58.965), Vector(9.497, 1.425, -62.521), Vector(26.565, 1.425,
-60.700), Vector(43.557, 3.425, -58.977), Vector(43.575, -2.575, -43.810), Vector(-8.771, 3.425, 44.467), Vector(-9.616,
-2.575, 29.053), Vector(24.040, 1.425, 59.225), Vector(7.967, 1.425, 59.527), Vector(24.504, 1.425, 49.171), Vector(6.510,
1.425, 48.371), Vector(-4.986, 3.425, 32.198));
Global.NodeConnections = Array(Array(9, 1, 4), Array(0, 23), Array(5, 8, 4, 3, 49), Array(2, 4, 16, 22), Array(3, 2, 23, 24),
Array(2, 6), Array(5, 10), Array(8, 50, 58), Array(2, 7), Array(0, 15, 63), Array(6, 50, 61), Array(12, 61), Array(13, 11),
Array(14, 12), Array(13, 17, 15), Array(9, 14, 4, 3, 49), Array(3, 20), Array(14, 18, 20), Array(17, 3, 24), Array(26, 22, 23,
30), Array(24, 25, 21, 16), Array(25, 28, 20, 32), Array(26, 19, 23, 24, 3), Array(1, 19, 4, 22), Array(18, 22, 20, 25, 4),
Array(26, 21, 20, 24, 31), Array(19, 25, 22, 27, 32), Array(26, 33), Array(29, 21), Array(28, 45), Array(31, 19), Array(32, 30,
34, 25), Array(31, 21, 34, 26), Array(27, 44, 19), Array(35, 36, 32, 31, 40), Array(34, 47), Array(34, 37), Array(36, 48, 56),
Array(47, 48), Array(45, 52), Array(34, 54, 53), Array(51, 53), Array(43), Array(44, 42), Array(43, 33), Array(39, 29), Array(
57, 60), Array(35, 38), Array(37), Array(2, 7, 10, 61, 62), Array(7, 10), Array(41, 54), Array(54, 39, 55), Array(41, 40, 54),
Array(53, 40, 51, 52), Array(52, 56), Array(55, 37), Array(58, 62, 63, 46), Array(7, 57), Array(60, 61), Array(59, 62, 46),
Array(11, 59, 10, 62), Array(61, 60, 49, 57, 63), Array(62, 57, 9));
Global.DistanceMatrix = Array(Array(1.001, 2.004, 2.004, 1.003, 3.005, 4.006, 4.005, 3.005, 1.001, 4.005, 5.005, 5.005, 4.004,
3.003, 2.002, 3.005, 4.004, 3.005, 3.003, 3.005, 4.006, 3.003, 2.002, 2.004, 3.005, 4.004, 5.005, 5.007, 6.008, 4.004, 4.005,
5.005, 6.004, 5.006, 6.007, 6.007, 7.008, 8.009, 8.010, 6.007, 8.009, 9.007, 8.006, 7.005, 7.009, 4.004, 7.008, 8.009, 3.004,
5.006, 8.009, 8.009, 7.008, 7.008, 9.010, 8.009, 3.003, 4.004, 5.005, 4.004, 4.004, 3.003, 2.002), Array(3.003, 3.003, 2.002,
4.004, 5.005, 5.005, 4.004, 2.002, 5.006, 6.006, 6.006, 5.005, 4.004, 3.003, 4.004, 5.005, 4.004, 2.002, 4.004, 5.005, 2.002,
1.001, 3.003, 4.004, 3.003, 4.004, 6.006, 7.007, 3.003, 4.004, 4.004, 5.003, 5.005, 6.006, 6.006, 7.007, 8.008, 9.009, 6.006,
8.008, 8.006, 7.005, 6.004, 8.008, 5.005, 7.007, 8.008, 4.004, 6.006, 8.008, 8.008, 7.007, 7.007, 9.009, 8.008, 4.004, 5.005,
6.006, 5.005, 5.005, 4.004, 3.003), Array(1.001, 1.001, 1.001, 2.002, 2.002, 1.001, 4.003, 2.003, 3.004, 4.005, 5.004, 5.003,
5.002, 2.002, 4.003, 3.002, 3.003, 3.003, 4.004, 2.002, 2.002, 2.002, 3.003, 3.003, 4.004, 5.005, 6.006, 4.004, 4.004, 4.004,
5.004, 5.005, 6.006, 6.006, 7.007, 8.008, 8.008, 6.006, 8.008, 8.007, 7.006, 6.005, 7.007, 4.004, 7.007, 8.008, 1.001, 3.003,
8.008, 8.008, 7.007, 7.007, 9.009, 8.008, 3.003, 3.003, 3.004, 3.003, 2.003, 2.002, 3.003), Array(1.001, 2.002, 3.003, 3.003,
2.002, 5.002, 3.004, 4.005, 5.004, 6.003, 5.002, 6.001, 1.001, 4.002, 3.001, 2.002, 2.002, 3.003, 1.001, 2.002, 2.002, 3.003,
2.002, 3.003, 4.004, 5.005, 3.003, 4.004, 3.003, 4.003, 4.004, 5.005, 5.005, 6.006, 7.007, 7.007, 5.005, 7.007, 7.006, 6.005,
5.004, 6.006, 5.005, 6.006, 7.007, 2.002, 4.004, 7.007, 7.007, 6.006, 6.006, 8.008, 7.007, 4.004, 4.004, 4.005, 4.004, 3.004,
3.003, 4.003), Array(2.002, 3.003, 3.003, 2.002, 4.002, 3.004, 4.005, 5.004, 5.003, 4.002, 5.001, 2.002, 3.003, 2.002, 2.002,
2.002, 3.003, 2.002, 1.001, 1.001, 2.002, 3.003, 4.004, 4.004, 5.005, 3.003, 3.003, 4.004, 5.003, 4.004, 5.005, 5.005, 6.006,
7.007, 7.007, 5.005, 7.007, 8.006, 7.005, 6.004, 6.006, 5.005, 6.006, 7.007, 2.002, 4.004, 7.007, 7.007, 6.006, 6.006, 8.008,
7.007, 4.004, 4.004, 4.005, 4.004, 3.004, 3.003, 4.003), Array(1.001, 3.003, 2.002, 5.004, 2.002, 4.004, 5.005, 6.005, 6.004,
6.003, 3.003, 5.004, 4.003, 4.004, 4.004, 5.005, 3.003, 3.003, 3.003, 4.004, 4.004, 5.005, 6.006, 7.007, 5.005, 5.005, 5.005,
6.005, 6.006, 7.007, 7.007, 8.008, 9.009, 9.009, 7.007, 9.009, 9.008, 8.007, 7.006, 8.008, 5.005, 8.008, 9.009, 2.002, 3.003,
9.009, 9.009, 8.008, 8.008, 10.010, 9.009, 4.004, 4.004, 4.004, 4.004, 3.003, 3.003, 4.004), Array(3.003, 3.003, 5.004, 1.001,
3.003, 4.004, 5.005, 6.004, 6.003, 4.004, 6.005, 5.004, 5.005, 5.005, 6.006, 4.004, 4.004, 4.004, 5.005, 5.005, 6.006, 7.007,
8.008, 6.006, 6.006, 6.006, 7.006, 7.007, 8.008, 8.008, 9.009, 10.010, 10.010, 8.008, 10.010, 10.009, 9.008, 8.007, 9.009,
5.005, 9.009, 10.010, 3.002, 2.002, 10.010, 10.010, 9.009, 9.009, 11.011, 10.010, 4.004, 4.004, 3.003, 4.004, 2.002, 3.003,
4.004), Array(1.001, 4.003, 2.002, 4.004, 5.005, 6.004, 6.003, 5.002, 4.004, 6.004, 5.004, 5.005, 5.005, 6.006, 4.004, 4.004,
4.004, 5.005, 5.005, 6.006, 7.007, 8.008, 6.006, 6.006, 6.006, 7.006, 7.007, 8.008, 8.008, 9.009, 10.010, 10.010, 8.008,
10.010, 10.009, 9.008, 8.007, 9.009, 3.003, 9.009, 10.010, 3.001, 1.001, 10.010, 10.010, 9.009, 9.009, 11.011, 10.010, 2.002,
1.001, 4.004, 4.003, 3.003, 3.002, 3.003), Array(5.004, 3.003, 4.005, 5.006, 6.005, 6.004, 6.003, 3.003, 5.004, 4.003, 4.004,
4.004, 5.005, 3.003, 3.003, 3.003, 4.004, 4.004, 5.005, 6.006, 7.007, 5.005, 5.005, 5.005, 6.005, 6.006, 7.007, 7.007, 8.008,
9.009, 9.009, 7.007, 9.009, 9.008, 8.007, 7.006, 8.008, 4.004, 8.008, 9.009, 2.002, 2.002, 9.009, 9.009, 8.008, 8.008, 10.010,
9.009, 3.003, 2.002, 4.005, 4.004, 3.004, 3.003, 4.004), Array(3.004, 4.004, 4.004, 3.003, 2.002, 1.001, 3.006, 3.003, 4.004,
4.004, 4.006, 5.007, 3.004, 3.003, 3.005, 4.006, 4.005, 5.006, 6.008, 7.009, 5.005, 5.006, 5.006, 6.005, 6.007, 7.008, 7.008,
8.009, 9.010, 9.011, 7.008, 9.010, 9.008, 8.007, 7.006, 8.010, 3.003, 8.009, 9.010, 2.003, 4.005, 9.010, 9.010, 8.009, 8.009,
10.011, 9.010, 2.002, 3.003, 4.004, 3.003, 3.003, 2.002, 1.001), Array(2.002, 3.003, 4.004, 5.003, 5.002, 5.004, 6.004, 6.004,
6.005, 6.005, 7.006, 5.004, 5.004, 5.004, 6.005, 6.005, 7.006, 8.007, 9.008, 7.006, 7.006, 7.006, 8.006, 8.007, 9.008, 9.008,
10.009, 11.010, 11.010, 9.008, 11.010, 11.009, 10.008, 9.007, 10.009, 4.004, 10.009, 11.010, 3.001, 1.001, 11.010, 11.010,
10.009, 10.009, 12.011, 11.010, 3.003, 3.003, 2.002, 3.003, 1.001, 2.002, 3.003), Array(1.001, 2.002, 3.003, 4.003, 6.005,
4.004, 5.005, 7.006, 5.006, 6.007, 6.005, 6.005, 6.005, 6.006, 7.006, 8.007, 7.008, 8.009, 8.007, 7.007, 7.007, 9.007, 8.008,
9.009, 9.009, 10.010, 11.011, 10.011, 9.009, 11.011, 12.010, 11.009, 10.008, 9.010, 4.004, 10.010, 11.011, 3.002, 3.003,
11.011, 11.011, 10.010, 10.010, 12.012, 11.011, 3.003, 4.004, 2.002, 3.003, 1.001, 2.002, 3.003), Array(1.001, 2.002, 3.003,
5.006, 3.003, 4.004, 6.007, 4.006, 5.007, 5.006, 5.006, 5.005, 5.006, 6.007, 7.008, 6.008, 7.009, 7.008, 6.007, 6.008, 8.008,
7.008, 8.009, 8.009, 9.010, 10.011, 9.011, 8.009, 10.011, 11.011, 10.010, 9.009, 8.010, 5.005, 9.010, 10.011, 4.003, 4.004,
10.011, 10.011, 9.010, 9.010, 11.012, 10.011, 4.004, 5.005, 3.003, 4.004, 2.002, 3.003, 4.004), Array(1.001, 2.002, 4.006,
2.002, 3.003, 5.006, 3.005, 4.006, 4.005, 4.006, 4.004, 4.005, 5.006, 6.007, 5.007, 6.008, 6.007, 5.006, 5.007, 7.007, 6.007,
7.008, 7.008, 8.009, 9.010, 8.010, 7.008, 9.010, 10.010, 9.009, 8.008, 7.009, 6.006, 8.009, 9.010, 3.004, 5.005, 9.010, 9.010,
8.009, 8.009, 10.011, 9.010, 5.005, 5.006, 4.004, 5.005, 3.003, 4.004, 4.004), Array(1.001, 3.005, 1.001, 2.002, 4.005, 2.004,
3.005, 3.004, 3.005, 3.003, 3.004, 4.005, 5.006, 4.006, 5.007, 5.006, 4.005, 4.006, 6.006, 5.006, 6.007, 6.007, 7.008, 8.009,
7.009, 6.007, 8.009, 9.009, 8.008, 7.007, 6.008, 5.005, 7.008, 8.009, 2.005, 4.006, 8.009, 8.009, 7.008, 7.008, 9.010, 8.009,
4.004, 4.005, 4.005, 4.005, 3.004, 3.004, 3.003), Array(2.006, 2.002, 3.003, 3.005, 3.005, 4.006, 2.005, 2.004, 2.004, 3.005,
3.006, 4.007, 5.007, 6.008, 4.006, 4.006, 4.007, 5.006, 5.007, 6.008, 6.008, 7.009, 8.010, 8.010, 6.008, 8.010, 8.009, 7.008,
6.007, 7.009, 4.004, 7.009, 8.010, 1.004, 3.006, 8.010, 8.010, 7.009, 7.009, 9.011, 8.010, 3.003, 3.004, 3.005, 3.004, 2.004,
2.003, 2.002), Array(4.002, 3.002, 3.003, 1.001, 2.002, 2.002, 3.003, 2.002, 2.002, 3.003, 4.004, 3.003, 4.004, 4.004, 3.003,
3.003, 5.004, 4.004, 5.005, 5.005, 6.006, 7.007, 6.006, 5.005, 7.007, 8.007, 7.006, 6.005, 5.005, 6.006, 6.006, 7.007, 3.003,
5.005, 7.007, 7.007, 6.006, 6.006, 8.008, 7.007, 5.005, 5.005, 5.006, 5.005, 4.005, 4.004, 5.004), Array(1.001, 4.004, 1.003,
2.004, 3.003, 4.004, 2.002, 2.003, 3.004, 4.005, 3.005, 4.006, 4.005, 3.004, 3.005, 5.005, 4.005, 5.006, 5.006, 6.007, 7.008,
6.008, 5.006, 7.008, 8.008, 7.007, 6.006, 5.007, 6.006, 6.007, 7.008, 3.005, 5.007, 7.008, 7.008, 6.007, 6.007, 8.009, 7.008,
5.005, 5.006, 5.006, 5.006, 4.005, 4.005, 4.004), Array(3.003, 2.002, 3.003, 2.002, 3.003, 1.001, 2.002, 3.003, 4.004, 4.004,
5.005, 4.004, 3.003, 4.004, 5.004, 4.004, 5.005, 5.005, 6.006, 7.007, 7.007, 5.005, 7.007, 8.007, 7.006, 6.005, 6.006, 6.007,
6.006, 7.007, 3.004, 5.006, 7.007, 7.007, 6.006, 6.006, 8.008, 7.007, 5.006, 5.006, 5.007, 5.006, 4.006, 4.005, 5.005), Array(
3.003, 3.003, 1.001, 1.001, 2.002, 2.002, 1.001, 2.002, 4.004, 5.005, 1.001, 2.002, 2.002, 3.001, 3.003, 4.004, 4.004, 5.005,
6.006, 7.007, 4.004, 6.006, 6.004, 5.003, 4.002, 6.006, 7.007, 5.005, 6.006, 4.004, 6.006, 6.006, 6.006, 5.005, 5.005, 7.007,
6.006, 6.006, 6.006, 6.007, 6.006, 5.006, 5.005, 5.005), Array(1.001, 2.002, 3.003, 1.001, 1.001, 2.002, 3.003, 2.002, 3.003,
3.003, 2.002, 2.002, 4.004, 3.003, 4.004, 4.004, 5.005, 6.006, 5.005, 4.004, 6.006, 7.007, 6.006, 5.005, 4.004, 7.007, 5.005,
6.006, 4.004, 6.006, 6.006, 6.006, 5.005, 5.005, 7.007, 6.006, 6.006, 6.006, 6.007, 6.006, 5.006, 5.005, 6.005), Array(3.003,
4.004, 2.002, 1.001, 2.002, 3.003, 1.001, 2.002, 3.003, 2.002, 1.001, 4.004, 2.002, 3.003, 3.003, 4.004, 5.005, 4.004, 3.003,
5.005, 7.007, 6.006, 5.005, 3.003, 8.008, 4.004, 5.005, 5.005, 7.007, 5.005, 5.005, 4.004, 4.004, 6.006, 5.005, 7.007, 7.007,
7.008, 7.007, 6.007, 6.006, 7.006), Array(1.001, 1.001, 2.002, 1.001, 2.002, 4.004, 5.005, 2.002, 3.003, 2.002, 3.002, 3.003,
4.004, 4.004, 5.005, 6.006, 7.007, 4.004, 6.006, 6.005, 5.004, 4.003, 6.006, 6.006, 5.005, 6.006, 3.003, 5.005, 6.006, 6.006,
5.005, 5.005, 7.007, 6.006, 5.005, 5.005, 5.006, 5.005, 4.005, 4.004, 5.004), Array(2.002, 3.003, 2.002, 3.003, 5.005, 6.006,
2.002, 3.003, 3.003, 4.002, 4.004, 5.005, 5.005, 6.006, 7.007, 8.008, 5.005, 7.007, 7.005, 6.004, 5.003, 7.007, 6.006, 6.006,
7.007, 3.003, 5.005, 7.007, 7.007, 6.006, 6.006, 8.008, 7.007, 5.005, 5.005, 5.006, 5.005, 4.005, 4.004, 4.004), Array(1.001,
2.002, 3.003, 3.003, 4.004, 3.003, 2.002, 3.003, 4.003, 3.003, 4.004, 4.004, 5.005, 6.006, 6.006, 4.004, 6.006, 7.006, 6.005,
5.004, 5.005, 6.006, 5.005, 6.006, 3.003, 5.005, 6.006, 6.006, 5.005, 5.005, 7.007, 6.006, 5.005, 5.005, 5.006, 5.005, 4.005,
4.004, 5.004), Array(1.001, 2.002, 2.002, 3.003, 2.002, 1.001, 2.002, 3.003, 2.002, 3.003, 3.003, 4.004, 5.005, 5.005, 3.003,
5.005, 6.006, 5.005, 4.004, 4.004, 7.007, 4.004, 5.005, 4.004, 6.006, 5.005, 5.005, 4.004, 4.004, 6.006, 5.005, 6.006, 6.006,
6.007, 6.006, 5.006, 5.005, 6.005), Array(1.001, 3.003, 4.004, 2.002, 2.002, 1.001, 2.002, 2.002, 3.003, 3.003, 4.004, 5.005,
6.006, 3.003, 5.005, 5.005, 4.004, 3.003, 5.005, 7.007, 4.004, 5.005, 4.004, 6.006, 5.005, 5.005, 4.004, 4.004, 6.006, 5.005,
6.006, 6.006, 6.007, 6.006, 5.006, 5.005, 6.005), Array(4.004, 5.005, 3.003, 3.003, 2.002, 1.001, 3.003, 4.004, 4.004, 5.005,
6.006, 7.007, 4.004, 6.006, 4.004, 3.003, 2.002, 6.006, 8.008, 5.005, 6.006, 5.005, 7.007, 6.006, 6.006, 5.005, 5.005, 7.007,
6.006, 7.007, 7.007, 7.008, 7.007, 6.007, 6.006, 7.006), Array(1.001, 4.004, 3.003, 2.002, 5.005, 3.003, 4.004, 4.004, 5.005,
6.006, 3.003, 4.004, 6.006, 8.008, 7.007, 6.006, 2.002, 9.009, 5.005, 6.006, 6.006, 8.008, 6.006, 4.004, 5.005, 5.005, 5.005,
6.006, 8.008, 8.008, 8.009, 8.008, 7.008, 7.007, 8.007), Array(5.005, 4.004, 3.003, 6.006, 4.004, 5.005, 5.005, 6.006, 7.007,
2.002, 5.005, 6.006, 9.009, 8.008, 7.007, 1.001, 10.010, 6.006, 7.007, 7.007, 9.009, 5.005, 3.003, 5.005, 4.004, 4.004, 5.005,
9.009, 9.009, 9.010, 9.009, 8.009, 8.008, 9.008), Array(1.001, 2.002, 4.002, 2.002, 3.003, 3.003, 4.004, 5.005, 6.006, 3.003,
5.005, 7.005, 6.004, 5.003, 6.006, 8.008, 4.004, 5.005, 5.005, 7.007, 5.005, 5.005, 4.004, 4.004, 6.006, 5.005, 7.007, 7.007,
7.008, 7.007, 6.007, 6.006, 6.006), Array(1.001, 4.003, 1.001, 2.002, 2.002, 3.003, 4.004, 5.005, 2.002, 4.004, 7.006, 6.005,
5.004, 5.005, 8.008, 3.003, 4.004, 5.005, 7.007, 4.004, 4.004, 3.003, 3.003, 5.005, 4.004, 7.007, 7.007, 7.008, 7.007, 6.007,
6.006, 7.006), Array(3.003, 1.001, 2.002, 2.002, 3.003, 4.004, 5.005, 2.002, 4.004, 6.006, 5.005, 4.004, 4.004, 8.008, 3.003,
4.004, 5.005, 7.007, 4.004, 4.004, 3.003, 3.003, 5.005, 4.004, 7.007, 7.007, 7.008, 7.007, 6.007, 6.006, 7.006), Array(4.004,
5.005, 5.005, 6.006, 7.007, 8.008, 5.005, 7.007, 3.003, 2.002, 1.001, 7.007, 8.009, 6.006, 7.007, 5.006, 7.008, 7.007, 7.007,
6.006, 6.006, 8.008, 7.007, 7.008, 7.008, 7.009, 7.008, 6.008, 6.007, 6.007), Array(1.001, 1.001, 2.002, 3.003, 4.004, 1.001,
3.003, 7.007, 6.006, 5.005, 5.005, 9.009, 2.002, 3.003, 6.006, 8.008, 3.003, 3.003, 2.002, 2.002, 4.004, 3.003, 8.008, 8.008,
8.009, 8.008, 7.008, 7.007, 8.007), Array(2.002, 3.003, 2.002, 5.005, 2.002, 4.004, 8.008, 7.007, 6.006, 6.006, 10.010, 1.001,
3.004, 7.007, 9.009, 4.004, 4.004, 3.003, 3.003, 5.005, 4.004, 9.009, 9.009, 9.010, 9.009, 8.009, 8.008, 9.008), Array(1.001,
4.003, 5.005, 2.002, 4.004, 8.008, 7.007, 6.006, 6.006, 10.010, 3.003, 2.002, 7.007, 9.009, 4.004, 4.004, 3.003, 3.003, 3.003,
2.002, 9.009, 9.009, 9.010, 9.009, 8.009, 8.008, 9.008), Array(5.002, 4.004, 3.003, 5.005, 9.009, 8.008, 7.007, 5.005, 11.011,
4.003, 1.001, 8.008, 10.010, 5.005, 3.003, 4.004, 4.004, 2.002, 1.001, 10.010, 10.010, 10.011, 10.010, 9.010, 9.009, 10.009),
Array(6.007, 4.004, 6.006, 10.010, 9.009, 8.008, 7.008, 12.012, 1.001, 1.006, 9.009, 11.011, 6.006, 5.006, 5.005, 5.005, 4.007,
3.006, 11.011, 11.011, 11.012, 11.011, 10.011, 10.010, 11.010), Array(3.003, 4.004, 11.011, 10.010, 9.009, 1.001, 12.012,
6.006, 5.005, 9.009, 11.011, 3.003, 1.001, 3.003, 2.002, 2.002, 3.003, 11.011, 11.011, 11.012, 11.011, 10.011, 10.010, 11.010),
Array(2.002, 8.008, 7.007, 6.006, 4.004, 10.010, 3.003, 4.004, 7.007, 9.009, 2.002, 2.002, 1.001, 1.001, 3.003, 4.004, 9.009,
9.009, 9.010, 9.009, 8.009, 8.008, 9.008), Array(10.010, 9.009, 8.008, 5.005, 12.012, 5.005, 6.006, 9.009, 11.011, 1.001,
3.003, 1.001, 2.002, 4.004, 5.005, 11.011, 11.011, 11.012, 11.011, 10.011, 10.010, 11.010), Array(1.001, 2.002, 10.010, 11.012,
9.009, 10.010, 8.009, 10.011, 10.010, 10.010, 9.009, 9.009, 11.011, 10.010, 10.011, 10.011, 10.012, 10.011, 9.011, 9.010,
9.010), Array(1.001, 9.009, 10.011, 8.008, 9.009, 7.008, 9.010, 9.009, 9.009, 8.008, 8.008, 10.010, 9.009, 9.010, 9.010, 9.011,
9.010, 8.010, 8.009, 8.009), Array(8.008, 9.010, 7.007, 8.008, 6.007, 8.009, 8.008, 8.008, 7.007, 7.007, 9.009, 8.008, 8.009,
8.009, 8.010, 8.009, 7.009, 7.008, 7.008), Array(11.011, 7.007, 6.006, 8.008, 10.010, 4.004, 2.002, 4.004, 3.003, 3.003, 4.004,
10.010, 10.010, 10.011, 10.010, 9.010, 9.009, 10.009), Array(11.011, 12.012, 3.003, 4.004, 12.012, 12.012, 11.011, 11.011,
13.013, 12.012, 1.001, 2.002, 2.002, 1.001, 3.003, 2.002, 2.002), Array(2.005, 8.008, 10.010, 5.005, 5.005, 4.004, 4.004,
5.006, 4.005, 10.010, 10.010, 10.011, 10.010, 9.010, 9.009, 10.009), Array(9.009, 11.011, 6.006, 4.004, 5.005, 5.005, 3.003,
2.002, 11.011, 11.011, 11.012, 11.011, 10.011, 10.010, 11.010), Array(2.004, 9.009, 9.009, 8.008, 8.008, 10.010, 9.009, 2.002,
2.003, 2.003, 2.002, 1.002, 1.001, 2.002), Array(11.011, 11.011, 10.010, 10.010, 12.012, 11.011, 3.003, 2.002, 3.003, 4.004,
2.002, 3.003, 4.004), Array(2.002, 2.002, 1.001, 3.003, 4.004, 11.011, 11.011, 11.012, 11.011, 10.011, 10.010, 11.010), Array(
2.002, 1.001, 1.001, 2.002, 11.011, 11.011, 11.012, 11.011, 10.011, 10.010, 11.010), Array(1.001, 3.003, 4.004, 10.010, 10.010,
10.011, 10.010, 9.010, 9.009, 10.009), Array(2.002, 3.003, 10.010, 10.010, 10.011, 10.010, 9.010, 9.009, 10.009), Array(1.001,
12.012, 12.012, 12.013, 12.012, 11.012, 11.011, 12.011), Array(11.011, 11.011, 11.012, 11.011, 10.011, 10.010, 11.010), Array(
1.001, 3.003, 2.002, 2.002, 1.001, 1.001), Array(4.004, 3.003, 3.003, 2.002, 2.002), Array(1.001, 1.001, 2.002, 3.003), Array(
2.002, 1.001, 2.002), Array(1.001, 2.002), Array(1.001));
}
}
rule("MAP: WORKSHOP ISLAND")
rule("MAP: MALEVENTO (NODE POSITIONS)")
{
event
{
Ongoing - Global;
}
conditions
{
Current Map == Map(Workshop Island);
Current Map == Map(Malevento);
}
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(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));
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(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(-16.872,
-2.575, -31.658), Vector(38.964, 5, 22.877), Vector(22.370, 6.425, 2.101), Vector(38.279, 7.425, 28.325), Vector(34.339, 7.710,
22.006), Vector(-0.094, 10.474, 25.453), Vector(-28.951, -1.544, 7.626), Vector(-26.961, 4.425, 8.740), Vector(-30.851, 5.157,
19.324), Vector(-22.499, -2.575, -12.800), Vector(-14.980, 2.460, 44.680), Vector(-0.482, -1.575, -22.684));
}
}
rule("MAP: HAVANA")
rule("MAP: MALEVENTO (NODE CONNECTIONS)")
{
event
{
Ongoing - Global;
}
conditions
{
Current Map == Map(Havana);
Current Map == Map(Malevento);
}
actions
{
Global.NodePositions = Array(Vector(126.542, 12.733, -63.277), 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(99.937,
2.983, -67.099), Vector(113.039, 7.424, -37.337), Vector(106.552, 0.149, -53.045), Vector(120.953, 13.171, -58.443), 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));
Global.NodeConnections = Array(Array(7, 3, 6, 28), Array(5, 8, 27), Array(3, 9, 6, 10), Array(4, 7, 2, 6, 9, 10), Array(3, 5),
Array(4, 6, 1), Array(5, 3, 8, 10, 9, 2), Array(3, 0), Array(1, 6, 10, 26, 29), Array(10, 11, 2, 6, 3, 14, 17), Array(6, 8, 9,
2, 3, 17), Array(9, 12), Array(11, 9, 13), Array(12, 10), Array(9, 16), Array(16, 18), Array(14, 15, 18), Array(9, 15), Array(
15, 21, 27), Array(23, 31, 39), Array(22, 32), Array(18, 24, 30, 29, 33), Array(20, 30, 21, 33, 29), Array(19), Array(25, 21,
29, 30, 34, 35, 38), Array(24, 27, 33, 34, 35, 37), Array(8, 18, 15), Array(18, 25), Array(0, 3, 6, 1), Array(24, 21, 8, 18,
25, 30), Array(21, 24, 29, 32, 33), Array(19, 33, 34, 25, 35, 36), Array(30, 20, 31), Array(31, 30, 24, 25, 21, 34, 35), Array(
33, 24, 25, 35), Array(25, 24, 34, 33, 36, 38), Array(37, 35, 38), Array(36, 25), Array(36, 35, 34, 24, 39, 41), Array(38, 19,
40), Array(39, 38), Array(38), Array());
Global.DistanceMatrix = Array(Array(9999, 2, 2, 1, 2, 2, 1, 1, 2, 2, 2, 3, 4, 5, 3, 4, 4, 3, 4, 7, 6, 4, 7, 8, 4, 4, 3, 3, 1, 3, 4,
6, 5, 5, 5, 5, 6, 5, 5, 6, 7, 6), Array(5, 9999, 3, 3, 2, 1, 2, 4, 1, 3, 2, 4, 5, 6, 4, 3, 4, 3, 2, 5, 5, 3, 6, 6, 3, 2, 2, 1,
6, 2, 3, 4, 4, 3, 3, 3, 4, 3, 4, 5, 6, 5), Array(3, 3, 9999, 1, 2, 2, 1, 2, 2, 1, 1, 2, 3, 4, 2, 3, 3, 2, 4, 7, 6, 4, 7, 8, 4,
4, 3, 4, 4, 3, 4, 6, 5, 5, 5, 5, 6, 5, 5, 6, 7, 6), Array(2, 3, 1, 9999, 1, 2, 1, 1, 2, 1, 1, 2, 3, 4, 2, 3, 3, 2, 4, 7, 6, 4,
7, 8, 4, 4, 3, 4, 3, 3, 4, 6, 5, 5, 5, 5, 6, 5, 5, 6, 7, 6), Array(3, 2, 2, 1, 9999, 1, 2, 2, 3, 2, 2, 3, 4, 5, 3, 4, 4, 3, 4,
7, 7, 5, 8, 8, 5, 4, 4, 3, 4, 4, 5, 6, 6, 5, 5, 5, 6, 5, 6, 7, 8, 7), Array(4, 1, 2, 2, 1, 9999, 1, 3, 2, 2, 2, 3, 4, 5, 3, 4,
4, 3, 3, 6, 6, 4, 7, 7, 4, 3, 3, 2, 5, 3, 4, 5, 5, 4, 4, 4, 5, 4, 5, 6, 7, 6), Array(3, 2, 1, 1, 2, 1, 9999, 2, 1, 1, 1, 2, 3,
4, 2, 3, 3, 2, 3, 6, 5, 3, 6, 7, 3, 3, 2, 3, 4, 2, 3, 5, 4, 4, 4, 4, 5, 4, 4, 5, 6, 5), Array(1, 3, 2, 1, 2, 3, 2, 9999, 3, 2,
2, 3, 4, 5, 3, 4, 4, 3, 5, 8, 7, 5, 8, 9, 5, 5, 4, 4, 2, 4, 5, 7, 6, 6, 6, 6, 7, 6, 6, 7, 8, 7), Array(4, 1, 2, 2, 3, 2, 1, 3,
9999, 2, 1, 3, 4, 5, 3, 2, 3, 2, 2, 5, 4, 2, 5, 6, 2, 2, 1, 2, 5, 1, 2, 4, 3, 3, 3, 3, 4, 3, 3, 4, 5, 4), Array(3, 3, 1, 1, 2,
2, 1, 2, 2, 9999, 1, 1, 2, 3, 1, 2, 2, 1, 3, 7, 6, 4, 7, 8, 4, 4, 3, 4, 4, 3, 4, 6, 5, 5, 5, 5, 6, 5, 5, 6, 7, 6), Array(3, 2,
1, 1, 2, 2, 1, 2, 1, 1, 9999, 2, 3, 4, 2, 2, 3, 1, 3, 6, 5, 3, 6, 7, 3, 3, 2, 3, 4, 2, 3, 5, 4, 4, 4, 4, 5, 4, 4, 5, 6, 5),
Array(4, 4, 2, 2, 3, 3, 2, 3, 3, 1, 2, 9999, 1, 2, 2, 3, 3, 2, 4, 8, 7, 5, 8, 9, 5, 5, 4, 5, 5, 4, 5, 7, 6, 6, 6, 6, 7, 6, 6,
7, 8, 7), Array(4, 4, 2, 2, 3, 3, 2, 3, 3, 1, 2, 1, 9999, 1, 2, 3, 3, 2, 4, 8, 7, 5, 8, 9, 5, 5, 4, 5, 5, 4, 5, 7, 6, 6, 6, 6,
7, 6, 6, 7, 8, 7), Array(4, 3, 2, 2, 3, 3, 2, 3, 2, 2, 1, 2, 1, 9999, 3, 3, 4, 2, 4, 7, 6, 4, 7, 8, 4, 4, 3, 4, 5, 3, 4, 6, 5,
5, 5, 5, 6, 5, 5, 6, 7, 6), Array(4, 4, 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, 3, 5, 4,
4, 5, 5, 4, 5, 5, 6, 5, 5, 6, 7, 6), Array(6, 5, 4, 4, 5, 5, 4, 5, 4, 3, 4, 4, 5, 6, 2, 9999, 1, 4, 1, 5, 5, 2, 6, 6, 3, 3, 5,
2, 7, 3, 3, 4, 4, 3, 4, 4, 5, 4, 4, 5, 6, 5), Array(5, 5, 3, 3, 4, 4, 3, 4, 4, 2, 3, 3, 4, 5, 1, 1, 9999, 3, 1, 5, 5, 2, 6, 6,
3, 3, 5, 2, 6, 3, 3, 4, 4, 3, 4, 4, 5, 4, 4, 5, 6, 5), Array(4, 4, 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, 3, 5, 4, 4, 5, 5, 4, 5, 5, 6, 5, 5, 6, 7, 6), Array(7, 4, 5, 5, 6, 5, 4, 6, 3, 4, 4, 5, 6, 7, 3, 1, 2, 5,
9999, 4, 4, 1, 5, 5, 2, 2, 4, 1, 8, 2, 2, 3, 3, 2, 3, 3, 4, 3, 3, 4, 5, 4), Array(9, 6, 7, 7, 8, 7, 6, 8, 5, 7, 6, 8, 9, 10, 7,
5, 6, 7, 4, 9999, 5, 3, 6, 1, 3, 2, 6, 3, 10, 4, 3, 1, 4, 2, 2, 2, 2, 3, 2, 1, 2, 3), Array(7, 4, 5, 5, 6, 5, 4, 6, 3, 5, 4, 6,
7, 8, 6, 4, 5, 5, 3, 3, 9999, 2, 1, 4, 3, 3, 4, 4, 8, 2, 2, 2, 1, 2, 3, 3, 3, 4, 4, 4, 5, 5), Array(6, 3, 4, 4, 5, 4, 3, 5, 2,
4, 3, 5, 6, 7, 4, 2, 3, 4, 1, 3, 3, 9999, 4, 4, 1, 2, 3, 2, 7, 1, 1, 2, 2, 1, 2, 2, 3, 3, 2, 3, 4, 3), Array(6, 3, 4, 4, 5, 4,
3, 5, 2, 4, 3, 5, 6, 7, 5, 3, 4, 4, 2, 3, 1, 1, 9999, 4, 2, 2, 3, 3, 7, 1, 1, 2, 2, 1, 2, 2, 3, 3, 3, 4, 5, 4), Array(10, 7, 8,
8, 9, 8, 7, 9, 6, 8, 7, 9, 10, 11, 8, 6, 7, 8, 5, 1, 6, 4, 7, 9999, 4, 3, 7, 4, 11, 5, 4, 2, 5, 3, 3, 3, 3, 4, 3, 2, 3, 4),
Array(6, 3, 4, 4, 5, 4, 3, 5, 2, 4, 3, 5, 6, 7, 5, 3, 4, 4, 2, 3, 3, 1, 4, 4, 9999, 1, 3, 2, 7, 1, 1, 3, 2, 2, 1, 1, 2, 2, 1,
2, 3, 2), Array(7, 4, 5, 5, 6, 5, 4, 6, 3, 5, 4, 6, 7, 8, 5, 3, 4, 5, 2, 3, 4, 2, 5, 4, 1, 9999, 4, 1, 8, 2, 2, 2, 3, 1, 1, 1,
2, 1, 2, 3, 4, 3), Array(5, 2, 3, 3, 4, 3, 2, 4, 1, 3, 2, 4, 5, 6, 3, 1, 2, 3, 1, 5, 5, 2, 6, 6, 3, 3, 9999, 2, 6, 2, 3, 4, 4,
3, 4, 4, 5, 4, 4, 5, 6, 5), Array(8, 5, 6, 6, 7, 6, 5, 7, 4, 5, 5, 6, 7, 8, 4, 2, 3, 6, 1, 4, 5, 2, 6, 5, 2, 1, 5, 9999, 9, 3,
3, 3, 4, 2, 2, 2, 3, 2, 3, 4, 5, 4), Array(1, 1, 2, 1, 2, 2, 1, 2, 2, 2, 2, 3, 4, 5, 3, 4, 4, 3, 3, 6, 6, 4, 7, 7, 4, 3, 3, 2,
9999, 3, 4, 5, 5, 4, 4, 4, 5, 4, 5, 6, 7, 6), Array(5, 2, 3, 3, 4, 3, 2, 4, 1, 3, 2, 4, 5, 6, 4, 2, 3, 3, 1, 4, 3, 1, 4, 5, 1,
1, 2, 2, 6, 9999, 1, 3, 2, 2, 2, 2, 3, 2, 2, 3, 4, 3), Array(6, 3, 4, 4, 5, 4, 3, 5, 2, 4, 3, 5, 6, 7, 5, 3, 4, 4, 2, 3, 2, 1,
3, 4, 1, 2, 3, 3, 7, 1, 9999, 2, 1, 1, 2, 2, 3, 3, 2, 3, 4, 3), Array(8, 5, 6, 6, 7, 6, 5, 7, 4, 6, 5, 7, 8, 9, 6, 4, 5, 6, 3,
1, 4, 2, 5, 2, 2, 1, 5, 2, 9, 3, 2, 9999, 3, 1, 1, 1, 1, 2, 2, 2, 3, 3), Array(7, 4, 5, 5, 6, 5, 4, 6, 3, 5, 4, 6, 7, 8, 6, 4,
5, 5, 3, 2, 1, 2, 2, 3, 2, 2, 4, 3, 8, 2, 1, 1, 9999, 2, 2, 2, 2, 3, 3, 3, 4, 4), Array(7, 4, 5, 5, 6, 5, 4, 6, 3, 5, 4, 6, 7,
8, 5, 3, 4, 5, 2, 2, 3, 1, 4, 3, 1, 1, 4, 2, 8, 2, 1, 1, 2, 9999, 1, 1, 2, 2, 2, 3, 4, 3), Array(7, 4, 5, 5, 6, 5, 4, 6, 3, 5,
4, 6, 7, 8, 6, 4, 5, 5, 3, 3, 4, 2, 5, 4, 1, 1, 4, 2, 8, 2, 2, 2, 3, 1, 9999, 1, 2, 2, 2, 3, 4, 3), Array(7, 4, 5, 5, 6, 5, 4,
6, 3, 5, 4, 6, 7, 8, 6, 4, 5, 5, 3, 3, 4, 2, 5, 4, 1, 1, 4, 2, 8, 2, 2, 2, 3, 1, 1, 9999, 1, 2, 1, 2, 3, 2), Array(8, 5, 6, 6,
7, 6, 5, 7, 4, 6, 5, 7, 8, 9, 7, 5, 6, 6, 4, 3, 5, 3, 6, 4, 2, 2, 5, 3, 9, 3, 3, 3, 4, 2, 2, 1, 9999, 1, 1, 2, 3, 2), Array(8,
5, 6, 6, 7, 6, 5, 7, 4, 6, 5, 7, 8, 9, 6, 4, 5, 6, 3, 4, 5, 3, 6, 5, 2, 1, 5, 2, 9, 3, 3, 3, 4, 2, 2, 2, 1, 9999, 2, 3, 4, 3),
Array(7, 4, 5, 5, 6, 5, 4, 6, 3, 5, 4, 6, 7, 8, 6, 4, 5, 5, 3, 2, 4, 2, 5, 3, 1, 2, 4, 3, 8, 2, 2, 3, 3, 2, 1, 1, 1, 2, 9999,
1, 2, 1), Array(8, 5, 6, 6, 7, 6, 5, 7, 4, 6, 5, 7, 8, 9, 7, 5, 6, 6, 4, 1, 5, 3, 6, 2, 2, 3, 5, 4, 9, 3, 3, 2, 4, 3, 2, 2, 2,
3, 1, 9999, 1, 2), Array(8, 5, 6, 6, 7, 6, 5, 7, 4, 6, 5, 7, 8, 9, 7, 5, 6, 6, 4, 2, 5, 3, 6, 3, 2, 3, 5, 4, 9, 3, 3, 3, 4, 3,
2, 2, 2, 3, 1, 1, 9999, 2), Array(8, 5, 6, 6, 7, 6, 5, 7, 4, 6, 5, 7, 8, 9, 7, 5, 6, 6, 4, 3, 5, 3, 6, 4, 2, 3, 5, 4, 9, 3, 3,
4, 4, 3, 2, 2, 2, 3, 1, 2, 3, 9999), 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, 0, 0, 0, 0, 9999));
Global.NodeConnections = Array(Array(39, 52), Array(2, 22, 26, 39), Array(1, 39, 53), Array(20, 21, 22, 25), Array(5, 61, 66, 77),
Array(4, 37, 11, 43), Array(7, 8, 45, 43, 77), Array(6, 8, 39, 54, 45), Array(7, 6, 14, 39, 43, 44), Array(10, 13, 44), Array(
9, 34), Array(37, 5, 38), Array(13, 24, 29, 36, 48), Array(12, 9, 36, 48), Array(8, 15, 16), Array(14, 24), Array(14, 24),
Array(21, 57, 76), Array(58, 71), Array(31, 58), Array(3, 76), Array(3, 17, 22, 27), Array(3, 21, 1, 23, 52), Array(22, 24,
59), Array(23, 12, 27, 18, 16, 15), Array(26, 3), Array(1, 25, 72), Array(21, 24, 18, 28), Array(27, 30), Array(12, 30, 35,
57), Array(28, 29, 31), Array(30, 19, 50), Array(33, 47, 69, 70), Array(32, 34, 48, 62, 68), Array(33, 10, 37, 38), Array(29,
36, 69), Array(12, 13, 35, 48), Array(34, 11, 51, 5), Array(11, 34, 68), Array(40, 8, 7, 0, 2, 1), Array(39, 42, 45, 75),
Array(42, 45, 56, 66, 75), Array(41, 40, 72, 75), Array(6, 5, 8, 44), Array(43, 8, 9, 51), Array(41, 6, 56, 7, 66, 75, 40),
Array(6, 45, 51, 55, 56), Array(32, 67), Array(36, 12, 33, 13, 62, 67), Array(13, 60, 68), Array(12, 31, 24, 60), Array(44, 43,
46, 37, 5), Array(22, 0, 25, 73, 74), Array(39, 2, 42, 54, 73), Array(45, 41, 42, 53, 7), Array(46, 56, 61), Array(55, 46, 41,
45, 66), Array(17, 29), Array(19, 57), Array(60, 24, 23), Array(49, 24, 50, 59), Array(4), Array(33, 48, 13), Array(65, 25, 3,
74), Array(65, 3, 25), Array(63, 64, 3, 25), Array(41, 45, 56, 4), Array(47, 48), Array(38, 33, 49), Array(35, 32, 70), Array(
69, 32, 48, 36), Array(50, 23, 24, 19, 31), Array(26, 42), Array(52, 53), Array(52, 63), Array(45, 42, 40, 41), Array(20, 17),
Array(6, 4));
}
}
rule("SUBROUTINE: BOT - RESET PATH FINDING")
rule("MAP: MALEVENTO (DISTANCE MATRIX)")
{
event
{
Subroutine;
BotResetPathFinding;
Ongoing - Global;
}
conditions
{
Current Map == Map(Malevento);
}
actions
{
Event Player.BotTargetPlayer = -1;
Event Player.BotTargetNodeId = -1;
Event Player.BotTargetPosition = -1;
Event Player.BotIsPathFinding = False;
Stop Facing(Event Player);
Stop Throttle In Direction(Event Player);
Global.DistanceMatrix = Array(Array(2.002, 2.002, 3.003, 5.005, 4.004, 3.003, 2.002, 2.002, 4.004, 5.005, 5.005, 5.005, 5.005,
3.003, 4.004, 4.004, 4.004, 5.005, 7.007, 4.004, 3.003, 2.002, 3.003, 4.004, 2.004, 3.003, 4.004, 5.005, 6.006, 6.006, 7.006,
8.008, 7.007, 6.006, 7.007, 6.006, 5.005, 6.006, 1.001, 2.002, 4.004, 3.003, 3.003, 3.003, 3.003, 5.004, 8.008, 6.006, 6.006,
6.005, 4.004, 1.001, 3.002, 3.003, 5.005, 4.004, 5.005, 6.006, 4.004, 5.005, 6.006, 7.006, 3.003, 5.004, 4.004, 4.004, 7.007,
7.007, 8.008, 9.007, 6.004, 4.004, 2.002, 2.002, 3.003, 5.005, 4.004), Array(1.001, 2.002, 5.005, 4.004, 3.003, 2.002, 2.002,
4.004, 5.005, 5.005, 4.004, 5.005, 3.003, 4.004, 4.004, 3.003, 4.004, 6.006, 3.003, 2.002, 1.001, 2.002, 3.003, 2.002, 1.001,
3.003, 4.004, 5.005, 5.005, 6.005, 7.007, 6.006, 6.006, 6.006, 5.005, 5.005, 6.006, 1.001, 2.002, 4.004, 3.003, 3.003, 3.003,
3.003, 5.004, 7.007, 5.005, 5.005, 5.004, 4.004, 2.002, 2.002, 3.003, 5.005, 4.004, 4.004, 5.005, 3.003, 4.004, 6.006, 6.006,
4.003, 6.003, 5.003, 4.004, 6.006, 6.006, 7.007, 8.006, 5.003, 2.002, 3.003, 3.003, 3.003, 4.004, 4.004), Array(3.003, 5.005,
4.004, 3.003, 2.002, 2.002, 4.004, 5.005, 5.005, 5.005, 5.005, 3.003, 4.004, 4.004, 4.004, 5.005, 7.007, 4.004, 3.003, 2.002,
3.003, 4.004, 3.003, 2.002, 4.004, 5.005, 6.006, 6.006, 7.006, 8.008, 7.007, 6.006, 7.007, 6.006, 5.005, 6.006, 1.001, 2.002,
3.004, 2.003, 3.003, 3.003, 3.003, 5.004, 8.008, 6.006, 6.006, 6.005, 4.004, 3.003, 1.001, 2.002, 5.005, 4.004, 5.005, 6.006,
4.004, 5.005, 6.006, 7.006, 5.004, 7.004, 6.004, 4.004, 7.007, 7.007, 8.008, 9.007, 6.004, 3.003, 2.002, 4.004, 3.003, 5.005,
4.004), Array(7.007, 6.006, 5.005, 4.004, 4.004, 6.006, 7.007, 7.007, 4.004, 5.005, 5.005, 4.004, 4.004, 2.002, 3.004, 5.005,
1.001, 1.001, 1.001, 2.002, 3.003, 1.001, 2.002, 2.002, 3.003, 4.004, 4.004, 5.005, 7.007, 6.006, 7.007, 5.005, 5.005, 7.007,
7.007, 3.003, 4.004, 5.005, 4.004, 5.005, 5.005, 5.005, 7.006, 7.007, 5.005, 5.005, 5.004, 6.006, 2.002, 4.004, 5.005, 7.007,
6.006, 3.003, 4.004, 3.003, 4.004, 8.008, 6.006, 4.001, 6.001, 5.001, 6.006, 6.006, 6.006, 6.006, 7.006, 4.003, 3.003, 3.003,
3.002, 5.005, 2.002, 6.006), Array(1.001, 2.002, 3.003, 3.003, 4.004, 4.004, 2.002, 6.006, 5.005, 4.004, 5.005, 5.005, 8.008,
7.008, 9.009, 8.008, 7.007, 6.006, 7.007, 6.006, 6.006, 5.005, 7.007, 8.008, 7.007, 8.008, 8.008, 5.005, 4.004, 3.003, 7.007,
6.006, 2.002, 3.003, 4.004, 3.003, 2.002, 3.003, 2.002, 3.003, 2.002, 3.003, 6.006, 5.005, 5.005, 7.007, 3.002, 6.006, 5.004,
4.003, 3.002, 2.002, 8.008, 8.009, 7.007, 6.006, 1.001, 5.005, 8.007, 10.007, 9.007, 1.001, 6.006, 4.004, 6.006, 6.006, 8.007,
4.004, 6.005, 7.007, 3.003, 9.009, 1.001), Array(2.002, 3.003, 2.002, 3.003, 3.003, 1.001, 5.005, 4.004, 3.003, 4.004, 4.004,
7.007, 6.007, 8.008, 7.007, 6.006, 5.005, 6.006, 5.005, 6.006, 5.005, 6.006, 7.007, 6.006, 7.007, 7.007, 4.004, 3.003, 2.002,
6.006, 5.005, 1.001, 2.002, 3.003, 4.004, 3.003, 4.004, 1.001, 2.002, 3.003, 3.002, 5.005, 4.004, 4.004, 6.006, 2.001, 5.005,
5.004, 4.004, 4.003, 3.003, 7.007, 7.008, 6.006, 5.005, 2.002, 4.004, 7.007, 9.007, 8.007, 2.002, 5.005, 3.003, 5.005, 5.005,
7.006, 5.005, 6.005, 6.006, 4.004, 8.008, 2.002), Array(1.001, 1.001, 3.003, 4.004, 3.003, 5.005, 4.004, 2.002, 3.003, 3.003,
6.006, 5.006, 7.007, 6.006, 5.005, 4.004, 5.005, 4.004, 5.005, 4.004, 5.005, 6.006, 6.006, 7.007, 7.006, 6.006, 5.005, 4.004,
6.006, 5.005, 3.003, 4.004, 2.002, 2.002, 2.002, 3.003, 1.001, 2.002, 1.001, 3.001, 7.007, 5.005, 6.005, 7.005, 3.002, 4.004,
3.003, 2.002, 3.002, 2.002, 7.007, 6.008, 6.005, 7.005, 3.003, 6.005, 6.006, 8.006, 7.006, 2.002, 6.006, 5.005, 7.007, 7.006,
6.005, 4.004, 4.004, 5.005, 2.002, 7.007, 1.001), Array(1.001, 3.003, 4.004, 4.004, 5.005, 4.004, 2.002, 3.003, 3.003, 5.005,
5.006, 7.007, 5.005, 4.004, 3.003, 4.004, 4.004, 4.004, 3.003, 5.005, 6.006, 6.006, 7.007, 7.006, 7.007, 6.006, 5.005, 6.006,
5.005, 4.004, 5.005, 1.001, 2.002, 2.002, 2.003, 2.002, 2.002, 1.001, 3.002, 7.007, 5.005, 7.005, 7.005, 3.003, 3.003, 2.002,
1.001, 3.003, 2.002, 6.006, 6.007, 5.005, 6.005, 4.004, 6.005, 5.005, 7.005, 6.005, 2.002, 6.006, 6.006, 7.007, 8.006, 6.005,
3.004, 3.003, 4.004, 2.002, 6.006, 2.002), Array(2.002, 3.003, 3.003, 4.004, 3.003, 1.001, 2.002, 2.002, 5.005, 4.005, 6.006,
5.005, 4.004, 3.003, 4.004, 3.003, 4.004, 3.003, 4.004, 5.005, 5.005, 6.006, 6.005, 6.006, 5.005, 4.004, 5.005, 4.004, 3.003,
4.004, 1.001, 2.002, 3.003, 3.003, 1.001, 1.001, 2.002, 3.002, 6.006, 4.004, 6.004, 6.004, 2.002, 3.003, 3.002, 2.002, 4.003,
3.003, 6.006, 5.007, 5.004, 6.004, 4.004, 5.004, 5.005, 7.005, 6.005, 3.003, 5.005, 5.005, 6.006, 7.005, 5.004, 4.004, 4.003,
4.004, 3.003, 6.006, 2.002), Array(1.001, 4.004, 2.002, 1.001, 3.003, 4.004, 4.004, 5.005, 4.005, 6.005, 7.007, 5.005, 5.005,
4.004, 3.003, 6.006, 5.005, 4.004, 5.005, 3.003, 4.004, 5.004, 4.004, 3.003, 2.002, 3.003, 2.002, 3.003, 3.003, 3.003, 4.004,
5.005, 5.005, 2.002, 1.001, 4.004, 3.003, 4.004, 2.002, 5.002, 6.003, 2.002, 5.005, 5.004, 4.004, 4.004, 4.004, 4.004, 5.005,
5.004, 6.003, 5.005, 3.002, 7.007, 9.007, 8.007, 5.005, 3.003, 4.003, 4.004, 5.003, 5.004, 6.006, 6.005, 6.006, 5.005, 6.006,
4.004), Array(3.003, 3.003, 2.002, 4.004, 5.005, 5.005, 6.006, 5.006, 7.006, 8.008, 6.006, 6.006, 5.005, 4.004, 7.007, 6.006,
5.005, 6.006, 4.004, 5.005, 6.005, 3.003, 2.002, 1.001, 4.004, 3.003, 2.002, 2.002, 4.004, 5.005, 6.006, 6.006, 3.003, 2.002,
5.005, 4.004, 4.004, 3.003, 4.003, 6.004, 3.003, 6.006, 6.005, 5.005, 5.005, 5.005, 5.005, 6.006, 6.005, 5.004, 5.005, 3.003,
8.008, 10.008, 9.008, 5.005, 4.004, 3.003, 4.004, 4.004, 6.005, 7.007, 7.006, 7.007, 6.006, 7.007, 5.005), Array(5.005, 4.005,
4.004, 5.005, 5.005, 8.008, 6.007, 7.007, 8.008, 7.007, 6.006, 6.006, 5.006, 7.007, 6.006, 6.007, 7.008, 6.006, 7.007, 6.006,
4.004, 3.003, 2.002, 6.006, 5.005, 1.001, 1.001, 4.004, 5.005, 4.004, 5.005, 2.002, 3.003, 4.004, 3.003, 5.005, 4.004, 3.003,
5.005, 2.002, 6.006, 6.005, 5.005, 4.004, 4.004, 7.007, 7.008, 5.005, 4.004, 3.003, 4.004, 8.008, 10.008, 9.008, 3.003, 5.005,
2.002, 5.005, 5.005, 7.006, 6.006, 7.006, 7.007, 5.005, 9.009, 3.003), Array(1.001, 3.003, 2.002, 2.002, 3.003, 2.003, 4.003,
5.005, 3.003, 3.003, 2.002, 1.001, 5.005, 5.005, 2.002, 3.003, 1.001, 2.002, 3.002, 3.003, 2.002, 3.003, 2.002, 1.001, 4.004,
4.004, 5.005, 6.006, 7.007, 7.007, 4.004, 3.003, 6.006, 5.005, 3.003, 1.001, 4.002, 4.001, 4.004, 4.004, 6.006, 6.006, 6.006,
6.006, 2.002, 3.003, 3.002, 4.002, 7.007, 2.002, 6.005, 8.005, 7.005, 7.007, 2.002, 3.003, 3.003, 4.002, 3.002, 6.006, 5.005,
5.005, 7.007, 4.004, 6.006), Array(4.004, 3.003, 3.003, 4.004, 3.004, 5.004, 6.006, 4.004, 4.004, 3.003, 2.002, 6.006, 6.006,
3.003, 4.004, 2.002, 3.003, 4.003, 3.003, 2.002, 3.003, 2.002, 1.001, 4.004, 4.003, 4.004, 5.005, 6.006, 6.006, 3.003, 2.002,
5.005, 4.004, 3.003, 1.001, 4.001, 5.002, 3.003, 5.005, 6.005, 5.005, 5.005, 5.005, 3.003, 4.004, 4.003, 5.002, 6.006, 2.001,
7.006, 9.006, 8.006, 6.006, 2.002, 3.002, 3.003, 4.002, 4.003, 7.007, 6.006, 6.006, 6.006, 5.005, 5.005), Array(1.001, 1.001,
5.005, 3.004, 5.005, 6.006, 4.004, 4.004, 3.003, 2.002, 5.005, 4.004, 3.003, 4.004, 4.004, 5.005, 5.004, 6.006, 5.005, 5.005,
5.005, 4.004, 4.004, 5.005, 2.002, 3.003, 4.004, 4.004, 2.002, 2.002, 3.003, 4.003, 6.006, 4.004, 6.004, 5.003, 3.003, 4.004,
4.003, 3.003, 5.004, 4.004, 5.005, 4.006, 4.003, 5.003, 5.005, 5.005, 6.006, 8.006, 7.006, 4.004, 5.005, 6.005, 6.006, 7.005,
4.003, 5.005, 5.004, 5.005, 4.004, 6.006, 3.003), Array(2.002, 4.004, 2.003, 4.004, 5.005, 3.003, 3.003, 2.002, 1.001, 5.005,
5.005, 2.002, 3.003, 3.003, 4.004, 4.003, 5.005, 4.004, 5.005, 4.004, 3.003, 5.005, 6.005, 3.003, 4.004, 5.005, 5.005, 3.003,
3.003, 4.004, 5.004, 5.005, 3.003, 5.003, 4.002, 4.004, 4.004, 5.004, 4.004, 6.005, 5.005, 4.004, 3.005, 3.002, 4.002, 6.006,
4.004, 6.005, 8.005, 7.005, 5.005, 4.004, 5.004, 5.005, 6.004, 3.002, 6.006, 5.005, 5.005, 5.005, 5.005, 4.004), Array(4.004,
2.003, 4.004, 5.005, 3.003, 3.003, 2.002, 1.001, 5.005, 5.005, 2.002, 3.003, 3.003, 4.004, 4.003, 5.005, 4.004, 5.005, 4.004,
3.003, 5.005, 6.005, 3.003, 4.004, 5.005, 5.005, 3.003, 3.003, 4.004, 5.004, 5.005, 3.003, 5.003, 4.002, 4.004, 4.004, 5.004,
4.004, 6.005, 5.005, 4.004, 3.005, 3.002, 4.002, 6.006, 4.004, 6.005, 8.005, 7.005, 5.005, 4.004, 5.004, 5.005, 6.004, 3.002,
6.006, 5.005, 5.005, 5.005, 5.005, 4.004), Array(3.003, 5.003, 2.002, 1.001, 2.002, 3.003, 3.003, 3.003, 4.004, 2.002, 3.003,
2.002, 3.003, 4.004, 5.005, 5.005, 6.006, 3.003, 4.004, 7.007, 7.007, 4.004, 5.005, 7.007, 6.006, 6.006, 6.006, 6.006, 8.007,
6.006, 4.004, 6.005, 5.004, 7.007, 3.003, 5.005, 6.006, 8.008, 7.007, 1.001, 4.002, 4.004, 5.004, 9.009, 5.005, 5.003, 7.003,
6.003, 7.007, 5.005, 6.006, 4.004, 5.005, 4.004, 5.005, 4.004, 4.004, 6.006, 1.001, 7.007), Array(2.004, 5.004, 4.002, 3.003,
2.002, 2.001, 5.004, 5.005, 3.001, 4.002, 3.003, 3.003, 2.003, 6.005, 5.004, 6.005, 4.004, 4.003, 7.006, 6.005, 5.005, 6.006,
8.007, 7.007, 6.005, 6.005, 7.006, 8.006, 6.005, 4.003, 4.003, 2.002, 7.006, 4.004, 6.006, 7.006, 9.007, 8.007, 2.004, 1.005,
3.002, 3.002, 9.008, 5.004, 6.004, 8.004, 7.004, 8.007, 5.004, 5.004, 5.005, 6.004, 1.002, 6.006, 5.005, 5.005, 7.007, 4.004,
7.006), Array(5.006, 4.004, 5.005, 4.004, 3.003, 6.006, 7.007, 4.003, 3.003, 3.003, 2.002, 1.001, 6.006, 5.006, 6.007, 4.004,
4.005, 7.008, 6.006, 7.007, 8.008, 9.009, 9.009, 7.007, 6.007, 8.008, 8.008, 6.007, 4.005, 4.004, 2.002, 7.008, 6.006, 8.008,
8.008, 9.009, 9.009, 2.004, 1.001, 4.004, 3.003, 10.010, 5.006, 8.006, 10.006, 9.006, 9.009, 5.006, 5.005, 5.005, 6.006, 5.001,
8.008, 7.007, 7.007, 9.009, 4.006, 8.008), Array(2.002, 2.002, 3.003, 4.004, 2.002, 3.003, 3.003, 4.004, 4.004, 5.005, 6.006,
7.007, 7.007, 8.008, 5.005, 6.006, 8.008, 8.008, 4.004, 5.005, 6.006, 5.005, 6.006, 6.006, 6.006, 8.007, 8.008, 6.006, 6.006,
6.005, 7.007, 3.003, 5.005, 6.006, 8.008, 7.007, 3.003, 5.004, 4.004, 5.005, 9.009, 7.007, 5.002, 7.002, 6.002, 7.007, 7.007,
7.007, 6.006, 7.007, 5.004, 4.004, 4.004, 4.003, 6.006, 1.001, 7.007), Array(1.001, 2.002, 2.002, 2.002, 3.003, 1.001, 2.002,
3.003, 3.003, 4.004, 6.006, 5.005, 6.006, 4.004, 4.004, 7.007, 7.006, 3.003, 4.004, 6.006, 5.005, 5.005, 5.005, 5.005, 7.006,
6.006, 4.004, 5.004, 4.003, 6.006, 2.002, 4.004, 5.005, 7.007, 6.006, 2.002, 3.003, 3.003, 4.003, 8.008, 5.005, 4.002, 6.002,
5.002, 6.006, 5.005, 6.005, 5.005, 6.005, 3.003, 4.004, 3.003, 3.003, 5.005, 2.002, 6.006), Array(1.001, 2.002, 2.002, 2.002,
2.002, 3.003, 4.004, 4.004, 5.004, 6.006, 5.005, 6.006, 5.005, 4.004, 6.006, 6.006, 2.002, 3.003, 5.005, 4.004, 4.004, 4.004,
4.004, 6.005, 6.006, 4.004, 4.004, 4.003, 5.005, 1.001, 3.003, 4.004, 6.006, 5.005, 3.003, 4.004, 2.002, 3.003, 7.007, 5.005,
3.002, 5.002, 4.002, 5.005, 5.005, 5.005, 6.006, 7.005, 4.002, 3.003, 2.002, 2.002, 4.004, 3.003, 5.005), Array(1.001, 3.003,
3.003, 2.002, 3.003, 3.003, 4.004, 4.003, 5.005, 4.004, 5.005, 4.004, 3.003, 6.006, 5.005, 3.003, 4.004, 6.006, 5.005, 5.005,
5.005, 5.005, 7.006, 5.005, 3.003, 3.003, 3.002, 6.006, 2.002, 4.004, 5.005, 7.007, 6.006, 4.004, 3.005, 1.001, 2.002, 8.008,
4.004, 4.003, 6.003, 5.003, 6.006, 4.004, 4.004, 5.005, 6.004, 3.001, 4.004, 3.003, 3.003, 5.005, 4.004, 6.006), Array(4.004,
4.004, 1.001, 2.002, 2.002, 3.003, 3.002, 4.004, 3.003, 4.004, 3.003, 2.002, 5.005, 5.004, 4.004, 5.005, 6.006, 6.006, 4.004,
4.004, 5.005, 6.005, 4.004, 2.002, 4.002, 3.001, 5.005, 3.003, 5.005, 5.005, 7.006, 6.006, 3.003, 2.004, 2.001, 3.001, 7.007,
3.003, 5.004, 7.004, 6.004, 6.006, 3.003, 4.003, 4.004, 5.003, 2.001, 5.005, 4.004, 4.004, 6.006, 4.004, 5.005), Array(1.001,
3.003, 4.004, 5.005, 5.005, 6.006, 8.008, 7.007, 8.008, 6.006, 6.006, 7.007, 8.008, 3.003, 4.004, 4.004, 3.003, 5.005, 5.005,
5.005, 6.006, 8.008, 6.006, 6.006, 6.005, 6.006, 3.001, 4.003, 5.004, 6.006, 5.005, 4.004, 5.005, 4.004, 5.005, 7.007, 7.007,
5.001, 7.001, 6.001, 5.005, 7.007, 7.007, 7.007, 8.007, 5.004, 2.002, 4.002, 4.002, 4.004, 3.003, 6.006), Array(4.004, 5.005,
6.006, 6.006, 7.006, 8.008, 7.007, 7.007, 7.007, 6.006, 6.006, 7.007, 2.002, 3.003, 3.003, 2.002, 4.004, 4.004, 4.004, 5.005,
8.008, 6.006, 6.006, 6.005, 5.005, 3.002, 3.003, 4.003, 5.005, 4.004, 5.005, 6.006, 4.004, 5.005, 6.006, 7.007, 5.002, 7.002,
6.002, 4.004, 7.007, 7.007, 8.008, 9.007, 6.004, 1.001, 4.003, 4.003, 3.003, 4.004, 5.005), Array(1.001, 3.003, 2.002, 3.003,
5.005, 4.004, 5.005, 4.004, 3.003, 6.006, 6.005, 4.004, 5.005, 7.007, 6.006, 5.005, 5.005, 6.006, 7.006, 5.005, 3.003, 5.003,
3.002, 6.006, 3.003, 5.005, 6.006, 8.007, 7.007, 3.003, 2.004, 3.002, 4.002, 8.008, 4.004, 5.003, 7.003, 6.003, 7.007, 4.004,
5.004, 5.005, 6.004, 2.002, 5.005, 4.004, 4.004, 6.006, 3.003, 6.006), Array(2.002, 1.001, 2.002, 5.005, 5.005, 6.006, 3.003,
4.004, 7.007, 7.006, 5.005, 6.006, 8.008, 7.007, 6.006, 6.006, 7.007, 8.007, 6.006, 4.004, 5.004, 3.003, 7.007, 4.004, 6.006,
7.007, 9.008, 8.008, 3.003, 3.004, 4.003, 4.003, 9.009, 5.005, 6.004, 8.004, 7.004, 8.008, 5.005, 6.005, 4.004, 5.005, 3.003,
6.006, 5.005, 5.005, 7.007, 4.004, 7.007), Array(1.001, 2.002, 3.003, 3.003, 4.004, 1.001, 2.002, 5.005, 5.005, 6.006, 7.007,
8.008, 8.008, 5.005, 4.004, 7.007, 6.006, 4.004, 2.002, 5.003, 3.002, 5.005, 5.005, 7.007, 7.007, 7.007, 7.007, 1.001, 4.002,
4.003, 4.003, 8.008, 3.003, 7.005, 9.005, 8.005, 8.008, 3.003, 4.004, 2.002, 3.003, 4.003, 7.007, 6.006, 6.006, 8.008, 3.003,
7.007), Array(1.001, 4.004, 4.004, 5.005, 2.002, 3.003, 6.006, 6.006, 6.006, 7.007, 9.009, 8.008, 6.006, 5.005, 8.008, 7.007,
5.005, 3.003, 4.004, 2.002, 6.006, 5.005, 7.007, 8.008, 8.008, 8.008, 2.002, 3.003, 4.004, 3.003, 9.009, 4.004, 7.005, 9.005,
8.005, 9.009, 4.004, 5.005, 3.003, 4.004, 4.002, 7.007, 6.006, 6.006, 8.008, 4.004, 8.008), Array(5.005, 4.005, 5.006, 3.003,
3.004, 6.007, 5.005, 6.007, 7.008, 8.009, 8.009, 6.007, 5.006, 7.008, 7.008, 5.006, 3.004, 3.003, 1.001, 6.007, 5.006, 7.008,
7.008, 8.009, 8.009, 3.003, 2.002, 3.003, 2.002, 9.009, 4.005, 7.006, 9.006, 8.006, 8.009, 4.005, 4.004, 4.004, 5.005, 4.001,
7.008, 6.007, 6.007, 8.009, 5.005, 7.008), Array(1.001, 2.002, 2.002, 2.003, 3.003, 3.003, 7.007, 7.008, 7.007, 8.008, 5.005,
5.005, 6.007, 5.005, 1.001, 2.002, 3.003, 5.004, 4.004, 7.007, 9.008, 8.008, 6.006, 6.006, 4.004, 6.005, 5.005, 4.004, 6.006,
2.002, 9.008, 11.008, 10.008, 6.006, 2.002, 2.002, 1.001, 1.001, 6.005, 9.009, 8.008, 8.008, 7.008, 6.006, 6.006), Array(1.001,
3.003, 2.002, 2.002, 2.002, 6.006, 6.007, 6.006, 7.007, 4.004, 4.004, 5.006, 4.004, 2.002, 1.001, 2.002, 4.003, 3.003, 6.006,
8.007, 7.007, 5.005, 5.005, 4.004, 5.005, 4.004, 3.003, 5.005, 1.001, 8.007, 10.007, 9.007, 5.005, 2.002, 1.001, 2.002, 2.002,
5.004, 8.008, 7.007, 7.007, 6.007, 6.006, 5.005), Array(4.004, 3.003, 1.001, 1.001, 5.005, 5.006, 5.005, 6.006, 3.003, 3.003,
4.005, 3.003, 3.003, 2.002, 3.003, 5.004, 2.002, 7.007, 7.006, 6.006, 4.004, 4.004, 5.005, 6.006, 5.005, 4.004, 4.004, 2.002,
9.008, 11.008, 10.008, 4.004, 3.003, 2.002, 3.003, 3.003, 6.005, 7.007, 8.007, 8.008, 5.006, 7.007, 4.004), Array(1.001, 5.005,
5.005, 6.006, 7.007, 8.008, 8.008, 5.005, 4.004, 7.007, 6.006, 3.003, 2.002, 5.003, 4.003, 5.005, 6.006, 8.007, 7.007, 7.007,
7.007, 2.002, 5.003, 5.004, 5.004, 8.008, 3.003, 8.006, 10.006, 9.006, 8.008, 3.003, 4.004, 1.001, 2.002, 5.004, 8.008, 7.007,
7.007, 8.008, 4.004, 7.007), Array(4.004, 4.004, 5.005, 6.006, 7.007, 7.007, 4.004, 3.003, 6.006, 5.005, 3.003, 1.001, 4.002,
5.002, 4.004, 5.005, 7.006, 6.006, 6.006, 6.006, 3.003, 4.004, 4.003, 5.003, 7.007, 2.002, 7.006, 9.006, 8.006, 7.007, 2.002,
3.003, 2.002, 3.001, 4.003, 7.007, 6.006, 6.006, 7.007, 5.005, 6.006), Array(2.002, 4.004, 4.005, 4.004, 5.005, 2.002, 2.002,
3.004, 2.002, 4.004, 3.003, 4.004, 6.005, 1.001, 6.006, 6.005, 5.005, 3.003, 3.003, 6.006, 7.007, 6.006, 5.005, 3.003, 3.003,
8.008, 10.008, 9.008, 3.003, 4.004, 3.003, 4.004, 4.004, 7.006, 6.006, 7.006, 7.007, 4.005, 8.008, 3.003), Array(5.005, 6.006,
5.005, 6.006, 3.003, 4.004, 5.005, 4.004, 4.004, 3.003, 2.002, 4.004, 3.003, 7.007, 7.006, 6.006, 5.005, 5.005, 6.006, 6.007,
4.004, 3.003, 4.004, 3.003, 9.008, 11.008, 10.008, 4.004, 4.004, 1.001, 4.004, 4.004, 6.005, 7.007, 8.007, 8.008, 6.006, 8.008,
4.004), Array(1.001, 3.003, 2.002, 2.002, 2.002, 2.002, 4.003, 7.007, 5.005, 6.005, 6.005, 3.003, 2.002, 2.001, 2.002, 4.004,
3.003, 5.005, 6.006, 4.004, 5.005, 5.005, 6.005, 4.004, 6.004, 5.004, 3.003, 6.006, 6.006, 7.007, 8.006, 6.004, 3.003, 3.002,
3.003, 2.002, 5.005, 3.003), Array(2.002, 1.001, 3.003, 3.003, 1.001, 3.002, 8.008, 6.006, 7.006, 7.006, 4.003, 3.003, 3.002,
3.002, 3.003, 2.002, 6.006, 7.007, 5.005, 6.006, 4.004, 7.006, 5.005, 7.005, 6.005, 2.002, 7.007, 7.007, 8.008, 9.007, 7.005,
2.002, 4.003, 4.004, 1.001, 6.006, 3.003), Array(1.001, 3.003, 4.004, 1.001, 2.002, 8.008, 7.007, 7.007, 9.007, 3.003, 5.004,
4.002, 3.001, 2.002, 1.001, 8.008, 8.009, 7.007, 8.007, 3.003, 7.007, 7.005, 9.005, 8.005, 1.001, 8.008, 6.006, 8.008, 8.008,
8.007, 2.002, 5.003, 6.005, 1.001, 7.007, 3.003), Array(4.004, 4.004, 2.002, 3.003, 9.009, 7.007, 8.007, 8.007, 4.004, 4.003,
4.001, 4.001, 3.003, 2.002, 7.007, 8.008, 6.006, 7.007, 4.004, 8.007, 6.004, 8.004, 7.004, 2.002, 8.008, 7.007, 9.009, 9.008,
8.006, 1.001, 5.002, 5.004, 1.001, 6.006, 4.004), Array(1.001, 2.002, 3.002, 6.006, 4.004, 5.004, 7.005, 2.001, 4.004, 4.003,
3.003, 4.003, 3.003, 6.006, 6.007, 6.005, 6.005, 3.003, 5.004, 6.006, 8.006, 7.006, 3.003, 5.005, 4.004, 6.006, 6.005, 6.005,
5.005, 5.004, 5.005, 3.003, 7.007, 2.002), Array(3.003, 2.002, 5.005, 3.003, 6.003, 7.004, 1.001, 4.004, 4.003, 3.003, 3.003,
3.003, 5.005, 6.006, 6.005, 7.004, 4.004, 4.003, 6.006, 8.006, 7.006, 4.004, 4.004, 5.004, 5.005, 6.004, 6.005, 5.005, 5.004,
5.005, 4.004, 7.007, 3.003), Array(2.001, 8.007, 6.006, 7.006, 8.006, 3.002, 4.004, 3.002, 2.001, 2.002, 1.001, 7.007, 7.008,
6.006, 7.006, 3.003, 7.006, 6.006, 8.006, 7.006, 1.001, 7.007, 6.006, 8.007, 8.007, 7.006, 3.003, 4.003, 5.005, 1.001, 7.007,
2.002), Array(6.006, 5.005, 6.005, 8.006, 1.001, 5.006, 4.004, 3.003, 1.001, 1.001, 7.007, 7.008, 7.007, 7.006, 2.004, 5.005,
7.007, 9.007, 8.007, 2.002, 6.006, 5.005, 6.006, 6.006, 7.007, 4.004, 5.005, 6.007, 2.003, 8.009, 2.004), Array(2.002, 4.004,
6.004, 5.005, 7.007, 9.008, 8.008, 7.007, 7.007, 5.005, 6.006, 6.005, 5.005, 7.007, 3.003, 9.008, 11.008, 10.008, 7.007, 1.001,
3.003, 2.002, 2.002, 6.005, 9.009, 8.008, 8.008, 8.009, 7.007, 7.007), Array(3.002, 5.002, 4.004, 5.005, 7.006, 6.006, 6.006,
6.006, 3.003, 4.004, 4.003, 4.003, 6.006, 1.001, 7.006, 9.006, 8.006, 6.006, 1.001, 2.002, 3.002, 3.001, 4.003, 7.007, 6.006,
6.006, 7.007, 5.005, 6.006), Array(2.002, 4.005, 5.005, 7.007, 6.008, 6.007, 6.007, 4.006, 4.005, 2.002, 1.001, 6.006, 3.003,
7.006, 9.006, 8.006, 6.006, 3.004, 1.001, 4.004, 4.004, 4.003, 7.007, 6.006, 6.006, 7.008, 6.007, 6.006), Array(5.007, 4.005,
6.007, 6.008, 7.009, 7.009, 3.004, 3.003, 2.002, 1.001, 8.008, 3.005, 6.006, 8.006, 7.006, 7.008, 3.006, 3.003, 4.005, 5.006,
3.001, 6.007, 5.006, 5.006, 7.008, 5.006, 6.008), Array(5.005, 5.004, 4.004, 2.002, 2.002, 6.006, 7.007, 7.006, 6.005, 3.004,
4.004, 7.007, 9.007, 8.007, 3.003, 5.005, 4.004, 5.005, 5.005, 7.006, 5.005, 6.005, 6.006, 3.004, 8.008, 3.004), Array(2.002,
3.003, 6.006, 5.005, 4.004, 5.005, 3.003, 4.004, 7.007, 6.006, 2.002, 4.003, 3.003, 5.005, 6.006, 6.006, 7.007, 8.006, 5.003,
3.004, 1.001, 1.001, 4.004, 4.004, 5.005), Array(1.001, 4.005, 3.004, 6.006, 7.007, 5.005, 6.006, 5.006, 7.007, 4.004, 6.005,
5.005, 3.004, 7.008, 7.008, 8.009, 9.008, 7.005, 2.004, 1.001, 3.003, 2.004, 6.006, 4.004), Array(3.004, 2.003, 7.007, 7.008,
6.006, 7.006, 4.005, 7.006, 5.005, 7.006, 6.006, 2.003, 7.007, 7.007, 8.008, 9.007, 7.006, 2.005, 2.002, 4.004, 2.003, 7.007,
3.003), Array(1.001, 8.008, 8.009, 8.008, 8.007, 1.004, 6.006, 8.007, 10.007, 9.007, 2.002, 7.007, 6.006, 7.007, 7.007, 8.008,
4.004, 6.005, 7.007, 3.003, 9.009, 3.004), Array(8.008, 8.009, 7.007, 8.007, 2.003, 6.006, 7.006, 9.006, 8.006, 1.001, 7.007,
6.006, 7.007, 7.007, 8.007, 3.003, 5.004, 6.006, 2.002, 8.008, 3.003), Array(5.001, 5.004, 5.004, 9.009, 4.004, 6.004, 8.004,
7.004, 8.008, 4.004, 5.005, 3.003, 4.004, 5.003, 6.006, 5.005, 5.005, 7.007, 2.002, 8.008), Array(5.003, 4.003, 10.009, 5.005,
7.005, 9.005, 8.005, 9.008, 5.005, 6.005, 4.006, 5.005, 6.002, 7.007, 6.006, 6.006, 8.008, 3.005, 9.007), Array(1.001, 8.008,
4.005, 5.004, 7.004, 6.004, 7.007, 4.005, 3.003, 5.006, 6.005, 3.002, 5.005, 4.004, 4.004, 6.006, 5.005, 6.007), Array(7.007,
4.004, 6.005, 8.005, 7.005, 7.007, 4.005, 2.002, 5.005, 5.005, 3.002, 6.006, 5.005, 5.005, 7.007, 5.006, 6.007), Array(6.006,
9.008, 11.008, 10.008, 2.002, 7.007, 5.005, 7.007, 7.007, 9.008, 5.005, 7.006, 8.008, 4.004, 10.010, 2.002), Array(8.007,
10.007, 9.007, 6.006, 2.002, 2.002, 3.003, 3.002, 5.004, 8.008, 7.007, 7.007, 7.008, 6.006, 6.006), Array(2.002, 1.001, 6.007,
7.008, 7.008, 7.009, 8.008, 5.005, 3.006, 3.003, 1.001, 5.006, 3.006, 7.007), Array(1.001, 6.009, 7.010, 7.010, 7.011, 8.010,
5.007, 3.008, 4.005, 3.003, 5.008, 3.008, 7.009), Array(6.008, 7.009, 7.009, 7.010, 8.009, 5.006, 3.007, 4.004, 2.002, 5.007,
3.007, 7.008), Array(7.007, 5.005, 7.007, 7.007, 8.007, 3.003, 5.004, 6.006, 2.002, 8.008, 2.002), Array(3.003, 3.003, 3.002,
5.004, 8.008, 7.007, 7.007, 8.008, 6.006, 7.007), Array(3.003, 3.003, 5.004, 8.008, 7.007, 7.007, 7.007, 7.007, 5.005), Array(
1.001, 6.005, 9.009, 8.008, 8.008, 8.009, 5.005, 7.007), Array(5.006, 8.010, 7.009, 7.009, 8.009, 6.006, 7.007), Array(5.007,
4.006, 4.006, 6.008, 5.005, 6.007), Array(5.003, 5.004, 2.002, 5.005, 5.005), Array(2.002, 3.005, 5.005, 5.005), Array(5.005,
4.005, 6.006), Array(7.007, 3.003), Array(8.008));
}
}
rule("SUBROUTINE: BOT - GET NEXT NODE ID")
rule("MAP: EICHENWALDE (HALLOWEEN)")
{
event
{
Subroutine;
BotGetNextNodeId;
Ongoing - Global;
}
conditions
{
Current Map == Map(Eichenwalde Halloween);
}
actions
{
Event Player.BotShortestDistance = 999;
Event Player.BotCurrentDistance = Event Player.BotShortestDistance;
Event Player.BotTempArray = Global.NodeConnections[Event Player.BotCurrentNodeId];
For Player Variable(Event Player, BotLoopIterator1, 0, Count Of(Event Player.BotTempArray), 1);
If(Event Player.BotTempArray[Event Player.BotLoopIterator1] == Event Player.BotTargetNodeId);
Event Player.BotCurrentNodeId = Event Player.BotTargetNodeId;
Break;
End;
Event Player.BotCurrentDistance = Global.DistanceMatrix[Event Player.BotTempArray[Event Player.BotLoopIterator1]][Event Player.BotTargetNodeId];
If(Event Player.BotCurrentDistance < Event Player.BotShortestDistance);
Event Player.BotShortestDistance = Event Player.BotCurrentDistance;
Event Player.BotCurrentNodeId = Event Player.BotTempArray[Event Player.BotLoopIterator1];
End;
End;
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.001, 2.002, 2.002, 3.003, 4.007, 5.005, 5.006, 4.004, 6.007, 7.007, 5.008, 3.003, 3.003,
4.004, 5.005, 4.004, 6.005, 7.006, 6.006, 6.007, 7.007, 6.006, 7.007, 7.007, 8.008, 9.007, 10.006, 7.007, 8.008, 9.009, 10.010,
8.008, 9.009, 9.009, 10.010, 11.011, 9.009, 8.008, 9.009, 10.010, 10.010, 10.010, 11.011, 12.012, 13.013, 14.012, 15.011,
12.012), Array(1.001, 1.001, 2.002, 3.006, 4.004, 4.005, 3.003, 5.006, 6.006, 4.007, 2.002, 2.002, 3.003, 4.004, 3.003, 5.004,
6.005, 5.005, 5.006, 6.006, 5.005, 6.006, 6.006, 7.007, 8.006, 9.005, 6.006, 7.007, 8.008, 9.009, 7.007, 8.008, 8.008, 9.009,
10.010, 8.008, 7.007, 8.008, 9.009, 9.009, 9.009, 10.010, 11.011, 12.012, 13.011, 14.010, 11.011), Array(2.002, 3.003, 4.007,
5.005, 5.006, 4.004, 6.007, 7.006, 5.007, 2.002, 1.001, 3.003, 4.004, 3.003, 5.004, 6.005, 5.005, 6.006, 6.006, 5.005, 6.006,
6.006, 7.007, 8.006, 9.005, 6.006, 7.007, 8.008, 9.009, 7.007, 8.008, 8.008, 9.009, 10.010, 8.008, 7.007, 8.008, 9.009, 9.009,
9.009, 10.010, 11.011, 12.012, 13.011, 14.010, 11.011), Array(1.001, 2.005, 3.003, 3.004, 2.002, 4.005, 5.005, 3.006, 1.001,
2.002, 2.002, 3.003, 2.002, 4.003, 5.004, 4.004, 4.005, 5.005, 4.004, 5.005, 5.005, 6.006, 7.005, 8.004, 5.005, 6.006, 7.007,
8.008, 6.006, 7.007, 7.007, 8.008, 9.009, 7.007, 6.006, 7.007, 8.008, 8.008, 8.008, 9.009, 10.010, 11.011, 12.010, 13.009,
10.010), Array(1.004, 2.002, 2.003, 1.001, 3.004, 4.005, 2.005, 2.002, 3.003, 3.003, 4.004, 3.003, 3.003, 4.004, 5.005, 3.005,
4.006, 4.004, 5.005, 5.005, 6.006, 7.006, 8.005, 5.005, 6.006, 7.007, 8.008, 6.006, 7.007, 7.007, 8.008, 9.009, 7.007, 6.006,
7.007, 8.008, 8.008, 8.008, 9.009, 10.010, 11.011, 12.010, 13.009, 10.010), Array(2.002, 1.001, 3.002, 2.002, 3.003, 1.001,
5.003, 6.004, 5.004, 4.004, 4.004, 3.003, 3.003, 4.004, 2.002, 3.003, 4.004, 4.004, 5.005, 6.006, 7.006, 8.005, 5.005, 6.006,
7.007, 8.008, 6.006, 7.007, 7.007, 8.008, 9.009, 7.007, 6.006, 7.007, 8.008, 8.008, 8.008, 9.009, 10.010, 11.011, 12.010,
13.009, 10.010), Array(1.001, 1.001, 2.002, 3.003, 2.003, 3.004, 4.005, 3.003, 2.002, 2.003, 1.001, 2.002, 3.003, 3.003, 4.004,
2.002, 3.003, 3.003, 4.004, 5.004, 6.003, 3.003, 4.004, 5.005, 6.006, 4.004, 5.005, 5.005, 6.006, 7.007, 5.005, 4.004, 5.005,
6.006, 6.006, 6.006, 7.007, 8.008, 9.009, 10.008, 11.007, 8.008), Array(2.002, 1.001, 2.002, 1.002, 4.004, 5.005, 4.004, 3.003,
3.004, 2.002, 3.003, 4.004, 2.003, 3.004, 3.003, 4.004, 4.004, 5.005, 6.005, 7.004, 4.004, 5.005, 6.006, 7.007, 5.005, 6.006,
6.006, 7.007, 8.008, 6.006, 5.005, 6.006, 7.007, 7.007, 7.007, 8.008, 9.009, 10.010, 11.009, 12.008, 9.009), Array(3.003,
4.004, 3.004, 3.003, 4.004, 4.004, 3.003, 3.004, 2.002, 3.003, 4.004, 4.004, 5.005, 3.003, 4.004, 4.004, 5.005, 6.005, 7.004,
4.004, 5.005, 6.006, 7.007, 5.005, 6.006, 6.006, 7.007, 8.008, 6.006, 5.005, 6.006, 7.007, 7.007, 7.007, 8.008, 9.009, 10.010,
11.009, 12.008, 9.009), Array(1.001, 1.003, 5.005, 6.006, 5.005, 4.004, 4.005, 3.003, 2.004, 3.005, 1.004, 2.005, 4.004, 3.005,
5.005, 6.006, 7.006, 8.005, 4.005, 5.006, 6.007, 7.008, 6.006, 7.007, 7.007, 8.008, 8.009, 6.007, 5.006, 6.007, 7.008, 7.008,
7.008, 8.009, 9.010, 10.011, 11.010, 12.009, 9.010), Array(2.004, 4.006, 5.007, 4.006, 3.005, 3.006, 2.004, 1.005, 2.006,
1.005, 2.006, 3.005, 3.006, 4.006, 5.007, 6.007, 7.006, 4.006, 5.007, 6.008, 7.009, 5.007, 6.008, 6.008, 7.009, 8.010, 6.008,
5.007, 6.008, 7.009, 7.009, 7.009, 8.010, 9.011, 10.012, 11.011, 12.010, 9.011), Array(5.004, 6.005, 5.005, 4.004, 4.005,
3.003, 2.002, 3.003, 1.001, 2.002, 4.004, 3.003, 5.005, 6.006, 7.005, 8.004, 4.004, 5.005, 6.006, 7.007, 6.006, 7.007, 7.007,
8.008, 8.008, 6.006, 5.005, 6.006, 7.007, 7.007, 7.007, 8.008, 9.009, 10.010, 11.009, 12.008, 9.009), Array(1.001, 1.001,
2.002, 1.001, 3.002, 4.003, 3.003, 5.004, 4.004, 3.003, 4.004, 4.004, 5.005, 6.004, 7.003, 4.004, 5.005, 6.006, 7.007, 5.005,
6.006, 6.006, 7.007, 8.008, 6.006, 5.005, 6.006, 7.007, 7.007, 7.007, 8.008, 9.009, 10.010, 11.009, 12.008, 9.009), Array(
2.002, 3.003, 2.002, 4.003, 5.004, 4.004, 6.005, 5.005, 4.004, 5.005, 5.005, 6.006, 7.005, 8.004, 5.005, 6.006, 7.007, 8.008,
6.006, 7.007, 7.007, 8.008, 9.009, 7.007, 6.006, 7.007, 8.008, 8.008, 8.008, 9.009, 10.010, 11.011, 12.010, 13.009, 10.010),
Array(1.001, 2.002, 2.002, 3.003, 2.002, 4.004, 3.003, 2.002, 3.003, 3.003, 4.004, 5.003, 6.002, 3.003, 4.004, 5.005, 6.006,
4.004, 5.005, 5.005, 6.006, 7.007, 5.005, 4.004, 5.005, 6.006, 6.006, 6.006, 7.007, 8.008, 9.009, 10.008, 11.007, 8.008),
Array(1.001, 1.001, 2.002, 1.001, 3.003, 2.002, 1.001, 2.002, 2.002, 3.003, 4.002, 5.001, 2.002, 3.003, 4.004, 5.005, 3.003,
4.004, 4.004, 5.005, 6.006, 4.004, 3.003, 4.004, 5.005, 5.005, 5.005, 6.006, 7.007, 8.008, 9.007, 10.006, 7.007), Array(2.001,
3.002, 2.002, 4.003, 3.003, 2.002, 3.003, 3.003, 4.004, 5.003, 6.002, 3.003, 4.004, 5.005, 6.006, 4.004, 5.005, 5.005, 6.006,
7.007, 5.005, 4.004, 5.005, 6.006, 6.006, 6.006, 7.007, 8.008, 9.009, 10.008, 11.007, 8.008), Array(1.001, 2.002, 2.002, 3.003,
1.001, 2.002, 2.002, 3.003, 4.003, 5.002, 2.002, 3.003, 4.004, 5.005, 3.003, 4.004, 4.004, 5.005, 6.006, 4.004, 3.003, 4.004,
5.005, 5.005, 5.005, 6.006, 7.007, 8.008, 9.007, 10.006, 7.007), Array(1.001, 1.001, 2.002, 2.002, 3.003, 3.003, 4.004, 5.003,
6.002, 3.003, 4.004, 5.005, 6.006, 4.004, 5.005, 5.005, 6.006, 7.007, 5.005, 4.004, 5.005, 6.006, 6.006, 6.006, 7.007, 8.008,
9.009, 10.008, 11.007, 8.008), Array(2.002, 1.001, 1.001, 2.002, 2.002, 3.003, 4.002, 5.001, 2.002, 3.003, 4.004, 5.005, 3.003,
4.004, 4.004, 5.005, 6.006, 4.004, 3.003, 4.004, 5.005, 5.005, 5.005, 6.006, 7.007, 8.008, 9.007, 10.006, 7.007), Array(1.001,
3.003, 2.002, 4.004, 5.005, 6.004, 7.003, 3.003, 4.004, 5.005, 6.006, 5.005, 6.006, 6.006, 7.007, 7.007, 5.005, 4.004, 5.005,
6.006, 6.006, 6.006, 7.007, 8.008, 9.009, 10.008, 11.007, 8.008), Array(2.002, 1.001, 3.003, 4.004, 5.003, 6.002, 2.002, 3.003,
4.004, 5.005, 4.004, 5.005, 5.005, 6.006, 6.006, 4.004, 3.003, 4.004, 5.005, 5.005, 5.005, 6.006, 7.007, 8.008, 9.007, 10.006,
7.007), Array(1.001, 1.001, 2.002, 3.003, 4.002, 1.001, 2.002, 3.003, 4.004, 2.002, 3.003, 3.003, 4.004, 5.005, 3.003, 2.002,
3.003, 4.004, 4.004, 4.004, 5.005, 6.006, 7.007, 8.006, 9.005, 6.006), Array(2.002, 3.003, 4.003, 5.002, 1.001, 2.002, 3.003,
4.004, 3.003, 4.004, 4.004, 5.005, 5.005, 3.003, 2.002, 3.003, 4.004, 4.004, 4.004, 5.005, 6.006, 7.007, 8.006, 9.005, 6.006),
Array(1.001, 2.002, 3.001, 1.001, 2.002, 3.003, 4.003, 1.001, 2.002, 2.002, 3.003, 4.004, 2.002, 1.001, 2.002, 3.003, 3.003,
3.003, 4.004, 5.005, 6.006, 7.005, 8.004, 5.005), Array(1.001, 2.002, 2.002, 3.003, 4.004, 5.004, 1.001, 2.002, 2.002, 3.003,
4.004, 2.002, 2.002, 3.003, 3.003, 3.003, 4.004, 4.004, 5.005, 6.006, 7.005, 8.004, 5.005), Array(1.001, 2.003, 3.004, 4.005,
5.005, 2.002, 3.003, 3.003, 4.004, 5.005, 3.003, 3.003, 4.004, 4.004, 4.004, 5.005, 5.005, 6.006, 7.007, 8.006, 9.005, 6.006),
Array(1.004, 2.005, 3.006, 4.006, 2.003, 3.004, 3.004, 4.005, 5.006, 3.004, 2.004, 3.005, 4.005, 4.005, 4.006, 5.006, 6.007,
7.008, 8.007, 9.006, 6.007), Array(1.001, 2.002, 3.003, 2.002, 3.003, 3.003, 4.004, 4.004, 2.002, 1.001, 2.002, 3.003, 3.003,
3.003, 4.004, 5.005, 6.006, 7.005, 8.004, 5.005), Array(1.001, 2.002, 3.003, 4.004, 4.004, 5.005, 5.005, 3.003, 2.002, 3.003,
4.004, 4.004, 3.004, 4.005, 5.006, 6.007, 7.006, 8.005, 5.006), Array(1.001, 4.004, 5.005, 4.005, 5.006, 4.006, 3.004, 3.003,
2.004, 3.005, 3.005, 2.005, 3.006, 4.007, 5.008, 6.007, 7.006, 4.007), Array(3.005, 4.006, 3.006, 4.007, 3.007, 2.005, 2.004,
1.005, 2.006, 2.006, 1.006, 2.007, 3.008, 4.009, 5.008, 6.007, 3.008), Array(1.001, 1.001, 2.002, 3.003, 1.001, 2.002, 2.002,
2.002, 2.002, 3.003, 3.003, 4.004, 5.005, 6.004, 7.003, 4.004), Array(2.002, 1.001, 2.002, 2.002, 3.003, 3.003, 3.003, 3.003,
4.004, 4.004, 5.005, 6.005, 7.004, 8.003, 3.003), Array(1.003, 2.002, 2.002, 3.003, 2.002, 1.001, 1.001, 2.002, 2.002, 3.003,
4.004, 5.003, 6.002, 3.003), Array(1.001, 3.003, 4.004, 3.003, 2.002, 3.002, 3.003, 3.003, 4.004, 5.004, 6.003, 7.002, 2.002),
Array(3.003, 3.003, 2.002, 1.001, 2.002, 2.002, 2.002, 3.003, 4.003, 5.002, 6.001, 1.001), Array(1.001, 1.001, 2.002, 1.001,
2.002, 3.003, 4.004, 5.005, 6.004, 7.003, 4.004), Array(1.001, 2.002, 2.002, 2.002, 3.003, 4.004, 5.005, 6.004, 7.003, 4.004),
Array(1.001, 1.001, 1.001, 2.002, 3.003, 4.004, 5.003, 6.002, 3.003), Array(1.001, 1.001, 1.001, 2.002, 3.003, 4.002, 5.001,
2.002), Array(2.002, 2.002, 3.003, 4.004, 5.003, 6.002, 3.003), Array(1.001, 2.002, 3.003, 4.002, 5.001, 2.002), Array(1.001,
2.002, 3.003, 4.002, 1.001), Array(1.001, 2.002, 3.003, 2.002), Array(1.001, 2.002, 3.003), Array(1.001, 3.004), Array(2.005));
}
}
rule("SUBROUTINE: BOT - GET CURRENT NODE ID")
rule("MAP: WORKSHOP ISLAND")
{
event
{
Subroutine;
BotGetCurrentNodeId;
Ongoing - Global;
}
conditions
{
Current Map == Map(Workshop Island);
}
actions
{
Event Player.BotCurrentNodeId = 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]);
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));
}
}
rule("SUBROUTINE: BOT - GET TARGET NODE ID")
rule("MAP: DORADO")
{
event
{
Subroutine;
BotGetTargetNodeId;
Ongoing - Global;
}
conditions
{
Current Map == Map(Dorado);
}
actions
{
Event Player.BotTargetPosition = Event Player.BotTargetPlayer != -1 ? Position Of(Event Player.BotTargetPlayer)
: Event Player.BotTargetPosition;
Event Player.BotTargetNodeId = 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]);
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.001, 2.002, 3.003, 2.002, 1.001, 0.003, 4.004, 3.003, 4.004, 5.005, 6.006, 0.004, 5.005,
4.004, 3.003, 2.002, 3.003, 3.003, 4.004, 5.005, 6.006, 6.006, 7.007, 7.007, 0.006, 8.007, 9.006, 10.007, 11.004, 10.005),
Array(1.001, 2.002, 3.003, 2.002, 0.003, 3.003, 2.002, 3.003, 4.004, 5.005, 0.003, 4.004, 3.003, 2.002, 1.001, 4.004, 3.003,
4.004, 5.005, 6.006, 6.006, 7.007, 6.006, 0.005, 7.007, 8.006, 9.007, 10.004, 9.005), Array(1.001, 2.002, 1.001, 0.002, 2.002,
1.001, 2.002, 3.003, 4.004, 0.002, 5.005, 4.004, 3.003, 2.002, 3.003, 2.002, 3.003, 4.004, 5.005, 5.005, 6.006, 5.005, 0.004,
6.006, 7.005, 8.006, 9.003, 8.004), Array(1.001, 2.002, 0.001, 1.001, 1.001, 2.002, 2.002, 3.003, 0.002, 4.004, 4.004, 3.003,
2.002, 2.002, 1.001, 2.002, 3.003, 4.004, 4.004, 5.005, 4.004, 0.003, 5.005, 6.004, 7.005, 8.002, 7.003), Array(1.001, 0.001,
2.002, 2.002, 3.003, 3.003, 4.004, 0.003, 5.005, 5.005, 4.004, 3.003, 1.001, 1.001, 2.002, 3.003, 4.004, 4.004, 5.005, 5.005,
0.004, 6.005, 7.004, 8.005, 9.002, 8.003), Array(0.002, 3.003, 2.002, 3.003, 4.004, 5.005, 0.003, 6.006, 5.005, 4.004, 3.003,
2.002, 2.002, 3.003, 4.004, 5.005, 5.005, 6.006, 6.006, 0.005, 7.006, 8.005, 9.006, 10.003, 9.004), 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.001, 2.002, 1.001, 2.002, 0.002, 3.003, 4.004, 3.003, 2.002, 2.002,
1.001, 2.002, 3.003, 4.004, 4.004, 4.004, 3.003, 0.002, 4.004, 5.004, 6.005, 7.002, 6.003), Array(1.001, 2.002, 3.003, 0.001,
4.004, 3.003, 2.002, 1.001, 3.003, 2.002, 3.003, 4.004, 5.005, 5.005, 5.005, 4.004, 0.003, 5.005, 6.005, 7.006, 8.003, 7.004),
Array(1.001, 2.002, 0.001, 3.003, 4.004, 3.003, 2.002, 4.004, 3.003, 4.004, 5.005, 5.005, 5.005, 4.004, 3.003, 0.002, 4.004,
5.005, 6.005, 7.004, 6.005), Array(1.001, 0.002, 2.002, 3.003, 4.004, 3.003, 3.003, 2.002, 3.003, 4.004, 4.004, 4.004, 3.003,
2.002, 0.001, 3.003, 4.004, 5.004, 6.003, 5.004), Array(0.001, 1.001, 2.002, 3.003, 4.004, 4.004, 3.003, 4.004, 4.004, 3.003,
3.003, 2.002, 1.001, 0.001, 2.002, 3.003, 4.003, 5.004, 4.004), Array(2, 3, 3, 2, 4, 3, 4, 5, 4, 4, 3, 2, 0, 3, 4, 5, 6, 5),
Array(1.001, 2.002, 3.003, 5.005, 4.004, 5.005, 5.005, 4.004, 4.004, 3.003, 2.002, 0.002, 3.003, 4.004, 5.004, 6.005, 5.005),
Array(1.001, 2.002, 6.006, 5.005, 6.006, 6.006, 5.005, 5.005, 4.004, 3.003, 0.003, 4.004, 5.005, 6.005, 7.006, 6.006), Array(
1.001, 5.005, 4.004, 5.005, 6.006, 6.006, 6.006, 5.005, 4.004, 0.004, 5.005, 6.006, 7.006, 8.005, 7.006), Array(4.004, 3.003,
4.004, 5.005, 6.006, 6.006, 6.006, 5.005, 0.004, 6.006, 7.006, 8.007, 9.004, 8.005), Array(1.001, 2.002, 3.003, 4.004, 4.004,
5.005, 5.005, 0.004, 6.005, 7.004, 8.005, 9.002, 8.003), Array(1.001, 2.002, 3.003, 3.003, 4.004, 4.004, 0.003, 5.004, 6.003,
7.004, 8.001, 7.002), Array(1.001, 2.002, 2.002, 3.003, 4.004, 0.004, 5.004, 6.004, 7.004, 8.002, 7.003), Array(1.001, 1.001,
2.002, 3.003, 0.004, 4.003, 5.003, 6.003, 7.003, 6.004), Array(2.002, 1.001, 2.002, 0.003, 3.002, 4.002, 5.002, 6.004, 5.003),
Array(1.001, 2.002, 0.003, 3.002, 4.002, 5.002, 6.004, 5.003), Array(1.001, 0.002, 2.001, 3.001, 4.001, 5.003, 4.002), Array(
0.001, 1.001, 2.002, 3.002, 4.004, 3.003), Array(2, 3, 4, 5, 4), Array(1.001, 2.001, 3.003, 2.002), Array(1.001, 2.002, 1.001),
Array(3.003, 2.002), Array(1.001));
}
}
rule("MAP: HAVANA")
{
event
{
Ongoing - Global;
}
conditions
{
Current Map == Map(Havana);
}
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.001, 2.002, 2.002, 1.001, 2.002, 1.001, 1.001, 5.002, 2.002, 3.004, 3.003, 2.002, 4.004,
6.006, 6.006, 3.003, 7.005, 7.007, 3.003, 3.003, 3.003, 4.004, 5.005, 5.005, 4.004, 4.004, 4.004, 5.005, 5.005, 6.006, 7.006,
4.002, 5.002, 4.005, 4.004, 5.005, 5.005, 5.001, 4.002, 3.003, 5.005, 6.006, 7.007, 2.002, 3.003, 3.002, 2.001), Array(1.001,
2.002, 1.001, 2.002, 1.001, 1.001, 5.002, 2.002, 3.004, 3.003, 2.002, 4.004, 6.006, 6.006, 3.003, 7.005, 7.007, 3.003, 3.003,
3.003, 4.004, 5.005, 5.005, 4.004, 4.004, 4.004, 5.005, 5.005, 6.006, 7.006, 3.001, 4.002, 4.005, 4.004, 5.005, 5.005, 4.001,
4.002, 3.003, 5.005, 6.006, 7.007, 2.002, 3.003, 2.002, 1.001), Array(1.001, 2.002, 3.003, 2.002, 2.002, 6.003, 3.003, 4.005,
4.004, 3.003, 5.005, 7.007, 7.007, 4.004, 8.006, 8.008, 4.004, 4.004, 4.004, 5.005, 6.006, 6.006, 5.005, 5.005, 5.005, 4.006,
6.006, 7.007, 8.007, 4.002, 5.003, 3.006, 4.005, 4.006, 6.006, 5.002, 5.003, 2.002, 5.006, 6.007, 7.008, 3.003, 4.004, 3.003,
2.002), Array(1.001, 2.002, 2.002, 2.002, 6.003, 3.003, 4.005, 4.004, 3.003, 4.004, 6.006, 6.006, 3.003, 7.005, 7.007, 3.003,
3.003, 3.003, 4.004, 5.005, 5.005, 4.004, 4.004, 4.004, 3.005, 5.005, 6.006, 7.006, 5.003, 6.002, 2.005, 3.004, 3.005, 5.005,
6.002, 5.003, 1.001, 4.005, 5.006, 6.007, 3.003, 4.004, 4.004, 3.003), Array(1.001, 1.001, 1.001, 5.002, 2.002, 3.004, 3.003,
2.002, 3.003, 5.005, 5.005, 2.002, 6.004, 6.006, 2.002, 2.002, 2.002, 3.003, 4.004, 4.004, 3.003, 3.003, 3.003, 4.004, 4.004,
5.005, 6.005, 4.002, 5.002, 3.004, 3.003, 4.004, 4.004, 5.001, 4.002, 2.002, 4.004, 5.005, 6.006, 2.002, 3.003, 3.003, 2.002),
Array(2.002, 1.001, 6.002, 3.003, 2.003, 3.003, 2.002, 2.002, 4.004, 4.004, 1.001, 5.003, 5.005, 1.001, 1.001, 1.001, 2.002,
3.003, 3.003, 2.002, 2.002, 2.002, 3.003, 3.003, 4.004, 5.004, 5.002, 6.002, 2.003, 2.002, 3.003, 3.003, 6.001, 5.003, 1.001,
3.003, 4.004, 5.005, 3.003, 4.004, 4.003, 3.003), Array(1.001, 4.002, 1.001, 2.003, 2.002, 1.001, 3.004, 6.006, 6.006, 3.003,
7.005, 7.007, 3.003, 3.003, 3.003, 4.004, 5.005, 5.005, 4.004, 4.004, 4.004, 5.005, 5.005, 6.006, 7.006, 4.002, 5.002, 4.005,
4.004, 4.005, 5.005, 5.001, 3.001, 3.003, 5.005, 6.006, 7.007, 1.001, 2.002, 3.002, 2.001), Array(5.001, 2.002, 2.004, 3.003,
1.001, 3.003, 5.005, 5.005, 2.002, 6.004, 6.006, 2.002, 2.002, 2.002, 3.003, 4.004, 4.004, 3.003, 3.003, 3.003, 4.004, 4.004,
5.005, 6.005, 4.002, 5.003, 3.004, 3.003, 4.004, 4.004, 5.002, 4.002, 2.002, 4.004, 5.005, 6.006, 2.002, 3.003, 3.003, 2.002),
Array(3.005, 3.007, 4.006, 2.005, 4.008, 6.010, 6.010, 3.007, 7.009, 7.011, 3.007, 3.007, 3.007, 4.008, 5.009, 5.009, 4.008,
4.008, 4.008, 5.009, 5.009, 6.010, 7.010, 5.006, 6.006, 4.009, 4.008, 5.009, 5.009, 6.005, 1.001, 3.007, 5.009, 6.010, 7.011,
2.003, 2.002, 4.006, 3.005), Array(2.002, 1.001, 2.002, 2.003, 6.007, 6.007, 3.004, 7.006, 7.008, 4.004, 4.003, 4.004, 4.005,
5.006, 5.006, 4.005, 5.005, 5.005, 5.006, 6.006, 7.007, 8.007, 5.003, 6.003, 4.005, 5.005, 3.004, 5.006, 6.002, 4.002, 4.004,
6.006, 7.007, 8.008, 2.002, 3.003, 4.003, 3.002), Array(1.001, 4.001, 1.001, 5.005, 5.005, 2.002, 6.004, 6.006, 3.003, 4.001,
3.002, 3.003, 4.004, 4.004, 3.003, 4.004, 4.004, 4.004, 5.005, 6.006, 7.006, 7.004, 8.004, 3.003, 4.004, 2.002, 4.004, 8.003,
6.003, 4.003, 5.005, 6.006, 7.007, 4.003, 5.004, 6.004, 5.003), Array(3.002, 1.002, 5.006, 5.006, 2.003, 6.005, 6.007, 3.004,
4.002, 3.003, 3.004, 4.005, 4.005, 3.004, 4.005, 4.005, 4.005, 5.006, 6.007, 7.007, 6.004, 7.004, 3.004, 4.005, 2.003, 4.005,
7.003, 5.003, 4.004, 5.006, 6.007, 7.008, 3.003, 4.004, 5.004, 4.003), Array(2.004, 6.006, 6.006, 3.003, 7.005, 7.007, 3.003,
3.003, 3.003, 4.004, 5.005, 5.005, 4.004, 4.004, 4.004, 5.005, 5.005, 6.006, 7.006, 5.003, 6.003, 4.005, 4.004, 3.005, 5.005,
6.002, 4.002, 3.003, 5.005, 6.006, 7.007, 2.002, 3.003, 4.003, 3.002), Array(4.004, 4.004, 1.001, 5.003, 5.005, 2.002, 3.001,
2.001, 2.002, 3.003, 3.003, 2.002, 3.003, 3.003, 3.003, 4.004, 5.005, 6.005, 7.004, 8.004, 2.002, 3.003, 1.001, 3.003, 8.003,
7.004, 3.003, 4.004, 5.005, 6.006, 5.004, 6.005, 6.005, 5.004), Array(4.003, 3.003, 5.002, 1.001, 3.003, 5.005, 4.004, 3.003,
1.001, 3.003, 2.002, 2.003, 3.003, 4.004, 2.002, 1.001, 2.002, 9.006, 10.006, 4.004, 3.003, 5.005, 2.002, 10.005, 9.007, 5.005,
3.003, 3.003, 3.003, 7.007, 8.008, 8.007, 7.007), Array(3.003, 1.001, 4.005, 3.003, 5.005, 3.003, 2.002, 2.003, 1.001, 2.003,
3.004, 3.004, 4.005, 4.005, 4.005, 5.006, 9.006, 10.006, 4.005, 3.004, 5.005, 2.002, 10.005, 9.007, 5.005, 4.005, 5.006, 6.007,
7.007, 8.008, 8.007, 7.007), Array(4.002, 4.004, 1.001, 2.002, 1.001, 1.001, 2.002, 2.002, 1.001, 2.002, 2.002, 3.003, 3.003,
4.004, 5.004, 6.003, 7.003, 2.003, 2.002, 2.002, 2.002, 7.002, 6.004, 2.002, 3.003, 4.004, 5.005, 4.004, 5.005, 5.004, 4.004),
Array(3.006, 2.004, 4.006, 2.004, 1.003, 1.004, 2.002, 1.004, 2.005, 2.005, 3.006, 3.006, 3.006, 4.007, 8.007, 9.007, 3.006,
2.005, 4.006, 2.003, 9.006, 8.008, 4.006, 3.006, 4.007, 5.008, 6.008, 7.009, 7.008, 6.008), Array(4.004, 6.006, 5.005, 4.004,
2.002, 4.004, 3.003, 3.004, 4.004, 5.005, 3.003, 2.002, 3.003, 10.007, 11.007, 5.005, 4.004, 6.006, 3.003, 11.006, 10.008,
6.006, 4.004, 4.004, 4.004, 8.008, 9.009, 9.008, 8.008), Array(2.002, 1.001, 1.001, 2.002, 2.002, 1.001, 1.001, 1.001, 2.002,
2.002, 3.003, 4.003, 6.003, 7.003, 2.002, 1.001, 3.003, 2.002, 7.002, 6.004, 2.002, 2.002, 3.003, 4.004, 4.004, 5.005, 5.004,
4.004), Array(2.002, 3.003, 4.004, 4.004, 3.003, 3.003, 3.003, 4.004, 4.004, 5.005, 6.005, 6.003, 7.003, 3.004, 3.003, 2.004,
4.004, 7.002, 6.004, 2.002, 4.004, 5.005, 6.006, 4.004, 5.005, 5.004, 4.004), Array(1.001, 3.003, 2.002, 2.002, 2.002, 2.002,
2.003, 3.003, 4.004, 5.004, 6.003, 7.003, 1.003, 2.002, 2.003, 3.003, 7.002, 6.004, 2.002, 3.003, 4.004, 5.005, 4.004, 5.005,
5.004, 4.004), Array(2.002, 1.001, 1.001, 2.002, 2.002, 3.003, 3.003, 4.004, 5.004, 7.004, 8.004, 2.003, 2.002, 3.003, 2.002,
8.003, 7.005, 3.003, 3.003, 4.004, 5.005, 5.005, 6.006, 6.005, 5.005), Array(2.002, 1.001, 1.002, 2.002, 3.003, 2.003, 2.002,
3.003, 8.005, 9.005, 3.003, 2.002, 4.004, 1.001, 9.004, 8.006, 4.004, 3.003, 3.004, 4.004, 6.006, 7.007, 7.006, 6.006), Array(
2.002, 3.003, 3.003, 4.004, 4.004, 4.004, 5.005, 8.005, 9.005, 3.004, 3.003, 4.004, 1.001, 9.004, 8.006, 4.004, 4.004, 5.005,
6.006, 6.006, 7.007, 7.006, 6.006), Array(1.001, 1.001, 2.002, 2.002, 3.003, 4.003, 7.004, 8.004, 2.002, 1.001, 3.003, 1.001,
8.003, 7.005, 3.003, 2.002, 3.003, 4.004, 5.005, 6.006, 6.005, 5.005), Array(1.001, 2.002, 1.001, 2.002, 3.002, 7.004, 8.004,
2.002, 1.001, 3.003, 2.002, 8.003, 7.005, 3.003, 2.002, 2.002, 3.003, 5.005, 6.006, 6.005, 5.005), Array(2.002, 1.001, 2.002,
3.002, 7.004, 8.004, 2.002, 1.001, 3.003, 2.002, 8.003, 7.005, 3.003, 1.001, 2.002, 3.003, 5.005, 6.006, 6.005, 5.005), Array(
2.002, 3.003, 4.003, 8.004, 9.003, 1.001, 1.001, 2.002, 3.003, 9.004, 8.006, 4.002, 1.001, 2.002, 3.003, 6.006, 7.007, 7.005,
6.006), Array(1.001, 2.001, 8.005, 9.005, 3.003, 2.002, 4.004, 3.003, 9.004, 8.006, 4.004, 1.001, 1.001, 2.002, 6.006, 7.007,
7.006, 6.006), Array(1.001, 9.006, 10.006, 4.004, 3.003, 5.005, 3.003, 10.005, 9.007, 5.005, 2.002, 2.002, 2.002, 7.007, 8.008,
8.007, 7.007), Array(9.007, 10.007, 4.005, 3.004, 5.006, 4.004, 10.006, 9.008, 5.006, 2.003, 2.002, 1.001, 7.008, 8.009, 8.008,
7.008), Array(1.001, 3.008, 4.007, 4.008, 5.008, 1.001, 5.005, 2.006, 5.008, 6.009, 7.010, 3.005, 4.006, 1.001, 2.002), Array(
2.009, 3.008, 3.009, 5.009, 1.001, 5.006, 1.007, 4.009, 5.010, 6.011, 3.006, 4.007, 2.002, 3.003), Array(1.001, 1.001, 3.003,
9.003, 8.005, 4.001, 2.002, 3.003, 4.004, 6.005, 7.006, 7.004, 6.005), Array(2.002, 2.002, 8.003, 7.005, 3.002, 2.002, 3.003,
4.004, 5.005, 6.006, 6.005, 5.005), Array(4.004, 9.004, 8.005, 4.002, 3.003, 4.004, 5.005, 6.005, 7.006, 7.005, 6.005), Array(
9.004, 8.006, 4.004, 3.003, 4.004, 5.005, 6.006, 7.007, 7.006, 6.006), Array(4.006, 2.007, 4.009, 5.010, 6.011, 2.006, 3.007,
2.002, 2.003), Array(4.006, 6.008, 7.009, 8.010, 1.002, 1.001, 4.005, 3.004), Array(3.004, 4.005, 5.006, 4.004, 5.005, 5.003,
4.004), Array(1.001, 2.002, 6.006, 7.007, 7.006, 6.006), Array(1.001, 7.007, 8.008, 8.007, 7.007), Array(8.008, 9.009, 9.008,
8.008), Array(1.001, 4.003, 3.002), Array(5.004, 4.003), Array(1.001));
}
}
rule("BOT: PATH FINDING - INIT")
{
event
{
Player Joined Match;
All;
All;
}
conditions
{
Is Dummy Bot(Event Player) == True;
}
actions
{
Event Player.BotMoveSpeedMultiplier = 1;
Call Subroutine(BotResetPathFinding);
}
}
rule("BOT: PATH FINDING - START")
{
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;
}
actions
{
"GET CLOSSEST NODE ID NEAR BOT TO START PATH FINDING"
Call Subroutine(BotGetCurrentNodeId);
"GET CLOSSEST NODE ID NEAR TARGET POSITION"
Call Subroutine(BotGetTargetNodeId);
"SET MOVEMENT DIRECTION"
Start Throttle In Direction(Event Player, Direction Towards(Position Of(Event Player),
Global.NodePositions[Event Player.BotCurrentNodeId]), 1, To World, Replace existing throttle, Direction and Magnitude);
Start Facing(Event Player, Direction Towards(Eye Position(Event Player), Global.NodePositions[Event Player.BotCurrentNodeId]), 500,
To World, Direction and Turn Rate);
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));
}
}
rule("BOT: PATH FINDING - LOST THE CURRENT NODE")
rule("BOT: PATH FINDING - CANCEL")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
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), Global.NodePositions[Event Player.BotCurrentNodeId] + Vector(
0, 2.500, 0), Barriers Do Not Block LOS) == False && Speed Of In Direction(Event Player, Throttle Of(Event Player)) < 2)
== True;
Event Player.BotCancelPathFinding == True;
}
actions
{
Wait(0.650, Abort When False);
Call Subroutine(BotGetCurrentNodeId);
Start Throttle In Direction(Event Player, Direction Towards(Position Of(Event Player),
Global.NodePositions[Event Player.BotCurrentNodeId]), 1, To World, Replace existing throttle, Direction and Magnitude);
Start Facing(Event Player, Direction Towards(Eye Position(Event Player), Global.NodePositions[Event Player.BotCurrentNodeId]), 500,
To World, Direction and Turn Rate);
Start Rule(BotResetPathFinding, Restart Rule);
}
}
rule("BOT: PATH FINDING - REACHED THE NODE")
rule("BOT: PATH FINDING - JUMP")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Event Player.BotIsPathFinding == True;
(Event Player.BotTargetNodeId >= 0 && Distance Between(Position Of(Event Player),
Global.NodePositions[Event Player.BotCurrentNodeId]) < 0.850) == True;
Is On Ground(Event Player) == True;
Speed Of(Event Player) < 3 * Event Player.BotMoveSpeedMultiplier;
}
actions
{
Call Subroutine(BotGetTargetNodeId);
"BOT REACHED THE TARGET NODE"
If(Event Player.BotCurrentNodeId == Event Player.BotTargetNodeId);
Call Subroutine(BotResetPathFinding);
Abort;
Press Button(Event Player, Button(Jump));
Press Button(Event Player, Button(Melee));
}
}
rule("BOT: PATH FINDING - TIMESTAMP TRIGGER")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.BotIsPathFinding == True;
Event Player.BotIsPathFinding == True;
Total Time Elapsed >= Event Player.BotTimestamp;
}
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;
End;
End;
Call Subroutine(BotGetNextNodeId);
Start Throttle In Direction(Event Player, Direction Towards(Position Of(Event Player),
Global.NodePositions[Event Player.BotCurrentNodeId]), 1, To World, Replace existing throttle, Direction and Magnitude);
Start Facing(Event Player, Direction Towards(Eye Position(Event Player), Global.NodePositions[Event Player.BotCurrentNodeId]), 500,
To World, Direction and Turn Rate);
Call Subroutine(BotGetNextPosition);
Call Subroutine(BotComputeTimestamp);
}
}
rule("BOT: DEAD")
{
event
{
Player Died;
All;
All;
}
actions
{
Call Subroutine(BotResetPathFinding);
}
}
rule("SUBROUTINE: BOT - RESET PATH FINDING")
{
event
{
Subroutine;
BotResetPathFinding;
}
actions
{
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 * 1000;
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;
}
}
disabled rule("=== EXPORT BLOCK END ===")
disabled rule("")
{
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);
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);
Global.WorkshopSettingShowConnections = Workshop Setting Toggle(Custom String("MOD PROPERTIES"), Custom String(
"SHOW CONNECTION EFFECTS WHEN SELECTED ONLY "), True, 0);
"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 TO GET EXPORT VARS"), False, -95);
Global.WorkshopSettingInstructions = Workshop Setting Toggle(Custom String("INSTRUCTIONS - HOW DOES IT WORKS"), Custom String(
" 2.1. SWITCH TO BUILD MODE"), False, -94);
Global.WorkshopSettingInstructions = Workshop Setting Toggle(Custom String("INSTRUCTIONS - HOW DOES IT WORKS"), Custom String(
" 2.2. HOLD 'INTERACT' BUTTON A FEW SECONDS TO RUN BUILD PROCESS"), False, -93);
"2. BUILD YOUR PROJECT WITH WEB APP"), False, -95);
Global.WorkshopSettingInstructions = Workshop Setting Toggle(Custom String("INSTRUCTIONS - HOW DOES IT WORKS"), Custom String(
" 2.3. WAIT WHEN THE PROCESS WILL BE FINISHED"), False, -92);
" 2.1. COPY ALL ACTUAL VAR VALUES FROM INSPECTOR ('X' BUTTON)"), False, -94);
Global.WorkshopSettingInstructions = Workshop Setting Toggle(Custom String("INSTRUCTIONS - HOW DOES IT WORKS"), Custom String(
" 2.3. OPEN WORKSHOP INSPECTOR AT LAST POSITION AND SELECT 'VARIABLE TARGET' = GLOBAL"), False, -91);
" 2.2. VISIT WEB APP 'PATH NODE BUILDER'"), False, -93);
Global.WorkshopSettingInstructions = Workshop Setting Toggle(Custom String("INSTRUCTIONS - HOW DOES IT WORKS"), Custom String(
" 2.4. CLICK (X) BUTTON TO COPY VALUES OF VARS TO CLIPBOARD AND PASTE IT IN ANY TEXT EDITOR"), False, -90);
" 2.3. PASTE COPIED VALUES IN FIRST FORM"), False, -92);
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);
" 2.3. PRESS BUTTON 'COMPUTE DISTANCE MATRIX'"), False, -91);
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);
" 2.4. PRESS BUTTON 'COPY TO CLIPBOARD'"), False, -90);
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 AND BOT: NAVIGATION DEBUG INFO")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Has Spawned(Event Player) == True;
}
actions
{
Create HUD Text(Event Player, Custom String("CLOSSEST NODE: {0}\r\nCLOSSEST 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("CURRENT NODE {1}", Null, Event Player.BotCurrentNodeId)), Null,
Null, Right, -1, Color(White), Color(White), Color(White), Visible To and String, Default Visibility);
}
}
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(PathFindingResetBot);
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("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);
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);
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 NODE {1}\r\n{2}", Input Binding String(Button(Primary Fire)),
Global.PathFindingStartNodeId, Custom String("{0} - SET END 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);
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"
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,
"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,
Global.BuilderHudColorBuildMode, Global.BuilderHudColorBuildMode, Visible To and Values, Default Visibility);
Global.BuilderProgressBarValue = 0;
Chase Global Variable Over Time(BuilderProgressBarValue, 100, 2, Destination and Duration);
disabled Global.BuilderProgressBarValue = 0;
disabled Chase Global Variable Over Time(BuilderProgressBarValue, 100, 2, Destination and Duration);
"HOLD BUTTON N SEC TO BEGIN PROCESS"
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;
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;
"RUN BUILD PROJECT"
Destroy All Progress Bar HUD Text;
Call Subroutine(BuilderBuildProject);
disabled Destroy All Progress Bar HUD Text;
disabled 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.050, Ignore Condition);
Wait(0.100, 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.030, Ignore Condition);
Wait(0.100, 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.030, Ignore Condition);
Wait(0.060, 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.030, Ignore Condition);
Wait(0.060, Ignore Condition);
}
}
rule("SUBROUTINE: COMPUTE DISTANCE MATRIX")
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;
}
}
disabled 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"
"INIT DISTANCE MATRIX SIZE"
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.016, Ignore Condition);
Wait(0.100, Ignore Condition);
End;
"REPLACE ZERO TO INF (9999)"
Global.BuilderInnerArray[Global.BuildProjectStartNodeId] = 9999;
"WRITE ONLY RESULT INTO INSPECTOR"
Enable Inspector Recording;
"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;
disabled (Is Button Held(Event Player, Button(Primary Fire)) || Is Button Held(Event Player, Button(Secondary Fire)) || Is Button Held(
Event Player, Button(Ultimate))) == 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)));
"ANY NODE IN LINE OF SIGHT"
Call Subroutine(BuilderGetClossestNodeIdToCursor);
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.400, Z Component Of(
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
{
Abort If(Global.BuilderTrySelectNodeInLOS == -1);
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 = Global.BuilderTrySelectNodeInLOS;
Global.PathFindingStartNodeEffectPos = Global.NodePositions[Global.BuilderTrySelectNodeInLOS];
If(Global.PathFindingStartNodeId == Global.PathFindingTargetNodeId);
Global.PathFindingTargetNodeId = -1;
Global.PathFindingTargetNodeEffectPos = Vector(0, -999, 0);
End;
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 = Global.BuilderTrySelectNodeInLOS;
Global.PathFindingTargetNodeEffectPos = Global.NodePositions[Global.BuilderTrySelectNodeInLOS];
If(Global.PathFindingTargetNodeId == Global.PathFindingStartNodeId);
Global.PathFindingStartNodeId = -1;
Global.PathFindingStartNodeEffectPos = Vector(0, -999, 0);
End;
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);
Call Subroutine(PathFindingGetShortestPath);
Call Subroutine(DeleteNodeBeams);
Call Subroutine(CreateNodeBeams);
disabled Call Subroutine(DeleteNodeBeams);
Call Subroutine(PathFindingDrawShortestPath);
disabled 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"));
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;
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;
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;
}
}
rule("SUBROUTINE: PATH FINDING GET SHORTEST PATH")
disabled rule("SUBROUTINE: PATH FINDING DRAW SHORTEST PATH")
{
event
{
Subroutine;
PathFindingGetShortestPath;
PathFindingDrawShortestPath;
}
actions
{
Global.PathFindingResultPath = Empty Array;
Global.BuildProjectVisitedNodes = Empty Array;
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.PathFindingCurrentNodeId = Global.PathFindingStartNodeId;
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;
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;
"ANTI-CRASH DELAY"
Wait(0.016, Ignore Condition);
Wait(0.020, 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.NodePositions[Global.PathFindingStartNodeId], Vector(0, 0, 0));
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.NodePositions[Global.PathFindingStartNodeId]);
Teleport(Global.PathFindingBotId, Global.PathFindingStartPosition);
End;
Call Subroutine(PathFindingResetBot);
Call Subroutine(PathFindingTestBotReset);
"ANTI-BUG DELAY"
Wait(0.016, Ignore Condition);
Global.PathFindingBotId.BotTargetPosition = Global.NodePositions[Global.PathFindingTargetNodeId];
Wait(0.100, Ignore Condition);
Global.PathFindingBotId.BotTargetPosition = Global.PathFindingTargetPosition;
disabled Global.PathFindingBotId.BotTargetPlayer = Event Player;
}
}
disabled rule("=== TEST BOT ===")
{
event
{
Ongoing - Global;
}
}
rule("SUBROUTINE: RESET TEST BOT")
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 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(
"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;
PathFindingResetBot;
PathFindingTestBotReset;
}
actions
{
Stop Throttle In Direction(Global.PathFindingBotId);
Stop Facing(Global.PathFindingBotId);
Global.PathFindingBotId.BotPrevNodeId = -1;
Global.PathFindingBotId.BotTargetPlayer = -1;
Global.PathFindingBotId.BotTargetPosition = -1;
Global.PathFindingBotId.BotTargetNodeId = -1;
Global.PathFindingBotId.BotIsPathFinding = False;
Global.PathFindingBotId.BotCancelPathFinding = False;
Stop Facing(Global.PathFindingBotId);
Stop Throttle In Direction(Global.PathFindingBotId);
}
}