Beispiel #1
0
 def update(self, task):
     while self.reader.dataAvailable():
         datagram = NetDatagram()
         if self.reader.getData(datagram):
             dataIter = PyDatagramIterator(datagram)
             pid = dataIter.getInt8()
             x = dataIter.getFloat32()
             y = dataIter.getFloat32()
             if pid not in self.players:
                 print 'NEW PLAYER', pid
                 self.players[pid] = Player(pid=pid, draw=True)
             self.players[pid].move_to(x, y)
     return task.cont
Beispiel #2
0
 def update(self, task):
     while self.reader.dataAvailable():
         datagram = NetDatagram()
         if self.reader.getData(datagram):
             dataIter = PyDatagramIterator(datagram)
             pid = dataIter.getInt8()
             x = dataIter.getFloat32()
             y = dataIter.getFloat32()
             if pid not in self.players:
                 print 'NEW PLAYER', pid
                 self.players[pid] = Player(pid=pid, draw=True)
             self.players[pid].move_to(x, y)
     return task.cont
    def process(self, data):
        #print "Got some data"
        it = PyDatagramIterator(data)
        msgid = it.getUint8()
        
        if msgid == 1:
            direction['1']=it.getString()
            #self.printMessage("Server received:", direction['1'])
        
        if msgid == 23:
            print "server got shout out"
            update = PyDatagram()
            update.addUint8(23)
            self.Application.server.broadcast(update)
        #standard update
        if msgid == 13:
            tempID = it.getInt8()
            #print "updating position for player ", tempID
            
            self.Application.players[tempID].setX(it.getFloat32())
            self.Application.players[tempID].setY(it.getFloat32())
            self.Application.players[tempID].setZ(it.getFloat32())
            self.Application.players[tempID].setH(it.getFloat32())
            self.Application.players[tempID].setP(it.getFloat32())
            self.Application.players[tempID].setR(it.getFloat32())
            
            self.Application.players[tempID].setPythonTag("velocity",it.getFloat32())
            #self.printMessage("Server received:", direction[2])        
        
        
        elif msgid == 38:
            if self.Application.server.isStarted is True:
                print "Game over"
                data = PyDatagram()
                data.addInt8(38)
                self.Application.server.broadcast(data)
        '''if msgid == 3:
            direction['3']=it.getString()
           3 self.printMessage("Server received:", direction['3'])  

        if msgid == 4:
            direction['4']=it.getString()
            self.printMessage("Server received:", direction['4'])

        if msgid == 5:
            direction['5']=it.getString()
            self.printMessage("Server received:", direction['5'])
'''
            
        return None
Beispiel #4
0
 def _processData(self, netDatagram):
     # convert incoming Datagram to dict
     myIterator = PyDatagramIterator(netDatagram)
     msg = {}
     msg[SEQN] = myIterator.getInt32()
     msg[AKN] = myIterator.getInt32()
     msg[MSG_TYPE] = myIterator.getInt16()
     msg[OOL] = myIterator.getInt8()
     msg[OAKN] = self.decode(myIterator.getString())
     if not msg[MSG_TYPE] == MULT:
         msg[DATA] = self.decode(myIterator.getString())
     else:
         msg[DATA] = (myIterator.getString())
     # msg.append(self.decode(myIterator.getString()))
     return msg
Beispiel #5
0
 def update(self, task):
     while self.reader.dataAvailable():
         datagram = NetDatagram()
         if self.reader.getData(datagram):
             update = PyDatagramIterator(datagram)
             num_objects = update.getInt8()
             for i in range(num_objects):
                 name = update.getString()
                 x = update.getFloat32()
                 y = update.getFloat32()
                 z = update.getFloat32()
                 h = update.getFloat32()
                 p = update.getFloat32()
                 r = update.getFloat32()
                 if name.startswith('Walker') and name not in self.world.objects:
                     self.world.create_walker(name)
                 obj = self.world.objects.get(name)
                 if obj:
                     obj.move((x, y, z))
                     obj.rotate(h, p, r)
     return task.cont
Beispiel #6
0
 def update(self, task):
     while self.reader.dataAvailable():
         datagram = NetDatagram()
         if self.reader.getData(datagram):
             update = PyDatagramIterator(datagram)
             num_objects = update.getInt8()
             for i in range(num_objects):
                 name = update.getString()
                 x = update.getFloat32()
                 y = update.getFloat32()
                 z = update.getFloat32()
                 h = update.getFloat32()
                 p = update.getFloat32()
                 r = update.getFloat32()
                 if name.startswith(
                         'Walker') and name not in self.world.objects:
                     self.world.create_walker(name)
                 obj = self.world.objects.get(name)
                 if obj:
                     obj.move((x, y, z))
                     obj.rotate(h, p, r)
     return task.cont
Beispiel #7
0
class Server(QueuedConnectionManager):
    """Handles new connections and the incomming of packages"""
    def __init__(self, p, b):
        self.cManager = QueuedConnectionManager()
        self.cListener = QueuedConnectionListener(self.cManager, 0)
        self.cReader = QueuedConnectionReader(self.cManager, 0)
        self.cWriter = ConnectionWriter(self.cManager, 0)
        self.port = p
        self.backlog = b
        self.socket = self.cManager.openTCPServerRendezvous(
            self.port, self.backlog)
        self.cListener.addConnection(self.socket)
        self.player_list = []
        self.iterator = None
        self.num_count = self.active_players = self.Δt_update = self.Δt = 0

    def reader_polling_task(self, arg):
        if self.cReader.dataAvailable():
            datagram = NetDatagram()

            if self.cReader.getData(datagram):
                self.process_data(datagram.getConnection(), datagram)

        return Task.cont

    def listener_polling_task(self, arg):
        if self.cListener.newConnectionAvailable():
            rendezvous = PointerToConnection()
            net_address = NetAddress()
            new_connection = PointerToConnection()
            if self.cListener.getNewConnection(rendezvous, net_address,
                                               new_connection):
                self.active_players += 1
                new_connection = new_connection.p()
                self.player_list.append(player(self.num_count))
                find_player(self.player_list, "player_id",
                            self.num_count).conn_id = new_connection
                logging.debug(self.active_players)
                self.initialize_player()
                self.num_count += 1
                self.cReader.addConnection(
                    new_connection)  # Begin reading connection
                logging.info('connection received')
        return Task.cont

    def initialize_player(self):
        conn = self.player_list[-1].conn_id

        datagram = PyDatagram()
        datagram.addString("init")
        newest = self.player_list[-1].player_id
        datagram.addUint8(newest)
        logging.debug(
            f"{self.active_players} players and {newest} is the newest player")
        datagram.addUint8(self.active_players)

        if len(self.player_list) > 1:
            for k in self.player_list:
                datagram.addString(k.username)
                datagram.addFloat64(k.pos_and_or['x'])
                datagram.addFloat64(k.pos_and_or['y'])
                datagram.addFloat64(k.pos_and_or['z'])

        self.cWriter.send(datagram, conn)

    def update_positions(self, data):  # send
        self.Δt = globalClock.getDt()
        self.Δt_update += self.Δt
        if self.Δt_update > 0.05:
            if self.active_players > 1:
                datagram = PyDatagram()
                datagram.addString("update")
                datagram.addInt8(self.active_players)

                for p in self.player_list:
                    datagram.addString(p.username)
                    datagram.addFloat64(p.pos_and_or['x'])
                    datagram.addFloat64(p.pos_and_or['y'])
                    datagram.addFloat64(p.pos_and_or['z'])
                    datagram.addFloat64(p.pos_and_or['h'])
                    datagram.addFloat64(p.pos_and_or['p'])
                    datagram.addFloat64(p.pos_and_or['r'])

                for p in self.player_list:
                    self.cWriter.send(datagram, p.conn_id)
            self.Δt_update = 0
        return Task.cont

    def update_chat(self, msg):
        datagram = PyDatagram()

        datagram.addString("chat")
        datagram.addString(msg)

        logging.info(f"{msg}")  # TODO make this useful
        for p in self.player_list:
            self.cWriter.send(datagram, p.conn_id)

    def process_data(self, connection, datagram):
        self.iterator = PyDatagramIterator(datagram)
        msg_type = self.iterator.getString()

        if msg_type == "position":
            self.process_position(connection)
        elif msg_type == "chat":
            self.update_chat(self.iterator.getString())
        elif msg_type == "introduce":
            username = self.iterator.getString()
            logging.info(f"User {username} introduced himself")
            cls = find_player(self.player_list, "conn_id", connection)
            cls.username = username
        elif msg_type == "quit":
            self.process_quit()

    def process_position(self, connection):
        it = self.iterator
        pos_and_or = find_player(self.player_list, "conn_id",
                                 connection).pos_and_or
        pos_and_or['x'] = it.getFloat64()
        pos_and_or['y'] = it.getFloat64()
        pos_and_or['z'] = it.getFloat64()
        pos_and_or['h'] = it.getFloat64()
        pos_and_or['p'] = it.getFloat64()
        pos_and_or['r'] = it.getFloat64()

    def process_quit(self):
        logging.debug("Player has quit")
        self.active_players -= 1

        player_num = self.iterator.getInt8()
        player_cls = find_player(self.player_list, "player_id", player_num)
        player_id = self.player_list.index(player_cls)
        player_name = player_cls.username
        del self.player_list[player_id]

        datagram = PyDatagram()
        datagram.addString("remove")
        datagram.addString(player_name)

        for p in self.player_list:
            self.cWriter.send(datagram, p.conn_id)

        logging.info(f"Player {player_name} has left the game")
    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)
Beispiel #9
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()