public static void PickupBeltItems_Postfix() { if (SimulatedWorld.Initialized && GameMain.data.localPlanet != null) { BeltManager.BeltPickupEnded(); } }
public static void PickupBeltItems_Prefix() { if (SimulatedWorld.Initialized) { BeltManager.BeltPickupStarted(); } }
static IEnumerable <CodeInstruction> PickupBeltItems_Transpiler(IEnumerable <CodeInstruction> instructions, ILGenerator iL) { var codeMatcher = new CodeMatcher(instructions, iL) .MatchForward(true, new CodeMatch(i => i.opcode == OpCodes.Callvirt && ((MethodInfo)i.operand).Name == nameof(CargoPath.TryPickItem)) ); if (codeMatcher.IsInvalid) { NebulaModel.Logger.Log.Error("CargoTraffic.PickupBeltItems_Transpiler failed. Mod version not compatible with game version."); return(instructions); } var itemId = codeMatcher.InstructionAt(3); var count = codeMatcher.InstructionAt(4); var beltId = new CodeInstruction(OpCodes.Ldarg_2); var segId = codeMatcher.InstructionAt(-6); return(codeMatcher .Advance(2) .InsertAndAdvance(itemId) .InsertAndAdvance(count) .InsertAndAdvance(beltId) .InsertAndAdvance(segId) .InsertAndAdvance(HarmonyLib.Transpilers.EmitDelegate <Action <int, int, int, int> >((item, cnt, belt, seg) => { if (SimulatedWorld.Initialized) { BeltManager.RegisterBeltPickupUpdate(item, cnt, belt, seg); } })) .InstructionEnumeration()); }
public void ProcessPacket(CreatePrebuildsRequest packet, NebulaConnection conn) { PlanetData planet = GameMain.galaxy.PlanetById(packet.PlanetId); if (planet.factory == null) { Log.Warn($"planet.factory was null create new one"); planet.factory = GameMain.data.GetOrCreateFactory(planet); } PlayerAction_Build pab = GameMain.mainPlayer.controller?.actionBuild; if (pab != null) { //Make backup of values that are overwritten List <BuildPreview> tmpList = pab.buildPreviews; bool tmpConfirm = pab.waitConfirm; UnityEngine.Vector3 tmpPos = pab.previewPose.position; UnityEngine.Quaternion tmpRot = pab.previewPose.rotation; PlanetFactory tmpFactory = null; NearColliderLogic tmpNearcdLogic = null; PlanetPhysics tmpPlanetPhysics = null; float tmpBuildArea = GameMain.mainPlayer.mecha.buildArea; PlanetData tmpData = null; bool loadExternalPlanetData = GameMain.localPlanet != planet; //Load temporary planet data, since host is not there if (loadExternalPlanetData) { tmpFactory = (PlanetFactory)AccessTools.Field(typeof(PlayerAction_Build), "factory").GetValue(GameMain.mainPlayer.controller.actionBuild); tmpNearcdLogic = (NearColliderLogic)AccessTools.Field(typeof(PlayerAction_Build), "nearcdLogic").GetValue(GameMain.mainPlayer.controller.actionBuild); tmpPlanetPhysics = (PlanetPhysics)AccessTools.Field(typeof(PlayerAction_Build), "planetPhysics").GetValue(pab); tmpData = GameMain.mainPlayer.planetData; } //Create Prebuilds from incomming packet and prepare new position pab.buildPreviews = packet.GetBuildPreviews(); pab.waitConfirm = true; using (FactoryManager.EventFromServer.On()) { FactoryManager.EventFactory = planet.factory; pab.previewPose.position = new UnityEngine.Vector3(packet.PosePosition.x, packet.PosePosition.y, packet.PosePosition.z); pab.previewPose.rotation = new UnityEngine.Quaternion(packet.PoseRotation.x, packet.PoseRotation.y, packet.PoseRotation.z, packet.PoseRotation.w); //Check if some mandatory variables are missing if (planet.physics == null || planet.physics.colChunks == null) { planet.physics = new PlanetPhysics(planet); planet.physics.Init(); } if (BeltManager.GetCargoTraffic(planet.factory.cargoTraffic) == null) { planet.factory.cargoTraffic.CreateRenderingBatches(); } if (planet.aux == null) { planet.aux = new PlanetAuxData(planet); } //Set temporary Local Planet / Factory data that are needed for original methods CheckBuildConditions() and CreatePrebuilds() AccessTools.Field(typeof(PlayerAction_Build), "factory").SetValue(GameMain.mainPlayer.controller.actionBuild, planet.factory); AccessTools.Field(typeof(PlayerAction_Build), "planetPhysics").SetValue(GameMain.mainPlayer.controller.actionBuild, planet.physics); AccessTools.Field(typeof(PlayerAction_Build), "nearcdLogic").SetValue(GameMain.mainPlayer.controller.actionBuild, planet.physics.nearColliderLogic); AccessTools.Property(typeof(global::Player), "planetData").SetValue(GameMain.mainPlayer, planet, null); //Check if prebuilds can be build (collision check, height check, etc) GameMain.mainPlayer.mecha.buildArea = float.MaxValue; bool canBuild; using (FactoryManager.IgnoreBasicBuildConditionChecks.On()) { canBuild = pab.CheckBuildConditions(); canBuild &= CheckBuildingConnections(pab.buildPreviews, planet.factory.entityPool, planet.factory.prebuildPool); } if (canBuild) { FactoryManager.PacketAuthor = packet.AuthorId; pab.CreatePrebuilds(); FactoryManager.PacketAuthor = -1; } //Revert changes back to the original planet if (loadExternalPlanetData) { planet.physics.Free(); planet.physics = null; AccessTools.Property(typeof(global::Player), "planetData").SetValue(GameMain.mainPlayer, tmpData, null); AccessTools.Field(typeof(PlayerAction_Build), "planetPhysics").SetValue(GameMain.mainPlayer.controller.actionBuild, tmpPlanetPhysics); AccessTools.Field(typeof(PlayerAction_Build), "factory").SetValue(GameMain.mainPlayer.controller.actionBuild, tmpFactory); AccessTools.Field(typeof(PlayerAction_Build), "nearcdLogic").SetValue(GameMain.mainPlayer.controller.actionBuild, tmpNearcdLogic); } GameMain.mainPlayer.mecha.buildArea = tmpBuildArea; FactoryManager.EventFactory = null; } pab.buildPreviews = tmpList; pab.waitConfirm = tmpConfirm; pab.previewPose.position = tmpPos; pab.previewPose.rotation = tmpRot; } }
public void ProcessPacket(CreatePrebuildsRequest packet, NebulaConnection conn) { PlanetData planet = GameMain.galaxy.PlanetById(packet.PlanetId); if (planet.factory == null) { // We only execute the code if the client has loaded the factory at least once. // Else it will get it once it goes to the planet for the first time. return; } PlayerAction_Build pab = GameMain.mainPlayer.controller?.actionBuild; if (pab != null) { //Make backup of values that are overwritten List <BuildPreview> tmpList = pab.buildPreviews; bool tmpConfirm = pab.waitConfirm; UnityEngine.Vector3 tmpPos = pab.previewPose.position; UnityEngine.Quaternion tmpRot = pab.previewPose.rotation; PlanetFactory tmpFactory = (PlanetFactory)AccessTools.Field(typeof(PlayerAction_Build), "factory").GetValue(GameMain.mainPlayer.controller.actionBuild); PlanetPhysics tmpPlanetPhysics = (PlanetPhysics)AccessTools.Field(typeof(PlayerAction_Build), "planetPhysics").GetValue(pab); //Create Prebuilds from incomming packet pab.buildPreviews = packet.GetBuildPreviews(); pab.waitConfirm = true; using (FactoryManager.EventFromServer.On()) { FactoryManager.EventFactory = planet.factory; pab.previewPose.position = new UnityEngine.Vector3(packet.PosePosition.x, packet.PosePosition.y, packet.PosePosition.z); pab.previewPose.rotation = new UnityEngine.Quaternion(packet.PoseRotation.x, packet.PoseRotation.y, packet.PoseRotation.z, packet.PoseRotation.w); AccessTools.Field(typeof(PlayerAction_Build), "factory").SetValue(GameMain.mainPlayer.controller.actionBuild, planet.factory); //Create temporary physics for spawning building's colliders if (planet.physics == null || planet.physics.colChunks == null) { planet.physics = new PlanetPhysics(planet); planet.physics.Init(); } if (BeltManager.GetCargoTraffic(planet.factory.cargoTraffic) == null) { planet.factory.cargoTraffic.CreateRenderingBatches(); } //Take item from the inventory if player is author of the build if (packet.AuthorId == LocalPlayer.PlayerId) { foreach (BuildPreview buildPreview in pab.buildPreviews) { if (GameMain.mainPlayer.inhandItemId == buildPreview.item.ID && GameMain.mainPlayer.inhandItemCount > 0) { GameMain.mainPlayer.UseHandItems(1); } else { int num = 1; GameMain.mainPlayer.package.TakeTailItems(ref buildPreview.item.ID, ref num, false); } } } AccessTools.Field(typeof(PlayerAction_Build), "planetPhysics").SetValue(GameMain.mainPlayer.controller.actionBuild, planet.physics); pab.CreatePrebuilds(); FactoryManager.EventFactory = null; } //Author has to call this for the continuous belt building if (packet.AuthorId == LocalPlayer.PlayerId) { pab.AfterPrebuild(); } //Revert changes back AccessTools.Field(typeof(PlayerAction_Build), "planetPhysics").SetValue(GameMain.mainPlayer.controller.actionBuild, tmpPlanetPhysics); AccessTools.Field(typeof(PlayerAction_Build), "factory").SetValue(GameMain.mainPlayer.controller.actionBuild, tmpFactory); pab.buildPreviews = tmpList; pab.waitConfirm = tmpConfirm; pab.previewPose.position = tmpPos; pab.previewPose.rotation = tmpRot; } }
void Start() { itemAnchor = transform.Find("Plate/ItemAnchor"); beltManager = GameObject.FindGameObjectWithTag("BeltManager").GetComponent <BeltManager>(); animator = GetComponent <Animator>(); }