diff options
Diffstat (limited to 'src/main/java/com/keuin/ohmyvanillamc/mixins/rule/reintroduceLlamaItemDuping/PlayerManagerMixin.java')
-rw-r--r-- | src/main/java/com/keuin/ohmyvanillamc/mixins/rule/reintroduceLlamaItemDuping/PlayerManagerMixin.java | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/src/main/java/com/keuin/ohmyvanillamc/mixins/rule/reintroduceLlamaItemDuping/PlayerManagerMixin.java b/src/main/java/com/keuin/ohmyvanillamc/mixins/rule/reintroduceLlamaItemDuping/PlayerManagerMixin.java new file mode 100644 index 0000000..f4f8bec --- /dev/null +++ b/src/main/java/com/keuin/ohmyvanillamc/mixins/rule/reintroduceLlamaItemDuping/PlayerManagerMixin.java @@ -0,0 +1,105 @@ +package com.keuin.ohmyvanillamc.mixins.rule.reintroduceLlamaItemDuping; + +import com.keuin.ohmyvanillamc.OmvmSettings; +import net.minecraft.advancement.PlayerAdvancementTracker; +import net.minecraft.entity.Entity; +import net.minecraft.network.Packet; +import net.minecraft.network.packet.s2c.play.PlayerListS2CPacket; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.PlayerManager; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.stat.ServerStatHandler; +import net.minecraft.stat.Stats; +import org.apache.logging.log4j.Logger; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +/** + * Reintroduce MC-161754 glitch + */ +@Mixin(PlayerManager.class) +public abstract class PlayerManagerMixin { + + @Shadow + protected abstract void savePlayerData(ServerPlayerEntity player); + + @Shadow + @Final + private static Logger LOGGER; + + @Shadow + @Final + private List<ServerPlayerEntity> players; + + @Shadow + @Final + private MinecraftServer server; + + @Shadow + @Final + private Map<UUID, ServerPlayerEntity> playerMap; + + @Shadow + @Final + private Map<UUID, ServerStatHandler> statisticsMap; + + @Shadow + @Final + private Map<UUID, PlayerAdvancementTracker> advancementTrackers; + + @Shadow + public abstract void sendToAll(Packet<?> packet); + + /** + * @reason re-introduce llama item duplicating glitch. + * @author trueKeuin + */ + @Overwrite + public void remove(ServerPlayerEntity player) { + ServerWorld serverWorld = player.getServerWorld(); + player.incrementStat(Stats.LEAVE_GAME); + this.savePlayerData(player); + if (player.hasVehicle()) { + Entity entity = player.getRootVehicle(); + if (entity.hasPlayerRider()) { + LOGGER.debug("Removing player mount"); + player.stopRiding(); + serverWorld.removeEntity(entity); + // entity.removed = true + entity.removed = !OmvmSettings.reintroduceLlamaItemDuplicating || entity.removed; + + Entity entity2; + for (Iterator var4 = entity.getPassengersDeep().iterator(); var4.hasNext(); // entity2.removed = true + entity2.removed = !OmvmSettings.reintroduceLlamaItemDuplicating || entity2.removed) { + entity2 = (Entity) var4.next(); + serverWorld.removeEntity(entity2); + } + + serverWorld.getChunk(player.chunkX, player.chunkZ).markDirty(); + } + } + + player.detach(); + serverWorld.removePlayer(player); + player.getAdvancementTracker().clearCriteria(); + this.players.remove(player); + this.server.getBossBarManager().onPlayerDisconnect(player); + UUID uUID = player.getUuid(); + ServerPlayerEntity serverPlayerEntity = (ServerPlayerEntity) this.playerMap.get(uUID); + if (serverPlayerEntity == player) { + this.playerMap.remove(uUID); + this.statisticsMap.remove(uUID); + this.advancementTrackers.remove(uUID); + } + + this.sendToAll(new PlayerListS2CPacket(PlayerListS2CPacket.Action.REMOVE_PLAYER, player)); + } +} |