示例#1
0
 public static void EditOrbit_Prefix(DysonSwarm __instance, int orbitId, float radius, Quaternion rotation)
 {
     if (Multiplayer.IsActive && !Multiplayer.Session.DysonSpheres.IncomingDysonSwarmPacket)
     {
         Multiplayer.Session.Network.SendPacket(new DysonSwarmEditOrbitPacket(__instance.starData.index, orbitId, radius, rotation));
     }
 }
示例#2
0
 public static void UpdateBulletBuffer(DysonSwarm __instance)
 {
     if (__instance.bulletBuffer != null)
     {
         __instance.bulletBuffer.Release();
     }
     __instance.bulletBuffer = new ComputeBuffer(__instance.bulletCapacity, 112, ComputeBufferType.Default);
 }
示例#3
0
 public static void AddBullet_Postfix(DysonSwarm __instance, SailBullet bullet, int orbitId)
 {
     //Host is sending correction / authorization packet to correct constants of the generated bullet
     if (SimulatedWorld.Initialized && LocalPlayer.IsMasterClient)
     {
         LocalPlayer.SendPacket(new DysonSphereBulletCorrectionPacket(__instance.starData.index, bullet.id, bullet.uEndVel, bullet.uEnd));
     }
 }
示例#4
0
 public static bool RemoveOrbit_Prefix(DysonSwarm __instance, int orbitId)
 {
     //Notify others that orbit for Dyson Swarm was deleted
     if (!DysonSphere_Manager.IncomingDysonSwarmPacket)
     {
         LocalPlayer.SendPacket(new DysonSwarmRemoveOrbitPacket(__instance.starData.index, orbitId));
     }
     return(true);
 }
示例#5
0
 public static bool NewOrbit_Prefix(DysonSwarm __instance, int __result, float radius, Quaternion rotation)
 {
     //Notify others that orbit for Dyson Swarm was created
     if (!DysonSphere_Manager.IncomingDysonSwarmPacket)
     {
         LocalPlayer.SendPacket(new DysonSwarmAddOrbitPacket(__instance.starData.index, radius, rotation));
     }
     return(true);
 }
示例#6
0
        public static bool DysonSwarm_AddSolarSail_Prefix(DysonSwarm __instance, DysonSail ss, int orbitId, long expiryTime)
        {
            if (executeNow || __instance.sailRecycleCursor > 0 || __instance.sailCursor < __instance.sailCapacity - 1)
            {
                // use default method if notifyNow is true or if the operation doesn't require a resize
                return(true);
            }

            addedDysonSwarmSails.Add(Tuple.Create(__instance, ss, orbitId, expiryTime));
            return(false);
        }
示例#7
0
 public static void SetOrbitColor_Prefix(DysonSwarm __instance, int orbitId, Vector4 hsva)
 {
     if (Multiplayer.IsActive && !Multiplayer.Session.DysonSpheres.IncomingDysonSwarmPacket)
     {
         if (storedHsva != hsva)
         {
             Multiplayer.Session.Network.SendPacket(new DysonSwarmEditOrbitPacket(__instance.starData.index, orbitId, hsva));
             storedHsva = hsva;
         }
     }
 }
示例#8
0
        public static bool IsOrbitReachable(EjectorComponent ejector, DysonSwarm swarm, AstroPose[] astroPoses, int orbitId)
        {
            if (!IsOrbitValid(orbitId, swarm))
            {
                return(false);
            }

            int        planetIndex = ejector.planetId / 100 * 100;
            float      num4        = ejector.localAlt + ejector.pivotY + (ejector.muzzleY - ejector.pivotY) / Mathf.Max(0.1f, Mathf.Sqrt(1f - ejector.localDir.y * ejector.localDir.y));
            Vector3    vector      = new Vector3(ejector.localPosN.x * num4, ejector.localPosN.y * num4, ejector.localPosN.z * num4);
            VectorLF3  vectorLF    = astroPoses[ejector.planetId].uPos + Maths.QRotateLF(astroPoses[ejector.planetId].uRot, vector);
            Quaternion q           = astroPoses[ejector.planetId].uRot * ejector.localRot;
            VectorLF3  uPos        = astroPoses[planetIndex].uPos;
            VectorLF3  b           = uPos - vectorLF;
            VectorLF3  vectorLF2   = uPos + VectorLF3.Cross(swarm.orbits[orbitId].up, b).normalized *(double)swarm.orbits[orbitId].radius;
            VectorLF3  vec         = vectorLF2 - vectorLF;
            var        targetDist  = vec.magnitude;

            vec.x /= targetDist;
            vec.y /= targetDist;
            vec.z /= targetDist;
            Vector3 vector2 = Maths.QInvRotate(q, vec);

            if ((double)vector2.y < 0.08715574 || vector2.y > 0.8660254f)
            {
                return(false);
            }

            for (int i = planetIndex + 1; i <= ejector.planetId + 2; i++)
            {
                if (i != ejector.planetId)
                {
                    double num5 = (double)astroPoses[i].uRadius;
                    if (num5 > 1.0)
                    {
                        VectorLF3 vectorLF3 = astroPoses[i].uPos - vectorLF;
                        double    num6      = vectorLF3.x * vectorLF3.x + vectorLF3.y * vectorLF3.y + vectorLF3.z * vectorLF3.z;
                        double    num7      = vectorLF3.x * vec.x + vectorLF3.y * vec.y + vectorLF3.z * vec.z;
                        if (num7 > 0.0)
                        {
                            double num8 = num6 - num7 * num7;
                            num5 += 120.0;
                            if (num8 < num5 * num5)
                            {
                                return(false);
                            }
                        }
                    }
                }
            }

            return(true);
        }
示例#9
0
 public static void SetOrbitEnable_Prefix(DysonSwarm __instance, int orbitId, bool enabled)
 {
     if (!Multiplayer.IsActive)
     {
         return;
     }
     //Notify others that orbit for Dyson Swarm was enabled/disabled
     if (!Multiplayer.Session.DysonSpheres.IncomingDysonSwarmPacket)
     {
         Multiplayer.Session.Network.SendPacket(new DysonSwarmRemoveOrbitPacket(__instance.starData.index, orbitId, enabled ? SwarmRemoveOrbitEvent.Enable : SwarmRemoveOrbitEvent.Disable));
     }
 }
示例#10
0
 public static void RemoveOrbit_Prefix(DysonSwarm __instance, int orbitId)
 {
     if (!Multiplayer.IsActive)
     {
         return;
     }
     //If local is the author and not in the process of importing blueprint
     if (!Multiplayer.Session.DysonSpheres.IncomingDysonSwarmPacket && !Multiplayer.Session.DysonSpheres.InBlueprint)
     {
         Multiplayer.Session.Network.SendPacket(new DysonSwarmRemoveOrbitPacket(__instance.starData.index, orbitId, SwarmRemoveOrbitEvent.Remove));
     }
 }
示例#11
0
 public static void NewOrbit_Prefix(DysonSwarm __instance, float radius, Quaternion rotation)
 {
     if (!Multiplayer.IsActive)
     {
         return;
     }
     //If local is the author and not in the process of importing blueprint
     if (!Multiplayer.Session.DysonSpheres.IncomingDysonSwarmPacket && !Multiplayer.Session.DysonSpheres.InBlueprint)
     {
         int orbitId = NebulaWorld.Universe.DysonSphereManager.QueryOrbitId(__instance);
         Multiplayer.Session.Network.SendPacket(new DysonSwarmAddOrbitPacket(__instance.starData.index, orbitId, radius, rotation));
     }
 }
示例#12
0
 public static bool IsOrbitValid(int orbitId, DysonSwarm swarm)
 {
     return(orbitId > 0 && orbitId < swarm.orbitCursor && swarm.orbits[orbitId].id == orbitId && swarm.orbits[orbitId].enabled);
 }
示例#13
0
        public static void EjectorComponent_InternalUpdate_Postfix(ref EjectorComponent __instance, DysonSwarm swarm, AstroPose[] astroPoses)
        {
            var ejectorUID = GetEjectorUID(__instance);

            if (ejectorUID % BATCH_COUNT != batch)
            {
                return;
            }

            ManagedEjector managedEjector = GetOrCreateManagedEjector(ejectorUID, __instance.orbitId);

            if (!IsOrbitValid(managedEjector.originalOrbitId, swarm))
            {
                managedEjector.originalOrbitId = 0;
            }

            if (__instance.orbitId != managedEjector.originalOrbitId && IsOrbitReachable(__instance, swarm, astroPoses, managedEjector.originalOrbitId))
            {
                // by default we try to check if the original orbit is available
                SetOrbit(ref __instance, managedEjector.originalOrbitId);
            }
            else if (
                (__instance.targetState == EjectorComponent.ETargetState.AngleLimit ||
                 __instance.targetState == EjectorComponent.ETargetState.Blocked ||
                 (__instance.targetState == EjectorComponent.ETargetState.None && forceRetargeting.Value))

                && swarm.orbitCursor > 1)
            {
                // if the current orbit is not reachable activate auto targeting
                var testOrbit   = __instance.orbitId;
                var orbitsCount = swarm.orbitCursor;
                while (--orbitsCount > 0)
                {
                    testOrbit++;
                    if (testOrbit >= swarm.orbitCursor)
                    {
                        testOrbit = 1;
                        if (ignoreOrbit1.Value)
                        {
                            continue;
                        }
                    }

                    if (IsOrbitReachable(__instance, swarm, astroPoses, testOrbit))
                    {
                        SetOrbit(ref __instance, testOrbit);
                        return;
                    }
                }

                // no alternative orbit has been found. set the original as default
                SetOrbit(ref __instance, managedEjector.originalOrbitId);
            }
        }