def myProcessDataFunction(self, netDatagram): # check a message and do what it says myIterator = PyDatagramIterator(netDatagram) msgID = myIterator.getUint8() if msgID == PRINT_MESSAGE: # This is a debugging message messageToPrint = myIterator.getString() print messageToPrint elif msgID == CAR_MESSAGE: # This updates a car carNum = myIterator.getUint8() for num in self.ignore: # if the car message is out of date, ignore it if num == carNum: break else: # else update the car carXpos = myIterator.getFloat32() carYpos = myIterator.getFloat32() carXvel = myIterator.getFloat32() carYvel = myIterator.getFloat32() carHeading = myIterator.getFloat32() carInput = [] for i in range(5): carInput.append(myIterator.getBool()) carLights = myIterator.getBool() carHp = myIterator.getInt32() self.updatePositions(carNum, (carXpos, carYpos, carXvel, carYvel, carHeading, carInput, carLights, carHp)) elif msgID == NEW_PLAYER_MESSAGE: # This creates a new player if len(self.carData.carlist) >= self.players: self.cWriter.send(self.startDatagram(), netDatagram.getConnection()) self.cWriter.send(self.mapDatagram(), netDatagram.getConnection()) self.cWriter.send(self.addNewCar(), netDatagram.getConnection()) self.returnAllCars(netDatagram.getConnection()) elif msgID == COLLIDED_MESSAGE: # This verifies that a car has recieved its collision message and is now up to date carNum = myIterator.getUint8() self.ignore.remove(carNum) elif msgID == END_MESSAGE: # This recieves a player score self.playerscores.append((myIterator.getString(), myIterator.getInt32()))
def server_task(self, task): if self.listener.newConnectionAvailable(): rendezvous = PointerToConnection() netAddress = NetAddress() newConnection = PointerToConnection() if self.listener.getNewConnection(rendezvous, netAddress, newConnection): print 'GOT CONNECTION FROM', netAddress newConnection = newConnection.p() self.connections.append(newConnection) self.reader.addConnection(newConnection) self.last_pid += 1 self.players[netAddress.getIpString()] = Player(pid=self.last_pid, draw=False) while self.manager.resetConnectionAvailable(): connPointer = PointerToConnection() self.manager.getResetConnection(connPointer) connection = connPointer.p() print 'LOST CONNECTION FROM', connection # Remove the connection we just found to be "reset" or "disconnected" self.reader.removeConnection(connection) # Loop through the activeConnections till we find the connection we just deleted # and remove it from our activeConnections list for idx in range(0, len(self.connections)): if self.connections[idx] == connection: del self.connections[c] break while self.reader.dataAvailable(): datagram = NetDatagram() if self.reader.getData(datagram): conn = datagram.getConnection() dataIter = PyDatagramIterator(datagram) addr = conn.getAddress() player = self.players[addr.getIpString()] player.handle_move(dataIter.getString(), dataIter.getBool()) return task.cont
def __loadDNAFileBase(self, store, file): f = open(file, 'rb') self.curStore = store self.curProp = None self.hadError = False data = f.read() dg = PyDatagram(data) dgi = PyDatagramIterator(dg) f.close() header = dgi.extractBytes(5) if header != "PDNA\n": raise DNAError.DNAError("Invalid header") compressed = dgi.getBool() dgi.skipBytes(1) if compressed: # Decompress the dgi # Sadly we have to extract everything # And make another dgi import zlib data = dgi.getRemainingBytes() data = zlib.decompress(data) dg = PyDatagram(data) dgi = PyDatagramIterator(dg) self.handleStorageData(dgi) self.handleCompData(dgi)
def loadDNAFileBase(self, store, _file): if type(_file) == str and _file.endswith(".dna"): _file = _file.replace(".dna", ".pdna") #_file = _file.replace("../resources/", "") if __debug__: _file = Filename("../resources/" + _file) else: _file = Filename("/" + _file) vfs = VirtualFileSystem.getGlobalPtr() vfs.resolveFilename(_file, "") if not vfs.exists(_file): raise DNAError.DNAError("Unable to open DNA file '%s'" % (str(_file))) dnaData = vfs.readFile(_file, True) self.curStore = store dg = PyDatagram(dnaData) dgi = PyDatagramIterator(dg) header = dgi.extractBytes(5) if header != 'PDNA\n': raise DNAError.DNAError('Invalid header: %s' % (header)) compressed = dgi.getBool() dgi.skipBytes(1) if compressed: data = dgi.getRemainingBytes() data = zlib.decompress(data) dg = PyDatagram(data) dgi = PyDatagramIterator(dg) self.curComp = None self.handleStorageData(dgi) self.handleCompData(dgi)
def server_task(self, task): if self.listener.newConnectionAvailable(): rendezvous = PointerToConnection() netAddress = NetAddress() newConnection = PointerToConnection() if self.listener.getNewConnection(rendezvous, netAddress, newConnection): print 'GOT CONNECTION FROM', netAddress newConnection = newConnection.p() newConnection.setNoDelay(True) self.connections.append(newConnection) self.reader.addConnection(newConnection) self.last_pid += 1 self.players[netAddress.getIpString()] = Player( self.last_pid, self.world.create_walker()) while self.manager.resetConnectionAvailable(): connPointer = PointerToConnection() self.manager.getResetConnection(connPointer) connection = connPointer.p() print 'LOST CONNECTION FROM', connection # Remove the connection we just found to be "reset" or "disconnected" self.reader.removeConnection(connection) # Loop through the activeConnections till we find the connection we just deleted # and remove it from our activeConnections list for idx in range(0, len(self.connections)): if self.connections[idx] == connection: del self.connections[idx] break while self.reader.dataAvailable(): datagram = NetDatagram() if self.reader.getData(datagram): conn = datagram.getConnection() dataIter = PyDatagramIterator(datagram) addr = conn.getAddress() player = self.players[addr.getIpString()] player.handle_command(dataIter.getString(), dataIter.getBool()) update = PyDatagram() update.addInt8(len([o for o in self.world.updatables if o.moved])) for obj in self.world.updatables: obj.add_update(update) for conn in self.connections: self.writer.send(update, conn) return task.again
def loadDNAFileBase(self, dnaStorage, file): self.dnaStorage = dnaStorage dnaFile = open(file, 'rb') dnaData = dnaFile.read() dg = PyDatagram(dnaData) dgi = PyDatagramIterator(dg) dnaFile.close() header = dgi.extractBytes(5) if header != 'PDNA\n': raise DNAError.DNAError('Invalid header: %s' % (header)) compressed = dgi.getBool() dgi.skipBytes(1) if compressed: data = dgi.getRemainingBytes() data = zlib.decompress(data) dg = PyDatagram(data) dgi = PyDatagramIterator(dg) self.handleStorageData(dgi) self.handleCompData(dgi)
def server_task(self, task): if self.listener.newConnectionAvailable(): rendezvous = PointerToConnection() netAddress = NetAddress() newConnection = PointerToConnection() if self.listener.getNewConnection(rendezvous, netAddress, newConnection): print 'GOT CONNECTION FROM', netAddress newConnection = newConnection.p() newConnection.setNoDelay(True) self.connections.append(newConnection) self.reader.addConnection(newConnection) self.last_pid += 1 self.players[netAddress.getIpString()] = Player(self.last_pid, self.world.create_walker()) while self.manager.resetConnectionAvailable(): connPointer = PointerToConnection() self.manager.getResetConnection(connPointer) connection = connPointer.p() print 'LOST CONNECTION FROM', connection # Remove the connection we just found to be "reset" or "disconnected" self.reader.removeConnection(connection) # Loop through the activeConnections till we find the connection we just deleted # and remove it from our activeConnections list for idx in range(0, len(self.connections)): if self.connections[idx] == connection: del self.connections[idx] break while self.reader.dataAvailable(): datagram = NetDatagram() if self.reader.getData(datagram): conn = datagram.getConnection() dataIter = PyDatagramIterator(datagram) addr = conn.getAddress() player = self.players[addr.getIpString()] player.handle_command(dataIter.getString(), dataIter.getBool()) update = PyDatagram() update.addInt8(len([o for o in self.world.updatables if o.moved])) for obj in self.world.updatables: obj.add_update(update) for conn in self.connections: self.writer.send(update, conn) return task.again
def myProcessDataFunction(self, netDatagram): myIterator = PyDatagramIterator(netDatagram) msgID = myIterator.getUint8() if msgID == PRINT_MESSAGE: messageToPrint = myIterator.getString() print messageToPrint elif msgID == CAR_MESSAGE: carNum = myIterator.getUint8() carXpos = myIterator.getFloat32() carYpos = myIterator.getFloat32() carXvel = myIterator.getFloat32() carYvel = myIterator.getFloat32() carHeading = myIterator.getFloat32() carInput = [] for i in range(5): carInput.append(myIterator.getBool()) carHp = myIterator.getInt32() self.updatePositions(carNum, (carXpos, carYpos, carXvel, carYvel, carHeading, carInput, carHp)) elif msgID == NEW_PLAYER_MESSAGE: self.cWriter.send(self.addNewCar(), netDatagram.getConnection()) self.returnAllCars(netDatagram.getConnection())
def server_task(self, task): if self.listener.newConnectionAvailable(): rendezvous = PointerToConnection() netAddress = NetAddress() newConnection = PointerToConnection() if self.listener.getNewConnection(rendezvous, netAddress, newConnection): print 'GOT CONNECTION FROM', netAddress newConnection = newConnection.p() self.connections.append(newConnection) self.reader.addConnection(newConnection) self.last_pid += 1 self.players[netAddress.getIpString()] = Player( pid=self.last_pid, draw=False) while self.manager.resetConnectionAvailable(): connPointer = PointerToConnection() self.manager.getResetConnection(connPointer) connection = connPointer.p() print 'LOST CONNECTION FROM', connection # Remove the connection we just found to be "reset" or "disconnected" self.reader.removeConnection(connection) # Loop through the activeConnections till we find the connection we just deleted # and remove it from our activeConnections list for idx in range(0, len(self.connections)): if self.connections[idx] == connection: del self.connections[c] break while self.reader.dataAvailable(): datagram = NetDatagram() if self.reader.getData(datagram): conn = datagram.getConnection() dataIter = PyDatagramIterator(datagram) addr = conn.getAddress() player = self.players[addr.getIpString()] player.handle_move(dataIter.getString(), dataIter.getBool()) return task.cont
def myProcessDataFunction(self, netDatagram): # check a message and do what it says myIterator = PyDatagramIterator(netDatagram) msgID = myIterator.getUint8() if msgID == PRINT_MESSAGE: # This is a debugging message messageToPrint = myIterator.getString() print messageToPrint elif msgID == PLAYER_ASSIGNMENT_MESSAGE: # This assigns the player to a car playerNum = myIterator.getUint8() self.carData.index = playerNum self.playername += " (%d)"%playerNum carXpos = myIterator.getFloat32() carYpos = myIterator.getFloat32() carXvel = myIterator.getFloat32() carYvel = myIterator.getFloat32() carHeading = myIterator.getFloat32() carInput = [] for i in range(5): carInput.append(myIterator.getBool()) carLights = myIterator.getBool() carHp = myIterator.getInt32() self.updatePositions(playerNum, (carXpos, carYpos, carXvel, carYvel, carHeading, carInput, carLights, carHp)) elif msgID == CAR_MESSAGE: # This updates a car carNum = myIterator.getUint8() if carNum != self.carData.index: carXpos = myIterator.getFloat32() carYpos = myIterator.getFloat32() carXvel = myIterator.getFloat32() carYvel = myIterator.getFloat32() carHeading = myIterator.getFloat32() carInput = [] for i in range(5): carInput.append(myIterator.getBool()) carLights = myIterator.getBool() carHp = myIterator.getInt32() self.updatePositions(carNum, (carXpos, carYpos, carXvel, carYvel, carHeading, carInput, carLights, carHp)) elif msgID == COLLIDED_MESSAGE: # This runs car-car collisions collisionFrom = myIterator.getUint8() if collisionFrom == self.carData.index: self.carHitSound.play() self.doCarCollision(myIterator.getUint8()) self.cWriter.send(self.verifyCollisionMessage(), self.myConnection) elif msgID == MAP_MESSAGE: # This sets the map map = myIterator.getString() print map world_loader = w_loader() world_loader.load_world(map) global spawn_locations self.carData.spos = spawn_locations elif msgID == BEGIN_MESSAGE: # This starts the game self.carData.go = True self.textWaitObject.destroy() self.startSound.play() elif msgID == END_MESSAGE: # This ends the game, and then displays the score on the second receipt self.carData.go = False num = myIterator.getInt32() if num == -1: scoreDatagram = self.scoreDatagram() self.cWriter.send(scoreDatagram, self.myConnection) else: textytext = "Most Numerous Deaths:" for i in range(num): textytext += "\n\n%s: %d"%(myIterator.getString(), myIterator.getInt32()) self.textScore = OnscreenText(text=textytext, style=1, fg=(1,1,1,1), pos=(0,0.9), scale = .08)