Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package data.scripts.weapons;
- import com.fs.starfarer.api.combat.BeamAPI;
- import com.fs.starfarer.api.combat.BeamEffectPlugin;
- import com.fs.starfarer.api.combat.CombatEngineAPI;
- import java.awt.Color;
- import org.lazywizard.lazylib.FastTrig;
- import org.lazywizard.lazylib.MathUtils;
- import org.lazywizard.lazylib.VectorUtils;
- public class tiandong_SweepingBeamEffect implements BeamEffectPlugin
- {
- /*
- Relevant protips:
- 1) weapon angle is relative to map
- */
- // no way to set arc directly, instead combine these two values
- private static final float FREQUENCY_MULT = 1; // higher means the beam changes direction more frequently
- private static final float AMPLITUDE_MULT = 0.28f; // how strongly the beam moves each frame; has to fight engine turret movement so can't be too low
- @Deprecated
- private static final float EDGE_ANGLE_BUFFER = 0;
- private float p = 0;
- private float turnrate = 0;
- private float lastAngle = 0;
- private double lastSin = 0;
- // debugging
- private static final boolean DEBUG_MODE = true;
- private float debugIncrement = 0;
- private float minAngle = 0;
- private float maxAngle = 0;
- @Override
- public void advance(float amount, CombatEngineAPI engine, BeamAPI beam)
- {
- // Don't bother with any checks if the game is paused
- if (engine.isPaused()) {
- return;
- }
- lastAngle = beam.getWeapon().getCurrAngle();
- if (beam.getBrightness()>0) {
- boolean allow = false;
- int tries = 0;
- while (!allow && tries < 2)
- {
- p += amount * FREQUENCY_MULT;
- double sin = FastTrig.sin(p);
- /*
- if (sin > 0 && sin < lastSin || sin < 0 && sin > lastSin)
- {
- // sign of delta(sin) has changed
- }
- if (sin > 0 && lastSin < 0 || sin < 0 && lastSin > 0)
- {
- // sign of sin has changed
- }
- lastSin = sin;
- */
- if (sin > 0)
- turnrate = 1;
- else
- turnrate = -1;
- turnrate *= AMPLITUDE_MULT;
- // if we're at the edge of turret turn arc, "bounce off"
- float relativeAngle = lastAngle + turnrate - beam.getWeapon().getArcFacing();
- relativeAngle = MathUtils.clampAngle(relativeAngle);
- if (relativeAngle < 0) relativeAngle *= 1;
- if (relativeAngle > beam.getWeapon().getArc() - EDGE_ANGLE_BUFFER || relativeAngle < EDGE_ANGLE_BUFFER)
- {
- // change sign of sin
- p += Math.PI;
- }
- else
- {
- allow = true;
- }
- tries++;
- }
- beam.getWeapon().setCurrAngle(lastAngle + turnrate);
- if (DEBUG_MODE)
- {
- float offsetAngle = VectorUtils.getAngle(beam.getFrom(), beam.getTo())
- - VectorUtils.getAngle(beam.getFrom(), beam.getSource().getMouseTarget());
- if (offsetAngle < minAngle)
- minAngle = offsetAngle;
- else if (offsetAngle > maxAngle)
- maxAngle = offsetAngle;
- debugIncrement++;
- if (debugIncrement >= 90)
- {
- //engine.addFloatingText(beam.getTo(), relativeAngle + "", 24, Color.WHITE, beam.getSource(), 0, 0);
- engine.getCombatUI().addMessage(0, minAngle + ", " + maxAngle);
- debugIncrement = 0;
- minAngle = 0;
- maxAngle = 0;
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement