示例#1
0
        public void CheckRecordsMultiplayer(NPC npc, int recordIndex)
        {
            string[] newRecordHolders = new string[] { "", "", "" };
            int[]    newWorldRecords  = new int[] {
                WorldAssist.worldRecords[recordIndex].stat.durationWorld,
                WorldAssist.worldRecords[recordIndex].stat.hitsTakenWorld,
                WorldAssist.worldRecords[recordIndex].stat.dodgeTimeWorld,
                WorldAssist.worldRecords[recordIndex].stat.healthLossWorld,
                WorldAssist.worldRecords[recordIndex].stat.healthAtStartWorld,
            };
            for (int i = 0; i < 255; i++)
            {
                Player player = Main.player[i];

                // Players must be active AND have interacted with the boss AND cannot have recordingstats disabled
                if (!player.active || !npc.playerInteraction[i])
                {
                    continue;
                }
                PlayerAssist     modPlayer = player.GetModPlayer <PlayerAssist>();
                List <BossStats> list      = BossChecklist.ServerCollectedRecords[i];
                BossStats        oldRecord = list[recordIndex];

                // Establish the new records for comparing
                BossStats newRecord = new BossStats()
                {
                    durationPrev      = modPlayer.RecordTimers[recordIndex],
                    hitsTakenPrev     = modPlayer.AttackCounter[recordIndex],
                    dodgeTimePrev     = modPlayer.DodgeTimer[recordIndex],
                    healthLossPrev    = modPlayer.BrinkChecker[recordIndex],
                    healthAtStartPrev = modPlayer.MaxHealth[recordIndex]
                };

                // Setup player's last fight attempt numbers
                modPlayer.durationLastFight   = newRecord.durationPrev;
                modPlayer.hitsTakenLastFight  = newRecord.hitsTakenPrev;
                modPlayer.healthLossLastFight = newRecord.healthLossPrev;

                RecordID specificRecord = RecordID.None;
                // For each record type we check if its beats the current record or if it is not set already
                // If it is beaten, we add a flag to specificRecord to allow newRecord's numbers to override the current record
                if (newRecord.durationPrev < oldRecord.durationBest || oldRecord.durationBest <= 0)
                {
                    Console.WriteLine($"{player.name} set a new record for DURATION: {newRecord.durationPrev} (Previous Record: {oldRecord.durationBest})");
                    specificRecord        |= RecordID.ShortestFightTime;
                    oldRecord.durationPrev = oldRecord.durationBest;
                    oldRecord.durationBest = newRecord.durationPrev;
                }
                else
                {
                    oldRecord.durationPrev = newRecord.durationPrev;
                }

                if (newRecord.hitsTakenPrev < oldRecord.hitsTakenBest || oldRecord.hitsTakenBest < 0)
                {
                    Console.WriteLine($"{player.name} set a new record for HITS TAKEN: {newRecord.hitsTakenPrev} (Previous Record: {oldRecord.hitsTakenBest})");
                    specificRecord         |= RecordID.LeastHits;
                    oldRecord.hitsTakenPrev = oldRecord.hitsTakenBest;
                    oldRecord.hitsTakenBest = newRecord.hitsTakenPrev;
                }
                else
                {
                    oldRecord.hitsTakenPrev = newRecord.hitsTakenPrev;
                }

                if (newRecord.dodgeTimePrev > oldRecord.dodgeTimeBest || oldRecord.dodgeTimeBest <= 0)
                {
                    Console.WriteLine($"{player.name} set a new record for BEST DODGE TIME: {newRecord.dodgeTimePrev} (Previous Record: {oldRecord.dodgeTimeBest})");
                    specificRecord         |= RecordID.DodgeTime;
                    oldRecord.dodgeTimeBest = newRecord.dodgeTimePrev;
                }

                if (newRecord.healthLossPrev > oldRecord.healthLossBest || oldRecord.healthLossBest <= 0)
                {
                    Console.WriteLine($"{player.name} set a new record for BEST HEALTH: {newRecord.healthLossPrev} (Previous Record: {oldRecord.healthLossBest})");
                    specificRecord          |= RecordID.BestBrink;
                    oldRecord.healthLossPrev = oldRecord.healthLossBest;
                    oldRecord.healthLossBest = newRecord.healthLossPrev;
                }
                else
                {
                    oldRecord.healthLossPrev = newRecord.healthLossPrev;
                }

                // Make and send the packet
                ModPacket packet = mod.GetPacket();
                packet.Write((byte)PacketMessageType.RecordUpdate);
                packet.Write((int)recordIndex);            // Which boss record are we changing?
                newRecord.NetSend(packet, specificRecord); // Writes all the variables needed
                packet.Send(toClient: i);                  // We send to the player. Only they need to see their own records
            }
            if (newRecordHolders.Any(x => x != ""))
            {
                WorldStats worldStats     = WorldAssist.worldRecords[recordIndex].stat;
                RecordID   specificRecord = RecordID.None;
                if (newRecordHolders[0] != "")
                {
                    specificRecord           |= RecordID.ShortestFightTime;
                    worldStats.durationHolder = newRecordHolders[0];
                    worldStats.durationWorld  = newWorldRecords[0];
                }
                if (newRecordHolders[1] != "")
                {
                    specificRecord            |= RecordID.LeastHits;
                    worldStats.hitsTakenHolder = newRecordHolders[1];
                    worldStats.hitsTakenWorld  = newWorldRecords[1];
                    worldStats.dodgeTimeWorld  = newWorldRecords[2];
                }
                if (newRecordHolders[2] != "")
                {
                    specificRecord |= RecordID.BestBrink;
                    worldStats.healthLossHolder   = newRecordHolders[2];
                    worldStats.healthLossWorld    = newWorldRecords[3];
                    worldStats.healthAtStartWorld = newWorldRecords[4];
                }

                ModPacket packet = mod.GetPacket();
                packet.Write((byte)PacketMessageType.WorldRecordUpdate);
                packet.Write((int)recordIndex); // Which boss record are we changing?
                worldStats.NetSend(packet, specificRecord);
                packet.Send();                  // To server (world data for everyone)
            }
        }