from operator import itemgetter from direct.directnotify import DirectNotifyGlobal from direct.distributed.DistributedObjectAI import DistributedObjectAI from toontown.toonbase import TTLocalizer class DistributedTrophyMgrAI(DistributedObjectAI): notify = DirectNotifyGlobal.directNotify.newCategory('DistributedTrophyMgrAI') def __init__(self, air): DistributedObjectAI.__init__(self, air) self.leaderInfo = ([], [], []) def requestTrophyScore(self): avId = self.air.getAvatarIdFromSender() av = self.air.doId2do.get(avId) if not av: return if avId not in self.leaderInfo[0]: return else: i = self.leaderInfo[0].index(avId) av.d_setTrophyScore(self.leaderInfo[2][i]) def getLeaderInfo(self): return self.leaderInfo def sort(self): scores = [] for avId in self.leaderInfo[0]: i = self.leaderInfo[0].index(avId) scores.append((avId, self.leaderInfo[1][i], self.leaderInfo[2][i])) scores.sort(key=itemgetter(2), reverse=True) avIds = [] names = [] numFloors = [] for avId, name, score in scores: avIds.append(avId) names.append(name) numFloors.append(score) self.leaderInfo = (avIds, names, numFloors) def addTrophy(self, avId, name, numFloors): if avId not in self.leaderInfo[0]: self.leaderInfo[0].append(avId) self.leaderInfo[1].append(name) self.leaderInfo[2].append(numFloors) else: i = self.leaderInfo[0].index(avId) self.leaderInfo[1][i] = name self.leaderInfo[2][i] += numFloors self.sort() messenger.send('leaderboardChanged') messenger.send('leaderboardFlush') av = self.air.doId2do.get(avId) if av: i = self.leaderInfo[0].index(avId) av.d_setTrophyScore(self.leaderInfo[2][i]) def removeTrophy(self, avId, numFloors): if avId in self.leaderInfo[0]: i = self.leaderInfo[0].index(avId) self.leaderInfo[2][i] -= numFloors av = self.air.doId2do.get(avId) if av: av.d_setTrophyScore(max(0, self.leaderInfo[2][i])) if self.leaderInfo[2][i] <= 0: del self.leaderInfo[0][i] del self.leaderInfo[1][i] del self.leaderInfo[2][i] self.sort() av = self.air.doId2do.get(avId) if av: av.d_setSystemMessage(0, TTLocalizer.RemoveTrophy) messenger.send('leaderboardChanged') messenger.send('leaderboardFlush') else: self.notify.warning('removeTrophy for av %s when av had no score!' % avId)