From 5be1d62e152ca17fcce0c54e92a15690c3434baa Mon Sep 17 00:00:00 2001 From: Andrew Chin Date: Sat, 8 Mar 2014 13:02:01 -0500 Subject: [PATCH 01/22] New blocks for snapshot Granite, Diorite, Andesite (new data values for blockid:1) Iron trapdoor See #1062 --- overviewer_core/textures.py | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/overviewer_core/textures.py b/overviewer_core/textures.py index e01ce08..999f2a8 100644 --- a/overviewer_core/textures.py +++ b/overviewer_core/textures.py @@ -864,7 +864,23 @@ def billboard(blockid=[], imagename=None, **kwargs): ## # stone -block(blockid=1, top_image="assets/minecraft/textures/blocks/stone.png") +@material(blockid=1, data=range(7), solid=True) +def stone(self, blockid, data): + if data == 0: # regular old-school stone + img = self.load_image_texture("assets/minecraft/textures/blocks/stone.png") + elif data == 1: # granite + img = self.load_image_texture("assets/minecraft/textures/blocks/stone_granite.png") + elif data == 2: # polished granite + img = self.load_image_texture("assets/minecraft/textures/blocks/stone_granite_smooth.png") + elif data == 3: # diorite + img = self.load_image_texture("assets/minecraft/textures/blocks/stone_diorite.png") + elif data == 4: # polished diorite + img = self.load_image_texture("assets/minecraft/textures/blocks/stone_diorite_smooth.png") + elif data == 5: # andesite + img = self.load_image_texture("assets/minecraft/textures/blocks/stone_andesite.png") + elif data == 6: # polished andesite + img = self.load_image_texture("assets/minecraft/textures/blocks/stone_andesite_smooth.png") + return self.build_block(img, img) @material(blockid=2, data=range(11)+[0x10,], solid=True) def grass(self, blockid, data): @@ -3216,7 +3232,7 @@ def comparator(self, blockid, data): # trapdoor # the trapdoor is looks like a sprite when opened, that's not good -@material(blockid=96, data=range(16), transparent=True, nospawn=True) +@material(blockid=[96,167], data=range(16), transparent=True, nospawn=True) def trapdoor(self, blockid, data): # rotation @@ -3238,7 +3254,10 @@ def trapdoor(self, blockid, data): elif (data & 0b0011) == 3: data = data & 0b1100 | 0 # texture generation - texture = self.load_image_texture("assets/minecraft/textures/blocks/trapdoor.png") + if blockid == 96: + texture = self.load_image_texture("assets/minecraft/textures/blocks/trapdoor.png") + else: + texture = self.load_image_texture("assets/minecraft/textures/blocks/iron_trapdoor.png") if data & 0x4 == 0x4: # opened trapdoor if data & 0x3 == 0: # west img = self.build_full_block(None, None, None, None, texture) From a6922e4ab71ce5f2e51de4c52806bd9affd2cea2 Mon Sep 17 00:00:00 2001 From: Andrew Chin Date: Sat, 8 Mar 2014 13:09:15 -0500 Subject: [PATCH 02/22] New snapshot block: slime blocks See #1062 --- overviewer_core/textures.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/overviewer_core/textures.py b/overviewer_core/textures.py index 999f2a8..78b1d97 100644 --- a/overviewer_core/textures.py +++ b/overviewer_core/textures.py @@ -4224,6 +4224,9 @@ def hopper(self, blockid, data): return img +# slime block +block(blockid=165, top_image="assets/minecraft/textures/blocks/slime.png") + # hay block @material(blockid=170, data=range(9), solid=True) def hayblock(self, blockid, data): From a5b7c9617f908a9cb21544c23d578fb8ab0dcef7 Mon Sep 17 00:00:00 2001 From: kiyote Date: Sat, 29 Mar 2014 09:17:59 -0500 Subject: [PATCH 03/22] Added ['time'] attribute to Players POI It's nice that we can see where a player was at logout, but now we can see when that logout was. --- overviewer_core/aux_files/genPOI.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/overviewer_core/aux_files/genPOI.py b/overviewer_core/aux_files/genPOI.py index 5fa4b00..9ca0b92 100755 --- a/overviewer_core/aux_files/genPOI.py +++ b/overviewer_core/aux_files/genPOI.py @@ -15,6 +15,7 @@ markers.js holds a list of which markerSets are attached to each tileSet ''' import os +import time import logging import json import sys @@ -161,6 +162,8 @@ def handlePlayers(rset, render, worldpath): data['x'] = int(data['Pos'][0]) data['y'] = int(data['Pos'][1]) data['z'] = int(data['Pos'][2]) + # Time at last logout, calculated from last time the player's file was modified + data['time'] = time.ctime(os.path.getmtime(os.path.join(playerdir, playerfile)) rset._pois['Players'].append(data) if "SpawnX" in data and dimension == 0: # Spawn position (bed or main spawn) From 37711f6b798e1cf274a3544e2b4433987c70cace Mon Sep 17 00:00:00 2001 From: Dan Berglund Date: Fri, 20 Jun 2014 11:35:21 -0700 Subject: [PATCH 04/22] add new 14w25a prismarine and sea lantern blocks --- overviewer_core/textures.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/overviewer_core/textures.py b/overviewer_core/textures.py index 36e8a65..9c613fc 100644 --- a/overviewer_core/textures.py +++ b/overviewer_core/textures.py @@ -4227,6 +4227,24 @@ def hopper(self, blockid, data): # slime block block(blockid=165, top_image="assets/minecraft/textures/blocks/slime.png") +# prismarine block +@material(blockid=168, data=range(3), solid=True) +def prismarine_block(self, blockid, data): + + if data == 0: # prismarine + t = self.load_image_texture("assets/minecraft/textures/blocks/prismarine_rough.png") + elif data == 1: # prismarine bricks + t = self.load_image_texture("assets/minecraft/textures/blocks/prismarine_bricks.png") + elif data == 2: # dark prismarine + t = self.load_image_texture("assets/minecraft/textures/blocks/prismarine_dark.png") + + img = self.build_block(t, t) + + return img + +# sea lantern +block(blockid=169, top_image="assets/minecraft/textures/blocks/sea_lantern.png") + # hay block @material(blockid=170, data=range(9), solid=True) def hayblock(self, blockid, data): From 6cca3ed004ec6d547a886389eaeeda9c55dbf131 Mon Sep 17 00:00:00 2001 From: Brooks Date: Wed, 30 Jul 2014 22:24:23 -0400 Subject: [PATCH 05/22] Latest version of minecraft jar Updated the version variable in the short script to install the latest minecraft jar for textures. --- docs/running.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/running.rst b/docs/running.rst index 6ccfb96..2da1557 100644 --- a/docs/running.rst +++ b/docs/running.rst @@ -261,13 +261,13 @@ If you want or need to provide your own textures, you have several options: :: - VERSION=1.7.2 + VERSION=1.7.10 wget https://s3.amazonaws.com/Minecraft.Download/versions/${VERSION}/${VERSION}.jar -P ~/.minecraft/versions/${VERSION}/ If that's too confusing for you, then just take this single line and paste it into - a terminal to get 1.7.2 textures:: + a terminal to get 1.7.10 textures:: - wget https://s3.amazonaws.com/Minecraft.Download/versions/1.7.2/1.7.2.jar -P ~/.minecraft/versions/1.7.2/ + wget https://s3.amazonaws.com/Minecraft.Download/versions/1.7.10/1.7.10.jar -P ~/.minecraft/versions/1.7.10/ * You can also just run the launcher to install the client. From 55bbe26916b8558844a419973873986d663d1064 Mon Sep 17 00:00:00 2001 From: Franz Dietrich Date: Fri, 1 Aug 2014 00:25:39 +0200 Subject: [PATCH 06/22] Fix error in the config.rst file --- docs/config.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/config.rst b/docs/config.rst index fe90c6a..c617f52 100644 --- a/docs/config.rst +++ b/docs/config.rst @@ -625,7 +625,7 @@ Rendering 'crop': (-500, -500, 500, 500), } - Example that renders two 500 by 500 squares of land: + Example that renders two 500 by 500 squares of land:: renders['myrender'] = { 'world': 'myworld', From 59d277a13142f52fa02eeb5dfd9e7e3df13d5d04 Mon Sep 17 00:00:00 2001 From: Andrew Chin Date: Tue, 19 Aug 2014 21:28:25 -0400 Subject: [PATCH 07/22] Change ctime to localtime. See discussion in #1082 --- overviewer_core/aux_files/genPOI.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/overviewer_core/aux_files/genPOI.py b/overviewer_core/aux_files/genPOI.py index 8c9910a..a6c6f83 100755 --- a/overviewer_core/aux_files/genPOI.py +++ b/overviewer_core/aux_files/genPOI.py @@ -191,7 +191,7 @@ def handlePlayers(rset, render, worldpath): data['y'] = int(data['Pos'][1]) data['z'] = int(data['Pos'][2]) # Time at last logout, calculated from last time the player's file was modified - data['time'] = time.ctime(os.path.getmtime(os.path.join(playerdir, playerfile)) + data['time'] = time.localtime(os.path.getmtime(os.path.join(playerdir, playerfile))) rset._pois['Players'].append(data) if "SpawnX" in data and dimension == 0: # Spawn position (bed or main spawn) From 322922b8e65bc7f4b4664cf2bcb3883e386fdff2 Mon Sep 17 00:00:00 2001 From: Andrew Chin Date: Tue, 19 Aug 2014 22:08:15 -0400 Subject: [PATCH 08/22] Implement a UUID lookup cache, to avoid hitting the mojang server so much The cache is a gzip'd JSON file. Soon we will have a small script to help manage the cache See #1090 and #1117 --- overviewer_core/aux_files/genPOI.py | 44 +++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/overviewer_core/aux_files/genPOI.py b/overviewer_core/aux_files/genPOI.py index a6c6f83..199cfd6 100755 --- a/overviewer_core/aux_files/genPOI.py +++ b/overviewer_core/aux_files/genPOI.py @@ -23,6 +23,7 @@ import re import urllib2 import Queue import multiprocessing +import gzip from multiprocessing import Process from multiprocessing import Pool @@ -121,6 +122,30 @@ def handleEntities(rset, outputdir, render, rname, config): class PlayerDict(dict): use_uuid = False _name = '' + uuid_cache = None # A cache the UUID->profile lookups + + @classmethod + def load_cache(cls, outputdir): + cache_file = os.path.join(outputdir, "uuidcache.dat") + pid = multiprocessing.current_process().pid + if os.path.exists(cache_file): + gz = gzip.GzipFile(cache_file) + cls.uuid_cache = json.load(gz) + logging.info("Loaded UUID cache from %r with %d entries", cache_file, len(cls.uuid_cache.keys())) + else: + cls.uuid_cache = {} + logging.info("Initialized an empty UUID cache") + cls.save_cache(outputdir) + + + @classmethod + def save_cache(cls, outputdir): + cache_file = os.path.join(outputdir, "uuidcache.dat") + gz = gzip.GzipFile(cache_file, "wb") + json.dump(cls.uuid_cache, gz) + logging.info("Wrote UUID cache with %d entries", len(cls.uuid_cache.keys())) + + def __getitem__(self, item): if item == "EntityId": if not super(PlayerDict, self).has_key("EntityId"): @@ -132,14 +157,22 @@ class PlayerDict(dict): return super(PlayerDict, self).__getitem__(item) def get_name_from_uuid(self): + sname = self._name.replace('-','') try: - profile = json.loads(urllib2.urlopen(UUID_LOOKUP_URL + self._name.replace('-','')).read()) + profile = PlayerDict.uuid_cache[sname] + return profile['name'] + except (KeyError,): + pass + + try: + profile = json.loads(urllib2.urlopen(UUID_LOOKUP_URL + sname).read()) if 'name' in profile: + PlayerDict.uuid_cache[sname] = profile return profile['name'] except (ValueError, urllib2.URLError): logging.warning("Unable to get player name for UUID %s", self._name) -def handlePlayers(rset, render, worldpath): +def handlePlayers(rset, render, worldpath, outputdir): if not hasattr(rset, "_pois"): rset._pois = dict(TileEntities=[], Entities=[]) @@ -168,6 +201,7 @@ def handlePlayers(rset, render, worldpath): isSinglePlayer = True rset._pois['Players'] = [] + for playerfile in playerfiles: try: data = PlayerDict(nbt.load(os.path.join(playerdir, playerfile))[1]) @@ -252,6 +286,8 @@ def main(): markersets = set() markers = dict() + PlayerDict.load_cache(destdir) + for rname, render in config['renders'].iteritems(): try: worldpath = config['worlds'][render['world']] @@ -291,7 +327,7 @@ def main(): if not options.skipscan: handleEntities(rset, os.path.join(destdir, rname), render, rname, config) - handlePlayers(rset, render, worldpath) + handlePlayers(rset, render, worldpath, destdir) handleManual(rset, render['manualpois']) logging.info("Done handling POIs") @@ -402,6 +438,8 @@ def main(): markerSetDict[name]['raw'].append(d) #print markerSetDict + PlayerDict.save_cache(destdir) + with open(os.path.join(destdir, "markersDB.js"), "w") as output: output.write("var markersDB=") json.dump(markerSetDict, output, indent=2) From 924d3967584d33b3f46b006b109950d87384db87 Mon Sep 17 00:00:00 2001 From: Andrew Chin Date: Tue, 19 Aug 2014 22:49:33 -0400 Subject: [PATCH 09/22] Show an ETA when using the plain text logger Closes #1088 --- overviewer_core/observer.py | 41 +++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/overviewer_core/observer.py b/overviewer_core/observer.py index 32a472c..e17c8f5 100644 --- a/overviewer_core/observer.py +++ b/overviewer_core/observer.py @@ -92,17 +92,50 @@ class LoggingObserver(Observer): #this is an easy way to make the first update() call print a line self.last_update = -101 + # a fake ProgressBar, for the sake of ETA + class FakePBar(object): + def __init__(self): + self.maxval = None + self.currval = 0 + self.finished = False + self.start_time = None + self.seconds_elapsed = 0 + def finish(self): + self.update(self.maxval) + def update(self, value): + assert 0 <= value <= self.maxval + self.currval = value + if self.finished: + return False + if not self.start_time: + self.start_time = time.time() + self.seconds_elapsed = time.time() - self.start_time + + if value == self.maxval: + self.finished = True + + self.fake = FakePBar(); + self.eta = progressbar.ETA() + + def start(self, max_value): + self.fake.maxval = max_value + super(LoggingObserver, self).start(max_value) + + def finish(self): - logging.info("Rendered %d of %d. %d%% complete", self.get_max_value(), - self.get_max_value(), 100.0) + self.fake.finish() + logging.info("Rendered %d of %d. %d%% complete. %s", self.get_max_value(), + self.get_max_value(), 100.0, self.eta.update(self.fake)) super(LoggingObserver, self).finish() def update(self, current_value): super(LoggingObserver, self).update(current_value) + self.fake.update(current_value) + if self._need_update(): - logging.info("Rendered %d of %d. %d%% complete", + logging.info("Rendered %d of %d. %d%% complete. %s", self.get_current_value(), self.get_max_value(), - self.get_percentage()) + self.get_percentage(), self.eta.update(self.fake)) self.last_update = current_value return True return False From df920e60decc87ee47b0a2d3ae68f5d5e151c377 Mon Sep 17 00:00:00 2001 From: Andrew Chin Date: Tue, 26 Aug 2014 14:17:40 -0400 Subject: [PATCH 10/22] Added support for the difference fence colors --- overviewer_core/src/iterate.c | 7 +++++-- overviewer_core/textures.py | 22 +++++++++++++++++++++- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/overviewer_core/src/iterate.c b/overviewer_core/src/iterate.c index fc52b78..0f02393 100644 --- a/overviewer_core/src/iterate.c +++ b/overviewer_core/src/iterate.c @@ -309,7 +309,8 @@ generate_pseudo_data(RenderState *state, unsigned short ancilData) { } data = (check_adjacent_blocks(state, x, y, z, state->block) ^ 0x0f) | data; return (data << 4) | (ancilData & 0x0f); - } else if (state->block == 85) { /* fences */ + } else if ((state->block == 85) || (state->block == 188) || (state->block == 189) || + (state->block == 190) || (state->block == 191) || (state->block == 192)) { /* fences */ /* check for fences AND fence gates */ return check_adjacent_blocks(state, x, y, z, state->block) | check_adjacent_blocks(state, x, y, z, 107); @@ -710,7 +711,9 @@ chunk_render(PyObject *self, PyObject *args) { (state.block == 111) || (state.block == 113) || (state.block == 139) || (state.block == 175) || (state.block == 160) || (state.block == 95) || - (state.block == 146) || + (state.block == 146) || (state.block == 188) || + (state.block == 189) || (state.block == 190) || + (state.block == 191) || (state.block == 192) || is_stairs(state.block)) { ancilData = generate_pseudo_data(&state, ancilData); state.block_pdata = ancilData; diff --git a/overviewer_core/textures.py b/overviewer_core/textures.py index ab8a192..55311cc 100644 --- a/overviewer_core/textures.py +++ b/overviewer_core/textures.py @@ -2738,7 +2738,7 @@ def jukebox(self, blockid, data): # nether and normal fences # uses pseudo-ancildata found in iterate.c -@material(blockid=[85, 113], data=range(16), transparent=True, nospawn=True) +@material(blockid=[85, 188, 189, 190, 191, 192, 113], data=range(16), transparent=True, nospawn=True) def fence(self, blockid, data): # no need for rotations, it uses pseudo data. # create needed images for Big stick fence @@ -2746,6 +2746,26 @@ def fence(self, blockid, data): fence_top = self.load_image_texture("assets/minecraft/textures/blocks/planks_oak.png").copy() fence_side = self.load_image_texture("assets/minecraft/textures/blocks/planks_oak.png").copy() fence_small_side = self.load_image_texture("assets/minecraft/textures/blocks/planks_oak.png").copy() + elif blockid == 188: # spruce fence + fence_top = self.load_image_texture("assets/minecraft/textures/blocks/planks_spruce.png").copy() + fence_side = self.load_image_texture("assets/minecraft/textures/blocks/planks_spruce.png").copy() + fence_small_side = self.load_image_texture("assets/minecraft/textures/blocks/planks_spruce.png").copy() + elif blockid == 189: # birch fence + fence_top = self.load_image_texture("assets/minecraft/textures/blocks/planks_birch.png").copy() + fence_side = self.load_image_texture("assets/minecraft/textures/blocks/planks_birch.png").copy() + fence_small_side = self.load_image_texture("assets/minecraft/textures/blocks/planks_birch.png").copy() + elif blockid == 190: # jungle fence + fence_top = self.load_image_texture("assets/minecraft/textures/blocks/planks_jungle.png").copy() + fence_side = self.load_image_texture("assets/minecraft/textures/blocks/planks_jungle.png").copy() + fence_small_side = self.load_image_texture("assets/minecraft/textures/blocks/planks_jungle.png").copy() + elif blockid == 191: # big/dark oak fence + fence_top = self.load_image_texture("assets/minecraft/textures/blocks/planks_big_oak.png").copy() + fence_side = self.load_image_texture("assets/minecraft/textures/blocks/planks_big_oak.png").copy() + fence_small_side = self.load_image_texture("assets/minecraft/textures/blocks/planks_big_oak.png").copy() + elif blockid == 192: # acacia oak fence + fence_top = self.load_image_texture("assets/minecraft/textures/blocks/planks_acacia.png").copy() + fence_side = self.load_image_texture("assets/minecraft/textures/blocks/planks_acacia.png").copy() + fence_small_side = self.load_image_texture("assets/minecraft/textures/blocks/planks_acacia.png").copy() else: # netherbrick fence fence_top = self.load_image_texture("assets/minecraft/textures/blocks/nether_brick.png").copy() fence_side = self.load_image_texture("assets/minecraft/textures/blocks/nether_brick.png").copy() From e82e7bf0b2cde77adfa71625a891dff8cc3a2fa1 Mon Sep 17 00:00:00 2001 From: Andrew Chin Date: Tue, 26 Aug 2014 15:48:05 -0400 Subject: [PATCH 11/22] added support for different door types --- overviewer_core/src/iterate.c | 13 ++++++++++--- overviewer_core/textures.py | 32 +++++++++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/overviewer_core/src/iterate.c b/overviewer_core/src/iterate.c index 0f02393..f1a379f 100644 --- a/overviewer_core/src/iterate.c +++ b/overviewer_core/src/iterate.c @@ -398,7 +398,9 @@ generate_pseudo_data(RenderState *state, unsigned short ancilData) { /* portal and nether brick fences */ return check_adjacent_blocks(state, x, y, z, state->block); - } else if ((state->block == 64) || (state->block == 71)) { + } else if ((state->block == 64) || (state->block == 71) || (state->block == 193) || + (state->block == 194) || (state->block == 195) || (state->block == 196) || + (state->block ==197)) { /* use bottom block data format plus one bit for top/down * block (0x8) and one bit for hinge position (0x10) */ @@ -704,8 +706,13 @@ chunk_render(PyObject *self, PyObject *args) { * trapped chests, stairs */ if ((state.block == 2) || (state.block == 9) || (state.block == 20) || (state.block == 54) || - (state.block == 55) || (state.block == 64) || - (state.block == 71) || (state.block == 79) || + (state.block == 55) || + /* doors */ + (state.block == 64) || (state.block == 193) || + (state.block == 194) || (state.block == 195) || + (state.block == 196) || (state.block == 197) || + (state.block == 71) || /* end doors */ + (state.block == 79) || (state.block == 85) || (state.block == 90) || (state.block == 101) || (state.block == 102) || (state.block == 111) || (state.block == 113) || diff --git a/overviewer_core/textures.py b/overviewer_core/textures.py index 55311cc..df14a67 100644 --- a/overviewer_core/textures.py +++ b/overviewer_core/textures.py @@ -2195,7 +2195,7 @@ def signpost(self, blockid, data): # wooden and iron door # uses pseudo-ancildata found in iterate.c -@material(blockid=[64,71], data=range(32), transparent=True) +@material(blockid=[64,71,193,194,195,196,197], data=range(32), transparent=True) def door(self, blockid, data): #Masked to not clobber block top/bottom & swung info if self.rotation == 1: @@ -2215,9 +2215,35 @@ def door(self, blockid, data): elif (data & 0b00011) == 3: data = data & 0b11100 | 2 if data & 0x8 == 0x8: # top of the door - raw_door = self.load_image_texture("assets/minecraft/textures/blocks/%s.png" % ("door_wood_upper" if blockid == 64 else "door_iron_upper")) + if blockid == 64: # classic wood door + raw_door = self.load_image_texture("assets/minecraft/textures/blocks/door_wood_upper.png") + elif blockid == 71: # iron door + raw_door = self.load_image_texture("assets/minecraft/textures/blocks/door_iron_upper.png") + elif blockid == 193: # spruce door + raw_door = self.load_image_texture("assets/minecraft/textures/blocks/door_spruce_upper.png") + elif blockid == 194: # birch door + raw_door = self.load_image_texture("assets/minecraft/textures/blocks/door_birch_upper.png") + elif blockid == 195: # jungle door + raw_door = self.load_image_texture("assets/minecraft/textures/blocks/door_jungle_upper.png") + elif blockid == 196: # acacia door + raw_door = self.load_image_texture("assets/minecraft/textures/blocks/door_acacia_upper.png") + elif blockid == 197: # dark_oak door + raw_door = self.load_image_texture("assets/minecraft/textures/blocks/door_dark_oak_upper.png") else: # bottom of the door - raw_door = self.load_image_texture("assets/minecraft/textures/blocks/%s.png" % ("door_wood_lower" if blockid == 64 else "door_iron_lower")) + if blockid == 64: + raw_door = self.load_image_texture("assets/minecraft/textures/blocks/door_wood_lower.png") + elif blockid == 71: # iron door + raw_door = self.load_image_texture("assets/minecraft/textures/blocks/door_iron_lower.png") + elif blockid == 193: # spruce door + raw_door = self.load_image_texture("assets/minecraft/textures/blocks/door_spruce_lower.png") + elif blockid == 194: # birch door + raw_door = self.load_image_texture("assets/minecraft/textures/blocks/door_birch_lower.png") + elif blockid == 195: # jungle door + raw_door = self.load_image_texture("assets/minecraft/textures/blocks/door_jungle_lower.png") + elif blockid == 196: # acacia door + raw_door = self.load_image_texture("assets/minecraft/textures/blocks/door_acacia_lower.png") + elif blockid == 197: # dark_oak door + raw_door = self.load_image_texture("assets/minecraft/textures/blocks/door_dark_oak_lower.png") # if you want to render all doors as closed, then force # force closed to be True From 52651c034ceca3a6e3273ef7cc40d1cf9fe29b0b Mon Sep 17 00:00:00 2001 From: Ean McLaughlin Date: Sun, 31 Aug 2014 13:01:29 -0600 Subject: [PATCH 12/22] Fix a typo and silly crash case Would crash instead of gracefully exiting if a tileset dir wasn't provided. Might also change how the memory limit option works - currently has to be provided, even though that's not mentioned. --- contrib/png-it.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/contrib/png-it.py b/contrib/png-it.py index eb1776f..1466fdc 100644 --- a/contrib/png-it.py +++ b/contrib/png-it.py @@ -34,7 +34,7 @@ def main(): metavar = '', type = str, dest = 'output', default = "output.png") (options, args) = parser.parse_args() - tileset = args[0] + # arg is overviewer tile set folder if len(args) > 1: @@ -42,6 +42,7 @@ def main(): if not args: parser.error("Error! Need an overviewer tile set folder. Use --help for a complete list of options.") + tileset = args[0] #set the tileset dir after ensuring it's been provided, not before. if not options.zoom_level: parser.error("Error! The option zoom-level is mandatory.") @@ -126,7 +127,7 @@ def main(): print "The image size will be {0}x{1}".format(final_cropped_img_size[0],final_cropped_img_size[1]) print "A total of {0} MB of memory will be used.".format(mem/1024**2) if mem/1024.**2. > options.memory_limit: - print "Warning! The expected RAM usage exceeds the spicifyed limit. Exiting." + print "Warning! The expected RAM usage exceeds the specified limit. Exiting." sys.exit(1) # Create a new huge image From 5d13030834f9f4f75b036829e58864ee03be48aa Mon Sep 17 00:00:00 2001 From: Andrew Chin Date: Tue, 2 Sep 2014 10:54:13 -0400 Subject: [PATCH 13/22] Bump versions and docs for 1.8 support! --- docs/running.rst | 6 +++--- overviewer_core/src/overviewer.h | 2 +- overviewer_core/textures.py | 16 ++++++++-------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/running.rst b/docs/running.rst index 2da1557..340f1e5 100644 --- a/docs/running.rst +++ b/docs/running.rst @@ -261,13 +261,13 @@ If you want or need to provide your own textures, you have several options: :: - VERSION=1.7.10 + VERSION=1.8 wget https://s3.amazonaws.com/Minecraft.Download/versions/${VERSION}/${VERSION}.jar -P ~/.minecraft/versions/${VERSION}/ If that's too confusing for you, then just take this single line and paste it into - a terminal to get 1.7.10 textures:: + a terminal to get 1.8 textures:: - wget https://s3.amazonaws.com/Minecraft.Download/versions/1.7.10/1.7.10.jar -P ~/.minecraft/versions/1.7.10/ + wget https://s3.amazonaws.com/Minecraft.Download/versions/1.8/1.8.jar -P ~/.minecraft/versions/1.8/ * You can also just run the launcher to install the client. diff --git a/overviewer_core/src/overviewer.h b/overviewer_core/src/overviewer.h index af5b418..d4af5d4 100644 --- a/overviewer_core/src/overviewer.h +++ b/overviewer_core/src/overviewer.h @@ -26,7 +26,7 @@ // increment this value if you've made a change to the c extesion // and want to force users to rebuild -#define OVERVIEWER_EXTENSION_VERSION 46 +#define OVERVIEWER_EXTENSION_VERSION 47 /* Python PIL, and numpy headers */ #include diff --git a/overviewer_core/textures.py b/overviewer_core/textures.py index df14a67..2ea9f43 100644 --- a/overviewer_core/textures.py +++ b/overviewer_core/textures.py @@ -252,12 +252,12 @@ class Textures(object): most_recent_version = [0,0,0] for version in versions: - # Look for the latest non-snapshot that is at least 1.6. This - # version is only compatible with >=1.6, and we cannot in general + # Look for the latest non-snapshot that is at least 1.8. This + # version is only compatible with >=1.8, and we cannot in general # tell if a snapshot is more or less recent than a release. - # Allow two component names such as "1.6" and three component names - # such as "1.6.1" + # Allow two component names such as "1.8" and three component names + # such as "1.8.1" if version.count(".") not in (1,2): continue try: @@ -265,14 +265,14 @@ class Textures(object): except ValueError: continue - if versionparts < [1,7]: + if versionparts < [1,8]: continue if versionparts > most_recent_version: most_recent_version = versionparts if most_recent_version != [0,0,0]: - if verbose: logging.info("Most recent version >=1.7.0: {0}. Searching it for the file...".format(most_recent_version)) + if verbose: logging.info("Most recent version >=1.8.0: {0}. Searching it for the file...".format(most_recent_version)) jarname = ".".join(str(x) for x in most_recent_version) jarpath = os.path.join(versiondir, jarname, jarname + ".jar") @@ -290,7 +290,7 @@ class Textures(object): if verbose: logging.info("Did not find file {0} in jar {1}".format(filename, jarpath)) else: - if verbose: logging.info("Did not find any non-snapshot minecraft jars >=1.7.0") + if verbose: logging.info("Did not find any non-snapshot minecraft jars >=1.8.0") # Last ditch effort: look for the file is stored in with the overviewer # installation. We include a few files that aren't included with Minecraft @@ -310,7 +310,7 @@ class Textures(object): if verbose: logging.info("Found %s in '%s'", filename, path) return open(path, mode) - raise TextureException("Could not find the textures while searching for '{0}'. Try specifying the 'texturepath' option in your config file.\nSet it to the path to a Minecraft Resource pack.\nAlternately, install the Minecraft client (which includes textures)\nAlso see \n(Remember, this version of Overviewer requires a 1.7-compatible resource pack)\n(Also note that I won't automatically use snapshots; you'll have to use the texturepath option to use a snapshot jar)".format(filename)) + raise TextureException("Could not find the textures while searching for '{0}'. Try specifying the 'texturepath' option in your config file.\nSet it to the path to a Minecraft Resource pack.\nAlternately, install the Minecraft client (which includes textures)\nAlso see \n(Remember, this version of Overviewer requires a 1.8-compatible resource pack)\n(Also note that I won't automatically use snapshots; you'll have to use the texturepath option to use a snapshot jar)".format(filename)) def load_image_texture(self, filename): # Textures may be animated or in a different resolution than 16x16. From fd468f4cf3d92f3aa998a0214b45d710dbd85163 Mon Sep 17 00:00:00 2001 From: Andrew Chin Date: Tue, 2 Sep 2014 10:56:09 -0400 Subject: [PATCH 14/22] Forgot to bump version for travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 382f1dc..f58105e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,7 @@ python: - "2.7" # - "3.2" env: - - MC_VERSION=1.7.4 + - MC_VERSION=1.8 before_install: - wget http://hg.effbot.org/pil-117/raw/f356a1f64271/libImaging/Imaging.h - wget http://hg.effbot.org/pil-117/raw/f356a1f64271/libImaging/ImPlatform.h From ed09c5c96557b43536b42a60585a2cd2a7e60310 Mon Sep 17 00:00:00 2001 From: Ean McLaughlin Date: Tue, 2 Sep 2014 18:41:16 -0600 Subject: [PATCH 15/22] Added definitions and support for all the various red sandstone blocks. --- overviewer_core/src/iterate.c | 1 + overviewer_core/textures.py | 98 ++++++++++++++++++++++++----------- 2 files changed, 69 insertions(+), 30 deletions(-) diff --git a/overviewer_core/src/iterate.c b/overviewer_core/src/iterate.c index f1a379f..91418c6 100644 --- a/overviewer_core/src/iterate.c +++ b/overviewer_core/src/iterate.c @@ -262,6 +262,7 @@ is_stairs(int block) { case 156: /* quartz stairs */ case 163: /* acacia wood stairs */ case 164: /* dark wood stairs */ + case 180: /* red sandstone stairs */ return 1; } return 0; diff --git a/overviewer_core/textures.py b/overviewer_core/textures.py index 2ea9f43..284974e 100644 --- a/overviewer_core/textures.py +++ b/overviewer_core/textures.py @@ -430,7 +430,7 @@ class Textures(object): self.foliagecolor = list(self.load_image("foliage.png").getdata()) return self.foliagecolor - #I guess "watercolor" is wrong. But I can't correct as my texture pack don't define water color. + #I guess "watercolor" is wrong. But I can't correct as my texture pack don't define water color. def load_water_color(self): """Helper function to load the water color texture.""" if not hasattr(self, "watercolor"): @@ -1151,6 +1151,18 @@ def sandstone(self, blockid, data): return self.build_block(top, self.load_image_texture("assets/minecraft/textures/blocks/sandstone_carved.png")) if data == 2: # soft return self.build_block(top, self.load_image_texture("assets/minecraft/textures/blocks/sandstone_smooth.png")) + +# red sandstone +@material(blockid=179, data=range(3), solid=True) +def sandstone(self, blockid, data): + top = self.load_image_texture("assets/minecraft/textures/blocks/red_sandstone_top.png") + if data == 0: # normal + side = self.load_image_texture("assets/minecraft/textures/blocks/red_sandstone_normal.png") + return self.build_full_block(top, None, None, side, side, self.load_image_texture("assets/minecraft/textures/blocks/red_sandstone_bottom.png") ) + if data == 1: # hieroglyphic + return self.build_block(top, self.load_image_texture("assets/minecraft/textures/blocks/red_sandstone_carved.png")) + if data == 2: # soft + return self.build_block(top, self.load_image_texture("assets/minecraft/textures/blocks/red_sandstone_smooth.png")) # note block block(blockid=25, top_image="assets/minecraft/textures/blocks/noteblock.png") @@ -1545,39 +1557,60 @@ block(blockid=42, top_image="assets/minecraft/textures/blocks/iron_block.png") # double slabs and slabs # these wooden slabs are unobtainable without cheating, they are still # here because lots of pre-1.3 worlds use this blocks -@material(blockid=[43, 44], data=range(16), transparent=(44,), solid=True) +@material(blockid=[43, 44, 181, 182], data=range(16), transparent=(44,182,), solid=True) def slabs(self, blockid, data): - if blockid == 44: + if blockid == 44 or blockid == 182: texture = data & 7 else: # data > 8 are special double slabs texture = data - if texture== 0: # stone slab - top = self.load_image_texture("assets/minecraft/textures/blocks/stone_slab_top.png") - side = self.load_image_texture("assets/minecraft/textures/blocks/stone_slab_side.png") - elif texture== 1: # smooth stone - top = self.load_image_texture("assets/minecraft/textures/blocks/sandstone_top.png") - side = self.load_image_texture("assets/minecraft/textures/blocks/sandstone_normal.png") - elif texture== 2: # wooden slab - top = side = self.load_image_texture("assets/minecraft/textures/blocks/planks_oak.png") - elif texture== 3: # cobblestone slab - top = side = self.load_image_texture("assets/minecraft/textures/blocks/cobblestone.png") - elif texture== 4: # brick - top = side = self.load_image_texture("assets/minecraft/textures/blocks/brick.png") - elif texture== 5: # stone brick - top = side = self.load_image_texture("assets/minecraft/textures/blocks/stonebrick.png") - elif texture== 6: # nether brick slab - top = side = self.load_image_texture("assets/minecraft/textures/blocks/nether_brick.png") - elif texture== 7: #quartz - top = side = self.load_image_texture("assets/minecraft/textures/blocks/quartz_block_side.png") - elif texture== 8: # special stone double slab with top texture only - top = side = self.load_image_texture("assets/minecraft/textures/blocks/stone_slab_top.png") - elif texture== 9: # special sandstone double slab with top texture only - top = side = self.load_image_texture("assets/minecraft/textures/blocks/sandstone_top.png") - else: - return None + + if blockid == 44 or blockid == 43: + if texture== 0: # stone slab + top = self.load_image_texture("assets/minecraft/textures/blocks/stone_slab_top.png") + side = self.load_image_texture("assets/minecraft/textures/blocks/stone_slab_side.png") + elif texture== 1: # sandstone slab + top = self.load_image_texture("assets/minecraft/textures/blocks/sandstone_top.png") + side = self.load_image_texture("assets/minecraft/textures/blocks/sandstone_normal.png") + elif texture== 2: # wooden slab + top = side = self.load_image_texture("assets/minecraft/textures/blocks/planks_oak.png") + elif texture== 3: # cobblestone slab + top = side = self.load_image_texture("assets/minecraft/textures/blocks/cobblestone.png") + elif texture== 4: # brick + top = side = self.load_image_texture("assets/minecraft/textures/blocks/brick.png") + elif texture== 5: # stone brick + top = side = self.load_image_texture("assets/minecraft/textures/blocks/stonebrick.png") + elif texture== 6: # nether brick slab + top = side = self.load_image_texture("assets/minecraft/textures/blocks/nether_brick.png") + elif texture== 7: #quartz + top = side = self.load_image_texture("assets/minecraft/textures/blocks/quartz_block_side.png") + elif texture== 8: # special stone double slab with top texture only + top = side = self.load_image_texture("assets/minecraft/textures/blocks/stone_slab_top.png") + elif texture== 9: # special sandstone double slab with top texture only + top = side = self.load_image_texture("assets/minecraft/textures/blocks/sandstone_top.png") + else: + return None + + elif blockid == 182: # single red sandstone slab + if texture == 0: + top = self.load_image_texture("assets/minecraft/textures/blocks/red_sandstone_top.png") + side = self.load_image_texture("assets/minecraft/textures/blocks/red_sandstone_normal.png") + else: + return None + + elif blockid == 181: # double red sandstone slab + if texture == 0: # red sandstone + top = self.load_image_texture("assets/minecraft/textures/blocks/red_sandstone_top.png") + side = self.load_image_texture("assets/minecraft/textures/blocks/red_sandstone_normal.png") + elif texture == 8: # 'full' red sandstone (smooth) + top = side = self.load_image_texture("assets/minecraft/textures/blocks/red_sandstone_top"); + else: + return None if blockid == 43: # double slab return self.build_block(top, side) + + if blockid == 181: # double red sandstone slab + return self.build_block(top, side) # cut the side texture in half mask = side.crop((0,8,16,16)) @@ -1709,8 +1742,8 @@ def fire(self, blockid, data): # monster spawner block(blockid=52, top_image="assets/minecraft/textures/blocks/mob_spawner.png", transparent=True) -# wooden, cobblestone, red brick, stone brick, netherbrick, sandstone, spruce, birch, jungle and quartz stairs. -@material(blockid=[53,67,108,109,114,128,134,135,136,156,163,164], data=range(128), transparent=True, solid=True, nospawn=True) +# wooden, cobblestone, red brick, stone brick, netherbrick, sandstone, spruce, birch, jungle, quartz, and red sandstone stairs. +@material(blockid=[53,67,108,109,114,128,134,135,136,156,163,164,180], data=range(128), transparent=True, solid=True, nospawn=True) def stairs(self, blockid, data): # preserve the upside-down bit upside_down = data & 0x4 @@ -1747,17 +1780,22 @@ def stairs(self, blockid, data): texture = self.load_image_texture("assets/minecraft/textures/blocks/planks_acacia.png").copy() elif blockid == 164: # dark oak stairs texture = self.load_image_texture("assets/minecraft/textures/blocks/planks_big_oak.png").copy() + elif blockid == 180: # red sandstone stairs + texture = self.load_image_texture("assets/minecraft/textures/blocks/red_sandstone_normal").copy() outside_l = texture.copy() outside_r = texture.copy() inside_l = texture.copy() inside_r = texture.copy() - # sandstone & quartz stairs have special top texture + # sandstone, red sandstone, and quartz stairs have special top texture if blockid == 128: texture = self.load_image_texture("assets/minecraft/textures/blocks/sandstone_top.png").copy() elif blockid == 156: texture = self.load_image_texture("assets/minecraft/textures/blocks/quartz_block_top.png").copy() + elif blockid == 180: + texture = self.load_image_texture("assets/minecraft/textures/blocks/red_sandstone_top").copy() + slab_top = texture.copy() From 5f8d5ca7bcd5f10a21eaa6ce947c1b33d3e48ab7 Mon Sep 17 00:00:00 2001 From: Ean McLaughlin Date: Tue, 2 Sep 2014 18:48:31 -0600 Subject: [PATCH 16/22] Forgot texture file extensions in a couple places. --- overviewer_core/textures.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/overviewer_core/textures.py b/overviewer_core/textures.py index 284974e..f81665d 100644 --- a/overviewer_core/textures.py +++ b/overviewer_core/textures.py @@ -1589,7 +1589,7 @@ def slabs(self, blockid, data): top = side = self.load_image_texture("assets/minecraft/textures/blocks/sandstone_top.png") else: return None - + elif blockid == 182: # single red sandstone slab if texture == 0: top = self.load_image_texture("assets/minecraft/textures/blocks/red_sandstone_top.png") @@ -1602,7 +1602,7 @@ def slabs(self, blockid, data): top = self.load_image_texture("assets/minecraft/textures/blocks/red_sandstone_top.png") side = self.load_image_texture("assets/minecraft/textures/blocks/red_sandstone_normal.png") elif texture == 8: # 'full' red sandstone (smooth) - top = side = self.load_image_texture("assets/minecraft/textures/blocks/red_sandstone_top"); + top = side = self.load_image_texture("assets/minecraft/textures/blocks/red_sandstone_top.png"); else: return None @@ -1781,7 +1781,7 @@ def stairs(self, blockid, data): elif blockid == 164: # dark oak stairs texture = self.load_image_texture("assets/minecraft/textures/blocks/planks_big_oak.png").copy() elif blockid == 180: # red sandstone stairs - texture = self.load_image_texture("assets/minecraft/textures/blocks/red_sandstone_normal").copy() + texture = self.load_image_texture("assets/minecraft/textures/blocks/red_sandstone_normal.png").copy() outside_l = texture.copy() outside_r = texture.copy() @@ -1794,7 +1794,7 @@ def stairs(self, blockid, data): elif blockid == 156: texture = self.load_image_texture("assets/minecraft/textures/blocks/quartz_block_top.png").copy() elif blockid == 180: - texture = self.load_image_texture("assets/minecraft/textures/blocks/red_sandstone_top").copy() + texture = self.load_image_texture("assets/minecraft/textures/blocks/red_sandstone_top.png").copy() slab_top = texture.copy() From af470000793dacf53d6c45b358f2067afb91f6b6 Mon Sep 17 00:00:00 2001 From: Andrew Chin Date: Tue, 2 Sep 2014 22:23:33 -0400 Subject: [PATCH 17/22] Lighting fixes for red sandstone stairs and slabs Closes #1150 Closes #1149 --- overviewer_core/src/overviewer.h | 2 +- overviewer_core/src/primitives/lighting.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/overviewer_core/src/overviewer.h b/overviewer_core/src/overviewer.h index d4af5d4..db3a7d9 100644 --- a/overviewer_core/src/overviewer.h +++ b/overviewer_core/src/overviewer.h @@ -26,7 +26,7 @@ // increment this value if you've made a change to the c extesion // and want to force users to rebuild -#define OVERVIEWER_EXTENSION_VERSION 47 +#define OVERVIEWER_EXTENSION_VERSION 48 /* Python PIL, and numpy headers */ #include diff --git a/overviewer_core/src/primitives/lighting.c b/overviewer_core/src/primitives/lighting.c index c891249..8978c06 100644 --- a/overviewer_core/src/primitives/lighting.c +++ b/overviewer_core/src/primitives/lighting.c @@ -138,7 +138,7 @@ estimate_blocklevel(RenderPrimitiveLighting *self, RenderState *state, blocklevel = get_data(state, BLOCKLIGHT, x, y, z); /* no longer a guess */ - if (!(block == 44 || block == 53 || block == 67 || block == 108 || block == 109) && authoratative) { + if (!(block == 44 || block == 53 || block == 67 || block == 108 || block == 109 || block == 180 || block == 182) && authoratative) { *authoratative = 1; } @@ -160,7 +160,7 @@ get_lighting_color(RenderPrimitiveLighting *self, RenderState *state, /* special half-step handling, stairs handling */ /* Anvil also needs to be here, blockid 145 */ if (block == 44 || block == 53 || block == 67 || block == 108 || block == 109 || block == 114 || - block == 128 || block == 134 || block == 135 || block == 136 || block == 145 || block == 156 || block == 163 || block == 164) { + block == 128 || block == 134 || block == 135 || block == 136 || block == 145 || block == 156 || block == 163 || block == 164 || block == 180 || block == 182) { unsigned int upper_block; /* stairs and half-blocks take the skylevel from the upper block if it's transparent */ @@ -171,7 +171,7 @@ get_lighting_color(RenderPrimitiveLighting *self, RenderState *state, upper_block = get_data(state, BLOCKS, x, y + upper_counter, z); } while (upper_block == 44 || upper_block == 53 || upper_block == 67 || upper_block == 108 || upper_block == 109 || upper_block == 114 || upper_block == 128 || upper_block == 134 || - upper_block == 135 || upper_block == 136 || upper_block == 156 || upper_block == 163 || upper_block == 164); + upper_block == 135 || upper_block == 136 || upper_block == 156 || upper_block == 163 || upper_block == 164 || upper_block == 180 || upper_block == 182); if (is_transparent(upper_block)) { skylevel = get_data(state, SKYLIGHT, x, y + upper_counter, z); } else { From a3b7ac12b84d50aa39d744ffaf44a945bc5ffefa Mon Sep 17 00:00:00 2001 From: Ean McLaughlin Date: Wed, 3 Sep 2014 01:36:44 -0600 Subject: [PATCH 18/22] Added definitions for the new fence gates. Hopefully I got the C side right. Close #1148 --- overviewer_core/src/iterate.c | 4 +++- overviewer_core/textures.py | 18 ++++++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/overviewer_core/src/iterate.c b/overviewer_core/src/iterate.c index 91418c6..af0fbf5 100644 --- a/overviewer_core/src/iterate.c +++ b/overviewer_core/src/iterate.c @@ -313,7 +313,9 @@ generate_pseudo_data(RenderState *state, unsigned short ancilData) { } else if ((state->block == 85) || (state->block == 188) || (state->block == 189) || (state->block == 190) || (state->block == 191) || (state->block == 192)) { /* fences */ /* check for fences AND fence gates */ - return check_adjacent_blocks(state, x, y, z, state->block) | check_adjacent_blocks(state, x, y, z, 107); + return check_adjacent_blocks(state, x, y, z, state->block) | check_adjacent_blocks(state, x, y, z, 107) + | check_adjacent_blocks(state, x, y, z, 183) | check_adjacent_blocks(state, x, y, z, 184) | check_adjacent_blocks(state, x, y, z, 185) + | check_adjacent_blocks(state, x, y, z, 186) | check_adjacent_blocks(state, x, y, z, 187); } else if (state->block == 55) { /* redstone */ /* three addiotional bit are added, one for on/off state, and diff --git a/overviewer_core/textures.py b/overviewer_core/textures.py index f81665d..d70305e 100644 --- a/overviewer_core/textures.py +++ b/overviewer_core/textures.py @@ -3590,7 +3590,7 @@ def vines(self, blockid, data): return img # fence gates -@material(blockid=107, data=range(8), transparent=True, nospawn=True) +@material(blockid=[107, 183, 184, 185, 186, 187] data=range(8), transparent=True, nospawn=True) def fence_gate(self, blockid, data): # rotation @@ -3617,7 +3617,21 @@ def fence_gate(self, blockid, data): data = data | 0x4 # create the closed gate side - gate_side = self.load_image_texture("assets/minecraft/textures/blocks/planks_oak.png").copy() + if blockid == 107: # Oak + gate_side = self.load_image_texture("assets/minecraft/textures/blocks/planks_oak.png").copy() + elif blockid == 183: # Spruce + gate_side = self.load_image_texture("assets/minecraft/textures/blocks/planks_spruce.png").copy() + elif blockid == 184: # Birch + gate_side = self.load_image_texture("assets/minecraft/textures/blocks/planks_birch.png").copy() + elif blockid == 185: # Jungle + gate_side = self.load_image_texture("assets/minecraft/textures/blocks/planks_jungle.png").copy() + elif blockid == 186: # Dark Oak + gate_side = self.load_image_texture("assets/minecraft/textures/blocks/planks_big_oak.png").copy() + elif blockid == 187: # Acacia + gate_side = self.load_image_texture("assets/minecraft/textures/blocks/planks_acacia.png").copy() + else + return None + gate_side_draw = ImageDraw.Draw(gate_side) gate_side_draw.rectangle((7,0,15,0),outline=(0,0,0,0),fill=(0,0,0,0)) gate_side_draw.rectangle((7,4,9,6),outline=(0,0,0,0),fill=(0,0,0,0)) From 893ca074190c708ea828a3c31aa396351209894b Mon Sep 17 00:00:00 2001 From: Ean McLaughlin Date: Wed, 3 Sep 2014 01:45:29 -0600 Subject: [PATCH 19/22] Might as well slip a tiny bit of clean up in. --- overviewer_core/textures.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/overviewer_core/textures.py b/overviewer_core/textures.py index d70305e..032173f 100644 --- a/overviewer_core/textures.py +++ b/overviewer_core/textures.py @@ -1606,10 +1606,7 @@ def slabs(self, blockid, data): else: return None - if blockid == 43: # double slab - return self.build_block(top, side) - - if blockid == 181: # double red sandstone slab + if blockid == 43 or blockid == 181: # double slab return self.build_block(top, side) # cut the side texture in half From f5b610e81cfa18ca1892269b526c68c97923d240 Mon Sep 17 00:00:00 2001 From: Ean McLaughlin Date: Wed, 3 Sep 2014 01:50:49 -0600 Subject: [PATCH 20/22] Update C extension version number. --- overviewer_core/src/overviewer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/overviewer_core/src/overviewer.h b/overviewer_core/src/overviewer.h index db3a7d9..873dcaa 100644 --- a/overviewer_core/src/overviewer.h +++ b/overviewer_core/src/overviewer.h @@ -26,7 +26,7 @@ // increment this value if you've made a change to the c extesion // and want to force users to rebuild -#define OVERVIEWER_EXTENSION_VERSION 48 +#define OVERVIEWER_EXTENSION_VERSION 49 /* Python PIL, and numpy headers */ #include From 8f909f99de1b5068b4fd18c2d653752ee50baa9f Mon Sep 17 00:00:00 2001 From: Ean McLaughlin Date: Wed, 3 Sep 2014 02:06:51 -0600 Subject: [PATCH 21/22] Added missing comma in function call for fence gate material definition. --- overviewer_core/src/iterate.c | 6 +++--- overviewer_core/textures.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/overviewer_core/src/iterate.c b/overviewer_core/src/iterate.c index af0fbf5..8a2e324 100644 --- a/overviewer_core/src/iterate.c +++ b/overviewer_core/src/iterate.c @@ -313,9 +313,9 @@ generate_pseudo_data(RenderState *state, unsigned short ancilData) { } else if ((state->block == 85) || (state->block == 188) || (state->block == 189) || (state->block == 190) || (state->block == 191) || (state->block == 192)) { /* fences */ /* check for fences AND fence gates */ - return check_adjacent_blocks(state, x, y, z, state->block) | check_adjacent_blocks(state, x, y, z, 107) - | check_adjacent_blocks(state, x, y, z, 183) | check_adjacent_blocks(state, x, y, z, 184) | check_adjacent_blocks(state, x, y, z, 185) - | check_adjacent_blocks(state, x, y, z, 186) | check_adjacent_blocks(state, x, y, z, 187); + return check_adjacent_blocks(state, x, y, z, state->block) | check_adjacent_blocks(state, x, y, z, 107) | + check_adjacent_blocks(state, x, y, z, 183) | check_adjacent_blocks(state, x, y, z, 184) | check_adjacent_blocks(state, x, y, z, 185) | + check_adjacent_blocks(state, x, y, z, 186) | check_adjacent_blocks(state, x, y, z, 187); } else if (state->block == 55) { /* redstone */ /* three addiotional bit are added, one for on/off state, and diff --git a/overviewer_core/textures.py b/overviewer_core/textures.py index 032173f..6b7fb11 100644 --- a/overviewer_core/textures.py +++ b/overviewer_core/textures.py @@ -3587,7 +3587,7 @@ def vines(self, blockid, data): return img # fence gates -@material(blockid=[107, 183, 184, 185, 186, 187] data=range(8), transparent=True, nospawn=True) +@material(blockid=[107, 183, 184, 185, 186, 187], data=range(8), transparent=True, nospawn=True) def fence_gate(self, blockid, data): # rotation From 97350e81e3d1ba35f602802dad7e3d0c65fb6d8b Mon Sep 17 00:00:00 2001 From: Ean McLaughlin Date: Wed, 3 Sep 2014 02:10:50 -0600 Subject: [PATCH 22/22] Missing colon from else statement. --- overviewer_core/textures.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/overviewer_core/textures.py b/overviewer_core/textures.py index 6b7fb11..36ce0fd 100644 --- a/overviewer_core/textures.py +++ b/overviewer_core/textures.py @@ -3626,7 +3626,7 @@ def fence_gate(self, blockid, data): gate_side = self.load_image_texture("assets/minecraft/textures/blocks/planks_big_oak.png").copy() elif blockid == 187: # Acacia gate_side = self.load_image_texture("assets/minecraft/textures/blocks/planks_acacia.png").copy() - else + else: return None gate_side_draw = ImageDraw.Draw(gate_side)