public static void DoGamble(Players.Player player) { if (player != null) { var priceItem = PickLoot(); ushort priceType; if (SPECIAL_SCIENCE.Equals(priceItem.Typename)) { Chat.Send(player, "Jackpot! Just found the solution to your current research"); ScienceManager.GetPlayerManager(player).AddActiveResearchProgress(1000000); } else if (SPECIAL_DEATH.Equals(priceItem.Typename)) { Chat.Send(player, "Fatal! Something inside killed you"); Players.TakeHit(player, 1000000); } else if (!ItemTypes.IndexLookup.TryGetIndex(priceItem.Typename, out priceType)) { Log.WriteError($"Unknown gambling price {priceItem.Typename} won by {player}"); Chat.Send(player, "I have bad feelings about this"); } else if (priceType == BuiltinBlocks.Air) { Chat.Send(player, "You found an empty box :-("); } else { Chat.Send(player, $"You found {priceItem.Amount} x {priceItem.Typename} as loot!"); if (!Inventory.GetInventory(player).TryAdd(priceType, priceItem.Amount)) { Stockpile.GetStockPile(player).Add(priceType, priceItem.Amount); } } } }
public static bool Prefix(ScienceManagerPlayer __instance, int progress) { Team team = TeamManager.GetTeamManager().GetTeam(__instance.Player); if (null == team) { return(true); } ScienceManagerPlayer fake_player_ScienceManager = ScienceManager.GetPlayerManager(team.fake_player); ResolvedResearchable research = ScienceManager.GetResearchable(__instance.ActiveResearch.research.GetKey()); if (fake_player_ScienceManager.HasCompleted(research)) { return(true); } if (fake_player_ScienceManager.ActiveResearch.research == __instance.ActiveResearch.research) { fake_player_ScienceManager.AddActiveResearchProgress(progress); } else { fake_player_ScienceManager.Select(research); fake_player_ScienceManager.AddActiveResearchProgress(progress); } return(true); }
public static void Postfix(ScienceManagerPlayer __instance) { //Not is fake_player if (__instance.Player.ID.type != NetworkID.IDType.Steam || __instance.Player.ID.steamID.GetEAccountType() != Steamworks.EAccountType.k_EAccountTypeAnonUser) { return; } ResolvedResearchable research = ScienceManager.GetResearchable(__instance.ActiveResearch.research.GetKey()); if (__instance.HasCompleted(research)) { foreach (Players.Player plr in TeamManager.GetTeamManager().GetTeamOfFakePlayer(__instance.Player).GetPlayers()) { ScienceManagerPlayer SMP = ScienceManager.GetPlayerManager(plr); if (null == SMP || SMP.HasCompleted(research)) { continue; } int addProgress = __instance.ActiveResearch.progress - SMP.ActiveResearch.progress; if (addProgress > 0) { if (__instance.ActiveResearch.research != SMP.ActiveResearch.research) { SMP.Select(research); } SMP.AddActiveResearchProgress(addProgress); } } } }
//Synchronization of research progess of the selected research public static void Postfix(ScienceManagerPlayer __instance) { //If NOT fake player if (__instance.Player.ID.type != NetworkID.IDType.Steam || __instance.Player.ID.steamID.GetEAccountType() != Steamworks.EAccountType.k_EAccountTypeAnonUser) { return; } ScienceManagerPlayer fake_player_ScienceManager = ScienceManager.GetPlayerManager(__instance.Player); if (!fake_player_ScienceManager.TryGetProgress(__instance.ActiveResearch.research, out ResearchProgress rp)) { return; } int addProgress = rp.progress - __instance.ActiveResearch.progress; if (addProgress > 0) { __instance.AddActiveResearchProgress(addProgress); } }
public static void SyncronizeResearch(Players.Player player, Players.Player fake_plater) { ScienceManagerPlayer player_ScienceManager = ScienceManager.GetPlayerManager(player); ScienceManagerPlayer fake_player_ScienceManager = ScienceManager.GetPlayerManager(fake_plater); List <ResearchProgress> plrinProgressResearch = player_ScienceManager.GetType().GetField("inProgressResearch", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(player_ScienceManager) as List <ResearchProgress>; List <ResearchProgress> fake_plrinProgressResearch = fake_player_ScienceManager.GetType().GetField("inProgressResearch", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(fake_player_ScienceManager) as List <ResearchProgress>; if (null == plrinProgressResearch && null == fake_plrinProgressResearch) { return; } if (null == fake_plrinProgressResearch) { Log.Write("<color=lime>Research from player to fakeplayer</color>"); fake_player_ScienceManager.GetType().GetField("inProgressResearch", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(fake_player_ScienceManager, plrinProgressResearch); foreach (ResearchProgress rp in plrinProgressResearch) { if (rp.research.GetResearchIterationCount() == rp.progress) { rp.research.OnResearchComplete(fake_player_ScienceManager, EResearchCompletionReason.Loaded); } } return; } if (null == plrinProgressResearch) { Log.Write("<color=lime>Research from fake_player to player</color>"); player_ScienceManager.GetType().GetField("inProgressResearch", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(player_ScienceManager, fake_plrinProgressResearch); foreach (ResearchProgress rp in fake_plrinProgressResearch) { if (rp.research.GetResearchIterationCount() == rp.progress) { rp.research.OnResearchComplete(player_ScienceManager, EResearchCompletionReason.Loaded); } } return; } foreach (ResearchProgress rpPlr in plrinProgressResearch) { bool contains = false; foreach (ResearchProgress rpFake_Plr in fake_plrinProgressResearch) { if (rpFake_Plr.research == rpPlr.research) { contains = true; if (rpPlr.progress > rpFake_Plr.progress) //Replace for the research with more progress { fake_plrinProgressResearch.Remove(rpFake_Plr); fake_plrinProgressResearch.Add(rpPlr); } break; } } if (!contains) { fake_plrinProgressResearch.Add(rpPlr); } } Log.Write("<color=lime>Synchronization</color>"); //Fake player synchronization fake_player_ScienceManager.GetType().GetField("inProgressResearch", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(fake_player_ScienceManager, fake_plrinProgressResearch); //Player synchronization player_ScienceManager.GetType().GetField("inProgressResearch", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(player_ScienceManager, fake_plrinProgressResearch); foreach (ResearchProgress rp in fake_plrinProgressResearch) { if (rp.research.GetResearchIterationCount() == rp.progress) { rp.research.OnResearchComplete(fake_player_ScienceManager, EResearchCompletionReason.Loaded); rp.research.OnResearchComplete(player_ScienceManager, EResearchCompletionReason.Loaded); } } }