🆕 Explanation for all of the new 1.48 PTR Workshop features!

Upon pressing the “Share Code” button, you’ll be prompted to either “Create A New Code” or “Upload To Existing Code.” If you choose the latter, then you’ll have to enter your existing share code into a text box before pressing Continue, which will update the existing share code with new custom game settings. According to the original post, this will only work if you originally owned the mode.

In the Skirmish settings, you can now choose if any control point area can be chosen to be played on, or only specifically the First, Second, or Third control point area.

Strings can be stored in variables without giving an error.

You can now set the reevaluation parameter to any of the following:

  • Visible To and Sort Order
  • Visible To
  • Sort Order
  • None

Triggers when a player takes knockback from another player. Attacker will be set to the player who dealt the knockback, Victim will be set to the player who took the knockback. Apply Impulse does not trigger this event.

New syntax for Workshop code. Examples:

Before 1.48

actions
{
	Set Global Variable(A, 88);
	Modify Global Variable(B, Add, 1);
	Set Global Variable At Index(C, 4, 2);
	Set Global Variable(D, Divide(Add(5, 10), 3);
	Set Global Variable(E, Or(True, False))
}

After 1.48

actions
{
	Global.A = 88;
	Global.B += 1;
	Global.C[4] = 2;
	Global.D = (5 + 10) / 3;
	Global.E = True || False;
}

Prettier, isn’t it? These are only a few examples of the improved C-style Workshop code.

If any extra {0}, {1}, or {2} parameters for String/Custom String are Null, then they will not appear in the Workshop code. Example:

Before 1.48

actions
{
	Small Message(All Players(All Teams), Custom String("Lorem ipsum {0}", Is Game In Progress, Null, Null));
}

After 1.48

actions
{
	Small Message(All Players(All Teams), Custom String("Lorem ipsum {0}", Is Game In Progress));
}

A lovely poem of syntax coloring:

  • Actions and operator symbols are yellow
  • Values are blue
  • Variables and numbers are white
  • Strings are dark blue

You can use booleans where numbers are expected, and vice versa.

Not really sure exactly how the Workshop handles using math on booleans or using numbers in And/Or operations, but maybe it’ll be useful.

A ton of new communication types were added to values such as Is Communicating and the action Communicate. These new communication types come from the new “Improved Communications Wheel” feature.

Now we can easily trigger lots of different rules by using Is Communicating with all the new communication options!

Breaks out of the current For/While loop, and jumps to the action after the loop’s End action.

Jumps back to the beginning of the current For/While loop.

Lets you enable/disable crouching for one or more players.

Does not affect crouch abilities like Hammond’s Piledriver.

Lets you enable/disable quick melee for one or more players.

Does not affect Reinhardt’s Rocket Hammer. Also, it make Brigitte go crazy for some reason if you disable it.

Lets you enable/disable jumping for one or more players.

Does not affect jump abilities like Hanzo’s Lunge, or jump passives like Hanzo/Genji’s Wall Climb, Genji’s Double Jump (requires you to leave the ground first), Mercy/Echo’s Glide, or Pharah’s Hover Jets.

Declares a draw for a single round. Only works in Elimination.

Allows you to set the cooldown of any ability for one or more players! Syntax:

  • Player - The player who will have their ability’s cooldown set.
  • Button - The button that is bound to the ability that will have its cooldown set. Accepts any values that can output a button constant.
  • Cooldown - The amount of seconds that you would like to set the ability’s cooldown to.

You can set the cooldown even higher than the normal cooldown of the ability, up to 1,000 seconds! Setting the cooldown to zero or a negative number will instantly make the ability ready for use again.

Instantly cancels any kind of ability/fire that the player is currently using, kind of like an animation cancel. Similar to using a very short stun on a player, except it does not stun them at all. There are so many things that this action can affect, that I wouldn’t be able to list them all. Here are some interesting effects, though:

  • Reloading will be canceled
  • Doomfist’s grounded Seismic Slam turns into a tiny hop
  • Roadhog’s Chain Hook gets instantly pulled back
  • McCree doesn’t move at all during Combat Roll, but he still reloads
  • Hanzo’s bow pull gets canceled
  • Ashe, Widowmaker, and Ana are pulled out of their scope
  • Burst fire weapons will usually shoot less bullets
  • Bastion’s Reconfigure will get canceled
  • If you use this action while Reinhardt is pulling out his shield, you get something hilarious

Is True if the player is currently using their quick melee, False/Null otherwise. Is still False/Null even if Reinhardt’s Rocket Hammer or Brigitte’s Rocket Flail is being used.

Is True if the player was last propelled into the air by their jump.

Will become False if the player lands onto a surface, or uses a propulsion ability/passive in the air such as Genji’s double jump, Hanzo’s Lunge, the Shimada Wall Climb, Echo’s Flight, Pharah’s Jump Jets and Hover Jets, and much much more!

Baptiste’s Exo Boots jump still counts as a jump, and will make this value be True. Mercy/Echo’s Glide will not set this value to False.

The direction pointing from the attacker/healer player/projectile towards the victim/healee player from the event of the current rule.

This works with the following events:

  • Player Dealt Damage
  • Player Took Damage
  • Player Dealt Healing
  • Player Received Healing
  • Player Dealt Knockback
  • Player Received Knockback

Good for Smash Bros. type modes!

A brand new constant that contains all of the buttons that affect normal gameplay in Overwatch.

It contains:

  • Primary Fire
  • Secondary Fire
  • Ability 1
  • Ability 2
  • Ultimate
  • Interact
  • Jump
  • Crouch
  • Melee
  • Reload

The ability that caused the event of the current rule to trigger. Returns the Button that is associated with the ability.

This works with the following events:

  • Player Earned Elimination
  • Player Dealt Final Blow
  • Player Dealt Damage
  • Player Took Damage
  • Player Died
  • Player Dealt Healing
  • Player Received Healing
  • Player Dealt Knockback
  • Player Received Knockback

Very useful value.

The ability cooldown time (in seconds) of the specified ability (that is associated with the button in the Button parameter).

You can use this to display any ability icon from any hero in a string!

It also works with the Primary Fire of heroes by showing an icon of their primary weapon.

The desired hero is chosen in the Hero parameter, and the desired ability of that hero is chosen by the Button parameter (choose the button which is associated with your desired ability).

You can easily build an array of values with this value!

Example:

actions
{
	Global.A = Array(55, 92, Hero(Echo), Custom String("Strings in variables!"), True, Button(Reload));
}

This easily creates an array with the following elements:

[0] = 55
[1] = 92
[2] = Echo
[3] = "Strings in variables!"
[4] = True
[5] = Reload

Allows you to return a certain value if a condition is true, and a different value if it is not true.

Example:

actions
{
	Event Player.A = Is Alive(Event Player) ? All Players(All Teams) : Empty Array;
}

This will set player variable A to All Players(All Teams) if the Event Player is alive, but will set player variable A to Empty Array is the Event Player is not alive.


And there you have it! I hope that this post will be informative to those of you who are wondering about the new Workshop content in the 1.48 PTR.

15 Likes

Thanks for making this list, these new values such as knockback, arrays, event ability, event direction, and set cooldown will be so incredibly useful. I’m excited to see what people will come up with!

2 Likes

True => 1 and false => 0. You can use them like this in some value boxes already.

3 Likes

Weird thing is, I tried something like 15 || 8 and I think it returned Null? I thought that it would at least consider at least one of them to be truthy enough to return True.

Yeah a Boolean can be type casted to an integer and vice versa with a value of >= 1 == TRUE, mean if the value is 1 or any value is greater than 1 it returns as TRUE, with a value <=0 == FALSE, means if the value is 0 or any value is lesser than 0 it returns FALSE. From programming backgrounds there are also AND/OR or XOR operators evaluated on integer number types, but they are meant to be used on a bitwise behaviour, bitwise operators like AND(just an &), OR(just |), XOR(with ^), left shift (<<), right shift(>>) and negation (the conditional counterpart of !A is ~A) are not supported yet. So i assume they do internal casting. Additional note for people who are familiar with C/C++): The if-then-else value is the equivalent to the Trenary Conditional Expression or Operator (symbolized in short as ?: or as expression A = B ? C : D).

3 Likes

I knew already :3

What I was talking about: In workshop, booleans don’t exist afaik. Internally they get always represented by 0 and 1.

Thanks for checking all these out and testing them. I got a lot of work ahead of me. If only I was getting paid lol.

Big thank you for all this. Was really easy to understand.

Thanks for this great list of explanations! ^^

I just realized how amazing the new array value is. Such a huge QoL improvement (one of many in this update) ^^

2 Likes