package mindustry.entities.bullet; import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; import mindustry.content.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.world.blocks.distribution.MassDriver.*; import static mindustry.Vars.*; public class MassDriverBolt extends BasicBulletType{ public MassDriverBolt(){ super(1f, 75); collidesTiles = false; lifetime = 1f; width = 11f; height = 13f; shrinkY = 0f; sprite = "shell"; despawnEffect = Fx.smeltsmoke; hitEffect = Fx.hitBulletBig; } @Override public void update(Bullet b){ super.update(b); //data MUST be an instance of DriverBulletData if(!(b.data() instanceof DriverBulletData data)){ hit(b); return; } float hitDst = 7f; //if the target is dead, just keep flying until the bullet explodes if(data.to.dead()){ return; } float baseDst = data.from.dst(data.to); float dst1 = b.dst(data.from); float dst2 = b.dst(data.to); boolean intersect = false; //bullet has gone past the destination point: but did it intersect it? if(dst1 > baseDst){ float angleTo = b.angleTo(data.to); float baseAngle = data.to.angleTo(data.from); //if angles are nearby, then yes, it did if(Angles.near(angleTo, baseAngle, 2f)){ intersect = true; //snap bullet position back; this is used for low-FPS situations b.set(data.to.x + Angles.trnsx(baseAngle, hitDst), data.to.y + Angles.trnsy(baseAngle, hitDst)); } } //if on course and it's in range of the target if(Math.abs(dst1 + dst2 - baseDst) < 4f && dst2 <= hitDst){ intersect = true; } //else, bullet has gone off course, does not get received. if(intersect){ data.to.handlePayload(b, data); } } @Override public void despawned(Bullet b){ super.despawned(b); if(!(b.data() instanceof DriverBulletData data)) return; for(int i = 0; i < data.items.length; i++){ int amountDropped = Mathf.random(0, data.items[i]); if(amountDropped > 0){ float angle = b.rotation() + Mathf.range(100f); Fx.dropItem.at(b.x, b.y, angle, Color.white, content.item(i)); } } } @Override public void hit(Bullet b, float hitx, float hity){ super.hit(b, hitx, hity); despawned(b); } }