2015-06-23 18:11:48 -05:00
|
|
|
from panda3d.core import *
|
2015-03-03 16:10:12 -06:00
|
|
|
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),
|
2015-08-17 08:21:07 -05:00
|
|
|
State.State('noTeleport',
|
|
|
|
self.enterNoTeleport,
|
|
|
|
self.exitNoTeleport),
|
2015-03-03 16:10:12 -06:00
|
|
|
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()
|
2015-05-16 22:00:56 -05:00
|
|
|
base.cr.ttsFriendsManager.d_teleportQuery(self.avId)
|
2015-03-03 16:10:12 -06:00
|
|
|
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):
|
2015-08-17 08:21:07 -05:00
|
|
|
self['text'] = TTLocalizer.TeleportPanelIgnored % self.avName
|
2015-03-03 16:10:12 -06:00
|
|
|
self.bOk.show()
|
|
|
|
|
|
|
|
def exitIgnored(self):
|
|
|
|
self.bOk.hide()
|
2015-08-17 08:21:07 -05:00
|
|
|
|
|
|
|
def enterNoTeleport(self):
|
|
|
|
self['text'] = TTLocalizer.TeleportPanelNoTeleport % self.avName
|
|
|
|
self.bOk.show()
|
|
|
|
|
|
|
|
def exitNoTeleport(self):
|
|
|
|
self.bOk.hide()
|
2015-03-03 16:10:12 -06:00
|
|
|
|
|
|
|
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
|
2015-04-07 09:19:50 -05:00
|
|
|
canonicalHoodId = ZoneUtil.getCanonicalZoneId(hoodId)
|
2015-03-03 16:10:12 -06:00
|
|
|
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()
|
2015-04-07 09:19:50 -05:00
|
|
|
elif canonicalHoodId not in hoodsVisited + ToontownGlobals.HoodsAlwaysVisited:
|
2015-03-03 16:10:12 -06:00
|
|
|
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')
|
2015-08-17 08:21:07 -05:00
|
|
|
elif available == 3:
|
|
|
|
self.fsm.request('noTeleport')
|
2015-03-03 16:10:12 -06:00
|
|
|
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')
|