Combine all versions into a single tree
This commit is contained in:
@@ -7,7 +7,6 @@ import com.replaymod.recording.handler.GuiHandler;
|
||||
import com.replaymod.recording.packet.PacketListener;
|
||||
import io.netty.channel.ChannelDuplexHandler;
|
||||
import io.netty.channel.ChannelHandler;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraft.network.NetworkManager;
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
|
||||
@@ -17,6 +16,8 @@ import net.minecraftforge.fml.common.network.NetworkRegistry;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.lwjgl.input.Keyboard;
|
||||
|
||||
import static com.replaymod.core.versions.MCVer.*;
|
||||
|
||||
@Mod(modid = ReplayModRecording.MOD_ID,
|
||||
version = "@MOD_VERSION@",
|
||||
acceptedMinecraftVersions = "@MC_VERSION@",
|
||||
@@ -56,7 +57,7 @@ public class ReplayModRecording {
|
||||
|
||||
@Mod.EventHandler
|
||||
public void init(FMLInitializationEvent event) {
|
||||
EventBus bus = MinecraftForge.EVENT_BUS;
|
||||
EventBus bus = FML_BUS;
|
||||
bus.register(connectionEventHandler = new ConnectionEventHandler(logger, core));
|
||||
|
||||
new GuiHandler(core).register();
|
||||
|
||||
@@ -13,6 +13,8 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
|
||||
import static com.replaymod.core.ReplayMod.TEXTURE;
|
||||
import static com.replaymod.core.ReplayMod.TEXTURE_SIZE;
|
||||
import static com.replaymod.core.versions.MCVer.getFontRenderer;
|
||||
import static com.replaymod.core.versions.MCVer.getType;
|
||||
|
||||
/**
|
||||
* Renders overlay during recording.
|
||||
@@ -40,9 +42,9 @@ public class GuiRecordingOverlay {
|
||||
*/
|
||||
@SubscribeEvent
|
||||
public void renderRecordingIndicator(RenderGameOverlayEvent.Post event) {
|
||||
if (event.getType() != RenderGameOverlayEvent.ElementType.ALL) return;
|
||||
if (getType(event) != RenderGameOverlayEvent.ElementType.ALL) return;
|
||||
if (settingsRegistry.get(Setting.INDICATOR)) {
|
||||
FontRenderer fontRenderer = mc.fontRenderer;
|
||||
FontRenderer fontRenderer = getFontRenderer(mc);
|
||||
fontRenderer.drawString(I18n.format("replaymod.gui.recording").toUpperCase(), 30, 18 - (fontRenderer.FONT_HEIGHT / 2), 0xffffffff);
|
||||
mc.renderEngine.bindTexture(TEXTURE);
|
||||
GlStateManager.resetColor();
|
||||
|
||||
@@ -12,7 +12,6 @@ import com.replaymod.replaystudio.replay.ZipReplayFile;
|
||||
import com.replaymod.replaystudio.studio.ReplayStudio;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.network.NetworkManager;
|
||||
import net.minecraft.world.WorldType;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
import net.minecraftforge.fml.common.network.FMLNetworkEvent.ClientDisconnectionFromServerEvent;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
@@ -21,6 +20,8 @@ import java.io.File;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Calendar;
|
||||
|
||||
import static com.replaymod.core.versions.MCVer.WorldType_DEBUG_ALL_BLOCK_STATES;
|
||||
|
||||
/**
|
||||
* Handles connection events and initiates recording if enabled.
|
||||
*/
|
||||
@@ -47,7 +48,7 @@ public class ConnectionEventHandler {
|
||||
try {
|
||||
boolean local = networkManager.isLocalChannel();
|
||||
if (local) {
|
||||
if (mc.getIntegratedServer().getEntityWorld().getWorldType() == WorldType.DEBUG_ALL_BLOCK_STATES) {
|
||||
if (mc.getIntegratedServer().getEntityWorld().getWorldType() == WorldType_DEBUG_ALL_BLOCK_STATES) {
|
||||
logger.info("Debug World recording is not supported.");
|
||||
return;
|
||||
}
|
||||
@@ -67,9 +68,11 @@ public class ConnectionEventHandler {
|
||||
worldName = mc.getIntegratedServer().getWorldName();
|
||||
} else if (Minecraft.getMinecraft().getCurrentServerData() != null) {
|
||||
worldName = Minecraft.getMinecraft().getCurrentServerData().serverIP;
|
||||
//#if MC>=11100
|
||||
} else if (Minecraft.getMinecraft().isConnectedToRealms()) {
|
||||
// we can't access the server name without tapping too deep in the Realms Library
|
||||
worldName = "A Realms Server";
|
||||
//#endif
|
||||
} else {
|
||||
logger.info("Recording not started as the world is neither local nor remote (probably a replay).");
|
||||
return;
|
||||
|
||||
@@ -8,11 +8,17 @@ import de.johni0702.minecraft.gui.container.VanillaGuiScreen;
|
||||
import de.johni0702.minecraft.gui.element.GuiCheckbox;
|
||||
import de.johni0702.minecraft.gui.layout.CustomLayout;
|
||||
import net.minecraft.client.gui.GuiMultiplayer;
|
||||
//#if MC>=10904
|
||||
import net.minecraft.client.gui.GuiWorldSelection;
|
||||
//#else
|
||||
//$$ import net.minecraft.client.gui.GuiSelectWorld;
|
||||
//#endif
|
||||
import net.minecraftforge.client.event.GuiScreenEvent;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
|
||||
import static com.replaymod.core.versions.MCVer.getGui;
|
||||
|
||||
public class GuiHandler {
|
||||
|
||||
private final ReplayMod mod;
|
||||
@@ -27,9 +33,14 @@ public class GuiHandler {
|
||||
|
||||
@SubscribeEvent
|
||||
public void onGuiInit(GuiScreenEvent.InitGuiEvent.Post event) {
|
||||
//#if MC>=10904
|
||||
if (event.getGui() instanceof GuiWorldSelection || event.getGui() instanceof GuiMultiplayer) {
|
||||
SettingsRegistry settingsRegistry = mod.getSettingsRegistry();
|
||||
boolean sp = event.getGui() instanceof GuiWorldSelection;
|
||||
//#else
|
||||
//$$ if (event.gui instanceof GuiSelectWorld || event.gui instanceof GuiMultiplayer) {
|
||||
//$$ boolean sp = event.gui instanceof GuiSelectWorld;
|
||||
//#endif
|
||||
SettingsRegistry settingsRegistry = mod.getSettingsRegistry();
|
||||
Setting<Boolean> setting = sp ? Setting.RECORD_SINGLEPLAYER : Setting.RECORD_SERVER;
|
||||
|
||||
GuiCheckbox recordingCheckbox = new GuiCheckbox()
|
||||
@@ -40,7 +51,7 @@ public class GuiHandler {
|
||||
settingsRegistry.save();
|
||||
});
|
||||
|
||||
VanillaGuiScreen.setup(event.getGui()).setLayout(new CustomLayout<GuiScreen>() {
|
||||
VanillaGuiScreen.setup(getGui(event)).setLayout(new CustomLayout<GuiScreen>() {
|
||||
@Override
|
||||
protected void layout(GuiScreen container, int width, int height) {
|
||||
//size(recordingCheckbox, 200, 20);
|
||||
|
||||
@@ -2,18 +2,11 @@ package com.replaymod.recording.handler;
|
||||
|
||||
import com.replaymod.recording.packet.PacketListener;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.entity.EntityLiving;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.inventory.EntityEquipmentSlot;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.network.Packet;
|
||||
import net.minecraft.network.datasync.EntityDataManager;
|
||||
import net.minecraft.network.play.server.*;
|
||||
import net.minecraft.server.integrated.IntegratedServer;
|
||||
import net.minecraft.util.EnumHand;
|
||||
import net.minecraft.util.SoundCategory;
|
||||
import net.minecraft.util.SoundEvent;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.event.entity.minecart.MinecartInteractEvent;
|
||||
import net.minecraftforge.event.entity.player.PlayerSleepInBedEvent;
|
||||
@@ -22,8 +15,22 @@ import net.minecraftforge.fml.common.gameevent.PlayerEvent.ItemPickupEvent;
|
||||
import net.minecraftforge.fml.common.gameevent.TickEvent;
|
||||
import net.minecraftforge.fml.common.gameevent.TickEvent.PlayerTickEvent;
|
||||
|
||||
//#if MC>=10904
|
||||
import net.minecraft.entity.EntityLiving;
|
||||
import net.minecraft.inventory.EntityEquipmentSlot;
|
||||
import net.minecraft.network.datasync.EntityDataManager;
|
||||
import net.minecraft.util.EnumHand;
|
||||
import net.minecraft.util.SoundCategory;
|
||||
import net.minecraft.util.SoundEvent;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
//#else
|
||||
//$$ import net.minecraft.util.BlockPos;
|
||||
//#endif
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
import static com.replaymod.core.versions.MCVer.*;
|
||||
|
||||
public class RecordingEventHandler {
|
||||
|
||||
private final Minecraft mc = Minecraft.getMinecraft();
|
||||
@@ -35,20 +42,24 @@ public class RecordingEventHandler {
|
||||
private boolean wasSleeping;
|
||||
private int lastRiding = -1;
|
||||
private Integer rotationYawHeadBefore;
|
||||
//#if MC>=10904
|
||||
private boolean wasHandActive;
|
||||
private EnumHand lastActiveHand;
|
||||
//#endif
|
||||
|
||||
public RecordingEventHandler(PacketListener packetListener) {
|
||||
this.packetListener = packetListener;
|
||||
}
|
||||
|
||||
public void register() {
|
||||
MinecraftForge.EVENT_BUS.register(this);
|
||||
FML_BUS.register(this);
|
||||
FORGE_BUS.register(this);
|
||||
((RecordingEventSender) mc.renderGlobal).setRecordingEventHandler(this);
|
||||
}
|
||||
|
||||
public void unregister() {
|
||||
MinecraftForge.EVENT_BUS.unregister(this);
|
||||
FML_BUS.unregister(this);
|
||||
FORGE_BUS.unregister(this);
|
||||
RecordingEventSender recordingEventSender = ((RecordingEventSender) mc.renderGlobal);
|
||||
if (recordingEventSender.getRecordingEventHandler() == this) {
|
||||
recordingEventSender.setRecordingEventHandler(null);
|
||||
@@ -57,7 +68,11 @@ public class RecordingEventHandler {
|
||||
|
||||
public void onPlayerJoin() {
|
||||
try {
|
||||
packetListener.save(new SPacketSpawnPlayer(mc.player));
|
||||
//#if MC>=10904
|
||||
packetListener.save(new SPacketSpawnPlayer(player(mc)));
|
||||
//#else
|
||||
//$$ packetListener.save(new S0CPacketSpawnPlayer(player(mc)));
|
||||
//#endif
|
||||
} catch(Exception e1) {
|
||||
e1.printStackTrace();
|
||||
}
|
||||
@@ -65,12 +80,17 @@ public class RecordingEventHandler {
|
||||
|
||||
public void onPlayerRespawn() {
|
||||
try {
|
||||
packetListener.save(new SPacketSpawnPlayer(mc.player));
|
||||
//#if MC>=10904
|
||||
packetListener.save(new SPacketSpawnPlayer(player(mc)));
|
||||
//#else
|
||||
//$$ packetListener.save(new S0CPacketSpawnPlayer(player(mc)));
|
||||
//#endif
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
//#if MC>=10904
|
||||
public void onClientSound(SoundEvent sound, SoundCategory category,
|
||||
double x, double y, double z, float volume, float pitch) {
|
||||
try {
|
||||
@@ -89,11 +109,12 @@ public class RecordingEventHandler {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
//#endif
|
||||
|
||||
@SubscribeEvent
|
||||
public void onPlayerTick(PlayerTickEvent e) {
|
||||
try {
|
||||
if(e.player != mc.player) return;
|
||||
if(e.player != player(mc)) return;
|
||||
|
||||
boolean force = false;
|
||||
if(lastX == null || lastY == null || lastZ == null) {
|
||||
@@ -119,14 +140,24 @@ public class RecordingEventHandler {
|
||||
|
||||
Packet packet;
|
||||
if (force || Math.abs(dx) > 8.0 || Math.abs(dy) > 8.0 || Math.abs(dz) > 8.0) {
|
||||
//#if MC>=10904
|
||||
packet = new SPacketEntityTeleport(e.player);
|
||||
//#else
|
||||
//$$ packet = new S18PacketEntityTeleport(e.player);
|
||||
//#endif
|
||||
} else {
|
||||
byte newYaw = (byte) ((int) (e.player.rotationYaw * 256.0F / 360.0F));
|
||||
byte newPitch = (byte) ((int) (e.player.rotationPitch * 256.0F / 360.0F));
|
||||
|
||||
//#if MC>=10904
|
||||
packet = new SPacketEntity.S17PacketEntityLookMove(e.player.getEntityId(),
|
||||
(short) Math.round(dx * 4096), (short) Math.round(dy * 4096), (short) Math.round(dz * 4096),
|
||||
newYaw, newPitch, e.player.onGround);
|
||||
//#else
|
||||
//$$ packet = new S14PacketEntity.S17PacketEntityLookMove(e.player.getEntityId(),
|
||||
//$$ (byte) Math.round(dx * 32), (byte) Math.round(dy * 32), (byte) Math.round(dz * 32),
|
||||
//$$ newYaw, newPitch, e.player.onGround);
|
||||
//#endif
|
||||
}
|
||||
|
||||
packetListener.save(packet);
|
||||
@@ -135,16 +166,28 @@ public class RecordingEventHandler {
|
||||
int rotationYawHead = ((int)(e.player.rotationYawHead * 256.0F / 360.0F));
|
||||
|
||||
if(!Objects.equals(rotationYawHead, rotationYawHeadBefore)) {
|
||||
//#if MC>=10904
|
||||
packetListener.save(new SPacketEntityHeadLook(e.player, (byte) rotationYawHead));
|
||||
//#else
|
||||
//$$ packetListener.save(new S19PacketEntityHeadLook(e.player, (byte) rotationYawHead));
|
||||
//#endif
|
||||
rotationYawHeadBefore = rotationYawHead;
|
||||
}
|
||||
|
||||
//#if MC>=10904
|
||||
packetListener.save(new SPacketEntityVelocity(e.player.getEntityId(), e.player.motionX, e.player.motionY, e.player.motionZ));
|
||||
//#else
|
||||
//$$ packetListener.save(new S12PacketEntityVelocity(e.player.getEntityId(), e.player.motionX, e.player.motionY, e.player.motionZ));
|
||||
//#endif
|
||||
|
||||
//Animation Packets
|
||||
//Swing Animation
|
||||
if (e.player.isSwingInProgress && e.player.swingProgressInt == -1) {
|
||||
//#if MC>=10904
|
||||
packetListener.save(new SPacketAnimation(e.player, e.player.swingingHand == EnumHand.MAIN_HAND ? 0 : 3));
|
||||
//#else
|
||||
//$$ packetListener.save(new S0BPacketAnimation(e.player, 0));
|
||||
//#endif
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -168,63 +211,105 @@ public class RecordingEventHandler {
|
||||
*/
|
||||
|
||||
//Inventory Handling
|
||||
if (playerItems[0] != mc.player.getHeldItem(EnumHand.MAIN_HAND)) {
|
||||
playerItems[0] = mc.player.getHeldItem(EnumHand.MAIN_HAND);
|
||||
//#if MC>=10904
|
||||
if (playerItems[0] != player(mc).getHeldItem(EnumHand.MAIN_HAND)) {
|
||||
playerItems[0] = player(mc).getHeldItem(EnumHand.MAIN_HAND);
|
||||
packetListener.save(new SPacketEntityEquipment(e.player.getEntityId(), EntityEquipmentSlot.MAINHAND, playerItems[0]));
|
||||
}
|
||||
|
||||
if (playerItems[1] != mc.player.getHeldItem(EnumHand.OFF_HAND)) {
|
||||
playerItems[1] = mc.player.getHeldItem(EnumHand.OFF_HAND);
|
||||
if (playerItems[1] != player(mc).getHeldItem(EnumHand.OFF_HAND)) {
|
||||
playerItems[1] = player(mc).getHeldItem(EnumHand.OFF_HAND);
|
||||
packetListener.save(new SPacketEntityEquipment(e.player.getEntityId(), EntityEquipmentSlot.OFFHAND, playerItems[1]));
|
||||
}
|
||||
|
||||
if (playerItems[2] != mc.player.getItemStackFromSlot(EntityEquipmentSlot.FEET)) {
|
||||
playerItems[2] = mc.player.getItemStackFromSlot(EntityEquipmentSlot.FEET);
|
||||
if (playerItems[2] != player(mc).getItemStackFromSlot(EntityEquipmentSlot.FEET)) {
|
||||
playerItems[2] = player(mc).getItemStackFromSlot(EntityEquipmentSlot.FEET);
|
||||
packetListener.save(new SPacketEntityEquipment(e.player.getEntityId(), EntityEquipmentSlot.FEET, playerItems[2]));
|
||||
}
|
||||
|
||||
if (playerItems[3] != mc.player.getItemStackFromSlot(EntityEquipmentSlot.LEGS)) {
|
||||
playerItems[3] = mc.player.getItemStackFromSlot(EntityEquipmentSlot.LEGS);
|
||||
if (playerItems[3] != player(mc).getItemStackFromSlot(EntityEquipmentSlot.LEGS)) {
|
||||
playerItems[3] = player(mc).getItemStackFromSlot(EntityEquipmentSlot.LEGS);
|
||||
packetListener.save(new SPacketEntityEquipment(e.player.getEntityId(), EntityEquipmentSlot.LEGS, playerItems[3]));
|
||||
}
|
||||
|
||||
if (playerItems[4] != mc.player.getItemStackFromSlot(EntityEquipmentSlot.CHEST)) {
|
||||
playerItems[4] = mc.player.getItemStackFromSlot(EntityEquipmentSlot.CHEST);
|
||||
if (playerItems[4] != player(mc).getItemStackFromSlot(EntityEquipmentSlot.CHEST)) {
|
||||
playerItems[4] = player(mc).getItemStackFromSlot(EntityEquipmentSlot.CHEST);
|
||||
packetListener.save(new SPacketEntityEquipment(e.player.getEntityId(), EntityEquipmentSlot.CHEST, playerItems[4]));
|
||||
}
|
||||
|
||||
if (playerItems[5] != mc.player.getItemStackFromSlot(EntityEquipmentSlot.HEAD)) {
|
||||
playerItems[5] = mc.player.getItemStackFromSlot(EntityEquipmentSlot.HEAD);
|
||||
if (playerItems[5] != player(mc).getItemStackFromSlot(EntityEquipmentSlot.HEAD)) {
|
||||
playerItems[5] = player(mc).getItemStackFromSlot(EntityEquipmentSlot.HEAD);
|
||||
packetListener.save(new SPacketEntityEquipment(e.player.getEntityId(), EntityEquipmentSlot.HEAD, playerItems[5]));
|
||||
}
|
||||
//#else
|
||||
//$$ if(playerItems[0] != mc.thePlayer.getHeldItem()) {
|
||||
//$$ playerItems[0] = mc.thePlayer.getHeldItem();
|
||||
//$$ S04PacketEntityEquipment pee = new S04PacketEntityEquipment(e.player.getEntityId(), 0, playerItems[0]);
|
||||
//$$ packetListener.save(pee);
|
||||
//$$ }
|
||||
//$$
|
||||
//$$ if(playerItems[1] != mc.thePlayer.inventory.armorInventory[0]) {
|
||||
//$$ playerItems[1] = mc.thePlayer.inventory.armorInventory[0];
|
||||
//$$ S04PacketEntityEquipment pee = new S04PacketEntityEquipment(e.player.getEntityId(), 1, playerItems[1]);
|
||||
//$$ packetListener.save(pee);
|
||||
//$$ }
|
||||
//$$
|
||||
//$$ if(playerItems[2] != mc.thePlayer.inventory.armorInventory[1]) {
|
||||
//$$ playerItems[2] = mc.thePlayer.inventory.armorInventory[1];
|
||||
//$$ S04PacketEntityEquipment pee = new S04PacketEntityEquipment(e.player.getEntityId(), 2, playerItems[2]);
|
||||
//$$ packetListener.save(pee);
|
||||
//$$ }
|
||||
//$$
|
||||
//$$ if(playerItems[3] != mc.thePlayer.inventory.armorInventory[2]) {
|
||||
//$$ playerItems[3] = mc.thePlayer.inventory.armorInventory[2];
|
||||
//$$ S04PacketEntityEquipment pee = new S04PacketEntityEquipment(e.player.getEntityId(), 3, playerItems[3]);
|
||||
//$$ packetListener.save(pee);
|
||||
//$$ }
|
||||
//$$
|
||||
//$$ if(playerItems[4] != mc.thePlayer.inventory.armorInventory[3]) {
|
||||
//$$ playerItems[4] = mc.thePlayer.inventory.armorInventory[3];
|
||||
//$$ S04PacketEntityEquipment pee = new S04PacketEntityEquipment(e.player.getEntityId(), 4, playerItems[4]);
|
||||
//$$ packetListener.save(pee);
|
||||
//$$ }
|
||||
//#endif
|
||||
|
||||
//Leaving Ride
|
||||
|
||||
if((!mc.player.isRiding() && lastRiding != -1) ||
|
||||
(mc.player.isRiding() && lastRiding != mc.player.getRidingEntity().getEntityId())) {
|
||||
if(!mc.player.isRiding()) {
|
||||
if((!player(mc).isRiding() && lastRiding != -1) ||
|
||||
(player(mc).isRiding() && lastRiding != getRidingEntity(player(mc)).getEntityId())) {
|
||||
if(!player(mc).isRiding()) {
|
||||
lastRiding = -1;
|
||||
} else {
|
||||
lastRiding = mc.player.getRidingEntity().getEntityId();
|
||||
lastRiding = getRidingEntity(player(mc)).getEntityId();
|
||||
}
|
||||
packetListener.save(new SPacketEntityAttach(e.player, e.player.getRidingEntity()));
|
||||
//#if MC>=10904
|
||||
packetListener.save(new SPacketEntityAttach(e.player, getRidingEntity(e.player)));
|
||||
//#else
|
||||
//$$ packetListener.save(new S1BPacketEntityAttach(0, e.player, getRidingEntity(e.player)));
|
||||
//#endif
|
||||
}
|
||||
|
||||
//Sleeping
|
||||
if(!mc.player.isPlayerSleeping() && wasSleeping) {
|
||||
if(!player(mc).isPlayerSleeping() && wasSleeping) {
|
||||
//#if MC>=10904
|
||||
packetListener.save(new SPacketAnimation(e.player, 2));
|
||||
//#else
|
||||
//$$ packetListener.save(new S0BPacketAnimation(e.player, 2));
|
||||
//#endif
|
||||
wasSleeping = false;
|
||||
}
|
||||
|
||||
//#if MC>=10904
|
||||
// Active hand (e.g. eating, drinking, blocking)
|
||||
if (mc.player.isHandActive() ^ wasHandActive || mc.player.getActiveHand() != lastActiveHand) {
|
||||
wasHandActive = mc.player.isHandActive();
|
||||
lastActiveHand = mc.player.getActiveHand();
|
||||
if (player(mc).isHandActive() ^ wasHandActive || player(mc).getActiveHand() != lastActiveHand) {
|
||||
wasHandActive = player(mc).isHandActive();
|
||||
lastActiveHand = player(mc).getActiveHand();
|
||||
EntityDataManager dataManager = new EntityDataManager(null);
|
||||
int state = (wasHandActive ? 1 : 0) | (lastActiveHand == EnumHand.OFF_HAND ? 2 : 0);
|
||||
dataManager.register(EntityLiving.HAND_STATES, (byte) state);
|
||||
packetListener.save(new SPacketEntityMetadata(mc.player.getEntityId(), dataManager, true));
|
||||
packetListener.save(new SPacketEntityMetadata(player(mc).getEntityId(), dataManager, true));
|
||||
}
|
||||
//#endif
|
||||
|
||||
} catch(Exception e1) {
|
||||
e1.printStackTrace();
|
||||
@@ -234,8 +319,21 @@ public class RecordingEventHandler {
|
||||
@SubscribeEvent
|
||||
public void onPickupItem(ItemPickupEvent event) {
|
||||
try {
|
||||
//#if MC>=11100
|
||||
//#if MC>=11200
|
||||
packetListener.save(new SPacketCollectItem(event.pickedUp.getEntityId(), event.player.getEntityId(),
|
||||
event.pickedUp.getItem().getMaxStackSize()));
|
||||
//#else
|
||||
//$$ packetListener.save(new SPacketCollectItem(event.pickedUp.getEntityId(), event.player.getEntityId(),
|
||||
//$$ event.pickedUp.getEntityItem().getMaxStackSize()));
|
||||
//#endif
|
||||
//#else
|
||||
//#if MC>=10904
|
||||
//$$ packetListener.save(new SPacketCollectItem(event.pickedUp.getEntityId(), event.player.getEntityId()));
|
||||
//#else
|
||||
//$$ packetListener.save(new S0DPacketCollectItem(event.pickedUp.getEntityId(), event.player.getEntityId()));
|
||||
//#endif
|
||||
//#endif
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
@@ -244,11 +342,19 @@ public class RecordingEventHandler {
|
||||
@SubscribeEvent
|
||||
public void onSleep(PlayerSleepInBedEvent event) {
|
||||
try {
|
||||
if (event.getEntityPlayer() != mc.player) {
|
||||
//#if MC>=10904
|
||||
if (event.getEntityPlayer() != player(mc)) {
|
||||
return;
|
||||
}
|
||||
|
||||
packetListener.save(new SPacketUseBed(event.getEntityPlayer(), event.getPos()));
|
||||
//#else
|
||||
//$$ if (event.entityPlayer != player(mc)) {
|
||||
//$$ return;
|
||||
//$$ }
|
||||
//$$
|
||||
//$$ packetListener.save(new S0APacketUseBed(event.entityPlayer, event.pos));
|
||||
//#endif
|
||||
|
||||
wasSleeping = true;
|
||||
|
||||
@@ -260,22 +366,36 @@ public class RecordingEventHandler {
|
||||
@SubscribeEvent
|
||||
public void enterMinecart(MinecartInteractEvent event) {
|
||||
try {
|
||||
if(event.getEntity() != mc.player) {
|
||||
//#if MC>=10904
|
||||
if(event.getEntity() != player(mc)) {
|
||||
return;
|
||||
}
|
||||
|
||||
packetListener.save(new SPacketEntityAttach(event.getPlayer(), event.getMinecart()));
|
||||
|
||||
lastRiding = event.getMinecart().getEntityId();
|
||||
//#else
|
||||
//$$ if(event.entity != player(mc)) {
|
||||
//$$ return;
|
||||
//$$ }
|
||||
//$$
|
||||
//$$ packetListener.save(new S1BPacketEntityAttach(0, event.player, event.minecart));
|
||||
//$$
|
||||
//$$ lastRiding = event.minecart.getEntityId();
|
||||
//#endif
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void onBlockBreakAnim(int breakerId, BlockPos pos, int progress) {
|
||||
EntityPlayer thePlayer = mc.player;
|
||||
EntityPlayer thePlayer = player(mc);
|
||||
if (thePlayer != null && breakerId == thePlayer.getEntityId()) {
|
||||
//#if MC>=10904
|
||||
packetListener.save(new SPacketBlockBreakAnim(breakerId, pos, progress));
|
||||
//#else
|
||||
//$$ packetListener.save(new S25PacketBlockBreakAnim(breakerId, pos, progress));
|
||||
//#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -25,8 +25,10 @@ public abstract class MixinNetHandlerLoginClient {
|
||||
ReplayModRecording.instance.initiateRecording(networkManager);
|
||||
}
|
||||
|
||||
//#if MC>=11200
|
||||
@Inject(method = "handleLoginSuccess", at=@At("RETURN"))
|
||||
public void replayModRecording_raceConditionWorkAround(CallbackInfo cb) {
|
||||
networkManager.channel().config().setAutoRead(true);
|
||||
}
|
||||
//#endif
|
||||
}
|
||||
|
||||
@@ -4,17 +4,28 @@ import com.replaymod.recording.handler.RecordingEventHandler;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.network.NetHandlerPlayClient;
|
||||
import net.minecraft.client.network.NetworkPlayerInfo;
|
||||
import net.minecraft.network.play.server.SPacketPlayerListItem;
|
||||
import net.minecraft.network.play.server.SPacketRespawn;
|
||||
import net.minecraft.network.play.server.*;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
//#if MC>=10904
|
||||
import net.minecraft.network.play.server.SPacketPlayerListItem.Action;
|
||||
import net.minecraft.network.play.server.SPacketPlayerListItem.AddPlayerData;
|
||||
//#else
|
||||
//$$ import net.minecraft.network.play.server.S38PacketPlayerListItem.Action;
|
||||
//$$ import net.minecraft.network.play.server.S38PacketPlayerListItem.AddPlayerData;
|
||||
//#endif
|
||||
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
import static com.replaymod.core.versions.MCVer.*;
|
||||
|
||||
@Mixin(NetHandlerPlayClient.class)
|
||||
public abstract class MixinNetHandlerPlayClient {
|
||||
|
||||
@@ -36,31 +47,59 @@ public abstract class MixinNetHandlerPlayClient {
|
||||
* @param ci Callback info
|
||||
*/
|
||||
@Inject(method = "handlePlayerListItem", at=@At("HEAD"))
|
||||
//#if MC>=10809
|
||||
//#if MC>=10904
|
||||
public void recordOwnJoin(SPacketPlayerListItem packet, CallbackInfo ci) {
|
||||
if (gameController.player == null) return;
|
||||
//#else
|
||||
//$$ public void recordOwnJoin(S38PacketPlayerListItem packet, CallbackInfo ci) {
|
||||
//#endif
|
||||
if (player(gameController) == null) return;
|
||||
|
||||
RecordingEventHandler handler = getRecordingEventHandler();
|
||||
if (handler != null && packet.getAction() == SPacketPlayerListItem.Action.ADD_PLAYER) {
|
||||
for (SPacketPlayerListItem.AddPlayerData data : packet.getEntries()) {
|
||||
if (handler != null && packet.getAction() == Action.ADD_PLAYER) {
|
||||
for (AddPlayerData data : packet.getEntries()) {
|
||||
if (data.getProfile() == null || data.getProfile().getId() == null) continue;
|
||||
// Only add spawn packet for our own player and only if he isn't known yet
|
||||
if (data.getProfile().getId().equals(Minecraft.getMinecraft().player.getGameProfile().getId())
|
||||
if (data.getProfile().getId().equals(player(gameController).getGameProfile().getId())
|
||||
&& !playerInfoMap.containsKey(data.getProfile().getId())) {
|
||||
handler.onPlayerJoin();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//#else
|
||||
//$$ public void recordOwnJoin(S38PacketPlayerListItem packet, CallbackInfo ci) {
|
||||
//$$ if (gameController.thePlayer == null) return;
|
||||
//$$
|
||||
//$$ RecordingEventHandler handler = getRecordingEventHandler();
|
||||
//$$ if (handler != null && packet.func_179768_b() == S38PacketPlayerListItem.Action.ADD_PLAYER) {
|
||||
//$$ @SuppressWarnings("unchecked")
|
||||
//$$ List<S38PacketPlayerListItem.AddPlayerData> dataList = packet.func_179767_a();
|
||||
//$$ for (S38PacketPlayerListItem.AddPlayerData data : dataList) {
|
||||
//$$ if (data.func_179962_a() == null || data.func_179962_a().getId() == null) continue;
|
||||
//$$ // Only add spawn packet for our own player and only if he isn't known yet
|
||||
//$$ if (data.func_179962_a().getId().equals(Minecraft.getMinecraft().thePlayer.getGameProfile().getId())
|
||||
//$$ && !playerInfoMap.containsKey(data.func_179962_a().getId())) {
|
||||
//$$ handler.onPlayerJoin();
|
||||
//$$ }
|
||||
//$$ }
|
||||
//$$ }
|
||||
//$$ }
|
||||
//#endif
|
||||
|
||||
/**
|
||||
* Record the own player entity respawning.
|
||||
* We cannot use the {@link net.minecraftforge.event.entity.EntityJoinWorldEvent} because that would also include
|
||||
* the first spawn which is already handled by {@link #recordOwnJoin(SPacketPlayerListItem, CallbackInfo)}.
|
||||
* the first spawn which is already handled by the above method.
|
||||
* @param packet The packet
|
||||
* @param ci Callback info
|
||||
*/
|
||||
@Inject(method = "handleRespawn", at=@At("RETURN"))
|
||||
//#if MC>=10904
|
||||
public void recordOwnRespawn(SPacketRespawn packet, CallbackInfo ci) {
|
||||
//#else
|
||||
//$$ public void recordOwnRespawn(S07PacketRespawn packet, CallbackInfo ci) {
|
||||
//#endif
|
||||
RecordingEventHandler handler = getRecordingEventHandler();
|
||||
if (handler != null) {
|
||||
handler.onPlayerRespawn();
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
package com.replaymod.recording.mixin;
|
||||
|
||||
import com.replaymod.recording.handler.FMLHandshakeFilter;
|
||||
import io.netty.channel.ChannelConfig;
|
||||
import io.netty.channel.ChannelPipeline;
|
||||
import io.netty.channel.embedded.EmbeddedChannel;
|
||||
import net.minecraft.network.EnumConnectionState;
|
||||
import net.minecraft.network.NetworkManager;
|
||||
import net.minecraftforge.fml.common.network.handshake.FMLHandshakeCodec;
|
||||
import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher;
|
||||
import net.minecraftforge.fml.relauncher.Side;
|
||||
@@ -13,9 +10,15 @@ import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
//#if MC>=11200
|
||||
import io.netty.channel.ChannelConfig;
|
||||
import net.minecraft.network.EnumConnectionState;
|
||||
import net.minecraft.network.NetworkManager;
|
||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||
//#endif
|
||||
|
||||
@Mixin(value = NetworkDispatcher.class, remap = false)
|
||||
public abstract class MixinNetworkDispatcher {
|
||||
|
||||
@@ -48,6 +51,7 @@ public abstract class MixinNetworkDispatcher {
|
||||
}
|
||||
}
|
||||
|
||||
//#if MC>=11200
|
||||
@Redirect(method = "clientListenForServerHandshake", at = @At(value = "INVOKE", remap = true, target =
|
||||
"Lnet/minecraft/network/NetworkManager;setConnectionState(Lnet/minecraft/network/EnumConnectionState;)V"))
|
||||
public void replayModRecording_raceConditionWorkAround1(NetworkManager self, EnumConnectionState ignored) { }
|
||||
@@ -60,4 +64,5 @@ public abstract class MixinNetworkDispatcher {
|
||||
}
|
||||
return self.setAutoRead(autoRead);
|
||||
}
|
||||
//#endif
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.replaymod.recording.mixin;
|
||||
|
||||
//#if MC>=10904
|
||||
import com.replaymod.recording.handler.RecordingEventHandler;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.multiplayer.PlayerControllerMP;
|
||||
@@ -10,6 +11,8 @@ import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||
|
||||
import static com.replaymod.core.versions.MCVer.*;
|
||||
|
||||
@Mixin(PlayerControllerMP.class)
|
||||
public abstract class MixinPlayerControllerMP implements RecordingEventHandler.RecordingEventSender {
|
||||
|
||||
@@ -23,6 +26,7 @@ public abstract class MixinPlayerControllerMP implements RecordingEventHandler.R
|
||||
@Redirect(method = "onPlayerDestroyBlock", at = @At(value = "INVOKE",
|
||||
target = "Lnet/minecraft/world/World;playEvent(ILnet/minecraft/util/math/BlockPos;I)V"))
|
||||
public void replayModRecording_playEvent_fixed(World world, int type, BlockPos pos, int data) {
|
||||
world.playEvent(mc.player, type, pos, data);
|
||||
world.playEvent(player(mc), type, pos, data);
|
||||
}
|
||||
}
|
||||
//#endif
|
||||
|
||||
@@ -2,12 +2,17 @@ package com.replaymod.recording.mixin;
|
||||
|
||||
import com.replaymod.recording.handler.RecordingEventHandler;
|
||||
import net.minecraft.client.renderer.RenderGlobal;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
//#if MC>=10904
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
//#else
|
||||
//$$ import net.minecraft.util.BlockPos;
|
||||
//#endif
|
||||
|
||||
@Mixin(RenderGlobal.class)
|
||||
public abstract class MixinRenderGlobal implements RecordingEventHandler.RecordingEventSender {
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.replaymod.recording.mixin;
|
||||
|
||||
//#if MC>=10904
|
||||
import com.replaymod.recording.handler.RecordingEventHandler;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.multiplayer.WorldClient;
|
||||
@@ -18,6 +19,8 @@ import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
import static com.replaymod.core.versions.MCVer.*;
|
||||
|
||||
@Mixin(WorldClient.class)
|
||||
public abstract class MixinWorldClient extends World implements RecordingEventHandler.RecordingEventSender {
|
||||
@Shadow
|
||||
@@ -39,7 +42,7 @@ public abstract class MixinWorldClient extends World implements RecordingEventHa
|
||||
at = @At("HEAD"))
|
||||
public void replayModRecording_recordClientSound(EntityPlayer player, double x, double y, double z, SoundEvent sound, SoundCategory category,
|
||||
float volume, float pitch, CallbackInfo ci) {
|
||||
if (player == mc.player) {
|
||||
if (player == player(mc)) {
|
||||
RecordingEventHandler handler = replayModRecording_getRecordingEventHandler();
|
||||
if (handler != null) {
|
||||
handler.onClientSound(sound, category, x, y, z, volume, pitch);
|
||||
@@ -51,7 +54,7 @@ public abstract class MixinWorldClient extends World implements RecordingEventHa
|
||||
// These are handled in the World class, so we override the method in WorldClient and add our special handling.
|
||||
@Override
|
||||
public void playEvent(EntityPlayer player, int type, BlockPos pos, int data) {
|
||||
if (player == mc.player) {
|
||||
if (player == player(mc)) {
|
||||
// We caused this event, the server won't send it to us
|
||||
RecordingEventHandler handler = replayModRecording_getRecordingEventHandler();
|
||||
if (handler != null) {
|
||||
@@ -61,3 +64,4 @@ public abstract class MixinWorldClient extends World implements RecordingEventHa
|
||||
super.playEvent(player, type, pos, data);
|
||||
}
|
||||
}
|
||||
//#endif
|
||||
|
||||
@@ -14,18 +14,21 @@ import net.minecraft.network.EnumConnectionState;
|
||||
import net.minecraft.network.EnumPacketDirection;
|
||||
import net.minecraft.network.Packet;
|
||||
import net.minecraft.network.PacketBuffer;
|
||||
import net.minecraft.network.datasync.EntityDataManager;
|
||||
import net.minecraft.network.play.server.SPacketCollectItem;
|
||||
import net.minecraft.network.play.server.SPacketCustomPayload;
|
||||
import net.minecraft.network.play.server.SPacketDisconnect;
|
||||
import net.minecraft.network.play.server.SPacketResourcePackSend;
|
||||
import net.minecraft.network.play.server.SPacketSpawnMob;
|
||||
import net.minecraft.network.play.server.SPacketSpawnPlayer;
|
||||
import net.minecraft.util.text.TextComponentString;
|
||||
import net.minecraft.network.play.server.*;
|
||||
import net.minecraftforge.fml.common.network.internal.FMLProxyPacket;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
//#if MC>=10904
|
||||
import net.minecraft.network.datasync.EntityDataManager;
|
||||
import net.minecraft.util.text.TextComponentString;
|
||||
//#else
|
||||
//$$ import net.minecraft.entity.DataWatcher;
|
||||
//$$ import net.minecraft.util.ChatComponentText;
|
||||
//$$
|
||||
//$$ import java.util.List;
|
||||
//#endif
|
||||
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
@@ -37,6 +40,8 @@ import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import static com.replaymod.core.versions.MCVer.*;
|
||||
|
||||
public class PacketListener extends ChannelInboundHandlerAdapter {
|
||||
|
||||
private static final Minecraft mc = Minecraft.getMinecraft();
|
||||
@@ -92,13 +97,27 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
|
||||
|
||||
public void save(Packet packet) {
|
||||
try {
|
||||
//#if MC>=10904
|
||||
if(packet instanceof SPacketSpawnPlayer) {
|
||||
UUID uuid = ((SPacketSpawnPlayer) packet).getUniqueId();
|
||||
//#else
|
||||
//$$ if(packet instanceof S0CPacketSpawnPlayer) {
|
||||
//#if MC>=10809
|
||||
//$$ UUID uuid = ((S0CPacketSpawnPlayer) packet).getPlayer();
|
||||
//#else
|
||||
//$$ UUID uuid = ((S0CPacketSpawnPlayer) packet).func_179819_c();
|
||||
//#endif
|
||||
//#endif
|
||||
Set<String> uuids = new HashSet<>(Arrays.asList(metaData.getPlayers()));
|
||||
uuids.add(uuid.toString());
|
||||
metaData.setPlayers(uuids.toArray(new String[uuids.size()]));
|
||||
saveMetaData();
|
||||
}
|
||||
//#if MC<10904
|
||||
//$$ if (packet instanceof S46PacketSetCompressionLevel) {
|
||||
//$$ return; // Replay data is never compressed on the packet level
|
||||
//$$ }
|
||||
//#endif
|
||||
|
||||
byte[] bytes = getPacketData(packet);
|
||||
long now = System.currentTimeMillis();
|
||||
@@ -159,16 +178,31 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
|
||||
try {
|
||||
Packet packet = (Packet) msg;
|
||||
|
||||
//#if MC>=10904
|
||||
if(packet instanceof SPacketCollectItem) {
|
||||
if(mc.player != null ||
|
||||
((SPacketCollectItem) packet).getEntityID() == mc.player.getEntityId()) {
|
||||
if(player(mc) != null ||
|
||||
((SPacketCollectItem) packet).getEntityID() == player(mc).getEntityId()) {
|
||||
//#else
|
||||
//$$ if(packet instanceof S0DPacketCollectItem) {
|
||||
//$$ if(player(mc) != null ||
|
||||
//#if MC>=10809
|
||||
//$$ ((S0DPacketCollectItem) packet).getEntityID() == player(mc).getEntityId()) {
|
||||
//#else
|
||||
//$$ ((S0DPacketCollectItem) packet).func_149353_d() == player(mc).getEntityId()) {
|
||||
//#endif
|
||||
//#endif
|
||||
super.channelRead(ctx, msg);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//#if MC>=10904
|
||||
if (packet instanceof SPacketResourcePackSend) {
|
||||
save(resourcePackRecorder.handleResourcePack((SPacketResourcePackSend) packet));
|
||||
//#else
|
||||
//$$ if (packet instanceof S48PacketResourcePackSend) {
|
||||
//$$ save(resourcePackRecorder.handleResourcePack((S48PacketResourcePackSend) packet));
|
||||
//#endif
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -181,10 +215,17 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
|
||||
|
||||
save(packet);
|
||||
|
||||
//#if MC>=10904
|
||||
if (packet instanceof SPacketCustomPayload) {
|
||||
SPacketCustomPayload p = (SPacketCustomPayload) packet;
|
||||
if (Restrictions.PLUGIN_CHANNEL.equals(p.getChannelName())) {
|
||||
packet = new SPacketDisconnect(new TextComponentString("Please update to view this replay."));
|
||||
//#else
|
||||
//$$ if (packet instanceof S3FPacketCustomPayload) {
|
||||
//$$ S3FPacketCustomPayload p = (S3FPacketCustomPayload) packet;
|
||||
//$$ if (Restrictions.PLUGIN_CHANNEL.equals(p.getChannelName())) {
|
||||
//$$ packet = new S40PacketDisconnect(new ChatComponentText("Please update to view this replay."));
|
||||
//#endif
|
||||
save(packet);
|
||||
}
|
||||
}
|
||||
@@ -197,12 +238,15 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
|
||||
super.channelRead(ctx, msg);
|
||||
}
|
||||
|
||||
//#if MC>=10904
|
||||
private <T> void DataManager_set(EntityDataManager dataManager, EntityDataManager.DataEntry<T> entry) {
|
||||
dataManager.register(entry.getKey(), entry.getValue());
|
||||
}
|
||||
//#endif
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private byte[] getPacketData(Packet packet) throws Exception {
|
||||
//#if MC>=10904
|
||||
if (packet instanceof SPacketSpawnMob) {
|
||||
SPacketSpawnMob p = (SPacketSpawnMob) packet;
|
||||
if (p.dataManager == null) {
|
||||
@@ -226,6 +270,39 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
|
||||
}
|
||||
}
|
||||
}
|
||||
//#else
|
||||
//$$ if(packet instanceof S0FPacketSpawnMob) {
|
||||
//$$ S0FPacketSpawnMob p = (S0FPacketSpawnMob) packet;
|
||||
//$$ if (p.field_149043_l == null) {
|
||||
//$$ p.field_149043_l = new DataWatcher(null);
|
||||
//$$ if(p.func_149027_c() != null) {
|
||||
//$$ for(DataWatcher.WatchableObject wo : (List<DataWatcher.WatchableObject>) p.func_149027_c()) {
|
||||
//$$ p.field_149043_l.addObject(wo.getDataValueId(), wo.getObject());
|
||||
//$$ }
|
||||
//$$ }
|
||||
//$$ }
|
||||
//$$ }
|
||||
//$$
|
||||
//$$ if(packet instanceof S0CPacketSpawnPlayer) {
|
||||
//$$ S0CPacketSpawnPlayer p = (S0CPacketSpawnPlayer) packet;
|
||||
//#if MC>=10809
|
||||
//$$ if (p.watcher == null) {
|
||||
//$$ p.watcher = new DataWatcher(null);
|
||||
//$$ if(p.func_148944_c() != null) {
|
||||
//$$ for(DataWatcher.WatchableObject wo : p.func_148944_c()) {
|
||||
//$$ p.watcher.addObject(wo.getDataValueId(), wo.getObject());
|
||||
//#else
|
||||
//$$ if (p.field_148960_i == null) {
|
||||
//$$ p.field_148960_i = new DataWatcher(null);
|
||||
//$$ if(p.func_148944_c() != null) {
|
||||
//$$ for(DataWatcher.WatchableObject wo : (List<DataWatcher.WatchableObject>) p.func_148944_c()) {
|
||||
//$$ p.field_148960_i.addObject(wo.getDataValueId(), wo.getObject());
|
||||
//#endif
|
||||
//$$ }
|
||||
//$$ }
|
||||
//$$ }
|
||||
//$$ }
|
||||
//#endif
|
||||
|
||||
Integer packetId = EnumConnectionState.PLAY.getPacketId(EnumPacketDirection.CLIENTBOUND, packet);
|
||||
if (packetId == null) {
|
||||
@@ -233,7 +310,7 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
|
||||
}
|
||||
ByteBuf byteBuf = Unpooled.buffer();
|
||||
PacketBuffer packetBuffer = new PacketBuffer(byteBuf);
|
||||
packetBuffer.writeVarInt(packetId);
|
||||
writeVarInt(packetBuffer, packetId);
|
||||
packet.writePacketData(packetBuffer);
|
||||
|
||||
byteBuf.readerIndex(0);
|
||||
|
||||
@@ -9,19 +9,27 @@ import com.replaymod.replaystudio.replay.ReplayFile;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.GuiScreenWorking;
|
||||
import net.minecraft.client.gui.GuiYesNo;
|
||||
import net.minecraft.client.gui.GuiYesNoCallback;
|
||||
import net.minecraft.client.multiplayer.ServerData;
|
||||
import net.minecraft.client.multiplayer.ServerList;
|
||||
import net.minecraft.client.network.NetHandlerPlayClient;
|
||||
import net.minecraft.client.resources.I18n;
|
||||
import net.minecraft.client.resources.ResourcePackRepository;
|
||||
import net.minecraft.network.NetworkManager;
|
||||
import net.minecraft.network.play.client.CPacketResourcePackStatus;
|
||||
import net.minecraft.network.play.server.SPacketResourcePackSend;
|
||||
import net.minecraft.util.HttpUtil;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
//#if MC>=10904
|
||||
import net.minecraft.network.play.client.CPacketResourcePackStatus;
|
||||
import net.minecraft.network.play.client.CPacketResourcePackStatus.Action;
|
||||
import net.minecraft.network.play.server.SPacketResourcePackSend;
|
||||
//#else
|
||||
//$$ import net.minecraft.network.play.client.C19PacketResourcePackStatus;
|
||||
//$$ import net.minecraft.network.play.client.C19PacketResourcePackStatus.Action;
|
||||
//$$ import net.minecraft.network.play.server.S48PacketResourcePackSend;
|
||||
//#endif
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
@@ -29,6 +37,8 @@ import java.io.OutputStream;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import static com.replaymod.core.versions.MCVer.*;
|
||||
|
||||
/**
|
||||
* Records resource packs and handles incoming resource pack packets during recording.
|
||||
*/
|
||||
@@ -74,12 +84,36 @@ public class ResourcePackRecorder {
|
||||
}
|
||||
}
|
||||
|
||||
//#if MC>=10904
|
||||
public CPacketResourcePackStatus makeStatusPacket(String hash, Action action) {
|
||||
//#if MC>=11002
|
||||
return new CPacketResourcePackStatus(action);
|
||||
//#else
|
||||
//$$ return new CPacketResourcePackStatus(hash, action);
|
||||
//#endif
|
||||
}
|
||||
//#else
|
||||
//$$ public C19PacketResourcePackStatus makeStatusPacket(String hash, Action action) {
|
||||
//$$ return new C19PacketResourcePackStatus(hash, action);
|
||||
//$$ }
|
||||
//#endif
|
||||
|
||||
|
||||
//#if MC>=10904
|
||||
public synchronized SPacketResourcePackSend handleResourcePack(SPacketResourcePackSend packet) {
|
||||
//#else
|
||||
//$$ public synchronized S48PacketResourcePackSend handleResourcePack(S48PacketResourcePackSend packet) {
|
||||
//#endif
|
||||
final int requestId = nextRequestId++;
|
||||
final NetHandlerPlayClient netHandler = mc.getConnection();
|
||||
final NetHandlerPlayClient netHandler = getConnection(mc);
|
||||
final NetworkManager netManager = netHandler.getNetworkManager();
|
||||
//#if MC>=10809
|
||||
final String url = packet.getURL();
|
||||
final String hash = packet.getHash();
|
||||
//#else
|
||||
//$$ final String url = packet.func_179783_a();
|
||||
//$$ final String hash = packet.func_179784_b();
|
||||
//#endif
|
||||
|
||||
if (url.startsWith("level://")) {
|
||||
String levelName = url.substring("level://".length());
|
||||
@@ -87,60 +121,69 @@ public class ResourcePackRecorder {
|
||||
final File levelDir = new File(savesDir, levelName);
|
||||
|
||||
if (levelDir.isFile()) {
|
||||
netManager.sendPacket(new CPacketResourcePackStatus(CPacketResourcePackStatus.Action.ACCEPTED));
|
||||
Futures.addCallback(mc.getResourcePackRepository().setServerResourcePack(levelDir), new FutureCallback<Object>() {
|
||||
netManager.sendPacket(makeStatusPacket(hash, Action.ACCEPTED));
|
||||
Futures.addCallback(setServerResourcePack(mc.getResourcePackRepository(), levelDir), new FutureCallback<Object>() {
|
||||
@Override
|
||||
public void onSuccess(Object result) {
|
||||
recordResourcePack(levelDir, requestId);
|
||||
netManager.sendPacket(new CPacketResourcePackStatus(CPacketResourcePackStatus.Action.SUCCESSFULLY_LOADED));
|
||||
netManager.sendPacket(makeStatusPacket(hash, Action.SUCCESSFULLY_LOADED));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(@Nonnull Throwable throwable) {
|
||||
netManager.sendPacket(new CPacketResourcePackStatus(CPacketResourcePackStatus.Action.FAILED_DOWNLOAD));
|
||||
netManager.sendPacket(makeStatusPacket(hash, Action.FAILED_DOWNLOAD));
|
||||
}
|
||||
});
|
||||
} else {
|
||||
netManager.sendPacket(new CPacketResourcePackStatus(CPacketResourcePackStatus.Action.FAILED_DOWNLOAD));
|
||||
netManager.sendPacket(makeStatusPacket(hash, Action.FAILED_DOWNLOAD));
|
||||
}
|
||||
} else {
|
||||
final ServerData serverData = mc.getCurrentServerData();
|
||||
if (serverData != null && serverData.getResourceMode() == ServerData.ServerResourceMode.ENABLED) {
|
||||
netManager.sendPacket(new CPacketResourcePackStatus(CPacketResourcePackStatus.Action.ACCEPTED));
|
||||
netManager.sendPacket(makeStatusPacket(hash, Action.ACCEPTED));
|
||||
downloadResourcePackFuture(requestId, url, hash);
|
||||
} else if (serverData != null && serverData.getResourceMode() != ServerData.ServerResourceMode.PROMPT) {
|
||||
netManager.sendPacket(new CPacketResourcePackStatus(CPacketResourcePackStatus.Action.DECLINED));
|
||||
netManager.sendPacket(makeStatusPacket(hash, Action.DECLINED));
|
||||
} else {
|
||||
mc.addScheduledTask(() -> mc.displayGuiScreen(new GuiYesNo((result, id) -> {
|
||||
if (serverData != null) {
|
||||
serverData.setResourceMode(result ? ServerData.ServerResourceMode.ENABLED : ServerData.ServerResourceMode.DISABLED);
|
||||
}
|
||||
if (result) {
|
||||
netManager.sendPacket(new CPacketResourcePackStatus(CPacketResourcePackStatus.Action.ACCEPTED));
|
||||
downloadResourcePackFuture(requestId, url, hash);
|
||||
} else {
|
||||
netManager.sendPacket(new CPacketResourcePackStatus(CPacketResourcePackStatus.Action.DECLINED));
|
||||
}
|
||||
// Lambdas MUST NOT be used with methods that need re-obfuscation in FG prior to 2.2 (will result in AbstractMethodError)
|
||||
//noinspection Convert2Lambda
|
||||
mc.addScheduledTask(() -> mc.displayGuiScreen(new GuiYesNo(new GuiYesNoCallback() {
|
||||
@Override
|
||||
public void confirmClicked(boolean result, int id) {
|
||||
if (serverData != null) {
|
||||
serverData.setResourceMode(result ? ServerData.ServerResourceMode.ENABLED : ServerData.ServerResourceMode.DISABLED);
|
||||
}
|
||||
if (result) {
|
||||
netManager.sendPacket(makeStatusPacket(hash, Action.ACCEPTED));
|
||||
downloadResourcePackFuture(requestId, url, hash);
|
||||
} else {
|
||||
netManager.sendPacket(makeStatusPacket(hash, Action.DECLINED));
|
||||
}
|
||||
|
||||
ServerList.saveSingleServer(serverData);
|
||||
mc.displayGuiScreen(null);
|
||||
ServerList_saveSingleServer(serverData);
|
||||
mc.displayGuiScreen(null);
|
||||
}
|
||||
}, I18n.format("multiplayer.texturePrompt.line1"), I18n.format("multiplayer.texturePrompt.line2"), 0)));
|
||||
}
|
||||
}
|
||||
|
||||
//#if MC>=10904
|
||||
return new SPacketResourcePackSend("replay://" + requestId, "");
|
||||
//#else
|
||||
//$$ return new S48PacketResourcePackSend("replay://" + requestId, "");
|
||||
//#endif
|
||||
}
|
||||
|
||||
private void downloadResourcePackFuture(int requestId, String url, final String hash) {
|
||||
Futures.addCallback(downloadResourcePack(requestId, url, hash), new FutureCallback() {
|
||||
@Override
|
||||
public void onSuccess(Object result) {
|
||||
mc.getConnection().sendPacket(new CPacketResourcePackStatus(CPacketResourcePackStatus.Action.SUCCESSFULLY_LOADED));
|
||||
sendPacket(getConnection(mc), makeStatusPacket(hash, Action.SUCCESSFULLY_LOADED));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(@Nonnull Throwable throwable) {
|
||||
mc.getConnection().sendPacket(new CPacketResourcePackStatus(CPacketResourcePackStatus.Action.FAILED_DOWNLOAD));
|
||||
sendPacket(getConnection(mc), makeStatusPacket(hash, Action.FAILED_DOWNLOAD));
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -165,16 +208,24 @@ public class ResourcePackRecorder {
|
||||
}
|
||||
|
||||
final File file = new File(repo.dirServerResourcepacks, fileName);
|
||||
//#if MC>=10809
|
||||
repo.lock.lock();
|
||||
//#else
|
||||
//$$ repo.field_177321_h.lock();
|
||||
//#endif
|
||||
try {
|
||||
//#if MC>=10809
|
||||
repo.clearResourcePack();
|
||||
//#else
|
||||
//$$ repo.func_148529_f();
|
||||
//#endif
|
||||
|
||||
if (file.exists() && hash.length() == 40) {
|
||||
try {
|
||||
String fileHash = Hashing.sha1().hashBytes(Files.toByteArray(file)).toString();
|
||||
if (fileHash.equals(hash)) {
|
||||
recordResourcePack(file, requestId);
|
||||
return repo.setServerResourcePack(file);
|
||||
return setServerResourcePack(repo, file);
|
||||
}
|
||||
|
||||
logger.warn("File " + file + " had wrong hash (expected " + hash + ", found " + fileHash + "). Deleting it.");
|
||||
@@ -190,13 +241,27 @@ public class ResourcePackRecorder {
|
||||
|
||||
Futures.getUnchecked(mc.addScheduledTask(() -> mc.displayGuiScreen(guiScreen)));
|
||||
|
||||
//#if MC>=10809
|
||||
//#if MC>=11002
|
||||
//#if MC>=11100
|
||||
Map<String, String> sessionInfo = ResourcePackRepository.getDownloadHeaders();
|
||||
//#else
|
||||
//$$ Map<String, String> sessionInfo = ResourcePackRepository.func_190115_a();
|
||||
//#endif
|
||||
//#else
|
||||
//$$ Map<String, String> sessionInfo = Minecraft.getSessionInfo();
|
||||
//#endif
|
||||
repo.downloadingPacks = HttpUtil.downloadResourcePack(file, url, sessionInfo, 50 * 1024 * 1024, guiScreen, mc.getProxy());
|
||||
Futures.addCallback(repo.downloadingPacks, new FutureCallback<Object>() {
|
||||
//#else
|
||||
//$$ Map sessionInfo = Minecraft.getSessionInfo();
|
||||
//$$ repo.field_177322_i = HttpUtil.func_180192_a(file, url, sessionInfo, 50 * 1024 * 1024, guiScreen, mc.getProxy());
|
||||
//$$ Futures.addCallback(repo.field_177322_i, new FutureCallback() {
|
||||
//#endif
|
||||
@Override
|
||||
public void onSuccess(Object value) {
|
||||
recordResourcePack(file, requestId);
|
||||
repo.setServerResourcePack(file);
|
||||
setServerResourcePack(repo, file);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -204,9 +269,17 @@ public class ResourcePackRecorder {
|
||||
throwable.printStackTrace();
|
||||
}
|
||||
});
|
||||
//#if MC>=10809
|
||||
return repo.downloadingPacks;
|
||||
//#else
|
||||
//$$ return repo.field_177322_i;
|
||||
//#endif
|
||||
} finally {
|
||||
//#if MC>=10809
|
||||
repo.lock.unlock();
|
||||
//#else
|
||||
//$$ repo.field_177321_h.unlock();
|
||||
//#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user