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()
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
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
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)
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
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)
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)
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()
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
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)