示例#1
0
        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;
            }
        }