Advertisement
Chronos_Ouroboros

Boondorl thing

Nov 2nd, 2020
2,669
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.73 KB | None | 0 0
  1.     transient MoveTracer moveTracer;
  2.  
  3.     override void Tick()
  4.     {
  5.         if (IsFrozen())
  6.             return;
  7.  
  8.         if (bWindThrust)
  9.         {
  10.             int special = CurSector.special;
  11.             switch (special)
  12.             {
  13.                 // Wind_East
  14.                 case 40:
  15.                 case 41:
  16.                 case 42:
  17.                     Thrust(windTab[special-40], 0);
  18.                     break;
  19.  
  20.                 // Wind_North
  21.                 case 43:
  22.                 case 44:
  23.                 case 45:
  24.                     Thrust(windTab[special-43], 90);
  25.                     break;
  26.  
  27.                 // Wind_South
  28.                 case 46:
  29.                 case 47:
  30.                 case 48:
  31.                     Thrust(windTab[special-46], 270);
  32.                     break;
  33.  
  34.                 // Wind_West
  35.                 case 49:
  36.                 case 50:
  37.                 case 51:
  38.                     Thrust(windTab[special-49], 180);
  39.                     break;
  40.             }
  41.         }
  42.  
  43.         bool bHitActor, bHitWall, bHitPlane, bHitWater;
  44.         if (!moveTracer)
  45.         {
  46.             moveTracer = new("MoveTracer");
  47.             moveTracer.master = self;
  48.         }
  49.  
  50.         if (!(vel ~== (0, 0, 0))) {
  51.             double velLen = vel.Length();
  52.             Vector3 velDir = vel / velLen;
  53.             if (moveTracer.Trace(pos, CurSector, velDir, velLen, TRACE_ReportPortals)) {
  54.                 bHitActor = moveTracer.bHitActor;
  55.                 bHitWall = moveTracer.bHitWall;
  56.                 bHitPlane = moveTracer.bHitPlane;
  57.                 bHitWater = moveTracer.bHitWater;
  58.  
  59.                 SetOrigin(moveTracer.results.hitPos);
  60.             } else {
  61.                 SetOrigin(level.Vec3Offset(pos, vel));
  62.             }
  63.         }
  64.         if (moveTracer.bHitPortal)
  65.             vel.xy = RotateVector(vel.xy, DeltaAngle(VectorAngle(vel.x, vel.y), moveTracer.results.srcAngleFromTarget));
  66.  
  67.         CheckPortalTransition();
  68.  
  69.         if (pos.z < floorz)
  70.             SetZ(floorz);
  71.         else if (pos.z+height > ceilingz)
  72.             SetZ(ceilingz-height);
  73.  
  74.         if (!bNoGravity && pos.z > floorz)
  75.             vel.z -= GetGravity();
  76.  
  77.         if (bMissile
  78.             && (bHitWall || bHitActor || bHitPlane || bHitWater
  79.             || pos.z <= floorz || pos.z+height >= ceilingz))
  80.         {
  81.             bMissile = false;
  82.             vel = (0,0,0);
  83.             if (bHitWater)
  84.                 bNoGravity = true;
  85.  
  86.             SetState(FindState("Death"));
  87.             return;
  88.         }
  89.  
  90.         if (!CheckNoDelay())
  91.             return;
  92.  
  93.         if (tics > 0)
  94.             --tics;
  95.         while (!tics)
  96.         {
  97.             if (!SetState(CurState.NextState))
  98.                 return;
  99.         }
  100.  
  101. class MoveTracer : LineTracer
  102. {
  103.     Actor master;
  104.  
  105.     bool bHitActor;
  106.     bool bHitWall;
  107.     bool bHitPlane;
  108.     bool bHitWater;
  109.  
  110.     bool bHitPortal;
  111.  
  112.     override ETraceStatus TraceCallback()
  113.     {
  114.         if (results.crossedWater || results.crossed3DWater)
  115.         {
  116.             bHitWater = true;
  117.             results.hitPos = results.crossedWater ? results.crossedWaterPos : results.crossed3DWaterPos;
  118.             return TRACE_Stop;
  119.         }
  120.  
  121.         switch (results.HitType)
  122.         {
  123.             case TRACE_CrossingPortal:
  124.                 bHitPortal = true;
  125.                 break;
  126.  
  127.             case TRACE_HitWall:
  128.                 if (results.ffloor
  129.                     && (!(results.ffloor.flags & F3DFloor.FF_EXISTS)
  130.                     || !(results.ffloor.flags & F3DFloor.FF_SOLID)))
  131.                 {
  132.                     results.ffloor = null;
  133.                     break;
  134.                 }
  135.  
  136.                 if (results.tier == TIER_Middle
  137.                     && (results.hitLine.flags & Line.ML_TWOSIDED)
  138.                     && !(results.hitLine.flags & (Line.ML_BLOCKING|Line.ML_BLOCKEVERYTHING)))
  139.                 {
  140.                     break;
  141.                 }
  142.                 bHitWall = true;
  143.                 return TRACE_Stop;
  144.                 break;
  145.  
  146.             case TRACE_HitFloor:
  147.             case TRACE_HitCeiling:
  148.                 if (results.ffloor
  149.                     && (results.ffloor.flags & F3DFloor.FF_EXISTS)
  150.                     && (results.ffloor.flags & F3DFloor.FF_SOLID))
  151.                 {
  152.                     bHitPlane = true;
  153.                     return TRACE_Stop;
  154.                 }
  155.                 results.ffloor = null;
  156.                 break;
  157.  
  158.             case TRACE_HitActor:
  159.                 if (results.hitActor != master && results.hitActor.bSolid)
  160.                 {
  161.                     bHitActor = true;
  162.                     return TRACE_Stop;
  163.                 }
  164.                 break;
  165.         }
  166.  
  167.         return TRACE_Skip;
  168.     }
  169. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement