diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/storage/DerivedWorldInfoBridge.java b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/storage/DerivedWorldInfoBridge.java new file mode 100644 index 00000000..20e4571f --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/storage/DerivedWorldInfoBridge.java @@ -0,0 +1,12 @@ +package io.izzel.arclight.common.bridge.world.storage; + +import net.minecraft.util.RegistryKey; +import net.minecraft.world.DimensionType; +import net.minecraft.world.storage.IServerWorldInfo; + +public interface DerivedWorldInfoBridge { + + IServerWorldInfo bridge$getDelegate(); + + void bridge$setDimType(RegistryKey typeKey); +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/EntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/EntityMixin.java index 973009ee..d79d3e25 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/EntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/EntityMixin.java @@ -921,6 +921,7 @@ public abstract class EntityMixin implements InternalEntityBridge, EntityBridge, vector3d = new Vector3d(0.5D, 0.0D, 0.0D); } + ArclightCaptures.captureCraftPortalEvent(event); return PortalSize.func_242963_a(worldFinal, p_242275_2_, direction$axis, vector3d, this.getSize(this.getPose()), this.getMotion(), this.rotationYaw, this.rotationPitch); }).orElse(null); } @@ -938,7 +939,10 @@ public abstract class EntityMixin implements InternalEntityBridge, EntityBridge, } blockpos = new BlockPos(event.getTo().getX(), event.getTo().getY(), event.getTo().getZ()); - return new PortalInfo(new Vector3d((double) blockpos.getX() + 0.5D, blockpos.getY(), (double) blockpos.getZ() + 0.5D), this.getMotion(), this.rotationYaw, this.rotationPitch); + PortalInfo portalInfo = new PortalInfo(new Vector3d((double) blockpos.getX() + 0.5D, blockpos.getY(), (double) blockpos.getZ() + 0.5D), this.getMotion(), this.rotationYaw, this.rotationPitch); + ((PortalInfoBridge) portalInfo).bridge$setWorld(((CraftWorld) event.getTo().getWorld()).getHandle()); + ((PortalInfoBridge) portalInfo).bridge$setPortalEventInfo(event); + return portalInfo; } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/boss/dragon/EnderDragonEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/boss/dragon/EnderDragonEntityMixin.java index 56cdb73c..e56b1e7d 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/boss/dragon/EnderDragonEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/boss/dragon/EnderDragonEntityMixin.java @@ -33,7 +33,7 @@ import java.util.List; @Mixin(EnderDragonEntity.class) public abstract class EnderDragonEntityMixin extends MobEntityMixin { - private Explosion explosionSource = new Explosion(null, (EnderDragonEntity) (Object) this, Double.NaN, Double.NaN, Double.NaN, Float.NaN, true, Explosion.Mode.DESTROY); + private Explosion explosionSource = new Explosion(null, (EnderDragonEntity) (Object) this, null, null, Double.NaN, Double.NaN, Double.NaN, Float.NaN, true, Explosion.Mode.DESTROY); @Redirect(method = "livingTick", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/boss/dragon/phase/IPhase;getTargetLocation()Lnet/minecraft/util/math/vector/Vector3d;")) private Vector3d arclight$noMoveHovering(IPhase phase) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/player/ServerPlayerEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/player/ServerPlayerEntityMixin.java index 08ca09fc..8afc296d 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/player/ServerPlayerEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/player/ServerPlayerEntityMixin.java @@ -467,6 +467,7 @@ public abstract class ServerPlayerEntityMixin extends PlayerEntityMixin implemen ServerWorld serverworld = this.getServerWorld(); RegistryKey registrykey = ((WorldBridge) serverworld).bridge$getTypeKey(); if (registrykey == DimensionType.THE_END && ((WorldBridge) server).bridge$getTypeKey() == DimensionType.OVERWORLD && teleporter instanceof Teleporter) { //Forge: Fix non-vanilla teleporters triggering end credits + this.invulnerableDimensionChange = true; this.detach(); this.getServerWorld().removePlayer((ServerPlayerEntity) (Object) this, true); //Forge: The player entity is cloned so keep the data until after cloning calls copyFrom if (!this.queuedEndExit) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/PlayerListMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/PlayerListMixin.java index 6d6d27d0..94e49d59 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/PlayerListMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/PlayerListMixin.java @@ -284,7 +284,7 @@ public abstract class PlayerListMixin implements PlayerListBridge { Vector3d vec3d2 = Vector3d.copyCenteredHorizontally(pos).subtract(vec3d).normalize(); f2 = (float) MathHelper.wrapDegrees(MathHelper.atan2(vec3d2.z, vec3d2.x) * 57.2957763671875 - 90.0); } - playerIn.setLocationAndAngles(vec3d.x, vec3d.y, vec3d.z, f2, 0.0f); + // playerIn.setLocationAndAngles(vec3d.x, vec3d.y, vec3d.z, f2, 0.0f); playerIn.func_242111_a(spawnWorld.getDimensionKey(), pos, f, flag2, false); flag3 = (!flag && flag4); isBedSpawn = true; @@ -385,7 +385,7 @@ public abstract class PlayerListMixin implements PlayerListBridge { if (spawnWorld != null) { Optional optional; if (pos != null) { - optional = PlayerEntity.func_242374_a(spawnWorld, pos, f, flag2, flag2); + optional = PlayerEntity.func_242374_a(spawnWorld, pos, f, flag2, conqueredEnd); } else { optional = Optional.empty(); } @@ -400,7 +400,7 @@ public abstract class PlayerListMixin implements PlayerListBridge { Vector3d vec3d2 = Vector3d.copyCenteredHorizontally(pos).subtract(vec3d).normalize(); f2 = (float) MathHelper.wrapDegrees(MathHelper.atan2(vec3d2.z, vec3d2.x) * 57.2957763671875 - 90.0); } - playerIn.setLocationAndAngles(vec3d.x, vec3d.y, vec3d.z, f2, 0.0f); + // playerIn.setLocationAndAngles(vec3d.x, vec3d.y, vec3d.z, f2, 0.0f); playerIn.func_242111_a(spawnWorld.getDimensionKey(), pos, f, flag2, false); flag3 = (!flag2 && flag4); isBedSpawn = true; @@ -421,7 +421,7 @@ public abstract class PlayerListMixin implements PlayerListBridge { return playerIn; } location = respawnEvent.getRespawnLocation(); - if (!flag2) { + if (!conqueredEnd) { ((ServerPlayerEntityBridge) playerIn).bridge$reset(); } } else { @@ -441,7 +441,7 @@ public abstract class PlayerListMixin implements PlayerListBridge { // Forward to new player instance ((InternalEntityBridge) playerIn).internal$getBukkitEntity().setHandle(serverplayerentity); ((EntityBridge) serverplayerentity).bridge$setBukkitEntity(((InternalEntityBridge) playerIn).internal$getBukkitEntity()); - if ((Object) serverplayerentity instanceof MobEntity) { + if ((Object) playerIn instanceof MobEntity) { ((MobEntity) (Object) playerIn).clearLeashed(true, false); } @@ -455,8 +455,8 @@ public abstract class PlayerListMixin implements PlayerListBridge { serverplayerentity.addTag(s); } - playerIn.setPositionAndRotation(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); - playerIn.connection.captureCurrentPosition(); + serverplayerentity.setPositionAndRotation(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); + serverplayerentity.connection.captureCurrentPosition(); this.setPlayerGameTypeBasedOnOther(serverplayerentity, playerIn, serverWorld); while (avoidSuffocation && !serverWorld.hasNoCollisions(serverplayerentity) && serverplayerentity.getPosY() < 256.0D) { @@ -474,7 +474,7 @@ public abstract class PlayerListMixin implements PlayerListBridge { serverplayerentity.connection.sendPacket(new SSetExperiencePacket(serverplayerentity.experience, serverplayerentity.experienceTotal, serverplayerentity.experienceLevel)); this.sendWorldInfo(serverplayerentity, serverWorld); this.updatePermissionLevel(serverplayerentity); - if (!((ServerPlayNetHandlerBridge) playerIn.connection).bridge$isDisconnected()) { + if (!((ServerPlayNetHandlerBridge) serverplayerentity.connection).bridge$isDisconnected()) { serverWorld.addRespawnedPlayer(serverplayerentity); this.addPlayer(serverplayerentity); this.uuidToPlayerMap.put(serverplayerentity.getUniqueID(), serverplayerentity); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ServerWorldMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ServerWorldMixin.java index a6290f76..7a51c1f4 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ServerWorldMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ServerWorldMixin.java @@ -8,6 +8,7 @@ import io.izzel.arclight.common.bridge.world.ExplosionBridge; import io.izzel.arclight.common.bridge.world.WorldBridge; import io.izzel.arclight.common.bridge.world.server.ServerChunkProviderBridge; import io.izzel.arclight.common.bridge.world.server.ServerWorldBridge; +import io.izzel.arclight.common.bridge.world.storage.DerivedWorldInfoBridge; import io.izzel.arclight.common.bridge.world.storage.MapDataBridge; import io.izzel.arclight.common.bridge.world.storage.WorldInfoBridge; import io.izzel.arclight.common.mixin.core.world.WorldMixin; @@ -134,6 +135,7 @@ public abstract class ServerWorldMixin extends WorldMixin implements ServerWorld } else if (worldInfo instanceof DerivedWorldInfo) { // damn spigot again this.$$worldDataServer = DelegateWorldInfo.wrap(((DerivedWorldInfo) worldInfo)); + ((DerivedWorldInfoBridge) worldInfo).bridge$setDimType(this.getTypeKey()); } ((ServerChunkProviderBridge) this.field_241102_C_).bridge$setViewDistance(spigotConfig.viewDistance); ((WorldInfoBridge) this.$$worldDataServer).bridge$setWorld((ServerWorld) (Object) this); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/storage/DerivedWorldInfoAccessor.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/storage/DerivedWorldInfoAccessor.java deleted file mode 100644 index 36333682..00000000 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/storage/DerivedWorldInfoAccessor.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.izzel.arclight.common.mixin.core.world.storage; - -import net.minecraft.world.storage.DerivedWorldInfo; -import net.minecraft.world.storage.IServerWorldInfo; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(DerivedWorldInfo.class) -public interface DerivedWorldInfoAccessor { - - @Accessor("delegate") - IServerWorldInfo bridge$getDelegate(); -} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/storage/DerivedWorldInfoMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/storage/DerivedWorldInfoMixin.java new file mode 100644 index 00000000..f0318f4c --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/storage/DerivedWorldInfoMixin.java @@ -0,0 +1,51 @@ +package io.izzel.arclight.common.mixin.core.world.storage; + +import io.izzel.arclight.common.bridge.world.storage.DerivedWorldInfoBridge; +import net.minecraft.util.RegistryKey; +import net.minecraft.world.DimensionType; +import net.minecraft.world.storage.DerivedWorldInfo; +import net.minecraft.world.storage.IServerWorldInfo; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(DerivedWorldInfo.class) +public class DerivedWorldInfoMixin implements DerivedWorldInfoBridge { + + @Shadow @Final private IServerWorldInfo delegate; + + private RegistryKey typeKey; + + /** + * @author IzzelAliz + * @reason + */ + @Overwrite + public String getWorldName() { + if (typeKey == null || typeKey == DimensionType.OVERWORLD) { + return this.delegate.getWorldName(); + } else { + String worldName = this.delegate.getWorldName() + "/"; + String suffix; + if (typeKey == DimensionType.THE_END) { + suffix = "DIM1"; + } else if (typeKey == DimensionType.THE_NETHER) { + suffix = "DIM-1"; + } else { + suffix = typeKey.getLocation().getNamespace() + "/" + typeKey.getLocation().getPath(); + } + return worldName + suffix; + } + } + + @Override + public IServerWorldInfo bridge$getDelegate() { + return delegate; + } + + @Override + public void bridge$setDimType(RegistryKey typeKey) { + this.typeKey = typeKey; + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/DelegateWorldInfo.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/DelegateWorldInfo.java index 74d7bdc5..c180cf7d 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/DelegateWorldInfo.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/DelegateWorldInfo.java @@ -2,7 +2,7 @@ package io.izzel.arclight.common.mod.util; import com.mojang.serialization.Lifecycle; import io.izzel.arclight.common.bridge.world.storage.WorldInfoBridge; -import io.izzel.arclight.common.mixin.core.world.storage.DerivedWorldInfoAccessor; +import io.izzel.arclight.common.bridge.world.storage.DerivedWorldInfoBridge; import net.minecraft.command.TimerCallbackManager; import net.minecraft.crash.CrashReportCategory; import net.minecraft.server.MinecraftServer; @@ -247,7 +247,7 @@ public class DelegateWorldInfo extends ServerWorldInfo { if (worldInfo instanceof ServerWorldInfo) { return ((WorldInfoBridge) worldInfo).bridge$getWorldSettings(); } else { - return worldSettings(((DerivedWorldInfoAccessor) worldInfo).bridge$getDelegate()); + return worldSettings(((DerivedWorldInfoBridge) worldInfo).bridge$getDelegate()); } } @@ -255,7 +255,7 @@ public class DelegateWorldInfo extends ServerWorldInfo { if (worldInfo instanceof ServerWorldInfo) { return ((ServerWorldInfo) worldInfo).getDimensionGeneratorSettings(); } else { - return generatorSettings(((DerivedWorldInfoAccessor) worldInfo).bridge$getDelegate()); + return generatorSettings(((DerivedWorldInfoBridge) worldInfo).bridge$getDelegate()); } } @@ -263,7 +263,7 @@ public class DelegateWorldInfo extends ServerWorldInfo { if (worldInfo instanceof ServerWorldInfo) { return ((WorldInfoBridge) worldInfo).bridge$getLifecycle(); } else { - return lifecycle(((DerivedWorldInfoAccessor) worldInfo).bridge$getDelegate()); + return lifecycle(((DerivedWorldInfoBridge) worldInfo).bridge$getDelegate()); } } } diff --git a/arclight-common/src/main/resources/mixins.arclight.core.json b/arclight-common/src/main/resources/mixins.arclight.core.json index fcc8e45d..8f8223ee 100644 --- a/arclight-common/src/main/resources/mixins.arclight.core.json +++ b/arclight-common/src/main/resources/mixins.arclight.core.json @@ -427,7 +427,7 @@ "world.spawner.WanderingTraderSpawnerMixin", "world.spawner.WorldEntitySpawner_EntityDensityManagerMixin", "world.spawner.WorldEntitySpawnerMixin", - "world.storage.DerivedWorldInfoAccessor", + "world.storage.DerivedWorldInfoMixin", "world.storage.MapData_MapInfoMixin", "world.storage.MapDataMixin", "world.storage.PlayerDataMixin",