chore(history): squash 10 commit(s) from 2026-07-31
- feat: Фаза 1 ребрендинг combatant → lovisual + восстановление config - refactor: Фаза 2 — выкинуть Runtime/JarReplacement, заменить на Lifecycle - refactor: Фаза 3.5 — удалить читерские модули, ESP под легит - refactor: Фаза 3 — разбить Renderer2D (3379→2150 фасад + 14 хелперов ≤200) - refactor: Фаза 3 — разбить BetterChatRenderer (2870→210 фасад + 21 хелпер ≤200) - refactor: Фаза 3 — разбить UnifiedSettingRenderer (2798→208 фасад + 24 хелпера ≤200) - refactor: Фаза 3 — разбить ClickGuiRenderer (1887→542 фасад + 15 хелперов ≤200) - refactor: Фаза 3 — разбить NameTags (1791→438 фасад + 11 хелперов ≤200) - refactor: Фаза 3 — разбить TargetHud (1655→340 фасад + 11 хелперов ≤200) - refactor: Фаза 3 — разбить ESP (1538→269 фасад + 11 хелперов ≤200)
This commit is contained in:
parent
8084ac50b3
commit
52d87368c9
1595 changed files with 35857 additions and 51145 deletions
|
|
@ -0,0 +1,477 @@
|
|||
/*
|
||||
* This file is part of the LoVisual Client distribution.
|
||||
* Copyright (c) 2026 pivosos2007.
|
||||
*
|
||||
* Licensed under the GNU General Public License v3.0.
|
||||
*/
|
||||
|
||||
package dev.loki.lovisual.config;
|
||||
|
||||
import dev.loki.lovisual.config.values.*;
|
||||
import dev.loki.lovisual.config.values.*;
|
||||
import dev.loki.lovisual.render.iris.IrisRuntime;
|
||||
import dev.loki.lovisual.util.logging.DebugLog;
|
||||
import dev.loki.lovisual.util.logging.DebugMode;
|
||||
import dev.loki.lovisual.util.player.inventory.InventorySearchScope;
|
||||
import dev.loki.lovisual.util.player.inventory.InventorySwap;
|
||||
import dev.loki.lovisual.util.player.inventory.InventorySwapPolicy;
|
||||
import dev.loki.lovisual.util.player.inventory.InventorySwapVisibility;
|
||||
import net.minecraft.client.resources.language.I18n;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public final class MainConfig implements ConfigObject, ConfigNameProvider, SettingOwner {
|
||||
|
||||
public static final MainConfig INSTANCE = new MainConfig();
|
||||
private static final String IRIS_MSAA_REASON_KEY = "setting.main_config.msaa3d.iris_blocked";
|
||||
private static final String IRIS_MSAA_REASON_FALLBACK = "Iris shaderpack pipeline is active.";
|
||||
|
||||
//@CFGComment("Debug logging mode: off / error_only / error_and_warnings / info / config / render_thread / stencil / serverdebug / all")
|
||||
private final ModeValue debug =
|
||||
new ModeValue("debug", "off", "off", "error_only", "error_and_warnings", "info", "config", "render_thread", "stencil", "serverdebug", "all");
|
||||
|
||||
//@CFGComment("Force PvP mode ON everywhere (dev/testing only)")
|
||||
private final BooleanValue forcePvp =
|
||||
new BooleanValue("forcePvp", false);
|
||||
|
||||
//@CFGComment("Menu background shader: off / waves / aurora")
|
||||
private final ModeValue menuBg =
|
||||
new ModeValue("menuBg", "off", "off", "waves", "aurora");
|
||||
|
||||
//@CFGComment("Use ClickGUI theme colors for menu background shader")
|
||||
private final BooleanValue menuBgUseTheme =
|
||||
new BooleanValue("menuBgUseTheme", false);
|
||||
|
||||
//@CFGComment("Show seconds in the custom main menu clock")
|
||||
private final BooleanValue menuClockShowSeconds =
|
||||
new BooleanValue("menuClockShowSeconds", false);
|
||||
|
||||
//@CFGComment("MSAA for world render: off / 2x / 4x")
|
||||
private final ModeValue msaa3d =
|
||||
new ModeValue("msaa3d", "off", "off", "2x", "4x");
|
||||
|
||||
//@CFGComment("Show ClickGUI modules hotkey hints")
|
||||
private final BooleanValue clickGuiModulesHints =
|
||||
new BooleanValue("clickGuiModulesHints", true);
|
||||
|
||||
//@CFGComment("Show ClickGUI HUD editor hotkey hints")
|
||||
private final BooleanValue clickGuiHudEditorHints =
|
||||
new BooleanValue("clickGuiHudEditorHints", true);
|
||||
|
||||
//@CFGComment("Default inventory swap safety policy: none / grim_strict / legit")
|
||||
private final EnumValue<InventorySwapPolicy> inventorySwapPolicy =
|
||||
new EnumValue<>("inventorySwapPolicy", InventorySwapPolicy.NONE, InventorySwapPolicy.class);
|
||||
|
||||
//@CFGComment("Default inventory swap search scope: hotbar / inventory / full")
|
||||
private final EnumValue<InventorySearchScope> inventorySwapScope =
|
||||
new EnumValue<>("inventorySwapScope", InventorySearchScope.FULL, InventorySearchScope.class);
|
||||
|
||||
//@CFGComment("Default inventory swap visibility: normal / silent")
|
||||
private final EnumValue<InventorySwapVisibility> inventorySwapVisibility =
|
||||
new EnumValue<>("inventorySwapVisibility", InventorySwapVisibility.SILENT, InventorySwapVisibility.class);
|
||||
|
||||
//@CFGComment("Restore the original hotbar slot after default swap requests")
|
||||
private final BooleanValue inventorySwapRestore =
|
||||
new BooleanValue("inventorySwapRestore", true);
|
||||
|
||||
//@CFGComment("Prefer hotbar matches before inventory matches for full-scope swap requests")
|
||||
private final BooleanValue inventorySwapPreferHotbar =
|
||||
new BooleanValue("inventorySwapPreferHotbar", true);
|
||||
|
||||
//@CFGComment("Extra delay before queued legit inventory swap actions")
|
||||
private final NumberValue<Integer> inventorySwapLegitWaitTicks =
|
||||
new NumberValue<>("inventorySwapLegitWaitTicks", 2, 0, 20);
|
||||
|
||||
// @CFGComment("Extra delay before queued Grim-strict inventory click/close actions")
|
||||
private final NumberValue<Integer> inventorySwapStrictInventoryWaitTicks =
|
||||
new NumberValue<>("inventorySwapStrictInventoryWaitTicks", 1, 0, 20);
|
||||
|
||||
//@CFGComment("Movement input lock duration while waiting for Grim-strict inventory actions")
|
||||
private final NumberValue<Integer> inventorySwapStrictMovementLockTicks =
|
||||
new NumberValue<>("inventorySwapStrictMovementLockTicks", 2, 0, 20);
|
||||
|
||||
//@CFGComment("Hard-disable narrator and narrator hotkey")
|
||||
private final BooleanValue disableNarrator =
|
||||
new BooleanValue("disableNarrator", true);
|
||||
|
||||
//@CFGComment("Always-on backdoor protection master switch")
|
||||
private final BooleanValue backdoorProtection =
|
||||
new BooleanValue("backdoorProtection", true);
|
||||
|
||||
//@CFGComment("Filter non-whitelisted translation keys in server-controlled sign/anvil text")
|
||||
private final BooleanValue backdoorTranslationFilter =
|
||||
new BooleanValue("backdoorTranslationFilter", true);
|
||||
|
||||
//@CFGComment("Filter non-vanilla keybind text keys in server-controlled text")
|
||||
private final BooleanValue backdoorKeybindFilter =
|
||||
new BooleanValue("backdoorKeybindFilter", true);
|
||||
|
||||
//@CFGComment("Block remote servers from redirecting resource-pack downloads into local/private network addresses")
|
||||
private final BooleanValue backdoorLocalHttpGuard =
|
||||
new BooleanValue("backdoorLocalHttpGuard", true);
|
||||
|
||||
//@CFGComment("Isolate downloaded server-pack cache by account UUID to reduce pack-cache fingerprinting")
|
||||
private final BooleanValue backdoorPackCacheIsolation =
|
||||
new BooleanValue("backdoorPackCacheIsolation", true);
|
||||
|
||||
//@CFGComment("Allow local/private HTTP requests when connected to local/integrated server")
|
||||
private final BooleanValue backdoorAllowLocalHttpWhenServerLocal =
|
||||
new BooleanValue("backdoorAllowLocalHttpWhenServerLocal", true);
|
||||
|
||||
//@CFGComment("Extra allowed translation resource-pack ids for server-controlled text")
|
||||
private final SetValue backdoorAllowedTranslationPacks =
|
||||
new SetValue("backdoorAllowedTranslationPacks", defaultAllowedTranslationPacks());
|
||||
|
||||
//@CFGComment("Extra allowed keybind ids for server-controlled text")
|
||||
private final SetValue backdoorAllowedKeybinds =
|
||||
new SetValue("backdoorAllowedKeybinds");
|
||||
|
||||
private MainConfig() {
|
||||
ConfigSerializer.load(this);
|
||||
applyDebugMode();
|
||||
applyInventorySwapSettings();
|
||||
}
|
||||
|
||||
public static MainConfig get() {
|
||||
return INSTANCE;
|
||||
}
|
||||
|
||||
private static Set<String> defaultAllowedTranslationPacks() {
|
||||
LinkedHashSet<String> out = new LinkedHashSet<>();
|
||||
out.add("vanilla");
|
||||
return out;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getConfigName() {
|
||||
return "mainconfig";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String name() {
|
||||
return "main_config";
|
||||
}
|
||||
|
||||
// ================= DEBUG =================
|
||||
|
||||
@Override
|
||||
public void saveConfig() {
|
||||
applyDebugMode();
|
||||
applyInventorySwapSettings();
|
||||
ConfigSerializer.requestSave(this);
|
||||
}
|
||||
|
||||
public DebugMode getDebugMode() {
|
||||
try {
|
||||
return DebugMode.valueOf(debug.get().toUpperCase());
|
||||
} catch (IllegalArgumentException e) {
|
||||
return DebugMode.OFF;
|
||||
}
|
||||
}
|
||||
|
||||
public void setDebugMode(DebugMode mode) {
|
||||
if (mode == null) mode = DebugMode.OFF;
|
||||
debug.set(mode.name().toLowerCase());
|
||||
applyDebugMode();
|
||||
ConfigSerializer.requestSave(this);
|
||||
}
|
||||
|
||||
private void applyDebugMode() {
|
||||
DebugLog.setMode(getDebugMode());
|
||||
}
|
||||
|
||||
public boolean isForcePvp() {
|
||||
return forcePvp.get();
|
||||
}
|
||||
|
||||
public String getMenuBackgroundMode() {
|
||||
return menuBg.get();
|
||||
}
|
||||
|
||||
public boolean isMenuBackgroundUseTheme() {
|
||||
return menuBgUseTheme.get();
|
||||
}
|
||||
|
||||
public boolean isMenuClockShowSeconds() {
|
||||
return menuClockShowSeconds.get();
|
||||
}
|
||||
|
||||
public int getMsaa3dSamples() {
|
||||
if (IrisRuntime.isShaderpackRendererActive()) return 0;
|
||||
String v = msaa3d.get();
|
||||
if (v == null) return 0;
|
||||
if (v.equalsIgnoreCase("2x")) return 2;
|
||||
if (v.equalsIgnoreCase("4x")) return 4;
|
||||
return 0;
|
||||
}
|
||||
|
||||
public boolean isClickGuiModulesHintsEnabled() {
|
||||
return clickGuiModulesHints.get();
|
||||
}
|
||||
|
||||
public boolean isClickGuiHintsEnabled() {
|
||||
return clickGuiModulesHints.get();
|
||||
}
|
||||
|
||||
public void setClickGuiModulesHintsEnabled(boolean enabled) {
|
||||
clickGuiModulesHints.set(enabled);
|
||||
ConfigSerializer.requestSave(this);
|
||||
}
|
||||
|
||||
public void setClickGuiHintsEnabled(boolean enabled) {
|
||||
setClickGuiModulesHintsEnabled(enabled);
|
||||
}
|
||||
|
||||
public boolean isClickGuiHudEditorHintsEnabled() {
|
||||
return clickGuiHudEditorHints.get();
|
||||
}
|
||||
|
||||
public void setClickGuiHudEditorHintsEnabled(boolean enabled) {
|
||||
clickGuiHudEditorHints.set(enabled);
|
||||
ConfigSerializer.requestSave(this);
|
||||
}
|
||||
|
||||
public InventorySwapPolicy getInventorySwapPolicy() {
|
||||
return inventorySwapPolicy.get();
|
||||
}
|
||||
|
||||
public void setInventorySwapPolicy(InventorySwapPolicy policy) {
|
||||
inventorySwapPolicy.set(policy != null ? policy : InventorySwapPolicy.NONE);
|
||||
saveAndApplyInventorySwapSettings();
|
||||
}
|
||||
|
||||
public InventorySearchScope getInventorySwapScope() {
|
||||
return inventorySwapScope.get();
|
||||
}
|
||||
|
||||
public void setInventorySwapScope(InventorySearchScope scope) {
|
||||
inventorySwapScope.set(scope != null ? scope : InventorySearchScope.FULL);
|
||||
saveAndApplyInventorySwapSettings();
|
||||
}
|
||||
|
||||
public InventorySwapVisibility getInventorySwapVisibility() {
|
||||
return inventorySwapVisibility.get();
|
||||
}
|
||||
|
||||
public void setInventorySwapVisibility(InventorySwapVisibility visibility) {
|
||||
inventorySwapVisibility.set(visibility != null ? visibility : InventorySwapVisibility.SILENT);
|
||||
saveAndApplyInventorySwapSettings();
|
||||
}
|
||||
|
||||
public boolean isInventorySwapRestore() {
|
||||
return inventorySwapRestore.get();
|
||||
}
|
||||
|
||||
public void setInventorySwapRestore(boolean restore) {
|
||||
inventorySwapRestore.set(restore);
|
||||
saveAndApplyInventorySwapSettings();
|
||||
}
|
||||
|
||||
public boolean isInventorySwapPreferHotbar() {
|
||||
return inventorySwapPreferHotbar.get();
|
||||
}
|
||||
|
||||
public void setInventorySwapPreferHotbar(boolean preferHotbar) {
|
||||
inventorySwapPreferHotbar.set(preferHotbar);
|
||||
saveAndApplyInventorySwapSettings();
|
||||
}
|
||||
|
||||
public int getInventorySwapLegitWaitTicks() {
|
||||
return inventorySwapLegitWaitTicks.get();
|
||||
}
|
||||
|
||||
public void setInventorySwapLegitWaitTicks(int ticks) {
|
||||
inventorySwapLegitWaitTicks.fromJson(ticks);
|
||||
saveAndApplyInventorySwapSettings();
|
||||
}
|
||||
|
||||
public int getInventorySwapStrictInventoryWaitTicks() {
|
||||
return inventorySwapStrictInventoryWaitTicks.get();
|
||||
}
|
||||
|
||||
public void setInventorySwapStrictInventoryWaitTicks(int ticks) {
|
||||
inventorySwapStrictInventoryWaitTicks.fromJson(ticks);
|
||||
saveAndApplyInventorySwapSettings();
|
||||
}
|
||||
|
||||
public int getInventorySwapStrictMovementLockTicks() {
|
||||
return inventorySwapStrictMovementLockTicks.get();
|
||||
}
|
||||
|
||||
public void setInventorySwapStrictMovementLockTicks(int ticks) {
|
||||
inventorySwapStrictMovementLockTicks.fromJson(ticks);
|
||||
saveAndApplyInventorySwapSettings();
|
||||
}
|
||||
|
||||
public EnumValue<InventorySwapPolicy> inventorySwapPolicyValue() {
|
||||
return inventorySwapPolicy;
|
||||
}
|
||||
|
||||
public EnumValue<InventorySearchScope> inventorySwapScopeValue() {
|
||||
return inventorySwapScope;
|
||||
}
|
||||
|
||||
public EnumValue<InventorySwapVisibility> inventorySwapVisibilityValue() {
|
||||
return inventorySwapVisibility;
|
||||
}
|
||||
|
||||
public BooleanValue inventorySwapRestoreValue() {
|
||||
return inventorySwapRestore;
|
||||
}
|
||||
|
||||
public BooleanValue inventorySwapPreferHotbarValue() {
|
||||
return inventorySwapPreferHotbar;
|
||||
}
|
||||
|
||||
public NumberValue<Integer> inventorySwapLegitWaitTicksValue() {
|
||||
return inventorySwapLegitWaitTicks;
|
||||
}
|
||||
|
||||
public NumberValue<Integer> inventorySwapStrictInventoryWaitTicksValue() {
|
||||
return inventorySwapStrictInventoryWaitTicks;
|
||||
}
|
||||
|
||||
public NumberValue<Integer> inventorySwapStrictMovementLockTicksValue() {
|
||||
return inventorySwapStrictMovementLockTicks;
|
||||
}
|
||||
|
||||
public List<SettingDef> getImageSettingDefs() {
|
||||
List<SettingDef> list = new ArrayList<>();
|
||||
list.add(SettingDef.mode(msaa3d)
|
||||
.unavailableWhen(IrisRuntime::isShaderpackRendererActive, MainConfig::irisMsaaReason));
|
||||
list.add(SettingDef.mode(menuBg));
|
||||
list.add(SettingDef.bool(menuClockShowSeconds));
|
||||
list.add(SettingDef.bool(menuBgUseTheme));
|
||||
return list;
|
||||
}
|
||||
|
||||
private static String irisMsaaReason() {
|
||||
String translated = I18n.get(IRIS_MSAA_REASON_KEY);
|
||||
return IRIS_MSAA_REASON_KEY.equals(translated) ? IRIS_MSAA_REASON_FALLBACK : translated;
|
||||
}
|
||||
|
||||
public List<SettingDef> getMiscellaneousSettingDefs() {
|
||||
List<SettingDef> list = new ArrayList<>();
|
||||
list.add(SettingDef.mode(debug));
|
||||
list.add(SettingDef.bool(forcePvp));
|
||||
list.add(SettingDef.bool(disableNarrator));
|
||||
return list;
|
||||
}
|
||||
|
||||
public List<SettingDef> getSecuritySettingDefs() {
|
||||
List<SettingDef> list = new ArrayList<>();
|
||||
list.add(SettingDef.bool(backdoorProtection));
|
||||
list.add(SettingDef.bool(backdoorTranslationFilter).visibleWhen(backdoorProtection::get));
|
||||
list.add(SettingDef.bool(backdoorKeybindFilter).visibleWhen(backdoorProtection::get));
|
||||
list.add(SettingDef.bool(backdoorLocalHttpGuard).visibleWhen(backdoorProtection::get));
|
||||
list.add(SettingDef.bool(backdoorPackCacheIsolation).visibleWhen(backdoorProtection::get));
|
||||
list.add(SettingDef.bool(backdoorAllowLocalHttpWhenServerLocal).visibleWhen(backdoorProtection::get));
|
||||
list.add(SettingDef.textList(backdoorAllowedTranslationPacks)
|
||||
.visibleWhen(() -> backdoorProtection.get() && backdoorTranslationFilter.get()));
|
||||
list.add(SettingDef.textList(backdoorAllowedKeybinds)
|
||||
.visibleWhen(() -> backdoorProtection.get() && backdoorKeybindFilter.get()));
|
||||
return list;
|
||||
}
|
||||
|
||||
public List<SettingDef> getUtilitySettingDefs() {
|
||||
List<SettingDef> list = new ArrayList<>();
|
||||
list.add(SettingDef.mode(inventorySwapPolicy).common("inventory.swap_policy"));
|
||||
list.add(SettingDef.mode(inventorySwapScope).common("inventory.search_scope"));
|
||||
list.add(SettingDef.mode(inventorySwapVisibility).common("inventory.swap_visibility"));
|
||||
list.add(SettingDef.bool(inventorySwapRestore).common("inventory.restore_item"));
|
||||
list.add(SettingDef.bool(inventorySwapPreferHotbar).common("inventory.prefer_hotbar"));
|
||||
list.add(SettingDef.number(inventorySwapLegitWaitTicks).common("inventory.legit_wait_ticks"));
|
||||
list.add(SettingDef.number(inventorySwapStrictInventoryWaitTicks).common("inventory.strict_inventory_wait_ticks"));
|
||||
list.add(SettingDef.number(inventorySwapStrictMovementLockTicks).common("inventory.strict_movement_lock_ticks"));
|
||||
return list;
|
||||
}
|
||||
|
||||
public boolean isNarratorDisabled() {
|
||||
return disableNarrator.get();
|
||||
}
|
||||
|
||||
public boolean isBackdoorProtectionEnabled() {
|
||||
return backdoorProtection.get();
|
||||
}
|
||||
|
||||
public boolean isBackdoorTranslationFilterEnabled() {
|
||||
return backdoorProtection.get() && backdoorTranslationFilter.get();
|
||||
}
|
||||
|
||||
public boolean isBackdoorKeybindFilterEnabled() {
|
||||
return backdoorProtection.get() && backdoorKeybindFilter.get();
|
||||
}
|
||||
|
||||
public boolean isBackdoorLocalHttpGuardEnabled() {
|
||||
return backdoorProtection.get() && backdoorLocalHttpGuard.get();
|
||||
}
|
||||
|
||||
public boolean isBackdoorPackCacheIsolationEnabled() {
|
||||
return backdoorProtection.get() && backdoorPackCacheIsolation.get();
|
||||
}
|
||||
|
||||
public boolean isBackdoorAllowLocalHttpWhenServerLocal() {
|
||||
return backdoorAllowLocalHttpWhenServerLocal.get();
|
||||
}
|
||||
|
||||
public Set<String> getBackdoorAllowedTranslationPacks() {
|
||||
return new LinkedHashSet<>(backdoorAllowedTranslationPacks.get());
|
||||
}
|
||||
|
||||
// ================= CONFIG =================
|
||||
|
||||
public Set<String> getBackdoorAllowedKeybinds() {
|
||||
return new LinkedHashSet<>(backdoorAllowedKeybinds.get());
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ConfigValue<?>> getConfigValues() {
|
||||
List<ConfigValue<?>> list = new ArrayList<>();
|
||||
list.add(debug);
|
||||
list.add(forcePvp);
|
||||
list.add(menuBg);
|
||||
list.add(menuClockShowSeconds);
|
||||
list.add(menuBgUseTheme);
|
||||
list.add(msaa3d);
|
||||
list.add(clickGuiModulesHints);
|
||||
list.add(clickGuiHudEditorHints);
|
||||
list.add(inventorySwapPolicy);
|
||||
list.add(inventorySwapScope);
|
||||
list.add(inventorySwapVisibility);
|
||||
list.add(inventorySwapRestore);
|
||||
list.add(inventorySwapPreferHotbar);
|
||||
list.add(inventorySwapLegitWaitTicks);
|
||||
list.add(inventorySwapStrictInventoryWaitTicks);
|
||||
list.add(inventorySwapStrictMovementLockTicks);
|
||||
list.add(disableNarrator);
|
||||
list.add(backdoorProtection);
|
||||
list.add(backdoorTranslationFilter);
|
||||
list.add(backdoorKeybindFilter);
|
||||
list.add(backdoorLocalHttpGuard);
|
||||
list.add(backdoorPackCacheIsolation);
|
||||
list.add(backdoorAllowLocalHttpWhenServerLocal);
|
||||
list.add(backdoorAllowedTranslationPacks);
|
||||
list.add(backdoorAllowedKeybinds);
|
||||
return list;
|
||||
}
|
||||
|
||||
private void saveAndApplyInventorySwapSettings() {
|
||||
applyInventorySwapSettings();
|
||||
ConfigSerializer.requestSave(this);
|
||||
}
|
||||
|
||||
private void applyInventorySwapSettings() {
|
||||
InventorySwap swap = InventorySwap.INSTANCE;
|
||||
swap.setDefaultPolicy(inventorySwapPolicy.get());
|
||||
swap.setDefaultScope(inventorySwapScope.get());
|
||||
swap.setDefaultVisibility(inventorySwapVisibility.get());
|
||||
swap.setRestoreByDefault(inventorySwapRestore.get());
|
||||
swap.setPreferHotbar(inventorySwapPreferHotbar.get());
|
||||
swap.setLegitWaitTicks(inventorySwapLegitWaitTicks.get());
|
||||
swap.setStrictInventoryWaitTicks(inventorySwapStrictInventoryWaitTicks.get());
|
||||
swap.setStrictMovementLockTicks(inventorySwapStrictMovementLockTicks.get());
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue