From 511e95a06747ca600d121fb5da168ca52526bd8a Mon Sep 17 00:00:00 2001 From: lax1dude Date: Sat, 7 Dec 2024 18:25:36 -0800 Subject: [PATCH] fixes for sp2, part 1 --- .classpath | 12 +- build.gradle | 94 ++--- gradle.properties | 1 + gradle/wrapper/gradle-wrapper.jar | Bin 58702 -> 63721 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- lwjgl-rundir/_eagstorage.g.dat | Bin 1705 -> 1741 bytes settings.gradle | 2 +- sp-server/.classpath | 6 +- sp-server/.project | 2 +- sp-server/build.gradle | 116 ++----- sp-server/gradle.properties | 1 + sp-server/gradle/wrapper/gradle-wrapper.jar | Bin 59536 -> 63721 bytes .../gradle/wrapper/gradle-wrapper.properties | 4 +- sp-server/settings.gradle | 2 +- .../sp/ipc/IPCPacket14StringList.java | 6 +- .../sp/ipc/IPCPacket15ThrowException.java | 4 +- .../sp/ipc/IPCPacket16NBTList.java | 6 +- .../sp/ipc/IPCPacket17ConfigureLAN.java | 2 +- .../eaglercraft/sp/ipc/IPCPacketManager.java | 2 +- .../eaglercraft/sp/EAGMinecraftServer.java | 18 +- .../lax1dude/eaglercraft/sp/ExpiringSet.java | 4 +- .../eaglercraft/sp/IDBObjectStorePatched.java | 79 ----- .../eaglercraft/sp/IntegratedServer.java | 34 +- .../lax1dude/eaglercraft/sp/MCAConverter.java | 2 +- .../lax1dude/eaglercraft/sp/SkinsPlugin.java | 8 +- .../net/lax1dude/eaglercraft/sp/SysUtil.java | 48 +++ .../eaglercraft/sp/VFSSaveHandler.java | 2 +- .../net/lax1dude/eaglercraft/sp/VFile.java | 2 +- .../eaglercraft/sp/VIteratorFile.java | 8 +- .../eaglercraft/sp/VirtualFilesystem.java | 52 +-- .../eaglercraft/sp/VoiceChatPlugin.java | 2 +- .../eaglercraft/sp/WorkerListenThread.java | 3 +- .../eaglercraft/sp/WorkerNetworkManager.java | 5 +- .../eaglercraft/sp/ZipOutputStream.java | 327 ------------------ .../net/minecraft/server/MinecraftServer.java | 9 +- .../java/net/minecraft/src/BiomeCache.java | 6 +- .../minecraft/src/ChunkProviderServer.java | 4 +- .../java/net/minecraft/src/CommandDebug.java | 5 +- .../src/ConvertingProgressUpdate.java | 8 +- .../java/net/minecraft/src/EntityAgeable.java | 2 +- .../java/net/minecraft/src/EntityBat.java | 2 +- .../java/net/minecraft/src/EntityBlaze.java | 2 +- .../java/net/minecraft/src/EntityBoat.java | 6 +- .../java/net/minecraft/src/EntityDragon.java | 2 +- .../net/minecraft/src/EntityEnderman.java | 6 +- .../net/minecraft/src/EntityMinecart.java | 10 +- .../minecraft/src/EntityMinecartFurnace.java | 2 +- .../java/net/minecraft/src/EntitySheep.java | 2 +- .../net/minecraft/src/EntitySkeleton.java | 2 +- .../java/net/minecraft/src/EntitySlime.java | 4 +- .../java/net/minecraft/src/EntitySpider.java | 2 +- .../java/net/minecraft/src/EntityWither.java | 10 +- .../java/net/minecraft/src/EntityWolf.java | 6 +- .../main/java/net/minecraft/src/Packet.java | 4 +- .../java/net/minecraft/src/WorldServer.java | 3 +- .../adapter/EaglerAdapterImpl2.java | 21 +- .../java/paulscode/sound/CommandThread.java | 6 +- .../java/paulscode/sound/MidiChannel.java | 8 +- src/lwjgl/java/paulscode/sound/Source.java | 8 +- .../lax1dude/eaglercraft/AssetRepository.java | 7 +- .../eaglercraft/DefaultSkinRenderer.java | 39 ++- .../lax1dude/eaglercraft/EaglerProfile.java | 4 +- .../lax1dude/eaglercraft/EarlyLoadScreen.java | 12 +- .../net/lax1dude/eaglercraft/ExpiringSet.java | 4 +- .../eaglercraft/GuiScreenAddRelay.java | 1 - .../eaglercraft/GuiScreenNameWorldImport.java | 2 +- .../lax1dude/eaglercraft/GuiScreenRelay.java | 4 +- .../GuiScreenSingleplayerConnecting.java | 6 +- .../GuiScreenSingleplayerLoading.java | 6 +- .../lax1dude/eaglercraft/GuiSlotRelay.java | 1 - .../lax1dude/eaglercraft/GuiVoiceMenu.java | 2 +- .../lax1dude/eaglercraft/GuiVoiceOverlay.java | 6 +- .../eaglercraft/IntegratedServer.java | 8 +- .../eaglercraft/IntegratedServerLAN.java | 40 +-- .../eaglercraft/LANClientNetworkManager.java | 34 +- .../lax1dude/eaglercraft/LANServerList.java | 10 +- .../lax1dude/eaglercraft/RelayManager.java | 18 +- .../net/lax1dude/eaglercraft/RelayServer.java | 7 +- .../net/lax1dude/eaglercraft/ServerQuery.java | 24 +- .../lax1dude/eaglercraft/TextureLocation.java | 2 +- .../eaglercraft/TextureTerrainMap.java | 2 +- .../eaglercraft/WebsocketNetworkManager.java | 2 +- .../eaglercraft/glemu/EaglerAdapterGL30.java | 12 +- .../eaglercraft/glemu/EffectPipeline.java | 4 +- .../glemu/FixedFunctionShader.java | 2 +- .../glemu/GameOverlayFramebuffer.java | 4 +- .../eaglercraft/sp/relay/pkt/IPacket.java | 4 +- .../sp/relay/pkt/IPacket01ICEServers.java | 2 +- .../sp/relay/pkt/IPacket07LocalWorlds.java | 2 +- .../java/net/minecraft/client/Minecraft.java | 54 +-- .../java/net/minecraft/src/EntityAgeable.java | 2 +- .../java/net/minecraft/src/EntityBat.java | 2 +- .../java/net/minecraft/src/EntityBlaze.java | 2 +- .../java/net/minecraft/src/EntityBoat.java | 6 +- .../java/net/minecraft/src/EntityDragon.java | 2 +- .../net/minecraft/src/EntityEnderman.java | 6 +- .../net/minecraft/src/EntityMinecart.java | 10 +- .../minecraft/src/EntityMinecartFurnace.java | 2 +- .../java/net/minecraft/src/EntityPlayer.java | 3 +- .../net/minecraft/src/EntityRenderer.java | 8 +- .../java/net/minecraft/src/EntitySheep.java | 2 +- .../net/minecraft/src/EntitySkeleton.java | 2 +- .../java/net/minecraft/src/EntitySlime.java | 4 +- .../java/net/minecraft/src/EntitySpider.java | 2 +- .../java/net/minecraft/src/EntityWither.java | 10 +- .../java/net/minecraft/src/EntityWolf.java | 6 +- .../java/net/minecraft/src/GuiIngame.java | 3 +- .../java/net/minecraft/src/GuiMainMenu.java | 6 +- .../net/minecraft/src/GuiMultiplayer.java | 7 +- .../net/minecraft/src/GuiTexturePacks.java | 2 - src/main/java/net/minecraft/src/Packet.java | 4 +- .../java/net/minecraft/src/RenderGlobal.java | 4 +- .../java/net/minecraft/src/RenderPlayer.java | 2 +- .../java/net/minecraft/src/ServerList.java | 2 +- .../java/net/minecraft/src/SoundManager.java | 2 +- .../net/minecraft/src/StringTranslate.java | 2 - .../net/minecraft/src/TextureStitched.java | 6 +- .../src/TileEntityBeaconRenderer.java | 2 +- .../adapter/DetectAnisotropicGlitch.java | 6 +- .../adapter/EaglerAdapterImpl2.java | 317 +++++++++-------- .../eaglercraft/adapter/SimpleStorage.java | 19 +- .../eaglercraft/adapter/Tessellator.java | 8 +- .../adapter/teavm/EventHandler.java | 24 -- .../adapter/teavm/IDBCountRequest.java | 23 -- .../eaglercraft/adapter/teavm/IDBCursor.java | 54 --- .../adapter/teavm/IDBCursorRequest.java | 23 -- .../adapter/teavm/IDBCursorSource.java | 21 -- .../adapter/teavm/IDBDatabase.java | 62 ---- .../eaglercraft/adapter/teavm/IDBError.java | 24 -- .../eaglercraft/adapter/teavm/IDBFactory.java | 46 --- .../adapter/teavm/IDBGetRequest.java | 24 -- .../eaglercraft/adapter/teavm/IDBIndex.java | 61 ---- .../adapter/teavm/IDBKeyRange.java | 59 ---- .../adapter/teavm/IDBObjectStore.java | 78 ----- .../teavm/IDBObjectStoreParameters.java | 41 --- .../adapter/teavm/IDBOpenDBRequest.java | 30 -- .../eaglercraft/adapter/teavm/IDBRequest.java | 42 --- .../adapter/teavm/IDBRequestSource.java | 21 -- .../adapter/teavm/IDBTransaction.java | 44 --- .../adapter/teavm/IDBVersionChangeEvent.java | 27 -- .../adapter/teavm/SelfDefence.java | 2 +- 141 files changed, 656 insertions(+), 1834 deletions(-) create mode 100644 gradle.properties create mode 100644 sp-server/gradle.properties delete mode 100644 sp-server/src/main/java/net/lax1dude/eaglercraft/sp/IDBObjectStorePatched.java create mode 100644 sp-server/src/main/java/net/lax1dude/eaglercraft/sp/SysUtil.java delete mode 100644 sp-server/src/main/java/net/lax1dude/eaglercraft/sp/ZipOutputStream.java delete mode 100644 src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/EventHandler.java delete mode 100644 src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBCountRequest.java delete mode 100644 src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBCursor.java delete mode 100644 src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBCursorRequest.java delete mode 100644 src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBCursorSource.java delete mode 100644 src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBDatabase.java delete mode 100644 src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBError.java delete mode 100644 src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBFactory.java delete mode 100644 src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBGetRequest.java delete mode 100644 src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBIndex.java delete mode 100644 src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBKeyRange.java delete mode 100644 src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBObjectStore.java delete mode 100644 src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBObjectStoreParameters.java delete mode 100644 src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBOpenDBRequest.java delete mode 100644 src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBRequest.java delete mode 100644 src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBRequestSource.java delete mode 100644 src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBTransaction.java delete mode 100644 src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBVersionChangeEvent.java diff --git a/.classpath b/.classpath index ab0a016..c20445f 100644 --- a/.classpath +++ b/.classpath @@ -3,22 +3,22 @@ - + - + - - + + - + - + diff --git a/build.gradle b/build.gradle index 13014da..5bfda51 100644 --- a/build.gradle +++ b/build.gradle @@ -1,27 +1,19 @@ +import org.teavm.gradle.api.OptimizationLevel -buildscript { - repositories { - mavenCentral() - } - - dependencies { - classpath 'io.github.zebalu:teavm-gradle-plugin:1.0.0' - } +plugins { + id "java" + id "eclipse" + id "org.teavm" version "0.10.2" } -apply plugin: 'java' -apply plugin: 'eclipse' -apply plugin: 'io.github.zebalu.teavm-gradle-plugin' - -sourceCompatibility = 1.8 -targetCompatibility = 1.8 - sourceSets { main { java { - srcDir 'src/main/java' - srcDir 'src/teavm/java' - srcDir 'sp-server/src/ipc/java' + srcDirs( + "src/main/java", + "src/teavm/java", + "sp-server/src/ipc/java" + ) } } } @@ -31,54 +23,24 @@ repositories { } dependencies { - implementation 'org.teavm:teavm-platform:0.6.1' - implementation 'org.teavm:teavm-classlib:0.6.1' + teavm(teavm.libs.jso) + teavm(teavm.libs.jsoApis) } -teavm { - - compileScopes = null; - minifying = true; - maxTopLevelNames = 10000; - properties = null; - debugInformationGenerated = false; - sourceMapsGenerated = true; - sourceFilesCopied = false; - incremental = false; - transformers = null; - - /** Where to save the result */ - targetDirectory = file("javascript"); - - /** The directory to monitor to decide if compile is up-to-date or not */ - sourceDirectory = file("src"); - - /** How to name the result file. */ - targetFileName = "classes.js"; - - /** Which class holds your public static void main(Strin[] args) method */ - mainClass = 'net.lax1dude.eaglercraft.Client'; - - /** This will be the name of your main method after compilation. */ - entryPointName = 'main'; - - classesToPreserve = null; - stopOnErrors = false; - optimizationLevel = "ADVANCED"; //org.teavm.vm.TeaVMOptimizationLevel.SIMPLE; - fastGlobalAnalysis = false; - targetType = "JAVASCRIPT"; //org.teavm.tooling.TeaVMTargetType.JAVASCRIPT; - cacheDirectory = null; - wasmVersion = "V_0x1"; //org.teavm.backend.wasm.render.WasmBinaryVersion.V_0x1; - minHeapSize = 4; - maxHeapSize = 128; - outOfProcess = false; - processMemory = 512; - longjmpSupported = true; - heapDump = false; - - /** Add name of configurations here where to look for jarfiles. */ - includeJarsFrom = []; - - /** By default teavmc taskd epends on javaCompile task, unless this varaibale is true. */ - skipJavaCompile = false; +def folder = "javascript" +def name = "classes.js" + +teavm.js { + obfuscated = true + sourceMap = true + targetFileName = "../" + name + optimization = OptimizationLevel.AGGRESSIVE + outOfProcess = false + fastGlobalAnalysis = false + processMemory = 512 + entryPointName = "main" + mainClass = "net.lax1dude.eaglercraft.Client" + outputDir = file(folder) + properties = [ "java.util.TimeZone.autodetect": "true" ] + debugInformation = false } diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..a36eb1c --- /dev/null +++ b/gradle.properties @@ -0,0 +1 @@ +org.gradle.jvmargs=-Xmx2G -Xms2G \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index cc4fdc293d0e50b0ad9b65c16e7ddd1db2f6025b..7f93135c49b765f8051ef9d0a6055ff8e46073d8 100644 GIT binary patch delta 44787 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 eUch3_WM($`F3VCz=E=>h+LKSR76Mt;Y?A - + - + - + diff --git a/sp-server/.project b/sp-server/.project index 1ce8e25..66b372c 100644 --- a/sp-server/.project +++ b/sp-server/.project @@ -1,6 +1,6 @@ - eaglercraft-sp-server + eaglercraft-sp-server-service-pack-2 Project sp-server created by Buildship. diff --git a/sp-server/build.gradle b/sp-server/build.gradle index 5f81193..61cb48d 100644 --- a/sp-server/build.gradle +++ b/sp-server/build.gradle @@ -1,48 +1,18 @@ +import org.teavm.gradle.api.OptimizationLevel -apply plugin: "java" -apply plugin: "eclipse" -apply plugin: "io.github.zebalu.teavm-gradle-plugin" - -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +plugins { + id "java" + id "eclipse" + id "org.teavm" version "0.10.2" +} sourceSets { main { java { - srcDir "src/main/java" - srcDir "src/ipc/java" - } - } -} - -repositories { - flatDir { - dirs "deps" - } -} - -buildscript { - repositories { - mavenCentral() - } - - dependencies { - classpath 'io.github.zebalu:teavm-gradle-plugin:1.0.0' - } -} - -apply plugin: 'java' -apply plugin: 'eclipse' -apply plugin: 'io.github.zebalu.teavm-gradle-plugin' - -sourceCompatibility = 1.8 -targetCompatibility = 1.8 - -sourceSets { - main { - java { - srcDir "src/main/java" - srcDir "src/ipc/java" + srcDirs( + "src/main/java", + "src/ipc/java" + ) } } } @@ -52,54 +22,24 @@ repositories { } dependencies { - implementation 'org.teavm:teavm-platform:0.6.1' - implementation 'org.teavm:teavm-classlib:0.6.1' + teavm(teavm.libs.jso) + teavm(teavm.libs.jsoApis) } -teavm { - - compileScopes = null; - minifying = true; - maxTopLevelNames = 10000; - properties = null; - debugInformationGenerated = false; - sourceMapsGenerated = true; - sourceFilesCopied = false; - incremental = false; - transformers = null; - - /** Where to save the result */ - targetDirectory = file("../javascript"); - - /** The directory to monitor to decide if compile is up-to-date or not */ - sourceDirectory = file("src"); - - /** How to name the result file. */ - targetFileName = "classes_server.js"; - - /** Which class holds your public static void main(Strin[] args) method */ - mainClass = "net.lax1dude.eaglercraft.sp.IntegratedServer"; - - /** This will be the name of your main method after compilation. */ - entryPointName = "main"; - - classesToPreserve = null; - stopOnErrors = false; - optimizationLevel = "ADVANCED"; //org.teavm.vm.TeaVMOptimizationLevel.SIMPLE; - fastGlobalAnalysis = false; - targetType = "JAVASCRIPT"; //org.teavm.tooling.TeaVMTargetType.JAVASCRIPT; - cacheDirectory = null; - wasmVersion = "V_0x1"; //org.teavm.backend.wasm.render.WasmBinaryVersion.V_0x1; - minHeapSize = 4; - maxHeapSize = 128; - outOfProcess = false; - processMemory = 512; - longjmpSupported = true; - heapDump = false; - - /** Add name of configurations here where to look for jarfiles. */ - includeJarsFrom = []; - - /** By default teavmc taskd epends on javaCompile task, unless this varaibale is true. */ - skipJavaCompile = false; +def folder = "../javascript" +def name = "classes_server.js" + +teavm.js { + obfuscated = true + sourceMap = true + targetFileName = "../" + name + optimization = OptimizationLevel.AGGRESSIVE + outOfProcess = false + fastGlobalAnalysis = false + processMemory = 512 + entryPointName = "main" + mainClass = "net.lax1dude.eaglercraft.sp.IntegratedServer" + outputDir = file(folder) + properties = [ "java.util.TimeZone.autodetect": "true" ] + debugInformation = false } diff --git a/sp-server/gradle.properties b/sp-server/gradle.properties new file mode 100644 index 0000000..a36eb1c --- /dev/null +++ b/sp-server/gradle.properties @@ -0,0 +1 @@ +org.gradle.jvmargs=-Xmx2G -Xms2G \ No newline at end of file diff --git a/sp-server/gradle/wrapper/gradle-wrapper.jar b/sp-server/gradle/wrapper/gradle-wrapper.jar index 7454180f2ae8848c63b8b4dea2cb829da983f2fa..7f93135c49b765f8051ef9d0a6055ff8e46073d8 100644 GIT binary patch delta 44391 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%0D+ym=_w*d`k$@iM%aZm>(FB zFT}u)TP%ySs`RyJx#=oxe&Idagc(F$Sv(5*pWd?HYll`LXi*p`s9;8=FNKjA$zuDap z1iJ4_{GzB&FY7I^Z=V2WPV}duAN#+$7*g>}M-8M^ZIIB>-^X-D90KS2pYi;cJpI2t z9+!d$Z~~_e2!65t2V*tx>VN>IOBPZ~3v6t}2DR0RaAz+Y0&>nb^fj?~75%>lATlV_DagaSI48TP5e#m z`NUsBkeiDL|BMZ$&97r4JO2|SVnYrr+W2*{e!H;xn_8U}Ah!z{@Mwehm%07(!p~pV geSU+(twG={1R5&vkYyYSN)YnO$AzrH2Y-C~e^Sofwg3PC delta 40281 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 stringList; public IPCPacket14StringList() { - stringList = new ArrayList(); + stringList = new ArrayList<>(); } public IPCPacket14StringList(int opcode, String[] list) { - stringList = new ArrayList(); + stringList = new ArrayList<>(); for(String s : list) { s = s.trim(); if(s.length() > 0) { @@ -34,7 +34,7 @@ public class IPCPacket14StringList implements IPCPacketBase { } public IPCPacket14StringList(int opcode, List list) { - stringList = new ArrayList(); + stringList = new ArrayList<>(); for(String s : list) { s = s.trim(); if(s.length() > 0) { diff --git a/sp-server/src/ipc/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket15ThrowException.java b/sp-server/src/ipc/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket15ThrowException.java index 056588e..ff4dad3 100644 --- a/sp-server/src/ipc/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket15ThrowException.java +++ b/sp-server/src/ipc/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket15ThrowException.java @@ -15,11 +15,11 @@ public class IPCPacket15ThrowException implements IPCPacketBase { public final List stackTrace; public IPCPacket15ThrowException() { - stackTrace = new ArrayList(); + stackTrace = new ArrayList<>(); } public IPCPacket15ThrowException(String errorMessage, String[] list) { - stackTrace = new ArrayList(Arrays.asList(list)); + stackTrace = new ArrayList<>(Arrays.asList(list)); this.errorMessage = errorMessage; } diff --git a/sp-server/src/ipc/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket16NBTList.java b/sp-server/src/ipc/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket16NBTList.java index 82d7923..b248479 100644 --- a/sp-server/src/ipc/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket16NBTList.java +++ b/sp-server/src/ipc/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket16NBTList.java @@ -25,8 +25,8 @@ public class IPCPacket16NBTList implements IPCPacketBase { public final List nbtTagList; public IPCPacket16NBTList() { - tagList = new LinkedList(); - nbtTagList = new LinkedList(); + tagList = new LinkedList<>(); + nbtTagList = new LinkedList<>(); } public IPCPacket16NBTList(int opcode, NBTTagCompound[] list) { @@ -34,7 +34,7 @@ public class IPCPacket16NBTList implements IPCPacketBase { } public IPCPacket16NBTList(int opcode, List list) { - tagList = new LinkedList(); + tagList = new LinkedList<>(); nbtTagList = list; for(int i = 0, size = list.size(); i < size; ++i) { NBTTagCompound tag = list.get(i); diff --git a/sp-server/src/ipc/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket17ConfigureLAN.java b/sp-server/src/ipc/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket17ConfigureLAN.java index d1c4a5c..1d3f1bd 100644 --- a/sp-server/src/ipc/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket17ConfigureLAN.java +++ b/sp-server/src/ipc/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket17ConfigureLAN.java @@ -15,7 +15,7 @@ public class IPCPacket17ConfigureLAN implements IPCPacketBase { public final List iceServers; public IPCPacket17ConfigureLAN() { - iceServers = new ArrayList(); + iceServers = new ArrayList<>(); } public IPCPacket17ConfigureLAN(int gamemode, boolean cheats, List iceServers) { diff --git a/sp-server/src/ipc/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacketManager.java b/sp-server/src/ipc/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacketManager.java index d7b9ab2..5e8f3d2 100644 --- a/sp-server/src/ipc/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacketManager.java +++ b/sp-server/src/ipc/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacketManager.java @@ -8,7 +8,7 @@ import java.util.function.Supplier; public class IPCPacketManager { - public static final HashMap> mappings = new HashMap(); + public static final HashMap> mappings = new HashMap<>(); public static final IPCInputStream IPC_INPUT_STREAM = new IPCInputStream(); public static final IPCOutputStream IPC_OUTPUT_STREAM = new IPCOutputStream(); diff --git a/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/EAGMinecraftServer.java b/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/EAGMinecraftServer.java index 8b22bd5..681133d 100644 --- a/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/EAGMinecraftServer.java +++ b/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/EAGMinecraftServer.java @@ -37,11 +37,11 @@ public class EAGMinecraftServer extends MinecraftServer { public void mainLoop() { if(paused && this.playersOnline.size() <= 1) { - lastTick = System.currentTimeMillis(); + lastTick = SysUtil.steadyTimeMillis(); return; } - long ctm = System.currentTimeMillis(); + long ctm = SysUtil.steadyTimeMillis(); long delta = ctm - lastTick; if (delta > 2000L && ctm - this.timeOfLastWarning >= 15000L) { @@ -57,19 +57,15 @@ public class EAGMinecraftServer extends MinecraftServer { if (this.worldServers[0].areAllPlayersAsleep()) { this.tick(); - lastTick = System.currentTimeMillis(); + lastTick = SysUtil.steadyTimeMillis(); } else { boolean mustYield = false; while (delta >= 50L) { if(mustYield) { - try { - Thread.sleep(1l); // allow some async - }catch(InterruptedException e) { - System.err.println("you eagler"); - } + SysUtil.sleep(1); // allow some async } delta -= 50L; - lastTick = System.currentTimeMillis(); + lastTick = SysUtil.steadyTimeMillis(); this.tick(); mustYield = true; } @@ -80,7 +76,7 @@ public class EAGMinecraftServer extends MinecraftServer { public void setPaused(boolean p) { paused = p; if(!p) { - lastTick = System.currentTimeMillis(); + lastTick = SysUtil.steadyTimeMillis(); } } @@ -93,7 +89,7 @@ public class EAGMinecraftServer extends MinecraftServer { SkinsPlugin.reset(); VoiceChatPlugin.reset(); this.loadAllWorlds(folderName, 0l, newWorldSettings); - this.lastTick = System.currentTimeMillis(); + this.lastTick = SysUtil.steadyTimeMillis(); return true; } diff --git a/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/ExpiringSet.java b/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/ExpiringSet.java index 2620031..64ed0cf 100644 --- a/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/ExpiringSet.java +++ b/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/ExpiringSet.java @@ -29,7 +29,7 @@ public class ExpiringSet extends HashSet { public void checkForExpirations() { Iterator iterator = this.timestamps.keySet().iterator(); - long now = System.currentTimeMillis(); + long now = SysUtil.steadyTimeMillis(); while (iterator.hasNext()) { T element = iterator.next(); if (super.contains(element)) { @@ -50,7 +50,7 @@ public class ExpiringSet extends HashSet { checkForExpirations(); boolean success = super.add(o); if (success) - timestamps.put(o, System.currentTimeMillis()); + timestamps.put(o, SysUtil.steadyTimeMillis()); return success; } diff --git a/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/IDBObjectStorePatched.java b/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/IDBObjectStorePatched.java deleted file mode 100644 index 4ad338a..0000000 --- a/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/IDBObjectStorePatched.java +++ /dev/null @@ -1,79 +0,0 @@ -package net.lax1dude.eaglercraft.sp; - -import org.teavm.jso.JSBody; -import org.teavm.jso.JSObject; -import org.teavm.jso.JSProperty; -import org.teavm.jso.core.JSString; -import org.teavm.jso.indexeddb.IDBCountRequest; -import org.teavm.jso.indexeddb.IDBCursorRequest; -import org.teavm.jso.indexeddb.IDBCursorSource; -import org.teavm.jso.indexeddb.IDBDatabase; -import org.teavm.jso.indexeddb.IDBGetRequest; -import org.teavm.jso.indexeddb.IDBIndex; -import org.teavm.jso.indexeddb.IDBKeyRange; -import org.teavm.jso.indexeddb.IDBObjectStoreParameters; -import org.teavm.jso.indexeddb.IDBRequest; -import org.teavm.jso.indexeddb.IDBTransaction; - -public abstract class IDBObjectStorePatched implements JSObject, IDBCursorSource { - - @JSBody(params = { "db", "name", "optionalParameters" }, script = "return db.createObjectStore(name, optionalParameters);") - public static native IDBObjectStorePatched createObjectStorePatch(IDBDatabase db, String name, IDBObjectStoreParameters optionalParameters); - - @JSBody(params = { "tx", "name" }, script = "return tx.objectStore(name);") - public static native IDBObjectStorePatched objectStorePatch(IDBTransaction tx, String name); - - @JSProperty - public abstract String getName(); - - @JSProperty("keyPath") - abstract JSObject getKeyPathImpl(); - - public final String[] getKeyPath() { - JSObject result = getKeyPathImpl(); - if (JSString.isInstance(result)) { - return new String[] { result.cast().stringValue() }; - } else { - return unwrapStringArray(result); - } - } - - @JSBody(params = { "obj" }, script = "return this;") - private static native String[] unwrapStringArray(JSObject obj); - - @JSProperty - public abstract String[] getIndexNames(); - - @JSProperty - public abstract boolean isAutoIncrement(); - - public abstract IDBRequest put(JSObject value, JSObject key); - - public abstract IDBRequest put(JSObject value); - - public abstract IDBRequest add(JSObject value, JSObject key); - - public abstract IDBRequest add(JSObject value); - - public abstract IDBRequest delete(JSObject key); - - public abstract IDBGetRequest get(JSObject key); - - public abstract IDBRequest clear(); - - public abstract IDBCursorRequest openCursor(); - - public abstract IDBCursorRequest openCursor(IDBKeyRange range); - - public abstract IDBIndex createIndex(String name, String key); - - public abstract IDBIndex createIndex(String name, String[] keys); - - public abstract IDBIndex index(String name); - - public abstract void deleteIndex(String name); - - public abstract IDBCountRequest count(); - - public abstract IDBCountRequest count(JSObject key); -} diff --git a/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/IntegratedServer.java b/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/IntegratedServer.java index f4b2598..a493094 100644 --- a/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/IntegratedServer.java +++ b/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/IntegratedServer.java @@ -11,6 +11,7 @@ import java.util.List; import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; +import java.util.zip.ZipOutputStream; import org.teavm.jso.JSBody; import org.teavm.jso.JSFunctor; @@ -32,7 +33,7 @@ import net.minecraft.src.WorldType; public class IntegratedServer { - private static final LinkedList messageQueue = new LinkedList(); + private static final LinkedList messageQueue = new LinkedList<>(); protected static class PKT { protected final String channel; @@ -70,7 +71,7 @@ public class IntegratedServer { return; } - Uint8Array a = Uint8Array.create(buf); + Uint8Array a = new Uint8Array(buf); byte[] pkt = new byte[a.getLength()]; for(int i = 0; i < pkt.length; ++i) { pkt[i] = (byte) a.get(i); @@ -107,7 +108,7 @@ public class IntegratedServer { String str = t.toString(); System.err.println("Exception was raised to client: " + str); t.printStackTrace(); - List arr = new LinkedList(); + List arr = new LinkedList<>(); for(StackTraceElement e : t.getStackTrace()) { String st = e.toString(); arr.add(st); @@ -220,7 +221,7 @@ public class IntegratedServer { } String[] worldsTxt = SYS.VFS.getFile("worlds.txt").getAllLines(); if(worldsTxt != null) { - LinkedList newWorlds = new LinkedList(); + LinkedList newWorlds = new LinkedList<>(); for(String str : worldsTxt) { if(!str.equalsIgnoreCase(pkt.worldName)) { newWorlds.add(str); @@ -240,7 +241,7 @@ public class IntegratedServer { break; }else { String[] worldsTxt = SYS.VFS.getFile("worlds.txt").getAllLines(); - LinkedList newWorlds = new LinkedList(); + LinkedList newWorlds = new LinkedList<>(); if(worldsTxt != null) { for(String str : worldsTxt) { if(pkt.copy || !str.equalsIgnoreCase(pkt.worldOldName)) { @@ -586,7 +587,6 @@ public class IntegratedServer { } break; case IPCPacket0EListWorlds.ID: { - IPCPacket0EListWorlds pkt = (IPCPacket0EListWorlds)packet; if(isServerStopped()) { String[] worlds = SYS.VFS.getFile("worlds.txt").getAllLines(); if(worlds == null || (worlds.length == 1 && worlds[0].trim().length() <= 0)) { @@ -596,8 +596,8 @@ public class IntegratedServer { sendIPCPacket(new IPCPacket16NBTList(IPCPacket16NBTList.WORLD_LIST, new LinkedList())); break; } - LinkedList updatedList = new LinkedList(); - LinkedList sendListNBT = new LinkedList(); + LinkedList updatedList = new LinkedList<>(); + LinkedList sendListNBT = new LinkedList<>(); boolean rewrite = false; for(String w : worlds) { byte[] dat = (new VFile("worlds", w, "level.dat")).getAllBytes(); @@ -683,13 +683,13 @@ public class IntegratedServer { continue; } } - long watchDog = System.currentTimeMillis(); + long watchDog = SysUtil.steadyTimeMillis(); itr = cur.iterator(); int overflow = 0; while(itr.hasNext()) { PKT msg = itr.next(); if(!msg.channel.equals("IPC")) { - if(System.currentTimeMillis() - watchDog > 500l) { + if(SysUtil.steadyTimeMillis() - watchDog > 500l) { ++overflow; continue; } @@ -720,16 +720,16 @@ public class IntegratedServer { return; } - ArrayBuffer arb = ArrayBuffer.create(serialized.length); - Uint8Array ar = Uint8Array.create(arb); + ArrayBuffer arb = new ArrayBuffer(serialized.length); + Uint8Array ar = new Uint8Array(arb); ar.set(serialized); sendWorkerPacket("IPC", arb); } public static void sendPlayerPacket(String channel, byte[] buf) { //System.out.println("[Server][SEND][" + channel + "]: " + buf.length); - ArrayBuffer arb = ArrayBuffer.create(buf.length); - Uint8Array ar = Uint8Array.create(arb); + ArrayBuffer arb = new ArrayBuffer(buf.length); + Uint8Array ar = new Uint8Array(arb); ar.set(buf); sendWorkerPacket("NET|" + channel, arb); } @@ -767,11 +767,7 @@ public class IntegratedServer { mainLoop(); - try { - Thread.sleep(1l); // allow some async to occur - }catch(InterruptedException e) { - System.err.println("you eagler"); - } + SysUtil.sleep(1); // allow some async to occur } // yee diff --git a/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/MCAConverter.java b/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/MCAConverter.java index 1931116..98680af 100644 --- a/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/MCAConverter.java +++ b/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/MCAConverter.java @@ -84,7 +84,7 @@ public class MCAConverter { byte[] readBuffer = new byte[16000]; try { - int timestamp = (int) System.currentTimeMillis(); + int timestamp = (int) (System.currentTimeMillis() / 1000); int maxX = Integer.MIN_VALUE; int maxZ = Integer.MIN_VALUE; diff --git a/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/SkinsPlugin.java b/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/SkinsPlugin.java index 9ebf9f4..b211308 100644 --- a/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/SkinsPlugin.java +++ b/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/SkinsPlugin.java @@ -10,9 +10,9 @@ import net.minecraft.src.Packet250CustomPayload; public class SkinsPlugin { - private static final HashMap skinCollection = new HashMap(); - private static final HashMap capeCollection = new HashMap(); - private static final HashMap lastSkinLayerUpdate = new HashMap(); + private static final HashMap skinCollection = new HashMap<>(); + private static final HashMap capeCollection = new HashMap<>(); + private static final HashMap lastSkinLayerUpdate = new HashMap<>(); private static final int[] SKIN_DATA_SIZE = new int[] { 64*32*4, 64*64*4, -9, -9, 1, 64*64*4, -9 }; // 128 pixel skins crash clients private static final int[] CAPE_DATA_SIZE = new int[] { 32*32*4, -9, 1 }; @@ -60,7 +60,7 @@ public class SkinsPlugin { return true; } if("EAG|SkinLayers".equals(payload.channel)) { - long millis = System.currentTimeMillis(); + long millis = SysUtil.steadyTimeMillis(); Long lsu = lastSkinLayerUpdate.get(user); if(lsu != null && millis - lsu < 700L) { // DoS protection return true; diff --git a/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/SysUtil.java b/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/SysUtil.java new file mode 100644 index 0000000..daaf099 --- /dev/null +++ b/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/SysUtil.java @@ -0,0 +1,48 @@ +package net.lax1dude.eaglercraft.sp; + +import org.teavm.interop.Async; +import org.teavm.interop.AsyncCallback; +import org.teavm.jso.JSBody; +import org.teavm.jso.JSObject; +import org.teavm.platform.Platform; +import org.teavm.platform.PlatformRunnable; + +public class SysUtil { + + private static final JSObject steadyTimeFunc = getSteadyTimeFunc(); + + @JSBody(params = { }, script = "return ((typeof performance !== \"undefined\") && (typeof performance.now === \"function\"))" + + "? performance.now.bind(performance)" + + ": (function(epochStart){ return function() { return Date.now() - epochStart; }; })(Date.now());") + private static native JSObject getSteadyTimeFunc(); + + @JSBody(params = { "steadyTimeFunc" }, script = "return steadyTimeFunc();") + private static native double steadyTimeMillis0(JSObject steadyTimeFunc); + + public static long steadyTimeMillis() { + return (long)steadyTimeMillis0(steadyTimeFunc); + } + + public static long nanoTime() { + return (long)(steadyTimeMillis0(steadyTimeFunc) * 1000000.0); + } + + @Async + public static native void sleep(int millis); + + private static void sleep(int millis, final AsyncCallback callback) { + Platform.schedule(new DumbSleepHandler(callback), millis); + } + + private static class DumbSleepHandler implements PlatformRunnable { + private final AsyncCallback callback; + private DumbSleepHandler(AsyncCallback callback) { + this.callback = callback; + } + @Override + public void run() { + callback.complete(null); + } + } + +} diff --git a/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/VFSSaveHandler.java b/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/VFSSaveHandler.java index 09a46aa..a4c8927 100644 --- a/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/VFSSaveHandler.java +++ b/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/VFSSaveHandler.java @@ -17,7 +17,7 @@ public class VFSSaveHandler implements ISaveHandler, IPlayerFileData { public final VFile worldDirectory; - private final HashMap chunkLoaders = new HashMap(); + private final HashMap chunkLoaders = new HashMap<>(); public VFSSaveHandler(VFile worldDirectory) { this.worldDirectory = worldDirectory; diff --git a/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/VFile.java b/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/VFile.java index 5aaf2e9..dac9815 100644 --- a/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/VFile.java +++ b/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/VFile.java @@ -35,7 +35,7 @@ public class VFile { protected String path; public static String createPath(Object... p) { - ArrayList r = new ArrayList(); + ArrayList r = new ArrayList<>(); for(int i = 0; i < p.length; ++i) { if(p[i] == null) { continue; diff --git a/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/VIteratorFile.java b/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/VIteratorFile.java index 9a03ef7..5ba3d8b 100644 --- a/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/VIteratorFile.java +++ b/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/VIteratorFile.java @@ -182,7 +182,7 @@ public class VIteratorFile extends VFile { throw new ArrayIndexOutOfBoundsException("Value of the fucking value of the entry is missing"); } - Uint8Array a = Uint8Array.create(arr); + Uint8Array a = new Uint8Array(arr); if(a.getLength() < fileOffset + length) { throw new ArrayIndexOutOfBoundsException("file '" + path + "' size was "+a.getLength()+" but user tried to read index "+(fileOffset + length - 1)); @@ -213,7 +213,7 @@ public class VIteratorFile extends VFile { return null; } - Uint8Array a = Uint8Array.create(arr); + Uint8Array a = new Uint8Array(arr); int ii = a.getByteLength(); byte[] array = new byte[ii]; @@ -252,8 +252,8 @@ public class VIteratorFile extends VFile { private static native JSObject writeRow(String name, ArrayBuffer data); public boolean setAllBytes(byte[] bytes) { - ArrayBuffer a = ArrayBuffer.create(bytes.length); - Uint8Array ar = Uint8Array.create(a); + ArrayBuffer a = new ArrayBuffer(bytes.length); + Uint8Array ar = new Uint8Array(a); ar.set(bytes); JSObject obj = writeRow(path, a); BooleanResult r = AsyncHandlers.awaitRequest(cur.update(obj)); diff --git a/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/VirtualFilesystem.java b/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/VirtualFilesystem.java index fe102ac..729b4b3 100644 --- a/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/VirtualFilesystem.java +++ b/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/VirtualFilesystem.java @@ -63,7 +63,7 @@ public class VirtualFilesystem { protected VFSFile(VirtualFilesystem vfs, String filePath, boolean cacheEnabled) { this.virtualFilesystem = vfs; this.filePath = filePath; - this.cacheHit = System.currentTimeMillis(); + this.cacheHit = SysUtil.steadyTimeMillis(); if(cacheEnabled) { setCacheEnabled(); } @@ -82,7 +82,7 @@ public class VirtualFilesystem { } public int getSize() { - cacheHit = System.currentTimeMillis(); + cacheHit = SysUtil.steadyTimeMillis(); if(fileSize < 0) { if(cacheEnabled) { byte[] b = getAllBytes(false); @@ -117,7 +117,7 @@ public class VirtualFilesystem { }else if(hasBeenAccessed && !exists) { throw new ArrayIndexOutOfBoundsException("file '" + filePath + "' does not exist"); } - cacheHit = System.currentTimeMillis(); + cacheHit = SysUtil.steadyTimeMillis(); if(cacheEnabled && cache != null) { System.arraycopy(cache, fileOffset, array, offset, length); }else { @@ -129,7 +129,7 @@ public class VirtualFilesystem { exists = false; throw new ArrayIndexOutOfBoundsException("file '" + filePath + "' does not exist"); } - Uint8Array a = Uint8Array.create(aa); + Uint8Array a = new Uint8Array(aa); this.fileSize = a.getByteLength(); if(cacheEnabled) { cache = new byte[fileSize]; @@ -148,7 +148,7 @@ public class VirtualFilesystem { public void setCacheEnabled() { if(!cacheEnabled && !hasBeenDeleted && !(hasBeenAccessed && !exists)) { - cacheHit = System.currentTimeMillis(); + cacheHit = SysUtil.steadyTimeMillis(); cache = getAllBytes(false); cacheEnabled = true; } @@ -170,7 +170,7 @@ public class VirtualFilesystem { if(hasBeenDeleted || (hasBeenAccessed && !exists)) { return null; } - cacheHit = System.currentTimeMillis(); + cacheHit = SysUtil.steadyTimeMillis(); if(cacheEnabled && cache != null) { byte[] b = cache; if(copy) { @@ -187,7 +187,7 @@ public class VirtualFilesystem { exists = false; return null; } - Uint8Array a = Uint8Array.create(b); + Uint8Array a = new Uint8Array(b); this.fileSize = a.getByteLength(); byte[] array = new byte[fileSize]; for(int i = 0; i < a.getByteLength(); ++i) { @@ -217,7 +217,7 @@ public class VirtualFilesystem { if(hasBeenDeleted || bytes == null) { return false; } - cacheHit = System.currentTimeMillis(); + cacheHit = SysUtil.steadyTimeMillis(); this.fileSize = bytes.length; if(cacheEnabled) { byte[] copz = bytes; @@ -228,8 +228,8 @@ public class VirtualFilesystem { cache = copz; return sync(); }else { - ArrayBuffer a = ArrayBuffer.create(bytes.length); - Uint8Array ar = Uint8Array.create(a); + ArrayBuffer a = new ArrayBuffer(bytes.length); + Uint8Array ar = new Uint8Array(a); ar.set(bytes); boolean s = AsyncHandlers.writeWholeFile(virtualFilesystem.indexeddb, filePath, a).bool; hasBeenAccessed = true; @@ -240,9 +240,9 @@ public class VirtualFilesystem { public boolean sync() { if(cacheEnabled && cache != null && !hasBeenDeleted) { - cacheHit = System.currentTimeMillis(); - ArrayBuffer a = ArrayBuffer.create(cache.length); - Uint8Array ar = Uint8Array.create(a); + cacheHit = SysUtil.steadyTimeMillis(); + ArrayBuffer a = new ArrayBuffer(cache.length); + Uint8Array ar = new Uint8Array(a); ar.set(cache); boolean tryWrite = AsyncHandlers.writeWholeFile(virtualFilesystem.indexeddb, filePath, a).bool; hasBeenAccessed = true; @@ -254,7 +254,7 @@ public class VirtualFilesystem { public boolean delete() { if(!hasBeenDeleted && !(hasBeenAccessed && !exists)) { - cacheHit = System.currentTimeMillis(); + cacheHit = SysUtil.steadyTimeMillis(); if(!AsyncHandlers.deleteFile(virtualFilesystem.indexeddb, filePath).bool) { hasBeenAccessed = true; return false; @@ -270,7 +270,7 @@ public class VirtualFilesystem { public boolean rename(String newName, boolean copy) { if(!hasBeenDeleted && !(hasBeenAccessed && !exists)) { - cacheHit = System.currentTimeMillis(); + cacheHit = SysUtil.steadyTimeMillis(); ArrayBuffer arr = AsyncHandlers.readWholeFile(virtualFilesystem.indexeddb, filePath); hasBeenAccessed = true; if(arr != null) { @@ -298,7 +298,7 @@ public class VirtualFilesystem { if(hasBeenDeleted) { return false; } - cacheHit = System.currentTimeMillis(); + cacheHit = SysUtil.steadyTimeMillis(); if(hasBeenAccessed) { return exists; } @@ -309,7 +309,7 @@ public class VirtualFilesystem { } - private final HashMap fileMap = new HashMap(); + private final HashMap fileMap = new HashMap<>(); public final String database; private final IDBDatabase indexeddb; @@ -395,7 +395,7 @@ public class VirtualFilesystem { } public List listFiles(String prefix) { - final ArrayList list = new ArrayList(); + final ArrayList list = new ArrayList<>(); AsyncHandlers.iterateFiles(indexeddb, this, prefix, false, (v) -> { list.add(v.getPath()); }); @@ -425,7 +425,7 @@ public class VirtualFilesystem { } public void flushCache(long age) { - long curr = System.currentTimeMillis(); + long curr = SysUtil.steadyTimeMillis(); Iterator files = fileMap.values().iterator(); while(files.hasNext()) { if(curr - files.next().cacheHit > age) { @@ -487,7 +487,7 @@ public class VirtualFilesystem { f.setOnUpgradeNeeded(new EventListener() { @Override public void handleEvent(IDBVersionChangeEvent evt) { - IDBObjectStorePatched.createObjectStorePatch(f.getResult(), "filesystem", IDBObjectStoreParameters.create().keyPath("path")); + f.getResult().createObjectStore("filesystem", IDBObjectStoreParameters.create().keyPath("path")); } }); } @@ -497,7 +497,7 @@ public class VirtualFilesystem { private static void deleteFile(IDBDatabase db, String name, final AsyncCallback cb) { IDBTransaction tx = db.transaction("filesystem", "readwrite"); - final IDBRequest r = IDBObjectStorePatched.objectStorePatch(tx, "filesystem").delete(makeTheFuckingKeyWork(name)); + final IDBRequest r = tx.objectStore("filesystem").delete(makeTheFuckingKeyWork(name)); r.setOnSuccess(new EventHandler() { @Override @@ -524,7 +524,7 @@ public class VirtualFilesystem { private static void readWholeFile(IDBDatabase db, String name, final AsyncCallback cb) { IDBTransaction tx = db.transaction("filesystem", "readonly"); - final IDBGetRequest r = IDBObjectStorePatched.objectStorePatch(tx, "filesystem").get(makeTheFuckingKeyWork(name)); + final IDBGetRequest r = tx.objectStore("filesystem").get(makeTheFuckingKeyWork(name)); r.setOnSuccess(new EventHandler() { @Override public void handleEvent() { @@ -551,7 +551,7 @@ public class VirtualFilesystem { private static void iterateFiles(IDBDatabase db, final VirtualFilesystem vfs, final String prefix, boolean rw, final VFSIterator itr, final AsyncCallback cb) { IDBTransaction tx = db.transaction("filesystem", rw ? "readwrite" : "readonly"); - final IDBCursorRequest r = IDBObjectStorePatched.objectStorePatch(tx, "filesystem").openCursor(); + final IDBCursorRequest r = tx.objectStore("filesystem").openCursor(); final int[] res = new int[1]; r.setOnSuccess(new EventHandler() { @Override @@ -589,7 +589,7 @@ public class VirtualFilesystem { private static void deleteFiles(IDBDatabase db, final String prefix, final AsyncCallback cb) { IDBTransaction tx = db.transaction("filesystem", "readwrite"); - final IDBCursorRequest r = IDBObjectStorePatched.objectStorePatch(tx, "filesystem").openCursor(); + final IDBCursorRequest r = tx.objectStore("filesystem").openCursor(); final int[] res = new int[1]; r.setOnSuccess(new EventHandler() { @Override @@ -622,7 +622,7 @@ public class VirtualFilesystem { private static void fileExists(IDBDatabase db, String name, final AsyncCallback cb) { IDBTransaction tx = db.transaction("filesystem", "readonly"); - final IDBCountRequest r = IDBObjectStorePatched.objectStorePatch(tx, "filesystem").count(makeTheFuckingKeyWork(name)); + final IDBCountRequest r = tx.objectStore("filesystem").count(makeTheFuckingKeyWork(name)); r.setOnSuccess(new EventHandler() { @Override public void handleEvent() { @@ -645,7 +645,7 @@ public class VirtualFilesystem { private static void writeWholeFile(IDBDatabase db, String name, ArrayBuffer data, final AsyncCallback cb) { IDBTransaction tx = db.transaction("filesystem", "readwrite"); - final IDBRequest r = IDBObjectStorePatched.objectStorePatch(tx, "filesystem").put(writeRow(name, data)); + final IDBRequest r = tx.objectStore("filesystem").put(writeRow(name, data)); r.setOnSuccess(new EventHandler() { @Override diff --git a/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/VoiceChatPlugin.java b/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/VoiceChatPlugin.java index a7a0ba5..a786875 100644 --- a/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/VoiceChatPlugin.java +++ b/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/VoiceChatPlugin.java @@ -26,7 +26,7 @@ public class VoiceChatPlugin { private static final Map> voiceRequests = new HashMap<>(); private static final Set voicePairs = new HashSet<>(); - private static final List iceServers = new ArrayList(); + private static final List iceServers = new ArrayList<>(); private static final int VOICE_SIGNAL_ALLOWED = 0; private static final int VOICE_SIGNAL_REQUEST = 0; diff --git a/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/WorkerListenThread.java b/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/WorkerListenThread.java index 3368ff7..ea49888 100644 --- a/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/WorkerListenThread.java +++ b/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/WorkerListenThread.java @@ -8,7 +8,6 @@ import java.util.List; import net.minecraft.server.MinecraftServer; import net.minecraft.src.NetHandler; -import net.minecraft.src.NetServerHandler; public class WorkerListenThread { /** Reference to the MinecraftServer object. */ @@ -82,7 +81,7 @@ public class WorkerListenThread { deleteDeadConnections(); - List conns = new ArrayList(this.connections); + List conns = new ArrayList<>(this.connections); for (NetHandler var2 : conns) { var2.handlePackets(); } diff --git a/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/WorkerNetworkManager.java b/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/WorkerNetworkManager.java index e4cee94..a85f6dd 100644 --- a/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/WorkerNetworkManager.java +++ b/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/WorkerNetworkManager.java @@ -6,8 +6,6 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.LinkedList; -import java.util.UnknownFormatConversionException; - import net.lax1dude.eaglercraft.sp.ipc.IPCPacket0CPlayerChannel; import net.minecraft.server.MinecraftServer; import net.minecraft.src.INetworkManager; @@ -15,7 +13,6 @@ import net.minecraft.src.NetHandler; import net.minecraft.src.NetLoginHandler; import net.minecraft.src.NetServerHandler; import net.minecraft.src.Packet; -import net.minecraft.src.Packet204ClientInfo; public class WorkerNetworkManager implements INetworkManager { @@ -25,7 +22,7 @@ public class WorkerNetworkManager implements INetworkManager { private boolean isAlive; private WorkerListenThread listenThread; - private LinkedList frags = new LinkedList(); + private LinkedList frags = new LinkedList<>(); public WorkerNetworkManager(String ipcChannel, MinecraftServer srv, WorkerListenThread th) { this.ipcChannel = ipcChannel; diff --git a/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/ZipOutputStream.java b/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/ZipOutputStream.java deleted file mode 100644 index 3672b5f..0000000 --- a/sp-server/src/main/java/net/lax1dude/eaglercraft/sp/ZipOutputStream.java +++ /dev/null @@ -1,327 +0,0 @@ -package net.lax1dude.eaglercraft.sp; - -import static java.util.zip.Deflater.BEST_COMPRESSION; -import static java.util.zip.Deflater.DEFAULT_COMPRESSION; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.List; -import java.util.zip.ZipEntry; -import java.util.zip.ZipException; - -import com.jcraft.jzlib.Deflater; -import com.jcraft.jzlib.DeflaterOutputStream; - -public class ZipOutputStream extends DeflaterOutputStream { - long LOCSIG = 0x4034b50; - long EXTSIG = 0x8074b50; - long CENSIG = 0x2014b50; - long ENDSIG = 0x6054b50; - - int LOCHDR = 30; - int EXTHDR = 16; - - public static final int DEFLATED = 8; - public static final int STORED = 0; - - static final int ZIPDataDescriptorFlag = 8; - static final int ZIPLocalHeaderVersionNeeded = 20; - private String comment; - private final List entries = new ArrayList<>(); - private int compressMethod = DEFLATED; - private int compressLevel = -1; - private ByteArrayOutputStream cDir = new ByteArrayOutputStream(); - private ZipEntry currentEntry; - private final CRC32 crc = new CRC32(); - private int offset; - private int curOffset; - private int nameLength; - private byte[] nameBytes; - - public ZipOutputStream(OutputStream p1) throws IOException { - super(p1, new Deflater(-1, true)); - } - - @Override - public void close() throws IOException { - if (out != null) { - finish(); - out.close(); - out = null; - } - } - - public void closeEntry() throws IOException { - if (cDir == null) { - throw new IOException(); - } - if (currentEntry == null) { - return; - } - if (currentEntry.getMethod() == DEFLATED) { - super.finish(); - } - - // Verify values for STORED types - if (currentEntry.getMethod() == STORED) { - if (crc.getValue() != currentEntry.getCrc()) { - throw new ZipException(); - } - if (currentEntry.getSize() != crc.tbytes) { - throw new ZipException(); - } - } - curOffset = LOCHDR; - - // Write the DataDescriptor - if (currentEntry.getMethod() != STORED) { - curOffset += EXTHDR; - writeLong(out, EXTSIG); - currentEntry.setCrc(crc.getValue()); - writeLong(out, currentEntry.getCrc()); - currentEntry.setCompressedSize(deflater.getTotalOut()); - writeLong(out, currentEntry.getCompressedSize()); - currentEntry.setSize(deflater.getTotalIn()); - writeLong(out, currentEntry.getSize()); - } - // Update the CentralDirectory - writeLong(cDir, CENSIG); - writeShort(cDir, ZIPLocalHeaderVersionNeeded); // Version created - writeShort(cDir, ZIPLocalHeaderVersionNeeded); // Version to extract - writeShort(cDir, currentEntry.getMethod() == STORED ? 0 : ZIPDataDescriptorFlag); - writeShort(cDir, currentEntry.getMethod()); - writeShort(cDir, (int) currentEntry.getTime()); - writeShort(cDir, 0); - writeLong(cDir, crc.getValue()); - if (currentEntry.getMethod() == DEFLATED) { - curOffset += writeLong(cDir, deflater.getTotalOut()); - writeLong(cDir, deflater.getTotalIn()); - } else { - curOffset += writeLong(cDir, crc.tbytes); - writeLong(cDir, crc.tbytes); - } - curOffset += writeShort(cDir, nameLength); - if (currentEntry.getExtra() != null) { - curOffset += writeShort(cDir, currentEntry.getExtra().length); - } else { - writeShort(cDir, 0); - } - String c = currentEntry.getComment(); - writeShort(cDir, c != null ? c.length() : 0); - writeShort(cDir, 0); // Disk Start - writeShort(cDir, 0); // Internal File Attributes - writeLong(cDir, 0); // External File Attributes - writeLong(cDir, offset); - cDir.write(nameBytes); - nameBytes = null; - if (currentEntry.getExtra() != null) { - cDir.write(currentEntry.getExtra()); - } - offset += curOffset; - if (c != null) { - cDir.write(c.getBytes()); - } - currentEntry = null; - crc.reset(); - deflater.end(); - deflater.init(-1, true); - } - - @Override - public void finish() throws IOException { - if (out == null) { - throw new IOException(); - } - if (cDir == null) { - return; - } - if (entries.size() == 0) { - throw new ZipException(); - } - if (currentEntry != null) { - closeEntry(); - } - int cdirSize = cDir.size(); - // Write Central Dir End - writeLong(cDir, ENDSIG); - writeShort(cDir, 0); // Disk Number - writeShort(cDir, 0); // Start Disk - writeShort(cDir, entries.size()); // Number of entries - writeShort(cDir, entries.size()); // Number of entries - writeLong(cDir, cdirSize); // Size of central dir - writeLong(cDir, offset); // Offset of central dir - if (comment != null) { - writeShort(cDir, comment.length()); - cDir.write(comment.getBytes()); - } else { - writeShort(cDir, 0); - } - // Write the central dir - out.write(cDir.toByteArray()); - cDir = null; - - } - - public void putNextEntry(ZipEntry ze) throws IOException { - if (currentEntry != null) { - closeEntry(); - } - if (ze.getMethod() == STORED || (compressMethod == STORED && ze.getMethod() == -1)) { - if (ze.getCrc() == -1) { - throw new ZipException("Crc mismatch"); - } - if (ze.getSize() == -1 && ze.getCompressedSize() == -1) { - throw new ZipException("Size mismatch"); - } - if (ze.getSize() != ze.getCompressedSize() && ze.getCompressedSize() != -1 && ze.getSize() != -1) { - throw new ZipException("Size mismatch"); - } - } - if (cDir == null) { - throw new IOException("Stream is closed"); - } - if (entries.contains(ze.getName())) { - throw new ZipException("Entry already exists: " + ze.getName()); - } - nameLength = utf8Count(ze.getName()); - if (nameLength > 0xffff) { - throw new IllegalArgumentException("Name too long: " + ze.getName()); - } - - deflater.params(compressLevel, 0); - currentEntry = ze; - entries.add(currentEntry.getName()); - if (currentEntry.getMethod() == -1) { - currentEntry.setMethod(compressMethod); - } - writeLong(out, LOCSIG); // Entry header - writeShort(out, ZIPLocalHeaderVersionNeeded); // Extraction version - writeShort(out, currentEntry.getMethod() == STORED ? 0 : ZIPDataDescriptorFlag); - writeShort(out, currentEntry.getMethod()); - if (currentEntry.getTime() == -1) { - currentEntry.setTime(System.currentTimeMillis()); - } - writeShort(out, (int) currentEntry.getTime()); - writeShort(out, 0); - - if (currentEntry.getMethod() == STORED) { - if (currentEntry.getSize() == -1) { - currentEntry.setSize(currentEntry.getCompressedSize()); - } else if (currentEntry.getCompressedSize() == -1) { - currentEntry.setCompressedSize(currentEntry.getSize()); - } - writeLong(out, currentEntry.getCrc()); - writeLong(out, currentEntry.getSize()); - writeLong(out, currentEntry.getSize()); - } else { - writeLong(out, 0); - writeLong(out, 0); - writeLong(out, 0); - } - writeShort(out, nameLength); - writeShort(out, currentEntry.getExtra() != null ? currentEntry.getExtra().length : 0); - nameBytes = toUTF8Bytes(currentEntry.getName(), nameLength); - out.write(nameBytes); - if (currentEntry.getExtra() != null) { - out.write(currentEntry.getExtra()); - } - } - - public void setComment(String comment) { - if (comment.length() > 0xFFFF) { - throw new IllegalArgumentException(); - } - this.comment = comment; - } - - public void setLevel(int level) { - if (level < DEFAULT_COMPRESSION || level > BEST_COMPRESSION) { - throw new IllegalArgumentException(); - } - compressLevel = level; - } - - public void setMethod(int method) { - if (method != STORED && method != DEFLATED) { - throw new IllegalArgumentException(); - } - compressMethod = method; - - } - - private long writeLong(OutputStream os, long i) throws IOException { - // Write out the long value as an unsigned int - os.write((int) (i & 0xFF)); - os.write((int) (i >> 8) & 0xFF); - os.write((int) (i >> 16) & 0xFF); - os.write((int) (i >> 24) & 0xFF); - return i; - } - - private int writeShort(OutputStream os, int i) throws IOException { - os.write(i & 0xFF); - os.write((i >> 8) & 0xFF); - return i; - - } - - /** - * Writes data for the current entry to the underlying stream. - * - * @exception IOException If an error occurs writing to the stream - */ - @Override - public void write(byte[] buffer, int off, int nbytes) throws IOException { - // avoid int overflow, check null buf - if ((off < 0 || (nbytes < 0) || off > buffer.length) || (buffer.length - off < nbytes)) { - throw new IndexOutOfBoundsException(); - } - - if (currentEntry == null) { - throw new ZipException("No active entry"); - } - - if (currentEntry.getMethod() == STORED) { - out.write(buffer, off, nbytes); - } else { - super.write(buffer, off, nbytes); - } - crc.update(buffer, off, nbytes); - } - - static int utf8Count(String value) { - int total = 0; - for (int i = value.length(); --i >= 0;) { - char ch = value.charAt(i); - if (ch < 0x80) { - total++; - } else if (ch < 0x800) { - total += 2; - } else { - total += 3; - } - } - return total; - } - - static byte[] toUTF8Bytes(String value, int length) { - byte[] result = new byte[length]; - int pos = result.length; - for (int i = value.length(); --i >= 0;) { - char ch = value.charAt(i); - if (ch < 0x80) { - result[--pos] = (byte) ch; - } else if (ch < 0x800) { - result[--pos] = (byte) (0x80 | (ch & 0x3f)); - result[--pos] = (byte) (0xc0 | (ch >> 6)); - } else { - result[--pos] = (byte) (0x80 | (ch & 0x3f)); - result[--pos] = (byte) (0x80 | ((ch >> 6) & 0x3f)); - result[--pos] = (byte) (0xe0 | (ch >> 12)); - } - } - return result; - } -} diff --git a/sp-server/src/main/java/net/minecraft/server/MinecraftServer.java b/sp-server/src/main/java/net/minecraft/server/MinecraftServer.java index 0d63416..bc21910 100644 --- a/sp-server/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/sp-server/src/main/java/net/minecraft/server/MinecraftServer.java @@ -8,6 +8,7 @@ import java.util.List; import net.lax1dude.eaglercraft.sp.IntegratedServer; import net.lax1dude.eaglercraft.sp.SYS; +import net.lax1dude.eaglercraft.sp.SysUtil; import net.lax1dude.eaglercraft.sp.VFSSaveHandler; import net.lax1dude.eaglercraft.sp.VFile; import net.lax1dude.eaglercraft.sp.WorkerListenThread; @@ -355,10 +356,10 @@ public abstract class MinecraftServer implements ICommandSender, Runnable { public void run() { try { if (this.startServer()) { - long var1 = System.currentTimeMillis(); + long var1 = SysUtil.steadyTimeMillis(); for (long var50 = 0L; this.serverRunning; this.serverIsRunning = true) { - long var5 = System.currentTimeMillis(); + long var5 = SysUtil.steadyTimeMillis(); long var7 = var5 - var1; if (var7 > 2000L && var1 - this.timeOfLastWarning >= 15000L) { @@ -386,7 +387,7 @@ public abstract class MinecraftServer implements ICommandSender, Runnable { } } - Thread.sleep(1L); + SysUtil.sleep(1); } } else { throw new RuntimeException("Server did not init correctly"); @@ -456,7 +457,7 @@ public abstract class MinecraftServer implements ICommandSender, Runnable { this.theProfiler.endSection(); ++tpsCounter; - long millis = System.currentTimeMillis(); + long millis = SysUtil.steadyTimeMillis(); long elapsed = millis - tpsTimer; if(elapsed >= 1000l) { tpsTimer = millis; diff --git a/sp-server/src/main/java/net/minecraft/src/BiomeCache.java b/sp-server/src/main/java/net/minecraft/src/BiomeCache.java index 2b1493c..e2a8060 100644 --- a/sp-server/src/main/java/net/minecraft/src/BiomeCache.java +++ b/sp-server/src/main/java/net/minecraft/src/BiomeCache.java @@ -3,6 +3,8 @@ package net.minecraft.src; import java.util.ArrayList; import java.util.List; +import net.lax1dude.eaglercraft.sp.SysUtil; + public class BiomeCache { /** Reference to the WorldChunkManager */ private final WorldChunkManager chunkManager; @@ -38,7 +40,7 @@ public class BiomeCache { this.cache.add(var5); } - var5.lastAccessTime = System.currentTimeMillis(); + var5.lastAccessTime = SysUtil.steadyTimeMillis(); return var5; } @@ -54,7 +56,7 @@ public class BiomeCache { * least 30 seconds. */ public void cleanupCache() { - long var1 = System.currentTimeMillis(); + long var1 = SysUtil.steadyTimeMillis(); long var3 = var1 - this.lastCleanupTime; if (var3 > 7500L || var3 < 0L) { diff --git a/sp-server/src/main/java/net/minecraft/src/ChunkProviderServer.java b/sp-server/src/main/java/net/minecraft/src/ChunkProviderServer.java index 3f26403..f9b54c3 100644 --- a/sp-server/src/main/java/net/minecraft/src/ChunkProviderServer.java +++ b/sp-server/src/main/java/net/minecraft/src/ChunkProviderServer.java @@ -7,6 +7,8 @@ import java.util.Iterator; import java.util.List; import java.util.Set; +import net.lax1dude.eaglercraft.sp.SysUtil; + public class ChunkProviderServer implements IChunkProvider { private Set droppedChunksSet = new HashSet(); @@ -227,7 +229,7 @@ public class ChunkProviderServer implements IChunkProvider { public boolean unloadQueuedChunks() { if (!this.worldObj.levelSaving) { - long millis = System.currentTimeMillis(); + long millis = SysUtil.steadyTimeMillis(); if(millis - fixTheFuckingMemoryLeak > 10000l) { // FUCK OFF SUCK MY FUCKING COCK fixTheFuckingMemoryLeak = millis; this.id2ChunkMap.iterate((l,o) -> { diff --git a/sp-server/src/main/java/net/minecraft/src/CommandDebug.java b/sp-server/src/main/java/net/minecraft/src/CommandDebug.java index 6012822..d57ec58 100644 --- a/sp-server/src/main/java/net/minecraft/src/CommandDebug.java +++ b/sp-server/src/main/java/net/minecraft/src/CommandDebug.java @@ -2,6 +2,7 @@ package net.minecraft.src; import java.util.List; +import net.lax1dude.eaglercraft.sp.SysUtil; import net.minecraft.server.MinecraftServer; public class CommandDebug extends CommandBase { @@ -27,7 +28,7 @@ public class CommandDebug extends CommandBase { if (par2ArrayOfStr[0].equals("start")) { notifyAdmins(par1ICommandSender, "commands.debug.start", new Object[0]); MinecraftServer.getServer().enableProfiling(); - this.startTime = System.currentTimeMillis(); + this.startTime = SysUtil.steadyTimeMillis(); this.startTicks = MinecraftServer.getServer().getTickCounter(); return; } @@ -37,7 +38,7 @@ public class CommandDebug extends CommandBase { throw new CommandException("commands.debug.notStarted", new Object[0]); } - long var3 = System.currentTimeMillis(); + long var3 = SysUtil.steadyTimeMillis(); int var5 = MinecraftServer.getServer().getTickCounter(); long var6 = var3 - this.startTime; int var8 = var5 - this.startTicks; diff --git a/sp-server/src/main/java/net/minecraft/src/ConvertingProgressUpdate.java b/sp-server/src/main/java/net/minecraft/src/ConvertingProgressUpdate.java index 4ffd3f8..ada3d1d 100644 --- a/sp-server/src/main/java/net/minecraft/src/ConvertingProgressUpdate.java +++ b/sp-server/src/main/java/net/minecraft/src/ConvertingProgressUpdate.java @@ -1,5 +1,6 @@ package net.minecraft.src; +import net.lax1dude.eaglercraft.sp.SysUtil; import net.minecraft.server.MinecraftServer; public class ConvertingProgressUpdate implements IProgressUpdate { @@ -10,7 +11,7 @@ public class ConvertingProgressUpdate implements IProgressUpdate { public ConvertingProgressUpdate(MinecraftServer par1) { this.mcServer = par1; - this.field_96245_b = System.currentTimeMillis(); + this.field_96245_b = SysUtil.steadyTimeMillis(); } /** @@ -24,8 +25,9 @@ public class ConvertingProgressUpdate implements IProgressUpdate { * loadProgress */ public void setLoadingProgress(int par1) { - if (System.currentTimeMillis() - this.field_96245_b >= 1000L) { - this.field_96245_b = System.currentTimeMillis(); + long l = SysUtil.steadyTimeMillis(); + if (l - this.field_96245_b >= 1000L) { + this.field_96245_b = l; this.mcServer.getLogAgent().func_98233_a("Converting... " + par1 + "%"); } } diff --git a/sp-server/src/main/java/net/minecraft/src/EntityAgeable.java b/sp-server/src/main/java/net/minecraft/src/EntityAgeable.java index 1b130d1..cb6ea86 100644 --- a/sp-server/src/main/java/net/minecraft/src/EntityAgeable.java +++ b/sp-server/src/main/java/net/minecraft/src/EntityAgeable.java @@ -49,7 +49,7 @@ public abstract class EntityAgeable extends EntityCreature { protected void entityInit() { super.entityInit(); - this.dataWatcher.addObject(12, new Integer(0)); + this.dataWatcher.addObject(12, Integer.valueOf(0)); } /** diff --git a/sp-server/src/main/java/net/minecraft/src/EntityBat.java b/sp-server/src/main/java/net/minecraft/src/EntityBat.java index 2a80260..0062f8f 100644 --- a/sp-server/src/main/java/net/minecraft/src/EntityBat.java +++ b/sp-server/src/main/java/net/minecraft/src/EntityBat.java @@ -15,7 +15,7 @@ public class EntityBat extends EntityAmbientCreature { protected void entityInit() { super.entityInit(); - this.dataWatcher.addObject(16, new Byte((byte) 0)); + this.dataWatcher.addObject(16, Byte.valueOf((byte) 0)); } /** diff --git a/sp-server/src/main/java/net/minecraft/src/EntityBlaze.java b/sp-server/src/main/java/net/minecraft/src/EntityBlaze.java index a6554b0..e821e78 100644 --- a/sp-server/src/main/java/net/minecraft/src/EntityBlaze.java +++ b/sp-server/src/main/java/net/minecraft/src/EntityBlaze.java @@ -21,7 +21,7 @@ public class EntityBlaze extends EntityMob { protected void entityInit() { super.entityInit(); - this.dataWatcher.addObject(16, new Byte((byte) 0)); + this.dataWatcher.addObject(16, Byte.valueOf((byte) 0)); } /** diff --git a/sp-server/src/main/java/net/minecraft/src/EntityBoat.java b/sp-server/src/main/java/net/minecraft/src/EntityBoat.java index 9dabeee..0172a1b 100644 --- a/sp-server/src/main/java/net/minecraft/src/EntityBoat.java +++ b/sp-server/src/main/java/net/minecraft/src/EntityBoat.java @@ -30,9 +30,9 @@ public class EntityBoat extends Entity { } protected void entityInit() { - this.dataWatcher.addObject(17, new Integer(0)); - this.dataWatcher.addObject(18, new Integer(1)); - this.dataWatcher.addObject(19, new Integer(0)); + this.dataWatcher.addObject(17, Integer.valueOf(0)); + this.dataWatcher.addObject(18, Integer.valueOf(1)); + this.dataWatcher.addObject(19, Integer.valueOf(0)); } /** diff --git a/sp-server/src/main/java/net/minecraft/src/EntityDragon.java b/sp-server/src/main/java/net/minecraft/src/EntityDragon.java index 25b5f05..9e1d28e 100644 --- a/sp-server/src/main/java/net/minecraft/src/EntityDragon.java +++ b/sp-server/src/main/java/net/minecraft/src/EntityDragon.java @@ -82,7 +82,7 @@ public class EntityDragon extends EntityLiving implements IEntityMultiPart { protected void entityInit() { super.entityInit(); - this.dataWatcher.addObject(16, new Integer(this.getMaxHealth())); + this.dataWatcher.addObject(16, Integer.valueOf(this.getMaxHealth())); } /** diff --git a/sp-server/src/main/java/net/minecraft/src/EntityEnderman.java b/sp-server/src/main/java/net/minecraft/src/EntityEnderman.java index b2e705f..c78d98c 100644 --- a/sp-server/src/main/java/net/minecraft/src/EntityEnderman.java +++ b/sp-server/src/main/java/net/minecraft/src/EntityEnderman.java @@ -25,9 +25,9 @@ public class EntityEnderman extends EntityMob { protected void entityInit() { super.entityInit(); - this.dataWatcher.addObject(16, new Byte((byte) 0)); - this.dataWatcher.addObject(17, new Byte((byte) 0)); - this.dataWatcher.addObject(18, new Byte((byte) 0)); + this.dataWatcher.addObject(16, Byte.valueOf((byte) 0)); + this.dataWatcher.addObject(17, Byte.valueOf((byte) 0)); + this.dataWatcher.addObject(18, Byte.valueOf((byte) 0)); } /** diff --git a/sp-server/src/main/java/net/minecraft/src/EntityMinecart.java b/sp-server/src/main/java/net/minecraft/src/EntityMinecart.java index 6128e20..b69a856 100644 --- a/sp-server/src/main/java/net/minecraft/src/EntityMinecart.java +++ b/sp-server/src/main/java/net/minecraft/src/EntityMinecart.java @@ -70,11 +70,11 @@ public abstract class EntityMinecart extends Entity { } protected void entityInit() { - this.dataWatcher.addObject(17, new Integer(0)); - this.dataWatcher.addObject(18, new Integer(1)); - this.dataWatcher.addObject(19, new Integer(0)); - this.dataWatcher.addObject(20, new Integer(0)); - this.dataWatcher.addObject(21, new Integer(6)); + this.dataWatcher.addObject(17, Integer.valueOf(0)); + this.dataWatcher.addObject(18, Integer.valueOf(1)); + this.dataWatcher.addObject(19, Integer.valueOf(0)); + this.dataWatcher.addObject(20, Integer.valueOf(0)); + this.dataWatcher.addObject(21, Integer.valueOf(6)); this.dataWatcher.addObject(22, Byte.valueOf((byte) 0)); } diff --git a/sp-server/src/main/java/net/minecraft/src/EntityMinecartFurnace.java b/sp-server/src/main/java/net/minecraft/src/EntityMinecartFurnace.java index 486ad03..db8d4e1 100644 --- a/sp-server/src/main/java/net/minecraft/src/EntityMinecartFurnace.java +++ b/sp-server/src/main/java/net/minecraft/src/EntityMinecartFurnace.java @@ -19,7 +19,7 @@ public class EntityMinecartFurnace extends EntityMinecart { protected void entityInit() { super.entityInit(); - this.dataWatcher.addObject(16, new Byte((byte) 0)); + this.dataWatcher.addObject(16, Byte.valueOf((byte) 0)); } /** diff --git a/sp-server/src/main/java/net/minecraft/src/EntitySheep.java b/sp-server/src/main/java/net/minecraft/src/EntitySheep.java index 7877881..2cdd677 100644 --- a/sp-server/src/main/java/net/minecraft/src/EntitySheep.java +++ b/sp-server/src/main/java/net/minecraft/src/EntitySheep.java @@ -74,7 +74,7 @@ public class EntitySheep extends EntityAnimal { protected void entityInit() { super.entityInit(); - this.dataWatcher.addObject(16, new Byte((byte) 0)); + this.dataWatcher.addObject(16, Byte.valueOf((byte) 0)); } /** diff --git a/sp-server/src/main/java/net/minecraft/src/EntitySkeleton.java b/sp-server/src/main/java/net/minecraft/src/EntitySkeleton.java index d1453e4..509d884 100644 --- a/sp-server/src/main/java/net/minecraft/src/EntitySkeleton.java +++ b/sp-server/src/main/java/net/minecraft/src/EntitySkeleton.java @@ -27,7 +27,7 @@ public class EntitySkeleton extends EntityMob implements IRangedAttackMob { protected void entityInit() { super.entityInit(); - this.dataWatcher.addObject(13, new Byte((byte) 0)); + this.dataWatcher.addObject(13, Byte.valueOf((byte) 0)); } /** diff --git a/sp-server/src/main/java/net/minecraft/src/EntitySlime.java b/sp-server/src/main/java/net/minecraft/src/EntitySlime.java index 5eb2c3a..7b381ad 100644 --- a/sp-server/src/main/java/net/minecraft/src/EntitySlime.java +++ b/sp-server/src/main/java/net/minecraft/src/EntitySlime.java @@ -21,11 +21,11 @@ public class EntitySlime extends EntityLiving implements IMob { protected void entityInit() { super.entityInit(); - this.dataWatcher.addObject(16, new Byte((byte) 1)); + this.dataWatcher.addObject(16, Byte.valueOf((byte) 1)); } protected void setSlimeSize(int par1) { - this.dataWatcher.updateObject(16, new Byte((byte) par1)); + this.dataWatcher.updateObject(16, Byte.valueOf((byte) par1)); this.setSize(0.6F * (float) par1, 0.6F * (float) par1); this.setPosition(this.posX, this.posY, this.posZ); this.setEntityHealth(this.getMaxHealth()); diff --git a/sp-server/src/main/java/net/minecraft/src/EntitySpider.java b/sp-server/src/main/java/net/minecraft/src/EntitySpider.java index bd61884..78b6cd6 100644 --- a/sp-server/src/main/java/net/minecraft/src/EntitySpider.java +++ b/sp-server/src/main/java/net/minecraft/src/EntitySpider.java @@ -10,7 +10,7 @@ public class EntitySpider extends EntityMob { protected void entityInit() { super.entityInit(); - this.dataWatcher.addObject(16, new Byte((byte) 0)); + this.dataWatcher.addObject(16, Byte.valueOf((byte) 0)); } /** diff --git a/sp-server/src/main/java/net/minecraft/src/EntityWither.java b/sp-server/src/main/java/net/minecraft/src/EntityWither.java index 9679983..a9ab794 100644 --- a/sp-server/src/main/java/net/minecraft/src/EntityWither.java +++ b/sp-server/src/main/java/net/minecraft/src/EntityWither.java @@ -35,11 +35,11 @@ public class EntityWither extends EntityMob implements IRangedAttackMob { protected void entityInit() { super.entityInit(); - this.dataWatcher.addObject(16, new Integer(100)); - this.dataWatcher.addObject(17, new Integer(0)); - this.dataWatcher.addObject(18, new Integer(0)); - this.dataWatcher.addObject(19, new Integer(0)); - this.dataWatcher.addObject(20, new Integer(0)); + this.dataWatcher.addObject(16, Integer.valueOf(100)); + this.dataWatcher.addObject(17, Integer.valueOf(0)); + this.dataWatcher.addObject(18, Integer.valueOf(0)); + this.dataWatcher.addObject(19, Integer.valueOf(0)); + this.dataWatcher.addObject(20, Integer.valueOf(0)); } /** diff --git a/sp-server/src/main/java/net/minecraft/src/EntityWolf.java b/sp-server/src/main/java/net/minecraft/src/EntityWolf.java index 5b2b433..02094e2 100644 --- a/sp-server/src/main/java/net/minecraft/src/EntityWolf.java +++ b/sp-server/src/main/java/net/minecraft/src/EntityWolf.java @@ -67,9 +67,9 @@ public class EntityWolf extends EntityTameable { protected void entityInit() { super.entityInit(); - this.dataWatcher.addObject(18, new Integer(this.getHealth())); - this.dataWatcher.addObject(19, new Byte((byte) 0)); - this.dataWatcher.addObject(20, new Byte((byte) BlockCloth.getBlockFromDye(1))); + this.dataWatcher.addObject(18, Integer.valueOf(this.getHealth())); + this.dataWatcher.addObject(19, Byte.valueOf((byte) 0)); + this.dataWatcher.addObject(20, Byte.valueOf((byte) BlockCloth.getBlockFromDye(1))); } /** diff --git a/sp-server/src/main/java/net/minecraft/src/Packet.java b/sp-server/src/main/java/net/minecraft/src/Packet.java index d1d8dbe..5acefce 100644 --- a/sp-server/src/main/java/net/minecraft/src/Packet.java +++ b/sp-server/src/main/java/net/minecraft/src/Packet.java @@ -10,6 +10,8 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; +import net.lax1dude.eaglercraft.sp.SysUtil; + public abstract class Packet { /** Maps packet id to packet class */ public static IntHashMap packetIdToClassMap = new IntHashMap(); @@ -25,7 +27,7 @@ public abstract class Packet { public ILogAgent field_98193_m; /** the system time in milliseconds when this packet was created. */ - public final long creationTimeMillis = System.currentTimeMillis(); + public final long creationTimeMillis = SysUtil.steadyTimeMillis(); public static long receivedID; public static long receivedSize; diff --git a/sp-server/src/main/java/net/minecraft/src/WorldServer.java b/sp-server/src/main/java/net/minecraft/src/WorldServer.java index fd8ce36..07d6ecc 100644 --- a/sp-server/src/main/java/net/minecraft/src/WorldServer.java +++ b/sp-server/src/main/java/net/minecraft/src/WorldServer.java @@ -8,6 +8,7 @@ import java.util.Set; import java.util.TreeSet; import net.lax1dude.eaglercraft.sp.EaglercraftRandom; +import net.lax1dude.eaglercraft.sp.SysUtil; import net.minecraft.server.MinecraftServer; public class WorldServer extends World { @@ -166,7 +167,7 @@ public class WorldServer extends World { _lu += Chunk.totalBlockLightUpdates; Chunk.totalBlockLightUpdates = 0; - long millis = System.currentTimeMillis(); + long millis = SysUtil.steadyTimeMillis(); if(millis - rwgtuluTimer >= 1000l) { rwgtuluTimer = millis; r = _r; _r = 0; diff --git a/src/lwjgl/java/net/lax1dude/eaglercraft/adapter/EaglerAdapterImpl2.java b/src/lwjgl/java/net/lax1dude/eaglercraft/adapter/EaglerAdapterImpl2.java index 1ef324e..0ae329a 100644 --- a/src/lwjgl/java/net/lax1dude/eaglercraft/adapter/EaglerAdapterImpl2.java +++ b/src/lwjgl/java/net/lax1dude/eaglercraft/adapter/EaglerAdapterImpl2.java @@ -1622,7 +1622,7 @@ public class EaglerAdapterImpl2 { this.alive = true; synchronized(queryResponses) { if(pingTimer == -1) { - pingTimer = System.currentTimeMillis() - pingStart; + pingTimer = steadyTimeMillis() - pingStart; } if(arg0.equalsIgnoreCase("BLOCKED")) { synchronized(socketSync) { @@ -1672,7 +1672,7 @@ public class EaglerAdapterImpl2 { @Override public void onOpen(ServerHandshake arg0) { send("Accept: " + type); - pingStart = System.currentTimeMillis(); + pingStart = steadyTimeMillis(); } @Override @@ -1995,5 +1995,20 @@ public class EaglerAdapterImpl2 { public static final byte[] downloadURL(String url) { return null; } - + + public static final long steadyTimeMillis() { + return System.nanoTime() / 1000000l; + } + + public static final long nanoTime() { + return System.nanoTime(); + } + + public static final void sleep(int millis) { + try { + Thread.sleep(millis); + }catch(InterruptedException ex) { + } + } + } diff --git a/src/lwjgl/java/paulscode/sound/CommandThread.java b/src/lwjgl/java/paulscode/sound/CommandThread.java index 982e6fa..f0c81af 100644 --- a/src/lwjgl/java/paulscode/sound/CommandThread.java +++ b/src/lwjgl/java/paulscode/sound/CommandThread.java @@ -1,5 +1,7 @@ package paulscode.sound; +import net.lax1dude.eaglercraft.EaglerAdapter; + /** * The CommandThread class is designed to move all command processing into a * single thread to be run in the background and avoid conflicts between @@ -99,7 +101,7 @@ public class CommandThread extends SimpleThread @Override public void run() { - long previousTime = System.currentTimeMillis(); + long previousTime = EaglerAdapter.steadyTimeMillis(); long currentTime = previousTime; if( soundSystem == null ) @@ -121,7 +123,7 @@ public class CommandThread extends SimpleThread soundSystem.CommandQueue( null ); // Remove temporary sources every ten seconds: - currentTime = System.currentTimeMillis(); + currentTime = EaglerAdapter.steadyTimeMillis(); if( (!dying()) && ((currentTime - previousTime) > 10000) ) { previousTime = currentTime; diff --git a/src/lwjgl/java/paulscode/sound/MidiChannel.java b/src/lwjgl/java/paulscode/sound/MidiChannel.java index aedf033..a607421 100644 --- a/src/lwjgl/java/paulscode/sound/MidiChannel.java +++ b/src/lwjgl/java/paulscode/sound/MidiChannel.java @@ -17,6 +17,8 @@ import javax.sound.midi.Sequencer; import javax.sound.midi.ShortMessage; import javax.sound.midi.Synthesizer; +import net.lax1dude.eaglercraft.EaglerAdapter; + /** * The MidiChannel class provides an interface for playing MIDI files, using * the JavaSound API. For more information about the JavaSound API, visit @@ -422,7 +424,7 @@ public class MidiChannel implements MetaEventListener fadeOutMilis = milis; fadeInMilis = 0; fadeOutGain = 1.0f; - lastFadeCheck = System.currentTimeMillis(); + lastFadeCheck = EaglerAdapter.steadyTimeMillis(); synchronized( sequenceQueueLock ) { @@ -474,7 +476,7 @@ public class MidiChannel implements MetaEventListener fadeOutMilis = milisOut; fadeInMilis = milisIn; fadeOutGain = 1.0f; - lastFadeCheck = System.currentTimeMillis(); + lastFadeCheck = EaglerAdapter.steadyTimeMillis(); synchronized( sequenceQueueLock ) { @@ -503,7 +505,7 @@ public class MidiChannel implements MetaEventListener if( fadeOutGain == -1.0f && fadeInGain == 1.0f ) return false; - long currentTime = System.currentTimeMillis(); + long currentTime = EaglerAdapter.steadyTimeMillis(); long milisPast = currentTime - lastFadeCheck; lastFadeCheck = currentTime; diff --git a/src/lwjgl/java/paulscode/sound/Source.java b/src/lwjgl/java/paulscode/sound/Source.java index 00c0a0a..5bc6cb0 100644 --- a/src/lwjgl/java/paulscode/sound/Source.java +++ b/src/lwjgl/java/paulscode/sound/Source.java @@ -5,6 +5,8 @@ import java.util.LinkedList; import java.util.ListIterator; import javax.sound.sampled.AudioFormat; +import net.lax1dude.eaglercraft.EaglerAdapter; + /** * The Source class is used to store information about a source. * Source objects are stored in a map in the Library class. The @@ -476,7 +478,7 @@ public class Source fadeOutMilis = milis; fadeInMilis = 0; fadeOutGain = 1.0f; - lastFadeCheck = System.currentTimeMillis(); + lastFadeCheck = EaglerAdapter.steadyTimeMillis(); synchronized( soundSequenceLock ) { @@ -529,7 +531,7 @@ public class Source fadeInMilis = milisIn; fadeOutGain = 1.0f; - lastFadeCheck = System.currentTimeMillis(); + lastFadeCheck = EaglerAdapter.steadyTimeMillis(); synchronized( soundSequenceLock ) { @@ -555,7 +557,7 @@ public class Source if( fadeOutGain == -1.0f && fadeInGain == 1.0f ) return false; - long currentTime = System.currentTimeMillis(); + long currentTime = EaglerAdapter.steadyTimeMillis(); long milisPast = currentTime - lastFadeCheck; lastFadeCheck = currentTime; diff --git a/src/main/java/net/lax1dude/eaglercraft/AssetRepository.java b/src/main/java/net/lax1dude/eaglercraft/AssetRepository.java index 03810a7..cabf774 100644 --- a/src/main/java/net/lax1dude/eaglercraft/AssetRepository.java +++ b/src/main/java/net/lax1dude/eaglercraft/AssetRepository.java @@ -10,14 +10,13 @@ import java.util.HashMap; import com.jcraft.jzlib.CRC32; import com.jcraft.jzlib.GZIPInputStream; import com.jcraft.jzlib.InflaterInputStream; -import org.json.JSONArray; import org.json.JSONObject; public class AssetRepository { - private static final HashMap filePool = new HashMap(); - private static final HashMap filePoolTemp = new HashMap(); - public static final HashMap fileNameOverrides = new HashMap(); + private static final HashMap filePool = new HashMap<>(); + private static final HashMap filePoolTemp = new HashMap<>(); + public static final HashMap fileNameOverrides = new HashMap<>(); public static final void loadOverrides(JSONObject json) { JSONObject overrides = json.optJSONObject("assetOverrides", null); diff --git a/src/main/java/net/lax1dude/eaglercraft/DefaultSkinRenderer.java b/src/main/java/net/lax1dude/eaglercraft/DefaultSkinRenderer.java index ee2fdde..0342a04 100644 --- a/src/main/java/net/lax1dude/eaglercraft/DefaultSkinRenderer.java +++ b/src/main/java/net/lax1dude/eaglercraft/DefaultSkinRenderer.java @@ -104,20 +104,21 @@ public class DefaultSkinRenderer { false, true }; - private static final HashMap skinCookies = new HashMap(); - private static final HashMap skinGLUnits = new HashMap(); - private static final HashMap capeGLUnits = new HashMap(); - private static final HashMap skinGLTimeout = new HashMap(); + private static final HashMap skinCookies = new HashMap<>(); + private static final HashMap skinGLUnits = new HashMap<>(); + private static final HashMap capeGLUnits = new HashMap<>(); + private static final HashMap skinGLTimeout = new HashMap<>(); private static long lastClean = 0l; public static void deleteOldSkins() { - if(System.currentTimeMillis() - lastClean > 60000l) { - lastClean = System.currentTimeMillis(); + long now = EaglerAdapter.steadyTimeMillis(); + if(now - lastClean > 60000l) { + lastClean = now; Iterator> itr = skinGLTimeout.entrySet().iterator(); while(itr.hasNext()) { Entry ee = itr.next(); - if(System.currentTimeMillis() - ee.getValue() > 80000l) { + if(now - ee.getValue() > 80000l) { itr.remove(); if(skinGLUnits.containsKey(ee.getKey())) { Minecraft.getMinecraft().renderEngine.deleteTexture(skinGLUnits.remove(ee.getKey())); @@ -167,7 +168,7 @@ public class DefaultSkinRenderer { skinGLUnits.put(pp, Minecraft.getMinecraft().renderEngine.setupTextureRaw(skinToLoad, w, h)); } } - skinGLTimeout.put(pp, System.currentTimeMillis()); + skinGLTimeout.put(pp, EaglerAdapter.steadyTimeMillis()); Integer i = skinGLUnits.get(pp); if(i != null && i.intValue() > 0) { Minecraft.getMinecraft().renderEngine.bindTexture(i.intValue()); @@ -257,7 +258,7 @@ public class DefaultSkinRenderer { capeGLUnits.put(pp, Minecraft.getMinecraft().renderEngine.setupTextureRaw(dataToLoad, w, h)); } } - skinGLTimeout.put(pp, System.currentTimeMillis()); + skinGLTimeout.put(pp, EaglerAdapter.steadyTimeMillis()); Integer i = capeGLUnits.get(pp); if(i != null && i.intValue() > 0) { EaglerAdapter.glMatrixMode(EaglerAdapter.GL_TEXTURE); @@ -586,32 +587,32 @@ public class DefaultSkinRenderer { if(isNew) { if((id < 0 && EaglerProfile.skins.get(id2).slim) || (id >= 0 && isAlexSkin(id))) { newSkinRendererSlim.blockTransparentSkin = true; - newSkinRendererSlim.render(null, 0.0f, 0.0f, (float)(System.currentTimeMillis() % 100000) / 50f, ((x - mx) * 0.06f), ((y - my) * -0.1f), 0.0625F); + newSkinRendererSlim.render(null, 0.0f, 0.0f, (float)(EaglerAdapter.steadyTimeMillis() % 100000) / 50f, ((x - mx) * 0.06f), ((y - my) * -0.1f), 0.0625F); newSkinRendererSlim.blockTransparentSkin = false; }else { newSkinRenderer.blockTransparentSkin = true; - newSkinRenderer.render(null, 0.0f, 0.0f, (float)(System.currentTimeMillis() % 100000) / 50f, ((x - mx) * 0.06f), ((y - my) * -0.1f), 0.0625F); + newSkinRenderer.render(null, 0.0f, 0.0f, (float)(EaglerAdapter.steadyTimeMillis() % 100000) / 50f, ((x - mx) * 0.06f), ((y - my) * -0.1f), 0.0625F); newSkinRenderer.blockTransparentSkin = false; } }else { oldSkinRenderer.blockTransparentSkin = true; - oldSkinRenderer.render(null, 0.0f, 0.0f, (float)(System.currentTimeMillis() % 100000) / 50f, ((x - mx) * 0.06f), ((y - my) * -0.1f), 0.0625F); + oldSkinRenderer.render(null, 0.0f, 0.0f, (float)(EaglerAdapter.steadyTimeMillis() % 100000) / 50f, ((x - mx) * 0.06f), ((y - my) * -0.1f), 0.0625F); oldSkinRenderer.blockTransparentSkin = false; } gonnaShowCape = capeMode; }else if(isZombieModel(id)) { if(zombieRenderer == null) zombieRenderer = new ModelZombie(0.0F, true); zombieRenderer.isChild = false; - zombieRenderer.render(null, 0.0f, 0.0f, (float)(System.currentTimeMillis() % 100000) / 50f, ((x - mx) * 0.06f), ((y - my) * -0.1f), 0.0625F); + zombieRenderer.render(null, 0.0f, 0.0f, (float)(EaglerAdapter.steadyTimeMillis() % 100000) / 50f, ((x - mx) * 0.06f), ((y - my) * -0.1f), 0.0625F); gonnaShowCape = capeMode; }else if(id == 32) { if(villagerRenderer == null) villagerRenderer = new ModelVillager(0.0F); villagerRenderer.isChild = false; - villagerRenderer.render(null, 0.0f, 0.0f, (float)(System.currentTimeMillis() % 100000) / 50f, ((x - mx) * 0.06f), ((y - my) * -0.1f), 0.0625F); + villagerRenderer.render(null, 0.0f, 0.0f, (float)(EaglerAdapter.steadyTimeMillis() % 100000) / 50f, ((x - mx) * 0.06f), ((y - my) * -0.1f), 0.0625F); }else if(id == 19) { if(endermanRenderer == null) endermanRenderer = new ModelEnderman(); endermanRenderer.isChild = false; - endermanRenderer.render(null, 0.0f, 0.0f, (float)(System.currentTimeMillis() % 100000) / 50f, ((x - mx) * 0.06f), ((y - my) * -0.1f), 0.0625F); + endermanRenderer.render(null, 0.0f, 0.0f, (float)(EaglerAdapter.steadyTimeMillis() % 100000) / 50f, ((x - mx) * 0.06f), ((y - my) * -0.1f), 0.0625F); EaglerAdapter.glColor4f(1.4f, 1.4f, 1.4f, 1.0f); //EaglerAdapter.glEnable(EaglerAdapter.GL_BLEND); //EaglerAdapter.glDisable(EaglerAdapter.GL_ALPHA_TEST); @@ -620,7 +621,7 @@ public class DefaultSkinRenderer { EaglerAdapter.glEnable(EaglerAdapter.GL_TEXTURE_2D); EaglerAdapter.glDisable(EaglerAdapter.GL_DEPTH_TEST); RenderEnderman.tex_eyes.bindTexture(); - endermanRenderer.render(null, 0.0f, 0.0f, (float)(System.currentTimeMillis() % 100000) / 50f, ((x - mx) * 0.06f), ((y - my) * -0.1f), 0.0625F); + endermanRenderer.render(null, 0.0f, 0.0f, (float)(EaglerAdapter.steadyTimeMillis() % 100000) / 50f, ((x - mx) * 0.06f), ((y - my) * -0.1f), 0.0625F); EaglerAdapter.glBlendFunc(EaglerAdapter.GL_SRC_ALPHA, EaglerAdapter.GL_ONE_MINUS_SRC_ALPHA); EaglerAdapter.glEnable(EaglerAdapter.GL_ALPHA_TEST); EaglerAdapter.glEnable(EaglerAdapter.GL_DEPTH_TEST); @@ -629,12 +630,12 @@ public class DefaultSkinRenderer { }else if(id == 20) { if(skeletonRenderer == null) skeletonRenderer = new ModelSkeleton(0.0F); skeletonRenderer.isChild = false; - skeletonRenderer.render(null, 0.0f, 0.0f, (float)(System.currentTimeMillis() % 100000) / 50f, ((x - mx) * 0.06f), ((y - my) * -0.1f), 0.0625F); + skeletonRenderer.render(null, 0.0f, 0.0f, (float)(EaglerAdapter.steadyTimeMillis() % 100000) / 50f, ((x - mx) * 0.06f), ((y - my) * -0.1f), 0.0625F); }else if(id == 21) { if(blazeRenderer == null) blazeRenderer = new ModelBlaze(); blazeRenderer.isChild = false; EaglerAdapter.glColor4f(1.5f, 1.5f, 1.5f, 1.0f); - blazeRenderer.render(null, 0.0f, 0.0f, (float)(System.currentTimeMillis() % 100000) / 50f, ((x - mx) * 0.06f), ((y - my) * -0.1f), 0.0625F); + blazeRenderer.render(null, 0.0f, 0.0f, (float)(EaglerAdapter.steadyTimeMillis() % 100000) / 50f, ((x - mx) * 0.06f), ((y - my) * -0.1f), 0.0625F); } if(gonnaShowCape && !(EaglerProfile.presetCapeId >= 0 && defaultVanillaCapes[EaglerProfile.presetCapeId] == null)) { EaglerAdapter.glPushMatrix(); @@ -706,7 +707,7 @@ public class DefaultSkinRenderer { EaglerAdapter.glTranslatef(0.0F, -1.0F, 0.0F); bp.isChild = false; - bp.render(null, 0.0f, 0.0f, (float)(System.currentTimeMillis() % 100000) / 50f, ((x - mx) * 0.06f), ((y - my) * -0.1f), 0.0625F); + bp.render(null, 0.0f, 0.0f, (float)(EaglerAdapter.steadyTimeMillis() % 100000) / 50f, ((x - mx) * 0.06f), ((y - my) * -0.1f), 0.0625F); EaglerAdapter.glPopMatrix(); EaglerAdapter.glDisable(EaglerAdapter.GL_RESCALE_NORMAL); diff --git a/src/main/java/net/lax1dude/eaglercraft/EaglerProfile.java b/src/main/java/net/lax1dude/eaglercraft/EaglerProfile.java index 4985a05..4379a3c 100644 --- a/src/main/java/net/lax1dude/eaglercraft/EaglerProfile.java +++ b/src/main/java/net/lax1dude/eaglercraft/EaglerProfile.java @@ -44,8 +44,8 @@ public class EaglerProfile { public static final int[] SKIN_DATA_SIZE = new int[] { 64*32*4, 64*64*4, -9, -9, 1, 64*64*4, -9 }; public static final int[] CAPE_DATA_SIZE = new int[] { 32*32*4, -9, 1 }; - public static ArrayList skins = new ArrayList(); - public static ArrayList capes = new ArrayList(); + public static ArrayList skins = new ArrayList<>(); + public static ArrayList capes = new ArrayList<>(); public static final EaglercraftRandom rand; diff --git a/src/main/java/net/lax1dude/eaglercraft/EarlyLoadScreen.java b/src/main/java/net/lax1dude/eaglercraft/EarlyLoadScreen.java index 90c60bf..96389a3 100644 --- a/src/main/java/net/lax1dude/eaglercraft/EarlyLoadScreen.java +++ b/src/main/java/net/lax1dude/eaglercraft/EarlyLoadScreen.java @@ -67,11 +67,7 @@ public class EarlyLoadScreen { _wglDeleteShader(vert); _wglDeleteShader(frag); - try { - Thread.sleep(50l); - } catch (InterruptedException e) { - e.printStackTrace(); - } + sleep(50); _wglUseProgram(program); _wglUniform1i(_wglGetUniformLocation(program, "tex"), 0); @@ -128,11 +124,7 @@ public class EarlyLoadScreen { upload.flip(); _wglTexImage2D(_wGL_TEXTURE_2D, 0, _wGL_RGBA, 128, 128, 0, _wGL_RGBA, _wGL_UNSIGNED_BYTE, upload); - try { - Thread.sleep(50l); - } catch (InterruptedException e) { - e.printStackTrace(); - } + sleep(50); _wglUseProgram(program); diff --git a/src/main/java/net/lax1dude/eaglercraft/ExpiringSet.java b/src/main/java/net/lax1dude/eaglercraft/ExpiringSet.java index 9047df7..5d7e485 100644 --- a/src/main/java/net/lax1dude/eaglercraft/ExpiringSet.java +++ b/src/main/java/net/lax1dude/eaglercraft/ExpiringSet.java @@ -29,7 +29,7 @@ public class ExpiringSet extends HashSet { public void checkForExpirations() { Iterator iterator = this.timestamps.keySet().iterator(); - long now = System.currentTimeMillis(); + long now = EaglerAdapter.steadyTimeMillis(); while (iterator.hasNext()) { T element = iterator.next(); if (super.contains(element)) { @@ -48,7 +48,7 @@ public class ExpiringSet extends HashSet { public boolean add(T o) { checkForExpirations(); boolean success = super.add(o); - if (success) timestamps.put(o, System.currentTimeMillis()); + if (success) timestamps.put(o, EaglerAdapter.steadyTimeMillis()); return success; } diff --git a/src/main/java/net/lax1dude/eaglercraft/GuiScreenAddRelay.java b/src/main/java/net/lax1dude/eaglercraft/GuiScreenAddRelay.java index 6550ac6..1bdc206 100644 --- a/src/main/java/net/lax1dude/eaglercraft/GuiScreenAddRelay.java +++ b/src/main/java/net/lax1dude/eaglercraft/GuiScreenAddRelay.java @@ -3,7 +3,6 @@ package net.lax1dude.eaglercraft; import net.minecraft.src.GuiButton; import net.minecraft.src.GuiScreen; import net.minecraft.src.GuiTextField; -import net.minecraft.src.ServerData; import net.minecraft.src.StringTranslate; public class GuiScreenAddRelay extends GuiScreen { diff --git a/src/main/java/net/lax1dude/eaglercraft/GuiScreenNameWorldImport.java b/src/main/java/net/lax1dude/eaglercraft/GuiScreenNameWorldImport.java index 9292c3d..7aded44 100644 --- a/src/main/java/net/lax1dude/eaglercraft/GuiScreenNameWorldImport.java +++ b/src/main/java/net/lax1dude/eaglercraft/GuiScreenNameWorldImport.java @@ -114,7 +114,7 @@ public class GuiScreenNameWorldImport extends GuiScreen { this.theGuiTextField.drawTextBox(); }else { definetlyTimeToImport = true; - long dots = (System.currentTimeMillis() / 500l) % 4l; + long dots = (EaglerAdapter.steadyTimeMillis() / 500l) % 4l; String str = "Reading: '" + oldName + "'"; this.drawString(fontRenderer, str + (dots > 0 ? "." : "") + (dots > 1 ? "." : "") + (dots > 2 ? "." : ""), (this.width - this.fontRenderer.getStringWidth(str)) / 2, this.height / 3 + 10, 0xFFFFFF); } diff --git a/src/main/java/net/lax1dude/eaglercraft/GuiScreenRelay.java b/src/main/java/net/lax1dude/eaglercraft/GuiScreenRelay.java index 6e2991a..a78f492 100644 --- a/src/main/java/net/lax1dude/eaglercraft/GuiScreenRelay.java +++ b/src/main/java/net/lax1dude/eaglercraft/GuiScreenRelay.java @@ -78,7 +78,7 @@ public class GuiScreenRelay extends GuiScreen { selected = 0; } } else if(btn.id == 4) { - long millis = System.currentTimeMillis(); + long millis = EaglerAdapter.steadyTimeMillis(); if(millis - lastRefresh > 700l) { lastRefresh = millis; slots.relayManager.ping(); @@ -86,7 +86,7 @@ public class GuiScreenRelay extends GuiScreen { lastRefresh += 60l; } else if(btn.id == 5) { slots.relayManager.loadDefaults(); - long millis = System.currentTimeMillis(); + long millis = EaglerAdapter.steadyTimeMillis(); if(millis - lastRefresh > 700l) { lastRefresh = millis; slots.relayManager.ping(); diff --git a/src/main/java/net/lax1dude/eaglercraft/GuiScreenSingleplayerConnecting.java b/src/main/java/net/lax1dude/eaglercraft/GuiScreenSingleplayerConnecting.java index 9ab32c7..92284b9 100644 --- a/src/main/java/net/lax1dude/eaglercraft/GuiScreenSingleplayerConnecting.java +++ b/src/main/java/net/lax1dude/eaglercraft/GuiScreenSingleplayerConnecting.java @@ -26,7 +26,7 @@ public class GuiScreenSingleplayerConnecting extends GuiScreen { } public void initGui() { - if(startStartTime == 0) this.startStartTime = System.currentTimeMillis(); + if(startStartTime == 0) this.startStartTime = EaglerAdapter.steadyTimeMillis(); this.buttonList.add(killTask = new GuiButton(0, this.width / 2 - 100, this.height / 3 + 50, "Kill Task")); killTask.enabled = false; } @@ -36,7 +36,7 @@ public class GuiScreenSingleplayerConnecting extends GuiScreen { float f = 2.0f; int top = this.height / 3; - long millis = System.currentTimeMillis(); + long millis = EaglerAdapter.steadyTimeMillis(); long dots = (millis / 500l) % 4l; this.drawString(fontRenderer, message + (dots > 0 ? "." : "") + (dots > 1 ? "." : "") + (dots > 2 ? "." : ""), (this.width - this.fontRenderer.getStringWidth(message)) / 2, top + 10, 0xFFFFFF); @@ -68,7 +68,7 @@ public class GuiScreenSingleplayerConnecting extends GuiScreen { } } - long millis = System.currentTimeMillis(); + long millis = EaglerAdapter.steadyTimeMillis(); if(millis - startStartTime > 6000l) { killTask.enabled = true; } diff --git a/src/main/java/net/lax1dude/eaglercraft/GuiScreenSingleplayerLoading.java b/src/main/java/net/lax1dude/eaglercraft/GuiScreenSingleplayerLoading.java index 41d1e6e..e3fdaa9 100644 --- a/src/main/java/net/lax1dude/eaglercraft/GuiScreenSingleplayerLoading.java +++ b/src/main/java/net/lax1dude/eaglercraft/GuiScreenSingleplayerLoading.java @@ -64,7 +64,7 @@ public class GuiScreenSingleplayerLoading extends GuiScreen { } public void initGui() { - if(startStartTime == 0) this.startStartTime = System.currentTimeMillis(); + if(startStartTime == 0) this.startStartTime = EaglerAdapter.steadyTimeMillis(); areYouSure = 0; this.buttonList.add(killTask = new GuiButton(0, this.width / 2 - 100, this.height / 3 + 50, StringTranslate.getInstance().translateKey("gui.killTask"))); killTask.enabled = false; @@ -79,7 +79,7 @@ public class GuiScreenSingleplayerLoading extends GuiScreen { float f = 2.0f; int top = this.height / 3; - long millis = System.currentTimeMillis(); + long millis = EaglerAdapter.steadyTimeMillis(); String str = StringTranslate.getInstance().translateKey(currentStatus); @@ -105,7 +105,7 @@ public class GuiScreenSingleplayerLoading extends GuiScreen { } public void updateScreen() { - long millis = System.currentTimeMillis(); + long millis = EaglerAdapter.steadyTimeMillis(); if(millis - startStartTime > 6000l) { killTask.enabled = true; } diff --git a/src/main/java/net/lax1dude/eaglercraft/GuiSlotRelay.java b/src/main/java/net/lax1dude/eaglercraft/GuiSlotRelay.java index 8bc8f46..59b4741 100644 --- a/src/main/java/net/lax1dude/eaglercraft/GuiSlotRelay.java +++ b/src/main/java/net/lax1dude/eaglercraft/GuiSlotRelay.java @@ -3,7 +3,6 @@ package net.lax1dude.eaglercraft; import net.lax1dude.eaglercraft.RelayQuery.VersionMismatch; import net.lax1dude.eaglercraft.adapter.Tessellator; import net.minecraft.client.Minecraft; -import net.minecraft.src.Gui; import net.minecraft.src.GuiSlot; class GuiSlotRelay extends GuiSlot { diff --git a/src/main/java/net/lax1dude/eaglercraft/GuiVoiceMenu.java b/src/main/java/net/lax1dude/eaglercraft/GuiVoiceMenu.java index 30acbac..ba48fce 100644 --- a/src/main/java/net/lax1dude/eaglercraft/GuiVoiceMenu.java +++ b/src/main/java/net/lax1dude/eaglercraft/GuiVoiceMenu.java @@ -340,7 +340,7 @@ public class GuiVoiceMenu extends GuiScreen { } }else if(status == Voice.VoiceStatus.CONNECTING) { - float fadeTimer = MathHelper.sin((float)((System.currentTimeMillis() % 700l) * 0.0014d) * 3.14159f) * 0.35f + 0.3f; + float fadeTimer = MathHelper.sin((float)((EaglerAdapter.steadyTimeMillis() % 700l) * 0.0014d) * 3.14159f) * 0.35f + 0.3f; txt = ts.translateKey("voice.connecting"); EaglerAdapter.glEnable(EaglerAdapter.GL_BLEND); EaglerAdapter.glBlendFunc(EaglerAdapter.GL_SRC_ALPHA, EaglerAdapter.GL_ONE_MINUS_SRC_ALPHA); diff --git a/src/main/java/net/lax1dude/eaglercraft/GuiVoiceOverlay.java b/src/main/java/net/lax1dude/eaglercraft/GuiVoiceOverlay.java index 1404bd8..8c72223 100644 --- a/src/main/java/net/lax1dude/eaglercraft/GuiVoiceOverlay.java +++ b/src/main/java/net/lax1dude/eaglercraft/GuiVoiceOverlay.java @@ -57,7 +57,7 @@ public class GuiVoiceOverlay extends Gui { voiceGuiIcons.bindTexture(); if((mc.currentScreen == null || !mc.currentScreen.blockHotKeys()) && EaglerAdapter.isKeyDown(mc.gameSettings.voicePTTKey)) { - long millis = System.currentTimeMillis(); + long millis = EaglerAdapter.steadyTimeMillis(); if(pttTimer == 0l) { pttTimer = millis; } @@ -93,7 +93,7 @@ public class GuiVoiceOverlay extends Gui { Set speakers = EaglerAdapter.getVoiceSpeaking(); Set muted = EaglerAdapter.getVoiceMuted(); - List listenerList = new ArrayList(); + List listenerList = new ArrayList<>(); listenerList.addAll(listeners); listenerList.removeAll(muted); @@ -169,7 +169,7 @@ public class GuiVoiceOverlay extends Gui { Set speakers = EaglerAdapter.getVoiceSpeaking(); Set muted = EaglerAdapter.getVoiceMuted(); - List listenerList = new ArrayList(); + List listenerList = new ArrayList<>(); listenerList.addAll(speakers); listenerList.removeAll(muted); diff --git a/src/main/java/net/lax1dude/eaglercraft/IntegratedServer.java b/src/main/java/net/lax1dude/eaglercraft/IntegratedServer.java index 86f5e25..332b968 100644 --- a/src/main/java/net/lax1dude/eaglercraft/IntegratedServer.java +++ b/src/main/java/net/lax1dude/eaglercraft/IntegratedServer.java @@ -27,7 +27,7 @@ public class IntegratedServer { private static String[] loadLocale = null; private static String[] loadStats = null; private static boolean isPaused = false; - private static List integratedServerTPS = new LinkedList(); + private static List integratedServerTPS = new LinkedList<>(); public static final int preferredRelayVersion = 1; @@ -187,9 +187,9 @@ public class IntegratedServer { private static String worldStatusString = ""; private static float worldStatusProgress = 0.0f; - private static final LinkedList exceptions = new LinkedList(); + private static final LinkedList exceptions = new LinkedList<>(); - public static final LinkedList worlds = new LinkedList(); + public static final LinkedList worlds = new LinkedList<>(); public static int statusState() { return statusState; @@ -408,7 +408,7 @@ public class IntegratedServer { } } - private static final HashMap openConnections = new HashMap(); + private static final HashMap openConnections = new HashMap<>(); public static final boolean doesChannelExist(String channel) { return openConnections.containsKey(channel); diff --git a/src/main/java/net/lax1dude/eaglercraft/IntegratedServerLAN.java b/src/main/java/net/lax1dude/eaglercraft/IntegratedServerLAN.java index 3cc0464..625d92d 100644 --- a/src/main/java/net/lax1dude/eaglercraft/IntegratedServerLAN.java +++ b/src/main/java/net/lax1dude/eaglercraft/IntegratedServerLAN.java @@ -12,7 +12,7 @@ import net.lax1dude.eaglercraft.sp.relay.pkt.*; public class IntegratedServerLAN { - public static final List currentICEServers = new ArrayList(); + public static final List currentICEServers = new ArrayList<>(); private static RelayServerSocket lanRelaySocket = null; @@ -32,7 +32,7 @@ public class IntegratedServerLAN { String code = hs.connectionCode; System.out.println("Relay [" + sock.getURI() + "] connected as 'server', code: " + code); progressCallback.accept("Opened '" + code + "' on " + sock.getURI()); - long millis = System.currentTimeMillis(); + long millis = EaglerAdapter.steadyTimeMillis(); do { if(sock.isClosed()) { System.out.println("Relay [" + sock.getURI() + "] connection lost"); @@ -58,11 +58,8 @@ public class IntegratedServerLAN { return null; } } - try { - Thread.sleep(50l); - } catch (InterruptedException e) { - } - }while(System.currentTimeMillis() - millis < 1000l); + EaglerAdapter.sleep(50); + }while(EaglerAdapter.steadyTimeMillis() - millis < 1000l); System.out.println("Relay [" + sock.getURI() + "] relay provide ICE servers timeout"); closeLAN(); return null; @@ -107,7 +104,7 @@ public class IntegratedServerLAN { return lanRelaySocket != null; } - private static final Map clients = new HashMap(); + private static final Map clients = new HashMap<>(); public static void updateLANServer() { if(lanRelaySocket != null) { @@ -195,7 +192,7 @@ public class IntegratedServerLAN { protected void handleICECandidates(String candidates) { if(state == SENT_DESCRIPTION) { EaglerAdapter.serverLANPeerICECandidates(clientId, candidates); - long millis = System.currentTimeMillis(); + long millis = EaglerAdapter.steadyTimeMillis(); do { LANPeerEvent evt; if((evt = EaglerAdapter.serverLANGetEvent(clientId)) != null) { @@ -211,11 +208,8 @@ public class IntegratedServerLAN { disconnect(); return; } - try { - Thread.sleep(20l); - } catch (InterruptedException e) { - } - }while(System.currentTimeMillis() - millis < 5000l); + EaglerAdapter.sleep(20); + }while(EaglerAdapter.steadyTimeMillis() - millis < 5000l); System.err.println("Getting server ICE candidates for '" + clientId + "' timed out!"); disconnect(); }else { @@ -226,7 +220,7 @@ public class IntegratedServerLAN { protected void handleDescription(String description) { if(state == PRE) { EaglerAdapter.serverLANPeerDescription(clientId, description); - long millis = System.currentTimeMillis(); + long millis = EaglerAdapter.steadyTimeMillis(); do { LANPeerEvent evt; if((evt = EaglerAdapter.serverLANGetEvent(clientId)) != null) { @@ -242,11 +236,8 @@ public class IntegratedServerLAN { disconnect(); return; } - try { - Thread.sleep(20l); - } catch (InterruptedException e) { - } - }while(System.currentTimeMillis() - millis < 5000l); + EaglerAdapter.sleep(20); + }while(EaglerAdapter.steadyTimeMillis() - millis < 5000l); System.err.println("Getting server description for '" + clientId + "' timed out!"); disconnect(); }else { @@ -256,7 +247,7 @@ public class IntegratedServerLAN { protected void handleSuccess() { if(state == SENT_ICE_CANDIDATE) { - long millis = System.currentTimeMillis(); + long millis = EaglerAdapter.steadyTimeMillis(); do { LANPeerEvent evt; while((evt = EaglerAdapter.serverLANGetEvent(clientId)) != null && evt instanceof LANPeerEvent.LANPeerICECandidateEvent) { @@ -276,11 +267,8 @@ public class IntegratedServerLAN { disconnect(); return; } - try { - Thread.sleep(20l); - } catch (InterruptedException e) { - } - }while(System.currentTimeMillis() - millis < 5000l); + EaglerAdapter.sleep(20); + }while(EaglerAdapter.steadyTimeMillis() - millis < 5000l); System.err.println("Getting server description for '" + clientId + "' timed out!"); disconnect(); }else { diff --git a/src/main/java/net/lax1dude/eaglercraft/LANClientNetworkManager.java b/src/main/java/net/lax1dude/eaglercraft/LANClientNetworkManager.java index 69809c9..5843ac5 100644 --- a/src/main/java/net/lax1dude/eaglercraft/LANClientNetworkManager.java +++ b/src/main/java/net/lax1dude/eaglercraft/LANClientNetworkManager.java @@ -67,7 +67,7 @@ public class LANClientNetworkManager implements INetworkManager { // print servers System.out.println("Relay [" + displayRelay + "|" + displayCode + "] provided ICE servers:"); - List servers = new ArrayList(); + List servers = new ArrayList<>(); for(net.lax1dude.eaglercraft.sp.relay.pkt.ICEServerSet.RelayServer srv : ipkt.servers) { System.out.println("Relay [" + displayRelay + "|" + displayCode + "] " + srv.type.name() + ": " + srv.address); @@ -78,7 +78,7 @@ public class LANClientNetworkManager implements INetworkManager { EaglerAdapter.clientLANSetICEServersAndConnect(servers.toArray(new String[servers.size()])); // await result - long lm = System.currentTimeMillis(); + long lm = EaglerAdapter.steadyTimeMillis(); do { String c = EaglerAdapter.clientLANAwaitDescription(); if(c != null) { @@ -90,11 +90,8 @@ public class LANClientNetworkManager implements INetworkManager { connectState = SENT_DESCRIPTION; continue mainLoop; } - try { - Thread.sleep(20l); - } catch (InterruptedException e) { - } - }while(System.currentTimeMillis() - lm < 5000l); + EaglerAdapter.sleep(20); + }while(EaglerAdapter.steadyTimeMillis() - lm < 5000l); // no description was sent sock.close(); @@ -119,7 +116,7 @@ public class LANClientNetworkManager implements INetworkManager { EaglerAdapter.clientLANSetICECandidate(ipkt.candidate); // await result - long lm = System.currentTimeMillis(); + long lm = EaglerAdapter.steadyTimeMillis(); do { if(EaglerAdapter.clientLANAwaitChannel()) { System.out.println("Relay [" + displayRelay + "|" + displayCode + "] client opened data channel"); @@ -130,11 +127,8 @@ public class LANClientNetworkManager implements INetworkManager { return new LANClientNetworkManager(displayCode, displayRelay); } - try { - Thread.sleep(20l); - } catch (InterruptedException e) { - } - }while(System.currentTimeMillis() - lm < 5000l); + EaglerAdapter.sleep(20); + }while(EaglerAdapter.steadyTimeMillis() - lm < 5000l); // no channel was opened sock.writePacket(new IPacket06ClientFailure(ipkt.peerId)); @@ -160,7 +154,7 @@ public class LANClientNetworkManager implements INetworkManager { EaglerAdapter.clientLANSetDescription(ipkt.description); // await result - long lm = System.currentTimeMillis(); + long lm = EaglerAdapter.steadyTimeMillis(); do { String c = EaglerAdapter.clientLANAwaitICECandidate(); if(c != null) { @@ -172,11 +166,8 @@ public class LANClientNetworkManager implements INetworkManager { connectState = SENT_ICE_CANDIDATE; continue mainLoop; } - try { - Thread.sleep(20l); - } catch (InterruptedException e) { - } - }while(System.currentTimeMillis() - lm < 5000l); + EaglerAdapter.sleep(20); + }while(EaglerAdapter.steadyTimeMillis() - lm < 5000l); // no ice candidates were sent sock.close(); @@ -212,10 +203,7 @@ public class LANClientNetworkManager implements INetworkManager { return null; } } - try { - Thread.sleep(20l); - } catch (InterruptedException e) { - } + EaglerAdapter.sleep(20); } return null; } diff --git a/src/main/java/net/lax1dude/eaglercraft/LANServerList.java b/src/main/java/net/lax1dude/eaglercraft/LANServerList.java index f61d80a..458d5e9 100644 --- a/src/main/java/net/lax1dude/eaglercraft/LANServerList.java +++ b/src/main/java/net/lax1dude/eaglercraft/LANServerList.java @@ -13,15 +13,15 @@ import net.lax1dude.eaglercraft.sp.relay.pkt.IPacket07LocalWorlds.LocalWorld; public class LANServerList { - private final List lanServersList = new LinkedList(); - private final Map lanServersQueryList = new LinkedHashMap(); - private final Set deadURIs = new HashSet(); + private final List lanServersList = new LinkedList<>(); + private final Map lanServersQueryList = new LinkedHashMap<>(); + private final Set deadURIs = new HashSet<>(); private long lastRefresh = 0l; private int refreshCounter = 0; public void update() { - long millis = System.currentTimeMillis(); + long millis = EaglerAdapter.steadyTimeMillis(); if(millis - lastRefresh > 10000l) { if(++refreshCounter < 10) { refresh(); @@ -91,7 +91,7 @@ public class LANServerList { } private void refresh() { - lastRefresh = System.currentTimeMillis(); + lastRefresh = EaglerAdapter.steadyTimeMillis(); for(int i = 0, l = IntegratedServer.relayManager.count(); i < l; ++i) { RelayServer srv = IntegratedServer.relayManager.get(i); if(!lanServersQueryList.containsKey(srv.address) && !deadURIs.contains(srv.address)) { diff --git a/src/main/java/net/lax1dude/eaglercraft/RelayManager.java b/src/main/java/net/lax1dude/eaglercraft/RelayManager.java index 7289e39..4365770 100644 --- a/src/main/java/net/lax1dude/eaglercraft/RelayManager.java +++ b/src/main/java/net/lax1dude/eaglercraft/RelayManager.java @@ -15,7 +15,7 @@ import net.minecraft.src.NBTTagList; public class RelayManager { - private final List relays = new ArrayList(); + private final List relays = new ArrayList<>(); private long lastPingThrough = 0l; public void load(NBTTagList relayConfig) { @@ -94,7 +94,7 @@ public class RelayManager { } public void ping() { - lastPingThrough = System.currentTimeMillis(); + lastPingThrough = EaglerAdapter.steadyTimeMillis(); for(int i = 0, l = relays.size(); i < l; ++i) { relays.get(i).ping(); } @@ -211,16 +211,10 @@ public class RelayManager { return null; } } - try { - Thread.sleep(20l); - } catch (InterruptedException e) { - } + EaglerAdapter.sleep(20); } } - try { - Thread.sleep(20l); - } catch (InterruptedException e) { - } + EaglerAdapter.sleep(20); } System.err.println("Relay [" + relay.address + "] connection failed!"); Throwable t; @@ -230,12 +224,12 @@ public class RelayManager { return null; } - private final List brokenServers = new LinkedList(); + private final List brokenServers = new LinkedList<>(); public RelayServerSocket getWorkingRelay(Consumer progressCallback, int type, String code) { brokenServers.clear(); if(relays.size() > 0) { - long millis = System.currentTimeMillis(); + long millis = EaglerAdapter.steadyTimeMillis(); if(millis - lastPingThrough < 10000l) { RelayServer relay = getPrimary(); if(relay.getPing() > 0l && relay.getPingCompatible().isCompatible()) { diff --git a/src/main/java/net/lax1dude/eaglercraft/RelayServer.java b/src/main/java/net/lax1dude/eaglercraft/RelayServer.java index f8181e4..27c9b50 100644 --- a/src/main/java/net/lax1dude/eaglercraft/RelayServer.java +++ b/src/main/java/net/lax1dude/eaglercraft/RelayServer.java @@ -63,10 +63,7 @@ public class RelayServer { public void pingBlocking() { ping(); while(getPing() < 0l) { - try { - Thread.sleep(250l); - }catch(InterruptedException ex) { - } + EaglerAdapter.sleep(250); update(); } } @@ -97,7 +94,7 @@ public class RelayServer { queriedCompatible = query.getCompatible(); workingPing = ping; } - lastPing = System.currentTimeMillis(); + lastPing = EaglerAdapter.steadyTimeMillis(); query = null; } } diff --git a/src/main/java/net/lax1dude/eaglercraft/ServerQuery.java b/src/main/java/net/lax1dude/eaglercraft/ServerQuery.java index ee6c931..9ebf702 100644 --- a/src/main/java/net/lax1dude/eaglercraft/ServerQuery.java +++ b/src/main/java/net/lax1dude/eaglercraft/ServerQuery.java @@ -29,7 +29,7 @@ public interface ServerQuery { this.serverBrand = "Unknown"; this.serverName = "Unknown"; this.serverTime = 0l; - this.clientTime = System.currentTimeMillis(); + this.clientTime = EaglerAdapter.steadyTimeMillis(); this.serverCracked = false; this.rateLimitStatus = this.responseType.equals("locked") ? RateLimit.LOCKED : RateLimit.BLOCKED; this.rateLimitIsTCP = false; @@ -39,7 +39,7 @@ public interface ServerQuery { this.serverBrand = obj.getString("brand"); this.serverName = obj.getString("name"); this.serverTime = obj.getLong("time"); - this.clientTime = System.currentTimeMillis(); + this.clientTime = EaglerAdapter.steadyTimeMillis(); this.serverCracked = obj.optBoolean("cracked", false); this.rateLimitStatus = null; this.rateLimitIsTCP = false; @@ -53,7 +53,7 @@ public interface ServerQuery { this.serverBrand = "Unknown"; this.serverName = "Unknown"; this.serverTime = 0l; - this.clientTime = System.currentTimeMillis(); + this.clientTime = EaglerAdapter.steadyTimeMillis(); this.serverCracked = false; this.rateLimitStatus = lockedNotBlocked ? RateLimit.LOCKED : RateLimit.BLOCKED; this.rateLimitIsTCP = true; @@ -90,12 +90,9 @@ public interface ServerQuery { // java.util.concurrent classes for semaphore-like behavior public default boolean awaitResponseAvailable(long timeout) { - long start = System.currentTimeMillis(); - while(isQueryOpen() && responseAvailable() <= 0 && (timeout <= 0l || System.currentTimeMillis() - start < timeout)) { - try { - Thread.sleep(0l, 250000); - } catch (InterruptedException e) { - } + long start = EaglerAdapter.steadyTimeMillis(); + while(isQueryOpen() && responseAvailable() <= 0 && (timeout <= 0l || EaglerAdapter.steadyTimeMillis() - start < timeout)) { + EaglerAdapter.sleep(10); } return responseAvailable() > 0; } @@ -105,12 +102,9 @@ public interface ServerQuery { } public default boolean awaitResponseBinaryAvailable(long timeout) { - long start = System.currentTimeMillis(); - while(isQueryOpen() && responseBinaryAvailable() <= 0 && (timeout <= 0l || System.currentTimeMillis() - start < timeout)) { - try { - Thread.sleep(0l, 250000); - } catch (InterruptedException e) { - } + long start = EaglerAdapter.steadyTimeMillis(); + while(isQueryOpen() && responseBinaryAvailable() <= 0 && (timeout <= 0l || EaglerAdapter.steadyTimeMillis() - start < timeout)) { + EaglerAdapter.sleep(10); } return responseBinaryAvailable() > 0; } diff --git a/src/main/java/net/lax1dude/eaglercraft/TextureLocation.java b/src/main/java/net/lax1dude/eaglercraft/TextureLocation.java index 7c87d82..7a4adbc 100644 --- a/src/main/java/net/lax1dude/eaglercraft/TextureLocation.java +++ b/src/main/java/net/lax1dude/eaglercraft/TextureLocation.java @@ -33,6 +33,6 @@ public class TextureLocation { r.bindTexture(glObject); } - private static final ArrayList locations = new ArrayList(); + private static final ArrayList locations = new ArrayList<>(); } diff --git a/src/main/java/net/lax1dude/eaglercraft/TextureTerrainMap.java b/src/main/java/net/lax1dude/eaglercraft/TextureTerrainMap.java index 0111aad..829ee78 100644 --- a/src/main/java/net/lax1dude/eaglercraft/TextureTerrainMap.java +++ b/src/main/java/net/lax1dude/eaglercraft/TextureTerrainMap.java @@ -263,7 +263,7 @@ public class TextureTerrainMap implements IconRegister { this.height = size; this.basePath = par3Str; this.missingImage = new TerrainIconV2(nextSlot[1]++, 1, this, null); - this.iconList = new ArrayList(); + this.iconList = new ArrayList<>(); this.texture = EaglerAdapter.glGenTextures(); this.copyFramebuffer = EaglerAdapter._wglCreateFramebuffer(); EaglerAdapter.glBindTexture(EaglerAdapter.GL_TEXTURE_2D, texture); diff --git a/src/main/java/net/lax1dude/eaglercraft/WebsocketNetworkManager.java b/src/main/java/net/lax1dude/eaglercraft/WebsocketNetworkManager.java index 06ee3cc..674285f 100644 --- a/src/main/java/net/lax1dude/eaglercraft/WebsocketNetworkManager.java +++ b/src/main/java/net/lax1dude/eaglercraft/WebsocketNetworkManager.java @@ -65,7 +65,7 @@ public class WebsocketNetworkManager implements INetworkManager { } private ByteBuffer oldChunkBuffer = null; - private LinkedList readChunks = new LinkedList(); + private LinkedList readChunks = new LinkedList<>(); public void processReadPackets() { readChunks.clear(); diff --git a/src/main/java/net/lax1dude/eaglercraft/glemu/EaglerAdapterGL30.java b/src/main/java/net/lax1dude/eaglercraft/glemu/EaglerAdapterGL30.java index 26c0bdc..0e830a4 100644 --- a/src/main/java/net/lax1dude/eaglercraft/glemu/EaglerAdapterGL30.java +++ b/src/main/java/net/lax1dude/eaglercraft/glemu/EaglerAdapterGL30.java @@ -133,7 +133,7 @@ public class EaglerAdapterGL30 extends EaglerAdapterImpl2 { public static final boolean isWebGL = _wisWebGL(); - static final GLObjectMap texObjects = new GLObjectMap(256); + static final GLObjectMap texObjects = new GLObjectMap<>(256); static boolean enableTexture2D = false; static boolean enableTexture2D_1 = false; @@ -302,8 +302,8 @@ public class EaglerAdapterGL30 extends EaglerAdapterImpl2 { } } - private static final HashMap displayLists = new HashMap(); - private static final HashMap displayListsInitialized = new HashMap(); + private static final HashMap displayLists = new HashMap<>(); + private static final HashMap displayListsInitialized = new HashMap<>(); public static final int getDisplayListCount() { return displayListsInitialized.size(); @@ -1318,7 +1318,7 @@ public class EaglerAdapterGL30 extends EaglerAdapterImpl2 { } - private static final GLObjectMap queryObjs = new GLObjectMap(256); + private static final GLObjectMap queryObjs = new GLObjectMap<>(256); public static final int glCreateQuery() { return queryObjs.register(_wglCreateQuery()); @@ -1593,8 +1593,8 @@ public class EaglerAdapterGL30 extends EaglerAdapterImpl2 { private static int lastBandwidth = 0; public static final int getBitsPerSecond() { - if (System.currentTimeMillis() - lastBandwidthReset > 1000) { - lastBandwidthReset = System.currentTimeMillis(); + if (steadyTimeMillis() - lastBandwidthReset > 1000) { + lastBandwidthReset = steadyTimeMillis(); lastBandwidth = bytesUploaded * 8; bytesUploaded = 0; } diff --git a/src/main/java/net/lax1dude/eaglercraft/glemu/EffectPipeline.java b/src/main/java/net/lax1dude/eaglercraft/glemu/EffectPipeline.java index 20afd81..3f90ff9 100644 --- a/src/main/java/net/lax1dude/eaglercraft/glemu/EffectPipeline.java +++ b/src/main/java/net/lax1dude/eaglercraft/glemu/EffectPipeline.java @@ -6,13 +6,11 @@ import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.IntBuffer; -import net.lax1dude.eaglercraft.EaglerAdapter; import net.lax1dude.eaglercraft.EaglercraftRandom; import net.lax1dude.eaglercraft.adapter.Tessellator; import net.minecraft.client.Minecraft; import net.minecraft.src.EntityLiving; import net.minecraft.src.GLAllocation; -import net.minecraft.src.Gui; import net.minecraft.src.MathHelper; public class EffectPipeline { @@ -124,7 +122,7 @@ public class EffectPipeline { _wglViewport(0, 0, NOISE_WIDTH, NOISE_HEIGHT); _wglUseProgram(noiseProgram); - long l = System.currentTimeMillis(); + long l = steadyTimeMillis(); if(timer > 0l && l - timer < 20000l) { counter += (float)((l - timer) * 0.0007) * intensity; if(counter > 10000.0f) { diff --git a/src/main/java/net/lax1dude/eaglercraft/glemu/FixedFunctionShader.java b/src/main/java/net/lax1dude/eaglercraft/glemu/FixedFunctionShader.java index 7e348e1..4e0f5be 100644 --- a/src/main/java/net/lax1dude/eaglercraft/glemu/FixedFunctionShader.java +++ b/src/main/java/net/lax1dude/eaglercraft/glemu/FixedFunctionShader.java @@ -14,7 +14,7 @@ import net.lax1dude.eaglercraft.glemu.vector.Vector4f; public class FixedFunctionShader { private static final FixedFunctionShader[] instances = new FixedFunctionShader[4096]; //lol - private static final List instanceList = new ArrayList(); + private static final List instanceList = new ArrayList<>(); public static void refreshCoreGL() { for(int i = 0; i < instances.length; ++i) { diff --git a/src/main/java/net/lax1dude/eaglercraft/glemu/GameOverlayFramebuffer.java b/src/main/java/net/lax1dude/eaglercraft/glemu/GameOverlayFramebuffer.java index 74ceaad..e8b8624 100644 --- a/src/main/java/net/lax1dude/eaglercraft/glemu/GameOverlayFramebuffer.java +++ b/src/main/java/net/lax1dude/eaglercraft/glemu/GameOverlayFramebuffer.java @@ -45,11 +45,11 @@ public class GameOverlayFramebuffer { public void endRender() { _wglBindFramebuffer(_wGL_FRAMEBUFFER, null); - age = System.currentTimeMillis(); + age = steadyTimeMillis(); } public long getAge() { - return age == -1l ? -1l : (System.currentTimeMillis() - age); + return age == -1l ? -1l : (steadyTimeMillis() - age); } public void bindTexture() { diff --git a/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket.java b/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket.java index de9e628..d58e45c 100644 --- a/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket.java +++ b/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket.java @@ -11,8 +11,8 @@ import java.util.Map; public class IPacket { - private static final Map> definedPacketClasses = new HashMap(); - private static final Map,Integer> definedPacketIds = new HashMap(); + private static final Map> definedPacketClasses = new HashMap<>(); + private static final Map,Integer> definedPacketIds = new HashMap<>(); private static void register(int id, Class clazz) { definedPacketClasses.put(id, clazz); diff --git a/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket01ICEServers.java b/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket01ICEServers.java index 50875d8..c96cf53 100644 --- a/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket01ICEServers.java +++ b/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket01ICEServers.java @@ -10,7 +10,7 @@ public class IPacket01ICEServers extends IPacket { public final Collection servers; public IPacket01ICEServers() { - servers = new ArrayList(); + servers = new ArrayList<>(); } public void read(DataInputStream input) throws IOException { diff --git a/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket07LocalWorlds.java b/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket07LocalWorlds.java index 25f0e4a..769c188 100644 --- a/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket07LocalWorlds.java +++ b/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket07LocalWorlds.java @@ -22,7 +22,7 @@ public class IPacket07LocalWorlds extends IPacket { public final List worldsList; public IPacket07LocalWorlds() { - this.worldsList = new ArrayList(); + this.worldsList = new ArrayList<>(); } public void read(DataInputStream input) throws IOException { diff --git a/src/main/java/net/minecraft/client/Minecraft.java b/src/main/java/net/minecraft/client/Minecraft.java index 9603def..74c1d6e 100644 --- a/src/main/java/net/minecraft/client/Minecraft.java +++ b/src/main/java/net/minecraft/client/Minecraft.java @@ -379,7 +379,7 @@ public class Minecraft implements Runnable { EaglerAdapter.glDisable(EaglerAdapter.GL_FOG); EaglerAdapter.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - long t1 = System.currentTimeMillis(); + long t1 = EaglerAdapter.steadyTimeMillis(); for(int i = 0; i < 20; i++) { this.displayWidth = EaglerAdapter.getCanvasWidth(); this.displayHeight = EaglerAdapter.getCanvasHeight(); @@ -390,7 +390,7 @@ public class Minecraft implements Runnable { EaglerAdapter.glOrtho(0.0F, var1.getScaledWidth(), var1.getScaledHeight(), 0.0F, 1000.0F, 3000.0F); EaglerAdapter.glMatrixMode(EaglerAdapter.GL_MODELVIEW); - float f = ((float)(System.currentTimeMillis() - t1) / 333f); + float f = ((float)(EaglerAdapter.steadyTimeMillis() - t1) / 333f); EaglerAdapter.glClear(EaglerAdapter.GL_COLOR_BUFFER_BIT | EaglerAdapter.GL_DEPTH_BUFFER_BIT); EaglerAdapter.glColor4f(1.0F, 1.0F, 1.0F, MathHelper.clamp_float(1.0f - f, 0.0F, 1.0F)); @@ -406,17 +406,13 @@ public class Minecraft implements Runnable { EaglerAdapter.glFlush(); EaglerAdapter.updateDisplay(); - long t = t1 + 17 + 17*i - System.currentTimeMillis(); + long t = t1 + 17 + 17*i - EaglerAdapter.steadyTimeMillis(); if(t > 0) { - try { - Thread.sleep(t); - } catch (InterruptedException e) { - e.printStackTrace(); - } + EaglerAdapter.sleep((int)t); } } - t1 = System.currentTimeMillis(); + t1 = EaglerAdapter.steadyTimeMillis(); for(int i = 0; i < 20; i++) { this.displayWidth = EaglerAdapter.getCanvasWidth(); this.displayHeight = EaglerAdapter.getCanvasHeight(); @@ -427,7 +423,7 @@ public class Minecraft implements Runnable { EaglerAdapter.glOrtho(0.0F, var1.getScaledWidth(), var1.getScaledHeight(), 0.0F, 1000.0F, 3000.0F); EaglerAdapter.glMatrixMode(EaglerAdapter.GL_MODELVIEW); - float f = ((float)(System.currentTimeMillis() - t1) / 333f); + float f = ((float)(EaglerAdapter.steadyTimeMillis() - t1) / 333f); EaglerAdapter.glClear(EaglerAdapter.GL_COLOR_BUFFER_BIT | EaglerAdapter.GL_DEPTH_BUFFER_BIT); EaglerAdapter.glColor4f(1.0F, 1.0F, 1.0F, MathHelper.clamp_float(f, 0.0F, 1.0F)); @@ -443,30 +439,22 @@ public class Minecraft implements Runnable { EaglerAdapter.glFlush(); EaglerAdapter.updateDisplay(); - long t = t1 + 17 + 17*i - System.currentTimeMillis(); + long t = t1 + 17 + 17*i - EaglerAdapter.steadyTimeMillis(); if(t > 0) { - try { - Thread.sleep(t); - } catch (InterruptedException e) { - e.printStackTrace(); - } + EaglerAdapter.sleep((int)t); } } - try { - Thread.sleep(1600l); - } catch (InterruptedException e) { - e.printStackTrace(); - } + EaglerAdapter.sleep(1600); - t1 = System.currentTimeMillis(); + t1 = EaglerAdapter.steadyTimeMillis(); for(int i = 0; i < 21; i++) { this.displayWidth = EaglerAdapter.getCanvasWidth(); this.displayHeight = EaglerAdapter.getCanvasHeight(); EaglerAdapter.glViewport(0, 0, this.displayWidth, this.displayHeight); var1 = new ScaledResolution(this.gameSettings, this.displayWidth, this.displayHeight); - float f = ((float)(System.currentTimeMillis() - t1) / 340f); + float f = ((float)(EaglerAdapter.steadyTimeMillis() - t1) / 340f); EaglerAdapter.glClear(EaglerAdapter.GL_COLOR_BUFFER_BIT | EaglerAdapter.GL_DEPTH_BUFFER_BIT); EaglerAdapter.glColor4f(1.0F, 1.0F, 1.0F, MathHelper.clamp_float((1.0f - f), 0.0F, 1.0F)); @@ -482,13 +470,9 @@ public class Minecraft implements Runnable { EaglerAdapter.glFlush(); EaglerAdapter.updateDisplay(); - long t = t1 + 17 + 17*i - System.currentTimeMillis(); + long t = t1 + 17 + 17*i - EaglerAdapter.steadyTimeMillis(); if(t > 0) { - try { - Thread.sleep(t); - } catch (InterruptedException e) { - e.printStackTrace(); - } + EaglerAdapter.sleep((int)t); } } @@ -496,11 +480,7 @@ public class Minecraft implements Runnable { EaglerAdapter.glFlush(); EaglerAdapter.updateDisplay(); - try { - Thread.sleep(100l); - } catch (InterruptedException e) { - e.printStackTrace(); - } + EaglerAdapter.sleep(100); EaglerAdapter.glDisable(EaglerAdapter.GL_BLEND); EaglerAdapter.glEnable(EaglerAdapter.GL_ALPHA_TEST); @@ -792,14 +772,14 @@ public class Minecraft implements Runnable { //boolean var5 = this.isGamePaused; //this.isGamePaused = false; - if(System.currentTimeMillis() - secondTimer > 1000l) { + if(EaglerAdapter.steadyTimeMillis() - secondTimer > 1000l) { debugFPS = fpsCounter; fpsCounter = 0; debugChunkUpdates = chunkUpdates; chunkUpdates = 0; debugChunkGeometryUpdates = chunkGeometryUpdates; chunkGeometryUpdates = 0; - secondTimer = System.currentTimeMillis(); + secondTimer = EaglerAdapter.steadyTimeMillis(); } this.mcProfiler.startSection("syncDisplay"); @@ -1892,7 +1872,7 @@ public class Minecraft implements Runnable { * Gets the system time in milliseconds. */ public static long getSystemTime() { - return System.currentTimeMillis(); + return EaglerAdapter.steadyTimeMillis(); } /** diff --git a/src/main/java/net/minecraft/src/EntityAgeable.java b/src/main/java/net/minecraft/src/EntityAgeable.java index 6873dd1..fdb6040 100644 --- a/src/main/java/net/minecraft/src/EntityAgeable.java +++ b/src/main/java/net/minecraft/src/EntityAgeable.java @@ -8,7 +8,7 @@ public abstract class EntityAgeable extends EntityCreature { protected void entityInit() { super.entityInit(); - this.dataWatcher.addObject(12, new Integer(0)); + this.dataWatcher.addObject(12, Integer.valueOf(0)); } /** diff --git a/src/main/java/net/minecraft/src/EntityBat.java b/src/main/java/net/minecraft/src/EntityBat.java index 0d20147..5fedd0b 100644 --- a/src/main/java/net/minecraft/src/EntityBat.java +++ b/src/main/java/net/minecraft/src/EntityBat.java @@ -20,7 +20,7 @@ public class EntityBat extends EntityAmbientCreature { protected void entityInit() { super.entityInit(); - this.dataWatcher.addObject(16, new Byte((byte) 0)); + this.dataWatcher.addObject(16, Byte.valueOf((byte) 0)); } /** diff --git a/src/main/java/net/minecraft/src/EntityBlaze.java b/src/main/java/net/minecraft/src/EntityBlaze.java index 1093e46..0739ab0 100644 --- a/src/main/java/net/minecraft/src/EntityBlaze.java +++ b/src/main/java/net/minecraft/src/EntityBlaze.java @@ -22,7 +22,7 @@ public class EntityBlaze extends EntityMob { protected void entityInit() { super.entityInit(); - this.dataWatcher.addObject(16, new Byte((byte) 0)); + this.dataWatcher.addObject(16, Byte.valueOf((byte) 0)); } /** diff --git a/src/main/java/net/minecraft/src/EntityBoat.java b/src/main/java/net/minecraft/src/EntityBoat.java index 23dd7ae..b16b85a 100644 --- a/src/main/java/net/minecraft/src/EntityBoat.java +++ b/src/main/java/net/minecraft/src/EntityBoat.java @@ -31,9 +31,9 @@ public class EntityBoat extends Entity { } protected void entityInit() { - this.dataWatcher.addObject(17, new Integer(0)); - this.dataWatcher.addObject(18, new Integer(1)); - this.dataWatcher.addObject(19, new Integer(0)); + this.dataWatcher.addObject(17, Integer.valueOf(0)); + this.dataWatcher.addObject(18, Integer.valueOf(1)); + this.dataWatcher.addObject(19, Integer.valueOf(0)); } /** diff --git a/src/main/java/net/minecraft/src/EntityDragon.java b/src/main/java/net/minecraft/src/EntityDragon.java index fdcdb5e..6be9ae9 100644 --- a/src/main/java/net/minecraft/src/EntityDragon.java +++ b/src/main/java/net/minecraft/src/EntityDragon.java @@ -80,7 +80,7 @@ public class EntityDragon extends EntityLiving implements IBossDisplayData, IEnt protected void entityInit() { super.entityInit(); - this.dataWatcher.addObject(16, new Integer(this.getMaxHealth())); + this.dataWatcher.addObject(16, Integer.valueOf(this.getMaxHealth())); } /** diff --git a/src/main/java/net/minecraft/src/EntityEnderman.java b/src/main/java/net/minecraft/src/EntityEnderman.java index a5bff0f..d0c7bac 100644 --- a/src/main/java/net/minecraft/src/EntityEnderman.java +++ b/src/main/java/net/minecraft/src/EntityEnderman.java @@ -24,9 +24,9 @@ public class EntityEnderman extends EntityMob { protected void entityInit() { super.entityInit(); - this.dataWatcher.addObject(16, new Byte((byte) 0)); - this.dataWatcher.addObject(17, new Byte((byte) 0)); - this.dataWatcher.addObject(18, new Byte((byte) 0)); + this.dataWatcher.addObject(16, Byte.valueOf((byte) 0)); + this.dataWatcher.addObject(17, Byte.valueOf((byte) 0)); + this.dataWatcher.addObject(18, Byte.valueOf((byte) 0)); } /** diff --git a/src/main/java/net/minecraft/src/EntityMinecart.java b/src/main/java/net/minecraft/src/EntityMinecart.java index 55d301d..8b824f6 100644 --- a/src/main/java/net/minecraft/src/EntityMinecart.java +++ b/src/main/java/net/minecraft/src/EntityMinecart.java @@ -74,11 +74,11 @@ public abstract class EntityMinecart extends Entity { } protected void entityInit() { - this.dataWatcher.addObject(17, new Integer(0)); - this.dataWatcher.addObject(18, new Integer(1)); - this.dataWatcher.addObject(19, new Integer(0)); - this.dataWatcher.addObject(20, new Integer(0)); - this.dataWatcher.addObject(21, new Integer(6)); + this.dataWatcher.addObject(17, Integer.valueOf(0)); + this.dataWatcher.addObject(18, Integer.valueOf(1)); + this.dataWatcher.addObject(19, Integer.valueOf(0)); + this.dataWatcher.addObject(20, Integer.valueOf(0)); + this.dataWatcher.addObject(21, Integer.valueOf(6)); this.dataWatcher.addObject(22, Byte.valueOf((byte) 0)); } diff --git a/src/main/java/net/minecraft/src/EntityMinecartFurnace.java b/src/main/java/net/minecraft/src/EntityMinecartFurnace.java index 98ba5b1..ce94f0c 100644 --- a/src/main/java/net/minecraft/src/EntityMinecartFurnace.java +++ b/src/main/java/net/minecraft/src/EntityMinecartFurnace.java @@ -22,7 +22,7 @@ public class EntityMinecartFurnace extends EntityMinecart { protected void entityInit() { super.entityInit(); - this.dataWatcher.addObject(16, new Byte((byte) 0)); + this.dataWatcher.addObject(16, Byte.valueOf((byte) 0)); } /** diff --git a/src/main/java/net/minecraft/src/EntityPlayer.java b/src/main/java/net/minecraft/src/EntityPlayer.java index a45c8bd..97b1ef9 100644 --- a/src/main/java/net/minecraft/src/EntityPlayer.java +++ b/src/main/java/net/minecraft/src/EntityPlayer.java @@ -5,6 +5,7 @@ import java.util.Iterator; import java.util.List; import net.lax1dude.eaglercraft.DefaultSkinRenderer; +import net.lax1dude.eaglercraft.EaglerAdapter; import net.minecraft.client.Minecraft; public abstract class EntityPlayer extends EntityLiving implements ICommandSender { @@ -35,7 +36,7 @@ public abstract class EntityPlayer extends EntityLiving implements ICommandSende public float cameraYaw; public String username; - public long eaglerHighPolyAnimationTick = System.currentTimeMillis(); + public long eaglerHighPolyAnimationTick = EaglerAdapter.steadyTimeMillis(); public float eaglerHighPolyAnimationFloat1 = 0.0f; public float eaglerHighPolyAnimationFloat2 = 0.0f; public float eaglerHighPolyAnimationFloat3 = 0.0f; diff --git a/src/main/java/net/minecraft/src/EntityRenderer.java b/src/main/java/net/minecraft/src/EntityRenderer.java index e77cfb8..95fcee1 100644 --- a/src/main/java/net/minecraft/src/EntityRenderer.java +++ b/src/main/java/net/minecraft/src/EntityRenderer.java @@ -502,7 +502,7 @@ public class EntityRenderer { if(i < 0.0f) i = 0.0f; float i2 = i * i; if(i2 > 0.0f) { - float f = (float)((System.currentTimeMillis() % 10000000l) * 0.0002); + float f = (float)((EaglerAdapter.steadyTimeMillis() % 10000000l) * 0.0002); f += MathHelper.sin(f * 5.0f) * 0.2f; i2 *= MathHelper.sin(f) + MathHelper.sin(f * 1.5f + 0.6f) + MathHelper.sin(f * 0.7f + 1.7f) + MathHelper.sin(f * 3.0f + 3.0f) + MathHelper.sin(f * 5.25f + 1.2f); @@ -531,7 +531,7 @@ public class EntityRenderer { i2 = i * i; if(i > 0.0f) { - float f = (float)((System.currentTimeMillis() % 10000000l) * 0.00012); + float f = (float)((EaglerAdapter.steadyTimeMillis() % 10000000l) * 0.00012); f += MathHelper.sin(f * 3.0f) * 0.2f; i2 *= MathHelper.sin(f * 1.2f + 1.0f) + MathHelper.sin(f * 1.5f + 0.8f) * 3.0f + MathHelper.sin(f * 0.6f + 3.0f) + MathHelper.sin(f * 4.3f) + MathHelper.sin(f * 5.25f + 0.5f); @@ -609,7 +609,7 @@ public class EntityRenderer { if(i < 0.0f) i = 0.0f; float i2 = i * i; if(i2 > 0.0f) { - float f = (float)((System.currentTimeMillis() % 10000000l) * 0.0003); + float f = (float)((EaglerAdapter.steadyTimeMillis() % 10000000l) * 0.0003); f += MathHelper.sin(f * 3.0f) * 0.2f; i2 *= MathHelper.sin(f * 1.2f + 1.0f) + MathHelper.sin(f * 1.5f + 0.8f) * 3.0f + MathHelper.sin(f * 0.6f + 3.0f) + MathHelper.sin(f * 4.3f) + MathHelper.sin(f * 5.25f + 0.5f); @@ -1236,7 +1236,7 @@ public class EntityRenderer { } private int updateCounter = 0; - private int randomOffset = (int)(System.currentTimeMillis() % 100000l); + private int randomOffset = (int)(EaglerAdapter.steadyTimeMillis() % 100000l); public boolean asdfghjkl = false; diff --git a/src/main/java/net/minecraft/src/EntitySheep.java b/src/main/java/net/minecraft/src/EntitySheep.java index e83196a..392df73 100644 --- a/src/main/java/net/minecraft/src/EntitySheep.java +++ b/src/main/java/net/minecraft/src/EntitySheep.java @@ -55,7 +55,7 @@ public class EntitySheep extends EntityAnimal { protected void entityInit() { super.entityInit(); - this.dataWatcher.addObject(16, new Byte((byte) 0)); + this.dataWatcher.addObject(16, Byte.valueOf((byte) 0)); } /** diff --git a/src/main/java/net/minecraft/src/EntitySkeleton.java b/src/main/java/net/minecraft/src/EntitySkeleton.java index 65ba06f..5249ed2 100644 --- a/src/main/java/net/minecraft/src/EntitySkeleton.java +++ b/src/main/java/net/minecraft/src/EntitySkeleton.java @@ -9,7 +9,7 @@ public class EntitySkeleton extends EntityMob implements IRangedAttackMob { protected void entityInit() { super.entityInit(); - this.dataWatcher.addObject(13, new Byte((byte) 0)); + this.dataWatcher.addObject(13, Byte.valueOf((byte) 0)); } /** diff --git a/src/main/java/net/minecraft/src/EntitySlime.java b/src/main/java/net/minecraft/src/EntitySlime.java index 7d5fe05..6e1564d 100644 --- a/src/main/java/net/minecraft/src/EntitySlime.java +++ b/src/main/java/net/minecraft/src/EntitySlime.java @@ -22,11 +22,11 @@ public class EntitySlime extends EntityLiving implements IMob { protected void entityInit() { super.entityInit(); - this.dataWatcher.addObject(16, new Byte((byte) 1)); + this.dataWatcher.addObject(16, Byte.valueOf((byte) 1)); } protected void setSlimeSize(int par1) { - this.dataWatcher.updateObject(16, new Byte((byte) par1)); + this.dataWatcher.updateObject(16, Byte.valueOf((byte) par1)); this.setSize(0.6F * (float) par1, 0.6F * (float) par1); this.setPosition(this.posX, this.posY, this.posZ); this.setEntityHealth(this.getMaxHealth()); diff --git a/src/main/java/net/minecraft/src/EntitySpider.java b/src/main/java/net/minecraft/src/EntitySpider.java index ee2e27f..f933c2f 100644 --- a/src/main/java/net/minecraft/src/EntitySpider.java +++ b/src/main/java/net/minecraft/src/EntitySpider.java @@ -9,7 +9,7 @@ public class EntitySpider extends EntityMob { protected void entityInit() { super.entityInit(); - this.dataWatcher.addObject(16, new Byte((byte) 0)); + this.dataWatcher.addObject(16, Byte.valueOf((byte) 0)); } public int getMaxHealth() { diff --git a/src/main/java/net/minecraft/src/EntityWither.java b/src/main/java/net/minecraft/src/EntityWither.java index 7617eb1..7e5767a 100644 --- a/src/main/java/net/minecraft/src/EntityWither.java +++ b/src/main/java/net/minecraft/src/EntityWither.java @@ -27,11 +27,11 @@ public class EntityWither extends EntityMob implements IBossDisplayData, IRanged protected void entityInit() { super.entityInit(); - this.dataWatcher.addObject(16, new Integer(100)); - this.dataWatcher.addObject(17, new Integer(0)); - this.dataWatcher.addObject(18, new Integer(0)); - this.dataWatcher.addObject(19, new Integer(0)); - this.dataWatcher.addObject(20, new Integer(0)); + this.dataWatcher.addObject(16, Integer.valueOf(100)); + this.dataWatcher.addObject(17, Integer.valueOf(0)); + this.dataWatcher.addObject(18, Integer.valueOf(0)); + this.dataWatcher.addObject(19, Integer.valueOf(0)); + this.dataWatcher.addObject(20, Integer.valueOf(0)); } /** diff --git a/src/main/java/net/minecraft/src/EntityWolf.java b/src/main/java/net/minecraft/src/EntityWolf.java index c45a99c..decd4e8 100644 --- a/src/main/java/net/minecraft/src/EntityWolf.java +++ b/src/main/java/net/minecraft/src/EntityWolf.java @@ -53,9 +53,9 @@ public class EntityWolf extends EntityTameable { protected void entityInit() { super.entityInit(); - this.dataWatcher.addObject(18, new Integer(this.getHealth())); - this.dataWatcher.addObject(19, new Byte((byte) 0)); - this.dataWatcher.addObject(20, new Byte((byte) BlockCloth.getBlockFromDye(1))); + this.dataWatcher.addObject(18, Integer.valueOf(this.getHealth())); + this.dataWatcher.addObject(19, Byte.valueOf((byte) 0)); + this.dataWatcher.addObject(20, Byte.valueOf((byte) BlockCloth.getBlockFromDye(1))); } /** diff --git a/src/main/java/net/minecraft/src/GuiIngame.java b/src/main/java/net/minecraft/src/GuiIngame.java index 7c481b0..b061988 100644 --- a/src/main/java/net/minecraft/src/GuiIngame.java +++ b/src/main/java/net/minecraft/src/GuiIngame.java @@ -10,7 +10,6 @@ import net.lax1dude.eaglercraft.EnumBrowser; import net.lax1dude.eaglercraft.IntegratedServer; import net.lax1dude.eaglercraft.TextureLocation; import net.lax1dude.eaglercraft.adapter.Tessellator; -import net.lax1dude.eaglercraft.glemu.EffectPipeline; import net.minecraft.client.Minecraft; public class GuiIngame extends Gui { @@ -749,7 +748,7 @@ public class GuiIngame extends Gui { if(i < 0.0f) i = 0.0f; float i2 = i * i; if(i2 > 0.0f) { - float f = (float)((System.currentTimeMillis() % 1000000l) * 0.0002); + float f = (float)((EaglerAdapter.steadyTimeMillis() % 1000000l) * 0.0002); f += MathHelper.sin(f * 5.0f) * 0.2f; i2 *= MathHelper.sin(f) + MathHelper.sin(f * 1.5f + 0.6f) + MathHelper.sin(f * 0.7f + 1.7f) + MathHelper.sin(f * 3.0f + 3.0f); diff --git a/src/main/java/net/minecraft/src/GuiMainMenu.java b/src/main/java/net/minecraft/src/GuiMainMenu.java index 4578942..767ccf6 100644 --- a/src/main/java/net/minecraft/src/GuiMainMenu.java +++ b/src/main/java/net/minecraft/src/GuiMainMenu.java @@ -87,7 +87,7 @@ public class GuiMainMenu extends GuiScreen { } } this.field_92025_p = "Eaglercraft 1.5.2 Service Pack #1"; - this.start = System.currentTimeMillis(); + this.start = EaglerAdapter.steadyTimeMillis(); this.start += this.start % 10000l; this.ackLines = new ArrayList(); @@ -342,7 +342,7 @@ public class GuiMainMenu extends GuiScreen { float var9 = 0.0F; EaglerAdapter.glTranslatef(var7, var8, var9); - float panTimer = (float)(System.currentTimeMillis() - start) * 0.03f; + float panTimer = (float)(EaglerAdapter.steadyTimeMillis() - start) * 0.03f; EaglerAdapter.glRotatef(MathHelper.sin(panTimer / 400.0F) * 25.0F + 20.0F, 1.0F, 0.0F, 0.0F); EaglerAdapter.glRotatef(-(panTimer) * 0.1F, 0.0F, 1.0F, 0.0F); } @@ -646,7 +646,7 @@ public class GuiMainMenu extends GuiScreen { }else { EaglerAdapter.glEnable(EaglerAdapter.GL_BLEND); EaglerAdapter.glBlendFunc(EaglerAdapter.GL_SRC_ALPHA, EaglerAdapter.GL_ONE_MINUS_SRC_ALPHA); - EaglerAdapter.glColor4f(0.9f, 0.9f, 0.9f, MathHelper.sin((float)(System.currentTimeMillis() % 1000000l) / 300f) * 0.17f + 0.5f); + EaglerAdapter.glColor4f(0.9f, 0.9f, 0.9f, MathHelper.sin((float)(EaglerAdapter.steadyTimeMillis() % 1000000l) / 300f) * 0.17f + 0.5f); items.bindTexture(); diff --git a/src/main/java/net/minecraft/src/GuiMultiplayer.java b/src/main/java/net/minecraft/src/GuiMultiplayer.java index a152459..375a4a7 100644 --- a/src/main/java/net/minecraft/src/GuiMultiplayer.java +++ b/src/main/java/net/minecraft/src/GuiMultiplayer.java @@ -1,8 +1,5 @@ package net.minecraft.src; -import java.util.LinkedList; -import java.util.List; - import net.lax1dude.eaglercraft.ConfigConstants; import net.lax1dude.eaglercraft.EaglerAdapter; import net.lax1dude.eaglercraft.GuiNetworkSettingsButton; @@ -81,7 +78,7 @@ public class GuiMultiplayer extends GuiScreen { public static void tickRefreshCooldown() { if(cooldownTimer > 0) { - long t = System.currentTimeMillis(); + long t = EaglerAdapter.steadyTimeMillis(); if(t - lastCooldown > 5000l) { --cooldownTimer; lastCooldown = t; @@ -90,7 +87,7 @@ public class GuiMultiplayer extends GuiScreen { } private static boolean testIfCanRefresh() { - long t = System.currentTimeMillis(); + long t = EaglerAdapter.steadyTimeMillis(); if(t - lastRefresh > 1000l) { lastRefresh = t; if(cooldownTimer < 8) { diff --git a/src/main/java/net/minecraft/src/GuiTexturePacks.java b/src/main/java/net/minecraft/src/GuiTexturePacks.java index d1c8a54..e4c748f 100644 --- a/src/main/java/net/minecraft/src/GuiTexturePacks.java +++ b/src/main/java/net/minecraft/src/GuiTexturePacks.java @@ -2,8 +2,6 @@ package net.minecraft.src; import net.lax1dude.eaglercraft.EaglerAdapter; import net.lax1dude.eaglercraft.adapter.SimpleStorage; -import net.minecraft.client.Minecraft; - import java.util.List; public class GuiTexturePacks extends GuiScreen { diff --git a/src/main/java/net/minecraft/src/Packet.java b/src/main/java/net/minecraft/src/Packet.java index 0113147..5db7cdb 100644 --- a/src/main/java/net/minecraft/src/Packet.java +++ b/src/main/java/net/minecraft/src/Packet.java @@ -8,6 +8,8 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; +import net.lax1dude.eaglercraft.EaglerAdapter; + public abstract class Packet { /** Maps packet id to packet class */ public static IntHashMap packetIdToClassMap = new IntHashMap(); @@ -23,7 +25,7 @@ public abstract class Packet { protected ILogAgent field_98193_m; /** the system time in milliseconds when this packet was created. */ - public final long creationTimeMillis = System.currentTimeMillis(); + public final long creationTimeMillis = EaglerAdapter.steadyTimeMillis(); public static long receivedID; public static long receivedSize; diff --git a/src/main/java/net/minecraft/src/RenderGlobal.java b/src/main/java/net/minecraft/src/RenderGlobal.java index be11bb7..671ea86 100644 --- a/src/main/java/net/minecraft/src/RenderGlobal.java +++ b/src/main/java/net/minecraft/src/RenderGlobal.java @@ -572,7 +572,7 @@ public class RenderGlobal implements IWorldAccess { long stallRate = 500l; int cooldownRate = 13; - long ct = System.currentTimeMillis(); + long ct = EaglerAdapter.steadyTimeMillis(); if(par2 == 0) { this.theWorld.theProfiler.endStartSection("getoccl"); for (int i = 0; i < this.sortedWorldRenderers.length; ++i) { @@ -620,7 +620,7 @@ public class RenderGlobal implements IWorldAccess { var7 -= par1EntityLiving.getEyeHeight(); - ct = System.currentTimeMillis(); + ct = EaglerAdapter.steadyTimeMillis(); if(par2 == 0 && ct - lastOcclusionQuery > queryRate) { int totalRenderers = this.sortedWorldRenderers.length; diff --git a/src/main/java/net/minecraft/src/RenderPlayer.java b/src/main/java/net/minecraft/src/RenderPlayer.java index a235db0..73fcf67 100644 --- a/src/main/java/net/minecraft/src/RenderPlayer.java +++ b/src/main/java/net/minecraft/src/RenderPlayer.java @@ -178,7 +178,7 @@ public class RenderPlayer extends RenderLiving { if(msh.headModel != null) { if(msh == HighPolySkin.BABY_CHARLES) { - long millis = System.currentTimeMillis(); + long millis = EaglerAdapter.steadyTimeMillis(); float partialTicks = (float) ((millis - par1EntityPlayer.eaglerHighPolyAnimationTick) * 0.02); //long l50 = millis / 50l * 50l; //boolean runTick = par1EntityPlayer.eaglerHighPolyAnimationTick < l50 && millis >= l50; diff --git a/src/main/java/net/minecraft/src/ServerList.java b/src/main/java/net/minecraft/src/ServerList.java index 2ad4b7a..608e2fa 100644 --- a/src/main/java/net/minecraft/src/ServerList.java +++ b/src/main/java/net/minecraft/src/ServerList.java @@ -278,7 +278,7 @@ public class ServerList { addr = "ws://" + addr; } } - dat.pingSentTime = System.currentTimeMillis(); + dat.pingSentTime = EaglerAdapter.steadyTimeMillis(); dat.currentQuery = EaglerAdapter.openQuery("MOTD", addr); if(dat.currentQuery == null) { dat.hasPing = true; diff --git a/src/main/java/net/minecraft/src/SoundManager.java b/src/main/java/net/minecraft/src/SoundManager.java index fbc1af4..064a1d1 100644 --- a/src/main/java/net/minecraft/src/SoundManager.java +++ b/src/main/java/net/minecraft/src/SoundManager.java @@ -155,7 +155,7 @@ public class SoundManager { String path = "/records/" + par1Str.replace('.', '/') + ".mp3"; int snd = EaglerAdapter.beginPlayback(path, par2, par3, par4, 1.0F, 1.0F, music); if (snd != -1) { - activerecords.add(new Integer(snd)); + activerecords.add(Integer.valueOf(snd)); } else { System.err.println("unregistered record: "+par1Str); } diff --git a/src/main/java/net/minecraft/src/StringTranslate.java b/src/main/java/net/minecraft/src/StringTranslate.java index 931492d..3ac56d7 100644 --- a/src/main/java/net/minecraft/src/StringTranslate.java +++ b/src/main/java/net/minecraft/src/StringTranslate.java @@ -1,8 +1,6 @@ package net.minecraft.src; -import java.io.BufferedReader; import java.io.IOException; -import java.io.InputStreamReader; import java.util.IllegalFormatException; import java.util.Properties; import java.util.TreeMap; diff --git a/src/main/java/net/minecraft/src/TextureStitched.java b/src/main/java/net/minecraft/src/TextureStitched.java index 7ae57a9..f4c41c6 100644 --- a/src/main/java/net/minecraft/src/TextureStitched.java +++ b/src/main/java/net/minecraft/src/TextureStitched.java @@ -183,11 +183,11 @@ public class TextureStitched implements Icon { int var9 = var8.indexOf(42); if (var9 > 0) { - Integer var10 = new Integer(var8.substring(0, var9)); - Integer var11 = new Integer(var8.substring(var9 + 1)); + Integer var10 = Integer.valueOf(var8.substring(0, var9)); + Integer var11 = Integer.valueOf(var8.substring(var9 + 1)); var2.add(new Tuple(var10, var11)); } else { - var2.add(new Tuple(new Integer(var8), Integer.valueOf(1))); + var2.add(new Tuple(Integer.valueOf(var8), Integer.valueOf(1))); } } } diff --git a/src/main/java/net/minecraft/src/TileEntityBeaconRenderer.java b/src/main/java/net/minecraft/src/TileEntityBeaconRenderer.java index 01d9254..7440de9 100644 --- a/src/main/java/net/minecraft/src/TileEntityBeaconRenderer.java +++ b/src/main/java/net/minecraft/src/TileEntityBeaconRenderer.java @@ -25,7 +25,7 @@ public class TileEntityBeaconRenderer extends TileEntitySpecialRenderer { EaglerAdapter.glDisable(EaglerAdapter.GL_ALPHA_TEST); EaglerAdapter.glDepthMask(true); EaglerAdapter.glBlendFunc(EaglerAdapter.GL_SRC_ALPHA, EaglerAdapter.GL_ONE); - float var11 = ((System.currentTimeMillis() % 200000) / 50.0f);//par1TileEntityBeacon.getWorldObj().getWorldTime() + par8; + float var11 = ((EaglerAdapter.steadyTimeMillis() % 200000) / 50.0f);//par1TileEntityBeacon.getWorldObj().getWorldTime() + par8; float var12 = -var11 * 0.2F - (float) MathHelper.floor_float(-var11 * 0.1F); byte var13 = 1; double var14 = (double) var11 * 0.025D * (1.0D - (double) (var13 & 1) * 2.5D); diff --git a/src/teavm/java/net/lax1dude/eaglercraft/adapter/DetectAnisotropicGlitch.java b/src/teavm/java/net/lax1dude/eaglercraft/adapter/DetectAnisotropicGlitch.java index ddd5869..db51e74 100644 --- a/src/teavm/java/net/lax1dude/eaglercraft/adapter/DetectAnisotropicGlitch.java +++ b/src/teavm/java/net/lax1dude/eaglercraft/adapter/DetectAnisotropicGlitch.java @@ -127,7 +127,7 @@ public class DetectAnisotropicGlitch { x0, x0, x0, x1 }; - Uint8Array pixels = Uint8Array.create(pixelsData.length); + Uint8Array pixels = new Uint8Array(pixelsData.length); pixels.set(pixelsData); WebGLTexture tex = ctx.createTexture(); @@ -152,7 +152,7 @@ public class DetectAnisotropicGlitch { 0.0f, 1.0f }; - Float32Array verts = Float32Array.create(vertsData.length); + Float32Array verts = new Float32Array(vertsData.length); verts.set(vertsData); WebGLBuffer buf = ctx.createBuffer(); @@ -175,7 +175,7 @@ public class DetectAnisotropicGlitch { ctx.deleteTexture(tex); ctx.deleteProgram(pr); - Uint8Array readPx = Uint8Array.create(4); + Uint8Array readPx = new Uint8Array(4); ctx.readPixels(175, 150, 1, 1, RGBA, UNSIGNED_BYTE, readPx); boolean b = (readPx.get(0) + readPx.get(1) + readPx.get(2)) != 0; diff --git a/src/teavm/java/net/lax1dude/eaglercraft/adapter/EaglerAdapterImpl2.java b/src/teavm/java/net/lax1dude/eaglercraft/adapter/EaglerAdapterImpl2.java index 67272f3..fd22d50 100644 --- a/src/teavm/java/net/lax1dude/eaglercraft/adapter/EaglerAdapterImpl2.java +++ b/src/teavm/java/net/lax1dude/eaglercraft/adapter/EaglerAdapterImpl2.java @@ -85,6 +85,8 @@ import org.teavm.jso.webgl.WebGLUniformLocation; import org.teavm.jso.websocket.CloseEvent; import org.teavm.jso.websocket.WebSocket; import org.teavm.jso.workers.Worker; +import org.teavm.platform.Platform; +import org.teavm.platform.PlatformRunnable; import net.lax1dude.eaglercraft.AssetRepository; import net.lax1dude.eaglercraft.Base64; @@ -169,14 +171,14 @@ public class EaglerAdapterImpl2 { public static native String downloadAssetPack(String assetPackageURI); private static void downloadAssetPack(String assetPackageURI, final AsyncCallback cb) { - final XMLHttpRequest request = XMLHttpRequest.create(); + final XMLHttpRequest request = new XMLHttpRequest(); request.setResponseType("arraybuffer"); request.open("GET", assetPackageURI, true); request.setOnReadyStateChange(new ReadyStateChangeHandler() { @Override public void stateChanged() { if(request.getReadyState() == XMLHttpRequest.DONE) { - Uint8Array bl = Uint8Array.create((ArrayBuffer)request.getResponse()); + Uint8Array bl = new Uint8Array((ArrayBuffer)request.getResponse()); loadedPackage = new byte[bl.getByteLength()]; for(int i = 0; i < loadedPackage.length; ++i) { loadedPackage[i] = (byte) bl.get(i); @@ -196,14 +198,14 @@ public class EaglerAdapterImpl2 { cb.complete(new byte[0]); return; } - final XMLHttpRequest request = XMLHttpRequest.create(); + final XMLHttpRequest request = new XMLHttpRequest(); request.setResponseType("arraybuffer"); request.open("GET", url, true); request.setOnReadyStateChange(new ReadyStateChangeHandler() { @Override public void stateChanged() { if(request.getReadyState() == XMLHttpRequest.DONE) { - Uint8Array bl = Uint8Array.create((ArrayBuffer)request.getResponse()); + Uint8Array bl = new Uint8Array((ArrayBuffer)request.getResponse()); byte[] res = new byte[bl.getByteLength()]; for(int i = 0; i < res.length; ++i) { res[i] = (byte) bl.get(i); @@ -230,14 +232,14 @@ public class EaglerAdapterImpl2 { public static RenderbufferGL backBufferDepth = null; public static Window win = null; private static byte[] loadedPackage = null; - private static EventListener contextmenu = null; - private static EventListener mousedown = null; - private static EventListener mouseup = null; - private static EventListener mousemove = null; - private static EventListener keydown = null; - private static EventListener keyup = null; - private static EventListener keypress = null; - private static EventListener wheel = null; + private static EventListener contextmenu = null; + private static EventListener mousedown = null; + private static EventListener mouseup = null; + private static EventListener mousemove = null; + private static EventListener keydown = null; + private static EventListener keyup = null; + private static EventListener keypress = null; + private static EventListener wheel = null; private static String[] identifier = new String[0]; private static String integratedServerScript = "worker_bootstrap.js"; private static boolean anisotropicFilteringSupported = false; @@ -418,15 +420,11 @@ public class EaglerAdapterImpl2 { EarlyLoadScreen.paintEnable(); while(mouseEvents.isEmpty() && keyEvents.isEmpty()) { - try { - Thread.sleep(100l); - } catch (InterruptedException e) { - ; - } + sleep(100); } } - audioctx = AudioContext.create(); + audioctx = new AudioContext(); masterVolumeNode = audioctx.createGain(); masterVolumeNode.getGain().setValue(1.0f); masterVolumeNode.connect(audioctx.getDestination()); @@ -440,12 +438,15 @@ public class EaglerAdapterImpl2 { Window.setInterval(new TimerHandler() { @Override public void onTimer() { - Iterator vids = videosBuffer.values().iterator(); - while(vids.hasNext()) { - BufferedVideo v = vids.next(); - if(System.currentTimeMillis() - v.requestedTime > v.ttl) { - v.videoElement.setSrc(""); - vids.remove(); + if(!videosBuffer.isEmpty()) { + long now = steadyTimeMillis(); + Iterator vids = videosBuffer.values().iterator(); + while(vids.hasNext()) { + BufferedVideo v = vids.next(); + if(now - v.requestedTime > v.ttl) { + v.videoElement.setSrc(""); + vids.remove(); + } } } } @@ -511,8 +512,8 @@ public class EaglerAdapterImpl2 { } } - private static LinkedList mouseEvents = new LinkedList(); - private static LinkedList keyEvents = new LinkedList(); + private static LinkedList mouseEvents = new LinkedList<>(); + private static LinkedList keyEvents = new LinkedList<>(); private static int mouseX = 0; private static int mouseY = 0; @@ -718,7 +719,7 @@ public class EaglerAdapterImpl2 { public static final void _wglFlush() { //webgl.flush(); } - private static Uint8Array uploadBuffer = Uint8Array.create(ArrayBuffer.create(4 * 1024 * 1024)); + private static Uint8Array uploadBuffer = new Uint8Array(new ArrayBuffer(4 * 1024 * 1024)); public static final void _wglTexImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, ByteBuffer p9) { if(p9 == null) { webgl.texImage2D(p1, p2, p3, p4, p5, p6, p7, p8, null); @@ -728,7 +729,7 @@ public class EaglerAdapterImpl2 { for(int i = 0; i < len; ++i) { uploadBuffer1.set(i, (short) ((int)p9.get() & 0xff)); } - Uint8Array data = Uint8Array.create(uploadBuffer.getBuffer(), 0, len); + Uint8Array data = new Uint8Array(uploadBuffer.getBuffer(), 0, len); webgl.texImage2D(p1, p2, p3, p4, p5, p6, p7, p8, data); } } @@ -761,20 +762,20 @@ public class EaglerAdapterImpl2 { } public static final void _wglTexImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, IntBuffer p9) { int len = p9.remaining(); - DataView deevis = DataView.create(uploadBuffer.getBuffer()); + DataView deevis = new DataView(uploadBuffer.getBuffer()); for(int i = 0; i < len; ++i) { deevis.setInt32(i * 4, p9.get(), true); } - Uint8Array data = Uint8Array.create(uploadBuffer.getBuffer(), 0, len*4); + Uint8Array data = new Uint8Array(uploadBuffer.getBuffer(), 0, len*4); webgl.texImage2D(p1, p2, p3, p4, p5, p6, p7, p8, data); } public static final void _wglTexSubImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, IntBuffer p9) { int len = p9.remaining(); - DataView deevis = DataView.create(uploadBuffer.getBuffer()); + DataView deevis = new DataView(uploadBuffer.getBuffer()); for(int i = 0; i < len; ++i) { deevis.setInt32(i * 4, p9.get(), true); } - Uint8Array data = Uint8Array.create(uploadBuffer.getBuffer(), 0, len*4); + Uint8Array data = new Uint8Array(uploadBuffer.getBuffer(), 0, len*4); webgl.texSubImage2D(p1, p2, p3, p4, p5, p6, p7, p8, data); } public static final void _wglDeleteTextures(TextureGL p1) { @@ -795,7 +796,7 @@ public class EaglerAdapterImpl2 { //uploadBuffer.set(swapEndian ? ((i >> 2) + (3 - (i & 3))) : i, (short) ((int)p9.get() & 0xff)); uploadBuffer.set(i, (short) ((int)p9.get() & 0xff)); } - Uint8Array data = Uint8Array.create(uploadBuffer.getBuffer(), 0, len); + Uint8Array data = new Uint8Array(uploadBuffer.getBuffer(), 0, len); webgl.texSubImage2D(p1, p2, p3, p4, p5, p6, p7, p8, data); } public static final void _wglActiveTexture(int p1) { @@ -851,20 +852,20 @@ public class EaglerAdapterImpl2 { } public static final void _wglBufferData0(int p1, IntBuffer p2, int p3) { int len = p2.remaining(); - DataView deevis = DataView.create(uploadBuffer.getBuffer()); + DataView deevis = new DataView(uploadBuffer.getBuffer()); for(int i = 0; i < len; ++i) { deevis.setInt32(i * 4, p2.get(), true); } - Uint8Array data = Uint8Array.create(uploadBuffer.getBuffer(), 0, len*4); + Uint8Array data = new Uint8Array(uploadBuffer.getBuffer(), 0, len*4); webgl.bufferData(p1, data, p3); } public static final void _wglBufferSubData0(int p1, int p2, IntBuffer p3) { int len = p3.remaining(); - DataView deevis = DataView.create(uploadBuffer.getBuffer()); + DataView deevis = new DataView(uploadBuffer.getBuffer()); for(int i = 0; i < len; ++i) { deevis.setInt32(i * 4, p3.get(), true); } - Uint8Array data = Uint8Array.create(uploadBuffer.getBuffer(), 0, len*4); + Uint8Array data = new Uint8Array(uploadBuffer.getBuffer(), 0, len*4); webgl.bufferSubData(p1, p2, data); } public static final void _wglBufferData(int p1, Object p2, int p3) { @@ -916,9 +917,9 @@ public class EaglerAdapterImpl2 { public static final void _wglUniform4i(UniformGL p1, int p2, int p3, int p4, int p5) { if(p1 != null) webgl.uniform4i(p1.obj, p2, p3, p4, p5); } - private static Float32Array mat2 = Float32Array.create(4); - private static Float32Array mat3 = Float32Array.create(9); - private static Float32Array mat4 = Float32Array.create(16); + private static Float32Array mat2 = new Float32Array(4); + private static Float32Array mat3 = new Float32Array(9); + private static Float32Array mat4 = new Float32Array(16); public static final void _wglUniformMat2fv(UniformGL p1, float[] mat) { mat2.set(mat); if(p1 != null) webgl.uniformMatrix2fv(p1.obj, false, mat2); @@ -1049,8 +1050,8 @@ public class EaglerAdapterImpl2 { private static native void freeDataURL(String url); public static final EaglerImage loadPNG(byte[] data) { - ArrayBuffer arr = ArrayBuffer.create(data.length); - Uint8Array.create(arr).set(data); + ArrayBuffer arr = new ArrayBuffer(data.length); + (new Uint8Array(arr)).set(data); return loadPNG0(arr); } @@ -1088,7 +1089,7 @@ public class EaglerAdapterImpl2 { ret.complete(null); return; } - DataView dv = DataView.create(pxls.getBuffer()); + DataView dv = new DataView(pxls.getBuffer()); int[] pixels = new int[totalPixels]; for(int i = 0, j; i < pixels.length; ++i) { j = dv.getUint32(i << 2, false); @@ -1233,13 +1234,13 @@ public class EaglerAdapterImpl2 { public BufferedVideo(HTMLVideoElement videoElement, String url, int ttl) { this.videoElement = videoElement; this.url = url; - this.requestedTime = System.currentTimeMillis(); + this.requestedTime = steadyTimeMillis(); this.ttl = ttl; } } - private static final HashMap videosBuffer = new HashMap(); + private static final HashMap videosBuffer = new HashMap<>(); public static final void bufferVideo(String src, int ttl) { if(!videosBuffer.containsKey(src)) { @@ -1326,7 +1327,7 @@ public class EaglerAdapterImpl2 { private static native void html5VideoTexSubImage2D(WebGL2RenderingContext ctx, int target, int format, int type, HTMLVideoElement video); public static final void updateVideoTexture() { - long ms = System.currentTimeMillis(); + long ms = steadyTimeMillis(); if(ms - frameTimer < frameRate && videoTexIsInitialized) { return; } @@ -1485,13 +1486,13 @@ public class EaglerAdapterImpl2 { public BufferedImageElem(HTMLImageElement imageElement, String url, int ttl) { this.imageElement = imageElement; this.url = url; - this.requestedTime = System.currentTimeMillis(); + this.requestedTime = steadyTimeMillis(); this.ttl = ttl; } } - private static final HashMap imagesBuffer = new HashMap(); + private static final HashMap imagesBuffer = new HashMap<>(); public static final void bufferImage(String src, int ttl) { if(!imagesBuffer.containsKey(src)) { @@ -1529,7 +1530,7 @@ public class EaglerAdapterImpl2 { private static native void html5ImageTexSubImage2D(WebGL2RenderingContext ctx, int target, int format, int type, HTMLImageElement image); public static final void updateImageTexture() { - long ms = System.currentTimeMillis(); + long ms = steadyTimeMillis(); if(ms - imageFrameTimer < imageFrameRate && imageTexIsInitialized) { return; } @@ -1609,7 +1610,7 @@ public class EaglerAdapterImpl2 { public static final void mouseSetGrabbed(boolean grabbed) { if(grabbed) { canvas.requestPointerLock(); - long t = System.currentTimeMillis(); + long t = steadyTimeMillis(); if(mouseUngrabTimeout != 0) Window.clearTimeout(mouseUngrabTimeout); mouseUngrabTimeout = 0; if(t - mouseUngrabTimer < 3000l) { @@ -1621,7 +1622,7 @@ public class EaglerAdapterImpl2 { }, 3000 - (int)(t - mouseUngrabTimer)); } }else { - mouseUngrabTimer = System.currentTimeMillis(); + mouseUngrabTimer = steadyTimeMillis(); if(mouseUngrabTimeout != 0) Window.clearTimeout(mouseUngrabTimeout); mouseUngrabTimeout = 0; doc.exitPointerLock(); @@ -1712,11 +1713,7 @@ public class EaglerAdapterImpl2 { webgl.blitFramebuffer(0, 0, backBufferWidth, backBufferHeight, 0, 0, w2, h2, COLOR_BUFFER_BIT, NEAREST); webgl.bindFramebuffer(FRAMEBUFFER, backBuffer.obj); resizeBackBuffer(w2, h2); - try { - Thread.sleep(1l); - } catch (InterruptedException e) { - ; - } + sleep(1); } public static final void setupBackBuffer() { backBuffer = _wglCreateFramebuffer(); @@ -1805,14 +1802,14 @@ public class EaglerAdapterImpl2 { NONE, FAILED, BLOCKED, FAILED_POSSIBLY_LOCKED, LOCKED, NOW_LOCKED; } - private static final Set rateLimitedAddresses = new HashSet(); - private static final Set blockedAddresses = new HashSet(); + private static final Set rateLimitedAddresses = new HashSet<>(); + private static final Set blockedAddresses = new HashSet<>(); private static WebSocket sock = null; private static boolean sockIsConnecting = false; private static boolean sockIsConnected = false; private static boolean sockIsAlive = false; - private static LinkedList readPackets = new LinkedList(); + private static LinkedList readPackets = new LinkedList<>(); private static RateLimit rateLimitStatus = null; private static String currentSockURI = null; @@ -1848,16 +1845,16 @@ public class EaglerAdapterImpl2 { rateLimitStatus = null; currentSockURI = sockURI; try { - sock = WebSocket.create(sockURI); + sock = new WebSocket(sockURI); } catch(Throwable t) { sockIsConnecting = false; sockIsAlive = false; return; } sock.setBinaryType("arraybuffer"); - sock.onOpen(new EventListener() { + sock.addEventListener("open", new EventListener() { @Override - public void handleEvent(MessageEvent evt) { + public void handleEvent(Event evt) { sockIsConnecting = false; sockIsAlive = false; sockIsConnected = true; @@ -1865,7 +1862,7 @@ public class EaglerAdapterImpl2 { cb.complete("okay"); } }); - sock.onClose(new EventListener() { + sock.addEventListener("close", new EventListener() { @Override public void handleEvent(CloseEvent evt) { sock = null; @@ -1895,7 +1892,7 @@ public class EaglerAdapterImpl2 { if(b) cb.complete("fail"); } }); - sock.onMessage(new EventListener() { + sock.addEventListener("message", new EventListener() { @Override public void handleEvent(MessageEvent evt) { sockIsAlive = true; @@ -1918,7 +1915,7 @@ public class EaglerAdapterImpl2 { sock.close(); return; } - Uint8Array a = Uint8Array.create(evt.getDataAsArray()); + Uint8Array a = new Uint8Array(evt.getDataAsArray()); byte[] b = new byte[a.getByteLength()]; for(int i = 0; i < b.length; ++i) { b[i] = (byte) (a.get(i) & 0xFF); @@ -1956,7 +1953,7 @@ public class EaglerAdapterImpl2 { private static native void nativeBinarySend(WebSocket sock, ArrayBuffer buffer); public static final void writePacket(byte[] packet) { if(sock != null && !sockIsConnecting) { - Uint8Array arr = Uint8Array.create(packet.length); + Uint8Array arr = new Uint8Array(packet.length); arr.set(packet); nativeBinarySend(sock, arr.getBuffer()); } @@ -2013,7 +2010,7 @@ public class EaglerAdapterImpl2 { public static final byte[] getFileChooserResult() { ArrayBuffer b = getFileChooserResult0(); if(b == null) return null; - Uint8Array array = Uint8Array.create(b); + Uint8Array array = new Uint8Array(b); byte[] ret = new byte[array.getByteLength()]; for(int i = 0; i < ret.length; ++i) { ret[i] = (byte) array.get(i); @@ -2043,7 +2040,7 @@ public class EaglerAdapterImpl2 { private static int playbackId = 0; private static int audioElementId = 0; - private static final HashMap loadedSoundFiles = new HashMap(); + private static final HashMap loadedSoundFiles = new HashMap<>(); private static AudioContext audioctx = null; private static GainNode masterVolumeNode = null; private static GainNode musicVolumeNode = null; @@ -2101,7 +2098,7 @@ public class EaglerAdapterImpl2 { }); } - private static final HashMap activeSoundEffects = new HashMap(); + private static final HashMap activeSoundEffects = new HashMap<>(); private static class AudioBufferX { private final AudioBuffer buffer; @@ -2147,7 +2144,7 @@ public class EaglerAdapterImpl2 { if(ret == null) { byte[] file = loadResourceBytes(fileName); if(file == null) return null; - Uint8Array buf = Uint8Array.create(file.length); + Uint8Array buf = new Uint8Array(file.length); buf.set(file); ret = new AudioBufferX(decodeAudioAsync(buf.getBuffer())); loadedSoundFiles.put(fileName, ret); @@ -2662,8 +2659,8 @@ public class EaglerAdapterImpl2 { return volumeSpeak; } - private static final Set mutedSet = new HashSet(); - private static final Set speakingSet = new HashSet(); + private static final Set mutedSet = new HashSet<>(); + private static final Set speakingSet = new HashSet<>(); public static final Set getVoiceListening() { return voiceGains.keySet(); } @@ -2690,7 +2687,7 @@ public class EaglerAdapterImpl2 { speakingSet.clear(); for (String username : voiceAnalysers.keySet()) { AnalyserNode analyser = voiceAnalysers.get(username); - Uint8Array array = Uint8Array.create(analyser.getFrequencyBinCount()); + Uint8Array array = new Uint8Array(analyser.getFrequencyBinCount()); analyser.getByteFrequencyData(array); int len = array.getLength(); for (int i = 0; i < len; i++) { @@ -2777,11 +2774,11 @@ public class EaglerAdapterImpl2 { } public static final Object _wCreateLowLevelIntBuffer(int len) { - return Int32Array.create(len); + return new Int32Array(len); } private static int appendbufferindex = 0; - private static Int32Array appendbuffer = Int32Array.create(ArrayBuffer.create(525000*4)); + private static Int32Array appendbuffer = new Int32Array(new ArrayBuffer(525000*4)); public static final void _wAppendLowLevelBuffer(Object arr) { Int32Array a = ((Int32Array)arr); @@ -2792,7 +2789,7 @@ public class EaglerAdapterImpl2 { } public static final Object _wGetLowLevelBuffersAppended() { - Int32Array ret = Int32Array.create(appendbuffer.getBuffer(), 0, appendbufferindex); + Int32Array ret = new Int32Array(appendbuffer.getBuffer(), 0, appendbufferindex); appendbufferindex = 0; return ret; } @@ -2810,7 +2807,7 @@ public class EaglerAdapterImpl2 { public void onMessage(String channel, ArrayBuffer buf); } - private static final HashMap> workerMessageQueue = new HashMap(); + private static final HashMap> workerMessageQueue = new HashMap<>(); private static Worker server = null; private static boolean serverAlive = false; @@ -2837,7 +2834,7 @@ public class EaglerAdapterImpl2 { return; } - Uint8Array a = Uint8Array.create(buf); + Uint8Array a = new Uint8Array(buf); byte[] pkt = new byte[a.getLength()]; for(int i = 0; i < pkt.length; ++i) { pkt[i] = (byte) a.get(i); @@ -2865,7 +2862,7 @@ public class EaglerAdapterImpl2 { server.terminate(); } workerMessageQueue.put("IPC", new LinkedList()); - server = Worker.create(integratedServerScript); + server = new Worker(integratedServerScript); server.onError(new EventListener() { @Override public void handleEvent(ErrorEvent evt) { @@ -2893,8 +2890,8 @@ public class EaglerAdapterImpl2 { } public static final void sendToIntegratedServer(String channel, byte[] pkt) { - ArrayBuffer arb = ArrayBuffer.create(pkt.length); - Uint8Array ar = Uint8Array.create(arb); + ArrayBuffer arb = new ArrayBuffer(pkt.length); + Uint8Array ar = new Uint8Array(arb); ar.set(pkt); sendWorkerPacket(server, channel, arb); //System.out.println("[Client][WRITE][" + channel + "]: " + pkt.length); @@ -2906,7 +2903,7 @@ public class EaglerAdapterImpl2 { System.err.println("Tried to enable existing channel '" + channel + "' again"); }else { System.out.println("[Client][ENABLE][" + channel + "]"); - workerMessageQueue.put(channel, new LinkedList()); + workerMessageQueue.put(channel, new LinkedList<>()); } } } @@ -2940,8 +2937,8 @@ public class EaglerAdapterImpl2 { private static final native void downloadBytesImpl(String str, ArrayBuffer buf); public static final void downloadBytes(String str, byte[] dat) { - ArrayBuffer d = ArrayBuffer.create(dat.length); - Uint8Array.create(d).set(dat); + ArrayBuffer d = new ArrayBuffer(dat.length); + (new Uint8Array(d)).set(dat); downloadBytesImpl(str, d); } @@ -2956,11 +2953,11 @@ public class EaglerAdapterImpl2 { public static native String getClipboard(); private static void getClipboard(final AsyncCallback cb) { - final long start = System.currentTimeMillis(); + final long start = steadyTimeMillis(); getClipboard0(new StupidFunctionResolveString() { @Override public void resolveStr(String s) { - if(System.currentTimeMillis() - start > 500l) { + if(steadyTimeMillis() - start > 500l) { unpressCTRL = true; } cb.complete(s); @@ -2979,8 +2976,8 @@ public class EaglerAdapterImpl2 { private static class ServerQueryImpl implements ServerQuery { - private final LinkedList queryResponses = new LinkedList(); - private final LinkedList queryResponsesBytes = new LinkedList(); + private final LinkedList queryResponses = new LinkedList<>(); + private final LinkedList queryResponsesBytes = new LinkedList<>(); private final String type; private boolean open; private boolean alive; @@ -2998,7 +2995,7 @@ public class EaglerAdapterImpl2 { pingTimer = -1l; WebSocket s = null; try { - s = WebSocket.create(uri); + s = new WebSocket(uri); s.setBinaryType("arraybuffer"); open = true; }catch(Throwable t) { @@ -3013,14 +3010,14 @@ public class EaglerAdapterImpl2 { } sock = s; if(open) { - sock.onOpen(new EventListener() { + sock.addEventListener("open", new EventListener() { @Override - public void handleEvent(MessageEvent evt) { - pingStart = System.currentTimeMillis(); + public void handleEvent(Event evt) { + pingStart = steadyTimeMillis(); sock.send("Accept: " + type); } }); - sock.onClose(new EventListener() { + sock.addEventListener("close", new EventListener() { @Override public void handleEvent(CloseEvent evt) { open = false; @@ -3033,12 +3030,12 @@ public class EaglerAdapterImpl2 { } } }); - sock.onMessage(new EventListener() { + sock.addEventListener("message", new EventListener() { @Override public void handleEvent(MessageEvent evt) { alive = true; if(pingTimer == -1) { - pingTimer = System.currentTimeMillis() - pingStart; + pingTimer = steadyTimeMillis() - pingStart; } if(isString(evt.getData())) { try { @@ -3069,7 +3066,7 @@ public class EaglerAdapterImpl2 { System.err.println("Query response could not be parsed: " + t.toString()); } }else { - Uint8Array a = Uint8Array.create(evt.getDataAsArray()); + Uint8Array a = new Uint8Array(evt.getDataAsArray()); byte[] b = new byte[a.getByteLength()]; for(int i = 0; i < b.length; ++i) { b[i] = (byte) (a.get(i) & 0xFF); @@ -3153,9 +3150,9 @@ public class EaglerAdapterImpl2 { int checkIntegerA = 0xFF000000; int checkIntegerB = 0x000000FF; - ArrayBuffer buf = ArrayBuffer.create(4); - Int32Array bufW = Int32Array.create(buf); - Uint8Array bufR = Uint8Array.create(buf); + ArrayBuffer buf = new ArrayBuffer(4); + Int32Array bufW = new Int32Array(buf); + Uint8Array bufR = new Uint8Array(buf); bufW.set(0, checkIntegerA); @@ -3204,13 +3201,13 @@ public class EaglerAdapterImpl2 { } private static final ArrayBuffer convertToArrayBuffer(byte[] arr) { - Uint8Array buf = Uint8Array.create(arr.length); + Uint8Array buf = new Uint8Array(arr.length); buf.set(arr); return buf.getBuffer(); } - private static final Map relayQueryLimited = new HashMap(); - private static final Map relayQueryBlocked = new HashMap(); + private static final Map relayQueryLimited = new HashMap<>(); + private static final Map relayQueryBlocked = new HashMap<>(); private static class RelayQueryImpl implements RelayQuery { @@ -3238,8 +3235,8 @@ public class EaglerAdapterImpl2 { this.uri = uri; WebSocket s = null; try { - connectionOpenedAt = System.currentTimeMillis(); - s = WebSocket.create(uri); + connectionOpenedAt = steadyTimeMillis(); + s = new WebSocket(uri); s.setBinaryType("arraybuffer"); open = true; failed = false; @@ -3251,11 +3248,11 @@ public class EaglerAdapterImpl2 { return; } sock = s; - sock.onOpen(new EventListener() { + sock.addEventListener("open", new EventListener() { @Override - public void handleEvent(MessageEvent evt) { + public void handleEvent(Event evt) { try { - connectionPingStart = System.currentTimeMillis(); + connectionPingStart = steadyTimeMillis(); nativeBinarySend(sock, convertToArrayBuffer( IPacket.writePacket(new IPacket00Handshake(0x03, IntegratedServer.preferredRelayVersion, "")) )); @@ -3266,18 +3263,18 @@ public class EaglerAdapterImpl2 { } } }); - sock.onMessage(new EventListener() { + sock.addEventListener("message", new EventListener() { @Override public void handleEvent(MessageEvent evt) { if(evt.getData() != null && !isString(evt.getData())) { hasRecievedAnyData = true; - Uint8Array buf = Uint8Array.create(evt.getDataAsArray()); + Uint8Array buf = new Uint8Array(evt.getDataAsArray()); byte[] arr = new byte[buf.getLength()]; for(int i = 0; i < arr.length; ++i) { arr[i] = (byte)buf.get(i); } if(arr.length == 2 && arr[0] == (byte)0xFC) { - long millis = System.currentTimeMillis(); + long millis = steadyTimeMillis(); if(arr[1] == (byte)0x00 || arr[1] == (byte)0x01) { rateLimitStatus = RateLimit.BLOCKED; relayQueryLimited.put(RelayQueryImpl.this.uri, millis); @@ -3300,7 +3297,7 @@ public class EaglerAdapterImpl2 { IPacket69Pong ipkt = (IPacket69Pong)pkt; versError = RelayQuery.VersionMismatch.COMPATIBLE; if(connectionPingTimer == -1) { - connectionPingTimer = System.currentTimeMillis() - connectionPingStart; + connectionPingTimer = steadyTimeMillis() - connectionPingStart; } vers = ipkt.protcolVersion; comment = ipkt.comment; @@ -3340,7 +3337,7 @@ public class EaglerAdapterImpl2 { } } }); - sock.onClose(new EventListener() { + sock.addEventListener("close", new EventListener() { @Override public void handleEvent(CloseEvent evt) { open = false; @@ -3348,14 +3345,14 @@ public class EaglerAdapterImpl2 { failed = true; Long l = relayQueryBlocked.get(uri); if(l != null) { - if(System.currentTimeMillis() - l.longValue() < 400000l) { + if(steadyTimeMillis() - l.longValue() < 400000l) { rateLimitStatus = RateLimit.LOCKED; return; } } l = relayQueryLimited.get(uri); if(l != null) { - if(System.currentTimeMillis() - l.longValue() < 900000l) { + if(steadyTimeMillis() - l.longValue() < 900000l) { rateLimitStatus = RateLimit.BLOCKED; return; } @@ -3470,7 +3467,7 @@ public class EaglerAdapterImpl2 { } public static final RelayQuery openRelayQuery(String addr) { - long millis = System.currentTimeMillis(); + long millis = steadyTimeMillis(); Long l = relayQueryBlocked.get(addr); if(l != null && millis - l.longValue() < 60000l) { @@ -3504,7 +3501,7 @@ public class EaglerAdapterImpl2 { this.uri = uri; WebSocket s = null; try { - s = WebSocket.create(uri); + s = new WebSocket(uri); s.setBinaryType("arraybuffer"); open = true; failed = false; @@ -3515,9 +3512,9 @@ public class EaglerAdapterImpl2 { return; } sock = s; - sock.onOpen(new EventListener() { + sock.addEventListener("open", new EventListener() { @Override - public void handleEvent(MessageEvent evt) { + public void handleEvent(Event evt) { try { nativeBinarySend(sock, convertToArrayBuffer( IPacket.writePacket(new IPacket00Handshake(0x04, IntegratedServer.preferredRelayVersion, "")) @@ -3530,18 +3527,18 @@ public class EaglerAdapterImpl2 { } } }); - sock.onMessage(new EventListener() { + sock.addEventListener("message", new EventListener() { @Override public void handleEvent(MessageEvent evt) { if(evt.getData() != null && !isString(evt.getData())) { hasRecievedAnyData = true; - Uint8Array buf = Uint8Array.create(evt.getDataAsArray()); + Uint8Array buf = new Uint8Array(evt.getDataAsArray()); byte[] arr = new byte[buf.getLength()]; for(int i = 0; i < arr.length; ++i) { arr[i] = (byte)buf.get(i); } if(arr.length == 2 && arr[0] == (byte)0xFC) { - long millis = System.currentTimeMillis(); + long millis = steadyTimeMillis(); if(arr[1] == (byte)0x00 || arr[1] == (byte)0x01) { rateLimitStatus = RateLimit.BLOCKED; relayQueryLimited.put(RelayWorldsQueryImpl.this.uri, millis); @@ -3597,7 +3594,7 @@ public class EaglerAdapterImpl2 { } } }); - sock.onClose(new EventListener() { + sock.addEventListener("close", new EventListener() { @Override public void handleEvent(CloseEvent evt) { open = false; @@ -3605,14 +3602,14 @@ public class EaglerAdapterImpl2 { failed = true; Long l = relayQueryBlocked.get(uri); if(l != null) { - if(System.currentTimeMillis() - l.longValue() < 400000l) { + if(steadyTimeMillis() - l.longValue() < 400000l) { rateLimitStatus = RateLimit.LOCKED; return; } } l = relayQueryLimited.get(uri); if(l != null) { - if(System.currentTimeMillis() - l.longValue() < 900000l) { + if(steadyTimeMillis() - l.longValue() < 900000l) { rateLimitStatus = RateLimit.BLOCKED; return; } @@ -3686,7 +3683,7 @@ public class EaglerAdapterImpl2 { @Override public List getWorlds() { - return new ArrayList(0); + return new ArrayList<>(0); } @Override @@ -3696,7 +3693,7 @@ public class EaglerAdapterImpl2 { } public static final RelayWorldsQuery openRelayWorldsQuery(String addr) { - long millis = System.currentTimeMillis(); + long millis = steadyTimeMillis(); Long l = relayQueryBlocked.get(addr); if(l != null && millis - l.longValue() < 60000l) { @@ -3722,14 +3719,14 @@ public class EaglerAdapterImpl2 { private boolean hasRecievedAnyData; - private final List exceptions = new LinkedList(); - private final List packets = new LinkedList(); + private final List exceptions = new LinkedList<>(); + private final List packets = new LinkedList<>(); private RelayServerSocketImpl(String uri, int timeout) { this.uri = uri; WebSocket s = null; try { - s = WebSocket.create(uri); + s = new WebSocket(uri); s.setBinaryType("arraybuffer"); open = false; closed = false; @@ -3743,18 +3740,18 @@ public class EaglerAdapterImpl2 { return; } sock = s; - sock.onOpen(new EventListener() { + sock.addEventListener("open", new EventListener() { @Override - public void handleEvent(MessageEvent evt) { + public void handleEvent(Event evt) { open = true; } }); - sock.onMessage(new EventListener() { + sock.addEventListener("message", new EventListener() { @Override public void handleEvent(MessageEvent evt) { if(evt.getData() != null && !isString(evt.getData())) { hasRecievedAnyData = true; - Uint8Array buf = Uint8Array.create(evt.getDataAsArray()); + Uint8Array buf = new Uint8Array(evt.getDataAsArray()); byte[] arr = new byte[buf.getLength()]; for(int i = 0; i < arr.length; ++i) { arr[i] = (byte)buf.get(i); @@ -3773,7 +3770,7 @@ public class EaglerAdapterImpl2 { } } }); - sock.onClose(new EventListener() { + sock.addEventListener("close", new EventListener() { @Override public void handleEvent(CloseEvent evt) { if(!hasRecievedAnyData) { @@ -3939,7 +3936,7 @@ public class EaglerAdapterImpl2 { } public static final RelayServerSocket openRelayConnection(String addr, int timeout) { - long millis = System.currentTimeMillis(); + long millis = steadyTimeMillis(); Long l = relayQueryBlocked.get(addr); if(l != null && millis - l.longValue() < 60000l) { @@ -4012,7 +4009,7 @@ public class EaglerAdapterImpl2 { rtcLANClient.setRemotePacketHandler(new EaglercraftLANClient.RemotePacketHandler() { @Override public void call(ArrayBuffer buffer) { - Uint8Array array = Uint8Array.create(buffer); + Uint8Array array = new Uint8Array(buffer); byte[] ret = new byte[array.getByteLength()]; for(int i = 0; i < ret.length; ++i) { ret[i] = (byte) array.get(i); @@ -4122,7 +4119,7 @@ public class EaglerAdapterImpl2 { rtcLANServer.setRemoteClientPacketHandler(new EaglercraftLANServer.PeerPacketHandler() { @Override public void call(String peerId, ArrayBuffer buffer) { - Uint8Array array = Uint8Array.create(buffer); + Uint8Array array = new Uint8Array(buffer); byte[] ret = new byte[array.getByteLength()]; for(int i = 0; i < ret.length; ++i) { ret[i] = (byte) array.get(i); @@ -4167,16 +4164,16 @@ public class EaglerAdapterImpl2 { byte[] fragData = new byte[((i + fragmentSize > data.length) ? (data.length % fragmentSize) : fragmentSize) + 1]; System.arraycopy(data, i, fragData, 1, fragData.length - 1); fragData[0] = (i + fragmentSize < data.length) ? (byte) 1 : (byte) 0; - ArrayBuffer arr = ArrayBuffer.create(fragData.length); - Uint8Array.create(arr).set(fragData); + ArrayBuffer arr = new ArrayBuffer(fragData.length); + (new Uint8Array(arr)).set(fragData); rtcLANServer.sendPacketToRemoteClient(peer, arr); } } else { byte[] sendData = new byte[data.length + 1]; sendData[0] = 0; System.arraycopy(data, 0, sendData, 1, data.length); - ArrayBuffer arr = ArrayBuffer.create(sendData.length); - Uint8Array.create(arr).set(sendData); + ArrayBuffer arr = new ArrayBuffer(sendData.length); + (new Uint8Array(arr)).set(sendData); rtcLANServer.sendPacketToRemoteClient(peer, arr); } } @@ -4200,5 +4197,41 @@ public class EaglerAdapterImpl2 { public static final int countPeers() { return rtcLANServer.countPeers(); } - + + private static final JSObject steadyTimeFunc = getSteadyTimeFunc(); + + @JSBody(params = { }, script = "return ((typeof performance !== \"undefined\") && (typeof performance.now === \"function\"))" + + "? performance.now.bind(performance)" + + ": (function(epochStart){ return function() { return Date.now() - epochStart; }; })(Date.now());") + private static native JSObject getSteadyTimeFunc(); + + @JSBody(params = { "steadyTimeFunc" }, script = "return steadyTimeFunc();") + private static native double steadyTimeMillis0(JSObject steadyTimeFunc); + + public static long steadyTimeMillis() { + return (long)steadyTimeMillis0(steadyTimeFunc); + } + + public static long nanoTime() { + return (long)(steadyTimeMillis0(steadyTimeFunc) * 1000000.0); + } + + @Async + public static native void sleep(int millis); + + private static void sleep(int millis, final AsyncCallback callback) { + Platform.schedule(new DumbSleepHandler(callback), millis); + } + + private static class DumbSleepHandler implements PlatformRunnable { + private final AsyncCallback callback; + private DumbSleepHandler(AsyncCallback callback) { + this.callback = callback; + } + @Override + public void run() { + callback.complete(null); + } + } + } diff --git a/src/teavm/java/net/lax1dude/eaglercraft/adapter/SimpleStorage.java b/src/teavm/java/net/lax1dude/eaglercraft/adapter/SimpleStorage.java index d294f46..7ecd0a4 100644 --- a/src/teavm/java/net/lax1dude/eaglercraft/adapter/SimpleStorage.java +++ b/src/teavm/java/net/lax1dude/eaglercraft/adapter/SimpleStorage.java @@ -3,16 +3,15 @@ package net.lax1dude.eaglercraft.adapter; import org.teavm.interop.Async; import org.teavm.interop.AsyncCallback; import org.teavm.jso.core.JSString; +import org.teavm.jso.indexeddb.IDBDatabase; +import org.teavm.jso.indexeddb.IDBFactory; +import org.teavm.jso.indexeddb.IDBGetRequest; +import org.teavm.jso.indexeddb.IDBObjectStore; +import org.teavm.jso.indexeddb.IDBOpenDBRequest; +import org.teavm.jso.indexeddb.IDBRequest; import org.teavm.jso.typedarrays.ArrayBuffer; import org.teavm.jso.typedarrays.Uint8Array; -import net.lax1dude.eaglercraft.adapter.teavm.IDBDatabase; -import net.lax1dude.eaglercraft.adapter.teavm.IDBFactory; -import net.lax1dude.eaglercraft.adapter.teavm.IDBGetRequest; -import net.lax1dude.eaglercraft.adapter.teavm.IDBObjectStore; -import net.lax1dude.eaglercraft.adapter.teavm.IDBOpenDBRequest; -import net.lax1dude.eaglercraft.adapter.teavm.IDBRequest; - public class SimpleStorage { private static IDBDatabase database; private static boolean available; @@ -51,7 +50,7 @@ public class SimpleStorage { } IDBGetRequest request = getStore().get(JSString.valueOf(key)); request.setOnSuccess(() -> { - Uint8Array a = Uint8Array.create((ArrayBuffer) request.getResult().cast()); + Uint8Array a = new Uint8Array((ArrayBuffer) request.getResult().cast()); byte[] b = new byte[a.getByteLength()]; for(int i = 0; i < b.length; ++i) { b[i] = (byte) (a.get(i) & 0xFF); @@ -119,8 +118,8 @@ public class SimpleStorage { }); }); } else { - ArrayBuffer arr = ArrayBuffer.create(value.length); - Uint8Array.create(arr).set(value); + ArrayBuffer arr = new ArrayBuffer(value.length); + (new Uint8Array(arr)).set(value); IDBRequest request2 = getStore().put(arr, JSString.valueOf(key)); request2.setOnSuccess(() -> { IDBGetRequest request3 = getStore().get(JSString.valueOf("__LIST__")); diff --git a/src/teavm/java/net/lax1dude/eaglercraft/adapter/Tessellator.java b/src/teavm/java/net/lax1dude/eaglercraft/adapter/Tessellator.java index d791fe2..88ffd0a 100644 --- a/src/teavm/java/net/lax1dude/eaglercraft/adapter/Tessellator.java +++ b/src/teavm/java/net/lax1dude/eaglercraft/adapter/Tessellator.java @@ -93,9 +93,9 @@ public class Tessellator { private Tessellator(int par1) { this.bufferSize = par1; - ArrayBuffer a = ArrayBuffer.create(par1 * 4); - this.intBuffer = Int32Array.create(a); - this.floatBuffer = Float32Array.create(a); + ArrayBuffer a = new ArrayBuffer(par1 * 4); + this.intBuffer = new Int32Array(a); + this.floatBuffer = new Float32Array(a); } /** @@ -128,7 +128,7 @@ public class Tessellator { EaglerAdapter.glClientActiveTexture(EaglerAdapter.GL_TEXTURE0); } - EaglerAdapter.glDrawArrays(this.drawMode, 0, this.vertexCount, Int32Array.create(intBuffer.getBuffer(), 0, this.vertexCount * 8)); + EaglerAdapter.glDrawArrays(this.drawMode, 0, this.vertexCount, new Int32Array(intBuffer.getBuffer(), 0, this.vertexCount * 8)); if (this.hasTexture) { EaglerAdapter.glDisableVertexAttrib(EaglerAdapter.GL_TEXTURE_COORD_ARRAY); diff --git a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/EventHandler.java b/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/EventHandler.java deleted file mode 100644 index 856b834..0000000 --- a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/EventHandler.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2015 Alexey Andreev. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package net.lax1dude.eaglercraft.adapter.teavm; - -import org.teavm.jso.JSFunctor; -import org.teavm.jso.JSObject; - -@JSFunctor -public interface EventHandler extends JSObject { - void handleEvent(); -} diff --git a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBCountRequest.java b/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBCountRequest.java deleted file mode 100644 index 9c0cb98..0000000 --- a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBCountRequest.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2015 Alexey Andreev. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package net.lax1dude.eaglercraft.adapter.teavm; - -import org.teavm.jso.JSProperty; - -public interface IDBCountRequest extends IDBRequest { - @JSProperty - int getResult(); -} diff --git a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBCursor.java b/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBCursor.java deleted file mode 100644 index 42ecb90..0000000 --- a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBCursor.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2015 Alexey Andreev. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package net.lax1dude.eaglercraft.adapter.teavm; - -import org.teavm.jso.JSMethod; -import org.teavm.jso.JSObject; -import org.teavm.jso.JSProperty; - -public interface IDBCursor extends JSObject { - String DIRECTION_NEXT = "next"; - - String DIRECTION_NEXT_UNIQUE = "nextunique"; - - String DIRECTION_PREVIOUS = "prev"; - - String DIRECTION_PREVIOUS_UNIQUE = "prevunique"; - - @JSProperty - IDBCursorSource getSource(); - - @JSProperty - String getDirection(); - - @JSProperty - JSObject getKey(); - - @JSProperty - JSObject getValue(); - - @JSProperty - JSObject getPrimaryKey(); - - IDBRequest update(JSObject value); - - void advance(int count); - - @JSMethod("continue") - void doContinue(); - - IDBRequest delete(); -} diff --git a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBCursorRequest.java b/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBCursorRequest.java deleted file mode 100644 index d134d42..0000000 --- a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBCursorRequest.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2015 Alexey Andreev. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package net.lax1dude.eaglercraft.adapter.teavm; - -import org.teavm.jso.JSProperty; - -public interface IDBCursorRequest extends IDBRequest { - @JSProperty - IDBCursor getResult(); -} diff --git a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBCursorSource.java b/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBCursorSource.java deleted file mode 100644 index 6f36503..0000000 --- a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBCursorSource.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright 2015 Alexey Andreev. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package net.lax1dude.eaglercraft.adapter.teavm; - -import org.teavm.jso.JSObject; - -public interface IDBCursorSource extends JSObject { -} diff --git a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBDatabase.java b/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBDatabase.java deleted file mode 100644 index b1f671e..0000000 --- a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBDatabase.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2015 Alexey Andreev. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package net.lax1dude.eaglercraft.adapter.teavm; - -import org.teavm.jso.JSProperty; -import org.teavm.jso.dom.events.EventTarget; - -public interface IDBDatabase extends EventTarget { - String TRANSACTION_READONLY = "readonly"; - - String TRANSACTION_READWRITE = "readwrite"; - - String TRANSACTION_VERSIONCHANGE = "versionchange"; - - @JSProperty - String getName(); - - @JSProperty - int getVersion(); - - @JSProperty - String[] getObjectStoreNames(); - - net.lax1dude.eaglercraft.adapter.teavm.IDBObjectStore createObjectStore(String name, - IDBObjectStoreParameters optionalParameters); - - IDBObjectStore createObjectStore(String name); - - void deleteObjectStore(String name); - - IDBTransaction transaction(String storeName, String transactionMode); - - IDBTransaction transaction(String storeName); - - IDBTransaction transaction(String[] storeNames, String transactionMode); - - IDBTransaction transaction(String[] storeNames); - - void close(); - - @JSProperty("onabort") - void setOnAbort(net.lax1dude.eaglercraft.adapter.teavm.EventHandler handler); - - @JSProperty("onerror") - void setOnError(net.lax1dude.eaglercraft.adapter.teavm.EventHandler handler); - - @JSProperty("onversionchange") - void setOnVersionChange(EventHandler handler); -} diff --git a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBError.java b/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBError.java deleted file mode 100644 index 3ae0afd..0000000 --- a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBError.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2015 Alexey Andreev. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package net.lax1dude.eaglercraft.adapter.teavm; - -import org.teavm.jso.JSObject; -import org.teavm.jso.JSProperty; - -public abstract class IDBError implements JSObject { - @JSProperty - public abstract String getName(); -} diff --git a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBFactory.java b/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBFactory.java deleted file mode 100644 index 29d8bf2..0000000 --- a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBFactory.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2015 Alexey Andreev. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package net.lax1dude.eaglercraft.adapter.teavm; - -import org.teavm.jso.JSBody; -import org.teavm.jso.JSObject; - -public abstract class IDBFactory implements JSObject { - public static boolean isSupported() { - return !getInstanceImpl().isUndefined(); - } - - @JSBody(script = "return typeof this === 'undefined';") - private native boolean isUndefined(); - - public static IDBFactory getInstance() { - IDBFactory factory = getInstanceImpl(); - if (factory.isUndefined()) { - throw new IllegalStateException("IndexedDB is not supported in this browser"); - } - return factory; - } - - @JSBody(script = "return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || " - + "window.msIndexedDB;") - static native IDBFactory getInstanceImpl(); - - public abstract IDBOpenDBRequest open(String name, int version); - - public abstract IDBOpenDBRequest deleteDatabase(String name); - - public abstract int cmp(JSObject a, JSObject b); -} diff --git a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBGetRequest.java b/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBGetRequest.java deleted file mode 100644 index 0590aa7..0000000 --- a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBGetRequest.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2015 Alexey Andreev. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package net.lax1dude.eaglercraft.adapter.teavm; - -import org.teavm.jso.JSObject; -import org.teavm.jso.JSProperty; - -public interface IDBGetRequest extends IDBRequest { - @JSProperty - JSObject getResult(); -} diff --git a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBIndex.java b/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBIndex.java deleted file mode 100644 index a9a880d..0000000 --- a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBIndex.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2015 Alexey Andreev. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package net.lax1dude.eaglercraft.adapter.teavm; - -import org.teavm.jso.JSBody; -import org.teavm.jso.JSObject; -import org.teavm.jso.JSProperty; -import org.teavm.jso.core.JSString; - -public abstract class IDBIndex implements JSObject, IDBCursorSource { - @JSProperty - public abstract String getName(); - - @JSProperty("keyPath") - abstract JSObject getKeyPathImpl(); - - public final String[] getKeyPath() { - JSObject result = getKeyPathImpl(); - if (JSString.isInstance(result)) { - return new String[] { result.cast().stringValue() }; - } else { - return unwrapStringArray(result); - } - } - - @JSBody(script = "return this;") - private native String[] unwrapStringArray(JSObject obj); - - @JSProperty - public abstract boolean isMultiEntry(); - - @JSProperty - public abstract boolean isUnique(); - - public abstract IDBCursorRequest openCursor(); - - public abstract IDBCursorRequest openCursor(IDBKeyRange range); - - public abstract IDBCursorRequest openKeyCursor(); - - public abstract IDBGetRequest get(JSObject key); - - public abstract IDBGetRequest getKey(JSObject key); - - public abstract IDBCountRequest count(JSObject key); - - public abstract IDBCountRequest count(); -} diff --git a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBKeyRange.java b/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBKeyRange.java deleted file mode 100644 index 8028487..0000000 --- a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBKeyRange.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2015 Alexey Andreev. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package net.lax1dude.eaglercraft.adapter.teavm; - -import org.teavm.jso.JSBody; -import org.teavm.jso.JSObject; -import org.teavm.jso.JSProperty; - -public abstract class IDBKeyRange implements JSObject { - @JSProperty - public abstract JSObject getLower(); - - @JSProperty - public abstract JSObject getUpper(); - - @JSProperty - public abstract boolean isLowerOpen(); - - @JSProperty - public abstract boolean isUpperOpen(); - - @JSBody(params = "value", script = "return IDBKeyRange.only(value);") - public static native IDBKeyRange only(JSObject value); - - @JSBody(params = { "lower", "open" }, script = "return IDBKeyRange.lowerBound(lower, open);") - public static native IDBKeyRange lowerBound(JSObject lower, boolean open); - - public static IDBKeyRange lowerBound(JSObject lower) { - return lowerBound(lower, false); - } - - @JSBody(params = { "upper", "open" }, script = "return IDBKeyRange.upperBound(upper, open);") - public static native IDBKeyRange upperBound(JSObject upper, boolean open); - - public static IDBKeyRange upperBound(JSObject upper) { - return upperBound(upper, false); - } - - @JSBody(params = { "lower", "upper", "lowerOpen", - "upperOpen" }, script = "return IDBKeyRange.bound(lower, upper, lowerOpen, upperOpen);") - public static native IDBKeyRange bound(JSObject lower, JSObject upper, boolean lowerOpen, boolean upperOpen); - - public static IDBKeyRange bound(JSObject lower, JSObject upper) { - return bound(lower, upper, false, false); - } -} diff --git a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBObjectStore.java b/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBObjectStore.java deleted file mode 100644 index 62848bf..0000000 --- a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBObjectStore.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2015 Alexey Andreev. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package net.lax1dude.eaglercraft.adapter.teavm; - -import org.teavm.jso.JSBody; -import org.teavm.jso.JSObject; -import org.teavm.jso.JSProperty; -import org.teavm.jso.core.JSString; - -public abstract class IDBObjectStore implements JSObject, IDBCursorSource { - @JSProperty - public abstract String getName(); - - @JSProperty("keyPath") - abstract JSObject getKeyPathImpl(); - - public final String[] getKeyPath() { - JSObject result = getKeyPathImpl(); - if (JSString.isInstance(result)) { - return new String[] { result.cast().stringValue() }; - } else { - return unwrapStringArray(result); - } - } - - @JSBody(params = { "arr" }, script = "return arr;") - private native String[] unwrapStringArray(JSObject obj); - - @JSProperty - public abstract String[] getIndexNames(); - - @JSProperty - public abstract boolean isAutoIncrement(); - - public abstract IDBRequest put(JSObject value, JSObject key); - - public abstract IDBRequest put(JSObject value); - - public abstract IDBRequest add(JSObject value, JSObject key); - - public abstract IDBRequest add(JSObject value); - - public abstract IDBRequest delete(JSObject key); - - public abstract IDBGetRequest get(JSObject key); - - public abstract IDBRequest clear(); - - public abstract IDBCursorRequest openCursor(); - - public abstract IDBCursorRequest openCursor(IDBKeyRange range); - - public abstract net.lax1dude.eaglercraft.adapter.teavm.IDBIndex createIndex(String name, String key); - - public abstract net.lax1dude.eaglercraft.adapter.teavm.IDBIndex createIndex(String name, - String[] keys); - - public abstract IDBIndex index(String name); - - public abstract void deleteIndex(String name); - - public abstract IDBCountRequest count(); - - public abstract IDBCountRequest count(JSObject key); -} diff --git a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBObjectStoreParameters.java b/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBObjectStoreParameters.java deleted file mode 100644 index 17c1b98..0000000 --- a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBObjectStoreParameters.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2015 Alexey Andreev. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package net.lax1dude.eaglercraft.adapter.teavm; - -import org.teavm.jso.JSBody; -import org.teavm.jso.JSObject; -import org.teavm.jso.JSProperty; - -public abstract class IDBObjectStoreParameters implements JSObject { - @JSBody(script = "return {};") - public static native IDBObjectStoreParameters create(); - - public final IDBObjectStoreParameters keyPath(String... keys) { - setKeyPath(keys); - return this; - } - - public final IDBObjectStoreParameters autoIncrement(boolean autoIncrement) { - setAutoIncrement(autoIncrement); - return this; - } - - @JSProperty - abstract void setKeyPath(String[] keys); - - @JSProperty - abstract void setAutoIncrement(boolean autoIncrement); -} diff --git a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBOpenDBRequest.java b/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBOpenDBRequest.java deleted file mode 100644 index 827f48c..0000000 --- a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBOpenDBRequest.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2015 Alexey Andreev. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package net.lax1dude.eaglercraft.adapter.teavm; - -import org.teavm.jso.JSProperty; -import org.teavm.jso.dom.events.EventListener; - -public interface IDBOpenDBRequest extends IDBRequest { - @JSProperty - IDBDatabase getResult(); - - @JSProperty - void setOnBlocked(EventHandler handler); - - @JSProperty("onupgradeneeded") - void setOnUpgradeNeeded(EventListener listener); -} diff --git a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBRequest.java b/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBRequest.java deleted file mode 100644 index d97e273..0000000 --- a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBRequest.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2015 Alexey Andreev. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package net.lax1dude.eaglercraft.adapter.teavm; - -import org.teavm.jso.JSProperty; -import org.teavm.jso.dom.events.EventTarget; - -public interface IDBRequest extends EventTarget { - String STATE_PENDING = "pending"; - String STATE_DONE = "done"; - - @JSProperty - IDBError getError(); - - @JSProperty - IDBRequestSource getSource(); - - @JSProperty - IDBTransaction getTransaction(); - - @JSProperty - String getReadyState(); - - @JSProperty("onerror") - void setOnError(net.lax1dude.eaglercraft.adapter.teavm.EventHandler handler); - - @JSProperty("onsuccess") - void setOnSuccess(EventHandler handler); -} diff --git a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBRequestSource.java b/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBRequestSource.java deleted file mode 100644 index e208dea..0000000 --- a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBRequestSource.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright 2015 Alexey Andreev. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package net.lax1dude.eaglercraft.adapter.teavm; - -import org.teavm.jso.JSObject; - -public interface IDBRequestSource extends JSObject { -} diff --git a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBTransaction.java b/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBTransaction.java deleted file mode 100644 index 60d2efe..0000000 --- a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBTransaction.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2015 Alexey Andreev. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package net.lax1dude.eaglercraft.adapter.teavm; - -import org.teavm.jso.JSObject; -import org.teavm.jso.JSProperty; -import org.teavm.jso.dom.events.EventTarget; - -public interface IDBTransaction extends JSObject, EventTarget { - @JSProperty - String getMode(); - - @JSProperty - IDBDatabase getDb(); - - @JSProperty - IDBError getError(); - - IDBObjectStore objectStore(String name); - - void abort(); - - @JSProperty("onabort") - void setOnAbort(net.lax1dude.eaglercraft.adapter.teavm.EventHandler handler); - - @JSProperty("oncomplete") - void setOnComplete(net.lax1dude.eaglercraft.adapter.teavm.EventHandler handler); - - @JSProperty("onerror") - void setOnError(EventHandler handler); -} diff --git a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBVersionChangeEvent.java b/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBVersionChangeEvent.java deleted file mode 100644 index 5046041..0000000 --- a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/IDBVersionChangeEvent.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2015 Alexey Andreev. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package net.lax1dude.eaglercraft.adapter.teavm; - -import org.teavm.jso.JSProperty; -import org.teavm.jso.dom.events.Event; - -public interface IDBVersionChangeEvent extends Event { - @JSProperty - int getOldVersion(); - - @JSProperty - int getNewVersion(); -} diff --git a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/SelfDefence.java b/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/SelfDefence.java index 3406c45..3a2b146 100644 --- a/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/SelfDefence.java +++ b/src/teavm/java/net/lax1dude/eaglercraft/adapter/teavm/SelfDefence.java @@ -28,7 +28,7 @@ public class SelfDefence { @JSBody(params = { "cb" }, script = "const ccb = cb; const _open = window.open; window.open = (url,name,params) => { var rw = _open(url,name,params); ccb(rw); return rw; }") private static native void injectWindowCapture(NewWindowCallback callback); - private static final List capturedChildWindows = new ArrayList(); + private static final List capturedChildWindows = new ArrayList<>(); public static void init(HTMLCanvasElement legitCanvas) { canvas = legitCanvas;