package game; import java.awt.Desktop; import java.awt.image.BufferedImage; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.lang.Thread.UncaughtExceptionHandler; import java.lang.management.ManagementFactory; import java.lang.management.ThreadInfo; import java.lang.management.ThreadMXBean; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Modifier; import java.net.IDN; import java.net.InetAddress; import java.net.SocketAddress; import java.net.UnknownHostException; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.text.SimpleDateFormat; import java.util.ArrayDeque; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Map.Entry; import java.util.Queue; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.FutureTask; import javax.imageio.ImageIO; import game.BaseVar.VarFunction; import game.BoolVar.BoolFunction; import game.EnumVar.EnumFunction; import game.FloatVar.FloatFunction; import game.IntVar.IntFunction; import game.Variable.IntType; import game.audio.AudioInterface; import game.audio.SoundManager; import game.audio.Volume; import game.biome.Biome; import game.block.Block; import game.collect.Lists; import game.collect.Maps; import game.color.Colorizer; import game.color.TextColor; import game.entity.Entity; import game.entity.animal.EntityHorse; import game.entity.npc.Energy; import game.entity.npc.EntityNPC; import game.entity.types.EntityLiving; import game.future.Futures; import game.future.ListenableFuture; import game.future.ListenableFutureTask; import game.gui.GuiCheat; import game.gui.GuiContainer; import game.gui.GuiGameOver; import game.gui.GuiInventory; import game.init.BlockRegistry; import game.init.Config; import game.init.EntityRegistry; import game.init.ItemRegistry; import game.init.Registry; import game.init.SoundEvent; import game.inventory.InventoryPlayer; import game.item.Item; import game.item.ItemBlock; import game.item.ItemControl; import game.item.ItemStack; import game.material.Material; import game.model.ModelManager; import game.network.IThreadListener; import game.network.NetConnection; import game.network.NetHandler.ThreadQuickExitException; import game.network.NetHandlerLoginClient; import game.network.NetHandlerPlayClient; import game.network.PlayerController; import game.packet.CPacketAction; import game.packet.CPacketAction.Action; import game.packet.CPacketCheat; import game.packet.CPacketMessage; import game.packet.HPacketHandshake; import game.packet.LPacketPasswordResponse; import game.potion.Potion; import game.potion.PotionEffect; import game.potion.PotionHelper; import game.properties.IProperty; import game.renderer.BlockRenderer; import game.renderer.EntityRenderer; import game.renderer.GlState; import game.renderer.ItemRenderer; import game.renderer.RenderGlobal; import game.renderer.chunk.RenderChunk; import game.renderer.entity.RenderItem; import game.renderer.entity.RenderManager; import game.renderer.particle.EffectRenderer; import game.renderer.texture.EntityTexManager; import game.renderer.texture.TextureManager; import game.renderer.texture.TextureMap; import game.rng.Random; import game.world.BlockPos; import game.world.Chunk; import game.world.Converter; import game.world.Facing; import game.world.HitPosition; import game.world.HitPosition.ObjectType; import game.world.LightType; import game.world.Region; import game.world.State; import game.world.World; import game.world.WorldClient; import game.world.WorldServer; /* Een net ganz funktionierndes Programm ... Absolute Mindestanforderungen: Prozessor : Intel Core i3 530 oder AMD Phenom 2 X2 545 Grafikkarte : NVIDIA GeForce GTS 450 oder AMD Radeon HD 7730 Arbeitsspeicher : Etwa 512 MB ~ 1 GB, 2 - 4 GB empfohlen Mainboard : Was gerade passt (auch mit Hammer) Kühler : Ne Klimaanlage oder ordentlich Pusten Festplatte : Richtet sich nach der Geduld des Nutzers Netzteil : Atomkraftwerk oder stabiler Energiekern Gehäuse : Pappkarton, Bierkasten oder auch gar keins Tastatur : Hlb fktonrnd odr bsr Maus : Aus Plastik oder mit extra Quietsch-Effekt Monitor : Olle Röhre oder gebrochener Flachbild (Mindestens 1280x800) Stuhl : Interessiert niemanden (sonst siehe Gehäuse) [[oder einfach einen Toaster mit nem LCD und Maus]] */ public class Game implements IThreadListener { public static class SyncFunction implements IntFunction { public void apply(IntVar cv, int value) { Game.getGame().sync(value); } } public static class TickFunction implements FloatFunction { public void apply(FloatVar cv, float value) { Game.getGame().tick_target(value); } } public static class ConFunction implements IntFunction { public void apply(IntVar cv, int value) { Game.getGame().resize(value); } } public static class DistanceFunction implements IntFunction { public void apply(IntVar cv, int value) { if(Game.getGame().renderGlobal != null) Game.getGame().renderGlobal.setDisplayListEntitiesDirty(); Game.getGame().distance(value); } } public static final int LOG_BUFFER = 32768; private final Queue> tasks = new ArrayDeque>(); private final Map bars = Maps.newTreeMap(); private final Thread clThread = Thread.currentThread(); private final Map cvars = Maps.newTreeMap(); private final List log = Lists.newArrayList(); private final File config = new File(System.getProperty("config.file", "game.cfg")); private boolean primary; private boolean secondary; private boolean tertiary; private boolean quarternary; public boolean jump; public boolean sneak; public boolean debugCamEnable; public boolean debugWorld; public boolean zooming; public boolean sprint; public boolean renderOutlines; public boolean setGamma; public boolean nickChanged; public boolean xrayActive; public boolean tileOverlay; public boolean itemCheat; public boolean dayCycle = true; private int leftClickCounter; private int rightClickTimer; private int chunkLoadTimer; public int thirdPersonView; public int timeFactor = 1; public int chunksUpdated; private long lastTicked = 0L; private long debugUpdateTime = System.currentTimeMillis(); private long tickStart; private float deltaX; private float deltaY; public float moveStrafe; public float moveForward; public float zoomLevel; public float gravity = 1.0f; private TextureManager textureManager; private RenderManager renderManager; private RenderItem renderItem; private ItemRenderer itemRenderer; public RenderGlobal renderGlobal; public EffectRenderer effectRenderer; public EntityRenderer entityRenderer; private TextureMap textureMap; private ModelManager modelManager; private BlockRenderer blockRenderer; public Gui open; private SoundManager soundManager; private NetConnection connection; private Entity viewEntity; private Entity pointedEntity; private BufferedImage skin; private Object popupTarget; public PlayerController controller; public WorldClient theWorld; public EntityNPC thePlayer; public HitPosition pointed; @Variable(name = "chunk_view_distance", category = CVarCategory.WORLD, min = 2, max = 128, callback = DistanceFunction.class, display = "Sichtweite", unit = "Chunks") public int renderDistance = 8; @Variable(name = "chunk_build_time", category = CVarCategory.WORLD, min = 1, max = 100, display = "Max. Zeit für Chunk-Bau pro Frame", unit = "ms") public int maxBuildTime = 8; @Variable(name = "gl_fov", category = CVarCategory.RENDER, min = 1.0f, max = 179.0f, display = "Sichtfeld (FOV)", unit = "°", precision = 1) public float fov = 70.0f; @Variable(name = "gl_wireframe", category = CVarCategory.RENDER) public boolean wireframe = false; @Variable(name = "con_timestamps", category = CVarCategory.CONSOLE, display = "Zeiten") public boolean conTimestamps = false; @Variable(name = "con_loglevel", category = CVarCategory.CONSOLE, display = "Ausgabe") public LogLevel level = LogLevel.INFO; @Variable(name = "win_sync", category = CVarCategory.WINDOW, min = -1, max = 16384, callback = SyncFunction.class) public int sync = 0; public int width; public int height; public int mouse_x; public int mouse_y; @Variable(name = "win_width", category = CVarCategory.WINDOW, min = 1, max = 65536) public int xsize = 1280; @Variable(name = "win_height", category = CVarCategory.WINDOW, min = 1, max = 65536) public int ysize = 800; @Variable(name = "win_pos_x", category = CVarCategory.WINDOW, min = -65536, max = 65536) public int saved_xpos = 0x80000000; @Variable(name = "win_pos_y", category = CVarCategory.WINDOW, min = -65536, max = 65536) public int saved_ypos = 0x80000000; public int fb_x; public int fb_y; @Variable(name = "phy_sensitivity", category = CVarCategory.PHYSICS, min = 0.01f, max = 10.0f, display = "Mausempfindlichkeit", precision = 2, unit = "%") public float sensitivity = 1.0f; public boolean fullscreen; public long syncLimit; public boolean mouseFirst; public boolean nograb = System.getProperty("mouse.nograb") != null; public DisplayMode vidMode; @Variable(name = "gui_dclick_delay", category = CVarCategory.GUI, min = 150, max = 750, display = "Doppelklick bei", unit = "ms") public int dclickDelay = 250; @Variable(name = "con_size", category = CVarCategory.CONSOLE, min = 0, max = 128, callback = ConFunction.class, display = "Nachrichten im Overlay") public int hudSize = 32; @Variable(name = "con_fadeout", category = CVarCategory.CONSOLE, min = 100, max = 60000, display = "Dauer bis zum Ausblenden", unit = "ms") public int hudFadeout = 5000; @Variable(name = "con_overlay", category = CVarCategory.CONSOLE, display = "Konsolen-Overlay") public boolean hudOverlay = true; @Variable(name = "con_position", category = CVarCategory.CONSOLE, display = "Position") public ConsolePos hudPos = ConsolePos.BOTTOM; @Variable(name = "con_opacity", category = CVarCategory.CONSOLE, min = 0x00, max = 0xff, display = "Deckkraft Hintergrund") public int hudOpacity = 0x40; public boolean syncLimited; public boolean vsync; public boolean screenshot; public boolean saving; public boolean drawFps; public boolean drawDebug; @Variable(name = "gl_vsync_flush", category = CVarCategory.RENDER, display = "Puffer vor Synch. leeren") public boolean glFlush = false; @Variable(name = "con_autoclose", category = CVarCategory.CONSOLE, display = "Schließen") public boolean conAutoclose = true; public boolean interrupted; public List vid_modes = Lists.newArrayList(); public List messages = Lists.newArrayList(); @Variable(name = "gui_theme", category = CVarCategory.STYLE) public Style style = Style.DEFAULT; public List