Skip to content
Closed
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
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,17 @@ private static OptionPage createPage() {
.build())
.build();

return new OptionPage(id("options"), TextComponent.translatable("sarcio.options.pages.sarcio"), List.of(memory));
OptionGroup tweaks = OptionGroup.createBuilder()
.setId(id("tweaks"))
.add(OptionImpl.createBuilder(boolean.class, INSTANCE)
.setId(id("long_chat"))
.setControl(TickBoxControl::new)
.setBinding((config, value) -> config.longChat = value,
config -> config.longChat)
.build())
.build();

return new OptionPage(id("options"), TextComponent.translatable("sarcio.options.pages.sarcio"), List.of(memory, tweaks));
}

private static <T> OptionIdentifier<T> id(String path) {
Expand Down
1 change: 1 addition & 0 deletions src/main/java/dev/rdh/sarcio/SarcioConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ public final class SarcioConfig {

public boolean releaseCrashReserve;
public boolean disableRealms;
public boolean longChat = true;

public static SarcioConfig load() {
if (Files.isRegularFile(PATH)) {
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/dev/rdh/sarcio/SarcioMod.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package dev.rdh.sarcio;

import dev.rdh.sarcio.util.LongChatDetector;
import it.unimi.dsi.fastutil.bytes.ByteArrays;
import net.fabricmc.api.ModInitializer;

Expand Down Expand Up @@ -35,4 +36,8 @@ public void onInitialize() {
}
}
}

public static int chatLimit() {
return CONFIG.longChat && (Minecraft.getInstance().isIntegratedServerRunning() || LongChatDetector.supported()) ? 256 : 100;
}
}
2 changes: 1 addition & 1 deletion src/main/java/dev/rdh/sarcio/mixin/SarcioMixinPlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public void preApply(String targetClassName, ClassNode targetClass, String mixin

@Override
public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {
if (mixinClassName.endsWith("core.LazyLoadBaseMixin")) {
if (mixinClassName.endsWith("core.LazySupplierMixin")) {
Asm.asmLazyLoadBase(targetClass);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package dev.rdh.sarcio.mixin.allocation_rate.world;

import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import java.util.List;
import java.util.Set;
import net.minecraft.client.Minecraft;
Expand Down Expand Up @@ -102,4 +104,12 @@ private int activeChunkPlayerCount(List<PlayerEntity> players) {
private Object useLocalPlayer(List<PlayerEntity> players, int index) {
return this.isClient ? Minecraft.getInstance().player : players.get(index);
}

@WrapOperation(
method = "tickEntity(Lnet/minecraft/entity/Entity;Z)V",
at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;isAreaLoaded(IIIIIIZ)Z")
)
private boolean skipClientAreaCheck(World world, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, boolean allowEmpty, Operation<Boolean> original) {
return this.isClient || original.call(world, minX, minY, minZ, maxX, maxY, maxZ, allowEmpty);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package dev.rdh.sarcio.mixin.bugfix;

import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import java.util.Locale;
import java.util.Map;
import net.minecraft.server.command.handler.CommandRegistry;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;

@Mixin(CommandRegistry.class)
public class CommandRegistryMixin {
@WrapOperation(
method = {"run(Lnet/minecraft/server/command/source/CommandSource;Ljava/lang/String;)I", "getSuggestions"},
at = @At(value = "INVOKE", target = "Ljava/util/Map;get(Ljava/lang/Object;)Ljava/lang/Object;")
)
private Object sarcio$ignoreCommandCase(Map<?, ?> commands, Object name, Operation<Object> original) {
Object command = original.call(commands, name);
return command != null ? command : original.call(commands, ((String) name).toLowerCase(Locale.ROOT));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public class MinecraftMixin {
if (mc.screen == null) {
if (this.options.togglePerspectiveKey.consumeClick()) {
this.options.perspective = (this.options.perspective + 1) % 3;
if (this.options.perspective < 2) {
if (this.options.perspective < 2 && mc.getCamera() != mc.player) {
mc.gameRenderer.updateShader(this.options.perspective == 0 ? mc.getCamera() : null);
}
mc.worldRenderer.onViewChanged();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,11 @@ public abstract class ScoreboardMixin {
private void sarcio$dontThrowOnStaleTeam(String player, Team team, CallbackInfo ci) {
ci.cancel();
}

@Inject(method = "removeMemberFromTeam(Ljava/lang/String;Lnet/minecraft/scoreboard/team/Team;)V", at = @At("HEAD"), cancellable = true)
private void sarcio$dontRemoveFromNullTeam(String player, Team team, CallbackInfo ci) {
if (team == null) {
ci.cancel();
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package dev.rdh.sarcio.mixin.bugfix.gui;

import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
import net.minecraft.text.Text;
import org.spongepowered.asm.mixin.Unique;
import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import net.minecraft.client.gui.screen.Screen;
Expand Down Expand Up @@ -27,4 +30,20 @@ public abstract class BookEditScreenMixin extends Screen {
private void sarcio$drawBackground(int mouseX, int mouseY, float partialTicks, CallbackInfo ci) {
this.renderBackground();
}

@Unique
private Text sarcio$hoveredText;

@WrapWithCondition(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/game/BookEditScreen;renderTextHoverEffect(Lnet/minecraft/text/Text;II)V"))
private boolean sarcio$deferHoverTooltip(BookEditScreen instance, Text text, int x, int y) {
this.sarcio$hoveredText = text;
return false;
}

@Inject(method = "render", at = @At("TAIL"))
private void sarcio$drawHoverTooltipLast(int mouseX, int mouseY, float partialTicks, CallbackInfo ci) {
Text text = this.sarcio$hoveredText;
this.sarcio$hoveredText = null;
this.renderTextHoverEffect(text, mouseX, mouseY);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,19 @@ public class ServerListMixin {
ci.cancel();
}
}

@Inject(method = "swap", at = @At("HEAD"), cancellable = true)
private void sarcio$dontSwapOutOfBounds(int index1, int index2, CallbackInfo ci) {
int size = this.entries.size();
if (index1 < 0 || index1 >= size || index2 < 0 || index2 >= size) {
ci.cancel();
}
}

@Inject(method = "set", at = @At("HEAD"), cancellable = true)
private void sarcio$dontSetOutOfBounds(int index, ServerListEntry entry, CallbackInfo ci) {
if (index < 0 || index >= this.entries.size()) {
ci.cancel();
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package dev.rdh.sarcio.mixin.memory_management.enchantment;

import net.minecraft.entity.damage.DamageSource;
import net.minecraft.item.ItemStack;
import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import dev.rdh.sarcio.util.EnchantmentReferenceCleaner;
Expand Down Expand Up @@ -27,4 +29,13 @@ private static void clearDamageIterator(LivingEntity user, Entity target, Operat
EnchantmentReferenceCleaner.clearDamageIterator();
}
}

@WrapMethod(method = "modifyProtection")
private static int clearProtectionModifier(ItemStack[] armor, DamageSource source, Operation<Integer> original) {
try {
return original.call(armor, source);
} finally {
EnchantmentReferenceCleaner.clearProtectionModifier();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package dev.rdh.sarcio.mixin.memory_management.enchantment;

import dev.rdh.sarcio.util.EnchantmentReferenceCleaner;
import net.minecraft.entity.damage.DamageSource;
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.CallbackInfo;

@Mixin(targets = "net.minecraft.enchantment.EnchantmentHelper$ProtectionModifier")
abstract class ProtectionModifierMixin implements EnchantmentReferenceCleaner.Clearable {
@Shadow public DamageSource source;

@Inject(method = "<init>", at = @At("RETURN"))
private void register(CallbackInfo ci) {
EnchantmentReferenceCleaner.registerProtectionModifier(this);
}

@Override
public void clearReferences() {
this.source = null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package dev.rdh.sarcio.mixin.resourcepacks;

import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import net.minecraft.client.resource.pack.ResourcePacks;
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;

@Mixin(ResourcePacks.class)
public class ResourcePacksMixin {
@Shadow
private List<ResourcePacks.UnopenedPack> availablePacks;

@Unique
private Map<Object, Integer> sarcio$packIndex;

@WrapMethod(method = "reload")
private void sarcio$indexAvailablePacks(Operation<Void> original) {
Map<Object, Integer> index = new HashMap<>();
for (int i = 0; i < this.availablePacks.size(); i++) {
index.putIfAbsent(this.availablePacks.get(i), i);
}
this.sarcio$packIndex = index;
try {
original.call();
} finally {
this.sarcio$packIndex = null;
}
}

@WrapOperation(method = "reload", at = @At(value = "INVOKE", target = "Ljava/util/List;contains(Ljava/lang/Object;)Z"))
private boolean sarcio$hashContains(List<?> packs, Object pack, Operation<Boolean> original) {
return packs == this.availablePacks ? this.sarcio$packIndex.containsKey(pack) : original.call(packs, pack);
}

@WrapOperation(method = "reload", at = @At(value = "INVOKE", target = "Ljava/util/List;indexOf(Ljava/lang/Object;)I"))
private int sarcio$hashIndexOf(List<?> packs, Object pack, Operation<Integer> original) {
if (packs != this.availablePacks) {
return original.call(packs, pack);
}

Integer index = this.sarcio$packIndex.get(pack);
return index == null ? -1 : index;
}

@WrapOperation(method = "reload", at = @At(value = "INVOKE", target = "Ljava/util/List;removeAll(Ljava/util/Collection;)Z"))
private boolean sarcio$hashRemoveAll(List<?> packs, Collection<?> kept, Operation<Boolean> original) {
return original.call(packs, new HashSet<>(kept));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package dev.rdh.sarcio.mixin.tweaks;

import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
import dev.rdh.sarcio.SarcioMod;
import net.minecraft.network.packet.c2s.play.ChatMessageC2SPacket;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;

@Mixin(ChatMessageC2SPacket.class)
public class ChatMessageC2SPacketMixin {
@ModifyExpressionValue(method = "<init>(Ljava/lang/String;)V", at = @At(value = "CONSTANT", args = "intValue=100"))
private int sarcio$longChatPacket(int original) {
return SarcioMod.chatLimit();
}
}
15 changes: 15 additions & 0 deletions src/main/java/dev/rdh/sarcio/mixin/tweaks/ChatScreenMixin.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package dev.rdh.sarcio.mixin.tweaks;

import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
import dev.rdh.sarcio.SarcioMod;
import net.minecraft.client.gui.screen.game.ChatScreen;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;

@Mixin(ChatScreen.class)
public class ChatScreenMixin {
@ModifyExpressionValue(method = "init", at = @At(value = "CONSTANT", args = "intValue=100"))
private int sarcio$longChatInput(int original) {
return SarcioMod.chatLimit();
}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,28 @@
package dev.rdh.sarcio.mixin.tweaks;

import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
import dev.rdh.sarcio.SarcioMod;
import dev.rdh.sarcio.util.LongChatDetector;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.network.handler.ClientPlayNetworkHandler;
import net.minecraft.client.options.ServerListEntry;
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(ClientPlayNetworkHandler.class)
public class ClientPlayNetworkHandlerMixin {
@WrapWithCondition(method = "handlePlayerRespawn", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;openScreen(Lnet/minecraft/client/gui/screen/Screen;)V"))
private boolean sarcio$skipTerrainScreen(Minecraft instance, Screen screen) {
return false;
}

@Inject(method = "handleLogin", at = @At("TAIL"))
private void sarcio$detectLongChat(CallbackInfo ci) {
Minecraft minecraft = Minecraft.getInstance();
ServerListEntry server = minecraft.getCurrentServerEntry();
LongChatDetector.detect(SarcioMod.CONFIG.longChat && !minecraft.isIntegratedServerRunning() && server != null ? server.ip : null);
}
}
15 changes: 15 additions & 0 deletions src/main/java/dev/rdh/sarcio/mixin/tweaks/MinecraftMixin.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package dev.rdh.sarcio.mixin.tweaks;

import dev.rdh.sarcio.util.LongChatDetector;
import net.minecraft.entity.Entity;
import net.minecraft.client.Minecraft;
import net.minecraft.client.render.ProgressRenderer;
import net.minecraft.client.world.ClientWorld;
Expand Down Expand Up @@ -41,4 +43,17 @@ public class MinecraftMixin {
private boolean sarcio$skipWorldSwapProgress(ProgressRenderer instance, String message, ClientWorld world) {
return world == null;
}

@Inject(method = "setWorld(Lnet/minecraft/client/world/ClientWorld;Ljava/lang/String;)V", at = @At("HEAD"))
private void sarcio$forgetLongChatOnDisconnect(ClientWorld world, String message, CallbackInfo ci) {
if (world == null) {
LongChatDetector.detect(null); // ping again on the next join, the answer may have changed
}
}

@WrapWithCondition(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/GameRenderer;updateShader(Lnet/minecraft/entity/Entity;)V"))
private boolean sarcio$keepShaderOnPerspectiveChange(GameRenderer instance, Entity camera) {
Minecraft minecraft = (Minecraft) (Object) this;
return minecraft.getCamera() != minecraft.player;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
public final class EnchantmentReferenceCleaner {
private static Clearable hurtIterator;
private static Clearable damageIterator;
private static Clearable protectionModifier;

private EnchantmentReferenceCleaner() {
}
Expand All @@ -15,6 +16,14 @@ public static void registerDamageIterator(Clearable iterator) {
damageIterator = iterator;
}

public static void registerProtectionModifier(Clearable modifier) {
protectionModifier = modifier;
}

public static void clearProtectionModifier() {
protectionModifier.clearReferences();
}

public static void clearHurtIterator() {
hurtIterator.clearReferences();
}
Expand Down
Loading