def run(self): while True: data, addr = self.server.recv() pkg = Packet.unpack(data) # print "got packet: %s, %s, %s" % (pkg.tick, pkg.players, pkg.input) with self.lock: net_tick = self.parent.net_tick if addr not in self.clients: if pkg.tick == 0 and len(pkg.players) == 0 and len(pkg.input) == 0: self.clients[addr] = Client(addr, self.next_id, Player(50 + self.next_id * 30, 50)) self.next_id += 1 pkg_response = Packet(net_tick) pkg_response.add_player(self.clients[addr].id, self.clients[addr].player) self.server.send(pkg_response, addr) print "authenticating new client: %s -> %s" % (addr, self.clients[addr].id) else: print "invalid authentication attempt: %s, %s, %s" % (pkg.tick, pkg.players, pkg.input) else: client = self.clients[addr] client.ack() if pkg.tick >= net_tick: if len(pkg.input) > 0: client.events[pkg.tick] = pkg.input # if net_tick not in self.pkg_queue: # self.pkg_queue[net_tick] = [] # self.pkg_queue[net_tick].insert(0, pkg) else: print "discard packet (too old: %d < %d)" % (pkg.tick, net_tick)
def send_new_state(self): pkg_state = Packet(self.net_tick) for client in self.clients.values(): # construct current state from client data pkg_state.add_player(client.id, client.player) for addr in self.clients.keys(): # broadcast current state to all connected clients self.server.send(pkg_state, addr)