Esempio n. 1
0
        public void ProcessPacket(PowerTowerUserLoadingRequest packet, NebulaConnection conn)
        {
            PlanetFactory factory = GameMain.galaxy.PlanetById(packet.PlanetId)?.factory;

            if (factory != null && factory.powerSystem != null)
            {
                PowerNetwork pNet = factory.powerSystem.netPool[packet.NetId];

                if (packet.Charging)
                {
                    PowerTowerManager.AddExtraDemand(packet.PlanetId, packet.NetId, packet.NodeId, packet.PowerAmount);
                }
                else
                {
                    PowerTowerManager.RemExtraDemand(packet.PlanetId, packet.NetId, packet.NodeId);
                }

                LocalPlayer.SendPacketToStar(new PowerTowerUserLoadingResponse(packet.PlanetId,
                                                                               packet.NetId,
                                                                               packet.NodeId,
                                                                               packet.PowerAmount,
                                                                               pNet.energyCapacity,
                                                                               pNet.energyRequired,
                                                                               pNet.energyServed,
                                                                               pNet.energyAccumulated,
                                                                               pNet.energyExchanged,
                                                                               packet.Charging),
                                             GameMain.galaxy.PlanetById(packet.PlanetId).star.id);
            }
        }
        public void ProcessPacket(PowerTowerUserLoadingResponse packet, NebulaConnection conn)
        {
            PlanetFactory factory = GameMain.galaxy.PlanetById(packet.PlanetId)?.factory;

            if (factory != null && factory.powerSystem != null)
            {
                PowerNetwork pNet = factory.powerSystem.netPool[packet.NetId];

                if (packet.Charging)
                {
                    PowerTowerManager.AddExtraDemand(packet.PlanetId, packet.NetId, packet.NodeId, packet.PowerAmount);
                    if (PowerTowerManager.DidRequest(packet.PlanetId, packet.NetId, packet.NodeId))
                    {
                        int   baseDemand = factory.powerSystem.nodePool[packet.NodeId].workEnergyPerTick - factory.powerSystem.nodePool[packet.NodeId].idleEnergyPerTick;
                        float mult       = factory.powerSystem.networkServes[packet.NetId];
                        PowerTowerManager.PlayerChargeAmount = (int)(mult * (float)baseDemand);
                    }
                }
                else
                {
                    PowerTowerManager.RemExtraDemand(packet.PlanetId, packet.NetId, packet.NodeId);
                }

                pNet.energyCapacity    = packet.EnergyCapacity;
                pNet.energyRequired    = packet.EnergyRequired;
                pNet.energyAccumulated = packet.EnergyAccumulated;
                pNet.energyExchanged   = packet.EnergyExchanged;
                pNet.energyServed      = packet.EnergyServed;
            }
        }
Esempio n. 3
0
        public static bool RemoveNodeComponent(PowerSystem __instance, int id)
        {
            if (SimulatedWorld.Initialized)
            {
                // as the destruct is synced accross players this event is too
                // and as such we can safely remove power demand for every player
                PowerNodeComponent pComp = __instance.nodePool[id];
                PowerTowerManager.RemExtraDemand(__instance.planet.id, pComp.networkId, id);
            }

            return(true);
        }
Esempio n. 4
0
 public static void PowerSystem_GameTick_Postfix(PowerSystem __instance, long time, bool isActive, bool isMultithreadMode)
 {
     if (SimulatedWorld.Initialized)
     {
         for (int i = 1; i < __instance.netCursor; i++)
         {
             PowerNetwork pNet = __instance.netPool[i];
             pNet.energyRequired += PowerTowerManager.GetExtraDemand(__instance.planet.id, i);
         }
         PowerTowerManager.GivePlayerPower();
         PowerTowerManager.UpdateAllAnimations(__instance.planet.id);
     }
 }
Esempio n. 5
0
        public static IEnumerable <CodeInstruction> PowerSystem_GameTick_Transpiler(IEnumerable <CodeInstruction> instructions)
        {
            instructions = new CodeMatcher(instructions)
                           .MatchForward(true,
                                         new CodeMatch(OpCodes.Ldarg_0),
                                         new CodeMatch(OpCodes.Ldfld, AccessTools.Field(typeof(PowerSystem), "nodePool")),
                                         new CodeMatch(OpCodes.Ldloc_S),
                                         new CodeMatch(OpCodes.Ldelema),
                                         new CodeMatch(OpCodes.Ldarg_0),
                                         new CodeMatch(OpCodes.Ldfld, AccessTools.Field(typeof(PowerSystem), "nodePool")),
                                         new CodeMatch(OpCodes.Ldloc_S),
                                         new CodeMatch(OpCodes.Ldelema),
                                         new CodeMatch(OpCodes.Ldfld, AccessTools.Field(typeof(PowerNodeComponent), "workEnergyPerTick")),
                                         new CodeMatch(OpCodes.Stfld, AccessTools.Field(typeof(PowerNodeComponent), "requiredEnergy")))
                           .Advance(1)
                           .InsertAndAdvance(new CodeInstruction(OpCodes.Ldarg_0))
                           .InsertAndAdvance(new CodeInstruction(OpCodes.Ldloc_S, 58))
                           .InsertAndAdvance(new CodeInstruction(OpCodes.Ldloc_S, 22))
                           .Insert(HarmonyLib.Transpilers.EmitDelegate <PlayerChargesAtTower>((PowerSystem _this, int powerNodeId, int powerNetId) =>
            {
                if (SimulatedWorld.Initialized)
                {
                    if (!LocalPlayer.IsMasterClient)
                    {
                        _this.nodePool[powerNodeId].requiredEnergy = _this.nodePool[powerNodeId].idleEnergyPerTick;     // this gets added onto the known required energy by PowerTowerManager and PowerSystem_Patch
                        if (PowerTowerManager.AddRequested(_this.planet.id, powerNetId, powerNodeId, true, false))
                        {
                            LocalPlayer.SendPacket(new PowerTowerUserLoadingRequest(_this.planet.id, powerNetId, powerNodeId, _this.nodePool[powerNodeId].workEnergyPerTick, true));
                        }
                    }
                    else
                    {
                        PowerNetwork pNet = _this.netPool[powerNetId];
                        if (PowerTowerManager.AddRequested(_this.planet.id, powerNetId, powerNodeId, true, false))
                        {
                            PowerTowerManager.AddExtraDemand(_this.planet.id, powerNetId, powerNodeId, _this.nodePool[powerNodeId].workEnergyPerTick);
                            LocalPlayer.SendPacketToLocalStar(new PowerTowerUserLoadingResponse(_this.planet.id, powerNetId, powerNodeId, _this.nodePool[powerNodeId].workEnergyPerTick,
                                                                                                pNet.energyCapacity,
                                                                                                pNet.energyRequired,
                                                                                                pNet.energyServed,
                                                                                                pNet.energyAccumulated,
                                                                                                pNet.energyExchanged,
                                                                                                true));
                        }
                    }
                }
            }))
                           // now search for where its set back to idle after player leaves radius / has charged fully
                           .MatchForward(true,
                                         new CodeMatch(OpCodes.Ldarg_0),
                                         new CodeMatch(OpCodes.Ldfld, AccessTools.Field(typeof(PowerSystem), "nodePool")),
                                         new CodeMatch(OpCodes.Ldloc_S),
                                         new CodeMatch(OpCodes.Ldelema),
                                         new CodeMatch(OpCodes.Ldarg_0),
                                         new CodeMatch(OpCodes.Ldfld, AccessTools.Field(typeof(PowerSystem), "nodePool")),
                                         new CodeMatch(OpCodes.Ldloc_S),
                                         new CodeMatch(OpCodes.Ldelema),
                                         new CodeMatch(OpCodes.Ldfld, AccessTools.Field(typeof(PowerNodeComponent), "idleEnergyPerTick")),
                                         new CodeMatch(OpCodes.Stfld, AccessTools.Field(typeof(PowerNodeComponent), "requiredEnergy")))
                           .Repeat(matcher =>
            {
                matcher
                .Advance(1)
                .InsertAndAdvance(new CodeInstruction(OpCodes.Ldarg_0))
                .InsertAndAdvance(new CodeInstruction(OpCodes.Ldloc_S, 58))
                .InsertAndAdvance(new CodeInstruction(OpCodes.Ldloc_S, 22))
                .Insert(HarmonyLib.Transpilers.EmitDelegate <PlayerChargesAtTower>((PowerSystem _this, int powerNodeId, int powerNetId) =>
                {
                    if (SimulatedWorld.Initialized)
                    {
                        if (!LocalPlayer.IsMasterClient)
                        {
                            if (PowerTowerManager.AddRequested(_this.planet.id, powerNetId, powerNodeId, false, false))
                            {
                                LocalPlayer.SendPacket(new PowerTowerUserLoadingRequest(_this.planet.id, powerNetId, powerNodeId, _this.nodePool[powerNodeId].workEnergyPerTick, false));
                            }
                        }
                        else
                        {
                            PowerNetwork pNet = _this.netPool[powerNetId];
                            if (PowerTowerManager.AddRequested(_this.planet.id, powerNetId, powerNodeId, false, false))
                            {
                                PowerTowerManager.RemExtraDemand(_this.planet.id, powerNetId, powerNodeId);
                                LocalPlayer.SendPacketToLocalStar(new PowerTowerUserLoadingResponse(_this.planet.id, powerNetId, powerNodeId, _this.nodePool[powerNodeId].workEnergyPerTick,
                                                                                                    pNet.energyCapacity,
                                                                                                    pNet.energyRequired,
                                                                                                    pNet.energyServed,
                                                                                                    pNet.energyAccumulated,
                                                                                                    pNet.energyExchanged,
                                                                                                    false));
                            }
                        }
                    }
                }));
            })
                           .InstructionEnumeration();

            return(instructions);
        }