275 lines
11 KiB
Python
275 lines
11 KiB
Python
from direct.distributed import DistributedObject
|
|
from toontown.toonbase import ToontownGlobals
|
|
import MailboxGlobals
|
|
from toontown.catalog import CatalogItem
|
|
from toontown.catalog import CatalogItemList
|
|
from toontown.toontowngui import TTDialog
|
|
from toontown.toonbase import TTLocalizer
|
|
from toontown.catalog import MailboxScreen
|
|
from direct.directnotify.DirectNotifyGlobal import *
|
|
from direct.distributed.ClockDelta import *
|
|
from panda3d.core import *
|
|
import random
|
|
from direct.interval.IntervalGlobal import SoundInterval
|
|
FlagPitchEmpty = -70
|
|
FlagPitchFull = 0
|
|
|
|
class DistributedMailbox(DistributedObject.DistributedObject):
|
|
notify = directNotify.newCategory('DistributedMailbox')
|
|
|
|
def __init__(self, cr):
|
|
DistributedObject.DistributedObject.__init__(self, cr)
|
|
self.model = None
|
|
self.flag = None
|
|
self.flagIval = None
|
|
self.nameText = None
|
|
self.fullIndicator = 0
|
|
self.mailboxGui = None
|
|
self.mailboxDialog = None
|
|
self.mailboxSphereEvent = None
|
|
self.mailboxSphereEnterEvent = None
|
|
self.mailboxGuiDoneEvent = 'mailboxGuiDone'
|
|
return
|
|
|
|
def announceGenerate(self):
|
|
DistributedMailbox.notify.debug('announceGenerate')
|
|
DistributedObject.DistributedObject.announceGenerate(self)
|
|
self.mailboxSphereEvent = self.taskName('mailboxSphere')
|
|
self.mailboxSphereEnterEvent = 'enter' + self.mailboxSphereEvent
|
|
if self.houseId == base.localAvatar.houseId:
|
|
self.accept(self.mailboxSphereEnterEvent, self.__handleEnterSphere)
|
|
self.load()
|
|
|
|
def load(self):
|
|
DistributedMailbox.notify.debug('load')
|
|
randomGenerator = random.Random()
|
|
randomGenerator.seed(self.houseId)
|
|
r = randomGenerator.random()
|
|
g = randomGenerator.random()
|
|
b = randomGenerator.random()
|
|
self.nameColor = (r,
|
|
g,
|
|
b,
|
|
1)
|
|
houseNode = self.cr.playGame.hood.loader.houseNode[self.housePosInd]
|
|
estateNode = houseNode.getParent()
|
|
zOffset = 0
|
|
if self.housePosInd == 3:
|
|
zOffset = -1
|
|
elif self.housePosInd == 2:
|
|
zOffset = 0.5
|
|
self.model = loader.loadModel('phase_5.5/models/estate/mailboxHouse')
|
|
self.model.reparentTo(estateNode)
|
|
self.model.setPos(houseNode, 19, -4, 0 + zOffset)
|
|
self.model.setH(houseNode, 90)
|
|
self.flag = self.model.find('**/mailbox_flag')
|
|
if self.fullIndicator:
|
|
self.flag.setP(FlagPitchFull)
|
|
else:
|
|
self.flag.setP(FlagPitchEmpty)
|
|
self.__setupName()
|
|
collision = self.model.find('**/mailbox_collision')
|
|
collision.setName(self.mailboxSphereEvent)
|
|
|
|
def disable(self):
|
|
DistributedMailbox.notify.debug('disable')
|
|
self.notify.debug('disable')
|
|
self.ignoreAll()
|
|
if self.flagIval:
|
|
self.flagIval.finish()
|
|
self.flagIval = None
|
|
if self.model:
|
|
self.model.removeNode()
|
|
self.model = None
|
|
if self.nameText:
|
|
self.nameText.removeNode()
|
|
self.nameText = None
|
|
if self.mailboxGui:
|
|
self.mailboxGui.hide()
|
|
self.mailboxGui.unload()
|
|
self.mailboxGui = None
|
|
if self.mailboxDialog:
|
|
self.mailboxDialog.cleanup()
|
|
self.mailboxDialog = None
|
|
self.mailboxSphereEvent = None
|
|
self.mailboxSphereEnterEvent = None
|
|
DistributedObject.DistributedObject.disable(self)
|
|
return
|
|
|
|
def setHouseId(self, houseId):
|
|
DistributedMailbox.notify.debug('setHouseId( houseId=%d )' % houseId)
|
|
self.houseId = houseId
|
|
|
|
def setHousePos(self, housePosInd):
|
|
DistributedMailbox.notify.debug('setHousePos')
|
|
self.housePosInd = housePosInd
|
|
|
|
def setName(self, name):
|
|
DistributedMailbox.notify.debug('setName( name=%s )' % name)
|
|
self.name = name
|
|
|
|
def setFullIndicator(self, full):
|
|
DistributedMailbox.notify.debug('setFullIndicator( full=%s )' % full)
|
|
if self.fullIndicator != full:
|
|
self.fullIndicator = full
|
|
if self.flag:
|
|
if self.flagIval:
|
|
self.flagIval.pause()
|
|
self.flagIval = None
|
|
p = FlagPitchEmpty
|
|
if self.fullIndicator:
|
|
p = FlagPitchFull
|
|
self.flagIval = self.flag.hprInterval(0.5, VBase3(0, p, 0), blendType='easeInOut')
|
|
self.flagIval.start()
|
|
return
|
|
|
|
def __handleEnterSphere(self, collEntry):
|
|
DistributedMailbox.notify.debug('Entering Mailbox Sphere....')
|
|
self.ignore(self.mailboxSphereEnterEvent)
|
|
self.cr.playGame.getPlace().detectedMailboxCollision()
|
|
self.accept('mailboxAsleep', self.__handleMailboxSleep)
|
|
self.sendUpdate('avatarEnter', [])
|
|
|
|
def __handleMailboxSleep(self):
|
|
DistributedMailbox.notify.debug('Mailbox Sleep')
|
|
if self.mailboxGui:
|
|
self.mailboxGui.hide()
|
|
self.mailboxGui.unload()
|
|
self.mailboxGui = None
|
|
if self.mailboxDialog:
|
|
self.mailboxDialog.cleanup()
|
|
self.mailboxDialog = None
|
|
self.__handleMailboxDone()
|
|
return
|
|
|
|
def __handleMailboxDone(self):
|
|
DistributedMailbox.notify.debug('Mailbox Done')
|
|
self.sendUpdate('avatarExit', [])
|
|
self.ignore(self.mailboxGuiDoneEvent)
|
|
self.mailboxGui = None
|
|
return
|
|
|
|
def freeAvatar(self):
|
|
DistributedMailbox.notify.debug('freeAvatar')
|
|
self.notify.debug('freeAvatar')
|
|
curState = base.cr.playGame.getPlace().getState()
|
|
self.notify.debug('Estate.getState() == %s' % curState)
|
|
if not curState == 'stopped':
|
|
base.cr.playGame.getPlace().setState('walk')
|
|
self.ignore('mailboxAsleep')
|
|
self.accept(self.mailboxSphereEnterEvent, self.__handleEnterSphere)
|
|
|
|
def setMovie(self, mode, avId):
|
|
isLocalToon = avId == base.localAvatar.doId
|
|
if isLocalToon:
|
|
DistributedMailbox.notify.debug('setMovie( mode=%d, avId=%d ) called on a local toon' % (mode, avId))
|
|
else:
|
|
DistributedMailbox.notify.debug('setMovie( mode=%d, avId=%d ) called on a non-local toon' % (mode, avId))
|
|
if mode == MailboxGlobals.MAILBOX_MOVIE_CLEAR:
|
|
DistributedMailbox.notify.debug('setMovie: clear')
|
|
return
|
|
elif mode == MailboxGlobals.MAILBOX_MOVIE_EXIT:
|
|
if random.random() < 0.5:
|
|
sfx = base.loadSfx('phase_5.5/audio/sfx/mailbox_close_1.ogg')
|
|
else:
|
|
sfx = base.loadSfx('phase_5.5/audio/sfx/mailbox_close_2.ogg')
|
|
sfxTrack = SoundInterval(sfx, node=self.model)
|
|
sfxTrack.start()
|
|
DistributedMailbox.notify.debug('setMovie: exit')
|
|
return
|
|
elif mode == MailboxGlobals.MAILBOX_MOVIE_EMPTY:
|
|
DistributedMailbox.notify.debug('setMovie: empty')
|
|
if isLocalToon:
|
|
self.mailboxDialog = TTDialog.TTDialog(dialogName='MailboxEmpty', style=TTDialog.Acknowledge, text=TTLocalizer.DistributedMailboxEmpty, text_wordwrap=15, fadeScreen=1, command=self.__clearDialog)
|
|
return
|
|
elif mode == MailboxGlobals.MAILBOX_MOVIE_WAITING:
|
|
DistributedMailbox.notify.debug('setMovie: waiting')
|
|
if isLocalToon:
|
|
self.mailboxDialog = TTDialog.TTDialog(dialogName='MailboxWaiting', style=TTDialog.Acknowledge, text=TTLocalizer.DistributedMailboxWaiting, text_wordwrap=15, fadeScreen=1, command=self.__clearDialog)
|
|
return
|
|
elif mode == MailboxGlobals.MAILBOX_MOVIE_READY:
|
|
DistributedMailbox.notify.debug('setMovie: ready')
|
|
if random.random() < 0.5:
|
|
sfx = base.loadSfx('phase_5.5/audio/sfx/mailbox_open_1.ogg')
|
|
else:
|
|
sfx = base.loadSfx('phase_5.5/audio/sfx/mailbox_open_2.ogg')
|
|
sfxTrack = SoundInterval(sfx, node=self.model)
|
|
sfxTrack.start()
|
|
if isLocalToon:
|
|
self.mailboxGui = MailboxScreen.MailboxScreen(self, base.localAvatar, self.mailboxGuiDoneEvent)
|
|
self.mailboxGui.show()
|
|
self.accept(self.mailboxGuiDoneEvent, self.__handleMailboxDone)
|
|
return
|
|
elif mode == MailboxGlobals.MAILBOX_MOVIE_NOT_OWNER:
|
|
DistributedMailbox.notify.debug('setMovie: not owner')
|
|
if isLocalToon:
|
|
self.mailboxDialog = TTDialog.TTDialog(dialogName='MailboxNotOwner', style=TTDialog.Acknowledge, text=TTLocalizer.DistributedMailboxNotOwner, text_wordwrap=15, fadeScreen=1, command=self.__clearDialog)
|
|
return
|
|
else:
|
|
DistributedMailbox.notify.warning('unknown mode in setMovie: %s' % mode)
|
|
|
|
def acceptItem(self, item, index, callback, optional = -1):
|
|
DistributedMailbox.notify.debug('acceptItem')
|
|
blob = item.getBlob(store=CatalogItem.Customization)
|
|
context = self.getCallbackContext(callback, [item, index])
|
|
self.sendUpdate('acceptItemMessage', [context,
|
|
blob,
|
|
index,
|
|
optional])
|
|
|
|
def acceptInvite(self, item, acceptingIndex, callback, optional = -1):
|
|
DistributedMailbox.notify.debug('acceptInvite')
|
|
context = self.getCallbackContext(callback, [item, acceptingIndex])
|
|
self.sendUpdate('acceptInviteMessage', [context, item.inviteKey])
|
|
|
|
def acceptItemResponse(self, context, retcode):
|
|
DistributedMailbox.notify.debug('acceptItemResponse')
|
|
if retcode == ToontownGlobals.P_UserCancelled:
|
|
print 'DistributedMailbox User Canceled'
|
|
self.doCallbackContext(context, [retcode])
|
|
|
|
def discardItem(self, item, index, callback, optional = -1):
|
|
DistributedMailbox.notify.debug('discardItem')
|
|
blob = item.getBlob(store=CatalogItem.Customization)
|
|
context = self.getCallbackContext(callback, [item, index])
|
|
self.sendUpdate('discardItemMessage', [context,
|
|
blob,
|
|
index,
|
|
optional])
|
|
|
|
def rejectInvite(self, item, acceptingIndex, callback, optional = -1):
|
|
DistributedMailbox.notify.debug('rejectInvite')
|
|
context = self.getCallbackContext(callback, [item, acceptingIndex])
|
|
self.sendUpdate('rejectInviteMessage', [context, item.inviteKey])
|
|
|
|
def discardItemResponse(self, context, retcode):
|
|
DistributedMailbox.notify.debug('discardItemResponse')
|
|
self.doCallbackContext(context, [retcode])
|
|
|
|
def __setupName(self):
|
|
DistributedMailbox.notify.debug('__setupName')
|
|
if self.nameText:
|
|
self.nameText.removeNode()
|
|
self.nameText = None
|
|
nameOrigin = self.model.find('**/nameLocator')
|
|
if not nameOrigin.isEmpty():
|
|
text = TextNode('nameText')
|
|
text.setTextColor(*self.nameColor)
|
|
text.setAlign(TextNode.ACenter)
|
|
text.setFont(ToontownGlobals.getToonFont())
|
|
text.setWordwrap(7.5)
|
|
text.setText(self.name)
|
|
self.nameText = nameOrigin.attachNewNode(text)
|
|
self.nameText.setH(90)
|
|
self.nameText.setScale(0.2)
|
|
return
|
|
|
|
def __clearDialog(self, event):
|
|
DistributedMailbox.notify.debug('__clearDialog')
|
|
self.mailboxDialog.cleanup()
|
|
self.mailboxDialog = None
|
|
self.freeAvatar()
|
|
return
|
|
|
|
def sendInviteReadButNotReplied(self, inviteKey):
|
|
self.sendUpdate('markInviteReadButNotReplied', [inviteKey])
|