private static void ProcessRestoreTilesRequest(ref BinaryReader reader, int playerNumber) { if (Network.Players[playerNumber].Group.IsAdmin) { int playerID = reader.ReadInt32(); bool onlinePlayer = reader.ReadBoolean(); if (onlinePlayer) { playerID = Network.Players[playerID].ID; } TileChangeController.RestoreTileChangesMadeByPlayer(playerID); } }
//public static byte HEROsModNetworkMessageType //{ // get { return (byte)(Main.maxMsg - 1); } //} public static void InitializeWorld() { if (NetworkMode == NetworkMode.Server) { TileLastChangedBy = new int[Main.maxTilesX, Main.maxTilesY]; for (int x = 0; x < TileLastChangedBy.GetLength(0); x++) { for (int y = 0; y < TileLastChangedBy.GetLength(1); y++) { TileLastChangedBy[x, y] = -1; } } TileChangeController.Init(); Groups = DatabaseController.GetGroups(); Regions = DatabaseController.GetRegions(); } }
// TODO -- How will any of these work....? public static bool CheckIncomingDataForHEROsModMessage(ref byte msgType, ref BinaryReader binaryReader, int playerNumber) { long readerPos = binaryReader.BaseStream.Position; switch (msgType) { case 12: if (NetworkMode == NetworkMode.Server) { //if (CTF.CaptureTheFlag.GameInProgress && Netplay.Clients[playerNumber].State == 10) //{ // if (Players[playerNumber].CTFTeam != CTF.TeamColor.None) // { // CTF.CTFMessages.SendPlayerToSpawnPlatform(Players[playerNumber]); // return true; // } //} if (Netplay.Clients[playerNumber].State == 3) { PlayerJoined(playerNumber); } } break; //case 14: // if (NetworkMode != global::HEROsModMod.NetworkMode.Server) // { // if (CTF.CaptureTheFlag.GameInProgress) // { // int index = (int)binaryReader.ReadByte(); // byte active = binaryReader.ReadByte(); // if (Players[index].CTFTeam == CTF.TeamColor.None && active == 1 && Players[index].GameInstance.ghost) // { // return true; // } // } // } // break; case 17: //Terrain Modified if (NetworkMode == NetworkMode.Server) { bool canBuild = false; TileModifyType tileModifyType = (TileModifyType)binaryReader.ReadByte(); int x = (int)binaryReader.ReadInt16(); int y = (int)binaryReader.ReadInt16(); short placeType = binaryReader.ReadInt16(); int style = (int)binaryReader.ReadByte(); bool fail = placeType == 1; HEROsModPlayer player = Players[playerNumber]; Tile tile; if (x >= 0 && y >= 0 && x < Main.maxTilesX && y < Main.maxTilesY) { tile = Main.tile[x, y]; } else { binaryReader.BaseStream.Position = readerPos; return(false); } //if (CTF.CaptureTheFlag.GameInProgress && player.CTFTeam != CTF.TeamColor.None && CTF.CaptureTheFlag.AllowTerrainModification) //{ // canBuild = true; // if (CTF.CaptureTheFlag.ListeningForTileChanges) // { // Tile backupTile = CTF.CaptureTheFlag.ModifiedTiles[x, y]; // if (backupTile == null) // { // CTF.CaptureTheFlag.ModifiedTiles[x, y] = new Tile(); // CTF.CaptureTheFlag.ModifiedTiles[x, y].CopyFrom(tile); // Console.WriteLine("tile added"); // } // } //} if (!canBuild) { canBuild = PlayerHasPermissionToBuildAtBlock(player, x, y); } if (tileModifyType == TileModifyType.PlaceTile && placeType == TileID.LandMine) { SendTextToPlayer("Landmines are disabled on this server", playerNumber, Color.Red); } else if (canBuild) { TileLastChangedBy[x, y] = player.ID; binaryReader.BaseStream.Position = readerPos; if (tileModifyType == TileModifyType.KillTile) { LastTileKilledBy = player; WorldGen.KillTile(x, y, fail, false, false); NetMessage.SendData(17, -1, playerNumber, null, (int)tileModifyType, (float)x, (float)y, (float)placeType, style); LastTileKilledBy = null; return(true); } else { TileChangeController.RecordChanges(player, x, y); } return(false); } else { SendTextToPlayer("You do not have permission to build here", playerNumber, Color.Red); } switch (tileModifyType) { case TileModifyType.KillTile: NetMessage.SendData(17, playerNumber, -1, null, (int)TileModifyType.PlaceTile, (float)x, (float)y, (float)tile.type, tile.slope()); break; case TileModifyType.PlaceTile: NetMessage.SendData(17, playerNumber, -1, null, (int)TileModifyType.KillTile, (float)x, (float)y, (float)placeType, style); break; case TileModifyType.KillWall: NetMessage.SendData(17, playerNumber, -1, null, (int)TileModifyType.PlaceWall, (float)x, (float)y, (float)tile.wall, style); break; case TileModifyType.PlaceWall: NetMessage.SendData(17, playerNumber, -1, null, (int)TileModifyType.KillWall, (float)x, (float)y, (float)placeType, style); break; case TileModifyType.KillTileNoItem: NetMessage.SendData(17, playerNumber, -1, null, (int)TileModifyType.PlaceTile, (float)x, (float)y, (float)tile.type, tile.slope()); break; case TileModifyType.PlaceWire: NetMessage.SendData(17, playerNumber, -1, null, (int)TileModifyType.KillWire, (float)x, (float)y, (float)placeType, style); break; case TileModifyType.PlaceWire2: NetMessage.SendData(17, playerNumber, -1, null, (int)TileModifyType.KillWire2, (float)x, (float)y, (float)placeType, style); break; case TileModifyType.PlaceWire3: NetMessage.SendData(17, playerNumber, -1, null, (int)TileModifyType.KillWire3, (float)x, (float)y, (float)placeType, style); break; case TileModifyType.KillWire: NetMessage.SendData(17, playerNumber, -1, null, (int)TileModifyType.PlaceWire, (float)x, (float)y, (float)placeType, style); break; case TileModifyType.KillWire2: NetMessage.SendData(17, playerNumber, -1, null, (int)TileModifyType.PlaceWire2, (float)x, (float)y, (float)placeType, style); break; case TileModifyType.KillWire3: NetMessage.SendData(17, playerNumber, -1, null, (int)TileModifyType.PlaceWire3, (float)x, (float)y, (float)placeType, style); break; case TileModifyType.KillActuator: NetMessage.SendData(17, playerNumber, -1, null, (int)TileModifyType.PlaceActuator, (float)x, (float)y, (float)placeType, style); break; case TileModifyType.PlaceActuator: NetMessage.SendData(17, playerNumber, -1, null, (int)TileModifyType.KillActuator, (float)x, (float)y, (float)placeType, style); break; case TileModifyType.PoundTile: NetMessage.SendData(17, playerNumber, -1, null, (int)TileModifyType.PoundTile, (float)x, (float)y, (float)placeType, tile.slope()); break; case TileModifyType.SlopeTile: NetMessage.SendData(17, playerNumber, -1, null, (int)TileModifyType.SlopeTile, (float)x, (float)y, (float)placeType, tile.slope()); break; } return(true); } break; /* case 25: //received a chat message * * binaryReader.ReadByte(); * Color color = binaryReader.ReadRGB(); * string text = binaryReader.ReadString(); * if (NetworkMode == NetworkMode.Client) * { * if (text == HEROsModCheckMessage) * { * ServerUsingHEROsMod = true; * HEROsMod.ServiceHotbar.Visible = true; * GeneralMessages.TellSereverImUsingHEROsMod(); * return true; * } * } * else if (NetworkMode == NetworkMode.Server) * { * if (text.Length > 1 && text.Substring(0, 1) == "/") * { * string[] parameters = text.Substring(1, text.Length - 1).Split(' '); * parameters[0] = parameters[0].ToLower(); * switch (parameters[0]) * { * case "auth": * if (parameters.Length != 2 || parameters[1].Length != 6) * { * SendTextToPlayer("Invalid Input", playerNumber); * return true; * } * string authStr = parameters[1]; * if (authStr == AuthCode.ToString()) * { * if (!Players[playerNumber].UsingHEROsMod) * { * SendTextToPlayer("You need HEROsMod Mod to use this feature", playerNumber); * return true; * } * if (Players[playerNumber].Username.Length > 0) * { * Players[playerNumber].Group = AdminGroup; * DatabaseController.SetPlayerGroup(Players[playerNumber].ID, Players[playerNumber].Group.ID); * LoginService.SendPlayerPermissions(playerNumber); * SendTextToPlayer("You are now Admin", playerNumber); * return true; * } * else * { * SendTextToPlayer("Please login first", playerNumber); * return true; * } * } * else * { * SendTextToPlayer("Invalid Auth Code", playerNumber); * return true; * } * case "login": * if (parameters.Length != 3) * { * SendTextToPlayer("Invalid Input", playerNumber); * return true; * } * LoginService.ProcessLoginRequest(parameters[1], parameters[2], playerNumber); * return true; * case "logout": * if (parameters.Length != 1) * { * SendTextToPlayer("Invalid Input", playerNumber); * return true; * } * LoginService.ProcessLogoutRequest(playerNumber); * return true; * case "register": * if (parameters.Length != 3) * { * SendTextToPlayer("Invalid Input", playerNumber); * return true; * } * LoginService.ProcessRegistrationRequest(parameters[1], parameters[2], playerNumber); * break; * case "help": * if (parameters.Length != 1) * { * SendTextToPlayer("Invalid Input", playerNumber); * } * SendTextToPlayer("/login <username> <password> - Login with your account", playerNumber); * SendTextToPlayer("/register <username> <password> - Create an account", playerNumber); * SendTextToPlayer("/logout - Logout of your account", playerNumber); * SendTextToPlayer("Use HEROsMod Mod to unlock all server features.", playerNumber); * break; * default: * SendTextToPlayer("Invalid Command, type /help for a list of commands.", playerNumber); * break; * * } * } * else * { * string text2 = text.ToLower(); * if (text2 == Lang.mp[6] || text2 == Lang.mp[21]) * { * string text3 = ""; * for (int i = 0; i < 255; i++) * { * if (Main.player[i].active) * { * if (text3 == "") * { * text3 = Main.player[i].name; * } * else * { * text3 = text3 + ", " + Main.player[i].name; * } * } * } * NetMessage.SendData(25, playerNumber, -1, Lang.mp[7] + " " + text3 + ".", 255, 255f, 240f, 20f, 0); * } * else if (text2.StartsWith("/me ")) * { * NetMessage.SendData(25, -1, -1, "*" + Main.player[playerNumber].name + " " + text.Substring(4), 255, 200f, 100f, 0f, 0); * } * else if (text2 == Lang.mp[8]) * { * NetMessage.SendData(25, -1, -1, string.Concat(new object[] * { * "*", * Main.player[playerNumber].name, * " ", * Lang.mp[9], * " ", * Main.rand.Next(1, 101) * }), 255, 255f, 240f, 20f, 0); * } * else if (text2.StartsWith("/p ")) * { * int num28 = Main.player[playerNumber].team; * color = Main.teamColor[num28]; * if (num28 != 0) * { * for (int i = 0; i < 255; i++) * { * if (Main.player[i].team == num28) * { * NetMessage.SendData(25, i, -1, text.Substring(3), 255, (float)color.R, (float)color.G, (float)color.B, 0); * } * } * } * else * { * NetMessage.SendData(25, playerNumber, -1, Lang.mp[10].ToNetworkText(), 255, 255f, 240f, 20f, 0); * } * } * else * { * return false; * // why are chat messages randomized? * //color = chatColor[chatColorIndex]; * //chatColorIndex++; * //if (chatColorIndex >= chatColor.Length) chatColorIndex = 0; * //NetMessage.SendData(25, -1, -1, text, 255, (float)color.R, (float)color.G, (float)color.B, 0); * //if (Main.dedServ) * //{ * // Console.WriteLine("<" + Main.player[playerNumber].name + "> " + text); * //} * } * } * return true; * } * break;*/ //case 27: // if (ItemBanner.ItemsBanned && !Players[playerNumber].Group.IsAdmin) // { // int projIdentity = (int)binaryReader.ReadInt16(); // Vector2 position = binaryReader.ReadVector2(); // Vector2 velocity = binaryReader.ReadVector2(); // float knockback = binaryReader.ReadSingle(); // int damage = (int)binaryReader.ReadInt16(); // int owner = (int)binaryReader.ReadByte(); // int type = (int)binaryReader.ReadInt16(); // Console.WriteLine("Prof: " + type); // int[] bannedProjectiles = ItemBanner.bannedProjectiles; // for (int i = 0; i < bannedProjectiles.Length; i++) // { // if (bannedProjectiles[i] == type) // { // Projectile newProj = new Projectile(); // newProj.SetDefaults(type); // SendTextToPlayer(newProj.name + " is banned on the server", playerNumber, Color.Red); // int projIndex = 0; // for (int j = 0; j < 1000; j++) // { // if (!Main.projectile[j].active) // { // Projectile proj = Main.projectile[j]; // proj.owner = owner; // projIndex = j; // break; // } // } // NetMessage.SendData(27, playerNumber, -1, "", projIndex); // NetMessage.SendData(29, playerNumber, -1, "", projIdentity, (float)owner); // return true; // } // } // } // break; //case 30: // if (NetworkMode == global::HEROsModMod.NetworkMode.Server) // { // if (CTF.CaptureTheFlag.GameInProgress) // { // SendTextToPlayer("You cannot change your hostility while Capture the Flag is in progress.", playerNumber); // CTF.CaptureTheFlag.SetPlayerHostility(Players[playerNumber]); // return true; // } // } // break; //case 45: // if (NetworkMode == global::HEROsModMod.NetworkMode.Server) // { // if (CTF.CaptureTheFlag.GameInProgress) // { // SendTextToPlayer("You cannot change parties while Capture the Flag is in progress.", playerNumber); // CTF.CaptureTheFlag.SetPlayerHostility(Players[playerNumber]); // return true; // } // } // break; case 63: //block painted if (NetworkMode == global::HEROsMod.NetworkMode.Server) { int x = (int)binaryReader.ReadInt16(); int y = (int)binaryReader.ReadInt16(); byte paintColor = binaryReader.ReadByte(); HEROsModPlayer player = Players[playerNumber]; if (PlayerHasPermissionToBuildAtBlock(player, x, y)) { TileLastChangedBy[x, y] = player.ID; binaryReader.BaseStream.Position = readerPos; return(false); } else { NetMessage.SendData(63, playerNumber, -1, null, x, (float)y, (float)Main.tile[x, y].color()); SendTextToPlayer("You do not have permission to build here", playerNumber, Color.Red); return(true); } } break; case 64: //wall painted if (NetworkMode == global::HEROsMod.NetworkMode.Server) { int x = (int)binaryReader.ReadInt16(); int y = (int)binaryReader.ReadInt16(); byte paintColor = binaryReader.ReadByte(); HEROsModPlayer player = Players[playerNumber]; if (PlayerHasPermissionToBuildAtBlock(player, x, y)) { TileLastChangedBy[x, y] = player.ID; binaryReader.BaseStream.Position = readerPos; return(false); } else { NetMessage.SendData(64, playerNumber, -1, null, x, (float)y, (float)Main.tile[x, y].wallColor()); SendTextToPlayer("You do not have permission to build here", playerNumber, Color.Red); return(true); } } break; } //if (msgType == HEROsModNetworkMessageType) //{ // //We found a HEROsMod only message // MessageType subMsgType = (MessageType)binaryReader.ReadByte(); // switch(subMsgType) // { // case MessageType.GeneralMessage: // GeneralMessages.ProcessData(ref binaryReader, playerNumber); // break; // case MessageType.LoginMessage: // LoginService.ProcessData(ref binaryReader, playerNumber); // break; // case MessageType.CTFMessage: // CTF.CTFMessages.ProcessData(ref binaryReader, playerNumber); // break; // } //} //we need to set the stream position back to where it was before we got it binaryReader.BaseStream.Position = readerPos; return(false); }