historical/toontown-classic.git/toontown/estate/DistributedMailboxAI.py

203 lines
6.9 KiB
Python
Raw Normal View History

2024-01-16 11:20:27 -06:00
from direct.directnotify import DirectNotifyGlobal
from direct.distributed.DistributedObjectAI import DistributedObjectAI
from toontown.estate import MailboxGlobals
from toontown.toonbase import ToontownGlobals
from toontown.catalog import CatalogItem
class DistributedMailboxAI(DistributedObjectAI):
notify = DirectNotifyGlobal.directNotify.newCategory('DistributedMailboxAI')
def __init__(self, air, house):
DistributedObjectAI.__init__(self, air)
self.house = house
self.houseId = self.house.doId
self.housePos = self.house.housePos
self.name = self.house.name
self.busy = False
self.user = None
self.fullIndicator = 0
def generate(self):
DistributedObjectAI.generate(self)
self.updateIndicatorFlag()
def getHouseId(self):
return self.houseId
def getHousePos(self):
return self.housePos
def getName(self):
return self.name
def setFullIndicator(self, fullIndicator):
self.fullIndicator = fullIndicator
def d_setFullIndicator(self, fullIndicator):
self.sendUpdate('setFullIndicator', [fullIndicator])
def b_setFullIndicator(self, fullIndicator):
self.setFullIndicator(fullIndicator)
self.d_setFullIndicator(fullIndicator)
def getFullIndicator(self):
return self.fullIndicator
def avatarEnter(self):
if self.busy:
return
avId = self.air.getAvatarIdFromSender()
if avId != self.house.avatarId:
self.d_setMovie(MailboxGlobals.MAILBOX_MOVIE_NOT_OWNER, avId)
self.resetMovie()
return
av = self.air.doId2do.get(avId)
if not av:
return
if len(av.mailboxContents):
self.d_setMovie(MailboxGlobals.MAILBOX_MOVIE_READY, avId)
self.user = avId
self.busy = True
# The avatar has seen his items now.
if av.mailboxNotify == ToontownGlobals.NewItems:
av.b_setCatalogNotify(av.catalogNotify, ToontownGlobals.OldItems)
elif len(av.awardMailboxContents):
self.d_setMovie(MailboxGlobals.MAILBOX_MOVIE_READY, avId)
self.user = avId
self.busy = True
# The avatar has seen his items now.
if av.awardNotify == ToontownGlobals.NewItems:
av.b_setAwardNotify(ToontownGlobals.OldItems)
elif len(av.onOrder):
self.d_setMovie(MailboxGlobals.MAILBOX_MOVIE_WAITING, avId)
else:
self.d_setMovie(MailboxGlobals.MAILBOX_MOVIE_EMPTY, avId)
self.resetMovie()
def avatarExit(self):
avId = self.air.getAvatarIdFromSender()
if avId != self.user:
return
self.user = None
self.busy = False
self.updateIndicatorFlag()
self.d_setMovie(MailboxGlobals.MAILBOX_MOVIE_EXIT, avId)
self.d_freeAvatar(avId)
self.resetMovie()
def d_freeAvatar(self, avId):
self.sendUpdateToAvatarId(avId, 'freeAvatar', [])
def d_setMovie(self, movie, avId):
self.sendUpdate('setMovie', [movie, avId])
def acceptItemMessage(self, context, item, index, optional):
avId = self.air.getAvatarIdFromSender()
if avId != self.user:
return
av = self.air.doId2do.get(avId)
if not av:
return
item = CatalogItem.getItem(item, store=CatalogItem.Customization)
isAward = item.isAward()
adjustedMailboxContentsIndex = index - len(av.awardMailboxContents)
if index >= (len(av.mailboxContents) + len(av.awardMailboxContents)):
self.sendUpdateToAvatarId(avId, 'acceptItemResponse', [context, ToontownGlobals.P_InvalidIndex])
return
if not self.isItemIndexInvalid(av, item, index):
self.sendUpdateToAvatarId(avId, 'acceptItemResponse', [context, ToontownGlobals.P_InvalidIndex])
return
if isAward:
del av.awardMailboxContents[index]
av.b_setAwardMailboxContents(av.awardMailboxContents)
else:
del av.mailboxContents[adjustedMailboxContentsIndex]
av.b_setMailboxContents(av.mailboxContents)
self.sendUpdateToAvatarId(avId, 'acceptItemResponse', [context, item.recordPurchase(av, optional)])
def discardItemMessage(self, context, item, index, optional):
avId = self.air.getAvatarIdFromSender()
if avId != self.user:
return
av = self.air.doId2do.get(avId)
if not av:
return
item = CatalogItem.getItem(item, store=CatalogItem.Customization)
isAward = item.isAward()
adjustedMailboxContentsIndex = index - len(av.awardMailboxContents)
if index >= (len(av.mailboxContents) + len(av.awardMailboxContents)):
self.sendUpdateToAvatarId(avId, 'discardItemResponse', [context, ToontownGlobals.P_InvalidIndex])
return
if isAward:
del av.awardMailboxContents[index]
av.b_setAwardMailboxContents(av.awardMailboxContents)
else:
del av.mailboxContents[adjustedMailboxContentsIndex]
av.b_setMailboxContents(av.mailboxContents)
self.sendUpdateToAvatarId(avId, 'discardItemResponse', [context, ToontownGlobals.P_ItemAvailable])
def acceptInviteMessage(self, todo0, todo1):
pass # TODO
def rejectInviteMessage(self, todo0, todo1):
pass # TODO
def markInviteReadButNotReplied(self, todo0):
pass # TODO
def updateIndicatorFlag(self):
av = self.air.doId2do.get(self.house.avatarId)
if av:
self.b_setFullIndicator(len(av.mailboxContents) != 0 or av.numMailItems or av.getNumInvitesToShowInMailbox() or len(av.awardMailboxContents) != 0)
else:
self.b_setFullIndicator(0)
def resetMovie(self):
taskMgr.doMethodLater(2, self.d_setMovie, 'resetMovie-%d' % self.doId,
extraArgs=[MailboxGlobals.MAILBOX_MOVIE_CLEAR, 0])
def isItemIndexInvalid(self, av, item, itemIndex):
"""Return True if itemIndex is valid and matches mailboxContents or awardMailboxContents."""
result = True
adjustedMailboxContentsIndex = itemIndex - len(av.awardMailboxContents)
if itemIndex < 0 or itemIndex >= (len(av.mailboxContents) + len(av.awardMailboxContents)):
result = False
if result:
if not item.isAward():
if adjustedMailboxContentsIndex < 0:
result = False
elif adjustedMailboxContentsIndex >= len(av.mailboxContents):
result = False
else:
if av.mailboxContents[adjustedMailboxContentsIndex] != item:
result = False
else:
if av.awardMailboxContents[itemIndex] != item:
result = False
return result