Allow changing of camera controller

This commit is contained in:
johni0702
2015-11-07 22:18:47 +01:00
parent 305084f874
commit fb5cf01b7f
5 changed files with 80 additions and 1 deletions

View File

@@ -1,9 +1,11 @@
package com.replaymod.replay; package com.replaymod.replay;
import com.google.common.base.Function;
import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import com.replaymod.core.ReplayMod; import com.replaymod.core.ReplayMod;
import com.replaymod.replay.camera.*;
import com.replaymod.replay.handler.GuiHandler; import com.replaymod.replay.handler.GuiHandler;
import de.johni0702.replaystudio.replay.ReplayFile; import de.johni0702.replaystudio.replay.ReplayFile;
import de.johni0702.replaystudio.replay.ZipReplayFile; import de.johni0702.replaystudio.replay.ZipReplayFile;
@@ -11,12 +13,15 @@ import de.johni0702.replaystudio.studio.ReplayStudio;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.lwjgl.input.Keyboard; import org.lwjgl.input.Keyboard;
import javax.annotation.Nullable;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
@Mod(modid = ReplayModReplay.MOD_ID, useMetadata = true) @Mod(modid = ReplayModReplay.MOD_ID, useMetadata = true)
public class ReplayModReplay { public class ReplayModReplay {
@@ -28,6 +33,8 @@ public class ReplayModReplay {
@Mod.Instance(ReplayMod.MOD_ID) @Mod.Instance(ReplayMod.MOD_ID)
private static ReplayMod core; private static ReplayMod core;
private final CameraControllerRegistry cameraControllerRegistry = new CameraControllerRegistry();
private Logger logger; private Logger logger;
private ReplayHandler replayHandler; private ReplayHandler replayHandler;
@@ -83,6 +90,21 @@ public class ReplayModReplay {
} }
} }
}); });
cameraControllerRegistry.register("replaymod.camera.classic", new Function<CameraEntity, CameraController>() {
@Nullable
@Override
public CameraController apply(CameraEntity cameraEntity) {
return new ClassicCameraController(cameraEntity);
}
});
cameraControllerRegistry.register("replaymod.camera.vanilla", new Function<CameraEntity, CameraController>() {
@Nullable
@Override
public CameraController apply(@Nullable CameraEntity cameraEntity) {
return new VanillaCameraController(core.getMinecraft(), cameraEntity);
}
});
} }
@Mod.EventHandler @Mod.EventHandler
@@ -93,6 +115,11 @@ public class ReplayModReplay {
new GuiHandler(this).register(); new GuiHandler(this).register();
} }
@Mod.EventHandler
public void postInit(FMLPostInitializationEvent event) {
Setting.CAMERA.setChoices(new ArrayList<>(cameraControllerRegistry.getControllers()));
}
public void startReplay(File file) throws IOException { public void startReplay(File file) throws IOException {
ReplayFile replayFile = new ZipReplayFile(new ReplayStudio(), file); ReplayFile replayFile = new ZipReplayFile(new ReplayStudio(), file);
replayHandler = new ReplayHandler(replayFile, true); replayHandler = new ReplayHandler(replayFile, true);
@@ -105,4 +132,13 @@ public class ReplayModReplay {
public Logger getLogger() { public Logger getLogger() {
return logger; return logger;
} }
public CameraControllerRegistry getCameraControllerRegistry() {
return cameraControllerRegistry;
}
public CameraController createCameraController(CameraEntity cameraEntity) {
String controllerName = core.getSettingsRegistry().get(Setting.CAMERA);
return cameraControllerRegistry.create(controllerName, cameraEntity);
}
} }

View File

@@ -6,6 +6,9 @@ public final class Setting<T> extends SettingsRegistry.SettingKeys<T> {
public static final Setting<Boolean> RECORD_SINGLEPLAYER = make("recordSingleplayer", "recordsingleplayer", true); public static final Setting<Boolean> RECORD_SINGLEPLAYER = make("recordSingleplayer", "recordsingleplayer", true);
public static final Setting<Boolean> RECORD_SERVER = make("recordServer", "recordserver", true); public static final Setting<Boolean> RECORD_SERVER = make("recordServer", "recordserver", true);
public static final Setting<Boolean> INDICATOR = make("indicator", "indicator", true); public static final Setting<Boolean> INDICATOR = make("indicator", "indicator", true);
public static final SettingsRegistry.MultipleChoiceSettingKeys<String> CAMERA =
new SettingsRegistry.MultipleChoiceSettingKeys<>(
"replay", "camera", "replaymod.gui.settings.camera", "replaymod.camera.classic");
private static <T> Setting<T> make(String key, String displayName, T defaultValue) { private static <T> Setting<T> make(String key, String displayName, T defaultValue) {
return new Setting<>(key, displayName, defaultValue); return new Setting<>(key, displayName, defaultValue);

View File

@@ -0,0 +1,26 @@
package com.replaymod.replay.camera;
import com.google.common.base.Function;
import com.google.common.base.Preconditions;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
public class CameraControllerRegistry {
private final Map<String, Function<CameraEntity, CameraController>> constructors = new ConcurrentHashMap<>();
public void register(String name, Function<CameraEntity, CameraController> constructor) {
Preconditions.checkState(!constructors.containsKey(name), "Controller " + name + " is already registered.");
constructors.put(name, constructor);
}
public Set<String> getControllers() {
return Collections.unmodifiableSet(constructors.keySet());
}
public CameraController create(String name, CameraEntity cameraEntity) {
return constructors.get(name).apply(cameraEntity);
}
}

View File

@@ -1,6 +1,8 @@
package com.replaymod.replay.camera; package com.replaymod.replay.camera;
import com.replaymod.core.events.SettingsChangedEvent;
import com.replaymod.replay.ReplayModReplay; import com.replaymod.replay.ReplayModReplay;
import com.replaymod.replay.Setting;
import eu.crushedpixel.replaymod.holders.AdvancedPosition; import eu.crushedpixel.replaymod.holders.AdvancedPosition;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@@ -39,7 +41,7 @@ public class CameraEntity extends EntityPlayerSP {
public CameraEntity(Minecraft mcIn, World worldIn, NetHandlerPlayClient netHandlerPlayClient, StatFileWriter statFileWriter) { public CameraEntity(Minecraft mcIn, World worldIn, NetHandlerPlayClient netHandlerPlayClient, StatFileWriter statFileWriter) {
super(mcIn, worldIn, netHandlerPlayClient, statFileWriter); super(mcIn, worldIn, netHandlerPlayClient, statFileWriter);
FMLCommonHandler.instance().bus().register(this); FMLCommonHandler.instance().bus().register(this);
cameraController = new VanillaCameraController(mc, this); cameraController = ReplayModReplay.instance.createCameraController(this);
} }
/** /**
@@ -214,4 +216,11 @@ public class CameraEntity extends EntityPlayerSP {
lastControllerUpdate = now; lastControllerUpdate = now;
} }
} }
@SubscribeEvent
public void onSettingsChanged(SettingsChangedEvent event) {
if (event.getKey() == Setting.CAMERA) {
cameraController = ReplayModReplay.instance.createCameraController(this);
}
}
} }

View File

@@ -260,6 +260,7 @@ replaymod.gui.settings.interpolation=Path Interpolation
replaymod.gui.settings.pathpreview=Show Path Preview replaymod.gui.settings.pathpreview=Show Path Preview
replaymod.gui.settings.keyframecleancallback=Clear Confirmation replaymod.gui.settings.keyframecleancallback=Clear Confirmation
replaymod.gui.settings.renderinvisible=Render invisible Entities replaymod.gui.settings.renderinvisible=Render invisible Entities
replaymod.gui.settings.camera=Camera
replaymod.gui.settings.warning.linea=WARNING: Recording settings will be replaymod.gui.settings.warning.linea=WARNING: Recording settings will be
replaymod.gui.settings.warning.lineb=applied the next time you join a world. replaymod.gui.settings.warning.lineb=applied the next time you join a world.
@@ -281,6 +282,10 @@ replaymod.input.assetmanager=Asset Manager
replaymod.input.objectmanager=Object Manager replaymod.input.objectmanager=Object Manager
replaymod.input.interpolation=Toggle Interpolation replaymod.input.interpolation=Toggle Interpolation
# CameraControllers
replaymod.camera.classic=Classic
replaymod.camera.vanilla=Vanilla-ish
#Keyframe Presets GUI #Keyframe Presets GUI
replaymod.gui.keyframerepository.title=Keyframe Repository replaymod.gui.keyframerepository.title=Keyframe Repository
replaymod.gui.keyframerepository.presets=Keyframe Presets replaymod.gui.keyframerepository.presets=Keyframe Presets