Esempio n. 1
0
 def server_processing(self,datagram):
     data_iter = PyDatagramIterator(datagram)
     msgID = data_iter.getUint16()
     if msgID == PRINT_MESSAGE:
         messageToPrint = data_iter.getString()
         print messageToPrint
     if msgID == ARMY_MOVE_REQUEST:
         army_id = data_iter.getInt16()
         ax = data_iter.getFloat64()
         ay = data_iter.getFloat64()
         tx = data_iter.getFloat64()
         ty = data_iter.getFloat64()
         base.armies[army_id].set_target(False,tx,ty)
     if msgID == CLIENT_CHAT:
         r = data_iter.getInt32()
         g = data_iter.getInt32()
         b = data_iter.getInt32()
         text = data_iter.getString()
         self.server_messager("chat_send",[(r,g,b),text])
         #base.main_menu.chat_add((r,g,b,1),text)
     if msgID == CLIENT_READY:
         but_id = data_iter.getInt32()
         state = data_iter.getInt32()
         self.server_messager("ready_button",[but_id,state])
         #base.main_menu.chat_add((r,g,b,1),text)
     if msgID == CLIENT_LOADED:
         self.server_messager("all_loaded",[])
         base.menu_manager.menus["mp-load"].load_complete()
     if msgID == CLIENT_INIT_REQUEST:
         pn = data_iter.getString()
         pk = data_iter.getString()
         base.menu_manager.menus["mp-game"].obj_list[6]["text"] = pn
         base.menu_manager.menus["mp-game"].obj_list[7]["text"] = pk
         self.server_messager("client_update",[base.menu_manager.menus["mp-game"].obj_list[4]["text"],
                                              base.menu_manager.menus["mp-game"].obj_list[5]["text"],
                                              base.menu_manager.menus["mp-game"].obj_list[8]["indicatorValue"],
                                              base.menu_manager.menus["mp-game"].map_selected])
     if msgID == BUILD_START_REQUEST:
         t_id = data_iter.getInt32()
         player = data_iter.getInt32()
         type = data_iter.getString()
         base.towers[t_id].build_start()
     if msgID == BUILD_CANCEL_REQUEST:
         t_id = data_iter.getInt32()
         player = data_iter.getInt32()
         type = data_iter.getString()
         base.towers[t_id].build_cancel()
Esempio n. 2
0
def myProcessDataFunction(datagram):
    global status, P1NAME, P2NAME, lastResetRequest
    global MY_POSITION, kicker, texKicker, texKicker2, mode

    if (role == ROLE_SERVER):
        sender = activeConnections.index(datagram.getConnection())
    data = PyDatagramIterator(datagram)
    #try:
    if True:  #just to keep the indent, in case we need "try" again.
        pktType = data.getUint16()
        if role == ROLE_SERVER:  # packets received only by server
            if pktType == PACKET_MOVE:
                setOpponentMove(data, sender + 1)
            elif pktType == PACKET_MSG:
                timer = data.getUint16()
                msg = data.getString()
                sendMessage(msg, timer)  #broadcast to all
            elif pktType == PACKET_HELLO:
                magic = data.getString()
                proto = data.getUint16()
                soft = data.getString()
                if magic != MAGIC_WORD:
                    print "Connecting party did not identify as netkickern client."
                    sys.exit(1)
                if proto != PROTOCOL_VERSION:
                    print "Connecting party used incompatible protocol version " + str(
                        proto) + "."
                    print "We are using " + str(PROTOCOL_VERSION) + "."
                    sys.exit(1)
                if soft != SOFTWARE_VERSION:
                    print "WARNING: Client is using software " + soft + "."
                print "Ok, client " + str(sender + 1) + " connected."
                status = STATUS_INIT
                qpref = PyDatagram()  #query for client preferences
                qpref.addUint16(PACKET_QPREF)
                qpref.addString(SOFTWARE_VERSION)
                cWriter.send(qpref, activeConnections[sender])
            elif pktType == PACKET_PREF:
                if status != STATUS_INIT:
                    return
                prefs = {}
                teamname = data.getString()
                prefs['team'] = teamname
                place = -1
                if (mode == MODE_4P):
                    #assign the last free position, and P1 only if the teamname matches or everything else is given away
                    if not POSITION[3]:
                        place = 3
                    if not POSITION[2]:
                        place = 2
                    if (teamname == TEAMNAME) or (place == -1):
                        if not POSITION[1]:
                            place = 1
                    print "placed player ", sender + 1, " at position ", place
                    POSITION[place] = sender + 1
                    prefs['pos'] = place
                playerPrefs[sender] = prefs
                if (mode == MODE_2P) or (0 in playerPrefs and 1 in playerPrefs
                                         and 2 in playerPrefs):
                    P1NAME = TEAMNAME
                    P2NAME = playerPrefs[0]['team']
                    rename = PyDatagram()
                    rename.addUint16(PACKET_NAME)
                    rename.addString(P1NAME)
                    rename.addString(P2NAME)
                    toAll(rename, activeConnections)
                    if (mode == MODE_4P
                        ):  #inform players of the position they play in
                        for i in range(0, 3):
                            placing = PyDatagram()
                            placing.addUint16(PACKET_PLACE)
                            placing.addUint16(playerPrefs[i]['pos'])
                            cWriter.send(placing, activeConnections[i])
                    resetNames()
                    welcome = PyDatagram()
                    welcome.addUint16(PACKET_START)
                    toAll(welcome, activeConnections)
                    startGame()
            elif pktType == PACKET_PONG:
                stime = data.getFloat64()
                now = time.time()
                deltatime = now - stime  # TODO: use this to delay mouse movements by avg(deltatime)/2
                print "player " + str(sender) + " network delay: " + str(
                    deltatime * 500) + "ms "  #rtt/2
            elif pktType == PACKET_RESET:
                lastResetRequest = time.time()
                playerPrefs[sender]['lastReset'] = lastResetRequest
                if not isResetConfirmed():
                    resetRequest = PyDatagram()  #forward to all clients
                    resetRequest.addUint16(PACKET_RESET)
                    #resetRequest.addUint16(sender) # TODO: tell everyone which player sent the request
                    toAll(resetRequest, activeConnections)
                    setMessage(
                        "Player " + str(sender + 1) +
                        " wishes to reset the ball.\nPress Space to confirm.",
                        3)
        else:  # packets received only by clients
            if pktType == PACKET_SET:
                setGameStatus(data)
            elif pktType == PACKET_SCORE:
                setScore(data)
            elif pktType == PACKET_QPREF:
                soft = data.getString()
                if soft != SOFTWARE_VERSION:
                    print "WARNING: Server is using software " + soft + "."
                status = STATUS_INIT
                pref = PyDatagram()
                pref.addUint16(PACKET_PREF)
                pref.addString(TEAMNAME)
                cWriter.send(pref, serverConnection)
            elif pktType == PACKET_START:
                print "connection to game host confirmed."
                startGame()
            elif pktType == PACKET_MSG:
                timer = data.getUint16()
                msg = data.getString()
                setMessage(msg, timer)
            elif pktType == PACKET_NAME:
                P1NAME = data.getString()
                P2NAME = data.getString()
                resetNames()
            elif pktType == PACKET_PLACE:  #4P only
                MY_POSITION = data.getUint16()
                mode = MODE_4P
                resetGameColours(kicker, texKicker, texKicker2)
            elif pktType == PACKET_PING:
                stime = data.getFloat64()
                pong = PyDatagram()
                pong.addUint16(PACKET_PONG)
                pong.addFloat64(stime)
                cWriter.send(pong, serverConnection)
            elif pktType == PACKET_RESET:
                setMessage(
                    "Another wishes to reset the ball.\nPress Space to confirm.",
                    3)
    #except Exception, e:
    #  print e
    #  sys.exit(1) #wow, this is what I call exception handling..
    return
Esempio n. 3
0
def myProcessDataFunction(datagram):
  global status, P1NAME, P2NAME, lastResetRequest
  global MY_POSITION, kicker, texKicker, texKicker2, mode

  if (role==ROLE_SERVER):
    sender = activeConnections.index(datagram.getConnection()) 
  data = PyDatagramIterator(datagram)
  #try:
  if True: #just to keep the indent, in case we need "try" again. 
    pktType = data.getUint16()
    if role==ROLE_SERVER: # packets received only by server
      if pktType==PACKET_MOVE:
        setOpponentMove(data, sender+1)
      elif pktType==PACKET_MSG:
        timer = data.getUint16()
        msg   = data.getString()
        sendMessage(msg, timer) #broadcast to all
      elif pktType==PACKET_HELLO:
        magic = data.getString()
        proto = data.getUint16()
        soft  = data.getString()
        if magic != MAGIC_WORD:
          print "Connecting party did not identify as netkickern client."
          sys.exit(1)
        if proto != PROTOCOL_VERSION:
          print "Connecting party used incompatible protocol version "+str(proto)+"."
          print "We are using "+str(PROTOCOL_VERSION)+"."
          sys.exit(1)
        if soft != SOFTWARE_VERSION:
          print "WARNING: Client is using software "+soft+"."
        print "Ok, client "+str(sender+1)+" connected."
        status = STATUS_INIT
        qpref = PyDatagram() #query for client preferences
        qpref.addUint16(PACKET_QPREF)
        qpref.addString(SOFTWARE_VERSION)
        cWriter.send(qpref, activeConnections[sender])
      elif pktType==PACKET_PREF:
        if status != STATUS_INIT:
          return
        prefs = {}
        teamname = data.getString()
        prefs['team']=teamname
        place = -1
        if (mode == MODE_4P):
          #assign the last free position, and P1 only if the teamname matches or everything else is given away
          if not POSITION[3]:
            place = 3
          if not POSITION[2]:
            place = 2
          if (teamname == TEAMNAME) or (place==-1):
            if not POSITION[1]:
              place = 1
          print "placed player ", sender+1, " at position ", place
          POSITION[place]=sender+1
          prefs['pos'] = place
        playerPrefs[sender]=prefs
        if (mode == MODE_2P) or (0 in playerPrefs and 1 in playerPrefs and 2 in playerPrefs):
          P1NAME = TEAMNAME
          P2NAME = playerPrefs[0]['team']
          rename = PyDatagram() 
          rename.addUint16(PACKET_NAME)
          rename.addString(P1NAME) 
          rename.addString(P2NAME) 
          toAll(rename, activeConnections)
          if (mode == MODE_4P): #inform players of the position they play in
            for i in range(0,3):
              placing = PyDatagram()
              placing.addUint16(PACKET_PLACE)
              placing.addUint16(playerPrefs[i]['pos'])
              cWriter.send(placing, activeConnections[i])
          resetNames()
          welcome = PyDatagram()
          welcome.addUint16(PACKET_START)
          toAll(welcome, activeConnections)
          startGame()
      elif pktType==PACKET_PONG:
        stime = data.getFloat64()
        now = time.time()
        deltatime = now-stime   # TODO: use this to delay mouse movements by avg(deltatime)/2
        print "player "+str(sender)+" network delay: "+str(deltatime*500)+"ms " #rtt/2
      elif pktType==PACKET_RESET:
        lastResetRequest = time.time()
        playerPrefs[sender]['lastReset']=lastResetRequest
        if not isResetConfirmed():
          resetRequest=PyDatagram() #forward to all clients 
          resetRequest.addUint16(PACKET_RESET)
          #resetRequest.addUint16(sender) # TODO: tell everyone which player sent the request
          toAll(resetRequest, activeConnections) 
          setMessage("Player "+str(sender+1)+" wishes to reset the ball.\nPress Space to confirm.", 3)
    else: # packets received only by clients
      if pktType==PACKET_SET:
        setGameStatus(data)
      elif pktType==PACKET_SCORE:
        setScore(data)
      elif pktType==PACKET_QPREF:
        soft = data.getString()
        if soft != SOFTWARE_VERSION:
          print "WARNING: Server is using software "+soft+"."
        status = STATUS_INIT
        pref = PyDatagram()
        pref.addUint16(PACKET_PREF)
        pref.addString(TEAMNAME)
        cWriter.send(pref, serverConnection)     
      elif pktType==PACKET_START:
        print "connection to game host confirmed."
        startGame()
      elif pktType==PACKET_MSG:
        timer = data.getUint16()
        msg   = data.getString()
        setMessage(msg, timer)
      elif pktType==PACKET_NAME:
        P1NAME = data.getString()
        P2NAME = data.getString()
        resetNames()
      elif pktType==PACKET_PLACE: #4P only
        MY_POSITION = data.getUint16()
        mode = MODE_4P
        resetGameColours(kicker, texKicker, texKicker2)  
      elif pktType==PACKET_PING:
        stime = data.getFloat64()
        pong = PyDatagram()
        pong.addUint16(PACKET_PONG)
        pong.addFloat64(stime)
        cWriter.send(pong, serverConnection)
      elif pktType==PACKET_RESET:
        setMessage("Another wishes to reset the ball.\nPress Space to confirm.", 3)
  #except Exception, e:
  #  print e 
  #  sys.exit(1) #wow, this is what I call exception handling.. 
  return
Esempio n. 4
0
class PlayerReg(DirectObject):
    def __init__(self):
        self.PlayerList = []
        self.active = 0
        self.timeSinceLastUpdate = 0

    def updatePlayers(self, serverClass, data, type):
        if (type == "positions"):

            self.elapsed = globalClock.getDt()
            self.timeSinceLastUpdate += self.elapsed
            if (self.timeSinceLastUpdate > 0.1):
                if (self.active):
                    self.datagram = PyDatagram()
                    self.datagram.addString("update")

                    self.datagram.addFloat64(self.active)

                    for k in range(self.active):
                        self.datagram.addFloat64(
                            self.PlayerList[k].currentPos['x'])
                        self.datagram.addFloat64(
                            self.PlayerList[k].currentPos['y'])
                        self.datagram.addFloat64(
                            self.PlayerList[k].currentPos['z'])
                        self.datagram.addFloat64(
                            self.PlayerList[k].currentPos['h'])
                        self.datagram.addFloat64(
                            self.PlayerList[k].currentPos['p'])
                        self.datagram.addFloat64(
                            self.PlayerList[k].currentPos['r'])
                    for k in self.PlayerList:
                        self.conn = k.connectionID
                        serverClass.cWriter.send(self.datagram, self.conn)
                self.timeSinceLastUpdate = 0
            return Task.cont

        if (type == "chat"):

            self.iterator = data
            self.datagram = PyDatagram()
            self.datagram.addString("chat")
            self.text = self.iterator.getString()
            self.datagram.addString(self.text)
            for k in self.PlayerList:
                serverClass.cWriter.send(self.datagram, k.connectionID)

    def updateData(self, connection, datagram, serverClass):
        self.iterator = PyDatagramIterator(datagram)
        self.type = self.iterator.getString()
        if (self.type == "positions"):
            for k in self.PlayerList:
                if (k.connectionID == connection):
                    k.currentPos['x'] = self.iterator.getFloat64()
                    k.currentPos['y'] = self.iterator.getFloat64()
                    k.currentPos['z'] = self.iterator.getFloat64()
                    k.currentPos['h'] = self.iterator.getFloat64()
                    k.currentPos['p'] = self.iterator.getFloat64()
                    k.currentPos['r'] = self.iterator.getFloat64()
        if (self.type == "chat"):
            self.updatePlayers(serverClass, self.iterator, "chat")

    def sendInitialInfo(self, i, server):
        self.con = self.PlayerList[i].connectionID
        self.datagram = PyDatagram()
        self.datagram.addString("init")
        self.datagram.addUint8(self.active)
        self.datagram.addFloat64(i)
        for k in self.PlayerList:
            self.datagram.addString(k.username)
            self.datagram.addFloat64(k.currentPos['x'])
            self.datagram.addFloat64(k.currentPos['y'])
            self.datagram.addFloat64(k.currentPos['z'])
        server.cWriter.send(self.datagram, self.con)
Esempio n. 5
0
class PlayerReg(DirectObject): #This class will regulate the players
    def __init__(self):
        self.playerList = []
        self.numofplayers = 0
        self.win1 = None
        
    
    def ProcessData(self,datagram, m,chatClass):
        #process received data
        self.iterator = PyDatagramIterator(datagram)
        self.type = self.iterator.getString()
        if (self.type == "init"):
            print "initializing"
            #initialize
            m.setPlayerNum(self.iterator.getUint8())
            self.num = self.iterator.getUint8()
            for i in range(self.num):
                if (i != m.playernum):
                    self.playerList.append(Player())
                    self.playerList[i].username = self.iterator.getString()
                    self.playerList[i].load()
                    self.playerList[i].currentPos['x'] = self.iterator.getFloat64()
                    self.playerList[i].currentPos['y'] = self.iterator.getFloat64()
                    self.playerList[i].currentPos['z'] = self.iterator.getFloat64()
                    print "player ", str(i), " initialized"
                else:
                    self.playerList.append(Player())
            self.numofplayers = self.num
            print 'draw new'
            self.win1.queue_draw()
            
        if (self.type == "update"):
            self.num = self.iterator.getUint8()
            if (self.num > self.numofplayers):
                for i in range(self.numofplayers):
                    self.playerList[i].currentPos['x'] = self.iterator.getFloat64()
                    self.playerList[i].currentPos['y'] = self.iterator.getFloat64()
                    self.playerList[i].currentPos['z'] = self.iterator.getFloat64()
                    self.playerList[i].currentPos['h'] = self.iterator.getFloat64()
                    self.playerList[i].currentPos['p'] = self.iterator.getFloat64()
                    self.playerList[i].currentPos['r'] = self.iterator.getFloat64()
                for i in range(self.numofplayers,self.num):
                    if (i != m.playernum):
                        self.playerList.append(Player())
                        self.playerList[i].load()
                        self.playerList[i].currentPos['x'] = self.iterator.getFloat64()
                        self.playerList[i].currentPos['y'] = self.iterator.getFloat64()
                        self.playerList[i].currentPos['z'] = self.iterator.getFloat64()
                        self.playerList[i].currentPos['h'] = self.iterator.getFloat64()
                        self.playerList[i].currentPos['p'] = self.iterator.getFloat64()
                        self.playerList[i].currentPos['r'] = self.iterator.getFloat64()
                    else:
                        self.playerList.append(Player())
                self.numofplayers = self.num
            else:
                for i in range(self.numofplayers):
                    self.playerList[i].currentPos['x'] = self.iterator.getFloat64()
                    self.playerList[i].currentPos['y'] = self.iterator.getFloat64()
                    self.playerList[i].currentPos['z'] = self.iterator.getFloat64()
                    self.playerList[i].currentPos['h'] = self.iterator.getFloat64()
                    self.playerList[i].currentPos['p'] = self.iterator.getFloat64()
                    self.playerList[i].currentPos['r'] = self.iterator.getFloat64()
        if (self.type == "chat"):
            self.text = self.iterator.getString()
            chatClass.setText(self.text)
       
    def updatePlayers(self,m):
        
        if (self.numofplayers != 0):
            for k in range(self.numofplayers):
                #As long as the player is not the client put it where the server says
                if(k != m.playernum):
                    self.playerList[k].model.setPosHpr(self.playerList[k].currentPos['x'],self.playerList[k].currentPos['y'],self.playerList[k].currentPos['z'],self.playerList[k].currentPos['h'],self.playerList[k].currentPos['p'],self.playerList[k].currentPos['r'])
        return Task.cont
Esempio n. 6
0
    def process_data(self, datagram):
        # process received data
        iterator = PyDatagramIterator(datagram)
        self.type = iterator.getString()

        if self.type == "init":
            logging.info("initializing")
            me.player_id = iterator.getUint8()
            self.num_players = iterator.getUint8()

            if self.num_players > 1:
                for _ in range(self.num_players):
                    username = iterator.getString()

                    self.player_dict[username] = Player()
                    self.player_dict[username].username = username
                    self.player_dict[username].load()
                    self.player_dict[username].position[
                        'x'] = iterator.getFloat64()
                    self.player_dict[username].position[
                        'y'] = iterator.getFloat64()
                    self.player_dict[username].position[
                        'z'] = iterator.getFloat64()
                    logging.info(f"player '{username}' initialized")
            datagram = PyDatagram()
            datagram.addString("introduce")
            datagram.addString(me.username)
            world_client.cWriter.send(datagram, world_client.conn)
            logging.debug("Send introduction")

        elif self.type == "update":
            self.num_players = iterator.getInt8()

            for _ in range(self.num_players):
                username = iterator.getString()

                if username == me.username:
                    for i in range(6):
                        iterator.getFloat64()  # TODO: Implement check
                    continue

                if username not in self.player_dict.keys():
                    self.player_dict[username] = Player(username)
                    self.player_dict[username].load()

                self.player_dict[username].position['x'] = iterator.getFloat64(
                )
                self.player_dict[username].position['y'] = iterator.getFloat64(
                )
                self.player_dict[username].position['z'] = iterator.getFloat64(
                )
                self.player_dict[username].position['h'] = iterator.getFloat64(
                )
                self.player_dict[username].position['p'] = iterator.getFloat64(
                )
                self.player_dict[username].position['r'] = iterator.getFloat64(
                )

        elif self.type == "remove":
            username = iterator.getString()
            self.player_dict[username].model.removeNode()
            del self.player_dict[username]

        elif self.type == "chat":
            self.text = iterator.getString()
            chat_reg.setText(self.text)
Esempio n. 7
0
class PlayerReg(
        DirectObject
):  #This class will hold anything that is related to regulating clients
    def __init__(self):
        self.PlayerList = []
        self.active = 0
        self.timeSinceLastUpdate = 0

    def updatePlayers(self, serverClass, data, type):
        if (type == "positions"):
            #keep players updated on their position
            self.elapsed = globalClock.getDt()
            self.timeSinceLastUpdate += self.elapsed
            if (self.timeSinceLastUpdate > 0.1):
                if (self.active):
                    self.datagram = PyDatagram()
                    self.datagram.addString("update")
                    #add the number of players
                    self.datagram.addFloat64(self.active)
                    #add every players current position
                    for k in range(self.active):
                        self.datagram.addFloat64(
                            self.PlayerList[k].currentPos['x'])
                        self.datagram.addFloat64(
                            self.PlayerList[k].currentPos['y'])
                        self.datagram.addFloat64(
                            self.PlayerList[k].currentPos['z'])
                        self.datagram.addFloat64(
                            self.PlayerList[k].currentPos['h'])
                        self.datagram.addFloat64(
                            self.PlayerList[k].currentPos['p'])
                        self.datagram.addFloat64(
                            self.PlayerList[k].currentPos['r'])
                    for k in self.PlayerList:
                        self.conn = k.connectionID
                        serverClass.cWriter.send(self.datagram, self.conn)
                self.timeSinceLastUpdate = 0
            return Task.cont

        if (type == "chat"):
            #Keep players up to date with all the chat thats goin on
            self.iterator = data
            self.datagram = PyDatagram()
            self.datagram.addString("chat")
            self.text = self.iterator.getString()
            self.datagram.addString(self.text)
            print self.text, ' ', str(serverClass)
            for k in self.PlayerList:
                serverClass.cWriter.send(self.datagram, k.connectionID)

    def updateData(self, connection, datagram, serverClass):
        self.iterator = PyDatagramIterator(datagram)
        self.type = self.iterator.getString()
        if (self.type == "positions"):
            for k in self.PlayerList:
                if (k.connectionID == connection):
                    k.currentPos['x'] = self.iterator.getFloat64()
                    k.currentPos['y'] = self.iterator.getFloat64()
                    k.currentPos['z'] = self.iterator.getFloat64()
                    k.currentPos['h'] = self.iterator.getFloat64()
                    k.currentPos['p'] = self.iterator.getFloat64()
                    k.currentPos['r'] = self.iterator.getFloat64()
        if (self.type == "chat"):
            self.updatePlayers(serverClass, self.iterator, "chat")

    def sendInitialInfo(self, i, server):  #Initialize the new Player
        self.con = self.PlayerList[
            i].connectionID  #set the connection to the player's connection
        self.datagram = PyDatagram()  #create a datagram instance
        self.datagram.addString(
            "init")  #specify to the client that this is an init type packet
        self.datagram.addUint8(
            self.active
        )  #specify the player's number (not sure why this is here)
        self.datagram.addFloat64(
            i)  #specify number of players (same as player's number)
        for k in self.PlayerList:  #Add the current position of everyone in the game world and send it
            self.datagram.addString(k.username)
            self.datagram.addFloat64(k.currentPos['x'])
            self.datagram.addFloat64(k.currentPos['y'])
            self.datagram.addFloat64(k.currentPos['z'])
        server.cWriter.send(self.datagram, self.con)
Esempio n. 8
0
 def client_processing(self,datagram):
     data_iter = PyDatagramIterator(datagram)
     msgID = data_iter.getUint16()
     if msgID == PRINT_MESSAGE:
         messageToPrint = data_iter.getString()
         print messageToPrint
     if msgID == ARMY_MOVE:
         army_id = data_iter.getInt16()
         ax = data_iter.getFloat64()
         ay = data_iter.getFloat64()
         tx = data_iter.getFloat64()
         ty = data_iter.getFloat64()
         base.armies[army_id].node_path.setX(ax)
         base.armies[army_id].node_path.setY(ay)
         base.armies[army_id].move_to_point(tx,ty)
     if msgID == CLIENT_INIT_UPDATE:
         p1_name = data_iter.getString()
         p1_kingdom = data_iter.getString()
         p1_ready = data_iter.getInt32()
         game_map = data_iter.getInt32()
         base.menu_manager.menus["mp-game"].client_update(p1_name,p1_kingdom,p1_ready,game_map)
     if msgID == SERVER_CHAT:
         r = data_iter.getInt32()
         g = data_iter.getInt32()
         b = data_iter.getInt32()
         text = data_iter.getString()
         base.menu_manager.menus["mp-game"].chat_add((r,g,b),text)
     if msgID == SERVER_READY:
         but_id = data_iter.getInt32()
         state = data_iter.getInt32()
         base.menu_manager.menus["mp-game"].obj_list[but_id]["indicatorValue"]=state
         base.menu_manager.menus["mp-game"].start_game_check()
     if msgID == SERVER_LOADED:
         base.menu_manager.menus["mp-load"].load()
     if msgID == ALL_LOADED:
         base.menu_manager.menus["mp-load"].load_complete()
     if msgID == GAME_START:
         base.menu_manager.menu_goto("mp-load")
     if msgID == MAP_SET:
         map = data_iter.getInt32()
         base.menu_manager.menus["mp-game"].map_selected = map
         mapname = base.menu_manager.menus["mp-game"].maplist[map]["fullname"]
         mapimage = base.menu_manager.menus["mp-game"].maplist[map]["preview"]
         base.menu_manager.menus["mp-game"].obj_list[11]["text"]=mapname
         base.menu_manager.menus["mp-game"].obj_list[10].setImage(mapimage)
     if msgID == BATTLE_TURN:
         bat = data_iter.getInt32()
         turn = data_iter.getInt32()
         base.battles[bat].turn_change(turn)
     if msgID == BATTLE_START:
         a1 = data_iter.getInt32()
         a1_x = data_iter.getFloat32()
         a1_y = data_iter.getFloat32()
         a2 = data_iter.getInt32()
         a2_x = data_iter.getFloat32()
         a2_y = data_iter.getFloat32()
         army_start = data_iter.getInt32()
         base.armies[a1].stop()
         base.armies[a2].stop()
         base.armies[a1].node_path.setPos(a1_x,a1_y,0)
         base.armies[a2].node_path.setPos(a2_x,a2_y,0)
         base.battles.append(TimObjects.Battle([base.armies[a1],base.armies[a2]],army_start))
     if msgID == BATTLE_CLASH:
         battle = data_iter.getInt32()
         a1 = data_iter.getInt32()
         a2 = data_iter.getInt32()
         result = data_iter.getString()
         buff = data_iter.getInt8()
         base.battles[battle].clash(base.armies[a1],base.armies[a2],result,buff)
     if msgID == BATTLE_ARMYADD:
         bat = data_iter.getInt32()
         army = data_iter.getInt32()
         a_x = data_iter.getFloat32()
         a_y = data_iter.getFloat32()
         base.battles[bat].add_army(base.armies[army])
         base.armies[army].node_path.setPos(a_x,a_y,0)
     if msgID == BATTLE_END:
         bat = data_iter.getInt32()
         base.battles[bat].end()
     if msgID == BUILD_START:
         t_id = data_iter.getInt32()
         player = data_iter.getInt8()
         type = data_iter.getString()
         base.towers[t_id].build_start()
     if msgID == TOWER_CAPTURE:
         t_id = data_iter.getInt32()
         player = data_iter.getInt8()
         base.towers[t_id].change_owner(player)
     if msgID == BUILD_CANCEL:
         t_id = data_iter.getInt32()
         base.towers[t_id].build_cancel()
     if msgID == BUILD_COMPLETE:
         t_id = data_iter.getInt32()
         player = data_iter.getInt8()
         type = data_iter.getString()
         base.towers[t_id].create_counter()
Esempio n. 9
0
class PlayerReg(DirectObject):  #This class will regulate the players
    def __init__(self):
        self.playerList = []
        self.numofplayers = 0

    def ProcessData(self, datagram, m, chatClass):
        #process received data
        self.iterator = PyDatagramIterator(datagram)
        self.type = self.iterator.getString()
        if (self.type == "init"):
            print "initializing"
            #initialize
            m.setPlayerNum(self.iterator.getUint8())
            self.num = self.iterator.getFloat64()
            for i in range(int(self.num)):
                if (i != m.playernum):
                    self.playerList.append(Player())
                    self.playerList[i].username = self.iterator.getString()
                    self.playerList[i].load()
                    self.playerList[i].currentPos[
                        'x'] = self.iterator.getFloat64()
                    self.playerList[i].currentPos[
                        'y'] = self.iterator.getFloat64()
                    self.playerList[i].currentPos[
                        'z'] = self.iterator.getFloat64()
                    print "player ", str(i), " initialized"
                else:
                    self.playerList.append(Player())
            self.numofplayers = self.num
        if (self.type == "update"):
            self.num = self.iterator.getFloat64()
            if (self.num > self.numofplayers):
                for i in range(int(self.numofplayers)):
                    self.playerList[i].currentPos[
                        'x'] = self.iterator.getFloat64()
                    self.playerList[i].currentPos[
                        'y'] = self.iterator.getFloat64()
                    self.playerList[i].currentPos[
                        'z'] = self.iterator.getFloat64()
                    self.playerList[i].currentPos[
                        'h'] = self.iterator.getFloat64()
                    self.playerList[i].currentPos[
                        'p'] = self.iterator.getFloat64()
                    self.playerList[i].currentPos[
                        'r'] = self.iterator.getFloat64()
                for i in range(int(self.numofplayers), int(self.num)):
                    if (i != m.playernum):
                        self.playerList.append(Player())
                        self.playerList[i].load()
                        self.playerList[i].currentPos[
                            'x'] = self.iterator.getFloat64()
                        self.playerList[i].currentPos[
                            'y'] = self.iterator.getFloat64()
                        self.playerList[i].currentPos[
                            'z'] = self.iterator.getFloat64()
                        self.playerList[i].currentPos[
                            'h'] = self.iterator.getFloat64()
                        self.playerList[i].currentPos[
                            'p'] = self.iterator.getFloat64()
                        self.playerList[i].currentPos[
                            'r'] = self.iterator.getFloat64()
                    else:
                        self.playerList.append(Player())
                self.numofplayers = self.num
            else:
                for i in range(int(self.numofplayers)):
                    self.playerList[i].currentPos[
                        'x'] = self.iterator.getFloat64()
                    self.playerList[i].currentPos[
                        'y'] = self.iterator.getFloat64()
                    self.playerList[i].currentPos[
                        'z'] = self.iterator.getFloat64()
                    self.playerList[i].currentPos[
                        'h'] = self.iterator.getFloat64()
                    self.playerList[i].currentPos[
                        'p'] = self.iterator.getFloat64()
                    self.playerList[i].currentPos[
                        'r'] = self.iterator.getFloat64()
        if (self.type == "chat"):
            self.text = self.iterator.getString()
            chatClass.setText(self.text)

    def updatePlayers(self, m):

        if (self.numofplayers != 0):
            for k in range(int(self.numofplayers)):
                #As long as the player is not the client put it where the server says
                if (k != m.playernum):
                    self.playerList[k].model.setPosHpr(
                        self.playerList[k].currentPos['x'],
                        self.playerList[k].currentPos['y'],
                        self.playerList[k].currentPos['z'],
                        self.playerList[k].currentPos['h'],
                        self.playerList[k].currentPos['p'],
                        self.playerList[k].currentPos['r'])
        return Task.cont
Esempio n. 10
0
class PlayerReg(DirectObject): #This class will hold anything that is related to regulating clients
    def __init__(self):
        self.PlayerList = []
        self.active = 0
        self.timeSinceLastUpdate = 0
        self.elapsed = 0
    
    def updatePlayers(self,serverClass,data,type):
        if (type == "positions"):
            #keep players updated on their position
            #self.elapsed = globalClock.getDt()
            self.elapsed = 0.0001
            self.timeSinceLastUpdate += self.elapsed
            if (self.timeSinceLastUpdate > 0.1):
                self.timeSinceLastUpdate = 0
                if (self.active):
                    self.datagram = PyDatagram()
                    self.datagram.addString("update")
                    #add the number of players
                    self.datagram.addFloat64(self.active)
                    #add every players current position
                    for k in range(self.active):
                        self.datagram.addFloat64(self.PlayerList[k].currentPos['x'])
                        self.datagram.addFloat64(self.PlayerList[k].currentPos['y'])
                        self.datagram.addFloat64(self.PlayerList[k].currentPos['z'])
                        self.datagram.addFloat64(self.PlayerList[k].currentPos['h'])
                        self.datagram.addFloat64(self.PlayerList[k].currentPos['p'])
                        self.datagram.addFloat64(self.PlayerList[k].currentPos['r'])
                    for k in self.PlayerList:
                        self.conn = k.connectionID
                        serverClass.cWriter.send(self.datagram,self.conn)
                
            return Task.cont
        
        if(type == "chat"):
            #Keep players up to date with all the chat thats goin on
            self.iterator = data
            self.datagram = PyDatagram()
            self.datagram.addString("chat")
            self.text = self.iterator.getString()
            self.datagram.addString(self.text)
            print self.text,' ',str(serverClass)
            for k in self.PlayerList:
                serverClass.cWriter.send(self.datagram,k.connectionID)
                
                
        
    def updateData(self,connection, datagram,serverClass):
        self.iterator = PyDatagramIterator(datagram)
        self.type = self.iterator.getString()
        if (self.type == "positions"):
            for k in self.PlayerList:
                if (k.connectionID == connection):
                    k.currentPos['x'] = self.iterator.getFloat64()
                    k.currentPos['y'] = self.iterator.getFloat64()
                    k.currentPos['z'] = self.iterator.getFloat64()
                    k.currentPos['h'] = self.iterator.getFloat64()
                    k.currentPos['p'] = self.iterator.getFloat64()
                    k.currentPos['r'] = self.iterator.getFloat64()
        if (self.type == "chat"):
            self.updatePlayers(serverClass,self.iterator,"chat")
    
    def sendInitialInfo(self,i,server): #Initialize the new Player
        self.con = self.PlayerList[i].connectionID #set the connection to the player's connection
        self.datagram = PyDatagram() #create a datagram instance
        self.datagram.addString("init") #specify to the client that this is an init type packet
        self.datagram.addUint8(self.active) #specify the player's number (not sure why this is here)
        self.datagram.addFloat64(i) #specify number of players (same as player's number)
        for k in self.PlayerList: #Add the current position of everyone in the game world and send it
            self.datagram.addString(k.username)
            self.datagram.addFloat64(k.currentPos['x'])
            self.datagram.addFloat64(k.currentPos['y'])
            self.datagram.addFloat64(k.currentPos['z'])
        server.cWriter.send(self.datagram,self.con)