0

Merge branch 'master' into rewrite

This commit is contained in:
Aaron Griffith
2012-02-06 21:41:11 -05:00
51 changed files with 114 additions and 46 deletions

7
.gitignore vendored
View File

@@ -6,11 +6,14 @@ Minecraft_Overviewer.egg-info
terrain.png terrain.png
cachedir* cachedir*
#MCPatcher HD texture files
custom_*.png
# vim swap files # vim swap files
.*.swp .*.swp
# user-provided settings file # user-provided settings file as well as any variations on that name
settings.py settings*.py
# header files that may be copied over, if missing # header files that may be copied over, if missing
ImPlatform.h ImPlatform.h

View File

@@ -52,6 +52,7 @@ feature.
* Ryan Hitchman <hitchmanr@gmail.com> * Ryan Hitchman <hitchmanr@gmail.com>
* Jenny <jennytoo@gmail.com> * Jenny <jennytoo@gmail.com>
* Michael Jensen <emjay1988@gmail.com> * Michael Jensen <emjay1988@gmail.com>
* Johan Kiviniemi <devel@johan.kiviniemi.name>
* Thomas Lake <tswsl1989@sucs.org> * Thomas Lake <tswsl1989@sucs.org>
* Maciej Malecki <maciej.malecki@hotmail.com> * Maciej Malecki <maciej.malecki@hotmail.com>
* Ryan McCue <ryanmccue@cubegames.net> * Ryan McCue <ryanmccue@cubegames.net>

View File

@@ -44,8 +44,8 @@ recommended way of building Overviewer on 64-bit Windows using free tools. If y
have bought a copy of Visual Studio, you can use it for 64-bit builds. have bought a copy of Visual Studio, you can use it for 64-bit builds.
Prerequisits Prerequisites
~~~~~~~~~~~~ ~~~~~~~~~~~~~
You will need a copy of the `PIL sources <http://www.pythonware.com/products/pil/>`_. You will need a copy of the `PIL sources <http://www.pythonware.com/products/pil/>`_.
@@ -130,6 +130,17 @@ The following script (copied into your MCO source directory) should handle every
# build MCO # build MCO
C_INCLUDE_PATH="`pwd`/Imaging-1.1.7/libImaging" python ./setup.py build C_INCLUDE_PATH="`pwd`/Imaging-1.1.7/libImaging" python ./setup.py build
FreeBSD
-------
FreeBSD is similar to OSX and Linux, but ensure you're using Python 2.7. The port of Python 2.6 has bugs with threading under FreeBSD.
Everything else you should need is ported, in particular math/py-numpy and graphics/py-imaging.
You may need or want to add the line::
PYTHON_VERSION=2.7
to the file /etc/make.conf, but read the ports documentation to be sure of what this might do to other Python applications on your system.
.. _centos: .. _centos:
CentOS CentOS

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.6 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 854 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 153 KiB

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 579 KiB

After

Width:  |  Height:  |  Size: 528 KiB

View File

@@ -23,8 +23,9 @@ right place!
Debian / Ubuntu Debian / Ubuntu
=============== ===============
We provide an APT repository with pre-built Overviewer packages for Debian and We provide an APT repository with pre-built Overviewer packages for
Ubuntu users. To do this, add the following line to your Debian and Ubuntu users. These packages should work on any system with
a ``python2.6`` package. To do this, add the following line to your
``/etc/apt/sources.list`` ``/etc/apt/sources.list``
:: ::

View File

@@ -92,6 +92,7 @@ directory.
dump['worlds'] = worlds dump['worlds'] = worlds
dump['map'] = dict() dump['map'] = dict()
dump['map']['debug'] = True dump['map']['debug'] = True
dump['map']['cacheTag'] = str(int(time()))
dump['map']['north_direction'] = 'lower-left' # only temporary dump['map']['north_direction'] = 'lower-left' # only temporary
dump['map']['center'] = [-314, 67, 94] dump['map']['center'] = [-314, 67, 94]
dump['map']['controls'] = { dump['map']['controls'] = {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 103 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 78 B

View File

@@ -1431,10 +1431,8 @@ var overviewer = {
} }
} }
url = url + '.' + pathExt; url = url + '.' + pathExt;
if(overviewerConfig.map.cacheMinutes > 0) { if(typeof overviewerConfig.map.cacheTag !== 'undefined') {
var d = new Date(); url += '?c=' + overviewerConfig.map.cacheTag;
url += '?c=' + Math.floor(d.getTime() /
(1000 * 60 * overviewerConfig.map.cacheMinutes));
} }
return(urlBase + url); return(urlBase + url);
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 368 B

After

Width:  |  Height:  |  Size: 257 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 708 B

After

Width:  |  Height:  |  Size: 518 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 253 B

After

Width:  |  Height:  |  Size: 171 B

View File

@@ -17,7 +17,7 @@ import os
import os.path import os.path
import stat import stat
import cPickle import cPickle
import Image from PIL import Image
import shutil import shutil
from time import strftime, localtime from time import strftime, localtime
import json import json

View File

@@ -28,6 +28,7 @@ static PyObject *transparent_blocks = NULL;
static PyObject *solid_blocks = NULL; static PyObject *solid_blocks = NULL;
static PyObject *fluid_blocks = NULL; static PyObject *fluid_blocks = NULL;
static PyObject *nospawn_blocks = NULL; static PyObject *nospawn_blocks = NULL;
static PyObject *nodata_blocks = NULL;
PyObject *init_chunk_render(void) { PyObject *init_chunk_render(void) {
@@ -74,6 +75,9 @@ PyObject *init_chunk_render(void) {
nospawn_blocks = PyObject_GetAttrString(textures, "nospawn_blocks"); nospawn_blocks = PyObject_GetAttrString(textures, "nospawn_blocks");
if (!nospawn_blocks) if (!nospawn_blocks)
return NULL; return NULL;
nodata_blocks = PyObject_GetAttrString(textures, "nodata_blocks");
if (!nodata_blocks)
return NULL;
block_properties = calloc(max_blockid, sizeof(unsigned char)); block_properties = calloc(max_blockid, sizeof(unsigned char));
for (i = 0; i < max_blockid; i++) { for (i = 0; i < max_blockid; i++) {
@@ -89,6 +93,8 @@ PyObject *init_chunk_render(void) {
block_properties[i] |= 1 << FLUID; block_properties[i] |= 1 << FLUID;
if (PySequence_Contains(nospawn_blocks, block)) if (PySequence_Contains(nospawn_blocks, block))
block_properties[i] |= 1 << NOSPAWN; block_properties[i] |= 1 << NOSPAWN;
if (PySequence_Contains(nodata_blocks, block))
block_properties[i] |= 1 << NODATA;
Py_DECREF(block); Py_DECREF(block);
} }
@@ -502,22 +508,30 @@ chunk_render(PyObject *self, PyObject *args) {
} }
/* everything stored here will be a borrowed ref */ /* everything stored here will be a borrowed ref */
ancilData = getArrayByte3D(state.blockdatas, state.x, state.y, state.z); if (block_has_property(state.block, NODATA)) {
state.block_data = ancilData; /* block shouldn't have data associated with it, set it to 0 */
/* block that need pseudo ancildata: ancilData = 0;
* grass, water, glass, chest, restone wire, state.block_data = 0;
* ice, fence, portal, iron bars, glass panes */
if ((state.block == 2) || (state.block == 9) ||
(state.block == 20) || (state.block == 54) ||
(state.block == 55) || (state.block == 79) ||
(state.block == 85) || (state.block == 90) ||
(state.block == 101) || (state.block == 102) ||
(state.block == 113)) {
ancilData = generate_pseudo_data(&state, ancilData);
state.block_pdata = ancilData;
} else {
state.block_pdata = 0; state.block_pdata = 0;
} else {
/* block has associated data, use it */
ancilData = getArrayByte3D(state.blockdatas, state.x, state.y, state.z);
state.block_data = ancilData;
/* block that need pseudo ancildata:
* grass, water, glass, chest, restone wire,
* ice, fence, portal, iron bars, glass panes */
if ((state.block == 2) || (state.block == 9) ||
(state.block == 20) || (state.block == 54) ||
(state.block == 55) || (state.block == 79) ||
(state.block == 85) || (state.block == 90) ||
(state.block == 101) || (state.block == 102) ||
(state.block == 113)) {
ancilData = generate_pseudo_data(&state, ancilData);
state.block_pdata = ancilData;
} else {
state.block_pdata = 0;
}
} }
/* make sure our block info is in-bounds */ /* make sure our block info is in-bounds */
@@ -526,6 +540,9 @@ chunk_render(PyObject *self, PyObject *args) {
/* get the texture */ /* get the texture */
t = PyList_GET_ITEM(blockmap, max_data * state.block + ancilData); t = PyList_GET_ITEM(blockmap, max_data * state.block + ancilData);
/* if we don't get a texture, try it again with 0 data */
if ((t == NULL || t == Py_None) && ancilData != 0)
t = PyList_GET_ITEM(blockmap, max_data * state.block);
/* if we found a proper texture, render it! */ /* if we found a proper texture, render it! */
if (t != NULL && t != Py_None) if (t != NULL && t != Py_None)

View File

@@ -26,7 +26,7 @@
// increment this value if you've made a change to the c extesion // increment this value if you've made a change to the c extesion
// and want to force users to rebuild // and want to force users to rebuild
#define OVERVIEWER_EXTENSION_VERSION 16 #define OVERVIEWER_EXTENSION_VERSION 18
/* Python PIL, and numpy headers */ /* Python PIL, and numpy headers */
#include <Python.h> #include <Python.h>
@@ -102,6 +102,7 @@ typedef enum
SOLID, SOLID,
FLUID, FLUID,
NOSPAWN, NOSPAWN,
NODATA,
} BlockProperty; } BlockProperty;
/* globals set in init_chunk_render, here because they're used /* globals set in init_chunk_render, here because they're used
in block_has_property */ in block_has_property */

View File

@@ -246,8 +246,8 @@ get_lighting_color(RenderPrimitiveLighting *self, RenderState *state,
skylevel = getArrayByte3D(skylight, local_x, local_y, local_z); skylevel = getArrayByte3D(skylight, local_x, local_y, local_z);
blocklevel = getArrayByte3D(blocklight, local_x, local_y, local_z); blocklevel = getArrayByte3D(blocklight, local_x, local_y, local_z);
/* special half-step handling */ /* special half-step handling, stairs handling */
if (block == 44 || block == 53 || block == 67 || block == 108 || block == 109) { if (block == 44 || block == 53 || block == 67 || block == 108 || block == 109 || block == 114) {
unsigned int upper_block; unsigned int upper_block;
/* stairs and half-blocks take the skylevel from the upper block if it's transparent */ /* stairs and half-blocks take the skylevel from the upper block if it's transparent */

View File

@@ -56,7 +56,7 @@ class Textures(object):
def __getstate__(self): def __getstate__(self):
# we must get rid of the huge image lists, and other images # we must get rid of the huge image lists, and other images
attributes = self.__dict__.copy() attributes = self.__dict__.copy()
for attr in ['terrain_images', 'blockmap', 'biome_grass_texture', 'watertexture', 'lavatexture', 'lightcolor']: for attr in ['terrain_images', 'blockmap', 'biome_grass_texture', 'watertexture', 'lavatexture', 'firetexture', 'portaltexture', 'lightcolor']:
try: try:
del attributes[attr] del attributes[attr]
except KeyError: except KeyError:
@@ -249,6 +249,40 @@ class Textures(object):
self.lavatexture = lavatexture self.lavatexture = lavatexture
return lavatexture return lavatexture
def load_fire(self):
"""Special-case function for loading fire, handles
MCPatcher-compliant custom animated fire."""
firetexture = getattr(self, "firetexture", None)
if firetexture:
return firetexture
try:
# try the MCPatcher case first
firetextureNS = self.load_image("custom_fire_n_s.png")
firetextureNS = firetextureNS.crop((0, 0, firetextureNS.size[0], firetextureNS.size[0]))
firetextureEW = self.load_image("custom_fire_e_w.png")
firetextureEW = firetextureEW.crop((0, 0, firetextureEW.size[0], firetextureEW.size[0]))
firetexture = (firetextureNS,firetextureEW)
except IOError:
fire = self.load_image("fire.png")
firetexture = (fire, fire)
self.firetexture = firetexture
return firetexture
def load_portal(self):
"""Special-case function for loading portal, handles
MCPatcher-compliant custom animated portal."""
portaltexture = getattr(self, "portaltexture", None)
if portaltexture:
return portaltexture
try:
# try the MCPatcher case first
portaltexture = self.load_image("custom_portal.png")
portaltexture = portaltexture.crop((0, 0, portaltexture.size[0], portaltexture.size[1]))
except IOError:
portaltexture = self.load_image("portal.png")
self.portaltexture = portaltexture
return portaltexture
def load_light_color(self): def load_light_color(self):
"""Helper function to load the light color texture.""" """Helper function to load the light color texture."""
if hasattr(self, "lightcolor"): if hasattr(self, "lightcolor"):
@@ -681,11 +715,12 @@ transparent_blocks = set()
solid_blocks = set() solid_blocks = set()
fluid_blocks = set() fluid_blocks = set()
nospawn_blocks = set() nospawn_blocks = set()
nodata_blocks = set()
# the material registration decorator # the material registration decorator
def material(blockid=[], data=[0], **kwargs): def material(blockid=[], data=[0], **kwargs):
# mapping from property name to the set to store them in # mapping from property name to the set to store them in
properties = {"transparent" : transparent_blocks, "solid" : solid_blocks, "fluid" : fluid_blocks, "nospawn" : nospawn_blocks} properties = {"transparent" : transparent_blocks, "solid" : solid_blocks, "fluid" : fluid_blocks, "nospawn" : nospawn_blocks, "nodata" : nodata_blocks}
# make sure blockid and data are iterable # make sure blockid and data are iterable
try: try:
@@ -730,9 +765,9 @@ def material(blockid=[], data=[0], **kwargs):
return func_wrapper return func_wrapper
return inner_material return inner_material
# shortcut function for pure blocks, default to solid # shortcut function for pure blocks, default to solid, nodata
def block(blockid=[], top_index=None, side_index=None, **kwargs): def block(blockid=[], top_index=None, side_index=None, **kwargs):
new_kwargs = {'solid' : True} new_kwargs = {'solid' : True, 'nodata' : True}
new_kwargs.update(kwargs) new_kwargs.update(kwargs)
if top_index is None: if top_index is None:
@@ -746,9 +781,9 @@ def block(blockid=[], top_index=None, side_index=None, **kwargs):
return self.build_block(self.terrain_images[top_index], self.terrain_images[side_index]) return self.build_block(self.terrain_images[top_index], self.terrain_images[side_index])
return inner_block return inner_block
# shortcut function for sprite blocks, defaults to transparent # shortcut function for sprite blocks, defaults to transparent, nodata
def sprite(blockid=[], index=None, **kwargs): def sprite(blockid=[], index=None, **kwargs):
new_kwargs = {'transparent' : True} new_kwargs = {'transparent' : True, 'nodata' : True}
new_kwargs.update(kwargs) new_kwargs.update(kwargs)
if index is None: if index is None:
@@ -759,9 +794,9 @@ def sprite(blockid=[], index=None, **kwargs):
return self.build_sprite(self.terrain_images[index]) return self.build_sprite(self.terrain_images[index])
return inner_sprite return inner_sprite
# shortcut function for billboard blocks, defaults to transparent # shortcut function for billboard blocks, defaults to transparent, nodata
def billboard(blockid=[], index=None, **kwargs): def billboard(blockid=[], index=None, **kwargs):
new_kwargs = {'transparent' : True} new_kwargs = {'transparent' : True, 'nodata' : True}
new_kwargs.update(kwargs) new_kwargs.update(kwargs)
if index is None: if index is None:
@@ -1471,9 +1506,9 @@ def torches(self, blockid, data):
# fire # fire
@material(blockid=51, data=range(16), transparent=True) @material(blockid=51, data=range(16), transparent=True)
def fire(self, blockid, data): def fire(self, blockid, data):
firetexture = self.load_image("fire.png") firetextures = self.load_fire()
side1 = self.transform_image_side(firetexture) side1 = self.transform_image_side(firetextures[0])
side2 = self.transform_image_side(firetexture).transpose(Image.FLIP_LEFT_RIGHT) side2 = self.transform_image_side(firetextures[1]).transpose(Image.FLIP_LEFT_RIGHT)
img = Image.new("RGBA", (24,24), self.bgcolor) img = Image.new("RGBA", (24,24), self.bgcolor)
@@ -1716,7 +1751,7 @@ block(blockid=57, top_index=24)
# crafting table # crafting table
# needs two different sides # needs two different sides
@material(blockid=58, solid=True) @material(blockid=58, solid=True, nodata=True)
def crafting_table(self, blockid, data): def crafting_table(self, blockid, data):
top = self.terrain_images[43] top = self.terrain_images[43]
side3 = self.terrain_images[43+16] side3 = self.terrain_images[43+16]
@@ -2218,7 +2253,7 @@ def buttons(self, blockid, data):
return img return img
# snow # snow
@material(blockid=78, data=range(8), transparent=True, solid=True) @material(blockid=78, data=range(16), transparent=True, solid=True)
def snow(self, blockid, data): def snow(self, blockid, data):
# still not rendered correctly: data other than 0 # still not rendered correctly: data other than 0
@@ -2350,7 +2385,7 @@ def fence(self, blockid, data):
fence_small_side = ImageEnhance.Brightness(fence_small_side).enhance(0.9) fence_small_side = ImageEnhance.Brightness(fence_small_side).enhance(0.9)
fence_small_side.putalpha(sidealpha) fence_small_side.putalpha(sidealpha)
# Create img to compose the fence # Create img to compose the fence
img = Image.new("RGBA", (24,24), self.bgcolor) img = Image.new("RGBA", (24,24), self.bgcolor)
# Position of fence small sticks in img. # Position of fence small sticks in img.
@@ -2430,7 +2465,7 @@ block(blockid=89, top_index=105)
@material(blockid=90, data=[1, 2, 4, 8], transparent=True) @material(blockid=90, data=[1, 2, 4, 8], transparent=True)
def portal(self, blockid, data): def portal(self, blockid, data):
# no rotations, uses pseudo data # no rotations, uses pseudo data
portaltexture = self.load_image("portal.png") portaltexture = self.load_portal()
img = Image.new("RGBA", (24,24), self.bgcolor) img = Image.new("RGBA", (24,24), self.bgcolor)
side = self.transform_image_side(portaltexture) side = self.transform_image_side(portaltexture)
@@ -3013,7 +3048,7 @@ def nether_wart(self, blockid, data):
# enchantment table # enchantment table
# TODO there's no book at the moment # TODO there's no book at the moment
@material(blockid=116, transparent=True) @material(blockid=116, transparent=True, nodata=True)
def enchantment_table(self, blockid, data): def enchantment_table(self, blockid, data):
# no book at the moment # no book at the moment
top = self.terrain_images[166] top = self.terrain_images[166]
@@ -3058,7 +3093,7 @@ def cauldron(self, blockid, data):
return img return img
# end portal # end portal
@material(blockid=119, transparent=True) @material(blockid=119, transparent=True, nodata=True)
def end_portal(self, blockid, data): def end_portal(self, blockid, data):
img = Image.new("RGBA", (24,24), self.bgcolor) img = Image.new("RGBA", (24,24), self.bgcolor)
# generate a black texure with white, blue and grey dots resembling stars # generate a black texure with white, blue and grey dots resembling stars