All pastes #53751 Raw Edit

Untitled

public java v1 · immutable
#53751 ·published 2006-05-05 18:13 UTC
rendered paste body
/** *  */package net.sf.l2j.gameserver.model.geodata;import java.io.DataInputStream;import java.io.File;import java.io.FileInputStream;import java.util.List;import javolution.util.FastList;/** * @author zabbix * */public class GeoEngine{	Long size;	private List<GeoRegion> _regions = new FastList<GeoRegion>();	public static GeoEngine _instance = new GeoEngine();	public GeoEngine()	{		//parseZone();	}	public static GeoEngine getInstance()	{		return _instance;	}	public int getHeight(int x, int y)	{		int region_x = 20 + ((x - x % 32768) / 32768);		int region_y = 18 + ((y - y % 32768) / 32768);				System.err.println("region " + region_x + ":" + region_y);		//System.err.println("offset " + offset_x + ":" + offset_y + " block: [" + block_x + "][" +block_y +"]");        //System.err.println("cell [" + cell_x + "][" + cell_y + "]");		//		if(_blocks[block_x][block_y].getType() == 0)		//			return _blocks[block_x][block_y].getHeight(0);		for (GeoRegion r : _regions)		{			if (r.isValid(region_x,region_y))				return r.getHeight(x,y);		}		return 0;	}	public int getFlag(int x, int y)	{		int region_x = 20 + ((x - x % 32768) / 32768);		int region_y = 18 + ((y - y % 32768) / 32768);				System.err.println("region " + region_x + ":" + region_y);		//System.err.println("offset " + offset_x + ":" + offset_y + " block: [" + block_x + "][" +block_y +"]");        //System.err.println("cell [" + cell_x + "][" + cell_y + "]");		//		if(_blocks[block_x][block_y].getType() == 0)		//			return _blocks[block_x][block_y].getHeight(0);		for (GeoRegion r : _regions)		{			if (r.isValid(region_x,region_y))				return r.getFlag(x,y);		}		return 0;	}		private void hashFiles(String dirname, List<File> hash)	{		File dir = new File("c:/l2j/data/", dirname);		if (!dir.exists())		{			System.err.println("Dir " + dir.getAbsolutePath() + " not exists");			return;		}		File[] files = dir.listFiles();		for (File f : files)		{			if (f.getName().endsWith(".bin")) hash.add(f);		}	}	public void parseZone()	{		List<File> files = new FastList<File>();		hashFiles("geo", files);		try		{			for (File entry : files)			{				DataInputStream in = new DataInputStream(new FileInputStream(entry));				size = entry.length();								int _rx = in.readByte();				int _ry = in.readByte();								in.skip(16);				size -= 18;								GeoRegion region = new GeoRegion(_rx,_ry);				System.err.println("[GeoEngine] loading [" + _rx +"_"+ _ry + "][" + (size / 1024)					+ "kb]");				while (size > 0)				{					int b = getHeight(in);//in.readShort();					GeoBlock gb = new GeoBlock(b);					if (b == 0) // single plane					{						int h1 = getHeight(in);						int h2 = getHeight(in);												gb.addHeight(0, h1);						gb.addHeight(1, h2);					}					else if (b == 0x0040) // multiheight plane					{						for (int p = 0; p < 64; p++)						{							int h = getHeight(in);							gb.addHeight(p, h);							//int h3 = h&0xffff;							//int h2 = (h>>1);//-(h3^0xffff)>>1;							//h = (h&0xf);							//System.err.println("movement flag: "+h+" height: "+h2);						}					}					else					// multifloor multiheight					{						for (int i = 0; i < 64; i++)						{							int floor = getHeight(in);							for (int f = 0; f < floor; f++)							{								int fh = getHeight(in);								gb.addHeight(f, fh);							}						}					}					region.addBlock(gb);				}				_regions.add(region);				System.gc();			}		}		catch (Exception e)		{			System.err.println("Oops: " + e);		}		System.err.println("[GeoEngine] total "+_regions.size()+" regions loaded");	}	int getHeight(DataInputStream in)	{		try		{			byte b1 = in.readByte();			byte b2 = in.readByte();			size -= 2;			return b1 + (b2 << 8);		}		catch (Exception e)		{			System.err.println("height err!: " + e + ", bytes left: "+ size);			System.exit(0);		}		return 0;	}}