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) } }