diff --git a/game.py b/game.py index caaa419..2a12a93 100644 --- a/game.py +++ b/game.py @@ -327,6 +327,7 @@ class Game: register(self.handle_destroy_entities, DestroyEntitiesPacket) register(self.handle_spawn_player, SpawnPlayerPacket) register(self.handle_respawn, clientbound.play.RespawnPacket) + register(self.handle_player_list, clientbound.play.PlayerListItemPacket) #register(self.handle_entity_velocity, clientbound.play.EntityVelocityPacket) #register(self.handle_packet, Packet, early=True) @@ -454,7 +455,7 @@ class Game: reply = data if command == 'pos': - reply = str(utils.pint(self.g.pos))[1:-1] + reply = str(utils.pint(self.g.pos))[1:-1] + ', ' + self.g.dimension if command == 'afk': if not self.g.afk: @@ -512,6 +513,14 @@ class Game: if command == 'loaded': reply = str(self.g.chunks.get_loaded_area()) + if command == 'players': + if data == 'clear': + self.g.players = {} + reply = 'ok' + else: + for k, v in self.g.players.items(): + print(str(k) + ':', v, self.g.player_names[v.player_uuid]) + if command == 'objects': if data == 'clear': self.g.objects = {} @@ -672,6 +681,37 @@ class Game: self.g.job.state = self.g.job.fill_blocks reply = 'filling ' + str(utils.pvolume(coord1, coord2)) + ' with ' + blocks.BLOCKS[block] + if command == 'here': + try: + sender_uuid = self.g.player_names[sender] + except KeyError: + reply = 'can\'t find your uuid' + + if not reply: + for p in self.g.players.values(): + if p.player_uuid == sender_uuid: + player = p + break + else: # for + reply = 'can\'t find you' + + if not reply: + pos = utils.pint(self.g.pos) + goal = utils.pint((p.x, p.y, p.z)) + start = time.time() + navpath = self.g.world.path_to_place(pos, goal) + + if navpath: + self.g.path = navpath + if self.g.job: + self.g.job.stop() + print(len(navpath)) + print(navpath) + print(round(time.time() - start, 3), 'seconds') + reply = 'ok' + else: + reply = 'no path' + ################# Authorized commands ########################## if authed: @@ -936,6 +976,14 @@ class Game: mob.y += packet.delta_y / 4096.0 mob.z += packet.delta_z / 4096.0 + player = self.g.players.get(packet.entity_id, None) + if player: + player.x += packet.delta_x / 4096.0 + player.y += packet.delta_y / 4096.0 + player.z += packet.delta_z / 4096.0 + + if player.player_uuid == '0c123cfa-1697-4427-9413-4b645dee7ec0': print(packet) + def handle_entity_position_rotation(self, packet): mob = self.g.mobs.get(packet.entity_id, None) if mob: @@ -943,6 +991,14 @@ class Game: mob.y += packet.delta_y / 4096.0 mob.z += packet.delta_z / 4096.0 + player = self.g.players.get(packet.entity_id, None) + if player: + player.x += packet.delta_x / 4096.0 + player.y += packet.delta_y / 4096.0 + player.z += packet.delta_z / 4096.0 + + if player.player_uuid == '0c123cfa-1697-4427-9413-4b645dee7ec0': print(packet) + def handle_entity_velocity(self, packet): obj = self.g.objects.get(packet.entity_id, None) if obj: @@ -969,6 +1025,11 @@ class Game: print(packet) self.g.dimension = packet.world_name.replace('minecraft:', '') + def handle_player_list(self, packet): + for action in packet.actions: + if isinstance(action, packet.AddPlayerAction): + self.g.player_names[action.uuid] = action.name + self.g.player_names[action.name] = action.uuid # porque no los dos? def tick(self): if self.g.breaking: diff --git a/main.py b/main.py index ba0d156..fd377f7 100644 --- a/main.py +++ b/main.py @@ -24,6 +24,7 @@ g.inv = {} g.objects = {} g.mobs = {} g.players = {} +g.player_names = {} g.window = None g.job = None g.correction_count = 0