Advertisement
LJLim

Tiandong laser trial

Dec 31st, 2016
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.17 KB | None | 0 0
  1. package data.scripts.weapons;
  2.  
  3.  
  4. import com.fs.starfarer.api.combat.BeamAPI;
  5. import com.fs.starfarer.api.combat.BeamEffectPlugin;
  6. import com.fs.starfarer.api.combat.CombatEngineAPI;
  7. import java.awt.Color;
  8. import org.lazywizard.lazylib.FastTrig;
  9. import org.lazywizard.lazylib.MathUtils;
  10. import org.lazywizard.lazylib.VectorUtils;
  11.  
  12. public class tiandong_SweepingBeamEffect implements BeamEffectPlugin
  13. {
  14.     /*
  15.         Relevant protips:
  16.         1) weapon angle is relative to map
  17.        
  18.     */
  19.    
  20.     // no way to set arc directly, instead combine these two values
  21.     private static final float FREQUENCY_MULT = 1;      // higher means the beam changes direction more frequently
  22.     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
  23.     @Deprecated
  24.     private static final float EDGE_ANGLE_BUFFER = 0;
  25.    
  26.    
  27.     private float p = 0;
  28.     private float turnrate = 0;
  29.     private float lastAngle = 0;
  30.     private double lastSin = 0;
  31.    
  32.     // debugging
  33.     private static final boolean DEBUG_MODE = true;
  34.     private float debugIncrement = 0;
  35.     private float minAngle = 0;
  36.     private float maxAngle = 0;
  37.    
  38.     @Override
  39.     public void advance(float amount, CombatEngineAPI engine, BeamAPI beam)
  40.     {
  41.         // Don't bother with any checks if the game is paused
  42.         if (engine.isPaused()) {
  43.             return;
  44.         }
  45.        
  46.         lastAngle = beam.getWeapon().getCurrAngle();
  47.        
  48.         if (beam.getBrightness()>0) {
  49.             boolean allow = false;
  50.             int tries = 0;
  51.             while (!allow && tries < 2)
  52.             {
  53.                 p += amount * FREQUENCY_MULT;
  54.                 double sin = FastTrig.sin(p);
  55.                 /*
  56.                 if (sin > 0 && sin < lastSin || sin < 0 && sin > lastSin)
  57.                 {
  58.                     // sign of delta(sin) has changed
  59.                 }
  60.                 if (sin > 0 && lastSin < 0 || sin < 0 && lastSin > 0)
  61.                 {
  62.                     // sign of sin has changed
  63.                 }
  64.                 lastSin = sin;
  65.                 */
  66.                
  67.                 if (sin > 0)
  68.                     turnrate = 1;
  69.                 else
  70.                     turnrate = -1;
  71.                
  72.                 turnrate *= AMPLITUDE_MULT;
  73.  
  74.                 // if we're at the edge of turret turn arc, "bounce off"
  75.                 float relativeAngle = lastAngle + turnrate - beam.getWeapon().getArcFacing();
  76.                 relativeAngle = MathUtils.clampAngle(relativeAngle);
  77.                 if (relativeAngle < 0) relativeAngle *= 1;
  78.                 if (relativeAngle > beam.getWeapon().getArc() - EDGE_ANGLE_BUFFER || relativeAngle < EDGE_ANGLE_BUFFER)
  79.                 {
  80.                     // change sign of sin
  81.                     p += Math.PI;
  82.                 }
  83.                 else
  84.                 {
  85.                     allow = true;
  86.                 }
  87.                 tries++;
  88.             }
  89.             beam.getWeapon().setCurrAngle(lastAngle + turnrate);
  90.             if (DEBUG_MODE)
  91.             {
  92.                 float offsetAngle = VectorUtils.getAngle(beam.getFrom(), beam.getTo())
  93.                         - VectorUtils.getAngle(beam.getFrom(), beam.getSource().getMouseTarget());
  94.                 if (offsetAngle < minAngle)
  95.                     minAngle = offsetAngle;
  96.                 else if (offsetAngle > maxAngle)
  97.                     maxAngle = offsetAngle;
  98.                    
  99.                 debugIncrement++;
  100.                 if (debugIncrement >= 90)
  101.                 {
  102.                     //engine.addFloatingText(beam.getTo(), relativeAngle + "", 24, Color.WHITE, beam.getSource(), 0, 0);
  103.                     engine.getCombatUI().addMessage(0, minAngle + ", " + maxAngle);
  104.                     debugIncrement = 0;
  105.                     minAngle = 0;
  106.                     maxAngle = 0;
  107.                 }
  108.             }
  109.         }
  110.     }
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement