def loadLevel(self): import ogre.renderer.OGRE as ogre models= ["ship_blue.mesh","ship_gray.mesh","ship_tan.mesh"] if (self.engine.netMgr.networkingEnabled and self.engine.netMgr.server) or not self.engine.netMgr.networkingEnabled: ent = Spaceship("Ship" + str(0),0, self.engine,models[0]) ent.pos = ogre.Vector3(const.INNER_RADIUS + 100,50,0) self.entities.append(ent) self.playerIndex = 0 self.nextPos = ogre.Vector3(const.INNER_RADIUS + 140,50,0)
def tick(self, dtime): if self.networkingEnabled: if dtime < 1 and self.timeToWaitForPlayers > 0: self.timeToWaitForPlayers -= dtime # check to see if all players are ready to start the race if self.timeToWaitForPlayers > 0 and self.engine.gameMgr.allPlayersReady == False: allReady = True for ent in self.engine.entMgr.entities: if not ent.isReady: allReady = False if len(self.engine.entMgr.entities) > 1: self.engine.gameMgr.allPlayersReady = allReady elif self.timeToWaitForPlayers <= 0: self.engine.gameMgr.allPlayersReady = True # get messages incoming = self.listener.getMessages() outgoingMsgs = [] for msgs in incoming: msgType, msg = messages.unpack(msgs) if msgType == const.STATUS: found = False # check to see if the status message is regarding a ship that is already created for ent in self.engine.entMgr.entities: if ent.shipId == msg.shipId: found = True # if it is, send updates to entity if found and msg.shipId != self.engine.entMgr.playerIndex: self.engine.entMgr.entities[msg.shipId].updateQueue.append(msg) # if it isn't, create that entity elif not found: ent = Spaceship("Ship" + str(msg.shipId),msg.shipId, self.engine,const.MESHES[msg.shipId]) ent.pos = self.engine.entMgr.nextPos self.engine.entMgr.nextPos.x += 40 self.engine.entMgr.entities.append(ent) # only process requests before game has started elif msgType == const.REQUEST and self.timeToWaitForPlayers > 0: for ID in self.remainingIDs: # if the id has not been issued already, or if the ID corresponds to a user who has been given an ID (but did not recieve their ID), send the ID if ID[1] == "" or ID[1] == msg.userName: outgoingMsgs.append(messages.pack(messages.InfoMessage(msg.userName,ID[0]),const.INFO)) ID[1] = msg.userName # only process info messages when this player has not been handed a playerIndex elif msgType == const.INFO and not self.server and self.engine.entMgr.playerIndex == -1: self.engine.entMgr.playerIndex = msg.shipId found = False for ent in self.engine.entMgr.entities: if ent.shipId == msg.shipId: found = True if not found: ent = Spaceship("Ship" + str(msg.shipId),msg.shipId, self.engine,const.MESHES[msg.shipId]) ent.pos = self.engine.entMgr.nextPos self.engine.entMgr.nextPos.x += 40 self.engine.entMgr.entities.append(ent) # if this player has not been handed a playerIndex, request one. if self.engine.entMgr.playerIndex == -1: outgoingMsgs.append(messages.pack(messages.RequestMessage(str(socket.gethostname())),const.REQUEST)) # if the player has been handed a playerIndex, send the status of your ship else: myId = self.engine.entMgr.playerIndex myEnt = self.engine.entMgr.entities[myId] outgoingMsgs.append(messages.pack(messages.StatusMessage(myId,myEnt.pos,myEnt.dir,myEnt.colVel,myEnt.speed,myEnt.pitch, myEnt.roll,myEnt.isReady),const.STATUS)) # send outgoing messages for msg in outgoingMsgs: self.broadcaster.addMessage(msg)