def process(ediparts, p): if len(ediparts) == 2: # Player wants waypoint set: WPT x,y wpid = config.min_player_wpid + p.id wppos = [int(x) for x in ediparts[1]] wptitle = config.player_wp_fmtstring.format(p=p) wp = waypoint.by_id(wpid) if not wp: wp = waypoint.Waypoint(wpid, wppos, wptitle) waypoint.all.append(wp) wp.owner = p.id network.to_ready(edicomm.encode('WPT', wpid, wppos, wptitle, p.id)) elif len(ediparts) == 1: # Player wants waypoint deleted wpid = config.min_player_wpid + p.id wp = waypoint.by_id(wpid) if wp: waypoint.all.remove(wp) network.to_ready(edicomm.encode('WPT', wpid)) else: print 'Malformed WPT: {0}'.format( edicomm.encode(ediparts) ) raise EDIException(99, 'Wrong argument count!')
def new_nick(self, nick): if not self.nick: # First-time setting? self.metanick = nick tok = auth.player_token(nick) tokens.append(tok) self.enqueue(edicomm.encode("TOK", tok)) self.nick = nick self.enqueue(edicomm.encode("USN", nick))
def process(ediparts, p): if len(ediparts) != 2: raise edicomm.EDIException(99, 'Wrong argument count!') # TODO: Validation! newname = ediparts[1] print 'Player', p.id, 'sets name to', newname, 'from', p.name p.name = newname network.to_ready(edicomm.encode('USN', p.id, p.name)) p.ready = True nickmap = [edicomm.encode('USN', pl.id, pl.name) for pl in player.all if pl.ready] wpt_map = [edicomm.encode('WPT', wp.id, wp.position, wp.title, wp.owner) for wp in waypoint.all] p.enqueue('\n'.join(nickmap + wpt_map))
def process(ediparts, p): if len(ediparts) != 2: raise edicomm.EDIException(99, "Wrong argument count!") desired_shot = [int(x) for x in ediparts[1]] network.to_observing_at(desired_shot, edicomm.encode("USF", p.id, desired_shot)) # HACK: Quick and dirty "death" of player that gets shot for pl in player.all: if not pl.id == p.id and pl.contains(desired_shot): pl.position = locals.spawn pl.velocity = [0, 0]
def found_terminator(self): data = ''.join(self.recv_buffer) data = data.strip() if self.long_data: self.long_data = False self.set_terminator('\n') self.push(edicomm.encode('WAR', 2, 'Exited long data mode.')) messages.enqueue(self.addr, data) self.recv_buffer = []
def wp_handler(str, cl): parts = str.split(' ', 4) if len(parts) == 1: # Just wp by itself lists waypoints print 'ID\ttitle\tposition' for wp in waypoint.all: print wp.id, '\t', wp.title, '\t', wp.position elif len(parts) == 2: # wp <wpid> deletes waypoints wpid = int(parts[1]) wp = waypoint.by_id(wpid) if not wp: print 'No waypoint with id {0}'.format(wpid) return print 'Deleting waypoint {wp.id} at {wp.position} titled {wp.title}'.format(wp=wp) waypoint.all.remove(wp) network.to_ready(edicomm.encode('WPT', wpid)) elif len(parts) == 4: # wp <id> <x,y> <title> makes/moves waypoints wpid = int(parts[1]) wppos = [int(x) for x in parts[2].split(',')] wptitle = parts[3] wp = waypoint.by_id(wpid) if not wp: wp = waypoint.Waypoint(wpid, wppos, wptitle) waypoint.all.append(wp) wp.position = wppos wp.title = wptitle print 'Created/moved/named waypoint {wp.id} at {wp.position} titled {wp.title}'.format(wp=wp) network.to_ready(edicomm.encode('WPT', wpid, wppos, wptitle))
def forget_handler(str, cl): parts = str.split(' ', 2) if len(parts) == 1: print 'Missing argument, try "help forget" for usage info.' return try: p = player.by_partial_name(parts[1]) except PlayerAmbiguityError as e: print 'Found two players with same partial name: {e.p_one.name} and {e.p_two.name}'.format(e=e) return if not p: print 'Couldn\'t find player with prefix', parts[1] return # TODO: Should notify player of being kicked print 'Forgetting player', p.name network.to_ready( edicomm.encode( 'USD', p.id, 'Player kicked.' ) ) player.all.remove(p)
def check_input(): global sock while True: # breakout by return a few lines below socks = select.select([sock], [], [], 0) if len(socks[0]) == 0: return try: data, addr = sock.recvfrom(1500) except socket.error: # Swallowing socket.error 10054 because UDP shouldn't f*****g care! continue data = data.strip() if data != '': print 'got data: ', data, 'from', addr try: actions.dispatch(edicomm.decode(data), addr) except edicomm.EDIException as e: sock.sendto(edicomm.encode('ERR', str(e.id), e.msg), addr)
def process(ediparts, addr): if len(ediparts) != 2: raise edicomm.EDIException(99, 'Wrong argument count!') # TODO: Validation! token = ediparts[1] print 'Got new player with token', token if token not in player.tokens: player.tokens.append(token) newid = player.tokens.index(token) p = player.by_token(token) if not p: p = player.new_player(newid + 1, token) p.addr = addr p.enqueue(edicomm.encode('UID', p.id)) print 'Player (token:', token, ') got id', p.id
def move(self): if not self.ready: return newpos = [int(vel / 10) + pos for(vel, pos) in zip(self.velocity, self.position)] if newpos[0] < 0 or newpos[0] > locals.width: self.velocity[0] = 0 newpos[0] = self.position[0] if newpos[1] < 0 or newpos[1] > locals.height: self.velocity[1] = 0 newpos[1] = self.position[1] newrot = self.rotation if self.velocity != [0,0]: newrot = degrees(atan2(self.velocity[0], self.velocity[1])) self.position = newpos self.rotation = newrot self.tank_rect.topleft = newpos network.to_observing(self, edicomm.encode('USP', self.id, self.position, self.rotation))
def set_long_data(self): self.long_data = True self.set_terminator('\n.\n') self.push(edicomm.encode('WAR', 1, 'Entering long data mode, end with "." by itself on a line.'))