Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ loom {
}

dependencies {
implementation 'com.google.code.gson:gson:2.10.1'
minecraft "com.mojang:minecraft:${project.minecraft_version}"
mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2"
modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
Expand Down
22 changes: 16 additions & 6 deletions src/main/java/me/leeeaf/oakclient/OakClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,29 +9,33 @@
import me.leeeaf.oakclient.gui.ClickGUI;
import me.leeeaf.oakclient.gui.module.ClickGUIModule;
import me.leeeaf.oakclient.gui.module.HUDEditorModule;
import me.leeeaf.oakclient.systems.SaveHelper;
import me.leeeaf.oakclient.systems.modules.Category;
import me.leeeaf.oakclient.utils.file.FileHelper;
import me.leeeaf.oakclient.utils.io.KeyAction;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.api.ModInitializer;
import net.minecraft.client.MinecraftClient;
import org.lwjgl.glfw.GLFW;

import static me.leeeaf.oakclient.OakClientClient.mc;

public class OakClient implements ModInitializer {
@net.fabricmc.api.Environment(net.fabricmc.api.EnvType.CLIENT)
public class OakClient implements ModInitializer, ClientModInitializer {
public static String splashText = "OakClient";
public static MinecraftClient mc;


//TODO create Friends system
private static ClickGUI gui;
private boolean inited=false;
@Override
public void onInitialize() {
Category.init();
EventBus.getEventBus().subscribe(this);
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
SaveHelper.getInstance().saveAllSystems();
}));
}

@EventSubscribe
public void onKey(KeyEvent event){
FileHelper.getInstance();
if(mc.currentScreen == null){
if (event.key==ClickGUIModule.keybind.getKey()){
gui.enterGUI();
Expand All @@ -56,4 +60,10 @@ public void onHudRender(HudRenderEvent event){
gui.render();
}
}

@Override
public void onInitializeClient() {
mc = MinecraftClient.getInstance();
SaveHelper.getInstance().loadAllSystems(); //TODO if files does not exist everything explodes
}
}
14 changes: 0 additions & 14 deletions src/main/java/me/leeeaf/oakclient/OakClientClient.java

This file was deleted.

22 changes: 12 additions & 10 deletions src/main/java/me/leeeaf/oakclient/event/EventBus.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
public class EventBus {
private static EventBus eventBus;

public static EventBus getEventBus(){
if(eventBus == null){
public static EventBus getEventBus() {
if (eventBus == null) {
eventBus = new EventBus();
}
return eventBus;
Expand All @@ -16,7 +16,8 @@ public static EventBus getEventBus(){
private final HashMap<Class<?>, List<EventSubscriber>> subscribersMap = new HashMap<>();

Comparator<EventSubscriber> subscriberComparator;
private EventBus(){

private EventBus() {
subscriberComparator = Comparator.comparingInt(EventSubscriber::getEventPriorityValue).reversed();

}
Expand All @@ -25,32 +26,33 @@ private EventBus(){
public <T extends Event> T post(T event){
List<EventSubscriber> subscribers = subscribersMap.get(event.getClass());
if (subscribers != null) {
for (EventSubscriber subscriber : subscribers){
for (EventSubscriber subscriber : subscribers) {
subscriber.call(event);
}
}
return event;
}
public boolean subscribe(Object eventListener){

public boolean subscribe(Object eventListener) {
boolean subscribed = false;
for(Method method : eventListener.getClass().getDeclaredMethods()){
if(method.isAnnotationPresent(EventSubscribe.class) && method.getParameterTypes().length > 0){
for (Method method : eventListener.getClass().getDeclaredMethods()) {
if (method.isAnnotationPresent(EventSubscribe.class) && method.getParameterTypes().length > 0) {
insert(subscribersMap.computeIfAbsent(method.getParameterTypes()[0], k -> new ArrayList<>()), new EventSubscriber(method, eventListener));
subscribed = true;
}
}
return subscribed;
}

private void insert(List<EventSubscriber> subscribers, EventSubscriber subscriber){
private void insert(List<EventSubscriber> subscribers, EventSubscriber subscriber) {
int index = Collections.binarySearch(subscribers, subscriber, subscriberComparator);
if (index < 0) {
index = -index - 1;
}
subscribers.add(index,subscriber);
subscribers.add(index, subscriber);
}

public void unsubscribe(Object eventListener){
public void unsubscribe(Object eventListener) {
subscribersMap.values().forEach(subscribers -> subscribers.removeIf(subscriber -> subscriber.getListenerInstance().equals(eventListener)));
}
}
10 changes: 9 additions & 1 deletion src/main/java/me/leeeaf/oakclient/gui/setting/Setting.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ public void setValue (T value) {
this.value=value;
}

public String getConfigName(){
return configName;
}

@Override
public String getDisplayName() {
return displayName;
Expand All @@ -44,7 +48,11 @@ public String getDescription() {
public IBoolean isVisible() {
return visible;
}


public List<Setting<?>> getSubSettingsInstances(){
return subSettings;
}

public Stream<ISetting<?>> getSubSettings() {
if (subSettings.size()==0) return null;
return subSettings.stream().filter(setting->setting instanceof ISetting).sorted((a,b)->a.displayName.compareTo(b.displayName)).map(setting->(ISetting<?>)setting);
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/me/leeeaf/oakclient/mixin/BlockMixin.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package me.leeeaf.oakclient.mixin;

import me.leeeaf.oakclient.systems.modules.Category;
import me.leeeaf.oakclient.systems.modules.world.AntiCactus;
import me.leeeaf.oakclient.systems.modules.world.XRay;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
Expand All @@ -19,7 +20,7 @@ public class BlockMixin{
@Inject(method = "shouldDrawSide", at = @At("RETURN"), cancellable = true)
private static void onShouldDrawSide(BlockState state, BlockView world, BlockPos pos, Direction side, BlockPos otherPos, CallbackInfoReturnable<Boolean> cir) {
if(xRay == null){
xRay = (XRay) Category.WORLD.getModules().filter(iModule -> iModule instanceof XRay).findFirst().orElse(null);
xRay = (XRay) Category.getModule(XRay.class);
}else if(xRay.isEnabled().isOn()){
cir.setReturnValue(xRay.shouldRenderSide(state.getBlock()));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Mixin(ClientConnection.class)
public class ClientConnectionMixin {
public class ClientConnectionMixin { //TODO make all mixins abstract
@Shadow
private Channel channel;

Expand All @@ -23,7 +23,7 @@ private void onSendPacketHead(Packet<?> packet, CallbackInfo info) {
}

@Inject(at=@At("HEAD"), method = "channelRead0(Lio/netty/channel/ChannelHandlerContext;Lnet/minecraft/network/Packet;)V", cancellable = true)
private void onRecievePacketHead(ChannelHandlerContext channelHandlerContext, Packet<?> packet, CallbackInfo ci){
private void onReceivePacketHead(ChannelHandlerContext channelHandlerContext, Packet<?> packet, CallbackInfo ci){
if (channel.isOpen() && packet != null) {
if(EventBus.getEventBus().post(new PacketEvent.Receive(packet)).isCancelled()) ci.cancel();
}
Expand Down
166 changes: 166 additions & 0 deletions src/main/java/me/leeeaf/oakclient/systems/SaveHelper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
package me.leeeaf.oakclient.systems;

import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.JsonPrimitive;
import me.leeeaf.oakclient.gui.setting.*;
import me.leeeaf.oakclient.systems.modules.Category;
import me.leeeaf.oakclient.systems.modules.Module;
import me.leeeaf.oakclient.utils.file.FileHelper;
import me.leeeaf.oakclient.utils.io.ChatLogger;
import me.leeeaf.oakclient.utils.io.JsonUtils;

import java.awt.*;
import java.io.IOException;

public class SaveHelper {
private static SaveHelper instance;

private SaveHelper() {
}

public static SaveHelper getInstance() {
if (instance == null) {
instance = new SaveHelper();
}
return instance;
}

public void saveAllSystems() {
saveModules();
}

public void loadAllSystems() {
loadModules();
}

private void saveModules() {
JsonObject json = new JsonObject();
for (Category category : Category.values()) {

category.getModules().forEach(module -> {

JsonObject moduleJson = new JsonObject();
JsonObject moduleSettingsJson = new JsonObject();
for (Setting<?> setting : ((Module) module).getSettingsInstances()) {

JsonObject tempModuleSettingsJson = getSettingJson(setting);
JsonUtils.mergeJsonObject(moduleSettingsJson, tempModuleSettingsJson);
}
if (moduleSettingsJson.size() > 0) { //don't create "settings" key if module has no settings set
moduleJson.add("settings", moduleSettingsJson);
}
moduleJson.add("enabled", new JsonPrimitive(module.isEnabled() != null && module.isEnabled().isOn()));
json.add(module.getDisplayName(), moduleJson);
});
}
try {
FileHelper.getInstance().writeToFile(json.toString(), "modules.json");
} catch (IOException e) {
ChatLogger.error("Couldn't write to file modules.json!");
}
}

private JsonObject getSettingJson(Setting<?> setting) {
JsonObject settingJson = new JsonObject();

if (setting.getSubSettingsInstances().size() != 0) {
JsonObject subSettingJson = new JsonObject();
for (Setting<?> subSetting : setting.getSubSettingsInstances()) {
JsonUtils.mergeJsonObject(subSettingJson, getSettingJson(subSetting));
}
settingJson.add("subSettings", subSettingJson);
}

try {
if (setting instanceof BooleanSetting) {
settingJson.add(setting.getConfigName(), new JsonPrimitive(((BooleanSetting) setting).getValue()));
} else if (setting instanceof IntegerSetting) {
settingJson.add(setting.getConfigName(), new JsonPrimitive(((IntegerSetting) setting).getValue()));
} else if (setting instanceof DoubleSetting) {
settingJson.add(setting.getConfigName(), new JsonPrimitive(((DoubleSetting) setting).getValue()));
} else if (setting instanceof ColorSetting) {
settingJson.add(setting.getConfigName(), new JsonPrimitive(((ColorSetting) setting).getValue().getRGB()));
} else if (setting instanceof EnumSetting<?>) {
settingJson.add(setting.getConfigName(), new JsonPrimitive(((EnumSetting<?>) setting).getValueIndex()));
} else if (setting instanceof KeybindSetting) {
settingJson.add(setting.getConfigName(), new JsonPrimitive(((KeybindSetting) setting).getValue()));
} else if (setting instanceof StringSetting) {
settingJson.add(setting.getConfigName(), new JsonPrimitive(((StringSetting) setting).getValue()));
}
} catch (NullPointerException ignored) {
}
return settingJson;
}

private void loadModules() {
String modulesJsonString = null;
try {
modulesJsonString = FileHelper.getInstance().readFromFile("modules.json");
} catch (IOException e) {
ChatLogger.error("Couldn't read file modules.json!");
return;
}
JsonObject modulesJson = JsonParser.parseString(modulesJsonString).getAsJsonObject();

for (String key : modulesJson.keySet()) {
Module module = Category.getModule(key);
if (module == null) {
continue;
}

JsonObject value = modulesJson.getAsJsonObject(key);

if (value.get("enabled").getAsBoolean() && module.isEnabled() != null) {
module.isEnabled().toggle();
}

if (value.has("settings")) {
JsonObject settings = value.getAsJsonObject("settings");

JsonObject subSettings = null;

if (settings.has("subSettings")) {
subSettings = settings.getAsJsonObject("subSettings");
}

for (String settingKey : settings.keySet()) {
Setting<?> setting = module.getSetting(settingKey);
if (setting != null) {
setSettingValue(setting, settings.get(settingKey));
if (subSettings != null) {
for (String subSettingKey : subSettings.keySet()) {
Setting<?> subSetting = setting.getSubSettingsInstances().stream()
.filter(subSettingInstance -> subSettingInstance.getConfigName().equals(subSettingKey))
.findFirst()
.orElse(null);
if (subSetting != null) {
setSettingValue(subSetting, subSettings.get(subSettingKey));
}
}
}
}
}
}
}
}

private void setSettingValue(Setting<?> setting, JsonElement value) {
if (setting instanceof BooleanSetting) {
((BooleanSetting) setting).setValue(value.getAsBoolean());
} else if (setting instanceof IntegerSetting) {
((IntegerSetting) setting).setValue(value.getAsInt());
} else if (setting instanceof DoubleSetting) {
((DoubleSetting) setting).setValue(value.getAsDouble());
} else if (setting instanceof ColorSetting) {
((ColorSetting) setting).setValue(new Color(value.getAsInt()));
} else if (setting instanceof EnumSetting<?>) {
((EnumSetting<?>) setting).setValueIndex(value.getAsInt());
} else if (setting instanceof KeybindSetting) {
((KeybindSetting) setting).setValue(value.getAsInt());
} else if (setting instanceof StringSetting) {
((StringSetting) setting).setValue(value.getAsString());
}
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
package me.leeeaf.oakclient.systems.commands.commands;

import me.leeeaf.oakclient.OakClientClient;
import me.leeeaf.oakclient.systems.commands.Command;
import me.leeeaf.oakclient.utils.io.ChatLogger;
import net.minecraft.text.Text;

import static me.leeeaf.oakclient.OakClientClient.mc;
import static me.leeeaf.oakclient.OakClient.mc;

public class FOVCommand extends Command {
public FOVCommand() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import me.leeeaf.oakclient.systems.commands.CommandRegistry;
import net.minecraft.text.Text;

import static me.leeeaf.oakclient.OakClientClient.mc;
import static me.leeeaf.oakclient.OakClient.mc;

public class HelpCommand extends Command {
public HelpCommand() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import me.leeeaf.oakclient.systems.commands.Command;

import static me.leeeaf.oakclient.OakClientClient.mc;
import static me.leeeaf.oakclient.OakClient.mc;

public class ReloadCommand extends Command {
public ReloadCommand() {
Expand Down
Loading