Fix gapple bugs and unload far chunks
This commit is contained in:
		
							
								
								
									
										11
									
								
								bot.py
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								bot.py
									
									
									
									
									
								
							@@ -51,12 +51,13 @@ def tick(global_state):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    target = None
 | 
					    target = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    try:
 | 
					    # make sure current chunks are loaded for physics
 | 
				
			||||||
        g.chunks.get_block_at(*utils.pint(p))
 | 
					    if not g.chunks.check_loaded(p, 9):
 | 
				
			||||||
    except ChunkNotLoadedException:
 | 
					        packet = serverbound.play.PositionAndLookPacket(x=p.x, feet_y=p.y, z=p.z, pitch=0, yaw=0, on_ground=True)
 | 
				
			||||||
 | 
					        g.connection.write_packet(packet, force=True)
 | 
				
			||||||
        return
 | 
					        return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    #g.jobstate.run()
 | 
					    g.chunks.unload_chunks(p)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if g.path and len(g.path):
 | 
					    if g.path and len(g.path):
 | 
				
			||||||
        target = LPoint3f(g.path[0])
 | 
					        target = LPoint3f(g.path[0])
 | 
				
			||||||
@@ -194,7 +195,7 @@ def bot(global_state):
 | 
				
			|||||||
            time.sleep(utils.TICK)
 | 
					            time.sleep(utils.TICK)
 | 
				
			||||||
        print('Player loaded.')
 | 
					        print('Player loaded.')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        while not g.chunks.check_loaded(g.pos):
 | 
					        while not g.chunks.check_loaded(g.pos, 529):
 | 
				
			||||||
            time.sleep(utils.TICK)
 | 
					            time.sleep(utils.TICK)
 | 
				
			||||||
        print('Chunks loaded.')
 | 
					        print('Chunks loaded.')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								game.py
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								game.py
									
									
									
									
									
								
							@@ -240,11 +240,15 @@ class Game:
 | 
				
			|||||||
                print(traceback.format_exc())
 | 
					                print(traceback.format_exc())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def handle_position_and_look(self, packet):
 | 
					    def handle_position_and_look(self, packet):
 | 
				
			||||||
        print('pos and look:')
 | 
					 | 
				
			||||||
        print(packet)
 | 
					        print(packet)
 | 
				
			||||||
        p = LPoint3f(x=packet.x, y=packet.y, z=packet.z)
 | 
					        p = LPoint3f(x=packet.x, y=packet.y, z=packet.z)
 | 
				
			||||||
        self.g.pos = p
 | 
					        self.g.pos = p
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        confirm_packet = serverbound.play.TeleportConfirmPacket()
 | 
				
			||||||
 | 
					        confirm_packet.teleport_id = packet.teleport_id
 | 
				
			||||||
 | 
					        self.g.connection.write_packet(confirm_packet)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def handle_chat(self, message):
 | 
					    def handle_chat(self, message):
 | 
				
			||||||
        source, text = message
 | 
					        source, text = message
 | 
				
			||||||
        reply = None
 | 
					        reply = None
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										32
									
								
								jobs.py
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								jobs.py
									
									
									
									
									
								
							@@ -38,15 +38,19 @@ class FindGappleStates:
 | 
				
			|||||||
        step = utils.spiral(self.count)
 | 
					        step = utils.spiral(self.count)
 | 
				
			||||||
        step_scaled = utils.pmul(step, 192)
 | 
					        step_scaled = utils.pmul(step, 192)
 | 
				
			||||||
        self.coord = utils.padd(self.origin, step_scaled)
 | 
					        self.coord = utils.padd(self.origin, step_scaled)
 | 
				
			||||||
        self.coord = utils.padd(self.coord, (0, 50, 0))
 | 
					        self.coord = (self.coord[0], 50, self.coord[2])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        print('count:', self.count, 'teleporting to:', self.coord)
 | 
					        print('count:', self.count, 'teleporting to:', self.coord)
 | 
				
			||||||
        self.g.chat.send('/tp {} {} {}'.format(*self.coord))
 | 
					        self.g.chat.send('/tp {} {} {}'.format(*self.coord))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.g.command_lock = True
 | 
				
			||||||
        self.state = self.wait_for_load
 | 
					        self.state = self.wait_for_load
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def wait_for_load(self):
 | 
					    def wait_for_load(self):
 | 
				
			||||||
        if self.g.chunks.check_loaded(self.g.pos):
 | 
					        if self.g.command_lock:
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if self.g.chunks.check_loaded(self.g.pos, 169):
 | 
				
			||||||
            print('chunks have been loaded')
 | 
					            print('chunks have been loaded')
 | 
				
			||||||
            self.state = self.pick_chest
 | 
					            self.state = self.pick_chest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -56,9 +60,16 @@ class FindGappleStates:
 | 
				
			|||||||
            chest_list.extend(self.g.chunks.index.get(chest_id, []))
 | 
					            chest_list.extend(self.g.chunks.index.get(chest_id, []))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for chest in chest_list:
 | 
					        for chest in chest_list:
 | 
				
			||||||
            if chest in self.checked_chests: continue
 | 
					            if chest in self.checked_chests:
 | 
				
			||||||
 | 
					                # slow but simple
 | 
				
			||||||
 | 
					                continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if utils.phyp_king(self.coord, chest) > 96:
 | 
				
			||||||
 | 
					                # skip because we can't detect item drops
 | 
				
			||||||
 | 
					                continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            self.current_chest = chest
 | 
					            self.current_chest = chest
 | 
				
			||||||
 | 
					            self.checked_chests.append(self.current_chest)
 | 
				
			||||||
            self.state = self.break_chest
 | 
					            self.state = self.break_chest
 | 
				
			||||||
            break
 | 
					            break
 | 
				
			||||||
        else: # for
 | 
					        else: # for
 | 
				
			||||||
@@ -68,13 +79,21 @@ class FindGappleStates:
 | 
				
			|||||||
    def break_chest(self):
 | 
					    def break_chest(self):
 | 
				
			||||||
        print('Breaking chest', self.current_chest)
 | 
					        print('Breaking chest', self.current_chest)
 | 
				
			||||||
        self.g.command_lock = True
 | 
					        self.g.command_lock = True
 | 
				
			||||||
 | 
					        self.g.item_lock = True
 | 
				
			||||||
        self.g.chat.send('/setblock {} {} {} air destroy'.format(*self.current_chest))
 | 
					        self.g.chat.send('/setblock {} {} {} air destroy'.format(*self.current_chest))
 | 
				
			||||||
        self.checked_chests.append(self.current_chest)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.wait_time = 0.5
 | 
				
			||||||
        self.state = self.wait_for_items
 | 
					        self.state = self.wait_for_items
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def wait_for_items(self):
 | 
					    def wait_for_items(self):
 | 
				
			||||||
        if not self.g.command_lock:
 | 
					        # wait for command to execute
 | 
				
			||||||
 | 
					        if self.g.command_lock:
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # wait for items to drop
 | 
				
			||||||
 | 
					        if self.wait_time > 0:
 | 
				
			||||||
 | 
					            self.wait_time -= utils.TICK
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
            print('done waiting for items')
 | 
					            print('done waiting for items')
 | 
				
			||||||
            self.state = self.pick_chest
 | 
					            self.state = self.pick_chest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -95,6 +114,7 @@ class FindGappleStates:
 | 
				
			|||||||
        self.coord = None
 | 
					        self.coord = None
 | 
				
			||||||
        self.current_chest = None
 | 
					        self.current_chest = None
 | 
				
			||||||
        self.checked_chests = []
 | 
					        self.checked_chests = []
 | 
				
			||||||
 | 
					        self.wait_time = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def run(self):
 | 
					    def run(self):
 | 
				
			||||||
        self.state()
 | 
					        self.state()
 | 
				
			||||||
@@ -602,7 +622,7 @@ class JobStates:
 | 
				
			|||||||
        if s1.state == s1.idle:
 | 
					        if s1.state == s1.idle:
 | 
				
			||||||
            s1.state = s1.init
 | 
					            s1.state = s1.init
 | 
				
			||||||
        elif s1.state == s1.done:
 | 
					        elif s1.state == s1.done:
 | 
				
			||||||
            s1.state = s1.init
 | 
					            s1.state = s1.tp_to_coord
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        s1.run()
 | 
					        s1.run()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,7 @@
 | 
				
			|||||||
import os
 | 
					import os
 | 
				
			||||||
from math import floor
 | 
					from math import floor
 | 
				
			||||||
import json
 | 
					import json
 | 
				
			||||||
 | 
					import time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from minecraft.networking.packets import clientbound, serverbound
 | 
					from minecraft.networking.packets import clientbound, serverbound
 | 
				
			||||||
from protocol import packets
 | 
					from protocol import packets
 | 
				
			||||||
@@ -112,11 +113,10 @@ class ChunksManager:
 | 
				
			|||||||
        if not c: return None
 | 
					        if not c: return None
 | 
				
			||||||
        c.set_block_at(x%16, y%16, z%16, block)
 | 
					        c.set_block_at(x%16, y%16, z%16, block)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def check_loaded(self, position):
 | 
					    def check_loaded(self, position, steps):
 | 
				
			||||||
        #for i in range(441): # TODO: base off render_distance?
 | 
					 | 
				
			||||||
        x, y, z = utils.pint(position)
 | 
					        x, y, z = utils.pint(position)
 | 
				
			||||||
        player_chunk = (x//16, 1, z//16)
 | 
					        player_chunk = (x//16, 1, z//16)
 | 
				
			||||||
        for i in range(121): # TODO: base off render_distance?
 | 
					        for i in range(steps): # TODO: base off render_distance?
 | 
				
			||||||
            offset = utils.spiral(i)
 | 
					            offset = utils.spiral(i)
 | 
				
			||||||
            check = utils.padd(player_chunk, offset)
 | 
					            check = utils.padd(player_chunk, offset)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -125,6 +125,24 @@ class ChunksManager:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        return True
 | 
					        return True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def unload_chunks(self, position):
 | 
				
			||||||
 | 
					        start = time.time()
 | 
				
			||||||
 | 
					        x, y, z = utils.pint(position)
 | 
				
			||||||
 | 
					        player_chunk = (x//16, 0, z//16)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        loaded_chunks = list(self.chunks.keys())
 | 
				
			||||||
 | 
					        count = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for chunk in loaded_chunks:
 | 
				
			||||||
 | 
					            check = (chunk[0], 0, chunk[2])
 | 
				
			||||||
 | 
					            if utils.phyp_king(player_chunk, check) > 16:
 | 
				
			||||||
 | 
					                del self.chunks[chunk]
 | 
				
			||||||
 | 
					                count += 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if count:
 | 
				
			||||||
 | 
					            print('unloaded', count, 'chunks in', time.time()-start, 's')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ChunkNotLoadedException(Exception):
 | 
					class ChunkNotLoadedException(Exception):
 | 
				
			||||||
    def __str__(self):
 | 
					    def __str__(self):
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								utils.py
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								utils.py
									
									
									
									
									
								
							@@ -25,6 +25,10 @@ def phyp_bias(p1, p2, origin):
 | 
				
			|||||||
    height_diff = height_diff*8 if height_diff < 0 else height_diff*0.5
 | 
					    height_diff = height_diff*8 if height_diff < 0 else height_diff*0.5
 | 
				
			||||||
    return hypot(p1[0] - p2[0], height_diff, p1[2] - p2[2]) + origin_distance*0.5
 | 
					    return hypot(p1[0] - p2[0], height_diff, p1[2] - p2[2]) + origin_distance*0.5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def phyp_king(p1, p2):
 | 
				
			||||||
 | 
					    # calculates the Chebyshev distance
 | 
				
			||||||
 | 
					    return max(abs(p1[0] - p2[0]), abs(p1[1] - p2[1]), abs(p1[2] - p2[2]))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def pint(p):
 | 
					def pint(p):
 | 
				
			||||||
    return (floor(p[0]), floor(p[1]), floor(p[2]))
 | 
					    return (floor(p[0]), floor(p[1]), floor(p[2]))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user