diff --git a/overviewer_core/src/mc_id.h b/overviewer_core/src/mc_id.h index 0d27a23..025d6f2 100644 --- a/overviewer_core/src/mc_id.h +++ b/overviewer_core/src/mc_id.h @@ -394,6 +394,17 @@ enum mc_block_id { block_tuff = 1109, block_pointed_dripstone = 1110, + block_powder_snow = 1111, + block_hanging_roots = 1112, + block_small_amethyst_bud = 1113, + block_medium_amethyst_bud = 1114, + block_large_amethyst_bud = 1115, + block_cave_vines_plant = 1116, + block_cave_vines = 1117, + block_lightning_rod = 1118, + block_glow_lichen = 1119, + block_spore_blossom = 1120, + // adding a gap in the numbering of walls to keep them all // in one numbering block starting at 1792 // all blocks between 1792 and 2047 are considered walls diff --git a/overviewer_core/textures.py b/overviewer_core/textures.py index b8e2b96..3f2f221 100644 --- a/overviewer_core/textures.py +++ b/overviewer_core/textures.py @@ -4654,24 +4654,29 @@ def brewing_stand(self, blockid, data): # cauldron -@material(blockid=118, data=list(range(4)), transparent=True, solid=True, nospawn=True) +@material(blockid=118, data=list(range(16)), transparent=True, solid=True, nospawn=True) def cauldron(self, blockid, data): side = self.load_image_texture("assets/minecraft/textures/block/cauldron_side.png").copy() top = self.load_image_texture("assets/minecraft/textures/block/cauldron_top.png") - bottom = self.load_image_texture("assets/minecraft/textures/block/cauldron_inner.png") - water = self.transform_image_top(self.load_image_texture("water.png")) + filltype = (data & (3 << 2)) >> 2 + if filltype == 3: + water = self.transform_image_top(self.load_image_texture("assets/minecraft/textures/block/powder_snow.png")) + elif filltype == 2: + water = self.transform_image_top(self.load_image_texture("assets/minecraft/textures/block/lava_still.png")) + else: # filltype == 1 or 0 + water = self.transform_image_top(self.load_image_texture("water.png")) # Side texture isn't transparent between the feet, so adjust the texture ImageDraw.Draw(side).rectangle((5, 14, 11, 16), outline=(0, 0, 0, 0), fill=(0, 0, 0, 0)) - if data == 0: # Empty + level = (data & 3) + if level == 0: # Empty img = self.build_full_block(top, side, side, side, side) else: # Part or fully filled - # Is filled in increments of a third, with data indicating how many thirds are filled + # Is filled in increments of a third, with level indicating how many thirds are filled img = self.build_full_block(None, side, side, None, None) - alpha_over(img, water, (0, 12 - data * 4), water) + alpha_over(img, water, (0, 12 - level * 4), water) img2 = self.build_full_block(top, None, None, side, side) alpha_over(img, img2, (0, 0), img2) - return img @@ -5289,9 +5294,12 @@ def hayblock(self, blockid, data): # carpet - wool block that's small? -@material(blockid=171, data=list(range(16)), transparent=True) +@material(blockid=171, data=list(range(17)), transparent=True) def carpet(self, blockid, data): - texture = self.load_image_texture("assets/minecraft/textures/block/%s_wool.png" % color_map[data]) + if data < 16: + texture = self.load_image_texture("assets/minecraft/textures/block/%s_wool.png" % color_map[data]) + elif data == 16: + texture = self.load_image_texture("assets/minecraft/textures/block/moss_block.png") return self.build_full_block((texture,15),texture,texture,texture,texture) @@ -6080,3 +6088,289 @@ def pointed_dripstone(self, blockid, data): else: # 0 - tip tex = self.load_image_texture("assets/minecraft/textures/block/pointed_dripstone_%s_tip.png" % (up_down)) return self.build_sprite(tex) + + +block(blockid=1111, top_image="assets/minecraft/textures/block/powder_snow.png") + + +@material(blockid=1112, data=0, transparent=True) +def hangings_roots(self, blockid, data): + tex = self.load_image_texture("assets/minecraft/textures/block/hanging_roots.png") + return self.build_sprite(tex) + + +@material(blockid=[1113, 1114, 1115], data=list(range(6)), transparent=True) +def amethyst_bud(self, blockid, data): + if blockid == 1113: + tex = self.load_image_texture("assets/minecraft/textures/block/small_amethyst_bud.png") + elif blockid == 1114: + tex = self.load_image_texture("assets/minecraft/textures/block/medium_amethyst_bud.png") + elif blockid == 1115: + tex = self.load_image_texture("assets/minecraft/textures/block/large_amethyst_bud.png") + + def draw_north(): + rotated = tex.rotate(90) + side = self.transform_image_side(rotated) + otherside = self.transform_image_top(rotated) + otherside = otherside.transpose(Image.FLIP_TOP_BOTTOM) + alpha_over(img, side, (6, 3), side) + alpha_over(img, otherside, (0, 6), otherside) + + def draw_south(): + rotated = tex.rotate(-90) + side = self.transform_image_side(rotated) + otherside = self.transform_image_top(rotated) + otherside = otherside.transpose(Image.FLIP_TOP_BOTTOM) + alpha_over(img, side, (6, 3), side) + alpha_over(img, otherside, (0, 6), otherside) + + def draw_west(): + rotated = tex.rotate(-90) + side = self.transform_image_side(rotated) + side = side.transpose(Image.FLIP_LEFT_RIGHT) + otherside = self.transform_image_top(rotated) + otherside = otherside.transpose(Image.FLIP_LEFT_RIGHT) + otherside = otherside.transpose(Image.FLIP_TOP_BOTTOM) + alpha_over(img, side, (6, 3), side) + alpha_over(img, otherside, (0, 6), otherside) + + def draw_east(): + rotated = tex.rotate(90) + side = self.transform_image_side(rotated) + side = side.transpose(Image.FLIP_LEFT_RIGHT) + otherside = self.transform_image_top(rotated) + otherside = otherside.transpose(Image.FLIP_LEFT_RIGHT) + otherside = otherside.transpose(Image.FLIP_TOP_BOTTOM) + alpha_over(img, side, (6, 3), side) + alpha_over(img, otherside, (0, 6), otherside) + + draw_funcs = [draw_east, draw_south, draw_west, draw_north] + + if data == 0: # down + tex = tex.transpose(Image.FLIP_TOP_BOTTOM) + return self.build_sprite(tex) + elif data == 1: # up + return self.build_sprite(tex) + elif data == 5: # north + img = Image.new("RGBA", (24, 24), self.bgcolor) + draw_funcs[(self.rotation + 3) % len(draw_funcs)]() + return img + elif data == 3: # south + img = Image.new("RGBA", (24, 24), self.bgcolor) + draw_funcs[(self.rotation + 1) % len(draw_funcs)]() + return img + elif data == 4: # west + img = Image.new("RGBA", (24,24), self.bgcolor) + draw_funcs[(self.rotation + 2) % len(draw_funcs)]() + return img + elif data == 2: # east + img = Image.new("RGBA", (24, 24), self.bgcolor) + draw_funcs[(self.rotation + 0) % len(draw_funcs)]() + return img + + return self.build_sprite(tex) + + +@material(blockid=[1116, 1117], data=list(range(2)), transparent=True) +def cave_vines(self, blockid, data): + if blockid == 1116: + if data == 1: + tex = self.load_image_texture("assets/minecraft/textures/block/cave_vines_plant_lit.png") + else: + tex = self.load_image_texture("assets/minecraft/textures/block/cave_vines_plant.png") + elif blockid == 1117: + if data == 1: + tex = self.load_image_texture("assets/minecraft/textures/block/cave_vines_lit.png") + else: + tex = self.load_image_texture("assets/minecraft/textures/block/cave_vines.png") + return self.build_sprite(tex) + + +@material(blockid=1118, data=list(range(6)), transparent=True, solid=True) +def lightning_rod(self, blockid, data): + tex = self.load_image_texture("assets/minecraft/textures/block/lightning_rod.png") + img = Image.new("RGBA", (24, 24), self.bgcolor) + + mask = tex.crop((0, 4, 2, 16)) + sidetex = Image.new(tex.mode, tex.size, self.bgcolor) + alpha_over(sidetex, mask, (14, 4), mask) + + mask = tex.crop((0, 0, 4, 4)) + toptex = Image.new(tex.mode, tex.size, self.bgcolor) + alpha_over(toptex, mask, (12, 0), mask) + + mask = tex.crop((0, 4, 2, 6)) + side_toptex = Image.new(tex.mode, tex.size, self.bgcolor) + alpha_over(side_toptex, mask, (12, 0), mask) + + def draw_east(): + toptex_rotated = toptex.rotate(90) + top_side = self.transform_image_side(toptex_rotated) + top_side = top_side.transpose(Image.FLIP_LEFT_RIGHT) + top_otherside = self.transform_image_top(toptex) + top_otherside = top_otherside.transpose(Image.FLIP_LEFT_RIGHT) + top_top = self.transform_image_side(toptex) + + # top + alpha_over(img, top_otherside, (6, 6), top_otherside) + # side + alpha_over(img, top_side, (8, 7), top_side) + alpha_over(img, top_top, (6, 2), top_top) + + roated_side = sidetex.rotate(90) + side = self.transform_image_side(roated_side) + side = side.transpose(Image.FLIP_TOP_BOTTOM) + otherside = self.transform_image_top(sidetex) + otherside = otherside.transpose(Image.FLIP_TOP_BOTTOM) + side_top = self.transform_image_side(side_toptex) + + alpha_over(img, otherside, (-7, 4), otherside) + alpha_over(img, side, (5, -1), side) + alpha_over(img, side_top, (-2, 9), side_top) + + def draw_south(): + roated_side = sidetex.rotate(90) + side = self.transform_image_side(roated_side) + otherside = self.transform_image_top(sidetex) + + alpha_over(img, side, (3, 6), side) + alpha_over(img, otherside, (-8, 6), otherside) + + toptex_rotated = toptex.rotate(90) + top_side = self.transform_image_side(toptex_rotated) + top_otherside = self.transform_image_top(toptex) + top_top = self.transform_image_side(toptex) + top_top = top_top.transpose(Image.FLIP_LEFT_RIGHT) + + alpha_over(img, top_side, (15, 12), top_side) + alpha_over(img, top_otherside, (5, 10), top_otherside) + alpha_over(img, top_top, (17, 7), top_top) + + def draw_west(): + roated_side = sidetex.rotate(90) + side = self.transform_image_side(roated_side) + side = side.transpose(Image.FLIP_LEFT_RIGHT) + otherside = self.transform_image_top(sidetex) + otherside = otherside.transpose(Image.FLIP_LEFT_RIGHT) + + alpha_over(img, side, (10, 6), side) + alpha_over(img, otherside, (8, 6), otherside) + + toptex_rotated = toptex.rotate(90) + top_side = self.transform_image_side(toptex_rotated) + top_side = top_side.transpose(Image.FLIP_LEFT_RIGHT) + top_otherside = self.transform_image_top(toptex) + top_otherside = top_otherside.transpose(Image.FLIP_LEFT_RIGHT) + top_top = self.transform_image_side(toptex) + + # top + alpha_over(img, top_otherside, (-3, 10), top_otherside) + # side + alpha_over(img, top_side, (0, 11), top_side) + alpha_over(img, top_top, (-3, 7), top_top) + + def draw_north(): + roated_side = sidetex.rotate(90) + side = self.transform_image_side(roated_side) + otherside = self.transform_image_top(sidetex) + + alpha_over(img, side, (4, 7), side) + alpha_over(img, otherside, (-6, 7), otherside) + + toptex_rotated = toptex.rotate(90) + top_side = self.transform_image_side(toptex_rotated) + top_otherside = self.transform_image_top(toptex) + top_top = self.transform_image_side(toptex) + top_top = top_top.transpose(Image.FLIP_LEFT_RIGHT) + alpha_over(img, top_otherside, (-4, 6), top_otherside) + alpha_over(img, top_side, (5, 7), top_side) + alpha_over(img, top_top, (8, 3), top_top) + + draw_funcs = [draw_east, draw_south, draw_west, draw_north] + + if data == 1: # up + side = self.transform_image_side(sidetex) + otherside = side.transpose(Image.FLIP_LEFT_RIGHT) + alpha_over(img, side, (0, 6 - 4), side) + alpha_over(img, otherside, (12, 6 - 4), otherside) + + top_top = self.transform_image_top(toptex) + top_side = self.transform_image_side(toptex) + top_otherside = top_side.transpose(Image.FLIP_LEFT_RIGHT) + alpha_over(img, top_side, (0, 6 - 4), top_side) + alpha_over(img, top_otherside, (12, 6 - 4), top_otherside) + alpha_over(img, top_top, (0, 5), top_top) + elif data == 0: # down + toptex_flipped = toptex.transpose(Image.FLIP_TOP_BOTTOM) + top_top = self.transform_image_top(toptex) + top_side = self.transform_image_side(toptex_flipped) + top_otherside = top_side.transpose(Image.FLIP_LEFT_RIGHT) + alpha_over(img, top_side, (0, 6 - 4), top_side) + alpha_over(img, top_otherside, (12, 6 - 4), top_otherside) + alpha_over(img, top_top, (0, 14), top_top) + + flipped = sidetex.transpose(Image.FLIP_TOP_BOTTOM) + side_top = self.transform_image_top(side_toptex) + side = self.transform_image_side(flipped) + otherside = side.transpose(Image.FLIP_LEFT_RIGHT) + alpha_over(img, side, (0, 6 - 4), side) + alpha_over(img, otherside, (12, 6 - 4), otherside) + alpha_over(img, side_top, (2, 6), side_top) + elif data == 3: # south + draw_funcs[(self.rotation + 1) % len(draw_funcs)]() + elif data == 4: # west + draw_funcs[(self.rotation + 2) % len(draw_funcs)]() + elif data == 2: # east + draw_funcs[(self.rotation + 0) % len(draw_funcs)]() + elif data == 5: # north + draw_funcs[(self.rotation + 3) % len(draw_funcs)]() + + return img + + +@material(blockid=1119, data=list(range(1 << 6)), transparent=True) +def glow_lichen(self, blockid, data): + tex = self.load_image_texture("assets/minecraft/textures/block/glow_lichen.png") + + bottom = tex if data & 1 << 0 else None + top = tex if data & 1 << 1 else None + east = tex if data & 1 << 2 else None + south = tex if data & 1 << 3 else None + west = tex if data & 1 << 4 else None + north = tex if data & 1 << 5 else None + + if self.rotation == 0: + return self.build_full_block(top, north, east, west, south, bottom) + elif self.rotation == 1: + return self.build_full_block(top, west, north, south, east, bottom) + elif self.rotation == 2: + return self.build_full_block(top, south, west, east, north, bottom) + else: # self.rotation == 3: + return self.build_full_block(top, east, south, north, west, bottom) + + +@material(blockid=1120, data=list(range(1)), transparent=True) +def spore_blossom(self, blockid, data): + leaf = self.load_image_texture("assets/minecraft/textures/block/spore_blossom.png") + base = self.load_image_texture("assets/minecraft/textures/block/spore_blossom_base.png") + img = Image.new("RGBA", (24, 24), self.bgcolor) + + side_leaf = self.transform_image_top(leaf) + alpha_over(img, side_leaf, (-6, -5), side_leaf) + + roated_leaf = leaf.rotate(90) + side_leaf = self.transform_image_top(roated_leaf) + alpha_over(img, side_leaf, (-7, 4), side_leaf) + + roated_leaf = roated_leaf.rotate(90) + side_leaf = self.transform_image_top(roated_leaf) + alpha_over(img, side_leaf, (5, 4), side_leaf) + + roated_leaf = roated_leaf.rotate(90) + side_leaf = self.transform_image_top(roated_leaf) + alpha_over(img, side_leaf, (5, -5), side_leaf) + + base_top = self.transform_image_top(base) + alpha_over(img, base_top, (0, 0), base_top) + return img + diff --git a/overviewer_core/world.py b/overviewer_core/world.py index 4ef291e..8cb6213 100644 --- a/overviewer_core/world.py +++ b/overviewer_core/world.py @@ -506,7 +506,10 @@ class RegionSet(object): 'minecraft:nether_wart': (115, 0), 'minecraft:enchanting_table': (116, 0), 'minecraft:brewing_stand': (117, 0), - 'minecraft:cauldron': (118, 0), + 'minecraft:cauldron': (118, 1 << 2), + 'minecraft:water_cauldron': (118, 1 << 2), + 'minecraft:lava_cauldron': (118, (2 << 2) | 3), + 'minecraft:powder_snow_cauldron': (118, 3 << 2), 'minecraft:end_portal': (119, 0), 'minecraft:end_portal_frame': (120, 0), 'minecraft:end_stone': (121, 0), @@ -625,6 +628,7 @@ class RegionSet(object): 'minecraft:green_carpet': (171, 13), 'minecraft:red_carpet': (171, 14), 'minecraft:black_carpet': (171, 15), + 'minecraft:moss_carpet': (171, 16), 'minecraft:terracotta': (172, 0), 'minecraft:coal_block': (173, 0), 'minecraft:packed_ice': (174, 0), @@ -848,6 +852,17 @@ class RegionSet(object): 'minecraft:tuff': (1109, 0), 'minecraft:pointed_dripstone': (1110, 0), + 'minecraft:powder_snow': (1111, 0), + 'minecraft:hanging_roots': (1112, 0), + 'minecraft:small_amethyst_bud': (1113, 0), + 'minecraft:medium_amethyst_bud': (1114, 0), + 'minecraft:large_amethyst_bud': (1115, 0), + 'minecraft:cave_vines_plant': (1116, 0), + 'minecraft:cave_vines': (1117, 0), + 'minecraft:lightning_rod': (1118, 0), + 'minecraft:glow_lichen': (1119, 0), + 'minecraft:spore_blossom': (1120, 0), + # New blocks 'minecraft:carved_pumpkin': (11300, 0), 'minecraft:spruce_pressure_plate': (11301, 0), @@ -1365,8 +1380,9 @@ class RegionSet(object): data |= 4 elif key == 'minecraft:respawn_anchor': data = int(palette_entry['Properties']['charges']) - elif key == 'minecraft:cauldron': - data = int(palette_entry['Properties'].get('level', '0')) + elif key in ['minecraft:cauldron', 'minecraft:water_cauldron', + 'minecraft:lava_cauldron', 'minecraft:powder_snow_cauldron']: + data |= int(palette_entry.get('Properties', {}).get('level', '0')) elif key == 'minecraft:structure_block': block_mode = palette_entry['Properties'].get('mode', 'save') data = {'save': 0, 'load': 1, 'corner': 2, 'data': 3}.get(block_mode, 0) @@ -1405,6 +1421,28 @@ class RegionSet(object): p = palette_entry['Properties'] data = {'tip': 0, 'tip_merge': 1, 'middle': 2, 'frustum': 3, 'base': 4}[p['thickness']] data |= {'up': 0, 'down': 0b1000}[p['vertical_direction']] + elif key in ['minecraft:small_amethyst_bud', 'minecraft:medium_amethyst_bud', 'minecraft:large_amethyst_bud', + 'minecraft:lightning_rod']: + p = palette_entry['Properties'] + data = {'down': 0, 'up': 1, 'east': 2, 'south': 3, 'west': 4, 'north': 5}[p['facing']] + elif key in ['minecraft:cave_vines_plant', 'minecraft:cave_vines']: + p = palette_entry['Properties'] + if p['berries'] == 'true': + data = 1 + elif key == 'minecraft:glow_lichen': + p = palette_entry['Properties'] + if p['down'] == 'true': + data |= 1 << 0 + if p['up'] == 'true': + data |= 1 << 1 + if p['east'] == 'true': + data |= 1 << 2 + if p['south'] == 'true': + data |= 1 << 3 + if p['west'] == 'true': + data |= 1 << 4 + if p['north'] == 'true': + data |= 1 << 5 return (block, data)