toontown-just-works/toontown/estate/DistributedMailbox.py
2024-07-07 18:08:39 -05:00

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])