Newer
Older
ultramine_bukkit / src / main / java / org / bukkit / craftbukkit / map / CraftMapCanvas.java
@vlad20012 vlad20012 on 24 Feb 2017 2 KB initial
package org.bukkit.craftbukkit.map;

import org.bukkit.map.MapCanvas;
import org.bukkit.map.MapCursorCollection;
import org.bukkit.map.MapFont;
import org.bukkit.map.MapFont.CharacterSprite;
import org.bukkit.map.MapPalette;

import java.awt.Image;
import java.util.Arrays;

public class CraftMapCanvas implements MapCanvas
{

	private final byte[] buffer = new byte[128 * 128];
	private final CraftMapView mapView;
	private byte[] base;
	private MapCursorCollection cursors = new MapCursorCollection();

	protected CraftMapCanvas(CraftMapView mapView)
	{
		this.mapView = mapView;
		Arrays.fill(buffer, (byte) -1);
	}

	public CraftMapView getMapView()
	{
		return mapView;
	}

	public MapCursorCollection getCursors()
	{
		return cursors;
	}

	public void setCursors(MapCursorCollection cursors)
	{
		this.cursors = cursors;
	}

	public void setPixel(int x, int y, byte color)
	{
		if(x < 0 || y < 0 || x >= 128 || y >= 128)
			return;
		if(buffer[y * 128 + x] != color)
		{
			buffer[y * 128 + x] = color;
			mapView.worldMap.setColumnDirty(x, y, y);
		}
	}

	public byte getPixel(int x, int y)
	{
		if(x < 0 || y < 0 || x >= 128 || y >= 128)
			return 0;
		return buffer[y * 128 + x];
	}

	public byte getBasePixel(int x, int y)
	{
		if(x < 0 || y < 0 || x >= 128 || y >= 128)
			return 0;
		return base[y * 128 + x];
	}

	protected void setBase(byte[] base)
	{
		this.base = base;
	}

	protected byte[] getBuffer()
	{
		return buffer;
	}

	public void drawImage(int x, int y, Image image)
	{
		byte[] bytes = MapPalette.imageToBytes(image);
		for(int x2 = 0; x2 < image.getWidth(null); ++x2)
		{
			for(int y2 = 0; y2 < image.getHeight(null); ++y2)
			{
				setPixel(x + x2, y + y2, bytes[y2 * image.getWidth(null) + x2]);
			}
		}
	}

	public void drawText(int x, int y, MapFont font, String text)
	{
		int xStart = x;
		byte color = MapPalette.DARK_GRAY;
		if(!font.isValid(text))
		{
			throw new IllegalArgumentException("text contains invalid characters");
		}

		for(int i = 0; i < text.length(); ++i)
		{
			char ch = text.charAt(i);
			if(ch == '\n')
			{
				x = xStart;
				y += font.getHeight() + 1;
				continue;
			}
			else if(ch == '\u00A7')
			{
				int j = text.indexOf(';', i);
				if(j >= 0)
				{
					try
					{
						color = Byte.parseByte(text.substring(i + 1, j));
						i = j;
						continue;
					} catch(NumberFormatException ex)
					{
					}
				}
			}

			CharacterSprite sprite = font.getChar(text.charAt(i));
			for(int r = 0; r < font.getHeight(); ++r)
			{
				for(int c = 0; c < sprite.getWidth(); ++c)
				{
					if(sprite.get(r, c))
					{
						setPixel(x + c, y + r, color);
					}
				}
			}
			x += sprite.getWidth() + 1;
		}
	}

}