Merge branch '1.9.4' into 1.10.2

4a1ccea Merge branch '1.8' into 1.9.4
fb39a06 Add drone ci config
030c71c Automatically disable and re-enable Optifine's Fast Render setting before rendering a video
1fef12d Include FML handshake in recording
e86c66d Move README.md, LICENSE.md and user docs from master branch to 1.8
This commit is contained in:
johni0702
2016-12-10 19:54:55 +01:00
88 changed files with 1883 additions and 13 deletions

View File

@@ -5,6 +5,7 @@ import com.replaymod.core.utils.Restrictions;
import com.replaymod.recording.handler.ConnectionEventHandler;
import com.replaymod.recording.packet.PacketListener;
import net.minecraftforge.common.MinecraftForge;
import net.minecraft.network.NetworkManager;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
@@ -17,6 +18,9 @@ import org.lwjgl.input.Keyboard;
public class ReplayModRecording {
public static final String MOD_ID = "replaymod-recording";
@Mod.Instance(MOD_ID)
public static ReplayModRecording instance;
@Mod.Instance(ReplayMod.MOD_ID)
private static ReplayMod core;
@@ -49,4 +53,8 @@ public class ReplayModRecording {
NetworkRegistry.INSTANCE.newSimpleChannel(Restrictions.PLUGIN_CHANNEL);
}
public void initiateRecording(NetworkManager networkManager) {
connectionEventHandler.onConnectedToServerEvent(networkManager);
}
}

View File

@@ -9,13 +9,10 @@ import com.replaymod.replaystudio.replay.ReplayFile;
import com.replaymod.replaystudio.replay.ReplayMetaData;
import com.replaymod.replaystudio.replay.ZipReplayFile;
import com.replaymod.replaystudio.studio.ReplayStudio;
import io.netty.channel.Channel;
import io.netty.channel.ChannelPipeline;
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.ClientConnectedToServerEvent;
import net.minecraftforge.fml.common.network.FMLNetworkEvent.ClientDisconnectionFromServerEvent;
import org.apache.logging.log4j.Logger;
@@ -45,10 +42,10 @@ public class ConnectionEventHandler {
this.core = core;
}
@SubscribeEvent
public void onConnectedToServerEvent(ClientConnectedToServerEvent event) {
public void onConnectedToServerEvent(NetworkManager networkManager) {
try {
if(event.isLocal()) {
boolean local = networkManager.isLocalChannel();
if (local) {
if (mc.getIntegratedServer().getEntityWorld().getWorldType() == WorldType.DEBUG_WORLD) {
logger.info("Debug World recording is not supported.");
return;
@@ -64,9 +61,8 @@ public class ConnectionEventHandler {
}
}
NetworkManager nm = event.getManager();
String worldName;
if(event.isLocal()) {
if (local) {
worldName = mc.getIntegratedServer().getWorldName();
} else if (Minecraft.getMinecraft().getCurrentServerData() != null) {
worldName = Minecraft.getMinecraft().getCurrentServerData().serverIP;
@@ -75,9 +71,6 @@ public class ConnectionEventHandler {
return;
}
Channel channel = nm.channel();
ChannelPipeline pipeline = channel.pipeline();
File folder = core.getReplayFolder();
String name = sdf.format(Calendar.getInstance().getTime());
@@ -87,13 +80,13 @@ public class ConnectionEventHandler {
replayFile.writeModInfo(ModCompat.getInstalledNetworkMods());
ReplayMetaData metaData = new ReplayMetaData();
metaData.setSingleplayer(event.isLocal());
metaData.setSingleplayer(local);
metaData.setServerName(worldName);
metaData.setGenerator("ReplayMod v" + ReplayMod.getContainer().getVersion());
metaData.setDate(System.currentTimeMillis());
metaData.setMcVersion(ReplayMod.getMinecraftVersion());
packetListener = new PacketListener(replayFile, metaData);
pipeline.addBefore(packetHandlerKey, "replay_recorder", packetListener);
networkManager.channel().pipeline().addBefore(packetHandlerKey, "replay_recorder", packetListener);
recordingEventHandler = new RecordingEventHandler(packetListener);
recordingEventHandler.register();

View File

@@ -0,0 +1,27 @@
package com.replaymod.recording.mixin;
import com.replaymod.recording.ReplayModRecording;
import net.minecraft.client.network.NetHandlerLoginClient;
import net.minecraft.network.NetworkManager;
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;
@Mixin(NetHandlerLoginClient.class)
public abstract class MixinNetHandlerLoginClient {
@Shadow
private NetworkManager networkManager;
/**
* Starts the recording right before switching into PLAY state.
* We cannot use the {@link net.minecraftforge.fml.common.network.FMLNetworkEvent.ClientConnectedToServerEvent}
* as it only fires after the forge handshake.
*/
@Inject(method = "handleLoginSuccess", at=@At("HEAD"))
public void replayModRecording_initiateRecording(CallbackInfo cb) {
ReplayModRecording.instance.initiateRecording(networkManager);
}
}

View File

@@ -0,0 +1,27 @@
package com.replaymod.recording.mixin;
import io.netty.channel.embedded.EmbeddedChannel;
import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher;
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;
@Mixin(value = NetworkDispatcher.class, remap = false)
public abstract class MixinNetworkDispatcher {
@Shadow
private EmbeddedChannel handshakeChannel;
/**
* Always sets fml:isLocal to false.
* This effectively removes the difference in the FML handshake between SP and MP
* and forces the block/item ids, etc. to always be send.
* This might have undesired side effects but at least it works at all.
*/
@Inject(method = "insertIntoChannel", at=@At("HEAD"))
public void replayModRecording_forceIsLocalToFalse(CallbackInfo cb) {
handshakeChannel.attr(NetworkDispatcher.IS_LOCAL).set(false);
}
}