def _load_block_types( self, load_block_types=True, load_color=True, simple_color=False, load_material=True ): if not load_block_types: return bid_to_name = minecraft_specs.get_block_data()["bid_to_name"] color_data = minecraft_specs.get_colour_data() for (b, m), type_name in bid_to_name.items(): if b >= 256: continue memid = BlockTypeNode.create(self, type_name, (b, m)) self.add_triple(memid, "has_name", type_name) if "block" in type_name: self.add_triple(memid, "has_name", type_name.strip("block").strip()) if load_color: if simple_color: name_to_colors = color_data["name_to_simple_colors"] else: name_to_colors = color_data["name_to_colors"] if name_to_colors.get(type_name) is None: continue for color in name_to_colors[type_name]: self.add_triple(memid, "has_color", color)
def get_block_type(s) -> IDM: """string -> (id, meta) or {"has_x": span} -> (id, meta) """ name_to_bid = minecraft_specs.get_block_data()["name_to_bid"] if type(s) is str: s_aug = s + " block" _, closest_match = min( [(name, id_meta) for (name, id_meta) in name_to_bid.items() if id_meta[0] < 256], key=lambda x: min(Levenshtein.distance(x[0], s), Levenshtein.distance(x[0], s_aug)), ) else: if "has_colour" in s: c = block_data.COLOR_BID_MAP.get(s["has_colour"]) if c is not None: closest_match = random.choice(c) if "has_block_type" in s: _, closest_match = min( [(name, id_meta) for (name, id_meta) in name_to_bid.items() if id_meta[0] < 256], key=lambda x: min(Levenshtein.distance(x[0], s), Levenshtein.distance(x[0], s_aug)), ) return closest_match
def _load_schematics(self, load_minecraft_specs=True): if load_minecraft_specs: for premem in minecraft_specs.get_schematics(): npy = premem["schematic"] memid = SchematicNode.create(self, npy_to_blocks_list(npy)) if premem.get("name"): for n in premem["name"]: self.add_triple(subj=memid, pred_text="has_name", obj_text=n) self.add_triple(subj=memid, pred_text="has_tag", obj_text=n) if premem.get("tags"): for t in premem["tags"]: self.add_triple(subj=memid, pred_text="has_tag", obj_text=t) # load single blocks as schematics bid_to_name = minecraft_specs.get_block_data()["bid_to_name"] for (d, m), name in bid_to_name.items(): if d >= 256: continue memid = SchematicNode.create(self, [((0, 0, 0), (d, m))]) self.add_triple(subj=memid, pred_text="has_name", obj_text=name) if "block" in name: self.add_triple(subj=memid, pred_text="has_name", obj_text=name.strip("block").strip()) # tag single blocks with 'block' self.add_triple(subj=memid, pred_text="has_name", obj_text="block")
def create(cls, memory, item_stack) -> str: """Creates a new entry into the ReferenceObjects table Returns: string: memid of the entry Examples:: >>> memory = AgentMemory() >>> from collections import namedtuple >>> ItemStack = namedtuple("ItemStack", "entityId, pos") >>> item_stack = ItemStack(12345678, Pos(0.0, 0.0, 0.0)) >>> create(memory, item_stack) """ bid_to_name = minecraft_specs.get_block_data()["bid_to_name"] type_name = bid_to_name[(item_stack.item.id, item_stack.item.meta)] memid = cls.new(memory) memory.db_write( "INSERT INTO ReferenceObjects(uuid, eid, x, y, z, type_name, ref_type, created) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", memid, item_stack.entityId, item_stack.pos.x, item_stack.pos.y, item_stack.pos.z, type_name, "item_stack", memory.get_time(), ) memory.tag(memid, type_name) memory.tag(memid, "_item_stack") memory.tag(memid, "_on_ground") memory.tag(memid, "_physical_object") # this is a hack until memory_filters does "not" memory.tag(memid, "_not_location") return memid
def get_block_type(s) -> IDM: """string -> (id, meta)""" name_to_bid = minecraft_specs.get_block_data()["name_to_bid"] s_aug = s + " block" _, closest_match = min( [(name, id_meta) for (name, id_meta) in name_to_bid.items() if id_meta[0] < 256], key=lambda x: min(Levenshtein.distance(x[0], s), Levenshtein.distance(x[0], s_aug)), ) return closest_match
def _load_block_types( self, load_block_types=True, load_color=True, load_block_property=True, simple_color=False, load_material=True, ): """Load all block types into agent memory""" if not load_block_types: return bid_to_name = minecraft_specs.get_block_data()["bid_to_name"] color_data = minecraft_specs.get_colour_data() if simple_color: name_to_colors = color_data["name_to_simple_colors"] else: name_to_colors = color_data["name_to_colors"] block_property_data = minecraft_specs.get_block_property_data() block_name_to_properties = block_property_data["name_to_properties"] for (b, m), type_name in bid_to_name.items(): if b >= 256: continue memid = BlockTypeNode.create(self, type_name, (b, m)) self.add_triple(subj=memid, pred_text="has_name", obj_text=type_name) if "block" in type_name: self.add_triple(subj=memid, pred_text="has_name", obj_text=type_name.strip("block").strip()) if load_color: if name_to_colors.get(type_name) is not None: for color in name_to_colors[type_name]: self.add_triple(subj=memid, pred_text="has_colour", obj_text=color) if load_block_property: if block_name_to_properties.get(type_name) is not None: for property in block_name_to_properties[type_name]: self.add_triple(subj_text=memid, pred_text="has_name", obj_text=property)
def create(cls, memory, item_stack) -> str: bid_to_name = minecraft_specs.get_block_data()["bid_to_name"] type_name = bid_to_name[(item_stack.item.id, item_stack.item.meta)] memid = cls.new(memory) memory._db_write( "INSERT INTO ReferenceObjects(uuid, eid, x, y, z, type_name, ref_type, created) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", memid, item_stack.entityId, item_stack.pos.x, item_stack.pos.y, item_stack.pos.z, type_name, "item_stack", memory.get_time(), ) memory.tag(memid, type_name) memory.tag(memid, "_item_stack") memory.tag(memid, "_physical_object") # this is a hack until memory_filters does "not" memory.tag(memid, "_not_location") return memid
def _load_schematics(self, load_minecraft_specs=True): """Load all Minecraft schematics into agent memory""" if load_minecraft_specs: for premem in minecraft_specs.get_schematics(): npy = premem["schematic"] # lazy loading, only store memid in db, ((0, 0, 0), (0, 0)) as a placeholder memid = SchematicNode.create(self, [((0, 0, 0), (0, 0))]) self.schematics[memid] = npy_to_blocks_list(npy) if premem.get("name"): for n in premem["name"]: self.add_triple(subj=memid, pred_text="has_name", obj_text=n) self.add_triple(subj=memid, pred_text="has_tag", obj_text=n) if premem.get("tags"): for t in premem["tags"]: self.add_triple(subj=memid, pred_text="has_tag", obj_text=t) # load single blocks as schematics bid_to_name = minecraft_specs.get_block_data()["bid_to_name"] for (d, m), name in bid_to_name.items(): if d >= 256: continue memid = SchematicNode.create(self, [((0, 0, 0), (d, m))]) self.add_triple(subj=memid, pred_text="has_name", obj_text=name) if "block" in name: self.add_triple(subj=memid, pred_text="has_name", obj_text=name.strip("block").strip()) # tag single blocks with 'block' self.add_triple(subj=memid, pred_text="has_name", obj_text="block")
import math import numpy as np from scipy.ndimage.filters import median_filter from scipy.optimize import linprog import logging import minecraft_specs import util from block_data import BORING_BLOCKS, PASSABLE_BLOCKS from entities import MOBS_BY_ID from search import depth_first_search GROUND_BLOCKS = [1, 2, 3, 7, 8, 9, 12, 79, 80] MAX_RADIUS = 20 BLOCK_DATA = minecraft_specs.get_block_data() COLOUR = minecraft_specs.get_colour_data() BID_COLOR_DATA = minecraft_specs.get_bid_to_colours() # Taken from : stackoverflow.com/questions/16750618/ # whats-an-efficient-way-to-find-if-a-point-lies-in-the-convex-hull-of-a-point-cl def in_hull(points, x): """Check if x is in the convex hull of points""" n_points = len(points) c = np.zeros(n_points) A = np.r_[points.T, np.ones((1, n_points))] b = np.r_[x, np.ones(1)] lp = linprog(c, A_eq=A, b_eq=b) return lp.success
""" Copyright (c) Facebook, Inc. and its affiliates. """ import random import sys import argparse sys.path.append("/private/home/rebeccaqian/minecraft/python/craftassist/") import minecraft_specs from shape_helpers import SHAPE_NAMES ID_DELIM = "^" BLOCK_NAMES = [ v for k, v in minecraft_specs.get_block_data()["bid_to_name"].items() if k[0] < 256 ] COLOR_NAMES = [ "aqua", "black", "blue", "fuchsia", "green", "gray", "lime", "maroon", "navy", "olive", "purple", "red", "silver", "teal",