from minerl.herobraine.env_spec import EnvSpec from minerl.herobraine.hero import handler from minerl.herobraine.hero import handlers from minerl.herobraine.hero import mc from minerl.herobraine.hero.mc import INVERSE_KEYMAP def edit_options(**kwargs): import os, pathlib, re for word in os.popen('pip3 --version').read().split(' '): if '-packages/pip' in word: break else: raise RuntimeError('Could not found python package directory.') packages = pathlib.Path(word).parent filename = packages / 'minerl/Malmo/Minecraft/run/options.txt' options = filename.read_text() if 'fovEffectScale:' not in options: options += 'fovEffectScale:1.0\n' if 'simulationDistance:' not in options: options += 'simulationDistance:12\n' for key, value in kwargs.items(): assert f'{key}:' in options, key assert isinstance(value, str), (value, type(value)) options = re.sub(f'{key}:.*\n', f'{key}:{value}\n', options) filename.write_text(options) edit_options( difficulty='2', renderDistance='6', simulationDistance='6', fovEffectScale='0.0', ao='1', gamma='5.0', ) class MineRLEnv(EnvSpec): def __init__(self, resolution=(64, 64), break_speed=50, gamma=10.0): self.resolution = resolution self.break_speed = break_speed self.gamma = gamma super().__init__(name='MineRLEnv-v1') def create_agent_start(self): return [ BreakSpeedMultiplier(self.break_speed), ] def create_agent_handlers(self): return [] def create_server_world_generators(self): return [handlers.DefaultWorldGenerator(force_reset=True)] def create_server_quit_producers(self): return [handlers.ServerQuitWhenAnyAgentFinishes()] def create_server_initial_conditions(self): return [ handlers.TimeInitialCondition( allow_passage_of_time=True, start_time=0, ), handlers.SpawningInitialCondition( allow_spawning=True, ) ] def create_observables(self): return [ handlers.POVObservation(self.resolution), handlers.FlatInventoryObservation(mc.ALL_ITEMS), handlers.EquippedItemObservation( mc.ALL_ITEMS, _default='air', _other='other'), handlers.ObservationFromCurrentLocation(), handlers.ObservationFromLifeStats(), ] def create_actionables(self): kw = dict(_other='none', _default='none') return [ handlers.KeybasedCommandAction('forward', INVERSE_KEYMAP['forward']), handlers.KeybasedCommandAction('back', INVERSE_KEYMAP['back']), handlers.KeybasedCommandAction('left', INVERSE_KEYMAP['left']), handlers.KeybasedCommandAction('right', INVERSE_KEYMAP['right']), handlers.KeybasedCommandAction('jump', INVERSE_KEYMAP['jump']), handlers.KeybasedCommandAction('sneak', INVERSE_KEYMAP['sneak']), handlers.KeybasedCommandAction('attack', INVERSE_KEYMAP['attack']), handlers.CameraAction(), handlers.PlaceBlock(['none'] + mc.ALL_ITEMS, **kw), handlers.EquipAction(['none'] + mc.ALL_ITEMS, **kw), handlers.CraftAction(['none'] + mc.ALL_ITEMS, **kw), handlers.CraftNearbyAction(['none'] + mc.ALL_ITEMS, **kw), handlers.SmeltItemNearby(['none'] + mc.ALL_ITEMS, **kw), ] def is_from_folder(self, folder): return folder == 'none' def get_docstring(self): return '' def determine_success_from_rewards(self, rewards): return True def create_rewardables(self): return [] def create_server_decorators(self): return [] def create_mission_handlers(self): return [] def create_monitors(self): return [] class BreakSpeedMultiplier(handler.Handler): def __init__(self, multiplier=1.0): self.multiplier = multiplier def to_string(self): return f'break_speed({self.multiplier})' def xml_template(self): return '{{multiplier}}' class Gamma(handler.Handler): def __init__(self, gamma=2.0): self.gamma = gamma def to_string(self): return f'gamma({self.gamma})' def xml_template(self): return '{{gamma}}' NOOP_ACTION = dict( camera=(0, 0), forward=0, back=0, left=0, right=0, attack=0, sprint=0, jump=0, sneak=0, craft='none', nearbyCraft='none', nearbySmelt='none', place='none', equip='none', )