public override void HandlePacket(BinaryReader reader, int whoAmI) { PacketMessageType msgType = (PacketMessageType)reader.ReadByte(); Player player; PlayerAssist modPlayer; switch (msgType) { // Sent from Client to Server case PacketMessageType.RequestHideBoss: //if (Main.netMode == NetmodeID.MultiplayerClient) //{ // Main.NewText("Huh? RequestHideBoss on client?"); //} string bossKey = reader.ReadString(); bool hide = reader.ReadBoolean(); if (hide) { WorldAssist.HiddenBosses.Add(bossKey); } else { WorldAssist.HiddenBosses.Remove(bossKey); } if (Main.netMode == NetmodeID.Server) { NetMessage.SendData(MessageID.WorldData); } //else // ErrorLogger.Log("BossChecklist: Why is RequestHideBoss on Client/SP?"); break; case PacketMessageType.RequestClearHidden: //if (Main.netMode == NetmodeID.MultiplayerClient) //{ // Main.NewText("Huh? RequestClearHidden on client?"); //} WorldAssist.HiddenBosses.Clear(); if (Main.netMode == NetmodeID.Server) { NetMessage.SendData(MessageID.WorldData); } //else // ErrorLogger.Log("BossChecklist: Why is RequestHideBoss on Client/SP?"); break; case PacketMessageType.SendRecordsToServer: player = Main.player[whoAmI]; Console.WriteLine($"Receiving boss records from the joined player {player.name}!"); for (int i = 0; i < bossTracker.SortedBosses.Count; i++) { BossStats bossStats = ServerCollectedRecords[whoAmI][i]; bossStats.kills = reader.ReadInt32(); bossStats.deaths = reader.ReadInt32(); bossStats.durationBest = reader.ReadInt32(); bossStats.durationPrev = reader.ReadInt32(); bossStats.healthLossBest = reader.ReadInt32(); bossStats.healthLossPrev = reader.ReadInt32(); bossStats.hitsTakenBest = reader.ReadInt32(); bossStats.hitsTakenPrev = reader.ReadInt32(); bossStats.dodgeTimeBest = reader.ReadInt32(); //Console.WriteLine($"Establishing {player.name}'s records for {bossTracker.SortedBosses[i].name} to the server"); } break; case PacketMessageType.RecordUpdate: player = Main.LocalPlayer; modPlayer = player.GetModPlayer <PlayerAssist>(); //Server just sent us information about what boss just got killed and its records shall be updated //Since we did packet.Send(toClient: i);, you can use LocalPlayer here int npcPos = reader.ReadInt32(); BossStats specificRecord = modPlayer.AllBossRecords[npcPos].stat; // Get the Player's records specificRecord.NetRecieve(reader, player, npcPos); // The records will be updated through the reader (player and npcPos needed for new record) //Update the serverrecords too so they can be used later // TODO? send it as a single entry? ModPacket packet = GetPacket(); packet.Write((byte)PacketMessageType.SendRecordsToServer); for (int i = 0; i < bossTracker.SortedBosses.Count; i++) { BossStats stat = modPlayer.AllBossRecords[i].stat; packet.Write(stat.kills); packet.Write(stat.deaths); packet.Write(stat.durationBest); packet.Write(stat.durationPrev); packet.Write(stat.hitsTakenBest); packet.Write(stat.hitsTakenPrev); packet.Write(stat.dodgeTimeBest); packet.Write(stat.healthLossBest); packet.Write(stat.healthLossPrev); } packet.Send(); // To server (ORDER MATTERS FOR reader) break; case (PacketMessageType.WorldRecordUpdate): npcPos = reader.ReadInt32(); WorldStats worldRecords = WorldAssist.worldRecords[npcPos].stat; // Get the Player's records worldRecords.NetRecieve(reader); // The records will be updated through the reader (player and npcPos needed for new record) break; default: Logger.Error("Unknown Message type: " + msgType); break; } }