mirror of
https://codeberg.org/moonleay/Gimbal.git
synced 2025-07-06 23:25:46 +02:00
feat!: added Gimble Server side check, reworked mode & modifier checks
Signed-off-by: moonleay <contact@moonleay.net>
This commit is contained in:
parent
724618a052
commit
acd318c5f1
26 changed files with 305 additions and 116 deletions
|
@ -2,7 +2,7 @@ package net.moonleay.gimble.mixin;
|
|||
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.moonleay.gimble.client.editor.ClientEditor;
|
||||
import net.moonleay.gimble.editor.state.mode.ModeModifier;
|
||||
import net.moonleay.gimble.editor.state.mode.Capability;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
|
@ -17,7 +17,7 @@ public abstract class BulldozerMixin {
|
|||
|
||||
@Inject(method = "doAttack", at = @At(value = "HEAD"))
|
||||
private void func(CallbackInfoReturnable<Boolean> cir) {
|
||||
if (!ClientEditor.INSTANCE.containsModifier(ModeModifier.BULLDOZER)){
|
||||
if (!ClientEditor.INSTANCE.shouldClient(Capability.BULLDOZER)) {
|
||||
return;
|
||||
}
|
||||
this.attackCooldown = 0;
|
||||
|
@ -25,7 +25,7 @@ public abstract class BulldozerMixin {
|
|||
|
||||
@Inject(method = "handleBlockBreaking", at = @At(value = "HEAD"))
|
||||
private void func2(boolean breaking, CallbackInfo ci) {
|
||||
if (!ClientEditor.INSTANCE.containsModifier(ModeModifier.BULLDOZER) || !breaking){
|
||||
if (!ClientEditor.INSTANCE.shouldClient(Capability.BULLDOZER) || !breaking) {
|
||||
return;
|
||||
}
|
||||
this.attackCooldown = 0;
|
||||
|
|
|
@ -4,7 +4,7 @@ import net.minecraft.client.network.ClientPlayerInteractionManager;
|
|||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Direction;
|
||||
import net.moonleay.gimble.client.editor.ClientEditor;
|
||||
import net.moonleay.gimble.editor.state.mode.ModeModifier;
|
||||
import net.moonleay.gimble.editor.state.mode.Capability;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
|
@ -18,7 +18,7 @@ public class BulldozerMixin2 {
|
|||
|
||||
@Inject(method = "updateBlockBreakingProgress", at = @At("HEAD"))
|
||||
private void func(BlockPos pos, Direction direction, CallbackInfoReturnable<Boolean> cir) {
|
||||
if (!ClientEditor.INSTANCE.containsModifier(ModeModifier.BULLDOZER)) {
|
||||
if (!ClientEditor.INSTANCE.shouldClient(Capability.BULLDOZER)) {
|
||||
return;
|
||||
}
|
||||
this.blockBreakingCooldown = 0;
|
||||
|
|
|
@ -1,16 +1,17 @@
|
|||
package net.moonleay.gimble.mixin;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.BlockItem;
|
||||
import net.minecraft.item.ItemPlacementContext;
|
||||
import net.moonleay.gimble.editor.ServerEditorManager;
|
||||
import net.moonleay.gimble.editor.state.mode.ModeModifier;
|
||||
import net.moonleay.gimble.editor.state.mode.Capability;
|
||||
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 java.util.UUID;
|
||||
|
||||
@Mixin(BlockItem.class)
|
||||
public class ForcePlaceMixin {
|
||||
|
||||
|
@ -19,9 +20,9 @@ public class ForcePlaceMixin {
|
|||
if (context.getPlayer() == null) {
|
||||
return;
|
||||
}
|
||||
PlayerEntity player = context.getPlayer();
|
||||
UUID id = context.getPlayer().getGameProfile().getId();
|
||||
|
||||
if (!ServerEditorManager.INSTANCE.playerHasModifier(player.getGameProfile().getId(), ModeModifier.FORCE_PLACE)) {
|
||||
if (!ServerEditorManager.INSTANCE.shouldPlayer(id, Capability.FORCE_PLACE)) {
|
||||
return;
|
||||
}
|
||||
cir.setReturnValue(true);
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
package net.moonleay.gimble.mixin;
|
||||
|
||||
import net.minecraft.client.gui.screen.DownloadingTerrainScreen;
|
||||
import net.moonleay.gimble.client.editor.ClientEditor;
|
||||
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(DownloadingTerrainScreen.class)
|
||||
public class GimblePolicyCheckMixin {
|
||||
|
||||
|
||||
@Inject(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/DownloadingTerrainScreen;close()V", ordinal = -1))
|
||||
private void func(CallbackInfo ci) {
|
||||
ClientEditor.INSTANCE.onConnectedToNewWorld();
|
||||
}
|
||||
}
|
|
@ -4,21 +4,14 @@ import net.minecraft.client.MinecraftClient;
|
|||
import net.minecraft.client.font.TextRenderer;
|
||||
import net.minecraft.client.gui.hud.InGameHud;
|
||||
import net.minecraft.client.util.math.MatrixStack;
|
||||
import net.minecraft.text.Text;
|
||||
import net.moonleay.gimble.client.editor.ClientEditor;
|
||||
import net.moonleay.gimble.editor.state.mode.Mode;
|
||||
import net.moonleay.gimble.editor.state.mode.ModeModifier;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.spongepowered.asm.mixin.Final;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
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;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Mixin(InGameHud.class)
|
||||
public class HudMixin {
|
||||
|
||||
|
@ -26,41 +19,10 @@ public class HudMixin {
|
|||
|
||||
@Inject(method = "renderStatusEffectOverlay", at = @At("HEAD"))
|
||||
private void render(MatrixStack matrices, CallbackInfo ci) {
|
||||
Mode currentMode = ClientEditor.INSTANCE.getCurrentMode();
|
||||
StringBuilder displayText = getStringBuilder(currentMode);
|
||||
|
||||
MinecraftClient mc = MinecraftClient.getInstance();
|
||||
TextRenderer tr = mc.textRenderer;
|
||||
// int screenWidth = mc.getWindow().getWidth();
|
||||
// int screenHeight = mc.getWindow().getHeight();
|
||||
// int scale = (mc.options.getGuiScale().getValue() == 0 ? 1 : mc.options.getGuiScale().getValue());
|
||||
// int bottomY = screenHeight / scale - 4 - tr.fontHeight - 12;
|
||||
|
||||
TextRenderer tr = this.client.textRenderer;
|
||||
tr.drawWithShadow(matrices,
|
||||
Text.of(displayText.toString()),
|
||||
ClientEditor.INSTANCE.getModeDisplayText(),
|
||||
4, 4,
|
||||
currentMode.getColor());
|
||||
}
|
||||
|
||||
@Unique
|
||||
private static @NotNull StringBuilder getStringBuilder(Mode currentMode) {
|
||||
List<ModeModifier> currentModifier = ClientEditor.INSTANCE.getCurrentModifier();
|
||||
StringBuilder displayText = new StringBuilder(currentMode.getDisplayName());
|
||||
if (!currentModifier.isEmpty()) {
|
||||
displayText.append(" [");
|
||||
for (int i = 0; i < currentModifier.size(); i++) {
|
||||
displayText.append(currentModifier.get(i).getDisplayName());
|
||||
if (i != currentModifier.size() - 1) {
|
||||
displayText.append(", ");
|
||||
}
|
||||
}
|
||||
displayText.append("]");
|
||||
}
|
||||
return displayText;
|
||||
}
|
||||
|
||||
@Unique
|
||||
private int getXRight(String txt, int screenWidth) {
|
||||
return screenWidth / (MinecraftClient.getInstance().options.getGuiScale().getValue() == 0 ? 1 : MinecraftClient.getInstance().options.getGuiScale().getValue()) - 4 - MinecraftClient.getInstance().textRenderer.getWidth(Text.of(txt));
|
||||
ClientEditor.INSTANCE.getCurrentColor());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,16 +2,17 @@ package net.moonleay.gimble.mixin;
|
|||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.BlockItem;
|
||||
import net.minecraft.item.ItemPlacementContext;
|
||||
import net.moonleay.gimble.editor.ServerEditorManager;
|
||||
import net.moonleay.gimble.editor.state.mode.ModeModifier;
|
||||
import net.moonleay.gimble.editor.state.mode.Capability;
|
||||
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 java.util.UUID;
|
||||
|
||||
@Mixin(BlockItem.class)
|
||||
public class NoBlockUpdatesMixin {
|
||||
|
||||
|
@ -20,9 +21,9 @@ public class NoBlockUpdatesMixin {
|
|||
if (context.getPlayer() == null) {
|
||||
return;
|
||||
}
|
||||
PlayerEntity player = context.getPlayer();
|
||||
UUID id = context.getPlayer().getGameProfile().getId();
|
||||
|
||||
if (!ServerEditorManager.INSTANCE.playerHasModifier(player.getGameProfile().getId(), ModeModifier.NO_UPDATES)) {
|
||||
if (!ServerEditorManager.INSTANCE.shouldPlayer(id, Capability.NO_UPDATES)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ package net.moonleay.gimble.mixin;
|
|||
|
||||
import net.minecraft.client.render.Camera;
|
||||
import net.moonleay.gimble.client.editor.ClientEditor;
|
||||
import net.moonleay.gimble.editor.state.mode.ModeModifier;
|
||||
import net.moonleay.gimble.editor.state.mode.Capability;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
|
@ -13,9 +13,10 @@ public class NoClipCameraFixMixin {
|
|||
|
||||
@Inject(method = "clipToSpace", at = @At("HEAD"), cancellable = true)
|
||||
private void fixCameraInNoClip(double desiredCameraDistance, CallbackInfoReturnable<Double> cir) {
|
||||
if (ClientEditor.INSTANCE.containsModifier(ModeModifier.NO_CLIP)){
|
||||
cir.setReturnValue(desiredCameraDistance);
|
||||
cir.cancel();
|
||||
if (!ClientEditor.INSTANCE.shouldClient(Capability.NO_CLIP)) {
|
||||
return;
|
||||
}
|
||||
cir.setReturnValue(desiredCameraDistance);
|
||||
cir.cancel();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@ import net.minecraft.entity.player.PlayerAbilities;
|
|||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.world.World;
|
||||
import net.moonleay.gimble.editor.ServerEditorManager;
|
||||
import net.moonleay.gimble.editor.state.mode.ModeModifier;
|
||||
import net.moonleay.gimble.editor.state.mode.Capability;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
|
@ -33,7 +33,7 @@ public abstract class NoClipMixin extends LivingEntity {
|
|||
) private void enoClip(CallbackInfo ci) {
|
||||
UUID uuid = this.getGameProfile().getId();
|
||||
|
||||
if (!ServerEditorManager.INSTANCE.playerHasModifier(uuid, ModeModifier.NO_CLIP)) {
|
||||
if (!ServerEditorManager.INSTANCE.shouldPlayer(uuid, Capability.NO_CLIP)) {
|
||||
return; // NoClip is not enabled
|
||||
}
|
||||
if (!this.getAbilities().flying) {
|
||||
|
@ -47,7 +47,7 @@ public abstract class NoClipMixin extends LivingEntity {
|
|||
private void onUpdatePose(CallbackInfo ci) {
|
||||
UUID uuid = this.getGameProfile().getId();
|
||||
|
||||
if (!ServerEditorManager.INSTANCE.playerHasModifier(uuid, ModeModifier.NO_CLIP))
|
||||
if (!ServerEditorManager.INSTANCE.shouldPlayer(uuid, Capability.NO_CLIP))
|
||||
return; // NoClip is not enabled
|
||||
if (!this.getAbilities().flying)
|
||||
return;
|
||||
|
|
|
@ -2,8 +2,9 @@ package net.moonleay.gimble.mixin;
|
|||
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.client.option.GameOptions;
|
||||
import net.moonleay.gimble.editor.state.mode.Mode;
|
||||
import net.moonleay.gimble.client.editor.ClientEditor;
|
||||
import net.moonleay.gimble.editor.state.mode.Capability;
|
||||
import net.moonleay.gimble.editor.state.mode.Mode;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
|
@ -20,17 +21,17 @@ public class NormalModeMixin {
|
|||
|
||||
@Inject(method = "openPauseMenu", at = @At("HEAD"), cancellable = true)
|
||||
private void setNormalMode(boolean pause, CallbackInfo ci) {
|
||||
if (ClientEditor.INSTANCE.getCURRENT_MODE() != Mode.NORMAL){
|
||||
if (ClientEditor.INSTANCE.isInNonDefaultMode() && ClientEditor.INSTANCE.isAllowed()) {
|
||||
// Set the editor mode to normal
|
||||
ClientEditor.INSTANCE.setCURRENT_MODE(Mode.NORMAL);
|
||||
ClientEditor.INSTANCE.checkForIncompatibleModeModifiers();
|
||||
ClientEditor.INSTANCE.setMode(Mode.NORMAL);
|
||||
ci.cancel();
|
||||
}
|
||||
}
|
||||
|
||||
@Inject(method = "handleInputEvents", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;isUsingItem()Z"), cancellable = true)
|
||||
private void blockWorldManipulation(CallbackInfo ci) { // This could be replaced by net.minecraft.world.GameMode#isBlockBreakingRestricted
|
||||
if (ClientEditor.INSTANCE.getCURRENT_MODE() == Mode.NORMAL || ClientEditor.INSTANCE.getCURRENT_MODE() == Mode.VISUAL) {
|
||||
private void blockWorldManipulation(CallbackInfo ci) {
|
||||
// This could be replaced by net.minecraft.world.GameMode#isBlockBreakingRestricted
|
||||
if (!ClientEditor.INSTANCE.shouldClient(Capability.CAN_INTERACT)) {
|
||||
while(this.options.attackKey.wasPressed()) {
|
||||
}
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@ import net.minecraft.util.hit.HitResult;
|
|||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Direction;
|
||||
import net.moonleay.gimble.client.editor.ClientEditor;
|
||||
import net.moonleay.gimble.editor.state.mode.Mode;
|
||||
import net.moonleay.gimble.editor.state.mode.Capability;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.spongepowered.asm.mixin.Final;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
|
@ -38,7 +38,7 @@ public abstract class ReplaceModeMixin {
|
|||
@Inject(method = "doItemUse", at = @At("HEAD"))
|
||||
private void replaceBlock(CallbackInfo ci) {
|
||||
// Check if should run
|
||||
if (!ClientEditor.INSTANCE.getCURRENT_MODE().equals(Mode.REPLACE))
|
||||
if (!ClientEditor.INSTANCE.shouldClient(Capability.REPLACE))
|
||||
return; // Mode is not REPLACE, ignore
|
||||
MinecraftClient client = MinecraftClient.getInstance();
|
||||
assert this.interactionManager != null;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue