6 Commits
V1.1 ... V1.2.4

Author SHA1 Message Date
d9e2b00679 properly rename mod 2024-07-15 23:42:31 +02:00
677a82142f fix some bugs 2024-07-15 23:28:53 +02:00
4a84587f71 dumbass didnt test his mod 2024-07-15 23:11:12 +02:00
f8dabec863 better config handling 2024-07-15 23:05:31 +02:00
1a521a0e1d Update version (i forgor) 2024-07-15 09:35:14 +02:00
6ab4519093 V1.2 2024-07-15 09:28:55 +02:00
13 changed files with 227 additions and 71 deletions

View File

@ -8,9 +8,9 @@ org.gradle.jvmargs=-Xmx1G
loader_version=0.16.0
# Mod Properties
mod_version = 1.1
mod_version = 1.2.4
maven_group = com.kasetoatz
archives_base_name = RiptideHacks
archives_base_name = TridentHacks
# Dependencies
# check this on https://modmuss50.me/fabric.html

View File

@ -1,26 +0,0 @@
package com.kasetoatz.riptidehacks.mixin;
import com.kasetoatz.riptidehacks.RiptideHacks;
import net.minecraft.entity.LivingEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.item.TridentItem;
import net.minecraft.sound.SoundCategory;
import net.minecraft.sound.SoundEvents;
import net.minecraft.world.World;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(TridentItem.class)
public class TridentItemMixin {
@Inject(method="onStoppedUsing", at=@At("HEAD"))
private void onStoppedUsing(ItemStack stack, World world, LivingEntity user, int remainingUseTicks, CallbackInfo ci)
{
if (RiptideHacks.toggled && user == RiptideHacks.client.player && user.getItemUseTime() > 10)
{
world.playSoundFromEntity(user, SoundEvents.ITEM_TRIDENT_RIPTIDE_3.value(), SoundCategory.AMBIENT, 1.f, 1.f);
RiptideHacks.setLastTridentUse();
}
}
}

View File

@ -1,30 +1,38 @@
package com.kasetoatz.riptidehacks;
package com.kasetoatz.tridenthacks;
import com.kasetoatz.tridenthacks.config.Config;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.option.KeyBinding;
import net.minecraft.client.util.InputUtil;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.item.Items;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
import org.lwjgl.glfw.GLFW;
public class RiptideHacks implements ClientModInitializer {
import java.util.HashMap;
public class TridentHacks implements ClientModInitializer {
public static MinecraftClient client;
public static boolean toggled = false;
public static boolean onGround = true;
public static boolean riptideConditions = false;
public static boolean hasRiptide = false;
public static int tridentSlot = -1;
private static KeyBinding keyBinding;
private static long lastTridentUse = 0;
public static long lastTridentUse = 0;
@Override
public void onInitializeClient() {
Config.load();
client = MinecraftClient.getInstance();
keyBinding = KeyBindingHelper.registerKeyBinding(new KeyBinding("Toggle Riptide", InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_RIGHT_ALT, "RiptideHacks"));
ClientTickEvents.END_CLIENT_TICK.register(client -> {
while (keyBinding.wasPressed()) {
toggled = !toggled;
client.inGameHud.setOverlayMessage(Text.literal("Riptide ").append((toggled) ? Text.literal("ON").styled((style -> style.withColor(Formatting.GREEN))) : Text.literal("OFF").styled((style -> style.withColor(Formatting.RED)))), false);
Config.toggleRiptide = !Config.toggleRiptide;
Config.save();
client.inGameHud.setOverlayMessage(Text.of(Config.toggleRiptide ? Config.riptideOnMessage : Config.riptideOffMessage), false);
}
if (!onGround && client.player != null && client.player.isOnGround())
{
@ -33,14 +41,8 @@ public class RiptideHacks implements ClientModInitializer {
});
}
public static void setLastTridentUse()
public static boolean noNormalRiptide()
{
lastTridentUse = System.currentTimeMillis();
onGround = false;
}
public static boolean shouldAnimate()
{
return lastTridentUse > System.currentTimeMillis() - 1000;
return client.player == null || !riptideConditions || client.player.getActiveItem().getItem() != Items.TRIDENT || !hasRiptide;
}
}

View File

@ -0,0 +1,80 @@
package com.kasetoatz.tridenthacks.config;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import com.google.gson.Gson;
import com.kasetoatz.tridenthacks.TridentHacks;
import net.minecraft.client.MinecraftClient;
import net.minecraft.util.crash.CrashException;
import net.minecraft.util.crash.CrashReport;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Config {
public static boolean toggleRiptide = true;
public static boolean noFallDamage = true;
public static boolean returnToSameSlot = true;
public static String riptideOnMessage = "Riptide §aON";
public static String riptideOffMessage = "Riptide §cOFF";
private static final File file = new File(MinecraftClient.getInstance().runDirectory, "config/tridenthacks.json");
private static final Gson gson = new GsonBuilder().setPrettyPrinting().create();
public static void load() {
if (!file.exists())
{
save();
return;
}
try (FileReader reader = new FileReader(file))
{
JsonObject json = gson.fromJson(reader, JsonObject.class);
if (json.has("toggleRiptide"))
{
toggleRiptide = json.get("toggleRiptide").getAsBoolean();
}
if (json.has("noFallDamage"))
{
noFallDamage = json.get("noFallDamage").getAsBoolean();
}
if (json.has("returnToSameSlot"))
{
returnToSameSlot = json.get("returnToSameSlot").getAsBoolean();
}
if (json.has("riptideOnMessage"))
{
riptideOnMessage = json.get("riptideOnMessage").getAsString();
}
if (json.has("riptideOffMessage"))
{
riptideOffMessage = json.get("riptideOffMessage").getAsString();
}
save();
}
catch (IOException exc)
{
throw new CrashException(CrashReport.create(exc, "Loading config file."));
}
}
public static void save()
{
JsonObject json = new JsonObject();
json.addProperty("toggleRiptide", toggleRiptide);
json.addProperty("noFallDamage", noFallDamage);
json.addProperty("returnToSameSlot", returnToSameSlot);
json.addProperty("riptideOnMessage", riptideOnMessage);
json.addProperty("riptideOffMessage", riptideOffMessage);
try (FileWriter writer = new FileWriter(file))
{
gson.toJson(json, writer);
}
catch (IOException exc)
{
throw new CrashException(CrashReport.create(exc, "Saving config file."));
}
}
}

View File

@ -1,6 +1,7 @@
package com.kasetoatz.riptidehacks.mixin;
package com.kasetoatz.tridenthacks.mixin;
import com.kasetoatz.riptidehacks.RiptideHacks;
import com.kasetoatz.tridenthacks.config.Config;
import com.kasetoatz.tridenthacks.TridentHacks;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.item.Items;
import net.minecraft.network.ClientConnection;
@ -17,16 +18,16 @@ public abstract class ClientConnectionMixin {
@Inject(method="send*", at=@At("HEAD"), cancellable = true)
private void send(Packet<?> packet, CallbackInfo ci)
{
if (RiptideHacks.toggled)
if (Config.toggleRiptide)
{
ClientPlayerEntity player = RiptideHacks.client.player;
ClientPlayerEntity player = TridentHacks.client.player;
if (player != null)
{
if (packet instanceof PlayerActionC2SPacket && player.getActiveItem().getItem() == Items.TRIDENT)
if (player.getActiveItem().getItem() == Items.TRIDENT && player.isUsingItem() && packet instanceof PlayerActionC2SPacket && TridentHacks.noNormalRiptide() && ((PlayerActionC2SPacket)packet).getAction() == PlayerActionC2SPacket.Action.RELEASE_USE_ITEM)
{
ci.cancel();
}
else if (packet instanceof PlayerMoveC2SPacket && !RiptideHacks.onGround)
else if (Config.noFallDamage && packet instanceof PlayerMoveC2SPacket && !TridentHacks.onGround && !player.isFallFlying())
{
((PlayerMoveC2SPacketMixin)packet).setOnGround(true);
}

View File

@ -1,6 +1,7 @@
package com.kasetoatz.riptidehacks.mixin;
package com.kasetoatz.tridenthacks.mixin;
import com.kasetoatz.riptidehacks.RiptideHacks;
import com.kasetoatz.tridenthacks.config.Config;
import com.kasetoatz.tridenthacks.TridentHacks;
import net.minecraft.enchantment.EnchantmentHelper;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
@ -9,11 +10,12 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(EnchantmentHelper.class)
public abstract class EnchantmentHelperMixin {
@Inject(method="getTridentSpinAttackStrength", at=@At("HEAD"), cancellable = true)
@Inject(method="getTridentSpinAttackStrength", at=@At("RETURN"), cancellable = true)
private static void getTridentSpinAttackStrength(CallbackInfoReturnable<Float> cir)
{
if (RiptideHacks.toggled)
if (Config.toggleRiptide)
{
TridentHacks.hasRiptide = cir.getReturnValue() > 0.0f;
cir.setReturnValue(3.f);
}
}

View File

@ -1,6 +1,7 @@
package com.kasetoatz.riptidehacks.mixin;
package com.kasetoatz.tridenthacks.mixin;
import com.kasetoatz.riptidehacks.RiptideHacks;
import com.kasetoatz.tridenthacks.config.Config;
import com.kasetoatz.tridenthacks.TridentHacks;
import net.minecraft.entity.Entity;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
@ -9,13 +10,14 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(Entity.class)
public abstract class EntityMixin {
@Inject(method="isTouchingWaterOrRain", at=@At("HEAD"), cancellable = true)
@Inject(method="isTouchingWaterOrRain", at=@At("RETURN"), cancellable = true)
private void isTouchingWaterOrRain(CallbackInfoReturnable<Boolean> cir)
{
if (RiptideHacks.toggled)
if (Config.toggleRiptide)
{
if (((Entity)(Object)this) == RiptideHacks.client.player)
if (((Entity)(Object)this) == TridentHacks.client.player)
{
TridentHacks.riptideConditions = cir.getReturnValue();
cir.setReturnValue(true);
}
}

View File

@ -1,6 +1,7 @@
package com.kasetoatz.riptidehacks.mixin;
package com.kasetoatz.tridenthacks.mixin;
import com.kasetoatz.riptidehacks.RiptideHacks;
import com.kasetoatz.tridenthacks.config.Config;
import com.kasetoatz.tridenthacks.TridentHacks;
import net.minecraft.entity.LivingEntity;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
@ -13,9 +14,9 @@ public abstract class LivingEntityMixin {
private void isUsingRiptide(CallbackInfoReturnable<Boolean> cir)
{
LivingEntity entity = (LivingEntity)(Object)this;
if (RiptideHacks.toggled && RiptideHacks.shouldAnimate())
if (Config.toggleRiptide && TridentHacks.noNormalRiptide() && TridentHacks.lastTridentUse > System.currentTimeMillis() - 1000)
{
if (entity == RiptideHacks.client.player)
if (entity == TridentHacks.client.player)
{
cir.setReturnValue(true);
}

View File

@ -0,0 +1,46 @@
package com.kasetoatz.tridenthacks.mixin;
import com.kasetoatz.tridenthacks.TridentHacks;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.client.network.ClientPlayerInteractionManager;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.screen.slot.SlotActionType;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(PlayerInventory.class)
public abstract class PlayerInventoryMixin {
@Inject(method="setStack", at=@At("HEAD"))
public void setStack(int slot, ItemStack stack, CallbackInfo ci)
{
int tridentSlot = TridentHacks.tridentSlot;
if (tridentSlot != -1)
{
ClientPlayerEntity player = TridentHacks.client.player;
ClientPlayerInteractionManager interactionManager = TridentHacks.client.interactionManager;
if (!stack.isEmpty() && stack.getItem() == Items.TRIDENT && player != null && interactionManager != null)
{
if (player.getInventory().getStack(TridentHacks.tridentSlot).isEmpty())
{
interactionManager.clickSlot(player.playerScreenHandler.syncId, this.getSlotID(slot), 0, SlotActionType.PICKUP, player);
interactionManager.clickSlot(player.playerScreenHandler.syncId, this.getSlotID(TridentHacks.tridentSlot), 0, SlotActionType.PICKUP, player);
if (TridentHacks.tridentSlot == tridentSlot)
{
TridentHacks.tridentSlot = -1;
}
}
}
}
}
@Unique
private int getSlotID(int index)
{
return (index == PlayerInventory.OFF_HAND_SLOT) ? 45 : (index < PlayerInventory.getHotbarSize()) ? index + PlayerInventory.MAIN_SIZE : index;
}
}

View File

@ -1,4 +1,4 @@
package com.kasetoatz.riptidehacks.mixin;
package com.kasetoatz.tridenthacks.mixin;
import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket;
import org.spongepowered.asm.mixin.Mixin;

View File

@ -0,0 +1,47 @@
package com.kasetoatz.tridenthacks.mixin;
import com.kasetoatz.tridenthacks.config.Config;
import com.kasetoatz.tridenthacks.TridentHacks;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.item.TridentItem;
import net.minecraft.sound.SoundCategory;
import net.minecraft.sound.SoundEvents;
import net.minecraft.world.World;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(TridentItem.class)
public class TridentItemMixin {
@Inject(method="onStoppedUsing", at=@At("HEAD"))
private void onStoppedUsing(ItemStack stack, World world, LivingEntity user, int remainingUseTicks, CallbackInfo ci)
{
if (Config.toggleRiptide)
{
PlayerEntity player = TridentHacks.client.player;
if (user == player && user.getItemUseTime() > 10)
{
if (TridentHacks.noNormalRiptide())
{
world.playSoundFromEntity(player, SoundEvents.ITEM_TRIDENT_RIPTIDE_3.value(), SoundCategory.PLAYERS, 1.F, 1.F);
TridentHacks.lastTridentUse = System.currentTimeMillis();
}
TridentHacks.onGround = false;
}
}
else if (Config.returnToSameSlot && !TridentHacks.hasRiptide)
{
PlayerEntity player = TridentHacks.client.player;
if (player != null)
{
TridentHacks.tridentSlot = (user.getOffHandStack() == stack) ? PlayerInventory.OFF_HAND_SLOT : player.getInventory().selectedSlot;
}
}
}
}

View File

@ -1,23 +1,23 @@
{
"schemaVersion": 1,
"id": "riptidehacks",
"id": "tridenthacks",
"version": "${version}",
"name": "RiptideHacks",
"name": "TridentHacks",
"description": "",
"authors": [],
"contact": {
"repo": "https://github.com/KaseToatz1337/RiptideHacks"
"repo": "https://github.com/KaseToatz1337/TridentHacks"
},
"license": "MIT",
"environment": "*",
"entrypoints": {
"client": [
"com.kasetoatz.riptidehacks.RiptideHacks"
"com.kasetoatz.tridenthacks.TridentHacks"
],
"main": []
},
"mixins": [
"riptidehacks.mixins.json"
"tridenthacks.mixins.json"
],
"depends": {
"fabricloader": ">=${loader_version}",

View File

@ -1,16 +1,17 @@
{
"required": true,
"minVersion": "0.8",
"package": "com.kasetoatz.riptidehacks.mixin",
"package": "com.kasetoatz.tridenthacks.mixin",
"compatibilityLevel": "JAVA_21",
"mixins": [],
"client": [
"ClientConnectionMixin",
"EnchantmentHelperMixin",
"EntityMixin",
"LivingEntityMixin",
"PlayerInventoryMixin",
"PlayerMoveC2SPacketMixin",
"TridentItemMixin",
"ClientConnectionMixin"
"TridentItemMixin"
],
"injectors": {
"defaultRequire": 1