Merge branch 'master' into rewrite
7
.gitignore
vendored
@@ -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
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 6.9 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 7.6 KiB |
|
Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 9.2 KiB |
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 854 B |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 9.7 KiB |
|
Before Width: | Height: | Size: 93 KiB After Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 114 KiB After Width: | Height: | Size: 78 KiB |
|
Before Width: | Height: | Size: 153 KiB After Width: | Height: | Size: 146 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 579 KiB After Width: | Height: | Size: 528 KiB |
@@ -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``
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|||||||
@@ -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'] = {
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 6.9 KiB After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 6.9 KiB After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 6.9 KiB After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 103 B |
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 78 B |
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 368 B After Width: | Height: | Size: 257 B |
|
Before Width: | Height: | Size: 708 B After Width: | Height: | Size: 518 B |
|
Before Width: | Height: | Size: 253 B After Width: | Height: | Size: 171 B |
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||