diff --git a/etc/toon.dc b/etc/toon.dc index a075b28..29a554a 100755 --- a/etc/toon.dc +++ b/etc/toon.dc @@ -2857,6 +2857,8 @@ dclass ToontownFriendsManager : DistributedObject { getFriendsListRequest() clsend; getFriendsListResponse(Friend[]); friendOnline(uint32, uint8, uint8); + getAvatarDetailsRequest(uint32) clsend; + getAvatarDetailsResponse(blob); }; dclass TTSpeedchatRelay : SpeedchatRelay { diff --git a/toontown/distributed/ToontownClientRepository.py b/toontown/distributed/ToontownClientRepository.py index c9efad0..f08e18b 100644 --- a/toontown/distributed/ToontownClientRepository.py +++ b/toontown/distributed/ToontownClientRepository.py @@ -438,11 +438,14 @@ class ToontownClientRepository(OTPClientRepository.OTPClientRepository): pad.delayDelete.destroy() def __sendGetAvatarDetails(self, avId): - datagram = PyDatagram() - avatar = self.__queryAvatarMap[avId].avatar - datagram.addUint16(avatar.getRequestID()) - datagram.addUint32(avId) - self.send(datagram) + if __astron__: + self.toontownFriendsManager.sendGetAvatarDetailsRequest(avId) + else: + datagram = PyDatagram() + avatar = self.__queryAvatarMap[avId].avatar + datagram.addUint16(avatar.getRequestID()) + datagram.addUint32(avId) + self.send(datagram) def handleGetAvatarDetailsResp(self, di): avId = di.getUint32() diff --git a/toontown/friends/ToontownFriendsManager.py b/toontown/friends/ToontownFriendsManager.py index 2440a2c..7e5f58d 100644 --- a/toontown/friends/ToontownFriendsManager.py +++ b/toontown/friends/ToontownFriendsManager.py @@ -1,5 +1,7 @@ from direct.directnotify import DirectNotifyGlobal from direct.distributed.DistributedObjectGlobal import DistributedObjectGlobal +from direct.distributed.PyDatagram import PyDatagram +from direct.distributed.PyDatagramIterator import PyDatagramIterator class ToontownFriendsManager(DistributedObjectGlobal): @@ -13,3 +15,11 @@ class ToontownFriendsManager(DistributedObjectGlobal): def friendOnline(self, doId, commonChatFlags, whitelistChatFlags): self.cr.handleFriendOnline(doId, commonChatFlags, whitelistChatFlags) + + def sendGetAvatarDetailsRequest(self, avId): + self.sendUpdate('getAvatarDetailsRequest', [avId]) + + def getAvatarDetailsResponse(self, avatarDetails): + datagram = PyDatagram(avatarDetails) + di = PyDatagramIterator(datagram) + self.cr.handleGetAvatarDetailsResp(di) diff --git a/toontown/friends/ToontownFriendsManagerUD.py b/toontown/friends/ToontownFriendsManagerUD.py index adfcb76..bd74818 100644 --- a/toontown/friends/ToontownFriendsManagerUD.py +++ b/toontown/friends/ToontownFriendsManagerUD.py @@ -1,5 +1,6 @@ from direct.directnotify import DirectNotifyGlobal from direct.distributed.DistributedObjectGlobalUD import DistributedObjectGlobalUD +from direct.distributed.PyDatagram import * class FriendsOperation: @@ -17,6 +18,65 @@ class FriendsOperation: pass +class GetAvatarDetailsOperation(FriendsOperation): + + def __init__(self, friendsManager, sender): + FriendsOperation.__init__(self, friendsManager, sender) + self.avId = None + self.dclass = None + self.fields = None + + def start(self, avId): + self.avId = avId + self.fields = {} + self.friendsManager.air.dbInterface.queryObject(self.friendsManager.air.dbId, avId, + self.__handleAvatarRetrieved) + + def __handleAvatarRetrieved(self, dclass, fields): + if dclass not in (self.friendsManager.air.dclassesByName['DistributedToonUD'], + self.friendsManager.air.dclassesByName['DistributedPetAI']): + self.__sendAvatarDetails(False) + self._handleError('Retrieved avatar is not a DistributedToonUD or DistributedPetAI!') + return + + self.dclass = dclass + self.fields = fields + self.fields['avId'] = self.avId + self.__sendAvatarDetails(True) + self._handleDone() + + def __packAvatarDetails(self, dclass, fields): + # Pack required fields. + fieldPacker = DCPacker() + for i in range(dclass.getNumInheritedFields()): + field = dclass.getInheritedField(i) + if not field.isRequired() or field.asMolecularField(): + continue + + k = field.getName() + v = fields.get(k, None) + + fieldPacker.beginPack(field) + if not v: + fieldPacker.packDefaultValue() + else: + field.packArgs(fieldPacker, v) + + fieldPacker.endPack() + + return fieldPacker.getBytes() + + def __sendAvatarDetails(self, success): + datagram = PyDatagram() + datagram.addUint32(self.fields['avId']) + datagram.addUint8(0 if success else 1) + if success: + details = self.__packAvatarDetails(self.dclass, self.fields) + datagram.appendData(details) + + self.friendsManager.sendUpdateToAvatarId(self.sender, 'getAvatarDetailsResponse', [datagram.getMessage()]) + + class GetFriendsListOperation(FriendsOperation): def __init__(self, friendsManager, sender): @@ -102,3 +162,6 @@ class ToontownFriendsManagerUD(DistributedObjectGlobalUD): def getFriendsListRequest(self): self.runOperation(GetFriendsListOperation) + + def getAvatarDetailsRequest(self, avId): + self.runOperation(GetAvatarDetailsOperation, avId)