From 211fdd1f3a8a8bc6ca7d822cda83c1193e2db6cd Mon Sep 17 00:00:00 2001 From: will-emmerson Date: Sat, 13 Jan 2018 20:13:32 +0000 Subject: [PATCH 1/5] Awful pygame gui --- gui-client.py | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 gui-client.py diff --git a/gui-client.py b/gui-client.py new file mode 100644 index 0000000..4126d19 --- /dev/null +++ b/gui-client.py @@ -0,0 +1,99 @@ +import sys +from threading import Thread +from time import sleep + +import pygame + +from airmash.client import Client + +client = Client(enable_debug=False, enable_chat=False) + + +@client.on('PLAYER_HIT') +def on_hit(client, message): + for player in message.players: + if player.id == client.player.id: + print("Uh oh! I've been hit!") + + +kwargs = dict( + name='z', + flag='GB', + region='eu', + room='ffa1', + enable_trace=False +) + +t = Thread(target=client.connect, kwargs=kwargs) +t.start() + + +size = width, height = 1000, 800 +black = 0, 0, 0 +white = 255, 255, 255 +red = 255, 0, 0 +green = 0, 255, 0 +blue = 0, 0, 255 +player_size = 50 + +pygame.init() +font = pygame.font.SysFont('', 20) +clock = pygame.time.Clock() +screen = pygame.display.set_mode(size) + +keys = { + pygame.K_w: 'UP', + pygame.K_s: 'DOWN', + pygame.K_a: 'LEFT', + pygame.K_d: 'RIGHT', + pygame.K_SPACE: 'FIRE', + pygame.K_LSHIFT: 'SPECIAL', +} + +while not client.connected: + sleep(0.1) + +while 1: + + for event in pygame.event.get(): + if event.type == pygame.QUIT: + sys.exit() + + elif event.type == pygame.KEYDOWN: + d = keys.get(event.key) + if d: + client.key(d, True) + + elif event.type == pygame.KEYUP: + d = keys.get(event.key) + if d: + client.key(d, False) + + screen.fill(black) + + me = client.player + for player in list(client.players.values()): + if not player.online: + continue + x = player.posX - me.posX + (width / 2.0) + y = player.posY - me.posY + (height / 2.0) + if 0 < x < width and 0 < y < height: + colour = blue if player == me else green + pygame.draw.rect(screen, colour, (x, y, player_size, player_size)) + textsurface = font.render(player.name, False, white) + screen.blit(textsurface, (x, y)) + + for projectile in list(client.projectiles.values()): + if not projectile.online: + continue + x = projectile.posX - me.posX + (width / 2.0) + y = projectile.posY - me.posY + (height / 2.0) + if 0 < x < width and 0 < y < height: + pygame.draw.rect(screen, red, (x, y, 20, 20)) + label = f'{projectile.speedX:.1f} {projectile.accelX:.1f}' + # print(label) + textsurface = font.render(label, False, white) + screen.blit(textsurface, (x, y)) + + pygame.display.flip() + clock.tick(30) From c8d61ccfe9d46b672ccff9fc4b5fd25244323bf3 Mon Sep 17 00:00:00 2001 From: will-emmerson Date: Sun, 14 Jan 2018 10:25:24 +0000 Subject: [PATCH 2/5] Try and debug missile issue --- airmash/client.py | 19 +++++++++++++----- airmash/mob.py | 14 ++++++++++++- airmash/player.py | 9 +++++++++ gui-client.py | 50 ++++++++++++++++++++++++----------------------- 4 files changed, 62 insertions(+), 30 deletions(-) diff --git a/airmash/client.py b/airmash/client.py index 0c92631..4e2522e 100644 --- a/airmash/client.py +++ b/airmash/client.py @@ -20,7 +20,9 @@ def __init__(self, enable_debug=False, enable_chat=True): def on(self, key, handler=None): def decorate(handler): - self._handlers[key] = handler + keys = [key] if isinstance(key, str) else key + for k in keys: + self._handlers[k] = handler if handler is None: return decorate @@ -116,6 +118,10 @@ def process_message(self, message): self.send(cmd) self.connected = True + + Mob.start_time = message.clock + Player.start_time = message.clock + return self._call_handler(message) if message.command == 'SERVER_MESSAGE': @@ -176,7 +182,8 @@ def process_message(self, message): if message.command == 'PLAYER_FIRE': for projectile in message.projectiles: self._debug_print(packets.DEBUG_ACTION, u"New projectile of type {}".format(projectile.type)) - self.projectiles[projectile.id] = Mob(projectile.id, self.players[message.id], projectile) + self.projectiles[projectile.id] = Mob( + projectile.id, self.players[message.id], projectile, clock=message.clock) return self._call_handler(message) if message.command == 'EVENT_STEALTH': @@ -193,9 +200,11 @@ def process_message(self, message): self._debug_print(packets.DEBUG_ACTION, u"{} uses repel. {} self.players and {} self.projectiles repelled.".format(self.players[message.id].name, len(message.players), len(message.mobs))) for projectile in message.mobs: if projectile.id in self.projectiles: - self.projectiles[projectile.id].update(projectile, new_owner=self.players[message.id]) + self.projectiles[projectile.id].update( + projectile, new_owner=self.players[message.id], clock=message.clock) else: - self.projectiles[projectile.id] = Mob(projectile.id, self.players[message.id], projectile) + self.projectiles[projectile.id] = Mob( + projectile.id, self.players[message.id], projectile, clock=message.clock) return self._call_handler(message) return self._call_handler(message) @@ -242,7 +251,7 @@ def process_message(self, message): self.projectiles[message.id].update(message) else: self._debug_print(packets.DEBUG_INFO, u"Mob type of {} does not exist? {}".format(message.type, message.id)) - self.projectiles[message.id] = Mob(message.id, None, message) + self.projectiles[message.id] = Mob(message.id, None, message, clock=message.clock) return self._call_handler(message) if message.command in ['MOB_DESPAWN', 'MOB_DESPAWN_COORDS']: diff --git a/airmash/mob.py b/airmash/mob.py index 516ac47..b999d65 100644 --- a/airmash/mob.py +++ b/airmash/mob.py @@ -1,5 +1,8 @@ class Mob(): - def __init__(self, id, owner, data={}): + start_time = None + + def __init__(self, id, owner, data={}, clock=0): + self.clock = clock self.online = True self.id = id self.owner = owner @@ -7,6 +10,14 @@ def __init__(self, id, owner, data={}): self._handlers = {} self.update(data) + @property + def age(self): + return (self.clock - Mob.start_time) / 1e6 + + def __str__(self): + owner = self.owner.name if self.owner else 'Unknown' + return f'id:{self.id} clock:{self.age:.1f} pos:({self.posX:.1f}, {self.posY:.1f})' + def despawn(self): self.active = False self._handle_change('despawn', True, False) @@ -20,6 +31,7 @@ def update(self, data, new_owner=None): old = self.__dict__.copy() + self.clock = self._get_default(data, 'clock', 0) self.type = self._get_default(data, 'type', 0) self.posX = self._get_default(data, 'posX', 0) self.posY = self._get_default(data, 'posY', 0) diff --git a/airmash/player.py b/airmash/player.py index cdbbb0a..90a968d 100644 --- a/airmash/player.py +++ b/airmash/player.py @@ -4,6 +4,9 @@ def ks(player, k, a, b): print("[{}] {}: {}".format(player.name, k, a)) class Player(): + + start_time = None + def __init__(self, id, data={}): self.online = True self.id = id @@ -14,6 +17,12 @@ def __init__(self, id, data={}): #self._handlers['upgrades'] = ks #self._handlers['keystate'] = ks + @property + def age(self): + return (self.clock - Player.start_time) / 1e6 + + def __str__(self): + return f'{self.name} id:{self.id} clock:{self.age:.1f} pos:({self.posX:.1f}, {self.posY:.1f})' def update(self, data): old = self.__dict__.copy() diff --git a/gui-client.py b/gui-client.py index 4126d19..807917b 100644 --- a/gui-client.py +++ b/gui-client.py @@ -1,3 +1,4 @@ +import os import sys from threading import Thread from time import sleep @@ -16,6 +17,11 @@ def on_hit(client, message): print("Uh oh! I've been hit!") +@client.on(['MOB_DESPAWN', 'MOB_DESPAWN_COORDS', 'MOB_UPDATE', 'MOB_UPDATE_STATIONARY']) +def md(client, message): + print(message) + + kwargs = dict( name='z', flag='GB', @@ -27,15 +33,17 @@ def on_hit(client, message): t = Thread(target=client.connect, kwargs=kwargs) t.start() - -size = width, height = 1000, 800 +size = width, height = 900, 1000 black = 0, 0, 0 white = 255, 255, 255 red = 255, 0, 0 green = 0, 255, 0 blue = 0, 0, 255 + player_size = 50 +projectile_size = 20 +os.environ['SDL_VIDEO_WINDOW_POS'] = "0,20" pygame.init() font = pygame.font.SysFont('', 20) clock = pygame.time.Clock() @@ -53,6 +61,19 @@ def on_hit(client, message): while not client.connected: sleep(0.1) + +def draw(items, colour, size=player_size): + for item in items: + if not item.online: + continue + x = item.posX - me.posX + (width / 2.0) + y = item.posY - me.posY + (height / 2.0) + if 0 < x < width and 0 < y < height: + pygame.draw.rect(screen, colour, (x, y, size, size)) + textsurface = font.render(str(item), True, white) + screen.blit(textsurface, (x, y)) + + while 1: for event in pygame.event.get(): @@ -72,28 +93,9 @@ def on_hit(client, message): screen.fill(black) me = client.player - for player in list(client.players.values()): - if not player.online: - continue - x = player.posX - me.posX + (width / 2.0) - y = player.posY - me.posY + (height / 2.0) - if 0 < x < width and 0 < y < height: - colour = blue if player == me else green - pygame.draw.rect(screen, colour, (x, y, player_size, player_size)) - textsurface = font.render(player.name, False, white) - screen.blit(textsurface, (x, y)) - - for projectile in list(client.projectiles.values()): - if not projectile.online: - continue - x = projectile.posX - me.posX + (width / 2.0) - y = projectile.posY - me.posY + (height / 2.0) - if 0 < x < width and 0 < y < height: - pygame.draw.rect(screen, red, (x, y, 20, 20)) - label = f'{projectile.speedX:.1f} {projectile.accelX:.1f}' - # print(label) - textsurface = font.render(label, False, white) - screen.blit(textsurface, (x, y)) + draw([me], blue) + draw(client.players.values(), green) + draw(client.projectiles.values(), red, size=20) pygame.display.flip() clock.tick(30) From d1d3258ad11709ee999d7a3d8de27e4a016ae601 Mon Sep 17 00:00:00 2001 From: will-emmerson Date: Sun, 14 Jan 2018 10:54:15 +0000 Subject: [PATCH 3/5] better way to get age --- airmash/client.py | 2 +- airmash/mob.py | 8 +++++--- airmash/player.py | 7 ++++--- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/airmash/client.py b/airmash/client.py index 4e2522e..7926463 100644 --- a/airmash/client.py +++ b/airmash/client.py @@ -120,7 +120,7 @@ def process_message(self, message): self.connected = True Mob.start_time = message.clock - Player.start_time = message.clock + Player.current_clock = message.clock return self._call_handler(message) diff --git a/airmash/mob.py b/airmash/mob.py index b999d65..09bca20 100644 --- a/airmash/mob.py +++ b/airmash/mob.py @@ -1,8 +1,9 @@ class Mob(): - start_time = None + current_clock = 0 def __init__(self, id, owner, data={}, clock=0): self.clock = clock + Mob.current_clock = clock self.online = True self.id = id self.owner = owner @@ -12,11 +13,11 @@ def __init__(self, id, owner, data={}, clock=0): @property def age(self): - return (self.clock - Mob.start_time) / 1e6 + return (Mob.current_clock - self.clock) / 1e6 def __str__(self): owner = self.owner.name if self.owner else 'Unknown' - return f'id:{self.id} clock:{self.age:.1f} pos:({self.posX:.1f}, {self.posY:.1f})' + return f'id:{self.id} age:{self.age:.1f} pos:({self.posX:.1f}, {self.posY:.1f})' def despawn(self): self.active = False @@ -32,6 +33,7 @@ def update(self, data, new_owner=None): old = self.__dict__.copy() self.clock = self._get_default(data, 'clock', 0) + Mob.current_clock = self.clock self.type = self._get_default(data, 'type', 0) self.posX = self._get_default(data, 'posX', 0) self.posY = self._get_default(data, 'posY', 0) diff --git a/airmash/player.py b/airmash/player.py index 90a968d..9d9aabc 100644 --- a/airmash/player.py +++ b/airmash/player.py @@ -5,7 +5,7 @@ def ks(player, k, a, b): class Player(): - start_time = None + current_clock = 0 def __init__(self, id, data={}): self.online = True @@ -19,15 +19,16 @@ def __init__(self, id, data={}): #self._handlers['keystate'] = ks @property def age(self): - return (self.clock - Player.start_time) / 1e6 + return (Player.current_clock - self.clock) / 1e6 def __str__(self): - return f'{self.name} id:{self.id} clock:{self.age:.1f} pos:({self.posX:.1f}, {self.posY:.1f})' + return f'{self.name} id:{self.id} age:{self.age:.1f} pos:({self.posX:.1f}, {self.posY:.1f})' def update(self, data): old = self.__dict__.copy() self.clock = self._get_default(data, 'clock', 0) + Player.current_clock = self.clock self.status = self._get_default(data, 'status', 0) self.level = self._get_default(data, 'level', 0) self.name = self._get_default(data, 'name', "") From dc5536c11a78db8c7e19b38712dab79d4cbc52a3 Mon Sep 17 00:00:00 2001 From: will-emmerson Date: Sun, 14 Jan 2018 10:59:43 +0000 Subject: [PATCH 4/5] fix --- airmash/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airmash/client.py b/airmash/client.py index 7926463..a60bb0b 100644 --- a/airmash/client.py +++ b/airmash/client.py @@ -119,7 +119,7 @@ def process_message(self, message): self.connected = True - Mob.start_time = message.clock + Mob.current_clock = message.clock Player.current_clock = message.clock return self._call_handler(message) From efd0747bbda4065c7cd3860f0a400eb1ac886396 Mon Sep 17 00:00:00 2001 From: will-emmerson Date: Sun, 14 Jan 2018 11:29:45 +0000 Subject: [PATCH 5/5] remove player.online so both player and mob are using .active --- airmash/client.py | 2 +- airmash/mob.py | 3 +-- airmash/player.py | 2 +- gui-client.py | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/airmash/client.py b/airmash/client.py index a60bb0b..1231ffe 100644 --- a/airmash/client.py +++ b/airmash/client.py @@ -217,7 +217,7 @@ def process_message(self, message): if message.command == 'PLAYER_LEAVE': self._debug_print(packets.DEBUG_ACTION, u"{} left".format(self.players[message.id].name)) - self.players[message.id].online = False + self.players[message.id].active = False return self._call_handler(message) if message.command == 'PLAYER_NEW': diff --git a/airmash/mob.py b/airmash/mob.py index 09bca20..c192e49 100644 --- a/airmash/mob.py +++ b/airmash/mob.py @@ -4,10 +4,9 @@ class Mob(): def __init__(self, id, owner, data={}, clock=0): self.clock = clock Mob.current_clock = clock - self.online = True + self.active = True self.id = id self.owner = owner - self.active = True self._handlers = {} self.update(data) diff --git a/airmash/player.py b/airmash/player.py index 9d9aabc..09537f1 100644 --- a/airmash/player.py +++ b/airmash/player.py @@ -8,7 +8,7 @@ class Player(): current_clock = 0 def __init__(self, id, data={}): - self.online = True + self.active = True self.id = id self._handlers = {} self.update(data) diff --git a/gui-client.py b/gui-client.py index 807917b..c64da0a 100644 --- a/gui-client.py +++ b/gui-client.py @@ -64,7 +64,7 @@ def md(client, message): def draw(items, colour, size=player_size): for item in items: - if not item.online: + if not item.active: continue x = item.posX - me.posX + (width / 2.0) y = item.posY - me.posY + (height / 2.0)