friends: Handle avatar details retrieval

This commit is contained in:
John Cote 2021-07-17 22:30:27 -04:00
parent b259ead8c8
commit 46ac296025
No known key found for this signature in database
GPG Key ID: E3442FF71E9C1C01
4 changed files with 83 additions and 5 deletions

View File

@ -2857,6 +2857,8 @@ dclass ToontownFriendsManager : DistributedObject {
getFriendsListRequest() clsend;
getFriendsListResponse(Friend[]);
friendOnline(uint32, uint8, uint8);
getAvatarDetailsRequest(uint32) clsend;
getAvatarDetailsResponse(blob);
};
dclass TTSpeedchatRelay : SpeedchatRelay {

View File

@ -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()

View File

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

View File

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