ConfigSerializer.java 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package chylex.bettercontrols.config;
  2. import chylex.bettercontrols.input.SprintMode;
  3. import com.google.gson.Gson;
  4. import com.google.gson.GsonBuilder;
  5. import com.google.gson.JsonDeserializationContext;
  6. import com.google.gson.JsonDeserializer;
  7. import com.google.gson.JsonElement;
  8. import com.google.gson.JsonObject;
  9. import com.google.gson.JsonParseException;
  10. import com.google.gson.JsonSerializationContext;
  11. import com.google.gson.JsonSerializer;
  12. import com.google.gson.stream.JsonReader;
  13. import com.google.gson.stream.JsonWriter;
  14. import net.minecraft.util.math.MathHelper;
  15. import org.apache.logging.log4j.LogManager;
  16. import org.apache.logging.log4j.Logger;
  17. import java.io.FileNotFoundException;
  18. import java.io.IOException;
  19. import java.lang.reflect.Type;
  20. import java.nio.charset.StandardCharsets;
  21. import java.nio.file.Files;
  22. import java.nio.file.NoSuchFileException;
  23. import java.nio.file.Path;
  24. final class ConfigSerializer implements JsonSerializer<BetterControlsConfig>, JsonDeserializer<BetterControlsConfig>{
  25. private static final Logger logger = LogManager.getLogger();
  26. private static final Gson gson = new GsonBuilder().registerTypeAdapter(BetterControlsConfig.class, new ConfigSerializer()).setPrettyPrinting().create();
  27. private ConfigSerializer(){}
  28. @Override
  29. public JsonElement serialize(final BetterControlsConfig cfg, final Type typeOfSrc, final JsonSerializationContext context){
  30. final JsonObject obj = new JsonObject();
  31. Json.writeKeyBinding(obj, "Sprint.KeyToggle", cfg.keyToggleSprint);
  32. Json.setEnum(obj, "Sprint.Mode", cfg.sprintMode);
  33. Json.setBool(obj, "Sprint.DoubleTapForward", cfg.doubleTapForwardToSprint);
  34. Json.setBool(obj, "Sprint.ResumeAfterHittingObstacle", cfg.resumeSprintingAfterHittingObstacle);
  35. Json.writeKeyBinding(obj, "Sneak.KeyToggle", cfg.keyToggleSneak);
  36. Json.setBool(obj, "Sneak.SmoothCamera", cfg.sneakingMovesCameraSmoothly);
  37. Json.writeKeyBinding(obj, "Flight.KeyToggle.Creative", cfg.keyToggleFlight);
  38. Json.setEnum(obj, "Flight.SprintMode", cfg.sprintModeWhileFlying);
  39. Json.setBool(obj, "Flight.FlyOnGround.Creative", cfg.flyOnGroundInCreative);
  40. Json.setFloat(obj, "Flight.SpeedMp.Creative.Default", cfg.flightSpeedMpCreativeDefault);
  41. Json.setFloat(obj, "Flight.SpeedMp.Creative.Sprinting", cfg.flightSpeedMpCreativeSprinting);
  42. Json.setFloat(obj, "Flight.SpeedMp.Spectator.Default", cfg.flightSpeedMpSpectatorDefault);
  43. Json.setFloat(obj, "Flight.SpeedMp.Spectator.Sprinting", cfg.flightSpeedMpSpectatorSprinting);
  44. Json.writeKeyBinding(obj, "Misc.KeyToggleWalkForward", cfg.keyToggleWalkForward);
  45. Json.writeKeyBinding(obj, "Misc.KeyToggleJump", cfg.keyToggleJump);
  46. Json.writeKeyBinding(obj, "Misc.KeyResetAllToggles", cfg.keyResetAllToggles);
  47. Json.writeKeyBinding(obj, "Misc.KeyOpenMenu", cfg.keyOpenMenu);
  48. return obj;
  49. }
  50. @Override
  51. public BetterControlsConfig deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context) throws JsonParseException{
  52. final BetterControlsConfig cfg = new BetterControlsConfig();
  53. final JsonObject obj = json.getAsJsonObject();
  54. if (obj.has("Sprint.TapToStop") && obj.get("Sprint.TapToStop").getAsBoolean()){
  55. cfg.sprintMode = SprintMode.TAP_TO_TOGGLE;
  56. }
  57. Json.readKeyBinding(obj, "Sprint.KeyToggle", cfg.keyToggleSprint);
  58. cfg.sprintMode = Json.getEnum(obj, "Sprint.Mode", cfg.sprintMode, SprintMode.class);
  59. cfg.doubleTapForwardToSprint = Json.getBool(obj, "Sprint.DoubleTapForward", cfg.doubleTapForwardToSprint);
  60. cfg.resumeSprintingAfterHittingObstacle = Json.getBool(obj, "Sprint.ResumeAfterHittingObstacle", cfg.resumeSprintingAfterHittingObstacle);
  61. Json.readKeyBinding(obj, "Sneak.KeyToggle", cfg.keyToggleSneak);
  62. cfg.sneakingMovesCameraSmoothly = Json.getBool(obj, "Sneak.SmoothCamera", cfg.sneakingMovesCameraSmoothly);
  63. Json.readKeyBinding(obj, "Flight.KeyToggle.Creative", cfg.keyToggleFlight);
  64. cfg.sprintModeWhileFlying = Json.getEnum(obj, "Flight.SprintMode", cfg.sprintModeWhileFlying, SprintMode.class);
  65. cfg.flyOnGroundInCreative = Json.getBool(obj, "Flight.FlyOnGround.Creative", cfg.flyOnGroundInCreative);
  66. cfg.flightSpeedMpCreativeDefault = MathHelper.clamp(Json.getFloat(obj, "Flight.SpeedMp.Creative.Default", cfg.flightSpeedMpCreativeDefault), 0.25F, 8F);
  67. cfg.flightSpeedMpCreativeSprinting = MathHelper.clamp(Json.getFloat(obj, "Flight.SpeedMp.Creative.Sprinting", cfg.flightSpeedMpCreativeSprinting), 0.25F, 8F);
  68. cfg.flightSpeedMpSpectatorDefault = MathHelper.clamp(Json.getFloat(obj, "Flight.SpeedMp.Spectator.Default", cfg.flightSpeedMpSpectatorDefault), 0.25F, 8F);
  69. cfg.flightSpeedMpSpectatorSprinting = MathHelper.clamp(Json.getFloat(obj, "Flight.SpeedMp.Spectator.Sprinting", cfg.flightSpeedMpSpectatorSprinting), 0.25F, 8F);
  70. Json.readKeyBinding(obj, "Misc.KeyToggleWalkForward", cfg.keyToggleWalkForward);
  71. Json.readKeyBinding(obj, "Misc.KeyToggleJump", cfg.keyToggleJump);
  72. Json.readKeyBinding(obj, "Misc.KeyResetAllToggles", cfg.keyResetAllToggles);
  73. Json.readKeyBinding(obj, "Misc.KeyOpenMenu", cfg.keyOpenMenu);
  74. return cfg;
  75. }
  76. static void serialize(final Path path, final BetterControlsConfig config){
  77. try(final JsonWriter writer = gson.newJsonWriter(Files.newBufferedWriter(path, StandardCharsets.UTF_8))){
  78. gson.getAdapter(BetterControlsConfig.class).write(writer, config);
  79. }catch(final IOException e){
  80. logger.error("Error saving BetterControls configuration file!", e);
  81. }
  82. }
  83. static BetterControlsConfig deserialize(final Path path){
  84. try(final JsonReader jsonReader = new JsonReader(Files.newBufferedReader(path, StandardCharsets.UTF_8))){
  85. return gson.getAdapter(BetterControlsConfig.class).read(jsonReader);
  86. }catch(final FileNotFoundException | NoSuchFileException ignored){
  87. }catch(final IOException e){
  88. logger.error("Error reading BetterControls configuration file!", e);
  89. }
  90. return new BetterControlsConfig();
  91. }
  92. }