def setDNAString(self, dnaStr): data = PyDatagram(dnaStr) iter = PyDatagramIterator(data) self.setShapeStyle(int(iter.getUint8())) bgData = [ 0] * len(self.bgData) layoutData = [ 0] * len(self.layoutData) for x in range(len(bgData)): bgData[x] = int(iter.getUint8()) self.setBackground(*bgData) for x in range(len(layoutData)): layoutData[x] = int(iter.getUint8()) self.setLayout(*layoutData) self.emblems = { } eCount = 0 while iter.getRemainingSize() >= len(self.DefaultEmblemData): edata = self.DefaultEmblemData[:] for x in range(0, len(edata)): edata[x] = int(iter.getUint8()) self.setEmblem(eCount, *edata) eCount += 1
def __makeList(self, store): list = [] if self.__blob: dg = PyDatagram(self.__blob) di = PyDatagramIterator(dg) versionNumber = di.getUint8() while di.getRemainingSize() > 0: item = CatalogItem.decodeCatalogItem(di, versionNumber, store) list.append(item) return list
def __makeList(self, store): list = [] if self.__blob: dg = PyDatagram(self.__blob) di = PyDatagramIterator(dg) versionNumber = di.getUint8() while di.getRemainingSize() > 0: item = CatalogItem.decodeCatalogItem(di, versionNumber, store) list.append(item) return list
def __makeList(self, store): # Construct a new list and populate it with the items decoded # from the blob. list = [] if self.__blob: # empty string or None means nothing on the list. dg = PyDatagram(self.__blob) di = PyDatagramIterator(dg) versionNumber = di.getUint8() while di.getRemainingSize() > 0: item = CatalogItem.decodeCatalogItem(di, versionNumber, store) list.append(item) return list
def fromNetString(self, netString): self.netString = netString dg = PyDatagram(netString) dgi = PyDatagramIterator(dg) dictionary = {} while dgi.getRemainingSize() > 0: gagId = dgi.getUint8() supply = dgi.getUint8() dictionary[gagId] = supply return dictionary
def getTrackExperienceFromNetString(netString): dg = PyDatagram(netString) dgi = PyDatagramIterator(dg) tracks = {} for track in TrackNameById.values(): tracks[track] = 0 while dgi.getRemainingSize() > 0: trackId = dgi.getUint8() exp = dgi.getInt16() tracks[TrackNameById.get(trackId)] = exp return tracks
def makeFromNetStringForceSize(self, netString, numTracks, numLevels): dataList = [] dg = PyDatagram(netString) dgi = PyDatagramIterator(dg) for track in xrange(0, numTracks): subList = [] for level in xrange(0, numLevels): if dgi.getRemainingSize() > 0: value = dgi.getUint8() else: value = 0 subList.append(value) dataList.append(subList) return dataList
def makeFromNetString(self, netString): dataList = [] dg = PyDatagram(netString) dgi = PyDatagramIterator(dg) for track in range(0, len(Tracks)): subList = [] for level in range(0, len(Levels[track])): if dgi.getRemainingSize() > 0: value = dgi.getUint8() else: value = 0 subList.append(value) dataList.append(subList) return dataList
def makeFromNetStringForceSize(self, netString, numTracks, numLevels): dataList = [] dg = PyDatagram(netString) dgi = PyDatagramIterator(dg) for track in range(0, numTracks): subList = [] for level in range(0, numLevels): if dgi.getRemainingSize() > 0: value = dgi.getUint8() else: value = 0 subList.append(value) dataList.append(subList) return dataList
def makeFromNetString(self, netString): dataList = [] dg = PyDatagram(netString) dgi = PyDatagramIterator(dg) for track in xrange(0, len(Tracks)): subList = [] for level in xrange(0, len(Levels[track])): if dgi.getRemainingSize() > 0: value = dgi.getUint8() else: value = 0 subList.append(value) dataList.append(subList) return dataList
def fromNetString(self, netString): self.tracks.clear() dg = PyDatagram(netString) dgi = PyDatagramIterator(dg) avDoId = dgi.getUint32() favGagId = dgi.getUint8() self.avatar = base.cr.doId2do.get(avDoId, None) self.avatarName = None if not self.avatar else self.avatar.getName() self.favoriteGag = base.cr.attackMgr.getAttackName(favGagId) while dgi.getRemainingSize() > 0: track = GagGlobals.TrackNameById.get(dgi.getUint8()) exp = dgi.getInt16() maxExp = dgi.getInt16() increment = dgi.getInt16() self.tracks[track] = Track(track, exp, maxExp, increment) return avDoId
def updateSuppliesFromNetString(self, netString): self.netString = netString dg = PyDatagram(netString) dgi = PyDatagramIterator(dg) addedGag = False while dgi.getRemainingSize() > 0: gagId = dgi.getUint8() supply = dgi.getUint8() if self.hasGag(gagId): self.setSupply(gagId, supply) else: addedGag = True self.addGag(gagId, supply) if addedGag and self.avatar == base.localAvatar: if base.localAvatar.invGui: base.localAvatar.reloadInvGui()
def setDNAString(self, dnaStr): data = PyDatagram(dnaStr) iter = PyDatagramIterator(data) self.setShapeStyle(int(iter.getUint8())) bgData = [0] * len(self.bgData) layoutData = [0] * len(self.layoutData) for x in range(len(bgData)): bgData[x] = int(iter.getUint8()) self.setBackground(*bgData) for x in range(len(layoutData)): layoutData[x] = int(iter.getUint8()) self.setLayout(*layoutData) self.emblems = {} eCount = 0 while iter.getRemainingSize() >= len(self.DefaultEmblemData): edata = self.DefaultEmblemData[:] for x in range(0, len(edata)): edata[x] = int(iter.getUint8()) self.setEmblem(eCount, *edata) eCount += 1
def processPacket(self, packet, backend, sender=None): iterator = PyDatagramIterator(packet) lastId = "None" lastController = "None" try: rebroadcast = True while iterator.getRemainingSize() > 0: type = net.Uint8.getFrom(iterator) if type == constants.PACKET_CONTROLLER: rebroadcast = True id = net.Uint8.getFrom(iterator) entity = backend.entityGroup.getEntity(id) if entity is not None: lastId = str(id) lastController = entity.controller entity.controller.clientUpdate(backend.aiWorld, backend.entityGroup, iterator) else: engine.log.warning( "Received controller packet with no matching entity. ID: " + str(id) + " Last entity updated: " + lastId + " - controller: " + str(lastController)) # Only send a request once every two seconds if sender is not None and ( (id not in list(self.requestedEntitySpawns.keys())) or (engine.clock.time - self.requestedEntitySpawns[id] > 2.0)): p = net.Packet() p.add( net.Uint8(constants.PACKET_REQUESTSPAWNPACKET)) p.add(net.Uint8(id)) net.context.send(p, sender) self.requestedEntitySpawns[id] = engine.clock.time engine.log.info( "Sending request for missing entity spawn packet. Entity ID: " + str(id)) return rebroadcast elif type == constants.PACKET_SPAWN: controllerType = net.Uint8.getFrom(iterator) entity = controllers.types[controllerType].readSpawnPacket( backend.aiWorld, backend.entityGroup, iterator) if entity.getId() in list( self.requestedEntitySpawns.keys()): del self.requestedEntitySpawns[entity.getId()] if entity is not None and backend.entityGroup.getEntity( entity.getId()) is None: backend.entityGroup.addEntity(entity) elif entity is not None: engine.log.warning( "Spawned entity " + str(entity.getId()) + " already exists. Cancelling spawn.") entity.delete(backend.entityGroup, killed=False, localDelete=False) rebroadcast = True elif type == constants.PACKET_DELETE: id = net.Uint8.getFrom(iterator) entity = backend.entityGroup.getEntity(id) killed = net.Boolean.getFrom(iterator) if entity is not None: if killed: # The boolean indicates that the entity was not only deleted, it was killed. Also, let the entity know this was a remote delete packet. entity.kill(backend.aiWorld, backend.entityGroup, False) else: entity.delete(backend.entityGroup, False, False) rebroadcast = True elif type == constants.PACKET_REQUESTSPAWNPACKET: self.clientSpawnPacketRequests.append( (net.Uint8.getFrom(iterator), sender)) rebroadcast = False elif type == constants.PACKET_SETUP: if net.netMode == net.MODE_CLIENT: messenger.send("client-setup", [iterator]) else: return False rebroadcast = False elif type == constants.PACKET_CHAT: # Username and message messenger.send("chat-incoming", [ net.String.getFrom(iterator), net.String.getFrom(iterator) ]) rebroadcast = True elif type == constants.PACKET_ENDMATCH: engine.log.info("Received match end packet.") messenger.send("end-match", [iterator]) rebroadcast = True elif type == constants.PACKET_NEWCLIENT: # Sender address and username messenger.send( "server-new-connection", [sender, net.String.getFrom(iterator)]) rebroadcast = False elif type == constants.PACKET_DISCONNECT: engine.log.info( net.addressToString(sender) + " disconnected.") messenger.send("disconnect", [sender]) rebroadcast = False elif type == constants.PACKET_SERVERFULL: messenger.send("server-full") elif type == constants.PACKET_CONFIRMREGISTER: messenger.send("lobby-confirm-register") rebroadcast = False elif type == constants.PACKET_EMPTY: rebroadcast = False elif type == constants.PACKET_CLIENTREADY: rebroadcast = False messenger.send("client-ready", [sender]) elif type == constants.PACKET_NEWCLIENTNOTIFICATION: address = net.String.getFrom(iterator) port = net.Uint16.getFrom(iterator) # Make sure we get all the data out of the packet to ensure proper processing. # This packet has already been handled by the NetContext. rebroadcast = False elif type == constants.PACKET_ENTITYCHECKSUM: # Number of active entities we're supposed to have checksum = net.Uint8.getFrom(iterator) if net.netMode == net.MODE_CLIENT and checksum != len([ x for x in list(backend.entityGroup.entities.values( )) if x.active and x.getId() < 256 ]): # We don't have the right number of entities p = net.Packet() p.add(net.Uint8(constants.PACKET_REQUESTENTITYLIST)) net.context.send(p, sender) engine.log.info( "Entity checksum failed. Requesting full entity list." ) rebroadcast = False elif type == constants.PACKET_REQUESTENTITYLIST: p = net.Packet() p.add(net.Uint8(constants.PACKET_ENTITYLIST)) entityList = [ x for x in list(backend.entityGroup.entities.values()) if x.active and x.getId() < 256 ] p.add(net.Uint8(len(entityList))) for entity in entityList: p.add(net.Uint8(entity.getId())) net.context.send(p, sender) engine.log.info("Sending entity list to " + net.addressToString(sender)) rebroadcast = False elif type == constants.PACKET_ENTITYLIST: total = net.Uint8.getFrom(iterator) entities = [] missingEntities = [] for _ in range(total): id = net.Uint8.getFrom(iterator) if id not in list(backend.entityGroup.entities.keys()): missingEntities.append(id) entities.append(id) # Delete any extra entities, assuming they aren't ones that # we just spawned on our end. for entity in (x for x in list( backend.entityGroup.entities.values()) if x.active and x.getId() < 256): if entity.getId( ) not in entities and engine.clock.time - entity.spawnTime > 5.0: entity.delete(backend.entityGroup, False, False) if len(missingEntities) > 0: # Request spawn packets for any missing entities p = net.Packet() for id in missingEntities: p.add( net.Uint8(constants.PACKET_REQUESTSPAWNPACKET)) p.add(net.Uint8(id)) self.requestedEntitySpawns[id] = engine.clock.time engine.log.info( "Sending request for missing entity spawn packet. Entity ID: " + str(id)) net.context.send(p, sender) rebroadcast = False else: rebroadcast = False except AssertionError: engine.log.warning("Packet iteration failed. Discarding packet.") rebroadcast = False return rebroadcast
def processPacket(self, packet, backend, sender = None): iterator = PyDatagramIterator(packet) lastId = "None" lastController = "None" try: rebroadcast = True while iterator.getRemainingSize() > 0: type = net.Uint8.getFrom(iterator) if type == net.PACKET_CONTROLLER: rebroadcast = True id = net.Uint8.getFrom(iterator) entity = backend.entityGroup.getEntity(id) if entity != None: lastId = str(id) lastController = entity.controller entity.controller.clientUpdate(backend.aiWorld, backend.entityGroup, iterator) else: engine.log.warning("Received controller packet with no matching entity. ID: " + str(id) + " Last entity updated: " + lastId + " - controller: " + str(lastController)) if sender != None and ((not id in self.requestedEntitySpawns.keys()) or (engine.clock.time - self.requestedEntitySpawns[id] > 2.0)): # Only send a request once every two seconds p = net.Packet() p.add(net.Uint8(net.PACKET_REQUESTSPAWNPACKET)) p.add(net.Uint8(id)) net.context.send(p, sender) self.requestedEntitySpawns[id] = engine.clock.time engine.log.info("Sending request for missing entity spawn packet. Entity ID: " + str(id)) return rebroadcast elif type == net.PACKET_SPAWN: controllerType = net.Uint8.getFrom(iterator) entity = controllers.types[controllerType].readSpawnPacket(backend.aiWorld, backend.entityGroup, iterator) if entity.getId() in self.requestedEntitySpawns.keys(): del self.requestedEntitySpawns[entity.getId()] if entity != None and backend.entityGroup.getEntity(entity.getId()) == None: backend.entityGroup.addEntity(entity) elif entity != None: engine.log.warning("Spawned entity " + str(entity.getId()) + " already exists. Cancelling spawn.") entity.delete(backend.entityGroup, killed = False, localDelete = False) rebroadcast = True elif type == net.PACKET_DELETE: id = net.Uint8.getFrom(iterator) entity = backend.entityGroup.getEntity(id) killed = net.Boolean.getFrom(iterator) if entity != None: if killed: # The boolean indicates that the entity was not only deleted, it was killed. Also, let the entity know this was a remote delete packet. entity.kill(backend.aiWorld, backend.entityGroup, False) else: entity.delete(backend.entityGroup, False, False) rebroadcast = True elif type == net.PACKET_REQUESTSPAWNPACKET: self.clientSpawnPacketRequests.append((net.Uint8.getFrom(iterator), sender)) rebroadcast = False elif type == net.PACKET_SETUP: if net.netMode == net.MODE_CLIENT: messenger.send("client-setup", [iterator]) else: return False rebroadcast = False elif type == net.PACKET_CHAT: messenger.send("chat-incoming", [net.String.getFrom(iterator), net.String.getFrom(iterator)]) # Username and message rebroadcast = True elif type == net.PACKET_ENDMATCH: engine.log.info("Received match end packet.") messenger.send("end-match", [iterator]) rebroadcast = True elif type == net.PACKET_NEWCLIENT: messenger.send("server-new-connection", [sender, net.String.getFrom(iterator)]) # Sender address and username rebroadcast = False elif type == net.PACKET_DISCONNECT: engine.log.info(net.addressToString(sender) + " disconnected.") messenger.send("disconnect", [sender]) rebroadcast = False elif type == net.PACKET_SERVERFULL: messenger.send("server-full") elif type == net.PACKET_CONFIRMREGISTER: messenger.send("lobby-confirm-register") rebroadcast = False elif type == net.PACKET_EMPTY: rebroadcast = False elif type == net.PACKET_CLIENTREADY: rebroadcast = False messenger.send("client-ready", [sender]) elif type == net.PACKET_NEWCLIENTNOTIFICATION: address = net.String.getFrom(iterator) port = net.Uint16.getFrom(iterator) # Make sure we get all the data out of the packet to ensure proper processing. # This packet has already been handled by the NetContext. rebroadcast = False elif type == net.PACKET_ENTITYCHECKSUM: checksum = net.Uint8.getFrom(iterator) # Number of active entities we're supposed to have if net.netMode == net.MODE_CLIENT and checksum != len([x for x in backend.entityGroup.entities.values() if x.active and x.getId() < 256]): # We don't have the right number of entities p = net.Packet() p.add(net.Uint8(net.PACKET_REQUESTENTITYLIST)) net.context.send(p, sender) engine.log.info("Entity checksum failed. Requesting full entity list.") rebroadcast = False elif type == net.PACKET_REQUESTENTITYLIST: p = net.Packet() p.add(net.Uint8(net.PACKET_ENTITYLIST)) entityList = [x for x in backend.entityGroup.entities.values() if x.active and x.getId() < 256] p.add(net.Uint8(len(entityList))) for entity in entityList: p.add(net.Uint8(entity.getId())) net.context.send(p, sender) engine.log.info("Sending entity list to " + net.addressToString(sender)) rebroadcast = False elif type == net.PACKET_ENTITYLIST: total = net.Uint8.getFrom(iterator) entities = [] missingEntities = [] for _ in range(total): id = net.Uint8.getFrom(iterator) if id not in backend.entityGroup.entities.keys(): missingEntities.append(id) entities.append(id) # Delete any extra entities, assuming they aren't ones that we just spawned on our end. for entity in (x for x in backend.entityGroup.entities.values() if x.active and x.getId() < 256): if entity.getId() not in entities and engine.clock.time - entity.spawnTime > 5.0: entity.delete(backend.entityGroup, False, False) if len(missingEntities) > 0: # Request spawn packets for any missing entities p = net.Packet() for id in missingEntities: p.add(net.Uint8(net.PACKET_REQUESTSPAWNPACKET)) p.add(net.Uint8(id)) self.requestedEntitySpawns[id] = engine.clock.time engine.log.info("Sending request for missing entity spawn packet. Entity ID: " + str(id)) net.context.send(p, sender) rebroadcast = False else: rebroadcast = False except AssertionError: engine.log.warning("Packet iteration failed. Discarding packet.") rebroadcast = False return rebroadcast