Start on NEXT (version 1.0) branch

- update gradle wrapper version (8.4 to 8.5)
- update logo and add banner
- change to gradle kotlin DSL (from groovy)
- update README.md
- update project layout for planned forge support
- move common logic to common module
- change environment to 'client' to prevent servers from loading the mod (#2)
- cleanup unneeded files
- update LICENSE.md to use Markdown format for easier reading
- update version number to prepare for version 1.0

Signed-off-by: Lucas Petrino <nsx1lucas@gmail.com>
This commit is contained in:
2024-01-14 19:20:34 +13:00
parent 993df4b93d
commit 4eaf638e42
45 changed files with 804 additions and 683 deletions

16
common/build.gradle.kts Normal file
View File

@@ -0,0 +1,16 @@
architectury {
common(rootProject.property("enabled_platforms").toString().split(","))
}
loom {
accessWidenerPath = file("src/main/resources/weatherchanger.accesswidener")
}
repositories {
mavenCentral()
}
dependencies {
implementation("com.google.code.gson:gson:2.10.1")
modImplementation("net.fabricmc:fabric-loader:${rootProject.property("fabric.loader_version")}")
}

View File

@@ -0,0 +1,133 @@
package me.lucaslah.weatherchanger;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import me.lucaslah.weatherchanger.config.WcConfig;
import me.lucaslah.weatherchanger.config.WcMode;
import me.lucaslah.weatherchanger.keybinding.KeybindingManager;
import me.lucaslah.weatherchanger.keys.ToggleClearKey;
import me.lucaslah.weatherchanger.keys.ToggleOffKey;
import me.lucaslah.weatherchanger.keys.ToggleRainKey;
import me.lucaslah.weatherchanger.keys.ToggleThunderKey;
import java.io.File;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.nio.file.Files;
import java.util.Objects;
public class WeatherChanger {
private static final Gson gson = new GsonBuilder().setPrettyPrinting().create();
private static WcMode currentMode = WcMode.OFF;
public static void init() {
boolean fileCreated = false;
File configPath = getConfigFile();
if (!configPath.exists()) {
try {
fileCreated = configPath.createNewFile();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
if (fileCreated) {
writeConfig();
} else {
loadConfig();
}
KeybindingManager keybindingManager = WeatherChangerExpectPlatform.getKeybindingManager();
keybindingManager
.add(new ToggleClearKey())
.add(new ToggleOffKey())
.add(new ToggleRainKey())
.add(new ToggleThunderKey());
keybindingManager.registerKeys();
}
private static void loadConfig() {
Reader reader;
try {
reader = Files.newBufferedReader(getConfigFile().toPath());
} catch (IOException e) {
throw new RuntimeException(e);
}
WcConfig config = gson.fromJson(reader, WcConfig.class);
if (!Objects.equals(config.getVersion(), "1.0.0")) {
throw new RuntimeException("Invalid weather changer config version! Try removing the config file and try again.");
}
currentMode = config.getMode();
try {
reader.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private static void writeConfig() {
WcConfig config = new WcConfig();
config.setMode(currentMode);
config.setVersion("1.0.0");
Writer writer;
try {
writer = Files.newBufferedWriter(getConfigFile().toPath());
} catch (IOException e) {
throw new RuntimeException(e);
}
gson.toJson(config, writer);
try {
writer.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private static File getConfigFile() {
return WeatherChangerExpectPlatform.getConfigDirectory().resolve("weather-changer.json").toFile();
}
/**
* Reloads the config file from disk
* @return if the reload was successful
*/
public static boolean reloadConfig() {
if (getConfigFile().exists() && getConfigFile().isFile()) {
loadConfig();
return true;
}
return false;
}
/**
* Sets the current mode
* @param mode the mode
*/
public static void setMode(WcMode mode) {
currentMode = mode;
}
public static WcMode getMode() {
return currentMode;
}
/**
* Call on shutdown
*/
public static void shutdown() {
writeConfig();
}
}

View File

@@ -0,0 +1,18 @@
package me.lucaslah.weatherchanger;
import dev.architectury.injectables.annotations.ExpectPlatform;
import me.lucaslah.weatherchanger.keybinding.KeybindingManager;
import java.nio.file.Path;
public class WeatherChangerExpectPlatform {
@ExpectPlatform
public static Path getConfigDirectory() {
throw new AssertionError();
}
@ExpectPlatform
public static KeybindingManager getKeybindingManager() {
throw new AssertionError();
}
}

View File

@@ -0,0 +1,4 @@
package me.lucaslah.weatherchanger.command;
public class CommandManager {
}

View File

@@ -0,0 +1,30 @@
package me.lucaslah.weatherchanger.config;
public class WcConfig {
private WcMode mode;
private String version;
public WcConfig() {
}
public WcConfig(WcMode mode, String version) {
this.mode = mode;
this.version = version;
}
public WcMode getMode() {
return mode;
}
public void setMode(WcMode mode) {
this.mode = mode;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
}

View File

@@ -0,0 +1,8 @@
package me.lucaslah.weatherchanger.config;
public enum WcMode {
OFF,
CLEAR,
RAIN,
THUNDER
}

View File

@@ -0,0 +1,25 @@
package me.lucaslah.weatherchanger.keybinding;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.option.KeyBinding;
import net.minecraft.client.util.InputUtil;
import net.minecraft.util.Identifier;
import org.jetbrains.annotations.NotNull;
public abstract class Key {
public KeyBinding keybind;
public MinecraftClient mc = MinecraftClient.getInstance();
public Key(@NotNull String name) {
keybind = new KeyBinding(this.getDisplayName(), this.getKeyType(), this.getKey(), this.getCategory());
}
public abstract void onPress(@NotNull MinecraftClient client);
public abstract Identifier getId();
public abstract KeyBinding getKeyBinding();
public abstract boolean isEnabled();
public abstract String getDisplayName();
public abstract InputUtil.Type getKeyType();
public abstract String getCategory();
public abstract int getKey();
}

View File

@@ -0,0 +1,30 @@
package me.lucaslah.weatherchanger.keybinding;
import net.minecraft.util.Identifier;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public abstract class KeybindingManager {
private final HashMap<Identifier, Key> entries = new HashMap<>();
public KeybindingManager add(Key entry) {
entries.put(entry.getId(), entry);
return this;
}
public Key get(Identifier identifier) {
return entries.get(identifier);
}
public List<Key> getEntries() {
if (!entries.isEmpty()) {
return new ArrayList<>(entries.values());
}
return new ArrayList<>();
}
public abstract void registerKeys();
}

View File

@@ -0,0 +1,59 @@
package me.lucaslah.weatherchanger.keys;
import me.lucaslah.weatherchanger.WeatherChanger;
import me.lucaslah.weatherchanger.config.WcMode;
import me.lucaslah.weatherchanger.keybinding.Key;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.option.KeyBinding;
import net.minecraft.client.util.InputUtil;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import org.jetbrains.annotations.NotNull;
public class ToggleClearKey extends Key {
public ToggleClearKey() {
super("ToggleClearKey");
}
@Override
public void onPress(@NotNull MinecraftClient client) {
WeatherChanger.setMode(WcMode.CLEAR);
assert mc.player != null;
mc.player.sendMessage(Text.of("Set client weather to: Clear"), true);
}
@Override
public Identifier getId() {
return new Identifier("weatherchanger", "toggleclearkey");
}
@Override
public KeyBinding getKeyBinding() {
return this.keybind;
}
@Override
public boolean isEnabled() {
return true;
}
@Override
public String getDisplayName() {
return "Toggle Weather Clear";
}
@Override
public InputUtil.Type getKeyType() {
return InputUtil.Type.KEYSYM;
}
@Override
public String getCategory() {
return "Weather Changer";
}
@Override
public int getKey() {
return -1;
}
}

View File

@@ -0,0 +1,59 @@
package me.lucaslah.weatherchanger.keys;
import me.lucaslah.weatherchanger.WeatherChanger;
import me.lucaslah.weatherchanger.config.WcMode;
import me.lucaslah.weatherchanger.keybinding.Key;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.option.KeyBinding;
import net.minecraft.client.util.InputUtil;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import org.jetbrains.annotations.NotNull;
public class ToggleOffKey extends Key {
public ToggleOffKey() {
super("ToggleOffKey");
}
@Override
public void onPress(@NotNull MinecraftClient client) {
WeatherChanger.setMode(WcMode.OFF);
assert mc.player != null;
mc.player.sendMessage(Text.of("Set client weather to: Off"), true);
}
@Override
public Identifier getId() {
return new Identifier("weatherchanger", "toggleoffkey");
}
@Override
public KeyBinding getKeyBinding() {
return this.keybind;
}
@Override
public boolean isEnabled() {
return true;
}
@Override
public String getDisplayName() {
return "Toggle Weather Off";
}
@Override
public InputUtil.Type getKeyType() {
return InputUtil.Type.KEYSYM;
}
@Override
public String getCategory() {
return "Weather Changer";
}
@Override
public int getKey() {
return -1;
}
}

View File

@@ -0,0 +1,59 @@
package me.lucaslah.weatherchanger.keys;
import me.lucaslah.weatherchanger.WeatherChanger;
import me.lucaslah.weatherchanger.config.WcMode;
import me.lucaslah.weatherchanger.keybinding.Key;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.option.KeyBinding;
import net.minecraft.client.util.InputUtil;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import org.jetbrains.annotations.NotNull;
public class ToggleRainKey extends Key {
public ToggleRainKey() {
super("ToggleRainKey");
}
@Override
public void onPress(@NotNull MinecraftClient client) {
WeatherChanger.setMode(WcMode.RAIN);
assert mc.player != null;
mc.player.sendMessage(Text.of("Set client weather to: Rain"), true);
}
@Override
public Identifier getId() {
return new Identifier("weatherchanger", "togglerainkey");
}
@Override
public KeyBinding getKeyBinding() {
return this.keybind;
}
@Override
public boolean isEnabled() {
return true;
}
@Override
public String getDisplayName() {
return "Toggle Weather Rain";
}
@Override
public InputUtil.Type getKeyType() {
return InputUtil.Type.KEYSYM;
}
@Override
public String getCategory() {
return "Weather Changer";
}
@Override
public int getKey() {
return -1;
}
}

View File

@@ -0,0 +1,59 @@
package me.lucaslah.weatherchanger.keys;
import me.lucaslah.weatherchanger.WeatherChanger;
import me.lucaslah.weatherchanger.config.WcMode;
import me.lucaslah.weatherchanger.keybinding.Key;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.option.KeyBinding;
import net.minecraft.client.util.InputUtil;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import org.jetbrains.annotations.NotNull;
public class ToggleThunderKey extends Key {
public ToggleThunderKey() {
super("ToggleThunderKey");
}
@Override
public void onPress(@NotNull MinecraftClient client) {
WeatherChanger.setMode(WcMode.THUNDER);
assert mc.player != null;
mc.player.sendMessage(Text.of("Set client weather to: Thunder"), true);
}
@Override
public Identifier getId() {
return new Identifier("weatherchanger", "togglethunderkey");
}
@Override
public KeyBinding getKeyBinding() {
return this.keybind;
}
@Override
public boolean isEnabled() {
return true;
}
@Override
public String getDisplayName() {
return "Toggle Weather Thunder";
}
@Override
public InputUtil.Type getKeyType() {
return InputUtil.Type.KEYSYM;
}
@Override
public String getCategory() {
return "Weather Changer";
}
@Override
public int getKey() {
return -1;
}
}

View File

@@ -0,0 +1,53 @@
package me.lucaslah.weatherchanger.mixin;
import me.lucaslah.weatherchanger.WeatherChanger;
import me.lucaslah.weatherchanger.config.WcMode;
import net.minecraft.util.math.MathHelper;
import net.minecraft.world.World;
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.CallbackInfoReturnable;
@Mixin(World.class)
public class WorldMixin {
@Shadow
protected float rainGradientPrev;
@Shadow
protected float rainGradient;
@Shadow
protected float thunderGradientPrev;
@Shadow
protected float thunderGradient;
@Inject(method = "getRainGradient", at = @At("HEAD"), cancellable = true)
public void getRainGradient(float delta, CallbackInfoReturnable<Float> callback) {
WcMode mode = WeatherChanger.getMode();
if (mode == WcMode.CLEAR) {
callback.setReturnValue(0F);
} else if (mode == WcMode.RAIN || mode == WcMode.THUNDER) {
callback.setReturnValue(1F);
} else {
callback.setReturnValue(MathHelper.lerp(delta, this.rainGradientPrev, this.rainGradient));
}
callback.cancel();
}
@Inject(method = "getThunderGradient", at = @At("HEAD"), cancellable = true)
public void getThunderGradient(float delta, CallbackInfoReturnable<Float> callback) {
WcMode mode = WeatherChanger.getMode();
if (mode == WcMode.CLEAR) {
callback.setReturnValue(0F);
} else if (mode == WcMode.THUNDER) {
callback.setReturnValue(1F);
} else {
callback.setReturnValue(MathHelper.lerp(delta, this.thunderGradientPrev, this.thunderGradient) * MathHelper.lerp(delta, this.rainGradientPrev, this.rainGradient));
}
callback.cancel();
}
}

View File

@@ -0,0 +1,3 @@
{
"accessWidener": "weatherchanger.accesswidener"
}

View File

@@ -0,0 +1 @@
accessWidener v2 named

View File

@@ -0,0 +1,14 @@
{
"required": true,
"minVersion": "0.8",
"package": "me.lucaslah.weatherchanger.mixin",
"compatibilityLevel": "JAVA_17",
"mixins": [
],
"client": [
"WorldMixin"
],
"injectors": {
"defaultRequire": 1
}
}