multiplayer: Fix crashes on Astron clients

This commit is contained in:
John Cote 2021-06-29 15:08:37 -04:00
parent 092f6611cc
commit e7936e7045
2 changed files with 30 additions and 8 deletions

View file

@ -18,5 +18,8 @@ class TelemetryLimited:
self._limits.remove(limit)
def enforceTelemetryLimits(self):
if __astron__ and self.isEmpty():
return
for limit in self._limits:
limit(self)

View file

@ -22,6 +22,11 @@ class TelemetryLimiter(DirectObject):
self._objs[id] = obj
self.accept(self._getDummyEventName(obj), self._dummyEventHandler)
if __astron__:
def hasObj(self, obj):
id = obj.getTelemetryLimiterId()
return id in self._objs
def _getDummyEventName(self, obj):
return '%s-%s-%s-%s' % (self.LeakDetectEventName,
obj.getTelemetryLimiterId(),
@ -80,7 +85,10 @@ class TLGatherAllAvs(DirectObject):
self._handlePlayerArrive(av)
self.accept(DistributedPlayer.GetPlayerGenerateEvent(), self._handlePlayerArrive)
self.accept(DistributedPlayer.GetPlayerNetworkDeleteEvent(), self._handlePlayerLeave)
if __astron__:
self.accept(DistributedPlayer.GetPlayerDeleteEvent(), self._handlePlayerLeave)
else:
self.accept(DistributedPlayer.GetPlayerNetworkDeleteEvent(), self._handlePlayerLeave)
def _handlePlayerArrive(self, av):
if av is not localAvatar:
@ -94,14 +102,25 @@ class TLGatherAllAvs(DirectObject):
self._avId2limits[av.doId] = limitList
base.cr.telemetryLimiter.addObj(av)
def _handlePlayerLeave(self, av):
if av is not localAvatar:
base.cr.telemetryLimiter.removeObj(av)
for limit in self._avId2limits[av.doId]:
av.removeTelemetryLimit(limit)
if __astron__:
def _handlePlayerLeave(self, av):
if av is not localAvatar and base.cr.telemetryLimiter.hasObj(av) and av.doId in self._avId2limits:
base.cr.telemetryLimiter.removeObj(av)
for limit in self._avId2limits[av.doId]:
av.removeTelemetryLimit(limit)
del self._avId2limits[av.doId]
del self._avs[av.doId]
del self._avId2limits[av.doId]
if av.doId in self._avs:
del self._avs[av.doId]
else:
def _handlePlayerLeave(self, av):
if av is not localAvatar:
base.cr.telemetryLimiter.removeObj(av)
for limit in self._avId2limits[av.doId]:
av.removeTelemetryLimit(limit)
del self._avId2limits[av.doId]
del self._avs[av.doId]
def destroy(self):
self.ignoreAll()