Skip to content

Instantly share code, notes, and snippets.

@nathan130200
Created January 4, 2022 20:35
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 nathan130200/7f84a4f0ece636bb7b8a72b5ea56f9d8 to your computer and use it in GitHub Desktop.
Save nathan130200/7f84a4f0ece636bb7b8a72b5ea56f9d8 to your computer and use it in GitHub Desktop.
Workshop orbs prototype based on moira orb's.

Workshop Orbs

Orbs in workshop based on moira orbs.

Import Code:

Official import code: 96QBQ

Controls

Hold INTERACT (default button on PC: F) for some seconds and an orb will spawn in front of player.

Features

  • Orb can bounce
  • Orb will both apply damage and healing on teammates or enemies
  • After some seconds orb will despawn (or when orb cannot reach destination at time / too far away from valid position)
#!define vdest(pos, dir, len) (pos + (dir * len))
#!define uet(x) updateEveryTick(x)
playervar state
playervar counter
playervar effects
playervar startPos
playervar endPos
playervar alive
playervar dir
playervar step
playervar rateSpeed
playervar players
enum Colors:
ORB = rgb(9, 0, 136),
BAD_AURA = rgb(153, 0, 179)
#!define maxSteps 15
#!define maxRadius 2.5
#!define baseVelocity 12
#!define doTraceHit() raycast(eventPlayer.getEyePosition(), vdest(eventPlayer.getEyePosition(), eventPlayer.dir, 1000), null, null, true).getHitPosition()
#!define doTraceHitFromPos(x) raycast(x, vdest(x, eventPlayer.dir, 1000), null, null, true).getHitPosition()
#!define doTraceHitNormal() raycast(eventPlayer.getEyePosition(), vdest(eventPlayer.getEyePosition(), eventPlayer.dir, 1000), null, null, true).getNormal()
#!define doTraceHitNormalFromPos(x) raycast(x, vdest(x, eventPlayer.dir, 1000), null, null, true).getNormal()
enum SpawnState:
None = 0,
Spawned = 1,
Alive = 2,
Destroyed = 3
rule "Spawn":
@Event eachPlayer
@Condition eventPlayer.state == SpawnState.None
@Condition eventPlayer.isHoldingButton(Button.INTERACT)
wait(1, Wait.ABORT_WHEN_FALSE)
eventPlayer.state = SpawnState.Spawned
eventPlayer.dir = eventPlayer.getFacingDirection()
eventPlayer.startPos = eventPlayer.getEyePosition()
eventPlayer.endPos = doTraceHit()
createEffect(getAllPlayers(), Effect.ORB, Color.ROSE, uet(eventPlayer.startPos), 0, EffectReeval.VISIBILITY_POSITION_AND_RADIUS)
eventPlayer.effects[0] = getLastCreatedEntity()
createEffect(getAllPlayers(), Effect.BAD_AURA, Colors.BAD_AURA, uet(eventPlayer.startPos), 1.5, EffectReeval.VISIBILITY_POSITION_AND_RADIUS)
eventPlayer.effects[1] = getLastCreatedEntity()
createEffect(getAllPlayers(), Effect.SMOKE_SOUND, null, uet(eventPlayer.startPos), 75, EffectReeval.VISIBILITY_POSITION_AND_RADIUS)
eventPlayer.effects[2] = getLastCreatedEntity()
createIcon([p for p in [localPlayer] if eventPlayer.state == SpawnState.Alive], uet(eventPlayer.startPos), Icon.SKULL, IconReeval.VISIBILITY_AND_POSITION, Color.ROSE, true)
eventPlayer.state = SpawnState.Alive
eventPlayer.step = 0
#!define otherPlayer eventPlayer.players[eventPlayer.counter]
#!define isSameTeam(t1, t2) t1.getTeam() == t2.getTeam()
#!define hval eventPlayer.data[0]
#!define dval eventPlayer.data[1]
playervar data
rule "Tick":
@Event eachPlayer
@Condition eventPlayer.state == SpawnState.Alive
eventPlayer.players = getPlayersInRadius(eventPlayer.startPos, maxRadius + 3, Team.ALL, LosCheck.SURFACES)
if len(eventPlayer.players) > 0:
eventPlayer.rateSpeed = baseVelocity / len(eventPlayer.players)
chase(eventPlayer.startPos, eventPlayer.endPos, rate=uet(eventPlayer.rateSpeed), ChaseReeval.DESTINATION_AND_RATE)
/*for eventPlayer.counter in range(0, len(eventPlayer.players), 1):
if isSameTeam(eventPlayer, otherPlayer):
createBeam(getAllPlayers(), Beam.GOOD, eventPlayer.startPos + Vector.UP, evalOnce(otherPlayer.getPosition()), [Color.RED if eventPlayer.getTeam() != otherPlayer.getTeam() else Color.YELLOW], EffectReeval.VISIBILITY_POSITION_AND_RADIUS)
eventPlayer.beams.append(getLastCreatedEntity())
else:
createBeam(getAllPlayers(), Beam.BAD, eventPlayer.startPos + Vector.UP, evalOnce(otherPlayer.getPosition()), [Color.RED if eventPlayer.getTeam() != otherPlayer.getTeam() else Color.YELLOW], EffectReeval.VISIBILITY_POSITION_AND_RADIUS)
eventPlayer.beams.append(getLastCreatedEntity())
*/
eventPlayer.data = [
random.randint(15, 30),
random.randint(15, 30)
]
damage([p for p in eventPlayer.players if not isSameTeam(p, eventPlayer)], eventPlayer, hval)
heal([p for p in eventPlayer.players if isSameTeam(p, eventPlayer)], eventPlayer, dval)
chase(eventPlayer.alive, 9999, duration=999, ChaseReeval.DESTINATION_AND_DURATION)
for eventPlayer.counter in range(0, len(eventPlayer.players), 1):
if isSameTeam(eventPlayer, otherPlayer):
playEffect(eventPlayer, DynamicEffect.RING_EXPLOSION, Color.YELLOW, otherPlayer.getPosition(), 5)
else:
playEffect(eventPlayer, DynamicEffect.RING_EXPLOSION, Color.ORANGE, otherPlayer.getPosition(), 5)
if distance(eventPlayer.startPos, eventPlayer.endPos) <= 1:
if eventPlayer.step >= maxSteps:
eventPlayer.state = SpawnState.Destroyed
return
else:
eventPlayer.alive = 0
eventPlayer.dir = doTraceHitNormalFromPos(eventPlayer.endPos)
eventPlayer.dir += vect(random.uniform(-0.5, 0.5), random.uniform(-0.2, 0.2), random.uniform(-0.5, 0.5))
eventPlayer.endPos = doTraceHitFromPos(eventPlayer.endPos)
eventPlayer.step++
/*for eventPlayer.counter in range(0, len(eventPlayer.beams), 1):
destroyEffect(eventPlayer.beams[eventPlayer.counter])
wait()*/
wait(0.16)
if RULE_CONDITION:
goto RULE_START
rule "Destroy":
@Event eachPlayer
@Condition eventPlayer.state == SpawnState.Destroyed
for eventPlayer.counter in range(0, len(eventPlayer.effects), 1):
destroyEffect(eventPlayer.effects[eventPlayer.counter])
wait()
/*for eventPlayer.counter in range(0, len(eventPlayer.beams), 1):
destroyEffect(eventPlayer.beams[eventPlayer.counter])
wait()*/
eventPlayer.state = 0
eventPlayer.effects = null
rule "Timout":
@Event eachPlayer
@Condition eventPlayer.state == SpawnState.Alive
@Condition eventPlayer.alive > 1
wait(10, Wait.ABORT_WHEN_FALSE)
eventPlayer.state = SpawnState.Destroyed
settings
{
main
{
Description: "I'm just prototyping orb mechanism like moira's damage/heal orb using workshop custom entities. Have fun!\n\nCONTROLS:\n\nHold 'INTERACT' for some seconds while facing to an place then orb will spawn and fly to that place and bounce many times."
Mode Name: "Workshop Orbs - 96QBQ"
}
lobby
{
Map Rotation: After A Game
Max Spectators: 12
Return To Lobby: Never
Swap Teams After Match: No
Team Balancing: After A Mirror Match
}
modes
{
Skirmish
{
enabled maps
{
Dorado
}
}
}
}
variables
{
player:
0: state
1: counter
2: effects
3: startPos
4: endPos
5: alive
6: dir
7: step
8: rateSpeed
9: players
10: data
}
rule("Spawn")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.state == 0;
Is Button Held(Event Player, Button(Interact)) == True;
}
actions
{
Wait(1, Abort When False);
Event Player.state = 1;
Event Player.dir = Facing Direction Of(Event Player);
Event Player.startPos = Eye Position(Event Player);
Event Player.endPos = Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player) + Event Player.dir * 1000, Null,
Null, True);
Create Effect(All Players(All Teams), Orb, Color(Rose), Update Every Frame(Event Player.startPos), 0,
Visible To Position and Radius);
Event Player.effects[0] = Last Created Entity;
Create Effect(All Players(All Teams), Bad Aura, Custom Color(153, 0, 179, 255), Update Every Frame(Event Player.startPos), 1.500,
Visible To Position and Radius);
Event Player.effects[1] = Last Created Entity;
Create Effect(All Players(All Teams), Smoke Sound, Null, Update Every Frame(Event Player.startPos), 75,
Visible To Position and Radius);
Event Player.effects[2] = Last Created Entity;
Create Icon(Event Player.state == 2 ? Array(Local Player) : Empty Array, Update Every Frame(Event Player.startPos), Skull,
Visible To and Position, Color(Rose), True);
Event Player.state = 2;
Event Player.step = 0;
}
}
rule("Tick")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.state == 2;
}
actions
{
Event Player.players = Players Within Radius(Event Player.startPos, 5.500, All Teams, Surfaces);
If(Count Of(Event Player.players) > 0);
Event Player.rateSpeed = 12 / Count Of(Event Player.players);
End;
Chase Player Variable At Rate(Event Player, startPos, Event Player.endPos, Update Every Frame(Event Player.rateSpeed),
Destination and Rate);
Event Player.data = Array(Random Integer(15, 30), Random Integer(15, 30));
Damage(Filtered Array(Event Player.players, !(Team Of(Current Array Element) == Team Of(Event Player))), Event Player, First Of(
Event Player.data));
Heal(Filtered Array(Event Player.players, Team Of(Current Array Element) == Team Of(Event Player)), Event Player,
Event Player.data[1]);
Chase Player Variable Over Time(Event Player, alive, 9999, 999, Destination and Duration);
For Player Variable(Event Player, counter, 0, Count Of(Event Player.players), 1);
If(Team Of(Event Player) == Team Of(Event Player.players[Event Player.counter]));
Play Effect(Event Player, Ring Explosion, Color(Yellow), Position Of(Event Player.players[Event Player.counter]), 5);
Else;
Play Effect(Event Player, Ring Explosion, Color(Orange), Position Of(Event Player.players[Event Player.counter]), 5);
End;
End;
If(Distance Between(Event Player.startPos, Event Player.endPos) <= 1);
If(Event Player.step >= 15);
Event Player.state = 3;
Abort;
Else;
Event Player.alive = 0;
Event Player.dir = Ray Cast Hit Normal(Event Player.endPos, Event Player.endPos + Event Player.dir * 1000, Null, Null, True);
Event Player.dir += Vector(Random Real(-0.500, 0.500), Random Real(-0.200, 0.200), Random Real(-0.500, 0.500));
Event Player.endPos = Ray Cast Hit Position(Event Player.endPos, Event Player.endPos + Event Player.dir * 1000, Null, Null, True);
Event Player.step += 1;
End;
End;
Wait(0.160, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Destroy")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.state == 3;
}
actions
{
For Player Variable(Event Player, counter, 0, Count Of(Event Player.effects), 1);
Destroy Effect(Event Player.effects[Event Player.counter]);
Wait(0.016, Ignore Condition);
End;
Event Player.state = 0;
Event Player.effects = Null;
}
}
rule("Timout")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.state == 2;
Event Player.alive > 1;
}
actions
{
Wait(10, Abort When False);
Event Player.state = 3;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment