from direct.directnotify import DirectNotifyGlobal from direct.gui.DirectGui import * from direct.task.Task import Task from pandac.PandaModules import * from toontown.distributed import ToontownDistrictStats from toontown.hood import ZoneUtil from toontown.shtiker import ShtikerPage from toontown.coghq import CogDisguiseGlobals from toontown.suit import SuitDNA from toontown.suit import Suit from toontown.toonbase import TTLocalizer from toontown.toonbase import ToontownGlobals from toontown.toontowngui import TTDialog ICON_COLORS = (Vec4(0.863, 0.776, 0.769, 1.0), Vec4(0.749, 0.776, 0.824, 1.0), Vec4(0.749, 0.769, 0.749, 1.0), Vec4(0.843, 0.745, 0.745, 1.0)) POP_COLORS = (Vec4(0.4, 0.4, 1.0, 1.0), Vec4(0.4, 1.0, 0.4, 1.0), Vec4(1.0, 0.4, 0.4, 1.0)) def compareShardTuples(a, b): if a[1] < b[1]: return -1 elif b[1] < a[1]: return 1 else: return 0 def setupInvasionMarkerAny(node): pass # TODO def setupInvasionMarker(node, invasionStatus): if node.find('**/*invasion-marker'): return markerNode = node.attachNewNode('invasion-marker') if invasionStatus == 5: setupInvasionMarkerAny(markerNode) return icons = loader.loadModel('phase_3/models/gui/cog_icons') if invasionStatus == 1: icon = icons.find('**/CorpIcon').copyTo(markerNode) elif invasionStatus == 2: icon = icons.find('**/LegalIcon').copyTo(markerNode) elif invasionStatus == 3: icon = icons.find('**/MoneyIcon').copyTo(markerNode) else: icon = icons.find('**/SalesIcon').copyTo(markerNode) icons.removeNode() icon.setColor(ICON_COLORS[invasionStatus - 1]) icon.setPos(0.50, 0, 0.01225) icon.setScale(0.0535) def removeInvasionMarker(node): markerNode = node.find('**/*invasion-marker') if not markerNode.isEmpty(): markerNode.removeNode() class ShardPage(ShtikerPage.ShtikerPage): notify = DirectNotifyGlobal.directNotify.newCategory('ShardPage') def __init__(self): ShtikerPage.ShtikerPage.__init__(self) self.shardButtonMap = {} self.shardButtons = [] self.scrollList = None self.currentBTL = None self.currentBTR = None self.textRolloverColor = Vec4(1, 1, 0, 1) self.textDownColor = Vec4(0.5, 0.9, 1, 1) self.textDisabledColor = Vec4(0.4, 0.8, 0.4, 1) self.ShardInfoUpdateInterval = 5.0 self.lowPop = config.GetInt('shard-low-pop', 150) self.midPop = config.GetInt('shard-mid-pop', 300) self.highPop = -1 self.showPop = config.GetBool('show-population', 0) self.showTotalPop = config.GetBool('show-total-population', 0) self.noTeleport = config.GetBool('shard-page-disable', 0) self.groupTypes = ['VP Group', 'CFO Group', 'CJ Group', 'CEO Group'] self.shardGroups = None self.currentGroupJoined = None def load(self): main_text_scale = 0.06 title_text_scale = 0.12 self.title = DirectLabel(parent=self, relief=None, text=TTLocalizer.ShardPageTitle, text_scale=title_text_scale, textMayChange=0, pos=(0, 0, 0.6)) helpText_ycoord = 0.403 self.helpText = DirectLabel(parent=self, relief=None, text='', text_scale=main_text_scale, text_wordwrap=12, text_align=TextNode.ALeft, textMayChange=1, pos=(0.058, 0, helpText_ycoord)) shardPop_ycoord = helpText_ycoord - 0.523 totalPop_ycoord = shardPop_ycoord - 0.44 self.districtInfo = NodePath('Selected-Shard-Info') self.districtInfo.reparentTo(self) self.totalPopulationText = DirectLabel(parent=self.districtInfo, relief=None, text=TTLocalizer.ShardPagePopulationTotal % 1, text_scale=main_text_scale, text_wordwrap=8, textMayChange=1, text_align=TextNode.ACenter, pos=(0.4247, 0, totalPop_ycoord)) if self.showTotalPop: self.totalPopulationText.show() else: self.totalPopulationText.hide() self.gui = loader.loadModel('phase_3.5/models/gui/friendslist_gui') self.listXorigin = -0.02 self.listFrameSizeX = 0.67 self.listZorigin = -0.96 self.listFrameSizeZ = 1.04 self.arrowButtonScale = 1.3 self.itemFrameXorigin = -0.247 self.itemFrameZorigin = 0.365 self.buttonXstart = self.itemFrameXorigin + 0.293 self.regenerateScrollList() scrollTitle = DirectFrame(parent=self.scrollList, text=TTLocalizer.ShardPageScrollTitle, text_scale=main_text_scale, text_align=TextNode.ACenter, relief=None, pos=(self.buttonXstart, 0, self.itemFrameZorigin + 0.127)) def firstLoadShard(self, buttonTuple): curShardTuples = base.cr.listActiveShards() curShardTuples.sort(compareShardTuples) actualShardId = base.localAvatar.defaultShard base.cr.groupManager.d_getInfo(1) for i in xrange(len(curShardTuples)): shardId, name, pop, WVPop, invasionStatus = curShardTuples[i] if shardId == actualShardId: self.currentBTL = buttonTuple[1] self.currentBTR = buttonTuple[2] self.currentBTL['state'] = DGG.DISABLED self.currentBTR['state'] = DGG.DISABLED self.reloadRightBrain(pop, name, shardId, buttonTuple) def unload(self): self.gui.removeNode() del self.title self.scrollList.destroy() del self.scrollList del self.shardButtons taskMgr.remove('ShardPageUpdateTask-doLater') ShtikerPage.ShtikerPage.unload(self) def regenerateScrollList(self): selectedIndex = 0 if self.scrollList: selectedIndex = self.scrollList.getSelectedIndex() for button in self.shardButtons: button.detachNode() self.scrollList.destroy() self.scrollList = None self.scrollList = DirectScrolledList(parent=self, relief=None, pos=(-0.51, 0, 0), incButton_image=(self.gui.find('**/FndsLst_ScrollUp'), self.gui.find('**/FndsLst_ScrollDN'), self.gui.find('**/FndsLst_ScrollUp_Rllvr'), self.gui.find('**/FndsLst_ScrollUp')), incButton_relief=None, incButton_scale=(self.arrowButtonScale, self.arrowButtonScale, -self.arrowButtonScale), incButton_pos=(self.buttonXstart + 0.005, 0, self.itemFrameZorigin - 1.000), incButton_image3_color=Vec4(1, 1, 1, 0.2), decButton_image=(self.gui.find('**/FndsLst_ScrollUp'), self.gui.find('**/FndsLst_ScrollDN'), self.gui.find('**/FndsLst_ScrollUp_Rllvr'), self.gui.find('**/FndsLst_ScrollUp')), decButton_relief=None, decButton_scale=(self.arrowButtonScale, self.arrowButtonScale, self.arrowButtonScale), decButton_pos=(self.buttonXstart, 0.0025, self.itemFrameZorigin + 0.130), decButton_image3_color=Vec4(1, 1, 1, 0.2), itemFrame_pos=(self.itemFrameXorigin, 0, self.itemFrameZorigin), itemFrame_scale=1.0, itemFrame_relief=DGG.SUNKEN, itemFrame_frameSize=(self.listXorigin, self.listXorigin + self.listFrameSizeX, self.listZorigin, self.listZorigin + self.listFrameSizeZ), itemFrame_frameColor=(0.85, 0.95, 1, 1), itemFrame_borderWidth=(0.01, 0.01), numItemsVisible=15, forceHeight=0.065, items=self.shardButtons) self.scrollList.scrollTo(selectedIndex) def askForShardInfoUpdate(self, task = None): ToontownDistrictStats.refresh('shardInfoUpdated') taskMgr.doMethodLater(self.ShardInfoUpdateInterval, self.askForShardInfoUpdate, 'ShardPageUpdateTask-doLater') return Task.done def makeShardButton(self, shardId, shardName, shardPop): shardButtonParent = DirectFrame() shardButtonL = DirectButton(parent=shardButtonParent, relief=None, text=shardName, text_scale=0.06, text_align=TextNode.ALeft, text_fg=Vec4(0, 0, 0, 1), text3_fg=self.textDisabledColor, text1_bg=self.textDownColor, text2_bg=self.textRolloverColor, textMayChange=0, command=self.reloadRightBrain) popText = str(shardPop) if popText is None: popText = '' model = loader.loadModel('phase_3.5/models/gui/matching_game_gui') button = model.find('**/minnieCircle') shardButtonR = DirectButton(parent=shardButtonParent, relief=None, image=button, image_scale=(0.3, 1, 0.3), image2_scale=(0.35, 1, 0.35), image_color=self.getPopColor(shardPop), pos=(0.58, 0, 0.0125), text=popText, text_scale=0.06, text_align=TextNode.ACenter, text_pos=(-0.215, -0.0165), text_fg=Vec4(0, 0, 0, 1), text3_fg=self.textDisabledColor, text1_bg=self.textRolloverColor, text2_bg=self.textRolloverColor, textMayChange=1, command=self.reloadRightBrain) model.removeNode() button.removeNode() invasionMarker = NodePath('InvasionMarker-%s' % shardId) invasionMarker.reparentTo(shardButtonParent) buttonTuple = (shardButtonParent, shardButtonR, shardButtonL, invasionMarker) shardButtonL['extraArgs'] = extraArgs=[shardPop, shardName, shardId, buttonTuple] shardButtonR['extraArgs'] = extraArgs=[shardPop, shardName, shardId, buttonTuple] return buttonTuple def makeGroupButton(self, shardId, groupType, groupPop, groupId): if not groupType in self.groupTypes: return groupButtonParent = DirectFrame() groupButtonL = DirectButton(parent=groupButtonParent, relief=None, text=groupType, text_pos=(0.0, -0.0225), text_scale=0.06, text_align=TextNode.ALeft, text_fg=Vec4(0, 0, 0, 1), text3_fg=self.textDisabledColor, text1_bg=self.textDownColor, text2_bg=self.textRolloverColor, textMayChange=0, command=self.joinGroup) popText = str(groupPop) if popText is None: return model = loader.loadModel('phase_3.5/models/gui/matching_game_gui') button = model.find('**/minnieCircle') groupButtonR = DirectButton(parent=groupButtonParent, relief=None, image=button, image_scale=(0.3, 1, 0.3), image2_scale=(0.35, 1, 0.35), image_color=Vec4(0, 0.8, 0, 1), pos=(0.58, 0, -0.0125), text=popText, text_scale=0.055, text_align=TextNode.ACenter, text_pos=(-0.00575, -0.0125), text_fg=Vec4(0, 0, 0, 1), text3_fg=Vec4(0, 0, 0, 1), text1_bg=self.textRolloverColor, text2_bg=self.textRolloverColor, textMayChange=1) leaveButton = DirectButton(parent=groupButtonParent, relief=None, image=button, image_scale=(0.3, 1, 0.3), image2_scale=(0.35, 1, 0.35), image_color=Vec4(0, 0.8, 0, 1), pos=(0.50, 0, -0.0125), text='Leave', text_scale=0.055, text_align=TextNode.ACenter, text_pos=(-0.00575, -0.0125), text_fg=Vec4(0, 0, 0, 0), text2_fg=Vec4(0, 0, 0, 1), command=self.leaveGroup) leaveButton.hide() model.removeNode() button.removeNode() buttonTuple = (groupButtonParent, groupButtonR, groupButtonL, leaveButton) groupButtonL['extraArgs'] = [shardId, groupId, buttonTuple] leaveButton['extraArgs'] = [shardId, groupId, buttonTuple] return buttonTuple def removeRightBrain(self): self.districtInfo.find('**/*district-info').removeNode() def reloadRightBrain(self, shardPop, shardName, shardId, buttonTuple): base.cr.groupManager.d_getInfo(1) self.currentRightBrain = (shardPop, shardName, shardId, buttonTuple) if self.districtInfo.find('**/*district-info'): self.removeRightBrain() if self.currentBTL: self.currentBTL['state'] = DGG.NORMAL if self.currentBTR: self.currentBTR['state'] = DGG.NORMAL popText = self.getPopText(shardPop) districtInfoNode = self.districtInfo.attachNewNode('district-info') self.districtStatusLabel = DirectLabel(parent=districtInfoNode, relief=None, pos=(0.4247, 0, 0.45), text=popText, text_scale=0.09, text_fg=Vec4(0, 0, 0, 1), textMayChange=1) pText = '%s Population: %s' % (shardName, str(shardPop)) self.populationStatusLabel = DirectLabel(parent=districtInfoNode, relief=None, pos=(0.4247, 0, 0.38), text=pText, text_scale=0.04, text_fg=Vec4(0, 0, 0, 1), textMayChange=1) tText = 'Teleport to\n%s' % shardName tImage = loader.loadModel('phase_4/models/gui/purchase_gui') tImage.setSz(1.35) self.shardTeleportButton = DirectButton(parent=districtInfoNode, relief=None, pos=(0.4247, 0, 0.25), image=(tImage.find('**/PurchScrn_BTN_UP'), tImage.find('**/PurchScrn_BTN_DN'), tImage.find('**/PurchScrn_BTN_RLVR')), text=tText, text_scale=0.065, text_pos=(0.0, 0.015), text_fg=Vec4(0, 0, 0, 1), textMayChange=1, command=self.choseShard, extraArgs=[shardId]) self.currentBTL = buttonTuple[1] self.currentBTR = buttonTuple[2] self.currentBTL['state'] = DGG.DISABLED self.currentBTR['state'] = DGG.DISABLED if shardId == self.getCurrentShardId(): self.shardTeleportButton['state'] = DGG.DISABLED if self.shardGroups is not None: for button in self.shardGroups: button.detachNode() self.shardGroups = [] base.cr.groupManager.d_getInfo(1) shardId = base.localAvatar.defaultShard - (base.localAvatar.defaultShard % 100000000 % 1000000) for gid, ginfo in base.cr.groupManager.groupStatus[shardId].items(): btuple = self.makeGroupButton(shardId, ginfo[0], len(ginfo[1]), gid) if base.localAvatar.doId in ginfo[1]: btuple[1]['state'] = DGG.DISABLED btuple[2]['state'] = DGG.DISABLED btuple[3].show() self.shardGroups.append(btuple[0]) self.districtGroups = DirectScrolledList(parent=districtInfoNode, relief=None, pos=(0.38, 0, -0.34), incButton_image=(self.gui.find('**/FndsLst_ScrollUp'), self.gui.find('**/FndsLst_ScrollDN'), self.gui.find('**/FndsLst_ScrollUp_Rllvr'), self.gui.find('**/FndsLst_ScrollUp')), incButton_relief=None, incButton_scale=(self.arrowButtonScale, self.arrowButtonScale, -self.arrowButtonScale), incButton_pos=(self.buttonXstart + 0.005, 0, -0.125), incButton_image3_color=Vec4(1, 1, 1, 0.2), decButton_image=(self.gui.find('**/FndsLst_ScrollUp'), self.gui.find('**/FndsLst_ScrollDN'), self.gui.find('**/FndsLst_ScrollUp_Rllvr'), self.gui.find('**/FndsLst_ScrollUp')), decButton_relief=None, decButton_scale=(self.arrowButtonScale, self.arrowButtonScale, self.arrowButtonScale), decButton_pos=(self.buttonXstart, 0.0025, 0.445), decButton_image3_color=Vec4(1, 1, 1, 0.2), itemFrame_pos=(self.itemFrameXorigin, 0, self.itemFrameZorigin), itemFrame_scale=1.0, itemFrame_relief=DGG.SUNKEN, itemFrame_frameSize=(self.listXorigin, (self.listXorigin + self.listFrameSizeX), self.listZorigin/2.1, (self.listZorigin + self.listFrameSizeZ)/2.1), itemFrame_frameColor=(0.85, 0.95, 1, 1), itemFrame_borderWidth=(0.01, 0.01), numItemsVisible=15, forceHeight=0.065, items=self.shardGroups) def joinGroup(self, shardId, groupId, buttonTuple): self.acceptOnce('confJoin', self.confirmJoinGroup, extraArgs=[shardId, groupId, buttonTuple]) self.joinDialog = TTDialog.TTGlobalDialog(message='Would you like to join this group?', doneEvent='confJoin', style=4) def rejectGroup(self, reason, suitType=0): self.acceptOnce('remRjD', self.doneReject) if reason == 1: self.rejectDialog = TTDialog.TTGlobalDialog(message='You need more suit parts!', doneEvent='remRjD', style=1) elif reason == 2: if suitType == 0: meritType = 'Stock Options' elif suitType == 1: meritType = 'Merits' elif suitType == 2: meritType = 'Cogbucks' elif suitType == 3: meritType = 'Notices' print(meritType, suitType, meritType[suitType]) self.rejectDialog = TTDialog.TTGlobalDialog(message='You need more %s!'%meritType, doneEvent='remRjD', style=1) elif reason == 3: self.rejectDialog = TTDialog.TTGlobalDialog(message='That group is full!', doneEvent='remRjD', style=1) elif reason == 4: self.rejectDialog = TTDialog.TTGlobalDialog(message='You\'re already in a group!', doneEvent='remRjD', style=1) elif reason == 5: self.rejectDialog = TTDialog.TTGlobalDialog(message='You can\'t leave the district while you\'re in a group!', doneEvent='remRjD', style=1) def doneReject(self): self.rejectDialog.cleanup() del self.rejectDialog def confirmJoinGroup(self, shardId, groupId, buttonTuple): doneStatus = self.joinDialog.doneStatus self.joinDialog.cleanup() del self.joinDialog if doneStatus is not 'ok': return for gid in base.cr.groupManager.groupStatus[shardId].keys(): if base.localAvatar.doId in base.cr.groupManager.groupStatus[shardId][gid][1]: self.rejectGroup(4) return if len(base.cr.groupManager.groupStatus[shardId][groupId][1]) >= 8: self.rejectGroup(3) return suitIdx = -1 if groupId == 10000: suitIdx = 0 elif groupId == 11000: suitIdx = 1 elif groupId == 12000: suitIdx = 2 elif groupId == 13000: suitIdx = 3 merits = base.localAvatar.cogMerits[suitIdx] if CogDisguiseGlobals.getTotalMerits(base.localAvatar, suitIdx) > merits: self.rejectGroup(2, suitIdx) return parts = base.localAvatar.getCogParts() if not CogDisguiseGlobals.isSuitComplete(parts, suitIdx): self.rejectGroup(1) return base.cr.groupManager.d_addPlayerId(shardId, groupId, base.localAvatar.doId) base.cr.groupManager.d_getInfo(1) try: place = base.cr.playGame.getPlace() except: try: place = base.cr.playGame.hood.loader.place except: place = base.cr.playGame.hood.place self.currentGroupJoined = [shardId, groupId] if ZoneUtil.getCanonicalHoodId(self.getCurrentZoneId()) == groupId: return base.cr.groupManager.d_getInfo(1) place.requestTeleport(groupId, groupId, shardId, -1) def leaveGroup(self, shardId, groupId, buttonTuple): self.acceptOnce('confLeave', self.confirmLeaveGroup, extraArgs=[shardId, groupId, buttonTuple]) self.joinDialog = TTDialog.TTGlobalDialog(message='Are you sure you want to leave this group?', doneEvent='confLeave', style=4) def confirmLeaveGroup(self, shardId, groupId, buttonTuple): doneStatus = self.joinDialog.doneStatus self.joinDialog.cleanup() del self.joinDialog if doneStatus is not 'ok': return self.currentGroupJoined = None if not base.localAvatar.doId in base.cr.groupManager.groupStatus[shardId][groupId][1]: return base.cr.groupManager.d_removePlayerId(shardId, groupId, base.localAvatar.doId) base.cr.groupManager.d_getInfo(1) try: place = base.cr.playGame.getPlace() except: try: place = base.cr.playGame.hood.loader.place except: place = base.cr.playGame.hood.place hoodId = -1 if groupId == 10000: hoodId = 1000 elif groupId == 11000: hoodId = 5000 elif groupId == 12000: hoodId = 9000 elif groupId == 13000: hoodId = 3000 base.cr.groupManager.d_getInfo(1) place.requestTeleport(hoodId, hoodId, shardId, -1) def getPopColor(self, pop): if pop <= self.lowPop: newColor = POP_COLORS[0] elif pop <= self.midPop: newColor = POP_COLORS[1] else: newColor = POP_COLORS[2] return newColor def getPopText(self, pop): if pop <= self.lowPop: popText = TTLocalizer.ShardPageLow elif pop <= self.midPop: popText = TTLocalizer.ShardPageMed else: popText = TTLocalizer.ShardPageHigh return popText def getPopChoiceHandler(self, pop): if pop <= self.midPop: if self.noTeleport and not self.showPop: handler = self.shardChoiceReject else: handler = self.choseShard elif self.showPop: handler = self.choseShard else: if localAvatar.adminAccess >= 200: handler = self.choseShard else: handler = self.shardChoiceReject return handler def getCurrentZoneId(self): try: zoneId = base.cr.playGame.getPlace().getZoneId() except: zoneId = None return zoneId def getCurrentShardId(self): zoneId = self.getCurrentZoneId() if zoneId != None and ZoneUtil.isWelcomeValley(zoneId): return ToontownGlobals.WelcomeValleyToken else: return base.localAvatar.defaultShard def createSuitHead(self, suitName): suitDNA = SuitDNA.SuitDNA() suitDNA.newSuit(suitName) suit = Suit.Suit() suit.setDNA(suitDNA) headParts = suit.getHeadParts() head = hidden.attachNewNode('head') for part in headParts: copyPart = part.copyTo(head) copyPart.setDepthTest(1) copyPart.setDepthWrite(1) self.fitGeometry(head, fFlip=1) suit.delete() suit = None return head def updateScrollList(self): curShardTuples = base.cr.listActiveShards() curShardTuples.sort(compareShardTuples) currentShardId = self.getCurrentShardId() actualShardId = base.localAvatar.defaultShard actualShardName = None anyChanges = 0 totalPop = 0 totalWVPop = 0 currentMap = {} self.shardButtons = [] for i in xrange(len(curShardTuples)): shardId, name, pop, WVPop, invasionStatus = curShardTuples[i] if shardId == actualShardId: actualShardName = name totalPop += pop totalWVPop += WVPop currentMap[shardId] = 1 buttonTuple = self.shardButtonMap.get(shardId) if buttonTuple == None: buttonTuple = self.makeShardButton(shardId, name, pop) self.shardButtonMap[shardId] = buttonTuple anyChanges = 1 else: buttonTuple[1]['image_color'] = self.getPopColor(pop) buttonTuple[1]['text'] = str(pop) buttonTuple[1]['command'] = self.reloadRightBrain buttonTuple[1]['extraArgs'] = [pop, name, shardId, buttonTuple] buttonTuple[2]['command'] = self.reloadRightBrain buttonTuple[2]['extraArgs'] = [pop, name, shardId, buttonTuple] self.shardButtons.append(buttonTuple[0]) if invasionStatus: setupInvasionMarker(buttonTuple[3], invasionStatus) else: removeInvasionMarker(buttonTuple[3]) for shardId, buttonTuple in self.shardButtonMap.items(): if shardId not in currentMap: buttonTuple[3].removeNode() buttonTuple[0].destroy() del self.shardButtonMap[shardId] anyChanges = 1 if anyChanges: self.regenerateScrollList() self.totalPopulationText['text'] = TTLocalizer.ShardPagePopulationTotal % totalPop helpText = TTLocalizer.ShardPageHelpIntro if actualShardName: helpText += TTLocalizer.ShardPageHelpWhere % actualShardName if not self.book.safeMode: helpText += TTLocalizer.ShardPageHelpMove def enter(self): base.cr.groupManager.d_getInfo(1) self.askForShardInfoUpdate() self.updateScrollList() currentShardId = self.getCurrentShardId() buttonTuple = self.shardButtonMap.get(currentShardId) if buttonTuple: i = self.shardButtons.index(buttonTuple[0]) self.scrollList.scrollTo(i, centered=1) self.firstLoadShard(buttonTuple) ShtikerPage.ShtikerPage.enter(self) self.accept('shardInfoUpdated', self.updateScrollList) def exit(self): for shardId, buttonTuple in self.shardButtonMap.items(): buttonTuple[1]['state'] = DGG.NORMAL buttonTuple[2]['state'] = DGG.NORMAL self.ignore('shardInfoUpdated') self.ignore('ShardPageConfirmDone') taskMgr.remove('ShardPageUpdateTask-doLater') ShtikerPage.ShtikerPage.exit(self) def shardChoiceReject(self, shardId): self.confirm = TTDialog.TTGlobalDialog(doneEvent='ShardPageConfirmDone', message=TTLocalizer.ShardPageChoiceReject, style=TTDialog.Acknowledge) self.confirm.show() self.accept('ShardPageConfirmDone', self.__handleConfirm) def __handleConfirm(self): self.ignore('ShardPageConfirmDone') self.confirm.cleanup() del self.confirm def choseShard(self, shardId): zoneId = self.getCurrentZoneId() canonicalHoodId = ZoneUtil.getCanonicalHoodId(base.localAvatar.lastHood) currentShardId = self.getCurrentShardId() if self.currentGroupJoined: self.rejectGroup(5) return if shardId == currentShardId: return elif shardId == base.localAvatar.defaultShard: self.doneStatus = {'mode': 'teleport', 'hood': canonicalHoodId} messenger.send(self.doneEvent) else: try: place = base.cr.playGame.getPlace() except: try: place = base.cr.playGame.hood.loader.place except: place = base.cr.playGame.hood.place place.requestTeleport(canonicalHoodId, canonicalHoodId, shardId, -1)