class OldNetworkSystem(sandbox.EntitySystem): def init(self, port=2000, server="127.0.0.1", serverPort=1999, backlog=1000, compress=False): self.packetCount = 0 self.port = port self.serverPort = serverPort self.serverIP = server self.serverAddress = NetAddress() self.serverAddress.setHost(server, serverPort) self.cManager = QueuedConnectionManager() self.cReader = QueuedConnectionReader(self.cManager, 0) self.cWriter = ConnectionWriter(self.cManager, 0) self.udpSocket = self.cManager.openUDPConnection(self.port) self.cReader.addConnection(self.udpSocket) def begin(self): if self.cReader.dataAvailable(): datagram = NetDatagram() # catch the incoming data in this instance # Check the return value; if we were threaded, someone else could have # snagged this data before we did if self.cReader.getData(datagram): myIterator = PyDatagramIterator(datagram) msgID = myIterator.getUint8() #If not in our protocol range then we just reject if msgID < 0 or msgID > 200: return #Order of these will need to be optimized later #We now pull out the rest of our headers remotePacketCount = myIterator.getUint8() ack = myIterator.getUint8() acks = myIterator.getUint16() hashID = myIterator.getUint16() sourceOfMessage = datagram.getConnection() if msgID == protocol.NEW_SHIP: log.info("New ship") playerPilotID = myIterator.getUint16() shipID = myIterator.getUint16() shipName = myIterator.getString() health = myIterator.getUint8() position = Point3(myIterator.getFloat32(), myIterator.getFloat32(), myIterator.getFloat32()) linearVelocity = Vec3(myIterator.getFloat32(), myIterator.getFloat32(), myIterator.getFloat32()) rotiation = VBase3(myIterator.getFloat32(), myIterator.getFloat32(), myIterator.getFloat32()) angularVelocity = Vec3(myIterator.getFloat32(), myIterator.getFloat32(), myIterator.getFloat32()) ship = sandbox.addEntity(shipID) component = ships.PilotComponent() component.accountEntityID = playerPilotID ship.addComponent(component) component = ships.BulletPhysicsComponent() messenger.send("addSpaceShip", [component, shipName, position, linearVelocity]) ship.addComponent(component) component = ships.ThrustComponent() ship.addComponent(component) component = ships.InfoComponent() component.health = health component.name = shipName ship.addComponent(component) elif msgID == protocol.PLAYER_MOVED_SHIP: log.debug("Player moved ship") accountID = myIterator.getUint16() shipID = myIterator.getUint16() print sandbox.components[shipID] universals.shipNode = sandbox.components[shipID][ships.BulletPhysicsComponent].nodePath elif msgID == protocol.LOGIN_ACCEPTED: log.info("Login accepted") entityID = myIterator.getUint8() universals.day = myIterator.getFloat32() elif msgID == protocol.LOGIN_DENIED: log.info("Login failed") def genBasicData(self, proto): myPyDatagram = PyDatagram() myPyDatagram.addUint8(proto) myPyDatagram.addUint8(self.packetCount) myPyDatagram.addUint8(0) myPyDatagram.addUint16(0) myPyDatagram.addUint16(0) self.packetCount += 1 return myPyDatagram def sendLogin(self, username, hashpassword): datagram = self.genBasicData(protocol.LOGIN) datagram.addString(username) datagram.addString(hashpassword) universals.log.debug("sending login") self.sendData(datagram) def sendData(self, datagram): sent = self.cWriter.send(datagram, self.udpSocket, self.serverAddress) while not sent: print "resending" sent = self.cWriter.send(datagram, self.udpSocket, self.serverAddress)
from panda3d.core import QueuedConnectionManager, QueuedConnectionListener, QueuedConnectionReader, ConnectionWriter, PointerToConnection, NetAddress, NetDatagram from direct.distributed.PyDatagram import PyDatagram import protocol port_address=9099 # same for client and server ip_address="127.0.0.1" packetCount = 0 cManager = QueuedConnectionManager() cReader = QueuedConnectionReader(cManager, 0) cWriter = ConnectionWriter(cManager,0) myConnection=cManager.openUDPConnection() myPyDatagram = PyDatagram() myPyDatagram.addUint8(protocol.LOGIN) myPyDatagram.addUint8(packetCount) myPyDatagram.addUint8(0) myPyDatagram.addUint16(0) myPyDatagram.addUint16(0) myPyDatagram.addString("HUser name") myPyDatagram.addString("Hashed password") serverAddress = NetAddress() serverAddress.setHost(ip_address, port_address) cWriter.send(myPyDatagram, myConnection, serverAddress) print "Sending packet"
class OldNetworkSystem(sandbox.EntitySystem): def init(self, port=1999, backlog=1000, compress=False): log.debug("Initing Network System") self.accept("broadcastData", self.broadcastData) self.port = port self.backlog = backlog self.compress = compress self.cManager = QueuedConnectionManager() self.cReader = QueuedConnectionReader(self.cManager, 0) #self.cReader.setRawMode(True) self.cWriter = ConnectionWriter(self.cManager, 0) self.udpSocket = self.cManager.openUDPConnection(self.port) self.cReader.addConnection(self.udpSocket) self.activePlayers = [] # PlayerComponent self.activeConnections = {} # {NetAddress : PlayerComponent} self.lastAck = {} # {NetAddress: time} self.startPolling() self.accept("shipGenerated", self.shipGenerated) def startPolling(self): #taskMgr.add(self.tskReaderPolling, "serverListenTask", -40) taskMgr.doMethodLater(10, self.activeCheck, "activeCheck") #def tskReaderPolling(self, taskdata): def begin(self): if self.cReader.dataAvailable(): datagram = NetDatagram() # catch the incoming data in this instance # Check the return value; if we were threaded, someone else could have # snagged this data before we did if self.cReader.getData(datagram): myIterator = PyDatagramIterator(datagram) msgID = myIterator.getUint8() #If not in our protocol range then we just reject if msgID < 0 or msgID > 200: return self.lastAck[datagram.getAddress()] = datetime.datetime.now() #TODO Switch to ip address and port #Order of these will need to be optimized later #We now pull out the rest of our headers remotePacketCount = myIterator.getUint8() ack = myIterator.getUint8() acks = myIterator.getUint16() hashID = myIterator.getUint16() if msgID == protocol.LOGIN: username = myIterator.getString() password = myIterator.getString() if username not in accountEntities: entity = sandbox.createEntity() component = AccountComponent() component.name = username component.passwordHash = password if not accountEntities: component.owner = True component.address = datagram.getAddress() entity.addComponent(component) accountEntities[username] = entity.id log.info("New player " + username + " logged in.") # self.activePlayers.append(component) self.activeConnections[component.address] = component ackDatagram = protocol.loginAccepted(entity.id) self.sendData(ackDatagram, datagram.getAddress()) #TODO: Send initial states? messenger.send("newPlayerShip", [component, entity]) else: component = sandbox.entities[accountEntities[username]].get_component(AccountComponent) if component.passwordHash != password: log.info("Player " + username + " has the wrong password.") else: component.connection = datagram.getConnection() log.info("Player " + username + " logged in.") def activeCheck(self, task): """Checks for last ack from all known active conenctions.""" for address, lastTime in self.lastAck.items(): if (datetime.datetime.now() - lastTime).seconds > 30: component = self.activeConnections[address] #TODO: Disconnect return task.again def sendData(self, datagram, address): self.cWriter.send(datagram, self.udpSocket, address) def broadcastData(self, datagram): # Broadcast data out to all activeConnections #for accountID in accountEntities.items(): #sandbox.entities[accountID].get_component() for addr in self.activeConnections.keys(): self.sendData(datagram, addr) def processData(self, netDatagram): myIterator = PyDatagramIterator(netDatagram) return self.decode(myIterator.getString()) def shipGenerated(self, ship): datagram = protocol.newShip(ship) log.info("Checking if new ship is valid for udp:", self.cWriter.isValidForUdp(datagram)) self.broadcastData(datagram) datagram = protocol.movedShip(ship) address = self.getAddress(ship.get_component(ships.PilotComponent).accountEntityID) self.sendData(datagram, address) def getAddress(self, entityID): return sandbox.components[entityID][AccountComponent].address