public override void Entry(IModHelper helper) { Events = helper.Events; if (AntiCheat.HasIllegalMods()) { Game1.quit = true; Console.Clear(); Monitor.Log("You have an illegal mod installed. Please uninstall it before using this mod.", LogLevel.Warn); if (AntiCheat.IllegalMod != null) { Monitor.Log($"- '{AntiCheat.IllegalMod}'", LogLevel.Warn); } Monitor.Log("Press any key to continue...", LogLevel.Warn); Console.ReadKey(); return; } var config = helper.ReadConfig <ModConfig>(); if (config == null) { config = new ModConfig(); helper.WriteConfig(config); } Config = config; BRGame = new Game(helper, config); Patch.PatchAll("ilyaki.battleroyale"); try { //Remove player limit var multiplayer = helper.Reflection.GetField <Multiplayer>(typeof(Game1), "multiplayer").GetValue(); multiplayer.playerLimit = config.PlayerLimit;//250 is the Galaxy limit (it's multiplied by two for some reason, so set 125) }catch (Exception) { Monitor.Log("Error setting player limit. The max is 125", LogLevel.Error); } helper.ConsoleCommands.Add("br_start", "Start the game. Alternative to pressing Right control", (c, a) => { if (Game1.IsServer) { BRGame.ServerStartGame(); } }); Events.Input.ButtonPressed += (o, e) => { if (Game1.IsServer && e.Button.TryGetKeyboard(out Keys key) && key == Keys.RightControl) { BRGame.ServerStartGame(); } if (e.Button.TryGetKeyboard(out Keys key2) && key2 == Keys.RightAlt) { var loc = Game1.player.currentLocation; int x = Game1.player.getTileX(); int y = Game1.player.getTileY(); Monitor.Log($"tile location={loc.Name}, pos=({x},{y})", LogLevel.Info); Monitor.Log($"my id : {Game1.player.UniqueMultiplayerID}", LogLevel.Info); Monitor.Log($"precise position = {Game1.player.Position}", LogLevel.Info); /*Game1.player.addItemToInventory(new StardewValley.Tools.Slingshot()); * Game1.player.addItemToInventory(new StardewValley.Tools.Slingshot(33)); * * var xd = new int[] { 388, 390, 378, 380, 384, 382, 386, 441 }; * foreach(int asdf in xd) * { * Game1.player.addItemToInventory(new StardewValley.Object(asdf, 100)); * }*/ } }; Events.GameLoop.UpdateTicked += (o, e) => BRGame?.Update(Game1.currentGameTime); Events.GameLoop.UpdateTicked += (o, e) => HitShaker.Update(Game1.currentGameTime); Events.GameLoop.UpdateTicked += (o, e) => SpectatorMode.Update(); //https://github.com/funny-snek/Always-On-Server-for-Multiplayer/blob/master/Always%20On%20Server/ModEntry.cs string currentSavedInviteCode = ""; Events.GameLoop.UpdateTicked += (o, e) => { if (e.IsMultipleOf(60 * 5) && Game1.server != null && Game1.options.enableServer == true && !string.Equals(currentSavedInviteCode, Game1.server.getInviteCode())) { currentSavedInviteCode = Game1.server.getInviteCode(); try { //helper.DirectoryPath StreamWriter sw = new StreamWriter("InviteCode.txt"); //Should be in the same folder as StardewModdingAPI.exe sw.WriteLine(currentSavedInviteCode); sw.Close(); } catch (Exception b) { Console.WriteLine("Exception writing InviteCode: " + b.Message); } } }; Events.Player.Warped += (o, e) => { if (e.NewLocation != null && (e.NewLocation is StardewValley.Locations.Woods || e.NewLocation.Name == "BugLand")) { e.NewLocation.characters.Clear(); } }; Events.Display.RenderingHud += (o, e) => { if (!SpectatorMode.InSpectatorMode) { Storm.Draw(Game1.spriteBatch); } }; Events.Display.Rendered += (o, e) => { if (SpectatorMode.InSpectatorMode) //Spectator mode can only see the storm when it is drawn above everything { Storm.Draw(Game1.spriteBatch); if (Game1.activeClickableMenu == null) { string message = "Spectating"; SpriteText.drawStringWithScrollBackground(Game1.spriteBatch, message, Game1.viewport.Width / 2 - SpriteText.getWidthOfString(message) / 2, 16, "", 1f, -1); } } }; helper.ConsoleCommands.Add("br_kick", "Kick a player. Usage: br_kick <player ID>", (a, b) => { if (!Game1.IsServer) { Monitor.Log("Need to be the server host", LogLevel.Info); } else if (b.Length != 1) { Monitor.Log("Need 1 argument", LogLevel.Info); } else if (!long.TryParse(b[0], out long x)) { Monitor.Log("Not a valid number", LogLevel.Info); } else { try { var f = Game1.getOnlineFarmers().First(p => p != Game1.player && p.UniqueMultiplayerID == x); NetworkUtility.KickPlayer(f, "You have been kicked by the host."); } catch (Exception) { Monitor.Log($"Could not find player with id {x}", LogLevel.Info); } } }); helper.ConsoleCommands.Add("br_setNumberOfPlayerSlots", "Sets the number of player slots. Usage: br_setNumberOfPlayerSlots <number of slots>", (a, b) => { if (!Game1.IsServer) { Monitor.Log("Need to be the server host", LogLevel.Info); } else if (b.Length != 1) { Monitor.Log("Need 1 argument", LogLevel.Info); } else if (!int.TryParse(b[0], out int n)) { Monitor.Log("Not a valid number", LogLevel.Info); } else { n = Math.Abs(n); var emptyCabins = Game1.getFarm().buildings.Where(z => z.daysOfConstructionLeft.Value <= 0 && z.indoors.Value is Cabin).ToArray(); if (n > emptyCabins.Length) { for (int i = 0; i < n - emptyCabins.Length; i++) { var blueprint = new BluePrint("Log Cabin"); var building = new Building(blueprint, new Vector2(-10000, 0)); Game1.getFarm().buildings.Add(building); try { foreach (var warp in building.indoors.Value.warps) { //warp.TargetName = "Forest"; Helper.Reflection.GetField <NetString>(warp, "targetName", true).SetValue(new NetString("Forest")); warp.TargetX = 100; warp.TargetY = 20; } } catch (Exception) { } } Monitor.Log($"Added {n - emptyCabins.Length} player slots", LogLevel.Info); } else if (n < emptyCabins.Length) { for (int i = 0; i < emptyCabins.Length - n; i++) { Game1.getFarm().buildings.Remove(emptyCabins[i]); } Monitor.Log($"Removed {emptyCabins.Length - n} player slots", LogLevel.Info); } else { Monitor.Log($"There are already {n} player slots", LogLevel.Info); } } }); }
public bool ProcessPlayerJoin(NetFarmerRoot farmer) { var pl = ModEntry.BRGame.ModHelper.Multiplayer.GetConnectedPlayer(farmer.Value.UniqueMultiplayerID); if (!pl.HasSmapi) { Console.WriteLine("Kicking because does not have SMAPI"); SendChatMessageToPlayerWithoutMod(farmer.Value.UniqueMultiplayerID, "Read the instruction page before joining."); Game1.server.sendMessage(farmer.Value.UniqueMultiplayerID, new OutgoingMessage((byte)19, farmer.Value.UniqueMultiplayerID, new object[0])); Game1.server.playerDisconnected(farmer.Value.UniqueMultiplayerID); Game1.otherFarmers.Remove(farmer.Value.UniqueMultiplayerID); return(false); } Console.WriteLine($"Player joined with mods:"); foreach (IMultiplayerPeerMod mod in pl.Mods) { Console.WriteLine($" - '{mod.ID}' / '{mod.Name}' / '{mod.Version}'"); if (!AntiCheat.IsLegal(mod)) { Console.WriteLine($"^ found illegal mod"); SendChatMessageToPlayerWithoutMod(farmer.Value.UniqueMultiplayerID, $"Mod {mod.Name} is not permitted."); Game1.server.sendMessage(farmer.Value.UniqueMultiplayerID, new OutgoingMessage((byte)19, farmer.Value.UniqueMultiplayerID, new object[0])); Game1.server.playerDisconnected(farmer.Value.UniqueMultiplayerID); Game1.otherFarmers.Remove(farmer.Value.UniqueMultiplayerID); return(false); } } Task.Factory.StartNew(() => { System.Threading.Thread.Sleep(ModEntry.Config.TimeInMillisecondsBetweenPlayerJoiningAndServerExpectingTheirVersionNumber); if (playersToVersions.TryGetValue(farmer.Value.UniqueMultiplayerID, out var theirVersion)) { //Item1 = major, Item2 = minor, Item3 = sha var tp = GetMyVersion(); var major = tp.Item1; var minor = tp.Item2; var sha = tp.Item3; if (theirVersion.Item1 != major || theirVersion.Item2 != minor || !theirVersion.Item3.SequenceEqual(sha)) { //Kick them for wrong version playersToVersions.Remove(farmer.Value.UniqueMultiplayerID); KickPlayer(farmer.Value, $"Incompatible mod version. You need {major}.{minor}"); return; } } else { //They don't have the mod installed or they have glitched (or really slow internet?) Console.WriteLine("Kicking"); //KickPlayer(farmer.Value, $"Could not connect in time"); SendChatMessageToPlayerWithoutMod(farmer.Value.UniqueMultiplayerID, "Could not connect in time"); Game1.server.sendMessage(farmer.Value.UniqueMultiplayerID, new OutgoingMessage((byte)19, farmer.Value.UniqueMultiplayerID, new object[0])); Game1.server.playerDisconnected(farmer.Value.UniqueMultiplayerID); Game1.otherFarmers.Remove(farmer.Value.UniqueMultiplayerID); return; } }); return(true); }