Update #42 - Fixed several WebRTC bugs and other issues
This commit is contained in:
parent
4d66ca140a
commit
64ac208565
|
@ -247,4 +247,4 @@ The `crashReportShow` hook can be used to capture crash reports and append addit
|
||||||
|
|
||||||
There is currently no system in place to make forks of 1.8 and merge commits made to the patch files in this repository with the patch files or workspace of the fork, you're on your own if you try to keep a fork of this repo for reasons other than to contribute to it
|
There is currently no system in place to make forks of 1.8 and merge commits made to the patch files in this repository with the patch files or workspace of the fork, you're on your own if you try to keep a fork of this repo for reasons other than to contribute to it
|
||||||
|
|
||||||
A javascript-based modding API resembling Minecraft Forge may be implemented someday though for adding custom content to the game.
|
**Note:** If you are trying to use the desktop runtime on Linux, make sure you add the "desktopRuntime" folder to the `LD_LIBRARY_PATH` environment variable of the Java process. This should be done automatically by the Eclipse project's default run configuration, but it might not work properly on every system, or when the Eclipse project is imported into IntelliJ.
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
u41
|
u42
|
|
@ -14,7 +14,11 @@
|
||||||
|
|
||||||
~ public void updateTick(World world, BlockPos blockpos, IBlockState iblockstate, EaglercraftRandom var4) {
|
~ public void updateTick(World world, BlockPos blockpos, IBlockState iblockstate, EaglercraftRandom var4) {
|
||||||
|
|
||||||
> CHANGE 66 : 67 @ 66 : 67
|
> CHANGE 33 : 34 @ 33 : 35
|
||||||
|
|
||||||
|
~ for (BlockPos blockpos$mutableblockpos : BlockPos.getAllInBoxMutable(pos.add(-4, 0, -4), pos.add(4, 1, 4))) {
|
||||||
|
|
||||||
|
> CHANGE 31 : 32 @ 31 : 32
|
||||||
|
|
||||||
~ public Item getItemDropped(IBlockState var1, EaglercraftRandom random, int i) {
|
~ public Item getItemDropped(IBlockState var1, EaglercraftRandom random, int i) {
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,28 @@
|
||||||
|
|
||||||
~ public void updateTick(World world, BlockPos blockpos, IBlockState var3, EaglercraftRandom random) {
|
~ public void updateTick(World world, BlockPos blockpos, IBlockState var3, EaglercraftRandom random) {
|
||||||
|
|
||||||
> DELETE 18 @ 18 : 19
|
> CHANGE 1 : 4 @ 1 : 3
|
||||||
|
|
||||||
|
~ BlockPos tmp = new BlockPos();
|
||||||
|
~ if (world.getLightFromNeighbors(blockpos.up(tmp)) < 4
|
||||||
|
~ && world.getBlockState(blockpos.up(tmp)).getBlock().getLightOpacity() > 2) {
|
||||||
|
|
||||||
|
> CHANGE 2 : 4 @ 2 : 3
|
||||||
|
|
||||||
|
~ if (world.getLightFromNeighbors(blockpos.up(tmp)) >= 9) {
|
||||||
|
~ BlockPos tmp2 = new BlockPos();
|
||||||
|
|
||||||
|
> CHANGE 2 : 4 @ 2 : 4
|
||||||
|
|
||||||
|
~ random.nextInt(3) - 1, tmp2);
|
||||||
|
~ Block block = world.getBlockState(blockpos1.up(tmp)).getBlock();
|
||||||
|
|
||||||
|
> CHANGE 3 : 5 @ 3 : 4
|
||||||
|
|
||||||
|
~ && world.getLightFromNeighbors(blockpos1.up(tmp)) >= 4
|
||||||
|
~ && block.getLightOpacity() <= 2) {
|
||||||
|
|
||||||
|
> DELETE 4 @ 4 : 5
|
||||||
|
|
||||||
> CHANGE 4 : 5 @ 4 : 5
|
> CHANGE 4 : 5 @ 4 : 5
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,11 @@
|
||||||
|
|
||||||
~ public void updateTick(World world, BlockPos blockpos, IBlockState iblockstate, EaglercraftRandom var4) {
|
~ public void updateTick(World world, BlockPos blockpos, IBlockState iblockstate, EaglercraftRandom var4) {
|
||||||
|
|
||||||
> DELETE 79 @ 79 : 80
|
> CHANGE 16 : 17 @ 16 : 17
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
|
> DELETE 62 @ 62 : 63
|
||||||
|
|
||||||
> CHANGE 3 : 4 @ 3 : 4
|
> CHANGE 3 : 4 @ 3 : 4
|
||||||
|
|
||||||
|
|
|
@ -26,11 +26,15 @@
|
||||||
|
|
||||||
~ public void updateTick(World world, BlockPos blockpos, IBlockState iblockstate, EaglercraftRandom random) {
|
~ public void updateTick(World world, BlockPos blockpos, IBlockState iblockstate, EaglercraftRandom random) {
|
||||||
|
|
||||||
> INSERT 22 : 23 @ 22
|
> INSERT 6 : 7 @ 6
|
||||||
|
|
||||||
+ BlockPos tmp = new BlockPos(0, 0, 0);
|
+ BlockPos tmp = new BlockPos(0, 0, 0);
|
||||||
|
|
||||||
> CHANGE 4 : 9 @ 4 : 7
|
> CHANGE 3 : 4 @ 3 : 4
|
||||||
|
|
||||||
|
~ if (world.getBlockState(blockpos.add(j, l, k, tmp)).getBlock() == this) {
|
||||||
|
|
||||||
|
> CHANGE 16 : 21 @ 16 : 19
|
||||||
|
|
||||||
~ EnumFacing[] facings = EnumFacing.Plane.HORIZONTAL.facingsArray;
|
~ EnumFacing[] facings = EnumFacing.Plane.HORIZONTAL.facingsArray;
|
||||||
~ for (int j = 0; j < facings.length; ++j) {
|
~ for (int j = 0; j < facings.length; ++j) {
|
||||||
|
@ -38,7 +42,11 @@
|
||||||
~ if (random.nextBoolean() || !this.canPlaceOn(
|
~ if (random.nextBoolean() || !this.canPlaceOn(
|
||||||
~ world.getBlockState(blockpos2.offsetEvenFaster(enumfacing3, tmp)).getBlock())) {
|
~ world.getBlockState(blockpos2.offsetEvenFaster(enumfacing3, tmp)).getBlock())) {
|
||||||
|
|
||||||
> CHANGE 33 : 35 @ 33 : 35
|
> CHANGE 16 : 17 @ 16 : 17
|
||||||
|
|
||||||
|
~ BlockPos blockpos4 = blockpos.offsetEvenFaster(enumfacing1, blockpos2);
|
||||||
|
|
||||||
|
> CHANGE 16 : 18 @ 16 : 18
|
||||||
|
|
||||||
~ } else if (flag1 && world.isAirBlock(blockpos5) && this.canPlaceOn(
|
~ } else if (flag1 && world.isAirBlock(blockpos5) && this.canPlaceOn(
|
||||||
~ world.getBlockState(blockpos.offsetEvenFaster(enumfacing2, tmp)).getBlock())) {
|
~ world.getBlockState(blockpos.offsetEvenFaster(enumfacing2, tmp)).getBlock())) {
|
||||||
|
@ -48,7 +56,15 @@
|
||||||
~ } else if (flag2 && world.isAirBlock(blockpos1) && this.canPlaceOn(
|
~ } else if (flag2 && world.isAirBlock(blockpos1) && this.canPlaceOn(
|
||||||
~ world.getBlockState(blockpos.offsetEvenFaster(enumfacing4, tmp)).getBlock())) {
|
~ world.getBlockState(blockpos.offsetEvenFaster(enumfacing4, tmp)).getBlock())) {
|
||||||
|
|
||||||
> INSERT 16 : 17 @ 16
|
> CHANGE 2 : 3 @ 2 : 3
|
||||||
|
|
||||||
|
~ } else if (this.canPlaceOn(world.getBlockState(blockpos4.up(tmp)).getBlock())) {
|
||||||
|
|
||||||
|
> CHANGE 10 : 11 @ 10 : 11
|
||||||
|
|
||||||
|
~ BlockPos blockpos3 = blockpos.down(blockpos2);
|
||||||
|
|
||||||
|
> INSERT 2 : 3 @ 2
|
||||||
|
|
||||||
+ EnumFacing[] facings = EnumFacing.Plane.HORIZONTAL.facingsArray;
|
+ EnumFacing[] facings = EnumFacing.Plane.HORIZONTAL.facingsArray;
|
||||||
|
|
||||||
|
|
|
@ -713,7 +713,7 @@
|
||||||
+ currentScreen != null ? currentScreen.getClass().getName() : null, scaledResolution.getScaledWidth(),
|
+ currentScreen != null ? currentScreen.getClass().getName() : null, scaledResolution.getScaledWidth(),
|
||||||
+ scaledResolution.getScaledHeight(), displayWidth, displayHeight, scaledResolution.getScaleFactor());
|
+ scaledResolution.getScaledHeight(), displayWidth, displayHeight, scaledResolution.getScaleFactor());
|
||||||
|
|
||||||
> CHANGE 11 : 50 @ 11 : 12
|
> CHANGE 11 : 55 @ 11 : 12
|
||||||
|
|
||||||
~ RateLimitTracker.tick();
|
~ RateLimitTracker.tick();
|
||||||
~
|
~
|
||||||
|
@ -728,6 +728,11 @@
|
||||||
~
|
~
|
||||||
~ if (wasPaused != isGamePaused) {
|
~ if (wasPaused != isGamePaused) {
|
||||||
~ SingleplayerServerController.setPaused(this.isGamePaused);
|
~ SingleplayerServerController.setPaused(this.isGamePaused);
|
||||||
|
~ if (isGamePaused) {
|
||||||
|
~ mcSoundHandler.pauseSounds();
|
||||||
|
~ } else {
|
||||||
|
~ mcSoundHandler.resumeSounds();
|
||||||
|
~ }
|
||||||
~ wasPaused = isGamePaused;
|
~ wasPaused = isGamePaused;
|
||||||
~ }
|
~ }
|
||||||
~
|
~
|
||||||
|
|
|
@ -7,4 +7,6 @@
|
||||||
|
|
||||||
> DELETE 2 @ 2 : 4
|
> DELETE 2 @ 2 : 4
|
||||||
|
|
||||||
|
> DELETE 11 @ 11 : 12
|
||||||
|
|
||||||
> EOF
|
> EOF
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
|
||||||
|
# Eagler Context Redacted Diff
|
||||||
|
# Copyright (c) 2024 lax1dude. All rights reserved.
|
||||||
|
|
||||||
|
# Version: 1.0
|
||||||
|
# Author: lax1dude
|
||||||
|
|
||||||
|
> DELETE 9 @ 9 : 11
|
||||||
|
|
||||||
|
> EOF
|
|
@ -7,4 +7,8 @@
|
||||||
|
|
||||||
> DELETE 2 @ 2 : 3
|
> DELETE 2 @ 2 : 3
|
||||||
|
|
||||||
|
> DELETE 12 @ 12 : 13
|
||||||
|
|
||||||
|
> DELETE 18 @ 18 : 19
|
||||||
|
|
||||||
> EOF
|
> EOF
|
||||||
|
|
|
@ -7,4 +7,6 @@
|
||||||
|
|
||||||
> DELETE 2 @ 2 : 4
|
> DELETE 2 @ 2 : 4
|
||||||
|
|
||||||
|
> DELETE 15 @ 15 : 16
|
||||||
|
|
||||||
> EOF
|
> EOF
|
||||||
|
|
|
@ -7,4 +7,8 @@
|
||||||
|
|
||||||
> DELETE 2 @ 2 : 3
|
> DELETE 2 @ 2 : 3
|
||||||
|
|
||||||
|
> DELETE 10 @ 10 : 11
|
||||||
|
|
||||||
|
> DELETE 14 @ 14 : 18
|
||||||
|
|
||||||
> EOF
|
> EOF
|
||||||
|
|
|
@ -7,4 +7,26 @@
|
||||||
|
|
||||||
> DELETE 2 @ 2 : 4
|
> DELETE 2 @ 2 : 4
|
||||||
|
|
||||||
|
> CHANGE 4 : 5 @ 4 : 5
|
||||||
|
|
||||||
|
~ return new PositionedSoundRecord(soundResource, 0.25F, pitch, false, ISound.AttenuationType.NONE, 0.0F, 0.0F,
|
||||||
|
|
||||||
|
> CHANGE 4 : 5 @ 4 : 5
|
||||||
|
|
||||||
|
~ return new PositionedSoundRecord(soundResource, 1.0F, 1.0F, false, ISound.AttenuationType.NONE, 0.0F, 0.0F,
|
||||||
|
|
||||||
|
> CHANGE 5 : 6 @ 5 : 6
|
||||||
|
|
||||||
|
~ return new PositionedSoundRecord(soundResource, 4.0F, 1.0F, false, ISound.AttenuationType.LINEAR, xPosition,
|
||||||
|
|
||||||
|
> CHANGE 5 : 6 @ 5 : 6
|
||||||
|
|
||||||
|
~ this(soundResource, volume, pitch, false, ISound.AttenuationType.LINEAR, xPosition, yPosition, zPosition);
|
||||||
|
|
||||||
|
> CHANGE 3 : 4 @ 3 : 5
|
||||||
|
|
||||||
|
~ ISound.AttenuationType attenuationType, float xPosition, float yPosition, float zPosition) {
|
||||||
|
|
||||||
|
> DELETE 7 @ 7 : 8
|
||||||
|
|
||||||
> EOF
|
> EOF
|
||||||
|
|
|
@ -43,7 +43,11 @@
|
||||||
|
|
||||||
~ EaglercraftRandom random = new EaglercraftRandom();
|
~ EaglercraftRandom random = new EaglercraftRandom();
|
||||||
|
|
||||||
> CHANGE 83 : 84 @ 83 : 85
|
> CHANGE 3 : 4 @ 3 : 4
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
|
> CHANGE 79 : 80 @ 79 : 81
|
||||||
|
|
||||||
~ return "Non-integrated multiplayer server";
|
~ return "Non-integrated multiplayer server";
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
|
|
||||||
> CHANGE 2 : 6 @ 2 : 3
|
> CHANGE 2 : 6 @ 2 : 3
|
||||||
|
|
||||||
~ BlockPos.MutableBlockPos pointer = new BlockPos.MutableBlockPos();
|
~ BlockPos pointer = new BlockPos();
|
||||||
~ EnumFacing[] facings = EnumFacing._VALUES;
|
~ EnumFacing[] facings = EnumFacing._VALUES;
|
||||||
~ for (int m = 0; m < facings.length; ++m) {
|
~ for (int m = 0; m < facings.length; ++m) {
|
||||||
~ EnumFacing enumfacing = facings[m];
|
~ EnumFacing enumfacing = facings[m];
|
||||||
|
|
|
@ -616,7 +616,11 @@
|
||||||
~ b0 = 8;
|
~ b0 = 8;
|
||||||
~ } else if (this.mc.gameSettings.fancyGraphics) {
|
~ } else if (this.mc.gameSettings.fancyGraphics) {
|
||||||
|
|
||||||
> CHANGE 38 : 39 @ 38 : 39
|
> CHANGE 7 : 8 @ 7 : 8
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
|
> CHANGE 30 : 31 @ 30 : 31
|
||||||
|
|
||||||
~ if (f2 >= 0.15F) {
|
~ if (f2 >= 0.15F) {
|
||||||
|
|
||||||
|
|
|
@ -489,7 +489,11 @@
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
|
|
||||||
> INSERT 29 : 30 @ 29
|
> CHANGE 5 : 6 @ 5 : 7
|
||||||
|
|
||||||
|
~ for (BlockPos blockpos$mutableblockpos : BlockPos.getAllInBoxMutable(blockpos, blockpos.add(15, 15, 15))) {
|
||||||
|
|
||||||
|
> INSERT 22 : 23 @ 22
|
||||||
|
|
||||||
+ ((ClippingHelperImpl) this.debugFixedClippingHelper).destroy();
|
+ ((ClippingHelperImpl) this.debugFixedClippingHelper).destroy();
|
||||||
|
|
||||||
|
|
|
@ -88,7 +88,7 @@
|
||||||
|
|
||||||
> CHANGE 2 : 4 @ 2 : 4
|
> CHANGE 2 : 4 @ 2 : 4
|
||||||
|
|
||||||
~ for (BlockPos blockpos$mutableblockpos : BlockPos.getAllInBox(blockpos, blockpos1)) {
|
~ for (BlockPos blockpos$mutableblockpos : BlockPos.getAllInBoxMutable(blockpos, blockpos1)) {
|
||||||
~ IBlockState iblockstate = regionrendercache.getBlockStateFaster(blockpos$mutableblockpos);
|
~ IBlockState iblockstate = regionrendercache.getBlockStateFaster(blockpos$mutableblockpos);
|
||||||
|
|
||||||
> CHANGE 6 : 7 @ 6 : 7
|
> CHANGE 6 : 7 @ 6 : 7
|
||||||
|
|
|
@ -11,4 +11,9 @@
|
||||||
|
|
||||||
+
|
+
|
||||||
|
|
||||||
|
> CHANGE 40 : 42 @ 40 : 42
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
~ BlockPos blockpos$mutableblockpos1 = new BlockPos();
|
||||||
|
|
||||||
> EOF
|
> EOF
|
||||||
|
|
|
@ -147,7 +147,11 @@
|
||||||
~ for (int i = 0; i < numbers.length; ++i) {
|
~ for (int i = 0; i < numbers.length; ++i) {
|
||||||
~ nbttaglist.appendTag(new NBTTagFloat(numbers[i]));
|
~ nbttaglist.appendTag(new NBTTagFloat(numbers[i]));
|
||||||
|
|
||||||
> CHANGE 172 : 173 @ 172 : 173
|
> CHANGE 33 : 34 @ 33 : 35
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos(Integer.MIN_VALUE, Integer.MIN_VALUE, Integer.MIN_VALUE);
|
||||||
|
|
||||||
|
> CHANGE 137 : 138 @ 137 : 138
|
||||||
|
|
||||||
~ for (AxisAlignedBB axisalignedbb : (List<AxisAlignedBB>) list) {
|
~ for (AxisAlignedBB axisalignedbb : (List<AxisAlignedBB>) list) {
|
||||||
|
|
||||||
|
|
|
@ -16,4 +16,8 @@
|
||||||
~ private static final EaglercraftUUID babySpeedBoostUUID = EaglercraftUUID
|
~ private static final EaglercraftUUID babySpeedBoostUUID = EaglercraftUUID
|
||||||
~ .fromString("B9766B59-9566-4402-BC1F-2EE2A276D836");
|
~ .fromString("B9766B59-9566-4402-BC1F-2EE2A276D836");
|
||||||
|
|
||||||
|
> CHANGE 489 : 490 @ 489 : 490
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
> EOF
|
> EOF
|
||||||
|
|
|
@ -16,4 +16,8 @@
|
||||||
|
|
||||||
> DELETE 9 @ 9 : 11
|
> DELETE 9 @ 9 : 11
|
||||||
|
|
||||||
|
> CHANGE 91 : 92 @ 91 : 92
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
> EOF
|
> EOF
|
||||||
|
|
|
@ -7,4 +7,8 @@
|
||||||
|
|
||||||
> DELETE 8 @ 8 : 11
|
> DELETE 8 @ 8 : 11
|
||||||
|
|
||||||
|
> CHANGE 168 : 169 @ 168 : 169
|
||||||
|
|
||||||
|
~ for (BlockPos blockpos : BlockPos.getAllInBoxMutable(new BlockPos(parInt1, parInt2, parInt3),
|
||||||
|
|
||||||
> EOF
|
> EOF
|
||||||
|
|
|
@ -5,9 +5,9 @@
|
||||||
# Version: 1.0
|
# Version: 1.0
|
||||||
# Author: lax1dude
|
# Author: lax1dude
|
||||||
|
|
||||||
> DELETE 4 @ 4 : 10
|
> DELETE 4 @ 4 : 11
|
||||||
|
|
||||||
> DELETE 10 @ 10 : 15
|
> DELETE 9 @ 9 : 14
|
||||||
|
|
||||||
> CHANGE 3 : 5 @ 3 : 6
|
> CHANGE 3 : 5 @ 3 : 6
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,11 @@
|
||||||
~ for (int m = 0, l = list.size(); m < l; ++m) {
|
~ for (int m = 0, l = list.size(); m < l; ++m) {
|
||||||
~ list.get(m).addPotionEffect(new PotionEffect(this.secondaryEffect, 180, 0, true, true));
|
~ list.get(m).addPotionEffect(new PotionEffect(this.secondaryEffect, 180, 0, true, true));
|
||||||
|
|
||||||
> CHANGE 87 : 88 @ 87 : 88
|
> CHANGE 18 : 19 @ 18 : 19
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
|
> CHANGE 68 : 69 @ 68 : 69
|
||||||
|
|
||||||
~ List<EntityPlayer> lst = this.worldObj.getEntitiesWithinAABB(EntityPlayer.class,
|
~ List<EntityPlayer> lst = this.worldObj.getEntitiesWithinAABB(EntityPlayer.class,
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,45 @@
|
||||||
|
|
||||||
> DELETE 1 @ 1 : 5
|
> DELETE 1 @ 1 : 5
|
||||||
|
|
||||||
> INSERT 55 : 65 @ 55
|
> INSERT 12 : 16 @ 12
|
||||||
|
|
||||||
|
+ public BlockPos() {
|
||||||
|
+ super(0, 0, 0);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
|
||||||
|
> CHANGE 22 : 23 @ 22 : 23
|
||||||
|
|
||||||
|
~ : new BlockPos((double) this.x + x, (double) this.y + y, (double) this.z + z);
|
||||||
|
|
||||||
|
> CHANGE 3 : 4 @ 3 : 4
|
||||||
|
|
||||||
|
~ return x == 0 && y == 0 && z == 0 ? this : new BlockPos(this.x + x, this.y + y, this.z + z);
|
||||||
|
|
||||||
|
> INSERT 2 : 12 @ 2
|
||||||
|
|
||||||
|
+ /**
|
||||||
|
+ * eagler
|
||||||
|
+ */
|
||||||
|
+ public BlockPos add(int x, int y, int z, BlockPos dst) {
|
||||||
|
+ dst.x = this.x + x;
|
||||||
|
+ dst.y = this.y + y;
|
||||||
|
+ dst.z = this.z + z;
|
||||||
|
+ return dst;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
|
||||||
|
> CHANGE 1 : 3 @ 1 : 3
|
||||||
|
|
||||||
|
~ return vec.x == 0 && vec.y == 0 && vec.z == 0 ? this
|
||||||
|
~ : new BlockPos(this.x + vec.x, this.y + vec.y, this.z + vec.z);
|
||||||
|
|
||||||
|
> CHANGE 3 : 5 @ 3 : 5
|
||||||
|
|
||||||
|
~ return vec.x == 0 && vec.y == 0 && vec.z == 0 ? this
|
||||||
|
~ : new BlockPos(this.x - vec.x, this.y - vec.y, this.z - vec.z);
|
||||||
|
|
||||||
|
> INSERT 6 : 16 @ 6
|
||||||
|
|
||||||
+ /**
|
+ /**
|
||||||
+ * eagler
|
+ * eagler
|
||||||
|
@ -96,9 +134,9 @@
|
||||||
> INSERT 4 : 21 @ 4
|
> INSERT 4 : 21 @ 4
|
||||||
|
|
||||||
+ public BlockPos offsetFaster(EnumFacing facing, BlockPos ret) {
|
+ public BlockPos offsetFaster(EnumFacing facing, BlockPos ret) {
|
||||||
+ ret.x = this.getX() + facing.getFrontOffsetX();
|
+ ret.x = this.x + facing.getFrontOffsetX();
|
||||||
+ ret.y = this.getY() + facing.getFrontOffsetY();
|
+ ret.y = this.y + facing.getFrontOffsetY();
|
||||||
+ ret.z = this.getZ() + facing.getFrontOffsetZ();
|
+ ret.z = this.z + facing.getFrontOffsetZ();
|
||||||
+ return ret;
|
+ return ret;
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
|
@ -118,10 +156,89 @@
|
||||||
~ : new BlockPos(this.x + facing.getFrontOffsetX() * n, this.y + facing.getFrontOffsetY() * n,
|
~ : new BlockPos(this.x + facing.getFrontOffsetX() * n, this.y + facing.getFrontOffsetY() * n,
|
||||||
~ this.z + facing.getFrontOffsetZ() * n);
|
~ this.z + facing.getFrontOffsetZ() * n);
|
||||||
|
|
||||||
> DELETE 104 @ 104 : 107
|
> CHANGE 3 : 5 @ 3 : 6
|
||||||
|
|
||||||
> CHANGE 6 : 7 @ 6 : 10
|
~ return new BlockPos(this.y * vec3i.z - this.z * vec3i.y, this.z * vec3i.x - this.x * vec3i.z,
|
||||||
|
~ this.x * vec3i.y - this.y * vec3i.x);
|
||||||
|
|
||||||
~ super(x_, y_, z_);
|
> CHANGE 3 : 5 @ 3 : 5
|
||||||
|
|
||||||
|
~ return ((long) this.x & X_MASK) << X_SHIFT | ((long) this.y & Y_MASK) << Y_SHIFT
|
||||||
|
~ | ((long) this.z & Z_MASK) << 0;
|
||||||
|
|
||||||
|
> CHANGE 10 : 12 @ 10 : 14
|
||||||
|
|
||||||
|
~ final BlockPos blockpos = new BlockPos(Math.min(from.x, to.x), Math.min(from.y, to.y), Math.min(from.z, to.z));
|
||||||
|
~ final BlockPos blockpos1 = new BlockPos(Math.max(from.x, to.x), Math.max(from.y, to.y), Math.max(from.z, to.z));
|
||||||
|
|
||||||
|
> CHANGE 12 : 16 @ 12 : 16
|
||||||
|
|
||||||
|
~ int i = this.lastReturned.x;
|
||||||
|
~ int j = this.lastReturned.y;
|
||||||
|
~ int k = this.lastReturned.z;
|
||||||
|
~ if (i < blockpos1.x) {
|
||||||
|
|
||||||
|
> CHANGE 1 : 3 @ 1 : 3
|
||||||
|
|
||||||
|
~ } else if (j < blockpos1.y) {
|
||||||
|
~ i = blockpos.x;
|
||||||
|
|
||||||
|
> CHANGE 1 : 4 @ 1 : 4
|
||||||
|
|
||||||
|
~ } else if (k < blockpos1.z) {
|
||||||
|
~ i = blockpos.x;
|
||||||
|
~ j = blockpos.y;
|
||||||
|
|
||||||
|
> CHANGE 12 : 19 @ 12 : 21
|
||||||
|
|
||||||
|
~ public static Iterable<BlockPos> getAllInBoxMutable(BlockPos from, BlockPos to) {
|
||||||
|
~ final BlockPos blockpos = new BlockPos(Math.min(from.x, to.x), Math.min(from.y, to.y), Math.min(from.z, to.z));
|
||||||
|
~ final BlockPos blockpos1 = new BlockPos(Math.max(from.x, to.x), Math.max(from.y, to.y), Math.max(from.z, to.z));
|
||||||
|
~ return new Iterable<BlockPos>() {
|
||||||
|
~ public Iterator<BlockPos> iterator() {
|
||||||
|
~ return new AbstractIterator<BlockPos>() {
|
||||||
|
~ private BlockPos theBlockPos = null;
|
||||||
|
|
||||||
|
> CHANGE 1 : 2 @ 1 : 2
|
||||||
|
|
||||||
|
~ protected BlockPos computeNext() {
|
||||||
|
|
||||||
|
> CHANGE 1 : 2 @ 1 : 3
|
||||||
|
|
||||||
|
~ this.theBlockPos = new BlockPos(blockpos.x, blockpos.y, blockpos.z);
|
||||||
|
|
||||||
|
> CHANGE 2 : 3 @ 2 : 3
|
||||||
|
|
||||||
|
~ return (BlockPos) this.endOfData();
|
||||||
|
|
||||||
|
> CHANGE 1 : 5 @ 1 : 5
|
||||||
|
|
||||||
|
~ int i = this.theBlockPos.x;
|
||||||
|
~ int j = this.theBlockPos.y;
|
||||||
|
~ int k = this.theBlockPos.z;
|
||||||
|
~ if (i < blockpos1.x) {
|
||||||
|
|
||||||
|
> CHANGE 1 : 3 @ 1 : 3
|
||||||
|
|
||||||
|
~ } else if (j < blockpos1.y) {
|
||||||
|
~ i = blockpos.x;
|
||||||
|
|
||||||
|
> CHANGE 1 : 4 @ 1 : 4
|
||||||
|
|
||||||
|
~ } else if (k < blockpos1.z) {
|
||||||
|
~ i = blockpos.x;
|
||||||
|
~ j = blockpos.y;
|
||||||
|
|
||||||
|
> CHANGE 14 : 19 @ 14 : 48
|
||||||
|
|
||||||
|
~ public BlockPos func_181079_c(int x, int y, int z) {
|
||||||
|
~ this.x = x;
|
||||||
|
~ this.y = y;
|
||||||
|
~ this.z = z;
|
||||||
|
~ return this;
|
||||||
|
|
||||||
|
> INSERT 1 : 2 @ 1
|
||||||
|
|
||||||
|
+
|
||||||
|
|
||||||
> EOF
|
> EOF
|
||||||
|
|
|
@ -189,8 +189,11 @@
|
||||||
+ * So sorry for this implementation
|
+ * So sorry for this implementation
|
||||||
+ */
|
+ */
|
||||||
|
|
||||||
> CHANGE 1 : 8 @ 1 : 2
|
> CHANGE 1 : 11 @ 1 : 2
|
||||||
|
|
||||||
|
~ if (component == null) {
|
||||||
|
~ return "null";
|
||||||
|
~ }
|
||||||
~ if ((component instanceof ChatComponentText) && component.getChatStyle().isEmpty()
|
~ if ((component instanceof ChatComponentText) && component.getChatStyle().isEmpty()
|
||||||
~ && component.getSiblings().isEmpty()) {
|
~ && component.getSiblings().isEmpty()) {
|
||||||
~ String escaped = new JSONObject().put("E", component.getUnformattedTextForChat()).toString();
|
~ String escaped = new JSONObject().put("E", component.getUnformattedTextForChat()).toString();
|
||||||
|
|
|
@ -19,4 +19,8 @@
|
||||||
|
|
||||||
~ this.random = new EaglercraftRandom(worldIn.getSeed(), !worldIn.getWorldInfo().isOldEaglercraftRandom());
|
~ this.random = new EaglercraftRandom(worldIn.getSeed(), !worldIn.getWorldInfo().isOldEaglercraftRandom());
|
||||||
|
|
||||||
|
> CHANGE 152 : 153 @ 152 : 153
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
> EOF
|
> EOF
|
||||||
|
|
|
@ -69,11 +69,29 @@
|
||||||
|
|
||||||
~ return HString.format("ID #%d (%s // %s)",
|
~ return HString.format("ID #%d (%s // %s)",
|
||||||
|
|
||||||
> CHANGE 128 : 129 @ 128 : 129
|
> CHANGE 60 : 66 @ 60 : 65
|
||||||
|
|
||||||
|
~ BlockPos tmp = new BlockPos(0, 0, 0);
|
||||||
|
~ int i1 = this.getLight(pos.up(tmp), false);
|
||||||
|
~ int i = this.getLight(pos.east(tmp), false);
|
||||||
|
~ int j = this.getLight(pos.west(tmp), false);
|
||||||
|
~ int k = this.getLight(pos.south(tmp), false);
|
||||||
|
~ int l = this.getLight(pos.north(tmp), false);
|
||||||
|
|
||||||
|
> CHANGE 63 : 64 @ 63 : 64
|
||||||
|
|
||||||
~ return Chunk.getNoSkyLightValue();
|
~ return Chunk.getNoSkyLightValue();
|
||||||
|
|
||||||
> CHANGE 74 : 80 @ 74 : 75
|
> CHANGE 10 : 16 @ 10 : 15
|
||||||
|
|
||||||
|
~ BlockPos tmp = new BlockPos();
|
||||||
|
~ int i1 = this.getLightFor(type, pos.up(tmp));
|
||||||
|
~ int i = this.getLightFor(type, pos.east(tmp));
|
||||||
|
~ int j = this.getLightFor(type, pos.west(tmp));
|
||||||
|
~ int k = this.getLightFor(type, pos.south(tmp));
|
||||||
|
~ int l = this.getLightFor(type, pos.north(tmp));
|
||||||
|
|
||||||
|
> CHANGE 59 : 65 @ 59 : 60
|
||||||
|
|
||||||
~ if (lightValue < 0) {
|
~ if (lightValue < 0) {
|
||||||
~ j += -lightValue;
|
~ j += -lightValue;
|
||||||
|
@ -82,7 +100,15 @@
|
||||||
~ }
|
~ }
|
||||||
~ } else if (j < lightValue) {
|
~ } else if (j < lightValue) {
|
||||||
|
|
||||||
> DELETE 579 @ 579 : 582
|
> CHANGE 320 : 321 @ 320 : 321
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
|
> CHANGE 72 : 73 @ 72 : 73
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
|
> DELETE 185 @ 185 : 188
|
||||||
|
|
||||||
> DELETE 23 @ 23 : 24
|
> DELETE 23 @ 23 : 24
|
||||||
|
|
||||||
|
@ -104,7 +130,31 @@
|
||||||
|
|
||||||
> DELETE 38 @ 38 : 39
|
> DELETE 38 @ 38 : 39
|
||||||
|
|
||||||
> CHANGE 400 : 401 @ 400 : 401
|
> CHANGE 37 : 38 @ 37 : 38
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
|
> CHANGE 22 : 23 @ 22 : 23
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
|
> CHANGE 23 : 24 @ 23 : 24
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
|
> CHANGE 28 : 29 @ 28 : 29
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
|
> CHANGE 38 : 39 @ 38 : 39
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
|
> CHANGE 22 : 23 @ 22 : 23
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
|
> CHANGE 224 : 225 @ 224 : 225
|
||||||
|
|
||||||
~ if (!this.provider.getHasNoSky() && this.getGameRules().getBoolean("doWeatherCycle")) {
|
~ if (!this.provider.getHasNoSky() && this.getGameRules().getBoolean("doWeatherCycle")) {
|
||||||
|
|
||||||
|
@ -140,7 +190,13 @@
|
||||||
|
|
||||||
~ public void forceBlockUpdateTick(Block blockType, BlockPos pos, EaglercraftRandom random) {
|
~ public void forceBlockUpdateTick(Block blockType, BlockPos pos, EaglercraftRandom random) {
|
||||||
|
|
||||||
> CHANGE 93 : 96 @ 93 : 94
|
> CHANGE 28 : 31 @ 28 : 30
|
||||||
|
|
||||||
|
~ BlockPos tmp = new BlockPos();
|
||||||
|
~ boolean flag = this.isWater(pos.west(tmp)) && this.isWater(pos.east(tmp))
|
||||||
|
~ && this.isWater(pos.north(tmp)) && this.isWater(pos.south(tmp));
|
||||||
|
|
||||||
|
> CHANGE 63 : 66 @ 63 : 64
|
||||||
|
|
||||||
~ EnumFacing[] facings = EnumFacing._VALUES;
|
~ EnumFacing[] facings = EnumFacing._VALUES;
|
||||||
~ for (int m = 0; m < facings.length; ++m) {
|
~ for (int m = 0; m < facings.length; ++m) {
|
||||||
|
@ -148,7 +204,11 @@
|
||||||
|
|
||||||
> DELETE 22 @ 22 : 23
|
> DELETE 22 @ 22 : 23
|
||||||
|
|
||||||
> CHANGE 27 : 30 @ 27 : 28
|
> CHANGE 25 : 26 @ 25 : 26
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
|
> CHANGE 1 : 4 @ 1 : 2
|
||||||
|
|
||||||
~ EnumFacing[] facings = EnumFacing._VALUES;
|
~ EnumFacing[] facings = EnumFacing._VALUES;
|
||||||
~ for (int m = 0; m < facings.length; ++m) {
|
~ for (int m = 0; m < facings.length; ++m) {
|
||||||
|
@ -156,7 +216,35 @@
|
||||||
|
|
||||||
> DELETE 20 @ 20 : 23
|
> DELETE 20 @ 20 : 23
|
||||||
|
|
||||||
> DELETE 50 @ 50 : 51
|
> INSERT 6 : 7 @ 6
|
||||||
|
|
||||||
|
+ BlockPos tmp = new BlockPos(0, 0, 0);
|
||||||
|
|
||||||
|
> CHANGE 10 : 11 @ 10 : 11
|
||||||
|
|
||||||
|
~ if (this.getLightFor(lightType, blockpos1.west(tmp)) < j6) {
|
||||||
|
|
||||||
|
> CHANGE 4 : 5 @ 4 : 5
|
||||||
|
|
||||||
|
~ if (this.getLightFor(lightType, blockpos1.east(tmp)) < j6) {
|
||||||
|
|
||||||
|
> CHANGE 4 : 5 @ 4 : 5
|
||||||
|
|
||||||
|
~ if (this.getLightFor(lightType, blockpos1.down(tmp)) < j6) {
|
||||||
|
|
||||||
|
> CHANGE 4 : 5 @ 4 : 5
|
||||||
|
|
||||||
|
~ if (this.getLightFor(lightType, blockpos1.up(tmp)) < j6) {
|
||||||
|
|
||||||
|
> CHANGE 4 : 5 @ 4 : 5
|
||||||
|
|
||||||
|
~ if (this.getLightFor(lightType, blockpos1.north(tmp)) < j6) {
|
||||||
|
|
||||||
|
> CHANGE 4 : 5 @ 4 : 5
|
||||||
|
|
||||||
|
~ if (this.getLightFor(lightType, blockpos1.south(tmp)) < j6) {
|
||||||
|
|
||||||
|
> DELETE 8 @ 8 : 9
|
||||||
|
|
||||||
> CHANGE 43 : 46 @ 43 : 45
|
> CHANGE 43 : 46 @ 43 : 45
|
||||||
|
|
||||||
|
@ -175,7 +263,42 @@
|
||||||
~ for (int j = 0, l = this.loadedEntityList.size(); j < l; ++j) {
|
~ for (int j = 0, l = this.loadedEntityList.size(); j < l; ++j) {
|
||||||
~ Entity entity = this.loadedEntityList.get(j);
|
~ Entity entity = this.loadedEntityList.get(j);
|
||||||
|
|
||||||
> CHANGE 102 : 107 @ 102 : 104
|
> CHANGE 51 : 53 @ 51 : 52
|
||||||
|
|
||||||
|
~ BlockPos tmp = new BlockPos();
|
||||||
|
~ i = Math.max(i, this.getStrongPower(pos.down(tmp), EnumFacing.DOWN));
|
||||||
|
|
||||||
|
> CHANGE 3 : 4 @ 3 : 4
|
||||||
|
|
||||||
|
~ i = Math.max(i, this.getStrongPower(pos.up(tmp), EnumFacing.UP));
|
||||||
|
|
||||||
|
> CHANGE 3 : 4 @ 3 : 4
|
||||||
|
|
||||||
|
~ i = Math.max(i, this.getStrongPower(pos.north(tmp), EnumFacing.NORTH));
|
||||||
|
|
||||||
|
> CHANGE 3 : 4 @ 3 : 4
|
||||||
|
|
||||||
|
~ i = Math.max(i, this.getStrongPower(pos.south(tmp), EnumFacing.SOUTH));
|
||||||
|
|
||||||
|
> CHANGE 3 : 4 @ 3 : 4
|
||||||
|
|
||||||
|
~ i = Math.max(i, this.getStrongPower(pos.west(tmp), EnumFacing.WEST));
|
||||||
|
|
||||||
|
> CHANGE 3 : 4 @ 3 : 4
|
||||||
|
|
||||||
|
~ i = Math.max(i, this.getStrongPower(pos.east(tmp), EnumFacing.EAST));
|
||||||
|
|
||||||
|
> CHANGE 19 : 26 @ 19 : 25
|
||||||
|
|
||||||
|
~ BlockPos tmp = new BlockPos(0, 0, 0);
|
||||||
|
~ return this.getRedstonePower(pos.down(tmp), EnumFacing.DOWN) > 0 ? true
|
||||||
|
~ : (this.getRedstonePower(pos.up(tmp), EnumFacing.UP) > 0 ? true
|
||||||
|
~ : (this.getRedstonePower(pos.north(tmp), EnumFacing.NORTH) > 0 ? true
|
||||||
|
~ : (this.getRedstonePower(pos.south(tmp), EnumFacing.SOUTH) > 0 ? true
|
||||||
|
~ : (this.getRedstonePower(pos.west(tmp), EnumFacing.WEST) > 0 ? true
|
||||||
|
~ : this.getRedstonePower(pos.east(tmp), EnumFacing.EAST) > 0))));
|
||||||
|
|
||||||
|
> CHANGE 5 : 10 @ 5 : 7
|
||||||
|
|
||||||
~ EnumFacing[] facings = EnumFacing._VALUES;
|
~ EnumFacing[] facings = EnumFacing._VALUES;
|
||||||
~ BlockPos tmp = new BlockPos(0, 0, 0);
|
~ BlockPos tmp = new BlockPos(0, 0, 0);
|
||||||
|
|
|
@ -7,4 +7,8 @@
|
||||||
|
|
||||||
> DELETE 4 @ 4 : 5
|
> DELETE 4 @ 4 : 5
|
||||||
|
|
||||||
|
> CHANGE 24 : 25 @ 24 : 25
|
||||||
|
|
||||||
|
~ for (BlockPos blockpos$mutableblockpos : BlockPos.getAllInBoxMutable(parBlockPos.add(-1, 0, -1),
|
||||||
|
|
||||||
> EOF
|
> EOF
|
||||||
|
|
|
@ -93,7 +93,11 @@
|
||||||
~ public final void generateBiomeTerrain(World worldIn, EaglercraftRandom rand, ChunkPrimer chunkPrimerIn,
|
~ public final void generateBiomeTerrain(World worldIn, EaglercraftRandom rand, ChunkPrimer chunkPrimerIn,
|
||||||
~ int parInt1, int parInt2, double parDouble1) {
|
~ int parInt1, int parInt2, double parDouble1) {
|
||||||
|
|
||||||
> CHANGE 101 : 177 @ 101 : 102
|
> CHANGE 7 : 8 @ 7 : 8
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
|
> CHANGE 93 : 169 @ 93 : 94
|
||||||
|
|
||||||
~ public static void doBootstrap() {
|
~ public static void doBootstrap() {
|
||||||
~ ocean = (new BiomeGenOcean(0)).setColor(112).setBiomeName("Ocean").setHeight(height_Oceans);
|
~ ocean = (new BiomeGenOcean(0)).setColor(112).setBiomeName("Ocean").setHeight(height_Oceans);
|
||||||
|
|
|
@ -195,4 +195,8 @@
|
||||||
~ for (int i = 0; i < facings.length; ++i) {
|
~ for (int i = 0; i < facings.length; ++i) {
|
||||||
~ EnumFacing enumfacing = facings[i];
|
~ EnumFacing enumfacing = facings[i];
|
||||||
|
|
||||||
|
> CHANGE 49 : 50 @ 49 : 51
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos((this.xPosition << 4) + x, 0, (this.zPosition << 4) + z);
|
||||||
|
|
||||||
> EOF
|
> EOF
|
||||||
|
|
|
@ -7,4 +7,8 @@
|
||||||
|
|
||||||
> DELETE 8 @ 8 : 9
|
> DELETE 8 @ 8 : 9
|
||||||
|
|
||||||
|
> CHANGE 87 : 88 @ 87 : 88
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
> EOF
|
> EOF
|
||||||
|
|
|
@ -23,4 +23,8 @@
|
||||||
|
|
||||||
~ EaglercraftRandom random = new EaglercraftRandom(parLong1, this.rand.isScramble());
|
~ EaglercraftRandom random = new EaglercraftRandom(parLong1, this.rand.isScramble());
|
||||||
|
|
||||||
|
> CHANGE 106 : 107 @ 106 : 107
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
> EOF
|
> EOF
|
||||||
|
|
|
@ -22,4 +22,8 @@
|
||||||
|
|
||||||
~ EaglercraftRandom random = new EaglercraftRandom(parLong1, this.rand.isScramble());
|
~ EaglercraftRandom random = new EaglercraftRandom(parLong1, this.rand.isScramble());
|
||||||
|
|
||||||
|
> CHANGE 105 : 106 @ 105 : 106
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
> EOF
|
> EOF
|
||||||
|
|
|
@ -15,4 +15,8 @@
|
||||||
|
|
||||||
~ public boolean generate(World world, EaglercraftRandom random, BlockPos blockpos) {
|
~ public boolean generate(World world, EaglercraftRandom random, BlockPos blockpos) {
|
||||||
|
|
||||||
|
> CHANGE 13 : 14 @ 13 : 14
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
> EOF
|
> EOF
|
||||||
|
|
|
@ -23,14 +23,22 @@
|
||||||
> CHANGE 111 : 113 @ 111 : 113
|
> CHANGE 111 : 113 @ 111 : 113
|
||||||
|
|
||||||
~ for (int i = 0, l = this.field_175948_j.size(); i < l; ++i) {
|
~ for (int i = 0, l = this.field_175948_j.size(); i < l; ++i) {
|
||||||
~ this.generateLeafNode(this.field_175948_j.get(i));
|
~ this.generateLeafNode(this.field_175948_j.get(i).blockPos);
|
||||||
|
|
||||||
> CHANGE 22 : 24 @ 22 : 23
|
> CHANGE 22 : 24 @ 22 : 23
|
||||||
|
|
||||||
~ for (int j = 0, l = this.field_175948_j.size(); j < l; ++j) {
|
~ for (int j = 0, l = this.field_175948_j.size(); j < l; ++j) {
|
||||||
~ WorldGenBigTree.FoliageCoordinates worldgenbigtree$foliagecoordinates = this.field_175948_j.get(j);
|
~ WorldGenBigTree.FoliageCoordinates worldgenbigtree$foliagecoordinates = this.field_175948_j.get(j);
|
||||||
|
|
||||||
> CHANGE 35 : 36 @ 35 : 36
|
> CHANGE 2 : 3 @ 2 : 3
|
||||||
|
|
||||||
|
~ if (!blockpos.equals(worldgenbigtree$foliagecoordinates.blockPos)
|
||||||
|
|
||||||
|
> CHANGE 1 : 2 @ 1 : 2
|
||||||
|
|
||||||
|
~ this.func_175937_a(blockpos, worldgenbigtree$foliagecoordinates.blockPos, Blocks.log);
|
||||||
|
|
||||||
|
> CHANGE 30 : 31 @ 30 : 31
|
||||||
|
|
||||||
~ public boolean generate(World worldIn, EaglercraftRandom rand, BlockPos position) {
|
~ public boolean generate(World worldIn, EaglercraftRandom rand, BlockPos position) {
|
||||||
|
|
||||||
|
@ -38,4 +46,18 @@
|
||||||
|
|
||||||
~ this.rand = new EaglercraftRandom(rand.nextLong(), !worldIn.getWorldInfo().isOldEaglercraftRandom());
|
~ this.rand = new EaglercraftRandom(rand.nextLong(), !worldIn.getWorldInfo().isOldEaglercraftRandom());
|
||||||
|
|
||||||
|
> CHANGE 32 : 33 @ 32 : 33
|
||||||
|
|
||||||
|
~ static class FoliageCoordinates {
|
||||||
|
|
||||||
|
> INSERT 1 : 2 @ 1
|
||||||
|
|
||||||
|
+ private final BlockPos blockPos;
|
||||||
|
|
||||||
|
> DELETE 2 @ 2 : 3
|
||||||
|
|
||||||
|
> INSERT 1 : 2 @ 1
|
||||||
|
|
||||||
|
+ this.blockPos = parBlockPos;
|
||||||
|
|
||||||
> EOF
|
> EOF
|
||||||
|
|
|
@ -15,4 +15,9 @@
|
||||||
|
|
||||||
~ public boolean generate(World world, EaglercraftRandom random, BlockPos blockpos) {
|
~ public boolean generate(World world, EaglercraftRandom random, BlockPos blockpos) {
|
||||||
|
|
||||||
|
> CHANGE 25 : 27 @ 25 : 26
|
||||||
|
|
||||||
|
~ for (BlockPos blockpos1 : BlockPos.getAllInBoxMutable(blockpos.add(-j, -k, -l),
|
||||||
|
~ blockpos.add(j, k, l))) {
|
||||||
|
|
||||||
> EOF
|
> EOF
|
||||||
|
|
|
@ -15,4 +15,8 @@
|
||||||
|
|
||||||
~ public boolean generate(World world, EaglercraftRandom random, BlockPos blockpos) {
|
~ public boolean generate(World world, EaglercraftRandom random, BlockPos blockpos) {
|
||||||
|
|
||||||
|
> CHANGE 111 : 112 @ 111 : 112
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
> EOF
|
> EOF
|
||||||
|
|
|
@ -15,4 +15,8 @@
|
||||||
|
|
||||||
~ public boolean generate(World world, EaglercraftRandom random, BlockPos blockpos) {
|
~ public boolean generate(World world, EaglercraftRandom random, BlockPos blockpos) {
|
||||||
|
|
||||||
|
> CHANGE 17 : 18 @ 17 : 18
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
> EOF
|
> EOF
|
||||||
|
|
|
@ -15,4 +15,8 @@
|
||||||
|
|
||||||
~ public boolean generate(World world, EaglercraftRandom random, BlockPos blockpos) {
|
~ public boolean generate(World world, EaglercraftRandom random, BlockPos blockpos) {
|
||||||
|
|
||||||
|
> CHANGE 13 : 14 @ 13 : 14
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
> EOF
|
> EOF
|
||||||
|
|
|
@ -15,4 +15,8 @@
|
||||||
|
|
||||||
~ public boolean generate(World world, EaglercraftRandom random, BlockPos blockpos) {
|
~ public boolean generate(World world, EaglercraftRandom random, BlockPos blockpos) {
|
||||||
|
|
||||||
|
> CHANGE 3 : 4 @ 3 : 4
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
> EOF
|
> EOF
|
||||||
|
|
|
@ -15,4 +15,12 @@
|
||||||
|
|
||||||
~ public boolean generate(World world, EaglercraftRandom random, BlockPos blockpos) {
|
~ public boolean generate(World world, EaglercraftRandom random, BlockPos blockpos) {
|
||||||
|
|
||||||
|
> CHANGE 18 : 19 @ 18 : 19
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
|
> CHANGE 57 : 58 @ 57 : 58
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos1 = new BlockPos();
|
||||||
|
|
||||||
> EOF
|
> EOF
|
||||||
|
|
|
@ -15,4 +15,8 @@
|
||||||
|
|
||||||
~ public boolean generate(World world, EaglercraftRandom random, BlockPos blockpos) {
|
~ public boolean generate(World world, EaglercraftRandom random, BlockPos blockpos) {
|
||||||
|
|
||||||
|
> CHANGE 14 : 15 @ 14 : 15
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
> EOF
|
> EOF
|
||||||
|
|
|
@ -15,4 +15,8 @@
|
||||||
|
|
||||||
~ public boolean generate(World world, EaglercraftRandom random, BlockPos blockpos) {
|
~ public boolean generate(World world, EaglercraftRandom random, BlockPos blockpos) {
|
||||||
|
|
||||||
|
> CHANGE 14 : 15 @ 14 : 15
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
> EOF
|
> EOF
|
||||||
|
|
|
@ -15,7 +15,15 @@
|
||||||
|
|
||||||
~ public boolean generate(World world, EaglercraftRandom random, BlockPos blockpos) {
|
~ public boolean generate(World world, EaglercraftRandom random, BlockPos blockpos) {
|
||||||
|
|
||||||
> CHANGE 126 : 129 @ 126 : 127
|
> CHANGE 13 : 14 @ 13 : 14
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
|
> CHANGE 75 : 76 @ 75 : 76
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos1 = new BlockPos();
|
||||||
|
|
||||||
|
> CHANGE 36 : 39 @ 36 : 37
|
||||||
|
|
||||||
~ EnumFacing[] facings = EnumFacing.Plane.HORIZONTAL.facingsArray;
|
~ EnumFacing[] facings = EnumFacing.Plane.HORIZONTAL.facingsArray;
|
||||||
~ for (int m = 0; m < facings.length; ++m) {
|
~ for (int m = 0; m < facings.length; ++m) {
|
||||||
|
|
|
@ -39,7 +39,11 @@
|
||||||
|
|
||||||
~ protected Feature(EaglercraftRandom parRandom, int parInt1, int parInt2, int parInt3, int parInt4, int parInt5,
|
~ protected Feature(EaglercraftRandom parRandom, int parInt1, int parInt2, int parInt3, int parInt4, int parInt5,
|
||||||
|
|
||||||
> CHANGE 86 : 87 @ 86 : 87
|
> CHANGE 39 : 40 @ 39 : 40
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
|
> CHANGE 46 : 47 @ 46 : 47
|
||||||
|
|
||||||
~ public JunglePyramid(EaglercraftRandom parRandom, int parInt1, int parInt2) {
|
~ public JunglePyramid(EaglercraftRandom parRandom, int parInt1, int parInt2) {
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,11 @@
|
||||||
|
|
||||||
~ public abstract boolean addComponentParts(World var1, EaglercraftRandom var2, StructureBoundingBox var3);
|
~ public abstract boolean addComponentParts(World var1, EaglercraftRandom var2, StructureBoundingBox var3);
|
||||||
|
|
||||||
> CHANGE 408 : 409 @ 408 : 409
|
> CHANGE 32 : 33 @ 32 : 33
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
|
> CHANGE 375 : 376 @ 375 : 376
|
||||||
|
|
||||||
~ int minZ, int maxX, int maxY, int maxZ, boolean alwaysReplace, EaglercraftRandom rand,
|
~ int minZ, int maxX, int maxY, int maxZ, boolean alwaysReplace, EaglercraftRandom rand,
|
||||||
|
|
||||||
|
|
|
@ -216,7 +216,11 @@
|
||||||
|
|
||||||
~ List<StructureComponent> rand, EaglercraftRandom parRandom, int parInt1, int parInt2) {
|
~ List<StructureComponent> rand, EaglercraftRandom parRandom, int parInt1, int parInt2) {
|
||||||
|
|
||||||
> CHANGE 138 : 139 @ 138 : 139
|
> CHANGE 27 : 28 @ 27 : 28
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
|
> CHANGE 110 : 111 @ 110 : 111
|
||||||
|
|
||||||
~ public Well(StructureVillagePieces.Start start, int parInt1, EaglercraftRandom rand, int parInt2, int parInt3) {
|
~ public Well(StructureVillagePieces.Start start, int parInt1, EaglercraftRandom rand, int parInt2, int parInt3) {
|
||||||
|
|
||||||
|
|
|
@ -13,4 +13,8 @@
|
||||||
~ for (int j = 0; j < facings.length; ++j) {
|
~ for (int j = 0; j < facings.length; ++j) {
|
||||||
~ EnumFacing enumfacing = facings[j];
|
~ EnumFacing enumfacing = facings[j];
|
||||||
|
|
||||||
|
> CHANGE 16 : 17 @ 16 : 17
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
> EOF
|
> EOF
|
||||||
|
|
|
@ -7,4 +7,13 @@
|
||||||
|
|
||||||
> DELETE 15 @ 15 : 16
|
> DELETE 15 @ 15 : 16
|
||||||
|
|
||||||
|
> CHANGE 22 : 24 @ 22 : 24
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos(MathHelper.floor_double(entity.posX), i,
|
||||||
|
~ MathHelper.floor_double(entity.posZ));
|
||||||
|
|
||||||
|
> CHANGE 113 : 114 @ 113 : 114
|
||||||
|
|
||||||
|
~ BlockPos blockpos$mutableblockpos = new BlockPos();
|
||||||
|
|
||||||
> EOF
|
> EOF
|
||||||
|
|
|
@ -53,17 +53,22 @@ public class PlatformAudio {
|
||||||
@Override
|
@Override
|
||||||
public void pause(boolean setPaused) {
|
public void pause(boolean setPaused) {
|
||||||
if(setPaused) {
|
if(setPaused) {
|
||||||
if(sndSystem.playing(sourceName)) {
|
if(!paused) {
|
||||||
sndSystem.pause(sourceName);
|
sndSystem.pause(sourceName);
|
||||||
}
|
|
||||||
paused = true;
|
paused = true;
|
||||||
}else {
|
|
||||||
if(!sndSystem.playing(sourceName)) {
|
|
||||||
sndSystem.play(sourceName);
|
|
||||||
}
|
}
|
||||||
|
}else {
|
||||||
|
if(paused) {
|
||||||
|
sndSystem.play(sourceName);
|
||||||
paused = false;
|
paused = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void repeat(boolean en) {
|
||||||
|
sndSystem.setLooping(sourceName, en);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void restart() {
|
public void restart() {
|
||||||
|
@ -172,7 +177,7 @@ public class PlatformAudio {
|
||||||
private static int sourceCounter = 0;
|
private static int sourceCounter = 0;
|
||||||
|
|
||||||
public static IAudioHandle beginPlayback(IAudioResource track, float x, float y, float z,
|
public static IAudioHandle beginPlayback(IAudioResource track, float x, float y, float z,
|
||||||
float volume, float pitch) {
|
float volume, float pitch, boolean repeat) {
|
||||||
if(sndSystem == null) {
|
if(sndSystem == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -188,12 +193,13 @@ public class PlatformAudio {
|
||||||
sndSystem.setTemporary(srcName, true);
|
sndSystem.setTemporary(srcName, true);
|
||||||
sndSystem.setPitch(srcName, pitch);
|
sndSystem.setPitch(srcName, pitch);
|
||||||
sndSystem.setVolume(srcName, volume);
|
sndSystem.setVolume(srcName, volume);
|
||||||
|
sndSystem.setLooping(srcName, repeat);
|
||||||
sndSystem.play(srcName);
|
sndSystem.play(srcName);
|
||||||
|
|
||||||
return new PaulscodeAudioHandle(srcName);
|
return new PaulscodeAudioHandle(srcName);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IAudioHandle beginPlaybackStatic(IAudioResource track, float volume, float pitch) {
|
public static IAudioHandle beginPlaybackStatic(IAudioResource track, float volume, float pitch, boolean repeat) {
|
||||||
if(sndSystem == null) {
|
if(sndSystem == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -204,6 +210,7 @@ public class PlatformAudio {
|
||||||
sndSystem.setTemporary(srcName, true);
|
sndSystem.setTemporary(srcName, true);
|
||||||
sndSystem.setPitch(srcName, pitch);
|
sndSystem.setPitch(srcName, pitch);
|
||||||
sndSystem.setVolume(srcName, volume);
|
sndSystem.setVolume(srcName, volume);
|
||||||
|
sndSystem.setLooping(srcName, repeat);
|
||||||
sndSystem.play(srcName);
|
sndSystem.play(srcName);
|
||||||
|
|
||||||
return new PaulscodeAudioHandle(srcName);
|
return new PaulscodeAudioHandle(srcName);
|
||||||
|
|
|
@ -568,6 +568,10 @@ public class PlatformRuntime {
|
||||||
return new GZIPInputStream(is);
|
return new GZIPInputStream(is);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void downloadRemoteURIByteArray(String assetPackageURI, boolean forceCache, final Consumer<byte[]> cb) {
|
||||||
|
downloadRemoteURIByteArray(assetPackageURI, cb);
|
||||||
|
}
|
||||||
|
|
||||||
public static void downloadRemoteURIByteArray(String assetPackageURI, final Consumer<byte[]> cb) {
|
public static void downloadRemoteURIByteArray(String assetPackageURI, final Consumer<byte[]> cb) {
|
||||||
logger.info("Downloading: {}");
|
logger.info("Downloading: {}");
|
||||||
try(InputStream is = (new URL(assetPackageURI)).openStream()) {
|
try(InputStream is = (new URL(assetPackageURI)).openStream()) {
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package net.lax1dude.eaglercraft.v1_8.internal;
|
package net.lax1dude.eaglercraft.v1_8.internal;
|
||||||
|
|
||||||
import net.lax1dude.eaglercraft.v1_8.EaglercraftUUID;
|
import net.lax1dude.eaglercraft.v1_8.EaglercraftUUID;
|
||||||
import net.lax1dude.eaglercraft.v1_8.voice.EnumVoiceChannelPeerState;
|
|
||||||
import net.lax1dude.eaglercraft.v1_8.voice.EnumVoiceChannelReadyState;
|
import net.lax1dude.eaglercraft.v1_8.voice.EnumVoiceChannelReadyState;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -89,28 +88,8 @@ public class PlatformVoiceClient {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static EnumVoiceChannelPeerState getPeerState() {
|
|
||||||
return EnumVoiceChannelPeerState.LOADING;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static EnumVoiceChannelReadyState getReadyState() {
|
public static EnumVoiceChannelReadyState getReadyState() {
|
||||||
return EnumVoiceChannelReadyState.NONE;
|
return EnumVoiceChannelReadyState.NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static EnumVoiceChannelPeerState getPeerStateConnect() {
|
|
||||||
return EnumVoiceChannelPeerState.LOADING;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static EnumVoiceChannelPeerState getPeerStateInitial() {
|
|
||||||
return EnumVoiceChannelPeerState.LOADING;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static EnumVoiceChannelPeerState getPeerStateDesc() {
|
|
||||||
return EnumVoiceChannelPeerState.LOADING;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static EnumVoiceChannelPeerState getPeerStateIce() {
|
|
||||||
return EnumVoiceChannelPeerState.LOADING;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,18 +5,8 @@ import dev.onvoid.webrtc.internal.NativeLoader;
|
||||||
import net.lax1dude.eaglercraft.v1_8.EagRuntime;
|
import net.lax1dude.eaglercraft.v1_8.EagRuntime;
|
||||||
import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
|
import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
|
||||||
import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
||||||
|
import net.lax1dude.eaglercraft.v1_8.sp.internal.ClientPlatformSingleplayer;
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.lan.LANPeerEvent;
|
import net.lax1dude.eaglercraft.v1_8.sp.lan.LANPeerEvent;
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayLoggerImpl;
|
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayQuery;
|
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayQueryImpl;
|
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayQueryRateLimitDummy;
|
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayServerRateLimitTracker;
|
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayServerSocket;
|
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayServerSocketImpl;
|
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayServerSocketRateLimitDummy;
|
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayWorldsQuery;
|
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayWorldsQueryImpl;
|
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayWorldsQueryRateLimitDummy;
|
|
||||||
|
|
||||||
import org.apache.commons.lang3.SystemUtils;
|
import org.apache.commons.lang3.SystemUtils;
|
||||||
import org.json.JSONArray;
|
import org.json.JSONArray;
|
||||||
|
@ -50,11 +40,8 @@ public class PlatformWebRTC {
|
||||||
|
|
||||||
private static final Logger logger = LogManager.getLogger("PlatformWebRTC");
|
private static final Logger logger = LogManager.getLogger("PlatformWebRTC");
|
||||||
|
|
||||||
private static final RelayLoggerImpl loggerImpl = new RelayLoggerImpl(LogManager.getLogger("RelayPacket"));
|
|
||||||
|
|
||||||
private static final Object lock1 = new Object();
|
private static final Object lock1 = new Object();
|
||||||
private static final Object lock2 = new Object();
|
private static final Object lock2 = new Object();
|
||||||
private static final Object lock3 = new Object();
|
|
||||||
|
|
||||||
private static final List<ScheduledRunnable> scheduledRunnables = new LinkedList<>();
|
private static final List<ScheduledRunnable> scheduledRunnables = new LinkedList<>();
|
||||||
|
|
||||||
|
@ -93,8 +80,6 @@ public class PlatformWebRTC {
|
||||||
return supported;
|
return supported;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final Map<String, RTCDataChannel> fuckTeaVM = new HashMap<>();
|
|
||||||
|
|
||||||
private static final Comparator<ScheduledRunnable> sortTasks = (r1, r2) -> {
|
private static final Comparator<ScheduledRunnable> sortTasks = (r1, r2) -> {
|
||||||
return (int)(r1.runAt - r2.runAt);
|
return (int)(r1.runAt - r2.runAt);
|
||||||
};
|
};
|
||||||
|
@ -177,9 +162,17 @@ public class PlatformWebRTC {
|
||||||
synchronized (lock1) {
|
synchronized (lock1) {
|
||||||
if (iceCandidate.sdp != null && !iceCandidate.sdp.isEmpty()) {
|
if (iceCandidate.sdp != null && !iceCandidate.sdp.isEmpty()) {
|
||||||
if (iceCandidates.isEmpty()) {
|
if (iceCandidates.isEmpty()) {
|
||||||
scheduleTask(3000l, () -> {
|
final int[] candidateState = new int[2];
|
||||||
|
final Runnable[] runnable = new Runnable[1];
|
||||||
|
scheduleTask(2000l, runnable[0] = () -> {
|
||||||
synchronized (lock1) {
|
synchronized (lock1) {
|
||||||
if (peerConnection != null && peerConnection.getConnectionState() != RTCPeerConnectionState.DISCONNECTED) {
|
if (peerConnection != null && peerConnection.getConnectionState() != RTCPeerConnectionState.DISCONNECTED) {
|
||||||
|
int trial = ++candidateState[1];
|
||||||
|
if(candidateState[0] != iceCandidates.size() && trial < 3) {
|
||||||
|
candidateState[0] = iceCandidates.size();
|
||||||
|
scheduleTask(2000l, runnable[0]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
clientICECandidate = JSONWriter.valueToString(iceCandidates);
|
clientICECandidate = JSONWriter.valueToString(iceCandidates);
|
||||||
iceCandidates.clear();
|
iceCandidates.clear();
|
||||||
}
|
}
|
||||||
|
@ -382,6 +375,8 @@ public class PlatformWebRTC {
|
||||||
public LANServer client;
|
public LANServer client;
|
||||||
public String peerId;
|
public String peerId;
|
||||||
public RTCPeerConnection peerConnection;
|
public RTCPeerConnection peerConnection;
|
||||||
|
public RTCDataChannel dataChannel;
|
||||||
|
public String ipcChannel;
|
||||||
|
|
||||||
public LANPeer(LANServer client, String peerId, RTCPeerConnection peerConnection) {
|
public LANPeer(LANServer client, String peerId, RTCPeerConnection peerConnection) {
|
||||||
this.client = client;
|
this.client = client;
|
||||||
|
@ -390,10 +385,9 @@ public class PlatformWebRTC {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void disconnect() {
|
public void disconnect() {
|
||||||
synchronized (fuckTeaVM) {
|
if(dataChannel != null) {
|
||||||
if (fuckTeaVM.get(peerId) != null) {
|
dataChannel.close();
|
||||||
fuckTeaVM.remove(peerId).close();
|
dataChannel = null;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
peerConnection.close();
|
peerConnection.close();
|
||||||
peerConnection = null;
|
peerConnection = null;
|
||||||
|
@ -472,16 +466,36 @@ public class PlatformWebRTC {
|
||||||
client.signalRemoteDisconnect(peerId);
|
client.signalRemoteDisconnect(peerId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void mapIPC(String ipcChannel) {
|
||||||
|
if(this.ipcChannel == null) {
|
||||||
|
if(ipcChannel != null) {
|
||||||
|
this.ipcChannel = ipcChannel;
|
||||||
|
synchronized(this.client.ipcMapList) {
|
||||||
|
this.client.ipcMapList.put(ipcChannel, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
if(ipcChannel == null) {
|
||||||
|
synchronized(this.client.ipcMapList) {
|
||||||
|
this.client.ipcMapList.remove(this.ipcChannel);
|
||||||
|
}
|
||||||
|
this.ipcChannel = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class LANServer {
|
public static class LANServer {
|
||||||
public Set<Map<String, String>> iceServers = new HashSet<>();
|
public Set<Map<String, String>> iceServers = new HashSet<>();
|
||||||
public Map<String, LANPeer> peerList = new HashMap<>();
|
public Map<String, LANPeer> peerList = new HashMap<>();
|
||||||
|
public Map<String, LANPeer> ipcMapList = new HashMap<>();
|
||||||
public byte peerState = PEERSTATE_LOADING;
|
public byte peerState = PEERSTATE_LOADING;
|
||||||
public byte peerStateConnect = PEERSTATE_LOADING;
|
public byte peerStateConnect = PEERSTATE_LOADING;
|
||||||
public byte peerStateInitial = PEERSTATE_LOADING;
|
public byte peerStateInitial = PEERSTATE_LOADING;
|
||||||
public byte peerStateDesc = PEERSTATE_LOADING;
|
public byte peerStateDesc = PEERSTATE_LOADING;
|
||||||
public byte peerStateIce = PEERSTATE_LOADING;
|
public byte peerStateIce = PEERSTATE_LOADING;
|
||||||
|
private final Object lock3 = new Object();
|
||||||
|
|
||||||
public void setIceServers(String[] urls) {
|
public void setIceServers(String[] urls) {
|
||||||
iceServers.clear();
|
iceServers.clear();
|
||||||
|
@ -502,23 +516,28 @@ public class PlatformWebRTC {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendPacketToRemoteClient(String peerId, RTCDataChannelBuffer buffer) {
|
public void sendPacketToRemoteClient(String peerId, RTCDataChannelBuffer buffer) {
|
||||||
LANPeer thePeer = this.peerList.get(peerId);
|
LANPeer thePeer;
|
||||||
|
synchronized(peerList) {
|
||||||
|
thePeer = peerList.get(peerId);
|
||||||
|
}
|
||||||
if (thePeer != null) {
|
if (thePeer != null) {
|
||||||
|
sendPacketToRemoteClient(thePeer, buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendPacketToRemoteClient(LANPeer thePeer, RTCDataChannelBuffer buffer) {
|
||||||
boolean b = false;
|
boolean b = false;
|
||||||
synchronized (fuckTeaVM) {
|
if(thePeer.dataChannel != null && thePeer.dataChannel.getState() == RTCDataChannelState.OPEN) {
|
||||||
if (fuckTeaVM.get(thePeer.peerId) != null && fuckTeaVM.get(thePeer.peerId).getState() == RTCDataChannelState.OPEN) {
|
|
||||||
try {
|
try {
|
||||||
fuckTeaVM.get(thePeer.peerId).send(buffer);
|
thePeer.dataChannel.send(buffer);
|
||||||
} catch (Throwable e) {
|
} catch (Exception e) {
|
||||||
b = true;
|
b = true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
b = true;
|
b = true;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if (b) {
|
if (b) {
|
||||||
signalRemoteDisconnect(peerId);
|
signalRemoteDisconnect(thePeer.peerId);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -537,16 +556,25 @@ public class PlatformWebRTC {
|
||||||
iceServer.password = server.getOrDefault("credential", null);
|
iceServer.password = server.getOrDefault("credential", null);
|
||||||
rtcConfig.iceServers.add(iceServer);
|
rtcConfig.iceServers.add(iceServer);
|
||||||
}
|
}
|
||||||
RTCPeerConnection[] peerConnection = new RTCPeerConnection[1];
|
final RTCPeerConnection[] peerConnection = new RTCPeerConnection[1];
|
||||||
|
final LANPeer[] peerInstance = new LANPeer[1];
|
||||||
peerConnection[0] = pcFactory.createPeerConnection(rtcConfig, new PeerConnectionObserver() {
|
peerConnection[0] = pcFactory.createPeerConnection(rtcConfig, new PeerConnectionObserver() {
|
||||||
@Override
|
@Override
|
||||||
public void onIceCandidate(RTCIceCandidate iceCandidate) {
|
public void onIceCandidate(RTCIceCandidate iceCandidate) {
|
||||||
synchronized (lock3) {
|
synchronized (lock3) {
|
||||||
if (iceCandidate.sdp != null && !iceCandidate.sdp.isEmpty()) {
|
if (iceCandidate.sdp != null && !iceCandidate.sdp.isEmpty()) {
|
||||||
if (iceCandidates.isEmpty()) {
|
if (iceCandidates.isEmpty()) {
|
||||||
scheduleTask(3000l, () -> {
|
final int[] candidateState = new int[2];
|
||||||
|
final Runnable[] runnable = new Runnable[1];
|
||||||
|
scheduleTask(2000l, runnable[0] = () -> {
|
||||||
synchronized (lock3) {
|
synchronized (lock3) {
|
||||||
if (peerConnection[0] != null && peerConnection[0].getConnectionState() != RTCPeerConnectionState.DISCONNECTED) {
|
if (peerConnection[0] != null && peerConnection[0].getConnectionState() != RTCPeerConnectionState.DISCONNECTED) {
|
||||||
|
int trial = ++candidateState[1];
|
||||||
|
if(candidateState[0] != iceCandidates.size() && trial < 3) {
|
||||||
|
candidateState[0] = iceCandidates.size();
|
||||||
|
scheduleTask(2000l, runnable[0]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
LANPeerEvent.LANPeerICECandidateEvent e = new LANPeerEvent.LANPeerICECandidateEvent(peerId, JSONWriter.valueToString(iceCandidates));
|
LANPeerEvent.LANPeerICECandidateEvent e = new LANPeerEvent.LANPeerICECandidateEvent(peerId, JSONWriter.valueToString(iceCandidates));
|
||||||
synchronized (serverLANEventBuffer) {
|
synchronized (serverLANEventBuffer) {
|
||||||
serverLANEventBuffer.put(peerId, e);
|
serverLANEventBuffer.put(peerId, e);
|
||||||
|
@ -582,9 +610,11 @@ public class PlatformWebRTC {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (dataChannel == null) return;
|
if (dataChannel == null) return;
|
||||||
synchronized (fuckTeaVM) {
|
if(peerInstance[0].dataChannel != null) {
|
||||||
fuckTeaVM.put(peerId, dataChannel);
|
dataChannel.close();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
peerInstance[0].dataChannel = dataChannel;
|
||||||
synchronized (serverLANEventBuffer) {
|
synchronized (serverLANEventBuffer) {
|
||||||
serverLANEventBuffer.put(peerId, new LANPeerEvent.LANPeerDataChannelEvent(peerId));
|
serverLANEventBuffer.put(peerId, new LANPeerEvent.LANPeerDataChannelEvent(peerId));
|
||||||
}
|
}
|
||||||
|
@ -604,11 +634,16 @@ public class PlatformWebRTC {
|
||||||
if (!buffer.binary) return;
|
if (!buffer.binary) return;
|
||||||
byte[] data = new byte[buffer.data.remaining()];
|
byte[] data = new byte[buffer.data.remaining()];
|
||||||
buffer.data.get(data);
|
buffer.data.get(data);
|
||||||
|
LANPeer peer = peerInstance[0];
|
||||||
|
if(peer.ipcChannel != null) {
|
||||||
|
ClientPlatformSingleplayer.sendPacket(new IPCPacketData(peer.ipcChannel, data));
|
||||||
|
}else {
|
||||||
LANPeerEvent.LANPeerPacketEvent e = new LANPeerEvent.LANPeerPacketEvent(peerId, data);
|
LANPeerEvent.LANPeerPacketEvent e = new LANPeerEvent.LANPeerPacketEvent(peerId, data);
|
||||||
synchronized (serverLANEventBuffer) {
|
synchronized (serverLANEventBuffer) {
|
||||||
serverLANEventBuffer.put(peerId, e);
|
serverLANEventBuffer.put(peerId, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -627,8 +662,10 @@ public class PlatformWebRTC {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
LANPeer peerInstance = new LANPeer(this, peerId, peerConnection[0]);
|
peerInstance[0] = new LANPeer(this, peerId, peerConnection[0]);
|
||||||
peerList.put(peerId, peerInstance);
|
synchronized(peerList) {
|
||||||
|
peerList.put(peerId, peerInstance[0]);
|
||||||
|
}
|
||||||
if (peerStateConnect != PEERSTATE_SUCCESS) peerStateConnect = PEERSTATE_SUCCESS;
|
if (peerStateConnect != PEERSTATE_SUCCESS) peerStateConnect = PEERSTATE_SUCCESS;
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
if (peerStateConnect == PEERSTATE_LOADING) peerStateConnect = PEERSTATE_FAILED;
|
if (peerStateConnect == PEERSTATE_LOADING) peerStateConnect = PEERSTATE_FAILED;
|
||||||
|
@ -636,14 +673,20 @@ public class PlatformWebRTC {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void signalRemoteDescription(String peerId, String descJSON) {
|
public void signalRemoteDescription(String peerId, String descJSON) {
|
||||||
LANPeer thePeer = peerList.get(peerId);
|
LANPeer thePeer;
|
||||||
|
synchronized(peerList) {
|
||||||
|
thePeer = peerList.get(peerId);
|
||||||
|
}
|
||||||
if (thePeer != null) {
|
if (thePeer != null) {
|
||||||
thePeer.setRemoteDescription(descJSON);
|
thePeer.setRemoteDescription(descJSON);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void signalRemoteICECandidate(String peerId, String candidate) {
|
public void signalRemoteICECandidate(String peerId, String candidate) {
|
||||||
LANPeer thePeer = peerList.get(peerId);
|
LANPeer thePeer;
|
||||||
|
synchronized(peerList) {
|
||||||
|
thePeer = peerList.get(peerId);
|
||||||
|
}
|
||||||
if (thePeer != null) {
|
if (thePeer != null) {
|
||||||
thePeer.addICECandidate(candidate);
|
thePeer.addICECandidate(candidate);
|
||||||
}
|
}
|
||||||
|
@ -651,7 +694,12 @@ public class PlatformWebRTC {
|
||||||
|
|
||||||
public void signalRemoteDisconnect(String peerId) {
|
public void signalRemoteDisconnect(String peerId) {
|
||||||
if (peerId == null || peerId.isEmpty()) {
|
if (peerId == null || peerId.isEmpty()) {
|
||||||
for (LANPeer thePeer : peerList.values()) {
|
List<LANPeer> cpy;
|
||||||
|
synchronized(peerList) {
|
||||||
|
cpy = new ArrayList<>(peerList.values());
|
||||||
|
peerList.clear();
|
||||||
|
}
|
||||||
|
for (LANPeer thePeer : cpy) {
|
||||||
if (thePeer != null) {
|
if (thePeer != null) {
|
||||||
try {
|
try {
|
||||||
thePeer.disconnect();
|
thePeer.disconnect();
|
||||||
|
@ -662,54 +710,43 @@ public class PlatformWebRTC {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
peerList.clear();
|
|
||||||
synchronized (fuckTeaVM) {
|
|
||||||
fuckTeaVM.clear();
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
LANPeer thePeer = peerList.get(peerId);
|
LANPeer thePeer;
|
||||||
|
synchronized(peerList) {
|
||||||
|
thePeer = peerList.remove(peerId);
|
||||||
|
}
|
||||||
if (thePeer != null) {
|
if (thePeer != null) {
|
||||||
peerList.remove(peerId);
|
if(thePeer.ipcChannel != null) {
|
||||||
|
synchronized(ipcMapList) {
|
||||||
|
ipcMapList.remove(thePeer.ipcChannel);
|
||||||
|
}
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
thePeer.disconnect();
|
thePeer.disconnect();
|
||||||
} catch (Throwable ignored) {
|
} catch (Throwable ignored) {
|
||||||
}
|
}
|
||||||
synchronized (fuckTeaVM) {
|
|
||||||
fuckTeaVM.remove(peerId);
|
|
||||||
}
|
|
||||||
synchronized (serverLANEventBuffer) {
|
synchronized (serverLANEventBuffer) {
|
||||||
serverLANEventBuffer.put(thePeer.peerId, new LANPeerEvent.LANPeerDisconnectEvent(peerId));
|
serverLANEventBuffer.put(thePeer.peerId, new LANPeerEvent.LANPeerDisconnectEvent(peerId));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void serverPeerMapIPC(String peer, String ipcChannel) {
|
||||||
|
LANPeer peerr;
|
||||||
|
synchronized(peerList) {
|
||||||
|
peerr = peerList.get(peer);
|
||||||
|
}
|
||||||
|
if(peerr != null) {
|
||||||
|
peerr.mapIPC(ipcChannel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public int countPeers() {
|
public int countPeers() {
|
||||||
|
synchronized(peerList) {
|
||||||
return peerList.size();
|
return peerList.size();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public static RelayQuery openRelayQuery(String addr) {
|
|
||||||
RelayQuery.RateLimit limit = RelayServerRateLimitTracker.isLimited(addr);
|
|
||||||
if(limit == RelayQuery.RateLimit.LOCKED || limit == RelayQuery.RateLimit.BLOCKED) {
|
|
||||||
return new RelayQueryRateLimitDummy(limit);
|
|
||||||
}
|
|
||||||
return new RelayQueryImpl(addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static RelayWorldsQuery openRelayWorldsQuery(String addr) {
|
|
||||||
RelayQuery.RateLimit limit = RelayServerRateLimitTracker.isLimited(addr);
|
|
||||||
if(limit == RelayQuery.RateLimit.LOCKED || limit == RelayQuery.RateLimit.BLOCKED) {
|
|
||||||
return new RelayWorldsQueryRateLimitDummy(limit);
|
|
||||||
}
|
|
||||||
return new RelayWorldsQueryImpl(addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static RelayServerSocket openRelayConnection(String addr, int timeout) {
|
|
||||||
RelayQuery.RateLimit limit = RelayServerRateLimitTracker.isLimited(addr);
|
|
||||||
if(limit == RelayQuery.RateLimit.LOCKED || limit == RelayQuery.RateLimit.BLOCKED) {
|
|
||||||
return new RelayServerSocketRateLimitDummy(limit);
|
|
||||||
}
|
|
||||||
return new RelayServerSocketImpl(addr, timeout);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static LANClient rtcLANClient = null;
|
private static LANClient rtcLANClient = null;
|
||||||
|
@ -883,6 +920,27 @@ public class PlatformWebRTC {
|
||||||
rtcLANServer.signalRemoteDescription(peer, description);
|
rtcLANServer.signalRemoteDescription(peer, description);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void serverLANPeerMapIPC(String peer, String ipcChannel) {
|
||||||
|
rtcLANServer.serverPeerMapIPC(peer, ipcChannel);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean serverLANPeerPassIPC(IPCPacketData ipcPacket) {
|
||||||
|
if(rtcLANServer != null) {
|
||||||
|
LANPeer peer;
|
||||||
|
synchronized(rtcLANServer.ipcMapList) {
|
||||||
|
peer = rtcLANServer.ipcMapList.get(ipcPacket.channel);
|
||||||
|
}
|
||||||
|
if(peer != null) {
|
||||||
|
rtcLANServer.sendPacketToRemoteClient(peer, new RTCDataChannelBuffer(ByteBuffer.wrap(ipcPacket.contents), true));
|
||||||
|
return true;
|
||||||
|
}else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void serverLANDisconnectPeer(String peer) {
|
public static void serverLANDisconnectPeer(String peer) {
|
||||||
rtcLANServer.signalRemoteDisconnect(peer);
|
rtcLANServer.signalRemoteDisconnect(peer);
|
||||||
}
|
}
|
||||||
|
@ -893,4 +951,5 @@ public class PlatformWebRTC {
|
||||||
}
|
}
|
||||||
return rtcLANServer.countPeers();
|
return rtcLANServer.countPeers();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -141,7 +141,7 @@ public class EaglerLWJGLByteBuffer implements ByteBuffer {
|
||||||
int l = src.remaining();
|
int l = src.remaining();
|
||||||
if(position + l > limit) throw Buffer.makeIOOBE(position + l - 1);
|
if(position + l > limit) throw Buffer.makeIOOBE(position + l - 1);
|
||||||
for(int i = 0; i < l; ++i) {
|
for(int i = 0; i < l; ++i) {
|
||||||
UnsafeUtils.setMemByte(address + position + l, src.get());
|
UnsafeUtils.setMemByte(address + position + i, src.get());
|
||||||
}
|
}
|
||||||
position += l;
|
position += l;
|
||||||
}
|
}
|
||||||
|
|
|
@ -150,7 +150,7 @@ public class EaglerLWJGLFloatBuffer implements FloatBuffer {
|
||||||
int l = src.remaining();
|
int l = src.remaining();
|
||||||
if(position + l > limit) throw Buffer.makeIOOBE(position + l - 1);
|
if(position + l > limit) throw Buffer.makeIOOBE(position + l - 1);
|
||||||
for(int i = 0; i < l; ++i) {
|
for(int i = 0; i < l; ++i) {
|
||||||
UnsafeUtils.setMemFloat(address + ((position + l) << SHIFT), src.get());
|
UnsafeUtils.setMemFloat(address + ((position + i) << SHIFT), src.get());
|
||||||
}
|
}
|
||||||
position += l;
|
position += l;
|
||||||
}
|
}
|
||||||
|
|
|
@ -150,7 +150,7 @@ public class EaglerLWJGLIntBuffer implements IntBuffer {
|
||||||
int l = src.remaining();
|
int l = src.remaining();
|
||||||
if(position + l > limit) throw Buffer.makeIOOBE(position + l - 1);
|
if(position + l > limit) throw Buffer.makeIOOBE(position + l - 1);
|
||||||
for(int i = 0; i < l; ++i) {
|
for(int i = 0; i < l; ++i) {
|
||||||
UnsafeUtils.setMemInt(address + ((position + l) << SHIFT), src.get());
|
UnsafeUtils.setMemInt(address + ((position + i) << SHIFT), src.get());
|
||||||
}
|
}
|
||||||
position += l;
|
position += l;
|
||||||
}
|
}
|
||||||
|
|
|
@ -150,7 +150,7 @@ public class EaglerLWJGLShortBuffer implements ShortBuffer {
|
||||||
int l = src.remaining();
|
int l = src.remaining();
|
||||||
if(position + l > limit) throw Buffer.makeIOOBE(position + l - 1);
|
if(position + l > limit) throw Buffer.makeIOOBE(position + l - 1);
|
||||||
for(int i = 0; i < l; ++i) {
|
for(int i = 0; i < l; ++i) {
|
||||||
UnsafeUtils.setMemInt(address + ((position + l) << SHIFT), src.get());
|
UnsafeUtils.setMemInt(address + ((position + i) << SHIFT), src.get());
|
||||||
}
|
}
|
||||||
position += l;
|
position += l;
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ import net.lax1dude.eaglercraft.v1_8.Filesystem;
|
||||||
import net.lax1dude.eaglercraft.v1_8.internal.IClientConfigAdapter;
|
import net.lax1dude.eaglercraft.v1_8.internal.IClientConfigAdapter;
|
||||||
import net.lax1dude.eaglercraft.v1_8.internal.IEaglerFilesystem;
|
import net.lax1dude.eaglercraft.v1_8.internal.IEaglerFilesystem;
|
||||||
import net.lax1dude.eaglercraft.v1_8.internal.IPCPacketData;
|
import net.lax1dude.eaglercraft.v1_8.internal.IPCPacketData;
|
||||||
|
import net.lax1dude.eaglercraft.v1_8.internal.PlatformWebRTC;
|
||||||
import net.lax1dude.eaglercraft.v1_8.internal.lwjgl.DesktopClientConfigAdapter;
|
import net.lax1dude.eaglercraft.v1_8.internal.lwjgl.DesktopClientConfigAdapter;
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.server.internal.lwjgl.MemoryConnection;
|
import net.lax1dude.eaglercraft.v1_8.sp.server.internal.lwjgl.MemoryConnection;
|
||||||
|
|
||||||
|
@ -45,6 +46,9 @@ public class ServerPlatformSingleplayer {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void sendPacket(IPCPacketData packet) {
|
public static void sendPacket(IPCPacketData packet) {
|
||||||
|
if(PlatformWebRTC.serverLANPeerPassIPC(packet)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
synchronized(MemoryConnection.serverToClientQueue) {
|
synchronized(MemoryConnection.serverToClientQueue) {
|
||||||
MemoryConnection.serverToClientQueue.add(packet);
|
MemoryConnection.serverToClientQueue.add(packet);
|
||||||
}
|
}
|
||||||
|
|
|
@ -215,10 +215,12 @@ public class EagRuntime {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void getStackTrace(Throwable t, Consumer<String> ret) {
|
public static void getStackTrace(Throwable t, Consumer<String> ret) {
|
||||||
|
if(t == null) return;
|
||||||
PlatformRuntime.getStackTrace(t, ret);
|
PlatformRuntime.getStackTrace(t, ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String[] getStackTraceElements(Throwable t) {
|
public static String[] getStackTraceElements(Throwable t) {
|
||||||
|
if(t == null) return new String[0];
|
||||||
List<String> lst = new ArrayList<>();
|
List<String> lst = new ArrayList<>();
|
||||||
PlatformRuntime.getStackTrace(t, (s) -> {
|
PlatformRuntime.getStackTrace(t, (s) -> {
|
||||||
lst.add(s);
|
lst.add(s);
|
||||||
|
@ -227,6 +229,9 @@ public class EagRuntime {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getStackTrace(Throwable t) {
|
public static String getStackTrace(Throwable t) {
|
||||||
|
if(t == null) {
|
||||||
|
return "[null]";
|
||||||
|
}
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
getStackTrace0(t, sb);
|
getStackTrace0(t, sb);
|
||||||
Throwable c = t.getCause();
|
Throwable c = t.getCause();
|
||||||
|
|
|
@ -21,7 +21,6 @@ import net.minecraft.client.audio.SoundHandler;
|
||||||
import net.minecraft.client.audio.SoundPoolEntry;
|
import net.minecraft.client.audio.SoundPoolEntry;
|
||||||
import net.minecraft.client.settings.GameSettings;
|
import net.minecraft.client.settings.GameSettings;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.util.ITickable;
|
|
||||||
import net.minecraft.util.MathHelper;
|
import net.minecraft.util.MathHelper;
|
||||||
import net.minecraft.util.ResourceLocation;
|
import net.minecraft.util.ResourceLocation;
|
||||||
|
|
||||||
|
@ -42,7 +41,7 @@ import net.minecraft.util.ResourceLocation;
|
||||||
*/
|
*/
|
||||||
public class EaglercraftSoundManager {
|
public class EaglercraftSoundManager {
|
||||||
|
|
||||||
protected static class ActiveSoundEvent {
|
protected class ActiveSoundEvent {
|
||||||
|
|
||||||
protected final EaglercraftSoundManager manager;
|
protected final EaglercraftSoundManager manager;
|
||||||
|
|
||||||
|
@ -88,14 +87,11 @@ public class EaglercraftSoundManager {
|
||||||
activeZ = z;
|
activeZ = z;
|
||||||
}
|
}
|
||||||
if(pitch != activePitch) {
|
if(pitch != activePitch) {
|
||||||
soundHandle.pitch(MathHelper.clamp_float(pitch * (float)soundConfig.getPitch(), 0.5f, 2.0f));
|
soundHandle.pitch(EaglercraftSoundManager.this.getNormalizedPitch(soundInstance, soundConfig));
|
||||||
activePitch = pitch;
|
activePitch = pitch;
|
||||||
}
|
}
|
||||||
if(gain != activeGain) {
|
if(gain != activeGain) {
|
||||||
float attenuatedGain = gain * manager.categoryVolumes[SoundCategory.MASTER.getCategoryId()] *
|
soundHandle.gain(EaglercraftSoundManager.this.getNormalizedVolume(soundInstance, soundConfig, soundCategory));
|
||||||
(soundCategory == SoundCategory.MASTER ? 1.0f : manager.categoryVolumes[soundCategory.getCategoryId()])
|
|
||||||
* (float)soundConfig.getVolume();
|
|
||||||
soundHandle.gain(MathHelper.clamp_float(attenuatedGain, 0.0f, 1.0f));
|
|
||||||
activeGain = gain;
|
activeGain = gain;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -152,10 +148,7 @@ public class EaglercraftSoundManager {
|
||||||
ActiveSoundEvent evt = soundItr.next();
|
ActiveSoundEvent evt = soundItr.next();
|
||||||
if((category == SoundCategory.MASTER || evt.soundCategory == category)
|
if((category == SoundCategory.MASTER || evt.soundCategory == category)
|
||||||
&& !evt.soundHandle.shouldFree()) {
|
&& !evt.soundHandle.shouldFree()) {
|
||||||
float newVolume = (evt.activeGain = evt.soundInstance.getVolume()) * categoryVolumes[SoundCategory.MASTER.getCategoryId()] *
|
float newVolume = getNormalizedVolume(evt.soundInstance, evt.soundConfig, evt.soundCategory);
|
||||||
(evt.soundCategory == SoundCategory.MASTER ? 1.0f : categoryVolumes[evt.soundCategory.getCategoryId()])
|
|
||||||
* (float)evt.soundConfig.getVolume();
|
|
||||||
newVolume = MathHelper.clamp_float(newVolume, 0.0f, 1.0f);
|
|
||||||
if(newVolume > 0.0f) {
|
if(newVolume > 0.0f) {
|
||||||
evt.soundHandle.gain(newVolume);
|
evt.soundHandle.gain(newVolume);
|
||||||
}else {
|
}else {
|
||||||
|
@ -211,34 +204,34 @@ public class EaglercraftSoundManager {
|
||||||
Iterator<ActiveSoundEvent> soundItr = activeSounds.iterator();
|
Iterator<ActiveSoundEvent> soundItr = activeSounds.iterator();
|
||||||
while(soundItr.hasNext()) {
|
while(soundItr.hasNext()) {
|
||||||
ActiveSoundEvent evt = soundItr.next();
|
ActiveSoundEvent evt = soundItr.next();
|
||||||
if(!evt.paused && (evt.soundInstance instanceof ITickable)) {
|
boolean persist = false;
|
||||||
|
if(!evt.paused && (evt.soundInstance instanceof ITickableSound)) {
|
||||||
boolean destroy = false;
|
boolean destroy = false;
|
||||||
|
ITickableSound snd = (ITickableSound) evt.soundInstance;
|
||||||
|
lbl : {
|
||||||
try {
|
try {
|
||||||
((ITickable)evt.soundInstance).update();
|
snd.update();
|
||||||
if ((evt.soundInstance instanceof ITickableSound)
|
if(snd.isDonePlaying()) {
|
||||||
&& ((ITickableSound) evt.soundInstance).isDonePlaying()) {
|
|
||||||
destroy = true;
|
destroy = true;
|
||||||
|
break lbl;
|
||||||
}
|
}
|
||||||
|
persist = true;
|
||||||
}catch(Throwable t) {
|
}catch(Throwable t) {
|
||||||
logger.error("Error ticking sound: {}", t.toString());
|
logger.error("Error ticking sound: {}", t.toString());
|
||||||
logger.error(t);
|
logger.error(t);
|
||||||
destroy = true;
|
destroy = true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if(destroy) {
|
if(destroy) {
|
||||||
if(!evt.soundHandle.shouldFree()) {
|
if(!evt.soundHandle.shouldFree()) {
|
||||||
evt.soundHandle.end();
|
evt.soundHandle.end();
|
||||||
}
|
}
|
||||||
soundItr.remove();
|
soundItr.remove();
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(evt.soundHandle.shouldFree()) {
|
if(evt.soundHandle.shouldFree()) {
|
||||||
if(evt.soundInstance.canRepeat()) {
|
if(!persist) {
|
||||||
if(!evt.paused && ++evt.repeatCounter > evt.soundInstance.getRepeatDelay()) {
|
|
||||||
evt.repeatCounter = 0;
|
|
||||||
evt.updateLocation();
|
|
||||||
evt.soundHandle.restart();
|
|
||||||
}
|
|
||||||
}else {
|
|
||||||
soundItr.remove();
|
soundItr.remove();
|
||||||
}
|
}
|
||||||
}else {
|
}else {
|
||||||
|
@ -323,17 +316,16 @@ public class EaglercraftSoundManager {
|
||||||
|
|
||||||
ActiveSoundEvent newSound = new ActiveSoundEvent(this, sound, accessor.getSoundCategory(), etr, null);
|
ActiveSoundEvent newSound = new ActiveSoundEvent(this, sound, accessor.getSoundCategory(), etr, null);
|
||||||
|
|
||||||
float pitch = MathHelper.clamp_float(newSound.activePitch * (float)etr.getPitch(), 0.5f, 2.0f);
|
float pitch = getNormalizedPitch(sound, etr);
|
||||||
float attenuatedGain = newSound.activeGain * categoryVolumes[SoundCategory.MASTER.getCategoryId()] *
|
float attenuatedGain = getNormalizedVolume(sound, etr, accessor.getSoundCategory());
|
||||||
(accessor.getSoundCategory() == SoundCategory.MASTER ? 1.0f :
|
boolean repeat = sound.canRepeat();
|
||||||
categoryVolumes[accessor.getSoundCategory().getCategoryId()]) * (float)etr.getVolume();
|
|
||||||
|
|
||||||
AttenuationType tp = sound.getAttenuationType();
|
AttenuationType tp = sound.getAttenuationType();
|
||||||
if(tp == AttenuationType.LINEAR) {
|
if(tp == AttenuationType.LINEAR) {
|
||||||
newSound.soundHandle = PlatformAudio.beginPlayback(trk, newSound.activeX, newSound.activeY,
|
newSound.soundHandle = PlatformAudio.beginPlayback(trk, newSound.activeX, newSound.activeY,
|
||||||
newSound.activeZ, attenuatedGain, pitch);
|
newSound.activeZ, attenuatedGain, pitch, repeat);
|
||||||
}else {
|
}else {
|
||||||
newSound.soundHandle = PlatformAudio.beginPlaybackStatic(trk, attenuatedGain, pitch);
|
newSound.soundHandle = PlatformAudio.beginPlaybackStatic(trk, attenuatedGain, pitch, repeat);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(newSound.soundHandle == null) {
|
if(newSound.soundHandle == null) {
|
||||||
|
@ -351,6 +343,17 @@ public class EaglercraftSoundManager {
|
||||||
queuedSounds.add(new WaitingSoundEvent(sound, delay));
|
queuedSounds.add(new WaitingSoundEvent(sound, delay));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private float getNormalizedVolume(ISound sound, SoundPoolEntry entry, SoundCategory category) {
|
||||||
|
return (float) MathHelper.clamp_double((double) sound.getVolume() * entry.getVolume(), 0.0D, 1.0D)
|
||||||
|
* (category.getCategoryId() == SoundCategory.MASTER.getCategoryId() ? 1.0f
|
||||||
|
: categoryVolumes[category.getCategoryId()])
|
||||||
|
* categoryVolumes[SoundCategory.MASTER.getCategoryId()];
|
||||||
|
}
|
||||||
|
|
||||||
|
private float getNormalizedPitch(ISound sound, SoundPoolEntry entry) {
|
||||||
|
return MathHelper.clamp_float(sound.getPitch() * (float)entry.getPitch(), 0.5f, 2.0f);
|
||||||
|
}
|
||||||
|
|
||||||
public void setListener(EntityPlayer player, float partialTicks) {
|
public void setListener(EntityPlayer player, float partialTicks) {
|
||||||
if(!PlatformAudio.available()) {
|
if(!PlatformAudio.available()) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -10,7 +10,7 @@ public class EaglercraftVersion {
|
||||||
/// Customize these to fit your fork:
|
/// Customize these to fit your fork:
|
||||||
|
|
||||||
public static final String projectForkName = "EaglercraftX";
|
public static final String projectForkName = "EaglercraftX";
|
||||||
public static final String projectForkVersion = "u41";
|
public static final String projectForkVersion = "u42";
|
||||||
public static final String projectForkVendor = "lax1dude";
|
public static final String projectForkVendor = "lax1dude";
|
||||||
|
|
||||||
public static final String projectForkURL = "https://gitlab.com/lax1dude/eaglercraftx-1.8";
|
public static final String projectForkURL = "https://gitlab.com/lax1dude/eaglercraftx-1.8";
|
||||||
|
@ -20,20 +20,20 @@ public class EaglercraftVersion {
|
||||||
public static final String projectOriginName = "EaglercraftX";
|
public static final String projectOriginName = "EaglercraftX";
|
||||||
public static final String projectOriginAuthor = "lax1dude";
|
public static final String projectOriginAuthor = "lax1dude";
|
||||||
public static final String projectOriginRevision = "1.8";
|
public static final String projectOriginRevision = "1.8";
|
||||||
public static final String projectOriginVersion = "u41";
|
public static final String projectOriginVersion = "u42";
|
||||||
|
|
||||||
public static final String projectOriginURL = "https://gitlab.com/lax1dude/eaglercraftx-1.8"; // rest in peace
|
public static final String projectOriginURL = "https://gitlab.com/lax1dude/eaglercraftx-1.8"; // rest in peace
|
||||||
|
|
||||||
// EPK Version Identifier
|
// EPK Version Identifier
|
||||||
|
|
||||||
public static final String EPKVersionIdentifier = "u41"; // Set to null to disable EPK version check
|
public static final String EPKVersionIdentifier = "u42"; // Set to null to disable EPK version check
|
||||||
|
|
||||||
// Updating configuration
|
// Updating configuration
|
||||||
|
|
||||||
public static final boolean enableUpdateService = true;
|
public static final boolean enableUpdateService = true;
|
||||||
|
|
||||||
public static final String updateBundlePackageName = "net.lax1dude.eaglercraft.v1_8.client";
|
public static final String updateBundlePackageName = "net.lax1dude.eaglercraft.v1_8.client";
|
||||||
public static final int updateBundlePackageVersionInt = 41;
|
public static final int updateBundlePackageVersionInt = 42;
|
||||||
|
|
||||||
public static final String updateLatestLocalStorageKey = "latestUpdate_" + updateBundlePackageName;
|
public static final String updateLatestLocalStorageKey = "latestUpdate_" + updateBundlePackageName;
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@ package net.lax1dude.eaglercraft.v1_8.internal;
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public enum EnumPlatformType {
|
public enum EnumPlatformType {
|
||||||
DESKTOP("Desktop"), JAVASCRIPT("JavaScript"), ASM("ASM");
|
DESKTOP("Desktop"), JAVASCRIPT("JavaScript"), WASM_GC("ASM");
|
||||||
|
|
||||||
private final String name;
|
private final String name;
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,8 @@ public interface IAudioHandle {
|
||||||
|
|
||||||
void restart();
|
void restart();
|
||||||
|
|
||||||
|
void repeat(boolean en);
|
||||||
|
|
||||||
void move(float x, float y, float z);
|
void move(float x, float y, float z);
|
||||||
|
|
||||||
void pitch(float f);
|
void pitch(float f);
|
||||||
|
|
|
@ -283,7 +283,7 @@ public class EaglerFolderResourcePack extends AbstractResourcePack {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PlatformRuntime.downloadRemoteURIByteArray(url, arr -> {
|
PlatformRuntime.downloadRemoteURIByteArray(url, true, arr -> {
|
||||||
ast.accept(() -> {
|
ast.accept(() -> {
|
||||||
if (arr == null) {
|
if (arr == null) {
|
||||||
cb.accept(null);
|
cb.accept(null);
|
||||||
|
|
|
@ -517,6 +517,8 @@ public class FontMappingHelper {
|
||||||
return 253;
|
return 253;
|
||||||
case 9632:
|
case 9632:
|
||||||
return 254;
|
return 254;
|
||||||
|
case 160:
|
||||||
|
return 32; //nbsp
|
||||||
default:
|
default:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -162,7 +162,6 @@ public class SingleplayerServerController implements ISaveFormat {
|
||||||
}else {
|
}else {
|
||||||
openLANChannels.add(ch);
|
openLANChannels.add(ch);
|
||||||
sendIPCPacket(new IPCPacket0CPlayerChannel(ch, true));
|
sendIPCPacket(new IPCPacket0CPlayerChannel(ch, true));
|
||||||
PlatformWebRTC.serverLANCreatePeer(ch);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -288,6 +287,8 @@ public class SingleplayerServerController implements ISaveFormat {
|
||||||
logger.warn("Recieved {} byte packet on closed local player connection", packetData.contents.length);
|
logger.warn("Recieved {} byte packet on closed local player connection", packetData.contents.length);
|
||||||
}
|
}
|
||||||
}else {
|
}else {
|
||||||
|
//logger.warn("Recieved packet on IPC channel '{}', forwarding to PlatformWebRTC even though the channel should be mapped", packetData.channel);
|
||||||
|
// just to be safe
|
||||||
PlatformWebRTC.serverLANWritePacket(packetData.channel, packetData.contents);
|
PlatformWebRTC.serverLANWritePacket(packetData.channel, packetData.contents);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,9 +6,7 @@ import net.lax1dude.eaglercraft.v1_8.sp.WorkerStartupFailedException;
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.ipc.IPCPacket15Crashed;
|
import net.lax1dude.eaglercraft.v1_8.sp.ipc.IPCPacket15Crashed;
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.ipc.IPCPacket1CIssueDetected;
|
import net.lax1dude.eaglercraft.v1_8.sp.ipc.IPCPacket1CIssueDetected;
|
||||||
import net.minecraft.client.gui.GuiButton;
|
import net.minecraft.client.gui.GuiButton;
|
||||||
import net.minecraft.client.gui.GuiMainMenu;
|
|
||||||
import net.minecraft.client.gui.GuiScreen;
|
import net.minecraft.client.gui.GuiScreen;
|
||||||
import net.minecraft.client.gui.GuiSelectWorld;
|
|
||||||
import net.minecraft.client.resources.I18n;
|
import net.minecraft.client.resources.I18n;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -151,7 +151,7 @@ public class GuiShareToLan extends GuiScreen {
|
||||||
}
|
}
|
||||||
this.mc.displayGuiScreen(null);
|
this.mc.displayGuiScreen(null);
|
||||||
LoadingScreenRenderer ls = mc.loadingScreen;
|
LoadingScreenRenderer ls = mc.loadingScreen;
|
||||||
String code = LANServerController.shareToLAN(ls::resetProgressAndMessage, worldName, hiddenToggle);
|
String code = LANServerController.shareToLAN((msg) -> ls.eaglerShow(msg, null), worldName, hiddenToggle);
|
||||||
if (code != null) {
|
if (code != null) {
|
||||||
SingleplayerServerController.configureLAN(WorldSettings.GameType.getByName(this.gameMode), this.allowCommands);
|
SingleplayerServerController.configureLAN(WorldSettings.GameType.getByName(this.gameMode), this.allowCommands);
|
||||||
this.mc.ingameGUI.getChatGUI().printChatMessage(new ChatComponentText(I18n.format("lanServer.opened")
|
this.mc.ingameGUI.getChatGUI().printChatMessage(new ChatComponentText(I18n.format("lanServer.opened")
|
||||||
|
|
|
@ -1,10 +1,8 @@
|
||||||
package net.lax1dude.eaglercraft.v1_8.sp.lan;
|
package net.lax1dude.eaglercraft.v1_8.sp.lan;
|
||||||
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import net.lax1dude.eaglercraft.v1_8.EagRuntime;
|
import net.lax1dude.eaglercraft.v1_8.EagRuntime;
|
||||||
import net.lax1dude.eaglercraft.v1_8.EagUtils;
|
|
||||||
import net.lax1dude.eaglercraft.v1_8.internal.IPCPacketData;
|
import net.lax1dude.eaglercraft.v1_8.internal.IPCPacketData;
|
||||||
import net.lax1dude.eaglercraft.v1_8.internal.PlatformWebRTC;
|
import net.lax1dude.eaglercraft.v1_8.internal.PlatformWebRTC;
|
||||||
import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
|
import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
|
||||||
|
@ -33,42 +31,26 @@ class LANClientPeer {
|
||||||
|
|
||||||
private static final Logger logger = LogManager.getLogger("LANClientPeer");
|
private static final Logger logger = LogManager.getLogger("LANClientPeer");
|
||||||
|
|
||||||
private static final int PRE = 0, SENT_ICE_CANDIDATE = 2, SENT_DESCRIPTION = 3, CONNECTED = 4, CLOSED = 5;
|
private static final int PRE = 0, RECEIVED_ICE_CANDIDATE = 1, SENT_ICE_CANDIDATE = 2, RECEIVED_DESCRIPTION = 3,
|
||||||
|
SENT_DESCRIPTION = 4, RECEIVED_SUCCESS = 5, CONNECTED = 6, CLOSED = 7;
|
||||||
|
|
||||||
protected final String clientId;
|
protected final String clientId;
|
||||||
|
|
||||||
protected int state = PRE;
|
protected int state = PRE;
|
||||||
protected boolean dead = false;
|
protected boolean dead = false;
|
||||||
|
|
||||||
|
protected long startTime;
|
||||||
|
|
||||||
protected LANClientPeer(String clientId) {
|
protected LANClientPeer(String clientId) {
|
||||||
this.clientId = clientId;
|
this.clientId = clientId;
|
||||||
|
this.startTime = EagRuntime.steadyTimeMillis();
|
||||||
PlatformWebRTC.serverLANCreatePeer(clientId);
|
PlatformWebRTC.serverLANCreatePeer(clientId);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void handleICECandidates(String candidates) {
|
protected void handleICECandidates(String candidates) {
|
||||||
if(state == SENT_DESCRIPTION) {
|
if(state == SENT_DESCRIPTION) {
|
||||||
PlatformWebRTC.serverLANPeerICECandidates(clientId, candidates);
|
PlatformWebRTC.serverLANPeerICECandidates(clientId, candidates);
|
||||||
long millis = EagRuntime.steadyTimeMillis();
|
state = RECEIVED_ICE_CANDIDATE;
|
||||||
do {
|
|
||||||
PlatformWebRTC.runScheduledTasks();
|
|
||||||
LANPeerEvent evt;
|
|
||||||
if((evt = PlatformWebRTC.serverLANGetEvent(clientId)) != null) {
|
|
||||||
if(evt instanceof LANPeerEvent.LANPeerICECandidateEvent) {
|
|
||||||
LANServerController.lanRelaySocket.writePacket(new RelayPacket03ICECandidate(clientId, ((LANPeerEvent.LANPeerICECandidateEvent)evt).candidates));
|
|
||||||
state = SENT_ICE_CANDIDATE;
|
|
||||||
return;
|
|
||||||
}else if(evt instanceof LANPeerEvent.LANPeerDisconnectEvent) {
|
|
||||||
logger.error("LAN client '{}' disconnected while waiting for server ICE candidates", clientId);
|
|
||||||
}else {
|
|
||||||
logger.error("LAN client '{}' had an accident: {}", clientId, evt.getClass().getSimpleName());
|
|
||||||
}
|
|
||||||
disconnect();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
EagUtils.sleep(20);
|
|
||||||
}while(EagRuntime.steadyTimeMillis() - millis < 5000l);
|
|
||||||
logger.error("Getting server ICE candidates for '{}' timed out!", clientId);
|
|
||||||
disconnect();
|
|
||||||
}else {
|
}else {
|
||||||
logger.error("Relay [{}] unexpected IPacket03ICECandidate for '{}'", LANServerController.lanRelaySocket.getURI(), clientId);
|
logger.error("Relay [{}] unexpected IPacket03ICECandidate for '{}'", LANServerController.lanRelaySocket.getURI(), clientId);
|
||||||
}
|
}
|
||||||
|
@ -77,27 +59,7 @@ class LANClientPeer {
|
||||||
protected void handleDescription(String description) {
|
protected void handleDescription(String description) {
|
||||||
if(state == PRE) {
|
if(state == PRE) {
|
||||||
PlatformWebRTC.serverLANPeerDescription(clientId, description);
|
PlatformWebRTC.serverLANPeerDescription(clientId, description);
|
||||||
long millis = EagRuntime.steadyTimeMillis();
|
state = RECEIVED_DESCRIPTION;
|
||||||
do {
|
|
||||||
PlatformWebRTC.runScheduledTasks();
|
|
||||||
LANPeerEvent evt;
|
|
||||||
if((evt = PlatformWebRTC.serverLANGetEvent(clientId)) != null) {
|
|
||||||
if(evt instanceof LANPeerEvent.LANPeerDescriptionEvent) {
|
|
||||||
LANServerController.lanRelaySocket.writePacket(new RelayPacket04Description(clientId, ((LANPeerEvent.LANPeerDescriptionEvent)evt).description));
|
|
||||||
state = SENT_DESCRIPTION;
|
|
||||||
return;
|
|
||||||
}else if(evt instanceof LANPeerEvent.LANPeerDisconnectEvent) {
|
|
||||||
logger.error("LAN client '{}' disconnected while waiting for server description", clientId);
|
|
||||||
}else {
|
|
||||||
logger.error("LAN client '{}' had an accident: {}", clientId, evt.getClass().getSimpleName());
|
|
||||||
}
|
|
||||||
disconnect();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
EagUtils.sleep(20);
|
|
||||||
}while(EagRuntime.steadyTimeMillis() - millis < 5000l);
|
|
||||||
logger.error("Getting server description for '{}' timed out!", clientId);
|
|
||||||
disconnect();
|
|
||||||
}else {
|
}else {
|
||||||
logger.error("Relay [{}] unexpected IPacket04Description for '{}'", LANServerController.lanRelaySocket.getURI(), clientId);
|
logger.error("Relay [{}] unexpected IPacket04Description for '{}'", LANServerController.lanRelaySocket.getURI(), clientId);
|
||||||
}
|
}
|
||||||
|
@ -105,31 +67,8 @@ class LANClientPeer {
|
||||||
|
|
||||||
protected void handleSuccess() {
|
protected void handleSuccess() {
|
||||||
if(state == SENT_ICE_CANDIDATE) {
|
if(state == SENT_ICE_CANDIDATE) {
|
||||||
long millis = EagRuntime.steadyTimeMillis();
|
state = RECEIVED_SUCCESS;
|
||||||
do {
|
}else if(state != CONNECTED) {
|
||||||
PlatformWebRTC.runScheduledTasks();
|
|
||||||
LANPeerEvent evt;
|
|
||||||
while((evt = PlatformWebRTC.serverLANGetEvent(clientId)) != null && evt instanceof LANPeerEvent.LANPeerICECandidateEvent) {
|
|
||||||
// skip ice candidates
|
|
||||||
}
|
|
||||||
if(evt != null) {
|
|
||||||
if(evt instanceof LANPeerEvent.LANPeerDataChannelEvent) {
|
|
||||||
SingleplayerServerController.openPlayerChannel(clientId);
|
|
||||||
state = CONNECTED;
|
|
||||||
return;
|
|
||||||
}else if(evt instanceof LANPeerEvent.LANPeerDisconnectEvent) {
|
|
||||||
logger.error("LAN client '{}' disconnected while waiting for connection", clientId);
|
|
||||||
}else {
|
|
||||||
logger.error("LAN client '{}' had an accident: {}", clientId, evt.getClass().getSimpleName());
|
|
||||||
}
|
|
||||||
disconnect();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
EagUtils.sleep(20);
|
|
||||||
}while(EagRuntime.steadyTimeMillis() - millis < 5000l);
|
|
||||||
logger.error("Getting server description for '{}' timed out!", clientId);
|
|
||||||
disconnect();
|
|
||||||
}else {
|
|
||||||
logger.error("Relay [{}] unexpected IPacket05ClientSuccess for '{}'", LANServerController.lanRelaySocket.getURI(), clientId);
|
logger.error("Relay [{}] unexpected IPacket05ClientSuccess for '{}'", LANServerController.lanRelaySocket.getURI(), clientId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -144,24 +83,67 @@ class LANClientPeer {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void update() {
|
protected void update() {
|
||||||
if(state == CONNECTED) {
|
if(state != CLOSED) {
|
||||||
|
if(state != CONNECTED && EagRuntime.steadyTimeMillis() - startTime > 10000l) {
|
||||||
|
logger.info("LAN client '{}' handshake timed out", clientId);
|
||||||
|
disconnect();
|
||||||
|
return;
|
||||||
|
}
|
||||||
List<LANPeerEvent> l = PlatformWebRTC.serverLANGetAllEvent(clientId);
|
List<LANPeerEvent> l = PlatformWebRTC.serverLANGetAllEvent(clientId);
|
||||||
if(l == null) {
|
if(l == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Iterator<LANPeerEvent> itr = l.iterator();
|
read_loop: for(int i = 0, s = l.size(); i < s; ++i) {
|
||||||
while(state == CONNECTED && itr.hasNext()) {
|
LANPeerEvent evt = l.get(i);
|
||||||
LANPeerEvent evt = itr.next();
|
if(evt instanceof LANPeerEvent.LANPeerDisconnectEvent) {
|
||||||
if(evt instanceof LANPeerEvent.LANPeerPacketEvent) {
|
|
||||||
ClientPlatformSingleplayer.sendPacket(new IPCPacketData(clientId, ((LANPeerEvent.LANPeerPacketEvent)evt).payload));
|
|
||||||
}else if(evt instanceof LANPeerEvent.LANPeerDisconnectEvent) {
|
|
||||||
logger.info("LAN client '{}' disconnected", clientId);
|
logger.info("LAN client '{}' disconnected", clientId);
|
||||||
disconnect();
|
disconnect();
|
||||||
}else {
|
}else {
|
||||||
|
switch(state) {
|
||||||
|
case RECEIVED_ICE_CANDIDATE: {
|
||||||
|
if(evt instanceof LANPeerEvent.LANPeerICECandidateEvent) {
|
||||||
|
LANServerController.lanRelaySocket.writePacket(new RelayPacket03ICECandidate(clientId, ((LANPeerEvent.LANPeerICECandidateEvent)evt).candidates));
|
||||||
|
state = SENT_ICE_CANDIDATE;
|
||||||
|
continue read_loop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case RECEIVED_DESCRIPTION: {
|
||||||
|
if(evt instanceof LANPeerEvent.LANPeerDescriptionEvent) {
|
||||||
|
LANServerController.lanRelaySocket.writePacket(new RelayPacket04Description(clientId, ((LANPeerEvent.LANPeerDescriptionEvent)evt).description));
|
||||||
|
state = SENT_DESCRIPTION;
|
||||||
|
continue read_loop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case SENT_ICE_CANDIDATE:
|
||||||
|
case RECEIVED_SUCCESS: {
|
||||||
|
if(evt instanceof LANPeerEvent.LANPeerDataChannelEvent) {
|
||||||
|
SingleplayerServerController.openPlayerChannel(clientId);
|
||||||
|
PlatformWebRTC.serverLANPeerMapIPC(clientId, clientId);
|
||||||
|
state = CONNECTED;
|
||||||
|
continue read_loop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case CONNECTED: {
|
||||||
|
if(evt instanceof LANPeerEvent.LANPeerPacketEvent) {
|
||||||
|
//logger.warn("Forwarding packet for '{}' to IPC channel manually, even though the channel should be mapped", clientId);
|
||||||
|
// just to be safe
|
||||||
|
ClientPlatformSingleplayer.sendPacket(new IPCPacketData(clientId, ((LANPeerEvent.LANPeerPacketEvent)evt).payload));
|
||||||
|
continue read_loop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(state != CLOSED) {
|
||||||
logger.error("LAN client '{}' had an accident: {}", clientId, evt.getClass().getSimpleName());
|
logger.error("LAN client '{}' had an accident: {}", clientId, evt.getClass().getSimpleName());
|
||||||
|
}
|
||||||
disconnect();
|
disconnect();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}else {
|
||||||
|
disconnect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@ import java.util.Set;
|
||||||
import net.lax1dude.eaglercraft.v1_8.EagRuntime;
|
import net.lax1dude.eaglercraft.v1_8.EagRuntime;
|
||||||
import net.lax1dude.eaglercraft.v1_8.internal.PlatformWebRTC;
|
import net.lax1dude.eaglercraft.v1_8.internal.PlatformWebRTC;
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayManager;
|
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayManager;
|
||||||
|
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayQueryDispatch;
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayServer;
|
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayServer;
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayWorldsQuery;
|
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayWorldsQuery;
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.relay.pkt.RelayPacket07LocalWorlds;
|
import net.lax1dude.eaglercraft.v1_8.sp.relay.pkt.RelayPacket07LocalWorlds;
|
||||||
|
@ -123,7 +124,7 @@ public class LANServerList {
|
||||||
for(int i = 0, l = RelayManager.relayManager.count(); i < l; ++i) {
|
for(int i = 0, l = RelayManager.relayManager.count(); i < l; ++i) {
|
||||||
RelayServer srv = RelayManager.relayManager.get(i);
|
RelayServer srv = RelayManager.relayManager.get(i);
|
||||||
if(!lanServersQueryList.containsKey(srv.address) && !deadURIs.contains(srv.address)) {
|
if(!lanServersQueryList.containsKey(srv.address) && !deadURIs.contains(srv.address)) {
|
||||||
lanServersQueryList.put(srv.address, PlatformWebRTC.openRelayWorldsQuery(srv.address));
|
lanServersQueryList.put(srv.address, RelayQueryDispatch.openRelayWorldsQuery(srv.address));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
package net.lax1dude.eaglercraft.v1_8.sp.relay;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class RelayQueryDispatch {
|
||||||
|
|
||||||
|
public static RelayQuery openRelayQuery(String addr) {
|
||||||
|
RelayQuery.RateLimit limit = RelayServerRateLimitTracker.isLimited(addr);
|
||||||
|
if(limit == RelayQuery.RateLimit.LOCKED || limit == RelayQuery.RateLimit.BLOCKED) {
|
||||||
|
return new RelayQueryRateLimitDummy(limit);
|
||||||
|
}
|
||||||
|
return new RelayQueryImpl(addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RelayWorldsQuery openRelayWorldsQuery(String addr) {
|
||||||
|
RelayQuery.RateLimit limit = RelayServerRateLimitTracker.isLimited(addr);
|
||||||
|
if(limit == RelayQuery.RateLimit.LOCKED || limit == RelayQuery.RateLimit.BLOCKED) {
|
||||||
|
return new RelayWorldsQueryRateLimitDummy(limit);
|
||||||
|
}
|
||||||
|
return new RelayWorldsQueryImpl(addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RelayServerSocket openRelayConnection(String addr, int timeout) {
|
||||||
|
RelayQuery.RateLimit limit = RelayServerRateLimitTracker.isLimited(addr);
|
||||||
|
if(limit == RelayQuery.RateLimit.LOCKED || limit == RelayQuery.RateLimit.BLOCKED) {
|
||||||
|
return new RelayServerSocketRateLimitDummy(limit);
|
||||||
|
}
|
||||||
|
return new RelayServerSocketImpl(addr, timeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -89,7 +89,7 @@ public class RelayServer {
|
||||||
public void ping() {
|
public void ping() {
|
||||||
if(PlatformWebRTC.supported()) {
|
if(PlatformWebRTC.supported()) {
|
||||||
close();
|
close();
|
||||||
query = PlatformWebRTC.openRelayQuery(address);
|
query = RelayQueryDispatch.openRelayQuery(address);
|
||||||
queriedVersion = -1;
|
queriedVersion = -1;
|
||||||
queriedComment = null;
|
queriedComment = null;
|
||||||
queriedVendor = null;
|
queriedVendor = null;
|
||||||
|
@ -142,7 +142,7 @@ public class RelayServer {
|
||||||
}
|
}
|
||||||
|
|
||||||
public RelayServerSocket openSocket() {
|
public RelayServerSocket openSocket() {
|
||||||
return PlatformWebRTC.openRelayConnection(address, Minecraft.getMinecraft().gameSettings.relayTimeout * 1000);
|
return RelayQueryDispatch.openRelayConnection(address, Minecraft.getMinecraft().gameSettings.relayTimeout * 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,8 +10,8 @@ import net.lax1dude.eaglercraft.v1_8.EagRuntime;
|
||||||
import net.lax1dude.eaglercraft.v1_8.EaglerInputStream;
|
import net.lax1dude.eaglercraft.v1_8.EaglerInputStream;
|
||||||
import net.lax1dude.eaglercraft.v1_8.EaglerOutputStream;
|
import net.lax1dude.eaglercraft.v1_8.EaglerOutputStream;
|
||||||
import net.lax1dude.eaglercraft.v1_8.internal.PlatformApplication;
|
import net.lax1dude.eaglercraft.v1_8.internal.PlatformApplication;
|
||||||
import net.lax1dude.eaglercraft.v1_8.internal.PlatformWebRTC;
|
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayManager;
|
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayManager;
|
||||||
|
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayQueryDispatch;
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayServerSocket;
|
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayServerSocket;
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.relay.pkt.RelayPacket00Handshake;
|
import net.lax1dude.eaglercraft.v1_8.sp.relay.pkt.RelayPacket00Handshake;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
|
@ -111,7 +111,7 @@ public class RelayUpdateChecker {
|
||||||
private static void connect(RelayEntry socket) {
|
private static void connect(RelayEntry socket) {
|
||||||
try {
|
try {
|
||||||
socket.handshake = false;
|
socket.handshake = false;
|
||||||
socket.currentSocket = PlatformWebRTC.openRelayConnection(socket.uri, 10000);
|
socket.currentSocket = RelayQueryDispatch.openRelayConnection(socket.uri, 10000);
|
||||||
if(socket.currentSocket.isClosed()) {
|
if(socket.currentSocket.isClosed()) {
|
||||||
socket.currentSocket = null;
|
socket.currentSocket = null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
package net.lax1dude.eaglercraft.v1_8.voice;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Copyright (c) 2024 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.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public enum EnumVoiceChannelPeerState {
|
|
||||||
FAILED, SUCCESS, LOADING;
|
|
||||||
}
|
|
|
@ -20,6 +20,7 @@ import net.lax1dude.eaglercraft.v1_8.profile.EaglerProfile;
|
||||||
import net.lax1dude.eaglercraft.v1_8.socket.protocol.pkt.GameMessagePacket;
|
import net.lax1dude.eaglercraft.v1_8.socket.protocol.pkt.GameMessagePacket;
|
||||||
import net.lax1dude.eaglercraft.v1_8.socket.protocol.pkt.client.*;
|
import net.lax1dude.eaglercraft.v1_8.socket.protocol.pkt.client.*;
|
||||||
import net.lax1dude.eaglercraft.v1_8.socket.protocol.pkt.server.SPacketVoiceSignalGlobalEAG;
|
import net.lax1dude.eaglercraft.v1_8.socket.protocol.pkt.server.SPacketVoiceSignalGlobalEAG;
|
||||||
|
import net.lax1dude.eaglercraft.v1_8.sp.lan.LANServerController;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
|
||||||
|
@ -133,23 +134,23 @@ public class VoiceClientController {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void handleVoiceSignalPacketTypeConnect(EaglercraftUUID user, boolean offer) {
|
public static void handleVoiceSignalPacketTypeConnect(EaglercraftUUID user, boolean offer) {
|
||||||
PlatformVoiceClient.signalConnect(user, offer);
|
if (voiceChannel != EnumVoiceChannelType.NONE) PlatformVoiceClient.signalConnect(user, offer);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void handleVoiceSignalPacketTypeConnectAnnounce(EaglercraftUUID user) {
|
public static void handleVoiceSignalPacketTypeConnectAnnounce(EaglercraftUUID user) {
|
||||||
sendPacketRequest(user);
|
if (voiceChannel != EnumVoiceChannelType.NONE) sendPacketRequest(user);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void handleVoiceSignalPacketTypeDisconnect(EaglercraftUUID user) {
|
public static void handleVoiceSignalPacketTypeDisconnect(EaglercraftUUID user) {
|
||||||
PlatformVoiceClient.signalDisconnect(user, true);
|
if (voiceChannel != EnumVoiceChannelType.NONE) PlatformVoiceClient.signalDisconnect(user, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void handleVoiceSignalPacketTypeICECandidate(EaglercraftUUID user, String ice) {
|
public static void handleVoiceSignalPacketTypeICECandidate(EaglercraftUUID user, String ice) {
|
||||||
PlatformVoiceClient.signalICECandidate(user, ice);
|
if (voiceChannel != EnumVoiceChannelType.NONE) PlatformVoiceClient.signalICECandidate(user, ice);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void handleVoiceSignalPacketTypeDescription(EaglercraftUUID user, String desc) {
|
public static void handleVoiceSignalPacketTypeDescription(EaglercraftUUID user, String desc) {
|
||||||
PlatformVoiceClient.signalDescription(user, desc);
|
if (voiceChannel != EnumVoiceChannelType.NONE) PlatformVoiceClient.signalDescription(user, desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void tickVoiceClient(Minecraft mc) {
|
public static void tickVoiceClient(Minecraft mc) {
|
||||||
|
@ -161,6 +162,11 @@ public class VoiceClientController {
|
||||||
if (getVoiceChannel() != EnumVoiceChannelType.NONE && (getVoiceStatus() == EnumVoiceChannelStatus.CONNECTING || getVoiceStatus() == EnumVoiceChannelStatus.CONNECTED)) {
|
if (getVoiceChannel() != EnumVoiceChannelType.NONE && (getVoiceStatus() == EnumVoiceChannelStatus.CONNECTING || getVoiceStatus() == EnumVoiceChannelStatus.CONNECTED)) {
|
||||||
activateVoice((mc.currentScreen == null || !mc.currentScreen.blockPTTKey()) && Keyboard.isKeyDown(mc.gameSettings.voicePTTKey));
|
activateVoice((mc.currentScreen == null || !mc.currentScreen.blockPTTKey()) && Keyboard.isKeyDown(mc.gameSettings.voicePTTKey));
|
||||||
|
|
||||||
|
if(mc.isSingleplayer() && !LANServerController.isHostingLAN()) {
|
||||||
|
setVoiceChannel(EnumVoiceChannelType.NONE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (mc.theWorld != null && mc.thePlayer != null) {
|
if (mc.theWorld != null && mc.thePlayer != null) {
|
||||||
HashSet<EaglercraftUUID> seenPlayers = new HashSet<>();
|
HashSet<EaglercraftUUID> seenPlayers = new HashSet<>();
|
||||||
for (EntityPlayer player : mc.theWorld.playerEntities) {
|
for (EntityPlayer player : mc.theWorld.playerEntities) {
|
||||||
|
@ -209,7 +215,6 @@ public class VoiceClientController {
|
||||||
public static void setVoiceChannel(EnumVoiceChannelType channel) {
|
public static void setVoiceChannel(EnumVoiceChannelType channel) {
|
||||||
if (voiceChannel == channel) return;
|
if (voiceChannel == channel) return;
|
||||||
if (channel != EnumVoiceChannelType.NONE) PlatformVoiceClient.initializeDevices();
|
if (channel != EnumVoiceChannelType.NONE) PlatformVoiceClient.initializeDevices();
|
||||||
PlatformVoiceClient.resetPeerStates();
|
|
||||||
if (channel == EnumVoiceChannelType.NONE) {
|
if (channel == EnumVoiceChannelType.NONE) {
|
||||||
for (EaglercraftUUID uuid : nearbyPlayers) {
|
for (EaglercraftUUID uuid : nearbyPlayers) {
|
||||||
PlatformVoiceClient.signalDisconnect(uuid, false);
|
PlatformVoiceClient.signalDisconnect(uuid, false);
|
||||||
|
@ -261,13 +266,10 @@ public class VoiceClientController {
|
||||||
return voiceChannel;
|
return voiceChannel;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean voicePeerErrored() {
|
|
||||||
return PlatformVoiceClient.getPeerState() == EnumVoiceChannelPeerState.FAILED || PlatformVoiceClient.getPeerStateConnect() == EnumVoiceChannelPeerState.FAILED || PlatformVoiceClient.getPeerStateInitial() == EnumVoiceChannelPeerState.FAILED || PlatformVoiceClient.getPeerStateDesc() == EnumVoiceChannelPeerState.FAILED || PlatformVoiceClient.getPeerStateIce() == EnumVoiceChannelPeerState.FAILED;
|
|
||||||
}
|
|
||||||
public static EnumVoiceChannelStatus getVoiceStatus() {
|
public static EnumVoiceChannelStatus getVoiceStatus() {
|
||||||
return (!isClientSupported() || !isServerSupported()) ? EnumVoiceChannelStatus.UNAVAILABLE :
|
return (!isClientSupported() || !isServerSupported()) ? EnumVoiceChannelStatus.UNAVAILABLE :
|
||||||
(PlatformVoiceClient.getReadyState() != EnumVoiceChannelReadyState.DEVICE_INITIALIZED ?
|
(PlatformVoiceClient.getReadyState() != EnumVoiceChannelReadyState.DEVICE_INITIALIZED ?
|
||||||
EnumVoiceChannelStatus.CONNECTING : (voicePeerErrored() ? EnumVoiceChannelStatus.UNAVAILABLE : EnumVoiceChannelStatus.CONNECTED));
|
EnumVoiceChannelStatus.CONNECTING : EnumVoiceChannelStatus.CONNECTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean talkStatus = false;
|
private static boolean talkStatus = false;
|
||||||
|
@ -352,36 +354,48 @@ public class VoiceClientController {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void sendPacketICE(EaglercraftUUID peerId, String candidate) {
|
public static void sendPacketICE(EaglercraftUUID peerId, String candidate) {
|
||||||
|
if(packetSendCallback != null) {
|
||||||
packetSendCallback.accept(new CPacketVoiceSignalICEEAG(peerId.msb, peerId.lsb, candidate));
|
packetSendCallback.accept(new CPacketVoiceSignalICEEAG(peerId.msb, peerId.lsb, candidate));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void sendPacketDesc(EaglercraftUUID peerId, String desc) {
|
public static void sendPacketDesc(EaglercraftUUID peerId, String desc) {
|
||||||
|
if(packetSendCallback != null) {
|
||||||
packetSendCallback.accept(new CPacketVoiceSignalDescEAG(peerId.msb, peerId.lsb, desc));
|
packetSendCallback.accept(new CPacketVoiceSignalDescEAG(peerId.msb, peerId.lsb, desc));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void sendPacketDisconnect() {
|
public static void sendPacketDisconnect() {
|
||||||
|
if(packetSendCallback != null) {
|
||||||
if(protocolVersion <= 3) {
|
if(protocolVersion <= 3) {
|
||||||
packetSendCallback.accept(new CPacketVoiceSignalDisconnectV3EAG());
|
packetSendCallback.accept(new CPacketVoiceSignalDisconnectV3EAG());
|
||||||
}else {
|
}else {
|
||||||
packetSendCallback.accept(new CPacketVoiceSignalDisconnectV4EAG());
|
packetSendCallback.accept(new CPacketVoiceSignalDisconnectV4EAG());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void sendPacketDisconnectPeer(EaglercraftUUID peerId) {
|
public static void sendPacketDisconnectPeer(EaglercraftUUID peerId) {
|
||||||
|
if(packetSendCallback != null) {
|
||||||
if(protocolVersion <= 3) {
|
if(protocolVersion <= 3) {
|
||||||
packetSendCallback.accept(new CPacketVoiceSignalDisconnectV3EAG(true, peerId.msb, peerId.lsb));
|
packetSendCallback.accept(new CPacketVoiceSignalDisconnectV3EAG(true, peerId.msb, peerId.lsb));
|
||||||
}else {
|
}else {
|
||||||
packetSendCallback.accept(new CPacketVoiceSignalDisconnectPeerV4EAG(peerId.msb, peerId.lsb));
|
packetSendCallback.accept(new CPacketVoiceSignalDisconnectPeerV4EAG(peerId.msb, peerId.lsb));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void sendPacketConnect() {
|
public static void sendPacketConnect() {
|
||||||
|
if(packetSendCallback != null) {
|
||||||
packetSendCallback.accept(new CPacketVoiceSignalConnectEAG());
|
packetSendCallback.accept(new CPacketVoiceSignalConnectEAG());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void sendPacketRequest(EaglercraftUUID peerId) {
|
public static void sendPacketRequest(EaglercraftUUID peerId) {
|
||||||
|
if(packetSendCallback != null) {
|
||||||
packetSendCallback.accept(new CPacketVoiceSignalRequestEAG(peerId.msb, peerId.lsb));
|
packetSendCallback.accept(new CPacketVoiceSignalRequestEAG(peerId.msb, peerId.lsb));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static void sendPacketRequestIfNeeded(EaglercraftUUID uuid) {
|
private static void sendPacketRequestIfNeeded(EaglercraftUUID uuid) {
|
||||||
if (getVoiceStatus() == EnumVoiceChannelStatus.DISCONNECTED || getVoiceStatus() == EnumVoiceChannelStatus.UNAVAILABLE) return;
|
if (getVoiceStatus() == EnumVoiceChannelStatus.DISCONNECTED || getVoiceStatus() == EnumVoiceChannelStatus.UNAVAILABLE) return;
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
u41
|
u42
|
|
@ -30,7 +30,6 @@
|
||||||
<option class="_eaglercraftX_boot_menu_launch_conf_val_launch_type_opt" value="PEYTON_V1">PeytonPlayz585 Indev</option>
|
<option class="_eaglercraftX_boot_menu_launch_conf_val_launch_type_opt" value="PEYTON_V1">PeytonPlayz585 Indev</option>
|
||||||
<option class="_eaglercraftX_boot_menu_launch_conf_val_launch_type_opt" value="PEYTON_V2">PeytonPlayz585 Alpha/Beta</option>
|
<option class="_eaglercraftX_boot_menu_launch_conf_val_launch_type_opt" value="PEYTON_V2">PeytonPlayz585 Alpha/Beta</option>
|
||||||
<option class="_eaglercraftX_boot_menu_launch_conf_val_launch_type_opt" value="STANDARD_OFFLINE_V1">Standard Offline</option>
|
<option class="_eaglercraftX_boot_menu_launch_conf_val_launch_type_opt" value="STANDARD_OFFLINE_V1">Standard Offline</option>
|
||||||
<option class="_eaglercraftX_boot_menu_launch_conf_val_launch_type_opt" value="IFRAME_SANDBOX_V1">IFrame HTML File</option>
|
|
||||||
</select>
|
</select>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
Binary file not shown.
|
@ -1 +1 @@
|
||||||
{"pluginName":"EaglercraftXBungee","pluginVersion":"1.3.2","pluginButton":"Download \"EaglerXBungee-1.3.2.jar\"","pluginFilename":"EaglerXBungee.zip"}
|
{"pluginName":"EaglercraftXBungee","pluginVersion":"1.3.3","pluginButton":"Download \"EaglerXBungee-1.3.3.jar\"","pluginFilename":"EaglerXBungee.zip"}
|
Binary file not shown.
|
@ -119,7 +119,7 @@ public class PlatformApplication {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@JSBody(params = { "cb" }, script = "if(!navigator.clipboard) { cb(null); } else if (!navigator.clipboard.readText) cb(null); else navigator.clipboard.readText().then(function(s) { cb(s || null); }, function() { cb(null); });")
|
@JSBody(params = { "cb" }, script = "if(!navigator.clipboard) { cb(null); } else if (!navigator.clipboard.readText) cb(null); else navigator.clipboard.readText().then(function(s) { cb((typeof s === \"string\") ? s : null); }, function(err) { cb(null); });")
|
||||||
private static native void getClipboard1(StupidFunctionResolveString cb);
|
private static native void getClipboard1(StupidFunctionResolveString cb);
|
||||||
|
|
||||||
@JSBody(params = { "str" }, script = "if(navigator.clipboard) { navigator.clipboard.writeText(str); return true; } else { return false; }")
|
@JSBody(params = { "str" }, script = "if(navigator.clipboard) { navigator.clipboard.writeText(str); return true; } else { return false; }")
|
||||||
|
@ -212,7 +212,7 @@ public class PlatformApplication {
|
||||||
}
|
}
|
||||||
|
|
||||||
@JSBody(params = { "ctx", "buffer", "w", "h" }, script = "var imgData = ctx.createImageData(w, h); var ww = w * 4; for(var i = 0; i < h; ++i) { imgData.data.set(new Uint8ClampedArray(buffer, (h - i - 1) * ww, ww), i * ww); } ctx.putImageData(imgData, 0, 0);")
|
@JSBody(params = { "ctx", "buffer", "w", "h" }, script = "var imgData = ctx.createImageData(w, h); var ww = w * 4; for(var i = 0; i < h; ++i) { imgData.data.set(new Uint8ClampedArray(buffer, (h - i - 1) * ww, ww), i * ww); } ctx.putImageData(imgData, 0, 0);")
|
||||||
private static native JSObject putImageData(CanvasRenderingContext2D ctx, ArrayBuffer buffer, int w, int h);
|
private static native void putImageData(CanvasRenderingContext2D ctx, ArrayBuffer buffer, int w, int h);
|
||||||
|
|
||||||
@JSBody(params = { "cvs", "name", "parentElement" }, script =
|
@JSBody(params = { "cvs", "name", "parentElement" }, script =
|
||||||
"var vigg = function(el, url){" +
|
"var vigg = function(el, url){" +
|
||||||
|
@ -474,7 +474,7 @@ public class PlatformApplication {
|
||||||
}
|
}
|
||||||
|
|
||||||
@JSFunctor
|
@JSFunctor
|
||||||
private static interface DownloadBytesBlobURLRevoke extends JSObject {
|
static interface DownloadBytesBlobURLRevoke extends JSObject {
|
||||||
void call();
|
void call();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -507,6 +507,10 @@ public class PlatformApplication {
|
||||||
downloadBytesImpl(str, blobHandle.toExternalForm(), blobHandle::release, PlatformRuntime.parent);
|
downloadBytesImpl(str, blobHandle.toExternalForm(), blobHandle::release, PlatformRuntime.parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void downloadURLWithNameTeaVM(String str, String url, DownloadBytesBlobURLRevoke revoker) {
|
||||||
|
downloadBytesImpl(str, url, revoker, PlatformRuntime.parent);
|
||||||
|
}
|
||||||
|
|
||||||
public static void showDebugConsole() {
|
public static void showDebugConsole() {
|
||||||
DebugConsoleWindow.showDebugConsole();
|
DebugConsoleWindow.showDebugConsole();
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,16 +87,19 @@ public class PlatformAudio {
|
||||||
protected final PannerNode panner;
|
protected final PannerNode panner;
|
||||||
protected final GainNode gain;
|
protected final GainNode gain;
|
||||||
protected float pitch;
|
protected float pitch;
|
||||||
|
protected boolean repeat;
|
||||||
protected boolean isPaused = false;
|
protected boolean isPaused = false;
|
||||||
protected boolean isEnded = false;
|
protected boolean isEnded = false;
|
||||||
|
protected boolean isDisposed = false;
|
||||||
|
|
||||||
public BrowserAudioHandle(BrowserAudioResource resource, AudioBufferSourceNode source, PannerNode panner,
|
public BrowserAudioHandle(BrowserAudioResource resource, AudioBufferSourceNode source, PannerNode panner,
|
||||||
GainNode gain, float pitch) {
|
GainNode gain, float pitch, boolean repeat) {
|
||||||
this.resource = resource;
|
this.resource = resource;
|
||||||
this.source = source;
|
this.source = source;
|
||||||
this.panner = panner;
|
this.panner = panner;
|
||||||
this.gain = gain;
|
this.gain = gain;
|
||||||
this.pitch = pitch;
|
this.pitch = pitch;
|
||||||
|
this.repeat = repeat;
|
||||||
source.setOnEnded(this);
|
source.setOnEnded(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -115,6 +118,14 @@ public class PlatformAudio {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void repeat(boolean en) {
|
||||||
|
repeat = en;
|
||||||
|
if(!isEnded) {
|
||||||
|
source.setLoop(en);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void restart() {
|
public void restart() {
|
||||||
if(isEnded) {
|
if(isEnded) {
|
||||||
|
@ -124,11 +135,21 @@ public class PlatformAudio {
|
||||||
resource.cacheHit = PlatformRuntime.steadyTimeMillis();
|
resource.cacheHit = PlatformRuntime.steadyTimeMillis();
|
||||||
src.setBuffer(resource.buffer);
|
src.setBuffer(resource.buffer);
|
||||||
src.getPlaybackRate().setValue(pitch);
|
src.getPlaybackRate().setValue(pitch);
|
||||||
|
src.setLoop(repeat);
|
||||||
source.disconnect();
|
source.disconnect();
|
||||||
src.connect(panner == null ? gain : panner);
|
src.connect(panner == null ? gain : panner);
|
||||||
|
if(isDisposed) {
|
||||||
|
isDisposed = false;
|
||||||
|
activeSounds.add(this);
|
||||||
|
gain.connect(audioctx.getDestination());
|
||||||
|
if(gameRecGain != null) {
|
||||||
|
gain.connect(gameRecGain);
|
||||||
|
}
|
||||||
|
}
|
||||||
source = src;
|
source = src;
|
||||||
source.start();
|
source.start();
|
||||||
}else {
|
}else {
|
||||||
|
isPaused = false;
|
||||||
source.getPlaybackRate().setValue(pitch);
|
source.getPlaybackRate().setValue(pitch);
|
||||||
source.start(0.0);
|
source.start(0.0);
|
||||||
}
|
}
|
||||||
|
@ -179,6 +200,12 @@ public class PlatformAudio {
|
||||||
isEnded = true;
|
isEnded = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void dispose() {
|
||||||
|
if(!isDisposed) {
|
||||||
|
isDisposed = true;
|
||||||
|
gain.disconnect();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void initialize() {
|
static void initialize() {
|
||||||
|
@ -304,10 +331,9 @@ public class PlatformAudio {
|
||||||
gameRecGain = audioctx.createGain();
|
gameRecGain = audioctx.createGain();
|
||||||
gameRecGain.getGain().setValue(gameVol);
|
gameRecGain.getGain().setValue(gameVol);
|
||||||
for(BrowserAudioHandle handle : activeSounds) {
|
for(BrowserAudioHandle handle : activeSounds) {
|
||||||
if(handle.panner != null) {
|
try {
|
||||||
handle.panner.connect(gameRecGain);
|
|
||||||
}else {
|
|
||||||
handle.gain.connect(gameRecGain);
|
handle.gain.connect(gameRecGain);
|
||||||
|
}catch(Throwable t) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PlatformVoiceClient.addRecordingDest(gameRecGain);
|
PlatformVoiceClient.addRecordingDest(gameRecGain);
|
||||||
|
@ -342,11 +368,7 @@ public class PlatformAudio {
|
||||||
}
|
}
|
||||||
for(BrowserAudioHandle handle : activeSounds) {
|
for(BrowserAudioHandle handle : activeSounds) {
|
||||||
try {
|
try {
|
||||||
if(handle.panner != null) {
|
|
||||||
handle.panner.disconnect(gameRecGain);
|
|
||||||
}else {
|
|
||||||
handle.gain.disconnect(gameRecGain);
|
handle.gain.disconnect(gameRecGain);
|
||||||
}
|
|
||||||
}catch(Throwable t) {
|
}catch(Throwable t) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -451,8 +473,10 @@ public class PlatformAudio {
|
||||||
activeFreeTimer = millis;
|
activeFreeTimer = millis;
|
||||||
Iterator<BrowserAudioHandle> itr = activeSounds.iterator();
|
Iterator<BrowserAudioHandle> itr = activeSounds.iterator();
|
||||||
while(itr.hasNext()) {
|
while(itr.hasNext()) {
|
||||||
if(itr.next().shouldFree()) {
|
BrowserAudioHandle h = itr.next();
|
||||||
|
if(h.shouldFree()) {
|
||||||
itr.remove();
|
itr.remove();
|
||||||
|
h.dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -460,6 +484,10 @@ public class PlatformAudio {
|
||||||
|
|
||||||
public static void flushAudioCache() {
|
public static void flushAudioCache() {
|
||||||
soundCache.clear();
|
soundCache.clear();
|
||||||
|
Iterator<BrowserAudioHandle> itr = activeSounds.iterator();
|
||||||
|
while(itr.hasNext()) {
|
||||||
|
itr.next().dispose();
|
||||||
|
}
|
||||||
activeSounds.clear();
|
activeSounds.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -468,13 +496,14 @@ public class PlatformAudio {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IAudioHandle beginPlayback(IAudioResource track, float x, float y, float z,
|
public static IAudioHandle beginPlayback(IAudioResource track, float x, float y, float z,
|
||||||
float volume, float pitch) {
|
float volume, float pitch, boolean repeat) {
|
||||||
BrowserAudioResource internalTrack = (BrowserAudioResource) track;
|
BrowserAudioResource internalTrack = (BrowserAudioResource) track;
|
||||||
internalTrack.cacheHit = PlatformRuntime.steadyTimeMillis();
|
internalTrack.cacheHit = PlatformRuntime.steadyTimeMillis();
|
||||||
|
|
||||||
AudioBufferSourceNode src = audioctx.createBufferSource();
|
AudioBufferSourceNode src = audioctx.createBufferSource();
|
||||||
src.setBuffer(internalTrack.buffer);
|
src.setBuffer(internalTrack.buffer);
|
||||||
src.getPlaybackRate().setValue(pitch);
|
src.getPlaybackRate().setValue(pitch);
|
||||||
|
src.setLoop(repeat);
|
||||||
|
|
||||||
PannerNode panner = audioctx.createPanner();
|
PannerNode panner = audioctx.createPanner();
|
||||||
panner.setPosition(x, y, z);
|
panner.setPosition(x, y, z);
|
||||||
|
@ -503,18 +532,19 @@ public class PlatformAudio {
|
||||||
|
|
||||||
src.start();
|
src.start();
|
||||||
|
|
||||||
BrowserAudioHandle ret = new BrowserAudioHandle(internalTrack, src, panner, gain, pitch);
|
BrowserAudioHandle ret = new BrowserAudioHandle(internalTrack, src, panner, gain, pitch, repeat);
|
||||||
activeSounds.add(ret);
|
activeSounds.add(ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IAudioHandle beginPlaybackStatic(IAudioResource track, float volume, float pitch) {
|
public static IAudioHandle beginPlaybackStatic(IAudioResource track, float volume, float pitch, boolean repeat) {
|
||||||
BrowserAudioResource internalTrack = (BrowserAudioResource) track;
|
BrowserAudioResource internalTrack = (BrowserAudioResource) track;
|
||||||
internalTrack.cacheHit = PlatformRuntime.steadyTimeMillis();
|
internalTrack.cacheHit = PlatformRuntime.steadyTimeMillis();
|
||||||
|
|
||||||
AudioBufferSourceNode src = audioctx.createBufferSource();
|
AudioBufferSourceNode src = audioctx.createBufferSource();
|
||||||
src.setBuffer(internalTrack.buffer);
|
src.setBuffer(internalTrack.buffer);
|
||||||
src.getPlaybackRate().setValue(pitch);
|
src.getPlaybackRate().setValue(pitch);
|
||||||
|
src.setLoop(repeat);
|
||||||
|
|
||||||
GainNode gain = audioctx.createGain();
|
GainNode gain = audioctx.createGain();
|
||||||
float v2 = volume;
|
float v2 = volume;
|
||||||
|
@ -529,7 +559,7 @@ public class PlatformAudio {
|
||||||
|
|
||||||
src.start();
|
src.start();
|
||||||
|
|
||||||
BrowserAudioHandle ret = new BrowserAudioHandle(internalTrack, src, null, gain, pitch);
|
BrowserAudioHandle ret = new BrowserAudioHandle(internalTrack, src, null, gain, pitch, repeat);
|
||||||
activeSounds.add(ret);
|
activeSounds.add(ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -330,7 +330,7 @@ public class PlatformInput {
|
||||||
if(tryGrabCursorHook()) return;
|
if(tryGrabCursorHook()) return;
|
||||||
int b = evt.getButton();
|
int b = evt.getButton();
|
||||||
b = b == 1 ? 2 : (b == 2 ? 1 : b);
|
b = b == 1 ? 2 : (b == 2 ? 1 : b);
|
||||||
buttonStates[b] = true;
|
if(b >= 0 && b < buttonStates.length) buttonStates[b] = true;
|
||||||
int eventX = (int)(getOffsetX(evt, touchOffsetXTeaVM) * windowDPI);
|
int eventX = (int)(getOffsetX(evt, touchOffsetXTeaVM) * windowDPI);
|
||||||
int eventY = windowHeight - (int)(getOffsetY(evt, touchOffsetYTeaVM) * windowDPI) - 1;
|
int eventY = windowHeight - (int)(getOffsetY(evt, touchOffsetYTeaVM) * windowDPI) - 1;
|
||||||
synchronized(mouseEvents) {
|
synchronized(mouseEvents) {
|
||||||
|
@ -348,7 +348,7 @@ public class PlatformInput {
|
||||||
evt.stopPropagation();
|
evt.stopPropagation();
|
||||||
int b = evt.getButton();
|
int b = evt.getButton();
|
||||||
b = b == 1 ? 2 : (b == 2 ? 1 : b);
|
b = b == 1 ? 2 : (b == 2 ? 1 : b);
|
||||||
buttonStates[b] = false;
|
if(b >= 0 && b < buttonStates.length) buttonStates[b] = false;
|
||||||
int eventX = (int)(getOffsetX(evt, touchOffsetXTeaVM) * windowDPI);
|
int eventX = (int)(getOffsetX(evt, touchOffsetXTeaVM) * windowDPI);
|
||||||
int eventY = windowHeight - (int)(getOffsetY(evt, touchOffsetYTeaVM) * windowDPI) - 1;
|
int eventY = windowHeight - (int)(getOffsetY(evt, touchOffsetYTeaVM) * windowDPI) - 1;
|
||||||
synchronized(mouseEvents) {
|
synchronized(mouseEvents) {
|
||||||
|
@ -366,8 +366,10 @@ public class PlatformInput {
|
||||||
evt.stopPropagation();
|
evt.stopPropagation();
|
||||||
mouseX = (int)(getOffsetX(evt, touchOffsetXTeaVM) * windowDPI);
|
mouseX = (int)(getOffsetX(evt, touchOffsetXTeaVM) * windowDPI);
|
||||||
mouseY = windowHeight - (int)(getOffsetY(evt, touchOffsetYTeaVM) * windowDPI) - 1;
|
mouseY = windowHeight - (int)(getOffsetY(evt, touchOffsetYTeaVM) * windowDPI) - 1;
|
||||||
|
if(pointerLockFlag) {
|
||||||
mouseDX += evt.getMovementX();
|
mouseDX += evt.getMovementX();
|
||||||
mouseDY += -evt.getMovementY();
|
mouseDY += -evt.getMovementY();
|
||||||
|
}
|
||||||
if(hasShownPressAnyKey) {
|
if(hasShownPressAnyKey) {
|
||||||
int eventX = (int)(getOffsetX(evt, touchOffsetXTeaVM) * windowDPI);
|
int eventX = (int)(getOffsetX(evt, touchOffsetXTeaVM) * windowDPI);
|
||||||
int eventY = windowHeight - (int)(getOffsetY(evt, touchOffsetYTeaVM) * windowDPI) - 1;
|
int eventY = windowHeight - (int)(getOffsetY(evt, touchOffsetYTeaVM) * windowDPI) - 1;
|
||||||
|
@ -765,7 +767,7 @@ public class PlatformInput {
|
||||||
win.addEventListener("gamepaddisconnected", gamepaddisconnected = new EventListener<GamepadEvent>() {
|
win.addEventListener("gamepaddisconnected", gamepaddisconnected = new EventListener<GamepadEvent>() {
|
||||||
@Override
|
@Override
|
||||||
public void handleEvent(GamepadEvent evt) {
|
public void handleEvent(GamepadEvent evt) {
|
||||||
if(evt.getGamepad() == selectedGamepad) {
|
if(selectedGamepad != null && evt.getGamepad().getIndex() == selectedGamepad.getIndex()) {
|
||||||
selectedGamepad = null;
|
selectedGamepad = null;
|
||||||
}
|
}
|
||||||
enumerateGamepads();
|
enumerateGamepads();
|
||||||
|
@ -1287,7 +1289,7 @@ public class PlatformInput {
|
||||||
|
|
||||||
public static int mouseGetDWheel() {
|
public static int mouseGetDWheel() {
|
||||||
int ret = (int)mouseDWheel;
|
int ret = (int)mouseDWheel;
|
||||||
mouseDWheel = 0.0D;
|
mouseDWheel -= ret;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -599,7 +599,11 @@ public class PlatformRuntime {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void downloadRemoteURIByteArray(String assetPackageURI, final Consumer<byte[]> cb) {
|
public static void downloadRemoteURIByteArray(String assetPackageURI, final Consumer<byte[]> cb) {
|
||||||
downloadRemoteURI(assetPackageURI, arr -> cb.accept(TeaVMUtils.wrapByteArrayBuffer(arr)));
|
downloadRemoteURIByteArray(assetPackageURI, false, cb);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void downloadRemoteURIByteArray(String assetPackageURI, boolean useCache, final Consumer<byte[]> cb) {
|
||||||
|
downloadRemoteURI(assetPackageURI, useCache, arr -> cb.accept(TeaVMUtils.wrapByteArrayBuffer(arr)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void downloadRemoteURI(String assetPackageURI, final Consumer<ArrayBuffer> cb) {
|
public static void downloadRemoteURI(String assetPackageURI, final Consumer<ArrayBuffer> cb) {
|
||||||
|
|
|
@ -3,7 +3,6 @@ package net.lax1dude.eaglercraft.v1_8.internal;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.teavm.interop.Async;
|
import org.teavm.interop.Async;
|
||||||
|
@ -16,7 +15,6 @@ import org.teavm.jso.browser.Window;
|
||||||
import org.teavm.jso.canvas.CanvasRenderingContext2D;
|
import org.teavm.jso.canvas.CanvasRenderingContext2D;
|
||||||
import org.teavm.jso.dom.events.Event;
|
import org.teavm.jso.dom.events.Event;
|
||||||
import org.teavm.jso.dom.events.EventListener;
|
import org.teavm.jso.dom.events.EventListener;
|
||||||
import org.teavm.jso.dom.html.HTMLAnchorElement;
|
|
||||||
import org.teavm.jso.dom.html.HTMLCanvasElement;
|
import org.teavm.jso.dom.html.HTMLCanvasElement;
|
||||||
import org.teavm.jso.webaudio.MediaStream;
|
import org.teavm.jso.webaudio.MediaStream;
|
||||||
|
|
||||||
|
@ -193,19 +191,11 @@ public class PlatformScreenRecord {
|
||||||
final String fileName = EaglercraftVersion.mainMenuStringB + " - " + EaglerProfile.getName() + " - " + fmt.format(new Date()) + "." + params.codec.fileExt;
|
final String fileName = EaglercraftVersion.mainMenuStringB + " - " + EaglerProfile.getName() + " - " + fmt.format(new Date()) + "." + params.codec.fileExt;
|
||||||
if("video/webm".equals(params.codec.container)) {
|
if("video/webm".equals(params.codec.container)) {
|
||||||
FixWebMDurationJS.getRecUrl(evt, (int) (PlatformRuntime.steadyTimeMillis() - startTime), url -> {
|
FixWebMDurationJS.getRecUrl(evt, (int) (PlatformRuntime.steadyTimeMillis() - startTime), url -> {
|
||||||
HTMLAnchorElement a = (HTMLAnchorElement) win.getDocument().createElement("a");
|
PlatformApplication.downloadURLWithNameTeaVM(fileName, url, () -> TeaVMUtils.freeDataURL(url));
|
||||||
a.setDownload(fileName);
|
|
||||||
a.setHref(url);
|
|
||||||
a.click();
|
|
||||||
TeaVMUtils.freeDataURL(url);
|
|
||||||
}, logger::info);
|
}, logger::info);
|
||||||
}else {
|
}else {
|
||||||
String url = TeaVMUtils.getDataURL(evt.getData());
|
String url = TeaVMUtils.getDataURL(evt.getData());
|
||||||
HTMLAnchorElement a = (HTMLAnchorElement) win.getDocument().createElement("a");
|
PlatformApplication.downloadURLWithNameTeaVM(fileName, url, () -> TeaVMUtils.freeDataURL(url));
|
||||||
a.setDownload(fileName);
|
|
||||||
a.setHref(url);
|
|
||||||
a.click();
|
|
||||||
TeaVMUtils.freeDataURL(url);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -4,7 +4,6 @@ import net.lax1dude.eaglercraft.v1_8.EaglercraftUUID;
|
||||||
import net.lax1dude.eaglercraft.v1_8.internal.teavm.TeaVMUtils;
|
import net.lax1dude.eaglercraft.v1_8.internal.teavm.TeaVMUtils;
|
||||||
import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
|
import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
|
||||||
import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
||||||
import net.lax1dude.eaglercraft.v1_8.voice.EnumVoiceChannelPeerState;
|
|
||||||
import net.lax1dude.eaglercraft.v1_8.voice.EnumVoiceChannelReadyState;
|
import net.lax1dude.eaglercraft.v1_8.voice.EnumVoiceChannelReadyState;
|
||||||
import net.lax1dude.eaglercraft.v1_8.voice.EnumVoiceChannelType;
|
import net.lax1dude.eaglercraft.v1_8.voice.EnumVoiceChannelType;
|
||||||
import net.lax1dude.eaglercraft.v1_8.voice.VoiceClientController;
|
import net.lax1dude.eaglercraft.v1_8.voice.VoiceClientController;
|
||||||
|
@ -179,32 +178,17 @@ public class PlatformVoiceClient {
|
||||||
VoiceClientController.sendPacketDesc(peerId, JSON.stringify(desc));
|
VoiceClientController.sendPacketDesc(peerId, JSON.stringify(desc));
|
||||||
}, err -> {
|
}, err -> {
|
||||||
logger.error("Failed to set local description for \"{}\"! {}", peerId, err);
|
logger.error("Failed to set local description for \"{}\"! {}", peerId, err);
|
||||||
if (peerStateInitial == EnumVoiceChannelPeerState.LOADING) {
|
|
||||||
peerStateInitial = EnumVoiceChannelPeerState.FAILED;
|
|
||||||
}
|
|
||||||
signalDisconnect(VoicePeer.this, false);
|
signalDisconnect(VoicePeer.this, false);
|
||||||
});
|
});
|
||||||
}, err -> {
|
}, err -> {
|
||||||
logger.error("Failed to set create offer for \"{}\"! {}", peerId, err);
|
logger.error("Failed to set create offer for \"{}\"! {}", peerId, err);
|
||||||
if (peerStateInitial == EnumVoiceChannelPeerState.LOADING) {
|
|
||||||
peerStateInitial = EnumVoiceChannelPeerState.FAILED;
|
|
||||||
}
|
|
||||||
signalDisconnect(VoicePeer.this, false);
|
signalDisconnect(VoicePeer.this, false);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
TeaVMUtils.addEventListener(peerConnection, "connectionstatechange", (EventListener<Event>) evt -> {
|
TeaVMUtils.addEventListener(peerConnection, "connectionstatechange", (EventListener<Event>) evt -> {
|
||||||
String cs = PlatformWebRTC.getConnectionState(peerConnection);
|
String cs = PlatformWebRTC.getConnectionState(peerConnection);
|
||||||
if ("disconnected".equals(cs)) {
|
if ("disconnected".equals(cs) || "failed".equals(cs)) {
|
||||||
signalDisconnect(VoicePeer.this, false);
|
|
||||||
} else if ("connected".equals(cs)) {
|
|
||||||
if (peerState != EnumVoiceChannelPeerState.SUCCESS) {
|
|
||||||
peerState = EnumVoiceChannelPeerState.SUCCESS;
|
|
||||||
}
|
|
||||||
} else if ("failed".equals(cs)) {
|
|
||||||
if (peerState == EnumVoiceChannelPeerState.LOADING) {
|
|
||||||
peerState = EnumVoiceChannelPeerState.FAILED;
|
|
||||||
}
|
|
||||||
signalDisconnect(VoicePeer.this, false);
|
signalDisconnect(VoicePeer.this, false);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -226,26 +210,21 @@ public class PlatformVoiceClient {
|
||||||
PlatformWebRTC.createAnswer(peerConnection, desc -> {
|
PlatformWebRTC.createAnswer(peerConnection, desc -> {
|
||||||
PlatformWebRTC.setLocalDescription(peerConnection, desc, () -> {
|
PlatformWebRTC.setLocalDescription(peerConnection, desc, () -> {
|
||||||
VoiceClientController.sendPacketDesc(peerId, JSON.stringify(desc));
|
VoiceClientController.sendPacketDesc(peerId, JSON.stringify(desc));
|
||||||
if (peerStateDesc != EnumVoiceChannelPeerState.SUCCESS) peerStateDesc = EnumVoiceChannelPeerState.SUCCESS;
|
|
||||||
}, err -> {
|
}, err -> {
|
||||||
logger.error("Failed to set local description for \"{}\"! {}", peerId, err.getMessage());
|
logger.error("Failed to set local description for \"{}\"! {}", peerId, err.getMessage());
|
||||||
if (peerStateDesc == EnumVoiceChannelPeerState.LOADING) peerStateDesc = EnumVoiceChannelPeerState.FAILED;
|
|
||||||
signalDisconnect(VoicePeer.this, false);
|
signalDisconnect(VoicePeer.this, false);
|
||||||
});
|
});
|
||||||
}, err -> {
|
}, err -> {
|
||||||
logger.error("Failed to create answer for \"{}\"! {}", peerId, err.getMessage());
|
logger.error("Failed to create answer for \"{}\"! {}", peerId, err.getMessage());
|
||||||
if (peerStateDesc == EnumVoiceChannelPeerState.LOADING) peerStateDesc = EnumVoiceChannelPeerState.FAILED;
|
|
||||||
signalDisconnect(VoicePeer.this, false);
|
signalDisconnect(VoicePeer.this, false);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}, err -> {
|
}, err -> {
|
||||||
logger.error("Failed to set remote description for \"{}\"! {}", peerId, err.getMessage());
|
logger.error("Failed to set remote description for \"{}\"! {}", peerId, err.getMessage());
|
||||||
if (peerStateDesc == EnumVoiceChannelPeerState.LOADING) peerStateDesc = EnumVoiceChannelPeerState.FAILED;
|
|
||||||
signalDisconnect(VoicePeer.this, false);
|
signalDisconnect(VoicePeer.this, false);
|
||||||
});
|
});
|
||||||
} catch (Throwable err) {
|
} catch (Throwable err) {
|
||||||
logger.error("Failed to parse remote description for \"{}\"! {}", peerId, err.getMessage());
|
logger.error("Failed to parse remote description for \"{}\"! {}", peerId, err.getMessage());
|
||||||
if (peerStateDesc == EnumVoiceChannelPeerState.LOADING) peerStateDesc = EnumVoiceChannelPeerState.FAILED;
|
|
||||||
signalDisconnect(VoicePeer.this, false);
|
signalDisconnect(VoicePeer.this, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -253,10 +232,8 @@ public class PlatformVoiceClient {
|
||||||
public void addICECandidate(String candidate) {
|
public void addICECandidate(String candidate) {
|
||||||
try {
|
try {
|
||||||
addIceCandidate(peerConnection, candidate);
|
addIceCandidate(peerConnection, candidate);
|
||||||
if (peerStateIce != EnumVoiceChannelPeerState.SUCCESS) peerStateIce = EnumVoiceChannelPeerState.SUCCESS;
|
|
||||||
} catch (Throwable err) {
|
} catch (Throwable err) {
|
||||||
logger.error("Failed to parse ice candidate for \"{}\"! {}", peerId, err.getMessage());
|
logger.error("Failed to parse ice candidate for \"{}\"! {}", peerId, err.getMessage());
|
||||||
if (peerStateIce == EnumVoiceChannelPeerState.LOADING) peerStateIce = EnumVoiceChannelPeerState.FAILED;
|
|
||||||
signalDisconnect(VoicePeer.this, false);
|
signalDisconnect(VoicePeer.this, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -269,11 +246,6 @@ public class PlatformVoiceClient {
|
||||||
public static GainNode localMediaStreamGain;
|
public static GainNode localMediaStreamGain;
|
||||||
public static MediaStream localRawMediaStream;
|
public static MediaStream localRawMediaStream;
|
||||||
public static EnumVoiceChannelReadyState readyState = EnumVoiceChannelReadyState.NONE;
|
public static EnumVoiceChannelReadyState readyState = EnumVoiceChannelReadyState.NONE;
|
||||||
public static EnumVoiceChannelPeerState peerState = EnumVoiceChannelPeerState.LOADING;
|
|
||||||
public static EnumVoiceChannelPeerState peerStateConnect = EnumVoiceChannelPeerState.LOADING;
|
|
||||||
public static EnumVoiceChannelPeerState peerStateInitial = EnumVoiceChannelPeerState.LOADING;
|
|
||||||
public static EnumVoiceChannelPeerState peerStateDesc = EnumVoiceChannelPeerState.LOADING;
|
|
||||||
public static EnumVoiceChannelPeerState peerStateIce = EnumVoiceChannelPeerState.LOADING;
|
|
||||||
public static AudioContext microphoneVolumeAudioContext = null;
|
public static AudioContext microphoneVolumeAudioContext = null;
|
||||||
|
|
||||||
public static void setICEServers(String[] urls) {
|
public static void setICEServers(String[] urls) {
|
||||||
|
@ -348,43 +320,16 @@ public class PlatformVoiceClient {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void resetPeerStates() {
|
|
||||||
peerState = peerStateConnect = peerStateInitial = peerStateDesc = peerStateIce = EnumVoiceChannelPeerState.LOADING;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static EnumVoiceChannelPeerState getPeerState() {
|
|
||||||
return peerState;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static EnumVoiceChannelPeerState getPeerStateConnect() {
|
|
||||||
return peerStateConnect;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static EnumVoiceChannelPeerState getPeerStateInitial() {
|
|
||||||
return peerStateInitial;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static EnumVoiceChannelPeerState getPeerStateDesc() {
|
|
||||||
return peerStateDesc;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static EnumVoiceChannelPeerState getPeerStateIce() {
|
|
||||||
return peerStateIce;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static EnumVoiceChannelReadyState getReadyState() {
|
public static EnumVoiceChannelReadyState getReadyState() {
|
||||||
return readyState;
|
return readyState;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void signalConnect(EaglercraftUUID peerId, boolean offer) {
|
public static void signalConnect(EaglercraftUUID peerId, boolean offer) {
|
||||||
if (!hasInit) initializeDevices();
|
|
||||||
try {
|
try {
|
||||||
JSObject peerConnection = PlatformWebRTC.createRTCPeerConnection(JSONWriter.valueToString(iceServers));
|
JSObject peerConnection = PlatformWebRTC.createRTCPeerConnection(JSONWriter.valueToString(iceServers));
|
||||||
VoicePeer peerInstance = new VoicePeer(peerId, peerConnection, offer);
|
VoicePeer peerInstance = new VoicePeer(peerId, peerConnection, offer);
|
||||||
peerList.put(peerId, peerInstance);
|
peerList.put(peerId, peerInstance);
|
||||||
if (peerStateConnect != EnumVoiceChannelPeerState.SUCCESS) peerStateConnect = EnumVoiceChannelPeerState.SUCCESS;
|
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
if (peerStateConnect == EnumVoiceChannelPeerState.LOADING) peerStateConnect = EnumVoiceChannelPeerState.FAILED;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,23 +4,15 @@ import net.lax1dude.eaglercraft.v1_8.EagRuntime;
|
||||||
import net.lax1dude.eaglercraft.v1_8.internal.teavm.TeaVMUtils;
|
import net.lax1dude.eaglercraft.v1_8.internal.teavm.TeaVMUtils;
|
||||||
import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
|
import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
|
||||||
import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
||||||
|
import net.lax1dude.eaglercraft.v1_8.sp.internal.ClientPlatformSingleplayer;
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.lan.LANPeerEvent;
|
import net.lax1dude.eaglercraft.v1_8.sp.lan.LANPeerEvent;
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayQuery;
|
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayQueryImpl;
|
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayQueryRateLimitDummy;
|
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayServerRateLimitTracker;
|
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayServerSocket;
|
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayServerSocketImpl;
|
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayServerSocketRateLimitDummy;
|
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayWorldsQuery;
|
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayWorldsQueryImpl;
|
|
||||||
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayWorldsQueryRateLimitDummy;
|
|
||||||
|
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
import org.json.JSONWriter;
|
import org.json.JSONWriter;
|
||||||
import org.teavm.jso.JSBody;
|
import org.teavm.jso.JSBody;
|
||||||
import org.teavm.jso.JSFunctor;
|
import org.teavm.jso.JSFunctor;
|
||||||
import org.teavm.jso.JSObject;
|
import org.teavm.jso.JSObject;
|
||||||
|
import org.teavm.jso.browser.TimerHandler;
|
||||||
import org.teavm.jso.browser.Window;
|
import org.teavm.jso.browser.Window;
|
||||||
import org.teavm.jso.core.JSError;
|
import org.teavm.jso.core.JSError;
|
||||||
import org.teavm.jso.dom.events.Event;
|
import org.teavm.jso.dom.events.Event;
|
||||||
|
@ -326,8 +318,6 @@ public class PlatformWebRTC {
|
||||||
@JSBody(params = { "sock", "buffer" }, script = "sock.send(buffer);")
|
@JSBody(params = { "sock", "buffer" }, script = "sock.send(buffer);")
|
||||||
static native void nativeBinarySend(WebSocket sock, ArrayBuffer buffer);
|
static native void nativeBinarySend(WebSocket sock, ArrayBuffer buffer);
|
||||||
|
|
||||||
private static final Map<String, JSObject> fuckTeaVM = new HashMap<>();
|
|
||||||
|
|
||||||
public static void runScheduledTasks() {
|
public static void runScheduledTasks() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -403,12 +393,20 @@ public class PlatformWebRTC {
|
||||||
TeaVMUtils.addEventListener(peerConnection, "icecandidate", (EventListener<Event>) evt -> {
|
TeaVMUtils.addEventListener(peerConnection, "icecandidate", (EventListener<Event>) evt -> {
|
||||||
if (hasCandidate(evt)) {
|
if (hasCandidate(evt)) {
|
||||||
if (iceCandidates.isEmpty()) {
|
if (iceCandidates.isEmpty()) {
|
||||||
Window.setTimeout(() -> {
|
final int[] candidateState = new int[2];
|
||||||
|
final TimerHandler[] runnable = new TimerHandler[1];
|
||||||
|
Window.setTimeout(runnable[0] = () -> {
|
||||||
if (peerConnection != null && !"disconnected".equals(getConnectionState(peerConnection))) {
|
if (peerConnection != null && !"disconnected".equals(getConnectionState(peerConnection))) {
|
||||||
|
int trial = ++candidateState[1];
|
||||||
|
if(candidateState[0] != iceCandidates.size() && trial < 3) {
|
||||||
|
candidateState[0] = iceCandidates.size();
|
||||||
|
Window.setTimeout(runnable[0], 2000);
|
||||||
|
return;
|
||||||
|
}
|
||||||
clientICECandidate = JSONWriter.valueToString(iceCandidates);
|
clientICECandidate = JSONWriter.valueToString(iceCandidates);
|
||||||
iceCandidates.clear();
|
iceCandidates.clear();
|
||||||
}
|
}
|
||||||
}, 3000);
|
}, 2000);
|
||||||
}
|
}
|
||||||
Map<String, String> m = new HashMap<>();
|
Map<String, String> m = new HashMap<>();
|
||||||
m.put("sdpMLineIndex", "" + getSdpMLineIndex(evt));
|
m.put("sdpMLineIndex", "" + getSdpMLineIndex(evt));
|
||||||
|
@ -506,6 +504,8 @@ public class PlatformWebRTC {
|
||||||
public LANServer client;
|
public LANServer client;
|
||||||
public String peerId;
|
public String peerId;
|
||||||
public JSObject peerConnection;
|
public JSObject peerConnection;
|
||||||
|
public JSObject dataChannel;
|
||||||
|
public String ipcChannel;
|
||||||
|
|
||||||
public LANPeer(LANServer client, String peerId, JSObject peerConnection) {
|
public LANPeer(LANServer client, String peerId, JSObject peerConnection) {
|
||||||
this.client = client;
|
this.client = client;
|
||||||
|
@ -517,15 +517,23 @@ public class PlatformWebRTC {
|
||||||
TeaVMUtils.addEventListener(peerConnection, "icecandidate", (EventListener<Event>) evt -> {
|
TeaVMUtils.addEventListener(peerConnection, "icecandidate", (EventListener<Event>) evt -> {
|
||||||
if (hasCandidate(evt)) {
|
if (hasCandidate(evt)) {
|
||||||
if (iceCandidates.isEmpty()) {
|
if (iceCandidates.isEmpty()) {
|
||||||
Window.setTimeout(() -> {
|
final int[] candidateState = new int[2];
|
||||||
|
final TimerHandler[] runnable = new TimerHandler[1];
|
||||||
|
Window.setTimeout(runnable[0] = () -> {
|
||||||
if (peerConnection != null && !"disconnected".equals(getConnectionState(peerConnection))) {
|
if (peerConnection != null && !"disconnected".equals(getConnectionState(peerConnection))) {
|
||||||
|
int trial = ++candidateState[1];
|
||||||
|
if(candidateState[0] != iceCandidates.size() && trial < 3) {
|
||||||
|
candidateState[0] = iceCandidates.size();
|
||||||
|
Window.setTimeout(runnable[0], 2000);
|
||||||
|
return;
|
||||||
|
}
|
||||||
LANPeerEvent.LANPeerICECandidateEvent e = new LANPeerEvent.LANPeerICECandidateEvent(peerId, JSONWriter.valueToString(iceCandidates));
|
LANPeerEvent.LANPeerICECandidateEvent e = new LANPeerEvent.LANPeerICECandidateEvent(peerId, JSONWriter.valueToString(iceCandidates));
|
||||||
synchronized(serverLANEventBuffer) {
|
synchronized(serverLANEventBuffer) {
|
||||||
serverLANEventBuffer.put(peerId, e);
|
serverLANEventBuffer.put(peerId, e);
|
||||||
}
|
}
|
||||||
iceCandidates.clear();
|
iceCandidates.clear();
|
||||||
}
|
}
|
||||||
}, 3000);
|
}, 2000);
|
||||||
}
|
}
|
||||||
Map<String, String> m = new HashMap<>();
|
Map<String, String> m = new HashMap<>();
|
||||||
m.put("sdpMLineIndex", "" + getSdpMLineIndex(evt));
|
m.put("sdpMLineIndex", "" + getSdpMLineIndex(evt));
|
||||||
|
@ -542,17 +550,24 @@ public class PlatformWebRTC {
|
||||||
}
|
}
|
||||||
if (getChannel(evt) == null) return;
|
if (getChannel(evt) == null) return;
|
||||||
JSObject dataChannel = getChannel(evt);
|
JSObject dataChannel = getChannel(evt);
|
||||||
synchronized(fuckTeaVM) {
|
if(this.dataChannel != null) {
|
||||||
fuckTeaVM.put(peerId, dataChannel);
|
closeIt(dataChannel);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
this.dataChannel = dataChannel;
|
||||||
synchronized(serverLANEventBuffer) {
|
synchronized(serverLANEventBuffer) {
|
||||||
serverLANEventBuffer.put(peerId, new LANPeerEvent.LANPeerDataChannelEvent(peerId));
|
serverLANEventBuffer.put(peerId, new LANPeerEvent.LANPeerDataChannelEvent(peerId));
|
||||||
}
|
}
|
||||||
TeaVMUtils.addEventListener(dataChannel, "message", (EventListener<Event>) evt2 -> {
|
TeaVMUtils.addEventListener(dataChannel, "message", (EventListener<Event>) evt2 -> {
|
||||||
LANPeerEvent.LANPeerPacketEvent e = new LANPeerEvent.LANPeerPacketEvent(peerId, TeaVMUtils.wrapByteArrayBuffer(getData(evt2)));
|
ArrayBuffer data = getData(evt2);
|
||||||
|
if(ipcChannel != null) {
|
||||||
|
ClientPlatformSingleplayer.sendPacketTeaVM(ipcChannel, data);
|
||||||
|
}else {
|
||||||
|
LANPeerEvent.LANPeerPacketEvent e = new LANPeerEvent.LANPeerPacketEvent(peerId, TeaVMUtils.wrapByteArrayBuffer(data));
|
||||||
synchronized(serverLANEventBuffer) {
|
synchronized(serverLANEventBuffer) {
|
||||||
serverLANEventBuffer.put(peerId, e);
|
serverLANEventBuffer.put(peerId, e);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -572,11 +587,8 @@ public class PlatformWebRTC {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void disconnect() {
|
public void disconnect() {
|
||||||
synchronized(fuckTeaVM) {
|
if(dataChannel != null) {
|
||||||
if (fuckTeaVM.get(peerId) != null) {
|
closeIt(dataChannel);
|
||||||
closeIt(fuckTeaVM.get(peerId));
|
|
||||||
fuckTeaVM.remove(peerId);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
closeIt(peerConnection);
|
closeIt(peerConnection);
|
||||||
}
|
}
|
||||||
|
@ -627,11 +639,26 @@ public class PlatformWebRTC {
|
||||||
client.signalRemoteDisconnect(peerId);
|
client.signalRemoteDisconnect(peerId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void mapIPC(String ipcChannel) {
|
||||||
|
if(this.ipcChannel == null) {
|
||||||
|
if(ipcChannel != null) {
|
||||||
|
this.ipcChannel = ipcChannel;
|
||||||
|
this.client.ipcMapList.put(ipcChannel, this);
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
if(ipcChannel == null) {
|
||||||
|
this.client.ipcMapList.remove(this.ipcChannel);
|
||||||
|
this.ipcChannel = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class LANServer {
|
public static class LANServer {
|
||||||
public Set<Map<String, String>> iceServers = new HashSet<>();
|
public Set<Map<String, String>> iceServers = new HashSet<>();
|
||||||
public Map<String, LANPeer> peerList = new HashMap<>();
|
public Map<String, LANPeer> peerList = new HashMap<>();
|
||||||
|
public Map<String, LANPeer> ipcMapList = new HashMap<>();
|
||||||
public byte peerState = PEERSTATE_LOADING;
|
public byte peerState = PEERSTATE_LOADING;
|
||||||
public byte peerStateConnect = PEERSTATE_LOADING;
|
public byte peerStateConnect = PEERSTATE_LOADING;
|
||||||
public byte peerStateInitial = PEERSTATE_LOADING;
|
public byte peerStateInitial = PEERSTATE_LOADING;
|
||||||
|
@ -659,21 +686,23 @@ public class PlatformWebRTC {
|
||||||
public void sendPacketToRemoteClient(String peerId, ArrayBuffer buffer) {
|
public void sendPacketToRemoteClient(String peerId, ArrayBuffer buffer) {
|
||||||
LANPeer thePeer = this.peerList.get(peerId);
|
LANPeer thePeer = this.peerList.get(peerId);
|
||||||
if (thePeer != null) {
|
if (thePeer != null) {
|
||||||
|
sendPacketToRemoteClient(thePeer, buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendPacketToRemoteClient(LANPeer thePeer, ArrayBuffer buffer) {
|
||||||
boolean b = false;
|
boolean b = false;
|
||||||
synchronized(fuckTeaVM) {
|
if (thePeer.dataChannel != null && "open".equals(getReadyState(thePeer.dataChannel))) {
|
||||||
if (fuckTeaVM.get(thePeer.peerId) != null && "open".equals(getReadyState(fuckTeaVM.get(thePeer.peerId)))) {
|
|
||||||
try {
|
try {
|
||||||
sendIt(fuckTeaVM.get(thePeer.peerId), buffer);
|
sendIt(thePeer.dataChannel, buffer);
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
b = true;
|
b = true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
b = true;
|
b = true;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if(b) {
|
if(b) {
|
||||||
signalRemoteDisconnect(peerId);
|
signalRemoteDisconnect(thePeer.peerId);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -719,26 +748,29 @@ public class PlatformWebRTC {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
peerList.clear();
|
peerList.clear();
|
||||||
synchronized(fuckTeaVM) {
|
|
||||||
fuckTeaVM.clear();
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
LANPeer thePeer = peerList.get(peerId);
|
LANPeer thePeer = peerList.remove(peerId);
|
||||||
if(thePeer != null) {
|
if(thePeer != null) {
|
||||||
peerList.remove(peerId);
|
if(thePeer.ipcChannel != null) {
|
||||||
|
ipcMapList.remove(thePeer.ipcChannel);
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
thePeer.disconnect();
|
thePeer.disconnect();
|
||||||
} catch (Throwable ignored) {}
|
} catch (Throwable ignored) {}
|
||||||
synchronized(fuckTeaVM) {
|
|
||||||
fuckTeaVM.remove(peerId);
|
|
||||||
}
|
|
||||||
synchronized(serverLANEventBuffer) {
|
synchronized(serverLANEventBuffer) {
|
||||||
serverLANEventBuffer.put(thePeer.peerId, new LANPeerEvent.LANPeerDisconnectEvent(peerId));
|
serverLANEventBuffer.put(thePeer.peerId, new LANPeerEvent.LANPeerDisconnectEvent(peerId));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void serverPeerMapIPC(String peer, String ipcChannel) {
|
||||||
|
LANPeer peerr = peerList.get(peer);
|
||||||
|
if(peerr != null) {
|
||||||
|
peerr.mapIPC(ipcChannel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public int countPeers() {
|
public int countPeers() {
|
||||||
return peerList.size();
|
return peerList.size();
|
||||||
}
|
}
|
||||||
|
@ -759,30 +791,6 @@ public class PlatformWebRTC {
|
||||||
void call(JSError err);
|
void call(JSError err);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static RelayQuery openRelayQuery(String addr) {
|
|
||||||
RelayQuery.RateLimit limit = RelayServerRateLimitTracker.isLimited(addr);
|
|
||||||
if(limit == RelayQuery.RateLimit.LOCKED || limit == RelayQuery.RateLimit.BLOCKED) {
|
|
||||||
return new RelayQueryRateLimitDummy(limit);
|
|
||||||
}
|
|
||||||
return new RelayQueryImpl(addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static RelayWorldsQuery openRelayWorldsQuery(String addr) {
|
|
||||||
RelayQuery.RateLimit limit = RelayServerRateLimitTracker.isLimited(addr);
|
|
||||||
if(limit == RelayQuery.RateLimit.LOCKED || limit == RelayQuery.RateLimit.BLOCKED) {
|
|
||||||
return new RelayWorldsQueryRateLimitDummy(limit);
|
|
||||||
}
|
|
||||||
return new RelayWorldsQueryImpl(addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static RelayServerSocket openRelayConnection(String addr, int timeout) {
|
|
||||||
RelayQuery.RateLimit limit = RelayServerRateLimitTracker.isLimited(addr);
|
|
||||||
if(limit == RelayQuery.RateLimit.LOCKED || limit == RelayQuery.RateLimit.BLOCKED) {
|
|
||||||
return new RelayServerSocketRateLimitDummy(limit);
|
|
||||||
}
|
|
||||||
return new RelayServerSocketImpl(addr, timeout);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static LANClient rtcLANClient = null;
|
private static LANClient rtcLANClient = null;
|
||||||
|
|
||||||
public static void startRTCLANClient() {
|
public static void startRTCLANClient() {
|
||||||
|
@ -806,7 +814,6 @@ public class PlatformWebRTC {
|
||||||
rtcLANClient.signalRemoteDisconnect(false);
|
rtcLANClient.signalRemoteDisconnect(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo: ArrayBuffer version
|
|
||||||
public static void clientLANSendPacket(byte[] pkt) {
|
public static void clientLANSendPacket(byte[] pkt) {
|
||||||
rtcLANClient.sendPacketToServer(TeaVMUtils.unwrapArrayBuffer(pkt));
|
rtcLANClient.sendPacketToServer(TeaVMUtils.unwrapArrayBuffer(pkt));
|
||||||
}
|
}
|
||||||
|
@ -949,6 +956,24 @@ public class PlatformWebRTC {
|
||||||
rtcLANServer.signalRemoteDescription(peer, description);
|
rtcLANServer.signalRemoteDescription(peer, description);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void serverLANPeerMapIPC(String peer, String ipcChannel) {
|
||||||
|
rtcLANServer.serverPeerMapIPC(peer, ipcChannel);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean serverLANPeerPassIPC(String channelName, ArrayBuffer data) {
|
||||||
|
if(rtcLANServer != null) {
|
||||||
|
LANPeer peer = rtcLANServer.ipcMapList.get(channelName);
|
||||||
|
if(peer != null) {
|
||||||
|
rtcLANServer.sendPacketToRemoteClient(peer, data);
|
||||||
|
return true;
|
||||||
|
}else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void serverLANDisconnectPeer(String peer) {
|
public static void serverLANDisconnectPeer(String peer) {
|
||||||
rtcLANServer.signalRemoteDisconnect(peer);
|
rtcLANServer.signalRemoteDisconnect(peer);
|
||||||
}
|
}
|
||||||
|
|
|
@ -169,7 +169,7 @@ public class EaglerArrayByteBuffer implements ByteBuffer {
|
||||||
int l = src.remaining();
|
int l = src.remaining();
|
||||||
if(position + l > limit) throw Buffer.makeIOOBE(position + l - 1);
|
if(position + l > limit) throw Buffer.makeIOOBE(position + l - 1);
|
||||||
for(int i = 0; i < l; ++i) {
|
for(int i = 0; i < l; ++i) {
|
||||||
dataView.setInt8(position + l, src.get());
|
dataView.setInt8(position + i, src.get());
|
||||||
}
|
}
|
||||||
position += l;
|
position += l;
|
||||||
}
|
}
|
||||||
|
|
|
@ -153,7 +153,7 @@ public class EaglerArrayFloatBuffer implements FloatBuffer {
|
||||||
int l = src.remaining();
|
int l = src.remaining();
|
||||||
if(position + l > limit) throw Buffer.makeIOOBE(position + l - 1);
|
if(position + l > limit) throw Buffer.makeIOOBE(position + l - 1);
|
||||||
for(int i = 0; i < l; ++i) {
|
for(int i = 0; i < l; ++i) {
|
||||||
typedArray.set(position + l, src.get());
|
typedArray.set(position + i, src.get());
|
||||||
}
|
}
|
||||||
position += l;
|
position += l;
|
||||||
}
|
}
|
||||||
|
|
|
@ -153,7 +153,7 @@ public class EaglerArrayIntBuffer implements IntBuffer {
|
||||||
int l = src.remaining();
|
int l = src.remaining();
|
||||||
if(position + l > limit) throw Buffer.makeIOOBE(position + l - 1);
|
if(position + l > limit) throw Buffer.makeIOOBE(position + l - 1);
|
||||||
for(int i = 0; i < l; ++i) {
|
for(int i = 0; i < l; ++i) {
|
||||||
typedArray.set(position + l, src.get());
|
typedArray.set(position + i, src.get());
|
||||||
}
|
}
|
||||||
position += l;
|
position += l;
|
||||||
}
|
}
|
||||||
|
|
|
@ -153,7 +153,7 @@ public class EaglerArrayShortBuffer implements ShortBuffer {
|
||||||
int l = src.remaining();
|
int l = src.remaining();
|
||||||
if(position + l > limit) throw Buffer.makeIOOBE(position + l - 1);
|
if(position + l > limit) throw Buffer.makeIOOBE(position + l - 1);
|
||||||
for(int i = 0; i < l; ++i) {
|
for(int i = 0; i < l; ++i) {
|
||||||
typedArray.set(position + l, src.get());
|
typedArray.set(position + i, src.get());
|
||||||
}
|
}
|
||||||
position += l;
|
position += l;
|
||||||
}
|
}
|
||||||
|
|
|
@ -130,7 +130,7 @@ public class TeaVMUtils {
|
||||||
@GeneratedBy(TeaVMUtilsUnwrapGenerator.WrapArrayBuffer.class)
|
@GeneratedBy(TeaVMUtilsUnwrapGenerator.WrapArrayBuffer.class)
|
||||||
public static native short[] wrapShortArrayBuffer(ArrayBuffer buf);
|
public static native short[] wrapShortArrayBuffer(ArrayBuffer buf);
|
||||||
|
|
||||||
@InjectedBy(TeaVMUtilsUnwrapGenerator.UnwrapArrayBuffer.class)
|
@GeneratedBy(TeaVMUtilsUnwrapGenerator.WrapArrayBufferView.class)
|
||||||
public static native short[] wrapShortArrayBuffer(ArrayBufferView buf);
|
public static native short[] wrapShortArrayBuffer(ArrayBufferView buf);
|
||||||
|
|
||||||
@Async
|
@Async
|
||||||
|
@ -140,12 +140,8 @@ public class TeaVMUtils {
|
||||||
Window.setTimeout(() -> cb.complete(null), millis);
|
Window.setTimeout(() -> cb.complete(null), millis);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final Comparator<Touch> touchSortingComparator = (t1, t2) -> {
|
|
||||||
return t1.getIdentifier() - t2.getIdentifier();
|
|
||||||
};
|
|
||||||
|
|
||||||
public static final Comparator<OffsetTouch> touchSortingComparator2 = (t1, t2) -> {
|
public static final Comparator<OffsetTouch> touchSortingComparator2 = (t1, t2) -> {
|
||||||
return t1.touch.getIdentifier() - t2.touch.getIdentifier();
|
return t1.eventUID - t2.eventUID;
|
||||||
};
|
};
|
||||||
|
|
||||||
public static List<OffsetTouch> toSortedTouchList(TouchList touchList, SortedTouchEvent.ITouchUIDMapper mapper,
|
public static List<OffsetTouch> toSortedTouchList(TouchList touchList, SortedTouchEvent.ITouchUIDMapper mapper,
|
||||||
|
|
|
@ -16,6 +16,7 @@ import org.teavm.jso.workers.Worker;
|
||||||
|
|
||||||
import net.lax1dude.eaglercraft.v1_8.internal.IPCPacketData;
|
import net.lax1dude.eaglercraft.v1_8.internal.IPCPacketData;
|
||||||
import net.lax1dude.eaglercraft.v1_8.internal.PlatformRuntime;
|
import net.lax1dude.eaglercraft.v1_8.internal.PlatformRuntime;
|
||||||
|
import net.lax1dude.eaglercraft.v1_8.internal.PlatformWebRTC;
|
||||||
import net.lax1dude.eaglercraft.v1_8.internal.teavm.ClientMain;
|
import net.lax1dude.eaglercraft.v1_8.internal.teavm.ClientMain;
|
||||||
import net.lax1dude.eaglercraft.v1_8.internal.teavm.TeaVMBlobURLManager;
|
import net.lax1dude.eaglercraft.v1_8.internal.teavm.TeaVMBlobURLManager;
|
||||||
import net.lax1dude.eaglercraft.v1_8.internal.teavm.TeaVMClientConfigAdapter;
|
import net.lax1dude.eaglercraft.v1_8.internal.teavm.TeaVMClientConfigAdapter;
|
||||||
|
@ -101,6 +102,10 @@ public class ClientPlatformSingleplayer {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(PlatformWebRTC.serverLANPeerPassIPC(channel, buf)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
synchronized(messageQueue) {
|
synchronized(messageQueue) {
|
||||||
messageQueue.add(new IPCPacketData(channel, TeaVMUtils.wrapByteArrayBuffer(buf)));
|
messageQueue.add(new IPCPacketData(channel, TeaVMUtils.wrapByteArrayBuffer(buf)));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user