diff --git a/core/src/io/anuke/mindustry/content/Mechs.java b/core/src/io/anuke/mindustry/content/Mechs.java index dc88c1917d..5a37fac3d5 100644 --- a/core/src/io/anuke/mindustry/content/Mechs.java +++ b/core/src/io/anuke/mindustry/content/Mechs.java @@ -96,7 +96,7 @@ public class Mechs implements ContentList{ Effects.shake(1f, 1f, player); Effects.effect(UnitFx.landShock, player); for(int i = 0; i < 8; i++){ - Timers.run(Mathf.random(8f), () -> Lightning.create(player.getTeam(), BulletFx.hitLancer, player.getTeam().color, 17f, player.x, player.y, Mathf.random(360f), 14)); + Timers.run(Mathf.random(8f), () -> Lightning.create(player.getTeam(), player.getTeam().color, 17f, player.x, player.y, Mathf.random(360f), 14)); } } } @@ -254,7 +254,7 @@ public class Mechs implements ContentList{ float scl = scld(player); if(Mathf.chance(Timers.delta() * (0.15*scl))){ Effects.effect(BulletFx.hitLancer, Palette.lancerLaser, player.x, player.y); - Lightning.create(player.getTeam(), BulletFx.hitLancer, Palette.lancerLaser, 10f, + Lightning.create(player.getTeam(), Palette.lancerLaser, 10f, player.x + player.getVelocity().x, player.y + player.getVelocity().y, player.rotation, 14); } } diff --git a/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java b/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java index 7853db554f..4cdd459b53 100644 --- a/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java @@ -112,15 +112,18 @@ public class TurretBlocks extends BlockList implements ContentList{ heatColor = Color.RED; size = 2; health = 320; + targetAir = false; }}; arc = new PowerTurret("arc"){{ shootType = AmmoTypes.arc; - reload = 34f; + reload = 60f; shootShake = 1f; + shootCone = 40f; + rotatespeed = 8f; powerUsed = 5f; powerCapacity = 30f; - range = 60f; + range = 130f; shootEffect = ShootFx.lightningShoot; heatColor = Color.RED; recoil = 1f; diff --git a/core/src/io/anuke/mindustry/content/bullets/FlakBullets.java b/core/src/io/anuke/mindustry/content/bullets/FlakBullets.java index 5a1c6c5f2a..158c4240fa 100644 --- a/core/src/io/anuke/mindustry/content/bullets/FlakBullets.java +++ b/core/src/io/anuke/mindustry/content/bullets/FlakBullets.java @@ -43,7 +43,7 @@ public class FlakBullets extends BulletList implements ContentList{ super.despawned(b); for (int i = 0; i < 2; i++) { - Lightning.create(b.getTeam(), BulletFx.hitLancer, Palette.surge, damage, b.x, b.y, Mathf.random(360f), 12); + Lightning.create(b.getTeam(), Palette.surge, damage, b.x, b.y, Mathf.random(360f), 12); } } }; diff --git a/core/src/io/anuke/mindustry/content/bullets/MissileBullets.java b/core/src/io/anuke/mindustry/content/bullets/MissileBullets.java index 2cc4985c43..0e0dc3a8fb 100644 --- a/core/src/io/anuke/mindustry/content/bullets/MissileBullets.java +++ b/core/src/io/anuke/mindustry/content/bullets/MissileBullets.java @@ -67,7 +67,7 @@ public class MissileBullets extends BulletList implements ContentList{ super.hit(b); for (int i = 0; i < 2; i++) { - Lightning.create(b.getTeam(), BulletFx.hitLancer, Palette.surge, damage, b.x, b.y, Mathf.random(360f), 14); + Lightning.create(b.getTeam(), Palette.surge, damage, b.x, b.y, Mathf.random(360f), 14); } } }; diff --git a/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java b/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java index 2ee175ae96..048aff0dad 100644 --- a/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java +++ b/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java @@ -27,11 +27,20 @@ import static io.anuke.mindustry.Vars.content; import static io.anuke.mindustry.Vars.world; public class TurretBullets extends BulletList implements ContentList{ - public static BulletType fireball, basicFlame, lancerLaser, burstLaser, meltdownLaser, fuseShot, waterShot, cryoShot, lavaShot, oilShot, lightning, driverBolt, healBullet, arc; + public static BulletType fireball, basicFlame, lancerLaser, burstLaser, meltdownLaser, + fuseShot, waterShot, cryoShot, lavaShot, oilShot, lightning, driverBolt, healBullet, arc, damageLightning; @Override public void load(){ + damageLightning = new BulletType(0.0001f, 0f){ + { + lifetime = Lightning.lifetime; + hiteffect = BulletFx.hitLancer; + despawneffect = Fx.none; + } + }; + healBullet = new BulletType(5.2f, 13){ float healAmount = 21f; @@ -276,11 +285,12 @@ public class TurretBullets extends BulletList implements ContentList{ } }; - lightning = new BulletType(0.001f, 14){ + lightning = new BulletType(0.001f, 12f){ { - lifetime = 1; + lifetime = 1f; despawneffect = Fx.none; hiteffect = BulletFx.hitLancer; + keepVelocity = false; } @Override @@ -289,11 +299,11 @@ public class TurretBullets extends BulletList implements ContentList{ @Override public void init(Bullet b){ - Lightning.create(b.getTeam(), hiteffect, Palette.lancerLaser, damage, b.x, b.y, b.angle(), 30); + Lightning.create(b.getTeam(), Palette.lancerLaser, damage, b.x, b.y, b.angle(), 30); } }; - arc = new BulletType(0.001f, 7){ + arc = new BulletType(0.001f, 30){ { lifetime = 1; despawneffect = Fx.none; @@ -306,7 +316,7 @@ public class TurretBullets extends BulletList implements ContentList{ @Override public void init(Bullet b){ - Lightning.create(b.getTeam(), hiteffect, Palette.lancerLaser, damage, b.x, b.y, b.angle(), 28); + Lightning.create(b.getTeam(), Palette.lancerLaser, damage, b.x, b.y, b.angle(), 34); } }; diff --git a/core/src/io/anuke/mindustry/entities/Damage.java b/core/src/io/anuke/mindustry/entities/Damage.java index 199b3379d1..579dddc3df 100644 --- a/core/src/io/anuke/mindustry/entities/Damage.java +++ b/core/src/io/anuke/mindustry/entities/Damage.java @@ -34,7 +34,7 @@ public class Damage{ public static void dynamicExplosion(float x, float y, float flammability, float explosiveness, float power, float radius, Color color){ for(int i = 0; i < Mathf.clamp(power / 20, 0, 6); i++){ int branches = 5 + Mathf.clamp((int) (power / 30), 1, 20); - Timers.run(i * 2f + Mathf.random(4f), () -> Lightning.create(Team.none, Fx.none, Palette.power, 3, + Timers.run(i * 2f + Mathf.random(4f), () -> Lightning.create(Team.none, Palette.power, 3, x, y, Mathf.random(360f), branches + Mathf.range(2))); } diff --git a/core/src/io/anuke/mindustry/entities/bullet/Bullet.java b/core/src/io/anuke/mindustry/entities/bullet/Bullet.java index 02d5297965..05864553c9 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/Bullet.java +++ b/core/src/io/anuke/mindustry/entities/bullet/Bullet.java @@ -4,6 +4,7 @@ import com.badlogic.gdx.math.Vector2; import io.anuke.annotations.Annotations.Loc; import io.anuke.annotations.Annotations.Remote; import io.anuke.mindustry.entities.Unit; +import io.anuke.mindustry.entities.effect.Lightning; import io.anuke.mindustry.entities.traits.AbsorbTrait; import io.anuke.mindustry.entities.traits.SyncTrait; import io.anuke.mindustry.entities.traits.TeamTrait; @@ -133,6 +134,10 @@ public class Bullet extends BulletEntity implements TeamTrait, SyncT return super.getDamage() * ((Unit) owner).getDamageMultipler(); } + if(owner instanceof Lightning && data instanceof Float){ + return (Float)data; + } + return super.getDamage(); } diff --git a/core/src/io/anuke/mindustry/entities/effect/Lightning.java b/core/src/io/anuke/mindustry/entities/effect/Lightning.java index 795de1f9c6..0921d2a2f2 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Lightning.java +++ b/core/src/io/anuke/mindustry/entities/effect/Lightning.java @@ -1,10 +1,16 @@ package io.anuke.mindustry.entities.effect; import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.math.Rectangle; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.IntSet; import io.anuke.annotations.Annotations.Loc; import io.anuke.annotations.Annotations.Remote; +import io.anuke.mindustry.content.bullets.TurretBullets; +import io.anuke.mindustry.entities.Unit; +import io.anuke.mindustry.entities.Units; +import io.anuke.mindustry.entities.bullet.Bullet; import io.anuke.mindustry.entities.traits.SyncTrait; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.gen.Call; @@ -17,17 +23,24 @@ import io.anuke.ucore.entities.trait.PosTrait; import io.anuke.ucore.entities.trait.TimeTrait; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Lines; -import io.anuke.ucore.util.Pooling; -import io.anuke.ucore.util.SeedRandom; +import io.anuke.ucore.util.*; import java.io.DataInput; import java.io.DataOutput; import static io.anuke.mindustry.Vars.bulletGroup; +import static io.anuke.mindustry.Vars.fontScale; public class Lightning extends TimedEntity implements DrawTrait, SyncTrait, TimeTrait{ + public static final float lifetime = 10f; + + private static final SeedRandom random = new SeedRandom(); + private static final Rectangle rect = new Rectangle(); + private static final Array entities = new Array<>(); + private static final IntSet hit = new IntSet(); + private static final int maxChain = 8; + private static final float hitRange = 30f; private static int lastSeed = 0; - private static SeedRandom random = new SeedRandom(); private Array lines = new Array<>(); private Color color = Palette.lancerLaser; @@ -37,25 +50,52 @@ public class Lightning extends TimedEntity implements DrawTrait, SyncTrait, Time } /**Create a lighting branch at a location. Use Team.none to damage everyone.*/ - public static void create(Team team, Effect effect, Color color, float damage, float x, float y, float targetAngle, int length){ - Call.createLighting(lastSeed++, team, effect, color, damage, x, y, targetAngle, length); + public static void create(Team team, Color color, float damage, float x, float y, float targetAngle, int length){ + Call.createLighting(lastSeed++, team, color, damage, x, y, targetAngle, length); } /**Do not invoke!*/ @Remote(called = Loc.server) - public static void createLighting(int seed, Team team, Color color, float damage, float x, float y, int length){ + public static void createLighting(int seed, Team team, Color color, float damage, float x, float y, float rotation, int length){ + Lightning l = Pooling.obtain(Lightning.class, Lightning::new); + Float dmg = damage; l.x = x; l.y = y; l.color = color; l.add(); - for (int i = 0; i < length; i++) { - Effect - } - random.setSeed(seed); + hit.clear(); + + for (int i = 0; i < length/2; i++) { + Bullet.create(TurretBullets.damageLightning, l, team, x, y, 0f, 1f, 1f, dmg); + l.lines.add(new Translator(x + Mathf.range(3f), y + Mathf.range(3f))); + + rect.setSize(hitRange).setCenter(x, y); + entities.clear(); + if(hit.size < maxChain){ + Units.getNearbyEnemies(team, rect, u -> { + if(!hit.contains(u.getID())){ + entities.add(u); + } + }); + } + + Unit furthest = Geometry.findFurthest(x, y, entities); + + if(furthest != null){ + hit.add(furthest.getID()); + x = furthest.x; + y = furthest.y; + }else{ + rotation += random.range(20f); + x += Angles.trnsx(rotation, hitRange/2f); + y += Angles.trnsy(rotation, hitRange/2f); + } + + } } @Override @@ -71,11 +111,12 @@ public class Lightning extends TimedEntity implements DrawTrait, SyncTrait, Time @Override public float lifetime(){ - return 10; + return lifetime; } @Override public void reset(){ + super.reset(); color = Palette.lancerLaser; lines.clear(); } @@ -91,20 +132,25 @@ public class Lightning extends TimedEntity implements DrawTrait, SyncTrait, Time float lx = x, ly = y; Draw.color(color, Color.WHITE, fin()); for(int i = 0; i < lines.size; i++){ - Vector2 v = lines.get(i); + PosTrait v = lines.get(i); - Lines.stroke(fout() * 3f * (1.5f - (float) i / lines.size)); + float f = (float) i / lines.size; + + Lines.stroke(fout() * 3f * (1.5f - f)); Lines.stroke(Lines.getStroke() * 4f); Draw.alpha(0.3f); - Lines.line(lx, ly, v.x, v.y); + Lines.line(lx, ly, v.getX(), v.getY()); Lines.stroke(Lines.getStroke()/4f); Draw.alpha(1f); - Lines.line(lx, ly, v.x, v.y); + Lines.line(lx, ly, v.getX(), v.getY()); - lx = v.x; - ly = v.y; + Lines.stroke(3f * fout() * (1f - f)); + // Lines.lineAngleCenter(lx, ly, Angles.angle(lx, ly, v.getX(), v.getY()) + 90f, 20f); + + lx = v.getX(); + ly = v.getY(); } Draw.color(); } diff --git a/core/src/io/anuke/mindustry/type/Weapon.java b/core/src/io/anuke/mindustry/type/Weapon.java index 1d87e6a831..1a4e9159cd 100644 --- a/core/src/io/anuke/mindustry/type/Weapon.java +++ b/core/src/io/anuke/mindustry/type/Weapon.java @@ -15,6 +15,7 @@ import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.util.Angles; +import io.anuke.ucore.util.Log; import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Translator; diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/ShockMine.java b/core/src/io/anuke/mindustry/world/blocks/defense/ShockMine.java index 49b8bd986a..be3e1c51f2 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/ShockMine.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/ShockMine.java @@ -1,6 +1,5 @@ package io.anuke.mindustry.world.blocks.defense; -import io.anuke.mindustry.content.fx.BulletFx; import io.anuke.mindustry.entities.Unit; import io.anuke.mindustry.entities.effect.Lightning; import io.anuke.mindustry.graphics.Layer; @@ -47,7 +46,7 @@ public class ShockMine extends Block{ public void unitOn(Tile tile, Unit unit){ if(unit.getTeam() != tile.getTeam() && tile.entity.timer.get(timerDamage, cooldown)){ for(int i = 0; i < tendrils; i++){ - Lightning.create(tile.getTeam(), BulletFx.hitLancer, tile.getTeam().color, damage, tile.drawx(), tile.drawy(), Mathf.random(360f), length); + Lightning.create(tile.getTeam(), tile.getTeam().color, damage, tile.drawx(), tile.drawy(), Mathf.random(360f), length); } tile.entity.damage(tileDamage); } diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/SurgeWall.java b/core/src/io/anuke/mindustry/world/blocks/defense/SurgeWall.java index 5d7a20e5a8..eb79b46eb2 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/SurgeWall.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/SurgeWall.java @@ -1,6 +1,5 @@ package io.anuke.mindustry.world.blocks.defense; -import io.anuke.mindustry.content.fx.BulletFx; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.bullet.Bullet; import io.anuke.mindustry.entities.effect.Lightning; @@ -20,7 +19,7 @@ public class SurgeWall extends Wall{ public void handleBulletHit(TileEntity entity, Bullet bullet){ super.handleBulletHit(entity, bullet); if(Mathf.chance(lightningChance)){ - Lightning.create(entity.getTeam(), BulletFx.hitLancer, Palette.surge, lightningDamage, bullet.x, bullet.y, bullet.angle() + 180f, lightningLength); + Lightning.create(entity.getTeam(), Palette.surge, lightningDamage, bullet.x, bullet.y, bullet.angle() + 180f, lightningLength); } } }