mirror of
https://github.com/CompeyDev/elytra-lock-fabric.git
synced 2024-12-13 05:20:42 +00:00
feat: toggle system & improved locking mechanism
This commit is contained in:
parent
172aa5b876
commit
597ffaf4b1
7 changed files with 72 additions and 41 deletions
|
@ -19,12 +19,9 @@ repositories {
|
||||||
}
|
}
|
||||||
|
|
||||||
loom {
|
loom {
|
||||||
splitEnvironmentSourceSets()
|
|
||||||
|
|
||||||
mods {
|
mods {
|
||||||
"elytra-lock" {
|
"elytra-lock" {
|
||||||
sourceSet sourceSets.main
|
sourceSet sourceSets.main
|
||||||
sourceSet sourceSets.client
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,21 +1,46 @@
|
||||||
package xyz.devcomp.elytralock;
|
package xyz.devcomp.elytralock;
|
||||||
|
|
||||||
|
import org.lwjgl.glfw.GLFW;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import net.fabricmc.api.ClientModInitializer;
|
import net.fabricmc.api.ClientModInitializer;
|
||||||
|
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
|
||||||
|
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
|
||||||
|
import net.fabricmc.fabric.impl.networking.client.ClientPlayNetworkAddon;
|
||||||
|
import net.minecraft.client.MinecraftClient;
|
||||||
|
import net.minecraft.client.network.ClientPlayNetworkHandler;
|
||||||
|
import net.minecraft.client.option.KeyBinding;
|
||||||
|
import net.minecraft.client.util.InputUtil;
|
||||||
|
import net.minecraft.network.message.MessageType;
|
||||||
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
|
import net.minecraft.network.packet.c2s.play.ClickSlotC2SPacket;
|
||||||
|
import net.minecraft.network.packet.c2s.play.SlotChangedStateC2SPacket;
|
||||||
|
|
||||||
public class ElytraLock implements ClientModInitializer {
|
public class ElytraLock implements ClientModInitializer {
|
||||||
public static final Logger LOGGER = LoggerFactory.getLogger("Elytra Lock");
|
public static final Logger LOGGER = LoggerFactory.getLogger("Elytra Lock");
|
||||||
|
private static KeyBinding lockKeybind;
|
||||||
|
private static boolean locked = false;
|
||||||
|
private static MinecraftClient client;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onInitializeClient() {
|
public void onInitializeClient() {
|
||||||
// This entrypoint is suitable for setting up client-specific logic, such as rendering.
|
lockKeybind = KeyBindingHelper.registerKeyBinding(
|
||||||
|
new KeyBinding("key.elytralock.lock", InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_J, "category.elytralock"));
|
||||||
|
client = MinecraftClient.getInstance();
|
||||||
|
|
||||||
LOGGER.info("Elytra lock initializing!");
|
LOGGER.info("Elytra lock initializing!");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isLocked() {
|
public static boolean isLocked() {
|
||||||
// TODO: Load from config
|
if (lockKeybind.wasPressed()) {
|
||||||
return true;
|
locked = !locked;
|
||||||
|
}
|
||||||
|
|
||||||
|
client.inGameHud.getChatHud().addMessage(Text.translatable("elytralock.chat.lockedMessage"));
|
||||||
|
|
||||||
|
return locked;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
package xyz.devcomp.elytralock.mixin;
|
||||||
|
|
||||||
|
import xyz.devcomp.elytralock.ElytraLock;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.mutable.MutableObject;
|
||||||
|
|
||||||
|
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.CallbackInfoReturnable;
|
||||||
|
|
||||||
|
import com.llamalad7.mixinextras.sugar.Local;
|
||||||
|
|
||||||
|
import net.fabricmc.api.EnvType;
|
||||||
|
import net.fabricmc.api.Environment;
|
||||||
|
import net.minecraft.client.network.ClientPlayerInteractionManager;
|
||||||
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.item.Items;
|
||||||
|
import net.minecraft.util.ActionResult;
|
||||||
|
import net.minecraft.util.Hand;
|
||||||
|
|
||||||
|
@Environment(EnvType.CLIENT)
|
||||||
|
@Mixin(ClientPlayerInteractionManager.class)
|
||||||
|
public class ClientPlayerInteractionManagerMixin {
|
||||||
|
@Inject(method = "interactItem(Lnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/util/Hand;)Lnet/minecraft/util/ActionResult;", at = @At(value = "INVOKE", target = "net/minecraft/client/network/ClientPlayerInteractionManager.sendSequencedPacket (Lnet/minecraft/client/world/ClientWorld;Lnet/minecraft/client/network/SequencedPacketCreator;)V"), cancellable = true)
|
||||||
|
private void skipElytra(PlayerEntity player, Hand hand, CallbackInfoReturnable<ActionResult> info, @Local MutableObject<ActionResult> mutableObject) {
|
||||||
|
ItemStack itemStack = player.getStackInHand(hand);
|
||||||
|
if (itemStack.isOf(Items.ELYTRA) && ElytraLock.isLocked()) {
|
||||||
|
mutableObject.setValue(ActionResult.FAIL);
|
||||||
|
info.setReturnValue((ActionResult) mutableObject.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,30 +0,0 @@
|
||||||
package xyz.devcomp.elytralock.mixin;
|
|
||||||
|
|
||||||
import xyz.devcomp.elytralock.ElytraLock;
|
|
||||||
|
|
||||||
import net.fabricmc.api.EnvType;
|
|
||||||
import net.fabricmc.api.Environment;
|
|
||||||
|
|
||||||
import net.minecraft.item.Equipment;
|
|
||||||
import net.minecraft.item.ItemStack;
|
|
||||||
import net.minecraft.item.Items;
|
|
||||||
import net.minecraft.util.TypedActionResult;
|
|
||||||
|
|
||||||
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.CallbackInfoReturnable;
|
|
||||||
|
|
||||||
import com.llamalad7.mixinextras.sugar.Local;
|
|
||||||
|
|
||||||
@Mixin(Equipment.class)
|
|
||||||
@Environment(EnvType.CLIENT)
|
|
||||||
public interface EquipmentMixin {
|
|
||||||
@Inject(method = "equipAndSwap(Lnet/minecraft/item/Item;Lnet/minecraft/world/World;Lnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/util/Hand;)Lnet/minecraft/util/TypedActionResult;", at = @At(value = "INVOKE_ASSIGN", target = "net/minecraft/entity/player/PlayerEntity.getStackInHand (Lnet/minecraft/util/Hand;)Lnet/minecraft/item/ItemStack;"), cancellable = true)
|
|
||||||
private void injected(CallbackInfoReturnable<TypedActionResult<ItemStack>> info,
|
|
||||||
@Local(ordinal = 0) ItemStack itemStack) {
|
|
||||||
if (itemStack.isOf(Items.ELYTRA) && ElytraLock.isLocked()) {
|
|
||||||
info.setReturnValue(TypedActionResult.fail(itemStack));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
5
src/main/resources/assets/lang/en_us.json
Normal file
5
src/main/resources/assets/lang/en_us.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"category.elytralock": "Elytra Lock Keybinds",
|
||||||
|
"key.elytralock.lock": "Lock elytra",
|
||||||
|
"elytralock.chat.lockedMessage": "[elytra-lock] Elytra is locked!"
|
||||||
|
}
|
|
@ -3,7 +3,7 @@
|
||||||
"package": "xyz.devcomp.elytralock.mixin",
|
"package": "xyz.devcomp.elytralock.mixin",
|
||||||
"compatibilityLevel": "JAVA_17",
|
"compatibilityLevel": "JAVA_17",
|
||||||
"mixins": [
|
"mixins": [
|
||||||
"EquipmentMixin"
|
"ClientPlayerInteractionManagerMixin"
|
||||||
],
|
],
|
||||||
"injectors": {
|
"injectors": {
|
||||||
"defaultRequire": 1
|
"defaultRequire": 1
|
||||||
|
|
|
@ -3,13 +3,13 @@
|
||||||
"id": "elytra-lock",
|
"id": "elytra-lock",
|
||||||
"version": "${version}",
|
"version": "${version}",
|
||||||
"name": "elytra-lock",
|
"name": "elytra-lock",
|
||||||
"description": "This is an example description! Tell everyone what your mod is about!",
|
"description": "A simple mod which registers a keybind to lock your elytra from usage when not required.",
|
||||||
"authors": [
|
"authors": [
|
||||||
"Me!"
|
"CompeyDev <hi@devcomp.xyz>"
|
||||||
],
|
],
|
||||||
"contact": {
|
"contact": {
|
||||||
"homepage": "https://fabricmc.net/",
|
"homepage": "https://fabricmc.net/",
|
||||||
"sources": "https://github.com/FabricMC/fabric-example-mod"
|
"sources": "https://github.com/CompeyDev/elytra-lock"
|
||||||
},
|
},
|
||||||
"license": "CC0-1.0",
|
"license": "CC0-1.0",
|
||||||
"icon": "assets/elytra-lock/icon.png",
|
"icon": "assets/elytra-lock/icon.png",
|
||||||
|
|
Loading…
Reference in a new issue