Back to home

Randomized Gun Game with replaced nonFFA abilities

W51SS
click to copy
This game is archived.
If you with to unarchive it, click the "restore" button in the options menu.

Category:
Custom game mode

Author:
getup98

Rating:
1

Version:
1.0.2-alpha

Posted:
18 days ago

Last updated:
17 days ago

Tags:
gun game gungame custom ability abilities random new

Share this workshop!

Options

Gamemode is playable but not tested extensively, have fun!

Gun game but...

  • You have to go through the full roster in randomised order.
  • You can score by killing someone OR by dealing 2000 damage
  • You only heal 25% of life when killing someone, reduced from 100%
  • You lose score for self damage deaths
  • Every ability that has no use in FFA (mercy, brig, zarya, etc...) Has been replaced with weird stuff. Explainations in-game. Will write it here when i feel like it :P
  • Some movement options were expanded upon (lucio the floor is lava, Brigitte recall explodes, baptiste jump is cancer)
  • I like on-a-whim balance changes.

Known bugs: None, but haven't tested extensively, please write how to reproduce them in the comments if you find some.

variables
{
	global:
		0: HeroList
		1: SetDamageToScore
		2: HealingPercentOnKill
		3: KillLeader
		4: PlayersByScore
		5: LowestScoreForCatchup
		6: LowestScoretemp

	player:
		0: HUDNextHero
		1: Score
		2: DamageToScore
		3: HUDDamageToScore
		4: HealthForHeroSwap
		5: Ability1CD
		6: Ability2CD
		7: CustomAbility_Mercy2_Targeting
		8: CustomAbility_Zen1_InitTargeting
		9: CustomAbility_Zen1_CurTarget
		10: CustomAbility_Zen1_Duration
		11: CustomAbility_Zen1_VisualFX
		13: CustomAbility_ZenU_Targeting
		14: CustomAbility_BapS_Targeting
		15: CustomAbility_Zar2_Targeting
		16: CustomAbility_Zar2_VisualFX
		17: LucioOffTheWallCounter
		18: LucioOffTheWall_VisualFX
		19: LucioOffTheWall_SoundFX
		20: CustomAbility_Brig2_Targeting
		21: CustomAbility_Brig2_VisualFX
		22: Brigthing
		23: BastionIsTrash
		24: BastionIsTrashPos
}

rule("MANUAL VARIABLES")
{
	event
	{
		Ongoing - Global;
	}

	actions
	{
		Set Global Variable(SetDamageToScore, 2000);
		Set Global Variable(HealingPercentOnKill, 0.250);
	}
}

rule("Build hero list and disable built in scoring")
{
	event
	{
		Ongoing - Global;
	}

	actions
	{
		Set Global Variable(HeroList, Randomized Array(All Heroes));
		Disable Built-In Game Mode Scoring;
		Wait(30, Ignore Condition);
		Skip If(Not(Is Game In Progress), 1);
		Pause Match Time;
	}
}

rule("Initialize HUD for each player")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	actions
	{
		Create HUD Text(Event Player, Hero Icon String(Value In Array(Global Variable(HeroList), Add(Score Of(Event Player), 1))), String(
			"Next Hero", Null, Null, Null), Value In Array(Global Variable(HeroList), Add(Score Of(Event Player), 1)), Left, 0, Blue,
			White, White, String, Default Visibility);
		Set Player Variable(Event Player, HUDNextHero, Last Text ID);
		Create HUD Text(Event Player, Null, Custom String("Kill or deal {0} damage to advance", Subtract(Global Variable(SetDamageToScore),
			Player Variable(Event Player, DamageToScore)), Null, Null), Null, Left, 1, Aqua, Aqua, White, String, Default Visibility);
		Set Player Variable(Event Player, HUDDamageToScore, Last Text ID);
	}
}

rule("If on the last hero, clean up the HUD and show feedback link")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Player Variable(Event Player, Score) >= Subtract(Count Of(Global Variable(HeroList)), 1);
	}

	actions
	{
		Destroy HUD Text(Player Variable(Event Player, HUDNextHero));
		Create HUD Text(Event Player, Icon String(Heart), Custom String("Gamemode created by Getup98", Null, Null, Null), Custom String(
			"Leave feedback and bug reports at https://www.workshop.codes/0QMVD", Null, Null, Null), Left, 0, Red, Green, White, String,
			Default Visibility);
	}
}

rule("Gain score when earning a kill")
{
	event
	{
		Player Dealt Final Blow;
		All;
		All;
	}

	conditions
	{
		Is Game In Progress == True;
		Attacker != Victim;
	}

	actions
	{
		Wait(0.250, Ignore Condition);
		Modify Player Score(Attacker, 1);
		Modify Player Variable(Attacker, Score, Add, 1);
		Wait(0.250, Ignore Condition);
	}
}

rule("Gain score dealing damage to prevent preponderant killstealing (resets with hero switching)")
{
	event
	{
		Player Dealt Damage;
		All;
		All;
	}

	conditions
	{
		Attacker != Victim;
	}

	actions
	{
		Modify Player Variable(Attacker, DamageToScore, Add, Event Damage);
		Abort If(Compare(Player Variable(Attacker, DamageToScore), <, Global Variable(SetDamageToScore)));
		Wait(0.250, Ignore Condition);
		Set Player Variable(Event Player, DamageToScore, 0);
		Modify Player Score(Attacker, 1);
		Modify Player Variable(Attacker, Score, Add, 1);
		Wait(0.250, Ignore Condition);
	}
}

rule("Lose score when self death")
{
	event
	{
		Player Died;
		All;
		All;
	}

	conditions
	{
		Attacker == Victim;
	}

	actions
	{
		Wait(0.250, Ignore Condition);
		Abort If(Compare(Score Of(Event Player), ==, 0));
		Modify Player Score(Event Player, -1.000);
		Modify Player Variable(Event Player, Score, Subtract, 1);
		Wait(0.250, Ignore Condition);
	}
}

rule("If a player's actual hero differs from the player's desired hero, force the hero(and heal him a bit but not to full)(&updatePBS)")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Hero Of(Event Player) != Value In Array(Global Variable(HeroList), Player Variable(Event Player, Score));
	}

	actions
	{
		Wait(0.016, Ignore Condition);
		Loop If(Is Dead(Event Player));
		Wait(0.016, Ignore Condition);
		Set Player Variable(Event Player, HealthForHeroSwap, Min(1, Add(Normalized Health(Event Player), Global Variable(
			HealingPercentOnKill))));
		Wait(0.016, Ignore Condition);
		Start Forcing Player To Be Hero(Event Player, Value In Array(Global Variable(HeroList), Player Variable(Event Player, Score)));
		Wait(0.016, Ignore Condition);
		Set Max Health(Event Player, Multiply(Player Variable(Event Player, HealthForHeroSwap), 100));
		Set Player Variable(Event Player, DamageToScore, 0);
		Set Player Variable(Event Player, Ability1CD, 0);
		Set Player Variable(Event Player, Ability2CD, 0);
		Set Global Variable(PlayersByScore, Sorted Array(All Players(All Teams), Score Of(Current Array Element)));
		Wait(0.250, Ignore Condition);
		Preload Hero(Event Player, Array Slice(Global Variable(HeroList), Add(Player Variable(Event Player, Score), 1), 12));
		Set Max Health(Event Player, 100);
		Loop If Condition Is True;
	}
}

rule("Sparkles on first place: spawn")
{
	event
	{
		Ongoing - Global;
	}

	conditions
	{
		Is Game In Progress == True;
	}

	actions
	{
		Create Effect(All Players(All Teams), Sparkles, Purple, Global Variable(KillLeader), 1.700, Position and Radius);
	}
}

rule("Track KillLeader")
{
	event
	{
		Player Died;
		All;
		All;
	}

	conditions
	{
		Score Of(Value In Array(Global Variable(PlayersByScore), Count Of(Global Variable(PlayersByScore)))) != Score Of(Value In Array(
			Global Variable(PlayersByScore), Subtract(Count Of(Global Variable(PlayersByScore)), 1)));
	}

	actions
	{
		Set Global Variable(KillLeader, Last Of(Global Variable(PlayersByScore)));
	}
}

disabled rule("Gain score pressing interact TESTING")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Is Button Held(Event Player, Interact) == True;
	}

	actions
	{
		Wait(0.250, Ignore Condition);
		Modify Player Score(Event Player, 1);
		Modify Player Variable(Event Player, Score, Add, 1);
		Wait(0.250, Ignore Condition);
	}
}

disabled rule("Create dummy bot TESTING")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Is Button Held(Event Player, Crouch) == True;
		Is Button Held(Event Player, Jump) == True;
	}

	actions
	{
		Create Dummy Bot(Hero(Ana), All Teams, -1.000, Add(Event Player, Vector(0, 2, 0)), Vector(0, 0, -1.000));
	}
}

rule("Catch-up mechanic: sync lowest score every minute")
{
	event
	{
		Player Joined Match;
		All;
		All;
	}

	conditions
	{
		Is Game In Progress == True;
	}

	actions
	{
		Set Global Variable(LowestScoretemp, Score Of(Filtered Array(Global Variable(PlayersByScore), Compare(Score Of(
			Current Array Element), >, 0))));
		Skip If(Compare(Global Variable(LowestScoreForCatchup), >=, Global Variable(LowestScoretemp)), 1);
		Set Global Variable(LowestScoreForCatchup, Global Variable(LowestScoretemp));
	}
}

rule("Catch-up mechanic: on join set score to lowest-2")
{
	event
	{
		Player Joined Match;
		All;
		All;
	}

	actions
	{
		Wait(0.250, Ignore Condition);
		Loop If(Not(Has Spawned(Event Player)));
		Wait(1, Ignore Condition);
		Modify Player Score(Event Player, Max(0, Subtract(Global Variable(LowestScoreForCatchup), 2)));
		Modify Player Variable(Event Player, Score, Add, Max(0, Subtract(Global Variable(LowestScoreForCatchup), 2)));
	}
}

rule("Bandagefix:heal so you don't spawn with half health on first spawn")
{
	event
	{
		Player Joined Match;
		All;
		All;
	}

	actions
	{
		Wait(0.250, Ignore Condition);
		Loop If(Not(Has Spawned(Event Player)));
		Wait(0.450, Ignore Condition);
		Heal(Event Player, Null, 1000);
	}
}

rule("Custom abilities handling: disallow ability1 on cooldown")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Player Variable(Event Player, Ability1CD) > 0;
	}

	actions
	{
		Disallow Button(Event Player, Ability 1);
		Set Ability 1 Enabled(Event Player, False);
		Chase Player Variable At Rate(Event Player, Ability1CD, 0, 1, None);
	}
}

rule("Custom abilities handling: allow ability1 when out of cooldown")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Player Variable(Event Player, Ability1CD) <= 0;
	}

	actions
	{
		Allow Button(Event Player, Ability 1);
		Set Ability 1 Enabled(Event Player, True);
		Stop Chasing Player Variable(Event Player, Ability1CD);
	}
}

rule("Custom abilities handling: disallow ability2 on cooldown")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Player Variable(Event Player, Ability2CD) > 0;
	}

	actions
	{
		Disallow Button(Event Player, Ability 2);
		Set Ability 2 Enabled(Event Player, False);
		Chase Player Variable At Rate(Event Player, Ability2CD, 0, 1, None);
	}
}

rule("Custom abilities handling: allow ability2 when out of cooldown")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Player Variable(Event Player, Ability2CD) <= 0;
	}

	actions
	{
		Allow Button(Event Player, Ability 2);
		Set Ability 2 Enabled(Event Player, True);
		Stop Chasing Player Variable(Event Player, Ability2CD);
	}
}

rule("TRACER: explaination")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Hero Of(Event Player) == Hero(Tracer);
	}

	actions
	{
		Wait(0.200, Abort When False);
		Small Message(Event Player, Custom String("You now unleash a powerful blast after [E]Recall.", Null, Null, Null));
		Wait(3, Abort When False);
		Small Message(Event Player, Custom String("Remove people from your future luring them to your past!", Null, Null, Null));
	}
}

rule("TRACER: recall blast (ffa version)")
{
	event
	{
		Ongoing - Each Player;
		All;
		Tracer;
	}

	conditions
	{
		Is Using Ability 2(Event Player) == True;
		Hero Of(Event Player) == Hero(Tracer);
	}

	actions
	{
		Wait(1, Ignore Condition);
		Play Effect(All Players(All Teams), Ring Explosion, Aqua, Add(Event Player, Vector(0, 0.500, 0)), 7);
		Damage(Remove From Array(Players Within Radius(Add(Event Player, Vector(0, 0.500, 0)), 7, All Teams, Surfaces And Enemy Barriers),
			Event Player), Event Player, 120);
	}
}

rule("MERCY: explaination")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Hero Of(Event Player) == Hero(Mercy);
	}

	actions
	{
		Wait(0.200, Abort When False);
		Small Message(Event Player, Custom String("Your [Shift]Guardian Angel is now [Shift]Ascend.", Null, Null, Null));
		Wait(3, Abort When False);
		Small Message(Event Player, Custom String("Your [E]Resurrect is now [E]Made you look!: small AoE in front of you", Null, Null,
			Null));
		Wait(3, Abort When False);
		Small Message(Event Player, Custom String("that will have enemies look for you in the sky.", Null, Null, Null));
	}
}

rule("MERCY: made you look! (ffa version)")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Hero Of(Event Player) == Hero(Mercy);
		Is Button Held(Event Player, Ability 2) == True;
		Player Variable(Event Player, Ability2CD) <= 0;
		Has Status(Event Player, Hacked) == False;
		Has Status(Event Player, Knocked Down) == False;
		Has Status(Event Player, Asleep) == False;
		Has Status(Event Player, Frozen) == False;
		Has Status(Event Player, Stunned) == False;
	}

	actions
	{
		Play Effect(All Players(All Teams), Good Explosion, Yellow, Add(Add(Event Player, Vector(0, 1, 0)), World Vector Of(Vector(0, 0,
			2), Event Player, Rotation)), 3);
		Set Player Variable(Event Player, CustomAbility_Mercy2_Targeting, Remove From Array(Players Within Radius(Add(Add(Event Player,
			Vector(0, 1, 0)), World Vector Of(Vector(0, 0, 2), Event Player, Rotation)), 3, All Teams, Surfaces), Event Player));
		Set Facing(Player Variable(Event Player, CustomAbility_Mercy2_Targeting), Vector(Random Integer(-10.000, 10), 10000,
			Random Integer(-10.000, 10)), To World);
		Set Player Variable(Event Player, Ability2CD, 8);
	}
}

rule("MERCY: ascend")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Hero Of(Event Player) == Hero(Mercy);
		Is Button Held(Event Player, Ability 1) == True;
		Player Variable(Event Player, Ability1CD) <= 0;
		Has Status(Event Player, Hacked) == False;
		Has Status(Event Player, Knocked Down) == False;
		Has Status(Event Player, Asleep) == False;
		Has Status(Event Player, Frozen) == False;
		Has Status(Event Player, Stunned) == False;
		Has Status(Event Player, Rooted) == False;
	}

	actions
	{
		Start Accelerating(Event Player, Vector(0, 2, 1), 40, 15, To Player, Direction Rate and Max Speed);
		Set Player Variable(Event Player, Ability1CD, 8);
		Wait(3, Ignore Condition);
		Stop Accelerating(Event Player);
	}
}

rule("ZENYATTA: explaination")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Hero Of(Event Player) == Hero(Zenyatta);
	}

	actions
	{
		Wait(0.200, Abort When False);
		Small Message(Event Player, Custom String("Your [Shift]Healing Orb is now [Shift]Heavy Orb.", Null, Null, Null));
		Wait(3, Abort When False);
		Small Message(Event Player, Custom String("Same as usual orbs, but slows down the enemy.", Null, Null, Null));
		Wait(25, Abort When False);
		Small Message(Event Player, Custom String(
			"If you somehow are still on Zen, your ult drains people around you until they have 1hp.", Null, Null, Null));
	}
}

rule("ZENYATTA: heavy orb (ffa version) --- Send orb")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Hero Of(Event Player) == Hero(Zenyatta);
		Is Button Held(Event Player, Ability 1) == True;
		Player Variable(Event Player, Ability1CD) <= 0;
		Has Status(Event Player, Hacked) == False;
		Has Status(Event Player, Knocked Down) == False;
		Has Status(Event Player, Asleep) == False;
		Has Status(Event Player, Frozen) == False;
		Has Status(Event Player, Stunned) == False;
	}

	actions
	{
		Set Player Variable(Event Player, CustomAbility_Zen1_InitTargeting, Player Closest To Reticle(Event Player, All Teams));
		Abort If(Not(Is In Line of Sight(Eye Position(Event Player), Player Variable(Event Player, CustomAbility_Zen1_InitTargeting),
			Enemy Barriers Block LOS)));
		Set Player Variable(Event Player, Ability1CD, 0.700);
		Set Player Variable(Event Player, CustomAbility_Zen1_Duration, 0);
		Wait(0.150, Ignore Condition);
		Set Player Variable(Event Player, CustomAbility_Zen1_Duration, 3);
		Set Player Variable(Event Player, CustomAbility_Zen1_CurTarget, Player Variable(Event Player, CustomAbility_Zen1_InitTargeting));
		Wait(0.150, Ignore Condition);
		Create Effect(All Players(All Teams), Orb, White, Add(Player Variable(Event Player, CustomAbility_Zen1_CurTarget), World Vector Of(
			Vector(-0.851, 1.970, 0.399), Player Variable(Event Player, CustomAbility_Zen1_CurTarget), Rotation)), 0.010,
			Visible To Position and Radius);
		Set Player Variable(Event Player, CustomAbility_Zen1_VisualFX, Last Created Entity);
		Set Aim Speed(Player Variable(Event Player, CustomAbility_Zen1_CurTarget), 50);
		Set Move Speed(Player Variable(Event Player, CustomAbility_Zen1_CurTarget), 50);
		Set Gravity(Player Variable(Event Player, CustomAbility_Zen1_CurTarget), 220);
		Set Projectile Speed(Player Variable(Event Player, CustomAbility_Zen1_CurTarget), 30);
		Stop Chasing Player Variable(Event Player, CustomAbility_Zen1_Duration);
	}
}

rule("ZENYATTA: heavy orb (ffa version) --- LOS Check negative")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Player Variable(Event Player, CustomAbility_Zen1_CurTarget) != Null;
		Is In Line of Sight(Eye Position(Event Player), Player Variable(Event Player, CustomAbility_Zen1_CurTarget),
			Enemy Barriers Block LOS) == False;
	}

	actions
	{
		Chase Player Variable At Rate(Event Player, CustomAbility_Zen1_Duration, 0, 1, None);
	}
}

rule("ZENYATTA: heavy orb (ffa version) --- LOS Check positive")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Player Variable(Event Player, CustomAbility_Zen1_CurTarget) != Null;
		Is In Line of Sight(Eye Position(Event Player), Player Variable(Event Player, CustomAbility_Zen1_CurTarget),
			Enemy Barriers Block LOS) == True;
	}

	actions
	{
		Stop Chasing Player Variable(Event Player, CustomAbility_Zen1_Duration);
		Set Player Variable(Event Player, CustomAbility_Zen1_Duration, 3);
	}
}

rule("ZENYATTA: heavy orb (ffa version) --- remove on death of either player or when not zen anymore")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Player Variable(Event Player, CustomAbility_Zen1_CurTarget) != Null;
		Or(Or(Is Dead(Event Player), Compare(Hero Of(Event Player), !=, Hero(Zenyatta))), Is Dead(Player Variable(Event Player,
			CustomAbility_Zen1_CurTarget))) == True;
	}

	actions
	{
		Set Player Variable(Event Player, CustomAbility_Zen1_Duration, 0);
	}
}

rule("ZENYATTA: heavy orb (ffa version) --- End effects")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Player Variable(Event Player, CustomAbility_Zen1_CurTarget) != Null;
		Player Variable(Event Player, CustomAbility_Zen1_Duration) <= 0;
	}

	actions
	{
		Destroy Effect(Player Variable(Event Player, CustomAbility_Zen1_VisualFX));
		Set Player Variable(Event Player, CustomAbility_Zen1_VisualFX, Last Created Entity);
		Set Aim Speed(Player Variable(Event Player, CustomAbility_Zen1_CurTarget), 100);
		Set Move Speed(Player Variable(Event Player, CustomAbility_Zen1_CurTarget), 100);
		Set Projectile Speed(Player Variable(Event Player, CustomAbility_Zen1_CurTarget), 100);
		Set Gravity(Player Variable(Event Player, CustomAbility_Zen1_CurTarget), 100);
		Set Player Variable(Event Player, CustomAbility_Zen1_CurTarget, Null);
		Small Message(Event Player, Custom String("Heavy orb returned", Null, Null, Null));
	}
}

rule("ZENYATTA: merciful g0d (ffa version)")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Hero Of(Event Player) == Hero(Zenyatta);
		Is Using Ultimate(Event Player) == True;
	}

	actions
	{
		Set Player Variable(Event Player, CustomAbility_ZenU_Targeting, Remove From Array(Players Within Radius(Eye Position(Event Player),
			10, All Teams, Surfaces And Enemy Barriers), Event Player));
		Set Status(Player Variable(Event Player, CustomAbility_ZenU_Targeting), Event Player, Unkillable, 0.400);
		Heal(Player Variable(Event Player, CustomAbility_ZenU_Targeting), Event Player, 30);
		Wait(0.050, Ignore Condition);
		Damage(Player Variable(Event Player, CustomAbility_ZenU_Targeting), Event Player, 60);
		Wait(0.250, Ignore Condition);
		Loop If Condition Is True;
	}
}

rule("BAPTISTE: explaination")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Hero Of(Event Player) == Hero(Baptiste);
	}

	actions
	{
		Wait(0.200, Abort When False);
		Small Message(Event Player, Custom String("Your charge jump will knockdown nearby enemies...", Null, Null, Null));
		Wait(3, Abort When False);
		Small Message(Event Player, Custom String("Unless they know they have to crouch to avoid it.", Null, Null, Null));
		Wait(3, Abort When False);
		Small Message(Event Player, Custom String("Happy SpamTiste!", Null, Null, Null));
	}
}

rule("BAPTISTE: Shockwave (ffa version)")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Hero Of(Event Player) == Hero(Baptiste);
		Is Button Held(Event Player, Crouch) == True;
		Is Button Held(Event Player, Jump) == True;
	}

	actions
	{
		Abort If(Compare(Altitude Of(Event Player), >=, 0.350));
		Play Effect(All Players(All Teams), Ring Explosion, Yellow, Add(Event Player, Vector(0, 0.200, 0)), 7);
		Set Player Variable(Event Player, CustomAbility_BapS_Targeting, Remove From Array(Players Within Radius(Add(Event Player, Vector(0,
			0.200, 0)), 7, All Teams, Surfaces And Enemy Barriers), Filtered Array(All Players(All Teams), Is Crouching(
			Current Array Element))));
		Damage(Player Variable(Event Player, CustomAbility_BapS_Targeting), Event Player, 5);
		Set Status(Player Variable(Event Player, CustomAbility_BapS_Targeting), Event Player, Knocked Down, 1);
	}
}

rule("ZARYA: explaination")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Hero Of(Event Player) == Hero(Zarya);
	}

	actions
	{
		Wait(0.200, Abort When False);
		Small Message(Event Player, Custom String("Your [E]Protective Bubble is now... well... [E]"Protective" Bubble", Null, Null,
			Null));
		Wait(3, Abort When False);
		Small Message(Event Player, Custom String("Use it to prevent someone from securing a kill!", Null, Null, Null));
	}
}

rule("ZARYA: "Protective" bubble (ffa version)")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Hero Of(Event Player) == Hero(Zarya);
		Is Button Held(Event Player, Ability 2) == True;
		Player Variable(Event Player, Ability2CD) <= 0;
		Has Status(Event Player, Hacked) == False;
		Has Status(Event Player, Knocked Down) == False;
		Has Status(Event Player, Asleep) == False;
		Has Status(Event Player, Frozen) == False;
		Has Status(Event Player, Stunned) == False;
	}

	actions
	{
		Set Player Variable(Event Player, CustomAbility_Zar2_Targeting, Player Closest To Reticle(Event Player, All Teams));
		Abort If(Not(Is In Line of Sight(Eye Position(Event Player), Player Variable(Event Player, CustomAbility_Zar2_Targeting),
			Enemy Barriers Block LOS)));
		Set Player Variable(Event Player, Ability2CD, 15);
		Create Effect(All Players(All Teams), Sphere, Purple, Add(Player Variable(Event Player, CustomAbility_Zar2_Targeting), Vector(0,
			-0.200, 0)), 1.200, Position and Radius);
		Set Player Variable(Event Player, CustomAbility_Zar2_VisualFX, Last Created Entity);
		Set Status(Player Variable(Event Player, CustomAbility_Zar2_Targeting), Event Player, Asleep, 5);
		Set Status(Player Variable(Event Player, CustomAbility_Zar2_Targeting), Event Player, Invincible, 5);
		Small Message(Player Variable(Event Player, CustomAbility_Zar2_Targeting), Custom String("{0} is "protecting" you", Event Player,
			Null, Null));
		Wait(5, Ignore Condition);
		Destroy Effect(Player Variable(Event Player, CustomAbility_Zar2_VisualFX));
	}
}

rule("LUCIO: explaination")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Hero Of(Event Player) == Hero(Lúcio);
	}

	actions
	{
		Wait(0.200, Abort When False);
		Small Message(Event Player, Custom String("The floor is lava!", Null, Null, Null));
		Wait(3, Abort When False);
		Small Message(Event Player, Custom String("Consecutive airtime increases your damage A LOT!", Null, Null, Null));
	}
}

rule("LUCIO: the floor is lava")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Hero Of(Event Player) == Hero(Lúcio);
		Is On Ground(Event Player) == True;
	}

	actions
	{
		Set Status(Event Player, Event Player, Burning, 0.600);
		Damage(Event Player, Event Player, 16);
		Wait(0.600, Ignore Condition);
		Loop If Condition Is True;
	}
}

rule("LUCIO: off the wall --- ramp up")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Hero Of(Event Player) == Hero(Lúcio);
		Or(Is In Air(Event Player), Is On Wall(Event Player)) == True;
	}

	actions
	{
		Modify Player Variable(Event Player, LucioOffTheWallCounter, Add, 10);
		Set Damage Dealt(Event Player, Add(100, Player Variable(Event Player, LucioOffTheWallCounter)));
		Wait(0.500, Ignore Condition);
		Loop If Condition Is True;
	}
}

rule("LUCIO: off the wall --- VisualFX spawn")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Hero Of(Event Player) == Hero(Lúcio);
		Or(Is In Air(Event Player), Is On Wall(Event Player)) == True;
		Player Variable(Event Player, LucioOffTheWallCounter) >= 80;
	}

	actions
	{
		Create Effect(All Players(All Teams), Bad Aura, Green, Event Player, Divide(Player Variable(Event Player, LucioOffTheWallCounter),
			150), Visible To Position and Radius);
		Set Player Variable(Event Player, LucioOffTheWall_VisualFX, Last Created Entity);
		Create Effect(All Players(All Teams), Energy Sound, Green, Event Player, Multiply(Player Variable(Event Player,
			LucioOffTheWallCounter), 1.300), Visible To Position and Radius);
		Set Player Variable(Event Player, LucioOffTheWall_SoundFX, Last Created Entity);
	}
}

rule("LUCIO: off the wall --- reset")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Is On Ground(Event Player) == True;
		Player Variable(Event Player, LucioOffTheWallCounter) > 1;
	}

	actions
	{
		Set Player Variable(Event Player, LucioOffTheWallCounter, 0);
		Destroy Effect(Player Variable(Event Player, LucioOffTheWall_VisualFX));
		Destroy Effect(Player Variable(Event Player, LucioOffTheWall_SoundFX));
		Set Damage Dealt(Event Player, 100);
	}
}

rule("BRIGITTE: explaination")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Hero Of(Event Player) == Hero(Brigitte);
	}

	actions
	{
		Wait(0.200, Abort When False);
		Small Message(Event Player, Custom String("Your [E]Health pack is now [E](Brute)Force pull.", Null, Null, Null));
		Wait(3, Abort When False);
		Small Message(Event Player, Custom String("Brigitte is no jedi, so it won't be a controlled one.", Null, Null, Null));
	}
}

rule("BRIGITTE: force pull")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Hero Of(Event Player) == Hero(Brigitte);
		Is Button Held(Event Player, Ability 2) == True;
		Player Variable(Event Player, Ability2CD) <= 0;
		Has Status(Event Player, Hacked) == False;
		Has Status(Event Player, Knocked Down) == False;
		Has Status(Event Player, Asleep) == False;
		Has Status(Event Player, Frozen) == False;
		Has Status(Event Player, Stunned) == False;
	}

	actions
	{
		Set Player Variable(Event Player, CustomAbility_Brig2_Targeting, Filtered Array(Players in View Angle(Event Player, All Teams, 45),
			Is In Line of Sight(Eye Position(Event Player), Current Array Element, Barriers Do Not Block LOS)));
		Set Player Variable(Event Player, Ability2CD, 10);
		Damage(Player Variable(Event Player, CustomAbility_Brig2_Targeting), Event Player, 10);
		Set Player Variable(Player Variable(Event Player, CustomAbility_Brig2_Targeting), Brigthing, Event Player);
		Apply Impulse(Player Variable(Event Player, CustomAbility_Brig2_Targeting), Vector(0, 1, 0), 4, To World, Cancel Contrary Motion);
		Wait(0.100, Ignore Condition);
		Apply Impulse(Player Variable(Event Player, CustomAbility_Brig2_Targeting), World Vector Of(Vector(0, 1, -2.000), Event Player,
			Rotation), Multiply(Distance Between(Event Player, Player Variable(Event Player, CustomAbility_Brig2_Targeting)), 1.500),
			To World, Cancel Contrary Motion);
	}
}

rule("BRIGITTE: force pull --- reverse VisualFX")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Player Variable(Event Player, Brigthing) != Null;
	}

	actions
	{
		Wait(0.100, Ignore Condition);
		Create Beam Effect(All Players(All Teams), Grapple Beam, Player Variable(Event Player, Brigthing), Event Player, Orange,
			Visible To Position and Radius);
		Set Player Variable(Event Player, CustomAbility_Brig2_VisualFX, Last Created Entity);
		Wait(1, Ignore Condition);
		Destroy Effect(Player Variable(Event Player, CustomAbility_Brig2_VisualFX));
		Set Player Variable(Event Player, Brigthing, Null);
	}
}

rule("BASTION: explaination")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Hero Of(Event Player) == Hero(Bastion);
	}

	actions
	{
		Wait(0.200, Abort When False);
		Small Message(Event Player, Custom String("Using your turret mode will let everyone know", Null, Null, Null));
		Wait(3, Abort When False);
		Small Message(Event Player, Custom String("how trash you are, revealing your position.", Null, Null, Null));
	}
}

rule("BASTION: be trash")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Hero Of(Event Player) == Hero(Bastion);
		Is Using Ability 1(Event Player) == True;
	}

	actions
	{
		Skip If(Compare(Player Variable(Event Player, BastionIsTrash), !=, Null), 2);
		Create Icon(All Players(All Teams), Add(Eye Position(Event Player), World Vector Of(Vector(0, 0, 0.200), Event Player, Rotation)),
			Trashcan, Visible To and Position, Red, False);
		Set Player Variable(Event Player, BastionIsTrash, Last Created Entity);
		Set Player Variable(Event Player, BastionIsTrashPos, Position Of(Event Player));
		Wait(2, Restart When True);
		Loop If(Compare(Distance Between(Player Variable(Event Player, BastionIsTrashPos), Position Of(Event Player)), <=, 3));
		Destroy Icon(Player Variable(Event Player, BastionIsTrash));
		Set Player Variable(Event Player, BastionIsTrash, Null);
	}
}

rule("TORBJORN: explaination")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Hero Of(Event Player) == Hero(Torbjörn);
	}

	actions
	{
		Wait(0.200, Abort When False);
		Small Message(Event Player, Custom String("Turret halves your health and has a 180s CD", Null, Null, Null));
		Wait(3, Abort When False);
		Small Message(Event Player, Custom String("so use it wisely!", Null, Null, Null));
	}
}

rule("TORBJORN: self damage on turret spawn and you only get 1 turret every 180s")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Hero Of(Event Player) == Hero(Torbjörn);
		Is Button Held(Event Player, Ability 1) == True;
		Player Variable(Event Player, Ability1CD) <= 0;
		Has Status(Event Player, Hacked) == False;
		Has Status(Event Player, Knocked Down) == False;
		Has Status(Event Player, Asleep) == False;
		Has Status(Event Player, Frozen) == False;
		Has Status(Event Player, Stunned) == False;
	}

	actions
	{
		Damage(Event Player, Event Player, Divide(Health(Event Player), 2));
		Set Player Variable(Event Player, Ability1CD, 180);
	}
}

Changelog

17 days ago 1.0.2-alpha

Fixed catch-up mechanic, again...

W51SS
click to copy
17 days ago 1.0.1-alpha

Fixed catch-up mechanic giving the wrong hero. Fixed spamtiste not working. Probably introduced even more new bugs. Added feedback link.

F6ZBN
click to copy
18 days ago 1.0.0-alpha

This revision contains no notes

TPTR3
click to copy