mirror of
https://github.com/catfoolyou/Alpha-1.1.2_01.git
synced 2025-05-31 11:50:57 -05:00
25w20b and WASM
This commit is contained in:
parent
6b36182531
commit
e3bcfd9bb8
1
.idea/.name
generated
Normal file
1
.idea/.name
generated
Normal file
@ -0,0 +1 @@
|
||||
eaglercraft
|
6
.idea/compiler.xml
generated
Normal file
6
.idea/compiler.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="CompilerConfiguration">
|
||||
<bytecodeTargetLevel target="17" />
|
||||
</component>
|
||||
</project>
|
15
.idea/gradle.xml
generated
Normal file
15
.idea/gradle.xml
generated
Normal file
@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="GradleSettings">
|
||||
<option name="linkedExternalProjectsSettings">
|
||||
<GradleProjectSettings>
|
||||
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||
<option name="modules">
|
||||
<set>
|
||||
<option value="$PROJECT_DIR$" />
|
||||
</set>
|
||||
</option>
|
||||
</GradleProjectSettings>
|
||||
</option>
|
||||
</component>
|
||||
</project>
|
20
.idea/jarRepositories.xml
generated
Normal file
20
.idea/jarRepositories.xml
generated
Normal file
@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="RemoteRepositoriesConfiguration">
|
||||
<remote-repository>
|
||||
<option name="id" value="central" />
|
||||
<option name="name" value="Maven Central repository" />
|
||||
<option name="url" value="https://repo1.maven.org/maven2" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="jboss.community" />
|
||||
<option name="name" value="JBoss Community repository" />
|
||||
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="MavenRepo" />
|
||||
<option name="name" value="MavenRepo" />
|
||||
<option name="url" value="https://repo.maven.apache.org/maven2/" />
|
||||
</remote-repository>
|
||||
</component>
|
||||
</project>
|
5
.idea/misc.xml
generated
Normal file
5
.idea/misc.xml
generated
Normal file
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" project-jdk-name="17" project-jdk-type="JavaSDK" />
|
||||
</project>
|
6
.idea/vcs.xml
generated
Normal file
6
.idea/vcs.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
443
.idea/workspace.xml
generated
443
.idea/workspace.xml
generated
@ -5,398 +5,22 @@
|
||||
</component>
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="6bf56493-3337-4b11-98fb-a5d499cdbe34" name="Changes" comment="">
|
||||
<change beforePath="$PROJECT_DIR$/.gitignore" beforeDir="false" afterPath="$PROJECT_DIR$/.gitignore" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.idea/.gitignore" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.idea/.name" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.idea/Alpha-1.1.2_01.iml" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.idea/compiler.xml" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.idea/gradle.xml" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.idea/jarRepositories.xml" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.idea/misc.xml" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.idea/vcs.xml" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/build.gradle" beforeDir="false" afterPath="$PROJECT_DIR$/build.gradle" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/javascript/classes.js" beforeDir="false" afterPath="$PROJECT_DIR$/javascript/classes.js" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/javascript/classes.js.map" beforeDir="false" afterPath="$PROJECT_DIR$/javascript/classes.js.map" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/lwjgl-rundir/eaglercraft.jar" beforeDir="false" afterPath="$PROJECT_DIR$/lwjgl-rundir/eaglercraft.jar" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/client/Minecraft.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/AxisAlignedBB.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Block.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockBookshelf.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockBreakable.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockButton.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockCactus.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockChest.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockClay.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockContainer.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockCrops.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockDirt.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockDoor.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockFarmland.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockFence.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockFire.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockFlower.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockFlowing.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockFluid.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockFurnace.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockGlass.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockGrass.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockGravel.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockIce.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockJukeBox.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockLadder.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockLeaves.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockLeavesBase.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockLever.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockLog.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockMinecartTrack.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockMobSpawner.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockMushroom.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockObsidian.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockOre.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockOreBlock.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockPressurePlate.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockRedstoneOre.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockRedstoneTorch.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockRedstoneWire.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockReed.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockSand.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockSapling.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockSign.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockSnow.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockSnowBlock.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockSponge.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockStairs.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockStationary.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockStep.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockStone.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockTNT.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockTorch.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockWorkbench.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ChatAllowedCharacters.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ChatLine.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Chunk.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ChunkCache.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ChunkCoordIntPair.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ChunkCoordinates.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ChunkLoader.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ChunkPosition.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ChunkProviderClient.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ChunkProviderGenerate.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ChunkProviderIso.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ChunkProviderLoadOrGenerate.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ClippingHelper.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ClippingHelperImplementation.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/CompressedStreamTools.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/CraftingInventoryCB.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/CraftingInventoryPlayerCB.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/CraftingInventoryWorkbenchCB.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/CraftingManager.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/CraftingRecipe.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EffectRenderer.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Entity.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityAnimal.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityArrow.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityBoat.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityBubbleFX.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityChicken.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityClientPlayerMP.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityCow.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityCreature.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityCreeper.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityDiggingFX.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityExplodeFX.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityFX.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityFallingSand.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityFlameFX.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityGiantZombie.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityItem.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityLavaFX.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityList.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityLiving.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityMinecart.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityMob.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityOtherPlayerMP.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityPainting.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityPickupFX.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityPig.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityPlayer.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityPlayerSP.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityRainFX.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityReddustFX.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityRenderer.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntitySheep.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntitySkeleton.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntitySlime.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntitySlimeFX.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntitySmokeFX.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntitySnowball.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntitySorter.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntitySpider.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntitySplashFX.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityTNTPrimed.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityZombie.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EnumArt.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EnumMobType.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EnumOS.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EnumOSIsom.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EnumSkyBlock.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Explosion.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/FontRenderer.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Frustum.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GLAllocation.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GameSettings.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Gui.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiButton.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiChat.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiChest.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiConflictWarning.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiConnectFailed.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiConnecting.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiContainer.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiControls.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiCrafting.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiDeleteWorld.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiDownloadTerrain.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiEditSign.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiErrorScreen.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiFurnace.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiGameOver.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiIngame.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiIngameMenu.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiInventory.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiMainMenu.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiMultiplayer.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiOptions.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiScreen.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiSelectWorld.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiSlider.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiSmallButton.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiTextField.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiYesNo.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/IBlockAccess.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ICamera.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/IChunkLoader.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/IChunkProvider.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/IInventory.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/IMobs.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/IProgressUpdate.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/IWorldAccess.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/InventoryCraftResult.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/InventoryCrafting.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/InventoryLargeChest.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/InventoryPlayer.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/IsoImageBuffer.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Item.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemArmor.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemAxe.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemBlock.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemBoat.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemBow.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemBucket.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemDoor.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemFlintAndSteel.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemFood.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemHoe.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemMinecart.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemPainting.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemPickaxe.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemRecord.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemRedstone.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemReed.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemRenderer.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemSaddle.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemSeeds.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemSign.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemSnowball.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemSoup.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemSpade.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemStack.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemSword.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemTool.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/KeyBinding.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/LoadingScreenRenderer.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/LogoEffectRandomizer.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MCHashEntry.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MCHashTable.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MapGenBase.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MapGenCaves.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Material.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MaterialLiquid.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MaterialLogic.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MaterialTransparent.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MathHelper.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MetadataChunkBlock.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MinecartTrackLogic.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MinecraftError.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MinecraftException.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelBase.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelBiped.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelBoat.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelChicken.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelCow.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelCreeper.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelMinecart.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelPig.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelQuadraped.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelRenderer.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelSheep.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelSheepFur.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelSkeleton.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelSlime.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelSpider.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelZombie.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MouseHelper.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MovementInput.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MovementInputFromOptions.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MovingObjectPosition.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NBTBase.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NBTTagByte.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NBTTagByteArray.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NBTTagCompound.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NBTTagDouble.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NBTTagEnd.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NBTTagFloat.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NBTTagInt.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NBTTagList.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NBTTagLong.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NBTTagShort.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NBTTagString.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NetClientHandler.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NetHandler.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NetworkManager.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NextTickListEntry.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NibbleArray.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NoiseGenerator.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NoiseGeneratorOctaves.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NoiseGeneratorPerlin.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/OSMap.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/OSMapIsom.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet0KeepAlive.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet10Flying.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet11PlayerPosition.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet12PlayerLook.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet13PlayerLookMove.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet14BlockDig.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet15Place.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet16BlockItemSwitch.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet17AddToInventory.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet18ArmAnimation.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet1Login.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet20NamedEntitySpawn.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet21PickupSpawn.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet22Collect.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet23VehicleSpawn.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet24MobSpawn.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet255KickDisconnect.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet29DestroyEntity.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet2Handshake.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet30Entity.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet31RelEntityMove.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet32EntityLook.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet33RelEntityMoveLook.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet34EntityTeleport.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet3Chat.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet4UpdateTime.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet50PreChunk.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet51MapChunk.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet52MultiBlockChange.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet53BlockChange.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet59ComplexEntity.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet5PlayerInventory.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet6SpawnPosition.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/PanelCrashReport.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Path.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/PathEntity.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/PathPoint.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Pathfinder.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/PlayerController.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/PlayerControllerCreative.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/PlayerControllerMP.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/PlayerControllerSP.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/PositionTexureVertex.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RecipeSorter.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RecipesArmor.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RecipesCrafting.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RecipesFood.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RecipesIngots.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RecipesTools.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RecipesWeapons.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RedstoneUpdateInfo.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Render.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderArrow.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderBlocks.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderBoat.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderChicken.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderCow.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderCreeper.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderEngine.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderEntity.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderFallingSand.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderGiantZombie.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderGlobal.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderHelper.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderItem.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderList.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderLiving.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderManager.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderMinecart.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderPainting.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderPig.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderPlayer.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderSheep.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderSlime.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderSnowball.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderSorter.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderSpider.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderTNTPrimed.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ScaledResolution.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Session.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/SignModel.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Slot.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/SlotArmor.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/SlotCrafting.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/SlotInventory.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/SoundManager.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/SpawnerAnimals.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/SpawnerClient.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/StepSound.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/StepSoundGlass.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/StepSoundSand.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TerrainTextureManager.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Tessellator.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TextureCompassFX.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TextureFX.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TextureFlamesFX.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TextureLavaFX.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TextureLavaFlowFX.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TextureWaterFX.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TextureWaterFlowFX.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TexturedQuad.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TileEntity.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TileEntityChest.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TileEntityFurnace.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TileEntityMobSpawner.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TileEntityMobSpawnerRenderer.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TileEntityRenderer.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TileEntitySign.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TileEntitySignRenderer.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TileEntitySpecialRenderer.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Timer.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/UnexpectedThrowable.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Vec3D.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/World.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/WorldBlockPositionType.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/WorldClient.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/WorldGenBigTree.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/WorldGenCactus.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/WorldGenClay.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/WorldGenDungeons.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/WorldGenFlowers.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/WorldGenLiquids.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/WorldGenMinable.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/WorldGenReed.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/WorldGenTrees.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/WorldGenerator.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/WorldRenderer.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/minecraft/src/Block.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/minecraft/src/Block.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/minecraft/src/BlockSign.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/minecraft/src/BlockSign.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/minecraft/src/EntityList.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/minecraft/src/EntityList.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/minecraft/src/Packet.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/minecraft/src/Packet.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/minecraft/src/PlayerControllerSP.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/minecraft/src/PlayerControllerSP.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/minecraft/src/SpawnerAnimals.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/minecraft/src/SpawnerAnimals.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/minecraft/src/SpawnerClient.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/minecraft/src/SpawnerClient.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/minecraft/src/TileEntity.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/minecraft/src/TileEntity.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/peyton/eagler/minecraft/EntityConstructor.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/peyton/eagler/minecraft/EntityConstructor.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/wasm_gc_teavm/CompileEagRuntimeJS.sh" beforeDir="false" afterPath="$PROJECT_DIR$/wasm_gc_teavm/CompileEagRuntimeJS.sh" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/wasm_gc_teavm/javascript/eagruntime.js" beforeDir="false" afterPath="$PROJECT_DIR$/wasm_gc_teavm/javascript/eagruntime.js" afterDir="false" />
|
||||
</list>
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||
@ -413,7 +37,12 @@
|
||||
<state>
|
||||
<projects_view>
|
||||
<tree_state>
|
||||
<expand />
|
||||
<expand>
|
||||
<path>
|
||||
<item name="" type="6a2764b6:ExternalProjectsStructure$RootNode" />
|
||||
<item name="eaglercraft" type="f1a62948:ProjectNode" />
|
||||
</path>
|
||||
</expand>
|
||||
<select />
|
||||
</tree_state>
|
||||
</projects_view>
|
||||
@ -443,21 +72,35 @@
|
||||
<option name="hideEmptyMiddlePackages" value="true" />
|
||||
<option name="showLibraryContents" value="true" />
|
||||
</component>
|
||||
<component name="PropertiesComponent">{
|
||||
"keyToString": {
|
||||
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||
"SHARE_PROJECT_CONFIGURATION_FILES": "true",
|
||||
"git-widget-placeholder": "main",
|
||||
"kotlin-language-version-configured": "true",
|
||||
"last_opened_file_path": "/home/lyosha/IdeaProjects/Project164",
|
||||
"settings.editor.selected.configurable": "preferences.updates"
|
||||
<component name="PropertiesComponent"><![CDATA[{
|
||||
"keyToString": {
|
||||
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||
"git-widget-placeholder": "main",
|
||||
"kotlin-language-version-configured": "true",
|
||||
"last_opened_file_path": "/home/lyosha/IdeaProjects/Alpha-1.1.2_01",
|
||||
"settings.editor.selected.configurable": "preferences.updates"
|
||||
}
|
||||
}</component>
|
||||
}]]></component>
|
||||
<component name="RecentsManager">
|
||||
<key name="CopyFile.RECENT_KEYS">
|
||||
<recent name="$PROJECT_DIR$/src/main/java/net/lax1dude/eaglercraft/profile" />
|
||||
</key>
|
||||
</component>
|
||||
<component name="RunManager">
|
||||
<configuration default="true" type="JetRunConfigurationType">
|
||||
<module name="eaglercraft.test" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
<configuration default="true" type="KotlinStandaloneScriptRunConfigurationType">
|
||||
<module name="eaglercraft.test" />
|
||||
<option name="filePath" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
|
||||
<component name="TaskManager">
|
||||
<task active="true" id="Default" summary="Default task">
|
||||
|
@ -10,7 +10,7 @@ sourceSets {
|
||||
java {
|
||||
srcDirs(
|
||||
"src/main/java",
|
||||
"src/lwjgl/java"
|
||||
"src/teavm/java"
|
||||
)
|
||||
}
|
||||
}
|
||||
@ -26,7 +26,7 @@ tasks.withType(JavaCompile) {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation fileTree(dir: './lwjgl-rundir/', include: '*.jar')
|
||||
//implementation fileTree(dir: './lwjgl-rundir/', include: '*.jar')
|
||||
|
||||
teavm(teavm.libs.jso)
|
||||
teavm(teavm.libs.jsoApis)
|
||||
|
File diff suppressed because it is too large
Load Diff
17404
javascript/classes.js
17404
javascript/classes.js
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
Binary file not shown.
@ -82,12 +82,12 @@ public class Block {
|
||||
public static final Block tilledField = (new BlockFarmland(60)).setHardness(0.6F).setStepSound(soundGravelFootstep);
|
||||
public static final Block stoneOvenIdle = (new BlockFurnace(61, false)).setHardness(3.5F).setStepSound(soundStoneFootstep);
|
||||
public static final Block stoneOvenActive = (new BlockFurnace(62, true)).setHardness(3.5F).setStepSound(soundStoneFootstep).setLightValue(14.0F / 16.0F);
|
||||
public static final Block signStanding = (new BlockSign(63, TileEntitySign.class, true)).setHardness(1.0F).setStepSound(soundWoodFootstep);
|
||||
public static final Block signStanding = (new BlockSign(63, true)).setHardness(1.0F).setStepSound(soundWoodFootstep);
|
||||
public static final Block doorWood = (new BlockDoor(64, Material.wood)).setHardness(3.0F).setStepSound(soundWoodFootstep);
|
||||
public static final Block ladder = (new BlockLadder(65, 83)).setHardness(0.4F).setStepSound(soundWoodFootstep);
|
||||
public static final Block minecartTrack = (new BlockMinecartTrack(66, 128)).setHardness(0.7F).setStepSound(soundMetalFootstep);
|
||||
public static final Block stairCompactStone = new BlockStairs(67, cobblestone);
|
||||
public static final Block signWall = (new BlockSign(68, TileEntitySign.class, false)).setHardness(1.0F).setStepSound(soundWoodFootstep);
|
||||
public static final Block signWall = (new BlockSign(68, false)).setHardness(1.0F).setStepSound(soundWoodFootstep);
|
||||
public static final Block lever = (new BlockLever(69, 96)).setHardness(0.5F).setStepSound(soundWoodFootstep);
|
||||
public static final Block pressurePlateStone = (new BlockPressurePlate(70, stone.blockIndexInTexture, EnumMobType.mobs)).setHardness(0.5F).setStepSound(soundStoneFootstep);
|
||||
public static final Block doorSteel = (new BlockDoor(71, Material.iron)).setHardness(5.0F).setStepSound(soundMetalFootstep);
|
||||
|
@ -3,14 +3,12 @@ package net.minecraft.src;
|
||||
import java.util.Random;
|
||||
|
||||
public class BlockSign extends BlockContainer {
|
||||
private Class signEntityClass;
|
||||
private boolean isFreestanding;
|
||||
|
||||
protected BlockSign(int var1, Class var2, boolean var3) {
|
||||
protected BlockSign(int var1, boolean var3) {
|
||||
super(var1, Material.wood);
|
||||
this.isFreestanding = var3;
|
||||
this.blockIndexInTexture = 4;
|
||||
this.signEntityClass = var2;
|
||||
float var4 = 0.25F;
|
||||
float var5 = 1.0F;
|
||||
this.setBlockBounds(0.5F - var4, 0.0F, 0.5F - var4, 0.5F + var4, var5, 0.5F + var4);
|
||||
@ -67,7 +65,7 @@ public class BlockSign extends BlockContainer {
|
||||
|
||||
protected TileEntity getBlockEntity() {
|
||||
try {
|
||||
return (TileEntity)this.signEntityClass.newInstance();
|
||||
return new TileEntitySign();
|
||||
} catch (Exception var2) {
|
||||
throw new RuntimeException(var2);
|
||||
}
|
||||
|
@ -1,18 +1,20 @@
|
||||
package net.minecraft.src;
|
||||
|
||||
import net.peyton.eagler.minecraft.EntityConstructor;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class EntityList {
|
||||
private static Map stringToClassMapping = new HashMap();
|
||||
private static Map<String, EntityConstructor> stringToClassMapping = new HashMap();
|
||||
private static Map classToStringMapping = new HashMap();
|
||||
private static Map IDtoClassMapping = new HashMap();
|
||||
private static Map<Integer, EntityConstructor> IDtoClassMapping = new HashMap();
|
||||
private static Map classToIDMapping = new HashMap();
|
||||
|
||||
private static void addMapping(Class var0, String var1, int var2) {
|
||||
stringToClassMapping.put(var1, var0);
|
||||
private static void addMapping(Class var0, EntityConstructor var3, String var1, int var2) {
|
||||
stringToClassMapping.put(var1, var3);
|
||||
classToStringMapping.put(var0, var1);
|
||||
IDtoClassMapping.put(Integer.valueOf(var2), var0);
|
||||
IDtoClassMapping.put(Integer.valueOf(var2), var3);
|
||||
classToIDMapping.put(var0, Integer.valueOf(var2));
|
||||
}
|
||||
|
||||
@ -20,9 +22,9 @@ public class EntityList {
|
||||
Entity var2 = null;
|
||||
|
||||
try {
|
||||
Class var3 = (Class)stringToClassMapping.get(var0);
|
||||
EntityConstructor var3 = stringToClassMapping.get(var0);
|
||||
if(var3 != null) {
|
||||
var2 = (Entity)var3.getConstructor(new Class[]{World.class}).newInstance(new Object[]{var1});
|
||||
var2 = var3.createEntity(var1);
|
||||
}
|
||||
} catch (Exception var4) {
|
||||
var4.printStackTrace();
|
||||
@ -35,9 +37,9 @@ public class EntityList {
|
||||
Entity var2 = null;
|
||||
|
||||
try {
|
||||
Class var3 = (Class)stringToClassMapping.get(var0.getString("id"));
|
||||
EntityConstructor var3 = stringToClassMapping.get(var0.getString("id"));
|
||||
if(var3 != null) {
|
||||
var2 = (Entity)var3.getConstructor(new Class[]{World.class}).newInstance(new Object[]{var1});
|
||||
var2 = var3.createEntity(var1);
|
||||
}
|
||||
} catch (Exception var4) {
|
||||
var4.printStackTrace();
|
||||
@ -56,9 +58,9 @@ public class EntityList {
|
||||
Entity var2 = null;
|
||||
|
||||
try {
|
||||
Class var3 = (Class)IDtoClassMapping.get(Integer.valueOf(var0));
|
||||
EntityConstructor var3 = IDtoClassMapping.get(Integer.valueOf(var0));
|
||||
if(var3 != null) {
|
||||
var2 = (Entity)var3.getConstructor(new Class[]{World.class}).newInstance(new Object[]{var1});
|
||||
var2 = var3.createEntity(var1);
|
||||
}
|
||||
} catch (Exception var4) {
|
||||
var4.printStackTrace();
|
||||
@ -80,25 +82,25 @@ public class EntityList {
|
||||
}
|
||||
|
||||
static {
|
||||
addMapping(EntityArrow.class, "Arrow", 10);
|
||||
addMapping(EntitySnowball.class, "Snowball", 11);
|
||||
addMapping(EntityItem.class, "Item", 1);
|
||||
addMapping(EntityPainting.class, "Painting", 9);
|
||||
addMapping(EntityLiving.class, "Mob", 48);
|
||||
addMapping(EntityMob.class, "Monster", 49);
|
||||
addMapping(EntityCreeper.class, "Creeper", 50);
|
||||
addMapping(EntitySkeleton.class, "Skeleton", 51);
|
||||
addMapping(EntitySpider.class, "Spider", 52);
|
||||
addMapping(EntityGiantZombie.class, "Giant", 53);
|
||||
addMapping(EntityZombie.class, "Zombie", 54);
|
||||
addMapping(EntitySlime.class, "Slime", 55);
|
||||
addMapping(EntityPig.class, "Pig", 90);
|
||||
addMapping(EntitySheep.class, "Sheep", 91);
|
||||
addMapping(EntityCow.class, "Cow", 91);
|
||||
addMapping(EntityChicken.class, "Chicken", 91);
|
||||
addMapping(EntityTNTPrimed.class, "PrimedTnt", 20);
|
||||
addMapping(EntityFallingSand.class, "FallingSand", 21);
|
||||
addMapping(EntityMinecart.class, "Minecart", 40);
|
||||
addMapping(EntityBoat.class, "Boat", 41);
|
||||
addMapping(EntityArrow.class, EntityArrow::new, "Arrow", 10);
|
||||
addMapping(EntitySnowball.class, EntitySnowball::new, "Snowball", 11);
|
||||
addMapping(EntityItem.class, EntityItem::new, "Item", 1);
|
||||
addMapping(EntityPainting.class, EntityPainting::new, "Painting", 9);
|
||||
addMapping(EntityLiving.class, EntityLiving::new, "Mob", 48);
|
||||
addMapping(EntityMob.class, EntityMob::new, "Monster", 49);
|
||||
addMapping(EntityCreeper.class, EntityCreeper::new, "Creeper", 50);
|
||||
addMapping(EntitySkeleton.class, EntitySkeleton::new, "Skeleton", 51);
|
||||
addMapping(EntitySpider.class, EntitySpider::new, "Spider", 52);
|
||||
addMapping(EntityGiantZombie.class, EntityGiantZombie::new, "Giant", 53);
|
||||
addMapping(EntityZombie.class, EntityZombie::new, "Zombie", 54);
|
||||
addMapping(EntitySlime.class, EntitySlime::new, "Slime", 55);
|
||||
addMapping(EntityPig.class, EntityPig::new, "Pig", 90);
|
||||
addMapping(EntitySheep.class, EntitySheep::new, "Sheep", 91);
|
||||
addMapping(EntityCow.class, EntityCow::new, "Cow", 92);
|
||||
addMapping(EntityChicken.class, EntityChicken::new, "Chicken", 93);
|
||||
addMapping(EntityTNTPrimed.class, EntityTNTPrimed::new, "PrimedTnt", 20);
|
||||
addMapping(EntityFallingSand.class, EntityFallingSand::new, "FallingSand", 21);
|
||||
addMapping(EntityMinecart.class, EntityMinecart::new, "Minecart", 40);
|
||||
addMapping(EntityBoat.class, EntityBoat::new, "Boat", 41);
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,7 @@
|
||||
package net.minecraft.src;
|
||||
|
||||
import net.peyton.eagler.minecraft.PacketConstructor;
|
||||
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.IOException;
|
||||
@ -7,25 +9,25 @@ import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public abstract class Packet {
|
||||
private static Map packetIdToClassMap = new HashMap();
|
||||
private static Map<Integer, PacketConstructor> packetIdToClassMap = new HashMap();
|
||||
private static Map packetClassToIdMap = new HashMap();
|
||||
public boolean isChunkDataPacket = false;
|
||||
|
||||
static void addIdClassMapping(int var0, Class var1) {
|
||||
static void addIdClassMapping(int var0, Class var1, PacketConstructor var2) {
|
||||
if(packetIdToClassMap.containsKey(Integer.valueOf(var0))) {
|
||||
throw new IllegalArgumentException("Duplicate packet id:" + var0);
|
||||
} else if(packetClassToIdMap.containsKey(var1)) {
|
||||
throw new IllegalArgumentException("Duplicate packet class:" + var1);
|
||||
} else {
|
||||
packetIdToClassMap.put(Integer.valueOf(var0), var1);
|
||||
packetIdToClassMap.put(Integer.valueOf(var0), var2);
|
||||
packetClassToIdMap.put(var1, Integer.valueOf(var0));
|
||||
}
|
||||
}
|
||||
|
||||
public static Packet getNewPacket(int var0) {
|
||||
try {
|
||||
Class var1 = (Class)packetIdToClassMap.get(Integer.valueOf(var0));
|
||||
return var1 == null ? null : (Packet)var1.newInstance();
|
||||
PacketConstructor var1 = packetIdToClassMap.get(Integer.valueOf(var0));
|
||||
return var1 == null ? null : var1.createPacket();
|
||||
} catch (Exception var2) {
|
||||
var2.printStackTrace();
|
||||
System.out.println("Skipping packet with id " + var0);
|
||||
@ -66,38 +68,38 @@ public abstract class Packet {
|
||||
public abstract int getPacketSize();
|
||||
|
||||
static {
|
||||
addIdClassMapping(0, Packet0KeepAlive.class);
|
||||
addIdClassMapping(1, Packet1Login.class);
|
||||
addIdClassMapping(2, Packet2Handshake.class);
|
||||
addIdClassMapping(3, Packet3Chat.class);
|
||||
addIdClassMapping(4, Packet4UpdateTime.class);
|
||||
addIdClassMapping(5, Packet5PlayerInventory.class);
|
||||
addIdClassMapping(6, Packet6SpawnPosition.class);
|
||||
addIdClassMapping(10, Packet10Flying.class);
|
||||
addIdClassMapping(11, Packet11PlayerPosition.class);
|
||||
addIdClassMapping(12, Packet12PlayerLook.class);
|
||||
addIdClassMapping(13, Packet13PlayerLookMove.class);
|
||||
addIdClassMapping(14, Packet14BlockDig.class);
|
||||
addIdClassMapping(15, Packet15Place.class);
|
||||
addIdClassMapping(16, Packet16BlockItemSwitch.class);
|
||||
addIdClassMapping(17, Packet17AddToInventory.class);
|
||||
addIdClassMapping(18, Packet18ArmAnimation.class);
|
||||
addIdClassMapping(20, Packet20NamedEntitySpawn.class);
|
||||
addIdClassMapping(21, Packet21PickupSpawn.class);
|
||||
addIdClassMapping(22, Packet22Collect.class);
|
||||
addIdClassMapping(23, Packet23VehicleSpawn.class);
|
||||
addIdClassMapping(24, Packet24MobSpawn.class);
|
||||
addIdClassMapping(29, Packet29DestroyEntity.class);
|
||||
addIdClassMapping(30, Packet30Entity.class);
|
||||
addIdClassMapping(31, Packet31RelEntityMove.class);
|
||||
addIdClassMapping(32, Packet32EntityLook.class);
|
||||
addIdClassMapping(33, Packet33RelEntityMoveLook.class);
|
||||
addIdClassMapping(34, Packet34EntityTeleport.class);
|
||||
addIdClassMapping(50, Packet50PreChunk.class);
|
||||
addIdClassMapping(51, Packet51MapChunk.class);
|
||||
addIdClassMapping(52, Packet52MultiBlockChange.class);
|
||||
addIdClassMapping(53, Packet53BlockChange.class);
|
||||
addIdClassMapping(59, Packet59ComplexEntity.class);
|
||||
addIdClassMapping(255, Packet255KickDisconnect.class);
|
||||
addIdClassMapping(0, Packet0KeepAlive.class, Packet0KeepAlive::new);
|
||||
addIdClassMapping(1, Packet1Login.class, Packet1Login::new);
|
||||
addIdClassMapping(2, Packet2Handshake.class, Packet2Handshake::new);
|
||||
addIdClassMapping(3, Packet3Chat.class, Packet3Chat::new);
|
||||
addIdClassMapping(4, Packet4UpdateTime.class, Packet4UpdateTime::new);
|
||||
addIdClassMapping(5, Packet5PlayerInventory.class, Packet5PlayerInventory::new);
|
||||
addIdClassMapping(6, Packet6SpawnPosition.class, Packet6SpawnPosition::new);
|
||||
addIdClassMapping(10, Packet10Flying.class, Packet10Flying::new);
|
||||
addIdClassMapping(11, Packet11PlayerPosition.class, Packet11PlayerPosition::new);
|
||||
addIdClassMapping(12, Packet12PlayerLook.class, Packet12PlayerLook::new);
|
||||
addIdClassMapping(13, Packet13PlayerLookMove.class, Packet13PlayerLookMove::new);
|
||||
addIdClassMapping(14, Packet14BlockDig.class, Packet14BlockDig::new);
|
||||
addIdClassMapping(15, Packet15Place.class, Packet15Place::new);
|
||||
addIdClassMapping(16, Packet16BlockItemSwitch.class, Packet16BlockItemSwitch::new);
|
||||
addIdClassMapping(17, Packet17AddToInventory.class, Packet17AddToInventory::new);
|
||||
addIdClassMapping(18, Packet18ArmAnimation.class, Packet18ArmAnimation::new);
|
||||
addIdClassMapping(20, Packet20NamedEntitySpawn.class, Packet20NamedEntitySpawn::new);
|
||||
addIdClassMapping(21, Packet21PickupSpawn.class, Packet21PickupSpawn::new);
|
||||
addIdClassMapping(22, Packet22Collect.class, Packet22Collect::new);
|
||||
addIdClassMapping(23, Packet23VehicleSpawn.class, Packet23VehicleSpawn::new);
|
||||
addIdClassMapping(24, Packet24MobSpawn.class, Packet24MobSpawn::new);
|
||||
addIdClassMapping(29, Packet29DestroyEntity.class, Packet29DestroyEntity::new);
|
||||
addIdClassMapping(30, Packet30Entity.class, Packet30Entity::new);
|
||||
addIdClassMapping(31, Packet31RelEntityMove.class, Packet31RelEntityMove::new);
|
||||
addIdClassMapping(32, Packet32EntityLook.class, Packet32EntityLook::new);
|
||||
addIdClassMapping(33, Packet33RelEntityMoveLook.class, Packet33RelEntityMoveLook::new);
|
||||
addIdClassMapping(34, Packet34EntityTeleport.class, Packet34EntityTeleport::new);
|
||||
addIdClassMapping(50, Packet50PreChunk.class, Packet50PreChunk::new);
|
||||
addIdClassMapping(51, Packet51MapChunk.class, Packet51MapChunk::new);
|
||||
addIdClassMapping(52, Packet52MultiBlockChange.class, Packet52MultiBlockChange::new);
|
||||
addIdClassMapping(53, Packet53BlockChange.class, Packet53BlockChange::new);
|
||||
addIdClassMapping(59, Packet59ComplexEntity.class, Packet59ComplexEntity::new);
|
||||
addIdClassMapping(255, Packet255KickDisconnect.class, Packet255KickDisconnect::new);
|
||||
}
|
||||
}
|
||||
|
@ -10,8 +10,8 @@ public class PlayerControllerSP extends PlayerController {
|
||||
private float prevBlockDamage = 0.0F;
|
||||
private float blockDestroySoundCounter = 0.0F;
|
||||
private int blockHitWait = 0;
|
||||
private SpawnerAnimals monsterSpawner = new SpawnerClient(this, 200, IMobs.class, new Class[]{EntityZombie.class, EntitySkeleton.class, EntityCreeper.class, EntitySpider.class, EntitySlime.class});
|
||||
private SpawnerAnimals animalSpawner = new SpawnerAnimals(15, EntityAnimal.class, new Class[]{EntitySheep.class, EntityPig.class, EntityCow.class, EntityChicken.class});
|
||||
private SpawnerAnimals monsterSpawner = new SpawnerClient(this, 200, IMobs.class, new SpawnerAnimals.EntityConstructor[]{EntityZombie::new, EntitySkeleton::new, EntityCreeper::new, EntitySpider::new, EntitySlime::new});
|
||||
private SpawnerAnimals animalSpawner = new SpawnerAnimals(15, EntityAnimal.class, new SpawnerAnimals.EntityConstructor[]{EntitySheep::new, EntityPig::new, EntityCow::new, EntityChicken::new});
|
||||
|
||||
public PlayerControllerSP(Minecraft var1) {
|
||||
super(var1);
|
||||
|
@ -7,10 +7,10 @@ import java.util.Set;
|
||||
public class SpawnerAnimals {
|
||||
private int maxSpawns;
|
||||
private Class entityType;
|
||||
private Class[] entities;
|
||||
private EntityConstructor[] entities;
|
||||
private Set eligibleChunksForSpawning = new HashSet();
|
||||
|
||||
public SpawnerAnimals(int var1, Class var2, Class[] var3) {
|
||||
public SpawnerAnimals(int var1, Class var2, EntityConstructor[] var3) {
|
||||
this.maxSpawns = var1;
|
||||
this.entityType = var2;
|
||||
this.entities = var3;
|
||||
@ -20,7 +20,7 @@ public class SpawnerAnimals {
|
||||
int var2 = var1.countEntities(this.entityType);
|
||||
if(var2 < this.maxSpawns) {
|
||||
for(int var3 = 0; var3 < 3; ++var3) {
|
||||
this.performSpawning(var1, 1, (IProgressUpdate)null);
|
||||
this.performSpawning(var1, 1, null);
|
||||
}
|
||||
}
|
||||
|
||||
@ -101,7 +101,8 @@ public class SpawnerAnimals {
|
||||
if(var24 >= 576.0F) {
|
||||
EntityLiving var29;
|
||||
try {
|
||||
var29 = (EntityLiving)this.entities[var7].getConstructor(new Class[]{World.class}).newInstance(new Object[]{var1});
|
||||
var29 = this.entities[var7].createEntity(var1);
|
||||
|
||||
} catch (Exception var25) {
|
||||
var25.printStackTrace();
|
||||
return var4;
|
||||
@ -125,4 +126,8 @@ public class SpawnerAnimals {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public interface EntityConstructor<T extends EntityLiving> {
|
||||
T createEntity(World world);
|
||||
}
|
||||
}
|
||||
|
@ -3,7 +3,7 @@ package net.minecraft.src;
|
||||
class SpawnerClient extends SpawnerAnimals {
|
||||
final PlayerControllerSP playerController;
|
||||
|
||||
SpawnerClient(PlayerControllerSP var1, int var2, Class var3, Class[] var4) {
|
||||
SpawnerClient(PlayerControllerSP var1, int var2, Class var3, EntityConstructor[] var4) {
|
||||
super(var2, var3, var4);
|
||||
this.playerController = var1;
|
||||
}
|
||||
|
@ -1,21 +1,23 @@
|
||||
package net.minecraft.src;
|
||||
|
||||
import net.peyton.eagler.minecraft.TileEntityConstructor;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class TileEntity {
|
||||
private static Map nameToClassMap = new HashMap();
|
||||
private static Map<String, TileEntityConstructor> nameToClassMap = new HashMap();
|
||||
private static Map classToNameMap = new HashMap();
|
||||
public World worldObj;
|
||||
public int xCoord;
|
||||
public int yCoord;
|
||||
public int zCoord;
|
||||
|
||||
private static void addMapping(Class var0, String var1) {
|
||||
private static void addMapping(Class var0, TileEntityConstructor var2, String var1) {
|
||||
if(classToNameMap.containsKey(var1)) {
|
||||
throw new IllegalArgumentException("Duplicate id: " + var1);
|
||||
} else {
|
||||
nameToClassMap.put(var1, var0);
|
||||
nameToClassMap.put(var1, var2);
|
||||
classToNameMap.put(var0, var1);
|
||||
}
|
||||
}
|
||||
@ -45,9 +47,9 @@ public class TileEntity {
|
||||
TileEntity var1 = null;
|
||||
|
||||
try {
|
||||
Class var2 = (Class)nameToClassMap.get(var0.getString("id"));
|
||||
TileEntityConstructor var2 = nameToClassMap.get(var0.getString("id"));
|
||||
if(var2 != null) {
|
||||
var1 = (TileEntity)var2.newInstance();
|
||||
var1 = (TileEntity)var2.createTileEntity();
|
||||
}
|
||||
} catch (Exception var3) {
|
||||
var3.printStackTrace();
|
||||
@ -82,9 +84,9 @@ public class TileEntity {
|
||||
}
|
||||
|
||||
static {
|
||||
addMapping(TileEntityFurnace.class, "Furnace");
|
||||
addMapping(TileEntityChest.class, "Chest");
|
||||
addMapping(TileEntitySign.class, "Sign");
|
||||
addMapping(TileEntityMobSpawner.class, "MobSpawner");
|
||||
addMapping(TileEntityFurnace.class, TileEntityFurnace::new, "Furnace");
|
||||
addMapping(TileEntityChest.class, TileEntityChest::new, "Chest");
|
||||
addMapping(TileEntitySign.class, TileEntitySign::new, "Sign");
|
||||
addMapping(TileEntityMobSpawner.class, TileEntityMobSpawner::new, "MobSpawner");
|
||||
}
|
||||
}
|
||||
|
@ -6,5 +6,4 @@ import net.minecraft.src.World;
|
||||
public interface EntityConstructor <T extends Entity> {
|
||||
|
||||
T createEntity(World world);
|
||||
|
||||
}
|
||||
|
220
src/wasm-gc-teavm/js/clientPlatformSingleplayer.js
Normal file
220
src/wasm-gc-teavm/js/clientPlatformSingleplayer.js
Normal file
@ -0,0 +1,220 @@
|
||||
/*
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
const clientPlatfSPName = "clientPlatformSingleplayer";
|
||||
|
||||
/** @type {HTMLElement} */
|
||||
var integratedServerCrashPanel = null;
|
||||
|
||||
var integratedServerCrashPanelShowing = false;
|
||||
|
||||
function initializeClientPlatfSP(spImports) {
|
||||
|
||||
/** @type {Worker|null} */
|
||||
var workerObj = null;
|
||||
|
||||
const clientMessageQueue = new EaglerLinkedQueue();
|
||||
|
||||
const workerBootstrapSource = "\"use strict\"; (function(ctx, globals) {" +
|
||||
"globals.__eaglerXOnMessage = function(o) {" +
|
||||
"globals.__eaglerXOnMessage = function(oo) { console.error(\"Dropped IPC packet that was sent too early!\"); };" +
|
||||
"const eagRuntimeJSURL = URL.createObjectURL(new Blob([ o.eagruntimeJS ], { type: \"text/javascript;charset=utf-8\" }));" +
|
||||
"ctx.getEaglercraftXOpts = function() { return o.eaglercraftXOpts; };" +
|
||||
"ctx.getEagRuntimeJSURL = function() { return eagRuntimeJSURL; };" +
|
||||
"ctx.getClassesWASMURL = function() { return o.classesWASM; };" +
|
||||
"ctx.getClassesDeobfWASMURL = function() { return o.classesDeobfWASM; };" +
|
||||
"ctx.getClassesTEADBGURL = function() { return o.classesTEADBG; };" +
|
||||
"ctx.getEPKFiles = function() { return null; };" +
|
||||
"ctx.getRootElement = function() { return null; };" +
|
||||
"ctx.getMainArgs = function() { return [\"_worker_process_\"]; };" +
|
||||
"ctx.getImageURL = function(idx) { return null; };" +
|
||||
"ctx.runMain = function(mainFunc) { mainFunc(); };" +
|
||||
"importScripts(eagRuntimeJSURL);" +
|
||||
"};" +
|
||||
"addEventListener(\"message\", function(evt) { globals.__eaglerXOnMessage(evt.data); });" +
|
||||
"})(self.__eaglercraftXLoaderContext = {}, self);";
|
||||
|
||||
/** @type {string|null} */
|
||||
var workerURL = null;
|
||||
|
||||
/**
|
||||
* @return {Promise<boolean>}
|
||||
*/
|
||||
async function startIntegratedServerImpl() {
|
||||
if(!workerURL) {
|
||||
workerURL = URL.createObjectURL(new Blob([ workerBootstrapSource ], { "type": "text/javascript;charset=utf8" }));
|
||||
}
|
||||
|
||||
try {
|
||||
workerObj = new Worker(workerURL);
|
||||
}catch(ex) {
|
||||
eagStackTrace(ERROR, "Failed to create worker", ex);
|
||||
return false;
|
||||
}
|
||||
|
||||
workerObj.addEventListener("error", /** @type {function(Event)} */ (function(/** ErrorEvent */ evt) {
|
||||
eagStackTrace(ERROR, "Worker Error", /** @type {Error} */ (evt.error));
|
||||
}));
|
||||
|
||||
workerObj.addEventListener("message", /** @type {function(Event)} */ (function(/** MessageEvent */ evt) {
|
||||
const channel = evt.data["ch"];
|
||||
|
||||
if(!channel) {
|
||||
eagError("Recieved IPC packet with null channel");
|
||||
return;
|
||||
}
|
||||
|
||||
if(channel === "~!LOGGER") {
|
||||
addLogMessageImpl(evt.data["txt"], evt.data["err"]);
|
||||
return;
|
||||
}
|
||||
|
||||
const buf = evt.data["dat"];
|
||||
|
||||
if(!buf) {
|
||||
eagError("Recieved IPC packet with null buffer");
|
||||
return;
|
||||
}
|
||||
|
||||
if(serverLANPeerPassIPCFunc(channel, buf)) {
|
||||
return;
|
||||
}
|
||||
|
||||
clientMessageQueue.push({
|
||||
"ch": channel,
|
||||
"data": new Uint8Array(buf),
|
||||
"_next": null
|
||||
});
|
||||
}));
|
||||
|
||||
const classesTEADBGCopy = new Int8Array(classesTEADBG.length);
|
||||
classesTEADBGCopy.set(classesTEADBG, 0);
|
||||
|
||||
var eagRuntimeJS;
|
||||
try {
|
||||
eagRuntimeJS = await fetch(/** @type {string} */ (eagRuntimeJSURL), { "cache": "force-cache" })
|
||||
.then((resp) => resp.arrayBuffer());
|
||||
}catch(ex) {
|
||||
eagStackTrace(ERROR, "Failed to fetch eagruntime.js contents", ex);
|
||||
try {
|
||||
workerObj.terminate();
|
||||
}catch(exx) {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
workerObj.postMessage({
|
||||
"eaglercraftXOpts": eaglercraftXOpts,
|
||||
"eagruntimeJS": eagRuntimeJS,
|
||||
"classesWASM": classesWASMModule,
|
||||
"classesDeobfWASM": classesDeobfWASMModule,
|
||||
"classesTEADBG": classesTEADBGCopy.buffer
|
||||
});
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
spImports["startIntegratedServer"] = new WebAssembly.Suspending(startIntegratedServerImpl);
|
||||
|
||||
/**
|
||||
* @param {string} channel
|
||||
* @param {Uint8Array} arr
|
||||
*/
|
||||
spImports["sendPacket"] = function(channel, arr) {
|
||||
if(workerObj) {
|
||||
const copiedArray = new Uint8Array(arr.length);
|
||||
copiedArray.set(arr, 0);
|
||||
workerObj.postMessage({
|
||||
"ch": channel,
|
||||
"dat": copiedArray.buffer
|
||||
}, [copiedArray.buffer]);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {string} channel
|
||||
* @param {!ArrayBuffer} arr
|
||||
*/
|
||||
sendIPCPacketFunc = function(channel, arr) {
|
||||
if(workerObj) {
|
||||
workerObj.postMessage({
|
||||
"ch": channel,
|
||||
"dat": arr
|
||||
}, [arr]);
|
||||
}
|
||||
};
|
||||
|
||||
spImports["getAvailablePackets"] = clientMessageQueue.getLength.bind(clientMessageQueue);
|
||||
|
||||
spImports["getNextPacket"] = clientMessageQueue.shift.bind(clientMessageQueue);
|
||||
|
||||
spImports["killWorker"] = function() {
|
||||
if(workerObj) {
|
||||
workerObj.terminate();
|
||||
workerObj = null;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {string} report
|
||||
* @param {number} x
|
||||
* @param {number} y
|
||||
* @param {number} w
|
||||
* @param {number} h
|
||||
*/
|
||||
spImports["showCrashReportOverlay"] = function(report, x, y, w, h) {
|
||||
if(!integratedServerCrashPanel) {
|
||||
integratedServerCrashPanel = /** @type {HTMLElement} */ (document.createElement("div"));
|
||||
integratedServerCrashPanel.setAttribute("style", "z-index:99;position:absolute;background-color:black;color:white;overflow-x:hidden;overflow-y:scroll;overflow-wrap:break-word;white-space:pre-wrap;font:18px sans-serif;padding:20px;display:none;");
|
||||
integratedServerCrashPanel.classList.add("_eaglercraftX_integratedserver_crash_element");
|
||||
parentElement.appendChild(integratedServerCrashPanel);
|
||||
}
|
||||
integratedServerCrashPanel.innerText = "";
|
||||
integratedServerCrashPanel.innerText = "CURRENT DATE: " + (new Date()).toLocaleString() + "\n\n" + report;
|
||||
const s = window.devicePixelRatio;
|
||||
integratedServerCrashPanel.style.top = "" + (y / s) + "px";
|
||||
integratedServerCrashPanel.style.left = "" + (x / s) + "px";
|
||||
integratedServerCrashPanel.style.width = "" + ((w / s) - 20) + "px";
|
||||
integratedServerCrashPanel.style.height = "" + ((h / s) - 20) + "px";
|
||||
integratedServerCrashPanel.style.display = "block";
|
||||
integratedServerCrashPanelShowing = true;
|
||||
};
|
||||
|
||||
spImports["hideCrashReportOverlay"] = function() {
|
||||
if(integratedServerCrashPanel) {
|
||||
integratedServerCrashPanel.style.display = "none";
|
||||
}
|
||||
integratedServerCrashPanelShowing = false;
|
||||
};
|
||||
|
||||
window.__curEaglerX188UnloadListenerCB = function() {
|
||||
if(workerObj) {
|
||||
workerObj.postMessage({
|
||||
"ch": "~!WASM_AUTOSAVE"
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function initializeNoClientPlatfSP(spImports) {
|
||||
setUnsupportedFunc(spImports, clientPlatfSPName, "startIntegratedServer");
|
||||
setUnsupportedFunc(spImports, clientPlatfSPName, "sendPacket");
|
||||
setUnsupportedFunc(spImports, clientPlatfSPName, "getAvailablePackets");
|
||||
setUnsupportedFunc(spImports, clientPlatfSPName, "getNextPacket");
|
||||
setUnsupportedFunc(spImports, clientPlatfSPName, "killWorker");
|
||||
setUnsupportedFunc(spImports, clientPlatfSPName, "showCrashReportOverlay");
|
||||
setUnsupportedFunc(spImports, clientPlatfSPName, "hideCrashReportOverlay");
|
||||
}
|
541
src/wasm-gc-teavm/js/fix-webm-duration.js
Normal file
541
src/wasm-gc-teavm/js/fix-webm-duration.js
Normal file
@ -0,0 +1,541 @@
|
||||
/*
|
||||
* The MIT license
|
||||
*
|
||||
* Copyright (c) 2018 Yury Sitnikov
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
const webmSections = {
|
||||
0xa45dfa3: { name: 'EBML', type: 'Container' },
|
||||
0x286: { name: 'EBMLVersion', type: 'Uint' },
|
||||
0x2f7: { name: 'EBMLReadVersion', type: 'Uint' },
|
||||
0x2f2: { name: 'EBMLMaxIDLength', type: 'Uint' },
|
||||
0x2f3: { name: 'EBMLMaxSizeLength', type: 'Uint' },
|
||||
0x282: { name: 'DocType', type: 'String' },
|
||||
0x287: { name: 'DocTypeVersion', type: 'Uint' },
|
||||
0x285: { name: 'DocTypeReadVersion', type: 'Uint' },
|
||||
0x6c: { name: 'Void', type: 'Binary' },
|
||||
0x3f: { name: 'CRC-32', type: 'Binary' },
|
||||
0xb538667: { name: 'SignatureSlot', type: 'Container' },
|
||||
0x3e8a: { name: 'SignatureAlgo', type: 'Uint' },
|
||||
0x3e9a: { name: 'SignatureHash', type: 'Uint' },
|
||||
0x3ea5: { name: 'SignaturePublicKey', type: 'Binary' },
|
||||
0x3eb5: { name: 'Signature', type: 'Binary' },
|
||||
0x3e5b: { name: 'SignatureElements', type: 'Container' },
|
||||
0x3e7b: { name: 'SignatureElementList', type: 'Container' },
|
||||
0x2532: { name: 'SignedElement', type: 'Binary' },
|
||||
0x8538067: { name: 'Segment', type: 'Container' },
|
||||
0x14d9b74: { name: 'SeekHead', type: 'Container' },
|
||||
0xdbb: { name: 'Seek', type: 'Container' },
|
||||
0x13ab: { name: 'SeekID', type: 'Binary' },
|
||||
0x13ac: { name: 'SeekPosition', type: 'Uint' },
|
||||
0x549a966: { name: 'Info', type: 'Container' },
|
||||
0x33a4: { name: 'SegmentUID', type: 'Binary' },
|
||||
0x3384: { name: 'SegmentFilename', type: 'String' },
|
||||
0x1cb923: { name: 'PrevUID', type: 'Binary' },
|
||||
0x1c83ab: { name: 'PrevFilename', type: 'String' },
|
||||
0x1eb923: { name: 'NextUID', type: 'Binary' },
|
||||
0x1e83bb: { name: 'NextFilename', type: 'String' },
|
||||
0x444: { name: 'SegmentFamily', type: 'Binary' },
|
||||
0x2924: { name: 'ChapterTranslate', type: 'Container' },
|
||||
0x29fc: { name: 'ChapterTranslateEditionUID', type: 'Uint' },
|
||||
0x29bf: { name: 'ChapterTranslateCodec', type: 'Uint' },
|
||||
0x29a5: { name: 'ChapterTranslateID', type: 'Binary' },
|
||||
0xad7b1: { name: 'TimecodeScale', type: 'Uint' },
|
||||
0x489: { name: 'Duration', type: 'Float' },
|
||||
0x461: { name: 'DateUTC', type: 'Date' },
|
||||
0x3ba9: { name: 'Title', type: 'String' },
|
||||
0xd80: { name: 'MuxingApp', type: 'String' },
|
||||
0x1741: { name: 'WritingApp', type: 'String' },
|
||||
// 0xf43b675: { name: 'Cluster', type: 'Container' },
|
||||
0x67: { name: 'Timecode', type: 'Uint' },
|
||||
0x1854: { name: 'SilentTracks', type: 'Container' },
|
||||
0x18d7: { name: 'SilentTrackNumber', type: 'Uint' },
|
||||
0x27: { name: 'Position', type: 'Uint' },
|
||||
0x2b: { name: 'PrevSize', type: 'Uint' },
|
||||
0x23: { name: 'SimpleBlock', type: 'Binary' },
|
||||
0x20: { name: 'BlockGroup', type: 'Container' },
|
||||
0x21: { name: 'Block', type: 'Binary' },
|
||||
0x22: { name: 'BlockVirtual', type: 'Binary' },
|
||||
0x35a1: { name: 'BlockAdditions', type: 'Container' },
|
||||
0x26: { name: 'BlockMore', type: 'Container' },
|
||||
0x6e: { name: 'BlockAddID', type: 'Uint' },
|
||||
0x25: { name: 'BlockAdditional', type: 'Binary' },
|
||||
0x1b: { name: 'BlockDuration', type: 'Uint' },
|
||||
0x7a: { name: 'ReferencePriority', type: 'Uint' },
|
||||
0x7b: { name: 'ReferenceBlock', type: 'Int' },
|
||||
0x7d: { name: 'ReferenceVirtual', type: 'Int' },
|
||||
0x24: { name: 'CodecState', type: 'Binary' },
|
||||
0x35a2: { name: 'DiscardPadding', type: 'Int' },
|
||||
0xe: { name: 'Slices', type: 'Container' },
|
||||
0x68: { name: 'TimeSlice', type: 'Container' },
|
||||
0x4c: { name: 'LaceNumber', type: 'Uint' },
|
||||
0x4d: { name: 'FrameNumber', type: 'Uint' },
|
||||
0x4b: { name: 'BlockAdditionID', type: 'Uint' },
|
||||
0x4e: { name: 'Delay', type: 'Uint' },
|
||||
0x4f: { name: 'SliceDuration', type: 'Uint' },
|
||||
0x48: { name: 'ReferenceFrame', type: 'Container' },
|
||||
0x49: { name: 'ReferenceOffset', type: 'Uint' },
|
||||
0x4a: { name: 'ReferenceTimeCode', type: 'Uint' },
|
||||
0x2f: { name: 'EncryptedBlock', type: 'Binary' },
|
||||
0x654ae6b: { name: 'Tracks', type: 'Container' },
|
||||
0x2e: { name: 'TrackEntry', type: 'Container' },
|
||||
0x57: { name: 'TrackNumber', type: 'Uint' },
|
||||
0x33c5: { name: 'TrackUID', type: 'Uint' },
|
||||
0x3: { name: 'TrackType', type: 'Uint' },
|
||||
0x39: { name: 'FlagEnabled', type: 'Uint' },
|
||||
0x8: { name: 'FlagDefault', type: 'Uint' },
|
||||
0x15aa: { name: 'FlagForced', type: 'Uint' },
|
||||
0x1c: { name: 'FlagLacing', type: 'Uint' },
|
||||
0x2de7: { name: 'MinCache', type: 'Uint' },
|
||||
0x2df8: { name: 'MaxCache', type: 'Uint' },
|
||||
0x3e383: { name: 'DefaultDuration', type: 'Uint' },
|
||||
0x34e7a: { name: 'DefaultDecodedFieldDuration', type: 'Uint' },
|
||||
0x3314f: { name: 'TrackTimecodeScale', type: 'Float' },
|
||||
0x137f: { name: 'TrackOffset', type: 'Int' },
|
||||
0x15ee: { name: 'MaxBlockAdditionID', type: 'Uint' },
|
||||
0x136e: { name: 'Name', type: 'String' },
|
||||
0x2b59c: { name: 'Language', type: 'String' },
|
||||
0x6: { name: 'CodecID', type: 'String' },
|
||||
0x23a2: { name: 'CodecPrivate', type: 'Binary' },
|
||||
0x58688: { name: 'CodecName', type: 'String' },
|
||||
0x3446: { name: 'AttachmentLink', type: 'Uint' },
|
||||
0x1a9697: { name: 'CodecSettings', type: 'String' },
|
||||
0x1b4040: { name: 'CodecInfoURL', type: 'String' },
|
||||
0x6b240: { name: 'CodecDownloadURL', type: 'String' },
|
||||
0x2a: { name: 'CodecDecodeAll', type: 'Uint' },
|
||||
0x2fab: { name: 'TrackOverlay', type: 'Uint' },
|
||||
0x16aa: { name: 'CodecDelay', type: 'Uint' },
|
||||
0x16bb: { name: 'SeekPreRoll', type: 'Uint' },
|
||||
0x2624: { name: 'TrackTranslate', type: 'Container' },
|
||||
0x26fc: { name: 'TrackTranslateEditionUID', type: 'Uint' },
|
||||
0x26bf: { name: 'TrackTranslateCodec', type: 'Uint' },
|
||||
0x26a5: { name: 'TrackTranslateTrackID', type: 'Binary' },
|
||||
0x60: { name: 'Video', type: 'Container' },
|
||||
0x1a: { name: 'FlagInterlaced', type: 'Uint' },
|
||||
0x13b8: { name: 'StereoMode', type: 'Uint' },
|
||||
0x13c0: { name: 'AlphaMode', type: 'Uint' },
|
||||
0x13b9: { name: 'OldStereoMode', type: 'Uint' },
|
||||
0x30: { name: 'PixelWidth', type: 'Uint' },
|
||||
0x3a: { name: 'PixelHeight', type: 'Uint' },
|
||||
0x14aa: { name: 'PixelCropBottom', type: 'Uint' },
|
||||
0x14bb: { name: 'PixelCropTop', type: 'Uint' },
|
||||
0x14cc: { name: 'PixelCropLeft', type: 'Uint' },
|
||||
0x14dd: { name: 'PixelCropRight', type: 'Uint' },
|
||||
0x14b0: { name: 'DisplayWidth', type: 'Uint' },
|
||||
0x14ba: { name: 'DisplayHeight', type: 'Uint' },
|
||||
0x14b2: { name: 'DisplayUnit', type: 'Uint' },
|
||||
0x14b3: { name: 'AspectRatioType', type: 'Uint' },
|
||||
0xeb524: { name: 'ColourSpace', type: 'Binary' },
|
||||
0xfb523: { name: 'GammaValue', type: 'Float' },
|
||||
0x383e3: { name: 'FrameRate', type: 'Float' },
|
||||
0x61: { name: 'Audio', type: 'Container' },
|
||||
0x35: { name: 'SamplingFrequency', type: 'Float' },
|
||||
0x38b5: { name: 'OutputSamplingFrequency', type: 'Float' },
|
||||
0x1f: { name: 'Channels', type: 'Uint' },
|
||||
0x3d7b: { name: 'ChannelPositions', type: 'Binary' },
|
||||
0x2264: { name: 'BitDepth', type: 'Uint' },
|
||||
0x62: { name: 'TrackOperation', type: 'Container' },
|
||||
0x63: { name: 'TrackCombinePlanes', type: 'Container' },
|
||||
0x64: { name: 'TrackPlane', type: 'Container' },
|
||||
0x65: { name: 'TrackPlaneUID', type: 'Uint' },
|
||||
0x66: { name: 'TrackPlaneType', type: 'Uint' },
|
||||
0x69: { name: 'TrackJoinBlocks', type: 'Container' },
|
||||
0x6d: { name: 'TrackJoinUID', type: 'Uint' },
|
||||
0x40: { name: 'TrickTrackUID', type: 'Uint' },
|
||||
0x41: { name: 'TrickTrackSegmentUID', type: 'Binary' },
|
||||
0x46: { name: 'TrickTrackFlag', type: 'Uint' },
|
||||
0x47: { name: 'TrickMasterTrackUID', type: 'Uint' },
|
||||
0x44: { name: 'TrickMasterTrackSegmentUID', type: 'Binary' },
|
||||
0x2d80: { name: 'ContentEncodings', type: 'Container' },
|
||||
0x2240: { name: 'ContentEncoding', type: 'Container' },
|
||||
0x1031: { name: 'ContentEncodingOrder', type: 'Uint' },
|
||||
0x1032: { name: 'ContentEncodingScope', type: 'Uint' },
|
||||
0x1033: { name: 'ContentEncodingType', type: 'Uint' },
|
||||
0x1034: { name: 'ContentCompression', type: 'Container' },
|
||||
0x254: { name: 'ContentCompAlgo', type: 'Uint' },
|
||||
0x255: { name: 'ContentCompSettings', type: 'Binary' },
|
||||
0x1035: { name: 'ContentEncryption', type: 'Container' },
|
||||
0x7e1: { name: 'ContentEncAlgo', type: 'Uint' },
|
||||
0x7e2: { name: 'ContentEncKeyID', type: 'Binary' },
|
||||
0x7e3: { name: 'ContentSignature', type: 'Binary' },
|
||||
0x7e4: { name: 'ContentSigKeyID', type: 'Binary' },
|
||||
0x7e5: { name: 'ContentSigAlgo', type: 'Uint' },
|
||||
0x7e6: { name: 'ContentSigHashAlgo', type: 'Uint' },
|
||||
0xc53bb6b: { name: 'Cues', type: 'Container' },
|
||||
0x3b: { name: 'CuePoint', type: 'Container' },
|
||||
0x33: { name: 'CueTime', type: 'Uint' },
|
||||
0x37: { name: 'CueTrackPositions', type: 'Container' },
|
||||
0x77: { name: 'CueTrack', type: 'Uint' },
|
||||
0x71: { name: 'CueClusterPosition', type: 'Uint' },
|
||||
0x70: { name: 'CueRelativePosition', type: 'Uint' },
|
||||
0x32: { name: 'CueDuration', type: 'Uint' },
|
||||
0x1378: { name: 'CueBlockNumber', type: 'Uint' },
|
||||
0x6a: { name: 'CueCodecState', type: 'Uint' },
|
||||
0x5b: { name: 'CueReference', type: 'Container' },
|
||||
0x16: { name: 'CueRefTime', type: 'Uint' },
|
||||
0x17: { name: 'CueRefCluster', type: 'Uint' },
|
||||
0x135f: { name: 'CueRefNumber', type: 'Uint' },
|
||||
0x6b: { name: 'CueRefCodecState', type: 'Uint' },
|
||||
0x941a469: { name: 'Attachments', type: 'Container' },
|
||||
0x21a7: { name: 'AttachedFile', type: 'Container' },
|
||||
0x67e: { name: 'FileDescription', type: 'String' },
|
||||
0x66e: { name: 'FileName', type: 'String' },
|
||||
0x660: { name: 'FileMimeType', type: 'String' },
|
||||
0x65c: { name: 'FileData', type: 'Binary' },
|
||||
0x6ae: { name: 'FileUID', type: 'Uint' },
|
||||
0x675: { name: 'FileReferral', type: 'Binary' },
|
||||
0x661: { name: 'FileUsedStartTime', type: 'Uint' },
|
||||
0x662: { name: 'FileUsedEndTime', type: 'Uint' },
|
||||
0x43a770: { name: 'Chapters', type: 'Container' },
|
||||
0x5b9: { name: 'EditionEntry', type: 'Container' },
|
||||
0x5bc: { name: 'EditionUID', type: 'Uint' },
|
||||
0x5bd: { name: 'EditionFlagHidden', type: 'Uint' },
|
||||
0x5db: { name: 'EditionFlagDefault', type: 'Uint' },
|
||||
0x5dd: { name: 'EditionFlagOrdered', type: 'Uint' },
|
||||
0x36: { name: 'ChapterAtom', type: 'Container' },
|
||||
0x33c4: { name: 'ChapterUID', type: 'Uint' },
|
||||
0x1654: { name: 'ChapterStringUID', type: 'String' },
|
||||
0x11: { name: 'ChapterTimeStart', type: 'Uint' },
|
||||
0x12: { name: 'ChapterTimeEnd', type: 'Uint' },
|
||||
0x18: { name: 'ChapterFlagHidden', type: 'Uint' },
|
||||
0x598: { name: 'ChapterFlagEnabled', type: 'Uint' },
|
||||
0x2e67: { name: 'ChapterSegmentUID', type: 'Binary' },
|
||||
0x2ebc: { name: 'ChapterSegmentEditionUID', type: 'Uint' },
|
||||
0x23c3: { name: 'ChapterPhysicalEquiv', type: 'Uint' },
|
||||
0xf: { name: 'ChapterTrack', type: 'Container' },
|
||||
0x9: { name: 'ChapterTrackNumber', type: 'Uint' },
|
||||
0x0: { name: 'ChapterDisplay', type: 'Container' },
|
||||
0x5: { name: 'ChapString', type: 'String' },
|
||||
0x37c: { name: 'ChapLanguage', type: 'String' },
|
||||
0x37e: { name: 'ChapCountry', type: 'String' },
|
||||
0x2944: { name: 'ChapProcess', type: 'Container' },
|
||||
0x2955: { name: 'ChapProcessCodecID', type: 'Uint' },
|
||||
0x50d: { name: 'ChapProcessPrivate', type: 'Binary' },
|
||||
0x2911: { name: 'ChapProcessCommand', type: 'Container' },
|
||||
0x2922: { name: 'ChapProcessTime', type: 'Uint' },
|
||||
0x2933: { name: 'ChapProcessData', type: 'Binary' },
|
||||
0x254c367: { name: 'Tags', type: 'Container' },
|
||||
0x3373: { name: 'Tag', type: 'Container' },
|
||||
0x23c0: { name: 'Targets', type: 'Container' },
|
||||
0x28ca: { name: 'TargetTypeValue', type: 'Uint' },
|
||||
0x23ca: { name: 'TargetType', type: 'String' },
|
||||
0x23c5: { name: 'TagTrackUID', type: 'Uint' },
|
||||
0x23c9: { name: 'TagEditionUID', type: 'Uint' },
|
||||
0x23c4: { name: 'TagChapterUID', type: 'Uint' },
|
||||
0x23c6: { name: 'TagAttachmentUID', type: 'Uint' },
|
||||
0x27c8: { name: 'SimpleTag', type: 'Container' },
|
||||
0x5a3: { name: 'TagName', type: 'String' },
|
||||
0x47a: { name: 'TagLanguage', type: 'String' },
|
||||
0x484: { name: 'TagDefault', type: 'Uint' },
|
||||
0x487: { name: 'TagString', type: 'String' },
|
||||
0x485: { name: 'TagBinary', type: 'Binary' }
|
||||
};
|
||||
|
||||
function doInherit(newClass, baseClass) {
|
||||
newClass.prototype = Object.create(baseClass.prototype);
|
||||
newClass.prototype.constructor = newClass;
|
||||
}
|
||||
/**
|
||||
* @param {string} name
|
||||
* @param {string} type
|
||||
* @constructor
|
||||
*/
|
||||
function WebmBase(name, type) {
|
||||
this.name = name || 'Unknown';
|
||||
this.type = type || 'Unknown';
|
||||
}
|
||||
WebmBase.prototype.updateBySource = function() { };
|
||||
WebmBase.prototype.setSource = function(source) {
|
||||
this.source = source;
|
||||
this.updateBySource();
|
||||
};
|
||||
WebmBase.prototype.updateByData = function() { };
|
||||
WebmBase.prototype.setData = function(data) {
|
||||
this.data = data;
|
||||
this.updateByData();
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {string} name
|
||||
* @param {string} type
|
||||
* @extends {WebmBase}
|
||||
* @constructor
|
||||
*/
|
||||
function WebmUint(name, type) {
|
||||
WebmBase.call(this, name, type || 'Uint');
|
||||
}
|
||||
doInherit(WebmUint, WebmBase);
|
||||
function padHex(hex) {
|
||||
return hex.length % 2 === 1 ? '0' + hex : hex;
|
||||
}
|
||||
WebmUint.prototype.updateBySource = function() {
|
||||
// use hex representation of a number instead of number value
|
||||
this.data = '';
|
||||
for (var i = 0; i < this.source.length; i++) {
|
||||
var hex = this.source[i].toString(16);
|
||||
this.data += padHex(hex);
|
||||
}
|
||||
};
|
||||
WebmUint.prototype.updateByData = function() {
|
||||
var length = this.data.length / 2;
|
||||
this.source = new Uint8Array(length);
|
||||
for (var i = 0; i < length; i++) {
|
||||
var hex = this.data.substr(i * 2, 2);
|
||||
this.source[i] = parseInt(hex, 16);
|
||||
}
|
||||
};
|
||||
WebmUint.prototype.getValue = function() {
|
||||
return parseInt(this.data, 16);
|
||||
};
|
||||
WebmUint.prototype.setValue = function(value) {
|
||||
this.setData(padHex(value.toString(16)));
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {string} name
|
||||
* @param {string} type
|
||||
* @extends {WebmBase}
|
||||
* @constructor
|
||||
*/
|
||||
function WebmFloat(name, type) {
|
||||
WebmBase.call(this, name, type || 'Float');
|
||||
}
|
||||
doInherit(WebmFloat, WebmBase);
|
||||
WebmFloat.prototype.getFloatArrayType = function() {
|
||||
return this.source && this.source.length === 4 ? Float32Array : Float64Array;
|
||||
};
|
||||
WebmFloat.prototype.updateBySource = function() {
|
||||
var byteArray = this.source.reverse();
|
||||
var floatArrayType = this.getFloatArrayType();
|
||||
var floatArray = new floatArrayType(byteArray.buffer);
|
||||
this.data = floatArray[0];
|
||||
};
|
||||
WebmFloat.prototype.updateByData = function() {
|
||||
var floatArrayType = this.getFloatArrayType();
|
||||
var floatArray = new floatArrayType([ this.data ]);
|
||||
var byteArray = new Uint8Array(floatArray.buffer);
|
||||
this.source = byteArray.reverse();
|
||||
};
|
||||
WebmFloat.prototype.getValue = function() {
|
||||
return this.data;
|
||||
};
|
||||
WebmFloat.prototype.setValue = function(value) {
|
||||
this.setData(value);
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {string} name
|
||||
* @param {string} type
|
||||
* @extends {WebmBase}
|
||||
* @constructor
|
||||
*/
|
||||
function WebmContainer(name, type) {
|
||||
WebmBase.call(this, name, type || 'Container');
|
||||
}
|
||||
doInherit(WebmContainer, WebmBase);
|
||||
WebmContainer.prototype.readByte = function() {
|
||||
return this.source[this.offset++];
|
||||
};
|
||||
WebmContainer.prototype.readUint = function() {
|
||||
var firstByte = this.readByte();
|
||||
var bytes = 8 - firstByte.toString(2).length;
|
||||
var value = firstByte - (1 << (7 - bytes));
|
||||
for (var i = 0; i < bytes; i++) {
|
||||
// don't use bit operators to support x86
|
||||
value *= 256;
|
||||
value += this.readByte();
|
||||
}
|
||||
return value;
|
||||
};
|
||||
WebmContainer.prototype.updateBySource = function() {
|
||||
this.data = [];
|
||||
var end;
|
||||
for (this.offset = 0; this.offset < this.source.length; this.offset = end) {
|
||||
var id = this.readUint();
|
||||
var len = this.readUint();
|
||||
end = Math.min(this.offset + len, this.source.length);
|
||||
var data = this.source.slice(this.offset, end);
|
||||
|
||||
var info = webmSections[id] || { name: 'Unknown', type: 'Unknown' };
|
||||
var ctr = WebmBase;
|
||||
switch (info.type) {
|
||||
case 'Container':
|
||||
ctr = WebmContainer;
|
||||
break;
|
||||
case 'Uint':
|
||||
ctr = WebmUint;
|
||||
break;
|
||||
case 'Float':
|
||||
ctr = WebmFloat;
|
||||
break;
|
||||
}
|
||||
var section = new ctr(info.name, info.type);
|
||||
section.setSource(data);
|
||||
this.data.push({
|
||||
id: id,
|
||||
idHex: id.toString(16),
|
||||
data: section
|
||||
});
|
||||
}
|
||||
};
|
||||
WebmContainer.prototype.writeUint = function(x, draft) {
|
||||
for (var bytes = 1, flag = 0x80; x >= flag && bytes < 8; bytes++, flag *= 0x80) { }
|
||||
|
||||
if (!draft) {
|
||||
var value = flag + x;
|
||||
for (var i = bytes - 1; i >= 0; i--) {
|
||||
// don't use bit operators to support x86
|
||||
var c = value % 256;
|
||||
this.source[this.offset + i] = c;
|
||||
value = (value - c) / 256;
|
||||
}
|
||||
}
|
||||
|
||||
this.offset += bytes;
|
||||
};
|
||||
WebmContainer.prototype.writeSections = function(draft) {
|
||||
this.offset = 0;
|
||||
for (var i = 0; i < this.data.length; i++) {
|
||||
var section = this.data[i],
|
||||
content = section.data.source,
|
||||
contentLength = content.length;
|
||||
this.writeUint(section.id, draft);
|
||||
this.writeUint(contentLength, draft);
|
||||
if (!draft) {
|
||||
this.source.set(content, this.offset);
|
||||
}
|
||||
this.offset += contentLength;
|
||||
}
|
||||
return this.offset;
|
||||
};
|
||||
WebmContainer.prototype.updateByData = function() {
|
||||
// run without accessing this.source to determine total length - need to know it to create Uint8Array
|
||||
var length = this.writeSections('draft');
|
||||
this.source = new Uint8Array(length);
|
||||
// now really write data
|
||||
this.writeSections(null);
|
||||
};
|
||||
WebmContainer.prototype.getSectionById = function(id) {
|
||||
for (var i = 0; i < this.data.length; i++) {
|
||||
var section = this.data[i];
|
||||
if (section.id === id) {
|
||||
return section.data;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {Uint8Array} source
|
||||
* @extends {WebmContainer}
|
||||
* @constructor
|
||||
*/
|
||||
function WebmFile(source) {
|
||||
WebmContainer.call(this, 'File', 'File');
|
||||
this.setSource(source);
|
||||
}
|
||||
doInherit(WebmFile, WebmContainer);
|
||||
WebmFile.prototype.fixDuration = function(duration, options) {
|
||||
var logger = options && options.logger;
|
||||
if (logger === undefined) {
|
||||
logger = function(message) {
|
||||
console.log(message);
|
||||
};
|
||||
} else if (!logger) {
|
||||
logger = function() { };
|
||||
}
|
||||
|
||||
var segmentSection = this.getSectionById(0x8538067);
|
||||
if (!segmentSection) {
|
||||
logger('[fix-webm-duration] Segment section is missing');
|
||||
return false;
|
||||
}
|
||||
|
||||
var infoSection = segmentSection.getSectionById(0x549a966);
|
||||
if (!infoSection) {
|
||||
logger('[fix-webm-duration] Info section is missing');
|
||||
return false;
|
||||
}
|
||||
|
||||
var timeScaleSection = infoSection.getSectionById(0xad7b1);
|
||||
if (!timeScaleSection) {
|
||||
logger('[fix-webm-duration] TimecodeScale section is missing');
|
||||
return false;
|
||||
}
|
||||
|
||||
var durationSection = infoSection.getSectionById(0x489);
|
||||
if (durationSection) {
|
||||
if (durationSection.getValue() <= 0) {
|
||||
logger('[fix-webm-duration] Duration section is present, but the value is empty');
|
||||
durationSection.setValue(duration);
|
||||
} else {
|
||||
logger('[fix-webm-duration] Duration section is present');
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
logger('[fix-webm-duration] Duration section is missing');
|
||||
// append Duration section
|
||||
durationSection = new WebmFloat('Duration', 'Float');
|
||||
durationSection.setValue(duration);
|
||||
infoSection.data.push({
|
||||
id: 0x489,
|
||||
data: durationSection
|
||||
});
|
||||
}
|
||||
|
||||
// set default time scale to 1 millisecond (1000000 nanoseconds)
|
||||
timeScaleSection.setValue(1000000);
|
||||
infoSection.updateByData();
|
||||
segmentSection.updateByData();
|
||||
this.updateByData();
|
||||
|
||||
return true;
|
||||
};
|
||||
WebmFile.prototype.toBlob = function(mimeType) {
|
||||
return new Blob([ this.source.buffer ], { type: mimeType || 'video/webm' });
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {!Blob} blob
|
||||
* @param {number} duration
|
||||
* @param {function(!Blob)} callback
|
||||
* @param {Object} options
|
||||
*/
|
||||
function fixWebMDuration(blob, duration, callback, options) {
|
||||
try {
|
||||
var reader = new FileReader();
|
||||
reader.onloadend = function() {
|
||||
try {
|
||||
var file = new WebmFile(new Uint8Array(/** @type {ArrayBuffer} */ (reader.result)));
|
||||
if (file.fixDuration(duration, options)) {
|
||||
blob = file.toBlob(blob.type);
|
||||
}
|
||||
} catch (ex) {
|
||||
// ignore
|
||||
}
|
||||
callback(blob);
|
||||
};
|
||||
reader.readAsArrayBuffer(blob);
|
||||
} catch (ex) {
|
||||
callback(blob);
|
||||
}
|
||||
}
|
197
src/wasm-gc-teavm/js/platformVoiceClient.js
Normal file
197
src/wasm-gc-teavm/js/platformVoiceClient.js
Normal file
@ -0,0 +1,197 @@
|
||||
/*
|
||||
* Copyright (c) 2024 lax1dude, ayunami2000. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
const EVENT_VOICE_ICE = 0;
|
||||
const EVENT_VOICE_DESC = 1;
|
||||
const EVENT_VOICE_OPEN = 2;
|
||||
const EVENT_VOICE_CLOSE = 3;
|
||||
|
||||
const platfVoiceClientName = "platformVoiceClient";
|
||||
|
||||
function initializePlatfVoiceClient(voiceClientImports) {
|
||||
|
||||
/**
|
||||
* @return {boolean}
|
||||
*/
|
||||
voiceClientImports["isSupported"] = function() {
|
||||
return typeof navigator.mediaDevices !== "undefined" && typeof navigator.mediaDevices.getUserMedia !== "undefined" && "srcObject" in HTMLAudioElement.prototype;
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {string} desc
|
||||
* @suppress {globalThis}
|
||||
*/
|
||||
function setRemoteDescriptionImpl(desc) {
|
||||
try {
|
||||
const remoteDesc = JSON.parse(desc);
|
||||
this["_peerConnection"].setRemoteDescription(remoteDesc).then(() => {
|
||||
if (remoteDesc.hasOwnProperty("type") && "offer" === remoteDesc["type"]) {
|
||||
this["_peerConnection"].createAnswer().then((desc) => {
|
||||
this["_peerConnection"].setLocalDescription(desc).then(() => {
|
||||
pushEvent(EVENT_TYPE_VOICE, EVENT_VOICE_DESC, {
|
||||
"objId": this["objId"],
|
||||
"data": JSON.stringify(desc)
|
||||
});
|
||||
}).catch((err) => {
|
||||
eagError("Failed to set local description for \"{}\"! {}", this["objId"], err.message);
|
||||
pushEvent(EVENT_TYPE_VOICE, EVENT_VOICE_CLOSE, {
|
||||
"objId": this["objId"]
|
||||
});
|
||||
});
|
||||
}).catch((err) => {
|
||||
eagError("Failed to create answer for \"{}\"! {}", this["objId"], err.message);
|
||||
pushEvent(EVENT_TYPE_VOICE, EVENT_VOICE_CLOSE, {
|
||||
"objId": this["objId"]
|
||||
});
|
||||
});
|
||||
}
|
||||
}).catch((err) => {
|
||||
eagError("Failed to set remote description for \"{}\"! {}", this["objId"], err.message);
|
||||
pushEvent(EVENT_TYPE_VOICE, EVENT_VOICE_CLOSE, {
|
||||
"objId": this["objId"]
|
||||
});
|
||||
});
|
||||
} catch (e) {
|
||||
eagError(e.message);
|
||||
pushEvent(EVENT_TYPE_VOICE, EVENT_VOICE_CLOSE, {
|
||||
"objId": this["objId"]
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} ice
|
||||
* @suppress {globalThis}
|
||||
*/
|
||||
function addRemoteICECandidateImpl(ice) {
|
||||
try {
|
||||
this["_peerConnection"].addIceCandidate(new RTCIceCandidate(/** @type {!RTCIceCandidateInit} */ (JSON.parse(ice)))).catch((err) => {
|
||||
eagError("Failed to parse ice candidate for \"{}\"! {}", this["objId"], err.message);
|
||||
pushEvent(EVENT_TYPE_VOICE, EVENT_VOICE_CLOSE, {
|
||||
"objId": this["objId"]
|
||||
});
|
||||
});
|
||||
} catch (e) {
|
||||
eagError(e.message);
|
||||
pushEvent(EVENT_TYPE_VOICE, EVENT_VOICE_CLOSE, {
|
||||
"objId": this["objId"]
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @suppress {globalThis}
|
||||
*/
|
||||
function closeImpl() {
|
||||
this["_peerConnection"].close();
|
||||
}
|
||||
|
||||
let idCounter = 0;
|
||||
|
||||
/**
|
||||
* @param {string} iceServers
|
||||
* @param {number} offer
|
||||
* @param {!MediaStream} localStream
|
||||
* @return {Object}
|
||||
*/
|
||||
voiceClientImports["createRTCPeerConnection"] = function(iceServers, offer, localStream) {
|
||||
try {
|
||||
const peerId = idCounter++;
|
||||
var ret;
|
||||
const peerConnection = new RTCPeerConnection(/** @type {!RTCConfiguration} */ ({
|
||||
"iceServers": JSON.parse(iceServers),
|
||||
"optional": [
|
||||
{
|
||||
"DtlsSrtpKeyAgreement": true
|
||||
}
|
||||
]
|
||||
}));
|
||||
|
||||
peerConnection.addEventListener("icecandidate", /** @type {function(Event)} */ ((/** RTCPeerConnectionIceEvent */ evt) => {
|
||||
if (evt.candidate) {
|
||||
pushEvent(EVENT_TYPE_VOICE, EVENT_VOICE_ICE, {
|
||||
"objId": peerId,
|
||||
"data": JSON.stringify({
|
||||
"sdpMLineIndex": "" + evt.candidate.sdpMLineIndex,
|
||||
"candidate": evt.candidate.candidate
|
||||
})
|
||||
});
|
||||
}
|
||||
}));
|
||||
peerConnection.addEventListener("track", /** @type {function(Event)} */ ((/** RTCTrackEvent */ evt) => {
|
||||
const rawStream = evt.streams[0];
|
||||
ret["_aud"] = document.createElement("audio");
|
||||
ret["_aud"]["autoplay"] = true;
|
||||
ret["_aud"]["muted"] = true;
|
||||
ret["_aud"]["srcObject"] = rawStream;
|
||||
pushEvent(EVENT_TYPE_VOICE, EVENT_VOICE_OPEN, {
|
||||
"objId": peerId,
|
||||
"stream": rawStream
|
||||
});
|
||||
}));
|
||||
|
||||
localStream.getTracks().forEach(function(track) {
|
||||
peerConnection.addTrack(track, localStream);
|
||||
});
|
||||
if (offer) {
|
||||
peerConnection.createOffer().then((desc) => {
|
||||
peerConnection.setLocalDescription(desc).then(() => {
|
||||
pushEvent(EVENT_TYPE_VOICE, EVENT_VOICE_DESC, {
|
||||
"objId": peerId,
|
||||
"data": JSON.stringify(desc)
|
||||
});
|
||||
}).catch((err) => {
|
||||
eagError("Failed to set local description for \"{}\"! {}", peerId, err.message);
|
||||
pushEvent(EVENT_TYPE_VOICE, EVENT_VOICE_CLOSE, {
|
||||
"objId": peerId
|
||||
});
|
||||
});
|
||||
}).catch((err) => {
|
||||
eagError("Failed to set create offer for \"{}\"! {}", peerId, err.message);
|
||||
pushEvent(EVENT_TYPE_VOICE, EVENT_VOICE_CLOSE, {
|
||||
"objId": peerId
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
peerConnection.addEventListener("connectionstatechange", () => {
|
||||
const cs = peerConnection.connectionState;
|
||||
if ("disconnected" === cs || "failed" === cs) {
|
||||
pushEvent(EVENT_TYPE_VOICE, EVENT_VOICE_CLOSE, {
|
||||
"objId": peerId
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
return ret = {
|
||||
"objId": peerId,
|
||||
"_peerConnection": peerConnection,
|
||||
"setRemoteDescription": setRemoteDescriptionImpl,
|
||||
"addRemoteICECandidate": addRemoteICECandidateImpl,
|
||||
"closeHandle": closeImpl
|
||||
};
|
||||
} catch (e) {
|
||||
eagError(e.message);
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
function initializeNoPlatfVoiceClient(voiceClientImports) {
|
||||
setUnsupportedFunc(voiceClientImports, platfVoiceClientName, "isSupported");
|
||||
setUnsupportedFunc(voiceClientImports, platfVoiceClientName, "createRTCPeerConnection");
|
||||
}
|
651
src/wasm-gc-teavm/js/platformWebRTC.js
Normal file
651
src/wasm-gc-teavm/js/platformWebRTC.js
Normal file
@ -0,0 +1,651 @@
|
||||
/*
|
||||
* Copyright (c) 2024 lax1dude, ayunami2000. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
const READYSTATE_INIT_FAILED = -2;
|
||||
const READYSTATE_FAILED = -1;
|
||||
const READYSTATE_DISCONNECTED = 0;
|
||||
const READYSTATE_CONNECTING = 1;
|
||||
const READYSTATE_CONNECTED = 2;
|
||||
|
||||
const EVENT_WEBRTC_ICE = 0;
|
||||
const EVENT_WEBRTC_DESC = 1;
|
||||
const EVENT_WEBRTC_OPEN = 2;
|
||||
const EVENT_WEBRTC_PACKET = 3;
|
||||
const EVENT_WEBRTC_CLOSE = 4;
|
||||
|
||||
const platfWebRTCName = "platformWebRTC";
|
||||
|
||||
/**
|
||||
* @typedef {{
|
||||
* peerId:string,
|
||||
* peerConnection:!RTCPeerConnection,
|
||||
* dataChannel:RTCDataChannel,
|
||||
* ipcChannel:(string|null),
|
||||
* pushEvent:function(number,*),
|
||||
* disconnect:function()
|
||||
* }}
|
||||
*/
|
||||
let LANPeerInternal;
|
||||
|
||||
function initializePlatfWebRTC(webrtcImports) {
|
||||
|
||||
const clientLANPacketBuffer = new EaglerLinkedQueue();
|
||||
|
||||
let lanClient;
|
||||
lanClient = {
|
||||
iceServers: [],
|
||||
/** @type {RTCPeerConnection|null} */
|
||||
peerConnection: null,
|
||||
/** @type {RTCDataChannel|null} */
|
||||
dataChannel: null,
|
||||
readyState: READYSTATE_CONNECTING,
|
||||
/** @type {string|null} */
|
||||
iceCandidate: null,
|
||||
/** @type {string|null} */
|
||||
description: null,
|
||||
dataChannelOpen: false,
|
||||
dataChannelClosed: true,
|
||||
disconnect: function(quiet) {
|
||||
if (lanClient.dataChannel) {
|
||||
try {
|
||||
lanClient.dataChannel.close();
|
||||
} catch (t) {
|
||||
}
|
||||
lanClient.dataChannel = null;
|
||||
}
|
||||
if (lanClient.peerConnection) {
|
||||
try {
|
||||
lanClient.peerConnection.close();
|
||||
} catch (t) {
|
||||
}
|
||||
lanClient.peerConnection = null;
|
||||
}
|
||||
if (!quiet) lanClient.dataChannelClosed = true;
|
||||
lanClient.readyState = READYSTATE_DISCONNECTED;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @return {boolean}
|
||||
*/
|
||||
webrtcImports["supported"] = function() {
|
||||
return typeof RTCPeerConnection !== "undefined";
|
||||
};
|
||||
|
||||
/**
|
||||
* @return {number}
|
||||
*/
|
||||
webrtcImports["clientLANReadyState"] = function() {
|
||||
return lanClient.readyState;
|
||||
};
|
||||
|
||||
webrtcImports["clientLANCloseConnection"] = function() {
|
||||
lanClient.disconnect(false);
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {!Uint8Array} pkt
|
||||
*/
|
||||
webrtcImports["clientLANSendPacket"] = function(pkt) {
|
||||
if (lanClient.dataChannel !== null && "open" === lanClient.dataChannel.readyState) {
|
||||
try {
|
||||
lanClient.dataChannel.send(pkt);
|
||||
} catch (e) {
|
||||
lanClient.disconnect(false);
|
||||
}
|
||||
}else {
|
||||
lanClient.disconnect(false);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @return {Uint8Array}
|
||||
*/
|
||||
webrtcImports["clientLANReadPacket"] = function() {
|
||||
const ret = clientLANPacketBuffer.shift();
|
||||
return ret ? new Uint8Array(ret["data"]) : null;
|
||||
};
|
||||
|
||||
/**
|
||||
* @return {number}
|
||||
*/
|
||||
webrtcImports["clientLANAvailable"] = function() {
|
||||
return clientLANPacketBuffer.getLength();
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {!Array<string>} servers
|
||||
*/
|
||||
webrtcImports["clientLANSetICEServersAndConnect"] = function(servers) {
|
||||
lanClient.iceServers.length = 0;
|
||||
for (let url of servers) {
|
||||
let etr = url.split(";");
|
||||
if(etr.length === 1) {
|
||||
lanClient.iceServers.push({
|
||||
urls: etr[0]
|
||||
});
|
||||
}else if(etr.length === 3) {
|
||||
lanClient.iceServers.push({
|
||||
urls: etr[0],
|
||||
username: etr[1],
|
||||
credential: etr[2]
|
||||
});
|
||||
}
|
||||
}
|
||||
if(lanClient.readyState === READYSTATE_CONNECTED || lanClient.readyState === READYSTATE_CONNECTING) {
|
||||
lanClient.disconnect(true);
|
||||
}
|
||||
try {
|
||||
if (lanClient.dataChannel) {
|
||||
try {
|
||||
lanClient.dataChannel.close();
|
||||
} catch (t) {
|
||||
}
|
||||
lanClient.dataChannel = null;
|
||||
}
|
||||
if (lanClient.peerConnection) {
|
||||
try {
|
||||
lanClient.peerConnection.close();
|
||||
} catch (t) {
|
||||
}
|
||||
}
|
||||
lanClient.peerConnection = new RTCPeerConnection({
|
||||
iceServers: lanClient.iceServers,
|
||||
optional: [
|
||||
{
|
||||
DtlsSrtpKeyAgreement: true
|
||||
}
|
||||
]
|
||||
});
|
||||
lanClient.readyState = READYSTATE_CONNECTING;
|
||||
} catch (/** Error */ t) {
|
||||
eagStackTrace(ERROR, "Could not create LAN client RTCPeerConnection!", t);
|
||||
lanClient.readyState = READYSTATE_INIT_FAILED;
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const iceCandidates = [];
|
||||
|
||||
lanClient.peerConnection.addEventListener("icecandidate", /** @type {function(Event)} */ ((/** !RTCPeerConnectionIceEvent */ evt) => {
|
||||
if(evt.candidate) {
|
||||
if(iceCandidates.length === 0) {
|
||||
const candidateState = [0, 0];
|
||||
const runnable = () => {
|
||||
if(lanClient.peerConnection !== null && lanClient.peerConnection.connectionState !== "disconnected") {
|
||||
const trial = ++candidateState[1];
|
||||
if(candidateState[0] !== iceCandidates.length && trial < 3) {
|
||||
candidateState[0] = iceCandidates.length;
|
||||
setTimeout(runnable, 2000);
|
||||
return;
|
||||
}
|
||||
lanClient.iceCandidate = JSON.stringify(iceCandidates);
|
||||
iceCandidates.length = 0;
|
||||
}
|
||||
};
|
||||
setTimeout(runnable, 2000);
|
||||
}
|
||||
iceCandidates.push({
|
||||
"sdpMLineIndex": evt.candidate.sdpMLineIndex,
|
||||
"candidate": evt.candidate.candidate
|
||||
});
|
||||
}
|
||||
}));
|
||||
|
||||
lanClient.dataChannel = lanClient.peerConnection.createDataChannel("lan");
|
||||
lanClient.dataChannel.binaryType = "arraybuffer";
|
||||
|
||||
let evtHandler;
|
||||
evtHandler = () => {
|
||||
if (iceCandidates.length > 0) {
|
||||
setTimeout(evtHandler, 10);
|
||||
return;
|
||||
}
|
||||
lanClient.dataChannelClosed = false;
|
||||
lanClient.dataChannelOpen = true;
|
||||
};
|
||||
|
||||
lanClient.dataChannel.addEventListener("open", evtHandler);
|
||||
|
||||
lanClient.dataChannel.addEventListener("message", /** @type {function(Event)} */ ((/** MessageEvent */ evt) => {
|
||||
clientLANPacketBuffer.push({ "data": evt.data, "_next": null });
|
||||
}));
|
||||
|
||||
lanClient.peerConnection.createOffer().then((/** !RTCSessionDescription */ desc) => {
|
||||
lanClient.peerConnection.setLocalDescription(desc).then(() => {
|
||||
lanClient.description = JSON.stringify(desc);
|
||||
}).catch((err) => {
|
||||
eagError("Failed to set local description! {}", /** @type {string} */ (err.message));
|
||||
lanClient.readyState = READYSTATE_FAILED;
|
||||
lanClient.disconnect(false);
|
||||
});
|
||||
}).catch((err) => {
|
||||
eagError("Failed to set create offer! {}", /** @type {string} */ (err.message));
|
||||
lanClient.readyState = READYSTATE_FAILED;
|
||||
lanClient.disconnect(false);
|
||||
});
|
||||
|
||||
lanClient.peerConnection.addEventListener("connectionstatechange", /** @type {function(Event)} */ ((evt) => {
|
||||
var connectionState = lanClient.peerConnection.connectionState;
|
||||
if ("disconnected" === connectionState) {
|
||||
lanClient.disconnect(false);
|
||||
} else if ("connected" === connectionState) {
|
||||
lanClient.readyState = READYSTATE_CONNECTED;
|
||||
} else if ("failed" === connectionState) {
|
||||
lanClient.readyState = READYSTATE_FAILED;
|
||||
lanClient.disconnect(false);
|
||||
}
|
||||
}));
|
||||
} catch (t) {
|
||||
if (lanClient.dataChannel) {
|
||||
try {
|
||||
lanClient.dataChannel.close();
|
||||
} catch (tt) {
|
||||
}
|
||||
lanClient.dataChannel = null;
|
||||
}
|
||||
if (lanClient.peerConnection) {
|
||||
try {
|
||||
lanClient.peerConnection.close();
|
||||
} catch (tt) {
|
||||
}
|
||||
lanClient.peerConnection = null;
|
||||
}
|
||||
eagStackTrace(ERROR, "Could not create LAN client RTCDataChannel!", t);
|
||||
lanClient.readyState = READYSTATE_INIT_FAILED;
|
||||
}
|
||||
};
|
||||
|
||||
webrtcImports["clearLANClientState"] = function() {
|
||||
lanClient.iceCandidate = lanClient.description = null;
|
||||
lanClient.dataChannelOpen = false;
|
||||
lanClient.dataChannelClosed = true;
|
||||
};
|
||||
|
||||
/**
|
||||
* @return {string|null}
|
||||
*/
|
||||
webrtcImports["clientLANAwaitICECandidate"] = function() {
|
||||
if (lanClient.iceCandidate === null) {
|
||||
return null;
|
||||
}
|
||||
const ret = lanClient.iceCandidate;
|
||||
lanClient.iceCandidate = null;
|
||||
return ret;
|
||||
};
|
||||
|
||||
/**
|
||||
* @return {string|null}
|
||||
*/
|
||||
webrtcImports["clientLANAwaitDescription"] = function() {
|
||||
if (lanClient.description === null) {
|
||||
return null;
|
||||
}
|
||||
const ret = lanClient.description;
|
||||
lanClient.description = null;
|
||||
return ret;
|
||||
};
|
||||
|
||||
/**
|
||||
* @return {boolean}
|
||||
*/
|
||||
webrtcImports["clientLANAwaitChannel"] = function() {
|
||||
if (lanClient.dataChannelOpen) {
|
||||
lanClient.dataChannelOpen = false;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
/**
|
||||
* @return {boolean}
|
||||
*/
|
||||
webrtcImports["clientLANClosed"] = function() {
|
||||
return lanClient.dataChannelClosed;
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {string} candidate
|
||||
*/
|
||||
webrtcImports["clientLANSetICECandidate"] = function(candidate) {
|
||||
try {
|
||||
const lst = /** @type {Array<!Object>} */ (JSON.parse(candidate));
|
||||
for (var i = 0; i < lst.length; ++i) {
|
||||
lanClient.peerConnection.addIceCandidate(new RTCIceCandidate(lst[i]));
|
||||
}
|
||||
}catch(/** Error */ ex) {
|
||||
eagStackTrace(ERROR, "Uncaught exception setting remote ICE candidates", ex);
|
||||
lanClient.readyState = READYSTATE_FAILED;
|
||||
lanClient.disconnect(false);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {string} description
|
||||
*/
|
||||
webrtcImports["clientLANSetDescription"] = function(description) {
|
||||
try {
|
||||
lanClient.peerConnection.setRemoteDescription(/** @type {!RTCSessionDescription} */ (JSON.parse(description)));
|
||||
}catch(/** Error */ ex) {
|
||||
eagStackTrace(ERROR, "Uncaught exception setting remote description", ex);
|
||||
lanClient.readyState = READYSTATE_FAILED;
|
||||
lanClient.disconnect(false);
|
||||
}
|
||||
};
|
||||
|
||||
let lanServer;
|
||||
lanServer = {
|
||||
/** @type {!Array<Object>} */
|
||||
iceServers: [],
|
||||
/** @type {!Map<string, !LANPeerInternal>} */
|
||||
peerList: new Map(),
|
||||
/** @type {!Map<string, !LANPeerInternal>} */
|
||||
ipcMapList: new Map(),
|
||||
disconnect: function(/** string */ peerId) {
|
||||
const thePeer = lanServer.peerList.get(peerId);
|
||||
if(thePeer) {
|
||||
lanServer.peerList.delete(peerId);
|
||||
if(thePeer.ipcChannel) {
|
||||
lanServer.ipcMapList.delete(thePeer.ipcChannel);
|
||||
}
|
||||
try {
|
||||
thePeer.disconnect();
|
||||
} catch (ignored) {}
|
||||
thePeer.pushEvent(EVENT_WEBRTC_CLOSE, null);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {!Array<string>} servers
|
||||
*/
|
||||
webrtcImports["serverLANInitializeServer"] = function(servers) {
|
||||
lanServer.iceServers.length = 0;
|
||||
for (let url of servers) {
|
||||
let etr = url.split(";");
|
||||
if(etr.length === 1) {
|
||||
lanServer.iceServers.push({
|
||||
"urls": etr[0]
|
||||
});
|
||||
}else if(etr.length === 3) {
|
||||
lanServer.iceServers.push({
|
||||
"urls": etr[0],
|
||||
"username": etr[1],
|
||||
"credential": etr[2]
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
webrtcImports["serverLANCloseServer"] = function() {
|
||||
for (let thePeer of Object.values(lanServer.peerList)) {
|
||||
if (thePeer) {
|
||||
try {
|
||||
thePeer.disconnect();
|
||||
} catch (e) {}
|
||||
thePeer.pushEvent(EVENT_WEBRTC_CLOSE, null);
|
||||
}
|
||||
}
|
||||
lanServer.peerList.clear();
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {string} peer
|
||||
*/
|
||||
webrtcImports["serverLANCreatePeer"] = function(peer) {
|
||||
try {
|
||||
const events = new EaglerLinkedQueue();
|
||||
|
||||
/** @type {!LANPeerInternal} */
|
||||
let peerInstance;
|
||||
peerInstance = {
|
||||
peerId: peer,
|
||||
peerConnection: new RTCPeerConnection(/** @type {RTCConfiguration} */ ({
|
||||
"iceServers": lanServer.iceServers,
|
||||
"optional": [
|
||||
{
|
||||
"DtlsSrtpKeyAgreement": true
|
||||
}
|
||||
]
|
||||
})),
|
||||
/** @type {RTCDataChannel} */
|
||||
dataChannel: null,
|
||||
/** @type {string|null} */
|
||||
ipcChannel: null,
|
||||
pushEvent: function(type, data) {
|
||||
events.push({
|
||||
"type": type,
|
||||
"data": data,
|
||||
"_next": null
|
||||
});
|
||||
},
|
||||
disconnect: function() {
|
||||
if (peerInstance.dataChannel) peerInstance.dataChannel.close();
|
||||
peerInstance.peerConnection.close();
|
||||
}
|
||||
};
|
||||
|
||||
lanServer.peerList.set(peerInstance.peerId, peerInstance);
|
||||
|
||||
const iceCandidates = [];
|
||||
|
||||
peerInstance.peerConnection.addEventListener("icecandidate", /** @type {function(Event)} */ ((/** RTCPeerConnectionIceEvent */ evt) => {
|
||||
if(evt.candidate) {
|
||||
if(iceCandidates.length === 0) {
|
||||
const candidateState = [0, 0];
|
||||
const runnable = () => {
|
||||
if(peerInstance.peerConnection !== null && peerInstance.peerConnection.connectionState !== "disconnected") {
|
||||
const trial = ++candidateState[1];
|
||||
if(candidateState[0] !== iceCandidates.length && trial < 3) {
|
||||
candidateState[0] = iceCandidates.length;
|
||||
setTimeout(runnable, 2000);
|
||||
return;
|
||||
}
|
||||
peerInstance.pushEvent(EVENT_WEBRTC_ICE, JSON.stringify(iceCandidates));
|
||||
iceCandidates.length = 0;
|
||||
}
|
||||
};
|
||||
setTimeout(runnable, 2000);
|
||||
}
|
||||
iceCandidates.push({
|
||||
"sdpMLineIndex": evt.candidate.sdpMLineIndex,
|
||||
"candidate": evt.candidate.candidate
|
||||
});
|
||||
}
|
||||
}));
|
||||
|
||||
let evtHandler;
|
||||
evtHandler = (/** RTCDataChannelEvent */ evt) => {
|
||||
if (iceCandidates.length > 0) {
|
||||
setTimeout(evtHandler, 10, evt);
|
||||
return;
|
||||
}
|
||||
if (!evt.channel) return;
|
||||
const newDataChannel = evt.channel;
|
||||
if(peerInstance.dataChannel !== null) {
|
||||
newDataChannel.close();
|
||||
return;
|
||||
}
|
||||
peerInstance.dataChannel = newDataChannel;
|
||||
peerInstance.pushEvent(EVENT_WEBRTC_OPEN, null);
|
||||
peerInstance.dataChannel.addEventListener("message", (evt2) => {
|
||||
const data = evt2.data;
|
||||
if(peerInstance.ipcChannel) {
|
||||
sendIPCPacketFunc(peerInstance.ipcChannel, data);
|
||||
}else {
|
||||
peerInstance.pushEvent(EVENT_WEBRTC_PACKET, new Uint8Array(data));
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
peerInstance.peerConnection.addEventListener("datachannel", /** @type {function(Event)} */ (evtHandler));
|
||||
|
||||
peerInstance.peerConnection.addEventListener("connectionstatechange", (evt) => {
|
||||
const connectionState = peerInstance.peerConnection.connectionState;
|
||||
if ("disconnected" === connectionState || "failed" === connectionState) {
|
||||
lanServer.disconnect(peerInstance.peerId);
|
||||
}
|
||||
});
|
||||
|
||||
return {
|
||||
"peerId": peerInstance.peerId,
|
||||
/**
|
||||
* @return {number}
|
||||
*/
|
||||
"countAvailableEvents": function() {
|
||||
return events.getLength();
|
||||
},
|
||||
/**
|
||||
* @return {Object}
|
||||
*/
|
||||
"nextEvent": function() {
|
||||
return events.shift();
|
||||
},
|
||||
/**
|
||||
* @param {!Uint8Array} dat
|
||||
*/
|
||||
"writePacket": function(dat) {
|
||||
let b = false;
|
||||
if (peerInstance.dataChannel !== null && "open" === peerInstance.dataChannel.readyState) {
|
||||
try {
|
||||
peerInstance.dataChannel.send(dat);
|
||||
} catch (e) {
|
||||
b = true;
|
||||
}
|
||||
} else {
|
||||
b = true;
|
||||
}
|
||||
if(b) {
|
||||
lanServer.disconnect(peerInstance.peerId);
|
||||
}
|
||||
},
|
||||
/**
|
||||
* @param {string} iceCandidates
|
||||
*/
|
||||
"handleRemoteICECandidates": function(iceCandidates) {
|
||||
try {
|
||||
const candidateList = /** @type {!Array<!RTCIceCandidateInit>} */ (JSON.parse(iceCandidates));
|
||||
for (let candidate of candidateList) {
|
||||
peerInstance.peerConnection.addIceCandidate(new RTCIceCandidate(candidate));
|
||||
}
|
||||
} catch (err) {
|
||||
eagError("Failed to parse ice candidate for \"{}\"! {}", peerInstance.peerId, err.message);
|
||||
lanServer.disconnect(peerInstance.peerId);
|
||||
}
|
||||
},
|
||||
/**
|
||||
* @param {string} desc
|
||||
*/
|
||||
"handleRemoteDescription": function(desc) {
|
||||
try {
|
||||
const remoteDesc = /** @type {!RTCSessionDescription} */ (JSON.parse(desc));
|
||||
peerInstance.peerConnection.setRemoteDescription(remoteDesc).then(() => {
|
||||
if (remoteDesc.hasOwnProperty("type") && "offer" === remoteDesc["type"]) {
|
||||
peerInstance.peerConnection.createAnswer().then((desc) => {
|
||||
peerInstance.peerConnection.setLocalDescription(desc).then(() => {
|
||||
peerInstance.pushEvent(EVENT_WEBRTC_DESC, JSON.stringify(desc));
|
||||
}).catch((err) => {
|
||||
eagError("Failed to set local description for \"{}\"! {}", peerInstance.peerId, err.message);
|
||||
lanServer.disconnect(peerInstance.peerId);
|
||||
});
|
||||
}).catch((err) => {
|
||||
eagError("Failed to create answer for \"{}\"! {}", peerInstance.peerId, err.message);
|
||||
lanServer.disconnect(peerInstance.peerId);
|
||||
});
|
||||
}
|
||||
}).catch((err) => {
|
||||
eagError("Failed to set remote description for \"{}\"! {}", peerInstance.peerId, err.message);
|
||||
lanServer.disconnect(peerInstance.peerId);
|
||||
});
|
||||
} catch (err) {
|
||||
eagError("Failed to parse remote description for \"{}\"! {}", peerInstance.peerId, err.message);
|
||||
lanServer.disconnect(peerInstance.peerId);
|
||||
}
|
||||
},
|
||||
/**
|
||||
* @param {string|null} ipcChannel
|
||||
*/
|
||||
"mapIPC": function(ipcChannel) {
|
||||
if(!peerInstance.ipcChannel) {
|
||||
if(ipcChannel) {
|
||||
peerInstance.ipcChannel = ipcChannel;
|
||||
lanServer.ipcMapList.set(ipcChannel, peerInstance);
|
||||
}
|
||||
}else {
|
||||
if(!ipcChannel) {
|
||||
lanServer.ipcMapList.delete(peerInstance.ipcChannel);
|
||||
peerInstance.ipcChannel = null;
|
||||
}
|
||||
}
|
||||
},
|
||||
"disconnect": function() {
|
||||
lanServer.disconnect(peerInstance.peerId);
|
||||
}
|
||||
};
|
||||
}catch(/** Error */ tt) {
|
||||
eagStackTrace(ERROR, "Failed to create WebRTC LAN peer!", tt);
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {string} channel
|
||||
* @param {!ArrayBuffer} arr
|
||||
*/
|
||||
serverLANPeerPassIPCFunc = function(channel, arr) {
|
||||
const peer = lanServer.ipcMapList.get(channel);
|
||||
if(peer) {
|
||||
let b = false;
|
||||
if (peer.dataChannel && "open" === peer.dataChannel.readyState) {
|
||||
try {
|
||||
peer.dataChannel.send(arr);
|
||||
} catch (e) {
|
||||
b = true;
|
||||
}
|
||||
} else {
|
||||
b = true;
|
||||
}
|
||||
if(b) {
|
||||
lanServer.disconnect(peer.peerId);
|
||||
}
|
||||
return true;
|
||||
}else {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
function initializeNoPlatfWebRTC(webrtcImports) {
|
||||
setUnsupportedFunc(webrtcImports, platfWebRTCName, "supported");
|
||||
setUnsupportedFunc(webrtcImports, platfWebRTCName, "clientLANReadyState");
|
||||
setUnsupportedFunc(webrtcImports, platfWebRTCName, "clientLANCloseConnection");
|
||||
setUnsupportedFunc(webrtcImports, platfWebRTCName, "clientLANSendPacket");
|
||||
setUnsupportedFunc(webrtcImports, platfWebRTCName, "clientLANReadPacket");
|
||||
setUnsupportedFunc(webrtcImports, platfWebRTCName, "clientLANAvailable");
|
||||
setUnsupportedFunc(webrtcImports, platfWebRTCName, "clientLANSetICEServersAndConnect");
|
||||
setUnsupportedFunc(webrtcImports, platfWebRTCName, "clearLANClientState");
|
||||
setUnsupportedFunc(webrtcImports, platfWebRTCName, "clientLANAwaitICECandidate");
|
||||
setUnsupportedFunc(webrtcImports, platfWebRTCName, "clientLANAwaitDescription");
|
||||
setUnsupportedFunc(webrtcImports, platfWebRTCName, "clientLANAwaitChannel");
|
||||
setUnsupportedFunc(webrtcImports, platfWebRTCName, "clientLANClosed");
|
||||
setUnsupportedFunc(webrtcImports, platfWebRTCName, "clientLANSetICECandidate");
|
||||
setUnsupportedFunc(webrtcImports, platfWebRTCName, "clientLANSetDescription");
|
||||
setUnsupportedFunc(webrtcImports, platfWebRTCName, "clientLANClosed");
|
||||
setUnsupportedFunc(webrtcImports, platfWebRTCName, "serverLANInitializeServer");
|
||||
setUnsupportedFunc(webrtcImports, platfWebRTCName, "serverLANCloseServer");
|
||||
setUnsupportedFunc(webrtcImports, platfWebRTCName, "serverLANCreatePeer");
|
||||
}
|
523
src/wasm-gc-teavm/js/platformWebView.js
Normal file
523
src/wasm-gc-teavm/js/platformWebView.js
Normal file
@ -0,0 +1,523 @@
|
||||
/*
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
const platfWebViewName = "platformWebView";
|
||||
|
||||
function initializePlatfWebView(webViewImports) {
|
||||
|
||||
const BEGIN_SHOWING_DIRECT = 0;
|
||||
const BEGIN_SHOWING_ENABLE_JAVASCRIPT = 1;
|
||||
const BEGIN_SHOWING_CONTENT_BLOCKED = 2;
|
||||
|
||||
const EVENT_WEBVIEW_CHANNEL = 0;
|
||||
const EVENT_WEBVIEW_MESSAGE = 1;
|
||||
const EVENT_WEBVIEW_PERMISSION_ALLOW = 2;
|
||||
const EVENT_WEBVIEW_PERMISSION_BLOCK = 3;
|
||||
const EVENT_WEBVIEW_PERMISSION_CLEAR = 4;
|
||||
|
||||
const EVENT_CHANNEL_OPEN = 0;
|
||||
const EVENT_CHANNEL_CLOSE = 1;
|
||||
|
||||
const EVENT_MESSAGE_STRING = 0;
|
||||
const EVENT_MESSAGE_BINARY = 1;
|
||||
|
||||
const utf8Decoder = new TextDecoder("utf-8");
|
||||
|
||||
var supported = false;
|
||||
var cspSupport = false;
|
||||
var supportForce = runtimeOpts.forceWebViewSupport;
|
||||
var enableCSP = runtimeOpts.enableWebViewCSP;
|
||||
if(supportForce) {
|
||||
supported = true;
|
||||
cspSupport = true;
|
||||
}else {
|
||||
supported = false;
|
||||
cspSupport = false;
|
||||
try {
|
||||
var tmp = /** @type {HTMLIFrameElement} */ (document.createElement("iframe"));
|
||||
supported = tmp != null && (typeof tmp.allow === "string") && (typeof tmp.sandbox === "object");
|
||||
cspSupport = enableCSP && supported && (typeof tmp.csp === "string");
|
||||
}catch(ex) {
|
||||
eagError("Error checking iframe support");
|
||||
eagError(ex);
|
||||
}
|
||||
}
|
||||
if(!supported) {
|
||||
eagError("This browser does not meet the safety requirements for webview support, this feature will be disabled");
|
||||
}else if(!cspSupport && enableCSP) {
|
||||
eagWarn("This browser does not support CSP attribute on iframes! (try Chrome)");
|
||||
}
|
||||
|
||||
const requireSSL = location.protocol && "https:" === location.protocol.toLowerCase();
|
||||
|
||||
var webviewResetSerial = 0;
|
||||
|
||||
/** @type {HTMLElement} */
|
||||
var currentIFrameContainer = null;
|
||||
|
||||
/** @type {HTMLElement} */
|
||||
var currentAllowJavaScript = null;
|
||||
|
||||
/** @type {HTMLIFrameElement} */
|
||||
var currentIFrame = null;
|
||||
|
||||
/** @type {function(MessageEvent)|null} */
|
||||
var currentMessageHandler = null;
|
||||
|
||||
window.addEventListener("message", /** @type {function(Event)} */ (function(/** MessageEvent */ evt) {
|
||||
if(currentMessageHandler && evt.source !== window) {
|
||||
currentMessageHandler(evt);
|
||||
}
|
||||
}));
|
||||
|
||||
/**
|
||||
* @return {boolean}
|
||||
*/
|
||||
webViewImports["checkSupported"] = function() {
|
||||
return supported;
|
||||
};
|
||||
|
||||
/**
|
||||
* @return {boolean}
|
||||
*/
|
||||
webViewImports["checkCSPSupported"] = function() {
|
||||
return cspSupport;
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {string} ch
|
||||
* @param {string} str
|
||||
*/
|
||||
webViewImports["sendStringMessage"] = function(ch, str) {
|
||||
try {
|
||||
var w;
|
||||
if(currentIFrame != null && (w = currentIFrame.contentWindow) != null) {
|
||||
w.postMessage({
|
||||
"ver": 1,
|
||||
"channel": ch,
|
||||
"type": "string",
|
||||
"data": str
|
||||
}, "*");
|
||||
}else {
|
||||
eagError("Server tried to send the WebView a message, but the message channel is not open!");
|
||||
}
|
||||
}catch(/** Error */ ex) {
|
||||
eagStackTrace(ERROR, "Failed to send string message to WebView!", ex);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {string} ch
|
||||
* @param {Uint8Array} bin
|
||||
*/
|
||||
webViewImports["sendBinaryMessage"] = function(ch, bin) {
|
||||
try {
|
||||
var w;
|
||||
if(currentIFrame != null && (w = currentIFrame.contentWindow) != null) {
|
||||
const copiedArray = new Uint8Array(bin.length);
|
||||
copiedArray.set(bin, 0);
|
||||
w.postMessage({
|
||||
"ver": 1,
|
||||
"channel": ch,
|
||||
"type": "binary",
|
||||
"data": copiedArray.buffer
|
||||
}, "*");
|
||||
}else {
|
||||
eagError("Server tried to send the WebView a message, but the message channel is not open!");
|
||||
}
|
||||
}catch(/** Error */ ex) {
|
||||
eagStackTrace(ERROR, "Failed to send string message to WebView!", ex);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {number} state
|
||||
* @param {Object} options
|
||||
* @param {number} x
|
||||
* @param {number} y
|
||||
* @param {number} w
|
||||
* @param {number} h
|
||||
*/
|
||||
webViewImports["beginShowing"] = function(state, options, x, y, w, h) {
|
||||
if(!supported) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
setupShowing(x, y, w, h);
|
||||
switch(state) {
|
||||
case BEGIN_SHOWING_DIRECT:
|
||||
beginShowingDirect(options);
|
||||
break;
|
||||
case BEGIN_SHOWING_ENABLE_JAVASCRIPT:
|
||||
if(options["contentMode"] === 1) {
|
||||
const copiedBlob = new Uint8Array(options["blob"].length);
|
||||
copiedBlob.set(options["blob"], 0);
|
||||
options["blob"] = copiedBlob;
|
||||
}
|
||||
beginShowingEnableJavaScript(options);
|
||||
break;
|
||||
case BEGIN_SHOWING_CONTENT_BLOCKED:
|
||||
if(options["contentMode"] === 1) {
|
||||
const copiedBlob = new Uint8Array(options["blob"].length);
|
||||
copiedBlob.set(options["blob"], 0);
|
||||
options["blob"] = copiedBlob;
|
||||
}
|
||||
beginShowingContentBlocked(options);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}catch(/** Error */ ex) {
|
||||
eagStackTrace(ERROR, "Failed to begin showing WebView!", ex);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {number} x
|
||||
* @param {number} y
|
||||
* @param {number} w
|
||||
* @param {number} h
|
||||
*/
|
||||
function setupShowing(x, y, w, h) {
|
||||
if(currentIFrameContainer !== null) {
|
||||
endShowingImpl();
|
||||
}
|
||||
currentIFrameContainer = /** @type {HTMLElement} */ (document.createElement("div"));
|
||||
currentIFrameContainer.classList.add("_eaglercraftX_webview_container_element");
|
||||
currentIFrameContainer.style.border = "5px solid #333333";
|
||||
currentIFrameContainer.style.zIndex = "11";
|
||||
currentIFrameContainer.style.position = "absolute";
|
||||
currentIFrameContainer.style.backgroundColor = "#DDDDDD";
|
||||
currentIFrameContainer.style.fontFamily = "sans-serif";
|
||||
resizeImpl(x, y, w, h);
|
||||
parentElement.appendChild(currentIFrameContainer);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {HTMLIFrameElement} iframeElement
|
||||
* @param {string} str
|
||||
*/
|
||||
function setAllowSafe(iframeElement, str) {
|
||||
iframeElement.allow = str;
|
||||
return iframeElement.allow === str;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {HTMLIFrameElement} iframeElement
|
||||
* @param {Array<string>} args
|
||||
*/
|
||||
function setSandboxSafe(iframeElement, args) {
|
||||
const theSandbox = iframeElement.sandbox;
|
||||
for(var i = 0; i < args.length; ++i) {
|
||||
theSandbox.add(args[i]);
|
||||
}
|
||||
for(var i = 0; i < args.length; ++i) {
|
||||
if(!theSandbox.contains(args[i])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
for(var i = 0; i < theSandbox.length; ++i) {
|
||||
if(!args.find(itm => itm === theSandbox[i])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function beginShowingDirect(options) {
|
||||
if(!supportForce) {
|
||||
currentIFrame = /** @type {HTMLIFrameElement} */ (document.createElement("iframe"));
|
||||
currentIFrame.referrerPolicy = "strict-origin";
|
||||
const sandboxArgs = [ "allow-downloads" ];
|
||||
if(options["scriptEnabled"]) {
|
||||
sandboxArgs.push("allow-scripts");
|
||||
sandboxArgs.push("allow-pointer-lock");
|
||||
}
|
||||
if(!setAllowSafe(currentIFrame, "") || !setSandboxSafe(currentIFrame, sandboxArgs)) {
|
||||
eagError("Caught safety exception while opening webview!");
|
||||
if(currentIFrame !== null) {
|
||||
currentIFrame.remove();
|
||||
currentIFrame = null;
|
||||
}
|
||||
eagError("Things you can try:");
|
||||
eagError("1. Set window.eaglercraftXOpts.forceWebViewSupport to true");
|
||||
eagError("2. Set window.eaglercraftXOpts.enableWebViewCSP to false");
|
||||
eagError("(these settings may compromise security)");
|
||||
beginShowingSafetyError();
|
||||
return;
|
||||
}
|
||||
}else {
|
||||
currentIFrame = /** @type {HTMLIFrameElement} */ (document.createElement("iframe"));
|
||||
currentIFrame.allow = "";
|
||||
currentIFrame.referrerPolicy = "strict-origin";
|
||||
currentIFrame.sandbox.add("allow-downloads");
|
||||
if(options["scriptEnabled"]) {
|
||||
currentIFrame.sandbox.add("allow-scripts");
|
||||
currentIFrame.sandbox.add("allow-pointer-lock");
|
||||
}
|
||||
}
|
||||
currentIFrame.credentialless = true;
|
||||
currentIFrame.loading = "lazy";
|
||||
var cspWarn = false;
|
||||
if(options["contentMode"] === 1) {
|
||||
if(enableCSP && cspSupport) {
|
||||
if(typeof currentIFrame.csp === "string") {
|
||||
var csp = "default-src 'none';";
|
||||
var protos = options["strictCSPEnable"] ? "" : (requireSSL ? " https:" : " http: https:");
|
||||
if(options["scriptEnabled"]) {
|
||||
csp += (" script-src 'unsafe-eval' 'unsafe-inline' data: blob:" + protos + ";");
|
||||
csp += (" style-src 'unsafe-eval' 'unsafe-inline' data: blob:" + protos + ";");
|
||||
csp += (" img-src data: blob:" + protos + ";");
|
||||
csp += (" font-src data: blob:" + protos + ";");
|
||||
csp += (" child-src data: blob:" + protos + ";");
|
||||
csp += (" frame-src data: blob:;");
|
||||
csp += (" media-src data: mediastream: blob:" + protos + ";");
|
||||
csp += (" connect-src data: blob:" + protos + ";");
|
||||
csp += (" worker-src data: blob:" + protos + ";");
|
||||
}else {
|
||||
csp += (" style-src data: 'unsafe-inline'" + protos + ";");
|
||||
csp += (" img-src data:" + protos + ";");
|
||||
csp += (" font-src data:" + protos + ";");
|
||||
csp += (" media-src data:" + protos + ";");
|
||||
}
|
||||
currentIFrame.csp = csp;
|
||||
}else {
|
||||
eagWarn("This browser does not support CSP attribute on iframes! (try Chrome)");
|
||||
cspWarn = true;
|
||||
}
|
||||
}else {
|
||||
cspWarn = true;
|
||||
}
|
||||
if(cspWarn && options["strictCSPEnable"]) {
|
||||
eagWarn("Strict CSP was requested for this webview, but that feature is not available!");
|
||||
}
|
||||
}else {
|
||||
cspWarn = true;
|
||||
}
|
||||
currentIFrame.style.border = "none";
|
||||
currentIFrame.style.backgroundColor = "white";
|
||||
currentIFrame.style.width = "100%";
|
||||
currentIFrame.style.height = "100%";
|
||||
currentIFrame.classList.add("_eaglercraftX_webview_iframe_element");
|
||||
currentIFrameContainer.appendChild(currentIFrame);
|
||||
if(options["contentMode"] === 1) {
|
||||
const decodedText = utf8Decoder.decode(options["blob"]);
|
||||
options["blob"] = null;
|
||||
currentIFrame.srcdoc = decodedText;
|
||||
}else {
|
||||
currentIFrame.src = options["uri"];
|
||||
}
|
||||
const resetSer = webviewResetSerial;
|
||||
const curIFrame = currentIFrame;
|
||||
let focusTracker = false;
|
||||
currentIFrame.addEventListener("mouseover", function(/** Event */ evt) {
|
||||
if(resetSer === webviewResetSerial && curIFrame === currentIFrame) {
|
||||
if(!focusTracker) {
|
||||
focusTracker = true;
|
||||
currentIFrame.contentWindow.focus();
|
||||
}
|
||||
}
|
||||
});
|
||||
currentIFrame.addEventListener("mouseout", function(/** Event */ evt) {
|
||||
if(resetSer === webviewResetSerial && curIFrame === currentIFrame) {
|
||||
if(focusTracker) {
|
||||
focusTracker = false;
|
||||
window.focus();
|
||||
}
|
||||
}
|
||||
});
|
||||
if(options["scriptEnabled"] && options["serverMessageAPIEnabled"]) {
|
||||
currentMessageHandler = function(/** MessageEvent */ evt) {
|
||||
if(resetSer === webviewResetSerial && curIFrame === currentIFrame && evt.source === curIFrame.contentWindow) {
|
||||
/** @type {Object} */
|
||||
const obj = evt.data;
|
||||
if((typeof obj === "object") && (obj["ver"] === 1) && ((typeof obj["channel"] === "string") && obj["channel"]["length"] > 0)) {
|
||||
if(typeof obj["open"] === "boolean") {
|
||||
pushEvent(EVENT_TYPE_WEBVIEW, EVENT_WEBVIEW_CHANNEL, {
|
||||
"eventType": (obj["open"] ? EVENT_CHANNEL_OPEN : EVENT_CHANNEL_CLOSE),
|
||||
"channelName": obj["channel"]
|
||||
});
|
||||
return;
|
||||
}else if(typeof obj["data"] === "string") {
|
||||
pushEvent(EVENT_TYPE_WEBVIEW, EVENT_WEBVIEW_MESSAGE, {
|
||||
"eventType": EVENT_MESSAGE_STRING,
|
||||
"channelName": obj["channel"],
|
||||
"eventData": obj["data"]
|
||||
});
|
||||
return;
|
||||
}else if(obj["data"] instanceof ArrayBuffer) {
|
||||
pushEvent(EVENT_TYPE_WEBVIEW, EVENT_WEBVIEW_MESSAGE, {
|
||||
"eventType": EVENT_MESSAGE_BINARY,
|
||||
"channelName": obj["channel"],
|
||||
"eventData": obj["data"]
|
||||
});
|
||||
return;
|
||||
}
|
||||
}
|
||||
eagWarn("WebView sent an invalid message!");
|
||||
}else {
|
||||
eagWarn("Recieved message from on dead IFrame handler: (#{}) {}", resetSer, curIFrame.src);
|
||||
}
|
||||
};
|
||||
}
|
||||
eagInfo("WebView is loading: \"{}\"", options["contentMode"] === 1 ? "about:srcdoc" : currentIFrame.src);
|
||||
eagInfo("JavaScript: {}, Strict CSP: {}, Message API: {}", options["scriptEnabled"],
|
||||
options["strictCSPEnable"] && !cspWarn, options["serverMessageAPIEnabled"]);
|
||||
}
|
||||
|
||||
function beginShowingEnableJSSetup() {
|
||||
if(currentAllowJavaScript !== null) {
|
||||
++webviewResetSerial;
|
||||
currentAllowJavaScript.remove();
|
||||
currentAllowJavaScript = null;
|
||||
}
|
||||
currentAllowJavaScript = /** @type {HTMLElement} */ (document.createElement("div"));
|
||||
currentAllowJavaScript.style.backgroundColor = "white";
|
||||
currentAllowJavaScript.style.width = "100%";
|
||||
currentAllowJavaScript.style.height = "100%";
|
||||
currentAllowJavaScript.classList.add("_eaglercraftX_webview_permission_screen");
|
||||
currentIFrameContainer.appendChild(currentAllowJavaScript);
|
||||
}
|
||||
|
||||
function beginShowingEnableJavaScript(options) {
|
||||
beginShowingEnableJSSetup();
|
||||
var strictCSPMarkup;
|
||||
if(options["contentMode"] !== 1) {
|
||||
strictCSPMarkup = "<span style=\"color:red;\">Impossible</span>";
|
||||
}else if(!cspSupport || !enableCSP) {
|
||||
strictCSPMarkup = "<span style=\"color:red;\">Unsupported</span>";
|
||||
}else if(options["strictCSPEnable"]) {
|
||||
strictCSPMarkup = "<span style=\"color:green;\">Enabled</span>";
|
||||
}else {
|
||||
strictCSPMarkup = "<span style=\"color:red;\">Disabled</span>";
|
||||
}
|
||||
var messageAPIMarkup;
|
||||
if(options["serverMessageAPIEnabled"]) {
|
||||
messageAPIMarkup = "<span style=\"color:red;\">Enabled</span>";
|
||||
}else {
|
||||
messageAPIMarkup = "<span style=\"color:green;\">Disabled</span>";
|
||||
}
|
||||
currentAllowJavaScript.innerHTML =
|
||||
"<div style=\"padding-top:13vh;\"><div style=\"margin:auto;max-width:450px;border:6px double black;text-align:center;padding:20px;\">"
|
||||
+ "<h2><img width=\"32\" height=\"32\" style=\"vertical-align:middle;\" src=\"" + faviconURL + "\"> Allow JavaScript</h2>"
|
||||
+ "<p style=\"font-family:monospace;text-decoration:underline;word-wrap:break-word;\" class=\"_eaglercraftX_permission_target_url\"></p>"
|
||||
+ "<h4 style=\"line-height:1.4em;\">Strict CSP: " + strictCSPMarkup + " | "
|
||||
+ "Message API: " + messageAPIMarkup + "</h4>"
|
||||
+ "<p><input class=\"_eaglercraftX_remember_javascript\" type=\"checkbox\" checked> Remember my choice</p>"
|
||||
+ "<p><button style=\"font-size:1.5em;\" class=\"_eaglercraftX_allow_javascript\">Allow</button> "
|
||||
+ "<button style=\"font-size:1.5em;\" class=\"_eaglercraftX_block_javascript\">Block</button></p></div></div>";
|
||||
const serial = webviewResetSerial;
|
||||
if(options["contentMode"] !== 1) {
|
||||
const urlStr = options["url"];
|
||||
currentAllowJavaScript.querySelector("._eaglercraftX_permission_target_url").innerText = urlStr.length() > 255 ? (urlStr.substring(0, 253) + "...") : urlStr;
|
||||
}
|
||||
currentAllowJavaScript.querySelector("._eaglercraftX_allow_javascript").addEventListener("click", function(/** Event */ evt) {
|
||||
if(webviewResetSerial === serial && currentAllowJavaScript !== null) {
|
||||
const chkbox = currentAllowJavaScript.querySelector("._eaglercraftX_remember_javascript");
|
||||
if(chkbox !== null && chkbox.checked) {
|
||||
pushEvent(EVENT_TYPE_WEBVIEW, EVENT_WEBVIEW_PERMISSION_ALLOW, null);
|
||||
}
|
||||
currentAllowJavaScript.remove();
|
||||
currentAllowJavaScript = null;
|
||||
++webviewResetSerial;
|
||||
beginShowingDirect(options);
|
||||
}
|
||||
});
|
||||
currentAllowJavaScript.querySelector("._eaglercraftX_block_javascript").addEventListener("click", function(/** Event */ evt) {
|
||||
if(webviewResetSerial === serial && currentAllowJavaScript !== null) {
|
||||
const chkbox = currentAllowJavaScript.querySelector("._eaglercraftX_remember_javascript");
|
||||
if(chkbox !== null && chkbox.checked) {
|
||||
pushEvent(EVENT_TYPE_WEBVIEW, EVENT_WEBVIEW_PERMISSION_BLOCK, null);
|
||||
}
|
||||
beginShowingContentBlocked(options);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function beginShowingContentBlocked(options) {
|
||||
beginShowingEnableJSSetup();
|
||||
currentAllowJavaScript.innerHTML =
|
||||
"<div style=\"padding-top:13vh;\"><h1 style=\"text-align:center;\">"
|
||||
+ "<img width=\"48\" height=\"48\" style=\"vertical-align:middle;\" src=\"" + faviconURL + "\"> Content Blocked</h1>"
|
||||
+ "<h4 style=\"text-align:center;\">You chose to block JavaScript execution for this embed</h4>"
|
||||
+ "<p style=\"text-align:center;\"><button style=\"font-size:1.0em;\" class=\"_eaglercraftX_re_evaluate_javascript\">Re-evaluate</button></p></div>";
|
||||
const serial = webviewResetSerial;
|
||||
currentAllowJavaScript.querySelector("._eaglercraftX_re_evaluate_javascript").addEventListener("click", function(/** Event */ evt) {
|
||||
if(webviewResetSerial === serial && currentAllowJavaScript !== null) {
|
||||
pushEvent(EVENT_TYPE_WEBVIEW, EVENT_WEBVIEW_PERMISSION_CLEAR, null);
|
||||
beginShowingEnableJavaScript(options);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function beginShowingSafetyError() {
|
||||
beginShowingEnableJSSetup();
|
||||
currentAllowJavaScript.innerHTML =
|
||||
"<div style=\"padding-top:13vh;\"><h1 style=\"text-align:center;\">"
|
||||
+ "<img width=\"48\" height=\"48\" style=\"vertical-align:middle;\" src=\"" + faviconURL + "\"> IFrame Safety Error</h1>"
|
||||
+ "<h4 style=\"text-align:center;\">The content cannot be displayed safely!</h4>"
|
||||
+ "<h4 style=\"text-align:center;\">Check console for more details</h4></div>";
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {number} x
|
||||
* @param {number} y
|
||||
* @param {number} w
|
||||
* @param {number} h
|
||||
*/
|
||||
function resizeImpl(x, y, w, h) {
|
||||
if(currentIFrameContainer) {
|
||||
const s = window.devicePixelRatio;
|
||||
currentIFrameContainer.style.top = "" + (y / s) + "px";
|
||||
currentIFrameContainer.style.left = "" + (x / s) + "px";
|
||||
currentIFrameContainer.style.width = "" + ((w / s) - 10) + "px";
|
||||
currentIFrameContainer.style.height = "" + ((h / s) - 10) + "px";
|
||||
}
|
||||
}
|
||||
|
||||
function endShowingImpl() {
|
||||
++webviewResetSerial;
|
||||
if(currentIFrame) {
|
||||
currentIFrame.remove();
|
||||
currentIFrame = null;
|
||||
}
|
||||
currentMessageHandler = null;
|
||||
if(currentAllowJavaScript) {
|
||||
currentAllowJavaScript.remove();
|
||||
currentAllowJavaScript = null;
|
||||
}
|
||||
if(currentIFrameContainer) {
|
||||
currentIFrameContainer.remove();
|
||||
currentIFrameContainer = null;
|
||||
}
|
||||
window.focus();
|
||||
}
|
||||
|
||||
webViewImports["resize"] = resizeImpl;
|
||||
|
||||
webViewImports["endShowing"] = endShowingImpl;
|
||||
|
||||
}
|
||||
|
||||
function initializeNoPlatfWebView(webViewImports) {
|
||||
setUnsupportedFunc(webViewImports, platfWebViewName, "checkSupported");
|
||||
setUnsupportedFunc(webViewImports, platfWebViewName, "checkCSPSupported");
|
||||
setUnsupportedFunc(webViewImports, platfWebViewName, "sendStringMessage");
|
||||
setUnsupportedFunc(webViewImports, platfWebViewName, "sendBinaryMessage");
|
||||
setUnsupportedFunc(webViewImports, platfWebViewName, "beginShowing");
|
||||
setUnsupportedFunc(webViewImports, platfWebViewName, "resize");
|
||||
setUnsupportedFunc(webViewImports, platfWebViewName, "endShowing");
|
||||
}
|
99
src/wasm-gc-teavm/js/serverPlatformSingleplayer.js
Normal file
99
src/wasm-gc-teavm/js/serverPlatformSingleplayer.js
Normal file
@ -0,0 +1,99 @@
|
||||
/*
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
const serverPlatfSPName = "serverPlatformSingleplayer";
|
||||
|
||||
/** @type {function(string, boolean)|null} */
|
||||
var sendIntegratedServerCrash = null;
|
||||
|
||||
/** @type {boolean} */
|
||||
var isTabClosingFlag = false;
|
||||
|
||||
function initializeServerPlatfSP(spImports) {
|
||||
|
||||
const serverMessageQueue = new EaglerLinkedQueue();
|
||||
|
||||
/**
|
||||
* @param {Object} o
|
||||
*/
|
||||
self.__eaglerXOnMessage = function(o) {
|
||||
const channel = o["ch"];
|
||||
const buf = o["dat"];
|
||||
|
||||
if(!channel) {
|
||||
eagError("Recieved IPC packet with null channel");
|
||||
return;
|
||||
}
|
||||
|
||||
if(channel === "~!WASM_AUTOSAVE") {
|
||||
isTabClosingFlag = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if(!buf) {
|
||||
eagError("Recieved IPC packet with null buffer");
|
||||
return;
|
||||
}
|
||||
|
||||
serverMessageQueue.push({
|
||||
"ch": channel,
|
||||
"data": new Uint8Array(buf),
|
||||
"_next": null
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {string} channel
|
||||
* @param {Uint8Array} arr
|
||||
*/
|
||||
spImports["sendPacket"] = function(channel, arr) {
|
||||
const copiedArray = new Uint8Array(arr.length);
|
||||
copiedArray.set(arr, 0);
|
||||
postMessage({
|
||||
"ch": channel,
|
||||
"dat": copiedArray.buffer
|
||||
}, [copiedArray.buffer]);
|
||||
};
|
||||
|
||||
spImports["getAvailablePackets"] = serverMessageQueue.getLength.bind(serverMessageQueue);
|
||||
|
||||
spImports["getNextPacket"] = serverMessageQueue.shift.bind(serverMessageQueue);
|
||||
|
||||
spImports["setCrashCallback"] = function() {
|
||||
return {
|
||||
"call": function(functor) {
|
||||
sendIntegratedServerCrash = functor;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* @return {boolean}
|
||||
*/
|
||||
spImports["isTabAboutToClose"] = function() {
|
||||
const ret = isTabClosingFlag;
|
||||
isTabClosingFlag = false;
|
||||
return ret;
|
||||
};
|
||||
}
|
||||
|
||||
function initializeNoServerPlatfSP(spImports) {
|
||||
setUnsupportedFunc(spImports, serverPlatfSPName, "sendPacket");
|
||||
setUnsupportedFunc(spImports, serverPlatfSPName, "getAvailablePackets");
|
||||
setUnsupportedFunc(spImports, serverPlatfSPName, "getNextPacket");
|
||||
setUnsupportedFunc(spImports, serverPlatfSPName, "setCrashCallback");
|
||||
setUnsupportedFunc(spImports, serverPlatfSPName, "isTabAboutToClose");
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
#!/bin/sh
|
||||
srcFolder=../src/wasm-gc-teavm/js
|
||||
echo Compiling $srcFolder
|
||||
java -jar buildtools/closure-compiler.jar --compilation_level ADVANCED_OPTIMIZATIONS --assume_function_wrapper --emit_use_strict --isolation_mode IIFE --js $srcFolder/externs.js $srcFolder/eagruntime_util.js $srcFolder/eagruntime_main.js $srcFolder/platformApplication.js $srcFolder/platformAssets.js $srcFolder/platformAudio.js $srcFolder/platformFilesystem.js $srcFolder/platformInput.js $srcFolder/platformNetworking.js $srcFolder/platformOpenGL.js $srcFolder/platformRuntime.js $srcFolder/platformScreenRecord.js $srcFolder/platformVoiceClient.js $srcFolder/platformWebRTC.js $srcFolder/platformWebView.js $srcFolder/clientPlatformSingleplayer.js $srcFolder/serverPlatformSingleplayer.js $srcFolder/WASMGCBufferAllocator.js $srcFolder/fix-webm-duration.js $srcFolder/teavm_runtime.js $srcFolder/eagruntime_entrypoint.js --js_output_file javascript/eagruntime.js
|
||||
java -jar buildtools/closure-compiler.jar --compilation_level ADVANCED_OPTIMIZATIONS --assume_function_wrapper --emit_use_strict --isolation_mode IIFE --js $srcFolder/externs.js $srcFolder/eagruntime_util.js $srcFolder/eagruntime_main.js $srcFolder/platformApplication.js $srcFolder/platformAssets.js $srcFolder/platformAudio.js $srcFolder/platformFilesystem.js $srcFolder/platformInput.js $srcFolder/platformNetworking.js $srcFolder/platformOpenGL.js $srcFolder/platformRuntime.js $srcFolder/platformVoiceClient.js $srcFolder/platformWebRTC.js $srcFolder/platformWebView.js $srcFolder/clientPlatformSingleplayer.js $srcFolder/serverPlatformSingleplayer.js $srcFolder/WASMGCBufferAllocator.js $srcFolder/fix-webm-duration.js $srcFolder/teavm_runtime.js $srcFolder/eagruntime_entrypoint.js --js_output_file javascript/eagruntime.js
|
||||
|
BIN
wasm_gc_teavm/javascript/classes.wasm
Normal file
BIN
wasm_gc_teavm/javascript/classes.wasm
Normal file
Binary file not shown.
1431
wasm_gc_teavm/javascript/classes.wasm.teadbg
Normal file
1431
wasm_gc_teavm/javascript/classes.wasm.teadbg
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,17 +1,17 @@
|
||||
(function(){'use strict';const da=["DEBUG","INFO","WARN","ERROR"];var ea="main",ka=null;function la(a,b,f){if(!(1>a)){var g="EagRuntimeJS: ["+(new Date).toLocaleTimeString()+"]["+ea+"/"+(da[a]||"UNKNOWN")+"] ";a:{if(0<f.length){for(var r=[],u=0;u<f.length;++u){var D=b.indexOf("{}");if(-1!=D)r.push(b.substring(0,D)),r.push(f[u]),b=b.substring(D+2);else break}if(0<r.length){r.push(b);f=r.join("");break a}}f=b}b=g+f;3<=a?console.error(b):console.log(b);ka&&ka(b,3<=a)}}function c(a,...b){la(1,a,b)}
|
||||
function k(a,...b){la(3,a,b)}function oa(a,b){if(b){if(b.message?la(3,'{}: {} - "{}"',[a,b.name,b.message]):la(3,"{}: {}",[a,b.name]),"string"===typeof b.stack)for(b=qa(b.stack),a=0;a<b.length;++a)la(3," at "+b[a],[])}else la(3,"{}: <null>",[a])}function ra(a){return function(){k("Unsupported function called: {}.{}",a);return 0}}function y(a,b){a[b]=ra(b)}function sa(a){return new Promise(function(b){setTimeout(b,a)})}
|
||||
class ua{constructor(){this.i=this.g=null;this.m=0}A(){return this.m}push(a){this.i&&(this.i._next=a);this.i=a;this.g||(this.g=a);++this.m}s(){if(this.g){const a=this.g;(this.g=a._next||null)?a._next=null:this.i=null;--this.m;return a}return null}};var va={},A={},wa={},xa={},ya={},F={},Ba={},H={},Ca={},Da=null,Ea=null,Ha=null,Ia=null,Ja=null,I=null,Ka=null,M=null,R=null,La=null,Oa=!1,Pa=0,S=null,Qa=!1,Ra=!1;const Sa=[];var Ta=null,Ua="_eaglercraftX",Va=!1,Wa=!1,Xa=!1,rb=!1,sb=!0,tb=!0,ub=!1;
|
||||
function vb(){"string"===typeof I.localStorageNamespace&&(Ua=I.localStorageNamespace);"boolean"===typeof I.openDebugConsoleOnLaunch&&(Va=I.openDebugConsoleOnLaunch);"boolean"===typeof I.fixDebugConsoleUnloadListener&&(Wa=I.fixDebugConsoleUnloadListener);"boolean"===typeof I.forceWebGL1&&(Xa=I.forceWebGL1);"boolean"===typeof I.forceWebGL2&&(rb=I.forceWebGL2);"boolean"===typeof I.allowExperimentalWebGL1&&(sb=I.allowExperimentalWebGL1);"boolean"===typeof I.useWebGLExt&&(tb=I.useWebGLExt);"boolean"===
|
||||
class ua{constructor(){this.i=this.g=null;this.m=0}A(){return this.m}push(a){this.i&&(this.i._next=a);this.i=a;this.g||(this.g=a);++this.m}s(){if(this.g){const a=this.g;(this.g=a._next||null)?a._next=null:this.i=null;--this.m;return a}return null}};var va={},A={},wa={},xa={},ya={},F={},za={},H={},Ca={},Da=null,Ea=null,Fa=null,Ia=null,Ja=null,I=null,Ka=null,M=null,R=null,La=null,Ma=!1,Pa=0,S=null,Qa=!1,Ra=!1;const Sa=[];var Ta=null,Ua="_eaglercraftX",Va=!1,Wa=!1,Xa=!1,Ya=!1,Za=!0,tb=!0,ub=!1;
|
||||
function vb(){"string"===typeof I.localStorageNamespace&&(Ua=I.localStorageNamespace);"boolean"===typeof I.openDebugConsoleOnLaunch&&(Va=I.openDebugConsoleOnLaunch);"boolean"===typeof I.fixDebugConsoleUnloadListener&&(Wa=I.fixDebugConsoleUnloadListener);"boolean"===typeof I.forceWebGL1&&(Xa=I.forceWebGL1);"boolean"===typeof I.forceWebGL2&&(Ya=I.forceWebGL2);"boolean"===typeof I.allowExperimentalWebGL1&&(Za=I.allowExperimentalWebGL1);"boolean"===typeof I.useWebGLExt&&(tb=I.useWebGLExt);"boolean"===
|
||||
typeof I.useDelayOnSwap&&(ub=I.useDelayOnSwap)}
|
||||
async function wb(){function a(){try{r=new AudioContext}catch(D){oa("Could not initialize audio context",D)}}vb();ka=xb;"yes"!==window.__isEaglerX188UnloadListenerSet&&(window.onbeforeunload=function(){window.__curEaglerX188UnloadListenerCB&&window.__curEaglerX188UnloadListenerCB();return!1},window.__isEaglerX188UnloadListenerSet="yes");c("Initializing EagRuntime JS context...");await yb();zb();Ka.classList.add("_eaglercraftX_root_element");Ka.style.overflow="hidden";for(var b=null,f;f=Ka.lastChild;)b||=
|
||||
f,Ka.removeChild(f);M=document.createElement("div");M.classList.add("_eaglercraftX_wrapper_element");M.style.position="relative";M.style.width="100%";M.style.height="100%";M.style.overflow="hidden";M.style.backgroundColor="black";Ka.appendChild(M);b&&(b.style.position="absolute",b.style.top="0px",b.style.left="0px",b.style.right="0px",b.style.bottom="0px",b.style.zIndex="2",b.classList.add("_eaglercraftX_early_splash_element"),M.appendChild(b));await sa(10);f=window.devicePixelRatio;b=f*M.clientWidth|
|
||||
0;f=f*M.clientHeight|0;c("Initializing audio context");if("function"===typeof document.exitPointerLock){var g=navigator.userAgent;null!==g?(g=g.toLowerCase(),Qa=-1!==g.indexOf("mobi")||-1!==g.indexOf("tablet")):Qa=!1}else Qa=!0;var r=null;!Qa&&navigator.userActivation&&navigator.userActivation.hasBeenActive?a():(g=document.createElement("div"),g.classList.add("_eaglercraftX_press_any_key_image"),g.style.position="absolute",g.style.top="0px",g.style.left="0px",g.style.right="0px",g.style.bottom="0px",
|
||||
g.style.width="100%",g.style.height="100%",g.style.zIndex="3",g.style.touchAction="pan-x pan-y",g.style.background='center / contain no-repeat url("'+Ha+'"), left / 1000000% 100% no-repeat url("'+Ha+'") white',g.style.setProperty("image-rendering","pixelated"),M.appendChild(g),await new Promise(function(D,J){function G(){if(!N){N=!0;Qa?M.removeChild(O):(window.removeEventListener("keydown",G),M.removeEventListener("mousedown",G),M.removeEventListener("touchstart",G));try{a()}catch(B){J(B);return}D()}}
|
||||
g.style.width="100%",g.style.height="100%",g.style.zIndex="3",g.style.touchAction="pan-x pan-y",g.style.background='center / contain no-repeat url("'+Fa+'"), left / 1000000% 100% no-repeat url("'+Fa+'") white',g.style.setProperty("image-rendering","pixelated"),M.appendChild(g),await new Promise(function(D,J){function G(){if(!N){N=!0;Qa?M.removeChild(O):(window.removeEventListener("keydown",G),M.removeEventListener("mousedown",G),M.removeEventListener("touchstart",G));try{a()}catch(B){J(B);return}D()}}
|
||||
var N=!1;if(Qa){var O=document.createElement("div");O.classList.add("_eaglercraftX_mobile_press_any_key");O.setAttribute("style","position:absolute;background-color:white;font-family:sans-serif;top:10%;left:10%;right:10%;bottom:10%;border:5px double black;padding:calc(5px + 7vh) 15px;text-align:center;font-size:20px;user-select:none;z-index:10;");O.innerHTML='<h3 style="margin-block-start:0px;margin-block-end:0px;margin:20px 5px;">Mobile Browser Detected</h3><p style="margin-block-start:0px;margin-block-end:0px;margin:20px 5px;">Warning: EaglercraftX WASM-GC requires a lot of memory and may not be stable on most mobile devices!</p><p style="margin-block-start:0px;margin-block-end:0px;margin:20px 2px;"><button style="font: 24px sans-serif;font-weight:bold;" class="_eaglercraftX_mobile_launch_client">Launch EaglercraftX</button></p><p style="margin-block-start:0px;margin-block-end:0px;margin:25px 5px;">(Tablets and phones with large screens work best)</p>';
|
||||
O.querySelector("._eaglercraftX_mobile_launch_client").addEventListener("click",G);M.appendChild(O)}else window.addEventListener("keydown",G),M.addEventListener("mousedown",G),M.addEventListener("touchstart",G)}),M.removeChild(g));r?Ab(r):Bb();c("Creating main canvas");R=document.createElement("canvas");R.classList.add("_eaglercraftX_canvas_element");R.style.width="100%";R.style.height="100%";R.style.zIndex="1";R.style.touchAction="pan-x pan-y";R.style.setProperty("-webkit-touch-callout","none");
|
||||
R.style.setProperty("-webkit-tap-highlight-color","rgba(255, 255, 255, 0)");R.style.setProperty("image-rendering","pixelated");R.width=b;R.height=f;M.appendChild(R);await Cb();c("Creating WebGL context");M.addEventListener("webglcontextcreationerror",function(D){k("[WebGL Error]: {}",D.statusMessage)});b={antialias:!1,depth:!1,powerPreference:"high-performance",desynchronized:!0,preserveDrawingBuffer:!1,premultipliedAlpha:!1,alpha:!1};g=!1;if(rb){c("Note: Forcing WebGL 2.0 context");f=300;var u=R.getContext("webgl2",
|
||||
b);if(!u)return Db("WebGL 2.0 is not supported on this device!"),!1}else if(Xa){if(c("Note: Forcing WebGL 1.0 context"),f=200,u=R.getContext("webgl",b),!u)if(sb){if(g=!0,u=R.getContext("experimental-webgl",b),!u)return Db("WebGL is not supported on this device!"),!1}else return Db("WebGL is not supported on this device!"),!1}else if(f=300,u=R.getContext("webgl2",b),!u&&(f=200,u=R.getContext("webgl",b),!u))if(sb){if(g=!0,u=R.getContext("experimental-webgl",b),!u)return Db("WebGL is not supported on this device!"),
|
||||
!1}else return Db("WebGL is not supported on this device!"),!1;g&&alert('WARNING: Detected "experimental" WebGL 1.0 support, certain graphics API features may be missing, and therefore EaglercraftX may malfunction and crash!');Pa=f;La=u;Oa=g;Eb(u,f);c("OpenGL Version: {}",H.glGetString(7938));c("OpenGL Renderer: {}",H.glGetString(7937));b=H.dumpActiveExtensions();if(0===b.length)c("Unlocked the following OpenGL ES extensions: (NONE)");else for(b.sort(),c("Unlocked the following OpenGL ES extensions:"),
|
||||
R.style.setProperty("-webkit-tap-highlight-color","rgba(255, 255, 255, 0)");R.style.setProperty("image-rendering","pixelated");R.width=b;R.height=f;M.appendChild(R);await Cb();c("Creating WebGL context");M.addEventListener("webglcontextcreationerror",function(D){k("[WebGL Error]: {}",D.statusMessage)});b={antialias:!1,depth:!1,powerPreference:"high-performance",desynchronized:!0,preserveDrawingBuffer:!1,premultipliedAlpha:!1,alpha:!1};g=!1;if(Ya){c("Note: Forcing WebGL 2.0 context");f=300;var u=R.getContext("webgl2",
|
||||
b);if(!u)return Db("WebGL 2.0 is not supported on this device!"),!1}else if(Xa){if(c("Note: Forcing WebGL 1.0 context"),f=200,u=R.getContext("webgl",b),!u)if(Za){if(g=!0,u=R.getContext("experimental-webgl",b),!u)return Db("WebGL is not supported on this device!"),!1}else return Db("WebGL is not supported on this device!"),!1}else if(f=300,u=R.getContext("webgl2",b),!u&&(f=200,u=R.getContext("webgl",b),!u))if(Za){if(g=!0,u=R.getContext("experimental-webgl",b),!u)return Db("WebGL is not supported on this device!"),
|
||||
!1}else return Db("WebGL is not supported on this device!"),!1;g&&alert('WARNING: Detected "experimental" WebGL 1.0 support, certain graphics API features may be missing, and therefore EaglercraftX may malfunction and crash!');Pa=f;La=u;Ma=g;Eb(u,f);c("OpenGL Version: {}",H.glGetString(7938));c("OpenGL Renderer: {}",H.glGetString(7937));b=H.dumpActiveExtensions();if(0===b.length)c("Unlocked the following OpenGL ES extensions: (NONE)");else for(b.sort(),c("Unlocked the following OpenGL ES extensions:"),
|
||||
f=0;f<b.length;++f)c(" - {}",b[f]);H.glClearColor(0,0,0,1);H.glClear(16384);await sa(20);c("EagRuntime JS context initialization complete");return!0}
|
||||
async function Fb(){vb();ka=function(a,b){postMessage({ch:"~!LOGGER",txt:a,err:b})};c("Initializing EagRuntime worker JS context...");await yb();y(A,"setClipboard");y(A,"getClipboard");y(A,"displayFileChooser");y(A,"fileChooserHasResult");y(A,"getFileChooserResult");y(A,"clearFileChooserResult");y(A,"downloadFileWithNameU8");y(A,"downloadFileWithNameA");y(A,"downloadScreenshot");y(A,"showDebugConsole");y(A,"addLogMessage");y(A,"isShowingDebugConsole");y(A,"getFaviconURL");Bb();y(F,"keyboardLayoutSupported");
|
||||
y(F,"iterateKeyboardLayout");y(F,"updateCanvasSize");y(F,"updatePlatformAndSleep");y(F,"isVSyncSupported");y(F,"mouseSetGrabbed");y(F,"isMouseGrabSupported");y(F,"isMouseGrabbed");y(F,"isPointerLocked");y(F,"supportsFullscreen");y(F,"toggleFullscreen");y(F,"isFullscreen");y(F,"touchSetOpenKeyboardZone");y(F,"touchCloseDeviceKeyboard");y(F,"touchIsDeviceKeyboardOpenMAYBE");y(F,"gamepadSupported");y(F,"isVisualViewport");y(H,"getCapBits");y(H,"glEnable");y(H,"glDisable");y(H,"glClearColor");y(H,"glClearDepth");
|
||||
@ -34,7 +34,7 @@ b.appendChild(f);b.appendChild(g);g.innerHTML='<h2><svg style="vertical-align:mi
|
||||
(new Date).toLocaleString()+'</p><p><br /><span style="font-size:1.1em;border-bottom:1px dashed #AAAAAA;padding-bottom:5px;">Things you can try:</span></p><ol><li><span style="font-weight:bold;">Just try using Eaglercraft on a different device</span>, it isn\'t a bug it\'s common sense</li><li style="margin-top:7px;">If this screen just appeared randomly, try restarting your browser or device</li><li style="margin-top:7px;">If you are not using Chrome/Edge, try installing the latest Google Chrome</li><li style="margin-top:7px;">If your browser is out of date, please update it to the latest version</li></ol></div>';
|
||||
g.querySelector("#_eaglercraftX_crashReason").appendChild(document.createTextNode(a));try{var r=window.navigator.userAgent}catch(D){r="<error>"}g.querySelector("#_eaglercraftX_crashUserAgent").appendChild(document.createTextNode(r));Ta&&Ta();window.__curEaglerX188UnloadListenerCB=null;a="No GL_RENDERER string could be queried";try{const D=document.createElement("canvas");D.width=64;D.height=64;const J=D.getContext("webgl");if(J){if(J.getExtension("WEBGL_debug_renderer_info"))var u=J.getParameter(37446);
|
||||
else(u=J.getParameter(WebGLRenderingContext.RENDERER))&&(u+=" [masked]");u&&(a=u)}}catch(D){}g.querySelector("#_eaglercraftX_crashWebGL").appendChild(document.createTextNode(a))}else alert("Compatibility error: "+a)}}var Rb=null;
|
||||
function Lb(){if(Rb)return Rb;try{var a=La,b=Oa;if(!a){b=!1;var f=document.createElement("canvas");f.width=64;f.height=64;a=f.getContext("webgl2");a||(a=f.getContext("webgl"),a||(b=!0,a=f.getContext("experimental-webgl")))}return a?(f="",0<Pa&&(f+="webgl.version = "+a.getParameter(7938)+"\n"),f=a.getExtension("WEBGL_debug_renderer_info")?f+("webgl.renderer = "+a.getParameter(37446)+"\nwebgl.vendor = "+a.getParameter(37445)+"\n"):f+("webgl.renderer = "+a.getParameter(7937)+" [masked]\nwebgl.vendor = "+
|
||||
function Lb(){if(Rb)return Rb;try{var a=La,b=Ma;if(!a){b=!1;var f=document.createElement("canvas");f.width=64;f.height=64;a=f.getContext("webgl2");a||(a=f.getContext("webgl"),a||(b=!0,a=f.getContext("experimental-webgl")))}return a?(f="",0<Pa&&(f+="webgl.version = "+a.getParameter(7938)+"\n"),f=a.getExtension("WEBGL_debug_renderer_info")?f+("webgl.renderer = "+a.getParameter(37446)+"\nwebgl.vendor = "+a.getParameter(37445)+"\n"):f+("webgl.renderer = "+a.getParameter(7937)+" [masked]\nwebgl.vendor = "+
|
||||
a.getParameter(7936)+" [masked]\n"),0<Pa?(f+="\nwebgl.version.id = "+Pa+"\nwebgl.experimental = "+b,200===Pa?f+="\nwebgl.ext.ANGLE_instanced_arrays = "+!!a.getExtension("ANGLE_instanced_arrays")+"\nwebgl.ext.EXT_color_buffer_half_float = "+!!a.getExtension("EXT_color_buffer_half_float")+"\nwebgl.ext.EXT_shader_texture_lod = "+!!a.getExtension("EXT_shader_texture_lod")+"\nwebgl.ext.OES_fbo_render_mipmap = "+!!a.getExtension("OES_fbo_render_mipmap")+"\nwebgl.ext.OES_texture_float = "+!!a.getExtension("OES_texture_float")+
|
||||
"\nwebgl.ext.OES_texture_half_float = "+!!a.getExtension("OES_texture_half_float")+"\nwebgl.ext.OES_texture_half_float_linear = "+!!a.getExtension("OES_texture_half_float_linear"):300<=Pa&&(f+="\nwebgl.ext.EXT_color_buffer_float = "+!!a.getExtension("EXT_color_buffer_float")+"\nwebgl.ext.EXT_color_buffer_half_float = "+!!a.getExtension("EXT_color_buffer_half_float")+"\nwebgl.ext.OES_texture_float_linear = "+!!a.getExtension("OES_texture_float_linear")),f+="\nwebgl.ext.EXT_texture_filter_anisotropic = "+
|
||||
!!a.getExtension("EXT_texture_filter_anisotropic")+"\n"):f+="webgl.ext.ANGLE_instanced_arrays = "+!!a.getExtension("ANGLE_instanced_arrays")+"\nwebgl.ext.EXT_color_buffer_float = "+!!a.getExtension("EXT_color_buffer_float")+"\nwebgl.ext.EXT_color_buffer_half_float = "+!!a.getExtension("EXT_color_buffer_half_float")+"\nwebgl.ext.EXT_shader_texture_lod = "+!!a.getExtension("EXT_shader_texture_lod")+"\nwebgl.ext.OES_fbo_render_mipmap = "+!!a.getExtension("OES_fbo_render_mipmap")+"\nwebgl.ext.OES_texture_float = "+
|
||||
@ -64,10 +64,10 @@ ya.eaglerExists=new WebAssembly.Suspending(function(a,b){return new Promise(func
|
||||
ya.eaglerCopy=new WebAssembly.Suspending(async function(a,b,f){return(b=await bc(a,b))&&await cc(a,f,b)});ya.eaglerSize=new WebAssembly.Suspending(function(a,b){return new Promise(function(f){const g=a.transaction("filesystem","readonly").objectStore("filesystem").get([b]);g.addEventListener("success",function(){const r=$b(g.result);f(r?r.byteLength:-1)});g.addEventListener("error",function(){f(-1)})})});
|
||||
function dc(a){if(0===a.length)return-1;for(var b=0,f=0,g=a.length;f<g;++f)47===a.charCodeAt(f)&&++b;return b}
|
||||
ya.eaglerIterate=new WebAssembly.Suspending(function(a,b,f){return new Promise(function(g){const r=[],u=a.transaction("filesystem","readonly").objectStore("filesystem").openCursor(),D=0===b.length,J=f?-1:dc(b);u.addEventListener("success",function(){const G=u.result;if(null===G||null===G.key)g({length:r.length,getRow:function(O){return r[O]}});else{var N=Zb(G.key);null!=N&&(!D&&!N.startsWith(b)||!f&&dc(N)!==J||r.push(N));G.continue()}});u.addEventListener("error",function(){g(null)})})});async function Cb(){function a(){var e=window.devicePixelRatio;.01>e&&(e=1);ha=X=0;for(var t=R;t&&!isNaN(t.offsetLeft)&&!isNaN(t.offsetTop);)X+=t.offsetLeft-t.scrollLeft,ha+=t.offsetTop-t.scrollTop,t=t.offsetParent;t=M.clientWidth*e|0;var Q=M.clientHeight*e|0,K=0,U=0,ja=t,fa=Q;if(aa){fa=window.visualViewport;var V=fa.scale;K=fa.pageLeft*e*V;U=fa.pageTop*e*V;ja=fa.width*e*V;fa=fa.height*e*V;1>ja&&(ja=1);1>fa&&(fa=1);0>K?(ja+=K,K=0):K>=t&&(K=t-1);0>U?(fa+=U,U=0):U>=Q&&(U=Q-1);K+ja>t&&(ja=t-K);U+fa>
|
||||
Q&&(fa=Q-U)}V={eventTypeMask:0};L!==e&&(L=e,V.eventTypeMask|=4,V.windowDPI=e);if(C!==t||T!==Q)C=t,T=Q,V.eventTypeMask|=1,V.windowWidth=t,V.windowHeight=Q;if(ia!==K||Ma!==U||za!==ja||Na!==fa)ia=K,Ma=U,za=ja,Na=fa,V.eventTypeMask|=2,V.visualViewportX=K,V.visualViewportY=U,V.visualViewportW=ja,V.visualViewportH=fa;0!==V.eventTypeMask&&Y(0,9,V)}function b(e){const t=e.length,Q=Array(t);for(var K=0;K<t;++K){const U=e.item(K);Q[K]={pointX:U.pageX-X,pointY:U.pageY-ha,radius:.5*(U.radiusX+U.radiusY),force:U.force,
|
||||
Q&&(fa=Q-U)}V={eventTypeMask:0};L!==e&&(L=e,V.eventTypeMask|=4,V.windowDPI=e);if(C!==t||T!==Q)C=t,T=Q,V.eventTypeMask|=1,V.windowWidth=t,V.windowHeight=Q;if(ia!==K||Na!==U||Aa!==ja||Oa!==fa)ia=K,Na=U,Aa=ja,Oa=fa,V.eventTypeMask|=2,V.visualViewportX=K,V.visualViewportY=U,V.visualViewportW=ja,V.visualViewportH=fa;0!==V.eventTypeMask&&Y(0,9,V)}function b(e){const t=e.length,Q=Array(t);for(var K=0;K<t;++K){const U=e.item(K);Q[K]={pointX:U.pageX-X,pointY:U.pageY-ha,radius:.5*(U.radiusX+U.radiusY),force:U.force,
|
||||
pointUID:U.identifier}}return Q}function f(e,t){return{eventType:e,keyCode:t.code||null,keyName:t.key||null,legacyCode:"number"===typeof t.which?t.which:"number"===typeof t.keyCode?t.keyCode:0,location:t.location,mods:(t.ctrlKey?1:0)|(t.shiftKey?2:0)|(t.metaKey?4:0)}}function g(){return new Promise(function(e){if(-1!==E)throw Error("Main thread is already waiting for VSync!");const t=[!1];window.requestAnimationFrame(function(){t[0]||(t[0]=!0,-1!==E&&(window.clearTimeout(E),E=-1),e())});E=window.setTimeout(function(){t[0]||
|
||||
(t[0]=!0,E=-1,e())},20)})}function r(e){return new Promise(function(t){setTimeout(t,e)})}function u(e){if(0<e&&1E3>=e){const Q=1E3/e;if(0===ba)ba=performance.now()+Q;else{e=performance.now();var t=ba-e|0;if(0<t)return!ub&&ec?fc().then(function(){var K=performance.now(),U=ba-K|0;if(0<U)return r(U).then(function(){var ja=performance.now();(ba+=Q)<ja&&(ba=ja)});(ba+=Q)<K&&(ba=K)}):r(t).then(function(){var K=performance.now();(ba+=Q)<K&&(ba=K)});(ba+=Q)<e&&(ba=e)}}else ba=0;return ub?gc(0):fc()}function D(e){if(ta){pa=
|
||||
!!e;var t=performance.now()|0;if(e){Aa=!0;try{R.requestPointerLock()}catch(Q){}-1!==ma&&window.clearTimeout(ma);ma=-1;3E3>t-Fa&&(ma=window.setTimeout(function(){try{R.requestPointerLock()}catch(Q){}},3100-(t-Fa)))}else if(-1!==ma&&window.clearTimeout(ma),ma=-1,!Aa)try{document.exitPointerLock()}catch(Q){}}}function J(){if(ca)if(h.matches){if(m)try{navigator.keyboard.unlock()}catch(e){}try{document.exitFullscreen()}catch(e){}}else{if(m)try{navigator.keyboard.lock()}catch(e){}try{R.requestFullscreen()}catch(e){}}}
|
||||
!!e;var t=performance.now()|0;if(e){Ba=!0;try{R.requestPointerLock()}catch(Q){}-1!==ma&&window.clearTimeout(ma);ma=-1;3E3>t-Ga&&(ma=window.setTimeout(function(){try{R.requestPointerLock()}catch(Q){}},3100-(t-Ga)))}else if(-1!==ma&&window.clearTimeout(ma),ma=-1,!Ba)try{document.exitPointerLock()}catch(Q){}}}function J(){if(ca)if(h.matches){if(m)try{navigator.keyboard.unlock()}catch(e){}try{document.exitFullscreen()}catch(e){}}else{if(m)try{navigator.keyboard.lock()}catch(e){}try{R.requestFullscreen()}catch(e){}}}
|
||||
function G(){O()?N():d?(d.blur(),d.value="",setTimeout(function(){d&&(p?p.removeChild(d):d.remove(),d=null);p&&(M.removeChild(p),p=null)},10)):(p&&(M.removeChild(p),p=null),p=document.createElement("form"),p.setAttribute("autocomplete","off"),p.classList.add("_eaglercraftX_text_input_wrapper"),p.style.position="absolute",p.style.top="0px",p.style.left="0px",p.style.right="0px",p.style.bottom="0px",p.style.zIndex="-100",p.style.margin="0px",p.style.padding="0px",p.style.border="none",p.addEventListener("submit",
|
||||
function(e){e.preventDefault();e.stopPropagation();e=e.timeStamp;e&&(0!==w&&10>e-w||0!==l&&10>e-l||0!==z&&10>e-z)||(n||(c("Note: Generating return keystroke from submit event on form, this browser probably doesn't generate keydown/beforeinput/input when enter/return is pressed on the on-screen keyboard"),n=!0),Y(0,3,{eventType:0,absoluteCode:28,absoluteChar:10}))}),d=document.createElement("input"),d.type="password",d.value=" ",d.classList.add("_eaglercraftX_text_input_element"),d.setAttribute("autocomplete",
|
||||
"off"),d.style.position="absolute",d.style.top="0px",d.style.left="0px",d.style.right="0px",d.style.bottom="0px",d.style.zIndex="-100",d.style.margin="0px",d.style.padding="0px",d.style.border="none",d.style.setProperty("-webkit-touch-callout","default"),d.addEventListener("beforeinput",function(e){if(d===e.target){q||(c("Note: Caught beforeinput event from on-screen keyboard, browser probably does not generate global keydown/keyup events on text fields, or does not respond to cancelling keydown"),
|
||||
@ -75,25 +75,25 @@ q=!0);var t=e.timeStamp;if(t){if(0!==w&&10>t-w)return;l=t}e.preventDefault();e.s
|
||||
3,{eventType:0,absoluteCode:211,absoluteChar:0});break;case "insertText":case "insertCompositionText":case "insertReplacementText":(e=e.data)&&0<e.length&&Y(0,3,{eventType:1,codepoints:e});break;case "insertFromPaste":case "insertFromPasteAsQuotation":case "insertFromDrop":case "insertFromYank":case "insertLink":(e=e.data)&&0<e.length&&Y(0,4,e);break;case "historyUndo":case "historyRedo":case "deleteByDrag":case "deleteByCut":break;default:c('Ignoring InputEvent.inputType "{}" from on-screen keyboard',
|
||||
e.inputType)}}}),d.addEventListener("input",function(e){if(d===e.target){v||(c("Note: Caught legacy input events from on-screen keyboard, browser could be outdated and doesn't support beforeinput event, or does not respond to cancelling beforeinput"),v=!0);if(e=e.timeStamp){if(0!==w&&10>e-w||0!==l&&10>e-l)return;z=e}e=d.value;var t=e.length;0===t?Y(0,3,{eventType:0,absoluteCode:14,absoluteChar:0}):1===t?Y(0,3,{eventType:1,codepoints:e}):(e=e.trim(),t=e.length,0===t?Y(0,3,{eventType:0,absoluteCode:57,
|
||||
absoluteChar:32}):Y(0,3,{eventType:1,codepoints:e.charAt(t-1)}));d.value=" ";d.setSelectionRange(1,1)}}),d.addEventListener("focus",function(e){d===e.target&&(d.value=" ",d.setSelectionRange(1,1))}),d.addEventListener("select",function(e){d===e.target&&(e.preventDefault(),e.stopPropagation(),d.value=" ",d.setSelectionRange(1,1))}),p.appendChild(d),M.appendChild(p),d.value=" ",d.focus(),d.select(),d.setSelectionRange(1,1))}function N(){if(d){d.blur();d.value="";const e=d,t=p;window.setTimeout(function(){null!==
|
||||
t?(t.removeChild(e),t.remove()):e.remove()},10);p=d=null}else p&&(M?M.removeChild(p):p.remove(),p=null)}function O(){return!!d&&document.activeElement===d}var B=null,X=0,ha=0,p=null,d=null,q=!1,v=!1,n=!1,w=0,l=0,z=0,C=-1,T=-1,L=-1,aa=!1,ia=-1,Ma=-1,za=-1,Na=-1,ta=!1,pa=!1,Aa=!1,Fa=0,ma=-1,ca=!1,h=null,m=!1,x=!1,E=-1,P=!1,W=null,na=null,Ga=null,Ya=null,Za=null,$a=null,ab=null,bb=null,cb=null,db=null,eb=null,fb=null,gb=null,hb=null,ib=null,jb=null,kb=null,lb=null,mb=null,nb=null,ob=null,pb=null,qb=
|
||||
t?(t.removeChild(e),t.remove()):e.remove()},10);p=d=null}else p&&(M?M.removeChild(p):p.remove(),p=null)}function O(){return!!d&&document.activeElement===d}var B=null,X=0,ha=0,p=null,d=null,q=!1,v=!1,n=!1,w=0,l=0,z=0,C=-1,T=-1,L=-1,aa=!1,ia=-1,Na=-1,Aa=-1,Oa=-1,ta=!1,pa=!1,Ba=!1,Ga=0,ma=-1,ca=!1,h=null,m=!1,x=!1,E=-1,P=!1,W=null,na=null,Ha=null,$a=null,ab=null,bb=null,cb=null,db=null,eb=null,fb=null,gb=null,hb=null,ib=null,jb=null,kb=null,lb=null,mb=null,nb=null,ob=null,pb=null,qb=null,rb=null,sb=
|
||||
null;B=document.createElement("div");B.classList.add("_eaglercraftX_keyboard_open_zone");B.style.display="none";B.style.position="absolute";B.style.backgroundColor="transparent";B.style.top="0px";B.style.left="0px";B.style.width="0px";B.style.height="0px";B.style.zIndex="100";B.style.touchAction="pan-x pan-y";B.style.setProperty("-webkit-touch-callout","none");B.style.setProperty("-webkit-tap-highlight-color","rgba(255, 255, 255, 0)");M.appendChild(B);a();M.addEventListener("contextmenu",W=function(e){e.preventDefault();
|
||||
e.stopPropagation()});R.addEventListener("mousedown",na=function(e){e.preventDefault();e.stopPropagation();ta&&pa&&document.pointerLockElement!==R?D(1):Y(0,0,{eventType:0,posX:e.offsetX,posY:e.offsetY,button:e.button})});R.addEventListener("mouseup",Ga=function(e){e.preventDefault();e.stopPropagation();Y(0,0,{eventType:1,posX:e.offsetX,posY:e.offsetY,button:e.button})});R.addEventListener("mousemove",Ya=function(e){e.preventDefault();e.stopPropagation();Y(0,0,{eventType:2,posX:e.offsetX,posY:e.offsetY,
|
||||
movementX:e.movementX,movementY:e.movementY})});R.addEventListener("mouseenter",Za=function(){Y(0,7,null)});R.addEventListener("mouseleave",$a=function(){Y(0,8,null)});R.addEventListener("touchstart",ab=function(e){e.preventDefault();e.stopPropagation();Y(0,2,{eventType:0,changedTouches:b(e.changedTouches),targetTouches:b(e.targetTouches)});N()});R.addEventListener("touchend",bb=function(e){e.preventDefault();e.stopPropagation();Y(0,2,{eventType:2,changedTouches:b(e.changedTouches),targetTouches:b(e.targetTouches)})});
|
||||
R.addEventListener("touchmove",cb=function(e){e.preventDefault();e.stopPropagation();Y(0,2,{eventType:1,changedTouches:b(e.changedTouches),targetTouches:b(e.targetTouches)})});R.addEventListener("touchcancel",db=function(e){Y(0,2,{eventType:2,changedTouches:b(e.changedTouches),targetTouches:b(e.targetTouches)})});R.addEventListener("wheel",lb=function(e){e.preventDefault();e.stopPropagation();Y(0,0,{eventType:3,posX:e.offsetX,posY:e.offsetY,wheel:e.deltaY})});window.addEventListener("blur",nb=function(){Y(0,
|
||||
6,null)});window.addEventListener("focus",mb=function(){Y(0,5,null)});window.addEventListener("keydown",gb=function(e){e.preventDefault();e.stopPropagation();"F11"!==e.key||e.repeat?(Y(0,1,f(e.repeat?2:0,e)),e.timeStamp&&"Unidentified"!==e.key&&(w=e.timeStamp)):J()});window.addEventListener("keyup",hb=function(e){e.preventDefault();e.stopPropagation();Y(0,1,f(1,e))});B.addEventListener("touchstart",ib=function(e){e.preventDefault();e.stopPropagation()});B.addEventListener("touchend",jb=function(e){e.preventDefault();
|
||||
e.stopPropagation();G()});B.addEventListener("touchmove",kb=function(e){e.preventDefault();e.stopPropagation()});(ta="function"===typeof document.exitPointerLock)?(document.addEventListener("pointerlockchange",ob=function(){window.setTimeout(function(){const e=document.pointerLockElement===R;e||pa&&(Fa=performance.now()|0);pa=e},60);Aa=!1}),document.addEventListener("pointerlockerror",pb=function(){Aa=!1})):k("Pointer lock is not supported on this browser");(ca="function"===typeof document.exitFullscreen)?
|
||||
(h=window.matchMedia("(display-mode: fullscreen)"),(m=!(!navigator.keyboard||!navigator.keyboard.lock))&&h.addEventListener("change",qb=function(){h.matches||navigator.keyboard.unlock()})):k("Fullscreen is not supported on this browser");if("undefined"!==typeof window.visualViewport)if("body"===Ka.tagName.toLowerCase())aa=!0;else{const e=document.body;10>=Math.abs(e.clientWidth-M.clientWidth)&&10>=Math.abs(e.clientHeight-M.clientHeight)&&(aa=!0)}else aa=!1;aa&&c("Note: Detected game is embedded in body, some screens may be resized to window.visualViewport instead for a better mobile experience");
|
||||
try{await g(),x=!0}catch(e){x=!1}x||k("VSync is not supported on this browser");(P="function"===typeof navigator.getGamepads)?(window.addEventListener("gamepadconnected",eb=function(){Y(0,10,{eventType:0})}),window.addEventListener("gamepaddisconnected",fb=function(e){Y(0,10,{eventType:1,gamepad:e.gamepad})})):k("Gamepad detected as unsupported!");F.keyboardLayoutSupported=function(){return!(!navigator.keyboard||!navigator.keyboard.getLayoutMap)};F.iterateKeyboardLayout=new WebAssembly.Suspending(async function(){const e=
|
||||
e.stopPropagation()});R.addEventListener("mousedown",na=function(e){e.preventDefault();e.stopPropagation();ta&&pa&&document.pointerLockElement!==R?D(1):Y(0,0,{eventType:0,posX:e.offsetX,posY:e.offsetY,button:e.button})});R.addEventListener("mouseup",Ha=function(e){e.preventDefault();e.stopPropagation();Y(0,0,{eventType:1,posX:e.offsetX,posY:e.offsetY,button:e.button})});R.addEventListener("mousemove",$a=function(e){e.preventDefault();e.stopPropagation();Y(0,0,{eventType:2,posX:e.offsetX,posY:e.offsetY,
|
||||
movementX:e.movementX,movementY:e.movementY})});R.addEventListener("mouseenter",ab=function(){Y(0,7,null)});R.addEventListener("mouseleave",bb=function(){Y(0,8,null)});R.addEventListener("touchstart",cb=function(e){e.preventDefault();e.stopPropagation();Y(0,2,{eventType:0,changedTouches:b(e.changedTouches),targetTouches:b(e.targetTouches)});N()});R.addEventListener("touchend",db=function(e){e.preventDefault();e.stopPropagation();Y(0,2,{eventType:2,changedTouches:b(e.changedTouches),targetTouches:b(e.targetTouches)})});
|
||||
R.addEventListener("touchmove",eb=function(e){e.preventDefault();e.stopPropagation();Y(0,2,{eventType:1,changedTouches:b(e.changedTouches),targetTouches:b(e.targetTouches)})});R.addEventListener("touchcancel",fb=function(e){Y(0,2,{eventType:2,changedTouches:b(e.changedTouches),targetTouches:b(e.targetTouches)})});R.addEventListener("wheel",nb=function(e){e.preventDefault();e.stopPropagation();Y(0,0,{eventType:3,posX:e.offsetX,posY:e.offsetY,wheel:e.deltaY})});window.addEventListener("blur",pb=function(){Y(0,
|
||||
6,null)});window.addEventListener("focus",ob=function(){Y(0,5,null)});window.addEventListener("keydown",ib=function(e){e.preventDefault();e.stopPropagation();"F11"!==e.key||e.repeat?(Y(0,1,f(e.repeat?2:0,e)),e.timeStamp&&"Unidentified"!==e.key&&(w=e.timeStamp)):J()});window.addEventListener("keyup",jb=function(e){e.preventDefault();e.stopPropagation();Y(0,1,f(1,e))});B.addEventListener("touchstart",kb=function(e){e.preventDefault();e.stopPropagation()});B.addEventListener("touchend",lb=function(e){e.preventDefault();
|
||||
e.stopPropagation();G()});B.addEventListener("touchmove",mb=function(e){e.preventDefault();e.stopPropagation()});(ta="function"===typeof document.exitPointerLock)?(document.addEventListener("pointerlockchange",qb=function(){window.setTimeout(function(){const e=document.pointerLockElement===R;e||pa&&(Ga=performance.now()|0);pa=e},60);Ba=!1}),document.addEventListener("pointerlockerror",rb=function(){Ba=!1})):k("Pointer lock is not supported on this browser");(ca="function"===typeof document.exitFullscreen)?
|
||||
(h=window.matchMedia("(display-mode: fullscreen)"),(m=!(!navigator.keyboard||!navigator.keyboard.lock))&&h.addEventListener("change",sb=function(){h.matches||navigator.keyboard.unlock()})):k("Fullscreen is not supported on this browser");if("undefined"!==typeof window.visualViewport)if("body"===Ka.tagName.toLowerCase())aa=!0;else{const e=document.body;10>=Math.abs(e.clientWidth-M.clientWidth)&&10>=Math.abs(e.clientHeight-M.clientHeight)&&(aa=!0)}else aa=!1;aa&&c("Note: Detected game is embedded in body, some screens may be resized to window.visualViewport instead for a better mobile experience");
|
||||
try{await g(),x=!0}catch(e){x=!1}x||k("VSync is not supported on this browser");(P="function"===typeof navigator.getGamepads)?(window.addEventListener("gamepadconnected",gb=function(){Y(0,10,{eventType:0})}),window.addEventListener("gamepaddisconnected",hb=function(e){Y(0,10,{eventType:1,gamepad:e.gamepad})})):k("Gamepad detected as unsupported!");F.keyboardLayoutSupported=function(){return!(!navigator.keyboard||!navigator.keyboard.getLayoutMap)};F.iterateKeyboardLayout=new WebAssembly.Suspending(async function(){const e=
|
||||
[];try{const t=await navigator.keyboard.getLayoutMap();t&&t.forEach&&t.forEach(function(Q,K){e.push({key:Q,value:K})})}catch(t){}return e});F.updateCanvasSize=function(e,t){R.width!==e&&(R.width=e);R.height!==t&&(R.height=t)};var ba=0;F.updatePlatformAndSleep=new WebAssembly.Suspending(function(e,t){a();if("string"!==typeof document.visibilityState||"visible"===document.visibilityState)return x&&t?(ba=0,g()):0>=e?(ba=0,ub?gc(0):fc()):u(e);ba=0;return r(50)});F.isVSyncSupported=function(){return x};
|
||||
F.mouseSetGrabbed=D;F.isMouseGrabSupported=function(){return ta};F.isMouseGrabbed=function(){return pa};F.isPointerLocked=function(){return ta&&(Aa||document.pointerLockElement===R)};F.supportsFullscreen=function(){return ca};F.toggleFullscreen=J;F.isFullscreen=function(){return ca&&h.matches};F.touchSetOpenKeyboardZone=function(e,t,Q,K){0!==Q&&0!==K?(B.style.display="block",B.style.top=""+(T-t-K)/L+"px",B.style.left=""+e/L+"px",B.style.width=""+Q/L+"px",B.style.height=""+K/L+"px"):(B.style.display=
|
||||
"none",B.style.top="0px",B.style.left="0px",B.style.width="0px",B.style.height="0px")};F.touchCloseDeviceKeyboard=N;F.touchIsDeviceKeyboardOpenMAYBE=O;F.gamepadSupported=function(){return P};F.isVisualViewport=function(){return aa};Ta=function(){try{W&&(M.removeEventListener("contextmenu",W),W=null),na&&(R.removeEventListener("mousedown",na),na=null),Ga&&(R.removeEventListener("mouseup",Ga),Ga=null),Ya&&(R.removeEventListener("mousemove",Ya),Ya=null),Za&&(R.removeEventListener("mouseenter",Za),Za=
|
||||
null),$a&&(R.removeEventListener("mouseleave",$a),$a=null),ab&&(R.removeEventListener("touchstart",ab),ab=null),bb&&(R.removeEventListener("touchend",bb),bb=null),cb&&(R.removeEventListener("touchmove",cb),cb=null),db&&(R.removeEventListener("touchcancel",db),db=null),eb&&(window.removeEventListener("gamepadconnected",eb),eb=null),fb&&(window.removeEventListener("gamepaddisconnected",fb),fb=null),gb&&(window.removeEventListener("keydown",gb),gb=null),hb&&(window.removeEventListener("keyup",hb),hb=
|
||||
null),ib&&(B.removeEventListener("touchstart",ib),ib=null),jb&&(B.removeEventListener("touchend",jb),jb=null),kb&&(B.removeEventListener("touchmove",kb),kb=null),lb&&(R.removeEventListener("wheel",lb),lb=null),mb&&(window.removeEventListener("focus",mb),mb=null),nb&&(window.removeEventListener("blur",nb),nb=null),ob&&(document.removeEventListener("pointerlockchange",ob),ob=null),pb&&(document.removeEventListener("pointerlockerror",pb),pb=null),qb&&(h.removeEventListener("change",qb),qb=null)}catch(e){k("Failed to remove event listeners! {}",
|
||||
F.mouseSetGrabbed=D;F.isMouseGrabSupported=function(){return ta};F.isMouseGrabbed=function(){return pa};F.isPointerLocked=function(){return ta&&(Ba||document.pointerLockElement===R)};F.supportsFullscreen=function(){return ca};F.toggleFullscreen=J;F.isFullscreen=function(){return ca&&h.matches};F.touchSetOpenKeyboardZone=function(e,t,Q,K){0!==Q&&0!==K?(B.style.display="block",B.style.top=""+(T-t-K)/L+"px",B.style.left=""+e/L+"px",B.style.width=""+Q/L+"px",B.style.height=""+K/L+"px"):(B.style.display=
|
||||
"none",B.style.top="0px",B.style.left="0px",B.style.width="0px",B.style.height="0px")};F.touchCloseDeviceKeyboard=N;F.touchIsDeviceKeyboardOpenMAYBE=O;F.gamepadSupported=function(){return P};F.isVisualViewport=function(){return aa};Ta=function(){try{W&&(M.removeEventListener("contextmenu",W),W=null),na&&(R.removeEventListener("mousedown",na),na=null),Ha&&(R.removeEventListener("mouseup",Ha),Ha=null),$a&&(R.removeEventListener("mousemove",$a),$a=null),ab&&(R.removeEventListener("mouseenter",ab),ab=
|
||||
null),bb&&(R.removeEventListener("mouseleave",bb),bb=null),cb&&(R.removeEventListener("touchstart",cb),cb=null),db&&(R.removeEventListener("touchend",db),db=null),eb&&(R.removeEventListener("touchmove",eb),eb=null),fb&&(R.removeEventListener("touchcancel",fb),fb=null),gb&&(window.removeEventListener("gamepadconnected",gb),gb=null),hb&&(window.removeEventListener("gamepaddisconnected",hb),hb=null),ib&&(window.removeEventListener("keydown",ib),ib=null),jb&&(window.removeEventListener("keyup",jb),jb=
|
||||
null),kb&&(B.removeEventListener("touchstart",kb),kb=null),lb&&(B.removeEventListener("touchend",lb),lb=null),mb&&(B.removeEventListener("touchmove",mb),mb=null),nb&&(R.removeEventListener("wheel",nb),nb=null),ob&&(window.removeEventListener("focus",ob),ob=null),pb&&(window.removeEventListener("blur",pb),pb=null),qb&&(document.removeEventListener("pointerlockchange",qb),qb=null),rb&&(document.removeEventListener("pointerlockerror",rb),rb=null),sb&&(h.removeEventListener("change",sb),sb=null)}catch(e){k("Failed to remove event listeners! {}",
|
||||
e)}Ta=null}};(function(){function a(){this._socket.close()}function b(l){this._socket.send(l)}function f(l){this._socket.send(l)}function g(){return this._frameCountStr+this._frameCountBin}function r(){const l=this._queue;return l?(l._next===l&&l._prev===l?this._queue=null:(this._queue=l._next,l._prev._next=l._next,l._next._prev=l._prev),l._next=null,l._prev=null,0===l.type?--this._frameCountStr:--this._frameCountBin,l):null}function u(){var l=this._frameCountStr+this._frameCountBin;if(0===l)return null;l=Array(l);
|
||||
var z=0,C=this._queue;const T=C;do{l[z++]=C;var L=C._next;C._next=null;C._prev=null;C=L}while(C!==T);this._queue=null;this._frameCountBin=this._frameCountStr=0;return l}function D(){this._queue=null;this._frameCountBin=this._frameCountStr=0}function J(l,z){var C=l._queue;if(!C)return null;const T=C;do{var L=C._next;if(C.type===z)return z=C._prev,L===C&&z===C?l._queue=null:(C===T&&(l._queue=L),z._next=L,L._prev=z),C._next=null,C._prev=null,C;C=L}while(C!==T);return null}function G(l,z,C){var T=0,L=
|
||||
l._queue,aa=L;do{var ia=L._next;L.type===z&&(C[T++]=L);L=ia}while(L!==aa);C.length=T;for(aa=0;aa<T;++aa)L=C[aa],ia=L._next,z=L._prev,ia===L&&z===L?l._queue=null:(L===l._queue&&(l._queue=ia),z._next=ia,ia._prev=z)}function N(){return this._frameCountStr}function O(){if(0===this._frameCountStr)return null;const l=J(this,0);l?--this._frameCountStr:this._frameCountStr=0;return l}function B(){var l=this._frameCountStr;if(0===l)return null;l=Array(l);G(this,0,l);this._frameCountStr=0;return l}function X(){const l=
|
||||
this._frameCountStr;if(0===l)return null;G(this,0,Array(l));this._frameCountStr=0}function ha(){return this._frameCountBin}function p(){if(0===this._frameCountBin)return null;const l=J(this,1);l?--this._frameCountBin:this._frameCountBin=0;return l}function d(){var l=this._frameCountBin;if(0===l)return null;l=Array(l);G(this,1,l);this._frameCountBin=0;return l}function q(){const l=this._frameCountBin;if(0===l)return null;G(this,1,Array(l));this._frameCountBin=0}function v(l){this._enableStringFrames=
|
||||
l}function n(l){this._enableBinaryFrames=l}function w(l){const z="string"===typeof l;if(z){if(!this._enableStringFrames)return}else if(!this._enableBinaryFrames)return;l={type:z?0:1,data:l,timestamp:performance.now(),_next:null,_prev:null};const C=this._queue;if(C){const T=C._prev;T._next=l;l._prev=T;l._next=C;C._prev=l}else this._queue=l,l._next=l,l._prev=l;z?++this._frameCountStr:++this._frameCountBin}Ba.createWebSocketHandle=function(l){let z;try{z=new WebSocket(l)}catch(T){return k("Failed to create WebSocket: {}",
|
||||
l}function n(l){this._enableBinaryFrames=l}function w(l){const z="string"===typeof l;if(z){if(!this._enableStringFrames)return}else if(!this._enableBinaryFrames)return;l={type:z?0:1,data:l,timestamp:performance.now(),_next:null,_prev:null};const C=this._queue;if(C){const T=C._prev;T._next=l;l._prev=T;l._next=C;C._prev=l}else this._queue=l,l._next=l,l._prev=l;z?++this._frameCountStr:++this._frameCountBin}za.createWebSocketHandle=function(l){let z;try{z=new WebSocket(l)}catch(T){return k("Failed to create WebSocket: {}",
|
||||
l),oa("Exception Caught",T),null}z.binaryType="arraybuffer";const C={state:1,_socket:z,_queue:null,_frameCountStr:0,_frameCountBin:0,_addRecievedFrame:w,_enableStringFrames:!0,_enableBinaryFrames:!0,closeSocket:a,sendStringFrame:b,sendBinaryFrame:f,availableFrames:g,getNextFrame:r,getAllFrames:u,clearFrames:D,availableStringFrames:N,getNextStringFrame:O,getAllStringFrames:B,clearStringFrames:X,availableBinaryFrames:ha,getNextBinaryFrame:p,getAllBinaryFrames:d,clearBinaryFrames:q,setEnableStringFrames:v,
|
||||
setEnableBinaryFrames:n};z.addEventListener("open",function(){C.state=2});z.addEventListener("message",function(T){C._addRecievedFrame(T.data)});z.addEventListener("close",function(){3!==C.state&&(C.state=0)});z.addEventListener("error",function(){1===C.state&&(C.state=3)});return C}})();function Eb(a,b){var f=tb;const g=f&&200===b?a.getExtension("OES_vertex_array_object"):null,r=f&&200===b?a.getExtension("ANGLE_instanced_arrays"):null,u=f&&200===b&&null!==r,D=f&&(310===b||300===b)&&null!==a.getExtension("EXT_color_buffer_float"),J=f&&!D&&(310===b||300===b||200===b)&&null!==a.getExtension("EXT_color_buffer_half_float"),G=f&&200===b&&null!==a.getExtension("EXT_shader_texture_lod"),N=f&&200===b&&null!==a.getExtension("OES_fbo_render_mipmap"),O=f&&200===b&&null!==g,B=f&&200===b&&null!==
|
||||
a.getExtension("OES_texture_float"),X=f&&300<=b&&null!==a.getExtension("OES_texture_float_linear"),ha=f&&200===b&&null!==a.getExtension("OES_texture_half_float"),p=f&&200===b&&null!==a.getExtension("OES_texture_half_float_linear");f=f&&null!==a.getExtension("EXT_texture_filter_anisotropic");const d=null!==a.getExtension("WEBGL_debug_renderer_info"),q=300<=b?0:200===b&&O?1:-1,v=300<=b?0:200===b&&u?1:-1,n=[b,q,v,0,0];if(300<=b||N)n[3]|=4;if(300<=b||G)n[3]|=8;300<=b&&(n[3]|=16);(320<=b||(300<=b||B)&&
|
||||
@ -113,27 +113,48 @@ r.drawArraysInstancedANGLE.bind(r);H.glDrawElementsInstanced=r.drawElementsInsta
|
||||
Ca.getEaglercraftXOpts=function(){return I};Ca.getEventCount=Hb.A.bind(Hb);Ca.getNextEvent=Hb.s.bind(Hb);
|
||||
Ca.queueAsyncDownload=function(a,b,f){try{fetch(a,{cache:b?"force-cache":"no-store",mode:"cors"}).then(function(g){return g.arrayBuffer()}).then(function(g){Y(1,0,{requestId:f,arrayBuffer:g})}).catch(function(g){k("Failed to complete async download: {}",a);oa("Exception Caught",g);Y(1,0,{requestId:f,arrayBuffer:null})})}catch(g){k("Failed to fetch: {}",a),oa("Exception Caught",g),Y(1,0,{requestId:f,arrayBuffer:null})}};
|
||||
Ca.download=new WebAssembly.Suspending(function(a,b){return new Promise(function(f){try{fetch(a,{cache:b?"force-cache":"no-store",mode:"cors"}).then(function(g){return g.arrayBuffer()}).then(function(g){f(g)}).catch(function(g){k("Failed to complete download: {}",a);oa("Exception Caught",g);f(null)})}catch(g){k("Failed to fetch: {}",a),oa("Exception Caught",g),f(null)}})});Ca.writeCrashReport=function(a){Kb(a,!1)};Ca.steadyTimeMillis=performance.now.bind(performance);
|
||||
function gc(a){return new Promise(function(b){setTimeout(b,a)})}Ca.sleep=new WebAssembly.Suspending(gc);function jc(a){ec?(ic=a,hc.port1.postMessage(0)):setTimeout(a,0)}function fc(){return new Promise(jc)}Ca.immediateContinue=new WebAssembly.Suspending(fc);Ca.immediateContinueSupported=function(){return ec};Ca.setCrashReportString=function(a,b){Sa[a]=b};va.getByteBufferView=function(a,b){return new Int8Array(S,a,b)};va.getUnsignedByteBufferView=function(a,b){return new Uint8Array(S,a,b)};va.getUnsignedClampedByteBufferView=function(a,b){return new Uint8ClampedArray(S,a,b)};va.getShortBufferView=function(a,b){return new Int16Array(S,a,b)};va.getUnsignedShortBufferView=function(a,b){return new Uint16Array(S,a,b)};va.getIntBufferView=function(a,b){return new Int32Array(S,a,b)};va.getFloatBufferView=function(a,b){return new Float32Array(S,a,b)};var kc;
|
||||
function gc(a){return new Promise(function(b){setTimeout(b,a)})}Ca.sleep=new WebAssembly.Suspending(gc);function jc(a){ec?(ic=a,hc.port1.postMessage(0)):setTimeout(a,0)}function fc(){return new Promise(jc)}Ca.immediateContinue=new WebAssembly.Suspending(fc);Ca.immediateContinueSupported=function(){return ec};Ca.setCrashReportString=function(a,b){Sa[a]=b};va.getByteBufferView=function(a,b){return new Int8Array(S,a,b)};va.getUnsignedByteBufferView=function(a,b){return new Uint8Array(S,a,b)};va.getUnsignedClampedByteBufferView=function(a,b){return new Uint8ClampedArray(S,a,b)};va.getShortBufferView=function(a,b){return new Int16Array(S,a,b)};va.getUnsignedShortBufferView=function(a,b){return new Uint16Array(S,a,b)};va.getIntBufferView=function(a,b){return new Int32Array(S,a,b)};va.getFloatBufferView=function(a,b){return new Float32Array(S,a,b)};const kc={172351395:{name:"EBML",type:"Container"},646:{name:"EBMLVersion",type:"Uint"},759:{name:"EBMLReadVersion",type:"Uint"},754:{name:"EBMLMaxIDLength",type:"Uint"},755:{name:"EBMLMaxSizeLength",type:"Uint"},642:{name:"DocType",type:"String"},647:{name:"DocTypeVersion",type:"Uint"},645:{name:"DocTypeReadVersion",type:"Uint"},108:{name:"Void",type:"Binary"},63:{name:"CRC-32",type:"Binary"},190023271:{name:"SignatureSlot",type:"Container"},16010:{name:"SignatureAlgo",type:"Uint"},16026:{name:"SignatureHash",
|
||||
type:"Uint"},16037:{name:"SignaturePublicKey",type:"Binary"},16053:{name:"Signature",type:"Binary"},15963:{name:"SignatureElements",type:"Container"},15995:{name:"SignatureElementList",type:"Container"},9522:{name:"SignedElement",type:"Binary"},139690087:{name:"Segment",type:"Container"},21863284:{name:"SeekHead",type:"Container"},3515:{name:"Seek",type:"Container"},5035:{name:"SeekID",type:"Binary"},5036:{name:"SeekPosition",type:"Uint"},88713574:{name:"Info",type:"Container"},13220:{name:"SegmentUID",
|
||||
type:"Binary"},13188:{name:"SegmentFilename",type:"String"},1882403:{name:"PrevUID",type:"Binary"},1868715:{name:"PrevFilename",type:"String"},2013475:{name:"NextUID",type:"Binary"},1999803:{name:"NextFilename",type:"String"},1092:{name:"SegmentFamily",type:"Binary"},10532:{name:"ChapterTranslate",type:"Container"},10748:{name:"ChapterTranslateEditionUID",type:"Uint"},10687:{name:"ChapterTranslateCodec",type:"Uint"},10661:{name:"ChapterTranslateID",type:"Binary"},710577:{name:"TimecodeScale",type:"Uint"},
|
||||
1161:{name:"Duration",type:"Float"},1121:{name:"DateUTC",type:"Date"},15273:{name:"Title",type:"String"},3456:{name:"MuxingApp",type:"String"},5953:{name:"WritingApp",type:"String"},103:{name:"Timecode",type:"Uint"},6228:{name:"SilentTracks",type:"Container"},6359:{name:"SilentTrackNumber",type:"Uint"},39:{name:"Position",type:"Uint"},43:{name:"PrevSize",type:"Uint"},35:{name:"SimpleBlock",type:"Binary"},32:{name:"BlockGroup",type:"Container"},33:{name:"Block",type:"Binary"},34:{name:"BlockVirtual",
|
||||
type:"Binary"},13729:{name:"BlockAdditions",type:"Container"},38:{name:"BlockMore",type:"Container"},110:{name:"BlockAddID",type:"Uint"},37:{name:"BlockAdditional",type:"Binary"},27:{name:"BlockDuration",type:"Uint"},122:{name:"ReferencePriority",type:"Uint"},123:{name:"ReferenceBlock",type:"Int"},125:{name:"ReferenceVirtual",type:"Int"},36:{name:"CodecState",type:"Binary"},13730:{name:"DiscardPadding",type:"Int"},14:{name:"Slices",type:"Container"},104:{name:"TimeSlice",type:"Container"},76:{name:"LaceNumber",
|
||||
type:"Uint"},77:{name:"FrameNumber",type:"Uint"},75:{name:"BlockAdditionID",type:"Uint"},78:{name:"Delay",type:"Uint"},79:{name:"SliceDuration",type:"Uint"},72:{name:"ReferenceFrame",type:"Container"},73:{name:"ReferenceOffset",type:"Uint"},74:{name:"ReferenceTimeCode",type:"Uint"},47:{name:"EncryptedBlock",type:"Binary"},106212971:{name:"Tracks",type:"Container"},46:{name:"TrackEntry",type:"Container"},87:{name:"TrackNumber",type:"Uint"},13253:{name:"TrackUID",type:"Uint"},3:{name:"TrackType",type:"Uint"},
|
||||
57:{name:"FlagEnabled",type:"Uint"},8:{name:"FlagDefault",type:"Uint"},5546:{name:"FlagForced",type:"Uint"},28:{name:"FlagLacing",type:"Uint"},11751:{name:"MinCache",type:"Uint"},11768:{name:"MaxCache",type:"Uint"},254851:{name:"DefaultDuration",type:"Uint"},216698:{name:"DefaultDecodedFieldDuration",type:"Uint"},209231:{name:"TrackTimecodeScale",type:"Float"},4991:{name:"TrackOffset",type:"Int"},5614:{name:"MaxBlockAdditionID",type:"Uint"},4974:{name:"Name",type:"String"},177564:{name:"Language",
|
||||
type:"String"},6:{name:"CodecID",type:"String"},9122:{name:"CodecPrivate",type:"Binary"},362120:{name:"CodecName",type:"String"},13382:{name:"AttachmentLink",type:"Uint"},1742487:{name:"CodecSettings",type:"String"},1785920:{name:"CodecInfoURL",type:"String"},438848:{name:"CodecDownloadURL",type:"String"},42:{name:"CodecDecodeAll",type:"Uint"},12203:{name:"TrackOverlay",type:"Uint"},5802:{name:"CodecDelay",type:"Uint"},5819:{name:"SeekPreRoll",type:"Uint"},9764:{name:"TrackTranslate",type:"Container"},
|
||||
9980:{name:"TrackTranslateEditionUID",type:"Uint"},9919:{name:"TrackTranslateCodec",type:"Uint"},9893:{name:"TrackTranslateTrackID",type:"Binary"},96:{name:"Video",type:"Container"},26:{name:"FlagInterlaced",type:"Uint"},5048:{name:"StereoMode",type:"Uint"},5056:{name:"AlphaMode",type:"Uint"},5049:{name:"OldStereoMode",type:"Uint"},48:{name:"PixelWidth",type:"Uint"},58:{name:"PixelHeight",type:"Uint"},5290:{name:"PixelCropBottom",type:"Uint"},5307:{name:"PixelCropTop",type:"Uint"},5324:{name:"PixelCropLeft",
|
||||
type:"Uint"},5341:{name:"PixelCropRight",type:"Uint"},5296:{name:"DisplayWidth",type:"Uint"},5306:{name:"DisplayHeight",type:"Uint"},5298:{name:"DisplayUnit",type:"Uint"},5299:{name:"AspectRatioType",type:"Uint"},963876:{name:"ColourSpace",type:"Binary"},1029411:{name:"GammaValue",type:"Float"},230371:{name:"FrameRate",type:"Float"},97:{name:"Audio",type:"Container"},53:{name:"SamplingFrequency",type:"Float"},14517:{name:"OutputSamplingFrequency",type:"Float"},31:{name:"Channels",type:"Uint"},15739:{name:"ChannelPositions",
|
||||
type:"Binary"},8804:{name:"BitDepth",type:"Uint"},98:{name:"TrackOperation",type:"Container"},99:{name:"TrackCombinePlanes",type:"Container"},100:{name:"TrackPlane",type:"Container"},101:{name:"TrackPlaneUID",type:"Uint"},102:{name:"TrackPlaneType",type:"Uint"},105:{name:"TrackJoinBlocks",type:"Container"},109:{name:"TrackJoinUID",type:"Uint"},64:{name:"TrickTrackUID",type:"Uint"},65:{name:"TrickTrackSegmentUID",type:"Binary"},70:{name:"TrickTrackFlag",type:"Uint"},71:{name:"TrickMasterTrackUID",
|
||||
type:"Uint"},68:{name:"TrickMasterTrackSegmentUID",type:"Binary"},11648:{name:"ContentEncodings",type:"Container"},8768:{name:"ContentEncoding",type:"Container"},4145:{name:"ContentEncodingOrder",type:"Uint"},4146:{name:"ContentEncodingScope",type:"Uint"},4147:{name:"ContentEncodingType",type:"Uint"},4148:{name:"ContentCompression",type:"Container"},596:{name:"ContentCompAlgo",type:"Uint"},597:{name:"ContentCompSettings",type:"Binary"},4149:{name:"ContentEncryption",type:"Container"},2017:{name:"ContentEncAlgo",
|
||||
type:"Uint"},2018:{name:"ContentEncKeyID",type:"Binary"},2019:{name:"ContentSignature",type:"Binary"},2020:{name:"ContentSigKeyID",type:"Binary"},2021:{name:"ContentSigAlgo",type:"Uint"},2022:{name:"ContentSigHashAlgo",type:"Uint"},206814059:{name:"Cues",type:"Container"},59:{name:"CuePoint",type:"Container"},51:{name:"CueTime",type:"Uint"},55:{name:"CueTrackPositions",type:"Container"},119:{name:"CueTrack",type:"Uint"},113:{name:"CueClusterPosition",type:"Uint"},112:{name:"CueRelativePosition",type:"Uint"},
|
||||
50:{name:"CueDuration",type:"Uint"},4984:{name:"CueBlockNumber",type:"Uint"},106:{name:"CueCodecState",type:"Uint"},91:{name:"CueReference",type:"Container"},22:{name:"CueRefTime",type:"Uint"},23:{name:"CueRefCluster",type:"Uint"},4959:{name:"CueRefNumber",type:"Uint"},107:{name:"CueRefCodecState",type:"Uint"},155296873:{name:"Attachments",type:"Container"},8615:{name:"AttachedFile",type:"Container"},1662:{name:"FileDescription",type:"String"},1646:{name:"FileName",type:"String"},1632:{name:"FileMimeType",
|
||||
type:"String"},1628:{name:"FileData",type:"Binary"},1710:{name:"FileUID",type:"Uint"},1653:{name:"FileReferral",type:"Binary"},1633:{name:"FileUsedStartTime",type:"Uint"},1634:{name:"FileUsedEndTime",type:"Uint"},4433776:{name:"Chapters",type:"Container"},1465:{name:"EditionEntry",type:"Container"},1468:{name:"EditionUID",type:"Uint"},1469:{name:"EditionFlagHidden",type:"Uint"},1499:{name:"EditionFlagDefault",type:"Uint"},1501:{name:"EditionFlagOrdered",type:"Uint"},54:{name:"ChapterAtom",type:"Container"},
|
||||
13252:{name:"ChapterUID",type:"Uint"},5716:{name:"ChapterStringUID",type:"String"},17:{name:"ChapterTimeStart",type:"Uint"},18:{name:"ChapterTimeEnd",type:"Uint"},24:{name:"ChapterFlagHidden",type:"Uint"},1432:{name:"ChapterFlagEnabled",type:"Uint"},11879:{name:"ChapterSegmentUID",type:"Binary"},11964:{name:"ChapterSegmentEditionUID",type:"Uint"},9155:{name:"ChapterPhysicalEquiv",type:"Uint"},15:{name:"ChapterTrack",type:"Container"},9:{name:"ChapterTrackNumber",type:"Uint"},0:{name:"ChapterDisplay",
|
||||
type:"Container"},5:{name:"ChapString",type:"String"},892:{name:"ChapLanguage",type:"String"},894:{name:"ChapCountry",type:"String"},10564:{name:"ChapProcess",type:"Container"},10581:{name:"ChapProcessCodecID",type:"Uint"},1293:{name:"ChapProcessPrivate",type:"Binary"},10513:{name:"ChapProcessCommand",type:"Container"},10530:{name:"ChapProcessTime",type:"Uint"},10547:{name:"ChapProcessData",type:"Binary"},39109479:{name:"Tags",type:"Container"},13171:{name:"Tag",type:"Container"},9152:{name:"Targets",
|
||||
type:"Container"},10442:{name:"TargetTypeValue",type:"Uint"},9162:{name:"TargetType",type:"String"},9157:{name:"TagTrackUID",type:"Uint"},9161:{name:"TagEditionUID",type:"Uint"},9156:{name:"TagChapterUID",type:"Uint"},9158:{name:"TagAttachmentUID",type:"Uint"},10184:{name:"SimpleTag",type:"Container"},1443:{name:"TagName",type:"String"},1146:{name:"TagLanguage",type:"String"},1156:{name:"TagDefault",type:"Uint"},1159:{name:"TagString",type:"String"},1157:{name:"TagBinary",type:"Binary"}};
|
||||
function lc(a,b){a.prototype=Object.create(b.prototype);a.prototype.constructor=a}function mc(a,b){this.name=a||"Unknown";this.type=b||"Unknown"}mc.prototype.g=function(){};function nc(a,b){mc.call(this,a,b||"Uint")}lc(nc,mc);nc.prototype.g=function(){this.data="";for(var a=0;a<this.source.length;a++){var b=this.source[a].toString(16);this.data+=1===b.length%2?"0"+b:b}};function oc(a,b){mc.call(this,a,b||"Float")}lc(oc,mc);
|
||||
oc.prototype.g=function(){var a=this.source.reverse();this.data=(new (this.source&&4===this.source.length?Float32Array:Float64Array)(a.buffer))[0]};function pc(a,b){mc.call(this,a,b||"Container")}lc(pc,mc);function qc(a){var b=a.source[a.offset++],f=8-b.toString(2).length;b-=1<<7-f;for(var g=0;g<f;g++)b*=256,b+=a.source[a.offset++];return b}
|
||||
pc.prototype.g=function(){this.data=[];for(this.offset=0;this.offset<this.source.length;this.offset=b){var a=qc(this);var b=qc(this);b=Math.min(this.offset+b,this.source.length);var f=this.source.slice(this.offset,b),g=kc[a]||{name:"Unknown",type:"Unknown"},r=mc;switch(g.type){case "Container":r=pc;break;case "Uint":r=nc;break;case "Float":r=oc}r=g=new r(g.name,g.type);r.source=f;r.g();this.data.push({id:a,K:a.toString(16),data:g})}};
|
||||
lc(function(a){pc.call(this,"File","File");this.source=a;this.g()},pc);var rc;
|
||||
(function(){function a(p){let d=O.get(p);"undefined"===typeof d&&(d=new Function("return "+p+";"),O.set(p,d));return d()}function b(p){let d={exports:null,h:null,j:null};f(p);g(p);r(p,d);u(p,d);p.teavmMath=Math;return{u(q){d.exports=q},F(q){d.h=q},D(q){d.j=q}}}function f(p){p.teavmDate={currentTimeMillis:()=>(new Date).getTime(),dateToString:d=>(new Date(d)).toString(),getYear:d=>(new Date(d)).getFullYear(),setYear:(d,q)=>{d=new Date(d);d.setFullYear(q);return d.getTime()},getMonth:d=>(new Date(d)).getMonth(),setMonth:(d,
|
||||
q)=>{d=new Date(d);d.setMonth(q);return d.getTime()},getDate:d=>(new Date(d)).getDate(),setDate:(d,q)=>{d=new Date(d);d.setDate(q);return d.getTime()},create:(d,q,v,n,w,l)=>(new Date(d,q,v,n,w,l)).getTime(),createFromUTC:(d,q,v,n,w,l)=>Date.UTC(d,q,v,n,w,l)}}function g(p){let d=[],q=[];p.teavmConsole={putcharStderr:function(v){10===v?(v=String.fromCharCode(...d),console.error(v),ka&&ka(v,!0),d.length=0):d.push(v)},putcharStdout:function(v){10===v?(v=String.fromCharCode(...q),console.log(v),ka&&ka(v,
|
||||
!1),q.length=0):q.push(v)}}}function r(p,d){let q=new FinalizationRegistry(n=>{let w=d.exports["teavm.reportGarbageCollectedValue"];"undefined"!==typeof w&&d.j(function(){w(n.B,n.C)})}),v=new FinalizationRegistry(n=>{let w=d.exports["teavm.reportGarbageCollectedString"];"function"===typeof w&&d.j(function(){w(n)})});p.teavm={createWeakRef:(n,w,l)=>{null!==l&&q.register(n,{C:w,B:l});return new WeakRef(n)},deref:n=>n.deref(),createStringWeakRef:(n,w)=>{v.register(n,w);return new WeakRef(n)},stringDeref:n=>
|
||||
n.deref(),takeStackTrace:()=>{var n=Error().stack;let w=[];for(let l of n.split("\n"))n=B.exec(l),null!==n&&2<=n.length&&w.push(parseInt(n[1],16));return{getStack:function(){let l;if(d.h)try{l=d.h(w)}catch(z){console.warn("Could not deobfuscate stack",z)}l||=w.map(z=>({className:"java.lang.Throwable$FakeClass",method:"fakeMethod",file:"Throwable.java",line:z}));return l}}},decorateException:n=>{new ha(d,n)}}}function u(p,d){function q(h){return h}function v(h){var m=h.charAt(0);var x=""+(n(m)?m:"_");
|
||||
for(m=1;m<h.length;++m){let P=h.charAt(m);var E=P;E=n(E)||"0"<=E&&"9">=E;x+=E?P:"_"}return x}function n(h){return"A"<=h&&"Z">=h||"a"<=h&&"z">=h||"_"===h||"$"===h}function w(h,m,x){null===h?(new Function("value",m+" = value;"))(x):h[m]=x}function l(h){d.exports["teavm.js.throwException"](X in h?h[X]:d.exports["teavm.js.wrapException"](h))}function z(h){a:{if(h instanceof WebAssembly.Exception){var m=d.exports["teavm.javaException"];var x=d.exports["teavm.getJsException"];if(h.is(m)){h=h.getArg(m,0);
|
||||
m=d.exports["teavm.js.extractException"](h);if(null!==m){x=m;break a}x=x(h);"undefined"===typeof x&&(x=new ha(d,h));break a}}x=h}throw x;}function C(h){var m=[];for(let x=0;x<h.length;++x)m.push("p"+x);m=0===m.length?"":m.join(", ");m=(new Function("rethrowJavaAsJs","fn",`return function(${m}) {\n`+" try {\n"+` return fn(${m});\n`+" } catch (e) {\n rethrowJavaAsJs(e);\n }\n};"))(z,h);m.__impl=h;m.__rethrow=z;return m}function T(h,m){return(new Function("constructor",`return function ${h}(marker, javaObject) {\n`+
|
||||
" return constructor.call(this, marker, javaObject);\n}\n"))(m)}function L(h){try{return h()}catch(m){l(m)}}let aa=Symbol("javaObject"),ia=Symbol("functions"),Ma=Symbol("functionOrigin"),za=Symbol("wrapperCallMarker"),Na=new WeakMap,ta=new WeakMap,pa=new Map,Aa=new FinalizationRegistry(h=>pa.delete(h)),Fa=new WeakMap,ma=2463534242;p.teavmJso={emptyString:()=>"",stringFromCharCode:h=>String.fromCharCode(h),concatStrings:(h,m)=>h+m,stringLength:h=>h.length,charAt:(h,m)=>h.charCodeAt(m),emptyArray:()=>
|
||||
[],appendToArray:(h,m)=>h.push(m),unwrapBoolean:h=>h?1:0,wrapBoolean:h=>!!h,getProperty:function(h,m){try{return null!==h?h[m]:a(m)}catch(x){l(x)}},setProperty:w,setPropertyPure:w,global:h=>{try{return a(h)}catch(m){l(m)}},createClass:(h,m,x)=>{h=v(h||"JavaObject");let E;E=null===m?function(W){this[aa]=W;this[ia]=null}:function(W){m.call(this,W)};let P=T(h,function(W,na){if(W===za)E.call(this,na);else{if(null===x)throw Error("This class can't be instantiated directly");try{return x.apply(null,arguments)}catch(Ga){z(Ga)}}});
|
||||
P.prototype=Object.create(m||Object.prototype);P.prototype.constructor=P;h=T(h,function(W){return P.call(this,za,W)});h[za]=P;h.prototype=P.prototype;return h},exportClass:h=>h[za],defineMethod:(h,m,x)=>{let E=[];for(let P=1;P<x.length;++P)E.push("p"+P);h.prototype[m]=(new Function("rethrowJavaAsJs","fn",`return function(${0===E.length?"":E.join(", ")}) {\n`+" try {\n"+` return fn(${["this",E].join(", ")});\n`+" } catch (e) {\n rethrowJavaAsJs(e);\n }\n};"))(z,x)},defineStaticMethod:(h,
|
||||
m,x)=>{h[m]=C(x)},defineFunction:C,defineProperty:(h,m,x,E)=>{let P={get(){try{return x(this)}catch(W){z(W)}}};null!==E&&(P.set=function(W){try{E(this,W)}catch(na){z(na)}});Object.defineProperty(h.prototype,m,P)},defineStaticProperty:(h,m,x,E)=>{let P={get(){try{return x()}catch(W){z(W)}}};null!==E&&(P.set=function(W){try{E(W)}catch(na){z(na)}});Object.defineProperty(h,m,P)},javaObjectToJS:(h,m)=>{if(null===h)return null;var x=Na.get(h);if("undefined"!=typeof x&&(x=x.deref(),"undefined"!==typeof x))return x;
|
||||
m=new m(h);Na.set(h,new WeakRef(m));return m},unwrapJavaObject:h=>h[aa],asFunction:(h,m)=>{let x=h[ia];null===x&&(x=Object.create(null),h[ia]=x);let E=x[m];"function"!==typeof E&&(E=function(){return h[m].apply(h,arguments)},E[Ma]=h,x[m]=E);return E},functionAsObject:(h,m)=>{let x=h[Ma];if("undefined"!==typeof x){let E=x[ia];if(void 0!==E&&E[m]===h)return x}return{[m]:function(...E){try{return h(...E)}catch(P){z(P)}}}},wrapObject:h=>{if(null===h)return null;if("object"===typeof h||"function"===typeof h){var m=
|
||||
h[aa];if("object"===typeof m)return m;m=ta.get(h);if(void 0!==m&&(m=m.deref(),void 0!==m))return m;m=d.exports["teavm.jso.createWrapper"](h);ta.set(h,new WeakRef(m));return m}m=pa.get(h);if(void 0!==m&&(m=m.deref(),void 0!==m))return m;m=d.exports["teavm.jso.createWrapper"](h);pa.set(h,new WeakRef(m));Aa.register(m,h);return m},isPrimitive:(h,m)=>typeof h===m,instanceOf:(h,m)=>h instanceof m,instanceOfOrNull:(h,m)=>null===h||h instanceof m,sameRef:(h,m)=>h===m,hashCode:h=>{if("object"===typeof h||
|
||||
"function"===typeof h||"symbol"===typeof h){var m=Fa.get(h);if("number"===typeof m)return m;m=ma;m^=m<<13;m^=m>>>17;ma=m^=m<<5;Fa.set(h,m);return m}return"number"===typeof h?h|0:"bigint"===typeof h?BigInt.asIntN(32,h):"boolean"===typeof h?h?1:0:0},apply:(h,m,x)=>{try{return null===h?a(m)(...x):h[m](...x)}catch(E){l(E)}},concatArray:(h,m)=>h.concat(m),getJavaException:h=>h[X]};for(var ca of"wrapByte wrapShort wrapChar wrapInt wrapFloat wrapDouble unwrapByte unwrapShort unwrapChar unwrapInt unwrapFloat unwrapDouble".split(" "))p.teavmJso[ca]=
|
||||
" return constructor.call(this, marker, javaObject);\n}\n"))(m)}function L(h){try{return h()}catch(m){l(m)}}let aa=Symbol("javaObject"),ia=Symbol("functions"),Na=Symbol("functionOrigin"),Aa=Symbol("wrapperCallMarker"),Oa=new WeakMap,ta=new WeakMap,pa=new Map,Ba=new FinalizationRegistry(h=>pa.delete(h)),Ga=new WeakMap,ma=2463534242;p.teavmJso={emptyString:()=>"",stringFromCharCode:h=>String.fromCharCode(h),concatStrings:(h,m)=>h+m,stringLength:h=>h.length,charAt:(h,m)=>h.charCodeAt(m),emptyArray:()=>
|
||||
[],appendToArray:(h,m)=>h.push(m),unwrapBoolean:h=>h?1:0,wrapBoolean:h=>!!h,getProperty:function(h,m){try{return null!==h?h[m]:a(m)}catch(x){l(x)}},setProperty:w,setPropertyPure:w,global:h=>{try{return a(h)}catch(m){l(m)}},createClass:(h,m,x)=>{h=v(h||"JavaObject");let E;E=null===m?function(W){this[aa]=W;this[ia]=null}:function(W){m.call(this,W)};let P=T(h,function(W,na){if(W===Aa)E.call(this,na);else{if(null===x)throw Error("This class can't be instantiated directly");try{return x.apply(null,arguments)}catch(Ha){z(Ha)}}});
|
||||
P.prototype=Object.create(m||Object.prototype);P.prototype.constructor=P;h=T(h,function(W){return P.call(this,Aa,W)});h[Aa]=P;h.prototype=P.prototype;return h},exportClass:h=>h[Aa],defineMethod:(h,m,x)=>{let E=[];for(let P=1;P<x.length;++P)E.push("p"+P);h.prototype[m]=(new Function("rethrowJavaAsJs","fn",`return function(${0===E.length?"":E.join(", ")}) {\n`+" try {\n"+` return fn(${["this",E].join(", ")});\n`+" } catch (e) {\n rethrowJavaAsJs(e);\n }\n};"))(z,x)},defineStaticMethod:(h,
|
||||
m,x)=>{h[m]=C(x)},defineFunction:C,defineProperty:(h,m,x,E)=>{let P={get(){try{return x(this)}catch(W){z(W)}}};null!==E&&(P.set=function(W){try{E(this,W)}catch(na){z(na)}});Object.defineProperty(h.prototype,m,P)},defineStaticProperty:(h,m,x,E)=>{let P={get(){try{return x()}catch(W){z(W)}}};null!==E&&(P.set=function(W){try{E(W)}catch(na){z(na)}});Object.defineProperty(h,m,P)},javaObjectToJS:(h,m)=>{if(null===h)return null;var x=Oa.get(h);if("undefined"!=typeof x&&(x=x.deref(),"undefined"!==typeof x))return x;
|
||||
m=new m(h);Oa.set(h,new WeakRef(m));return m},unwrapJavaObject:h=>h[aa],asFunction:(h,m)=>{let x=h[ia];null===x&&(x=Object.create(null),h[ia]=x);let E=x[m];"function"!==typeof E&&(E=function(){return h[m].apply(h,arguments)},E[Na]=h,x[m]=E);return E},functionAsObject:(h,m)=>{let x=h[Na];if("undefined"!==typeof x){let E=x[ia];if(void 0!==E&&E[m]===h)return x}return{[m]:function(...E){try{return h(...E)}catch(P){z(P)}}}},wrapObject:h=>{if(null===h)return null;if("object"===typeof h||"function"===typeof h){var m=
|
||||
h[aa];if("object"===typeof m)return m;m=ta.get(h);if(void 0!==m&&(m=m.deref(),void 0!==m))return m;m=d.exports["teavm.jso.createWrapper"](h);ta.set(h,new WeakRef(m));return m}m=pa.get(h);if(void 0!==m&&(m=m.deref(),void 0!==m))return m;m=d.exports["teavm.jso.createWrapper"](h);pa.set(h,new WeakRef(m));Ba.register(m,h);return m},isPrimitive:(h,m)=>typeof h===m,instanceOf:(h,m)=>h instanceof m,instanceOfOrNull:(h,m)=>null===h||h instanceof m,sameRef:(h,m)=>h===m,hashCode:h=>{if("object"===typeof h||
|
||||
"function"===typeof h||"symbol"===typeof h){var m=Ga.get(h);if("number"===typeof m)return m;m=ma;m^=m<<13;m^=m>>>17;ma=m^=m<<5;Ga.set(h,m);return m}return"number"===typeof h?h|0:"bigint"===typeof h?BigInt.asIntN(32,h):"boolean"===typeof h?h?1:0:0},apply:(h,m,x)=>{try{return null===h?a(m)(...x):h[m](...x)}catch(E){l(E)}},concatArray:(h,m)=>h.concat(m),getJavaException:h=>h[X]};for(var ca of"wrapByte wrapShort wrapChar wrapInt wrapFloat wrapDouble unwrapByte unwrapShort unwrapChar unwrapInt unwrapFloat unwrapDouble".split(" "))p.teavmJso[ca]=
|
||||
q;ca=[];for(let h=0;32>h;++h){let m=0===ca.length?"":ca.join(", "),x=[...ca,"body"].join(", ");p.teavmJso["createFunction"+h]=(new Function("wrapCallFromJavaToJs",...ca,"body",`return new Function('wrapCallFromJavaToJs', ${x}).bind(this, wrapCallFromJavaToJs);`)).bind(null,L);p.teavmJso["bindFunction"+h]=(E,...P)=>E.bind(null,...P);p.teavmJso["callFunction"+h]=(new Function("rethrowJsAsJava","fn",...ca,"try {\n"+` return fn(${m});\n`+"} catch (e) {\n rethrowJsAsJava(e);\n}")).bind(null,l);p.teavmJso["callMethod"+
|
||||
h]=(new Function("rethrowJsAsJava","getGlobalName","instance","method",...ca,"try {\n return instance !== null\n"+` ? instance[method](${m})\n`+` : getGlobalName(method)(${m});\n`+"} catch (e) {\n rethrowJsAsJava(e);\n}")).bind(null,l,a);p.teavmJso["construct"+h]=(new Function("rethrowJsAsJava","constructor",...ca,"try {\n"+` return new constructor(${m});\n`+"} catch (e) {\n rethrowJsAsJava(e);\n}")).bind(null,l);p.teavmJso["arrayOf"+h]=new Function(...ca,"return ["+m+"]");
|
||||
ca.push("p"+(h+1))}}async function D(p){try{const d={},q=b(d),v=p.path instanceof WebAssembly.Module?p.path:await WebAssembly.compileStreaming(fetch(p.path)),n=new WebAssembly.Instance(v,d);q.u(n.exports);return{module:v,instance:n}}catch(d){return console.warn("Could not load deobfuscator",d),null}}function J(p,d,q){let v=null,n=!1;return w=>{if(!n){n=!0;if(null!==d)try{v=q.exports.createFromExternalFile.value(d)}catch(l){console.warn("Could not load create deobfuscator",l)}if(null==v&&null!==p)try{v=
|
||||
q.exports.createForModule.value(p)}catch(l){console.warn("Could not create deobfuscator from module data",l)}}return null!==v?v.deobfuscate(w):[]}}async function G(p,d){if(!d.enabled||"auto"!==p&&"external"!==p)return null;if(d.l instanceof ArrayBuffer)return new Int8Array(d.l);p=await fetch(d.l);return p.ok?new Int8Array(await p.arrayBuffer()):null}function N(p){const d=new ua;p.teavm.pollAsyncCallbacks=function(){for(var q;q=d.s();)q.fn()};return function(q){d.push({fn:q,_next:null})}}let O=new Map,
|
||||
B=/.+:wasm-function\[[0-9]+]:0x([0-9a-f]+).*/,X=Symbol("javaException");class ha extends Error{constructor(p,d){super();this.g=p;this[X]=d;p.exports["teavm.setJsException"](d,this)}get message(){var p=this.g.exports["teavm.exceptionMessage"];return"function"===typeof p&&(p=p(this[X]),null!=p)?p:"(could not fetch message)"}}kc={load:async function(p,d){d||={};var q=d.h||{};let [v,n,w]=await Promise.all([q.enabled?D(q):Promise.resolve(null),p instanceof WebAssembly.Module?Promise.resolve(p):WebAssembly.compileStreaming(fetch(p)),
|
||||
G(q.v,q)]);q={};p=b(q);"undefined"!==typeof d.o&&d.o(q);p.D(N(q));d=await WebAssembly.instantiate(n,q);q={};p.u(d.exports);if(v){let l=J(null,w,v.instance);null!==l&&(p.F(l),q.deobfuscator=l)}p={exports:q,instance:d,K:{G:n,J:v?v.module:null}};for(let l in d.exports){let z=d.exports[l];z instanceof WebAssembly.Global?Object.defineProperty(q,l,{get:()=>z.value}):"function"===typeof z&&(q[l]=z)}q.memory=d.exports["teavm.memory"];q.H=w;return p},I:b,L:function(p){return new Proxy(p,{get(d,q){return new WebAssembly.Global({value:"externref",
|
||||
mutable:!1},d[q])}})}}})();async function lc(){try{Error.stackTraceLimit=1024;I=self.__eaglercraftXLoaderContext.getEaglercraftXOpts();self.__eaglercraftXLoaderContext.getEagRuntimeJSURL();const a=self.__eaglercraftXLoaderContext.getClassesWASMURL(),b=self.__eaglercraftXLoaderContext.getClassesDeobfWASMURL(),f=self.__eaglercraftXLoaderContext.getClassesTEADBGURL();Ea=self.__eaglercraftXLoaderContext.getEPKFiles();Ka=self.__eaglercraftXLoaderContext.getRootElement();self.__eaglercraftXLoaderContext.getImageURL(0);Ha=self.__eaglercraftXLoaderContext.getImageURL(1);
|
||||
Ia=self.__eaglercraftXLoaderContext.getImageURL(2);Ja=self.__eaglercraftXLoaderContext.getImageURL(3);const g=self.__eaglercraftXLoaderContext.getMainArgs();delete self.__eaglercraftXLoaderContext;if("_worker_process_"!==g[0]){if(!await wb())return}else ea="worker",await Fb();c("Loading EaglercraftX WASM GC binary...");const r=await kc.load(a,{h:{enabled:!0,path:b,v:"external",l:f},o:function(u){u.WASMGCBufferAllocator=va;u.platformApplication=A;u.platformAssets=wa;u.platformAudio=xa;u.platformFilesystem=
|
||||
ya;u.platformInput=F;u.platformNetworking=Ba;u.platformOpenGL=H;u.platformRuntime=Ca;u.teavm.notifyHeapResized=function(){Gb(r.exports.memory)}}});Gb(r.exports.memory);Da=r.exports.deobfuscator;c("Calling entry point with args: {}",JSON.stringify(g));try{await WebAssembly.promising(r.exports.main.__impl)(g)}catch(u){r.exports.main.__rethrow(u)}finally{la(2,"Main function has returned!",[])}}catch(a){Jb(a)}}
|
||||
"object"===typeof self.__eaglercraftXLoaderContext?self.__eaglercraftXLoaderContext.runMain(lc):console.error("???");}).call(this);
|
||||
B=/.+:wasm-function\[[0-9]+]:0x([0-9a-f]+).*/,X=Symbol("javaException");class ha extends Error{constructor(p,d){super();this.g=p;this[X]=d;p.exports["teavm.setJsException"](d,this)}get message(){var p=this.g.exports["teavm.exceptionMessage"];return"function"===typeof p&&(p=p(this[X]),null!=p)?p:"(could not fetch message)"}}rc={load:async function(p,d){d||={};var q=d.h||{};let [v,n,w]=await Promise.all([q.enabled?D(q):Promise.resolve(null),p instanceof WebAssembly.Module?Promise.resolve(p):WebAssembly.compileStreaming(fetch(p)),
|
||||
G(q.v,q)]);q={};p=b(q);"undefined"!==typeof d.o&&d.o(q);p.D(N(q));d=await WebAssembly.instantiate(n,q);q={};p.u(d.exports);if(v){let l=J(null,w,v.instance);null!==l&&(p.F(l),q.deobfuscator=l)}p={exports:q,instance:d,L:{G:n,J:v?v.module:null}};for(let l in d.exports){let z=d.exports[l];z instanceof WebAssembly.Global?Object.defineProperty(q,l,{get:()=>z.value}):"function"===typeof z&&(q[l]=z)}q.memory=d.exports["teavm.memory"];q.H=w;return p},I:b,M:function(p){return new Proxy(p,{get(d,q){return new WebAssembly.Global({value:"externref",
|
||||
mutable:!1},d[q])}})}}})();async function sc(){try{Error.stackTraceLimit=1024;I=self.__eaglercraftXLoaderContext.getEaglercraftXOpts();self.__eaglercraftXLoaderContext.getEagRuntimeJSURL();const a=self.__eaglercraftXLoaderContext.getClassesWASMURL(),b=self.__eaglercraftXLoaderContext.getClassesDeobfWASMURL(),f=self.__eaglercraftXLoaderContext.getClassesTEADBGURL();Ea=self.__eaglercraftXLoaderContext.getEPKFiles();Ka=self.__eaglercraftXLoaderContext.getRootElement();self.__eaglercraftXLoaderContext.getImageURL(0);Fa=self.__eaglercraftXLoaderContext.getImageURL(1);
|
||||
Ia=self.__eaglercraftXLoaderContext.getImageURL(2);Ja=self.__eaglercraftXLoaderContext.getImageURL(3);const g=self.__eaglercraftXLoaderContext.getMainArgs();delete self.__eaglercraftXLoaderContext;if("_worker_process_"!==g[0]){if(!await wb())return}else ea="worker",await Fb();c("Loading EaglercraftX WASM GC binary...");const r=await rc.load(a,{h:{enabled:!0,path:b,v:"external",l:f},o:function(u){u.WASMGCBufferAllocator=va;u.platformApplication=A;u.platformAssets=wa;u.platformAudio=xa;u.platformFilesystem=
|
||||
ya;u.platformInput=F;u.platformNetworking=za;u.platformOpenGL=H;u.platformRuntime=Ca;u.teavm.notifyHeapResized=function(){Gb(r.exports.memory)}}});Gb(r.exports.memory);Da=r.exports.deobfuscator;c("Calling entry point with args: {}",JSON.stringify(g));try{await WebAssembly.promising(r.exports.main.__impl)(g)}catch(u){r.exports.main.__rethrow(u)}finally{la(2,"Main function has returned!",[])}}catch(a){Jb(a)}}
|
||||
"object"===typeof self.__eaglercraftXLoaderContext?self.__eaglercraftXLoaderContext.runMain(sc):console.error("???");}).call(this);
|
||||
|
88
wasm_gc_teavm/javascript_dist/Infdev_WASM.html
Normal file
88
wasm_gc_teavm/javascript_dist/Infdev_WASM.html
Normal file
File diff suppressed because one or more lines are too long
BIN
wasm_gc_teavm/javascript_dist/assets.epw
Normal file
BIN
wasm_gc_teavm/javascript_dist/assets.epw
Normal file
Binary file not shown.
13
wasm_gc_teavm/javascript_dist/bootstrap.js
vendored
Normal file
13
wasm_gc_teavm/javascript_dist/bootstrap.js
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
(function(){'use strict';function g(a){console.log("LoaderBootstrap: [INFO] "+a)}function n(a){console.log("LoaderBootstrap: [WARN] "+a)}function q(a){console.error("LoaderBootstrap: [ERROR] "+a)}var r=null;
|
||||
function u(){const a=[];for(var c=0;64>c;++c)a["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charCodeAt(c)]=c;a[45]=62;a[95]=63;return function(b,d){var e=b.length-d;if(0<e%4)throw Error("Invalid string. Length must be a multiple of 4");var f=b.indexOf("=",d);f=-1===f?e:f-d;e=[f,f===e?0:4-f%4];var l=e[0];e=e[1];f=new Uint8Array(3*(l+e)/4-e);var h=0;l=(0<e?l-4:l)+d;var k;for(k=d;k<l;k+=4)d=a[b.charCodeAt(k)]<<18|a[b.charCodeAt(k+1)]<<12|a[b.charCodeAt(k+2)]<<6|a[b.charCodeAt(k+
|
||||
3)],f[h++]=d>>16&255,f[h++]=d>>8&255,f[h++]=d&255;2===e?(d=a[b.charCodeAt(k)]<<2|a[b.charCodeAt(k+1)]>>4,f[h++]=d&255):1===e&&(d=a[b.charCodeAt(k)]<<10|a[b.charCodeAt(k+1)]<<4|a[b.charCodeAt(k+2)]>>2,f[h++]=d>>8&255,f[h++]=d&255);return f.buffer}}function v(){return new Promise(function(a){setTimeout(a,20)})}
|
||||
function w(a){return new Promise(function(c){const b=new Image;b.addEventListener("load",c);b.addEventListener("error",function(){n("Failed to preload image: "+a);c()});b.src=a;setTimeout(c,50)})}function x(a){return new Promise(function(c){fetch(a,{cache:"force-cache"}).then(function(b){return b.arrayBuffer()}).then(c).catch(function(b){q("Failed to fetch URL! "+b);c(null)})})}
|
||||
function y(a){return a.startsWith("data:application/octet-stream;base64,")?new Promise(function(c){x(a).then(function(b){if(b)c(b);else{n("Failed to decode base64 via fetch, doing it the slow way instead...");try{r||=u();var d=r(a,37);c(d)}catch(e){q("Failed to decode base64! "+e),c(null)}}})}):x(a)}
|
||||
function z(a,c){const b=document.createElement("h2");b.style.color="#AA0000";b.style.padding="25px";b.style.fontFamily="sans-serif";b.style.marginBlock="0px";b.appendChild(document.createTextNode(c));a.appendChild(b);c=document.createElement("h4");c.style.color="#AA0000";c.style.padding="25px";c.style.fontFamily="sans-serif";c.style.marginBlock="0px";c.appendChild(document.createTextNode("Try again later"));a.style.backgroundColor="white";a.appendChild(c)}
|
||||
window.main=async function(){if("undefined"===typeof window.eaglercraftXOpts)q("window.eaglercraftXOpts is not defined!"),alert("window.eaglercraftXOpts is not defined!");else{var a=window.eaglercraftXOpts.container;if("string"!==typeof a)q("window.eaglercraftXOpts.container is not a string!"),alert("window.eaglercraftXOpts.container is not a string!");else{var c=window.eaglercraftXOpts.assetsURI;if("string"!==typeof c)if("object"===typeof c&&"object"===typeof c[0]&&"string"===typeof c[0].url)c=c[0].url;
|
||||
else{q("window.eaglercraftXOpts.assetsURI is not a string!");alert("window.eaglercraftXOpts.assetsURI is not a string!");return}c.startsWith("data:")&&delete window.eaglercraftXOpts.assetsURI;var b=document.getElementById(a);if(b){for(;a=b.lastChild;)b.removeChild(a);a=document.createElement("div");a.style.width="100%";a.style.height="100%";a.style.setProperty("image-rendering","pixelated");a.style.background='center / contain no-repeat url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAAAAAB3tzPbAAAACXBIWXMAAC4jAAAuIwF4pT92AAAG+UlEQVR42u2cy23jOhRATwbTwGwFvAJoF6BFGjColcGkASNuIPA6C68DN+BADZiCVxLSQBYqIGYBAbSdEvwWkvUzZWfymwlwCQwQUZeXPOT9URPkYs/3bj8QAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAH4x9vPvzFpAhAzM98UILmqfjDf1YT0N/cBk+71v+wDSczHmDeJ6TqO+SIfyD7IvC9g33Yc7dP6CQDxB+q62Hc2xnyJD2Sf5vuzL3Hi5MM0WbCN51u/Y/30ryEGmDVHlhwsY9Y7xlq0CuzVc4lh2n7NkGsnQ1nB7IefmrY/araJcbrq6Ryk9YqW4l3J/dHww1jdej+8kte042EW0Nba1hyWdl+9irq/FNXaD6BbQoexuvf+tQC2vX1+AFvP0kxiuyidfWwEbOtQtK0n0r6xbYCKsLcM21+pLZX3u4984Kq2xlnWDimllRudAXEpkGSHfqMzsmxfWnLWNf9aQznW4wMZWOMJxvGs/Ff5X+yPcD0g3dqZesdsI2f7Z2/73W2JSok9Gqu7P1q/I2qtj0qn/ZkTaCPWO2a0VyjrxY7sNUG1LxRlaE90MpDpGVeAxpaGobN2XPWH0aQVE1stfXPAj0+XzUmcob3aTRdVZ2+tRv+gMNBDaTkZ4k6uhtYPaK7iUkUcx9lgij92gZ6aXmxoDeK8D1hPfm18oBvTfPGwXoVG+4VfXcwl8dEOtCJS7De9M0VTqTA2p081O3kJ+uk5cU/RVN8C262Ms9HMlLHSmhNFTcc9u1uQRX4jMhqyNIk1GRk69a6hb0IDZ3pITnbfNqFuJWE9gbYrfmSqen/SiKy27G0VS20VWc+UEn59/YDPkc+0EunrAXQ/JXucYL+3VutyAqvP5wFvtEoyQPsMJMpKc3v7/Su9ALLkhAJDPCObGTDmonfNHAij3sg5866fmTHGnFt/crroh6vEv/Rq6vhEoP7hWWb2ylSQZP5zOVrDqVxSZnm/xL6OFnZwF3/4JoyGjyXu1X3n0rEFyE5Jzc5KEDfT7s2ZYs52s5e1HU88hB17nKTqAroXWPpXiHbN7R3Q8fVDbjzU6vb8hUbX67FWN8Xo4U5SIWjbukr1knY9XrcwS30aOuTatqa0vkA6cI05dyPrzWBbj7ZZrPUT2O7pdpKFtp4rph0E0AxtfN0u9kNVg25d4BPiDF0+R83dPol7/l4m4yQmQzdX+ISewqTnc8ngp94yaCan4vT+Hc228q8/T35+e8+XueSqCaPmEz9ofdbX6eSqE5iN/m4A8Qd9w/1bAEl2fPmafT3Axdv/ytlFeXUwTZyyf+NA3hWDGPrm+HXtHSdQ7nrz7fvv+MPFe/9Q3nAS+iYA3zcKCYAACIAACIAACIAACIAACIAACIAA1C2Komh++r9cogdv90M0+GoZAVHkSiGSaFmOmJdTRdESiKJ5Je4eovnSldoGNJ44gTBNbx+XH7tDYxwOniAPgEdygGWxTm/jBCAHV0u7xa90PV64IW0uOWdCapK7t600vfF2j4Ad5FCE4IopCSWMSg0Q4NgRVNKrwIBJ1ZDGxXO/5+fxhDvFQ87EsHxZMy9Sli/raMbjf9eqMpiciQG3yYOJwW1eQoBoesNBzG3yKdvqNwie1HMwiXFcwo7L7aMBtlSrC7c79RzyUm5w0f66Gk1vcJs8vFYHxUvy/u8leJz4N8t8vX5ccl04Chz5BOLR+mVVWXX5lsU4ncSOFevL7WFsJbYiPfQpcvJwhNsBxKiwcHDPNnoojzp8Jh8PnusiSMcLd1B8R5i+Igq5/BZKU3IEO8cIpoqw6L5NR8kjuOIaFR6GlmKdvmnhuFTsfqNwTBnzBOo+ZFua+jh3jAZtnksMu/b850wIfh1sVwVPhMEzKK9lz/+7Hi3Kx8CjOajVbVCEz3kIT1wyYnsD6s5t8tUaGLFpTfC7q2TH4rjzHMCoGgqTOJiMFi/TY5kduOJWHfzdtzdFrS4PYBwzhi0LAKcAdTcvKhur+VWQ3/TWcq/+LJG5VahUsILHUDGiGCmKy26cOrxlxwZUsMHlvVDW7lMQwghGOGZpmt6zcdFD47EhtQVyWySQRHUgVDzhmkeClyZFlGmiA5BH0WpyB+twPp/cgQpQBH0Lqt6qaTwfs+OW6Kl/RrdET/WqQi5BgWLDqNxmdV/Mo1X1QX5Ms0Pq/jmaP7d2/b6IVq3HW+a9qT7v6/TDNv2+tVA0hzz8klroc07AbXKmN98YQMppARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARCAD2//A2iD9ZsgY5XpAAAAAElFTkSuQmCC") white';
|
||||
b.appendChild(a);await v();c.startsWith("data:")?(g('Downloading EPW file "<data: '+c.length+' chars>"...'),c=await y(c)):(g('Downloading EPW file "'+c+'"...'),c=await x(c));var d=!1;c?384>c.byteLength&&(q("The EPW file is too short"),d=!0):d=!0;if(d)b.removeChild(a),z(b,"Failed to download EPW file!"),q("Failed to download EPW file!");else{var e=new DataView(c);if(608649541!==e.getUint32(0,!0)||1297301847!==e.getUint32(4,!0))q("The file is not an EPW file"),d=!0;var f=c.byteLength;e.getUint32(8,
|
||||
!0)!==f&&(q("The EPW file is the wrong length"),d=!0);if(d)b.removeChild(a),z(b,"EPW file is invalid!"),q("EPW file is invalid!");else{var l=new TextDecoder("utf-8"),h=e.getUint32(100,!0),k=e.getUint32(104,!0),m=e.getUint32(108,!0),p=e.getUint32(112,!0);if(0>h||h+k>f||0>m||m+p>f)q("The EPW file contains an invalid offset (component: splash)"),d=!0;if(d)b.removeChild(a),z(b,"EPW file is invalid!"),q("EPW file is invalid!");else{h=new Uint8Array(c,h,k);m=new Uint8Array(c,m,p);l=URL.createObjectURL(new Blob([h],
|
||||
{type:l.decode(m)}));await w(l);g("Loaded splash img: "+l);a.style.background='center / contain no-repeat url("'+l+'"), 0px 0px / 1000000% 1000000% no-repeat url("'+l+'") white';await v();p=e.getUint32(164,!0);h=e.getUint32(168,!0);m=e.getUint32(180,!0);e=e.getUint32(184,!0);if(0>p||p+h>f||0>m||m+e>f)q("The EPW file contains an invalid offset (component: loader)"),d=!0;if(d)b.removeChild(a),z(b,"EPW file is invalid!"),q("EPW file is invalid!");else{a=new Uint8Array(c,p,h);a=URL.createObjectURL(new Blob([a],
|
||||
{type:"text/javascript;charset=utf-8"}));g("Loaded loader.js: "+l);d=new Uint8Array(c,m,e);d=URL.createObjectURL(new Blob([d],{type:"application/wasm"}));g("Loaded loader.wasm: "+d);f={};for(const [t,A]of Object.entries(window.eaglercraftXOpts))"container"!==t&&"assetsURI"!==t&&(f[t]=A);window.__eaglercraftXLoaderContextPre={rootElement:b,eaglercraftXOpts:f,theEPWFileBuffer:c,loaderWASMURL:d,splashURL:l};g("Appending loader.js to document...");b=document.createElement("script");b.type="text/javascript";
|
||||
b.src=a;document.head.appendChild(b)}}}}}else b='window.eaglercraftXOpts.container "'+a+'" is not a known element id!',q(b),alert(b)}}};}).call(this);
|
Loading…
x
Reference in New Issue
Block a user