Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package data.scripts.plugins;
- import com.fs.starfarer.api.Global;
- import com.fs.starfarer.api.combat.CombatEngineAPI;
- import com.fs.starfarer.api.combat.CombatEntityAPI;
- import com.fs.starfarer.api.combat.DamageType;
- import com.fs.starfarer.api.combat.DamagingProjectileAPI;
- import com.fs.starfarer.api.combat.EveryFrameCombatPlugin;
- import com.fs.starfarer.api.combat.ShipAPI;
- import com.fs.starfarer.api.input.InputEventAPI;
- import java.util.*;
- import org.lwjgl.util.vector.Vector2f;
- import org.dark.shaders.distortion.DistortionShader;
- import org.dark.shaders.distortion.RippleDistortion;
- import org.lazywizard.lazylib.VectorUtils;
- public class ShieldRipple implements EveryFrameCombatPlugin {
- public CombatEngineAPI engine;
- public static final Set<DamagingProjectileAPI> projectiles = new LinkedHashSet<>();
- @Override
- public void init(CombatEngineAPI engine) {
- }
- @Override
- public void advance(float amount, List<InputEventAPI> events) {
- if (engine != Global.getCombatEngine()) {
- projectiles.clear();
- this.engine = Global.getCombatEngine();
- }
- if (engine.isPaused()) {
- return;
- }
- List<DamagingProjectileAPI> activeProjectiles = engine.getProjectiles();
- for (DamagingProjectileAPI projectile : activeProjectiles) {
- if (projectile.didDamage() || projectile.isFading()) {
- continue;
- }
- if (!projectiles.contains(projectile)) {
- projectiles.add(projectile);
- }
- }
- Iterator<DamagingProjectileAPI> iter = projectiles.iterator();
- while (iter.hasNext()) {
- DamagingProjectileAPI projectile = iter.next();
- if (projectile.didDamage()) {
- CombatEntityAPI target = projectile.getDamageTarget();
- if (target instanceof ShipAPI) {
- if (target.getShield() != null && target.getShield().isOn() && target.getShield().isWithinArc(projectile.getLocation())) {
- onHit(Vector2f.sub(new Vector2f(projectile.getLocation()), (Vector2f) new Vector2f(projectile.getVelocity()).scale(amount), null), projectile.getDamageAmount(), projectile.getDamageType(), VectorUtils.getFacing(VectorUtils.getDirectionalVector(target.getShield().getLocation(), projectile.getLocation())));
- }
- }
- iter.remove();
- } else if (!engine.isEntityInPlay(projectile)) {
- iter.remove();
- }
- }
- }
- private void onHit(Vector2f location, float damage, DamageType type, float direction) {
- if (type == DamageType.FRAGMENTATION) {
- damage *= 0.25f;
- }
- if (type == DamageType.HIGH_EXPLOSIVE) {
- damage *= 0.5f;
- }
- if (type == DamageType.KINETIC) {
- damage *= 2f;
- }
- if (damage < 50f) {
- return;
- }
- float start = direction - 75f;
- if (start < 0f) {
- start += 360f;
- }
- float end = direction + 75f;
- if (end >= 360f) {
- end -= 360f;
- }
- float fadeTime = (float) Math.pow(damage, 0.25) * 0.1f;
- float intensity = (float) Math.pow(damage, 0.3333333) * 15f;
- RippleDistortion ripple = new RippleDistortion();
- ripple.setSize(intensity);
- ripple.setIntensity(intensity * 0.3f);
- ripple.setLocation(location);
- ripple.setFrameRate(60f / fadeTime);
- ripple.fadeInSize(fadeTime * 1.2f);
- ripple.fadeOutIntensity(fadeTime);
- ripple.setSize(intensity * 0.2f);
- ripple.setArc(start, end);
- DistortionShader.addDistortion(ripple);
- ripple = new RippleDistortion();
- ripple.setSize(intensity);
- ripple.setIntensity(intensity * 0.1f);
- ripple.setLocation(location);
- ripple.setFrameRate(60f / fadeTime);
- ripple.fadeInSize(fadeTime * 1.2f);
- ripple.fadeOutIntensity(fadeTime);
- ripple.setSize(intensity * 0.2f);
- ripple.setArc(end, start);
- DistortionShader.addDistortion(ripple);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement