|
#!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 |