Skip to content

Instantly share code, notes, and snippets.

@dreness
Last active February 28, 2020 21:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dreness/9f4c4939f2038478b4ee97796e85c0e5 to your computer and use it in GitHub Desktop.
Save dreness/9f4c4939f2038478b4ee97796e85c0e5 to your computer and use it in GitHub Desktop.
#overwatch workshop code: trails occasionally buggy
#!define maxEffects N
#!define spawnEffects A
#!define effectDelay D
#!define effectScale S
#!define lastPosition Q
#!define editMode M
#!define editMutex J
#!define trails E
@Rule "fast setup"
@Event global
if isInSetup():
setMatchTime(5)
@Rule "init"
@Event eachPlayer
if eventPlayer.hasSpawned():
eventPlayer.spawnEffects = true
eventPlayer.maxEffects = 15
eventPlayer.effectDelay = 0.20
eventPlayer.effectScale = 30.00
eventPlayer.lastPosition = eventPlayer.getPosition()
eventPlayer.editMode = 0
eventPlayer.editMutex = 0
@Rule "init hud: speed, (x,y,z), Trails enabled, max effects, throttle"
@Event eachPlayer
if eventPlayer.hasSpawned():
hudSubtext(eventPlayer, eventPlayer.getVelocity(), Position.LEFT, 0, Color.WHITE, HudReeval.VISIBILITY_AND_STRING)
hudSubtext(eventPlayer, "Time: {}".format(eventPlayer.effectDelay), Position.LEFT, 1, Color.WHITE, HudReeval.VISIBILITY_AND_STRING)
hudSubtext(eventPlayer, "Height: {}".format(eventPlayer.effectScale), Position.LEFT, 2, Color.WHITE, HudReeval.VISIBILITY_AND_STRING)
hudSubtext(eventPlayer, "Max: {}".format(eventPlayer.maxEffects), Position.LEFT, 3, Color.WHITE, HudReeval.VISIBILITY_AND_STRING)
hudSubtext(eventPlayer, "Started: {}: Selected: {}".format(eventPlayer.editMutex, eventPlayer.editMode), Position.LEFT, 4, Color.WHITE, HudReeval.VISIBILITY_AND_STRING)
@Rule "trails"
@Event eachPlayer
if eventPlayer.isAlive() and eventPlayer.getSpeed() > 2 and eventPlayer.A == 1:
do:
eventPlayer.P = eventPlayer.getPosition()
eventPlayer.F.append(eventPlayer.getSpeed() / eventPlayer.S)
createEffect(getAllPlayers(), Effect.SPHERE, Color.AQUA, eventPlayer.P, eventPlayer.F[-1], Invis.NONE)
eventPlayer.E.append(getLastCreatedEntity())
wait(eventPlayer.D)
while RULE_CONDITION
@Rule "clear trails"
@Event eachPlayer
if eventPlayer.A == 1:
do:
if len(eventPlayer.E) <= eventPlayer.N:
goto lbl_0
destroyEffect(eventPlayer.E[0])
del eventPlayer.E[0]
del eventPlayer.F[0]
lbl_0:
wait(eventPlayer.D)
while RULE_CONDITION
@Rule "toggle trails"
@Event eachPlayer
if eventPlayer.isCommunicating(Comms.HELLO):
if not eventPlayer.A:
goto lbl_0
eventPlayer.A = false
return
lbl_0:
eventPlayer.A = true
@Rule "respawn"
@Event eachPlayer
if eventPlayer.isCommunicating(Comms.VOICE_LINE_UP) and not eventPlayer.isInSpawnRoom():
eventPlayer.respawn()
@Rule "TP to nearest ally"
@Event eachPlayer
@Team 1
if eventPlayer.isCommunicating(Comms.VOICE_LINE_LEFT):
eventPlayer.teleport(eventPlayer.getPlayerClosestToReticle(Color.TEAM_1))
@Rule "clear all effects"
@Event eachPlayer
if eventPlayer.isHoldingButton(Button.PRIMARY_FIRE) and eventPlayer.isHoldingButton(Button.SECONDARY_FIRE):
destroyAllEffects()
eventPlayer.trails = []
eventPlayer.F = []
@Rule "Adjust delay"
@Event eachPlayer
if eventPlayer.editMode == 1 and eventPlayer.editMutex != 0:
do:
eventPlayer.effectDelay = abs(eventPlayer.getVerticalFacingAngle() / 10)
wait(0.1)
while RULE_CONDITION
@Rule "Adjust scale"
@Event eachPlayer
if eventPlayer.editMode == 2 and eventPlayer.editMutex != 0:
do:
eventPlayer.effectScale = abs(eventPlayer.getVerticalFacingAngle() / 2)
wait(0.1)
while RULE_CONDITION
@Rule "Adjust effect count"
@Event eachPlayer
if eventPlayer.editMode == 3 and eventPlayer.editMutex != 0:
do:
eventPlayer.maxEffects = ceil(abs(eventPlayer.getVerticalFacingAngle() * 2))
wait(0.1)
while RULE_CONDITION
@Rule "toggle edit mode"
@Event eachPlayer
if eventPlayer.isHoldingButton(Button.INTERACT) and eventPlayer.isHoldingButton(Button.CROUCH):
if eventPlayer.editMutex != 0:
goto lbl_0
eventPlayer.editMutex = 1
return
lbl_0:
eventPlayer.editMutex = 0
eventPlayer.editMode = 0
@Rule "select edit mode"
@Event eachPlayer
if eventPlayer.editMutex != 0:
if eventPlayer.getThrottle().x > 0:
eventPlayer.editMode = 1
return
if eventPlayer.getThrottle().x < 0:
eventPlayer.editMode = 2
return
if eventPlayer.getThrottle().z > 0:
eventPlayer.editMode = 3
return
# if eventPlayer.getThrottle().z < 0:
# eventPlayer.editMode = 4
# return
"""@Rule "chase"
@Event eachPlayer
if eventPlayer.A:
eventPlayer.Q = eventPlayer.getPosition()
chase(eventPlayer.Q, eventPlayer.getEyePosition(), rate=distance(eventPlayer, eventPlayer.Q) / 4, ChaseReeval.DESTINATION_AND_RATE)
chase(eventPlayer.V, distance(eventPlayer.getPosition(), eventPlayer.Q), rate=distance(eventPlayer.getPosition(), eventPlayer.Q), ChaseReeval.DESTINATION_AND_RATE)
createEffect(eventPlayer, Effect.SPHERE, Color.PURPLE, eventPlayer.Q, 1, EffectReeval.VISIBILITY_POSITION_AND_RADIUS)
eventPlayer.X = getLastCreatedEntity()
"""
@dreness
Copy link
Author

dreness commented May 25, 2019

looks-like-a-googly-eye-hamburger

@dreness
Copy link
Author

dreness commented Feb 20, 2020

Compiled to native Workshop code:

variables {
	global:
		0: _unused_var_0
		1: _unused_var_1
		2: _unused_var_2
		3: _unused_var_3
		4: _unused_var_4
		5: _unused_var_5
		6: _unused_var_6
		7: _unused_var_7
		8: _unused_var_8
		9: _unused_var_9
		10: _unused_var_10
		11: _unused_var_11
		12: _unused_var_12
		13: _unused_var_13
		14: _unused_var_14
		15: _unused_var_15
		16: _unused_var_16
		17: _unused_var_17
		18: _unused_var_18
		19: _unused_var_19
		20: _unused_var_20
		21: _unused_var_21
		22: _unused_var_22
		23: _unused_var_23
		24: _unused_var_24
		25: _unused_var_25
		26: _unused_var_26
		27: _unused_var_27
		28: _unused_var_28
		29: _unused_var_29
		30: _unused_var_30
		31: _unused_var_31
		32: _unused_var_32
		33: _unused_var_33
		34: _unused_var_34
		35: _unused_var_35
		36: _unused_var_36
		37: _unused_var_37
		38: _unused_var_38
		39: _unused_var_39
		40: _unused_var_40
		41: _unused_var_41
		42: _unused_var_42
		43: _unused_var_43
		44: _unused_var_44
		45: _unused_var_45
		46: _unused_var_46
		47: _unused_var_47
		48: _unused_var_48
		49: _unused_var_49
		50: _unused_var_50
		51: _unused_var_51
		52: _unused_var_52
		53: _unused_var_53
		54: _unused_var_54
		55: _unused_var_55
		56: _unused_var_56
		57: _unused_var_57
		58: _unused_var_58
		59: _unused_var_59
		60: _unused_var_60
		61: _unused_var_61
		62: _unused_var_62
		63: _unused_var_63
		64: _unused_var_64
		65: _unused_var_65
		66: _unused_var_66
		67: _unused_var_67
		68: _unused_var_68
		69: _unused_var_69
		70: _unused_var_70
		71: _unused_var_71
		72: _unused_var_72
		73: _unused_var_73
		74: _unused_var_74
		75: _unused_var_75
		76: _unused_var_76
		77: _unused_var_77
		78: _unused_var_78
		79: _unused_var_79
		80: _unused_var_80
		81: _unused_var_81
		82: _unused_var_82
		83: _unused_var_83
		84: _unused_var_84
		85: _unused_var_85
		86: _unused_var_86
		87: _unused_var_87
		88: _unused_var_88
		89: _unused_var_89
		90: _unused_var_90
		91: _unused_var_91
		92: _unused_var_92
		93: _unused_var_93
		94: _unused_var_94
		95: _unused_var_95
		96: _unused_var_96
		97: _unused_var_97
		98: _unused_var_98
		99: _unused_var_99
		100: _unused_var_100
		101: _unused_var_101
		102: _unused_var_102
		103: _unused_var_103
		104: _unused_var_104
		105: _unused_var_105
		106: _unused_var_106
		107: _unused_var_107
		108: _unused_var_108
		109: _unused_var_109
		110: _unused_var_110
		111: _unused_var_111
		112: _unused_var_112
		113: _unused_var_113
		114: _unused_var_114
		115: _unused_var_115
		116: _unused_var_116
		117: _unused_var_117
		118: _unused_var_118
		119: _unused_var_119
		120: _unused_var_120
		121: _unused_var_121
		122: _unused_var_122
		123: _unused_var_123
		124: _unused_var_124
		125: _unused_var_125
		126: _unused_var_126
		127: _unused_var_127
	player:
		0: A
		1: _unused_var_1
		2: _unused_var_2
		3: D
		4: E
		5: F
		6: _unused_var_6
		7: _unused_var_7
		8: _unused_var_8
		9: J
		10: _unused_var_10
		11: _unused_var_11
		12: M
		13: N
		14: _unused_var_14
		15: P
		16: Q
		17: _unused_var_17
		18: S
		19: _unused_var_19
		20: _unused_var_20
		21: _unused_var_21
		22: _unused_var_22
		23: _unused_var_23
		24: _unused_var_24
		25: _unused_var_25
		26: _unused_var_26
		27: _unused_var_27
		28: _unused_var_28
		29: _unused_var_29
		30: _unused_var_30
		31: _unused_var_31
		32: _unused_var_32
		33: _unused_var_33
		34: _unused_var_34
		35: _unused_var_35
		36: _unused_var_36
		37: _unused_var_37
		38: _unused_var_38
		39: _unused_var_39
		40: _unused_var_40
		41: _unused_var_41
		42: _unused_var_42
		43: _unused_var_43
		44: _unused_var_44
		45: _unused_var_45
		46: _unused_var_46
		47: _unused_var_47
		48: _unused_var_48
		49: _unused_var_49
		50: _unused_var_50
		51: _unused_var_51
		52: _unused_var_52
		53: _unused_var_53
		54: _unused_var_54
		55: _unused_var_55
		56: _unused_var_56
		57: _unused_var_57
		58: _unused_var_58
		59: _unused_var_59
		60: _unused_var_60
		61: _unused_var_61
		62: _unused_var_62
		63: _unused_var_63
		64: _unused_var_64
		65: _unused_var_65
		66: _unused_var_66
		67: _unused_var_67
		68: _unused_var_68
		69: _unused_var_69
		70: _unused_var_70
		71: _unused_var_71
		72: _unused_var_72
		73: _unused_var_73
		74: _unused_var_74
		75: _unused_var_75
		76: _unused_var_76
		77: _unused_var_77
		78: _unused_var_78
		79: _unused_var_79
		80: _unused_var_80
		81: _unused_var_81
		82: _unused_var_82
		83: _unused_var_83
		84: _unused_var_84
		85: _unused_var_85
		86: _unused_var_86
		87: _unused_var_87
		88: _unused_var_88
		89: _unused_var_89
		90: _unused_var_90
		91: _unused_var_91
		92: _unused_var_92
		93: _unused_var_93
		94: _unused_var_94
		95: _unused_var_95
		96: _unused_var_96
		97: _unused_var_97
		98: _unused_var_98
		99: _unused_var_99
		100: _unused_var_100
		101: _unused_var_101
		102: _unused_var_102
		103: _unused_var_103
		104: _unused_var_104
		105: _unused_var_105
		106: _unused_var_106
		107: _unused_var_107
		108: _unused_var_108
		109: _unused_var_109
		110: _unused_var_110
		111: _unused_var_111
		112: _unused_var_112
		113: _unused_var_113
		114: _unused_var_114
		115: _unused_var_115
		116: _unused_var_116
		117: _unused_var_117
		118: _unused_var_118
		119: _unused_var_119
		120: _unused_var_120
		121: _unused_var_121
		122: _unused_var_122
		123: _unused_var_123
		124: _unused_var_124
		125: _unused_var_125
		126: _unused_var_126
		127: _unused_var_127
}
subroutines {
	0: _unused_sub_0
	1: _unused_sub_1
	2: _unused_sub_2
	3: _unused_sub_3
	4: _unused_sub_4
	5: _unused_sub_5
	6: _unused_sub_6
	7: _unused_sub_7
	8: _unused_sub_8
	9: _unused_sub_9
	10: _unused_sub_10
	11: _unused_sub_11
	12: _unused_sub_12
	13: _unused_sub_13
	14: _unused_sub_14
	15: _unused_sub_15
	16: _unused_sub_16
	17: _unused_sub_17
	18: _unused_sub_18
	19: _unused_sub_19
	20: _unused_sub_20
	21: _unused_sub_21
	22: _unused_sub_22
	23: _unused_sub_23
	24: _unused_sub_24
	25: _unused_sub_25
	26: _unused_sub_26
	27: _unused_sub_27
	28: _unused_sub_28
	29: _unused_sub_29
	30: _unused_sub_30
	31: _unused_sub_31
	32: _unused_sub_32
	33: _unused_sub_33
	34: _unused_sub_34
	35: _unused_sub_35
	36: _unused_sub_36
	37: _unused_sub_37
	38: _unused_sub_38
	39: _unused_sub_39
	40: _unused_sub_40
	41: _unused_sub_41
	42: _unused_sub_42
	43: _unused_sub_43
	44: _unused_sub_44
	45: _unused_sub_45
	46: _unused_sub_46
	47: _unused_sub_47
	48: _unused_sub_48
	49: _unused_sub_49
	50: _unused_sub_50
	51: _unused_sub_51
	52: _unused_sub_52
	53: _unused_sub_53
	54: _unused_sub_54
	55: _unused_sub_55
	56: _unused_sub_56
	57: _unused_sub_57
	58: _unused_sub_58
	59: _unused_sub_59
	60: _unused_sub_60
	61: _unused_sub_61
	62: _unused_sub_62
	63: _unused_sub_63
	64: _unused_sub_64
	65: _unused_sub_65
	66: _unused_sub_66
	67: _unused_sub_67
	68: _unused_sub_68
	69: _unused_sub_69
	70: _unused_sub_70
	71: _unused_sub_71
	72: _unused_sub_72
	73: _unused_sub_73
	74: _unused_sub_74
	75: _unused_sub_75
	76: _unused_sub_76
	77: _unused_sub_77
	78: _unused_sub_78
	79: _unused_sub_79
	80: _unused_sub_80
	81: _unused_sub_81
	82: _unused_sub_82
	83: _unused_sub_83
	84: _unused_sub_84
	85: _unused_sub_85
	86: _unused_sub_86
	87: _unused_sub_87
	88: _unused_sub_88
	89: _unused_sub_89
	90: _unused_sub_90
	91: _unused_sub_91
	92: _unused_sub_92
	93: _unused_sub_93
	94: _unused_sub_94
	95: _unused_sub_95
	96: _unused_sub_96
	97: _unused_sub_97
	98: _unused_sub_98
	99: _unused_sub_99
	100: _unused_sub_100
	101: _unused_sub_101
	102: _unused_sub_102
	103: _unused_sub_103
	104: _unused_sub_104
	105: _unused_sub_105
	106: _unused_sub_106
	107: _unused_sub_107
	108: _unused_sub_108
	109: _unused_sub_109
	110: _unused_sub_110
	111: _unused_sub_111
	112: _unused_sub_112
	113: _unused_sub_113
	114: _unused_sub_114
	115: _unused_sub_115
	116: _unused_sub_116
	117: _unused_sub_117
	118: _unused_sub_118
	119: _unused_sub_119
	120: _unused_sub_120
	121: _unused_sub_121
	122: _unused_sub_122
	123: _unused_sub_123
	124: _unused_sub_124
	125: _unused_sub_125
	126: _unused_sub_126
	127: _unused_sub_127
}
rule ("fast setup") {
    event {
        Ongoing - Global;
    }

    conditions {
        Is In Setup == True;
    }

    actions {
        Set Match Time(5);
    }
}

rule ("init") {
    event {
        Ongoing - Each Player;
        All;
        All;
    }

    conditions {
        Has Spawned(Event Player) == True;
    }

    actions {
        Set Player Variable(Event Player, A, True);
        Set Player Variable(Event Player, N, 15);
        Set Player Variable(Event Player, D, 0.20);
        Set Player Variable(Event Player, S, 30.00);
        Set Player Variable(Event Player, Q, Position Of(Event Player));
        Set Player Variable(Event Player, M, 0);
        Set Player Variable(Event Player, J, 0);
    }
}

rule ("init hud: speed, (x,y,z), Trails enabled, max effects, throttle") {
    event {
        Ongoing - Each Player;
        All;
        All;
    }

    conditions {
        Has Spawned(Event Player) == True;
    }

    actions {
        Create HUD Text(Event Player, Null, Null, Velocity Of(Event Player), Left, 0, White, White, White, Visible To and String, Default Visibility);
        Create HUD Text(Event Player, Null, Null, Custom String("Time: {0}", Player Variable(Event Player, D), Null, Null), Left, 1, White, White, White, Visible To and String, Default Visibility);
        Create HUD Text(Event Player, Null, Null, Custom String("Height: {0}", Player Variable(Event Player, S), Null, Null), Left, 2, White, White, White, Visible To and String, Default Visibility);
        Create HUD Text(Event Player, Null, Null, Custom String("Max: {0}", Player Variable(Event Player, N), Null, Null), Left, 3, White, White, White, Visible To and String, Default Visibility);
        Create HUD Text(Event Player, Null, Null, Custom String("Started: {0}: Selected: {1}", Player Variable(Event Player, J), Player Variable(Event Player, M), Null), Left, 4, White, White, White, Visible To and String, Default Visibility);
    }
}

rule ("trails") {
    event {
        Ongoing - Each Player;
        All;
        All;
    }

    conditions {
        Is Alive(Event Player) == True;
        Speed Of(Event Player) > 2;
        Player Variable(Event Player, A) == 1;
    }

    actions {
        Set Player Variable(Event Player, P, Position Of(Event Player));
        Modify Player Variable(Event Player, F, Append To Array, Divide(Speed Of(Event Player), Player Variable(Event Player, S)));
        Create Effect(All Players(All Teams), Sphere, Aqua, Player Variable(Event Player, P), Last Of(Player Variable(Event Player, F)), None);
        Modify Player Variable(Event Player, E, Append To Array, Last Created Entity);
        Wait(Player Variable(Event Player, D), Ignore Condition);
        Loop If Condition Is True;
    }
}

rule ("clear trails") {
    event {
        Ongoing - Each Player;
        All;
        All;
    }

    conditions {
        Player Variable(Event Player, A) == 1;
    }

    actions {
        Skip If(Compare(Count Of(Player Variable(Event Player, E)), <=, Player Variable(Event Player, N)), 3);
        Destroy Effect(First Of(Player Variable(Event Player, E)));
        Modify Player Variable(Event Player, E, Remove From Array By Index, 0);
        Modify Player Variable(Event Player, F, Remove From Array By Index, 0);
        Wait(Player Variable(Event Player, D), Ignore Condition);
        Loop If Condition Is True;
    }
}

rule ("toggle trails") {
    event {
        Ongoing - Each Player;
        All;
        All;
    }

    conditions {
        Is Communicating(Event Player, Hello) == True;
    }

    actions {
        Skip If(Not(Player Variable(Event Player, A)), 2);
        Set Player Variable(Event Player, A, False);
        Abort;
        Set Player Variable(Event Player, A, True);
    }
}

rule ("respawn") {
    event {
        Ongoing - Each Player;
        All;
        All;
    }

    conditions {
        Is Communicating(Event Player, Voice Line Up) == True;
        Is In Spawn Room(Event Player) == False;
    }

    actions {
        Respawn(Event Player);
    }
}

rule ("TP to nearest ally") {
    event {
        Ongoing - Each Player;
        Team 1;
        All;
    }

    conditions {
        Is Communicating(Event Player, Voice Line Left) == True;
    }

    actions {
        Teleport(Event Player, Player Closest To Reticle(Event Player, Team 1));
    }
}

rule ("clear all effects") {
    event {
        Ongoing - Each Player;
        All;
        All;
    }

    conditions {
        Is Button Held(Event Player, Primary Fire) == True;
        Is Button Held(Event Player, Secondary Fire) == True;
    }

    actions {
        Destroy All Effects;
        Set Player Variable(Event Player, E, Empty Array);
        Set Player Variable(Event Player, F, Empty Array);
    }
}

rule ("Adjust delay") {
    event {
        Ongoing - Each Player;
        All;
        All;
    }

    conditions {
        Player Variable(Event Player, M) == 1;
        Player Variable(Event Player, J) != 0;
    }

    actions {
        Set Player Variable(Event Player, D, Absolute Value(Divide(Vertical Facing Angle Of(Event Player), 10)));
        Wait(0.1, Ignore Condition);
        Loop If Condition Is True;
    }
}

rule ("Adjust scale") {
    event {
        Ongoing - Each Player;
        All;
        All;
    }

    conditions {
        Player Variable(Event Player, M) == 2;
        Player Variable(Event Player, J) != 0;
    }

    actions {
        Set Player Variable(Event Player, S, Absolute Value(Divide(Vertical Facing Angle Of(Event Player), 2)));
        Wait(0.1, Ignore Condition);
        Loop If Condition Is True;
    }
}

rule ("Adjust effect count") {
    event {
        Ongoing - Each Player;
        All;
        All;
    }

    conditions {
        Player Variable(Event Player, M) == 3;
        Player Variable(Event Player, J) != 0;
    }

    actions {
        Set Player Variable(Event Player, N, Round To Integer(Absolute Value(Multiply(Vertical Facing Angle Of(Event Player), 2)), Up));
        Wait(0.1, Ignore Condition);
        Loop If Condition Is True;
    }
}

rule ("toggle edit mode") {
    event {
        Ongoing - Each Player;
        All;
        All;
    }

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

    actions {
        Skip If(Compare(Player Variable(Event Player, J), !=, 0), 2);
        Set Player Variable(Event Player, J, 1);
        Abort;
        Set Player Variable(Event Player, J, 0);
        Set Player Variable(Event Player, M, 0);
    }
}

rule ("select edit mode") {
    event {
        Ongoing - Each Player;
        All;
        All;
    }

    conditions {
        Player Variable(Event Player, J) != 0;
    }

    actions {
        Skip If(Not(Compare(X Component Of(Throttle Of(Event Player)), >, 0)), 2);
        Set Player Variable(Event Player, M, 1);
        Abort;
        Skip If(Not(Compare(X Component Of(Throttle Of(Event Player)), <, 0)), 2);
        Set Player Variable(Event Player, M, 2);
        Abort;
        Skip If(Not(Compare(Z Component Of(Throttle Of(Event Player)), >, 0)), 2);
        Set Player Variable(Event Player, M, 3);
        Abort;
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment