from panda3d.core import * from direct.gui.DirectGui import * from toontown.toonbase import ToontownGlobals from direct.showbase import DirectObject from direct.fsm import ClassicFSM, State from direct.fsm import State from direct.directnotify import DirectNotifyGlobal from otp.avatar.Avatar import teleportNotify import ToonAvatarDetailPanel from toontown.toonbase import TTLocalizer from toontown.hood import ZoneUtil globalTeleport = None def showTeleportPanel(avId, avName, avDisableName): global globalTeleport if globalTeleport != None: globalTeleport.cleanup() globalTeleport = None globalTeleport = ToonTeleportPanel(avId, avName, avDisableName) return def hideTeleportPanel(): global globalTeleport if globalTeleport != None: globalTeleport.cleanup() globalTeleport = None return def unloadTeleportPanel(): global globalTeleport if globalTeleport != None: globalTeleport.cleanup() globalTeleport = None return class ToonTeleportPanel(DirectFrame): notify = DirectNotifyGlobal.directNotify.newCategory('ToonTeleportPanel') def __init__(self, avId, avName, avDisableName): DirectFrame.__init__(self, pos=(-1.01, 0.1, -0.35), parent=base.a2dTopRight, image_color=ToontownGlobals.GlobalDialogColor, image_scale=(1.0, 1.0, 0.6), text='', text_wordwrap=13.5, text_scale=0.06, text_pos=(0.0, 0.18)) messenger.send('releaseDirector') self['image'] = DGG.getDefaultDialogGeom() self.avId = avId self.avName = avName self.avDisableName = avDisableName self.fsm = ClassicFSM.ClassicFSM('ToonTeleportPanel', [ State.State('off', self.enterOff, self.exitOff), State.State('begin', self.enterBegin, self.exitBegin), State.State('checkAvailability', self.enterCheckAvailability, self.exitCheckAvailability), State.State('notAvailable', self.enterNotAvailable, self.exitNotAvailable), State.State('ignored', self.enterIgnored, self.exitIgnored), State.State('noTeleport', self.enterNoTeleport, self.exitNoTeleport), State.State('notOnline', self.enterNotOnline, self.exitNotOnline), State.State('wentAway', self.enterWentAway, self.exitWentAway), State.State('self', self.enterSelf, self.exitSelf), State.State('unknownHood', self.enterUnknownHood, self.exitUnknownHood), State.State('otherShard', self.enterOtherShard, self.exitOtherShard), State.State('teleport', self.enterTeleport, self.exitTeleport)], 'off', 'off') from toontown.friends import FriendInviter FriendInviter.hideFriendInviter() ToonAvatarDetailPanel.hideAvatarDetail() buttons = loader.loadModel('phase_3/models/gui/dialog_box_buttons_gui') self.bOk = DirectButton(self, image=(buttons.find('**/ChtBx_OKBtn_UP'), buttons.find('**/ChtBx_OKBtn_DN'), buttons.find('**/ChtBx_OKBtn_Rllvr')), relief=None, text=TTLocalizer.TeleportPanelOK, text_scale=0.05, text_pos=(0.0, -0.1), pos=(0.0, 0.0, -0.1), command=self.__handleOk) self.bOk.hide() self.bCancel = DirectButton(self, image=(buttons.find('**/CloseBtn_UP'), buttons.find('**/CloseBtn_DN'), buttons.find('**/CloseBtn_Rllvr')), relief=None, text=TTLocalizer.TeleportPanelCancel, text_scale=0.05, text_pos=(0.0, -0.1), pos=(0.0, 0.0, -0.1), command=self.__handleCancel) self.bCancel.hide() self.bYes = DirectButton(self, image=(buttons.find('**/ChtBx_OKBtn_UP'), buttons.find('**/ChtBx_OKBtn_DN'), buttons.find('**/ChtBx_OKBtn_Rllvr')), relief=None, text=TTLocalizer.TeleportPanelYes, text_scale=0.05, text_pos=(0.0, -0.1), pos=(-0.15, 0.0, -0.15), command=self.__handleYes) self.bYes.hide() self.bNo = DirectButton(self, image=(buttons.find('**/CloseBtn_UP'), buttons.find('**/CloseBtn_DN'), buttons.find('**/CloseBtn_Rllvr')), relief=None, text=TTLocalizer.TeleportPanelNo, text_scale=0.05, text_pos=(0.0, -0.1), pos=(0.15, 0.0, -0.15), command=self.__handleNo) self.bNo.hide() buttons.removeNode() self.accept(self.avDisableName, self.__handleDisableAvatar) self.show() self.fsm.enterInitialState() self.fsm.request('begin') return def cleanup(self): self.fsm.request('off') del self.fsm self.ignore(self.avDisableName) self.destroy() def enterOff(self): pass def exitOff(self): pass def enterBegin(self): myId = base.localAvatar.doId if self.avId == myId: self.fsm.request('self') elif self.avId in base.cr.doId2do: self.fsm.request('checkAvailability') elif base.cr.isFriend(self.avId): if base.cr.isFriendOnline(self.avId): self.fsm.request('checkAvailability') else: self.fsm.request('notOnline') else: self.fsm.request('wentAway') def exitBegin(self): pass def enterCheckAvailability(self): myId = base.localAvatar.getDoId() base.cr.ttsFriendsManager.d_teleportQuery(self.avId) self['text'] = TTLocalizer.TeleportPanelCheckAvailability % self.avName self.accept('teleportResponse', self.__teleportResponse) self.bCancel.show() def exitCheckAvailability(self): self.ignore('teleportResponse') self.bCancel.hide() def enterNotAvailable(self): self['text'] = TTLocalizer.TeleportPanelNotAvailable % self.avName self.bOk.show() def exitNotAvailable(self): self.bOk.hide() def enterIgnored(self): self['text'] = TTLocalizer.TeleportPanelIgnored % self.avName self.bOk.show() def exitIgnored(self): self.bOk.hide() def enterNoTeleport(self): self['text'] = TTLocalizer.TeleportPanelNoTeleport % self.avName self.bOk.show() def exitNoTeleport(self): self.bOk.hide() def enterNotOnline(self): self['text'] = TTLocalizer.TeleportPanelNotOnline % self.avName self.bOk.show() def exitNotOnline(self): self.bOk.hide() def enterWentAway(self): self['text'] = TTLocalizer.TeleportPanelWentAway % self.avName self.bOk.show() def exitWentAway(self): self.bOk.hide() def enterUnknownHood(self, hoodId): self['text'] = TTLocalizer.TeleportPanelUnknownHood % base.cr.hoodMgr.getFullnameFromId(hoodId) self.bOk.show() def exitUnknownHood(self): self.bOk.hide() def enterSelf(self): self['text'] = TTLocalizer.TeleportPanelDenySelf self.bOk.show() def exitSelf(self): self.bOk.hide() def enterOtherShard(self, shardId, hoodId, zoneId): shardName = base.cr.getShardName(shardId) if shardName is None: self.fsm.request('notAvailable') return myShardName = base.cr.getShardName(base.localAvatar.defaultShard) pop = None for shard in base.cr.listActiveShards(): if shard[0] == shardId: pop = shard[2] self.bYes.show() self.bNo.show() if pop and pop > localAvatar.shardPage.midPop: self.notify.warning('Entering full shard: issuing performance warning') self['text'] = TTLocalizer.TeleportPanelBusyShard % {'avName': self.avName} self.bYes.hide() self.bNo.hide() self.bOk.show() else: self['text'] = TTLocalizer.TeleportPanelOtherShard % {'avName': self.avName, 'shardName': shardName, 'myShardName': myShardName} self.shardId = shardId self.hoodId = hoodId self.zoneId = zoneId def exitOtherShard(self): self.bYes.hide() self.bNo.hide() def enterTeleport(self, shardId, hoodId, zoneId): shardName = base.cr.getShardName(shardId) if shardName is None: shardName = 'unknown' hoodsVisited = base.localAvatar.hoodsVisited canonicalHoodId = ZoneUtil.getCanonicalZoneId(hoodId) if hoodId == ToontownGlobals.MyEstate: teleportNotify.debug('enterTeleport: estate') if shardId == base.localAvatar.defaultShard: shardId = None place = base.cr.playGame.getPlace() place.requestTeleport(hoodId, zoneId, shardId, self.avId) unloadTeleportPanel() elif canonicalHoodId not in hoodsVisited + ToontownGlobals.HoodsAlwaysVisited: teleportNotify.debug('enterTeleport: unknownHood') self.fsm.request('unknownHood', [hoodId]) else: if shardId == base.localAvatar.defaultShard: shardId = None teleportNotify.debug('enterTeleport: requesting teleport') place = base.cr.playGame.getPlace() place.requestTeleport(hoodId, zoneId, shardId, self.avId) unloadTeleportPanel() return def exitTeleport(self): pass def __handleOk(self): unloadTeleportPanel() def __handleCancel(self): unloadTeleportPanel() def __handleYes(self): self.fsm.request('teleport', [self.shardId, self.hoodId, self.zoneId]) def __handleNo(self): unloadTeleportPanel() def __teleportResponse(self, avId, available, shardId, hoodId, zoneId): teleportNotify.debug('__teleportResponse%s' % ((avId, available, shardId, hoodId, zoneId),)) if avId != self.avId: return if available == 0: teleportNotify.debug('__teleportResponse: not available') self.fsm.request('notAvailable') elif available == 2: teleportNotify.debug('__teleportResponse: ignored') self.fsm.request('ignored') elif available == 3: self.fsm.request('noTeleport') elif shardId != base.localAvatar.defaultShard: teleportNotify.debug('__teleportResponse: otherShard') self.fsm.request('otherShard', [shardId, hoodId, zoneId]) else: teleportNotify.debug('__teleportResponse: teleport') self.fsm.request('teleport', [shardId, hoodId, zoneId]) def __handleDisableAvatar(self): self.fsm.request('wentAway')