示例#1
0
    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)
示例#2
0
    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)
示例#3
0
    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)
示例#4
0
 def stringReceived(self, string):
     cmdDict = fromGzJson(string)
     self.factory.game.process1Cmd(self, cmdDict)
示例#5
0
    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()
示例#6
0
 def stringReceived(self, string):
     self.factory.recvcount += 1
     self.factory.sendcount += 1
     cmdDict = fromGzJson(string)
     self.factory.process1Cmd(self, cmdDict)