Fixed server crash

This commit is contained in:
catfoolyou 2025-02-27 10:59:22 -05:00
parent 30ad33dcef
commit ca62d2cae1
52 changed files with 107 additions and 3747 deletions

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" /> <component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_18" default="true" project-jdk-name="corretto-18" project-jdk-type="JavaSDK" /> <component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="corretto-18" project-jdk-type="JavaSDK" />
</project> </project>

View File

@ -118,7 +118,6 @@ public class WebSocketProxy extends SimpleChannelInboundHandler<ByteBuf> {
public void sendPacket(ByteBuffer arg1) { public void sendPacket(ByteBuffer arg1) {
if(tcpChannel != null && tcpChannel.isOpen()) { if(tcpChannel != null && tcpChannel.isOpen()) {
System.out.println("[WebsocketProxy] - sending packet");
tcpChannel.write(Unpooled.wrappedBuffer(arg1)); tcpChannel.write(Unpooled.wrappedBuffer(arg1));
} }
} }

View File

@ -26,7 +26,7 @@ public class ChannelWrapper {
this.ch.write(packet); this.ch.write(packet);
} }
ch.unsafe().flushNow(); //ch.unsafe().flushNow();
} }
} }

Binary file not shown.

View File

@ -1,16 +1,10 @@
Eaglercraft 1.6.4 is an AOT compiled port of mojang's minecraft 1.6.4 designed to run in an html5/javascript environment, using TeaVM and lax1dude's opengl 1.3 emulator to simulate a desktop java enviroment fully compatible with minecraft java edition Eaglercraft 1.6.4 is an AOT compiled port of mojang's minecraft 1.6.4 designed to run in an html5/javascript environment, using TeaVM and lax1dude's opengl 1.3 emulator to simulate a desktop java enviroment fully compatible with minecraft java edition
§1This §1port §1was §1created §1by §1Catfoolyou
this project based on eaglercraft 1.5.2 by lax1dude and ayunami2000 §1This §1port §1was §1created §1by §4Catfoolyou
compiling the javascript and emulating the JRE is largely made possible by the TeaVM project, created by Alexey Andreev and is available for free at §nhttp://teavm.org/§r under Apache License 2.0
eaglercraft also makes use of jCraft's jzlib port, available at §nhttp://www.jcraft.com/jzlib/§r under BSD-style licensing. All graphical assets in this project were ripped from mojang's official minecraft.jar for minecraft version 1.6.4 and they are mojang's intellectual property. assets ommitted include the minecraft soundtrack and music disks and all software references to the mojang/minecraft api.
all graphical assets in this project were ripped from mojang's official minecraft.jar for minecraft version 1.6.4 and they are mojang's intellectual property. assets ommitted include the minecraft soundtrack and music disks and all software references to the mojang/minecraft api.
eaglercraft servers are powered by md_5's BungeeCord and the CraftBukkit project available at §nhttps://bukkit.org/§r. BungeeCord has been modified to accept eaglercraft's strange login packets and to host a websocket server to translate browser connections to raw TCP that vanilla minecraft servers can understand. All java plugins designed for CraftBukkit 1.6.4 are compatible with this configuration.
scroll down for the detailed license statements scroll down for the detailed license statements

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 781 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 675 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

View File

@ -1,371 +0,0 @@
package net.minecraft.src;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
public class AnvilChunkLoader implements IChunkLoader, IThreadedFileIO {
private List chunksToRemove = new ArrayList();
private Set pendingAnvilChunksCoordinates = new HashSet();
private Object syncLockObject = new Object();
/** Save directory for chunks using the Anvil format */
private final File chunkSaveLocation;
public AnvilChunkLoader(File par1File) {
this.chunkSaveLocation = par1File;
}
/**
* Loads the specified(XZ) chunk into the specified world.
*/
public Chunk loadChunk(World par1World, int par2, int par3) throws IOException {
NBTTagCompound var4 = null;
ChunkCoordIntPair var5 = new ChunkCoordIntPair(par2, par3);
Object var6 = this.syncLockObject;
synchronized (this.syncLockObject) {
if (this.pendingAnvilChunksCoordinates.contains(var5)) {
for (int var7 = 0; var7 < this.chunksToRemove.size(); ++var7) {
if (((AnvilChunkLoaderPending) this.chunksToRemove.get(var7)).chunkCoordinate.equals(var5)) {
var4 = ((AnvilChunkLoaderPending) this.chunksToRemove.get(var7)).nbtTags;
break;
}
}
}
}
if (var4 == null) {
DataInputStream var10 = RegionFileCache.getChunkInputStream(this.chunkSaveLocation, par2, par3);
if (var10 == null) {
return null;
}
var4 = CompressedStreamTools.read(var10);
}
return this.checkedReadChunkFromNBT(par1World, par2, par3, var4);
}
/**
* Wraps readChunkFromNBT. Checks the coordinates and several NBT tags.
*/
protected Chunk checkedReadChunkFromNBT(World par1World, int par2, int par3, NBTTagCompound par4NBTTagCompound) {
if (!par4NBTTagCompound.hasKey("Level")) {
par1World.getWorldLogAgent()
.logSevere("Chunk file at " + par2 + "," + par3 + " is missing level data, skipping");
return null;
} else if (!par4NBTTagCompound.getCompoundTag("Level").hasKey("Sections")) {
par1World.getWorldLogAgent()
.logSevere("Chunk file at " + par2 + "," + par3 + " is missing block data, skipping");
return null;
} else {
Chunk var5 = this.readChunkFromNBT(par1World, par4NBTTagCompound.getCompoundTag("Level"));
if (!var5.isAtLocation(par2, par3)) {
par1World.getWorldLogAgent()
.logSevere("Chunk file at " + par2 + "," + par3
+ " is in the wrong location; relocating. (Expected " + par2 + ", " + par3 + ", got "
+ var5.xPosition + ", " + var5.zPosition + ")");
par4NBTTagCompound.setInteger("xPos", par2);
par4NBTTagCompound.setInteger("zPos", par3);
var5 = this.readChunkFromNBT(par1World, par4NBTTagCompound.getCompoundTag("Level"));
}
return var5;
}
}
public void saveChunk(World par1World, Chunk par2Chunk) throws MinecraftException, IOException {
par1World.checkSessionLock();
try {
NBTTagCompound var3 = new NBTTagCompound();
NBTTagCompound var4 = new NBTTagCompound();
var3.setTag("Level", var4);
this.writeChunkToNBT(par2Chunk, par1World, var4);
this.addChunkToPending(par2Chunk.getChunkCoordIntPair(), var3);
} catch (Exception var5) {
var5.printStackTrace();
}
}
protected void addChunkToPending(ChunkCoordIntPair par1ChunkCoordIntPair, NBTTagCompound par2NBTTagCompound) {
Object var3 = this.syncLockObject;
synchronized (this.syncLockObject) {
if (this.pendingAnvilChunksCoordinates.contains(par1ChunkCoordIntPair)) {
for (int var4 = 0; var4 < this.chunksToRemove.size(); ++var4) {
if (((AnvilChunkLoaderPending) this.chunksToRemove.get(var4)).chunkCoordinate
.equals(par1ChunkCoordIntPair)) {
this.chunksToRemove.set(var4,
new AnvilChunkLoaderPending(par1ChunkCoordIntPair, par2NBTTagCompound));
return;
}
}
}
this.chunksToRemove.add(new AnvilChunkLoaderPending(par1ChunkCoordIntPair, par2NBTTagCompound));
this.pendingAnvilChunksCoordinates.add(par1ChunkCoordIntPair);
ThreadedFileIOBase.threadedIOInstance.queueIO(this);
}
}
/**
* Returns a boolean stating if the write was unsuccessful.
*/
public boolean writeNextIO() {
AnvilChunkLoaderPending var1 = null;
Object var2 = this.syncLockObject;
synchronized (this.syncLockObject) {
if (this.chunksToRemove.isEmpty()) {
return false;
}
var1 = (AnvilChunkLoaderPending) this.chunksToRemove.remove(0);
this.pendingAnvilChunksCoordinates.remove(var1.chunkCoordinate);
}
if (var1 != null) {
try {
this.writeChunkNBTTags(var1);
} catch (Exception var4) {
var4.printStackTrace();
}
}
return true;
}
private void writeChunkNBTTags(AnvilChunkLoaderPending par1AnvilChunkLoaderPending) throws IOException {
DataOutputStream var2 = RegionFileCache.getChunkOutputStream(this.chunkSaveLocation,
par1AnvilChunkLoaderPending.chunkCoordinate.chunkXPos,
par1AnvilChunkLoaderPending.chunkCoordinate.chunkZPos);
CompressedStreamTools.write(par1AnvilChunkLoaderPending.nbtTags, var2);
var2.close();
}
/**
* Save extra data associated with this Chunk not normally saved during
* autosave, only during chunk unload. Currently unused.
*/
public void saveExtraChunkData(World par1World, Chunk par2Chunk) {
}
/**
* Called every World.tick()
*/
public void chunkTick() {
}
/**
* Save extra data not associated with any Chunk. Not saved during autosave,
* only during world unload. Currently unused.
*/
public void saveExtraData() {
while (this.writeNextIO()) {
;
}
}
/**
* Writes the Chunk passed as an argument to the NBTTagCompound also passed,
* using the World argument to retrieve the Chunk's last update time.
*/
private void writeChunkToNBT(Chunk par1Chunk, World par2World, NBTTagCompound par3NBTTagCompound) {
par3NBTTagCompound.setInteger("xPos", par1Chunk.xPosition);
par3NBTTagCompound.setInteger("zPos", par1Chunk.zPosition);
par3NBTTagCompound.setLong("LastUpdate", par2World.getTotalWorldTime());
par3NBTTagCompound.setIntArray("HeightMap", par1Chunk.heightMap);
par3NBTTagCompound.setBoolean("TerrainPopulated", par1Chunk.isTerrainPopulated);
ExtendedBlockStorage[] var4 = par1Chunk.getBlockStorageArray();
NBTTagList var5 = new NBTTagList("Sections");
boolean var6 = !par2World.provider.hasNoSky;
ExtendedBlockStorage[] var7 = var4;
int var8 = var4.length;
NBTTagCompound var11;
for (int var9 = 0; var9 < var8; ++var9) {
ExtendedBlockStorage var10 = var7[var9];
if (var10 != null) {
var11 = new NBTTagCompound();
var11.setByte("Y", (byte) (var10.getYLocation() >> 4 & 255));
var11.setByteArray("Blocks", var10.getBlockLSBArray());
if (var10.getBlockMSBArray() != null) {
var11.setByteArray("Add", var10.getBlockMSBArray().data);
}
var11.setByteArray("Data", var10.getMetadataArray().data);
var11.setByteArray("BlockLight", var10.getBlocklightArray().data);
if (var6) {
var11.setByteArray("SkyLight", var10.getSkylightArray().data);
} else {
var11.setByteArray("SkyLight", new byte[var10.getBlocklightArray().data.length]);
}
var5.appendTag(var11);
}
}
par3NBTTagCompound.setTag("Sections", var5);
par3NBTTagCompound.setByteArray("Biomes", par1Chunk.getBiomeArray());
par1Chunk.hasEntities = false;
NBTTagList var16 = new NBTTagList();
Iterator var18;
for (var8 = 0; var8 < par1Chunk.entityLists.length; ++var8) {
var18 = par1Chunk.entityLists[var8].iterator();
while (var18.hasNext()) {
Entity var20 = (Entity) var18.next();
var11 = new NBTTagCompound();
if (var20.addEntityID(var11)) {
par1Chunk.hasEntities = true;
var16.appendTag(var11);
}
}
}
par3NBTTagCompound.setTag("Entities", var16);
NBTTagList var17 = new NBTTagList();
var18 = par1Chunk.chunkTileEntityMap.values().iterator();
while (var18.hasNext()) {
TileEntity var21 = (TileEntity) var18.next();
var11 = new NBTTagCompound();
var21.writeToNBT(var11);
var17.appendTag(var11);
}
par3NBTTagCompound.setTag("TileEntities", var17);
List var19 = par2World.getPendingBlockUpdates(par1Chunk, false);
if (var19 != null) {
long var22 = par2World.getTotalWorldTime();
NBTTagList var12 = new NBTTagList();
Iterator var13 = var19.iterator();
while (var13.hasNext()) {
NextTickListEntry var14 = (NextTickListEntry) var13.next();
NBTTagCompound var15 = new NBTTagCompound();
var15.setInteger("i", var14.blockID);
var15.setInteger("x", var14.xCoord);
var15.setInteger("y", var14.yCoord);
var15.setInteger("z", var14.zCoord);
var15.setInteger("t", (int) (var14.scheduledTime - var22));
var15.setInteger("p", var14.field_82754_f);
var12.appendTag(var15);
}
par3NBTTagCompound.setTag("TileTicks", var12);
}
}
/**
* Reads the data stored in the passed NBTTagCompound and creates a Chunk with
* that data in the passed World. Returns the created Chunk.
*/
private Chunk readChunkFromNBT(World par1World, NBTTagCompound par2NBTTagCompound) {
int var3 = par2NBTTagCompound.getInteger("xPos");
int var4 = par2NBTTagCompound.getInteger("zPos");
Chunk var5 = new Chunk(par1World, var3, var4);
var5.heightMap = par2NBTTagCompound.getIntArray("HeightMap");
var5.isTerrainPopulated = par2NBTTagCompound.getBoolean("TerrainPopulated");
NBTTagList var6 = par2NBTTagCompound.getTagList("Sections");
byte var7 = 16;
ExtendedBlockStorage[] var8 = new ExtendedBlockStorage[var7];
boolean var9 = !par1World.provider.hasNoSky;
for (int var10 = 0; var10 < var6.tagCount(); ++var10) {
NBTTagCompound var11 = (NBTTagCompound) var6.tagAt(var10);
byte var12 = var11.getByte("Y");
ExtendedBlockStorage var13 = new ExtendedBlockStorage(var12 << 4, var9);
var13.setBlockLSBArray(var11.getByteArray("Blocks"));
if (var11.hasKey("Add")) {
var13.setBlockMSBArray(new NibbleArray(var11.getByteArray("Add"), 4));
}
var13.setBlockMetadataArray(new NibbleArray(var11.getByteArray("Data"), 4));
var13.setBlocklightArray(new NibbleArray(var11.getByteArray("BlockLight"), 4));
if (var9) {
var13.setSkylightArray(new NibbleArray(var11.getByteArray("SkyLight"), 4));
}
var13.removeInvalidBlocks();
var8[var12] = var13;
}
var5.setStorageArrays(var8);
if (par2NBTTagCompound.hasKey("Biomes")) {
var5.setBiomeArray(par2NBTTagCompound.getByteArray("Biomes"));
}
NBTTagList var17 = par2NBTTagCompound.getTagList("Entities");
if (var17 != null) {
for (int var18 = 0; var18 < var17.tagCount(); ++var18) {
NBTTagCompound var20 = (NBTTagCompound) var17.tagAt(var18);
Entity var22 = EntityList.createEntityFromNBT(var20, par1World);
var5.hasEntities = true;
if (var22 != null) {
var5.addEntity(var22);
Entity var14 = var22;
for (NBTTagCompound var15 = var20; var15.hasKey("Riding"); var15 = var15.getCompoundTag("Riding")) {
Entity var16 = EntityList.createEntityFromNBT(var15.getCompoundTag("Riding"), par1World);
if (var16 != null) {
var5.addEntity(var16);
var14.mountEntity(var16);
}
var14 = var16;
}
}
}
}
NBTTagList var19 = par2NBTTagCompound.getTagList("TileEntities");
if (var19 != null) {
for (int var21 = 0; var21 < var19.tagCount(); ++var21) {
NBTTagCompound var24 = (NBTTagCompound) var19.tagAt(var21);
TileEntity var26 = TileEntity.createAndLoadEntity(var24);
if (var26 != null) {
var5.addTileEntity(var26);
}
}
}
if (par2NBTTagCompound.hasKey("TileTicks")) {
NBTTagList var23 = par2NBTTagCompound.getTagList("TileTicks");
if (var23 != null) {
for (int var25 = 0; var25 < var23.tagCount(); ++var25) {
NBTTagCompound var27 = (NBTTagCompound) var23.tagAt(var25);
par1World.scheduleBlockUpdateFromLoad(var27.getInteger("x"), var27.getInteger("y"),
var27.getInteger("z"), var27.getInteger("i"), var27.getInteger("t"), var27.getInteger("p"));
}
}
}
return var5;
}
}

View File

@ -1,11 +0,0 @@
package net.minecraft.src;
class AnvilChunkLoaderPending {
public final ChunkCoordIntPair chunkCoordinate;
public final NBTTagCompound nbtTags;
public AnvilChunkLoaderPending(ChunkCoordIntPair par1ChunkCoordIntPair, NBTTagCompound par2NBTTagCompound) {
this.chunkCoordinate = par1ChunkCoordIntPair;
this.nbtTags = par2NBTTagCompound;
}
}

View File

@ -1,21 +0,0 @@
package net.minecraft.src;
public class AnvilConverterData {
public long lastUpdated;
public boolean terrainPopulated;
public byte[] heightmap;
public NibbleArrayReader blockLight;
public NibbleArrayReader skyLight;
public NibbleArrayReader data;
public byte[] blocks;
public NBTTagList entities;
public NBTTagList tileEntities;
public NBTTagList tileTicks;
public final int x;
public final int z;
public AnvilConverterData(int par1, int par2) {
this.x = par1;
this.z = par2;
}
}

View File

@ -1,191 +0,0 @@
package net.minecraft.src;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import net.minecraft.server.MinecraftServer;
public class AnvilSaveConverter extends SaveFormatOld {
public AnvilSaveConverter(File par1File) {
super(par1File);
}
protected int getSaveVersion() {
return 19133;
}
public void flushCache() {
RegionFileCache.clearRegionFileReferences();
}
/**
* Returns back a loader for the specified save directory
*/
public ISaveHandler getSaveLoader(String par1Str, boolean par2) {
return new AnvilSaveHandler(this.savesDirectory, par1Str, par2);
}
/**
* gets if the map is old chunk saving (true) or McRegion (false)
*/
public boolean isOldMapFormat(String par1Str) {
WorldInfo var2 = this.getWorldInfo(par1Str);
return var2 != null && var2.getSaveVersion() != this.getSaveVersion();
}
/**
* converts the map to mcRegion
*/
public boolean convertMapFormat(String par1Str, IProgressUpdate par2IProgressUpdate) {
par2IProgressUpdate.setLoadingProgress(0);
ArrayList var3 = new ArrayList();
ArrayList var4 = new ArrayList();
ArrayList var5 = new ArrayList();
File var6 = new File(this.savesDirectory, par1Str);
File var7 = new File(var6, "DIM-1");
File var8 = new File(var6, "DIM1");
MinecraftServer.getServer().getLogAgent().func_98233_a("Scanning folders...");
this.addRegionFilesToCollection(var6, var3);
if (var7.exists()) {
this.addRegionFilesToCollection(var7, var4);
}
if (var8.exists()) {
this.addRegionFilesToCollection(var8, var5);
}
int var9 = var3.size() + var4.size() + var5.size();
MinecraftServer.getServer().getLogAgent().func_98233_a("Total conversion count is " + var9);
WorldInfo var10 = this.getWorldInfo(par1Str);
Object var11 = null;
if (var10.getTerrainType() == WorldType.FLAT) {
var11 = new WorldChunkManagerHell(BiomeGenBase.plains, 0.5F, 0.5F);
} else {
var11 = new WorldChunkManager(var10.getSeed(), var10.getTerrainType());
}
this.convertFile(new File(var6, "region"), var3, (WorldChunkManager) var11, 0, var9, par2IProgressUpdate);
this.convertFile(new File(var7, "region"), var4, new WorldChunkManagerHell(BiomeGenBase.hell, 1.0F, 0.0F),
var3.size(), var9, par2IProgressUpdate);
this.convertFile(new File(var8, "region"), var5, new WorldChunkManagerHell(BiomeGenBase.sky, 0.5F, 0.0F),
var3.size() + var4.size(), var9, par2IProgressUpdate);
var10.setSaveVersion(19133);
if (var10.getTerrainType() == WorldType.DEFAULT_1_1) {
var10.setTerrainType(WorldType.DEFAULT);
}
this.createFile(par1Str);
ISaveHandler var12 = this.getSaveLoader(par1Str, false);
var12.saveWorldInfo(var10);
return true;
}
/**
* par: filename for the level.dat_mcr backup
*/
private void createFile(String par1Str) {
File var2 = new File(this.savesDirectory, par1Str);
if (!var2.exists()) {
System.out.println("Warning: Unable to create level.dat_mcr backup");
} else {
File var3 = new File(var2, "level.dat");
if (!var3.exists()) {
System.out.println("Warning: Unable to create level.dat_mcr backup");
} else {
File var4 = new File(var2, "level.dat_mcr");
if (!var3.renameTo(var4)) {
System.out.println("Warning: Unable to create level.dat_mcr backup");
}
}
}
}
private void convertFile(File par1File, Iterable par2Iterable, WorldChunkManager par3WorldChunkManager, int par4,
int par5, IProgressUpdate par6IProgressUpdate) {
Iterator var7 = par2Iterable.iterator();
while (var7.hasNext()) {
File var8 = (File) var7.next();
this.convertChunks(par1File, var8, par3WorldChunkManager, par4, par5, par6IProgressUpdate);
++par4;
int var9 = (int) Math.round(100.0D * (double) par4 / (double) par5);
par6IProgressUpdate.setLoadingProgress(var9);
}
}
/**
* copies a 32x32 chunk set from par2File to par1File, via AnvilConverterData
*/
private void convertChunks(File par1File, File par2File, WorldChunkManager par3WorldChunkManager, int par4,
int par5, IProgressUpdate par6IProgressUpdate) {
try {
String var7 = par2File.getName();
RegionFile var8 = new RegionFile(par2File);
RegionFile var9 = new RegionFile(
new File(par1File, var7.substring(0, var7.length() - ".mcr".length()) + ".mca"));
for (int var10 = 0; var10 < 32; ++var10) {
int var11;
for (var11 = 0; var11 < 32; ++var11) {
if (var8.isChunkSaved(var10, var11) && !var9.isChunkSaved(var10, var11)) {
DataInputStream var12 = var8.getChunkDataInputStream(var10, var11);
if (var12 == null) {
MinecraftServer.getServer().getLogAgent().func_98236_b("Failed to fetch input stream");
} else {
NBTTagCompound var13 = CompressedStreamTools.read(var12);
var12.close();
NBTTagCompound var14 = var13.getCompoundTag("Level");
AnvilConverterData var15 = ChunkLoader.load(var14);
NBTTagCompound var16 = new NBTTagCompound();
NBTTagCompound var17 = new NBTTagCompound();
var16.setTag("Level", var17);
ChunkLoader.convertToAnvilFormat(var15, var17, par3WorldChunkManager);
DataOutputStream var18 = var9.getChunkDataOutputStream(var10, var11);
CompressedStreamTools.write(var16, var18);
var18.close();
}
}
}
var11 = (int) Math.round(100.0D * (double) (par4 * 1024) / (double) (par5 * 1024));
int var20 = (int) Math
.round(100.0D * (double) ((var10 + 1) * 32 + par4 * 1024) / (double) (par5 * 1024));
if (var20 > var11) {
par6IProgressUpdate.setLoadingProgress(var20);
}
}
var8.close();
var9.close();
} catch (IOException var19) {
var19.printStackTrace();
}
}
/**
* filters the files in the par1 directory, and adds them to the par2
* collections
*/
private void addRegionFilesToCollection(File par1File, Collection par2Collection) {
File var3 = new File(par1File, "region");
File[] var4 = var3.listFiles(new AnvilSaveConverterFileFilter(this));
if (var4 != null) {
Collections.addAll(par2Collection, var4);
}
}
}

View File

@ -1,16 +0,0 @@
package net.minecraft.src;
import java.io.File;
import java.io.FilenameFilter;
class AnvilSaveConverterFileFilter implements FilenameFilter {
final AnvilSaveConverter parent;
AnvilSaveConverterFileFilter(AnvilSaveConverter par1AnvilSaveConverter) {
this.parent = par1AnvilSaveConverter;
}
public boolean accept(File par1File, String par2Str) {
return par2Str.endsWith(".mcr");
}
}

View File

@ -1,50 +0,0 @@
package net.minecraft.src;
import java.io.File;
public class AnvilSaveHandler extends SaveHandler {
public AnvilSaveHandler(File par1File, String par2Str, boolean par3) {
super(par1File, par2Str, par3);
}
/**
* initializes and returns the chunk loader for the specified world provider
*/
public IChunkLoader getChunkLoader(WorldProvider par1WorldProvider) {
File var2 = this.getWorldDirectory();
File var3;
if (par1WorldProvider instanceof WorldProviderHell) {
var3 = new File(var2, "DIM-1");
var3.mkdirs();
return new AnvilChunkLoader(var3);
} else if (par1WorldProvider instanceof WorldProviderEnd) {
var3 = new File(var2, "DIM1");
var3.mkdirs();
return new AnvilChunkLoader(var3);
} else {
return new AnvilChunkLoader(var2);
}
}
/**
* Saves the given World Info with the given NBTTagCompound as the Player.
*/
public void saveWorldInfoWithPlayer(WorldInfo par1WorldInfo, NBTTagCompound par2NBTTagCompound) {
par1WorldInfo.setSaveVersion(19133);
super.saveWorldInfoWithPlayer(par1WorldInfo, par2NBTTagCompound);
}
/**
* Called to flush all changes to disk, waiting for them to complete.
*/
public void flush() {
try {
ThreadedFileIOBase.threadedIOInstance.waitForFinish();
} catch (InterruptedException var2) {
var2.printStackTrace();
}
RegionFileCache.clearRegionFileReferences();
}
}

View File

@ -1,122 +0,0 @@
package net.minecraft.src;
public class ChunkLoader {
public static AnvilConverterData load(NBTTagCompound par0NBTTagCompound) {
int var1 = par0NBTTagCompound.getInteger("xPos");
int var2 = par0NBTTagCompound.getInteger("zPos");
AnvilConverterData var3 = new AnvilConverterData(var1, var2);
var3.blocks = par0NBTTagCompound.getByteArray("Blocks");
var3.data = new NibbleArrayReader(par0NBTTagCompound.getByteArray("Data"), 7);
var3.skyLight = new NibbleArrayReader(par0NBTTagCompound.getByteArray("SkyLight"), 7);
var3.blockLight = new NibbleArrayReader(par0NBTTagCompound.getByteArray("BlockLight"), 7);
var3.heightmap = par0NBTTagCompound.getByteArray("HeightMap");
var3.terrainPopulated = par0NBTTagCompound.getBoolean("TerrainPopulated");
var3.entities = par0NBTTagCompound.getTagList("Entities");
var3.tileEntities = par0NBTTagCompound.getTagList("TileEntities");
var3.tileTicks = par0NBTTagCompound.getTagList("TileTicks");
try {
var3.lastUpdated = par0NBTTagCompound.getLong("LastUpdate");
} catch (ClassCastException var5) {
var3.lastUpdated = (long) par0NBTTagCompound.getInteger("LastUpdate");
}
return var3;
}
public static void convertToAnvilFormat(AnvilConverterData par0AnvilConverterData,
NBTTagCompound par1NBTTagCompound, WorldChunkManager par2WorldChunkManager) {
par1NBTTagCompound.setInteger("xPos", par0AnvilConverterData.x);
par1NBTTagCompound.setInteger("zPos", par0AnvilConverterData.z);
par1NBTTagCompound.setLong("LastUpdate", par0AnvilConverterData.lastUpdated);
int[] var3 = new int[par0AnvilConverterData.heightmap.length];
for (int var4 = 0; var4 < par0AnvilConverterData.heightmap.length; ++var4) {
var3[var4] = par0AnvilConverterData.heightmap[var4];
}
par1NBTTagCompound.setIntArray("HeightMap", var3);
par1NBTTagCompound.setBoolean("TerrainPopulated", par0AnvilConverterData.terrainPopulated);
NBTTagList var16 = new NBTTagList("Sections");
int var7;
for (int var5 = 0; var5 < 8; ++var5) {
boolean var6 = true;
for (var7 = 0; var7 < 16 && var6; ++var7) {
int var8 = 0;
while (var8 < 16 && var6) {
int var9 = 0;
while (true) {
if (var9 < 16) {
int var10 = var7 << 11 | var9 << 7 | var8 + (var5 << 4);
byte var11 = par0AnvilConverterData.blocks[var10];
if (var11 == 0) {
++var9;
continue;
}
var6 = false;
}
++var8;
break;
}
}
}
if (!var6) {
byte[] var19 = new byte[4096];
NibbleArray var20 = new NibbleArray(var19.length, 4);
NibbleArray var21 = new NibbleArray(var19.length, 4);
NibbleArray var22 = new NibbleArray(var19.length, 4);
for (int var23 = 0; var23 < 16; ++var23) {
for (int var12 = 0; var12 < 16; ++var12) {
for (int var13 = 0; var13 < 16; ++var13) {
int var14 = var23 << 11 | var13 << 7 | var12 + (var5 << 4);
byte var15 = par0AnvilConverterData.blocks[var14];
var19[var12 << 8 | var13 << 4 | var23] = (byte) (var15 & 255);
var20.set(var23, var12, var13,
par0AnvilConverterData.data.get(var23, var12 + (var5 << 4), var13));
var21.set(var23, var12, var13,
par0AnvilConverterData.skyLight.get(var23, var12 + (var5 << 4), var13));
var22.set(var23, var12, var13,
par0AnvilConverterData.blockLight.get(var23, var12 + (var5 << 4), var13));
}
}
}
NBTTagCompound var24 = new NBTTagCompound();
var24.setByte("Y", (byte) (var5 & 255));
var24.setByteArray("Blocks", var19);
var24.setByteArray("Data", var20.data);
var24.setByteArray("SkyLight", var21.data);
var24.setByteArray("BlockLight", var22.data);
var16.appendTag(var24);
}
}
par1NBTTagCompound.setTag("Sections", var16);
byte[] var17 = new byte[256];
for (int var18 = 0; var18 < 16; ++var18) {
for (var7 = 0; var7 < 16; ++var7) {
var17[var7 << 4
| var18] = (byte) (par2WorldChunkManager.getBiomeGenAt(par0AnvilConverterData.x << 4 | var18,
par0AnvilConverterData.z << 4 | var7).biomeID & 255);
}
}
par1NBTTagCompound.setByteArray("Biomes", var17);
par1NBTTagCompound.setTag("Entities", par0AnvilConverterData.entities);
par1NBTTagCompound.setTag("TileEntities", par0AnvilConverterData.tileEntities);
if (par0AnvilConverterData.tileTicks != null) {
par1NBTTagCompound.setTag("TileTicks", par0AnvilConverterData.tileTicks);
}
}
}

View File

@ -1,368 +0,0 @@
package net.minecraft.src;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import net.minecraft.server.MinecraftServer;
public class DedicatedServer extends MinecraftServer implements IServer {
private final List pendingCommandList = Collections.synchronizedList(new ArrayList());
private final ILogAgent field_98131_l;
private RConThreadQuery theRConThreadQuery;
private RConThreadMain theRConThreadMain;
private PropertyManager settings;
private boolean canSpawnStructures;
private EnumGameType gameType;
private NetworkListenThread networkThread;
private boolean guiIsEnabled = false;
public DedicatedServer(File par1File) {
super(par1File);
this.field_98131_l = new LogAgent("Minecraft-Server", (String) null,
(new File(par1File, "server.log")).getAbsolutePath());
new DedicatedServerSleepThread(this);
}
/**
* Initialises the server and starts it.
*/
protected boolean startServer() throws IOException {
DedicatedServerCommandThread var1 = new DedicatedServerCommandThread(this);
var1.setDaemon(true);
var1.start();
this.getLogAgent().func_98233_a("Starting minecraft server version 1.5.2");
if (Runtime.getRuntime().maxMemory() / 1024L / 1024L < 512L) {
this.getLogAgent().func_98236_b(
"To start the server with more ram, launch it as \"java -Xmx1024M -Xms1024M -jar minecraft_server.jar\"");
}
this.getLogAgent().func_98233_a("Loading properties");
this.settings = new PropertyManager(new File("server.properties"), this.getLogAgent());
if (this.isSinglePlayer()) {
this.setHostname("127.0.0.1");
} else {
this.setOnlineMode(this.settings.getBooleanProperty("online-mode", true));
this.setHostname(this.settings.getStringProperty("server-ip", ""));
}
this.setCanSpawnAnimals(this.settings.getBooleanProperty("spawn-animals", true));
this.setCanSpawnNPCs(this.settings.getBooleanProperty("spawn-npcs", true));
this.setAllowPvp(this.settings.getBooleanProperty("pvp", true));
this.setAllowFlight(this.settings.getBooleanProperty("allow-flight", false));
this.setTexturePack(this.settings.getStringProperty("texture-pack", ""));
this.setMOTD(this.settings.getStringProperty("motd", "A Minecraft Server"));
this.func_104055_i(this.settings.getBooleanProperty("force-gamemode", false));
if (this.settings.getIntProperty("difficulty", 1) < 0) {
this.settings.setProperty("difficulty", Integer.valueOf(0));
} else if (this.settings.getIntProperty("difficulty", 1) > 3) {
this.settings.setProperty("difficulty", Integer.valueOf(3));
}
this.canSpawnStructures = this.settings.getBooleanProperty("generate-structures", true);
int var2 = this.settings.getIntProperty("gamemode", EnumGameType.SURVIVAL.getID());
this.gameType = WorldSettings.getGameTypeById(var2);
this.getLogAgent().func_98233_a("Default game type: " + this.gameType);
InetAddress var3 = null;
if (this.getServerHostname().length() > 0) {
var3 = InetAddress.getByName(this.getServerHostname());
}
if (this.getServerPort() < 0) {
this.setServerPort(this.settings.getIntProperty("server-port", 25565));
}
this.getLogAgent().func_98233_a("Generating keypair");
this.setKeyPair(CryptManager.generateKeyPair());
this.getLogAgent()
.func_98233_a("Starting Minecraft server on "
+ (this.getServerHostname().length() == 0 ? "*" : this.getServerHostname()) + ":"
+ this.getServerPort());
try {
this.networkThread = new DedicatedServerListenThread(this, var3, this.getServerPort());
} catch (IOException var16) {
this.getLogAgent().func_98236_b("**** FAILED TO BIND TO PORT!");
this.getLogAgent().logWarningFormatted("The exception was: {0}", new Object[] { var16.toString() });
this.getLogAgent().func_98236_b("Perhaps a server is already running on that port?");
return false;
}
if (!this.isServerInOnlineMode()) {
this.getLogAgent().func_98236_b("**** SERVER IS RUNNING IN OFFLINE/INSECURE MODE!");
this.getLogAgent().func_98236_b("The server will make no attempt to authenticate usernames. Beware.");
this.getLogAgent().func_98236_b(
"While this makes the game possible to play without internet access, it also opens up the ability for hackers to connect with any username they choose.");
this.getLogAgent()
.func_98236_b("To change this, set \"online-mode\" to \"true\" in the server.properties file.");
}
this.setConfigurationManager(new DedicatedPlayerList(this));
long var4 = System.nanoTime();
if (this.getFolderName() == null) {
this.setFolderName(this.settings.getStringProperty("level-name", "world"));
}
String var6 = this.settings.getStringProperty("level-seed", "");
String var7 = this.settings.getStringProperty("level-type", "DEFAULT");
String var8 = this.settings.getStringProperty("generator-settings", "");
long var9 = (new Random()).nextLong();
if (var6.length() > 0) {
try {
long var11 = Long.parseLong(var6);
if (var11 != 0L) {
var9 = var11;
}
} catch (NumberFormatException var15) {
var9 = (long) var6.hashCode();
}
}
WorldType var17 = WorldType.parseWorldType(var7);
if (var17 == null) {
var17 = WorldType.DEFAULT;
}
this.setBuildLimit(this.settings.getIntProperty("max-build-height", 256));
this.setBuildLimit((this.getBuildLimit() + 8) / 16 * 16);
this.setBuildLimit(MathHelper.clamp_int(this.getBuildLimit(), 64, 256));
this.settings.setProperty("max-build-height", Integer.valueOf(this.getBuildLimit()));
this.getLogAgent().func_98233_a("Preparing level \"" + this.getFolderName() + "\"");
this.loadAllWorlds(this.getFolderName(), this.getFolderName(), var9, var17, var8);
long var12 = System.nanoTime() - var4;
String var14 = String.format("%.3fs", new Object[] { Double.valueOf((double) var12 / 1.0E9D) });
this.getLogAgent().func_98233_a("Done (" + var14 + ")! For help, type \"help\" or \"?\"");
if (this.settings.getBooleanProperty("enable-query", false)) {
this.getLogAgent().func_98233_a("Starting GS4 status listener");
this.theRConThreadQuery = new RConThreadQuery(this);
this.theRConThreadQuery.startThread();
}
if (this.settings.getBooleanProperty("enable-rcon", false)) {
this.getLogAgent().func_98233_a("Starting remote control listener");
this.theRConThreadMain = new RConThreadMain(this);
this.theRConThreadMain.startThread();
}
return true;
}
public boolean canStructuresSpawn() {
return this.canSpawnStructures;
}
public EnumGameType getGameType() {
return this.gameType;
}
/**
* Defaults to "1" (Easy) for the dedicated server, defaults to "2" (Normal) on
* the client.
*/
public int getDifficulty() {
return this.settings.getIntProperty("difficulty", 1);
}
/**
* Defaults to false.
*/
public boolean isHardcore() {
return this.settings.getBooleanProperty("hardcore", false);
}
/**
* Called on exit from the main run() loop.
*/
protected void finalTick(CrashReport par1CrashReport) {
while (this.isServerRunning()) {
this.executePendingCommands();
try {
Thread.sleep(10L);
} catch (InterruptedException var3) {
var3.printStackTrace();
}
}
}
/**
* Adds the server info, including from theWorldServer, to the crash report.
*/
public CrashReport addServerInfoToCrashReport(CrashReport par1CrashReport) {
par1CrashReport = super.addServerInfoToCrashReport(par1CrashReport);
par1CrashReport.func_85056_g().addCrashSectionCallable("Is Modded", new CallableType(this));
par1CrashReport.func_85056_g().addCrashSectionCallable("Type", new CallableServerType(this));
return par1CrashReport;
}
/**
* Directly calls System.exit(0), instantly killing the program.
*/
protected void systemExitNow() {
System.exit(0);
}
public void updateTimeLightAndEntities() {
super.updateTimeLightAndEntities();
this.executePendingCommands();
}
public boolean getAllowNether() {
return this.settings.getBooleanProperty("allow-nether", true);
}
public boolean allowSpawnMonsters() {
return this.settings.getBooleanProperty("spawn-monsters", true);
}
public void addServerStatsToSnooper(PlayerUsageSnooper par1PlayerUsageSnooper) {
par1PlayerUsageSnooper.addData("whitelist_enabled",
Boolean.valueOf(this.getDedicatedPlayerList().isWhiteListEnabled()));
par1PlayerUsageSnooper.addData("whitelist_count",
Integer.valueOf(this.getDedicatedPlayerList().getWhiteListedPlayers().size()));
super.addServerStatsToSnooper(par1PlayerUsageSnooper);
}
/**
* Returns whether snooping is enabled or not.
*/
public boolean isSnooperEnabled() {
return this.settings.getBooleanProperty("snooper-enabled", true);
}
public void addPendingCommand(String par1Str, ICommandSender par2ICommandSender) {
this.pendingCommandList.add(new ServerCommand(par1Str, par2ICommandSender));
}
public void executePendingCommands() {
while (!this.pendingCommandList.isEmpty()) {
ServerCommand var1 = (ServerCommand) this.pendingCommandList.remove(0);
this.getCommandManager().executeCommand(var1.sender, var1.command);
}
}
public boolean isDedicatedServer() {
return true;
}
public DedicatedPlayerList getDedicatedPlayerList() {
return (DedicatedPlayerList) super.getConfigurationManager();
}
public NetworkListenThread getNetworkThread() {
return this.networkThread;
}
/**
* Gets an integer property. If it does not exist, set it to the specified
* value.
*/
public int getIntProperty(String par1Str, int par2) {
return this.settings.getIntProperty(par1Str, par2);
}
/**
* Gets a string property. If it does not exist, set it to the specified value.
*/
public String getStringProperty(String par1Str, String par2Str) {
return this.settings.getStringProperty(par1Str, par2Str);
}
/**
* Gets a boolean property. If it does not exist, set it to the specified value.
*/
public boolean getBooleanProperty(String par1Str, boolean par2) {
return this.settings.getBooleanProperty(par1Str, par2);
}
/**
* Saves an Object with the given property name.
*/
public void setProperty(String par1Str, Object par2Obj) {
this.settings.setProperty(par1Str, par2Obj);
}
/**
* Saves all of the server properties to the properties file.
*/
public void saveProperties() {
this.settings.saveProperties();
}
/**
* Returns the filename where server properties are stored
*/
public String getSettingsFilename() {
File var1 = this.settings.getPropertiesFile();
return var1 != null ? var1.getAbsolutePath() : "No settings file";
}
public void enableGui() {
ServerGUI.initGUI(this);
this.guiIsEnabled = true;
}
public boolean getGuiEnabled() {
return this.guiIsEnabled;
}
/**
* On dedicated does nothing. On integrated, sets commandsAllowedForAll,
* gameType and allows external connections.
*/
public String shareToLAN(EnumGameType par1EnumGameType, boolean par2) {
return "";
}
/**
* Return whether command blocks are enabled.
*/
public boolean isCommandBlockEnabled() {
return this.settings.getBooleanProperty("enable-command-block", false);
}
/**
* Return the spawn protection area's size.
*/
public int getSpawnProtectionSize() {
return this.settings.getIntProperty("spawn-protection", super.getSpawnProtectionSize());
}
public boolean func_96290_a(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer) {
if (par1World.provider.dimensionId != 0) {
return false;
} else if (this.getDedicatedPlayerList().getOps().isEmpty()) {
return false;
} else if (this.getDedicatedPlayerList().areCommandsAllowed(par5EntityPlayer.username)) {
return false;
} else if (this.getSpawnProtectionSize() <= 0) {
return false;
} else {
ChunkCoordinates var6 = par1World.getSpawnPoint();
int var7 = MathHelper.abs_int(par2 - var6.posX);
int var8 = MathHelper.abs_int(par4 - var6.posZ);
int var9 = Math.max(var7, var8);
return var9 <= this.getSpawnProtectionSize();
}
}
public ILogAgent getLogAgent() {
return this.field_98131_l;
}
public ServerConfigurationManager getConfigurationManager() {
return this.getDedicatedPlayerList();
}
}

View File

@ -1,284 +0,0 @@
package net.minecraft.src;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.zip.DeflaterOutputStream;
import java.util.zip.GZIPInputStream;
import java.util.zip.InflaterInputStream;
public class RegionFile {
private static final byte[] emptySector = new byte[4096];
private final File fileName;
private RandomAccessFile dataFile;
private final int[] offsets = new int[1024];
private final int[] chunkTimestamps = new int[1024];
private ArrayList sectorFree;
/** McRegion sizeDelta */
private int sizeDelta;
private long lastModified = 0L;
public RegionFile(File par1File) {
this.fileName = par1File;
this.sizeDelta = 0;
try {
if (par1File.exists()) {
this.lastModified = par1File.lastModified();
}
this.dataFile = new RandomAccessFile(par1File, "rw");
int var2;
if (this.dataFile.length() < 4096L) {
for (var2 = 0; var2 < 1024; ++var2) {
this.dataFile.writeInt(0);
}
for (var2 = 0; var2 < 1024; ++var2) {
this.dataFile.writeInt(0);
}
this.sizeDelta += 8192;
}
if ((this.dataFile.length() & 4095L) != 0L) {
for (var2 = 0; (long) var2 < (this.dataFile.length() & 4095L); ++var2) {
this.dataFile.write(0);
}
}
var2 = (int) this.dataFile.length() / 4096;
this.sectorFree = new ArrayList(var2);
int var3;
for (var3 = 0; var3 < var2; ++var3) {
this.sectorFree.add(Boolean.valueOf(true));
}
this.sectorFree.set(0, Boolean.valueOf(false));
this.sectorFree.set(1, Boolean.valueOf(false));
this.dataFile.seek(0L);
int var4;
for (var3 = 0; var3 < 1024; ++var3) {
var4 = this.dataFile.readInt();
this.offsets[var3] = var4;
if (var4 != 0 && (var4 >> 8) + (var4 & 255) <= this.sectorFree.size()) {
for (int var5 = 0; var5 < (var4 & 255); ++var5) {
this.sectorFree.set((var4 >> 8) + var5, Boolean.valueOf(false));
}
}
}
for (var3 = 0; var3 < 1024; ++var3) {
var4 = this.dataFile.readInt();
this.chunkTimestamps[var3] = var4;
}
} catch (IOException var6) {
var6.printStackTrace();
}
}
/**
* args: x, y - get uncompressed chunk stream from the region file
*/
public synchronized DataInputStream getChunkDataInputStream(int par1, int par2) {
if (this.outOfBounds(par1, par2)) {
return null;
} else {
try {
int var3 = this.getOffset(par1, par2);
if (var3 == 0) {
return null;
} else {
int var4 = var3 >> 8;
int var5 = var3 & 255;
if (var4 + var5 > this.sectorFree.size()) {
return null;
} else {
this.dataFile.seek((long) (var4 * 4096));
int var6 = this.dataFile.readInt();
if (var6 > 4096 * var5) {
return null;
} else if (var6 <= 0) {
return null;
} else {
byte var7 = this.dataFile.readByte();
byte[] var8;
if (var7 == 1) {
var8 = new byte[var6 - 1];
this.dataFile.read(var8);
return new DataInputStream(
new BufferedInputStream(new GZIPInputStream(new ByteArrayInputStream(var8))));
} else if (var7 == 2) {
var8 = new byte[var6 - 1];
this.dataFile.read(var8);
return new DataInputStream(new BufferedInputStream(
new InflaterInputStream(new ByteArrayInputStream(var8))));
} else {
return null;
}
}
}
}
} catch (IOException var9) {
return null;
}
}
}
/**
* args: x, z - get an output stream used to write chunk data, data is on disk
* when the returned stream is closed
*/
public DataOutputStream getChunkDataOutputStream(int par1, int par2) {
return this.outOfBounds(par1, par2) ? null
: new DataOutputStream(new DeflaterOutputStream(new RegionFileChunkBuffer(this, par1, par2)));
}
/**
* args: x, z, data, length - write chunk data at (x, z) to disk
*/
protected synchronized void write(int par1, int par2, byte[] par3ArrayOfByte, int par4) {
try {
int var5 = this.getOffset(par1, par2);
int var6 = var5 >> 8;
int var7 = var5 & 255;
int var8 = (par4 + 5) / 4096 + 1;
if (var8 >= 256) {
return;
}
if (var6 != 0 && var7 == var8) {
this.write(var6, par3ArrayOfByte, par4);
} else {
int var9;
for (var9 = 0; var9 < var7; ++var9) {
this.sectorFree.set(var6 + var9, Boolean.valueOf(true));
}
var9 = this.sectorFree.indexOf(Boolean.valueOf(true));
int var10 = 0;
int var11;
if (var9 != -1) {
for (var11 = var9; var11 < this.sectorFree.size(); ++var11) {
if (var10 != 0) {
if (((Boolean) this.sectorFree.get(var11)).booleanValue()) {
++var10;
} else {
var10 = 0;
}
} else if (((Boolean) this.sectorFree.get(var11)).booleanValue()) {
var9 = var11;
var10 = 1;
}
if (var10 >= var8) {
break;
}
}
}
if (var10 >= var8) {
var6 = var9;
this.setOffset(par1, par2, var9 << 8 | var8);
for (var11 = 0; var11 < var8; ++var11) {
this.sectorFree.set(var6 + var11, Boolean.valueOf(false));
}
this.write(var6, par3ArrayOfByte, par4);
} else {
this.dataFile.seek(this.dataFile.length());
var6 = this.sectorFree.size();
for (var11 = 0; var11 < var8; ++var11) {
this.dataFile.write(emptySector);
this.sectorFree.add(Boolean.valueOf(false));
}
this.sizeDelta += 4096 * var8;
this.write(var6, par3ArrayOfByte, par4);
this.setOffset(par1, par2, var6 << 8 | var8);
}
}
this.setChunkTimestamp(par1, par2, (int) (System.currentTimeMillis() / 1000L));
} catch (IOException var12) {
var12.printStackTrace();
}
}
/**
* args: sectorNumber, data, length - write the chunk data to this RegionFile
*/
private void write(int par1, byte[] par2ArrayOfByte, int par3) throws IOException {
this.dataFile.seek((long) (par1 * 4096));
this.dataFile.writeInt(par3 + 1);
this.dataFile.writeByte(2);
this.dataFile.write(par2ArrayOfByte, 0, par3);
}
/**
* args: x, z - check region bounds
*/
private boolean outOfBounds(int par1, int par2) {
return par1 < 0 || par1 >= 32 || par2 < 0 || par2 >= 32;
}
/**
* args: x, y - get chunk's offset in region file
*/
private int getOffset(int par1, int par2) {
return this.offsets[par1 + par2 * 32];
}
/**
* args: x, z, - true if chunk has been saved / converted
*/
public boolean isChunkSaved(int par1, int par2) {
return this.getOffset(par1, par2) != 0;
}
/**
* args: x, z, offset - sets the chunk's offset in the region file
*/
private void setOffset(int par1, int par2, int par3) throws IOException {
this.offsets[par1 + par2 * 32] = par3;
this.dataFile.seek((long) ((par1 + par2 * 32) * 4));
this.dataFile.writeInt(par3);
}
/**
* args: x, z, timestamp - sets the chunk's write timestamp
*/
private void setChunkTimestamp(int par1, int par2, int par3) throws IOException {
this.chunkTimestamps[par1 + par2 * 32] = par3;
this.dataFile.seek((long) (4096 + (par1 + par2 * 32) * 4));
this.dataFile.writeInt(par3);
}
/**
* close this RegionFile and prevent further writes
*/
public void close() throws IOException {
if (this.dataFile != null) {
this.dataFile.close();
}
}
}

View File

@ -1,75 +0,0 @@
package net.minecraft.src;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class RegionFileCache {
/** A map containing Files as keys and RegionFiles as values */
private static final Map regionsByFilename = new HashMap();
public static synchronized RegionFile createOrLoadRegionFile(File par0File, int par1, int par2) {
File var3 = new File(par0File, "region");
File var4 = new File(var3, "r." + (par1 >> 5) + "." + (par2 >> 5) + ".mca");
RegionFile var5 = (RegionFile) regionsByFilename.get(var4);
if (var5 != null) {
return var5;
} else {
if (!var3.exists()) {
var3.mkdirs();
}
if (regionsByFilename.size() >= 256) {
clearRegionFileReferences();
}
RegionFile var6 = new RegionFile(var4);
regionsByFilename.put(var4, var6);
return var6;
}
}
/**
* clears region file references
*/
public static synchronized void clearRegionFileReferences() {
Iterator var0 = regionsByFilename.values().iterator();
while (var0.hasNext()) {
RegionFile var1 = (RegionFile) var0.next();
try {
if (var1 != null) {
var1.close();
}
} catch (IOException var3) {
var3.printStackTrace();
}
}
regionsByFilename.clear();
}
/**
* Returns an input stream for the specified chunk. Args: worldDir, chunkX,
* chunkZ
*/
public static DataInputStream getChunkInputStream(File par0File, int par1, int par2) {
RegionFile var3 = createOrLoadRegionFile(par0File, par1, par2);
return var3.getChunkDataInputStream(par1 & 31, par2 & 31);
}
/**
* Returns an output stream for the specified chunk. Args: worldDir, chunkX,
* chunkZ
*/
public static DataOutputStream getChunkOutputStream(File par0File, int par1, int par2) {
RegionFile var3 = createOrLoadRegionFile(par0File, par1, par2);
return var3.getChunkDataOutputStream(par1 & 31, par2 & 31);
}
}

View File

@ -1,22 +0,0 @@
package net.minecraft.src;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
class RegionFileChunkBuffer extends ByteArrayOutputStream {
private int chunkX;
private int chunkZ;
final RegionFile regionFile;
public RegionFileChunkBuffer(RegionFile par1RegionFile, int par2, int par3) {
super(8096);
this.regionFile = par1RegionFile;
this.chunkX = par2;
this.chunkZ = par3;
}
public void close() throws IOException {
this.regionFile.write(this.chunkX, this.chunkZ, this.buf, this.count);
}
}

View File

@ -1,141 +0,0 @@
package net.minecraft.src;
import java.io.File;
import java.io.FileInputStream;
public class SaveFormatOld implements ISaveFormat {
/**
* Reference to the File object representing the directory for the world saves
*/
protected final File savesDirectory;
public SaveFormatOld(File par1File) {
if (!par1File.exists()) {
par1File.mkdirs();
}
this.savesDirectory = par1File;
}
public void flushCache() {
}
/**
* gets the world info
*/
public WorldInfo getWorldInfo(String par1Str) {
File var2 = new File(this.savesDirectory, par1Str);
if (!var2.exists()) {
return null;
} else {
File var3 = new File(var2, "level.dat");
NBTTagCompound var4;
NBTTagCompound var5;
if (var3.exists()) {
try {
var4 = CompressedStreamTools.readCompressed(new FileInputStream(var3));
var5 = var4.getCompoundTag("Data");
return new WorldInfo(var5);
} catch (Exception var7) {
var7.printStackTrace();
}
}
var3 = new File(var2, "level.dat_old");
if (var3.exists()) {
try {
var4 = CompressedStreamTools.readCompressed(new FileInputStream(var3));
var5 = var4.getCompoundTag("Data");
return new WorldInfo(var5);
} catch (Exception var6) {
var6.printStackTrace();
}
}
return null;
}
}
/**
* @args: Takes one argument - the name of the directory of the world to
* delete. @desc: Delete the world by deleting the associated directory
* recursively.
*/
public boolean deleteWorldDirectory(String par1Str) {
File var2 = new File(this.savesDirectory, par1Str);
if (!var2.exists()) {
return true;
} else {
System.out.println("Deleting level " + par1Str);
for (int var3 = 1; var3 <= 5; ++var3) {
System.out.println("Attempt " + var3 + "...");
if (deleteFiles(var2.listFiles())) {
break;
}
System.out.println("Unsuccessful in deleting contents.");
if (var3 < 5) {
try {
Thread.sleep(500L);
} catch (InterruptedException var5) {
;
}
}
}
return var2.delete();
}
}
/**
* @args: Takes one argument - the list of files and directories to
* delete. @desc: Deletes the files and directory listed in the list
* recursively.
*/
protected static boolean deleteFiles(File[] par0ArrayOfFile) {
for (int var1 = 0; var1 < par0ArrayOfFile.length; ++var1) {
File var2 = par0ArrayOfFile[var1];
System.out.println("Deleting " + var2);
if (var2.isDirectory() && !deleteFiles(var2.listFiles())) {
System.out.println("Couldn\'t delete directory " + var2);
return false;
}
if (!var2.delete()) {
System.out.println("Couldn\'t delete file " + var2);
return false;
}
}
return true;
}
/**
* Returns back a loader for the specified save directory
*/
public ISaveHandler getSaveLoader(String par1Str, boolean par2) {
return new SaveHandler(this.savesDirectory, par1Str, par2);
}
/**
* gets if the map is old chunk saving (true) or McRegion (false)
*/
public boolean isOldMapFormat(String par1Str) {
return false;
}
/**
* converts the map to mcRegion
*/
public boolean convertMapFormat(String par1Str, IProgressUpdate par2IProgressUpdate) {
return false;
}
}

View File

@ -1,287 +0,0 @@
package net.minecraft.src;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import net.minecraft.server.MinecraftServer;
public class SaveHandler implements ISaveHandler, IPlayerFileData {
/** The directory in which to save world data. */
private final File worldDirectory;
/** The directory in which to save player data. */
private final File playersDirectory;
private final File mapDataDir;
/**
* The time in milliseconds when this field was initialized. Stored in the
* session lock file.
*/
private final long initializationTime = System.currentTimeMillis();
/** The directory name of the world */
private final String saveDirectoryName;
public SaveHandler(File par1File, String par2Str, boolean par3) {
this.worldDirectory = new File(par1File, par2Str);
this.worldDirectory.mkdirs();
this.playersDirectory = new File(this.worldDirectory, "players");
this.mapDataDir = new File(this.worldDirectory, "data");
this.mapDataDir.mkdirs();
this.saveDirectoryName = par2Str;
if (par3) {
this.playersDirectory.mkdirs();
}
this.setSessionLock();
}
/**
* Creates a session lock file for this process
*/
private void setSessionLock() {
try {
File var1 = new File(this.worldDirectory, "session.lock");
DataOutputStream var2 = new DataOutputStream(new FileOutputStream(var1));
try {
var2.writeLong(this.initializationTime);
} finally {
var2.close();
}
} catch (IOException var7) {
var7.printStackTrace();
throw new RuntimeException("Failed to check session lock, aborting");
}
}
/**
* Gets the File object corresponding to the base directory of this world.
*/
protected File getWorldDirectory() {
return this.worldDirectory;
}
/**
* Checks the session lock to prevent save collisions
*/
public void checkSessionLock() throws MinecraftException {
try {
File var1 = new File(this.worldDirectory, "session.lock");
DataInputStream var2 = new DataInputStream(new FileInputStream(var1));
try {
if (var2.readLong() != this.initializationTime) {
throw new MinecraftException("The save is being accessed from another location, aborting");
}
} finally {
var2.close();
}
} catch (IOException var7) {
throw new MinecraftException("Failed to check session lock, aborting");
}
}
/**
* initializes and returns the chunk loader for the specified world provider
*/
public IChunkLoader getChunkLoader(WorldProvider par1WorldProvider) {
throw new RuntimeException("Old Chunk Storage is no longer supported.");
}
/**
* Loads and returns the world info
*/
public WorldInfo loadWorldInfo() {
File var1 = new File(this.worldDirectory, "level.dat");
NBTTagCompound var2;
NBTTagCompound var3;
if (var1.exists()) {
try {
var2 = CompressedStreamTools.readCompressed(new FileInputStream(var1));
var3 = var2.getCompoundTag("Data");
return new WorldInfo(var3);
} catch (Exception var5) {
var5.printStackTrace();
}
}
var1 = new File(this.worldDirectory, "level.dat_old");
if (var1.exists()) {
try {
var2 = CompressedStreamTools.readCompressed(new FileInputStream(var1));
var3 = var2.getCompoundTag("Data");
return new WorldInfo(var3);
} catch (Exception var4) {
var4.printStackTrace();
}
}
return null;
}
/**
* Saves the given World Info with the given NBTTagCompound as the Player.
*/
public void saveWorldInfoWithPlayer(WorldInfo par1WorldInfo, NBTTagCompound par2NBTTagCompound) {
NBTTagCompound var3 = par1WorldInfo.cloneNBTCompound(par2NBTTagCompound);
NBTTagCompound var4 = new NBTTagCompound();
var4.setTag("Data", var3);
try {
File var5 = new File(this.worldDirectory, "level.dat_new");
File var6 = new File(this.worldDirectory, "level.dat_old");
File var7 = new File(this.worldDirectory, "level.dat");
CompressedStreamTools.writeCompressed(var4, new FileOutputStream(var5));
if (var6.exists()) {
var6.delete();
}
var7.renameTo(var6);
if (var7.exists()) {
var7.delete();
}
var5.renameTo(var7);
if (var5.exists()) {
var5.delete();
}
} catch (Exception var8) {
var8.printStackTrace();
}
}
/**
* used to update level.dat from old format to MCRegion format
*/
public void saveWorldInfo(WorldInfo par1WorldInfo) {
NBTTagCompound var2 = par1WorldInfo.getNBTTagCompound();
NBTTagCompound var3 = new NBTTagCompound();
var3.setTag("Data", var2);
try {
File var4 = new File(this.worldDirectory, "level.dat_new");
File var5 = new File(this.worldDirectory, "level.dat_old");
File var6 = new File(this.worldDirectory, "level.dat");
CompressedStreamTools.writeCompressed(var3, new FileOutputStream(var4));
if (var5.exists()) {
var5.delete();
}
var6.renameTo(var5);
if (var6.exists()) {
var6.delete();
}
var4.renameTo(var6);
if (var4.exists()) {
var4.delete();
}
} catch (Exception var7) {
var7.printStackTrace();
}
}
/**
* Writes the player data to disk from the specified PlayerEntityMP.
*/
public void writePlayerData(EntityPlayer par1EntityPlayer) {
try {
NBTTagCompound var2 = new NBTTagCompound();
par1EntityPlayer.writeToNBT(var2);
File var3 = new File(this.playersDirectory, par1EntityPlayer.username + ".dat.tmp");
File var4 = new File(this.playersDirectory, par1EntityPlayer.username + ".dat");
CompressedStreamTools.writeCompressed(var2, new FileOutputStream(var3));
if (var4.exists()) {
var4.delete();
}
var3.renameTo(var4);
} catch (Exception var5) {
MinecraftServer.getServer().getLogAgent()
.func_98236_b("Failed to save player data for " + par1EntityPlayer.username);
}
}
/**
* Reads the player data from disk into the specified PlayerEntityMP.
*/
public NBTTagCompound readPlayerData(EntityPlayer par1EntityPlayer) {
NBTTagCompound var2 = this.getPlayerData(par1EntityPlayer.username);
if (var2 != null) {
par1EntityPlayer.readFromNBT(var2);
}
return var2;
}
/**
* Gets the player data for the given playername as a NBTTagCompound.
*/
public NBTTagCompound getPlayerData(String par1Str) {
try {
File var2 = new File(this.playersDirectory, par1Str + ".dat");
if (var2.exists()) {
return CompressedStreamTools.readCompressed(new FileInputStream(var2));
}
} catch (Exception var3) {
MinecraftServer.getServer().getLogAgent().func_98236_b("Failed to load player data for " + par1Str);
}
return null;
}
public IPlayerFileData getPlayerNBTManager() {
return this;
}
/**
* Returns an array of usernames for which player.dat exists for.
*/
public String[] getAvailablePlayerDat() {
String[] var1 = this.playersDirectory.list();
for (int var2 = 0; var2 < var1.length; ++var2) {
if (var1[var2].endsWith(".dat")) {
var1[var2] = var1[var2].substring(0, var1[var2].length() - 4);
}
}
return var1;
}
/**
* Called to flush all changes to disk, waiting for them to complete.
*/
public void flush() {
}
/**
* Gets the file location of the given map
*/
public File getMapFileFromName(String par1Str) {
return new File(this.mapDataDir, par1Str + ".dat");
}
/**
* Returns the name of the directory where world information is saved.
*/
public String getWorldDirectoryName() {
return this.saveDirectoryName;
}
}

View File

@ -1,106 +0,0 @@
package net.minecraft.src;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import net.lax1dude.eaglercraft.sp.WorkerListenThread;
public class ServerListenThread extends Thread {
private final List pendingConnections = Collections.synchronizedList(new ArrayList());
/**
* This map stores a list of InetAddresses and the last time which they
* connected at
*/
private final HashMap recentConnections = new HashMap();
private int connectionCounter = 0;
private final ServerSocket myServerSocket;
private WorkerListenThread myNetworkListenThread;
private final InetAddress myServerAddress;
private final int myPort;
public ServerListenThread(WorkerListenThread par1NetworkListenThread, InetAddress par2InetAddress, int par3)
throws IOException {
super("Listen thread");
this.myNetworkListenThread = par1NetworkListenThread;
this.myPort = par3;
this.myServerSocket = new ServerSocket(par3, 0, par2InetAddress);
this.myServerAddress = par2InetAddress == null ? this.myServerSocket.getInetAddress() : par2InetAddress;
this.myServerSocket.setPerformancePreferences(0, 2, 1);
}
public void processPendingConnections() {
List var1 = this.pendingConnections;
synchronized (this.pendingConnections) {
for (int var2 = 0; var2 < this.pendingConnections.size(); ++var2) {
NetLoginHandler var3 = (NetLoginHandler) this.pendingConnections.get(var2);
try {
var3.tryLogin();
} catch (Exception var6) {
var3.kickUser("Internal server error");
this.myNetworkListenThread.getServer().getLogAgent().logWarningException(
"Failed to handle packet for " + var3.getUsernameAndAddress() + ": " + var6, var6);
}
if (var3.finishedProcessing) {
this.pendingConnections.remove(var2--);
}
var3.myTCPConnection.wakeThreads();
}
}
}
public void run() {
while (this.myNetworkListenThread.isListening) {
try {
Socket var1 = this.myServerSocket.accept();
NetLoginHandler var2 = new NetLoginHandler(this.myNetworkListenThread.getServer(), var1,
"Connection #" + this.connectionCounter++);
this.addPendingConnection(var2);
} catch (IOException var3) {
var3.printStackTrace();
}
}
this.myNetworkListenThread.getServer().getLogAgent().func_98233_a("Closing listening thread");
}
private void addPendingConnection(NetLoginHandler par1NetLoginHandler) {
if (par1NetLoginHandler == null) {
throw new IllegalArgumentException("Got null pendingconnection!");
} else {
List var2 = this.pendingConnections;
synchronized (this.pendingConnections) {
this.pendingConnections.add(par1NetLoginHandler);
}
}
}
public void func_71769_a(InetAddress par1InetAddress) {
if (par1InetAddress != null) {
HashMap var2 = this.recentConnections;
synchronized (this.recentConnections) {
this.recentConnections.remove(par1InetAddress);
}
}
}
public void func_71768_b() {
try {
this.myServerSocket.close();
} catch (Throwable var2) {
;
}
}
}

View File

@ -1,484 +0,0 @@
package net.minecraft.src;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.SocketException;
import java.security.PrivateKey;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import javax.crypto.SecretKey;
public class TcpConnection implements INetworkManager {
public static AtomicInteger field_74471_a = new AtomicInteger();
public static AtomicInteger field_74469_b = new AtomicInteger();
/** The object used for synchronization on the send queue. */
private final Object sendQueueLock = new Object();
private final ILogAgent field_98215_i;
/** The socket used by this network manager. */
private Socket networkSocket;
/** The InetSocketAddress of the remote endpoint */
private final SocketAddress remoteSocketAddress;
/** The input stream connected to the socket. */
private volatile DataInputStream socketInputStream;
/** The output stream connected to the socket. */
private volatile DataOutputStream socketOutputStream;
/** Whether the network is currently operational. */
private volatile boolean isRunning = true;
/**
* Whether this network manager is currently terminating (and should ignore
* further errors).
*/
private volatile boolean isTerminating = false;
/**
* Linked list of packets that have been read and are awaiting processing.
*/
private List readPackets = Collections.synchronizedList(new ArrayList());
/** Linked list of packets awaiting sending. */
private List dataPackets = Collections.synchronizedList(new ArrayList());
/** Linked list of packets with chunk data that are awaiting sending. */
private List chunkDataPackets = Collections.synchronizedList(new ArrayList());
/** A reference to the NetHandler object. */
private NetHandler theNetHandler;
/**
* Whether this server is currently terminating. If this is a client, this is
* always false.
*/
private boolean isServerTerminating = false;
/** The thread used for writing. */
private Thread writeThread;
/** The thread used for reading. */
private Thread readThread;
/** A String indicating why the network has shutdown. */
private String terminationReason = "";
private Object[] field_74480_w;
private int field_74490_x = 0;
/**
* The length in bytes of the packets in both send queues (data and chunkData).
*/
private int sendQueueByteLength = 0;
public static int[] field_74470_c = new int[256];
public static int[] field_74467_d = new int[256];
public int field_74468_e = 0;
boolean isInputBeingDecrypted = false;
boolean isOutputEncrypted = false;
private SecretKey sharedKeyForEncryption = null;
private PrivateKey field_74463_A = null;
/**
* Delay for sending pending chunk data packets (as opposed to pending non-chunk
* data packets)
*/
private int chunkDataPacketsDelay = 50;
public TcpConnection(ILogAgent par1ILogAgent, Socket par2Socket, String par3Str, NetHandler par4NetHandler,
PrivateKey par5PrivateKey) throws IOException {
this.field_74463_A = par5PrivateKey;
this.networkSocket = par2Socket;
this.field_98215_i = par1ILogAgent;
this.remoteSocketAddress = par2Socket.getRemoteSocketAddress();
this.theNetHandler = par4NetHandler;
try {
par2Socket.setSoTimeout(30000);
par2Socket.setTrafficClass(24);
} catch (SocketException var7) {
System.err.println(var7.getMessage());
}
this.socketInputStream = new DataInputStream(par2Socket.getInputStream());
this.socketOutputStream = new DataOutputStream(new BufferedOutputStream(par2Socket.getOutputStream(), 5120));
this.readThread = new TcpReaderThread(this, par3Str + " read thread");
this.writeThread = new TcpWriterThread(this, par3Str + " write thread");
this.readThread.start();
this.writeThread.start();
}
/**
* Sets the NetHandler for this NetworkManager. Server-only.
*/
public void setNetHandler(NetHandler par1NetHandler) {
this.theNetHandler = par1NetHandler;
}
/**
* Adds the packet to the correct send queue (chunk data packets go to a
* separate queue).
*/
public void addToSendQueue(Packet par1Packet) {
if (!this.isServerTerminating) {
Object var2 = this.sendQueueLock;
synchronized (this.sendQueueLock) {
this.sendQueueByteLength += par1Packet.getPacketSize() + 1;
this.dataPackets.add(par1Packet);
}
}
}
/**
* Sends a data packet if there is one to send, or sends a chunk data packet if
* there is one and the counter is up, or does nothing.
*/
private boolean sendPacket() {
boolean var1 = false;
try {
int[] var10000;
int var10001;
Packet var2;
if (this.field_74468_e == 0 || !this.dataPackets.isEmpty() && System.currentTimeMillis()
- ((Packet) this.dataPackets.get(0)).creationTimeMillis >= (long) this.field_74468_e) {
var2 = this.func_74460_a(false);
if (var2 != null) {
Packet.writePacket(var2, this.socketOutputStream);
if (var2 instanceof Packet252SharedKey && !this.isOutputEncrypted) {
if (!this.theNetHandler.isServerHandler()) {
this.sharedKeyForEncryption = ((Packet252SharedKey) var2).getSharedKey();
}
this.encryptOuputStream();
}
var10000 = field_74467_d;
var10001 = var2.getPacketId();
var10000[var10001] += var2.getPacketSize() + 1;
var1 = true;
}
}
if (this.chunkDataPacketsDelay-- <= 0 && (this.field_74468_e == 0
|| !this.chunkDataPackets.isEmpty() && System.currentTimeMillis() - ((Packet) this.chunkDataPackets
.get(0)).creationTimeMillis >= (long) this.field_74468_e)) {
var2 = this.func_74460_a(true);
if (var2 != null) {
Packet.writePacket(var2, this.socketOutputStream);
var10000 = field_74467_d;
var10001 = var2.getPacketId();
var10000[var10001] += var2.getPacketSize() + 1;
this.chunkDataPacketsDelay = 0;
var1 = true;
}
}
return var1;
} catch (Exception var3) {
if (!this.isTerminating) {
this.onNetworkError(var3);
}
return false;
}
}
private Packet func_74460_a(boolean par1) {
Packet var2 = null;
List var3 = par1 ? this.chunkDataPackets : this.dataPackets;
Object var4 = this.sendQueueLock;
synchronized (this.sendQueueLock) {
while (!var3.isEmpty() && var2 == null) {
var2 = (Packet) var3.remove(0);
this.sendQueueByteLength -= var2.getPacketSize() + 1;
if (this.func_74454_a(var2, par1)) {
var2 = null;
}
}
return var2;
}
}
private boolean func_74454_a(Packet par1Packet, boolean par2) {
if (!par1Packet.isRealPacket()) {
return false;
} else {
List var3 = par2 ? this.chunkDataPackets : this.dataPackets;
Iterator var4 = var3.iterator();
Packet var5;
do {
if (!var4.hasNext()) {
return false;
}
var5 = (Packet) var4.next();
} while (var5.getPacketId() != par1Packet.getPacketId());
return par1Packet.containsSameEntityIDAs(var5);
}
}
/**
* Wakes reader and writer threads
*/
public void wakeThreads() {
if (this.readThread != null) {
this.readThread.interrupt();
}
if (this.writeThread != null) {
this.writeThread.interrupt();
}
}
/**
* Reads a single packet from the input stream and adds it to the read queue. If
* no packet is read, it shuts down the network.
*/
private boolean readPacket() {
boolean var1 = false;
try {
Packet var2 = Packet.readPacket(this.field_98215_i, this.socketInputStream,
this.theNetHandler.isServerHandler(), this.networkSocket);
if (var2 != null) {
if (var2 instanceof Packet252SharedKey && !this.isInputBeingDecrypted) {
if (this.theNetHandler.isServerHandler()) {
this.sharedKeyForEncryption = ((Packet252SharedKey) var2).getSharedKey(this.field_74463_A);
}
this.decryptInputStream();
}
int[] var10000 = field_74470_c;
int var10001 = var2.getPacketId();
var10000[var10001] += var2.getPacketSize() + 1;
if (!this.isServerTerminating) {
if (var2.canProcessAsync() && this.theNetHandler.canProcessPacketsAsync()) {
this.field_74490_x = 0;
var2.processPacket(this.theNetHandler);
} else {
this.readPackets.add(var2);
}
}
var1 = true;
} else {
this.networkShutdown("disconnect.endOfStream", new Object[0]);
}
return var1;
} catch (Exception var3) {
if (!this.isTerminating) {
this.onNetworkError(var3);
}
return false;
}
}
/**
* Used to report network errors and causes a network shutdown.
*/
private void onNetworkError(Exception par1Exception) {
par1Exception.printStackTrace();
this.networkShutdown("disconnect.genericReason",
new Object[] { "Internal exception: " + par1Exception.toString() });
}
/**
* Shuts down the network with the specified reason. Closes all streams and
* sockets, spawns NetworkMasterThread to stop reading and writing threads.
*/
public void networkShutdown(String par1Str, Object... par2ArrayOfObj) {
if (this.isRunning) {
this.isTerminating = true;
this.terminationReason = par1Str;
this.field_74480_w = par2ArrayOfObj;
this.isRunning = false;
(new TcpMasterThread(this)).start();
try {
this.socketInputStream.close();
} catch (Throwable var6) {
;
}
try {
this.socketOutputStream.close();
} catch (Throwable var5) {
;
}
try {
this.networkSocket.close();
} catch (Throwable var4) {
;
}
this.socketInputStream = null;
this.socketOutputStream = null;
this.networkSocket = null;
}
}
/**
* Checks timeouts and processes all pending read packets.
*/
public void processReadPackets() {
if (this.sendQueueByteLength > 2097152) {
this.networkShutdown("disconnect.overflow", new Object[0]);
}
if (this.readPackets.isEmpty()) {
if (this.field_74490_x++ == 1200) {
this.networkShutdown("disconnect.timeout", new Object[0]);
}
} else {
this.field_74490_x = 0;
}
int var1 = 1000;
while (!this.readPackets.isEmpty() && var1-- >= 0) {
Packet var2 = (Packet) this.readPackets.remove(0);
var2.processPacket(this.theNetHandler);
}
this.wakeThreads();
if (this.isTerminating && this.readPackets.isEmpty()) {
this.theNetHandler.handleErrorMessage(this.terminationReason, this.field_74480_w);
}
}
/**
* Returns the socket address of the remote side. Server-only.
*/
public SocketAddress getRemoteAddress() {
return this.remoteSocketAddress;
}
/**
* Shuts down the server. (Only actually used on the server)
*/
public void serverShutdown() {
if (!this.isServerTerminating) {
this.wakeThreads();
this.isServerTerminating = true;
this.readThread.interrupt();
(new TcpMonitorThread(this)).start();
}
}
private void decryptInputStream() throws IOException {
this.isInputBeingDecrypted = true;
InputStream var1 = this.networkSocket.getInputStream();
this.socketInputStream = new DataInputStream(
CryptManager.decryptInputStream(this.sharedKeyForEncryption, var1));
}
/**
* flushes the stream and replaces it with an encryptedOutputStream
*/
private void encryptOuputStream() throws IOException {
this.socketOutputStream.flush();
this.isOutputEncrypted = true;
BufferedOutputStream var1 = new BufferedOutputStream(
CryptManager.encryptOuputStream(this.sharedKeyForEncryption, this.networkSocket.getOutputStream()),
5120);
this.socketOutputStream = new DataOutputStream(var1);
}
/**
* Returns the number of chunk data packets waiting to be sent.
*/
public int getNumChunkDataPackets() {
return this.chunkDataPackets.size();
}
public Socket getSocket() {
return this.networkSocket;
}
/**
* Whether the network is operational.
*/
static boolean isRunning(TcpConnection par0TcpConnection) {
return par0TcpConnection.isRunning;
}
/**
* Is the server terminating? Client side aways returns false.
*/
static boolean isServerTerminating(TcpConnection par0TcpConnection) {
return par0TcpConnection.isServerTerminating;
}
/**
* Static accessor to readPacket.
*/
static boolean readNetworkPacket(TcpConnection par0TcpConnection) {
return par0TcpConnection.readPacket();
}
/**
* Static accessor to sendPacket.
*/
static boolean sendNetworkPacket(TcpConnection par0TcpConnection) {
return par0TcpConnection.sendPacket();
}
static DataOutputStream getOutputStream(TcpConnection par0TcpConnection) {
return par0TcpConnection.socketOutputStream;
}
/**
* Gets whether the Network manager is terminating.
*/
static boolean isTerminating(TcpConnection par0TcpConnection) {
return par0TcpConnection.isTerminating;
}
/**
* Sends the network manager an error
*/
static void sendError(TcpConnection par0TcpConnection, Exception par1Exception) {
par0TcpConnection.onNetworkError(par1Exception);
}
/**
* Returns the read thread.
*/
static Thread getReadThread(TcpConnection par0TcpConnection) {
return par0TcpConnection.readThread;
}
/**
* Returns the write thread.
*/
static Thread getWriteThread(TcpConnection par0TcpConnection) {
return par0TcpConnection.writeThread;
}
}

View File

@ -1,34 +0,0 @@
package net.minecraft.src;
class TcpMasterThread extends Thread {
final TcpConnection theTcpConnection;
TcpMasterThread(TcpConnection par1TcpConnection) {
this.theTcpConnection = par1TcpConnection;
}
@SuppressWarnings("deprecation")
public void run() {
try {
Thread.sleep(5000L);
if (TcpConnection.getReadThread(this.theTcpConnection).isAlive()) {
try {
TcpConnection.getReadThread(this.theTcpConnection).stop();
} catch (Throwable var3) {
;
}
}
if (TcpConnection.getWriteThread(this.theTcpConnection).isAlive()) {
try {
TcpConnection.getWriteThread(this.theTcpConnection).stop();
} catch (Throwable var2) {
;
}
}
} catch (InterruptedException var4) {
var4.printStackTrace();
}
}
}

View File

@ -1,22 +0,0 @@
package net.minecraft.src;
class TcpMonitorThread extends Thread {
final TcpConnection theTcpConnection;
TcpMonitorThread(TcpConnection par1TcpConnection) {
this.theTcpConnection = par1TcpConnection;
}
public void run() {
try {
Thread.sleep(2000L);
if (TcpConnection.isRunning(this.theTcpConnection)) {
TcpConnection.getWriteThread(this.theTcpConnection).interrupt();
this.theTcpConnection.networkShutdown("disconnect.closed", new Object[0]);
}
} catch (Exception var2) {
var2.printStackTrace();
}
}
}

View File

@ -1,31 +0,0 @@
package net.minecraft.src;
class TcpReaderThread extends Thread {
final TcpConnection theTcpConnection;
TcpReaderThread(TcpConnection par1TcpConnection, String par2Str) {
super(par2Str);
this.theTcpConnection = par1TcpConnection;
}
public void run() {
TcpConnection.field_74471_a.getAndIncrement();
try {
while (TcpConnection.isRunning(this.theTcpConnection)
&& !TcpConnection.isServerTerminating(this.theTcpConnection)) {
while (true) {
if (!TcpConnection.readNetworkPacket(this.theTcpConnection)) {
try {
sleep(2L);
} catch (InterruptedException var5) {
;
}
}
}
}
} finally {
TcpConnection.field_74471_a.getAndDecrement();
}
}
}

View File

@ -1,46 +0,0 @@
package net.minecraft.src;
import java.io.IOException;
class TcpWriterThread extends Thread {
final TcpConnection theTcpConnection;
TcpWriterThread(TcpConnection par1TcpConnection, String par2Str) {
super(par2Str);
this.theTcpConnection = par1TcpConnection;
}
public void run() {
TcpConnection.field_74469_b.getAndIncrement();
try {
while (TcpConnection.isRunning(this.theTcpConnection)) {
boolean var1;
for (var1 = false; TcpConnection.sendNetworkPacket(this.theTcpConnection); var1 = true) {
;
}
try {
if (var1 && TcpConnection.getOutputStream(this.theTcpConnection) != null) {
TcpConnection.getOutputStream(this.theTcpConnection).flush();
}
} catch (IOException var8) {
if (!TcpConnection.isTerminating(this.theTcpConnection)) {
TcpConnection.sendError(this.theTcpConnection, var8);
}
var8.printStackTrace();
}
try {
sleep(2L);
} catch (InterruptedException var7) {
;
}
}
} finally {
TcpConnection.field_74469_b.getAndDecrement();
}
}
}

View File

@ -1,10 +1,11 @@
package net.lax1dude.eaglercraft; package net.lax1dude.eaglercraft;
import java.util.Arrays;
import java.util.List; import java.util.List;
public class ConfigConstants { public class ConfigConstants {
public static final String version = "25w05a"; public static final String version = "25w09a";
public static final String mainMenuString = "Eaglercraft " + version; public static final String mainMenuString = "Eaglercraft " + version;
public static final String forkMe = null; public static final String forkMe = null;
@ -17,7 +18,7 @@ public class ConfigConstants {
public static String mainMenuItemLine2 = null; public static String mainMenuItemLine2 = null;
public static String mainMenuItemLink = null; public static String mainMenuItemLink = null;
public static List<String> splashTexts = null; public static List<String> splashTexts = Arrays.asList("Darviglet!", "eaglerenophile!", "You Eagler!", "Yeeeeeee!", "yeee", "EEEEEEEEE!", "You Darvig!", "You Vigg!", ":>", "|>", "You Yumpster!", "No longer on Gitpod", "MiG Mad Marine", "Wild Weasel", "YGBSM", "Union Aerospace Corporation");
public static List<RelayEntry> relays = null; public static List<RelayEntry> relays = null;

View File

@ -10,7 +10,6 @@ import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import net.minecraft.src.AnvilSaveConverter;
import net.minecraft.src.AxisAlignedBB; import net.minecraft.src.AxisAlignedBB;
import net.minecraft.src.CallableIsServerModded; import net.minecraft.src.CallableIsServerModded;
import net.minecraft.src.CallableServerMemoryStats; import net.minecraft.src.CallableServerMemoryStats;
@ -53,7 +52,7 @@ public abstract class MinecraftServer implements ICommandSender, Runnable, IPlay
{ {
/** Instance of Minecraft Server. */ /** Instance of Minecraft Server. */
private static MinecraftServer mcServer; private static MinecraftServer mcServer;
private final ISaveFormat anvilConverterForAnvilFile; //private final ISaveFormat anvilConverterForAnvilFile;
/** The PlayerUsageSnooper instance. */ /** The PlayerUsageSnooper instance. */
private final PlayerUsageSnooper usageSnooper = new PlayerUsageSnooper("server", this, getSystemTimeMillis()); private final PlayerUsageSnooper usageSnooper = new PlayerUsageSnooper("server", this, getSystemTimeMillis());
@ -166,7 +165,7 @@ public abstract class MinecraftServer implements ICommandSender, Runnable, IPlay
mcServer = this; mcServer = this;
this.anvilFile = par1File; this.anvilFile = par1File;
this.commandManager = new ServerCommandManager(); this.commandManager = new ServerCommandManager();
this.anvilConverterForAnvilFile = new AnvilSaveConverter(par1File); //this.anvilConverterForAnvilFile = new AnvilSaveConverter(par1File);
this.registerDispenseBehaviors(); this.registerDispenseBehaviors();
} }
@ -212,7 +211,7 @@ public abstract class MinecraftServer implements ICommandSender, Runnable, IPlay
this.setUserMessage("menu.loadingLevel"); this.setUserMessage("menu.loadingLevel");
this.worldServers = new WorldServer[3]; this.worldServers = new WorldServer[3];
this.timeOfLastDimensionTick = new long[this.worldServers.length][100]; this.timeOfLastDimensionTick = new long[this.worldServers.length][100];
ISaveHandler var7 = this.anvilConverterForAnvilFile.getSaveLoader(par1Str, true); ISaveHandler var7 = null;
WorldInfo var9 = var7.loadWorldInfo(); WorldInfo var9 = var7.loadWorldInfo();
WorldSettings var8; WorldSettings var8;
@ -1044,7 +1043,7 @@ public abstract class MinecraftServer implements ICommandSender, Runnable, IPlay
public ISaveFormat getActiveAnvilConverter() public ISaveFormat getActiveAnvilConverter()
{ {
return this.anvilConverterForAnvilFile; return null;
} }
/** /**

View File

@ -1,425 +0,0 @@
package net.minecraft.src;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
public class AnvilChunkLoader implements IChunkLoader, IThreadedFileIO
{
private List chunksToRemove = new ArrayList();
private Set pendingAnvilChunksCoordinates = new HashSet();
private Object syncLockObject = new Object();
/** Save directory for chunks using the Anvil format */
private final File chunkSaveLocation;
public AnvilChunkLoader(File par1File)
{
this.chunkSaveLocation = par1File;
}
/**
* Loads the specified(XZ) chunk into the specified world.
*/
public Chunk loadChunk(World par1World, int par2, int par3) throws IOException
{
NBTTagCompound var4 = null;
ChunkCoordIntPair var5 = new ChunkCoordIntPair(par2, par3);
Object var6 = this.syncLockObject;
synchronized (this.syncLockObject)
{
if (this.pendingAnvilChunksCoordinates.contains(var5))
{
for (int var7 = 0; var7 < this.chunksToRemove.size(); ++var7)
{
if (((AnvilChunkLoaderPending)this.chunksToRemove.get(var7)).chunkCoordinate.equals(var5))
{
var4 = ((AnvilChunkLoaderPending)this.chunksToRemove.get(var7)).nbtTags;
break;
}
}
}
}
if (var4 == null)
{
DataInputStream var10 = RegionFileCache.getChunkInputStream(this.chunkSaveLocation, par2, par3);
if (var10 == null)
{
return null;
}
var4 = CompressedStreamTools.read(var10);
}
return this.checkedReadChunkFromNBT(par1World, par2, par3, var4);
}
/**
* Wraps readChunkFromNBT. Checks the coordinates and several NBT tags.
*/
protected Chunk checkedReadChunkFromNBT(World par1World, int par2, int par3, NBTTagCompound par4NBTTagCompound)
{
if (!par4NBTTagCompound.hasKey("Level"))
{
System.err.println("Chunk file at " + par2 + "," + par3 + " is missing level data, skipping");
return null;
}
else if (!par4NBTTagCompound.getCompoundTag("Level").hasKey("Sections"))
{
System.err.println("Chunk file at " + par2 + "," + par3 + " is missing block data, skipping");
return null;
}
else
{
Chunk var5 = this.readChunkFromNBT(par1World, par4NBTTagCompound.getCompoundTag("Level"));
if (!var5.isAtLocation(par2, par3))
{
System.err.println("Chunk file at " + par2 + "," + par3 + " is in the wrong location; relocating. (Expected " + par2 + ", " + par3 + ", got " + var5.xPosition + ", " + var5.zPosition + ")");
par4NBTTagCompound.setInteger("xPos", par2);
par4NBTTagCompound.setInteger("zPos", par3);
var5 = this.readChunkFromNBT(par1World, par4NBTTagCompound.getCompoundTag("Level"));
}
return var5;
}
}
public void saveChunk(World par1World, Chunk par2Chunk) throws MinecraftException, IOException
{
par1World.checkSessionLock();
try
{
NBTTagCompound var3 = new NBTTagCompound();
NBTTagCompound var4 = new NBTTagCompound();
var3.setTag("Level", var4);
this.writeChunkToNBT(par2Chunk, par1World, var4);
this.addChunkToPending(par2Chunk.getChunkCoordIntPair(), var3);
}
catch (Exception var5)
{
var5.printStackTrace();
}
}
protected void addChunkToPending(ChunkCoordIntPair par1ChunkCoordIntPair, NBTTagCompound par2NBTTagCompound)
{
Object var3 = this.syncLockObject;
synchronized (this.syncLockObject)
{
if (this.pendingAnvilChunksCoordinates.contains(par1ChunkCoordIntPair))
{
for (int var4 = 0; var4 < this.chunksToRemove.size(); ++var4)
{
if (((AnvilChunkLoaderPending)this.chunksToRemove.get(var4)).chunkCoordinate.equals(par1ChunkCoordIntPair))
{
this.chunksToRemove.set(var4, new AnvilChunkLoaderPending(par1ChunkCoordIntPair, par2NBTTagCompound));
return;
}
}
}
this.chunksToRemove.add(new AnvilChunkLoaderPending(par1ChunkCoordIntPair, par2NBTTagCompound));
this.pendingAnvilChunksCoordinates.add(par1ChunkCoordIntPair);
ThreadedFileIOBase.threadedIOInstance.queueIO(this);
}
}
/**
* Returns a boolean stating if the write was unsuccessful.
*/
public boolean writeNextIO()
{
AnvilChunkLoaderPending var1 = null;
Object var2 = this.syncLockObject;
synchronized (this.syncLockObject)
{
if (this.chunksToRemove.isEmpty())
{
return false;
}
var1 = (AnvilChunkLoaderPending)this.chunksToRemove.remove(0);
this.pendingAnvilChunksCoordinates.remove(var1.chunkCoordinate);
}
if (var1 != null)
{
try
{
this.writeChunkNBTTags(var1);
}
catch (Exception var4)
{
var4.printStackTrace();
}
}
return true;
}
private void writeChunkNBTTags(AnvilChunkLoaderPending par1AnvilChunkLoaderPending) throws IOException
{
DataOutputStream var2 = RegionFileCache.getChunkOutputStream(this.chunkSaveLocation, par1AnvilChunkLoaderPending.chunkCoordinate.chunkXPos, par1AnvilChunkLoaderPending.chunkCoordinate.chunkZPos);
CompressedStreamTools.write(par1AnvilChunkLoaderPending.nbtTags, var2);
var2.close();
}
/**
* Save extra data associated with this Chunk not normally saved during autosave, only during chunk unload.
* Currently unused.
*/
public void saveExtraChunkData(World par1World, Chunk par2Chunk) {}
/**
* Called every World.tick()
*/
public void chunkTick() {}
/**
* Save extra data not associated with any Chunk. Not saved during autosave, only during world unload. Currently
* unused.
*/
public void saveExtraData()
{
while (this.writeNextIO())
{
;
}
}
/**
* Writes the Chunk passed as an argument to the NBTTagCompound also passed, using the World argument to retrieve
* the Chunk's last update time.
*/
private void writeChunkToNBT(Chunk par1Chunk, World par2World, NBTTagCompound par3NBTTagCompound)
{
par3NBTTagCompound.setInteger("xPos", par1Chunk.xPosition);
par3NBTTagCompound.setInteger("zPos", par1Chunk.zPosition);
par3NBTTagCompound.setLong("LastUpdate", par2World.getTotalWorldTime());
par3NBTTagCompound.setIntArray("HeightMap", par1Chunk.heightMap);
par3NBTTagCompound.setBoolean("TerrainPopulated", par1Chunk.isTerrainPopulated);
par3NBTTagCompound.setLong("InhabitedTime", par1Chunk.inhabitedTime);
ExtendedBlockStorage[] var4 = par1Chunk.getBlockStorageArray();
NBTTagList var5 = new NBTTagList("Sections");
boolean var6 = !par2World.provider.hasNoSky;
ExtendedBlockStorage[] var7 = var4;
int var8 = var4.length;
NBTTagCompound var11;
for (int var9 = 0; var9 < var8; ++var9)
{
ExtendedBlockStorage var10 = var7[var9];
if (var10 != null)
{
var11 = new NBTTagCompound();
var11.setByte("Y", (byte)(var10.getYLocation() >> 4 & 255));
var11.setByteArray("Blocks", var10.getBlockLSBArray());
if (var10.getBlockMSBArray() != null)
{
var11.setByteArray("Add", var10.getBlockMSBArray().data);
}
var11.setByteArray("Data", var10.getMetadataArray().data);
var11.setByteArray("BlockLight", var10.getBlocklightArray().data);
if (var6)
{
var11.setByteArray("SkyLight", var10.getSkylightArray().data);
}
else
{
var11.setByteArray("SkyLight", new byte[var10.getBlocklightArray().data.length]);
}
var5.appendTag(var11);
}
}
par3NBTTagCompound.setTag("Sections", var5);
par3NBTTagCompound.setByteArray("Biomes", par1Chunk.getBiomeArray());
par1Chunk.hasEntities = false;
NBTTagList var16 = new NBTTagList();
Iterator var18;
for (var8 = 0; var8 < par1Chunk.entityLists.length; ++var8)
{
var18 = par1Chunk.entityLists[var8].iterator();
while (var18.hasNext())
{
Entity var20 = (Entity)var18.next();
var11 = new NBTTagCompound();
if (var20.writeToNBTOptional(var11))
{
par1Chunk.hasEntities = true;
var16.appendTag(var11);
}
}
}
par3NBTTagCompound.setTag("Entities", var16);
NBTTagList var17 = new NBTTagList();
var18 = par1Chunk.chunkTileEntityMap.values().iterator();
while (var18.hasNext())
{
TileEntity var21 = (TileEntity)var18.next();
var11 = new NBTTagCompound();
var21.writeToNBT(var11);
var17.appendTag(var11);
}
par3NBTTagCompound.setTag("TileEntities", var17);
List var19 = par2World.getPendingBlockUpdates(par1Chunk, false);
if (var19 != null)
{
long var22 = par2World.getTotalWorldTime();
NBTTagList var12 = new NBTTagList();
Iterator var13 = var19.iterator();
while (var13.hasNext())
{
NextTickListEntry var14 = (NextTickListEntry)var13.next();
NBTTagCompound var15 = new NBTTagCompound();
var15.setInteger("i", var14.blockID);
var15.setInteger("x", var14.xCoord);
var15.setInteger("y", var14.yCoord);
var15.setInteger("z", var14.zCoord);
var15.setInteger("t", (int)(var14.scheduledTime - var22));
var15.setInteger("p", var14.priority);
var12.appendTag(var15);
}
par3NBTTagCompound.setTag("TileTicks", var12);
}
}
/**
* Reads the data stored in the passed NBTTagCompound and creates a Chunk with that data in the passed World.
* Returns the created Chunk.
*/
private Chunk readChunkFromNBT(World par1World, NBTTagCompound par2NBTTagCompound)
{
int var3 = par2NBTTagCompound.getInteger("xPos");
int var4 = par2NBTTagCompound.getInteger("zPos");
Chunk var5 = new Chunk(par1World, var3, var4);
var5.heightMap = par2NBTTagCompound.getIntArray("HeightMap");
var5.isTerrainPopulated = par2NBTTagCompound.getBoolean("TerrainPopulated");
var5.inhabitedTime = par2NBTTagCompound.getLong("InhabitedTime");
NBTTagList var6 = par2NBTTagCompound.getTagList("Sections");
byte var7 = 16;
ExtendedBlockStorage[] var8 = new ExtendedBlockStorage[var7];
boolean var9 = !par1World.provider.hasNoSky;
for (int var10 = 0; var10 < var6.tagCount(); ++var10)
{
NBTTagCompound var11 = (NBTTagCompound)var6.tagAt(var10);
byte var12 = var11.getByte("Y");
ExtendedBlockStorage var13 = new ExtendedBlockStorage(var12 << 4, var9);
var13.setBlockLSBArray(var11.getByteArray("Blocks"));
if (var11.hasKey("Add"))
{
var13.setBlockMSBArray(new NibbleArray(var11.getByteArray("Add"), 4));
}
var13.setBlockMetadataArray(new NibbleArray(var11.getByteArray("Data"), 4));
var13.setBlocklightArray(new NibbleArray(var11.getByteArray("BlockLight"), 4));
if (var9)
{
var13.setSkylightArray(new NibbleArray(var11.getByteArray("SkyLight"), 4));
}
var13.removeInvalidBlocks();
var8[var12] = var13;
}
var5.setStorageArrays(var8);
if (par2NBTTagCompound.hasKey("Biomes"))
{
var5.setBiomeArray(par2NBTTagCompound.getByteArray("Biomes"));
}
NBTTagList var17 = par2NBTTagCompound.getTagList("Entities");
if (var17 != null)
{
for (int var18 = 0; var18 < var17.tagCount(); ++var18)
{
NBTTagCompound var20 = (NBTTagCompound)var17.tagAt(var18);
Entity var22 = EntityList.createEntityFromNBT(var20, par1World);
var5.hasEntities = true;
if (var22 != null)
{
var5.addEntity(var22);
Entity var14 = var22;
for (NBTTagCompound var15 = var20; var15.hasKey("Riding"); var15 = var15.getCompoundTag("Riding"))
{
Entity var16 = EntityList.createEntityFromNBT(var15.getCompoundTag("Riding"), par1World);
if (var16 != null)
{
var5.addEntity(var16);
var14.mountEntity(var16);
}
var14 = var16;
}
}
}
}
NBTTagList var19 = par2NBTTagCompound.getTagList("TileEntities");
if (var19 != null)
{
for (int var21 = 0; var21 < var19.tagCount(); ++var21)
{
NBTTagCompound var24 = (NBTTagCompound)var19.tagAt(var21);
TileEntity var26 = TileEntity.createAndLoadEntity(var24);
if (var26 != null)
{
var5.addTileEntity(var26);
}
}
}
if (par2NBTTagCompound.hasKey("TileTicks"))
{
NBTTagList var23 = par2NBTTagCompound.getTagList("TileTicks");
if (var23 != null)
{
for (int var25 = 0; var25 < var23.tagCount(); ++var25)
{
NBTTagCompound var27 = (NBTTagCompound)var23.tagAt(var25);
par1World.scheduleBlockUpdateFromLoad(var27.getInteger("x"), var27.getInteger("y"), var27.getInteger("z"), var27.getInteger("i"), var27.getInteger("t"), var27.getInteger("p"));
}
}
}
return var5;
}
}

View File

@ -1,13 +0,0 @@
package net.minecraft.src;
class AnvilChunkLoaderPending
{
public final ChunkCoordIntPair chunkCoordinate;
public final NBTTagCompound nbtTags;
public AnvilChunkLoaderPending(ChunkCoordIntPair par1ChunkCoordIntPair, NBTTagCompound par2NBTTagCompound)
{
this.chunkCoordinate = par1ChunkCoordIntPair;
this.nbtTags = par2NBTTagCompound;
}
}

View File

@ -1,23 +0,0 @@
package net.minecraft.src;
public class AnvilConverterData
{
public long lastUpdated;
public boolean terrainPopulated;
public byte[] heightmap;
public NibbleArrayReader blockLight;
public NibbleArrayReader skyLight;
public NibbleArrayReader data;
public byte[] blocks;
public NBTTagList entities;
public NBTTagList tileEntities;
public NBTTagList tileTicks;
public final int x;
public final int z;
public AnvilConverterData(int par1, int par2)
{
this.x = par1;
this.z = par2;
}
}

View File

@ -1,9 +0,0 @@
package net.minecraft.src;
public class AnvilConverterException extends Exception
{
public AnvilConverterException(String par1Str)
{
super(par1Str);
}
}

View File

@ -1,263 +0,0 @@
package net.minecraft.src;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import net.minecraft.server.MinecraftServer;
public class AnvilSaveConverter extends SaveFormatOld
{
public AnvilSaveConverter(File par1File)
{
super(par1File);
}
public List getSaveList() throws AnvilConverterException
{
if (this.savesDirectory != null && this.savesDirectory.exists() && this.savesDirectory.isDirectory())
{
ArrayList var1 = new ArrayList();
File[] var2 = this.savesDirectory.listFiles();
File[] var3 = var2;
int var4 = var2.length;
for (int var5 = 0; var5 < var4; ++var5)
{
File var6 = var3[var5];
if (var6.isDirectory())
{
String var7 = var6.getName();
WorldInfo var8 = this.getWorldInfo(var7);
if (var8 != null && (var8.getSaveVersion() == 19132 || var8.getSaveVersion() == 19133))
{
boolean var9 = var8.getSaveVersion() != this.getSaveVersion();
String var10 = var8.getWorldName();
if (var10 == null || MathHelper.stringNullOrLengthZero(var10))
{
var10 = var7;
}
long var11 = 0L;
var1.add(new SaveFormatComparator(var7, var10, var8.getLastTimePlayed(), var11, var8.getGameType(), var9, var8.isHardcoreModeEnabled(), var8.areCommandsAllowed()));
}
}
}
return var1;
}
else
{
throw new AnvilConverterException("Unable to read or access folder where game worlds are saved!");
}
}
protected int getSaveVersion()
{
return 19133;
}
public void flushCache()
{
RegionFileCache.clearRegionFileReferences();
}
/**
* Returns back a loader for the specified save directory
*/
public ISaveHandler getSaveLoader(String par1Str, boolean par2)
{
return new AnvilSaveHandler(this.savesDirectory, par1Str, par2);
}
/**
* Checks if the save directory uses the old map format
*/
public boolean isOldMapFormat(String par1Str)
{
WorldInfo var2 = this.getWorldInfo(par1Str);
return var2 != null && var2.getSaveVersion() != this.getSaveVersion();
}
/**
* Converts the specified map to the new map format. Args: worldName, loadingScreen
*/
public boolean convertMapFormat(String par1Str, IProgressUpdate par2IProgressUpdate)
{
par2IProgressUpdate.setLoadingProgress(0);
ArrayList var3 = new ArrayList();
ArrayList var4 = new ArrayList();
ArrayList var5 = new ArrayList();
File var6 = new File(this.savesDirectory, par1Str);
File var7 = new File(var6, "DIM-1");
File var8 = new File(var6, "DIM1");
MinecraftServer.getServer().getLogAgent().logInfo("Scanning folders...");
this.addRegionFilesToCollection(var6, var3);
if (var7.exists())
{
this.addRegionFilesToCollection(var7, var4);
}
if (var8.exists())
{
this.addRegionFilesToCollection(var8, var5);
}
int var9 = var3.size() + var4.size() + var5.size();
MinecraftServer.getServer().getLogAgent().logInfo("Total conversion count is " + var9);
WorldInfo var10 = this.getWorldInfo(par1Str);
Object var11 = null;
if (var10.getTerrainType() == WorldType.FLAT)
{
var11 = new WorldChunkManagerHell(BiomeGenBase.plains, 0.5F, 0.5F);
}
else
{
var11 = new WorldChunkManager(var10.getSeed(), var10.getTerrainType());
}
this.convertFile(new File(var6, "region"), var3, (WorldChunkManager)var11, 0, var9, par2IProgressUpdate);
this.convertFile(new File(var7, "region"), var4, new WorldChunkManagerHell(BiomeGenBase.hell, 1.0F, 0.0F), var3.size(), var9, par2IProgressUpdate);
this.convertFile(new File(var8, "region"), var5, new WorldChunkManagerHell(BiomeGenBase.sky, 0.5F, 0.0F), var3.size() + var4.size(), var9, par2IProgressUpdate);
var10.setSaveVersion(19133);
if (var10.getTerrainType() == WorldType.DEFAULT_1_1)
{
var10.setTerrainType(WorldType.DEFAULT);
}
this.createFile(par1Str);
ISaveHandler var12 = this.getSaveLoader(par1Str, false);
var12.saveWorldInfo(var10);
return true;
}
/**
* par: filename for the level.dat_mcr backup
*/
private void createFile(String par1Str)
{
File var2 = new File(this.savesDirectory, par1Str);
if (!var2.exists())
{
System.out.println("Warning: Unable to create level.dat_mcr backup");
}
else
{
File var3 = new File(var2, "level.dat");
if (!var3.exists())
{
System.out.println("Warning: Unable to create level.dat_mcr backup");
}
else
{
File var4 = new File(var2, "level.dat_mcr");
if (!var3.renameTo(var4))
{
System.out.println("Warning: Unable to create level.dat_mcr backup");
}
}
}
}
private void convertFile(File par1File, Iterable par2Iterable, WorldChunkManager par3WorldChunkManager, int par4, int par5, IProgressUpdate par6IProgressUpdate)
{
Iterator var7 = par2Iterable.iterator();
while (var7.hasNext())
{
File var8 = (File)var7.next();
this.convertChunks(par1File, var8, par3WorldChunkManager, par4, par5, par6IProgressUpdate);
++par4;
int var9 = (int)Math.round(100.0D * (double)par4 / (double)par5);
par6IProgressUpdate.setLoadingProgress(var9);
}
}
/**
* copies a 32x32 chunk set from par2File to par1File, via AnvilConverterData
*/
private void convertChunks(File par1File, File par2File, WorldChunkManager par3WorldChunkManager, int par4, int par5, IProgressUpdate par6IProgressUpdate)
{
try
{
String var7 = par2File.getName();
RegionFile var8 = new RegionFile(par2File);
RegionFile var9 = new RegionFile(new File(par1File, var7.substring(0, var7.length() - ".mcr".length()) + ".mca"));
for (int var10 = 0; var10 < 32; ++var10)
{
int var11;
for (var11 = 0; var11 < 32; ++var11)
{
if (var8.isChunkSaved(var10, var11) && !var9.isChunkSaved(var10, var11))
{
DataInputStream var12 = var8.getChunkDataInputStream(var10, var11);
if (var12 == null)
{
MinecraftServer.getServer().getLogAgent().logWarning("Failed to fetch input stream");
}
else
{
NBTTagCompound var13 = CompressedStreamTools.read(var12);
var12.close();
NBTTagCompound var14 = var13.getCompoundTag("Level");
AnvilConverterData var15 = ChunkLoader.load(var14);
NBTTagCompound var16 = new NBTTagCompound();
NBTTagCompound var17 = new NBTTagCompound();
var16.setTag("Level", var17);
ChunkLoader.convertToAnvilFormat(var15, var17, par3WorldChunkManager);
DataOutputStream var18 = var9.getChunkDataOutputStream(var10, var11);
CompressedStreamTools.write(var16, var18);
var18.close();
}
}
}
var11 = (int)Math.round(100.0D * (double)(par4 * 1024) / (double)(par5 * 1024));
int var20 = (int)Math.round(100.0D * (double)((var10 + 1) * 32 + par4 * 1024) / (double)(par5 * 1024));
if (var20 > var11)
{
par6IProgressUpdate.setLoadingProgress(var20);
}
}
var8.close();
var9.close();
}
catch (IOException var19)
{
var19.printStackTrace();
}
}
/**
* filters the files in the par1 directory, and adds them to the par2 collections
*/
private void addRegionFilesToCollection(File par1File, Collection par2Collection)
{
File var3 = new File(par1File, "region");
File[] var4 = var3.listFiles(new AnvilSaveConverterFileFilter(this));
if (var4 != null)
{
Collections.addAll(par2Collection, var4);
}
}
}

View File

@ -1,19 +0,0 @@
package net.minecraft.src;
import java.io.File;
import java.io.FilenameFilter;
class AnvilSaveConverterFileFilter implements FilenameFilter
{
final AnvilSaveConverter parent;
AnvilSaveConverterFileFilter(AnvilSaveConverter par1AnvilSaveConverter)
{
this.parent = par1AnvilSaveConverter;
}
public boolean accept(File par1File, String par2Str)
{
return par2Str.endsWith(".mcr");
}
}

View File

@ -1,63 +0,0 @@
package net.minecraft.src;
import java.io.File;
public class AnvilSaveHandler extends SaveHandler
{
public AnvilSaveHandler(File par1File, String par2Str, boolean par3)
{
super(par1File, par2Str, par3);
}
/**
* Returns the chunk loader with the provided world provider
*/
public IChunkLoader getChunkLoader(WorldProvider par1WorldProvider)
{
File var2 = this.getWorldDirectory();
File var3;
if (par1WorldProvider instanceof WorldProviderHell)
{
var3 = new File(var2, "DIM-1");
var3.mkdirs();
return new AnvilChunkLoader(var3);
}
else if (par1WorldProvider instanceof WorldProviderEnd)
{
var3 = new File(var2, "DIM1");
var3.mkdirs();
return new AnvilChunkLoader(var3);
}
else
{
return new AnvilChunkLoader(var2);
}
}
/**
* Saves the given World Info with the given NBTTagCompound as the Player.
*/
public void saveWorldInfoWithPlayer(WorldInfo par1WorldInfo, NBTTagCompound par2NBTTagCompound)
{
par1WorldInfo.setSaveVersion(19133);
super.saveWorldInfoWithPlayer(par1WorldInfo, par2NBTTagCompound);
}
/**
* Called to flush all changes to disk, waiting for them to complete.
*/
public void flush()
{
try
{
ThreadedFileIOBase.threadedIOInstance.waitForFinish();
}
catch (InterruptedException var2)
{
var2.printStackTrace();
}
RegionFileCache.clearRegionFileReferences();
}
}

View File

@ -2,135 +2,5 @@ package net.minecraft.src;
public class ChunkLoader public class ChunkLoader
{ {
public static AnvilConverterData load(NBTTagCompound par0NBTTagCompound)
{
int var1 = par0NBTTagCompound.getInteger("xPos");
int var2 = par0NBTTagCompound.getInteger("zPos");
AnvilConverterData var3 = new AnvilConverterData(var1, var2);
var3.blocks = par0NBTTagCompound.getByteArray("Blocks");
var3.data = new NibbleArrayReader(par0NBTTagCompound.getByteArray("Data"), 7);
var3.skyLight = new NibbleArrayReader(par0NBTTagCompound.getByteArray("SkyLight"), 7);
var3.blockLight = new NibbleArrayReader(par0NBTTagCompound.getByteArray("BlockLight"), 7);
var3.heightmap = par0NBTTagCompound.getByteArray("HeightMap");
var3.terrainPopulated = par0NBTTagCompound.getBoolean("TerrainPopulated");
var3.entities = par0NBTTagCompound.getTagList("Entities");
var3.tileEntities = par0NBTTagCompound.getTagList("TileEntities");
var3.tileTicks = par0NBTTagCompound.getTagList("TileTicks");
try
{
var3.lastUpdated = par0NBTTagCompound.getLong("LastUpdate");
}
catch (ClassCastException var5)
{
var3.lastUpdated = (long)par0NBTTagCompound.getInteger("LastUpdate");
}
return var3;
}
public static void convertToAnvilFormat(AnvilConverterData par0AnvilConverterData, NBTTagCompound par1NBTTagCompound, WorldChunkManager par2WorldChunkManager)
{
par1NBTTagCompound.setInteger("xPos", par0AnvilConverterData.x);
par1NBTTagCompound.setInteger("zPos", par0AnvilConverterData.z);
par1NBTTagCompound.setLong("LastUpdate", par0AnvilConverterData.lastUpdated);
int[] var3 = new int[par0AnvilConverterData.heightmap.length];
for (int var4 = 0; var4 < par0AnvilConverterData.heightmap.length; ++var4)
{
var3[var4] = par0AnvilConverterData.heightmap[var4];
}
par1NBTTagCompound.setIntArray("HeightMap", var3);
par1NBTTagCompound.setBoolean("TerrainPopulated", par0AnvilConverterData.terrainPopulated);
NBTTagList var16 = new NBTTagList("Sections");
int var7;
for (int var5 = 0; var5 < 8; ++var5)
{
boolean var6 = true;
for (var7 = 0; var7 < 16 && var6; ++var7)
{
int var8 = 0;
while (var8 < 16 && var6)
{
int var9 = 0;
while (true)
{
if (var9 < 16)
{
int var10 = var7 << 11 | var9 << 7 | var8 + (var5 << 4);
byte var11 = par0AnvilConverterData.blocks[var10];
if (var11 == 0)
{
++var9;
continue;
}
var6 = false;
}
++var8;
break;
}
}
}
if (!var6)
{
byte[] var19 = new byte[4096];
NibbleArray var20 = new NibbleArray(var19.length, 4);
NibbleArray var21 = new NibbleArray(var19.length, 4);
NibbleArray var22 = new NibbleArray(var19.length, 4);
for (int var23 = 0; var23 < 16; ++var23)
{
for (int var12 = 0; var12 < 16; ++var12)
{
for (int var13 = 0; var13 < 16; ++var13)
{
int var14 = var23 << 11 | var13 << 7 | var12 + (var5 << 4);
byte var15 = par0AnvilConverterData.blocks[var14];
var19[var12 << 8 | var13 << 4 | var23] = (byte)(var15 & 255);
var20.set(var23, var12, var13, par0AnvilConverterData.data.get(var23, var12 + (var5 << 4), var13));
var21.set(var23, var12, var13, par0AnvilConverterData.skyLight.get(var23, var12 + (var5 << 4), var13));
var22.set(var23, var12, var13, par0AnvilConverterData.blockLight.get(var23, var12 + (var5 << 4), var13));
}
}
}
NBTTagCompound var24 = new NBTTagCompound();
var24.setByte("Y", (byte)(var5 & 255));
var24.setByteArray("Blocks", var19);
var24.setByteArray("Data", var20.data);
var24.setByteArray("SkyLight", var21.data);
var24.setByteArray("BlockLight", var22.data);
var16.appendTag(var24);
}
}
par1NBTTagCompound.setTag("Sections", var16);
byte[] var17 = new byte[256];
for (int var18 = 0; var18 < 16; ++var18)
{
for (var7 = 0; var7 < 16; ++var7)
{
var17[var7 << 4 | var18] = (byte)(par2WorldChunkManager.getBiomeGenAt(par0AnvilConverterData.x << 4 | var18, par0AnvilConverterData.z << 4 | var7).biomeID & 255);
}
}
par1NBTTagCompound.setByteArray("Biomes", var17);
par1NBTTagCompound.setTag("Entities", par0AnvilConverterData.entities);
par1NBTTagCompound.setTag("TileEntities", par0AnvilConverterData.tileEntities);
if (par0AnvilConverterData.tileTicks != null)
{
par1NBTTagCompound.setTag("TileTicks", par0AnvilConverterData.tileTicks);
}
}
} }

View File

@ -66,7 +66,7 @@ public class GuiSelectWorld extends GuiScreen
{ {
this.loadSaves(); this.loadSaves();
} }
catch (AnvilConverterException var2) catch (Exception var2)
{ {
var2.printStackTrace(); var2.printStackTrace();
this.mc.displayGuiScreen(new GuiErrorScreen("Unable to load words", var2.getMessage())); this.mc.displayGuiScreen(new GuiErrorScreen("Unable to load words", var2.getMessage()));
@ -86,7 +86,7 @@ public class GuiSelectWorld extends GuiScreen
/** /**
* loads the saves * loads the saves
*/ */
private void loadSaves() throws AnvilConverterException private void loadSaves() throws Exception
{ {
ISaveFormat var1 = this.mc.getSaveLoader(); ISaveFormat var1 = this.mc.getSaveLoader();
this.saveList = var1.getSaveList(); this.saveList = var1.getSaveList();
@ -232,7 +232,7 @@ public class GuiSelectWorld extends GuiScreen
{ {
this.loadSaves(); this.loadSaves();
} }
catch (AnvilConverterException var5) catch (Exception var5)
{ {
var5.printStackTrace(); var5.printStackTrace();
} }

View File

@ -9,7 +9,7 @@ public interface ISaveFormat
*/ */
ISaveHandler getSaveLoader(String var1, boolean var2); ISaveHandler getSaveLoader(String var1, boolean var2);
List getSaveList() throws AnvilConverterException; List getSaveList() throws Exception;
void flushCache(); void flushCache();

View File

@ -39,11 +39,11 @@ public abstract class Render
par1TextureLocation.bindTexture(); par1TextureLocation.bindTexture();
} }
private static final TextureLocation terrain = new TextureLocation("/terrain.png");
/** /**
* Renders fire on top of the entity. Args: entity, x, y, z, partialTickTime * Renders fire on top of the entity. Args: entity, x, y, z, partialTickTime
*/ */
private void renderEntityOnFire(Entity par1Entity, double par2, double par4, double par6, float par8) private void renderEntityOnFire(Entity par1Entity, double par2, double par4, double par6, float par8) {
{
EaglerAdapter.glDisable(EaglerAdapter.GL_LIGHTING); EaglerAdapter.glDisable(EaglerAdapter.GL_LIGHTING);
Icon var9 = Block.fire.getFireIcon(0); Icon var9 = Block.fire.getFireIcon(0);
Icon var10 = Block.fire.getFireIcon(1); Icon var10 = Block.fire.getFireIcon(1);
@ -51,6 +51,9 @@ public abstract class Render
EaglerAdapter.glTranslatef((float) par2, (float) par4, (float) par6); EaglerAdapter.glTranslatef((float) par2, (float) par4, (float) par6);
float var11 = par1Entity.width * 1.4F; float var11 = par1Entity.width * 1.4F;
EaglerAdapter.glScalef(var11, var11, var11); EaglerAdapter.glScalef(var11, var11, var11);
terrain.bindTexture();
EaglerAdapter.glTexParameteri(EaglerAdapter.GL_TEXTURE_2D, EaglerAdapter.GL_TEXTURE_MIN_FILTER, EaglerAdapter.GL_NEAREST);
EaglerAdapter.glTexParameteri(EaglerAdapter.GL_TEXTURE_2D, EaglerAdapter.GL_TEXTURE_MAG_FILTER, EaglerAdapter.GL_NEAREST);
Tessellator var12 = Tessellator.instance; Tessellator var12 = Tessellator.instance;
float var13 = 0.5F; float var13 = 0.5F;
float var14 = 0.0F; float var14 = 0.0F;
@ -63,17 +66,21 @@ public abstract class Render
int var18 = 0; int var18 = 0;
var12.startDrawingQuads(); var12.startDrawingQuads();
while (var15 > 0.0F) while (var15 > 0.0F) {
{ Icon var19;
Icon var19 = var18 % 2 == 0 ? var9 : var10;
this.bindTexture(TextureMap.locationBlocksTexture); if (var18 % 2 == 0) {
var19 = var9;
} else {
var19 = var10;
}
float var20 = var19.getMinU(); float var20 = var19.getMinU();
float var21 = var19.getMinV(); float var21 = var19.getMinV();
float var22 = var19.getMaxU(); float var22 = var19.getMaxU();
float var23 = var19.getMaxV(); float var23 = var19.getMaxV();
if (var18 / 2 % 2 == 0) if (var18 / 2 % 2 == 0) {
{
float var24 = var22; float var24 = var22;
var22 = var20; var22 = var20;
var20 = var24; var20 = var24;
@ -95,26 +102,28 @@ public abstract class Render
EaglerAdapter.glEnable(EaglerAdapter.GL_LIGHTING); EaglerAdapter.glEnable(EaglerAdapter.GL_LIGHTING);
} }
private static final TextureLocation shadow = new TextureLocation("%clamp%/misc/shadow.png");
/** /**
* Renders the entity shadows at the position, shadow alpha and partialTickTime. Args: entity, x, y, z, shadowAlpha, * Renders the entity shadows at the position, shadow alpha and partialTickTime.
* partialTickTime * Args: entity, x, y, z, shadowAlpha, partialTickTime
*/ */
private void renderShadow(Entity par1Entity, double par2, double par4, double par6, float par8, float par9) private void renderShadow(Entity par1Entity, double par2, double par4, double par6, float par8, float par9) {
{
EaglerAdapter.glEnable(EaglerAdapter.GL_BLEND); EaglerAdapter.glEnable(EaglerAdapter.GL_BLEND);
EaglerAdapter.glDisable(EaglerAdapter.GL_ALPHA_TEST);
EaglerAdapter.glBlendFunc(EaglerAdapter.GL_SRC_ALPHA, EaglerAdapter.GL_ONE_MINUS_SRC_ALPHA); EaglerAdapter.glBlendFunc(EaglerAdapter.GL_SRC_ALPHA, EaglerAdapter.GL_ONE_MINUS_SRC_ALPHA);
shadowTextures.bindTexture(); shadow.bindTexture();
EaglerAdapter.glTexParameteri(EaglerAdapter.GL_TEXTURE_2D, EaglerAdapter.GL_TEXTURE_WRAP_S, EaglerAdapter.GL_CLAMP);
EaglerAdapter.glTexParameteri(EaglerAdapter.GL_TEXTURE_2D, EaglerAdapter.GL_TEXTURE_WRAP_T, EaglerAdapter.GL_CLAMP);
World var10 = this.getWorldFromRenderManager(); World var10 = this.getWorldFromRenderManager();
EaglerAdapter.glDepthMask(false); EaglerAdapter.glDepthMask(false);
float var11 = this.shadowSize; float var11 = this.shadowSize;
if (par1Entity instanceof EntityLiving) if (par1Entity instanceof EntityLiving) {
{
EntityLiving var12 = (EntityLiving) par1Entity; EntityLiving var12 = (EntityLiving) par1Entity;
var11 *= var12.getRenderSizeModifier(); var11 *= var12.getRenderSizeModifier();
if (var12.isChild()) if (var12.isChild()) {
{
var11 *= 0.5F; var11 *= 0.5F;
} }
} }
@ -134,16 +143,12 @@ public abstract class Render
Tessellator var30 = Tessellator.instance; Tessellator var30 = Tessellator.instance;
var30.startDrawingQuads(); var30.startDrawingQuads();
for (int var31 = var18; var31 <= var19; ++var31) for (int var31 = var18; var31 <= var19; ++var31) {
{ for (int var32 = var20; var32 <= var21; ++var32) {
for (int var32 = var20; var32 <= var21; ++var32) for (int var33 = var22; var33 <= var23; ++var33) {
{
for (int var33 = var22; var33 <= var23; ++var33)
{
int var34 = var10.getBlockId(var31, var32 - 1, var33); int var34 = var10.getBlockId(var31, var32 - 1, var33);
if (var34 > 0 && var10.getBlockLightValue(var31, var32, var33) > 3) if (var34 > 0 && var10.getBlockLightValue(var31, var32, var33) > 3) {
{
this.renderShadowOnBlock(Block.blocksList[var34], par2, par4 + (double) par1Entity.getShadowSize(), par6, var31, var32, var33, par8, var11, var24, var26 + (double) par1Entity.getShadowSize(), var28); this.renderShadowOnBlock(Block.blocksList[var34], par2, par4 + (double) par1Entity.getShadowSize(), par6, var31, var32, var33, par8, var11, var24, var26 + (double) par1Entity.getShadowSize(), var28);
} }
} }
@ -153,34 +158,31 @@ public abstract class Render
var30.draw(); var30.draw();
EaglerAdapter.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); EaglerAdapter.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
EaglerAdapter.glDisable(EaglerAdapter.GL_BLEND); EaglerAdapter.glDisable(EaglerAdapter.GL_BLEND);
EaglerAdapter.glEnable(EaglerAdapter.GL_ALPHA_TEST);
EaglerAdapter.glDepthMask(true); EaglerAdapter.glDepthMask(true);
} }
/** /**
* Returns the render manager's world object * Returns the render manager's world object
*/ */
private World getWorldFromRenderManager() private World getWorldFromRenderManager() {
{
return this.renderManager.worldObj; return this.renderManager.worldObj;
} }
/** /**
* Renders a shadow projected down onto the specified block. Brightness of the block plus how far away on the Y axis * Renders a shadow projected down onto the specified block. Brightness of the
* determines the alpha of the shadow. Args: block, centerX, centerY, centerZ, blockX, blockY, blockZ, baseAlpha, * block plus how far away on the Y axis determines the alpha of the shadow.
* Args: block, centerX, centerY, centerZ, blockX, blockY, blockZ, baseAlpha,
* shadowSize, xOffset, yOffset, zOffset * shadowSize, xOffset, yOffset, zOffset
*/ */
private void renderShadowOnBlock(Block par1Block, double par2, double par4, double par6, int par8, int par9, int par10, float par11, float par12, double par13, double par15, double par17) private void renderShadowOnBlock(Block par1Block, double par2, double par4, double par6, int par8, int par9, int par10, float par11, float par12, double par13, double par15, double par17) {
{
Tessellator var19 = Tessellator.instance; Tessellator var19 = Tessellator.instance;
if (par1Block.renderAsNormalBlock()) if (par1Block.renderAsNormalBlock()) {
{
double var20 = ((double) par11 - (par4 - ((double) par9 + par15)) / 2.0D) * 0.5D * (double) this.getWorldFromRenderManager().getLightBrightness(par8, par9, par10); double var20 = ((double) par11 - (par4 - ((double) par9 + par15)) / 2.0D) * 0.5D * (double) this.getWorldFromRenderManager().getLightBrightness(par8, par9, par10);
if (var20 >= 0.0D) if (var20 >= 0.0D) {
{ if (var20 > 1.0D) {
if (var20 > 1.0D)
{
var20 = 1.0D; var20 = 1.0D;
} }
@ -203,10 +205,10 @@ public abstract class Render
} }
/** /**
* Renders a white box with the bounds of the AABB translated by the offset. Args: aabb, x, y, z * Renders a white box with the bounds of the AABB translated by the offset.
* Args: aabb, x, y, z
*/ */
public static void renderOffsetAABB(AxisAlignedBB par0AxisAlignedBB, double par1, double par3, double par5) public static void renderOffsetAABB(AxisAlignedBB par0AxisAlignedBB, double par1, double par3, double par5) {
{
EaglerAdapter.glDisable(EaglerAdapter.GL_TEXTURE_2D); EaglerAdapter.glDisable(EaglerAdapter.GL_TEXTURE_2D);
Tessellator var7 = Tessellator.instance; Tessellator var7 = Tessellator.instance;
EaglerAdapter.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); EaglerAdapter.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
@ -250,8 +252,7 @@ public abstract class Render
/** /**
* Adds to the tesselator a box using the aabb for the bounds. Args: aabb * Adds to the tesselator a box using the aabb for the bounds. Args: aabb
*/ */
public static void renderAABB(AxisAlignedBB par0AxisAlignedBB) public static void renderAABB(AxisAlignedBB par0AxisAlignedBB) {
{
Tessellator var1 = Tessellator.instance; Tessellator var1 = Tessellator.instance;
var1.startDrawingQuads(); var1.startDrawingQuads();
var1.addVertex(par0AxisAlignedBB.minX, par0AxisAlignedBB.maxY, par0AxisAlignedBB.minZ); var1.addVertex(par0AxisAlignedBB.minX, par0AxisAlignedBB.maxY, par0AxisAlignedBB.minZ);
@ -284,29 +285,25 @@ public abstract class Render
/** /**
* Sets the RenderManager. * Sets the RenderManager.
*/ */
public void setRenderManager(RenderManager par1RenderManager) public void setRenderManager(RenderManager par1RenderManager) {
{
this.renderManager = par1RenderManager; this.renderManager = par1RenderManager;
} }
/** /**
* Renders the entity's shadow and fire (if its on fire). Args: entity, x, y, z, yaw, partialTickTime * Renders the entity's shadow and fire (if its on fire). Args: entity, x, y, z,
* yaw, partialTickTime
*/ */
public void doRenderShadowAndFire(Entity par1Entity, double par2, double par4, double par6, float par8, float par9) public void doRenderShadowAndFire(Entity par1Entity, double par2, double par4, double par6, float par8, float par9) {
{ if (this.renderManager.options.fancyGraphics && this.shadowSize > 0.0F && !par1Entity.isInvisible()) {
if (this.renderManager.options.fancyGraphics && this.shadowSize > 0.0F && !par1Entity.isInvisible())
{
double var10 = this.renderManager.getDistanceToCamera(par1Entity.posX, par1Entity.posY, par1Entity.posZ); double var10 = this.renderManager.getDistanceToCamera(par1Entity.posX, par1Entity.posY, par1Entity.posZ);
float var12 = (float) ((1.0D - var10 / 256.0D) * (double) this.shadowOpaque); float var12 = (float) ((1.0D - var10 / 256.0D) * (double) this.shadowOpaque);
if (var12 > 0.0F) if (var12 > 0.0F) {
{
this.renderShadow(par1Entity, par2, par4, par6, var12, par9); this.renderShadow(par1Entity, par2, par4, par6, var12, par9);
} }
} }
if (par1Entity.canRenderOnFire()) if (par1Entity.canRenderOnFire()) {
{
this.renderEntityOnFire(par1Entity, par2, par4, par6, par9); this.renderEntityOnFire(par1Entity, par2, par4, par6, par9);
} }
} }
@ -314,10 +311,10 @@ public abstract class Render
/** /**
* Returns the font renderer from the set render manager * Returns the font renderer from the set render manager
*/ */
public FontRenderer getFontRendererFromRenderManager() public FontRenderer getFontRendererFromRenderManager() {
{
return this.renderManager.getFontRenderer(); return this.renderManager.getFontRenderer();
} }
public void updateIcons(IconRegister par1IconRegister) {} public void updateIcons(IconRegister par1IconRegister) {
}
} }

View File

@ -10,7 +10,6 @@ import net.lax1dude.eaglercraft.EaglerAdapter;
import net.lax1dude.eaglercraft.EaglerImage; import net.lax1dude.eaglercraft.EaglerImage;
import net.lax1dude.eaglercraft.TextureLocation; import net.lax1dude.eaglercraft.TextureLocation;
import net.lax1dude.eaglercraft.TextureTerrainMap; import net.lax1dude.eaglercraft.TextureTerrainMap;
import net.minecraft.src.Minecraft;
public class RenderEngine { public class RenderEngine {
private HashMap textureMap = new HashMap(); private HashMap textureMap = new HashMap();

View File

@ -23,7 +23,7 @@ public class SaveFormatOld implements ISaveFormat
this.savesDirectory = par1File; this.savesDirectory = par1File;
} }
public List getSaveList() throws AnvilConverterException public List getSaveList() throws Exception
{ {
ArrayList var1 = new ArrayList(); ArrayList var1 = new ArrayList();

View File

@ -6,7 +6,6 @@ import java.util.List;
import net.lax1dude.eaglercraft.EaglerAdapter; import net.lax1dude.eaglercraft.EaglerAdapter;
import net.lax1dude.eaglercraft.EaglerImage; import net.lax1dude.eaglercraft.EaglerImage;
import net.minecraft.src.Minecraft;
public class TextureManager { public class TextureManager {
private static TextureManager instance; private static TextureManager instance;

View File

@ -10,7 +10,6 @@ import java.util.Map;
import net.lax1dude.eaglercraft.EaglerAdapter; import net.lax1dude.eaglercraft.EaglerAdapter;
import net.lax1dude.eaglercraft.EaglerImage; import net.lax1dude.eaglercraft.EaglerImage;
import net.lax1dude.eaglercraft.TextureLocation; import net.lax1dude.eaglercraft.TextureLocation;
import net.minecraft.src.Minecraft;
public class TextureMap implements IconRegister { public class TextureMap implements IconRegister {
public static final TextureLocation locationBlocksTexture = new TextureLocation("textures/atlas/blocks.png"); public static final TextureLocation locationBlocksTexture = new TextureLocation("textures/atlas/blocks.png");