def processCmd(self): while not self.conn.recvQueue.empty(): try: cmdDict = self.conn.recvQueue.get_nowait() if cmdDict is None: break except Queue.Empty: break cmdDict = fromGzJson(cmdDict) cmd = cmdDict.get("cmd") if cmd == "gameState": putParams2Queue(self.conn.sendQueue, cmd="reqState") self.applyState(cmdDict) if self.myteam is not None: self.makeClientAIAction() elif cmd == "actACK": pass elif cmd == "teamInfo": teamname = cmdDict.get("teamname") teamid = cmdDict.get("teamid") self.myteam = {"teamname": teamname, "teamid": teamid, "teamStartTime": self.thistick} Log.info("joined %s %s", teamname, teamid) Log.info("%s", self.myteam) putParams2Queue(self.conn.sendQueue, cmd="reqState") else: Log.warn("unknown cmd %s", cmdDict)
def process1Cmd(self, idno, packet): cmdDict = fromGzJson(packet) cmd = cmdDict.get('cmd') if cmd == 'gameState': self.reqState() self.applyState(cmdDict) if not self.allInited: # first time allSent = True for i, c in self.clientDict.iteritems(): if self.makeClientAIAction(i) is not True: allSent = False if allSent: self.allInited = True elif cmd == 'actACK': self.makeClientAIAction(idno) elif cmd == 'teamInfo': self.madeTeam(idno, cmdDict) else: Log.warn('unknown cmd %s', cmdDict)
def process1Cmd(self, client, packet): cmdDict = fromGzJson(packet) cmd = cmdDict.get('cmd') if cmd == 'gameState': client.reqState() self.applyState(cmdDict) if not self.allInited: # first time allSent = True for c in self.clients: if self.makeClientAIAction(c) is not True: allSent = False if allSent: self.allInited = True elif cmd == 'actACK': if client.teaminfo is not None: self.makeClientAIAction(client) elif cmd == 'teamInfo': client.madeTeam(cmdDict) client.teaminfo['teamStartTime'] = self.thistick else: Log.warn('unknown cmd %s', cmdDict)
def stringReceived(self, string): cmdDict = fromGzJson(string) self.factory.game.process1Cmd(self, cmdDict)
def run(self): self.profile = ProfileMixin(g_profile) self.profile.begin() self.recvcount, self.sendcount = 0, 0 Log.critical('GameLogicServer initing pid:%s', self.pid) self.FPSInit(getFrameTime, 60) self.dispgroup = {} self.dispgroup['effectObjs'] = GameObjectGroup().initialize( gameObj=self, spriteClass=SpriteObj, teamcolor=(0x7f, 0x7f, 0x7f)) self.dispgroup['objplayers'] = [] self.statObjN = Statistics() self.statCmpN = Statistics() self.statGState = Statistics() self.clients = {} # clientid : team info self.gameState = toGzJson({ 'cmd': 'gameState', 'frameinfo': {k: v for k, v in self.frameinfo.iteritems() if k in ['thisFrameTime']}, 'objplayers': [og.serialize() for og in self.dispgroup['objplayers']], 'effectObjs': self.dispgroup['effectObjs'].serialize() }) self.quit = False self.registerRepeatFn(self.prfps, 1) self.r2c = {} self.w2c = {} for c in self.channels: self.r2c[c.reader] = c self.w2c[c.writer] = c Log.info('GameLogicServer inited') for ch in self.channels: ch.writeTo(((0, 0), None)) # run server # main loop self.recvlist = [self.toMainCh.reader] + [ c.reader for c in self.channels] self.sendlist = [] while not self.quit: self.sendlist = [o.writer for o in self.channels if o.canSend()] inputready, outputready, exceptready = select.select( self.recvlist, self.sendlist, [], 0) if len(inputready) == 0 and len(outputready) == 0: self.FPSRun() self.FPSYield() for i in inputready: if i == self.toMainCh.reader: self.quit = True break else: if i in self.r2c: clientid, packet = self.r2c[i].readFrom() cmdDict = fromGzJson(packet) self.do1ClientCmd(self.r2c[i], clientid, cmdDict) else: Log.critical('invalid reader %s', i) for o in outputready: if o in self.w2c: self.w2c[o].writeFromQueue() else: Log.critical('invalid writer %s', i) for ch in self.channels: ch.writeTo(((0, -1), None)) # quit server Log.info('end doGame') self.prfps(0) self.profile.end()
def stringReceived(self, string): self.factory.recvcount += 1 self.factory.sendcount += 1 cmdDict = fromGzJson(string) self.factory.process1Cmd(self, cmdDict)