workshopModes/defendTheCastleExtended/latest.ostw

5843 lines
259 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import "customGameSettings.lobby";
globalvar define gatePosition;
globalvar define zenSpawnPositions;
globalvar define spawnPositionMaxId;
globalvar define loopIterator;
globalvar define bigBossSpawnPositions;
globalvar define playerSpawnPositions;
globalvar define gateHealthChase;
globalvar define gateHealth;
globalvar define gateMaxHealth;
globalvar define gateProgressBarColorCurrent;
globalvar define gateProgressBarColorComponent;
globalvar define gateHealthEvent;
globalvar define bastionTargetPositions;
globalvar define sniperPositions;
globalvar define ballSpawnPositions;
globalvar define zenRespawnTime;
globalvar define timeSeconds;
globalvar define timeMinutes;
globalvar define defaultCurrentBot;
globalvar define defaultHeroBotsPool;
globalvar define isDebug;
globalvar define botOrisaParent;
globalvar define botOrisaChild;
globalvar define gateRepairPosition;
globalvar define botOrisaTargetPosition;
globalvar define botEchoRespawnPosition;
globalvar define botEchoTeleportPositions;
globalvar define upgradeGateMaxHealthValue;
globalvar define upgradeGateMaxHealthHudId;
globalvar define upgradePlayerMaxHealthValue;
globalvar define upgradePlayerMaxHealthHudId;
globalvar define upgradeCriticalDamageValue;
globalvar define upgradeCriticalDamageHudId;
globalvar define upgradeMaxAmmoValue;
globalvar define upgradeMaxAmmoHudId;
globalvar define upgradeMaxAmmoMaxValue;
globalvar define upgradePlayerMaxHealthMaxValue;
globalvar define upgradeCriticalDamageMaxValue;
globalvar define upgradeGateMaxHealthMaxValue;
globalvar define isDebugAINavigation;
globalvar define gameLogicCountOfUniqueHeroes;
globalvar define isNewWaveGameLogicProcessing;
globalvar define automaticRepair;
globalvar define upgradePerkSharpshooterValue;
globalvar define perk;
globalvar define maxHealthDone;
globalvar define startMoney;
globalvar define time5Minutes;
globalvar define selfNanoWorkshopSetting;
globalvar define shopCamPosition;
globalvar define shopBasePosition;
globalvar define shopPositionAngle;
globalvar define activeBoss;
globalvar define bossRotation;
globalvar define lastBoss;
globalvar define time10Minutes;
globalvar define moneyMultiplier;
globalvar define challengeCount;
globalvar define upgradeBossHealthValue;
globalvar define globalHUDs;
globalvar define extendedGlobalCollection;
globalvar define arrayBuilder;
globalvar define exitButtonProperties;
globalvar define allPositions;
globalvar define allDirections;
globalvar define firstPosition;
globalvar define secondPosition;
globalvar define firstPoint;
globalvar define secondPoint;
globalvar define second;
globalvar define z;
globalvar define wallId;
globalvar define showWalls;
globalvar define isGrounded;
globalvar define beamType;
globalvar define nodePositions;
globalvar define nodeConnections;
globalvar define distanceMatrix;
playervar define botSeePlayer;
playervar define botDoesUniqueBehaviour;
playervar define botEffects;
playervar define botRayCastHitPosition;
playervar define botEventPosition;
playervar define currentHero;
playervar define isDead;
playervar define isRespawning;
playervar define botBastionArtilleryDidShotsCount;
playervar define botCounter;
playervar define hasBadStatus;
playervar define eventHealth;
playervar define healOverTimeId;
playervar define botIsOrisaChild;
playervar define botEchoCapturedPlayer;
playervar define botPlayersInRadius;
playervar define botLoopIterator2;
playervar define botWidowShotTime;
playervar define botWidowTeleportTime;
playervar define isNanoed;
playervar define abilityHUD;
playervar define lucioDashActive;
playervar define lucioDashIcon;
playervar define anaEntityID;
playervar define abilities;
playervar define money;
playervar define heroTalentText;
playervar define damageBoost;
playervar define playerHealth;
playervar define abilityCountdown;
playervar define hpPool;
playervar define effects;
playervar define abilityProjectile;
playervar define abilityEnd;
playervar define abilityAvailable;
playervar define speedBoost;
playervar define damageMod;
playervar define soldierEspionage;
playervar define healBoost;
playervar define baseStats;
playervar define chainReactionOn;
playervar define chainReactionImmune;
playervar define abilityActive;
playervar define p_loopIterator;
playervar define secondWindActive;
playervar define isInMenu;
playervar define playerFacing;
playervar define isBoss;
playervar define deathPosition;
playervar define lastSecondWind;
playervar define vote;
playervar define workshopButtons;
playervar define extendedPlayerCollection;
playervar define getProperties;
playervar define buttonModification;
playervar define currActionID;
playervar define destroyButtonID;
playervar define lastMenuButtonID;
playervar define buttons;
playervar define newButton;
playervar define menuOriginalFacing;
playervar define menuFrame;
playervar define filterPosition;
playervar define lastSavedPosition;
playervar define closestBodyPosition;
playervar define fullBodyPosition;
playervar define previousPositionIntersection;
playervar define activeWall;
playervar define closestWall;
playervar define x;
playervar define intersectionLength;
playervar define thickness;
playervar define botCancelPathFinding;
playervar define botLoopIterator1;
playervar define botTempArray;
playervar define botTargetPlayer;
playervar define botTargetPosition;
playervar define botClosestNodeIdToTarget;
playervar define botClosestNodeIdToBot;
playervar define botPreviousNodeId;
playervar define botNextNodeId;
playervar define botNextNodePosition;
playervar define botCurrentDistanceToTarget;
playervar define botShortestDistanceToTarget;
playervar define botIsPathFinding;
disabled rule: "=== PATH BUILDER MODE IMPORT ==="
{
}
rule: "MAP: HAVANA"
if (CurrentMap() == Map.Havana)
{
nodePositions = [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.92), Vector(124.572, 10.434, -34.3), 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.03, 7.418, -74.087), Vector(83.72, 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.45, -46.143), Vector(90.086, 7.411, -44.653), Vector(78.752, 7.418, -62.14), Vector(82.124, 7.428, -44.229), Vector(90.675, 7.231, -51.234), Vector(85.717, 4.692, -63.446), Vector(90.83, 4.33, -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.14), Vector(126.979, 12.393, -55.079), Vector(153.72, 18.578, -21.745), Vector(155.301, 18.619, -17.595), Vector(133.043, 10.425, -26.625), Vector(114.646, 7.278, -57.336), Vector(95.16, 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)];
nodeConnections = [[1, 6, 4, 7], [2, 1, 4, 6, 7, 0, 49], [1, 3], [2, 4, 42], [3, 1, 5, 7, 6, 1, 0], [4, 7, 20, 21, 19, 16, 42], [7, 1, 4, 1, 9, 12, 0, 46], [4, 5, 6, 1, 1, 12, 0], [7, 41], [6, 11], [11, 13], [9, 10, 13], [6, 7, 10], [10, 16, 36], [18, 23, 30], [17, 24], [13, 19, 22, 21, 25, 5], [15, 22, 25, 23], [14], [16, 21, 22, 26, 27, 35, 25, 5], [5, 13, 10], [19, 16, 5, 13, 22, 34], [16, 19, 21, 24, 25], [14, 25, 26, 37], [22, 15, 37], [23, 22, 19, 16, 26, 27, 35, 37], [25, 19, 27, 35, 29], [19, 26, 25, 29, 35, 43], [35, 34, 43], [27, 26, 30, 43, 44], [29, 14, 31], [30, 29, 45], [33, 38, 1, 48], [32, 38, 42], [35, 36, 28], [28, 19, 25, 27, 26, 34], [13, 34], [25, 23, 24], [5, 4, 1, 6, 1, 32, 33, 0], [40], [39], [6, 8, 47, 46], [3, 5, 34], [28, 27, 29, 44], [29, 43, 45], [44, 31], [6, 47], [46, 41], [49, 32], [1, 0, 6, 48]];
distanceMatrix = [[0, 1, 2, 2, 1, 2, 1, 1, 5, 2, 3, 3, 2, 4, 6, 6, 3, 7, 7, 3, 3, 3, 4, 5, 5, 4, 4, 4, 5, 5, 6, 7, 4, 5, 4, 4, 5, 5, 5, 0, 0, 4, 3, 5, 6, 7, 2, 3, 3, 2], [1, 0, 1, 2, 1, 2, 1, 1, 5, 2, 3, 3, 2, 4, 6, 6, 3, 7, 7, 3, 3, 3, 4, 5, 5, 4, 4, 4, 5, 5, 6, 7, 3, 4, 4, 4, 5, 5, 4, 0, 0, 4, 3, 5, 6, 7, 2, 3, 2, 1], [2, 1, 0, 1, 2, 3, 2, 2, 6, 3, 4, 4, 3, 5, 7, 7, 4, 8, 8, 4, 4, 4, 5, 6, 6, 5, 5, 5, 4, 6, 7, 8, 4, 5, 3, 4, 4, 6, 5, 0, 0, 5, 2, 5, 6, 7, 3, 4, 3, 2], [2, 2, 1, 0, 1, 2, 2, 2, 6, 3, 4, 4, 3, 4, 6, 6, 3, 7, 7, 3, 3, 3, 4, 5, 5, 4, 4, 4, 3, 5, 6, 7, 5, 6, 2, 3, 3, 5, 6, 0, 0, 5, 1, 4, 5, 6, 3, 4, 4, 3], [1, 1, 2, 1, 0, 1, 1, 1, 5, 2, 3, 3, 2, 3, 5, 5, 2, 6, 6, 2, 2, 2, 3, 4, 4, 3, 3, 3, 4, 4, 5, 6, 4, 5, 3, 3, 4, 4, 5, 0, 0, 4, 2, 4, 5, 6, 2, 3, 3, 2], [2, 2, 3, 2, 1, 0, 2, 1, 6, 3, 2, 3, 2, 2, 4, 4, 1, 5, 5, 1, 1, 1, 2, 3, 3, 2, 2, 2, 3, 3, 4, 5, 5, 6, 2, 2, 3, 3, 6, 0, 0, 5, 1, 3, 4, 5, 3, 4, 4, 3], [1, 1, 2, 2, 1, 2, 0, 1, 4, 1, 2, 2, 1, 3, 6, 6, 3, 7, 7, 3, 3, 3, 4, 5, 5, 4, 4, 4, 5, 5, 6, 7, 4, 5, 4, 4, 4, 5, 5, 0, 0, 3, 3, 5, 6, 7, 1, 2, 3, 2], [1, 1, 2, 2, 1, 1, 1, 0, 5, 2, 2, 3, 1, 3, 5, 5, 2, 6, 6, 2, 2, 2, 3, 4, 4, 3, 3, 3, 4, 4, 5, 6, 4, 5, 3, 3, 4, 4, 5, 0, 0, 4, 2, 4, 5, 6, 2, 3, 3, 2], [2, 2, 3, 3, 2, 2, 2, 1, 0, 3, 3, 4, 2, 4, 6, 6, 3, 7, 7, 3, 3, 3, 4, 5, 5, 4, 4, 4, 5, 5, 6, 7, 5, 6, 4, 4, 5, 5, 6, 0, 0, 1, 3, 5, 6, 7, 2, 2, 4, 3], [2, 2, 3, 3, 2, 3, 1, 2, 5, 0, 2, 1, 2, 2, 6, 6, 3, 7, 7, 4, 4, 4, 4, 5, 5, 4, 5, 5, 5, 6, 7, 8, 5, 6, 4, 5, 3, 5, 6, 0, 0, 4, 4, 6, 7, 8, 2, 3, 4, 3], [4, 4, 5, 5, 4, 3, 3, 4, 7, 2, 0, 1, 4, 1, 5, 5, 2, 6, 6, 3, 4, 3, 3, 4, 4, 3, 4, 4, 4, 5, 6, 7, 7, 8, 3, 4, 2, 4, 8, 0, 0, 6, 4, 5, 6, 7, 4, 5, 6, 5], [3, 3, 4, 4, 3, 3, 2, 3, 6, 1, 1, 0, 3, 1, 5, 5, 2, 6, 6, 3, 4, 3, 3, 4, 4, 3, 4, 4, 4, 5, 6, 7, 6, 7, 3, 4, 2, 4, 7, 0, 0, 5, 4, 5, 6, 7, 3, 4, 5, 4], [2, 2, 3, 3, 2, 2, 1, 1, 5, 2, 1, 2, 0, 2, 6, 6, 3, 7, 7, 3, 3, 3, 4, 5, 5, 4, 4, 4, 5, 5, 6, 7, 5, 6, 4, 4, 3, 5, 6, 0, 0, 4, 3, 5, 6, 7, 2, 3, 4, 3], [4, 4, 5, 4, 3, 2, 4, 3, 8, 3, 1, 2, 4, 0, 4, 4, 1, 5, 5, 2, 3, 2, 2, 3, 3, 2, 3, 3, 3, 4, 5, 6, 7, 8, 2, 3, 1, 3, 8, 0, 0, 7, 3, 4, 5, 6, 5, 6, 6, 5], [6, 6, 7, 6, 5, 4, 6, 5, 10, 7, 5, 6, 6, 4, 0, 4, 3, 5, 1, 3, 5, 4, 3, 1, 3, 2, 2, 3, 4, 2, 1, 2, 9, 10, 4, 3, 5, 2, 10, 0, 0, 9, 5, 3, 3, 3, 7, 8, 8, 7], [6, 6, 7, 6, 5, 4, 6, 5, 10, 7, 5, 6, 6, 4, 3, 0, 3, 1, 4, 3, 5, 3, 2, 2, 1, 2, 3, 3, 4, 4, 4, 5, 9, 10, 4, 3, 5, 2, 10, 0, 0, 9, 5, 4, 5, 6, 7, 8, 8, 7], [3, 3, 4, 3, 2, 1, 3, 2, 7, 4, 2, 3, 3, 1, 3, 3, 0, 4, 4, 1, 2, 1, 1, 2, 2, 1, 2, 2, 3, 3, 4, 5, 6, 7, 2, 2, 2, 2, 7, 0, 0, 6, 2, 3, 4, 5, 4, 5, 5, 4], [5, 5, 6, 5, 4, 3, 5, 4, 9, 6, 4, 5, 5, 3, 2, 1, 2, 0, 3, 2, 4, 2, 1, 1, 2, 1, 2, 2, 3, 3, 3, 4, 8, 9, 3, 2, 4, 2, 9, 0, 0, 8, 4, 3, 4, 5, 6, 7, 7, 6], [7, 7, 8, 7, 6, 5, 7, 6, 11, 8, 6, 7, 7, 5, 1, 5, 4, 6, 0, 4, 6, 5, 4, 2, 4, 3, 3, 4, 5, 3, 2, 3, 10, 11, 5, 4, 6, 3, 11, 0, 0, 10, 6, 4, 4, 4, 8, 9, 9, 8], [3, 3, 4, 3, 2, 1, 3, 2, 7, 4, 3, 4, 3, 2, 3, 3, 1, 4, 4, 0, 2, 1, 1, 2, 2, 1, 1, 1, 2, 2, 3, 4, 6, 7, 2, 1, 3, 2, 7, 0, 0, 6, 2, 2, 3, 4, 4, 5, 5, 4], [3, 3, 4, 3, 2, 1, 3, 2, 7, 3, 1, 2, 3, 1, 5, 5, 2, 6, 6, 2, 0, 2, 3, 4, 4, 3, 3, 3, 4, 4, 5, 6, 6, 7, 3, 3, 2, 4, 7, 0, 0, 6, 2, 4, 5, 6, 4, 5, 5, 4], [3, 3, 4, 3, 2, 1, 3, 2, 7, 4, 2, 3, 3, 1, 4, 3, 1, 4, 5, 1, 2, 0, 1, 3, 2, 2, 2, 2, 2, 3, 4, 5, 6, 7, 1, 2, 2, 3, 7, 0, 0, 6, 2, 3, 4, 5, 4, 5, 5, 4], [4, 4, 5, 4, 3, 2, 4, 3, 8, 5, 3, 4, 4, 2, 3, 2, 1, 3, 4, 1, 3, 1, 0, 2, 1, 1, 2, 2, 3, 3, 4, 5, 7, 8, 2, 2, 3, 2, 8, 0, 0, 7, 3, 3, 4, 5, 5, 6, 6, 5], [5, 5, 6, 5, 4, 3, 5, 4, 9, 6, 4, 5, 5, 3, 1, 3, 2, 4, 2, 2, 4, 3, 2, 0, 2, 1, 1, 2, 3, 2, 2, 3, 8, 9, 3, 2, 4, 1, 9, 0, 0, 8, 4, 3, 3, 4, 6, 7, 7, 6], [5, 5, 6, 5, 4, 3, 5, 4, 9, 6, 4, 5, 5, 3, 3, 1, 2, 2, 4, 2, 4, 2, 1, 2, 0, 2, 3, 3, 4, 4, 4, 5, 8, 9, 3, 3, 4, 1, 9, 0, 0, 8, 4, 4, 5, 6, 6, 7, 7, 6], [4, 4, 5, 4, 3, 2, 4, 3, 8, 5, 3, 4, 4, 2, 2, 3, 1, 4, 3, 1, 3, 2, 1, 1, 2, 0, 1, 1, 2, 2, 3, 4, 7, 8, 2, 1, 3, 1, 8, 0, 0, 7, 3, 2, 3, 4, 5, 6, 6, 5], [4, 4, 5, 4, 3, 2, 4, 3, 8, 5, 4, 5, 4, 3, 3, 4, 2, 5, 4, 1, 3, 2, 2, 2, 3, 1, 0, 1, 2, 1, 2, 3, 7, 8, 2, 1, 3, 2, 8, 0, 0, 7, 3, 2, 2, 3, 5, 6, 6, 5], [4, 4, 5, 4, 3, 2, 4, 3, 8, 5, 4, 5, 4, 3, 3, 4, 2, 5, 4, 1, 3, 2, 2, 2, 3, 1, 1, 0, 2, 1, 2, 3, 7, 8, 2, 1, 3, 2, 8, 0, 0, 7, 3, 1, 2, 3, 5, 6, 6, 5], [5, 5, 6, 5, 4, 3, 5, 4, 9, 6, 4, 5, 5, 3, 4, 5, 3, 6, 5, 2, 4, 3, 3, 3, 4, 2, 2, 2, 0, 2, 3, 4, 8, 9, 1, 1, 2, 3, 9, 0, 0, 8, 4, 1, 2, 3, 6, 7, 7, 6], [5, 5, 6, 5, 4, 3, 5, 4, 9, 6, 5, 6, 5, 4, 2, 5, 3, 6, 3, 2, 4, 3, 3, 3, 4, 2, 1, 1, 2, 0, 1, 2, 8, 9, 3, 2, 4, 3, 9, 0, 0, 8, 4, 1, 1, 2, 6, 7, 7, 6], [6, 6, 7, 6, 5, 4, 6, 5, 10, 7, 6, 7, 6, 5, 1, 5, 4, 6, 2, 3, 5, 4, 4, 2, 4, 3, 2, 2, 3, 1, 0, 1, 9, 10, 4, 3, 5, 3, 10, 0, 0, 9, 5, 2, 2, 2, 7, 8, 8, 7], [6, 6, 7, 6, 5, 4, 6, 5, 10, 7, 6, 7, 6, 5, 2, 6, 4, 7, 3, 3, 5, 4, 4, 3, 5, 3, 2, 2, 3, 1, 1, 0, 9, 10, 4, 3, 5, 4, 10, 0, 0, 9, 5, 2, 2, 1, 7, 8, 8, 7], [2, 1, 2, 3, 2, 2, 2, 2, 6, 3, 4, 4, 3, 4, 6, 6, 3, 7, 7, 3, 3, 3, 4, 5, 5, 4, 4, 4, 4, 5, 6, 7, 0, 1, 3, 4, 4, 5, 1, 0, 0, 5, 2, 5, 6, 7, 3, 4, 1, 2], [2, 2, 3, 2, 2, 2, 2, 3, 6, 3, 4, 4, 3, 4, 6, 6, 3, 7, 7, 3, 3, 3, 4, 5, 5, 4, 4, 4, 3, 5, 6, 7, 1, 0, 2, 3, 3, 5, 1, 0, 0, 5, 1, 4, 5, 6, 3, 4, 2, 3], [5, 5, 6, 5, 4, 3, 5, 4, 9, 5, 3, 4, 5, 2, 4, 5, 3, 6, 5, 2, 4, 3, 3, 3, 4, 2, 2, 2, 1, 3, 4, 5, 8, 9, 0, 1, 1, 3, 9, 0, 0, 8, 4, 2, 3, 4, 6, 7, 7, 6], [4, 4, 5, 4, 3, 2, 4, 3, 8, 5, 4, 5, 4, 3, 3, 4, 2, 5, 4, 1, 3, 2, 2, 2, 3, 1, 1, 1, 1, 2, 3, 4, 7, 8, 1, 0, 2, 2, 8, 0, 0, 7, 3, 2, 3, 4, 5, 6, 6, 5], [5, 5, 6, 5, 4, 3, 5, 4, 9, 4, 2, 3, 5, 1, 5, 5, 2, 6, 6, 3, 4, 3, 3, 4, 4, 3, 3, 3, 2, 4, 5, 6, 8, 9, 1, 2, 0, 4, 9, 0, 0, 8, 4, 3, 4, 5, 6, 7, 7, 6], [5, 5, 6, 5, 4, 3, 5, 4, 9, 6, 4, 5, 5, 3, 2, 2, 2, 3, 3, 2, 4, 3, 2, 1, 1, 1, 2, 2, 3, 3, 3, 4, 8, 9, 3, 2, 4, 0, 9, 0, 0, 8, 4, 3, 4, 5, 6, 7, 7, 6], [1, 1, 2, 2, 1, 1, 1, 2, 5, 2, 3, 3, 2, 3, 5, 5, 2, 6, 6, 2, 2, 2, 3, 4, 4, 3, 3, 3, 4, 4, 5, 6, 1, 1, 3, 3, 4, 4, 0, 0, 0, 4, 2, 4, 5, 6, 2, 3, 2, 2], [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, 1], [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, 1], [2, 2, 3, 3, 2, 3, 1, 2, 1, 2, 3, 3, 2, 4, 7, 7, 4, 8, 8, 4, 4, 4, 5, 6, 6, 5, 5, 5, 6, 6, 7, 8, 5, 6, 5, 5, 5, 6, 6, 0, 0, 0, 4, 6, 7, 8, 1, 1, 4, 3], [3, 3, 2, 1, 2, 1, 3, 2, 7, 4, 3, 4, 3, 3, 5, 5, 2, 6, 6, 2, 2, 2, 3, 4, 4, 3, 3, 3, 2, 4, 5, 6, 6, 7, 1, 2, 2, 4, 7, 0, 0, 6, 0, 3, 4, 5, 4, 5, 5, 4], [5, 5, 6, 5, 4, 3, 5, 4, 9, 6, 5, 6, 5, 4, 3, 5, 3, 6, 4, 2, 4, 3, 3, 3, 4, 2, 2, 1, 1, 1, 2, 3, 8, 9, 2, 2, 3, 3, 9, 0, 0, 8, 4, 0, 1, 2, 6, 7, 7, 6], [6, 6, 7, 6, 5, 4, 6, 5, 10, 7, 6, 7, 6, 5, 3, 6, 4, 7, 4, 3, 5, 4, 4, 4, 5, 3, 2, 2, 2, 1, 2, 2, 9, 10, 3, 3, 4, 4, 10, 0, 0, 9, 5, 1, 0, 1, 7, 8, 8, 7], [7, 7, 8, 7, 6, 5, 7, 6, 11, 8, 7, 8, 7, 6, 3, 7, 5, 8, 4, 4, 6, 5, 5, 4, 6, 4, 3, 3, 3, 2, 2, 1, 10, 11, 4, 4, 5, 5, 11, 0, 0, 10, 6, 2, 1, 0, 8, 9, 9, 8], [2, 2, 3, 3, 2, 3, 1, 2, 3, 2, 3, 3, 2, 4, 7, 7, 4, 8, 8, 4, 4, 4, 5, 6, 6, 5, 5, 5, 6, 6, 7, 8, 5, 6, 5, 5, 5, 6, 6, 0, 0, 2, 4, 6, 7, 8, 0, 1, 4, 3], [3, 3, 4, 4, 3, 4, 2, 3, 2, 3, 4, 4, 3, 5, 8, 8, 5, 9, 9, 5, 5, 5, 6, 7, 7, 6, 6, 6, 7, 7, 8, 9, 6, 7, 6, 6, 6, 7, 7, 0, 0, 1, 5, 7, 8, 9, 1, 0, 5, 4], [2, 2, 3, 4, 3, 3, 2, 3, 6, 3, 4, 4, 3, 5, 7, 7, 4, 8, 8, 4, 4, 4, 5, 6, 6, 5, 5, 5, 5, 6, 7, 8, 1, 2, 4, 5, 5, 6, 2, 0, 0, 5, 3, 6, 7, 8, 3, 4, 0, 1], [1, 1, 2, 3, 2, 3, 1, 2, 5, 2, 3, 3, 2, 4, 7, 7, 4, 8, 8, 4, 4, 4, 5, 6, 6, 5, 5, 5, 6, 6, 7, 8, 2, 3, 5, 5, 5, 6, 3, 0, 0, 4, 4, 6, 7, 8, 2, 3, 1]];
}
void BotResetPathFinding() "SUBROUTINE: BOT - RESET PATH FINDING"
{
botTargetPlayer = -1;
botTargetPosition = -1;
botPreviousNodeId = -1;
botClosestNodeIdToTarget = -1;
botNextNodeId = -1;
botNextNodePosition = -1;
botIsPathFinding = false;
botCancelPathFinding = false;
StopThrottleInDirection(EventPlayer());
}
void BotStartPathFinding() "SUBROUTINE: BOT - START PATH FINDING"
{
BotGetNextNodeIdAndPosition();
StartThrottleInDirection(EventPlayer(), DirectionTowards(PositionOf(EventPlayer()), botNextNodePosition), 1, Relative.ToWorld, ThrottleBehavior.ReplaceExistingThrottle, ThrottleRev.DirectionAndMagnitude);
botIsPathFinding = true;
}
void BotGetNextNodeIdAndPosition() "SUBROUTINE: BOT - GET NEXT NODE ID AND POSITION"
{
# BOT JUST START FOLLOW PATH OR LOST NEXT NODE
if (botPreviousNodeId == -1)
{
botClosestNodeIdToBot = IndexOfArrayValue(nodePositions, SortedArray(FilteredArray(nodePositions, IsInLineOfSight(PositionOf(EventPlayer()) + Vector(0, 2, 0), ArrayElement(), BarrierLOS.NoBarriersBlock) == true), DistanceBetween(PositionOf(EventPlayer()), ArrayElement()))[0]);
BotGetClosestNodeIdToTarget();
}
# NEXT NODE IS TARGET (DISTANCE TO TARGET NODE = 1)
if (distanceMatrix[botClosestNodeIdToBot][botClosestNodeIdToTarget] == 1)
{
botNextNodeId = botClosestNodeIdToTarget;
}
else
{
botShortestDistanceToTarget = 999;
botCurrentDistanceToTarget = botShortestDistanceToTarget;
botTempArray = nodeConnections[botClosestNodeIdToBot];
for (botLoopIterator1 = 0; CountOf(botTempArray); 1)
{
botCurrentDistanceToTarget = distanceMatrix[botTempArray[botLoopIterator1]][botClosestNodeIdToTarget];
if (botCurrentDistanceToTarget < botShortestDistanceToTarget)
{
botShortestDistanceToTarget = botCurrentDistanceToTarget;
botNextNodeId = botTempArray[botLoopIterator1];
}
}
}
# NEXT NODE IS HIGHER THAN BOT AND BOT DIDN'T REACH CLOSEST NODE
if (YOf(PositionOf(EventPlayer())) - YOf(nodePositions[botNextNodeId]) < -3 && botPreviousNodeId != botClosestNodeIdToBot)
{
botPreviousNodeId = botClosestNodeIdToBot;
botNextNodeId = botClosestNodeIdToBot;
}
else if (distanceMatrix[botClosestNodeIdToBot][botClosestNodeIdToTarget] == 1 && IsInLineOfSight(PositionOf(EventPlayer()) + Vector(0, 1.6, 0), botTargetPosition + Vector(0, 2, 0), BarrierLOS.NoBarriersBlock))
{
botNextNodePosition = botTargetPosition;
Abort();
}
else if (IsInLineOfSight(PositionOf(EventPlayer()) + Vector(0, 1.6, 0), nodePositions[botNextNodeId] + Vector(0, 2, 0), BarrierLOS.NoBarriersBlock) == false && botPreviousNodeId != botClosestNodeIdToBot)
{
botPreviousNodeId = botClosestNodeIdToBot;
botNextNodeId = botClosestNodeIdToBot;
}
botNextNodePosition = nodePositions[botNextNodeId];
}
void BotGetClosestNodeIdToTarget() "SUBROUTINE: BOT - GET CLOSEST NODE ID AND POSITION TO TARGET"
{
botTargetPosition = botTargetPlayer != -1 ? PositionOf(botTargetPlayer) : botTargetPosition;
botClosestNodeIdToTarget = IndexOfArrayValue(nodePositions, SortedArray(FilteredArray(nodePositions, IsInLineOfSight(botTargetPosition + Vector(0, 2, 0), ArrayElement(), BarrierLOS.NoBarriersBlock) == true), DistanceBetween(botTargetPosition, ArrayElement()))[0]);
}
rule: "BOT: PATH FINDING - START"
Event.OngoingPlayer
Team.Team2
if (IsDummyBot(EventPlayer()) == true)
if (HasSpawned(EventPlayer()) == true)
if ((botTargetPosition != -1 || botTargetPlayer != -1) == true)
{
async BotStartPathFinding();
}
rule: "BOT: PATH FINDING - CANCEL"
Event.OngoingPlayer
Team.Team2
if (IsDummyBot(EventPlayer()) == true)
if (HasSpawned(EventPlayer()) == true)
if (botIsPathFinding == true)
if (botCancelPathFinding == true)
{
async BotResetPathFinding();
}
rule: "BOT: PATH FINDING - LOST THE NODE"
Event.OngoingPlayer
Team.Team2
if (IsDummyBot(EventPlayer()) == true)
if (HasSpawned(EventPlayer()) == true)
if (botIsPathFinding == true)
if ((IsInLineOfSight(PositionOf(EventPlayer()) + Vector(0, 1.6, 0), botNextNodePosition + Vector(0, 2.5, 0), BarrierLOS.NoBarriersBlock) == false && SpeedOfInDirection(EventPlayer(), ThrottleOf(EventPlayer())) < 2) == true)
{
Wait(0.5, WaitBehavior.AbortWhenFalse);
# RESET PREV NODE ID TO INFORM BOT THAT IT LOST NEXT NODE
botPreviousNodeId = -1;
# TRY FIND NEW NEXT NODE
BotGetNextNodeIdAndPosition();
StartFacing(EventPlayer(), DirectionTowards(PositionOf(EventPlayer()), botNextNodeId), 360, Relative.ToWorld, FacingRev.DirectionAndTurnRate);
StartThrottleInDirection(EventPlayer(), DirectionTowards(PositionOf(EventPlayer()), botNextNodePosition), 1, Relative.ToWorld, ThrottleBehavior.ReplaceExistingThrottle, ThrottleRev.DirectionAndMagnitude);
}
rule: "BOT: PATH FINDING - REACHED THE NODE"
Event.OngoingPlayer
Team.Team2
if (IsDummyBot(EventPlayer()) == true)
if (HasSpawned(EventPlayer()) == true)
if (botIsPathFinding == true)
if (botClosestNodeIdToTarget >= 0)
if (DistanceBetween(Vector(XOf(PositionOf(EventPlayer())), 0, ZOf(PositionOf(EventPlayer()))), Vector(XOf(botNextNodePosition), 0, ZOf(botNextNodePosition))) < 0.85 == true)
{
botPreviousNodeId = botNextNodeId;
botClosestNodeIdToBot = botNextNodeId;
# BOT'S TARGET IS PLAYER
if (botTargetPlayer != -1)
{
BotGetClosestNodeIdToTarget();
}
botCurrentDistanceToTarget = DistanceBetween(Vector(XOf(PositionOf(EventPlayer())), 0, ZOf(PositionOf(EventPlayer()))), Vector(XOf(botTargetPosition), 0, ZOf(botTargetPosition)));
# BOT REACHED THE TARGET NODE OR TARGET POSITION
if (botNextNodeId == botClosestNodeIdToTarget || botCurrentDistanceToTarget <= 0.85)
{
# BOT DIDN'T REACH TARGET POSITION
if (botCurrentDistanceToTarget > 0.85)
{
botNextNodePosition = botTargetPosition;
Skip(6);
}
else
{
BotResetPathFinding();
Abort();
}
}
# CONTINUE FOLLOW PATH
BotGetNextNodeIdAndPosition();
StartThrottleInDirection(EventPlayer(), DirectionTowards(PositionOf(EventPlayer()), botNextNodePosition), 1, Relative.ToWorld, ThrottleBehavior.ReplaceExistingThrottle, ThrottleRev.DirectionAndMagnitude);
}
disabled rule: "=== PATH BUILDER MODE IMPORT ==="
{
}
rule: "GLOBAL: GAME MODE INIT - WORKSHOP SETTINGS"
{
isDebug = false;
isDebugAINavigation = false;
gateMaxHealth[0] = WorkshopSettingInteger("Defend The Castle Extended", "GATE MAX HEALTH", 500, 100, 1000, 0);
moneyMultiplier[0] = WorkshopSettingReal("Defend The Castle Extended", "Money Multiplicator", 1, 0.5, 2, 0);
selfNanoWorkshopSetting = WorkshopSettingToggle("Ana Self Nano", "Ana can nano herself even if there are other players (only if no player targeted)", false, 0);
}
rule: "GLOBAL: GAME MODE INIT - COMMON PROPERTIES"
{
CreateInWorldText(AllPlayers(Team.Team1), <"Defend The Castle Extended d143\r\nby ShuriZma#2349\r\nOriginal mode by HUKUTA94#2589\r\nDiscord: dc.shuri.gg\r\n<0>", <"Special Thanks to:\nShingen#21859 for the Abilities,\nLemonAid#11644 for the Hero Talents &\nJosbird for teaching me about Menus<0>", "\nPS: SHINGEN PLS COME BACK">>, Vector(165, 12, -46.5), 1.2, Clipping.ClipAgainstSurfaces, InworldTextRev.VisibleTo, Color.White, Spectators.DefaultVisibility);
gateRepairPosition = Vector(153, 8, -46.5);
gatePosition = Vector(148.8, 6, -46.4);
ballSpawnPositions = [Vector(104, 7, -46), Vector(106, 2, -31)];
sniperPositions = [Vector(154, 18, -22.6), Vector(86, 12, -46.6), Vector(80.88, 11.3, -71.6), Vector(98, 9, -19)];
zenSpawnPositions = [Vector(79.5, 5, -100), Vector(90, 4, -88), Vector(65, 11, -70), Vector(85, 4, -68), Vector(96, 2, -73), Vector(84, 7, -47), Vector(95, 9, -34), Vector(108, 1.7, -28), Vector(113, 7, -37), Vector(123, 5, -19), Vector(144, 5, -19), Vector(123, 6, -39), Vector(123, 6, -61), Vector(129, 6, -30.5), Vector(135, 6, -63)];
playerSpawnPositions = [Vector(160, 11, -53), Vector(158, 11, -53), Vector(160, 11, -39), Vector(158, 11, -39)];
bigBossSpawnPositions = [Vector(78, 4, -84), Vector(95, 4, -82)];
bastionTargetPositions = [Vector(131, 12, -62), Vector(115, 7, -46), ObjectivePosition(2), Vector(136, 10, -27)];
spawnPositionMaxId = 2;
botOrisaTargetPosition = Vector(104, 7, -46);
botEchoRespawnPosition = Vector(130, 23, -44);
botEchoTeleportPositions = [Vector(88, 23, -79), Vector(108, 18, -27)];
defaultHeroBotsPool = [Hero.Zenyatta, Hero.Widowmaker, null, Hero.Bastion, Hero.Echo, Hero.Bastion];
zenRespawnTime = 10;
gameLogicCountOfUniqueHeroes = 5;
lastBoss = [null, null, null, null];
CreateEffect(AllPlayers(Team.Team1), Effect.Ring, Color.SkyBlue, Vector(186, 11, -46.5), 9, EffectRev.VisibleToPositionAndRadius);
CreateEffect(AllPlayers(Team.Team1), Effect.Ring, Color.Yellow, Vector(159, 11, -46.5), 2, EffectRev.VisibleToPositionAndRadius);
}
disabled rule: "=== TEAM UPGRADES ==="
{
}
rule: "GLOBAL: TEAM UPGRADES - INIT"
{
upgradeMaxAmmoMaxValue[0] = 150;
upgradeMaxAmmoMaxValue[1] = 300;
upgradeMaxAmmoMaxValue[2] = 500;
upgradeCriticalDamageMaxValue[0] = 10;
upgradeCriticalDamageMaxValue[1] = 5;
upgradeCriticalDamageMaxValue[2] = 10;
upgradePlayerMaxHealthMaxValue[0] = 3000;
upgradePlayerMaxHealthMaxValue[1] = 7000;
upgradePlayerMaxHealthMaxValue[2] = 12000;
upgradeGateMaxHealthMaxValue[0] = RoundToInteger(gateMaxHealth[0] + gateMaxHealth[0] * 0.5, Rounding.Up) > 1000 ? 1000 : RoundToInteger(gateMaxHealth[0] + gateMaxHealth[0] * 0.5, Rounding.Up);
upgradeGateMaxHealthMaxValue[1] = RoundToInteger(upgradeGateMaxHealthMaxValue[0] + upgradeGateMaxHealthMaxValue[0] * 0.5, Rounding.Up);
upgradeGateMaxHealthMaxValue[2] = RoundToInteger(upgradeGateMaxHealthMaxValue[1] + upgradeGateMaxHealthMaxValue[1] * 0.5, Rounding.Up);
AbortIf(isDebug == false);
upgradeMaxAmmoMaxValue[0] = 1;
upgradeCriticalDamageMaxValue[0] = 1;
upgradePlayerMaxHealthMaxValue[0] = 1;
upgradeGateMaxHealthMaxValue[0] = 1;
upgradeMaxAmmoMaxValue[1] = 1;
upgradeCriticalDamageMaxValue[1] = 1;
upgradePlayerMaxHealthMaxValue[1] = 1;
upgradeGateMaxHealthMaxValue[1] = 1;
upgradeMaxAmmoMaxValue[2] = 1;
upgradeCriticalDamageMaxValue[2] = 1;
upgradePlayerMaxHealthMaxValue[2] = 1;
upgradeGateMaxHealthMaxValue[2] = 1;
}
rule: "GLOBAL: UPGRADE - GATE'S MAX HEALTH - DONE"
if (IsGameInProgress() == true)
if (upgradeGateMaxHealthValue >= upgradeGateMaxHealthMaxValue[0] == true)
{
PlayEffect(AllPlayers(Team.Team1), PlayEffect.GoodExplosion, Color.Green, gatePosition, 5);
PlayEffect(AllPlayers(Team.Team1), PlayEffect.BuffImpactSound, Color.Green, gatePosition, 100);
gateMaxHealth[0] = RoundToInteger(gateMaxHealth[0] + gateMaxHealth[0] * 0.5, Rounding.Up);
gateHealth = gateMaxHealth[0];
DestroyHudText(upgradeGateMaxHealthHudId[0]);
CreateHudText(AllPlayers(Team.Team1), AbilityIconString(Hero.Reinhardt, Button.SecondaryFire), "2X GATE REPAIR", <"REPAIR GATE <0>/<1> HP", upgradeGateMaxHealthValue, upgradeGateMaxHealthMaxValue[1]>, Location.Left, 12, Color.Blue, Color.Blue, Color.Blue, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
upgradeGateMaxHealthHudId[1] = LastTextID();
async GateProgressBarColor();
challengeCount += 1;
}
rule: "GLOBAL: UPGRADE - GATE'S MAX HEALTH 2 - DONE"
if (IsGameInProgress() == true)
if (upgradeGateMaxHealthValue >= upgradeGateMaxHealthMaxValue[1] == true)
{
PlayEffect(AllPlayers(Team.Team1), PlayEffect.GoodExplosion, Color.Green, gatePosition, 5);
PlayEffect(AllPlayers(Team.Team1), PlayEffect.BuffImpactSound, Color.Green, gatePosition, 100);
DestroyHudText(upgradeGateMaxHealthHudId[1]);
CreateHudText(AllPlayers(Team.Team1), AbilityIconString(Hero.Reinhardt, Button.SecondaryFire), "2X AUTO-REPAIR", <"REPAIR GATE <0>/<1> HP", upgradeGateMaxHealthValue, upgradeGateMaxHealthMaxValue[2]>, Location.Left, 12, Color.Blue, Color.Blue, Color.Blue, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
upgradeGateMaxHealthHudId[2] = LastTextID();
gateHealth = gateMaxHealth[0];
async GateProgressBarColor();
challengeCount += 1;
}
rule: "GLOBAL: UPGRADE - GATE'S MAX HEALTH 3 - DONE"
if (IsGameInProgress() == true)
if (upgradeGateMaxHealthValue >= upgradeGateMaxHealthMaxValue[2] == true)
{
PlayEffect(AllPlayers(Team.Team1), PlayEffect.GoodExplosion, Color.Green, gatePosition, 5);
PlayEffect(AllPlayers(Team.Team1), PlayEffect.BuffImpactSound, Color.Green, gatePosition, 100);
DestroyHudText(upgradeGateMaxHealthHudId[2]);
gateHealth = gateMaxHealth[0];
async GateProgressBarColor();
challengeCount += 1;
}
rule: "PLAYER: UPGRADE - PLAYER'S MAX HEALTH - DEALT HEALING"
Event.OnHealingTaken
Team.Team1
if (IsGameInProgress() == true)
if (upgradePlayerMaxHealthValue < upgradePlayerMaxHealthMaxValue[2])
{
upgradePlayerMaxHealthValue += EventHealing();
}
rule: "GLOBAL: UPGRADE - PLAYER'S MAX HEALTH - DONE"
if (IsGameInProgress() == true)
if (upgradePlayerMaxHealthValue >= upgradePlayerMaxHealthMaxValue[0] == true)
{
DestroyHudText(upgradePlayerMaxHealthHudId[0]);
CreateHudText(AllPlayers(Team.Team1), IconString(Icon.Plus), "Up You Go: You respawn twice as fast", <"HEAL PLAYERS <0>/<1> HP", RoundToInteger(upgradePlayerMaxHealthValue, Rounding.Down), upgradePlayerMaxHealthMaxValue[1]>, Location.Left, 13, Color.Blue, Color.Blue, Color.Blue, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
upgradePlayerMaxHealthHudId[1] = LastTextID();
for (loopIterator = 0; CountOf(AllPlayers(Team.Team1)); 1)
{
PlayEffect(AllPlayers(Team.Team1), PlayEffect.GoodPickupEffect, Color.Yellow, PositionOf(AllPlayers(Team.Team1)[loopIterator]), 1);
PlayEffect(AllPlayers(Team.Team1), PlayEffect.BuffImpactSound, Color.Yellow, PositionOf(AllPlayers(Team.Team1)[loopIterator]), 100);
}
maxHealthDone = 50;
Heal(AllPlayers(Team.Team1), null, 9999);
challengeCount += 1;
}
rule: "GLOBAL: UPGRADE - PLAYER'S MAX HEALTH - DONE"
Event.OngoingPlayer
Team.Team1
if (IsGameInProgress() == true)
if (upgradePlayerMaxHealthValue >= upgradePlayerMaxHealthMaxValue[0] == true)
{
UpdatePlayerStats();
}
rule: "GLOBAL: UPGRADE - PERK UP YOU GO - DONE"
if (IsGameInProgress() == true)
if (upgradePlayerMaxHealthValue >= upgradePlayerMaxHealthMaxValue[1] == true)
{
DestroyHudText(upgradePlayerMaxHealthHudId[1]);
CreateHudText(AllPlayers(Team.Team1), IconString(Icon.Plus), "PLAYER'S MAX HEALTH +100%", <"HEAL PLAYERS <0>/<1> HP", RoundToInteger(upgradePlayerMaxHealthValue, Rounding.Down), upgradePlayerMaxHealthMaxValue[2]>, Location.Left, 13, Color.Blue, Color.Blue, Color.Blue, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
upgradePlayerMaxHealthHudId[2] = LastTextID();
SetRespawnMaxTime(AllPlayers(Team.Team1), 5);
Heal(AllPlayers(Team.Team1), null, 9999);
for (loopIterator = 0; CountOf(AllPlayers(Team.Team1)); 1)
{
PlayEffect(AllPlayers(Team.Team1), PlayEffect.GoodPickupEffect, Color.Yellow, PositionOf(AllPlayers(Team.Team1)[loopIterator]), 1);
PlayEffect(AllPlayers(Team.Team1), PlayEffect.BuffImpactSound, Color.Yellow, PositionOf(AllPlayers(Team.Team1)[loopIterator]), 100);
}
perk[2] = 1;
CreateHudText(AllPlayers(Team.Team1), null, "Up You Go", null, Location.Left, 917, Color.White, Color.Green, Color.White, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
AllPlayers(Team.Team1).abilityHUD[17] = LastTextID();
challengeCount += 1;
}
rule: "GLOBAL: UPGRADE - PLAYER'S MAX HEALTH 2 - DONE"
if (IsGameInProgress() == true)
if (upgradePlayerMaxHealthValue >= upgradePlayerMaxHealthMaxValue[2] == true)
{
DestroyHudText(upgradePlayerMaxHealthHudId[2]);
for (loopIterator = 0; CountOf(AllPlayers(Team.Team1)); 1)
{
PlayEffect(AllPlayers(Team.Team1), PlayEffect.GoodPickupEffect, Color.Yellow, PositionOf(AllPlayers(Team.Team1)[loopIterator]), 1);
PlayEffect(AllPlayers(Team.Team1), PlayEffect.BuffImpactSound, Color.Yellow, PositionOf(AllPlayers(Team.Team1)[loopIterator]), 100);
}
maxHealthDone = 150;
Heal(AllPlayers(Team.Team1), null, 9999);
challengeCount += 1;
}
rule: "GLOBAL: UPGRADE - PLAYER'S MAX HEALTH 2 - DONE"
Event.OngoingPlayer
Team.Team1
if (IsGameInProgress() == true)
if (upgradePlayerMaxHealthValue >= upgradePlayerMaxHealthMaxValue[2] == true)
{
UpdatePlayerStats();
}
rule: "PLAYER: UPGRADE - CRITICAL DAMAGE - DEALT KILL"
Event.OnFinalBlow
Team.Team1
if (IsGameInProgress() == true)
if (EventWasCriticalHit() == true)
if (HeroOf(Victim()) == Hero.Widowmaker)
if (upgradeCriticalDamageValue < upgradeCriticalDamageMaxValue[0])
{
upgradeCriticalDamageValue += 1;
}
rule: "GLOBAL: UPGRADE - CRITICAL DAMAGE - DONE"
if (IsGameInProgress() == true)
if (upgradeCriticalDamageValue >= upgradeCriticalDamageMaxValue[0])
{
DestroyHudText(upgradeCriticalDamageHudId[0]);
CreateHudText(AllPlayers(Team.Team1), IconString(Icon.Skull), "Sharpshooter: 40% more damage at >15m", <"KILL ECHO <0>/<1>", upgradePerkSharpshooterValue, upgradeCriticalDamageMaxValue[1]>, Location.Left, 14, Color.Blue, Color.Blue, Color.Blue, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
upgradeCriticalDamageHudId[1] = LastTextID();
challengeCount += 1;
}
rule: "PLAYER: UPGRADE - PERK SHARPSHOOTER - DEALT KILL"
Event.OnFinalBlow
Team.Team1
if (IsGameInProgress() == true)
if (HeroOf(Victim()) == Hero.Echo)
if (upgradePerkSharpshooterValue < upgradeCriticalDamageMaxValue[1])
if (upgradeCriticalDamageValue >= upgradeCriticalDamageMaxValue[0])
{
upgradePerkSharpshooterValue += 1;
}
rule: "GLOBAL: UPGRADE - PERK SHARPSHOOTER - DONE"
if (IsGameInProgress() == true)
if (upgradePerkSharpshooterValue >= upgradeCriticalDamageMaxValue[1])
{
DestroyHudText(upgradeCriticalDamageHudId[1]);
CreateHudText(AllPlayers(Team.Team1), IconString(Icon.Skull), "-10% BOSS HEALTH", <"KILL Bosses <0>/<1>", upgradeBossHealthValue, upgradeCriticalDamageMaxValue[2]>, Location.Left, 14, Color.Blue, Color.Blue, Color.Blue, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
upgradeCriticalDamageHudId[2] = LastTextID();
perk[0] = 1;
CreateHudText(AllPlayers(Team.Team1), null, "Sharpshooter", null, Location.Left, 918, Color.White, Color.Green, Color.White, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
AllPlayers(Team.Team1).abilityHUD[18] = LastTextID();
challengeCount += 1;
}
rule: "GLOBAL: UPGRADE - -10% BOSS HEALTH - DONE"
if (IsGameInProgress() == true)
if (upgradeBossHealthValue >= upgradeCriticalDamageMaxValue[2])
{
DestroyHudText(upgradeCriticalDamageHudId[2]);
challengeCount += 1;
}
rule: "GLOBAL: UPGRADE - MAX AMMO - DONE"
if (IsGameInProgress() == true)
if (upgradeMaxAmmoValue >= upgradeMaxAmmoMaxValue[0] == true)
{
DestroyHudText(upgradeMaxAmmoHudId[0]);
CreateHudText(AllPlayers(Team.Team1), IconString(Icon.Asterisk), "+50% DAMAGE", <"KILL ENEMIES: <0>/<1>", upgradeMaxAmmoValue, upgradeMaxAmmoMaxValue[1]>, Location.Left, 15, Color.Blue, Color.Blue, Color.Blue, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
upgradeMaxAmmoHudId[1] = LastTextID();
for (loopIterator = 0; CountOf(AllPlayers(Team.Team1)); 1)
{
SetMaxAmmo(AllPlayers(Team.Team1)[loopIterator], 0, MaxAmmo(AllPlayers(Team.Team1)[loopIterator], 0) * 2);
SetMaxAmmo(AllPlayers(Team.Team1)[loopIterator], 1, MaxAmmo(AllPlayers(Team.Team1)[loopIterator], 1) * 2);
SetAmmo(AllPlayers(Team.Team1)[loopIterator], 0, MaxAmmo(AllPlayers(Team.Team1)[loopIterator], 0));
SetAmmo(AllPlayers(Team.Team1)[loopIterator], 1, MaxAmmo(AllPlayers(Team.Team1)[loopIterator], 1));
}
challengeCount += 1;
}
rule: "GLOBAL: UPGRADE - +50% DAMAGE - DONE"
if (IsGameInProgress() == true)
if (upgradeMaxAmmoValue >= upgradeMaxAmmoMaxValue[1] == true)
{
DestroyHudText(upgradeMaxAmmoHudId[1]);
CreateHudText(AllPlayers(Team.Team1), IconString(Icon.Asterisk), "Bulletstorm: Your weapon can hold unlimited ammo", <"KILL ENEMIES: <0>/<1>", upgradeMaxAmmoValue, upgradeMaxAmmoMaxValue[2]>, Location.Left, 15, Color.Blue, Color.Blue, Color.Blue, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
upgradeMaxAmmoHudId[2] = LastTextID();
challengeCount += 1;
}
rule: "GLOBAL: UPGRADE - +50% DAMAGE - DONE"
Event.OngoingPlayer
Team.Team1
if (IsGameInProgress() == true)
if (upgradeMaxAmmoValue >= upgradeMaxAmmoMaxValue[1] == true)
{
UpdatePlayerStats();
}
rule: "GLOBAL: UPGRADE - PERK BULLETSTORM - DONE"
if (IsGameInProgress() == true)
if (upgradeMaxAmmoValue >= upgradeMaxAmmoMaxValue[2] == true)
{
DestroyHudText(upgradeMaxAmmoHudId[2]);
perk[1] = 1;
CreateHudText(AllPlayers(Team.Team1), null, "Bulletstorm", null, Location.Left, 919, Color.White, Color.Green, Color.White, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
AllPlayers(Team.Team1).abilityHUD[19] = LastTextID();
challengeCount += 1;
}
disabled rule: "=== GAME PHASES ==="
{
}
rule: "GLOBAL: ASSEMBLING PHASE - MAKE CHALLENGE HUDS"
if (IsAssemblingHeroes() == true)
{
if (isDebug)
{
SetMatchTime(1);
}
else
{
DisableInspectorRecording();
SetMatchTime(10);
}
CreateInWorldText(AllPlayers(Team.Team1), <"<0><1>\nREPAIR\n <2>", <"<0><1><2>", HeroIconString(Hero.Torbjorn), HeroIconString(Hero.Brigitte), HeroIconString(Hero.Reinhardt)>, HeroIconString(Hero.Symmetra), AbilityIconString(Hero.Reinhardt, Button.PrimaryFire)>, gatePosition + Vector(0, 1.4, 0), 1.2, Clipping.DoNotClip, InworldTextRev.VisibleTo, Color.White, Spectators.DefaultVisibility);
CreateHudText(FilteredArray(AllPlayers(Team.Team1), ArrayElement().isInMenu[1] == 0), null, <"HOLD <0> - Reload to open the shop", InputBindingString(Button.Reload)>, null, Location.Top, 1000, Color.White, Color.Yellow, Color.White, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
WaitUntil(IsGameInProgress() == true, 9999);
CreateHudText(AllPlayers(Team.Team1), null, <"TEAM CHALLENGES <0>/12", challengeCount>, null, Location.Left, 11, Color.White, Color.Red, Color.White, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
# UPGRADE - GATE'S MAX HEALTH
CreateHudText(AllPlayers(Team.Team1), AbilityIconString(Hero.Reinhardt, Button.SecondaryFire), <"GATE'S MAX HEALTH: <0> HP", RoundToInteger(gateMaxHealth[0] + gateMaxHealth[0] * 0.75, Rounding.Up)>, <"REPAIR GATE <0>/<1> HP", upgradeGateMaxHealthValue, upgradeGateMaxHealthMaxValue[0]>, Location.Left, 12, Color.Blue, Color.Blue, Color.Blue, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
upgradeGateMaxHealthHudId[0] = LastTextID();
# UPGRADE - PLAYER'S MAX HEALTH
CreateHudText(AllPlayers(Team.Team1), IconString(Icon.Plus), "PLAYER'S MAX HEALTH +50%", <"HEAL PLAYERS <0>/<1> HP", RoundToInteger(upgradePlayerMaxHealthValue, Rounding.Down), upgradePlayerMaxHealthMaxValue[0]>, Location.Left, 13, Color.Blue, Color.Blue, Color.Blue, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
upgradePlayerMaxHealthHudId[0] = LastTextID();
# UPGRADE - CRITICAL DAMAGE
CreateHudText(AllPlayers(Team.Team1), IconString(Icon.Skull), "CRITICAL DAMAGE 150%", <"KILL WIDOW WITH HEADSHOT: <0>/<1>", upgradeCriticalDamageValue, upgradeCriticalDamageMaxValue[0]>, Location.Left, 14, Color.Blue, Color.Blue, Color.Blue, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
upgradeCriticalDamageHudId[0] = LastTextID();
# UPGRADE - MAX AMMO
CreateHudText(AllPlayers(Team.Team1), IconString(Icon.Asterisk), "MAX AMMO 200%", <"KILL ENEMIES: <0>/<1>", upgradeMaxAmmoValue, upgradeMaxAmmoMaxValue[0]>, Location.Left, 15, Color.Blue, Color.Blue, Color.Blue, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
upgradeMaxAmmoHudId[0] = LastTextID();
}
rule: "GLOBAL: SETUP PHASE"
if (IsInSetup() == true)
{
if (isDebug)
{
SetMatchTime(1);
}
else
{
PauseMatchTime();
CreateHudText(FilteredArray(AllPlayers(Team.Team1), ArrayElement().isInMenu[1] == 0), null, <"PRESS <0> - INTERACT TO VOTE FOR START | <1>/<2>", InputBindingString(Button.Interact), CountOf(FilteredArray(AllPlayers(Team.Team1), ArrayElement().vote[0] == 1)), CountOf(AllPlayers(Team.Team1))>, null, Location.Top, 50, Color.White, Color.Red, Color.White, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
globalHUDs[0] = LastTextID();
SetMatchTime(10);
while (CountOf(FilteredArray(AllPlayers(Team.Team1), ArrayElement().vote[0] == 1)) <= CountOf(AllPlayers(Team.Team1)) / 2)
{
FilteredArray(AllPlayers(Team.Team1), IsButtonHeld(ArrayElement(), Button.Interact)).vote[0] = 1;
Wait(0.1, WaitBehavior.IgnoreCondition);
}
DestroyHudText(globalHUDs[0]);
UnpauseMatchTime();
}
SetObjectiveDescription(AllPlayers(Team.All), "DEFEND GATE", HudTextRev.VisibleToAndString);
}
rule: "GLOBAL: GAME IN PROGRESS"
if (IsGameInProgress() == true)
{
SetMatchTime(3599);
PauseMatchTime();
DisableScoring();
DisableAnnouncer();
DisableCompletion();
DisableGameModeHud(AllPlayers(Team.All));
DisableGameModeInworldUI(AllPlayers(Team.All));
gateHealth = gateMaxHealth[0];
gateHealthChase = gateHealth;
gateProgressBarColorComponent = 255;
gateProgressBarColorCurrent = Color.White;
CreateProgressBarHudText(AllPlayers(Team.Team1), gateHealthChase * 100 / gateMaxHealth[0], <"GATE <0>/<1>", gateHealth, gateMaxHealth[0]>, Location.Top, 1, gateProgressBarColorCurrent, Color.White, ProgressBarHudEvaluation.VisibleToValuesAndColor, Spectators.DefaultVisibility);
CreateHudText(AllPlayers(Team.Team1), null, <"SURVIVED TIME: <0>:<1>", timeMinutes, timeSeconds < 10 ? <"0<0>", timeSeconds> : timeSeconds>, null, Location.Top, 2, Color.White, Color.White, Color.White, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
}
disabled rule: "=== GAME - MAIN LOGIC ==="
{
}
rule: "GLOBAL: DEFEAT"
if (IsGameInProgress() == true)
if (isDebug == false)
if (gateHealth <= 0)
{
DeclareTeamVictory(Team.Team2);
}
rule: "GLOBAL: TIMER - MAIN GAME LOOP"
if (IsGameInProgress() == true)
{
Wait(1, WaitBehavior.IgnoreCondition);
timeSeconds += 1;
if (timeSeconds == 60)
{
timeSeconds = 0;
timeMinutes += 1;
time5Minutes = RoundToInteger(timeMinutes / 5, Rounding.Down);
time10Minutes = RoundToInteger(timeMinutes / 10, Rounding.Down);
spawnPositionMaxId += 1;
}
else if (timeSeconds == 30)
{
spawnPositionMaxId += 1;
}
LoopIfConditionIsTrue();
}
void GameLogicSetBotProperties() "SUBROUTINE: GAME LOGIC - SET BOT PROPERTIES"
{
AbortIf(botIsOrisaChild == true);
if (timeMinutes >= 10)
{
if (FilteredArray(lastBoss, ArrayElement() == HeroOf(EventPlayer())) == false)
{
if (activeBoss == false)
{
activeBoss = EventPlayer();
isBoss[0] = 1;
}
}
}
End();
# PROPERTIES BY DEFAULT
SetGravity(EventPlayer(), 100);
SetDamageDealt(EventPlayer(), 100);
SetRespawnMaxTime(EventPlayer(), 10);
StartScalingPlayer(EventPlayer(), 1, false);
# INDIVIDUAL HERO'S PROPERTIES
if (HeroOf(EventPlayer()) == Hero.Zenyatta)
{
if (isBoss[0] == 1)
{
SetMoveSpeed(EventPlayer(), 30);
SetMaxHealth(EventPlayer(), 10 * (100 + 10 * timeMinutes + 25 * time5Minutes + 50 * time10Minutes) * (upgradeBossHealthValue >= upgradeCriticalDamageMaxValue[2] ? 0.9 : 1));
StartScalingPlayer(EventPlayer(), 1.5, false);
}
else
{
if (20 + 3 * NumberOfPlayers(Team.Team1) + 3 * timeMinutes > 75)
{
SetMoveSpeed(EventPlayer(), 75);
}
else
{
SetMoveSpeed(EventPlayer(), 20 + 3 * CountOf(AllPlayers(Team.Team1)) + 3 * timeMinutes);
}
SetMaxHealth(EventPlayer(), 100 + 10 * timeMinutes + 25 * time5Minutes + 50 * time10Minutes);
}
}
else if (HeroOf(EventPlayer()) == Hero.WreckingBall)
{
if (isBoss[0] == 1)
{
SetMoveSpeed(EventPlayer(), 20);
SetMaxHealth(EventPlayer(), 5 * (70 + 10 * CountOf(AllPlayers(Team.Team1)) + 10 * timeMinutes + 25 * time5Minutes + 30 * time10Minutes) * (upgradeBossHealthValue >= upgradeCriticalDamageMaxValue[2] ? 0.9 : 1));
StartScalingPlayer(EventPlayer(), 2, false);
}
else if (isBoss[1] == 1)
{
SetMoveSpeed(EventPlayer(), 50);
SetMaxHealth(EventPlayer(), 40 + 7 * CountOf(AllPlayers(Team.Team1)) + 5 * timeMinutes + 20 * time5Minutes + 15 * time10Minutes);
StartScalingPlayer(EventPlayer(), 0.5, false);
}
else
{
if (30 + timeMinutes + 2.5 * time5Minutes > 40)
{
SetMoveSpeed(EventPlayer(), 40);
}
else
{
SetMoveSpeed(EventPlayer(), 30 + timeMinutes + 2.5 * time5Minutes);
}
SetUltimateCharge(EventPlayer(), 0);
SetMaxHealth(EventPlayer(), 70 + 10 * CountOf(AllPlayers(Team.Team1)) + 10 * timeMinutes + 25 * time5Minutes + 30 * time10Minutes);
}
}
else if (HeroOf(EventPlayer()) == Hero.Widowmaker)
{
if (isBoss[0] == 1)
{
SetDamageDealt(EventPlayer(), 2 * (55 + 15 * CountOf(AllPlayers(Team.Team1)) + 25 * time5Minutes + 30 * time10Minutes));
SetMoveSpeed(EventPlayer(), 100);
SetMaxHealth(EventPlayer(), 5 * (50 + 25 * CountOf(AllPlayers(Team.Team1)) + 5 * timeMinutes + 15 * time5Minutes + 25 * time10Minutes) * (upgradeBossHealthValue >= upgradeCriticalDamageMaxValue[2] ? 0.9 : 1));
StartScalingPlayer(EventPlayer(), 2, false);
}
else
{
botCounter = 0;
SetDamageDealt(EventPlayer(), 55 + 15 * CountOf(AllPlayers(Team.Team1)) + 25 * time5Minutes + 30 * time10Minutes);
SetMoveSpeed(EventPlayer(), 100);
SetMaxHealth(EventPlayer(), 50 + 25 * CountOf(AllPlayers(Team.Team1)) + 5 * timeMinutes + 15 * time5Minutes + 25 * time10Minutes);
}
}
else if (HeroOf(EventPlayer()) == Hero.Bastion)
{
if (isBoss[0] == 1)
{
SetMoveSpeed(EventPlayer(), 50);
SetDamageDealt(EventPlayer(), 55 + 5 * CountOf(AllPlayers(Team.Team1)) + 5 * time5Minutes + 5 * time10Minutes);
StartScalingPlayer(EventPlayer(), 3, false);
SetMaxHealth(EventPlayer(), 5 * (125 + 150 * CountOf(AllPlayers(Team.Team1)) + 20 * timeMinutes + 35 * time5Minutes + 45 * time10Minutes) * (upgradeBossHealthValue >= upgradeCriticalDamageMaxValue[2] ? 0.9 : 1));
}
else if (isBoss[1] == 1)
{
SetMoveSpeed(EventPlayer(), 100);
SetDamageDealt(EventPlayer(), 20 + 2 * CountOf(AllPlayers(Team.Team1)) + 2 * time5Minutes + 5 * time10Minutes);
SetMaxHealth(EventPlayer(), 60 + 60 * CountOf(AllPlayers(Team.Team1)) + 10 * timeMinutes + 20 * time5Minutes + 20 * time10Minutes);
}
else
{
SetMoveSpeed(EventPlayer(), 80);
SetDamageDealt(EventPlayer(), 55 + 5 * CountOf(AllPlayers(Team.Team1)) + 5 * time5Minutes + 5 * time10Minutes);
StartScalingPlayer(EventPlayer(), 2, false);
SetMaxHealth(EventPlayer(), 125 + 150 * CountOf(AllPlayers(Team.Team1)) + 20 * timeMinutes + 35 * time5Minutes + 45 * time10Minutes);
}
}
else if (HeroOf(EventPlayer()) == Hero.Orisa)
{
if (isBoss[0] == 1)
{
StartScalingPlayer(EventPlayer(), 1.8, false);
SetMaxHealth(EventPlayer(), 5 * (200 + CountOf(AllPlayers(Team.Team1)) * 70 + 50 * time5Minutes + 75 * time10Minutes) * (upgradeBossHealthValue >= upgradeCriticalDamageMaxValue[2] ? 0.9 : 1));
SetMoveSpeed(EventPlayer(), 20 + 5 * time5Minutes);
}
else
{
StartScalingPlayer(EventPlayer(), 1.8, false);
SetMaxHealth(EventPlayer(), 200 + CountOf(AllPlayers(Team.Team1)) * 70 + 50 * time5Minutes + 75 * time10Minutes);
SetMoveSpeed(EventPlayer(), 80 + 5 * time5Minutes);
}
}
else if (HeroOf(EventPlayer()) == Hero.Echo)
{
if (isBoss[0] == 1)
{
SetGravity(EventPlayer(), 40);
SetMoveSpeed(EventPlayer(), 50 + 5 * time5Minutes);
SetRespawnMaxTime(EventPlayer(), 18);
SetMaxHealth(EventPlayer(), 5 * (70 + 25 * CountOf(AllPlayers(Team.Team1)) + 15 * timeMinutes + 25 * time5Minutes + 40 * time10Minutes) * (upgradeBossHealthValue >= upgradeCriticalDamageMaxValue[2] ? 0.9 : 1));
StartScalingPlayer(EventPlayer(), 2, false);
}
else
{
SetGravity(EventPlayer(), 40);
SetMoveSpeed(EventPlayer(), 110 + 5 * time5Minutes);
SetRespawnMaxTime(EventPlayer(), 18);
SetMaxHealth(EventPlayer(), 70 + 25 * CountOf(AllPlayers(Team.Team1)) + 15 * timeMinutes + 25 * time5Minutes + 40 * time10Minutes);
}
}
else if (HeroOf(EventPlayer()) == Hero.Reinhardt)
{
if (isBoss[0] == 1)
{
StartScalingPlayer(EventPlayer(), 1.5, false);
SetMoveSpeed(EventPlayer(), 50);
SetDamageDealt(EventPlayer(), 80 + 5 * CountOf(AllPlayers(Team.Team1)) + 5 * time5Minutes + 8 * time10Minutes);
SetRespawnMaxTime(EventPlayer(), 15);
SetMaxHealth(EventPlayer(), 5 * (45 + 25 * CountOf(AllPlayers(Team.Team1)) + 15 * timeMinutes + 25 * time5Minutes + 40 * time10Minutes) * (upgradeBossHealthValue >= upgradeCriticalDamageMaxValue[2] ? 0.9 : 1));
}
else if (isBoss[1] == 1)
{
StartScalingPlayer(EventPlayer(), 0.5, false);
SetMoveSpeed(EventPlayer(), 100);
SetDamageDealt(EventPlayer(), 30 + 2 * CountOf(AllPlayers(Team.Team1)) + 2 * time5Minutes + 5 * time10Minutes);
SetMaxHealth(EventPlayer(), 20 + 10 * CountOf(AllPlayers(Team.Team1)) + 10 * timeMinutes + 10 * time5Minutes + 20 * time10Minutes);
}
else
{
SetMoveSpeed(EventPlayer(), 90);
SetDamageDealt(EventPlayer(), 80 + 5 * CountOf(AllPlayers(Team.Team1)) + 5 * time5Minutes + 8 * time10Minutes);
SetRespawnMaxTime(EventPlayer(), 15);
SetMaxHealth(EventPlayer(), 45 + 25 * CountOf(AllPlayers(Team.Team1)) + 15 * timeMinutes + 25 * time5Minutes + 40 * time10Minutes);
}
}
Wait(0.25, WaitBehavior.IgnoreCondition);
# FILL HEALTH
Heal(EventPlayer(), null, 100000);
}
disabled rule: "=== GATE ==="
{
}
void UpdatePlayerStats() "Subroutine: UPDATE PLAYER STATS"
{
damageBoost[0] = (upgradeMaxAmmoValue >= upgradeMaxAmmoMaxValue[1] ? 50 : 0) + abilities[13] * 5 + damageBoost[1];
SetDamageDealt(EventPlayer(), baseStats[0] + damageBoost);
playerHealth = maxHealthDone + abilities[14] * 5;
SetMaxHealth(EventPlayer(), baseStats[1] + playerHealth);
healBoost[0] = healBoost[1] + abilities[15] * 5;
SetHealingDealt(EventPlayer(), baseStats[2] + healBoost[0]);
SetMoveSpeed(EventPlayer(), baseStats[3] + speedBoost);
}
void GateRepair() "Subroutine: GATE REPAIR"
{
# UPGRADE - GATE'S MAX HEALTH
if (upgradeGateMaxHealthValue < upgradeGateMaxHealthMaxValue[2])
{
if (gateMaxHealth[0] - gateHealth > (HeroOf(EventPlayer()) == Hero.Symmetra ? 2 : 10) * (upgradeGateMaxHealthValue >= upgradeGateMaxHealthMaxValue[1] ? 2 : 1) * (isNanoed == 1 ? 2 : 1))
{
upgradeGateMaxHealthValue += (HeroOf(EventPlayer()) == Hero.Symmetra ? 2 : 10) * (upgradeGateMaxHealthValue >= upgradeGateMaxHealthMaxValue[1] ? 2 : 1) * (isNanoed == 1 ? 2 : 1);
}
else
{
upgradeGateMaxHealthValue += gateMaxHealth[0] - gateHealth;
}
}
# HEAL GATE
if (gateMaxHealth[0] - gateHealth > (HeroOf(EventPlayer()) == Hero.Symmetra ? 2 : 10) * (upgradeGateMaxHealthValue >= upgradeGateMaxHealthMaxValue[1] ? 2 : 1) * (isNanoed == 1 ? 2 : 1))
{
gateHealth += (HeroOf(EventPlayer()) == Hero.Symmetra ? 2 : 10) * (upgradeGateMaxHealthValue >= upgradeGateMaxHealthMaxValue[1] ? 2 : 1) * (isNanoed == 1 ? 2 : 1);
}
else
{
gateHealth += gateMaxHealth[0] - gateHealth;
}
# CHARGE ULTIMATE
SetUltimateCharge(EventPlayer(), UltimateChargePercent(EventPlayer()) + 2);
# UPDATE GATE'S HEALTH BAR
async GateProgressBarColor();
}
rule: "GATE REPAIR"
Event.OngoingPlayer
Team.Team1
if (IsGameInProgress() == true)
if ((HeroOf(EventPlayer()) == Hero.Torbjorn && Weapon(EventPlayer()) == 2 || HeroOf(EventPlayer()) == Hero.Reinhardt || HeroOf(EventPlayer()) == Hero.Brigitte || HeroBeingDuplicated(EventPlayer()) == Hero.Reinhardt || HeroOf(EventPlayer()) == Hero.Symmetra) == true)
if (IsFiringPrimary(EventPlayer()) == true)
if (gateHealth < gateMaxHealth[0])
if (IsInViewAngle(EventPlayer(), gateRepairPosition, 30) == true)
if (DistanceBetween(PositionOf(EventPlayer()), gatePosition) < (HeroOf(EventPlayer()) == Hero.Brigitte ? 5 : HeroOf(EventPlayer()) == Hero.Symmetra ? 12 : 3.5))
{
if (HeroOf(EventPlayer()) == Hero.Reinhardt)
{
Wait(0.1, WaitBehavior.IgnoreCondition);
}
GateRepair();
if (HeroOf(EventPlayer()) == Hero.Torbjorn)
{
Wait(IsUsingAbility2(EventPlayer()) == true ? 0.35 : 0.7, WaitBehavior.IgnoreCondition);
}
else if (HeroOf(EventPlayer()) == Hero.Reinhardt)
{
Wait(0.85, WaitBehavior.IgnoreCondition);
}
else if (HeroOf(EventPlayer()) == Hero.Symmetra)
{
Wait(0.1, WaitBehavior.IgnoreCondition);
}
else
{
Wait(0.5, WaitBehavior.IgnoreCondition);
}
LoopIfConditionIsTrue();
}
void GateProgressBarColor() "SUBROUTINE: GATE PROGRESS BAR COLOR"
{
StopChasingVariable(gateHealthChase);
ChaseVariableOverTime(gateHealthChase, gateHealth, 0.1, TimeChaseReevaluation.DestinationAndDuration);
# GATE WAS DAMAGED
if (gateHealth < gateHealthEvent)
{
for (loopIterator = 0; 3; 1)
{
gateProgressBarColorCurrent = Color.Red;
Wait(0.1, WaitBehavior.IgnoreCondition);
gateProgressBarColorCurrent = Color.White;
Wait(0.1, WaitBehavior.IgnoreCondition);
}
}
else
{
gateProgressBarColorCurrent = Color.Green;
Wait(0.1, WaitBehavior.IgnoreCondition);
gateProgressBarColorCurrent = Color.Yellow;
Wait(0.1, WaitBehavior.IgnoreCondition);
}
gateHealthEvent = gateHealth;
gateProgressBarColorComponent = gateHealth * 255 / gateMaxHealth[0];
gateProgressBarColorCurrent = CustomColor(255, gateProgressBarColorComponent, gateProgressBarColorComponent, 255);
}
disabled rule: "=== COMMON MECHANICS ==="
{
}
rule: "ALL: INIT"
Event.OnPlayerJoin
{
# ALL (COMMON) INIT
isDead = true;
DisableKillFeed(EventPlayer());
DisableGameModeInworldUI(EventPlayer());
DisableSpectateHUD(EventPlayer());
# BOT INIT
if (IsDummyBot(EventPlayer()))
{
BotInit();
}
else
{
PlayerInit();
}
}
void BotInit() "SUBROUTINE: BOT - INIT"
{
# INIT VARS
hasBadStatus = false;
isRespawning = false;
botDoesUniqueBehaviour = false;
botEventPosition = Vector(9999, 999, 9999);
# DISABLE ALL FOR BOT
DisableHeroHud(EventPlayer());
DisableMessages(EventPlayer());
DisableTextChat(EventPlayer());
DisableScoreboard(EventPlayer());
DisableGameModeHud(EventPlayer());
DisableSpectate(EventPlayer());
DisableVoiceChat(EventPlayer(), true, true, true);
# INIT AI NAVIGATION VARS
BotResetPathFinding();
}
void PlayerInit() "SUBROUTINE: PLAYER - INIT"
{
UpdatePlayerStats();
if (IsGameInProgress())
{
DisableGameModeHud(EventPlayer());
}
}
rule: "ALL: RESPAWN"
Event.OngoingPlayer
if (HasSpawned(EventPlayer()) == true)
if (IsAlive(EventPlayer()) == true)
if ((HeroOf(EventPlayer()) != currentHero || isDead == true) == true)
{
isDead = false;
# BOT RESPAWN
if (IsDummyBot(EventPlayer()))
{
BotRespawn();
if (isDebugAINavigation)
{
CreateBeamEffect(AllPlayers(Team.All), BeamType.GoodBeam, EyePosition(EventPlayer()), botNextNodePosition, Color.Green, EffectRev.VisibleToPositionAndRadius);
}
}
else
{
PlayerRespawn();
}
# MUST BE AFTER ALL RESPAWN SUBROUTINES!
currentHero = HeroOf(EventPlayer());
}
void BotRespawn() "SUBROUTINE: BOT - RESPAWN"
{
# RESET COMMON PROPERTIES
isRespawning = true;
EnableNameplates(EventPlayer(), AllPlayers(Team.Team1));
BotResetPathFinding();
GameLogicSetBotProperties();
# INDIVIDUAL HERO'S RESPAWN SCRIPTS
if (HeroOf(EventPlayer()) == Hero.Bastion)
{
BotBastionRespawn();
}
else if (HeroOf(EventPlayer()) == Hero.Zenyatta)
{
BotZenyattaRespawn();
}
else if (HeroOf(EventPlayer()) == Hero.Widowmaker)
{
BotWidowRespawn();
}
else if (HeroOf(EventPlayer()) == Hero.WreckingBall)
{
BotBallRespawn();
}
else if (HeroOf(EventPlayer()) == Hero.Orisa)
{
BotOrisaRespawn();
}
else if (HeroOf(EventPlayer()) == Hero.Echo)
{
BotEchoRespawn();
}
else if (HeroOf(EventPlayer()) == Hero.Reinhardt)
{
BotReinRespawn();
}
isRespawning = false;
}
void PlayerRespawn() "SUBROUTINE: PLAYER - RESPAWN"
{
# TEAM CHALLENGE - MAX AMMO
if (HeroOf(EventPlayer()) != currentHero && upgradeMaxAmmoValue >= upgradeMaxAmmoMaxValue[0])
{
SetMaxAmmo(EventPlayer(), 0, Ammo(EventPlayer(), 0) * 2);
SetMaxAmmo(EventPlayer(), 1, Ammo(EventPlayer(), 1) * 2);
SetAmmo(EventPlayer(), 0, MaxAmmo(EventPlayer(), 0));
SetAmmo(EventPlayer(), 1, MaxAmmo(EventPlayer(), 1));
}
# PLAYER RESPAWN
SetStatus(EventPlayer(), null, Status.PhasedOut, 3);
SetFacing(EventPlayer(), Vector(-1, 0, 0), Relative.ToWorld);
if (AbilityCooldown(PlayersOnHero(Hero.Mercy, Team.Team1), Button.Ability2) >= 30 * (PlayersOnHero(Hero.Mercy, Team.Team1).abilities[6] ? PlayersOnHero(Hero.Mercy, Team.Team1).abilities[6] * 0.25 : 1) - 1)
{
Wait(0.25, WaitBehavior.IgnoreCondition);
Teleport(EventPlayer(), deathPosition);
}
else
{
Teleport(EventPlayer(), playerSpawnPositions[SlotOf(EventPlayer()) == CountOf(playerSpawnPositions) ? RandomInteger(0, CountOf(playerSpawnPositions) - 1) : SlotOf(EventPlayer())]);
}
UpdatePlayerStats();
}
rule: "PLAYER: DEATH"
Event.OnDeath
Team.Team1
{
if (HeroOf(EventPlayer()) == Hero.Roadhog)
{
abilities[8] -= 1;
Wait(perk[2] ? 5 : 10, WaitBehavior.IgnoreCondition);
abilities[8] += 1;
}
deathPosition = PositionOf(EventPlayer());
isDead = true;
}
rule: "BOT: DEATH"
Event.OnDeath
Team.Team2
{
deathPosition = PositionOf(EventPlayer());
if (isBoss[0] == 1)
{
if (upgradePerkSharpshooterValue >= upgradeCriticalDamageMaxValue[1] && upgradeBossHealthValue < upgradeCriticalDamageMaxValue[2])
{
upgradeBossHealthValue += 1;
}
isBoss[0] = 0;
activeBoss = null;
}
else if (isBoss[1] == 1)
{
if (HeroOf(EventPlayer()) == Hero.WreckingBall)
{
DestroyEffect(botEffects[0]);
}
Wait(1, WaitBehavior.IgnoreCondition);
ForcePlayerHero(EventPlayer(), RandomInteger(1, 100) > 50 ? Hero.Reinhardt : RandomInteger(1, 100) > 33 ? Hero.WreckingBall : CountOf(FilteredArray(AllPlayers(Team.Team2), HeroOf(ArrayElement()) == Hero.Zenyatta)) > 0 ? Hero.WreckingBall : Hero.Bastion);
}
isDead = true;
hasBadStatus = false;
botDoesUniqueBehaviour = false;
DisableNameplates(EventPlayer(), AllPlayers(Team.Team1));
# BOT HAS 1 EFFECT IN VAR (NOT ARRAY)
SkipIf(!EntityExists(botEffects), 1);
DestroyEffect(botEffects);
# BOT HAS MORE THEN 1 EFFECT IN VAR (ARRAY)
SkipIf(CountOf(botEffects) == 0, 3);
for (botLoopIterator1 = 0; CountOf(botEffects); 1)
{
DestroyEffect(botEffects[botLoopIterator1]);
}
}
disabled rule: "=== BOT COMMON MECHANICS ==="
{
}
rule: "BOT: BAD STATUS"
Event.OngoingPlayer
Team.Team2
if (IsDummyBot(EventPlayer()) == true)
if (HasSpawned(EventPlayer()) == true)
if (IsAlive(EventPlayer()) == true)
if (hasBadStatus == false)
if ((HasStatus(EventPlayer(), Status.Hacked) || HasStatus(EventPlayer(), Status.Frozen) || HasStatus(EventPlayer(), Status.KnockedDown) || HasStatus(EventPlayer(), Status.Asleep) || HasStatus(EventPlayer(), Status.Stunned)) == true)
{
hasBadStatus = true;
# PROCESS BAD STATUS
if (HeroOf(EventPlayer()) == Hero.Widowmaker)
{
async! BotWidowBadStatus();
}
WaitUntil(!HasStatus(EventPlayer(), Status.KnockedDown) && !HasStatus(EventPlayer(), Status.Asleep) && !HasStatus(EventPlayer(), Status.Frozen) && !HasStatus(EventPlayer(), Status.Stunned), 15);
hasBadStatus = false;
}
void BotLandingFromSky() "SUBROUTINE: BOT - LANDING FROM SKY"
{
StopThrottleInDirection(EventPlayer());
# SET RESPAWN POSITION
botEventPosition = RandomValueInArray(bigBossSpawnPositions);
# CREATE EFFECTS
CreateEffect(AllPlayers(Team.Team1), Effect.LightShaft, Color.Red, botEventPosition, 3, EffectRev.VisibleTo);
botEffects[0] = LastCreatedEntity();
# RESPAWN IN LIGHT SHAFT EFFECT
Teleport(EventPlayer(), botEventPosition + Vector(0, 25, 0));
Wait(0.1, WaitBehavior.IgnoreCondition);
# SLOW LANDING
SetGravity(EventPlayer(), 50);
while (IsInAir(EventPlayer()) == true)
{
PlayEffect(AllPlayers(Team.Team1), PlayEffect.GoodPickupEffect, Color.Orange, PositionOf(EventPlayer()) + Vector(0, -2.7, 0), 2);
Wait(0.25, WaitBehavior.IgnoreCondition);
}
SetGravity(EventPlayer(), 100);
DestroyEffect(botEffects[0]);
# LANDING EFFECTS
PlayEffect(AllPlayers(Team.Team1), PlayEffect.WreckingBallPiledriverImpactEffect, CustomColor(105, 87, 46, 255), PositionOf(EventPlayer()), 8);
PlayEffect(AllPlayers(Team.Team1), PlayEffect.DoomfistMeteorStrikeImpactSound, Color.White, PositionOf(EventPlayer()), 150);
}
void BotAppearFromUnderground() "SUBROUTINE: BOT - APPEAR FROM UNDERGROUND"
{
SetStatus(EventPlayer(), null, Status.KnockedDown, 1);
Wait(0.2, WaitBehavior.IgnoreCondition);
SetGravity(EventPlayer(), 20);
DisableMovementCollisionWithEnvironment(EventPlayer(), true);
Teleport(EventPlayer(), zenSpawnPositions[RandomInteger(Min(timeMinutes, CountOf(zenSpawnPositions) - 10), Min(spawnPositionMaxId, CountOf(zenSpawnPositions) - 4))] + Vector(0, -1.5, 0));
Wait(0.1, WaitBehavior.IgnoreCondition);
PlayEffect(AllPlayers(Team.Team1), PlayEffect.SigmaAccretionImpactEffect, CustomColor(220, 175, 100, 255), EyePosition(EventPlayer()), 3);
PlayEffect(AllPlayers(Team.Team1), PlayEffect.SigmaAccretionImpactSound, Color.Gray, EyePosition(EventPlayer()), 50);
ApplyImpulse(EventPlayer(), Up(), 3.5, Relative.ToWorld, ContraryMotion.Cancel);
Wait(0.4, WaitBehavior.IgnoreCondition);
ClearStatus(EventPlayer(), Status.KnockedDown);
SetGravity(EventPlayer(), 100);
EnableMovementCollisionWithEnvironment(EventPlayer());
}
disabled rule: "=== PLAYER MECHANICS ==="
{
}
rule: "PLAYER: HEALTH REGEN"
Event.OnDamageTaken
Team.Team1
{
StopHealOverTime(healOverTimeId);
eventHealth = Health(EventPlayer());
Wait(4, WaitBehavior.IgnoreCondition);
# TOOK DAMAGE, RESET REGENERATION TIMER
LoopIf(IsAlive(EventPlayer()) && eventHealth > Health(EventPlayer()));
StartHealOverTime(EventPlayer(), null, 3, MaxHealth(EventPlayer()) / 3);
healOverTimeId = LastHealOverTime();
}
disabled rule: "=== ZENYATTA ==="
{
}
rule: "BOT: ZEN - REACHED THE GATE"
Event.OngoingPlayer
Team.Team2
Player.Zenyatta
if (IsDummyBot(EventPlayer()) == true)
if (HasSpawned(EventPlayer()) == true)
if (IsAlive(EventPlayer()) == true)
if (isRespawning == false)
if (botIsPathFinding == false)
{
SetAmmo(EventPlayer(), 0, 0);
Communicate(EventPlayer(), Communication.Hello);
Wait(1.5, WaitBehavior.IgnoreCondition);
AbortIf(IsDead(EventPlayer()) == true);
Kill(EventPlayer(), null);
}
rule: "BOT: ZEN - DEATH"
Event.OnDeath
Team.Team2
Player.Zenyatta
{
# EFFECT
PlayEffect(AllPlayers(Team.Team1), PlayEffect.JunkratFragLauncherExplosionEffect, Color.Red, EyePosition(EventPlayer()), 2.5);
PlayEffect(AllPlayers(Team.Team1), PlayEffect.AsheDynamiteExplosionSound, Color.Red, EyePosition(EventPlayer()), 70);
# DAMAGE AND APPLY IMPULSE TO PLAYERS
botPlayersInRadius = PlayersWithinRadius(PositionOf(EventPlayer()), 2.5, Team.All, RadiusLOS.SurfacesAndEnemyBarriers);
for (botLoopIterator1 = 0; CountOf(botPlayersInRadius); 1)
{
ApplyImpulse(botPlayersInRadius[botLoopIterator1], DirectionTowards(PositionOf(EventPlayer()), EyePosition(botPlayersInRadius[botLoopIterator1])), 5, Relative.ToWorld, ContraryMotion.Incorporate);
if (TeamOf(botPlayersInRadius[botLoopIterator1]) == Team.Team1)
{
Damage(botPlayersInRadius[botLoopIterator1], EventPlayer(), 50);
}
}
# DAMAGE GATE
if (DistanceBetween(PositionOf(EventPlayer()), gatePosition) < 3 && IsInLineOfSight(EyePosition(EventPlayer()), gatePosition, BarrierLOS.EnemyBarriersBlock))
{
if (isBoss[0] == 1)
{
gateHealth -= 125;
}
else
{
gateHealth -= 25 + 5 * time5Minutes;
}
async GateProgressBarColor();
Respawn(EventPlayer());
Abort();
}
# KILLED BY PLAYER
Teleport(EventPlayer(), Vector(0, -999, 0));
Wait(2, WaitBehavior.IgnoreCondition);
Respawn(EventPlayer());
Wait(2, WaitBehavior.IgnoreCondition);
}
void BotZenyattaRespawn() "SUBROUTINE: ZEN - RESPAWN"
{
BotAppearFromUnderground();
botTargetPosition = gatePosition;
botIsPathFinding = true;
async! BotStartPathFinding();
StartFacing(EventPlayer(), DirectionTowards(PositionOf(EventPlayer()), botNextNodePosition), 360, Relative.ToWorld, FacingRev.DirectionAndTurnRate);
}
disabled rule: "=== WRECKING BALL ==="
{
}
rule: "BOT: BALL - REACHED THE GATE"
Event.OngoingPlayer
Team.Team2
Player.WreckingBall
if (IsDummyBot(EventPlayer()) == true)
if (HasSpawned(EventPlayer()) == true)
if (IsAlive(EventPlayer()) == true)
if (isRespawning == false)
if (botIsPathFinding == false)
{
StartHoldingButton(EventPlayer(), Button.Ability1);
SetAmmo(EventPlayer(), 0, 0);
Wait(1, WaitBehavior.IgnoreCondition);
SetUltimateCharge(EventPlayer(), 100);
StartHoldingButton(EventPlayer(), Button.Ultimate);
WaitUntil(IsUsingUltimate(EventPlayer()), 0.6);
AbortIf(IsDead(EventPlayer()));
Kill(EventPlayer(), null);
PlayEffect(AllPlayers(Team.Team1), PlayEffect.JunkratRipTireExplosionEffect, Color.Orange, EyePosition(EventPlayer()), 6);
PlayEffect(AllPlayers(Team.Team1), PlayEffect.DvaSelfDestructExplosionSound, Color.White, EyePosition(EventPlayer()), 250);
if (DistanceBetween(PositionOf(EventPlayer()), gatePosition) < 3.5 && IsInLineOfSight(EyePosition(EventPlayer()), gatePosition, BarrierLOS.EnemyBarriersBlock))
{
if (isBoss[0] == 1)
{
gateHealth -= 300;
}
else if (isBoss[1] == 1)
{
gateHealth -= 50;
}
else
{
gateHealth -= 150 + 10 * time5Minutes;
}
async GateProgressBarColor();
}
Damage(PlayersWithinRadius(EyePosition(EventPlayer()), 5, Team.Team1, RadiusLOS.SurfacesAndAllBarriers), EventPlayer(), 100);
}
rule: "BOT: BALL - ALTERNATIVE FORM"
Event.OngoingPlayer
Team.Team2
Player.WreckingBall
if (IsDummyBot(EventPlayer()) == true)
if (HasSpawned(EventPlayer()) == true)
if (IsInAlternateForm(EventPlayer()) == false)
{
StartHoldingButton(EventPlayer(), Button.Ability1);
WaitUntil(IsInAlternateForm(EventPlayer()), 10);
StopHoldingButton(EventPlayer(), Button.Ability1);
}
rule: "BOT: BALL - DEATH"
Event.OnDeath
Team.Team2
Player.WreckingBall
{
StopHoldingButton(EventPlayer(), Button.Ability1);
StopHoldingButton(EventPlayer(), Button.Ultimate);
}
void BotBallRespawn() "SUBROUTINE: BALL - RESPAWN"
{
# RESPAWN IN AIR
Teleport(EventPlayer(), RandomValueInArray(ballSpawnPositions) + Vector(0, 20, 0));
StopHoldingButton(EventPlayer(), Button.Ultimate);
Wait(0.25, WaitBehavior.IgnoreCondition);
# LANDING
StartHoldingButton(EventPlayer(), Button.Crouch);
WaitUntil(IsOnGround(EventPlayer()), 9999);
StopHoldingButton(EventPlayer(), Button.Crouch);
# LANDING IMPACT EFFECT
PlayEffect(AllPlayers(Team.Team1), PlayEffect.SigmaAccretionImpactSound, Color.White, EventPlayer(), 150);
PlayEffect(AllPlayers(Team.Team1), PlayEffect.DoomfistMeteorStrikeImpactEffect, Color.Gray, PositionOf(EventPlayer()), 10);
CreateEffect(AllPlayers(Team.Team1), Effect.BadAura, Color.Orange, EyePosition(EventPlayer()), 1.5, EffectRev.VisibleToPositionAndRadius);
botEffects[0] = LastCreatedEntity();
# PATH FINDING TO GATE
botTargetPosition = gatePosition;
botIsPathFinding = true;
async! BotStartPathFinding();
}
disabled rule: "=== ECHO ==="
{
}
rule: "BOT: ECHO - FLY ABILITY"
Event.OngoingPlayer
Team.Team2
Player.Echo
if (IsDummyBot(EventPlayer()) == true)
if (HasSpawned(EventPlayer()) == true)
if (IsAlive(EventPlayer()) == true)
if (isRespawning == false)
if (botIsPathFinding == false)
if (IsUsingAbility1(EventPlayer()) == false)
{
SetAbilityCooldown(EventPlayer(), Button.Ability1, 0);
PressButton(EventPlayer(), Button.Ability1);
Wait(0.3, WaitBehavior.IgnoreCondition);
LoopIfConditionIsTrue();
}
rule: "BOT: ECHO - BEAM ABILITY"
Event.OngoingPlayer
Team.Team2
Player.Echo
if (IsDummyBot(EventPlayer()) == true)
if (HasSpawned(EventPlayer()) == true)
if (IsAlive(EventPlayer()) == true)
if (isRespawning == false)
if (IsUsingAbility1(EventPlayer()) == false)
if (botDoesUniqueBehaviour == true)
{
SetAbilityCooldown(EventPlayer(), Button.Ability2, 0);
PressButton(EventPlayer(), Button.Ability2);
}
rule: "BOT: ECHO - BAD STATUS - RESET BEAM"
Event.OngoingPlayer
Team.Team2
if (IsDummyBot(EventPlayer()) == true)
if (HasSpawned(EventPlayer()) == true)
if (IsAlive(EventPlayer()) == true)
if (isRespawning == false)
if (hasBadStatus == true)
{
if (botDoesUniqueBehaviour)
{
BotEchoDetachPlayer();
}
WaitUntil(hasBadStatus, 7);
}
rule: "BOT: ECHO - CAN'T SEE PORTAL - APPLY IMPULSE"
Event.OngoingPlayer
Team.Team2
Player.Echo
if (IsDummyBot(EventPlayer()) == true)
if (HasSpawned(EventPlayer()) == true)
if (IsAlive(EventPlayer()) == true)
if (isRespawning == false)
if (botDoesUniqueBehaviour == true)
if (IsInLineOfSight(PositionOf(EventPlayer()), botEchoRespawnPosition, BarrierLOS.NoBarriersBlock) == false)
{
Wait(0.3, WaitBehavior.AbortWhenFalse);
ApplyImpulse(EventPlayer(), Vector(RandomInteger(-1, 1), 1, RandomInteger(-1, 1)), 20, Relative.ToWorld, ContraryMotion.Incorporate);
Wait(1, WaitBehavior.IgnoreCondition);
if (!IsInLineOfSight(PositionOf(EventPlayer()), botEchoRespawnPosition, BarrierLOS.NoBarriersBlock))
{
botTargetPosition = botEchoRespawnPosition;
async BotStartPathFinding();
}
else
{
BotResetPathFinding();
}
LoopIfConditionIsTrue();
}
rule: "BOT: ECHO - MAIN LOGIC - LOOP"
Event.OngoingPlayer
Team.Team2
Player.Echo
if (IsDummyBot(EventPlayer()) == true)
if (HasSpawned(EventPlayer()) == true)
if (IsAlive(EventPlayer()) == true)
if (isRespawning == false)
{
if (botDoesUniqueBehaviour == false)
{
botSeePlayer = SortedArray(FilteredArray(AllLivingPlayers(Team.Team1), HasSpawned(ArrayElement()) == true && ArrayElement().isInMenu[0] == false && (HeroOf(ArrayElement()) == Hero.Sombra && IsUsingAbility1(ArrayElement())) == false && IsInLineOfSight(EyePosition(EventPlayer()), EyePosition(ArrayElement()), BarrierLOS.NoBarriersBlock) == true), DistanceBetween(PositionOf(EventPlayer()), PositionOf(ArrayElement())))[0];
}
# TELEPORT PLAYER SO FAR
if (botDoesUniqueBehaviour && DistanceBetween(PositionOf(botEchoCapturedPlayer), botEchoRespawnPosition) < 4)
{
PlayEffect(AllPlayers(Team.Team1), PlayEffect.BadPickupEffect, Color.White, botEchoRespawnPosition, 1);
Teleport(botEchoCapturedPlayer, RandomValueInArray(botEchoTeleportPositions));
SetStatus(botEchoCapturedPlayer, EventPlayer(), Status.KnockedDown, 1);
BotEchoDetachPlayer();
}
# BEGIN TO FLY TO THE PORTAL WITH A PLAYER
if (botDoesUniqueBehaviour)
{
StartFacing(EventPlayer(), DirectionTowards(EyePosition(EventPlayer()), botEchoRespawnPosition), 100, Relative.ToWorld, FacingRev.DirectionAndTurnRate);
# BOT SEES THE PORTAL
if (IsInLineOfSight(PositionOf(EventPlayer()), botEchoRespawnPosition, BarrierLOS.NoBarriersBlock))
{
# RESET PATH FINDING
if (botIsPathFinding)
{
BotResetPathFinding();
}
StartThrottleInDirection(EventPlayer(), DirectionTowards(EyePosition(EventPlayer()), botEchoRespawnPosition), 1, Relative.ToWorld, ThrottleBehavior.ReplaceExistingThrottle, ThrottleRev.DirectionAndMagnitude);
}
else if (!botIsPathFinding)
{
botTargetPlayer = botEchoCapturedPlayer;
StopHoldingButton(EventPlayer(), Button.Jump);
async BotStartPathFinding();
}
}
Wait(0.5, WaitBehavior.IgnoreCondition);
LoopIfConditionIsTrue();
}
rule: "BOT: ECHO - DEFEND PORTAL"
Event.OngoingPlayer
Team.Team2
Player.Echo
if (IsDummyBot(EventPlayer()) == true)
if (HasSpawned(EventPlayer()) == true)
if (IsAlive(EventPlayer()) == true)
if (botSeePlayer == null)
if (isRespawning == false)
if (botIsPathFinding == false)
if (botDoesUniqueBehaviour == false)
{
BotEchoFlyToPortal();
}
rule: "BOT: ECHO - CAN SEE PLAYER"
Event.OngoingPlayer
Team.Team2
Player.Echo
if (IsDummyBot(EventPlayer()) == true)
if (HasSpawned(EventPlayer()) == true)
if (IsAlive(EventPlayer()) == true)
if (botSeePlayer != null)
if (isRespawning == false)
if (botDoesUniqueBehaviour == false)
if (IsInLineOfSight(EyePosition(EventPlayer()), EyePosition(botSeePlayer), BarrierLOS.NoBarriersBlock) == true)
if (botSeePlayer.isInMenu[0] == false)
{
if (botIsPathFinding)
{
BotResetPathFinding();
}
BotEchoFlyToPlayer();
}
rule: "BOT: ECHO - PATH FINDING TO PLAYER"
Event.OngoingPlayer
Team.Team2
Player.Echo
if (IsDummyBot(EventPlayer()) == true)
if (HasSpawned(EventPlayer()) == true)
if (IsAlive(EventPlayer()) == true)
if (botSeePlayer != null)
if (isRespawning == false)
if (botIsPathFinding == false)
if (botDoesUniqueBehaviour == false)
if (IsInLineOfSight(EyePosition(EventPlayer()), EyePosition(botSeePlayer), BarrierLOS.NoBarriersBlock) == false)
{
botTargetPlayer = botSeePlayer;
StopHoldingButton(EventPlayer(), Button.Jump);
BotStartPathFinding();
}
rule: "BOT: ECHO - ATTACH PLAYER BY BEAM"
Event.OngoingPlayer
Team.Team2
Player.Echo
if (IsDummyBot(EventPlayer()) == true)
if (HasSpawned(EventPlayer()) == true)
if (IsAlive(EventPlayer()) == true)
if (hasBadStatus == false)
if (botSeePlayer != null)
if (isRespawning == false)
if (botEchoCapturedPlayer == null)
if (botDoesUniqueBehaviour == false)
if (IsInLineOfSight(EyePosition(EventPlayer()), EyePosition(botSeePlayer), BarrierLOS.NoBarriersBlock) == true)
if (DistanceBetween(PositionOf(EventPlayer()), PositionOf(botSeePlayer)) < 3)
{
botDoesUniqueBehaviour = true;
botEchoCapturedPlayer = botSeePlayer;
SetStatus(botEchoCapturedPlayer, EventPlayer(), Status.Stunned, 0.7);
SetStatus(botEchoCapturedPlayer, EventPlayer(), Status.Hacked, 10);
AttachPlayers(botEchoCapturedPlayer, EventPlayer(), Vector(0, 0, 2));
PressButton(EventPlayer(), Button.Ability2);
}
rule: "BOT: ECHO - PLAYER DEAD"
Event.OngoingPlayer
Team.Team2
Player.Echo
if (IsDummyBot(EventPlayer()) == true)
if (HasSpawned(EventPlayer()) == true)
if (IsAlive(EventPlayer()) == true)
if (isRespawning == false)
if (IsDead(botEchoCapturedPlayer) != null)
{
if (botDoesUniqueBehaviour)
{
BotEchoDetachPlayer();
}
if (botIsPathFinding)
{
BotResetPathFinding();
}
BotEchoFlyToPortal();
}
rule: "BOT: ECHO - DEATH"
Event.OnDeath
Team.Team2
Player.Echo
{
BotEchoDetachPlayer();
StopHoldingButton(EventPlayer(), Button.Jump);
Wait(5, WaitBehavior.IgnoreCondition);
Teleport(EventPlayer(), Vector(0, 999, 0));
ForcePlayerHero(EventPlayer(), Hero.Orisa);
}
void BotEchoRespawn() "SUBROUTINE: ECHO - RESPAWN"
{
botCounter = 0;
botEffects = [];
CreateEffect(AllPlayers(Team.Team1), Effect.GoodAura, Color.SkyBlue, botEchoRespawnPosition, botCounter, EffectRev.VisibleToPositionAndRadius);
ModifyVariable(botEffects, Operation.AppendToArray, LastCreatedEntity());
CreateEffect(AllPlayers(Team.Team1), Effect.BadAura, Color.SkyBlue, botEchoRespawnPosition, botCounter, EffectRev.VisibleToPositionAndRadius);
ModifyVariable(botEffects, Operation.AppendToArray, LastCreatedEntity());
CreateEffect(AllPlayers(Team.Team1), Effect.EnergySound, Color.White, botEchoRespawnPosition, 200, EffectRev.VisibleTo);
ModifyVariable(botEffects, Operation.AppendToArray, LastCreatedEntity());
ChaseVariableOverTime(botCounter, 3, 0.8, TimeChaseReevaluation.DestinationAndDuration);
PlayEffect(AllPlayers(Team.Team1), PlayEffect.JunkratRipTireExplosionEffect, Color.SkyBlue, botEchoRespawnPosition, 12);
PlayEffect(AllPlayers(Team.Team1), PlayEffect.SombraEmpExplosionSound, null, botEchoRespawnPosition, 100);
Wait(3, WaitBehavior.IgnoreCondition);
Teleport(EventPlayer(), botEchoRespawnPosition);
PlayEffect(AllPlayers(Team.Team1), PlayEffect.GoodExplosion, Color.White, botEchoRespawnPosition, 2.5);
PlayEffect(AllPlayers(Team.Team1), PlayEffect.DebuffImpactSound, null, botEchoRespawnPosition, 100);
}
void BotEchoFlyToPlayer() "SUBROUTINE: ECHO - FLY TO PLAYER"
{
StartFacing(EventPlayer(), DirectionTowards(EyePosition(EventPlayer()), EyePosition(botSeePlayer)), 300, Relative.ToWorld, FacingRev.DirectionAndTurnRate);
StartThrottleInDirection(EventPlayer(), DirectionTowards(EyePosition(EventPlayer()), EyePosition(botSeePlayer)), 1, Relative.ToWorld, ThrottleBehavior.ReplaceExistingThrottle, ThrottleRev.DirectionAndMagnitude);
StopHoldingButton(EventPlayer(), Button.Jump);
}
void BotEchoFlyToPortal() "SUBROUTINE: ECHO - FLY TO PORTAL"
{
StartFacing(EventPlayer(), DirectionTowards(EyePosition(EventPlayer()), botEchoRespawnPosition), 100, Relative.ToWorld, FacingRev.DirectionAndTurnRate);
StartThrottleInDirection(EventPlayer(), DirectionTowards(EyePosition(EventPlayer()), botEchoRespawnPosition), 1, Relative.ToWorld, ThrottleBehavior.ReplaceExistingThrottle, ThrottleRev.DirectionAndMagnitude);
StartHoldingButton(EventPlayer(), Button.Jump);
}
void BotEchoDetachPlayer() "SUBROUTINE: ECHO - DETACH PLAYER"
{
DetachPlayers(botEchoCapturedPlayer);
ClearStatus(botEchoCapturedPlayer, Status.Hacked);
# IF PLAYER INSIDE THE WALL
if (IsInLineOfSight(EyePosition(EventPlayer()), EyePosition(botEchoCapturedPlayer), BarrierLOS.NoBarriersBlock))
{
Teleport(botEchoCapturedPlayer, PositionOf(EventPlayer()));
}
botDoesUniqueBehaviour = false;
botEchoCapturedPlayer = null;
}
disabled rule: "=== REINHARDT ==="
{
}
rule: "BOT: REIN - SET PLAYER AS TARGET"
Event.OngoingPlayer
Team.Team2
Player.Reinhardt
if (IsDummyBot(EventPlayer()) == true)
if (HasSpawned(EventPlayer()) == true)
if (IsAlive(EventPlayer()) == true)
if (isRespawning == false)
# CAN SEE PLAYER
if (IsTrueForAny(FilteredArray(AllLivingPlayers(Team.Team1), HasSpawned(ArrayElement()) && ArrayElement().isInMenu[0] == false && (HeroOf(ArrayElement()) == Hero.Sombra && IsUsingAbility1(ArrayElement())) == false), IsInLineOfSight(EyePosition(EventPlayer()), EyePosition(ArrayElement()), BarrierLOS.NoBarriersBlock)) == true)
{
BotResetPathFinding();
# SET CLOSEST PLAYER TO BOT AS TARGET AND FOLLOW HIM
botTargetPlayer = SortedArray(FilteredArray(AllLivingPlayers(Team.Team1), HasSpawned(ArrayElement()) == true && ArrayElement().isInMenu[0] == false && (HeroOf(ArrayElement()) == Hero.Sombra && IsUsingAbility1(ArrayElement())) == false && IsInLineOfSight(EyePosition(EventPlayer()), EyePosition(ArrayElement()), BarrierLOS.NoBarriersBlock) == true), DistanceBetween(PositionOf(EventPlayer()), PositionOf(ArrayElement())))[0];
StartFacing(EventPlayer(), DirectionTowards(PositionOf(EventPlayer()), PositionOf(botTargetPlayer)), 360, Relative.ToWorld, FacingRev.DirectionAndTurnRate);
async BotStartPathFinding();
}
rule: "BOT: REIN - SET GATE AS TARGET"
Event.OngoingPlayer
Team.Team2
Player.Reinhardt
if (IsDummyBot(EventPlayer()) == true)
if (HasSpawned(EventPlayer()) == true)
if (IsAlive(EventPlayer()) == true)
if (isRespawning == false)
# BOT DOESN'T FOLLOW PLAYER
if (botTargetPlayer == -1)
{
BotResetPathFinding();
# SET GATE AS TARGET
botTargetPosition = gatePosition;
StartFacing(EventPlayer(), DirectionTowards(PositionOf(EventPlayer()), botNextNodePosition), 360, Relative.ToWorld, FacingRev.DirectionAndTurnRate);
async BotStartPathFinding();
}
rule: "BOT: REIN - TARGET DEAD"
Event.OngoingPlayer
Team.Team2
Player.Reinhardt
if (IsDummyBot(EventPlayer()) == true)
if (HasSpawned(EventPlayer()) == true)
if (IsAlive(EventPlayer()) == true)
if (isRespawning == false)
if (botTargetPlayer != -1)
if ((IsDead(botTargetPlayer) || botTargetPlayer.isInMenu[0] || HeroOf(botTargetPlayer) == Hero.Sombra && IsUsingAbility1(botTargetPlayer)) == true)
{
BotResetPathFinding();
}
rule: "BOT: REIN - ATTACK TARGET"
Event.OngoingPlayer
Team.Team2
Player.Reinhardt
if (IsDummyBot(EventPlayer()) == true)
if (HasSpawned(EventPlayer()) == true)
if (IsAlive(EventPlayer()) == true)
if (isRespawning == false)
# CAN ATTACK TARGET
if (DistanceBetween(PositionOf(EventPlayer()), botTargetPlayer != -1 ? PositionOf(botTargetPlayer) : gatePosition) < 4)
{
StartHoldingButton(EventPlayer(), Button.PrimaryFire);
StopHoldingButton(EventPlayer(), Button.SecondaryFire);
# TARGET IS PLAYER
AbortIf(botTargetPlayer != -1);
if (isBoss[0] == 1)
{
# TARGET IS GATE
gateHealth -= 25 + 10 * time10Minutes;
}
else if (isBoss[1] == 1)
{
gateHealth -= 5;
}
else
{
gateHealth -= 5 + 5 * time5Minutes;
}
async GateProgressBarColor();
Wait(0.9, WaitBehavior.IgnoreCondition);
LoopIfConditionIsTrue();
}
rule: "BOT: REIN - STOP ATTACK TARGET"
Event.OngoingPlayer
Team.Team2
Player.Reinhardt
if (IsDummyBot(EventPlayer()) == true)
if (HasSpawned(EventPlayer()) == true)
if (IsAlive(EventPlayer()) == true)
if (isRespawning == false)
# CAN ATTACK TARGET
if (DistanceBetween(PositionOf(EventPlayer()), botTargetPlayer != -1 ? PositionOf(botTargetPlayer) : gatePosition) > 4)
{
StopHoldingButton(EventPlayer(), Button.PrimaryFire);
}
rule: "BOT: REIN - USE SHIELD"
Event.OnDamageTaken
Team.Team2
Player.Reinhardt
if (isBoss[1] == false)
if (DistanceBetween(PositionOf(EventPlayer()), PositionOf(botTargetPlayer)) > 3)
{
StartFacing(EventPlayer(), DirectionTowards(EyePosition(EventPlayer()), EyePosition(Attacker())), 200, Relative.ToWorld, FacingRev.DirectionAndTurnRate);
StartHoldingButton(EventPlayer(), Button.SecondaryFire);
WaitUntil(DistanceBetween(PositionOf(EventPlayer()), PositionOf(botTargetPlayer)) < 3, 3);
StopHoldingButton(EventPlayer(), Button.SecondaryFire);
}
rule: "BOT: REIN - CHARGE IN GATE"
Event.OngoingPlayer
Team.Team2
Player.Reinhardt
if (IsDummyBot(EventPlayer()) == true)
if (HasSpawned(EventPlayer()) == true)
if (IsAlive(EventPlayer()) == true)
if (isRespawning == false)
if (botTargetPlayer == -1)
if (IsUsingAbility1(EventPlayer()) == false)
if (IsInLineOfSight(EyePosition(EventPlayer()), gatePosition, BarrierLOS.NoBarriersBlock) == true)
if (IsInViewAngle(EventPlayer(), gatePosition, 7.5) == true)
{
StartHoldingButton(EventPlayer(), Button.Ability1);
WaitUntil(IsUsingAbility1(EventPlayer()), 1);
StopHoldingButton(EventPlayer(), Button.Ability1);
}
rule: "BOT: REIN - DEATH"
Event.OngoingPlayer
Team.Team2
Player.Reinhardt
{
StopHoldingButton(EventPlayer(), Button.PrimaryFire);
StopHoldingButton(EventPlayer(), Button.SecondaryFire);
}
void BotReinRespawn() "SUBROUTINE: REIN - RESPAWN"
{
BotAppearFromUnderground();
StartFacing(EventPlayer(), DirectionTowards(PositionOf(EventPlayer()), botNextNodePosition), 360, Relative.ToWorld, FacingRev.DirectionAndTurnRate);
}
disabled rule: "=== WIDOW ==="
{
}
rule: "BOT: WIDOW - SEE PLAYER"
Event.OngoingPlayer
Team.Team2
Player.Widowmaker
if (IsDummyBot(EventPlayer()) == true)
if (HasSpawned(EventPlayer()) == true)
if (IsAlive(EventPlayer()) == true)
if (IsReloading(EventPlayer()) == false)
if (botSeePlayer == null)
if (hasBadStatus == false)
# CAN SEE PLAYER
if (IsTrueForAny(FilteredArray(AllLivingPlayers(Team.Team1), HasSpawned(ArrayElement()) && ArrayElement().isInMenu[0] == false && (HeroOf(ArrayElement()) == Hero.Sombra && IsUsingAbility1(ArrayElement())) == false), IsInLineOfSight(EyePosition(EventPlayer()), EyePosition(ArrayElement()), BarrierLOS.NoBarriersBlock)) == true)
{
botSeePlayer = SortedArray(FilteredArray(AllLivingPlayers(Team.Team1), HasSpawned(ArrayElement()) == true && ArrayElement().isInMenu[0] == false && (HeroOf(ArrayElement()) == Hero.Sombra && IsUsingAbility1(ArrayElement())) == false && IsInLineOfSight(EyePosition(EventPlayer()), EyePosition(ArrayElement()), BarrierLOS.NoBarriersBlock) == true), DistanceBetween(PositionOf(EventPlayer()), PositionOf(ArrayElement())))[0];
botWidowShotTime = TotalTimeElapsed() + (timeMinutes >= 9 ? RandomReal(2, 5) : RandomReal(5, 10));
StartFacing(EventPlayer(), DirectionTowards(EyePosition(EventPlayer()), EyePosition(botSeePlayer)), 9999, Relative.ToWorld, FacingRev.DirectionAndTurnRate);
}
rule: "BOT: WIDOW - SHOOT"
Event.OngoingPlayer
Team.Team2
Player.Widowmaker
if (IsDummyBot(EventPlayer()) == true)
if (HasSpawned(EventPlayer()) == true)
if (IsAlive(EventPlayer()) == true)
if (IsReloading(EventPlayer()) == false)
if (botSeePlayer != null)
if (hasBadStatus == false)
if (TotalTimeElapsed() >= botWidowShotTime)
{
PressButton(EventPlayer(), Button.PrimaryFire);
StopFacing(EventPlayer());
botSeePlayer = null;
}
rule: "BOT: WIDOW - Aim Sound"
Event.OngoingPlayer
Team.Team1
if (IsAlive(EventPlayer()) == true)
if (IsInLineOfSight(EyePosition(PlayersOnHero(Hero.Widowmaker, Team.Team2)), EyePosition(EventPlayer()), BarrierLOS.NoBarriersBlock) == true)
if (IsAlive(PlayersOnHero(Hero.Widowmaker, Team.Team2)) == true)
if (PlayersOnHero(Hero.Widowmaker, Team.Team2).botSeePlayer == true)
{
PlayEffect(EventPlayer(), PlayEffect.ExplosionSound, Color.White, EventPlayer(), 100);
Wait(1, WaitBehavior.AbortWhenFalse);
LoopIfConditionIsTrue();
}
rule: "BOT: WIDOW - TELEPORT TO NEW POSITION"
Event.OngoingPlayer
Team.Team2
Player.Widowmaker
if (IsDummyBot(EventPlayer()) == true)
if (HasSpawned(EventPlayer()) == true)
if (IsAlive(EventPlayer()) == true)
if (hasBadStatus == false)
if (TotalTimeElapsed() >= botWidowTeleportTime)
{
botWidowTeleportTime = TotalTimeElapsed() + 28;
botWidowShotTime = TotalTimeElapsed() + (timeMinutes >= 9 ? RandomReal(1, 3) : RandomReal(3, 6));
PlayEffect(AllPlayers(Team.Team1), PlayEffect.BadPickupEffect, Color.White, EventPlayer(), 1);
Wait(0.1, WaitBehavior.IgnoreCondition);
Teleport(EventPlayer(), FilteredArray(sniperPositions, DistanceBetween(botEventPosition, ArrayElement()) > 5)[RandomInteger(0, CountOf(sniperPositions) - 2)]);
Wait(0.1, WaitBehavior.IgnoreCondition);
botEventPosition = PositionOf(EventPlayer());
SetFacing(EventPlayer(), DirectionTowards(EyePosition(EventPlayer()), ObjectivePosition(2)), Relative.ToWorld);
PlayEffect(AllPlayers(Team.Team1), PlayEffect.GoodPickupEffect, Color.White, EventPlayer(), 2);
PlayEffect(AllPlayers(Team.Team1), PlayEffect.DebuffImpactSound, Color.White, EventPlayer(), 100);
}
rule: "BOT: WIDOW - DEATH"
Event.OnDeath
Team.Team2
Player.Widowmaker
{
StopHoldingButton(EventPlayer(), Button.SecondaryFire);
Wait(0.25, WaitBehavior.IgnoreCondition);
DestroyEffect(botEffects[0]);
}
void BotWidowRespawn() "SUBROUTINE: WIDOW - RESPAWN"
{
# RESPAWN ON RANDOM SNIPER POSITION
Teleport(EventPlayer(), FilteredArray(sniperPositions, DistanceBetween(botEventPosition, ArrayElement()) > 5)[RandomInteger(0, CountOf(sniperPositions) - 2)]);
Wait(0.1, WaitBehavior.IgnoreCondition);
botEventPosition = PositionOf(EventPlayer());
PlayEffect(AllPlayers(Team.Team1), PlayEffect.GoodPickupEffect, Color.White, EventPlayer(), 2);
PlayEffect(AllPlayers(Team.Team1), PlayEffect.DebuffImpactSound, Color.White, EventPlayer(), 100);
SetFacing(EventPlayer(), DirectionTowards(EyePosition(EventPlayer()), ObjectivePosition(2)), Relative.ToWorld);
Wait(0.7, WaitBehavior.IgnoreCondition);
StartHoldingButton(EventPlayer(), Button.SecondaryFire);
CreateBeamEffect(AllPlayers(Team.All), BeamType.TorbjornTurretSightBeam, EyePosition(EventPlayer()), UpdateEveryFrame(RayCastHitPosition(EyePosition(EventPlayer()), EyePosition(EventPlayer()) + FacingDirectionOf(EventPlayer()) * 999, null, EventPlayer(), false)), Color.Red, EffectRev.VisibleToPositionAndRadius);
botEffects[0] = LastCreatedEntity();
WaitUntil(IsDead(EventPlayer()), 99999);
DestroyEffect(botEffects[0]);
}
void BotWidowBadStatus() "SUBROUTINE: WIDOW - BAD STATUS"
{
StopFacing(EventPlayer());
DestroyEffect(botEffects[0]);
WaitUntil(!hasBadStatus, 15);
CreateBeamEffect(AllPlayers(Team.All), BeamType.TorbjornTurretSightBeam, EyePosition(EventPlayer()), UpdateEveryFrame(RayCastHitPosition(EyePosition(EventPlayer()), EyePosition(EventPlayer()) + FacingDirectionOf(EventPlayer()) * 999, null, EventPlayer(), false)), Color.Red, EffectRev.VisibleToPositionAndRadius);
botEffects[0] = LastCreatedEntity();
}
disabled rule: "=== BASTION ==="
{
}
rule: "BOT: BASTION - MAIN LOGIC - LOOP"
Event.OngoingPlayer
Team.Team2
Player.Bastion
if (IsDummyBot(EventPlayer()) == true)
if (botIsOrisaChild == false)
if (HasSpawned(EventPlayer()) == true)
if (IsAlive(EventPlayer()) == true)
if (isRespawning == false)
if (botDoesUniqueBehaviour == false)
{
botSeePlayer = SortedArray(FilteredArray(AllLivingPlayers(Team.Team1), HasSpawned(ArrayElement()) == true && ArrayElement().isInMenu[0] == false && (HeroOf(ArrayElement()) == Hero.Sombra && IsUsingAbility1(ArrayElement())) == false && IsInLineOfSight(EyePosition(EventPlayer()), EyePosition(ArrayElement()), BarrierLOS.NoBarriersBlock) == true), DistanceBetween(PositionOf(EventPlayer()), PositionOf(ArrayElement())))[0];
# SEE THE PLAYER
if (botSeePlayer != null)
{
StopHoldingButton(EventPlayer(), Button.SecondaryFire);
StartFacing(EventPlayer(), DirectionTowards(EyePosition(EventPlayer()), EyePosition(botSeePlayer) - Vector(0, 0.5, 0)), 100, Relative.ToWorld, FacingRev.DirectionAndTurnRate);
}
else if (!IsFiringSecondary(EventPlayer()) && Health(EventPlayer()) < MaxHealth(EventPlayer()))
{
StartHoldingButton(EventPlayer(), Button.SecondaryFire);
}
Wait(1, WaitBehavior.IgnoreCondition);
LoopIfConditionIsTrue();
}
rule: "BOT: BASTION - ARTILLERY"
Event.OngoingPlayer
Team.Team2
Player.Bastion
if (IsDummyBot(EventPlayer()) == true)
if (botIsOrisaChild == false)
if (HasSpawned(EventPlayer()) == true)
if (IsAlive(EventPlayer()) == true)
if (botSeePlayer == true)
if (IsReloading(EventPlayer()) == false)
if (botDoesUniqueBehaviour == false)
if (IsInViewAngle(EventPlayer(), PositionOf(botSeePlayer), 30) == true)
if (DistanceBetween(PositionOf(EventPlayer()), PositionOf(botSeePlayer)) > 18)
if (DistanceBetween(EyePosition(EventPlayer()), RayCastHitPosition(EyePosition(EventPlayer()), EyePosition(EventPlayer()) + Up() * 99, null, EventPlayer(), false)) >= 35)
{
# TRYING TO CAPTURE TARGET
Wait(0.8, WaitBehavior.AbortWhenFalse);
# CAPTURE TARGET
botDoesUniqueBehaviour = true;
StopThrottleInDirection(EventPlayer());
CreateBeamEffect(AllPlayers(Team.All), BeamType.TorbjornTurretSightBeam, UpdateEveryFrame(EyePosition(EventPlayer())), UpdateEveryFrame(RayCastHitPosition(EyePosition(EventPlayer()), EyePosition(EventPlayer()) + FacingDirectionOf(EventPlayer()) * 1000, AllLivingPlayers(Team.Team1), EventPlayer(), true)), Color.SkyBlue, EffectRev.VisibleToPositionAndRadius);
botEffects[1] = LastCreatedEntity();
Wait(1.4, WaitBehavior.IgnoreCondition);
DestroyEffect(botEffects[1]);
AbortIf(IsDead(EventPlayer()));
botEventPosition = PositionOf(botSeePlayer);
# SHOOT FROM ARTILLERY
botBastionArtilleryDidShotsCount = 0;
for (botLoopIterator1 = 0; 4; 1)
{
botBastionArtilleryDidShotsCount += 1;
PlayEffect(AllPlayers(Team.Team1), PlayEffect.WreckingBallMinefieldExplosionSound, Color.White, EyePosition(EventPlayer()), 250);
PlayEffect(AllPlayers(Team.Team1), PlayEffect.PharahBarrageExplosionEffect, Color.Orange, EyePosition(EventPlayer()) + WorldVectorOf(Vector(0, 1.4, -0.7), EventPlayer(), LocalVector.Rotation), 2);
CreateBeamEffect(AllPlayers(Team.All), BeamType.ZaryaParticleBeam, EyePosition(EventPlayer()) + WorldVectorOf(Vector(0, 1.4, -0.7), EventPlayer(), LocalVector.Rotation), EyePosition(EventPlayer()) + WorldVectorOf(Vector(RandomReal(-1, 1), RandomInteger(40, 80), RandomReal(0.5, 1.5)), EventPlayer(), LocalVector.Rotation), Color.Orange, EffectRev.VisibleTo);
botEffects[2] = LastCreatedEntity();
Wait(0.1, WaitBehavior.IgnoreCondition);
DestroyEffect(botEffects[2]);
Wait(0.4, WaitBehavior.IgnoreCondition);
if (IsDead(EventPlayer()))
{
break;
}
}
StartThrottleInDirection(EventPlayer(), DirectionTowards(PositionOf(EventPlayer()), botNextNodePosition), 1, Relative.ToWorld, ThrottleBehavior.ReplaceExistingThrottle, ThrottleRev.DirectionAndMagnitude);
Wait(1.5, WaitBehavior.IgnoreCondition);
async! BotBastionArtilleryDamage();
Wait(4, WaitBehavior.IgnoreCondition);
}
rule: "BOT: BASTION - PRIMARY FIRE"
Event.OngoingPlayer
Team.Team2
Player.Bastion
if (IsDummyBot(EventPlayer()) == true)
if (botIsOrisaChild == false)
if (HasSpawned(EventPlayer()) == true)
if (IsAlive(EventPlayer()) == true)
if (botSeePlayer != null)
if (botDoesUniqueBehaviour == false)
if (IsInViewAngle(EventPlayer(), PositionOf(botSeePlayer), 40) == true)
{
StartHoldingButton(EventPlayer(), Button.PrimaryFire);
Wait(1, WaitBehavior.IgnoreCondition);
StopHoldingButton(EventPlayer(), Button.PrimaryFire);
Wait(1, WaitBehavior.IgnoreCondition);
LoopIfConditionIsTrue();
}
rule: "BOT: BASTION - DEATH"
Event.OnDeath
Team.Team2
Player.Bastion
{
StopHoldingButton(EventPlayer(), Button.SecondaryFire);
for (botLoopIterator1 = 0; 3; 1)
{
PlayEffect(AllPlayers(Team.Team1), PlayEffect.BastionTankCannonExplosionEffect, Color.White, EventPlayer(), 1);
PlayEffect(AllPlayers(Team.Team1), PlayEffect.BastionTankCannonExplosionSound, Color.White, EventPlayer(), 100);
Wait(0.25, WaitBehavior.IgnoreCondition);
}
}
void BotBastionRespawn() "SUBROUTINE: BASTION - RESPAWN"
{
AbortIf(botIsOrisaChild == true);
BotLandingFromSky();
SetAmmo(EventPlayer(), 0, 0);
WaitUntil(!IsReloading(EventPlayer()), 99999);
botTargetPosition = ObjectivePosition(2);
}
void BotBastionArtilleryDamage() "SUBROUTINE: BASTION - ARTILLERY DAMAGE"
{
botDoesUniqueBehaviour = false;
# EXPLOSIONS OF ARTILLERY
for (botLoopIterator2 = 0; botBastionArtilleryDidShotsCount; 1)
{
botEventPosition = RayCastHitPosition(botEventPosition + Vector(0, 50, 0), botEventPosition + Vector(RandomInteger(-4, 4), -15, RandomInteger(-4, 4)), null, EventPlayer(), true);
Damage(PlayersWithinRadius(botEventPosition, 8, Team.Team1, RadiusLOS.SurfacesAndEnemyBarriers), EventPlayer(), 50);
PlayEffect(AllPlayers(Team.Team1), PlayEffect.BastionTankCannonExplosionSound, Color.White, botEventPosition, 150);
PlayEffect(AllPlayers(Team.Team1), PlayEffect.PharahRocketLauncherExplosionEffect, Color.Orange, botEventPosition, 5);
CreateBeamEffect(AllPlayers(Team.All), BeamType.ZaryaParticleBeam, botEventPosition, botEventPosition + Vector(0, 60, 0), Color.Orange, EffectRev.VisibleTo);
botEffects[1] = LastCreatedEntity();
Wait(0.1, WaitBehavior.IgnoreCondition);
DestroyEffect(botEffects[1]);
Wait(0.4, WaitBehavior.IgnoreCondition);
}
}
disabled rule: "=== ORISA + BASTION ==="
{
}
rule: "BOT: ORISA-BASTION - REACHED TARGET POSITION"
Event.OngoingPlayer
Team.Team2
Player.Orisa
if (IsDummyBot(EventPlayer()) == true)
if (HasSpawned(EventPlayer()) == true)
if (IsAlive(EventPlayer()) == true)
if (botIsPathFinding == true)
if (DistanceBetween(PositionOf(EventPlayer()), botOrisaTargetPosition) < 1.5)
{
BotResetPathFinding();
StartFacing(EventPlayer(), DirectionTowards(EyePosition(EventPlayer()), Vector(XOf(gatePosition), -999, ZOf(gatePosition))), 80, Relative.ToWorld, FacingRev.DirectionAndTurnRate);
StartFacing(botOrisaChild, DirectionTowards(EyePosition(EventPlayer()), IsInLineOfSight(EyePosition(EventPlayer()), gatePosition, BarrierLOS.NoBarriersBlock) ? gatePosition : SortedArray(FilteredArray(AllPlayers(Team.Team1), IsAlive(ArrayElement())), DistanceBetween(EyePosition(EventPlayer()), PositionOf(ArrayElement())))[0]), 200, Relative.ToWorld, FacingRev.DirectionAndTurnRate);
PressButton(EventPlayer(), Button.Ability1);
WaitUntil(YOf(FacingDirectionOf(EventPlayer())) < -0.3, 99999);
PressButton(EventPlayer(), Button.Ability2);
Wait(0.8, WaitBehavior.IgnoreCondition);
botOrisaChild.botDoesUniqueBehaviour = false;
DisallowButton(EventPlayer(), Button.Ability2);
}
rule: "BOT: ORISA-BASTION - SHOOT"
Event.OngoingPlayer
Team.Team2
Player.Bastion
if (IsDummyBot(EventPlayer()) == true)
if (botIsOrisaChild == true)
if (HasSpawned(EventPlayer()) == true)
if (IsAlive(EventPlayer()) == true)
if (isRespawning == false)
if (botDoesUniqueBehaviour == false)
{
botDoesUniqueBehaviour = true;
while (IsAlive(EventPlayer()))
{
CreateEffect(AllPlayers(Team.Team1), Effect.BadAura, Color.Purple, EyePosition(EventPlayer()) - Vector(0, 0.7, 0) + FacingDirectionOf(EventPlayer()) * 3.2, 1, EffectRev.VisibleToPositionAndRadius);
botEffects[3] = LastCreatedEntity();
Wait(1.5, WaitBehavior.IgnoreCondition);
DestroyEffect(botEffects[3]);
AbortIf(IsDead(EventPlayer()));
PressButton(EventPlayer(), Button.PrimaryFire);
PressButton(EventPlayer(), Button.Reload);
botRayCastHitPosition = RayCastHitPosition(EyePosition(EventPlayer()), EyePosition(EventPlayer()) + FacingDirectionOf(EventPlayer()) * 999, AllPlayers(Team.Team1), AllPlayers(Team.Team2), true);
# ANTI-SHIELD BUG
botRayCastHitPosition = botRayCastHitPosition + DirectionTowards(botRayCastHitPosition, EyePosition(EventPlayer())) * 0.2;
CreateBeamEffect(AllPlayers(Team.All), BeamType.ZaryaParticleBeam, EyePosition(EventPlayer()) - Vector(0, 0.7, 0) + FacingDirectionOf(EventPlayer()) * 3, botRayCastHitPosition, Color.Purple, EffectRev.VisibleToPositionAndRadius);
botEffects[4] = LastCreatedEntity();
Damage(PlayersWithinRadius(botRayCastHitPosition, 4, Team.Team1, RadiusLOS.SurfacesAndAllBarriers), EventPlayer(), 0.04);
PlayEffect(AllPlayers(Team.Team1), PlayEffect.PharahConcussiveBlastEffect, Color.Purple, botRayCastHitPosition, 4);
PlayEffect(AllPlayers(Team.Team1), PlayEffect.PharahConcussiveBlastSound, Color.Purple, botRayCastHitPosition, 250);
PlayEffect(AllPlayers(Team.Team1), PlayEffect.BadExplosion, Color.Purple, EyePosition(EventPlayer()) + FacingDirectionOf(EventPlayer()) * 3.3, 2);
PlayEffect(AllPlayers(Team.Team1), PlayEffect.SombraEmpExplosionSound, Color.Purple, EyePosition(EventPlayer()), 170);
if (DistanceBetween(botRayCastHitPosition, gatePosition) < 4 && IsInLineOfSight(botRayCastHitPosition, gatePosition, BarrierLOS.EnemyBarriersBlock))
{
gateHealth -= 80 + 10 * time5Minutes;
async GateProgressBarColor();
}
Wait(0.15, WaitBehavior.IgnoreCondition);
DestroyEffect(botEffects[4]);
Wait(0.1, WaitBehavior.IgnoreCondition);
WaitUntil(!IsReloading(EventPlayer()), 2.5);
}
}
rule: "BOT: ORISA-BASTION - CAN'T SEE THE TARGET"
Event.OngoingPlayer
Team.Team2
Player.Orisa
if (IsDummyBot(EventPlayer()) == true)
if (HasSpawned(EventPlayer()) == true)
if (IsAlive(EventPlayer()) == true)
if (isRespawning == false)
if (botIsPathFinding == false)
if (IsInLineOfSight(EyePosition(EventPlayer()), gatePosition, BarrierLOS.NoBarriersBlock) == false)
{
botTargetPosition = botOrisaTargetPosition;
async BotStartPathFinding();
}
rule: "BOT: ORISA-BASTION - DEATH"
Event.OnDeath
Team.Team2
Player.Orisa
{
AllowButton(EventPlayer(), Button.Ability2);
Kill(botOrisaChild, null);
DetachPlayers(botOrisaChild);
ClearStatus(botOrisaChild, Status.PhasedOut);
SetDamageDealt(botOrisaChild, 100);
botOrisaChild.botIsOrisaChild = false;
botOrisaChild = null;
botOrisaParent = null;
ForcePlayerHero(EventPlayer(), Hero.Widowmaker);
}
void BotOrisaRespawn() "SUBROUTINE: ORISA - RESPAWN"
{
botOrisaParent = EventPlayer();
# WAITING FOR ANY BASTION TO DIE
WaitUntil(IsTrueForAny(AllPlayers(Team.Team2), IsDead(ArrayElement()) && HeroOf(ArrayElement()) == Hero.Bastion && ArrayElement().isBoss[0] == false && ArrayElement().isBoss[1] == false), 99999);
# SETUP BASTION AS CHILD
botOrisaChild = FilteredArray(AllPlayers(Team.Team2), IsDead(ArrayElement()) && HeroOf(ArrayElement()) == Hero.Bastion && ArrayElement().isBoss[0] == false && ArrayElement().isBoss[1] == false)[0];
botOrisaChild.botIsOrisaChild = true;
botOrisaChild.botDoesUniqueBehaviour = true;
Wait(2, WaitBehavior.IgnoreCondition);
Respawn(botOrisaChild);
StartScalingPlayer(botOrisaChild, 1.8, false);
SetDamageDealt(botOrisaChild, 2000);
SetStatus(botOrisaChild, null, Status.PhasedOut, 9999);
DisableNameplates(botOrisaChild, AllPlayers(Team.All));
SetFacing(botOrisaChild, Vector(XOf(FacingDirectionOf(EventPlayer())), 9999, ZOf(FacingDirectionOf(EventPlayer()))), Relative.ToWorld);
StartHoldingButton(botOrisaChild, Button.Ability1);
WaitUntil(IsInAlternateForm(botOrisaChild), 5);
StopHoldingButton(botOrisaChild, Button.Ability1);
Teleport(botOrisaChild, PositionOf(EventPlayer()));
AttachPlayers(botOrisaChild, botOrisaParent, Vector(0, 1.8, 0.23));
BotLandingFromSky();
StartFacing(EventPlayer(), DirectionTowards(PositionOf(EventPlayer()), botNextNodePosition), 360, Relative.ToWorld, FacingRev.DirectionAndTurnRate);
botTargetPosition = botOrisaTargetPosition;
async! BotStartPathFinding();
}
rule: "GLOBAL: GAME LOGIC - MIN 0 - ZENS, REINS, BALL"
if (IsGameInProgress() == true)
if (timeMinutes == 0)
{
# CREATE BOTS - ZEN
while (CountOf(AllPlayers(Team.Team2)) < 13)
{
CreateDummyBot(Hero.Zenyatta, Team.Team2, -1, Vector(0, 999, 0), Vector(0, 0, 0));
Wait(1, WaitBehavior.IgnoreCondition);
}
# BALL
while (CountOf(FilteredArray(AllPlayers(Team.Team2), HeroOf(ArrayElement()) == Hero.WreckingBall)) == 0)
{
CreateDummyBot(Hero.WreckingBall, Team.Team2, -1, Vector(0, 999, 0), Vector(0, 0, 0));
Wait(1, WaitBehavior.IgnoreCondition);
}
# REPLACE DEAD ZEN TO REIN
while (CountOf(FilteredArray(AllPlayers(Team.Team2), HeroOf(ArrayElement()) == Hero.Reinhardt)) != 3)
{
# WAITING FOR ANY ZEN TO DIE
WaitUntil(IsTrueForAny(AllPlayers(Team.Team2), IsDead(ArrayElement()) && HeroOf(ArrayElement()) == Hero.Zenyatta), 99999);
# REPLACE HIM TO A NEW HERO
defaultCurrentBot = FilteredArray(AllPlayers(Team.Team2), IsDead(ArrayElement()) && HeroOf(ArrayElement()) == Hero.Zenyatta)[0];
Wait(0.2, WaitBehavior.IgnoreCondition);
DestroyDummyBot(Team.Team2, SlotOf(defaultCurrentBot));
Wait(0.2, WaitBehavior.IgnoreCondition);
CreateDummyBot(Hero.Reinhardt, Team.Team2, -1, Vector(0, 999, 0), Vector(0, 0, 0));
}
}
rule: "GLOBAL: GAME LOGIC - MIN 1 - WIDOW"
if (IsGameInProgress() == true)
if (timeMinutes == 1)
{
isNewWaveGameLogicProcessing = true;
while (CountOf(FilteredArray(AllPlayers(Team.Team2), HeroOf(ArrayElement()) == Hero.Widowmaker)) == 0)
{
# WAITING FOR ANY ZEN TO DIE
WaitUntil(IsTrueForAny(AllPlayers(Team.Team2), IsDead(ArrayElement()) && HeroOf(ArrayElement()) == Hero.Zenyatta), 99999);
# REPLACE HIM TO A NEW HERO
defaultCurrentBot = FilteredArray(AllPlayers(Team.Team2), IsDead(ArrayElement()) && HeroOf(ArrayElement()) == Hero.Zenyatta)[0];
Wait(0.2, WaitBehavior.IgnoreCondition);
DestroyDummyBot(Team.Team2, SlotOf(defaultCurrentBot));
Wait(0.2, WaitBehavior.IgnoreCondition);
CreateDummyBot(Hero.Widowmaker, Team.Team2, -1, Vector(0, 999, 0), Vector(0, 0, 0));
}
isNewWaveGameLogicProcessing = false;
}
rule: "GLOBAL: GAME LOGIC - MIN 3 - BALL"
if (IsGameInProgress() == true)
if (timeMinutes == 3)
{
# WAITING FOR ANY ZEN TO DIE
WaitUntil(IsTrueForAny(AllPlayers(Team.Team2), IsDead(ArrayElement()) && HeroOf(ArrayElement()) == Hero.Zenyatta), 99999);
# REPLACE HIM TO A NEW HERO
defaultCurrentBot = FilteredArray(AllPlayers(Team.Team2), IsDead(ArrayElement()) && HeroOf(ArrayElement()) == Hero.Zenyatta)[0];
Wait(0.2, WaitBehavior.IgnoreCondition);
DestroyDummyBot(Team.Team2, SlotOf(defaultCurrentBot));
Wait(1, WaitBehavior.IgnoreCondition);
CreateDummyBot(Hero.WreckingBall, Team.Team2, -1, Vector(0, 999, 0), Vector(0, 0, 0));
}
rule: "GLOBAL: GAME LOGIC - MIN 6 - BASTION"
if (IsGameInProgress() == true)
if (timeMinutes == 6)
{
while (CountOf(FilteredArray(AllPlayers(Team.Team2), HeroOf(ArrayElement()) == Hero.Zenyatta)) > 0)
{
# WAITING FOR ANY ZEN TO DIE
WaitUntil(IsTrueForAny(AllPlayers(Team.Team2), IsDead(ArrayElement()) && HeroOf(ArrayElement()) == Hero.Zenyatta), 99999);
# REPLACE HIM TO A NEW HERO
defaultCurrentBot = FilteredArray(AllPlayers(Team.Team2), IsDead(ArrayElement()) && HeroOf(ArrayElement()) == Hero.Zenyatta)[0];
Wait(0.2, WaitBehavior.IgnoreCondition);
DestroyDummyBot(Team.Team2, SlotOf(defaultCurrentBot));
Wait(1, WaitBehavior.IgnoreCondition);
if (CountOf(AllPlayers(Team.Team2)) < 11)
{
CreateDummyBot(Hero.Reinhardt, Team.Team2, -1, Vector(0, 999, 0), Vector(0, 0, 0));
LastCreatedEntity().isBoss[1] = true;
}
}
CreateDummyBot(Hero.Bastion, Team.Team2, -1, Vector(0, 999, 0), Vector(0, 0, 0));
}
rule: "GLOBAL: GAME LOGIC - MIN 9 - ECHO, +1 BASTION"
if (IsGameInProgress() == true)
if (timeMinutes == 9)
{
while (CountOf(FilteredArray(AllPlayers(Team.Team2), HeroOf(ArrayElement()) == Hero.Widowmaker)) > 0)
{
WaitUntil(IsTrueForAny(AllPlayers(Team.Team2), IsDead(ArrayElement()) && HeroOf(ArrayElement()) == Hero.Widowmaker), 99999);
defaultCurrentBot = FilteredArray(AllPlayers(Team.Team2), IsDead(ArrayElement()) && HeroOf(ArrayElement()) == Hero.Widowmaker)[0];
Wait(0.2, WaitBehavior.IgnoreCondition);
DestroyDummyBot(Team.Team2, SlotOf(defaultCurrentBot));
}
while (CountOf(FilteredArray(AllPlayers(Team.Team2), HeroOf(ArrayElement()) == Hero.Echo)) == 0)
{
Wait(1, WaitBehavior.IgnoreCondition);
CreateDummyBot(Hero.Echo, Team.Team2, -1, Vector(0, 9999, 0), Vector(0, 0, 0));
}
WaitUntil(CountOf(FilteredArray(AllPlayers(Team.Team2), HeroOf(ArrayElement()) == Hero.Zenyatta)) == 0, 99999);
CreateDummyBot(Hero.Bastion, Team.Team2, -1, Vector(0, 9999, 0), Vector(0, 0, 0));
}
rule: "Ana Nano Variable"
Event.OngoingPlayer
Team.Team1
Player.Ana
if (IsUsingUltimate(EventPlayer()) == true)
{
PlayerClosestToReticle(EventPlayer(), Team.Team1).isNanoed = 1;
}
rule: "isNanoed"
Event.OngoingPlayer
Team.Team1
if (isNanoed == true)
{
if (IsDead(EventPlayer()))
{
isNanoed = 0;
}
Wait(8, WaitBehavior.IgnoreCondition);
isNanoed = 0;
}
rule: "money on kill"
Event.OnFinalBlow
Team.Team1
{
if (upgradeMaxAmmoValue < upgradeMaxAmmoMaxValue[2])
{
upgradeMaxAmmoValue += Victim().isBoss[0] == 1 ? 10 : 1;
}
if (HeroOf(Victim()) == Hero.Zenyatta)
{
AllPlayers(Team.Team1).money[0] += 10 * (Victim().isBoss[0] ? 3 : 1) * moneyMultiplier[0];
startMoney += 10 * (Victim().isBoss[0] ? 3 : 1) * moneyMultiplier[0];
}
else if (HeroOf(Victim()) == Hero.Reinhardt)
{
AllPlayers(Team.Team1).money[0] += 20 * (Victim().isBoss[0] ? 3 : 1) * moneyMultiplier[0];
startMoney += 20 * (Victim().isBoss[0] ? 3 : 1) * moneyMultiplier[0];
}
else if (HeroOf(Victim()) == Hero.WreckingBall)
{
AllPlayers(Team.Team1).money[0] += 30 * (Victim().isBoss[0] ? 3 : 1) * moneyMultiplier[0];
startMoney += 30 * (Victim().isBoss[0] ? 3 : 1) * moneyMultiplier[0];
}
else if (HeroOf(Victim()) == Hero.Widowmaker)
{
AllPlayers(Team.Team1).money[0] += 50 * (Victim().isBoss[0] ? 3 : 1) * moneyMultiplier[0];
startMoney += 50 * (Victim().isBoss[0] ? 3 : 1) * moneyMultiplier[0];
}
else if (HeroOf(Victim()) == Hero.Bastion)
{
AllPlayers(Team.Team1).money[0] += 70 * (Victim().isBoss[0] ? 3 : 1) * moneyMultiplier[0];
startMoney += 70 * (Victim().isBoss[0] ? 3 : 1) * moneyMultiplier[0];
}
else if (HeroOf(Victim()) == Hero.Echo)
{
AllPlayers(Team.Team1).money[0] += 90 * (Victim().isBoss[0] ? 3 : 1) * moneyMultiplier[0];
startMoney += 90 * (Victim().isBoss[0] ? 3 : 1) * moneyMultiplier[0];
}
else if (HeroOf(Victim()) == Hero.Orisa)
{
AllPlayers(Team.Team1).money[0] += 120 * (Victim().isBoss[0] ? 3 : 1) * moneyMultiplier[0];
startMoney += 120 * (Victim().isBoss[0] ? 3 : 1) * moneyMultiplier[0];
}
}
rule: "Abilities and Hero Talents by Shingen and LemonAid"
Event.OngoingPlayer
Team.Team1
{
baseStats[0] = 100;
baseStats[1] = 100;
baseStats[2] = 100;
baseStats[3] = 100;
damageBoost[0] = 0;
damageBoost[1] = 0;
playerHealth = 0;
healBoost = 0;
speedBoost = 0;
money[0] = 2400 + startMoney;
if (<"<0>", EventPlayer()> == "ShuriZma")
{
CreateHudText(EventPlayer(), null, <"Serverload: <0>, AVG <1>, Peak <2>", ServerLoad(), ServerLoadAverage(), ServerLoadPeak()>, null, Location.Right, -10000, Color.White, Color.Red, Color.White, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
CreateHudText(EventPlayer(), null, <"<0><1><2>", <"damage: <0>\nhealth: <1>\nhealing: <2>\n", baseStats[0], baseStats[1], baseStats[2]>, <"speed: <0>\ndamageBoost[0]: <1>\ndamageBoost[1]: <2>\n", baseStats[3], damageBoost[0], damageBoost[1]>, <"playerHealth: <0>\nhealBoost: <1>\n<2>", playerHealth, healBoost, <"speedBoost: <0>\nkills: <1>", speedBoost, baseStats[4]>>>, null, Location.Right, -10000, Color.White, Color.Red, Color.White, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
}
}
rule: "Team 1 (Ability): Quick Fix"
Event.OnElimination
Team.Team1
if (abilities[3] == true)
{
if (baseStats[5] != abilities[3] * 20 && baseStats[4] == true)
{
speedBoost -= baseStats[5];
}
Heal(EventPlayer(), null, abilities[3] * 50);
if (baseStats[4] != true || baseStats[5] != abilities[3] * 20)
{
baseStats[5] = abilities[3] * 20;
baseStats[4] = true;
speedBoost += baseStats[5];
UpdatePlayerStats();
}
Wait(5, WaitBehavior.RestartWhenTrue);
speedBoost -= baseStats[5];
baseStats[4] = false;
UpdatePlayerStats();
}
rule: "Team 1 (Ability): Heavyweight"
Event.PlayerDealtKnockback
Team.Team1
if (abilities[4] == true)
{
Damage(Victim(), EventPlayer(), EventDamage() / (100 / abilities[4] * 25));
}
rule: "Team 1 (Ability): Charged"
Event.OngoingPlayer
Team.Team1
if (abilities[5] == true)
if (UltimateChargePercent(EventPlayer()) < abilities[5] * 20)
{
SetUltimateCharge(EventPlayer(), abilities[5] * 20);
if (IsDuplicating(EventPlayer()))
{
Wait(0.1, WaitBehavior.IgnoreCondition);
SetUltimateCharge(EventPlayer(), abilities[5] * 20);
}
Wait(0.25, WaitBehavior.IgnoreCondition);
LoopIfConditionIsTrue();
}
rule: "Team 1 (Ability): Haste Primary Fire"
Event.OngoingPlayer
Team.Team1
if (abilities[6] == true)
if (AbilityCooldown(EventPlayer(), Button.PrimaryFire) > 0.1)
{
SetAbilityCooldown(EventPlayer(), Button.PrimaryFire, (1 - 0.25 * abilities[6]) * AbilityCooldown(EventPlayer(), Button.PrimaryFire));
}
rule: "Team 1 (Ability): Haste Secondary Fire"
Event.OngoingPlayer
Team.Team1
if (abilities[6] == true)
if (AbilityCooldown(EventPlayer(), Button.SecondaryFire) > 0.1)
{
SetAbilityCooldown(EventPlayer(), Button.SecondaryFire, (1 - 0.25 * abilities[6]) * AbilityCooldown(EventPlayer(), Button.SecondaryFire));
}
rule: "Team 1 (Ability): Haste Ability 1"
Event.OngoingPlayer
Team.Team1
if (abilities[6] == true)
if (AbilityCooldown(EventPlayer(), Button.Ability1) > 0.1)
{
SetAbilityCooldown(EventPlayer(), Button.Ability1, (1 - 0.25 * abilities[6]) * AbilityCooldown(EventPlayer(), Button.Ability1));
}
rule: "Team 1 (Ability): Haste Ability 2"
Event.OngoingPlayer
Team.Team1
if (abilities[6] == true)
if (AbilityCooldown(EventPlayer(), Button.Ability2) > 0.1)
{
SetAbilityCooldown(EventPlayer(), Button.Ability2, (1 - 0.25 * abilities[6]) * AbilityCooldown(EventPlayer(), Button.Ability2));
}
rule: "Team 1 (Ability): Haste Jump"
Event.OngoingPlayer
Team.Team1
if (abilities[6] == true)
if (AbilityCooldown(EventPlayer(), Button.Jump) > 0.1)
{
SetAbilityCooldown(EventPlayer(), Button.Jump, (1 - 0.25 * abilities[6]) * AbilityCooldown(EventPlayer(), Button.Jump));
}
rule: "Team 1 (Ability): Haste Crouch"
Event.OngoingPlayer
Team.Team1
if (abilities[6] == true)
if (AbilityCooldown(EventPlayer(), Button.Crouch) > 0.1)
{
SetAbilityCooldown(EventPlayer(), Button.Crouch, (1 - 0.25 * abilities[6]) * AbilityCooldown(EventPlayer(), Button.Crouch));
}
rule: "Team 1 (Ability): Heavy Impact"
Event.OnDamageTaken
Team.Team2
if (Attacker().abilities[7] == true)
{
AbortIf(RandomReal(-0.02, 1) > EventDamage() / MaxHealth(EventPlayer()));
SetStatus(EventPlayer(), Attacker(), Status.Stunned, 1 * Attacker().abilities[7]);
Wait(5, WaitBehavior.IgnoreCondition);
}
rule: "Team 1 (Ability): Resilience"
Event.OngoingPlayer
Team.Team1
if (abilities[11] == true)
if (NormalizedHealth(EventPlayer()) < abilities[11] * 0.3)
{
SetDamageReceived(EventPlayer(), 70);
WaitUntil(!(abilities[11] && NormalizedHealth(EventPlayer()) < abilities[11] * 0.3), 99999);
SetDamageReceived(EventPlayer(), 100);
}
rule: "Auto Repair"
if (IsGameInProgress() == true)
if (automaticRepair == true)
if (gateHealth < gateMaxHealth[0])
{
if (gateMaxHealth[0] - gateHealth > 5 * automaticRepair * (upgradeGateMaxHealthValue >= upgradeGateMaxHealthMaxValue[2] ? 2 : 1))
{
gateHealth += 5 * automaticRepair * (upgradeGateMaxHealthValue >= upgradeGateMaxHealthMaxValue[2] ? 2 : 1);
upgradeGateMaxHealthValue += 5 * automaticRepair;
}
else
{
gateHealth += gateMaxHealth[0] - gateHealth;
upgradeGateMaxHealthValue += gateMaxHealth[0] - gateHealth;
}
# UPDATE GATE'S HEALTH BAR
async GateProgressBarColor();
Wait(5, WaitBehavior.IgnoreCondition);
LoopIfConditionIsTrue();
}
rule: "Hero Talent Text"
Event.OngoingPlayer
Team.Team1
if (HasSpawned(EventPlayer()) == true)
if (IsAlive(EventPlayer()) == true)
{
if (HeroOf(EventPlayer()) == Hero.Ana)
{
heroTalentText[1] = [AbilityIconString(Hero.Ana, Button.Ability1), "Sleep Paralysis: Slept enemies will take a lot of damage when they wake up"];
heroTalentText[2] = [AbilityIconString(Hero.Ana, Button.Ability2), "Multinade: Ana throws multiple Biotic Grenades"];
}
else if (HeroOf(EventPlayer()) == Hero.Ashe)
{
heroTalentText[1] = [AbilityIconString(Hero.Ashe, Button.Ability2), "Black Gunpowder: Coach gun stuns and sets enemies on fire"];
heroTalentText[2] = [IconString(Icon.Fire), "Dancing Flames: Eliminated enemies exlpode and burn others nearby"];
}
else if (HeroOf(EventPlayer()) == Hero.Baptiste)
{
heroTalentText[1] = [IconString(Icon.Poison), "Corrode: Regenerative Burst will damage and poison enemies"];
heroTalentText[2] = [AbilityIconString(Hero.Baptiste, Button.Ability2), "Aerial Ace: Exo-boots allow for gliding and deal bonus damage while gliding"];
}
else if (HeroOf(EventPlayer()) == Hero.Bastion)
{
heroTalentText[1] = [AbilityIconString(Hero.Echo, Button.SecondaryFire), "Fusillade: Automatically fire a tactical grenade every so often in sentry form"];
heroTalentText[2] = [AbilityIconString(Hero.Symmetra, Button.Ability1), "Trickshot: Landing tactical grenade on an enemy deals more damage and heals"];
}
else if (HeroOf(EventPlayer()) == Hero.Brigitte)
{
heroTalentText[1] = [AbilityIconString(Hero.Brigitte, Button.Ability1), "Endeavor: Gain a boost in damage, armour and speed when your barrier breaks"];
heroTalentText[2] = [AbilityIconString(Hero.Brigitte, Button.Ultimate), "Whiplash: Endpoint of whip shot generates a stunning shockwave"];
}
else if (HeroOf(EventPlayer()) == Hero.Cassidy)
{
heroTalentText[1] = [AbilityIconString(Hero.Cassidy, Button.Ability2), "Standoff: Enemies cannot move once their skull is locked during deadeye"];
heroTalentText[2] = [AbilityIconString(Hero.Cassidy, Button.Ultimate), "Flashpoint: Magnetic Grenade will heavily stun enemies if it sticks"];
}
else if (HeroOf(EventPlayer()) == Hero.Dva)
{
heroTalentText[1] = [AbilityIconString(Hero.Dva, Button.SecondaryFire), "Voltage Grid: Defense matrix damages and roots enemies"];
heroTalentText[2] = [AbilityIconString(Hero.Dva, Button.Ability1), "Shooting Star: Boosters set enemies on fire"];
}
else if (HeroOf(EventPlayer()) == Hero.Doomfist)
{
heroTalentText[1] = [AbilityIconString(Hero.Pharah, Button.Jump), "Punch Card: Rocket Punch deals triple damage at full charge"];
heroTalentText[2] = [AbilityIconString(Hero.Doomfist, Button.Ultimate), "Fissure: Seismic Slam leaves a large fire pool behind"];
}
else if (HeroOf(EventPlayer()) == Hero.Echo)
{
heroTalentText[1] = [AbilityIconString(Hero.Echo, Button.Ability2), "Glass Bombs: Sticky Bombs deal double damage to enemies under half health"];
heroTalentText[2] = [AbilityIconString(Hero.Echo, Button.SecondaryFire), "Focusing Optics: Focusing Beam boost starts at 90% hp instead of 50%"];
}
else if (HeroOf(EventPlayer()) == Hero.Genji)
{
heroTalentText[1] = [AbilityIconString(Hero.Genji, Button.Ability1), "Venomous Strike: Swift Strike deals bleed damage; heal for bleed damage"];
heroTalentText[2] = [AbilityIconString(Hero.Genji, Button.Ultimate), "Dragon's Breath: Dragonblade fires explosive spirit charges with every swing"];
}
else if (HeroOf(EventPlayer()) == Hero.Hanzo)
{
heroTalentText[1] = [IconString(Icon.Bolt), "Firebolt: Charging an arrow for more than 2s turns it into an explosive bolt"];
heroTalentText[2] = [AbilityIconString(Hero.Hanzo, Button.Ability2), "Stormbreak: Storm arrows have no cooldown for a short duration when earning a kill"];
}
else if (HeroOf(EventPlayer()) == Hero.Junkrat)
{
heroTalentText[1] = [IconString(Icon.Fire), "Pyromania: All explosive attacks deal fire damage"];
heroTalentText[2] = [AbilityIconString(Hero.Junkrat, Button.Ability2), "Trigger Happy: Gain +1 Concussion Mine every 4s, up to 5 max"];
}
else if (HeroOf(EventPlayer()) == Hero.JunkerQueen)
{
heroTalentText[1] = [IconString(Icon.Fire), "Shout Louder: Commanding Shout wounds enemies in the area"];
heroTalentText[2] = [AbilityIconString(Hero.Junkrat, Button.Ability2), "Grace Period: Gracie deals extra damage upon pulling an enemy back"];
}
else if (HeroOf(EventPlayer()) == Hero.Kiriko)
{
heroTalentText[1] = [IconString(Icon.Fire), "Shinobi Tactics: Healing with abilities creates energy explosions around the target"];
heroTalentText[2] = [AbilityIconString(Hero.Junkrat, Button.Ability2), "Recession: Protection Suzu damages for 20% of health and freezes enemies"];
}
else if (HeroOf(EventPlayer()) == Hero.Lucio)
{
heroTalentText[1] = [AbilityIconString(Hero.Lucio, Button.SecondaryFire), "Power Skating: Soundwave deals more damage and knockback based on movement speed"];
heroTalentText[2] = [AbilityIconString(Hero.Lucio, Button.Ability1), "Reverse Amp: Amp It Up inflicts the opposite song effect to enemies"];
}
else if (HeroOf(EventPlayer()) == Hero.Mei)
{
heroTalentText[1] = [AbilityIconString(Hero.Mei, Button.Ultimate), "Cold Snap: Instantly freeze nearby enemies once Cryo-Freeze breaks"];
heroTalentText[2] = [AbilityIconString(Hero.Mei, Button.Ability2), "Polar Vortex: Mei throws 3 blizzard drones instead of 1 at increased damage"];
}
else if (HeroOf(EventPlayer()) == Hero.Mercy)
{
heroTalentText[1] = [AbilityIconString(Hero.Mercy, Button.Ability2), "Wings of Grand: Guardian Angel damages and knocks enemies down in its path"];
heroTalentText[2] = [AbilityIconString(Hero.Mercy, Button.Ultimate), "Holy light missiles: Unleash blasts of holy light missiles during valkyrie"];
}
else if (HeroOf(EventPlayer()) == Hero.Moira)
{
heroTalentText[1] = [AbilityIconString(Hero.Moira, Button.SecondaryFire), "Flourish: Fading through allies heals and through enemies damages them"];
heroTalentText[2] = [AbilityIconString(Hero.Moira, Button.Ability2), "Catalyst: Holding primary during coalescence costs energy and speed, but boosts effectiveness"];
}
else if (HeroOf(EventPlayer()) == Hero.Orisa)
{
heroTalentText[1] = [AbilityIconString(Hero.Orisa, Button.Ability1), "Steel Pinwheel: Javelin spin deals a large sweep attack when it ends"];
heroTalentText[2] = [AbilityIconString(Hero.Orisa, Button.SecondaryFire), "Flaming Harpoon: Energy Javelin stuns for longer and burns enemies"];
}
else if (HeroOf(EventPlayer()) == Hero.Pharah)
{
heroTalentText[1] = [AbilityIconString(Hero.Pharah, Button.Ability2), "Head Trauma: Concussive Blast deals damage and tazes enemies below half health"];
heroTalentText[2] = [AbilityIconString(Hero.Pharah, Button.Ability1), "Weaponized Storm: Every 6th rocket flies faster and detonates several clusters"];
}
else if (HeroOf(EventPlayer()) == Hero.Ramattra)
{
heroTalentText[1] = [AbilityIconString(Hero.Ramattra, Button.Ability1), "Vile Dominance: Move faster and root enemies with every punch in nemesis form"];
heroTalentText[2] = [AbilityIconString(Hero.Ramattra, Button.Ultimate), "Nether Sector: Heal and gain bonus ultimate charge for every enemy grounded with vortex"];
}
else if (HeroOf(EventPlayer()) == Hero.Reaper)
{
heroTalentText[1] = [AbilityIconString(Hero.Reaper, Button.Ability1), "Wraith Wrath: Shooting is enabled during wraith form with increased damage"];
heroTalentText[2] = [AbilityIconString(Hero.Reaper, Button.Ultimate), "Gloom: Wraith form instantly tazes all enemies in sight"];
}
else if (HeroOf(EventPlayer()) == Hero.Reinhardt)
{
heroTalentText[1] = [AbilityIconString(Hero.Reinhardt, Button.Ability2), "Fire Blast: Fire Strike explodes as it deals damage, igniting enemies"];
heroTalentText[2] = [AbilityIconString(Hero.Reinhardt, Button.Ultimate), "Epicenter: Earth shatter travels in all directions"];
}
else if (HeroOf(EventPlayer()) == Hero.Roadhog)
{
heroTalentText[1] = [IconString(Icon.Poison), "Stench: Constantly inflict toxic damage to nearby enemeis"];
heroTalentText[2] = [AbilityIconString(Hero.Roadhog, Button.Ability1), "Chainsnap: Chain Hook deals 4x more damage; resets upon eliminations"];
}
else if (HeroOf(EventPlayer()) == Hero.Sigma)
{
heroTalentText[1] = [AbilityIconString(Hero.Sigma, Button.Ability1), "Accretion Disk: Accretion flies straight and has increased damage and stun"];
heroTalentText[2] = [AbilityIconString(Hero.Sigma, Button.Ultimate), "String Theory: When kinetic grasp ends, fire a blast that scales based on the amount of damage collected"];
}
else if (HeroOf(EventPlayer()) == Hero.Sojourn)
{
heroTalentText[1] = [AbilityIconString(Hero.Sigma, Button.Ability1), "Thunderous kicks: Kickslide Jump initiates a powerful energy blast"];
heroTalentText[2] = [AbilityIconString(Hero.Sigma, Button.Ultimate), "Matter Splatter: Critical railgun hits are explosive"];
}
else if (HeroOf(EventPlayer()) == Hero.Soldier76)
{
heroTalentText[1] = [AbilityIconString(Hero.Pharah, Button.Ultimate), "Triple Threat: Helix Rockets fires two adjacent mini rockets"];
heroTalentText[2] = [AbilityIconString(Hero.Soldier76, Button.Ability1), "Espionage: Allies in biotic field revive faster and become harder to hit"];
}
else if (HeroOf(EventPlayer()) == Hero.Sombra)
{
heroTalentText[1] = [AbilityIconString(Hero.Sombra, Button.SecondaryFire), "Going Viral: Cancelling stealth will trigger a small hack explosion"];
heroTalentText[2] = [AbilityIconString(Hero.Sombra, Button.Ultimate), "Cyberattack: Using translocator will damage and hack nearby enemies"];
}
else if (HeroOf(EventPlayer()) == Hero.Symmetra)
{
heroTalentText[1] = [IconString(Icon.Bolt), "Sentry Paragon: Each sentry turret deals 50% more damage"];
heroTalentText[2] = [AbilityIconString(Hero.Symmetra, Button.Ultimate), "Shield Generator: Gain increased damage and speed, and grant all players shields with kills"];
}
else if (HeroOf(EventPlayer()) == Hero.Torbjorn)
{
heroTalentText[1] = [AbilityIconString(Hero.Torbjorn, Button.Ability2), "Heatwaves: Unleash waves of fire when overload or molten core is active"];
heroTalentText[2] = [AbilityIconString(Hero.Torbjorn, Button.Ultimate), "melting point: Every turret kill boosts its damage to 200% for a short duration"];
}
else if (HeroOf(EventPlayer()) == Hero.Tracer)
{
heroTalentText[1] = [AbilityIconString(Hero.Tracer, Button.Ability2), "Vortex: Recall drags and roots nearby enemies to its activation point"];
heroTalentText[2] = [AbilityIconString(Hero.Tracer, Button.Ultimate), "Chain Reaction: Pulse Bomb explosions can chain onto other enemies"];
}
else if (HeroOf(EventPlayer()) == Hero.Widowmaker)
{
heroTalentText[1] = [AbilityIconString(Hero.Widowmaker, Button.Ultimate), "Baiser de Soie: Scoped critical hits instantly kill enemies below 30% hp"];
heroTalentText[2] = [AbilityIconString(Hero.Widowmaker, Button.Ability2), "Felt More Alive: Gain low gravity and deal 40% more damage when scoping airbourne"];
}
else if (HeroOf(EventPlayer()) == Hero.Winston)
{
heroTalentText[1] = [AbilityIconString(Hero.Winston, Button.Ability2), "Lightning Strikes Twice: Direct zap hits will trigger twice"];
heroTalentText[2] = [AbilityIconString(Hero.Winston, Button.Ultimate), "Quake: Jump Pack landing force is much more powerful and stuns enemies"];
}
else if (HeroOf(EventPlayer()) == Hero.WreckingBall)
{
heroTalentText[1] = [AbilityIconString(Hero.WreckingBall, Button.Ultimate), "Mirror Ball: Reflect 100% of received damage to nearby enemies"];
heroTalentText[2] = [AbilityIconString(Hero.WreckingBall, Button.Ability2), "Distortion: Adaptive shields triggers explosions and tazes nearby enemies"];
}
else if (HeroOf(EventPlayer()) == Hero.Zarya)
{
heroTalentText[1] = [AbilityIconString(Hero.Zarya, Button.Ability1), "Combusta-Bubble: Barriers explode when they expire"];
heroTalentText[2] = [AbilityIconString(Hero.Echo, Button.Ability2), "Power Surge: Personal barrier grants energy upon activation"];
}
else if (HeroOf(EventPlayer()) == Hero.Zenyatta)
{
heroTalentText[1] = [AbilityIconString(Hero.Baptiste, Button.Ability2), "Stress Relief: Fully charged orb volleys deal 50% more damage"];
heroTalentText[2] = [AbilityIconString(Hero.Zenyatta, Button.Ultimate), "Perfect Balance: Transcendence damages enemies in the area of effect"];
}
}
void CancelMomentum() "Subroutine: Cancel player momentum"
{
ApplyImpulse(EventPlayer(), -1 * DirectionFromAngles(HorizontalAngleFromDirection(VelocityOf(EventPlayer())), 0), 0.001, Relative.ToWorld, ContraryMotion.CancelXYZ);
}
rule: "Ana: Sleep Paralysis"
Event.OnDamageDealt
Team.Team1
Player.Ana
{
AbortIf(!abilities[8]);
AbortIf(EventAbility() != Button.Ability1);
PlayEffect(AllPlayers(Team.All), PlayEffect.GoodExplosion, Color.Black, Victim(), 2);
Wait(0.5, WaitBehavior.IgnoreCondition);
WaitUntil(!HasStatus(Victim(), Status.Asleep), 5);
PlayEffect(AllPlayers(Team.All), PlayEffect.ExplosionSound, Color.Black, EyePosition(Victim()), 150);
PlayEffect(AllPlayers(Team.All), PlayEffect.GoodExplosion, Color.Black, Victim(), 6);
PlayEffect(AllPlayers(Team.All), PlayEffect.RingExplosion, Color.Black, Victim(), 12);
Damage(PlayersWithinRadius(Victim(), 6, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), 150);
SetStatus(PlayersWithinRadius(EyePosition(Victim()), 6, Team.Team2, RadiusLOS.Surfaces), null, Status.Hacked, 1.5);
}
rule: "Ana: Multinade"
Event.OngoingPlayer
Team.Team1
Player.Ana
if (abilities[12] == true)
if (IsUsingAbility2(EventPlayer()) == true)
{
for (p_loopIterator = 0; 4; 1)
{
Wait(0.03, WaitBehavior.IgnoreCondition);
SetAbilityCooldown(EventPlayer(), Button.Ability2, false);
CancelPrimaryAction(EventPlayer());
Wait(0.05, WaitBehavior.IgnoreCondition);
PressButton(EventPlayer(), Button.Ability2);
}
Wait(2, WaitBehavior.IgnoreCondition);
}
rule: "Ashe: Taunt"
Event.PlayerDealtKnockback
Team.Team1
Player.Ashe
if (abilities[8] == true)
if (EventAbility() == Button.Ability1)
if (Victim() != EventPlayer())
{
StartDamageOverTime(Victim(), EventPlayer(), 3, EventDamage() * 2.5);
SetStatus(Victim(), null, Status.Burning, 3);
SetStatus(Victim(), null, Status.Stunned, 3);
}
rule: "Ashe: Dancing Flames"
Event.OnElimination
Team.Team1
Player.Ashe
if (abilities[12] == true)
{
PlayEffect(AllPlayers(Team.All), PlayEffect.ExplosionSound, Color.Orange, Victim().deathPosition, 120);
PlayEffect(AllPlayers(Team.All), PlayEffect.GoodExplosion, Color.Orange, Victim().deathPosition, 5);
PlayEffect(AllPlayers(Team.All), PlayEffect.BadPickupEffect, Color.Yellow, Victim().deathPosition, 5);
StartDamageOverTime(PlayersWithinRadius(Victim().deathPosition, 5, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), 3, 15);
SetStatus(PlayersWithinRadius(Victim().deathPosition, 5, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), Status.Burning, 3);
Damage(PlayersWithinRadius(Victim().deathPosition, 5, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), 30);
}
rule: "Baptiste: Corrode"
Event.OngoingPlayer
Team.Team1
Player.Baptiste
if (IsUsingAbility1(EventPlayer()) == true)
if (abilities[8] == true)
{
for (p_loopIterator = 0; 3; 1)
{
PlayEffect(AllPlayers(Team.All), PlayEffect.RingExplosion, Color.Purple, PositionOf(EventPlayer()), 20);
Damage(PlayersWithinRadius(EventPlayer(), 10, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), 25);
StartDamageOverTime(PlayersWithinRadius(EventPlayer(), 10, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), 5, 30);
Wait(0.2, WaitBehavior.IgnoreCondition);
}
}
rule: "Baptiste: Aerial Ace - Jump"
Event.OngoingPlayer
Player.Baptiste
if (abilities[12] == true)
if (IsCrouching(EventPlayer()) == true)
if (HasStatus(EventPlayer(), Status.Hacked) == false)
{
WaitUntil(!IsCrouching(EventPlayer()), 9999);
WaitUntil(IsJumping(EventPlayer()), 1);
abilityAvailable = true;
Wait(0.25, WaitBehavior.IgnoreCondition);
damageBoost[1] += 30;
UpdatePlayerStats();
WaitUntil(IsOnGround(EventPlayer()), 99999);
abilityAvailable = false;
damageBoost[1] -= 30;
UpdatePlayerStats();
}
rule: "Baptiste: Aerial Ace - Slower fall"
Event.OngoingPlayer
Player.Baptiste
if (abilities[12] == true)
if (abilityAvailable == true)
if (IsAlive(EventPlayer()) == true)
if (IsButtonHeld(EventPlayer(), Button.Jump) == true)
if ((HasStatus(EventPlayer(), Status.Stunned) && HasStatus(EventPlayer(), Status.Hacked)) == false)
if (AltitudeOf(EventPlayer()) >= 1)
if (VerticalSpeedOf(EventPlayer()) < 0)
{
SetGravity(EventPlayer(), 7.5);
Wait(0.333, WaitBehavior.IgnoreCondition);
PlayEffect(AllPlayers(TeamOf(EventPlayer())), PlayEffect.RingExplosion, Color.Orange, PositionOf(EventPlayer()), 2);
LoopIfConditionIsTrue();
SetGravity(EventPlayer(), 100);
}
rule: "Bastion: Fusillade"
Event.OngoingPlayer
Player.Bastion
if (abilities[8] == true)
if (IsFiringPrimary(EventPlayer()) == true)
if (IsInAlternateForm(EventPlayer()) == true)
{
Wait(1.5, WaitBehavior.AbortWhenFalse);
CancelPrimaryAction(EventPlayer());
SetAbilityCooldown(EventPlayer(), Button.SecondaryFire, 0);
Wait(0.1, WaitBehavior.IgnoreCondition);
PressButton(EventPlayer(), Button.SecondaryFire);
LoopIfConditionIsTrue();
}
rule: "Bastion: Trickshot"
Event.OnDamageDealt
Player.Bastion
{
AbortIf(!abilities[12]);
AbortIf(EventAbility() != Button.SecondaryFire);
AbortIf(EventDamage() > 30);
Wait(0.5, WaitBehavior.IgnoreCondition);
SetAbilityCooldown(EventPlayer(), Button.SecondaryFire, AbilityCooldown(EventPlayer(), Button.SecondaryFire) - 3);
Damage(PlayersWithinRadius(Victim(), 5, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), 30);
Heal(EventPlayer(), EventPlayer(), 50);
}
rule: "Brigitte: Endeavor"
Event.OngoingPlayer
Team.Team1
Player.Brigitte
if (abilities[8] == true)
if (AbilityCooldown(EventPlayer(), Button.SecondaryFire) >= 0.1)
{
CreateEffect(AllPlayers(Team.All), Effect.EchoCloningEffect, Team.Team1, EventPlayer(), 0.4, EffectRev.VisibleToPositionAndRadius);
effects[1] = LastCreatedEntity();
PlayEffect(AllPlayers(Team.All), PlayEffect.RingExplosion, Color.Orange, EyePosition(EventPlayer()), 15);
Heal(PlayersWithinRadius(EventPlayer(), 15, Team.Team1, RadiusLOS.Off), EventPlayer(), 200);
damageBoost[1] += 150;
speedBoost += 75;
UpdatePlayerStats();
AddHealthPoolToPlayer(EventPlayer(), HealthType.Armor, MaxHealth(EventPlayer()) / 3, false, true);
hpPool[1] = LastCreatedHealthPool();
WaitUntil(!abilities[8] || IsDead(EventPlayer()), 6);
damageBoost[1] -= 150;
speedBoost -= 75;
UpdatePlayerStats();
RemoveHealthPoolFromPlayer(hpPool[1]);
DestroyEffect(effects[1]);
}
rule: "Brigitte: Whiplash"
Event.PlayerDealtKnockback
Team.Team1
Player.Brigitte
if (abilities[12] == true)
if (IsUsingAbility1(EventPlayer()) == true)
{
PlayEffect(AllPlayers(Team.All), PlayEffect.RingExplosionSound, Color.Green, Victim(), 100);
PlayEffect(AllPlayers(Team.All), PlayEffect.BadExplosion, Color.Orange, Victim(), 2.5);
PlayEffect(AllPlayers(Team.All), PlayEffect.BadPickupEffect, Color.Orange, Victim(), 2.5);
Damage(PlayersWithinRadius(Victim(), 2.5, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), 100);
SetStatus(PlayersWithinRadius(Victim(), 2.5, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), Status.Stunned, 1.5);
}
rule: "Cassidy: Standoff"
Event.OngoingPlayer
Team.Team1
Player.Cassidy
if (IsUsingUltimate(EventPlayer()) == true)
if (abilities[8] == true)
{
Wait(0.2, WaitBehavior.IgnoreCondition);
abilityCountdown = false;
ChaseVariableAtRate(abilityCountdown, 9999, 100, RateChaseReevaluation.DestinationAndRate);
Wait(0.5, WaitBehavior.IgnoreCondition);
ChaseVariableAtRate(abilityCountdown, 9999, 275, RateChaseReevaluation.DestinationAndRate);
Wait(0.5, WaitBehavior.IgnoreCondition);
ChaseVariableAtRate(abilityCountdown, 9999, 550, RateChaseReevaluation.DestinationAndRate);
}
rule: "Cassidy: Standoff - Set root"
Event.OngoingPlayer
Team.Team1
Player.Cassidy
if (IsUsingUltimate(EventPlayer()) == true)
if (abilities[8] == true)
{
Wait(0.2, WaitBehavior.IgnoreCondition);
for (p_loopIterator = 0; 5; 1)
{
Wait(1, WaitBehavior.AbortWhenFalse);
PlayEffect(EventPlayer(), PlayEffect.ExplosionSound, Color.White, EventPlayer(), 15);
SetStatus(FilteredArray(PlayersInViewAngle(EventPlayer(), Team.Team2, 103), Health(ArrayElement()) <= abilityCountdown && IsInLineOfSight(EventPlayer(), ArrayElement(), BarrierLOS.NoBarriersBlock)), EventPlayer(), Status.Rooted, 2);
}
StopChasingVariable(abilityCountdown);
}
rule: "Cassidy: Flashpoint"
Event.OnDamageDealt
Team.Team1
Player.Cassidy
{
AbortIf(!abilities[12]);
AbortIf(EventAbility() != Button.Ability2);
if (EventDamage() <= 5)
{
Wait(1.25, WaitBehavior.IgnoreCondition);
Damage(PlayersWithinRadius(Victim(), 6, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), 35);
SetStatus(PlayersWithinRadius(Victim(), 6, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), Status.Stunned, 1);
}
}
rule: "D.Va: Voltage Grid"
Event.OngoingPlayer
Team.Team1
Player.Dva
if (IsFiringSecondary(EventPlayer()) == true)
if (abilities[8] == true)
{
PlayEffect(AllPlayers(Team.All), PlayEffect.BadExplosion, Color.Turquoise, EyePosition(EventPlayer()) + FacingDirectionOf(EventPlayer()) * 2, 0.15);
PlayEffect(AllPlayers(Team.All), PlayEffect.BadExplosion, Color.Turquoise, EyePosition(EventPlayer()) + FacingDirectionOf(EventPlayer()) * 5, 0.15);
PlayEffect(AllPlayers(Team.All), PlayEffect.BadExplosion, Color.Turquoise, EyePosition(EventPlayer()) + FacingDirectionOf(EventPlayer()) * 8, 0.15);
Wait(0.3, WaitBehavior.IgnoreCondition);
Damage(PlayersWithinRadius(EyePosition(EventPlayer()) + FacingDirectionOf(EventPlayer()) * 2, 2.5, Team.Team2, RadiusLOS.Off), EventPlayer(), 20);
Damage(PlayersWithinRadius(EyePosition(EventPlayer()) + FacingDirectionOf(EventPlayer()) * 5, 2.5, Team.Team2, RadiusLOS.Off), EventPlayer(), 20);
Damage(PlayersWithinRadius(EyePosition(EventPlayer()) + FacingDirectionOf(EventPlayer()) * 8, 2.5, Team.Team2, RadiusLOS.Off), EventPlayer(), 20);
SetStatus(PlayersWithinRadius(EyePosition(EventPlayer()) + FacingDirectionOf(EventPlayer()) * 2, 2.5, Team.Team2, RadiusLOS.Off), EventPlayer(), Status.Rooted, 0.4);
SetStatus(PlayersWithinRadius(EyePosition(EventPlayer()) + FacingDirectionOf(EventPlayer()) * 5, 2.5, Team.Team2, RadiusLOS.Off), EventPlayer(), Status.Rooted, 0.4);
SetStatus(PlayersWithinRadius(EyePosition(EventPlayer()) + FacingDirectionOf(EventPlayer()) * 8, 2.5, Team.Team2, RadiusLOS.Off), EventPlayer(), Status.Rooted, 0.4);
LoopIfConditionIsTrue();
}
rule: "D.Va: Shooting Star"
Event.PlayerDealtKnockback
Team.Team1
Player.Dva
if (EventAbility() == Button.Ability1)
if (abilities[12] == true)
{
Damage(Victim(), EventPlayer(), 30);
SetStatus(Victim(), null, Status.Burning, 3);
StartDamageOverTime(Victim(), EventPlayer(), 3, 35);
PlayEffect(AllPlayers(Team.All), PlayEffect.BadExplosion, Color.Red, Victim(), 1);
}
rule: "Doomfist: Punch Card"
Event.OngoingPlayer
Team.Team1
Player.Doomfist
if (abilities[8] == true)
if (IsFiringSecondary(EventPlayer()) == true)
{
Wait(1, WaitBehavior.AbortWhenFalse);
damageBoost[1] += 200;
UpdatePlayerStats();
WaitUntil(AbilityCooldown(EventPlayer(), Button.SecondaryFire) > 0.1, 1);
damageBoost[1] -= 200;
UpdatePlayerStats();
}
rule: "Doomfist: Fissure"
Event.OngoingPlayer
Team.Team1
Player.Doomfist
if (IsUsingAbility1(EventPlayer()) == true)
if (abilities[12] == true)
{
Wait(1.25, WaitBehavior.AbortWhenFalse);
WaitUntil(IsOnGround(EventPlayer()), 10);
AbortIf(!IsOnGround(EventPlayer()));
abilityProjectile = PositionOf(EventPlayer());
abilityActive = true;
WaitUntil(IsDead(EventPlayer()), 5);
abilityActive = false;
}
rule: "Doomfist: Fissure"
Event.OngoingPlayer
Team.Team1
Player.Doomfist
if (abilityActive == true)
if (abilities[12] == true)
{
CreateEffect(AllPlayers(Team.All), Effect.Ring, Color.Orange, abilityProjectile, 8, EffectRev.VisibleToPositionAndRadius);
effects[1] = LastCreatedEntity();
CreateEffect(AllPlayers(Team.All), Effect.Cloud, Color.Orange, abilityProjectile, 8, EffectRev.VisibleToPositionAndRadius);
effects[2] = LastCreatedEntity();
PlayEffect(AllPlayers(Team.All), PlayEffect.RingExplosion, Color.Orange, abilityProjectile, 16);
while (abilityActive && abilities[12])
{
Damage(PlayersWithinRadius(abilityProjectile, 8, Team.Team2, RadiusLOS.Off), EventPlayer(), 20);
Wait(0.235, WaitBehavior.IgnoreCondition);
}
DestroyEffect(effects[1]);
DestroyEffect(effects[2]);
}
rule: "Echo: Silver Lining"
Event.OnDamageDealt
Team.Team1
Player.Echo
{
AbortIf(!abilities[8]);
AbortIf(EventAbility() != Button.SecondaryFire);
AbortIf(IsDuplicating(EventPlayer()));
AbortIf(NormalizedHealth(Victim()) > 0.5);
Damage(Victim(), EventPlayer(), EventDamage());
}
rule: "Echo: Focusing Optics"
Event.OnDamageDealt
Team.Team1
Player.Echo
{
AbortIf(!abilities[12]);
AbortIf(EventAbility() != Button.Ability2);
AbortIf(IsDuplicating(EventPlayer()));
AbortIf(NormalizedHealth(Victim()) <= 0.5);
AbortIf(NormalizedHealth(Victim()) > 0.9);
Damage(Victim(), EventPlayer(), EventDamage() * 3);
PlayEffect(AllPlayers(Team.All), PlayEffect.BadExplosion, Color.Violet, Victim(), 0.5);
}
rule: "Genji: Venomous Strike"
Event.OnDamageDealt
Team.Team1
Player.Genji
{
AbortIf(!abilities[8]);
AbortIf(EventAbility() != Button.Ability1);
StartHealOverTime(EventPlayer(), EventPlayer(), 3, 15);
StartDamageOverTime(Victim(), EventPlayer(), 3, 15);
Heal(EventPlayer(), EventPlayer(), 5);
Wait(0.25, WaitBehavior.RestartWhenTrue);
Wait(2, WaitBehavior.IgnoreCondition);
}
rule: "Genji: Dragon's Breath"
Event.OngoingPlayer
Team.Team1
Player.Genji
if (abilities[12] == true)
if (IsUsingUltimate(EventPlayer()) == true)
if (IsFiringPrimary(EventPlayer()) == true)
{
CreateEffect(AllPlayers(Team.All), Effect.GoodAura, Color.LimeGreen, abilityProjectile, 1, EffectRev.VisibleToPositionAndRadius);
effects[1] = LastCreatedEntity();
abilityProjectile = EyePosition(EventPlayer());
ChaseVariableAtRate(abilityProjectile, abilityEnd, 80, RateChaseReevaluation.DestinationAndRate);
abilityEnd = RayCastHitPosition(EyePosition(EventPlayer()), EyePosition(EventPlayer()) + FacingDirectionOf(EventPlayer()) * 60, AllLivingPlayers(Team.Team2), AllPlayers(Team.Team1), true);
WaitUntil(!abilities[12] || abilityEnd == abilityProjectile, 1);
DestroyEffect(effects[1]);
PlayEffect(AllPlayers(Team.All), PlayEffect.RingExplosionSound, Color.Green, abilityProjectile, 100);
PlayEffect(AllPlayers(Team.All), PlayEffect.BadExplosion, Color.LimeGreen, abilityProjectile, 5);
PlayEffect(AllPlayers(Team.All), PlayEffect.BadExplosion, Color.Green, abilityProjectile, 5);
Damage(PlayersWithinRadius(abilityProjectile, 5, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), 150);
StopChasingVariable(abilityCountdown);
}
rule: "Hanzo: Firebolt"
Event.OngoingPlayer
Team.Team1
Player.Hanzo
if (abilities[8] == true)
if (IsFiringPrimary(EventPlayer()) == true)
{
for (p_loopIterator = 0; 1; 1)
{
Wait(1, WaitBehavior.AbortWhenFalse);
PlayEffect(EventPlayer(), PlayEffect.ExplosionSound, Color.White, EventPlayer(), 100);
}
PlayEffect(AllPlayers(Team.All), PlayEffect.BadExplosion, Color.SkyBlue, EyePosition(EventPlayer()) + Vector(0, -0.25, false) + FacingDirectionOf(EventPlayer()), 1);
PlayEffect(AllPlayers(Team.All), PlayEffect.RingExplosionSound, Color.Team1, EventPlayer(), 100);
while (IsFiringPrimary(EventPlayer()))
{
Wait(0.1, WaitBehavior.IgnoreCondition);
PlayEffect(AllPlayers(Team.All), PlayEffect.GoodExplosion, Color.Orange, EyePosition(EventPlayer()) + Vector(0, -0.25, false) + FacingDirectionOf(EventPlayer()) * 0.7, 0.001);
}
AbortIf(HasStatus(EventPlayer(), Status.Stunned) || IsDead(EventPlayer()) || IsButtonHeld(EventPlayer(), Button.SecondaryFire) || HasStatus(EventPlayer(), Status.Asleep));
abilityProjectile = EyePosition(EventPlayer()) + FacingDirectionOf(EventPlayer()) * Vector(false, false, 2);
abilityEnd = RayCastHitPosition(EyePosition(EventPlayer()), EyePosition(EventPlayer()) + FacingDirectionOf(EventPlayer()) * 200, AllLivingPlayers(Team.All), EventPlayer(), false);
SetProjectileSpeed(EventPlayer(), 150);
ChaseVariableAtRate(abilityProjectile, abilityEnd, 165, RateChaseReevaluation.DestinationAndRate);
while (abilityProjectile != abilityEnd)
{
PlayEffect(AllPlayers(Team.All), PlayEffect.BadPickupEffect, Color.Orange, abilityProjectile, 3.5);
PlayEffect(AllPlayers(Team.All), PlayEffect.ExplosionSound, Color.Team1, abilityProjectile, 35);
Wait(0.072, WaitBehavior.IgnoreCondition);
}
PlayEffect(AllPlayers(Team.All), PlayEffect.GoodExplosion, Color.Orange, abilityProjectile, 4);
PlayEffect(AllPlayers(Team.All), PlayEffect.RingExplosionSound, Color.Team1, abilityProjectile, 150);
Damage(PlayersWithinRadius(abilityProjectile, 4, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), 175);
SetProjectileSpeed(EventPlayer(), 100);
StopChasingVariable(abilityProjectile);
}
rule: "Hanzo: Stormbreak"
Event.OnFinalBlow
Team.Team1
Player.Hanzo
if (abilities[12] == true)
{
abilityCountdown = 4;
ChaseVariableAtRate(abilityCountdown, 0, 1, RateChaseReevaluation.DestinationAndRate);
}
rule: "Hanzo: Stormbreak - Boost"
Event.OngoingPlayer
Team.Team1
Player.Hanzo
if (abilities[12] == true)
if (abilityCountdown > 0)
{
CreateEffect(AllPlayers(Team.All), Effect.WinstonPrimalRageEffect, Color.Team1, EventPlayer(), 1, EffectRev.VisibleToPositionAndRadius);
effects[1] = LastCreatedEntity();
WaitUntil(IsDead(EventPlayer()) || !abilityCountdown || !abilities[12], 99999);
abilityCountdown = false;
DestroyEffect(effects[1]);
StopChasingVariable(abilityCountdown);
}
rule: "Hanzo: Stormbreak - Reset Cooldowns For Storm Arrows"
Event.OngoingPlayer
Team.Team1
Player.Hanzo
if (abilityCountdown > 0)
if (AbilityCooldown(EventPlayer(), Button.Ability2) > 0)
{
SetAbilityCooldown(EventPlayer(), Button.Ability2, false);
}
rule: "Junker Queen: Shout Very Loudly"
Event.OngoingPlayer
Team.Team1
Player.JunkerQueen
if (abilities[8] == true)
if (IsUsingAbility1(EventPlayer()) == true)
{
StartDamageOverTime(RemoveFromArray(PlayersWithinRadius(EventPlayer(), 15, Team.Team2, RadiusLOS.Surfaces), EventPlayer()), EventPlayer(), 5, 8);
StartHealOverTime(EventPlayer(), EventPlayer(), 5, 8 * CountOf(PlayersWithinRadius(EventPlayer(), 15, Team.Team2, RadiusLOS.Surfaces)));
}
rule: "Junker Queen: Grace Period"
Event.PlayerDealtKnockback
Team.Team1
Player.JunkerQueen
if (abilities[12] == true)
if (EventAbility() == Button.SecondaryFire)
if (IsMeleeing(EventPlayer()) == false)
{
StartDamageOverTime(Victim(), EventPlayer(), 2.5, 20);
StartHealOverTime(EventPlayer(), EventPlayer(), 2.5, 20);
Heal(EventPlayer(), EventPlayer(), 60);
Damage(Victim(), EventPlayer(), 40);
PlayEffect(AllPlayers(Team.All), PlayEffect.BadExplosion, Color.Red, Victim(), 0.25);
}
rule: "Junkrat: Pyromania"
Event.PlayerDealtKnockback
Team.Team1
Player.Junkrat
{
AbortIf(!abilities[8]);
AbortIf(EventAbility() == Button.Melee);
AbortIf(Victim() == EventPlayer());
StartDamageOverTime(Victim(), EventPlayer(), 2, 20);
SetStatus(Victim(), null, Status.Burning, 2);
}
rule: "Junkrat: Trigger Happy"
Event.OngoingPlayer
Team.Team1
Player.Junkrat
if (abilities[12] == true)
if (AbilityCharge(EventPlayer(), Button.Ability1) < 5)
{
Wait(4, WaitBehavior.AbortWhenFalse);
SetAbilityCharge(EventPlayer(), Button.Ability1, AbilityCharge(EventPlayer(), Button.Ability1) + 1);
LoopIfConditionIsTrue();
}
rule: "Kiriko: Shinobi Tactics"
Event.OnHealingDealt
Team.Team1
Player.Kiriko
{
AbortIf(!abilities[8]);
AbortIf(EventAbility() == null);
Damage(PlayersWithinRadius(Healee(), 6, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), EventHealing() * 2);
}
rule: "Kiriko: Recession"
Event.PlayerDealtKnockback
Team.Team1
Player.Kiriko
if (abilities[12] == true)
if (EventAbility() == Button.Ability2)
{
Damage(Victim(), EventPlayer(), 75);
SetStatus(Victim(), EventPlayer(), Status.Frozen, 1.5);
PlayEffect(AllPlayers(Team.All), PlayEffect.GoodExplosion, Color.Gray, Victim(), 1);
}
rule: "Lucio: Power Skating - Damage"
Event.PlayerDealtKnockback
Team.Team1
Player.Lucio
if (abilities[8] == true)
if (EventAbility() == Button.SecondaryFire)
{
Damage(Victim(), EventPlayer(), SpeedOf(EventPlayer()) * 5);
ApplyImpulse(Victim(), FacingDirectionOf(EventPlayer()), SpeedOf(EventPlayer()) * 1.5, Relative.ToWorld, ContraryMotion.Cancel);
ApplyImpulse(Victim(), Up(), 4, Relative.ToWorld, ContraryMotion.Incorporate);
PlayEffect(AllPlayers(Team.All), PlayEffect.GoodExplosion, Color.Green, Victim(), 0.01);
}
rule: "Lucio: Reverse Amp"
Event.OngoingPlayer
Team.Team1
Player.Lucio
if (IsUsingAbility2(EventPlayer()) == true)
if (abilities[12] == true)
{
if (IsUsingAbility1(EventPlayer()))
{
SetStatus(PlayersWithinRadius(EventPlayer(), 12, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), Status.Rooted, 0.75);
}
else
{
Damage(PlayersWithinRadius(EventPlayer(), 12, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), 30);
Wait(0.5, WaitBehavior.IgnoreCondition);
LoopIfConditionIsTrue();
}
}
rule: "Mei: Cold Snap"
Event.OngoingPlayer
Team.Team1
Player.Mei
if (abilities[8] == true)
if (IsUsingAbility1(EventPlayer()) == true)
{
Wait(0.5, WaitBehavior.AbortWhenFalse);
WaitUntil(!IsUsingAbility1(EventPlayer()), 99999);
Damage(PlayersWithinRadius(EyePosition(EventPlayer()), 10, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), 35);
SetStatus(PlayersWithinRadius(EyePosition(EventPlayer()), 10, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), Status.Frozen, 2);
PlayEffect(AllPlayers(Team.All), PlayEffect.RingExplosion, Color.SkyBlue, PositionOf(EventPlayer()), 20);
PlayEffect(AllPlayers(Team.All), PlayEffect.RingExplosion, Color.Aqua, PositionOf(EventPlayer()) + Vector(0, 1, false), 20);
}
rule: "Mei: Polar Vortex"
Event.OngoingPlayer
Player.Mei
if (abilities[12] == true)
if (IsUsingUltimate(EventPlayer()) == true)
{
damageBoost[1] += 75;
UpdatePlayerStats();
for (p_loopIterator = 0; 3; 1)
{
MinWait();
SetUltimateCharge(EventPlayer(), 100);
PressButton(EventPlayer(), Button.Ultimate);
Wait(0.51, WaitBehavior.IgnoreCondition);
}
damageBoost[1] -= 75;
UpdatePlayerStats();
SetUltimateCharge(EventPlayer(), 0);
Wait(1, WaitBehavior.IgnoreCondition);
}
rule: "Mercy: Wings of Grand"
Event.OngoingPlayer
Team.Team1
Player.Mercy
if (abilities[8] == true)
if (IsAlive(EventPlayer()) == true)
if (IsUsingAbility1(EventPlayer()) == true)
{
if (SpeedOf(EventPlayer()) > 10)
{
Damage(FilteredArray(PlayersWithinRadius(EventPlayer(), 4, Team.Team2, RadiusLOS.Surfaces), !HasStatus(ArrayElement(), Status.KnockedDown)), EventPlayer(), 35);
SetStatus(PlayersWithinRadius(EventPlayer(), 4, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), Status.KnockedDown, 0.8);
ApplyImpulse(PlayersWithinRadius(EventPlayer(), 4, Team.Team2, RadiusLOS.Surfaces), Normalize(VelocityOf(EventPlayer())) + DirectionTowards(EventPlayer(), ThrottleOf(EventPlayer())) + Up() * 1.1, 7.5, Relative.ToWorld, ContraryMotion.Cancel);
PlayEffect(AllPlayers(Team.All), PlayEffect.BadExplosion, Color.Yellow, PositionOf(EventPlayer()), 0.15);
}
Wait(0.25, WaitBehavior.IgnoreCondition);
LoopIfConditionIsTrue();
}
rule: "Mercy: Holy Light Missiles"
Event.OngoingPlayer
Team.Team1
Player.Mercy
if (abilities[12] == true)
if (IsUsingUltimate(EventPlayer()) == true)
{
CreateEffect(AllPlayers(Team.All), Effect.Orb, Color.Yellow, abilityProjectile, 1, EffectRev.VisibleToPositionAndRadius);
effects[1] = LastCreatedEntity();
abilityProjectile = EyePosition(EventPlayer());
ChaseVariableAtRate(abilityProjectile, abilityEnd, 100, RateChaseReevaluation.DestinationAndRate);
abilityEnd = RayCastHitPosition(EyePosition(EventPlayer()), EyePosition(EventPlayer()) + FacingDirectionOf(EventPlayer()) * 60, AllLivingPlayers(Team.Team2), AllPlayers(Team.Team1), true);
WaitUntil(!abilities[12] || abilityEnd == abilityProjectile, 1);
DestroyEffect(effects[1]);
StopChasingVariable(abilityCountdown);
PlayEffect(AllPlayers(Team.All), PlayEffect.RingExplosionSound, Color.Green, abilityProjectile, 100);
PlayEffect(AllPlayers(Team.All), PlayEffect.BadExplosion, Color.Yellow, abilityProjectile, 6);
PlayEffect(AllPlayers(Team.All), PlayEffect.GoodPickupEffect, Color.White, abilityProjectile, 6);
Damage(PlayersWithinRadius(abilityProjectile, 6, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), 150);
Heal(PlayersWithinRadius(abilityProjectile, 6, Team.Team1, RadiusLOS.Surfaces), EventPlayer(), 150);
Wait(1.5, WaitBehavior.IgnoreCondition);
LoopIfConditionIsTrue();
}
rule: "Moira: Flourish"
Event.OngoingPlayer
Team.Team1
Player.Moira
if (IsUsingAbility1(EventPlayer()) == true)
if (abilities[8] == true)
{
StartDamageOverTime(PlayersWithinRadius(EventPlayer(), 3, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), 2, 25);
StartHealOverTime(PlayersWithinRadius(EventPlayer(), 3, Team.Team1, RadiusLOS.Surfaces), EventPlayer(), 2, 40);
PlayEffect(AllPlayers(Team.All), PlayEffect.RingExplosion, Color.Black, PositionOf(EventPlayer()), 6);
Wait(0.2, WaitBehavior.IgnoreCondition);
LoopIfConditionIsTrue();
}
rule: "Moira: Catalyst"
Event.OngoingPlayer
Player.Moira
if (abilities[12] == true)
if (IsUsingUltimate(EventPlayer()) == true)
if (IsButtonHeld(EventPlayer(), Button.PrimaryFire) == true)
if (AbilityResource(EventPlayer(), Button.PrimaryFire) > 8)
{
damageBoost[1] += 300;
healBoost[1] += 300;
speedBoost -= 40;
UpdatePlayerStats();
WaitUntil(!IsButtonHeld(EventPlayer(), Button.PrimaryFire) || !abilities[12] || !IsUsingUltimate(EventPlayer()), 8);
damageBoost[1] -= 300;
speedBoost += 40;
healBoost[1] -= 300;
UpdatePlayerStats();
Wait(0.25, WaitBehavior.IgnoreCondition);
}
rule: "Moira: Catalyst"
Event.OngoingPlayer
Player.Moira
if (abilities[12] == true)
if (IsUsingUltimate(EventPlayer()) == true)
if (IsButtonHeld(EventPlayer(), Button.PrimaryFire) == true)
if (AbilityResource(EventPlayer(), Button.PrimaryFire) > 8)
{
SetAbilityResource(EventPlayer(), Button.PrimaryFire, AbilityResource(EventPlayer(), Button.PrimaryFire) - 15);
PlayEffect(AllPlayers(Team.All), PlayEffect.RingExplosion, Color.Purple, EyePosition(EventPlayer()), 10);
Damage(PlayersWithinRadius(EyePosition(EventPlayer()), 5, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), 35);
Wait(0.5, WaitBehavior.IgnoreCondition);
LoopIfConditionIsTrue();
}
rule: "Orisa: Melting Point"
Event.OngoingPlayer
Team.Team1
Player.Orisa
if (abilities[8] == true)
if (IsUsingAbility2(EventPlayer()) == true)
{
WaitUntil(!IsUsingAbility2(EventPlayer()), 99999);
Damage(PlayersWithinRadius(EventPlayer(), 12, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), 70);
PlayEffect(AllPlayers(Team.All), PlayEffect.RingExplosion, Color.LimeGreen, PositionOf(EventPlayer()), 24);
ApplyImpulse(PlayersWithinRadius(EventPlayer(), 12, Team.Team2, RadiusLOS.Surfaces), Up(), 8, Relative.ToWorld, ContraryMotion.Cancel);
SetStatus(PlayersWithinRadius(EventPlayer(), 12, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), Status.Rooted, 1.5);
}
rule: "Orisa: Flaming Harpoon"
Event.PlayerDealtKnockback
Team.Team1
Player.Orisa
if (EventAbility() == Button.SecondaryFire)
if (abilities[12] == true)
{
StartDamageOverTime(Victim(), EventPlayer(), 3, 20);
SetStatus(Victim(), null, Status.Burning, 3);
SetStatus(Victim(), EventPlayer(), Status.Stunned, 1);
}
rule: "Pharah: Head Trauma"
Event.PlayerDealtKnockback
Team.Team1
Player.Pharah
if (abilities[8] == true)
if (EventAbility() == Button.Ability2)
if (Victim() != EventPlayer())
{
Damage(Victim(), EventPlayer(), 60);
PlayEffect(AllPlayers(Team.All), PlayEffect.GoodExplosion, Color.Gray, Victim(), 1);
AbortIf(NormalizedHealth(Victim()) > 0.5);
SetStatus(Victim(), null, Status.Hacked, 1);
}
rule: "Pharah: Weaponized Storm"
Event.OngoingPlayer
Player.Pharah
if (abilities[12] == true)
if (IsFiringPrimary(EventPlayer()) == true)
if (Ammo(EventPlayer(), false) % 6 == false)
{
SetProjectileSpeed(EventPlayer(), 125);
abilityEnd = RayCastHitPosition(EyePosition(EventPlayer()), EyePosition(EventPlayer()) + FacingDirectionOf(EventPlayer()) * 100, AllLivingPlayers(Team.All), EventPlayer(), true);
abilityProjectile = EyePosition(EventPlayer());
CreateEffect(AllPlayers(Team.All), Effect.BadAura, Color.Orange, abilityProjectile, 1, EffectRev.VisibleToPositionAndRadius);
effects[7] = LastCreatedEntity();
ChaseVariableAtRate(abilityProjectile, abilityEnd, 35, RateChaseReevaluation.DestinationAndRate);
WaitUntil(!abilities[12] || abilityProjectile == abilityEnd, 99999);
DestroyEffect(effects[7]);
for (p_loopIterator = 0; 6; 1)
{
PlayEffect(AllPlayers(Team.All), PlayEffect.BadPickupEffect, Color.Orange, abilityProjectile + Vector(RandomReal(-1.5, 1.5), RandomReal(-0.5, 0.5), RandomReal(-1.5, 1.5)), 1);
PlayEffect(AllPlayers(Team.All), PlayEffect.ExplosionSound, Color.Team1, abilityProjectile, 25);
Damage(PlayersWithinRadius(abilityProjectile, 4, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), 20);
Wait(0.1, WaitBehavior.IgnoreCondition);
}
SetProjectileSpeed(EventPlayer(), 100);
StopChasingVariable(abilityProjectile);
}
rule: "Ramattra: Vile Dominance"
Event.OngoingPlayer
Team.Team1
Player.Ramattra
if (abilities[8] == true)
if (HealthOfType(EventPlayer(), HealthType.Armor) >= 100)
{
speedBoost += 30;
abilityActive = true;
UpdatePlayerStats();
WaitUntil(AbilityCooldown(EventPlayer(), Button.Ability1) > 0.1 && !IsUsingUltimate(EventPlayer()) || !abilities[8], 9999);
speedBoost -= 30;
abilityActive = false;
UpdatePlayerStats();
}
rule: "Ramattra: Vile Dominance"
Event.OnDamageDealt
Team.Team1
Player.Ramattra
{
AbortIf(!abilityActive);
AbortIf(EventAbility() == null);
AbortIf(EventAbility() == Button.Ability2);
AbortIf(EventAbility() == Button.Ultimate);
SetStatus(Victim(), EventPlayer(), Status.Rooted, 0.75);
}
rule: "Ramattra: Nether Sector"
Event.OnDamageDealt
Team.Team1
Player.Ramattra
{
AbortIf(!abilities[12]);
AbortIf(!IsOnGround(EventPlayer()));
AbortIf(EventAbility() != Button.Ability2);
Heal(EventPlayer(), EventPlayer(), 20);
SetUltimateCharge(EventPlayer(), UltimateChargePercent(EventPlayer()) + 1);
Wait(0.1, WaitBehavior.IgnoreCondition);
}
rule: "Reaper: Wraith Wrath"
Event.OngoingPlayer
Team.Team1
Player.Reaper
if (IsUsingAbility1(EventPlayer()) == true)
if (abilities[8] == true)
{
Wait(0.1, WaitBehavior.AbortWhenFalse);
CancelPrimaryAction(EventPlayer());
CreateEffect(AllPlayers(Team.All), Effect.ReaperWraithFormEffect, Color.Team1, EventPlayer(), true, EffectRev.VisibleToPositionAndRadius);
effects[1] = LastCreatedEntity();
damageBoost[1] += 30;
speedBoost += 50;
UpdatePlayerStats();
DisallowButton(EventPlayer(), Button.Ability1);
SetStatus(EventPlayer(), null, Status.PhasedOut, 3);
WaitUntil(IsDead(EventPlayer()) || !abilities[8], 3);
AllowButton(EventPlayer(), Button.Ability1);
SetAbilityCooldown(EventPlayer(), Button.Ability1, 8);
damageBoost[1] -= 30;
speedBoost -= 50;
UpdatePlayerStats();
DestroyEffect(effects[1]);
}
rule: "Reaper: Loom"
Event.OngoingPlayer
Team.Team1
Player.Reaper
if (IsUsingAbility1(EventPlayer()) == true)
if (abilities[12] == true)
{
SetStatus(FilteredArray(PlayersInViewAngle(EventPlayer(), Team.Team2, 45), IsInLineOfSight(EventPlayer(), ArrayElement(), BarrierLOS.NoBarriersBlock)), EventPlayer(), Status.Hacked, 2);
Damage(FilteredArray(PlayersInViewAngle(EventPlayer(), Team.Team2, 45), IsInLineOfSight(ArrayElement(), EventPlayer(), BarrierLOS.NoBarriersBlock)), EventPlayer(), 35);
}
rule: "Reinhardt: Fire Blast"
Event.OnDamageDealt
Team.Team1
Player.Reinhardt
{
AbortIf(!abilities[8]);
AbortIf(EventAbility() != Button.Ability2);
PlayEffect(AllPlayers(Team.All), PlayEffect.GoodExplosion, Color.Orange, Victim(), 5);
StartDamageOverTime(PlayersWithinRadius(Victim(), 5, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), 5, 20);
SetStatus(PlayersWithinRadius(Victim(), 5, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), Status.Burning, 5);
}
rule: "Reinhardt: Epicenter"
Event.OngoingPlayer
Team.Team1
Player.Reinhardt
if (abilities[12] == true)
if (IsUsingUltimate(EventPlayer()) == true)
if (IsOnGround(EventPlayer()) == true)
{
SetStatus(PlayersWithinRadius(EventPlayer(), 20, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), Status.KnockedDown, 2.5);
for (p_loopIterator = 0; 3; 1)
{
Wait(0.032, WaitBehavior.IgnoreCondition);
Damage(PlayersWithinRadius(EventPlayer(), p_loopIterator * 10, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), 50);
PlayEffect(AllPlayers(Team.All), PlayEffect.RingExplosion, Color.Orange, PositionOf(EventPlayer()), p_loopIterator * 20);
}
Wait(5, WaitBehavior.IgnoreCondition);
}
rule: "Roadhog: Stench"
Event.OngoingPlayer
Team.Team1
Player.Roadhog
if (abilities[8] == true)
if (IsAlive(EventPlayer()) == true)
{
CreateEffect(AllPlayers(Team.All), Effect.Ring, Color.Violet, EventPlayer(), 8, EffectRev.VisibleToPositionAndRadius);
effects[1] = LastCreatedEntity();
WaitUntil(!abilities[8] || IsDead(EventPlayer()), 99999);
DestroyEffect(effects[1]);
Wait(0.1, WaitBehavior.IgnoreCondition);
LoopIfConditionIsTrue();
}
rule: "Roadhog: Stench effect"
Event.OngoingPlayer
Team.Team1
Player.Roadhog
if (DistanceBetween(EventPlayer(), ClosestPlayerTo(EventPlayer(), Team.Team2)) <= 8)
if (abilities[8] == true)
{
Damage(PlayersWithinRadius(EventPlayer(), 8, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), 9);
Wait(0.4, WaitBehavior.IgnoreCondition);
LoopIfConditionIsTrue();
}
rule: "Roadhog: Chainsnap"
Event.OngoingPlayer
Team.Team1
Player.Roadhog
if (abilities[12] == true)
if (IsAlive(EventPlayer()) == true)
{
StartDamageModification(IsUsingAbility1(EventPlayer()) ? AllPlayers(Team.Team2) : [], EventPlayer(), 400, DamageModificationRev.ReceiversDamagersAndDamagePercent);
damageMod = LastDamageModificationID();
WaitUntil(!abilities[12] || IsDead(EventPlayer()), 99999);
StopDamageModification(damageMod);
Wait(0.1, WaitBehavior.IgnoreCondition);
LoopIfConditionIsTrue();
}
rule: "Roadhog: Chainsnap - Reset cooldown"
Event.OnElimination
Team.Team1
Player.Roadhog
if (abilities[12] == true)
{
WaitUntil(!IsUsingAbility1(EventPlayer()), 3);
SetAbilityCooldown(EventPlayer(), Button.Ability1, false);
}
rule: "Sigma: Accretion Disk"
Event.OngoingPlayer
Team.Team1
Player.Sigma
if (abilities[8] == true)
if (IsUsingAbility2(EventPlayer()) == true)
{
SetProjectileSpeed(EventPlayer(), 150);
SetProjectileGravity(EventPlayer(), 0);
WaitUntil(!abilities[8] || !IsUsingAbility2(EventPlayer()), 5);
SetProjectileSpeed(EventPlayer(), 100);
SetProjectileGravity(EventPlayer(), 100);
}
rule: "Sigma: Accretion Disk"
Event.PlayerDealtKnockback
Team.Team1
Player.Sigma
{
AbortIf(!abilities[8]);
AbortIf(EventAbility() != Button.Ability2);
AbortIf(Victim() == EventPlayer());
SetStatus(Victim(), EventPlayer(), Status.KnockedDown, 1.5);
Damage(Victim(), EventPlayer(), EventDamage() * 0.75);
}
rule: "Sigma: String Theory"
Event.OngoingPlayer
Team.Team1
Player.Sigma
if (abilities[12] == true)
if (IsUsingAbility1(EventPlayer()) == true)
{
Wait(1.8, WaitBehavior.AbortWhenFalse);
abilityProjectile = EyePosition(EventPlayer());
abilityEnd = RayCastHitPosition(EyePosition(EventPlayer()), EyePosition(EventPlayer()) + FacingDirectionOf(EventPlayer()) * 50, AllPlayers(Team.Team2), EventPlayer(), true);
ChaseVariableAtRate(abilityProjectile, abilityEnd, 40, RateChaseReevaluation.DestinationAndRate);
CreateEffect(AllPlayers(Team.All), Effect.Sphere, Color.Violet, abilityProjectile, 0.6, EffectRev.VisibleToPositionAndRadius);
effects[1] = LastCreatedEntity();
CreateEffect(AllPlayers(Team.All), Effect.GoodAura, Color.Violet, abilityProjectile, 0.6, EffectRev.VisibleToPositionAndRadius);
effects[2] = LastCreatedEntity();
Wait(0.25, WaitBehavior.IgnoreCondition);
abilityCountdown = HealthOfType(EventPlayer(), HealthType.Shields);
WaitUntil(!abilities[12] || abilityProjectile == abilityEnd, 5);
StopChasingVariable(abilityProjectile);
DestroyEffect(effects[1]);
DestroyEffect(effects[2]);
Damage(PlayersWithinRadius(abilityProjectile, Min(10, 1.5 + abilityCountdown * 0.017), Team.Team2, RadiusLOS.Off), EventPlayer(), Min(200, 100 + abilityCountdown / 5));
PlayEffect(AllPlayers(Team.All), PlayEffect.DebuffImpactSound, Color.Violet, abilityProjectile, 150);
PlayEffect(AllPlayers(Team.All), PlayEffect.BadExplosion, Color.Violet, abilityProjectile, Min(10, 1.5 + abilityCountdown * 0.017));
PlayEffect(AllPlayers(Team.All), PlayEffect.GoodExplosion, Color.Purple, abilityProjectile, Min(10, 1.5 + abilityCountdown * 0.017));
PlayEffect(AllPlayers(Team.All), PlayEffect.RingExplosion, Color.Violet, abilityProjectile, Min(20, 3 + abilityCountdown * 0.017));
}
rule: "Sojourn: Thunderout Kicks"
Event.OngoingPlayer
Team.Team1
Player.Sojourn
if (abilities[8] == true)
if (IsUsingAbility1(EventPlayer()) == true)
{
abilityActive = 1 + TotalTimeElapsed();
WaitUntil(AbilityCooldown(EventPlayer(), Button.Ability1) > 1 || IsButtonHeld(EventPlayer(), Button.Jump), 1);
AbortIf(abilityActive < TotalTimeElapsed());
PlayEffect(AllPlayers(Team.All), PlayEffect.RingExplosion, Color.Turquoise, PositionOf(EventPlayer()), 12);
Damage(PlayersWithinRadius(EventPlayer(), 6, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), 75);
}
rule: "Sojourn: Matter Splatter"
Event.OnDamageDealt
Team.Team1
Player.Sojourn
{
AbortIf(!abilities[12]);
AbortIf(EventAbility() != Button.SecondaryFire);
AbortIf(!EventWasCriticalHit());
PlayEffect(AllPlayers(Team.All), PlayEffect.BadExplosion, Color.Turquoise, EyePosition(Victim()), 3.5);
Damage(RemoveFromArray(PlayersWithinRadius(Victim(), 3.5, Team.Team2, RadiusLOS.Surfaces), Victim()), EventPlayer(), EventDamage());
}
rule: "Soldier76: Triple Threat"
Event.OngoingPlayer
Team.Team1
Player.Soldier76
if (abilities[8] == true)
if (IsFiringSecondary(EventPlayer()) == true)
{
abilityCountdown = RayCastHitPosition(EyePosition(EventPlayer()), RayCastHitPosition(EyePosition(EventPlayer()), EyePosition(EventPlayer()) + FacingDirectionOf(EventPlayer()) * 60, AllLivingPlayers(Team.Team2), null, false) + WorldVectorOf(Vector(-2, false, false), EventPlayer(), LocalVector.Rotation), AllLivingPlayers(Team.Team2), null, false);
abilityProjectile = RayCastHitPosition(EyePosition(EventPlayer()), RayCastHitPosition(EyePosition(EventPlayer()), EyePosition(EventPlayer()) + FacingDirectionOf(EventPlayer()) * 60, AllLivingPlayers(Team.Team2), null, false) + WorldVectorOf(Vector(2, false, false), EventPlayer(), LocalVector.Rotation), AllLivingPlayers(Team.Team2), null, false);
abilityAvailable = EyePosition(EventPlayer()) + WorldVectorOf(Vector(false, -0.25, false), EventPlayer(), LocalVector.Rotation);
abilityEnd = EyePosition(EventPlayer()) + WorldVectorOf(Vector(false, -0.25, false), EventPlayer(), LocalVector.Rotation);
ChaseVariableAtRate(abilityAvailable, abilityProjectile, 60, RateChaseReevaluation.DestinationAndRate);
ChaseVariableAtRate(abilityEnd, abilityCountdown, 60, RateChaseReevaluation.DestinationAndRate);
}
rule: "Soldier76: Triple Threat - First Rocket"
Event.OngoingPlayer
Team.Team1
Player.Soldier76
if (abilityProjectile != abilityAvailable)
if (abilities[8] == true)
if (AbilityCooldown(EventPlayer(), Button.SecondaryFire) > 0.1)
{
PlayEffect(AllPlayers(Team.All), PlayEffect.GoodExplosion, Color.Aqua, abilityAvailable, 0.4);
Wait(0.064, WaitBehavior.IgnoreCondition);
LoopIfConditionIsTrue();
PlayEffect(AllPlayers(Team.All), PlayEffect.GoodExplosion, Color.SkyBlue, abilityAvailable, 2.5);
StopChasingVariable(abilityAvailable);
MinWait();
Damage(PlayersWithinRadius(abilityAvailable, 2.5, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), 80);
StopChasingVariable(abilityAvailable);
abilityAvailable = false;
abilityProjectile = false;
MinWait();
}
rule: "Soldier76: Triple Threat - Second Rocket"
Event.OngoingPlayer
Team.Team1
Player.Soldier76
if (abilityCountdown != abilityEnd)
if (abilities[8] == true)
if (AbilityCooldown(EventPlayer(), Button.SecondaryFire) > 0.1)
{
PlayEffect(AllPlayers(Team.All), PlayEffect.GoodExplosion, Color.Aqua, abilityEnd, 0.4);
Wait(0.064, WaitBehavior.IgnoreCondition);
LoopIfConditionIsTrue();
PlayEffect(AllPlayers(Team.All), PlayEffect.GoodExplosion, Color.SkyBlue, abilityEnd, 2.5);
StopChasingVariable(abilityEnd);
Damage(PlayersWithinRadius(abilityEnd, 2.5, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), 80);
abilityEnd = false;
abilityCountdown = false;
}
rule: "Soldier76: Triple Threat - Init rocket"
Event.OngoingPlayer
Team.Team1
Player.Soldier76
if (abilities[8] == true)
{
abilityProjectile = abilityAvailable;
abilityCountdown = abilityEnd;
}
rule: "Soldier76: Espionage"
Event.OnHealingDealt
Team.Team1
Player.Soldier76
{
AbortIf(!abilities[12]);
AbortIf(EventAbility() != Button.Ability2);
if (!Healee().soldierEspionage)
{
Healee().soldierEspionage = true;
}
}
rule: "Soldier76: Espionage - Allies effect"
Event.OngoingPlayer
Team.Team1
if (soldierEspionage == true)
{
soldierEspionage = false;
Wait(0.4, WaitBehavior.IgnoreCondition);
}
rule: "Sombra: Going Viral"
Event.OngoingPlayer
Team.Team1
Player.Sombra
if (abilities[8] == true)
if (IsUsingAbility1(EventPlayer()) == true)
{
Wait(0.5, WaitBehavior.AbortWhenFalse);
WaitUntil(!IsUsingAbility1(EventPlayer()), 20);
CreateEffect(AllPlayers(Team.All), Effect.Sphere, Color.Purple, EventPlayer(), 24 * TotalTimeElapsed() % 12, EffectRev.VisibleToPositionAndRadius);
effects[1] = LastCreatedEntity();
SetAbilityCooldown(EventPlayer(), Button.SecondaryFire, 0);
SetStatus(EventPlayer(), EventPlayer(), Status.Invincible, 0.75);
Wait(0.5, WaitBehavior.IgnoreCondition);
Damage(PlayersWithinRadius(EventPlayer(), 12, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), 50);
SetStatus(PlayersWithinRadius(EventPlayer(), 12, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), Status.Hacked, 8);
DestroyEffect(effects[1]);
}
rule: "Sombra: Cyberattack"
Event.OngoingPlayer
Team.Team1
Player.Sombra
if (abilities[12] == true)
if (IsUsingAbility2(EventPlayer()) == true)
{
WaitUntil(!IsUsingAbility2(EventPlayer()), 99999);
AbortIf(IsButtonHeld(EventPlayer(), Button.Interact) || AbilityCooldown(EventPlayer(), Button.Ability2) >= 2.8);
AbortIf(IsDead(EventPlayer()));
Wait(0.25, WaitBehavior.IgnoreCondition);
Damage(PlayersWithinRadius(EventPlayer(), 8, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), 80);
PlayEffect(AllPlayers(Team.All), PlayEffect.RingExplosionSound, Color.White, EyePosition(EventPlayer()), 20000);
PlayEffect(AllPlayers(Team.All), PlayEffect.GoodExplosion, Color.Purple, EyePosition(EventPlayer()), 8);
PlayEffect(AllPlayers(Team.All), PlayEffect.RingExplosion, Color.Violet, EyePosition(EventPlayer()), 16);
SetStatus(PlayersWithinRadius(EyePosition(EventPlayer()), 8, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), Status.Hacked, 3);
}
rule: "Symmetra: Sentry Paragon"
Event.OngoingPlayer
Team.Team1
Player.Symmetra
if (abilities[8] == true)
if (IsAlive(EventPlayer()) == true)
{
Wait(0.5, WaitBehavior.AbortWhenFalse);
StartDamageModification(AllPlayers(Team.Team2), EventPlayer(), 66.667, DamageModificationRev.ReceiversDamagersAndDamagePercent);
damageMod = LastDamageModificationID();
damageBoost[1] += 50;
UpdatePlayerStats();
WaitUntil(!abilities[8] || IsDead(EventPlayer()), 99999);
damageBoost[1] -= 50;
UpdatePlayerStats();
StopDamageModification(damageMod);
Wait(0.1, WaitBehavior.IgnoreCondition);
LoopIfConditionIsTrue();
}
rule: "Symmetra: Shield Generator"
Event.OnFinalBlow
Team.Team1
Player.Symmetra
if (abilities[12] == true)
{
damageBoost[1] += 30;
speedBoost += 30;
UpdatePlayerStats();
AddHealthPoolToPlayer(AllPlayers(Team.Team1), HealthType.Shields, Min(200, MaxHealth(EventPlayer()) * 0.25), false, false);
hpPool[6] = LastCreatedHealthPool();
CreateEffect(AllPlayers(Team.All), Effect.AnaNanoBoostedEffect, Color.Team1, EventPlayer(), 1, EffectRev.VisibleToPositionAndRadius);
effects[1] = LastCreatedEntity();
WaitUntil(!abilities[12] || IsDead(EventPlayer()), 10);
DestroyEffect(effects[1]);
RemoveHealthPoolFromPlayer(hpPool[6]);
damageBoost[1] -= 30;
speedBoost -= 30;
UpdatePlayerStats();
}
rule: "Torbjorn: Heatwave"
Event.OngoingPlayer
Team.Team1
Player.Torbjorn
if (abilities[8] == true)
if ((IsUsingAbility2(EventPlayer()) || IsUsingUltimate(EventPlayer())) == true)
{
PlayEffect(AllPlayers(Team.All), PlayEffect.RingExplosion, Color.Orange, PositionOf(EventPlayer()), 11);
PlayEffect(AllPlayers(Team.All), PlayEffect.RingExplosion, Color.Orange, PositionOf(EventPlayer()), 12);
StartDamageOverTime(RemoveFromArray(PlayersWithinRadius(EventPlayer(), 6, Team.Team2, RadiusLOS.Surfaces), EventPlayer()), EventPlayer(), 3, 20);
SetStatus(RemoveFromArray(PlayersWithinRadius(EventPlayer(), 6, Team.Team2, RadiusLOS.Surfaces), EventPlayer()), EventPlayer(), Status.Burning, 3);
Damage(PlayersWithinRadius(EventPlayer(), 6, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), 15);
Wait(0.75, WaitBehavior.IgnoreCondition);
LoopIfConditionIsTrue();
}
rule: "Torbjorn: Melting Point"
Event.OnElimination
Team.Team1
Player.Torbjorn
if (abilities[12] == true)
if (EventAbility() == Button.Ability1)
{
abilityCountdown += 6;
ChaseVariableAtRate(abilityCountdown, 0, 1, RateChaseReevaluation.DestinationAndRate);
}
rule: "Torbjorn: Melting Point - Boost"
Event.OngoingPlayer
Team.Team1
Player.Torbjorn
if (abilities[12] == true)
if (abilityCountdown > 0)
{
StartDamageModification(AllPlayers(Team.Team2), EventPlayer(), 33, DamageModificationRev.ReceiversDamagersAndDamagePercent);
damageMod = LastDamageModificationID();
damageBoost[1] += 300;
UpdatePlayerStats();
WaitUntil(IsDead(EventPlayer()) || !abilityCountdown || !abilities[12], 99999);
abilityCountdown = false;
StopDamageModification(damageMod);
damageBoost[1] -= 300;
UpdatePlayerStats();
StopChasingVariable(abilityCountdown);
}
rule: "Tracer: Vortex"
Event.OngoingPlayer
Team.Team1
Player.Tracer
if (IsUsingAbility2(EventPlayer()) == true)
if (abilities[8] == true)
{
Heal(PlayersWithinRadius(EventPlayer(), 10, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), 1);
Damage(PlayersWithinRadius(EventPlayer(), 10, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), 25);
PlayEffect(AllPlayers(Team.All), PlayEffect.RingExplosion, Color.Red, PositionOf(EventPlayer()), 20);
PlayEffect(AllPlayers(Team.All), PlayEffect.RingExplosion, Color.Yellow, PositionOf(EventPlayer()), 18);
PlayEffect(AllPlayers(Team.All), PlayEffect.RingExplosion, Color.Green, PositionOf(EventPlayer()), 16);
PlayEffect(AllPlayers(Team.All), PlayEffect.RingExplosion, Color.Aqua, PositionOf(EventPlayer()), 14);
SetEnvironmentCreditPlayer(PlayersWithinRadius(EventPlayer(), 10, Team.Team2, RadiusLOS.Surfaces), EventPlayer());
}
rule: "Tracer: Vortex 2"
Event.OnHealingTaken
Team.Team2
{
AbortIf(!Healer().abilities[8]);
AbortIf(!IsUsingAbility2(Healer()));
DisableMovementCollisionWithPlayers(EventPlayer());
ApplyImpulse(EventPlayer(), Up(), 3, Relative.ToWorld, ContraryMotion.Cancel);
SetGravity(EventPlayer(), false);
Wait(0.05, WaitBehavior.IgnoreCondition);
ApplyImpulse(EventPlayer(), DirectionTowards(EventPlayer(), Healer()), DistanceBetween(EventPlayer(), Healer()) * 3.4, Relative.ToWorld, ContraryMotion.Cancel);
SetStatus(EventPlayer(), null, Status.Rooted, 1);
Wait(0.23, WaitBehavior.IgnoreCondition);
SetGravity(EventPlayer(), 100);
EnableMovementCollisionWithPlayers(EventPlayer());
CancelMomentum();
}
rule: "Tracer: Chain Reaction"
Event.OngoingPlayer
Team.Team2
if (IsTrueForAny(FilteredArray(AllLivingPlayers(Team.Team2), ArrayElement().chainReactionOn), DistanceBetween(EventPlayer(), ArrayElement()) <= 7) == true)
if (chainReactionImmune == false)
if (chainReactionOn == false)
if (IsAlive(EventPlayer()) == true)
{
Wait(0.25, WaitBehavior.IgnoreCondition);
chainReactionOn = true;
}
rule: "Tracer: Chain Reaction 2"
Event.OngoingPlayer
Team.Team2
if (chainReactionOn == true)
{
Wait(0.1, WaitBehavior.IgnoreCondition);
PlayEffect(AllPlayers(Team.All), PlayEffect.GoodExplosion, Color.Aqua, EventPlayer(), 3);
Damage(EventPlayer(), PlayersOnHero(Hero.Tracer, Team.Team1), 200);
Wait(0.5, WaitBehavior.IgnoreCondition);
chainReactionImmune = true;
chainReactionOn = false;
Wait(2, WaitBehavior.IgnoreCondition);
chainReactionImmune = false;
}
rule: "Tracer: Chain Reaction 3"
Event.OnDamageDealt
Team.Team1
Player.Tracer
{
AbortIf(!abilities[12]);
AbortIf(EventAbility() != Button.Ultimate);
AbortIf(EventDamage() <= 20);
Victim().chainReactionOn = true;
}
rule: "Widowmaker: Baiser De Soie"
Event.OnDamageDealt
Team.Team1
Player.Widowmaker
{
AbortIf(!abilities[8]);
AbortIf(EventAbility() != Button.PrimaryFire);
AbortIf(!IsFiringSecondary(EventPlayer()));
AbortIf(!EventWasCriticalHit());
AbortIf(NormalizedHealth(Victim()) > 0.3);
PlayEffect(AllPlayers(Team.All), PlayEffect.BadPickupEffect, Color.Violet, Victim(), 3);
Damage(Victim(), EventPlayer(), 10000);
Damage(PlayersWithinRadius(Victim(), 3, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), EventDamage());
}
rule: "Widowmaker: Felt More Alive"
Event.OngoingPlayer
Team.Team1
Player.Widowmaker
if (abilities[12] == true)
if (IsFiringSecondary(EventPlayer()) == true)
if (IsInAir(EventPlayer()) == true)
{
SetGravity(EventPlayer(), 20);
damageBoost[1] += 40;
UpdatePlayerStats();
WaitUntil(!IsFiringSecondary(EventPlayer()) || !abilities[12] || !IsInAir(EventPlayer()), 99999);
SetGravity(EventPlayer(), 100);
damageBoost[1] -= 40;
UpdatePlayerStats();
}
rule: "Winston: Lightning Strikes Twice"
Event.OnDamageDealt
Team.Team1
Player.Winston
{
AbortIf(!abilities[8]);
AbortIf(EventAbility() != Button.SecondaryFire);
Wait(1, WaitBehavior.IgnoreCondition);
AbortIf(IsDead(Victim()));
Damage(Victim(), EventPlayer(), EventDamage());
PlayEffect(AllPlayers(Team.All), PlayEffect.RingExplosionSound, Color.White, Victim(), 50);
PlayEffect(AllPlayers(Team.All), PlayEffect.BadExplosion, Color.Blue, Victim(), 1);
}
rule: "Winston: Quake"
Event.OngoingPlayer
Team.Team1
Player.Winston
if (abilities[12] == true)
if (IsUsingAbility1(EventPlayer()) == true)
{
Wait(0.25, WaitBehavior.IgnoreCondition);
WaitUntil(IsOnGround(EventPlayer()), 99999);
AbortIf(IsDead(EventPlayer()));
Damage(PlayersWithinRadius(EventPlayer(), 7.5, Team.Team2, RadiusLOS.SurfacesAndAllBarriers), EventPlayer(), 30);
PlayEffect(AllPlayers(Team.All), PlayEffect.RingExplosion, Color.White, PositionOf(EventPlayer()), 15);
PlayEffect(AllPlayers(Team.All), PlayEffect.RingExplosion, Color.Gray, PositionOf(EventPlayer()), 14);
SetStatus(PlayersWithinRadius(EventPlayer(), 7.5, Team.Team2, RadiusLOS.SurfacesAndAllBarriers), EventPlayer(), Status.Stunned, 1);
}
rule: "Wrecking Ball: Mirror Ball"
Event.OnDamageTaken
Team.Team1
Player.WreckingBall
{
AbortIf(!abilities[8]);
Damage(PlayersWithinRadius(EventPlayer(), 4, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), EventDamage() * 0.6);
}
rule: "Wrecking Ball: Distort"
Event.OngoingPlayer
Team.Team1
Player.WreckingBall
if (abilities[12] == true)
if (IsUsingAbility2(EventPlayer()) == true)
{
for (p_loopIterator = false; 4; 1)
{
PlayEffect(AllPlayers(Team.All), PlayEffect.RingExplosion, Color.Purple, PositionOf(EventPlayer()), 20);
Damage(PlayersWithinRadius(EventPlayer(), 10, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), 25);
SetStatus(PlayersWithinRadius(EventPlayer(), 10, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), Status.Hacked, 2);
Wait(0.1, WaitBehavior.IgnoreCondition);
}
}
rule: "Zarya: Combusta-bubble - Detect Barrier Target"
Event.OngoingPlayer
Team.Team1
Player.Zarya
if (abilities[8] == true)
if (IsUsingAbility2(EventPlayer()) == true)
{
Wait(0.025, WaitBehavior.IgnoreCondition);
abilityEnd = FirstOf(FilteredArray(PlayersWithinRadius(EventPlayer(), 30, Team.Team1, RadiusLOS.Surfaces), HasStatus(ArrayElement(), Status.Invincible) && IsAlive(ArrayElement()) && IsInViewAngle(EventPlayer(), ArrayElement(), 103)));
WaitUntil(!IsUsingAbility2(EventPlayer()), 2);
PlayEffect(AllPlayers(Team.All), PlayEffect.ExplosionSound, Color.Orange, abilityEnd, 120);
PlayEffect(AllPlayers(Team.All), PlayEffect.GoodExplosion, Color.Orange, EyePosition(abilityEnd), 6);
PlayEffect(AllPlayers(Team.All), PlayEffect.BadPickupEffect, Color.Yellow, EyePosition(abilityEnd), 6);
Damage(PlayersWithinRadius(EyePosition(abilityEnd), 6, Team.Team2, RadiusLOS.Surfaces), abilityEnd, 100);
}
rule: "Zarya: Combusta-Bubble - Self bubble"
Event.OngoingPlayer
Team.Team1
Player.Zarya
if (abilities[8] == true)
if (IsUsingAbility1(EventPlayer()) == true)
{
Wait(0.1, WaitBehavior.AbortWhenFalse);
WaitUntil(!IsUsingAbility1(EventPlayer()), 2);
PlayEffect(AllPlayers(Team.All), PlayEffect.ExplosionSound, Color.Orange, EventPlayer(), 120);
PlayEffect(AllPlayers(Team.All), PlayEffect.GoodExplosion, Color.Orange, EyePosition(EventPlayer()), 6);
PlayEffect(AllPlayers(Team.All), PlayEffect.BadPickupEffect, Color.Yellow, EyePosition(EventPlayer()), 6);
Damage(PlayersWithinRadius(EventPlayer(), 6, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), 100);
}
rule: "Zarya: Power Surge"
Event.OngoingPlayer
Team.Team1
Player.Zarya
if (abilities[12] == true)
if (IsUsingAbility1(EventPlayer()) == true)
{
AbortIf(!HasStatus(EventPlayer(), Status.Invincible));
Damage(EventPlayer(), null, 10000);
Wait(0.1, WaitBehavior.IgnoreCondition);
SetAbilityCooldown(EventPlayer(), Button.Ability1, false);
PressButton(EventPlayer(), Button.Ability1);
Wait(3, WaitBehavior.IgnoreCondition);
}
rule: "Zenyatta: Stress Relief"
Event.OngoingPlayer
Team.Team1
Player.Zenyatta
if (abilities[8] == true)
if (IsFiringSecondary(EventPlayer()) == true)
{
Wait(2, WaitBehavior.AbortWhenFalse);
PlayEffect(EventPlayer(), PlayEffect.ExplosionSound, Color.Black, EventPlayer(), 150);
damageBoost[1] += 50;
UpdatePlayerStats();
Wait(0.75, WaitBehavior.IgnoreCondition);
damageBoost[1] -= 50;
UpdatePlayerStats();
}
rule: "Zenyatta: Perfect Balance"
Event.OngoingPlayer
Team.Team1
Player.Zenyatta
if (IsUsingUltimate(EventPlayer()) == true)
if (abilities[12] == true)
{
StartDamageOverTime(PlayersWithinRadius(EventPlayer(), 12, Team.Team2, RadiusLOS.Surfaces), EventPlayer(), 1, 100);
PlayEffect(AllPlayers(Team.All), PlayEffect.RingExplosion, Color.Orange, EventPlayer(), 24);
Wait(1, WaitBehavior.IgnoreCondition);
LoopIfConditionIsTrue();
}
rule: "Team 1 (perk): Bulletstorm"
Event.OngoingPlayer
Team.Team1
if (perk[1] == true)
if ((Ammo(EventPlayer(), 0) < MaxAmmo(EventPlayer(), 0) || Ammo(EventPlayer(), 1) < MaxAmmo(EventPlayer(), 1)) == true)
{
SetAmmo(EventPlayer(), 0, 1000);
SetAmmo(EventPlayer(), 1, 1000);
}
rule: "Team 1 Challenges"
Event.OnPlayerJoin
Team.Team1
{
if (perk[2] == 1)
{
CreateHudText(EventPlayer(), null, "Up You Go", null, Location.Left, 917, Color.White, Color.Green, Color.White, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
abilityHUD[17] = LastTextID();
}
if (perk[0] == 1)
{
CreateHudText(EventPlayer(), null, "Sharpshooter", null, Location.Left, 918, Color.White, Color.Green, Color.White, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
abilityHUD[18] = LastTextID();
}
if (perk[1] == 1)
{
CreateHudText(EventPlayer(), null, "Bulletstorm", null, Location.Left, 919, Color.White, Color.Green, Color.White, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
abilityHUD[19] = LastTextID();
}
UpdatePlayerStats();
}
rule: "Stuff to do when Player leaves"
Event.OnPlayerLeave
Team.Team1
{
automaticRepair -= abilities[16];
}
void Refund() "Refund"
{
# Refund Money
money[0] += money[1];
money[1] = 0;
# Reset Headhunter
abilities[1] = 0;
# Reset Ambush
abilities[2] = 0;
# Reset QuickFix
abilities[3] = 0;
# Reset HeavyWeight
abilities[4] = 0;
# Reset Charged
abilities[5] = 0;
# Reset Haste
abilities[6] = 0;
# Reset HeavyImpact
abilities[7] = 0;
# Reset HeroTalent1
abilities[8] = 0;
# Reset SecondWind
abilities[9] = 0;
# Reset BindingHeal
abilities[10] = 0;
# Reset Resilience
abilities[11] = 0;
# Reset HeroTalent2
abilities[12] = 0;
# Reset Damage
abilities[13] = 0;
# Reset Health
abilities[14] = 0;
# Reset Healing
abilities[15] = 0;
# Reset automaticRepair
automaticRepair -= abilities[16];
abilities[16] = 0;
UpdatePlayerStats();
}
rule: "Brig Shield Bash Stun"
Event.PlayerDealtKnockback
Team.Team1
Player.Brigitte
{
SetStatus(Victim(), null, Status.Stunned, 1);
}
rule: "Lucio Dash HUD Creation"
Event.OngoingPlayer
Team.Team1
if (HeroOf(EventPlayer()) == Hero.Lucio)
{
if (lucioDashActive == false)
{
lucioDashActive = true;
CreateHudText(EventPlayer(), null, <"<0> Slam on ground - Press: <1>", AbilityIconString(Hero.WreckingBall, Button.Crouch), InputBindingString(Button.Crouch)>, null, Location.Left, 1000, Color.White, Color.Green, Color.White, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
lucioDashIcon = LastTextID();
}
}
rule: "Lucio Dash Remove HUD"
Event.OngoingPlayer
Team.Team1
if (HeroOf(EventPlayer()) != Hero.Lucio)
if (lucioDashActive == true)
{
DestroyHudText(lucioDashIcon);
lucioDashActive = false;
}
rule: "Lucio Dash"
Event.OngoingPlayer
Team.Team1
if (HeroOf(EventPlayer()) == Hero.Lucio)
if (lucioDashActive == true)
if (IsOnGround(EventPlayer()) == false)
if (IsButtonHeld(EventPlayer(), Button.Crouch) == true)
{
ApplyImpulse(EventPlayer(), Down(), 20, Relative.ToWorld, ContraryMotion.Cancel);
}
rule: "Ana Self-Nano"
Event.OngoingPlayer
Team.Team1
Player.Ana
if (IsButtonHeld(EventPlayer(), Button.Ultimate) == true)
if (UltimateChargePercent(EventPlayer()) == 100)
if (IsDummyBot(EventPlayer()) == false)
{
AbortIf(selfNanoWorkshopSetting == false && NumberOfPlayers(Team.Team1) > 1);
Wait(0.1, WaitBehavior.IgnoreCondition);
if (IsUsingUltimate(EventPlayer()) == false)
{
CreateDummyBot(Hero.Ana, TeamOf(EventPlayer()), -1, PositionOf(EventPlayer()) + Backward(), EyePosition(EventPlayer()));
anaEntityID = LastCreatedEntity();
Wait(0.1, WaitBehavior.IgnoreCondition);
SetUltimateCharge(anaEntityID, 100);
StartFacing(anaEntityID, DirectionTowards(EyePosition(anaEntityID), PositionOf(EventPlayer()) + Up()), 1000, Relative.ToWorld, FacingRev.DirectionAndTurnRate);
SetInvisible(anaEntityID, InvisibleTo.All);
SetStatus(anaEntityID, null, Status.PhasedOut, 9999);
Wait(0.15, WaitBehavior.IgnoreCondition);
PressButton(anaEntityID, Button.Ultimate);
SetUltimateCharge(EventPlayer(), 0);
Wait(0.15, WaitBehavior.IgnoreCondition);
Teleport(anaEntityID, PositionOf(FirstOf(SpawnPoints(TeamOf(EventPlayer())))));
Wait(10, WaitBehavior.IgnoreCondition);
DestroyDummyBot(TeamOf(EventPlayer()), SlotOf(anaEntityID));
}
}
disabled rule: "Map Editor Walls"
{
}
rule: "Initial Global"
{
allPositions = [];
allDirections = [];
firstPosition = [];
secondPosition = [];
firstPoint = [];
secondPoint = [];
second = [];
z = [];
wallId = [];
beamType = [];
}
rule: "Initial Player"
Event.OngoingPlayer
Team.Team1
{
filterPosition = 0;
lastSavedPosition = 0;
closestBodyPosition = 0;
fullBodyPosition = 0;
previousPositionIntersection = 0;
activeWall = [];
closestWall = [];
}
rule: "Collision Logic"
Event.OngoingPlayer
Team.Team1
if (HasSpawned(EventPlayer()) == true)
{
lastSavedPosition = (EyePosition(EventPlayer()) + PositionOf(EventPlayer())) / 2;
Wait(0.1, WaitBehavior.IgnoreCondition);
closestWall = FilteredArray(allPositions, DistanceBetween(allPositions[CurrentArrayIndex()], EventPlayer()) <= DistanceBetween(allPositions[CurrentArrayIndex()], firstPosition[CurrentArrayIndex()]) || activeWall[CurrentArrayIndex()] == 1 || DotProduct(DirectionTowards(ArrayElement(), lastSavedPosition), allDirections[CurrentArrayIndex()]) > 0 != DotProduct(DirectionTowards(ArrayElement(), EventPlayer()), allDirections[CurrentArrayIndex()]) > 0);
for (x = 0; CountOf(closestWall); 1)
{
z = IndexOfArrayValue(allPositions, closestWall[x]);
if (wallId[z] == 1 || wallId[z] == 3 || wallId[z] == 5)
{
if (YOf(firstPosition[z]) >= YOf(PositionOf(EventPlayer())) && YOf(firstPosition[z]) <= YOf(EyePosition(EventPlayer()) + Vector([], 0.2, [])))
{
closestBodyPosition = firstPosition[z];
}
else if (YOf(secondPosition[z]) >= YOf(PositionOf(EventPlayer())) && YOf(secondPosition[z]) <= YOf(EyePosition(EventPlayer()) + Vector([], 0.2, [])))
{
closestBodyPosition = secondPosition[z];
}
else
{
closestBodyPosition = PositionOf(EventPlayer());
}
fullBodyPosition = Vector(XOf(EyePosition(EventPlayer())), YOf(closestBodyPosition), ZOf(EyePosition(EventPlayer())));
filterPosition = fullBodyPosition + allDirections[z] * DotProduct(allPositions[z] - fullBodyPosition, allDirections[z]) / DotProduct(allDirections[z], allDirections[z]);
if (wallId[z] == 1 || wallId[z] == 3)
{
if (DotProduct(DirectionTowards(allPositions[z], lastSavedPosition), allDirections[z]) > 0 != DotProduct(DirectionTowards(allPositions[z], fullBodyPosition), allDirections[z]) > 0)
{
intersectionLength = DotProduct(allPositions[z] - fullBodyPosition, allDirections[z]) / DotProduct(DirectionTowards(lastSavedPosition, fullBodyPosition), allDirections[z]);
previousPositionIntersection = fullBodyPosition + DirectionTowards(lastSavedPosition, fullBodyPosition) * Vector(1, [], 1) * intersectionLength;
if (DotProduct(DirectionTowards(firstPosition[z], Vector(XOf(secondPosition[z]), YOf(firstPosition[z]), ZOf(secondPosition[z]))), DirectionTowards(firstPosition[z], previousPositionIntersection)) >= 0 && DotProduct(DirectionTowards(firstPosition[z], Vector(XOf(firstPosition[z]), YOf(secondPosition[z]), ZOf(firstPosition[z]))), DirectionTowards(firstPosition[z], previousPositionIntersection)) >= 0 && DotProduct(DirectionTowards(secondPosition[z], Vector(XOf(secondPosition[z]), YOf(firstPosition[z]), ZOf(secondPosition[z]))), DirectionTowards(secondPosition[z], previousPositionIntersection)) >= 0 && DotProduct(DirectionTowards(secondPosition[z], Vector(XOf(firstPosition[z]), YOf(secondPosition[z]), ZOf(firstPosition[z]))), DirectionTowards(secondPosition[z], previousPositionIntersection)) >= 0)
{
CancelPrimaryAction(EventPlayer());
Teleport(EventPlayer(), previousPositionIntersection + DirectionTowards(previousPositionIntersection, lastSavedPosition) * Vector(1, [], 1) * 2);
}
}
}
thickness = 0;
if (wallId[z] == 5)
{
thickness = 4;
}
else
{
thickness = 1;
}
if (DistanceBetween(fullBodyPosition, filterPosition) <= thickness && DotProduct(DirectionTowards(firstPosition[z], Vector(XOf(secondPosition[z]), YOf(firstPosition[z]), ZOf(secondPosition[z]))), DirectionTowards(firstPosition[z], filterPosition)) >= 0 && DotProduct(DirectionTowards(firstPosition[z], Vector(XOf(firstPosition[z]), YOf(secondPosition[z]), ZOf(firstPosition[z]))), DirectionTowards(firstPosition[z], filterPosition)) >= 0 && DotProduct(DirectionTowards(secondPosition[z], Vector(XOf(secondPosition[z]), YOf(firstPosition[z]), ZOf(secondPosition[z]))), DirectionTowards(secondPosition[z], filterPosition)) >= 0 && DotProduct(DirectionTowards(secondPosition[z], Vector(XOf(firstPosition[z]), YOf(secondPosition[z]), ZOf(firstPosition[z]))), DirectionTowards(secondPosition[z], filterPosition)) >= 0)
{
if (!isGrounded)
{
SetGravity(EventPlayer(), 100);
}
if (activeWall[z] == false)
{
activeWall[z] = 1;
if ((wallId[z] == 1 || wallId[z] == 3) && isGrounded == false)
{
SetGravity(EventPlayer(), 100);
}
else if (wallId[z] == 5)
{
DisableMovementCollisionWithEnvironment(EventPlayer(), false);
}
}
if (wallId[z] == 1)
{
ApplyImpulse(EventPlayer(), DirectionTowards(filterPosition, fullBodyPosition) * Vector(1, [], 1), 0.001, Relative.ToWorld, ContraryMotion.Cancel);
SetMoveSpeed(EventPlayer(), 100 - DotProduct(DirectionTowards(EyePosition(EventPlayer()), EyePosition(EventPlayer()) + WorldVectorOf(ThrottleOf(EventPlayer()), EventPlayer(), LocalVector.Rotation)), DirectionTowards(filterPosition, fullBodyPosition) * -1) * 100);
}
else if (wallId[z] == 3)
{
ApplyImpulse(EventPlayer(), DirectionTowards(filterPosition, fullBodyPosition), SpeedOf(EventPlayer()), Relative.ToWorld, ContraryMotion.Cancel);
}
}
else
{
activeWall[z] = 0;
SetMoveSpeed(EventPlayer(), 100);
}
}
}
Loop();
}
rule: "Reset"
Event.OngoingPlayer
Team.Team1
if (CountOf(FilteredArray(activeWall, ArrayElement() != 0)) == 0)
{
EnableMovementCollisionWithEnvironment(EventPlayer());
}
rule: "Wall Data"
{
allPositions = [Vector(155.968, 12.47, -30.507), Vector(155.962, 12.472, -62.5), Vector(81.153, 6.453, -103.851), Vector(69.148, 6.474, -104.548)];
allDirections = [Vector(-1, 0, -0.002), Vector(1, 0, -0.001), Vector(0, 0, 1), Vector(0.001, 0, 1)];
firstPosition = [Vector(155.971, 11.047, -31.771), Vector(155.964, 11.05, -61.229), Vector(79.761, 5.03, -103.852), Vector(67.738, 5.022, -104.547)];
secondPosition = [Vector(155.965, 13.894, -29.242), Vector(155.96, 13.894, -63.771), Vector(82.544, 7.876, -103.851), Vector(70.558, 7.925, -104.55)];
firstPoint = [Vector(155.971, 13.894, -31.771), Vector(155.964, 13.894, -61.229), Vector(79.761, 7.876, -103.852), Vector(67.738, 7.925, -104.547)];
secondPoint = [Vector(155.965, 11.047, -29.242), Vector(155.96, 11.05, -63.771), Vector(82.544, 5.03, -103.851), Vector(70.558, 5.022, -104.55)];
z = 3;
beamType = [1, 1, 1, 1];
showWalls = true;
wallId = [5, 5, 5, 5];
}
disabled rule: "NEW SHOP"
{
}
rule: "Setting Shop Position"
{
shopCamPosition = 900 * Up();
shopPositionAngle[1] = DirectionFromAngles(HorizontalAngleFromDirection(Forward()), VerticalAngleFromDirection(Forward()) - 90);
shopPositionAngle[0] = CrossProduct(shopPositionAngle[1], Forward());
shopBasePosition = shopCamPosition - 9 * shopPositionAngle[1] + 142 * Forward();
}
rule: "Create Shop Buttons"
{
CreateInWorldText(FilteredArray(AllPlayers(Team.Team1), ArrayElement().isInMenu[0]), "┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃", shopBasePosition - 41 * shopPositionAngle[1] + 90 * shopPositionAngle[0], 2.5, Clipping.DoNotClip, InworldTextRev.VisibleTo, Color.White, Spectators.DefaultVisibility);
CreateInWorldText(FilteredArray(AllPlayers(Team.Team1), ArrayElement().isInMenu[0]), "┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃", shopBasePosition - 41 * shopPositionAngle[1] - 90 * shopPositionAngle[0], 2.5, Clipping.DoNotClip, InworldTextRev.VisibleTo, Color.White, Spectators.DefaultVisibility);
CreateInWorldText(FilteredArray(AllPlayers(Team.Team1), ArrayElement().isInMenu[0]), "Refund", shopBasePosition + 45 * shopPositionAngle[1] + 67.5 * shopPositionAngle[0], 3, Clipping.DoNotClip, InworldTextRev.VisibleTo, Color.Green, Spectators.DefaultVisibility);
CreateInWorldText(FilteredArray(AllPlayers(Team.Team1), ArrayElement().isInMenu[0]), <"[<0>] Leave", InputBindingString(Button.Reload)>, shopBasePosition + 45 * shopPositionAngle[1] - 67.5 * shopPositionAngle[0], 3, Clipping.DoNotClip, InworldTextRev.VisibleToAndString, Color.Green, Spectators.DefaultVisibility);
CreateInWorldText(LocalPlayer().isInMenu[0] ? LocalPlayer() : [], <"<0>$\n", LocalPlayer().money[0]>, shopBasePosition + 36.5 * shopPositionAngle[1], 3, Clipping.DoNotClip, InworldTextRev.VisibleToAndString, Color.White, Spectators.DefaultVisibility);
CreateInWorldText(LocalPlayer().isInMenu[0] ? LocalPlayer() : [], "▲", UpdateEveryFrame(shopBasePosition - (4 + VerticalFacingAngleOf(LocalPlayer())) * shopPositionAngle[1] + HorizontalFacingAngleOf(LocalPlayer()) * shopPositionAngle[0]), 4, Clipping.DoNotClip, InworldTextRev.VisibleToPositionAndColor, CustomColor(245 + 10 * SineFromRadians(4 * TotalTimeElapsed()), 205 + 50 * SineFromRadians(4 * TotalTimeElapsed()), 200 * SineFromRadians(4 * TotalTimeElapsed()), 255), Spectators.DefaultVisibility);
# Headhunter
CreateInWorldText(FilteredArray(AllPlayers(Team.Team1), ArrayElement().isInMenu[0]), LocalPlayer().abilities[1] ? "Headhunter II\n800$" : "Headhunter I\n800$", shopBasePosition + 20 * shopPositionAngle[1] + 67.5 * shopPositionAngle[0], 2.5, Clipping.DoNotClip, InworldTextRev.VisibleToStringAndColor, LocalPlayer().abilities[1] < 2 ? Color.Green : Color.Gray, Spectators.DefaultVisibility);
# Ambush
CreateInWorldText(FilteredArray(AllPlayers(Team.Team1), ArrayElement().isInMenu[0]), LocalPlayer().abilities[2] ? "Ambush II\n 800$" : "Ambush I\n 800$", shopBasePosition - 2.5 * shopPositionAngle[1] + 67.5 * shopPositionAngle[0], 2.5, Clipping.DoNotClip, InworldTextRev.VisibleToStringAndColor, LocalPlayer().abilities[2] < 2 ? Color.Green : Color.Gray, Spectators.DefaultVisibility);
# Quick Fix
CreateInWorldText(FilteredArray(AllPlayers(Team.Team1), ArrayElement().isInMenu[0]), LocalPlayer().abilities[3] ? "Quick Fix II\n 700$" : "Quick Fix I\n 700$", shopBasePosition - 25 * shopPositionAngle[1] + 67.5 * shopPositionAngle[0], 2.5, Clipping.DoNotClip, InworldTextRev.VisibleToStringAndColor, LocalPlayer().abilities[3] < 2 ? Color.Green : Color.Gray, Spectators.DefaultVisibility);
# Heavyweight
CreateInWorldText(FilteredArray(AllPlayers(Team.Team1), ArrayElement().isInMenu[0]), LocalPlayer().abilities[4] ? "Heavyweight II\n1000$" : "Heavyweight I\n1000$", shopBasePosition - 47.5 * shopPositionAngle[1] + 67.5 * shopPositionAngle[0], 2.5, Clipping.DoNotClip, InworldTextRev.VisibleToStringAndColor, LocalPlayer().abilities[4] < 2 ? Color.Green : Color.Gray, Spectators.DefaultVisibility);
# Charged
CreateInWorldText(FilteredArray(AllPlayers(Team.Team1), ArrayElement().isInMenu[0]), LocalPlayer().abilities[5] ? "Charged II\n 700$" : "Charged I\n 700$", shopBasePosition + 20 * shopPositionAngle[1] + 22.5 * shopPositionAngle[0], 2.5, Clipping.DoNotClip, InworldTextRev.VisibleToStringAndColor, LocalPlayer().abilities[5] < 2 ? Color.Green : Color.Gray, Spectators.DefaultVisibility);
# Haste
CreateInWorldText(FilteredArray(AllPlayers(Team.Team1), ArrayElement().isInMenu[0]), LocalPlayer().abilities[6] ? "Haste II\n 700$" : "Haste I\n 700$", shopBasePosition - 2.5 * shopPositionAngle[1] + 22.5 * shopPositionAngle[0], 2.5, Clipping.DoNotClip, InworldTextRev.VisibleToStringAndColor, LocalPlayer().abilities[6] < 2 ? Color.Green : Color.Gray, Spectators.DefaultVisibility);
# Heavy Impact
CreateInWorldText(FilteredArray(AllPlayers(Team.Team1), ArrayElement().isInMenu[0]), LocalPlayer().abilities[7] ? "Heavy Impact II\n1000$" : "Heavy Impact I\n1000$", shopBasePosition - 25 * shopPositionAngle[1] + 22.5 * shopPositionAngle[0], 2.5, Clipping.DoNotClip, InworldTextRev.VisibleToStringAndColor, LocalPlayer().abilities[7] < 2 ? Color.Green : Color.Gray, Spectators.DefaultVisibility);
# Hero Talent 1
CreateInWorldText(FilteredArray(AllPlayers(Team.Team1), ArrayElement().isInMenu[0]), "Hero Talent 1\n1200$", shopBasePosition - 47.5 * shopPositionAngle[1] + 22.5 * shopPositionAngle[0], 2.5, Clipping.DoNotClip, InworldTextRev.VisibleToStringAndColor, LocalPlayer().abilities[8] < 1 ? Color.Green : Color.Gray, Spectators.DefaultVisibility);
# Second Wind
CreateInWorldText(FilteredArray(AllPlayers(Team.Team1), ArrayElement().isInMenu[0]), LocalPlayer().abilities[9] ? "Second Wind II\n 900$" : "Second Wind I\n 900$", shopBasePosition + 20 * shopPositionAngle[1] - 22.5 * shopPositionAngle[0], 2.5, Clipping.DoNotClip, InworldTextRev.VisibleToStringAndColor, LocalPlayer().abilities[9] < 2 ? Color.Green : Color.Gray, Spectators.DefaultVisibility);
# Binding Heal
CreateInWorldText(FilteredArray(AllPlayers(Team.Team1), ArrayElement().isInMenu[0]), LocalPlayer().abilities[10] ? "Binding Heal II\n 700$" : "Binding Heal I\n 700$", shopBasePosition - 2.5 * shopPositionAngle[1] - 22.5 * shopPositionAngle[0], 2.5, Clipping.DoNotClip, InworldTextRev.VisibleToStringAndColor, LocalPlayer().abilities[10] < 2 ? Color.Green : Color.Gray, Spectators.DefaultVisibility);
# Resilience
CreateInWorldText(FilteredArray(AllPlayers(Team.Team1), ArrayElement().isInMenu[0]), LocalPlayer().abilities[11] ? "Resilience II\n 800$" : "Resilience I\n 800$", shopBasePosition - 25 * shopPositionAngle[1] - 22.5 * shopPositionAngle[0], 2.5, Clipping.DoNotClip, InworldTextRev.VisibleToStringAndColor, LocalPlayer().abilities[11] < 2 ? Color.Green : Color.Gray, Spectators.DefaultVisibility);
# Hero Talent 2
CreateInWorldText(FilteredArray(AllPlayers(Team.Team1), ArrayElement().isInMenu[0]), "Hero Talent 2\n1200$", shopBasePosition - 47.5 * shopPositionAngle[1] - 22.5 * shopPositionAngle[0], 2.5, Clipping.DoNotClip, InworldTextRev.VisibleToStringAndColor, LocalPlayer().abilities[12] < 1 ? Color.Green : Color.Gray, Spectators.DefaultVisibility);
# PlusDamage
CreateInWorldText(FilteredArray(AllPlayers(Team.Team1), ArrayElement().isInMenu[0]), "+5% Damage\n400$", shopBasePosition + 20 * shopPositionAngle[1] - 67.5 * shopPositionAngle[0], 2.5, Clipping.DoNotClip, InworldTextRev.VisibleToStringAndColor, Color.Green, Spectators.DefaultVisibility);
# PlusHealth
CreateInWorldText(FilteredArray(AllPlayers(Team.Team1), ArrayElement().isInMenu[0]), "+5% Health\n 400$", shopBasePosition - 2.5 * shopPositionAngle[1] - 67.5 * shopPositionAngle[0], 2.5, Clipping.DoNotClip, InworldTextRev.VisibleToStringAndColor, Color.Green, Spectators.DefaultVisibility);
# PlusHealing
CreateInWorldText(FilteredArray(AllPlayers(Team.Team1), ArrayElement().isInMenu[0]), "+5% Healing\n400$", shopBasePosition - 25 * shopPositionAngle[1] - 67.5 * shopPositionAngle[0], 2.5, Clipping.DoNotClip, InworldTextRev.VisibleToAndString, Color.Green, Spectators.DefaultVisibility);
# PlusHealing
CreateInWorldText(FilteredArray(AllPlayers(Team.Team1), ArrayElement().isInMenu[0]), <"+<0> Auto-Repair\n 400$", upgradeGateMaxHealthValue >= upgradeGateMaxHealthMaxValue[2] ? 10 : 5>, shopBasePosition - 47.5 * shopPositionAngle[1] - 67.5 * shopPositionAngle[0], 2.5, Clipping.DoNotClip, InworldTextRev.VisibleToStringAndColor, automaticRepair < 5 ? Color.Green : Color.Gray, Spectators.DefaultVisibility);
# Use Update Every Frame to avoid showing the String when the cursor is out of bounds, resulting in 0\r\n ROW 0
CreateInWorldText(UpdateEveryFrame(LocalPlayer().isInMenu[0] && AbsoluteValue(HorizontalFacingAngleOf(LocalPlayer())) < 90 && AbsoluteValue(VerticalFacingAngleOf(LocalPlayer()) + 11.25) < 47.5 ? LocalPlayer() : []), UpdateEveryFrame(VerticalFacingAngleOf(LocalPlayer()) < -33.75 ? ["Leave Buy Menu\n", "", "", "Refund your money\n"][RoundToInteger((HorizontalFacingAngleOf(LocalPlayer()) + 90) / 45, Rounding.Down)] : ""), shopBasePosition - 75 * shopPositionAngle[1], 2.5, Clipping.DoNotClip, InworldTextRev.VisibleToAndString, Color.White, Spectators.DefaultVisibility);
# ROW 1
CreateInWorldText(UpdateEveryFrame(LocalPlayer().isInMenu[0] && AbsoluteValue(HorizontalFacingAngleOf(LocalPlayer())) < 90 && AbsoluteValue(VerticalFacingAngleOf(LocalPlayer()) + 11.25) < 22.5 ? LocalPlayer() : []), UpdateEveryFrame(VerticalFacingAngleOf(LocalPlayer()) < -11.25 ? ["Increase your damage by 5%\n", LocalPlayer().abilities[9] ? "Second Wind II: 60% chance to revive yourself after going down\nThis cannot occur more than once every 30 seconds" : "Second Wind I: 30% chance to revive yourself after going down\n This cannot occur more than once every 30 seconds", LocalPlayer().abilities[5] ? "Charged II: Ultimates cost 40% less\n" : "Charged I: Ultimates cost 20% less\n", LocalPlayer().abilities[1] ? "Headhunter II: Critical hits deal 60% more damage\n" : "Headhunter I: Critical hits deal 30% more damage\n"][RoundToInteger((HorizontalFacingAngleOf(LocalPlayer()) + 90) / 45, Rounding.Down)] : ""), shopBasePosition - 75 * shopPositionAngle[1], 2.5, Clipping.DoNotClip, InworldTextRev.VisibleToAndString, Color.White, Spectators.DefaultVisibility);
# ROW 2
CreateInWorldText(UpdateEveryFrame(LocalPlayer().isInMenu[0] && AbsoluteValue(HorizontalFacingAngleOf(LocalPlayer())) < 90 && AbsoluteValue(VerticalFacingAngleOf(LocalPlayer()) - 36.25) < 47.5 ? LocalPlayer() : []), UpdateEveryFrame(VerticalFacingAngleOf(LocalPlayer()) < 11.25 ? ["Increase your health by 5%\n", LocalPlayer().abilities[10] ? "Binding Heal II: Heal yourself for 50% the amount when healing allies\n" : "Binding Heal I: Heal yourself for 25% the amount when healing allies\n", LocalPlayer().abilities[6] ? "Haste II: Ability cooldown is reduced by 50%\nDoes not affect abilities with multiple charges" : "Haste I: Ability cooldown is reduced by 25%\nDoes not affect abilities with multiple charges", LocalPlayer().abilities[2] ? "Ambush II: Deal 60% more damage when attacking enemies from behind or above\n" : "Ambush I: Deal 30% more damage when attacking enemies from behind or above\n"][RoundToInteger((HorizontalFacingAngleOf(LocalPlayer()) + 90) / 45, Rounding.Down)] : ""), shopBasePosition - 75 * shopPositionAngle[1], 2.5, Clipping.DoNotClip, InworldTextRev.VisibleToAndString, Color.White, Spectators.DefaultVisibility);
# ROW 3
CreateInWorldText(UpdateEveryFrame(LocalPlayer().isInMenu[0] && AbsoluteValue(HorizontalFacingAngleOf(LocalPlayer())) < 90 && AbsoluteValue(VerticalFacingAngleOf(LocalPlayer()) - 83.75) < 72.5 ? LocalPlayer() : []), UpdateEveryFrame(VerticalFacingAngleOf(LocalPlayer()) < 33.75 ? ["Increase your healing by 5%\n", LocalPlayer().abilities[11] ? "Resilience II: Take 30% less damage while below 60% health\n" : "Resilience I: Take 30% less damage while below 30% health\n", LocalPlayer().abilities[7] ? "Heavy Impact II: Every hit has a chance to stun the enemy for 2 seconds\n" : "Heavy Impact I: Every hit has a chance to stun the enemy for 1 second\n", LocalPlayer().abilities[3] ? "Quick Fix II: Eliminations restore 100 HP and shortly increase speed by 40%\n" : "Quick Fix I: Eliminations restore 50 HP and shortly increase speed by 20%\n"][RoundToInteger((HorizontalFacingAngleOf(LocalPlayer()) + 90) / 45, Rounding.Down)] : ""), shopBasePosition - 75 * shopPositionAngle[1], 2.5, Clipping.DoNotClip, InworldTextRev.VisibleToAndString, Color.White, Spectators.DefaultVisibility);
# ROW 4
CreateInWorldText(UpdateEveryFrame(LocalPlayer().isInMenu[0] && AbsoluteValue(HorizontalFacingAngleOf(LocalPlayer())) < 90 && AbsoluteValue(VerticalFacingAngleOf(LocalPlayer()) - 133) < 99.25 ? LocalPlayer() : []), UpdateEveryFrame(VerticalFacingAngleOf(LocalPlayer()) < 56.25 ? [<"Increase your auto-repair by <0>/5s\n", upgradeGateMaxHealthValue >= upgradeGateMaxHealthMaxValue[2] ? 10 : 5>, <"<0>", LocalPlayer().heroTalentText[2][1]>, <"<0>", LocalPlayer().heroTalentText[1][1]>, LocalPlayer().abilities[4] ? "Heavyweight II: Your knock back attacks deal 50% more damage and knock back\nYou receive 33% less knock back" : "Heavyweight I: Your knock back attacks deal 25% more damage and knock back\nYou receive 20% less knock back"][RoundToInteger((HorizontalFacingAngleOf(LocalPlayer()) + 90) / 45, Rounding.Down)] : ""), shopBasePosition - 75 * shopPositionAngle[1], 2.5, Clipping.DoNotClip, InworldTextRev.VisibleToAndString, Color.White, Spectators.DefaultVisibility);
}
rule: "Toggle Shop"
Event.OngoingPlayer
Team.Team1
if (!IsDummyBot(EventPlayer()) == true)
if (IsButtonHeld(EventPlayer(), Button.Reload) == true)
if (!IsCommunicatingAnyEmote(EventPlayer()) == true)
{
if (isInMenu[0] == false)
{
WaitUntil(!IsButtonHeld(EventPlayer(), Button.Reload), 0.5);
if (!IsButtonHeld(EventPlayer(), Button.Reload))
{
Abort();
}
}
isInMenu[0] = !isInMenu[0];
}
rule: "Open Shop"
Event.OngoingPlayer
Team.Team1
if (isInMenu[0] == true)
{
playerFacing = FacingDirectionOf(EventPlayer());
StartCamera(EventPlayer(), shopCamPosition, shopCamPosition + Forward(), 0);
DisableHeroHud(EventPlayer());
DisablePlayer();
SetAimSpeed(EventPlayer(), 200);
}
rule: "Close Shop"
Event.OngoingPlayer
Team.Team1
if (isInMenu[0] == false)
{
StopCamera(EventPlayer());
EnableHeroHud(EventPlayer());
EnablePlayer();
SetAimSpeed(EventPlayer(), 100);
SetFacing(EventPlayer(), playerFacing, Relative.ToWorld);
}
void DisablePlayer() "Subroutine: Disable Player"
{
ForceThrottle(EventPlayer(), 0, 0, 0, 0, 0, 0);
SetPrimaryFireEnabled(EventPlayer(), false);
SetSecondaryFireEnabled(EventPlayer(), false);
SetAbility1Enabled(EventPlayer(), false);
SetAbility2Enabled(EventPlayer(), false);
SetMeleeEnabled(EventPlayer(), false);
SetJumpEnabled(EventPlayer(), false);
SetCrouchEnabled(EventPlayer(), false);
DisallowButton(EventPlayer(), Button.Ultimate);
}
void EnablePlayer() "Subroutine: Enable Player"
{
StopForcingThrottle(EventPlayer());
SetPrimaryFireEnabled(EventPlayer(), true);
SetSecondaryFireEnabled(EventPlayer(), true);
SetAbility1Enabled(EventPlayer(), true);
SetAbility2Enabled(EventPlayer(), true);
SetMeleeEnabled(EventPlayer(), true);
SetJumpEnabled(EventPlayer(), true);
SetCrouchEnabled(EventPlayer(), true);
AllowButton(EventPlayer(), Button.Ultimate);
}
rule: "Buy Ability"
Event.OngoingPlayer
Team.Team1
if (isInMenu[0] == true)
if (IsButtonHeld(EventPlayer(), Button.PrimaryFire) == true)
if ((AbsoluteValue(HorizontalFacingAngleOf(EventPlayer())) < 90 && AbsoluteValue(VerticalFacingAngleOf(EventPlayer())) + 11.25 < 67) == true)
{
# ROW 0
if (VerticalFacingAngleOf(EventPlayer()) < -33.75)
{
# LEAVE SHOP
if (HorizontalFacingAngleOf(EventPlayer()) + 99.75 < 55)
{
isInMenu[0] = !isInMenu[0];
}
else if (HorizontalFacingAngleOf(EventPlayer()) + 0 > 45)
{
if (money[1] != 0)
{
Refund();
}
else
{
SmallMessage(LocalPlayer(), "You don't have anything to refund!");
}
}
}
else if (VerticalFacingAngleOf(EventPlayer()) < -11.25)
{
# +5% DAMAGE
if (HorizontalFacingAngleOf(EventPlayer()) + 99.75 < 55)
{
if (money[0] >= 400)
{
money[0] -= 400;
money[1] += 400;
abilities[13] += 1;
UpdatePlayerStats();
}
else
{
SmallMessage(EventPlayer(), "Not enough money!");
}
}
else if (HorizontalFacingAngleOf(EventPlayer()) + 22.5 < 22.5)
{
if (abilities[9] != 2)
{
if (money[0] >= 900)
{
money[0] -= 900;
money[1] += 900;
abilities[9] += 1;
}
else
{
SmallMessage(EventPlayer(), "Not enough money!");
}
}
}
else if (HorizontalFacingAngleOf(EventPlayer()) + 11.25 < 56)
{
if (abilities[5] != 2)
{
if (money[0] >= 700)
{
money[0] -= 700;
money[1] += 700;
abilities[5] += 1;
}
else
{
SmallMessage(EventPlayer(), "Not enough money!");
}
}
}
else if (HorizontalFacingAngleOf(EventPlayer()) + 0 > 45)
{
if (abilities[1] != 2)
{
if (money[0] >= 800)
{
money[0] -= 800;
money[1] += 800;
abilities[1] += 1;
}
else
{
SmallMessage(EventPlayer(), "Not enough money!");
}
}
}
}
else if (VerticalFacingAngleOf(EventPlayer()) < 11.25)
{
# +5% HEALTH
if (HorizontalFacingAngleOf(EventPlayer()) + 99.75 < 55)
{
if (money[0] >= 400)
{
money[0] -= 400;
money[1] += 400;
abilities[14] += 1;
UpdatePlayerStats();
}
else
{
SmallMessage(EventPlayer(), "Not enough money!");
}
}
else if (HorizontalFacingAngleOf(EventPlayer()) + 22.5 < 22.5)
{
if (abilities[10] != 2)
{
if (money[0] >= 700)
{
money[0] -= 700;
money[1] += 700;
abilities[10] += 1;
}
else
{
SmallMessage(EventPlayer(), "Not enough money!");
}
}
}
else if (HorizontalFacingAngleOf(EventPlayer()) + 11.25 < 56)
{
if (abilities[6] != 2)
{
if (money[0] >= 700)
{
money[0] -= 700;
money[1] += 700;
abilities[6] += 1;
}
else
{
SmallMessage(EventPlayer(), "Not enough money!");
}
}
}
else if (HorizontalFacingAngleOf(EventPlayer()) + 0 > 45)
{
if (abilities[2] != 2)
{
if (money[0] >= 800)
{
money[0] -= 800;
money[1] += 800;
abilities[2] += 1;
}
else
{
SmallMessage(EventPlayer(), "Not enough money!");
}
}
}
}
else if (VerticalFacingAngleOf(EventPlayer()) < 33.75)
{
# +5% HEALING
if (HorizontalFacingAngleOf(EventPlayer()) + 99.75 < 55)
{
if (money[0] >= 400)
{
money[0] -= 400;
money[1] += 400;
abilities[15] += 1;
UpdatePlayerStats();
}
else
{
SmallMessage(EventPlayer(), "Not enough money!");
}
}
else if (HorizontalFacingAngleOf(EventPlayer()) + 22.5 < 22.5)
{
if (abilities[11] != 2)
{
if (money[0] >= 800)
{
money[0] -= 800;
money[1] += 800;
abilities[11] += 1;
}
else
{
SmallMessage(EventPlayer(), "Not enough money!");
}
}
}
else if (HorizontalFacingAngleOf(EventPlayer()) + 11.25 < 56)
{
if (abilities[7] != 2)
{
if (money[0] >= 1000)
{
money[0] -= 1000;
money[1] += 1000;
abilities[7] += 1;
}
else
{
SmallMessage(EventPlayer(), "Not enough money!");
}
}
}
else if (HorizontalFacingAngleOf(EventPlayer()) + 0 > 45)
{
if (abilities[3] != 2)
{
if (money[0] >= 700)
{
money[0] -= 700;
money[1] += 700;
abilities[3] += 1;
}
else
{
SmallMessage(EventPlayer(), "Not enough money!");
}
}
}
}
else if (VerticalFacingAngleOf(EventPlayer()) < 56.25)
{
# +5 AUTO-REPAIR
if (HorizontalFacingAngleOf(EventPlayer()) + 99.75 < 55)
{
if (automaticRepair != 5)
{
if (money[0] >= 400)
{
money[0] -= 400;
money[1] += 400;
automaticRepair += 1;
abilities[16] += 1;
}
else
{
SmallMessage(EventPlayer(), "Not enough money!");
}
}
}
else if (HorizontalFacingAngleOf(EventPlayer()) + 22.5 < 22.5)
{
if (abilities[12] != 1)
{
if (money[0] >= 1200)
{
money[0] -= 1200;
money[1] += 1200;
abilities[12] += 1;
}
else
{
SmallMessage(EventPlayer(), "Not enough money!");
}
}
}
else if (HorizontalFacingAngleOf(EventPlayer()) + 11.25 < 56)
{
if (abilities[8] != 1)
{
if (money[0] >= 1200)
{
money[0] -= 1200;
money[1] += 1200;
abilities[8] += 1;
}
else
{
SmallMessage(EventPlayer(), "Not enough money!");
}
}
}
else if (HorizontalFacingAngleOf(EventPlayer()) + 0 > 45)
{
if (abilities[4] != 2)
{
if (money[0] >= 1000)
{
money[0] -= 1000;
money[1] += 1000;
abilities[4] += 1;
}
else
{
SmallMessage(EventPlayer(), "Not enough money!");
}
}
}
}
}
rule: "Refund Single Ability"
Event.OngoingPlayer
Team.Team1
if (isInMenu[0] == true)
if (IsButtonHeld(EventPlayer(), Button.SecondaryFire) == true)
if ((AbsoluteValue(HorizontalFacingAngleOf(EventPlayer())) < 90 && AbsoluteValue(VerticalFacingAngleOf(EventPlayer())) + 11.25 < 67) == true)
{
# ROW 0
if (VerticalFacingAngleOf(EventPlayer()) < -33.75)
{
# LEAVE SHOP
if (HorizontalFacingAngleOf(EventPlayer()) + 99.75 < 55)
{
}
else if (HorizontalFacingAngleOf(EventPlayer()) + 0 > 45)
{
}
}
else if (VerticalFacingAngleOf(EventPlayer()) < -11.25)
{
# +5% DAMAGE
if (HorizontalFacingAngleOf(EventPlayer()) + 99.75 < 55)
{
if (abilities[13] != 0)
{
money[0] += 400;
money[1] -= 400;
abilities[13] -= 1;
UpdatePlayerStats();
}
else
{
SmallMessage(EventPlayer(), "You don't have that ability!");
}
}
else if (HorizontalFacingAngleOf(EventPlayer()) + 22.5 < 22.5)
{
if (abilities[9] != 0)
{
money[0] += 900;
money[1] -= 900;
abilities[9] -= 1;
}
else
{
SmallMessage(EventPlayer(), "You don't have that ability!");
}
}
else if (HorizontalFacingAngleOf(EventPlayer()) + 11.25 < 56)
{
if (abilities[5] != 0)
{
money[0] += 700;
money[1] -= 700;
abilities[5] -= 1;
}
else
{
SmallMessage(EventPlayer(), "You don't have that ability!");
}
}
else if (HorizontalFacingAngleOf(EventPlayer()) + 0 > 45)
{
if (abilities[1] != 0)
{
money[0] += 800;
money[1] -= 800;
abilities[1] -= 1;
}
else
{
SmallMessage(EventPlayer(), "You don't have that ability!");
}
}
}
else if (VerticalFacingAngleOf(EventPlayer()) < 11.25)
{
# +5% HEALTH
if (HorizontalFacingAngleOf(EventPlayer()) + 99.75 < 55)
{
if (abilities[14] != 0)
{
money[0] += 400;
money[1] -= 400;
abilities[14] -= 1;
UpdatePlayerStats();
}
else
{
SmallMessage(EventPlayer(), "You don't have that ability!");
}
}
else if (HorizontalFacingAngleOf(EventPlayer()) + 22.5 < 22.5)
{
if (abilities[10] != 0)
{
money[0] += 700;
money[1] -= 700;
abilities[10] -= 1;
}
else
{
SmallMessage(EventPlayer(), "You don't have that ability!");
}
}
else if (HorizontalFacingAngleOf(EventPlayer()) + 11.25 < 56)
{
if (abilities[6] != 0)
{
money[0] += 700;
money[1] -= 700;
abilities[6] -= 1;
}
else
{
SmallMessage(EventPlayer(), "You don't have that ability!");
}
}
else if (HorizontalFacingAngleOf(EventPlayer()) + 0 > 45)
{
if (abilities[2] != 0)
{
money[0] += 800;
money[1] -= 800;
abilities[2] -= 1;
}
else
{
SmallMessage(EventPlayer(), "You don't have that ability!");
}
}
}
else if (VerticalFacingAngleOf(EventPlayer()) < 33.75)
{
# +5% HEALING
if (HorizontalFacingAngleOf(EventPlayer()) + 99.75 < 55)
{
if (abilities[15] != 0)
{
money[0] += 400;
money[1] -= 400;
abilities[15] -= 1;
UpdatePlayerStats();
}
else
{
SmallMessage(EventPlayer(), "You don't have that ability!");
}
}
else if (HorizontalFacingAngleOf(EventPlayer()) + 22.5 < 22.5)
{
if (abilities[11] != 0)
{
money[0] += 800;
money[1] -= 800;
abilities[11] -= 1;
}
else
{
SmallMessage(EventPlayer(), "You don't have that ability!");
}
}
else if (HorizontalFacingAngleOf(EventPlayer()) + 11.25 < 56)
{
if (abilities[7] != 0)
{
money[0] += 1000;
money[1] -= 1000;
abilities[7] -= 1;
}
else
{
SmallMessage(EventPlayer(), "You don't have that ability!");
}
}
else if (HorizontalFacingAngleOf(EventPlayer()) + 0 > 45)
{
if (abilities[3] != 0)
{
money[0] += 700;
money[1] -= 700;
abilities[3] -= 1;
}
else
{
SmallMessage(EventPlayer(), "You don't have that ability!");
}
}
}
else if (VerticalFacingAngleOf(EventPlayer()) < 56.25)
{
# +5 AUTO-REPAIR
if (HorizontalFacingAngleOf(EventPlayer()) + 99.75 < 55)
{
if (abilities[16] != 0)
{
money[0] += 400;
money[1] -= 400;
automaticRepair -= 1;
abilities[16] -= 1;
}
else
{
SmallMessage(EventPlayer(), "You don't have that ability!");
}
}
else if (HorizontalFacingAngleOf(EventPlayer()) + 22.5 < 22.5)
{
if (abilities[12] != 0)
{
money[0] += 1200;
money[1] -= 1200;
abilities[12] -= 1;
}
else
{
SmallMessage(EventPlayer(), "You don't have that ability!");
}
}
else if (HorizontalFacingAngleOf(EventPlayer()) + 11.25 < 56)
{
if (abilities[8] != 0)
{
money[0] += 1200;
money[1] -= 1200;
abilities[8] -= 1;
}
else
{
SmallMessage(EventPlayer(), "You don't have that ability!");
}
}
else if (HorizontalFacingAngleOf(EventPlayer()) + 0 > 45)
{
if (abilities[4] != 0)
{
money[0] += 1000;
money[1] -= 1000;
abilities[4] -= 1;
}
else
{
SmallMessage(EventPlayer(), "You don't have that ability!");
}
}
}
}
rule: "Create Player HUD"
Event.OnPlayerJoin
Team.Team1
{
CreateHudText(AllPlayers(Team.Team1), <"<0>", HeroIconString(HeroOf(EventPlayer()))>, <"<0><1>", EventPlayer(), isInMenu[0] ? "(In Shop)" : "">, <"<0><1>", IsAlive(EventPlayer()) ? <"<0> HP", RoundToInteger(Health(EventPlayer()), Rounding.Up)> : "Dead", <", <0>$", money>>, Location.Left, LocalPlayer() == EventPlayer() ? -1 : SlotOf(EventPlayer()), IsDead(EventPlayer()) ? Color.Red : Health(EventPlayer()) > MaxHealth(EventPlayer()) * 0.5 ? Color.Green : Color.Orange, IsDead(EventPlayer()) ? Color.Red : Health(EventPlayer()) > MaxHealth(EventPlayer()) * 0.5 ? Color.Green : Color.Orange, IsDead(EventPlayer()) ? Color.Red : Health(EventPlayer()) > MaxHealth(EventPlayer()) * 0.5 ? Color.Green : Color.Orange, HudTextRev.VisibleToSortOrderStringAndColor, Spectators.DefaultVisibility);
CreateHudText(damageBoost[0] != 0 ? EventPlayer() : null, null, <"+<0>% Damage", damageBoost[0]>, null, Location.Left, 913, Color.Green, Color.Green, Color.Green, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
CreateHudText(abilities[9] ? EventPlayer() : null, null, <"Second Wind <0>", abilities[9] == 1 ? "I" : "II">, null, Location.Left, 908, Color.Green, Color.Green, Color.Green, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
CreateHudText(abilities[5] ? EventPlayer() : null, null, <"Charged <0>", abilities[5] == 1 ? "I" : "II">, null, Location.Left, 905, Color.Green, Color.Green, Color.Green, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
CreateHudText(abilities[1] ? EventPlayer() : null, null, <"Headhunter <0>", abilities[1] == 1 ? "I" : "II">, null, Location.Left, 901, Color.Green, Color.Green, Color.Green, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
CreateHudText(playerHealth != 0 ? EventPlayer() : null, null, <"+<0>% Health", playerHealth>, null, Location.Left, 914, Color.Green, Color.Green, Color.Green, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
CreateHudText(abilities[10] ? EventPlayer() : null, null, <"Binding Heal <0>", abilities[10] == 1 ? "I" : "II">, null, Location.Left, 909, Color.Green, Color.Green, Color.Green, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
CreateHudText(abilities[6] ? EventPlayer() : null, null, <"Haste <0>", abilities[6] == 1 ? "I" : "II">, null, Location.Left, 906, Color.Green, Color.Green, Color.Green, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
CreateHudText(abilities[2] ? EventPlayer() : null, null, <"Ambush <0>", abilities[2] == 1 ? "I" : "II">, null, Location.Left, 902, Color.Green, Color.Green, Color.Green, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
CreateHudText(healBoost[0] != 0 ? EventPlayer() : null, null, <"+<0>% Healing", healBoost[0]>, null, Location.Left, 915, Color.Green, Color.Green, Color.Green, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
CreateHudText(speedBoost != 0 ? EventPlayer() : null, null, <"+<0>% Movement Speed", speedBoost>, null, Location.Left, 915, Color.Green, Color.Green, Color.Green, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
CreateHudText(abilities[11] ? EventPlayer() : null, null, <"Resilience <0>", abilities[11] == 1 ? "I" : "II">, null, Location.Left, 910, Color.Green, Color.Green, Color.Green, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
CreateHudText(abilities[7] ? EventPlayer() : null, null, <"Heavy Impact <0>", abilities[7] == 1 ? "I" : "II">, null, Location.Left, 907, Color.Green, Color.Green, Color.Green, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
CreateHudText(abilities[3] ? EventPlayer() : null, null, <"Quick Fix <0>", abilities[3] == 1 ? "I" : "II">, null, Location.Left, 903, Color.Green, Color.Green, Color.Green, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
CreateHudText(automaticRepair ? EventPlayer() : null, null, <"<0> total Auto-Repair/5s", automaticRepair * (upgradeGateMaxHealthValue >= upgradeGateMaxHealthMaxValue[2] ? 10 : 5)>, null, Location.Left, 916, Color.Green, Color.Green, Color.Green, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
CreateHudText(abilities[12] ? EventPlayer() : null, null, <"<0> <1>", heroTalentText[2][0], heroTalentText[2][1]>, null, Location.Top, 902, Color.Green, Color.Green, Color.Green, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
CreateHudText(abilities[12] ? EventPlayer() : null, null, "Hero Talent 2", null, Location.Left, 912, Color.Green, Color.Green, Color.Green, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
CreateHudText(abilities[8] ? EventPlayer() : null, null, <"<0> <1>", heroTalentText[1][0], heroTalentText[1][1]>, null, Location.Top, 901, Color.Green, Color.Green, Color.Green, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
CreateHudText(abilities[8] ? EventPlayer() : null, null, "Hero Talent 1", null, Location.Left, 911, Color.Green, Color.Green, Color.Green, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
CreateHudText(abilities[4] ? EventPlayer() : null, null, <"Heavyweight <0>", abilities[4] == 1 ? "I" : "II">, null, Location.Left, 904, Color.Green, Color.Green, Color.Green, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
}
rule: "Boss Rotation"
if (IsGameInProgress() == true)
if (activeBoss == true)
{
if (bossRotation == 0 || bossRotation == 3)
{
bossRotation = 1;
lastBoss[1] = HeroOf(activeBoss);
}
else if (bossRotation == 1)
{
bossRotation = 2;
lastBoss[2] = HeroOf(activeBoss);
}
else if (bossRotation == 2)
{
bossRotation = 3;
lastBoss[3] = HeroOf(activeBoss);
}
}
rule: "BOSS HUD"
if (IsGameInProgress() == true)
if (timeMinutes == 10)
{
CreateHudText(AllPlayers(Team.Team1), null, activeBoss ? <"Boss: <0>, HP: <1>/<2>", HeroOf(activeBoss), Health(activeBoss), MaxHealth(activeBoss)> : "", null, Location.Top, 900, Color.White, Color.Red, Color.White, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
}
rule: "DEBUG - SKIP TIME"
Event.OngoingPlayer
Team.Team1
if (isDebug == true)
if ((IsButtonHeld(EventPlayer(), Button.PrimaryFire) && IsButtonHeld(EventPlayer(), Button.Crouch)) == true)
{
timeSeconds = 59;
}
rule: "DEBUG - SKIP TIME"
Event.OngoingPlayer
Team.Team1
if (isDebug == true)
if ((IsButtonHeld(EventPlayer(), Button.SecondaryFire) && IsButtonHeld(EventPlayer(), Button.Crouch)) == true)
{
botEchoRespawnPosition = Vector(130, 23, -44);
}
rule: "DEBUG COLLECTION - Make Invincible, Show Player Coords"
Event.OngoingPlayer
Team.Team1
if (isDebug == true)
{
CreateHudText(LocalPlayer(), null, <"<0>", PositionOf(EventPlayer())>, null, Location.Left, 0, Color.White, Color.Yellow, Color.White, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
SetStatus(EventPlayer(), null, Status.Invincible, 9999);
SetStatus(EventPlayer(), null, Status.PhasedOut, 9999);
}
rule: "OPTIONAL ENDING - CREATE EXFIL POINT"
if (IsGameInProgress() == true)
if (challengeCount >= 12)
{
CreateHudText(AllPlayers(Team.Team1), null, "Exfiltration available! (optional - ends the mode)", null, Location.Top, 50, Color.White, Color.Red, Color.White, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
globalHUDs[1] = LastTextID();
CreateInWorldText(AllPlayers(Team.Team1), <"Exfiltration available! Gather here!\n<0>/<1> Players ready to exfiltrate!", CountOf(FilteredArray(AllPlayers(Team.Team1), DistanceBetween(Vector(186, 11, -46.5), ArrayElement()) <= 9)), CountOf(AllPlayers(Team.Team1))>, Vector(186, 15, -46.5), 1.2, Clipping.DoNotClip, InworldTextRev.VisibleToAndString, Color.Green, Spectators.DefaultVisibility);
Wait(3, WaitBehavior.IgnoreCondition);
DestroyHudText(globalHUDs[1]);
}
rule: "OPTIONAL ENDING - EXFIL PLAYERS"
if (IsGameInProgress() == true)
if (challengeCount == 12)
if (CountOf(FilteredArray(AllPlayers(Team.Team1), DistanceBetween(Vector(186, 11, -46.5), AllPlayers(Team.Team1)) <= 9)) > CountOf(AllPlayers(Team.Team1)) / 2)
{
BigMessage(AllPlayers(Team.Team1), "GG! YOU SUCCESSFULLY RAN AWAY, WHILE LEAVING THE GATE TO THE ENEMY!");
DestroyAllDummyBots();
DisableMovementCollisionWithEnvironment(AllPlayers(Team.Team1), true);
StartAccelerating(AllPlayers(Team.Team1), Up(), 100, 5, Relative.ToWorld, AccelerateRev.DirectionRateAndMaxSpeed);
Wait(5, WaitBehavior.IgnoreCondition);
DeclareTeamVictory(Team.Team1);
}
rule: "Team 1 (Ability): Second Wind save life"
Event.OnDamageTaken
Team.Team1
if (abilities[9] == true)
if (secondWindActive == true)
if (Health(EventPlayer()) == 1)
{
SmallMessage(AllPlayers(Team.All), <"<0> received a second wind!", EventPlayer()>);
PlayEffect(AllPlayers(Team.Team1), PlayEffect.GoodPickupEffect, Color.Green, EventPlayer(), 1);
ClearStatus(EventPlayer(), Status.Unkillable);
SetPlayerHealth(EventPlayer(), MaxHealth(EventPlayer()));
lastSecondWind = 30;
secondWindActive = 0;
}
rule: "Team 1 (Ability): Second Wind after buying"
Event.OngoingPlayer
Team.Team1
if (abilities[9] == true)
if (secondWindActive == false)
if (lastSecondWind == 0)
{
if (RandomInteger(1, 100) > abilities[9] * 30)
{
Wait(30, WaitBehavior.IgnoreCondition);
Loop();
}
SetStatus(EventPlayer(), null, Status.Unkillable, 9999);
secondWindActive = 1;
}
rule: "Team 1 (Ability): Second Wind counter"
Event.OngoingPlayer
Team.Team1
if (IsGameInProgress() == true)
if (lastSecondWind > 0)
{
Wait(1, WaitBehavior.IgnoreCondition);
lastSecondWind -= 1;
LoopIfConditionIsTrue();
}
rule: "Team 1: Change Hero"
Event.OngoingPlayer
Team.Team1
if (DistanceBetween(Vector(159, 11, -46.5), EventPlayer()) <= 2)
if (IsButtonHeld(EventPlayer(), Button.Interact) == true)
{
SetAllowedHeroes(EventPlayer(), Hero.Pharah);
SetAllowedHeroes(EventPlayer(), Hero.Ana);
ResetHeroAvailability(EventPlayer());
Wait(0.5, WaitBehavior.IgnoreCondition);
WaitUntil(HasSpawned(EventPlayer()), 99999);
Teleport(EventPlayer(), Vector(159, 11, -46.5));
}
rule: "Team 1: Player Dealt Healing"
Event.OnHealingDealt
Team.Team1
{
AbortIf(Healee() != EventPlayer());
if (abilities[10] == true)
{
SetPlayerHealth(EventPlayer(), Health(EventPlayer()) + abilities[10] * 0.25 * EventHealing());
}
}
rule: "Team 1: Player Dealt Damage"
Event.OnDamageDealt
Team.Team1
{
if (EventWasCriticalHit() == true)
{
if (upgradeCriticalDamageValue >= upgradeCriticalDamageMaxValue[0])
{
Damage(Victim(), EventPlayer(), EventDamage() * 0.5);
}
if (abilities[1] == true)
{
Damage(Victim(), EventPlayer(), EventDamage() * abilities[1] * 0.4);
}
}
if (abilities[2] == true && EventAbility() != null && (YOf(PositionOf(EventPlayer())) - YOf(PositionOf(Victim())) >= 3 || AbsoluteValue(HorizontalAngleTowards(Victim(), EventPlayer())) >= 90) == true)
{
Damage(Victim(), EventPlayer(), EventDamage() * abilities[2] * 0.3);
}
if (perk[0] == true && EventAbility() != null && DistanceBetween(EventPlayer(), Victim()) >= 10)
{
Damage(Victim(), EventPlayer(), EventDamage() * 0.5);
}
}
rule: "▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒【Josbird's Cursor Menu】▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒"
{
}
rule: "Global init"
{
CreateHudText(IsGameInProgress() == false && HostPlayer().isInMenu[1] ? HostPlayer() : null, null, <"Cursor Menu created by Josbird <0> Code: GETVX", AbilityIconString(Hero.Mercy, Button.Ultimate)>, null, Location.Right, -100, Color.White, Color.Turquoise, Color.White, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
CreateHudText(timeSeconds == 0 && timeMinutes == 0 && !HostPlayer().isInMenu[1] ? HostPlayer() : null, null, <"<0>", <"Press <0> - Crouch to open workshop settings", InputBindingString(Button.Crouch)>>, null, Location.Top, 1, Color.White, Color.Yellow, Color.White, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
CreateHudText(IsGameInProgress() == false && HostPlayer().isInMenu[1] ? HostPlayer() : null, null, <"<0>", <"Press <0> - Primary Fire to increase by X\nPress <1> - Secondary Fire to decrease by X", InputBindingString(Button.PrimaryFire), InputBindingString(Button.SecondaryFire)>>, null, Location.Right, 1, Color.White, Color.Yellow, Color.White, HudTextRev.VisibleToAndString, Spectators.DefaultVisibility);
extendedGlobalCollection[1] = 10;
extendedGlobalCollection[2] = 5;
extendedGlobalCollection[6] = true;
exitButtonProperties = ["exit menu", extendedGlobalCollection[1] / 2 - 0.15, extendedGlobalCollection[2] / 2 - 0.15, 0.35];
}
void createMenuButton() "Create a menu button"
{
if (CountOf(newButton) != 13)
{
LogToInspector(<"[CursorMenu.createMenuButton] Error: incorrect number of arguments (got <0>, expected <1>)", destroyButtonID, 13>);
}
else
{
lastMenuButtonID = CountOf(buttons);
extendedPlayerCollection[2] = 0;
while (extendedPlayerCollection[2] < CountOf(buttons))
{
if (buttons[extendedPlayerCollection[2]] == null)
{
lastMenuButtonID = extendedPlayerCollection[2];
extendedPlayerCollection[2] = CountOf(buttons);
}
extendedPlayerCollection[2] += 1;
}
buttons[lastMenuButtonID] = newButton;
}
}
void destroyMenuButton() "Destroy a menu button"
{
if (destroyButtonID >= CountOf(buttons) || !buttons[destroyButtonID])
{
LogToInspector(<"[CursorMenu.destroyMenuButton] Error: tried to destroy an invalid button ID (<0>)", destroyButtonID>);
}
else
{
arrayBuilder = buttons[destroyButtonID];
arrayBuilder[15] = true;
buttons[destroyButtonID] = arrayBuilder;
}
}
void modifyMenuButton() "Modify a menu button"
{
if (CountOf(buttonModification) % 2 == 0 || CountOf(buttonModification) < 3)
{
LogToInspector(<"[CursorMenu.modifyMenuButton] Error: incorrect number of arguments (<0>)", CountOf(FirstOf(buttonModification))>);
}
else if (FirstOf(buttonModification) >= CountOf(buttons) || !buttons[FirstOf(buttonModification)])
{
LogToInspector(<"[CursorMenu.modifyMenuButton] Error: tried to modify an invalid button ID (<0>)", FirstOf(buttonModification)>);
}
else
{
extendedPlayerCollection[2] = 1;
while (extendedPlayerCollection[2] < CountOf(buttonModification))
{
if (buttonModification[extendedPlayerCollection[2]] < 0 || buttonModification[extendedPlayerCollection[2]] >= 13)
{
LogToInspector(<"[CursorMenu.modifyMenuButton] Error: tried to modify an invalid property index (<0>)", CountOf(buttonModification[extendedPlayerCollection[2]])>);
}
else
{
arrayBuilder = buttons[FirstOf(buttonModification)];
arrayBuilder[buttonModification[extendedPlayerCollection[2]]] = buttonModification[extendedPlayerCollection[2] + 1];
buttons[FirstOf(buttonModification)] = arrayBuilder;
}
extendedPlayerCollection[2] += 2;
}
}
}
void getButtonProperties() "Get properties of a menu button"
{
if (getProperties >= CountOf(buttons) || !buttons[getProperties])
{
LogToInspector(<"[CursorMenu.getButtonProperties] Error: tried to access an invalid button ID (<0>)", getProperties>);
}
else
{
getProperties = ArraySlice(buttons[getProperties], 0, 13);
}
}
rule: "Toggle menu"
Event.OngoingPlayer
Team.Team1
if (IsGameInProgress() == false)
if (EventPlayer() == HostPlayer())
if (!IsDummyBot(EventPlayer()) == true)
if (IsButtonHeld(EventPlayer(), Button.Crouch) == true)
if (!IsCommunicatingAnyEmote(EventPlayer()) == true)
{
isInMenu[1] = !isInMenu[1];
}
void createCursor() "Create menu cursor"
{
CreateInWorldText(FilteredArray(EventPlayer(), TotalTimeElapsed() % 0.032 < 0.016), "▲", UpdateEveryFrame(EyePosition(EventPlayer()) + 100 * (AngleDifference(HorizontalAngleFromDirection(FacingDirectionOf(EventPlayer())), HorizontalAngleFromDirection(menuOriginalFacing)) * CrossProduct(FacingDirectionOf(EventPlayer()), DirectionFromAngles(HorizontalAngleFromDirection(FacingDirectionOf(EventPlayer())), VerticalAngleFromDirection(FacingDirectionOf(EventPlayer())) - 90)) + (AngleDifference(VerticalAngleFromDirection(FacingDirectionOf(EventPlayer())), VerticalAngleFromDirection(menuOriginalFacing)) - 0.2) * DirectionFromAngles(HorizontalAngleFromDirection(FacingDirectionOf(EventPlayer())), VerticalAngleFromDirection(FacingDirectionOf(EventPlayer())) - 90) + 3 * FacingDirectionOf(EventPlayer()))), 3, Clipping.DoNotClip, InworldTextRev.VisibleToPositionStringAndColor, Color.White, Spectators.DefaultVisibility);
ModifyVariable(menuFrame, Operation.AppendToArray, LastTextID());
CreateInWorldText(FilteredArray(EventPlayer(), TotalTimeElapsed() % 0.032 >= 0.016), "▲", UpdateEveryFrame(EyePosition(EventPlayer()) + 100 * (AngleDifference(HorizontalAngleFromDirection(FacingDirectionOf(EventPlayer())), HorizontalAngleFromDirection(menuOriginalFacing)) * CrossProduct(FacingDirectionOf(EventPlayer()), DirectionFromAngles(HorizontalAngleFromDirection(FacingDirectionOf(EventPlayer())), VerticalAngleFromDirection(FacingDirectionOf(EventPlayer())) - 90)) + (AngleDifference(VerticalAngleFromDirection(FacingDirectionOf(EventPlayer())), VerticalAngleFromDirection(menuOriginalFacing)) - 0.2) * DirectionFromAngles(HorizontalAngleFromDirection(FacingDirectionOf(EventPlayer())), VerticalAngleFromDirection(FacingDirectionOf(EventPlayer())) - 90) + 3 * FacingDirectionOf(EventPlayer()))), 3, Clipping.DoNotClip, InworldTextRev.VisibleToPositionStringAndColor, Color.White, Spectators.DefaultVisibility);
ModifyVariable(menuFrame, Operation.AppendToArray, LastTextID());
}
void doButtonUpdate() "Do button update"
{
extendedPlayerCollection[2] = 0;
while (extendedPlayerCollection[2] < CountOf(buttons))
{
if (buttons[extendedPlayerCollection[2]])
{
if (buttons[extendedPlayerCollection[2]][15])
{
if (buttons[extendedPlayerCollection[2]][14])
{
DestroyInWorldText(buttons[extendedPlayerCollection[2]][13]);
}
buttons[extendedPlayerCollection[2]] = null;
}
else if (!buttons[extendedPlayerCollection[2]][12] && buttons[extendedPlayerCollection[2]][14] || !isInMenu[1])
{
DestroyInWorldText(buttons[extendedPlayerCollection[2]][13]);
arrayBuilder = buttons[extendedPlayerCollection[2]];
arrayBuilder[14] = false;
buttons[extendedPlayerCollection[2]] = arrayBuilder;
}
else if (buttons[extendedPlayerCollection[2]][12] && !buttons[extendedPlayerCollection[2]][14])
{
CreateInWorldText(EventPlayer(), buttons[EvaluateOnce(extendedPlayerCollection[2])][10] ? <"<0>", FirstOf(buttons[EvaluateOnce(extendedPlayerCollection[2])])> : FirstOf(buttons[EvaluateOnce(extendedPlayerCollection[2])]), UpdateEveryFrame(EyePosition(EventPlayer()) + 100 * (buttons[EvaluateOnce(extendedPlayerCollection[2])][4] * CrossProduct(FacingDirectionOf(EventPlayer()), DirectionFromAngles(HorizontalAngleFromDirection(FacingDirectionOf(EventPlayer())), VerticalAngleFromDirection(FacingDirectionOf(EventPlayer())) - 90)) + (buttons[EvaluateOnce(extendedPlayerCollection[2])][5] - 0.2) * DirectionFromAngles(HorizontalAngleFromDirection(FacingDirectionOf(EventPlayer())), VerticalAngleFromDirection(FacingDirectionOf(EventPlayer())) - 90) + 3 * FacingDirectionOf(EventPlayer()))), buttons[EvaluateOnce(extendedPlayerCollection[2])][3], Clipping.DoNotClip, InworldTextRev.VisibleToPositionStringAndColor, buttons[EvaluateOnce(extendedPlayerCollection[2])][11] && AbsoluteValue(AngleDifference(HorizontalAngleFromDirection(FacingDirectionOf(EventPlayer())), HorizontalAngleFromDirection(menuOriginalFacing)) - buttons[EvaluateOnce(extendedPlayerCollection[2])][4]) <= buttons[EvaluateOnce(extendedPlayerCollection[2])][6] / 2 && AbsoluteValue(AngleDifference(VerticalAngleFromDirection(FacingDirectionOf(EventPlayer())), VerticalAngleFromDirection(menuOriginalFacing)) - buttons[EvaluateOnce(extendedPlayerCollection[2])][5]) <= buttons[EvaluateOnce(extendedPlayerCollection[2])][7] / 2 ? buttons[EvaluateOnce(extendedPlayerCollection[2])][9] : buttons[EvaluateOnce(extendedPlayerCollection[2])][8], Spectators.DefaultVisibility);
arrayBuilder = buttons[EvaluateOnce(extendedPlayerCollection[2])];
arrayBuilder[13] = LastTextID();
buttons[EvaluateOnce(extendedPlayerCollection[2])] = arrayBuilder;
arrayBuilder = buttons[EvaluateOnce(extendedPlayerCollection[2])];
arrayBuilder[14] = true;
buttons[EvaluateOnce(extendedPlayerCollection[2])] = arrayBuilder;
}
}
extendedPlayerCollection[2] += 1;
}
}
rule: "Close menu on start"
Event.OngoingPlayer
Team.Team1
if (IsGameInProgress() == true)
if (isInMenu[1] == true)
{
isInMenu[1] = false;
SetAimSpeed(EventPlayer(), 100);
SetPrimaryFireEnabled(EventPlayer(), true);
SetSecondaryFireEnabled(EventPlayer(), true);
EnableHeroHud(EventPlayer());
extendedPlayerCollection[2] = 0;
while (extendedPlayerCollection[2] < CountOf(menuFrame))
{
DestroyInWorldText(menuFrame[extendedPlayerCollection[2]]);
extendedPlayerCollection[2] += 1;
}
DestroyIcon(FirstOf(extendedPlayerCollection));
doButtonUpdate();
EnablePlayer();
}
rule: "Open menu"
Event.OngoingPlayer
Team.Team1
if (IsGameInProgress() == false)
if (!IsDummyBot(EventPlayer()) == true)
if (isInMenu[1] == true)
{
SetAimSpeed(EventPlayer(), 15);
menuOriginalFacing = FacingDirectionOf(EventPlayer());
SetPrimaryFireEnabled(EventPlayer(), false);
SetSecondaryFireEnabled(EventPlayer(), false);
DisableHeroHud(EventPlayer());
DisableGameModeHud(EventPlayer());
menuFrame = [];
createCursor();
MinWait();
MinWait();
MinWait();
doButtonUpdate();
DisablePlayer();
}
rule: "Close menu"
Event.OngoingPlayer
Team.Team1
if (IsGameInProgress() == false)
if (!IsDummyBot(EventPlayer()) == true)
if (!isInMenu[1] == true)
{
SetAimSpeed(EventPlayer(), 100);
SetPrimaryFireEnabled(EventPlayer(), true);
SetSecondaryFireEnabled(EventPlayer(), true);
EnableHeroHud(EventPlayer());
EnableGameModeHud(EventPlayer());
extendedPlayerCollection[2] = 0;
while (extendedPlayerCollection[2] < CountOf(menuFrame))
{
DestroyInWorldText(menuFrame[extendedPlayerCollection[2]]);
extendedPlayerCollection[2] += 1;
}
DestroyIcon(FirstOf(extendedPlayerCollection));
doButtonUpdate();
EnablePlayer();
}
rule: "Check for button update"
Event.OngoingPlayer
Team.Team1
if (IsGameInProgress() == false)
if (isInMenu[1] == true)
if (IsTrueForAny(buttons, ArrayElement() && (ArrayElement()[15] || !ArrayElement()[12] && ArrayElement()[14] || ArrayElement()[12] && !ArrayElement()[14])) == true)
{
doButtonUpdate();
MinWait();
}
rule: "Detect primary fire button press"
Event.OngoingPlayer
Team.Team1
if (IsGameInProgress() == false)
if (isInMenu[1] == true)
if (IsButtonHeld(EventPlayer(), Button.PrimaryFire) == true)
{
if (AbsoluteValue(AngleDifference(HorizontalAngleFromDirection(FacingDirectionOf(EventPlayer())), HorizontalAngleFromDirection(menuOriginalFacing)) - exitButtonProperties[1]) <= exitButtonProperties[3] / 2 && AbsoluteValue(AngleDifference(VerticalAngleFromDirection(FacingDirectionOf(EventPlayer())), VerticalAngleFromDirection(menuOriginalFacing)) - exitButtonProperties[2]) <= exitButtonProperties[3] / 2)
{
currActionID = FirstOf(exitButtonProperties);
}
extendedPlayerCollection[3] = 0;
while (extendedPlayerCollection[3] < CountOf(buttons))
{
if (buttons[extendedPlayerCollection[3]][11] && AbsoluteValue(AngleDifference(HorizontalAngleFromDirection(FacingDirectionOf(EventPlayer())), HorizontalAngleFromDirection(menuOriginalFacing)) - buttons[extendedPlayerCollection[3]][4]) <= buttons[extendedPlayerCollection[3]][6] / 2 && AbsoluteValue(AngleDifference(VerticalAngleFromDirection(FacingDirectionOf(EventPlayer())), VerticalAngleFromDirection(menuOriginalFacing)) - buttons[extendedPlayerCollection[3]][5]) <= buttons[extendedPlayerCollection[3]][7] / 2)
{
currActionID = buttons[extendedPlayerCollection[3]][1];
}
extendedPlayerCollection[3] += 1;
}
if (currActionID && extendedGlobalCollection[6])
{
PlayEffect(EventPlayer(), PlayEffect.ExplosionSound, Color.White, EventPlayer(), 30);
}
MinWait();
currActionID = null;
}
rule: "Detect secondary fire button press"
Event.OngoingPlayer
Team.Team1
if (IsGameInProgress() == false)
if (isInMenu[1] == true)
if (IsButtonHeld(EventPlayer(), Button.SecondaryFire) == true)
{
if (AbsoluteValue(AngleDifference(HorizontalAngleFromDirection(FacingDirectionOf(EventPlayer())), HorizontalAngleFromDirection(menuOriginalFacing)) - exitButtonProperties[1]) <= exitButtonProperties[3] / 2 && AbsoluteValue(AngleDifference(VerticalAngleFromDirection(FacingDirectionOf(EventPlayer())), VerticalAngleFromDirection(menuOriginalFacing)) - exitButtonProperties[2]) <= exitButtonProperties[3] / 2)
{
currActionID = FirstOf(exitButtonProperties);
}
extendedPlayerCollection[4] = 0;
while (extendedPlayerCollection[4] < CountOf(buttons))
{
if (buttons[extendedPlayerCollection[4]][11] && AbsoluteValue(AngleDifference(HorizontalAngleFromDirection(FacingDirectionOf(EventPlayer())), HorizontalAngleFromDirection(menuOriginalFacing)) - buttons[extendedPlayerCollection[4]][4]) <= buttons[extendedPlayerCollection[4]][6] / 2 && AbsoluteValue(AngleDifference(VerticalAngleFromDirection(FacingDirectionOf(EventPlayer())), VerticalAngleFromDirection(menuOriginalFacing)) - buttons[extendedPlayerCollection[4]][5]) <= buttons[extendedPlayerCollection[4]][7] / 2)
{
currActionID = buttons[extendedPlayerCollection[4]][2];
}
extendedPlayerCollection[4] += 1;
}
if (currActionID && extendedGlobalCollection[6])
{
PlayEffect(EventPlayer(), PlayEffect.ExplosionSound, Color.White, EventPlayer(), 30);
}
MinWait();
currActionID = null;
}
rule: "Cursor bounds"
Event.OngoingPlayer
Team.Team1
if (IsGameInProgress() == false)
if (isInMenu[1] == true)
if ((AbsoluteValue(AngleDifference(HorizontalAngleFromDirection(FacingDirectionOf(EventPlayer())), HorizontalAngleFromDirection(menuOriginalFacing))) > extendedGlobalCollection[1] / 2 + 0.05 || AbsoluteValue(AngleDifference(VerticalAngleFromDirection(FacingDirectionOf(EventPlayer())), VerticalAngleFromDirection(menuOriginalFacing))) > extendedGlobalCollection[2] / 2 + 0.05) == true)
{
SetFacing(EventPlayer(), DirectionFromAngles(Min(Max(HorizontalAngleFromDirection(menuOriginalFacing) - AngleDifference(HorizontalAngleFromDirection(FacingDirectionOf(EventPlayer())), HorizontalAngleFromDirection(menuOriginalFacing)), HorizontalAngleFromDirection(menuOriginalFacing) - extendedGlobalCollection[1] / 2), HorizontalAngleFromDirection(menuOriginalFacing) + extendedGlobalCollection[1] / 2), Min(Max(VerticalAngleFromDirection(menuOriginalFacing) - AngleDifference(VerticalAngleFromDirection(FacingDirectionOf(EventPlayer())), VerticalAngleFromDirection(menuOriginalFacing)), VerticalAngleFromDirection(menuOriginalFacing) - extendedGlobalCollection[2] / 2), VerticalAngleFromDirection(menuOriginalFacing) + extendedGlobalCollection[2] / 2)), Relative.ToWorld);
MinWait();
LoopIfConditionIsTrue();
}
rule: "▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒a"
{
}
rule: "workshop rules"
Event.OngoingPlayer
Team.Team1
if (IsGameInProgress() == false)
if (EventPlayer() == HostPlayer())
{
gateMaxHealth[1] = 100;
gateMaxHealth[2] = 1000;
moneyMultiplier[1] = 0.5;
moneyMultiplier[2] = 2;
HostPlayer().newButton = [<"GATE MAX HEALTH: <0>", gateMaxHealth[0]>, null, null, 3, -1, 0.5, 0, 0.3, Color.Green, Color.Green, true, true, true];
createMenuButton();
HostPlayer().workshopButtons[0] = HostPlayer().lastMenuButtonID;
HostPlayer().newButton = ["+/- 1", "gateMaxHealthAddOne", "gateMaxHealthSubtractOne", 3, 0.65, 0.5, 0.5, 0.3, Color.Green, Color.Yellow, true, true, true];
createMenuButton();
HostPlayer().workshopButtons[1] = HostPlayer().lastMenuButtonID;
HostPlayer().newButton = ["+/- 10", "gateMaxHealthAddTen", "gateMaxHealthSubtractTen", 3, 1.15, 0.5, 0.5, 0.3, Color.Green, Color.Yellow, true, true, true];
createMenuButton();
HostPlayer().workshopButtons[2] = HostPlayer().lastMenuButtonID;
HostPlayer().newButton = ["+/- 100", "gateMaxHealthAddHundred", "gateMaxHealthSubtractHundred", 3, 1.7, 0.5, 0.5, 0.3, Color.Green, Color.Yellow, true, true, true];
createMenuButton();
HostPlayer().workshopButtons[3] = HostPlayer().lastMenuButtonID;
HostPlayer().newButton = [<"Money Multiplier: <0>", moneyMultiplier[0]>, null, null, 3, -1, 0, 0, 0.3, Color.Green, Color.Green, true, true, true];
createMenuButton();
HostPlayer().workshopButtons[4] = HostPlayer().lastMenuButtonID;
HostPlayer().newButton = ["+/- 0.01", "moneyMultAddTen", "moneyMultSubtractTen", 3, 0.75, 0, 0.5, 0.3, Color.Green, Color.Yellow, true, true, true];
createMenuButton();
HostPlayer().workshopButtons[5] = HostPlayer().lastMenuButtonID;
HostPlayer().newButton = ["+/- 0.10", "moneyMultAddHundred", "moneyMultSubtractHundred", 3, 1.5, 0, 0.5, 0.3, Color.Green, Color.Yellow, true, true, true];
createMenuButton();
HostPlayer().workshopButtons[6] = HostPlayer().lastMenuButtonID;
HostPlayer().newButton = [<"Ana Self Nano: <0>", selfNanoWorkshopSetting>, null, null, 3, -1, -0.5, 0, 0.3, Color.Green, Color.Green, true, true, true];
createMenuButton();
HostPlayer().workshopButtons[7] = HostPlayer().lastMenuButtonID;
HostPlayer().newButton = ["Toggle", "anaSelfNano", null, 3, 0.75, -0.5, 1, 0.3, Color.Green, Color.Yellow, true, true, true];
createMenuButton();
HostPlayer().workshopButtons[8] = HostPlayer().lastMenuButtonID;
WaitUntil(IsGameInProgress() == true, 9999);
HostPlayer().destroyButtonID = HostPlayer().workshopButtons[0];
destroyMenuButton();
HostPlayer().destroyButtonID = HostPlayer().workshopButtons[1];
destroyMenuButton();
HostPlayer().destroyButtonID = HostPlayer().workshopButtons[2];
destroyMenuButton();
HostPlayer().destroyButtonID = HostPlayer().workshopButtons[3];
destroyMenuButton();
HostPlayer().destroyButtonID = HostPlayer().workshopButtons[4];
destroyMenuButton();
HostPlayer().destroyButtonID = HostPlayer().workshopButtons[5];
destroyMenuButton();
HostPlayer().destroyButtonID = HostPlayer().workshopButtons[6];
destroyMenuButton();
HostPlayer().destroyButtonID = HostPlayer().workshopButtons[7];
destroyMenuButton();
HostPlayer().destroyButtonID = HostPlayer().workshopButtons[8];
destroyMenuButton();
}
rule: "Actions"
Event.OngoingPlayer
Team.Team1
if (IsGameInProgress() == false)
if (currActionID != null)
{
if (currActionID == "gateMaxHealthAddOne")
{
if (gateMaxHealth[0] + 1 <= gateMaxHealth[2])
{
gateMaxHealth[0] += 1;
}
else
{
gateMaxHealth[0] = gateMaxHealth[2];
}
}
else if (currActionID == "gateMaxHealthSubtractOne")
{
if (gateMaxHealth[0] - 1 >= gateMaxHealth[1])
{
gateMaxHealth[0] -= 1;
}
else
{
gateMaxHealth[0] = gateMaxHealth[1];
}
}
else if (currActionID == "gateMaxHealthAddTen")
{
if (gateMaxHealth[0] + 10 <= gateMaxHealth[2])
{
gateMaxHealth[0] += 10;
}
else
{
gateMaxHealth[0] = gateMaxHealth[2];
}
}
else if (currActionID == "gateMaxHealthSubtractTen")
{
if (gateMaxHealth[0] - 10 >= gateMaxHealth[1])
{
gateMaxHealth[0] -= 10;
}
else
{
gateMaxHealth[0] = gateMaxHealth[1];
}
}
else if (currActionID == "gateMaxHealthAddHundred")
{
if (gateMaxHealth[0] + 100 <= gateMaxHealth[2])
{
gateMaxHealth[0] += 100;
}
else
{
gateMaxHealth[0] = gateMaxHealth[2];
}
}
else if (currActionID == "gateMaxHealthSubtractHundred")
{
if (gateMaxHealth[0] - 100 >= gateMaxHealth[1])
{
gateMaxHealth[0] -= 100;
}
else
{
gateMaxHealth[0] = gateMaxHealth[1];
}
}
else if (currActionID == "moneyMultAddTen")
{
if (moneyMultiplier[0] + 0.01 <= moneyMultiplier[2])
{
moneyMultiplier[0] += 0.01;
}
else
{
moneyMultiplier[0] = moneyMultiplier[2];
}
}
else if (currActionID == "moneyMultSubtractTen")
{
if (moneyMultiplier[0] - 0.01 >= moneyMultiplier[1])
{
moneyMultiplier[0] -= 0.01;
}
else
{
moneyMultiplier[0] = moneyMultiplier[1];
}
}
else if (currActionID == "moneyMultAddHundred")
{
if (moneyMultiplier[0] + 0.1 <= moneyMultiplier[2])
{
moneyMultiplier[0] += 0.1;
}
else
{
moneyMultiplier[0] = moneyMultiplier[2];
}
}
else if (currActionID == "moneyMultSubtractHundred")
{
if (moneyMultiplier[0] - 0.1 >= moneyMultiplier[1])
{
moneyMultiplier[0] -= 0.1;
}
else
{
moneyMultiplier[0] = moneyMultiplier[1];
}
}
else if (currActionID == "anaSelfNano")
{
selfNanoWorkshopSetting = !selfNanoWorkshopSetting;
}
upgradeGateMaxHealthMaxValue[0] = RoundToInteger(gateMaxHealth[0] + gateMaxHealth[0] * 0.5, Rounding.Up) > 1000 ? 1000 : RoundToInteger(gateMaxHealth[0] + gateMaxHealth[0] * 0.5, Rounding.Up);
upgradeGateMaxHealthMaxValue[1] = RoundToInteger(upgradeGateMaxHealthMaxValue[0] + upgradeGateMaxHealthMaxValue[0] * 0.5, Rounding.Up);
upgradeGateMaxHealthMaxValue[2] = RoundToInteger(upgradeGateMaxHealthMaxValue[1] + upgradeGateMaxHealthMaxValue[1] * 0.5, Rounding.Up);
buttonModification = [workshopButtons[0], 0, <"GATE MAX HEALTH: <0>", gateMaxHealth[0]>];
modifyMenuButton();
buttonModification = [workshopButtons[4], 0, <"Money Multiplier: <0>", moneyMultiplier[0]>];
modifyMenuButton();
buttonModification = [workshopButtons[7], 0, <"Ana Self Nano: <0>", selfNanoWorkshopSetting>];
modifyMenuButton();
}