Beispiel #1
0
    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
Beispiel #3
0
    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")
Beispiel #4
0
 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
Beispiel #6
0
    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)
Beispiel #7
0
 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
Beispiel #8
0
    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")
Beispiel #9
0
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
Beispiel #10
0
"""
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",