Skip to content

Commit 9624894

Browse files
Merge branch 'v7.51.2'
2 parents c3be685 + 5dc30cd commit 9624894

File tree

10 files changed

+119
-36
lines changed

10 files changed

+119
-36
lines changed

build.gradle

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ loom {
6868
accessWidenerPath = file("src/main/resources/wurst.accesswidener")
6969

7070
runs {
71+
clientWithMods {
72+
inherit client
73+
}
74+
7175
clientGameTestWithMods {
7276
inherit client
7377
source = sourceSets.gametest
@@ -89,6 +93,20 @@ dependencies {
8993
testMods "maven.modrinth:sodium:${project.sodium_version}"
9094
}
9195

96+
def cleanClientWithMods = tasks.register("cleanClientWithMods", Delete) {
97+
delete "run/mods"
98+
}
99+
100+
def prepareClientWithMods = tasks.register("prepareClientWithMods", Sync) {
101+
from configurations.testMods
102+
into "run/mods"
103+
}
104+
105+
tasks.named("runClientWithMods") {
106+
dependsOn prepareClientWithMods
107+
finalizedBy cleanClientWithMods
108+
}
109+
92110
def cleanClientGameTestWithMods = tasks.register("cleanClientGameTestWithMods", Delete) {
93111
delete layout.buildDirectory.dir("run/clientGameTestWithMods")
94112
}

gradle.properties

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@ org.gradle.configuration-cache=true
88
# https://modrinth.com/mod/fabric-api/versions
99
minecraft_version=1.21.10
1010
yarn_mappings=1.21.10+build.2
11-
loader_version=0.17.3
11+
loader_version=0.18.1
1212
loom_version=1.13-SNAPSHOT
1313

1414
# Fabric API
1515
fabric_version=0.138.3+1.21.10
1616

1717
# Mod Properties
18-
mod_version=v7.51.1-MC1.21.10
18+
mod_version=v7.51.2-MC1.21.10
1919
maven_group=net.wurstclient
2020
archives_base_name=Wurst-Client
2121
mod_loader=Fabric
@@ -26,5 +26,5 @@ mcx_repo_id=Wurst-Imperium/Wurst-MCX2
2626

2727
# Dependencies
2828
# check at https://modrinth.com/mod/sodium/versions?l=fabric&g=1.21.10
29-
sodium_version=mc1.21.10-0.7.2-fabric
29+
sodium_version=mc1.21.10-0.7.3-fabric
3030
do_mod_compat_test=true

src/gametest/java/net/wurstclient/gametest/WurstTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,7 @@ private void testInWorld(ClientGameTestContext context,
8989
world.waitForChunksRender();
9090

9191
assertScreenshotEquals(context, "in_game",
92-
IS_MOD_COMPAT_TEST ? "https://i.imgur.com/VxbGFrb.png"
93-
: "https://i.imgur.com/EfzN9Cd.png");
92+
"https://i.imgur.com/EfzN9Cd.png");
9493

9594
LOGGER.info("Recording debug menu");
9695
input.pressKey(GLFW.GLFW_KEY_F3);

src/gametest/java/net/wurstclient/gametest/tests/FreecamHackTest.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,14 @@ public static void testFreecamHack(ClientGameTestContext context,
4141
input.holdKeyFor(GLFW.GLFW_KEY_S, 2);
4242
input.holdKeyFor(GLFW.GLFW_KEY_SPACE, 1);
4343
assertScreenshotEquals(context, "freecam_moved",
44-
WurstTest.IS_MOD_COMPAT_TEST ? "https://i.imgur.com/oZUpI8c.png"
45-
: "https://i.imgur.com/pZDlYfH.png");
44+
"https://i.imgur.com/pZDlYfH.png");
4645
clearChat(context);
4746

4847
// Enable tracer
4948
runWurstCommand(context, "setcheckbox Freecam tracer on");
5049
context.waitTick();
5150
assertScreenshotEquals(context, "freecam_tracer",
52-
WurstTest.IS_MOD_COMPAT_TEST ? "https://i.imgur.com/teKaxAK.png"
53-
: "https://i.imgur.com/jYqDFzE.png");
51+
"https://i.imgur.com/jYqDFzE.png");
5452
clearChat(context);
5553

5654
// Clean up

src/gametest/java/net/wurstclient/gametest/tests/XRayHackTest.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,7 @@ public static void testXRayHack(ClientGameTestContext context,
3838
input.pressKey(GLFW.GLFW_KEY_X);
3939
waitForChunkReloading(context, world);
4040
assertScreenshotEquals(context, "xray_default",
41-
WurstTest.IS_MOD_COMPAT_TEST ? "https://i.imgur.com/02KZHLm.png"
42-
: "https://i.imgur.com/Dftamqv.png");
41+
"https://i.imgur.com/Dftamqv.png");
4342

4443
// Exposed only
4544
runWurstCommand(context, "setcheckbox X-Ray only_show_exposed on");
@@ -48,8 +47,7 @@ public static void testXRayHack(ClientGameTestContext context,
4847
input.pressKey(GLFW.GLFW_KEY_X);
4948
waitForChunkReloading(context, world);
5049
assertScreenshotEquals(context, "xray_exposed_only",
51-
WurstTest.IS_MOD_COMPAT_TEST ? "https://i.imgur.com/xplrJwM.png"
52-
: "https://i.imgur.com/QlEpQTu.png");
50+
"https://i.imgur.com/QlEpQTu.png");
5351

5452
// Opacity mode
5553
runWurstCommand(context, "setcheckbox X-Ray only_show_exposed off");
@@ -58,8 +56,7 @@ public static void testXRayHack(ClientGameTestContext context,
5856
input.pressKey(GLFW.GLFW_KEY_X);
5957
waitForChunkReloading(context, world);
6058
assertScreenshotEquals(context, "xray_opacity",
61-
WurstTest.IS_MOD_COMPAT_TEST ? "https://i.imgur.com/MFc821z.png"
62-
: "https://i.imgur.com/0nLulJn.png");
59+
"https://i.imgur.com/0nLulJn.png");
6360

6461
// Exposed only + opacity
6562
runWurstCommand(context, "setcheckbox X-Ray only_show_exposed on");
@@ -68,8 +65,7 @@ public static void testXRayHack(ClientGameTestContext context,
6865
input.pressKey(GLFW.GLFW_KEY_X);
6966
waitForChunkReloading(context, world);
7067
assertScreenshotEquals(context, "xray_exposed_only_opacity",
71-
WurstTest.IS_MOD_COMPAT_TEST ? "https://i.imgur.com/GRHgW6P.png"
72-
: "https://i.imgur.com/noPWDUl.png");
68+
"https://i.imgur.com/noPWDUl.png");
7369

7470
// Clean up
7571
runCommand(server, "fill ~-5 ~-2 ~5 ~5 ~5 ~7 air");

src/main/java/net/wurstclient/WurstClient.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public enum WurstClient
5050
public static Minecraft MC;
5151
public static IMinecraftClient IMC;
5252

53-
public static final String VERSION = "7.51.1";
53+
public static final String VERSION = "7.51.2";
5454
public static final String MC_VERSION = "1.21.10";
5555

5656
private PlausibleAnalytics plausible;

src/main/java/net/wurstclient/WurstTranslator.java

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,18 @@
1515
import java.util.IllegalFormatException;
1616
import java.util.List;
1717
import java.util.Map;
18+
import java.util.Optional;
1819
import java.util.function.BiConsumer;
1920

2021
import com.google.common.collect.Lists;
22+
import com.google.gson.JsonParseException;
2123

2224
import net.minecraft.client.Minecraft;
2325
import net.minecraft.client.resources.language.ClientLanguage;
2426
import net.minecraft.client.resources.language.I18n;
2527
import net.minecraft.locale.Language;
2628
import net.minecraft.resources.ResourceLocation;
29+
import net.minecraft.server.packs.repository.KnownPack;
2730
import net.minecraft.server.packs.resources.Resource;
2831
import net.minecraft.server.packs.resources.ResourceManager;
2932
import net.minecraft.server.packs.resources.ResourceManagerReloadListener;
@@ -187,17 +190,50 @@ private void loadTranslations(ResourceManager manager,
187190
ResourceLocation langId =
188191
ResourceLocation.fromNamespaceAndPath("wurst", langFilePath);
189192

193+
// IMPORTANT: Exceptions thrown by Language.loadFromJson() must
194+
// be caught to prevent mod detection vulnerabilities using
195+
// intentionally corrupted resource packs.
190196
for(Resource resource : manager.getResourceStack(langId))
197+
{
191198
try(InputStream stream = resource.open())
192199
{
193-
Language.loadFromJson(stream, entryConsumer);
200+
if(isBuiltInWurstResourcePack(resource))
201+
Language.loadFromJson(stream, entryConsumer);
202+
203+
}catch(IOException | JsonParseException e)
204+
{
205+
System.out.println(
206+
"Failed to load Wurst translations for " + langCode);
207+
e.printStackTrace();
194208

195-
}catch(IOException e)
209+
}catch(Exception e)
196210
{
197-
System.out.println("Failed to load translations for "
198-
+ langCode + " from pack " + resource.sourcePackId());
211+
System.out.println(
212+
"Unexpected exception while loading Wurst translations for "
213+
+ langCode);
199214
e.printStackTrace();
200215
}
216+
}
201217
}
202218
}
219+
220+
/**
221+
* Ensures that the given resource is from Wurst's built-in resource pack,
222+
* or at least from another client-side mod pretending to be Wurst, as it
223+
* should be impossible for server-provided resource packs to obtain a
224+
* KnownPack of <code>fabric:wurst</code>.
225+
*
226+
* <p>
227+
* ASSUME THEY CAN BYPASS THIS. CATCH EXCEPTIONS ANYWAY.
228+
*/
229+
private boolean isBuiltInWurstResourcePack(Resource resource)
230+
{
231+
KnownPack knownPack = Optional.ofNullable(resource)
232+
.flatMap(Resource::knownPackInfo).orElse(null);
233+
if(knownPack == null)
234+
return false;
235+
236+
return "fabric".equals(knownPack.namespace())
237+
&& "wurst".equals(knownPack.id());
238+
}
203239
}

src/main/java/net/wurstclient/mixin/FluidRendererMixin.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ private boolean modifyShouldSkipRendering(Direction side, float height,
4646
BlockAndTintGetter world, BlockPos pos, VertexConsumer vertexConsumer,
4747
BlockState blockState, FluidState fluidState)
4848
{
49+
// Note: the null BlockPos is here to skip the "exposed only" check
4950
ShouldDrawSideEvent event = new ShouldDrawSideEvent(blockState, null);
5051
EventManager.fire(event);
5152

src/main/java/net/wurstclient/mixin/sodium/DefaultFluidRendererMixin.java

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@
3737
public class DefaultFluidRendererMixin
3838
{
3939
/**
40-
* Hides and shows fluids when using X-Ray with Sodium installed.
40+
* Hides and shows the top side of fluids when using X-Ray with Sodium
41+
* installed.
4142
*/
4243
@Inject(at = @At("HEAD"),
4344
method = "isFullBlockFluidOccluded(Lnet/minecraft/class_1920;Lnet/minecraft/class_2338;Lnet/minecraft/class_2350;Lnet/minecraft/class_2680;Lnet/minecraft/class_3610;)Z",
@@ -48,21 +49,51 @@ private void onIsFullBlockFluidOccluded(BlockAndTintGetter world,
4849
BlockPos pos, Direction dir, BlockState state, FluidState fluid,
4950
CallbackInfoReturnable<Boolean> cir)
5051
{
51-
ShouldDrawSideEvent event = new ShouldDrawSideEvent(state, pos);
52+
// Note: the null BlockPos is here to skip the "exposed only" check
53+
ShouldDrawSideEvent event = new ShouldDrawSideEvent(state, null);
5254
EventManager.fire(event);
5355

5456
if(event.isRendered() != null)
5557
cir.setReturnValue(!event.isRendered());
5658
}
5759

60+
/**
61+
* Hides and shows all other sides of fluids when using X-Ray with Sodium
62+
* installed.
63+
*/
64+
@Inject(at = @At("HEAD"),
65+
method = "isSideExposed(Lnet/minecraft/class_1920;IIILnet/minecraft/class_2350;F)Z",
66+
cancellable = true,
67+
remap = false,
68+
require = 0)
69+
private void onIsSideExposed(BlockAndTintGetter world, int x, int y, int z,
70+
Direction dir, float height, CallbackInfoReturnable<Boolean> cir)
71+
{
72+
BlockPos pos = new BlockPos(x, y, z);
73+
BlockState state = world.getBlockState(pos);
74+
75+
// Note: the null BlockPos is here to skip the "exposed only" check
76+
ShouldDrawSideEvent event = new ShouldDrawSideEvent(state, null);
77+
EventManager.fire(event);
78+
79+
if(event.isRendered() == null)
80+
return;
81+
82+
BlockPos nPos = pos.offset(dir.getUnitVec3i());
83+
BlockState neighborState = world.getBlockState(nPos);
84+
85+
cir.setReturnValue(!neighborState.getFluidState().getType()
86+
.isSame(state.getFluidState().getType()) && event.isRendered());
87+
}
88+
5889
/**
5990
* Modifies opacity of fluids when using X-Ray with Sodium installed.
6091
*/
6192
@ModifyExpressionValue(at = @At(value = "INVOKE",
6293
target = "Lnet/caffeinemc/mods/sodium/api/util/ColorARGB;toABGR(I)I"),
6394
method = "updateQuad",
64-
require = 0,
65-
remap = false)
95+
remap = false,
96+
require = 0)
6697
private int onUpdateQuad(int original, @Local(argsOnly = true) BlockPos pos,
6798
@Local(argsOnly = true) FluidState state)
6899
{

src/main/resources/assets/wurst/translations/pl_pl.json

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
"description.wurst.hack.anchoraura": "Automatycznie umieszcza (opcjonalnie), ładuje i wysadza kotwice odrodzenia, aby zabijać otaczające cię istoty.",
1111
"description.wurst.setting.anchoraura.range": "Określa, jak daleko AnchorAura sięgnie, aby umieścić, naładować i zdetonować kotwice.",
1212
"description.wurst.setting.anchoraura.auto-place_anchors": "Gdy włączony, AnchorAura automatycznie umieszcza kotwice w pobliżu prawidłowych bytów.\nGdy wyłączony, AnchorAura będzie tylko ładować i detonować ręcznie umieszczone kotwice.",
13-
"description.wurst.setting.anchoraura.face_target": "Jak AnchorAura powinien być skierowany na kotwice odrodzenia.",
14-
"description.wurst.setting.anchoraura.check_line_of_sight": "Zabezpiecza przed sięganiem przez bloki podczas umieszczania lub klikania prawym przyciskiem kotwic odrodzenia.\n\nWolniejsze, ale może pomóc z pluginami antycheatowymi.",
13+
"description.wurst.setting.anchoraura.face_target": "Jak AnchorAura powinna być skierowana na kotwice odrodzenia.",
14+
"description.wurst.setting.anchoraura.check_line_of_sight": "Zabezpiecza przed sięganiem przez bloki podczas umieszczania lub klikania prawym przyciskiem kotwic odrodzenia.\n\nWolniejsze, ale może pomóc z pluginami anty-cheat.",
1515
"description.wurst.setting.anchoraura.swing_hand": "Jak AnchorAura powininna machać ręką podczas umieszczania, ładowania i detonacji kotwic odrodzenia.",
1616
"description.wurst.setting.anchoraura.take_items_from": "Gdzie szukać kotwic odrodzenia i jasnogłazu.",
1717
"description.wurst.hack.antiafk": "Spaceruje losowo dookoła, aby ukryć cię przed wykrywaczami AFK.",
@@ -38,8 +38,8 @@
3838
"description.wurst.hack.autodrop": "Automatycznie wyrzuca niechciane przedmioty.",
3939
"description.wurst.hack.autoleave": "Automatycznie opuszcza serwer, gdy masz mało życia.",
4040
"description.wurst.hack.autolibrarian": "Automatycznie szkoli osadnika, aby stał się bibliotekarzem sprzedającym określoną zaklętą książkę. Możesz błyskawicznie stworzyć całą halę handlową, korzystając z tego hacka.",
41-
"description.wurst.setting.autolibrarian.face_target": "Jak AutoLibrarian powinien być skierowany na wieśniaka i miejsce pracy.",
42-
"description.wurst.setting.autolibrarian.swing_hand": "Jak AutoLibrarian powinien machać ręką podczas interakcji z wieśniakiem i miejscem pracy.",
41+
"description.wurst.setting.autolibrarian.face_target": "Jak AutoLibrarian powinien być skierowany na osadnika i miejsce pracy.",
42+
"description.wurst.setting.autolibrarian.swing_hand": "Jak AutoLibrarian powinien machać ręką podczas interakcji z osadnikiem i miejscem pracy.",
4343
"description.wurst.hack.autoeat": "Automatycznie zjada coś, gdy jest to konieczne.",
4444
"description.wurst.setting.autoeat.target_hunger": "Stara się utrzymać pasek głodu na tym lub wyższym poziomie, jednak tylko, gdy nie zmarnuje to punktów głodu.",
4545
"description.wurst.setting.autoeat.min_hunger": "Zawsze utrzymuje pasek głodu na tym lub wyższym poziomie, nawet jeśli zmarnuje to kilka punktów głodu.\n6.5 - Nie zmarnuje punktów jedząc \"vanilla\" jedzenie.\n10.0 - Całkowicie ignoruje straty i po prostu utrzymuje pełny pasek głodu.",
@@ -51,6 +51,8 @@
5151
"description.wurst.setting.autoeat.allow_poison": "Trujące jedzenie zadaje z czasem obrażenia.\nNiepolecane.",
5252
"description.wurst.setting.autoeat.allow_chorus": "Zjedzenie owoców refrenusu teleportuje cię w losowe miejsce.\nNiepolecane.",
5353
"description.wurst.hack.autofarm": "Automatycznie zbiera i przesadza plony.",
54+
"description.wurst.setting.autofarm.check_line_of_sight": "Zabezpiecza przed sięganiem przez bloki podczas sadzenia i zbierania plonów.",
55+
"description.wurst.setting.autofarm.face_target": "Jak AutoFarm powinien być skierowany na uprawy podczas sadzenia i zbierania plonów.",
5456
"description.wurst.setting.autofarm.swing_hand": "Jak AutoFarm powinien machać twoją ręką podczas sadzenia i zbierania plonów.",
5557
"description.wurst.hack.autofish": "Automatycznie łowi ryby, korzystając z twojej najlepszej wędki. Jeśli podczas łowienia znajdzie lepszą wędkę, automatycznie się na nią przełączy.",
5658
"description.wurst.hack.automine": "Automatycznie wykopuje każdy blok, na który patrzysz.",
@@ -93,8 +95,8 @@
9395
"description.wurst.hack.creativeflight": "Pozwala latać, tak jak w trybie kreatywnym.\n\n§c§lOSTRZEŻENIE:§r Odniesiesz obrażenia od upadku, jeśli nie użyjesz NoFall.",
9496
"description.wurst.hack.criticals": "Zmienia wszystkie twoje uderzenia w uderzenia krytyczne.",
9597
"description.wurst.hack.crystalaura": "Automatycznie umieszcza (opcjonalnie) i wysadza kryształy Endu, aby zabijać otaczające cię istoty.",
96-
"description.wurst.setting.crystalaura.face_target": "Jak CrystalAura powinien być skierowany na kryształy Endu.",
97-
"description.wurst.setting.crystalaura.swing_hand": "Jak CrystalAura powinien machać ręką podczas umieszczania i detonacji kryształów Endu.",
98+
"description.wurst.setting.crystalaura.face_target": "Jak CrystalAura powinna być skierowana na kryształy Endu.",
99+
"description.wurst.setting.crystalaura.swing_hand": "Jak CrystalAura powinna machać ręką podczas umieszczania i detonacji kryształów Endu.",
98100
"description.wurst.hack.derp": "Losowo porusza twoją głową.\nWidoczne tylko dla innych graczy.",
99101
"description.wurst.hack.dolphin": "Sprawia, że automatycznie podskakujesz w wodzie.\n(tak jak delfin)",
100102
"description.wurst.hack.excavator": "Automatycznie niszczy wszystkie bloki w wybranym obszarze.",
@@ -133,6 +135,7 @@
133135
"description.wurst.hack.healthtags": "Pokazuje punkty życia graczy przy ich nazwach.",
134136
"description.wurst.hack.highjump": "Pozwala skakać wyżej.\n\n§c§lOSTRZEŻENIE:§r Odniesiesz obrażenia od upadku, jeśli nie użyjesz NoFall.",
135137
"description.wurst.hack.infinichat": "Usuwa limit 256 znaków z czatu.\nPrzydatne w przypadku długich poleceń modyfikujących dane NBT.\n\n§6§lUWAGA:§r Nie polecane do rozmów z ludźmi. Większość serwerów obcina wiadomości do 256 znaków.",
138+
"description.wurst.hack.instabuild": "Podobny do AutoBuild, z tym że próbuje zbudować cały szablon naraz.\nDziała tylko z bardzo prostymi szablonami.",
136139
"description.wurst.hack.instantbunker": "Buduje wokół ciebie mały bunkier. Wymaga 57 bloków.",
137140
"description.wurst.hack.invwalk": "Pozwala poruszać się z otwartym ekwipunkiem.",
138141
"description.wurst.setting.invwalk.allow_clickgui": "Pozwala poruszać się z otwartym ClickGUI Wursta.",
@@ -180,6 +183,7 @@
180183
"description.wurst.hack.nopumpkin": "Blokuje nakładkę podczas noszenia dyni na głowie.",
181184
"description.wurst.hack.noshieldoverlay": "Obniża tarczę, aby zakrywała mniejszą część ekranu.",
182185
"description.wurst.hack.noslowdown": "Anuluje efekty spowolnienia wywołane przez miód, piasek dusz i używanie przedmiotów.",
186+
"description.wurst.hack.novignette": "Usuwa efekt winiety (przyciemnienie krawędzi ekranu).",
183187
"description.wurst.hack.noweather": "Umożliwia zmianę pogody, czasu i fazy księżyca po stronie klienta.",
184188
"description.wurst.hack.noweb": "Zapobiega spowolnieniu przez pajęczyny.",
185189
"description.wurst.hack.nuker": "Automatycznie niszczy bloki wokół ciebie.",
@@ -246,10 +250,10 @@
246250
"button.wurst.nochatreports.disable_signatures": "Wyłącz Sygnatury",
247251
"button.wurst.nochatreports.re-enable_signatures": "Ponownie Włącz Sygnatury",
248252
"description.wurst.setting.generic.attack_speed": "Szybkość ataku w kliknięciach na sekundę.\n0 = dynamicznie dostosowuje szybkość do długości odnowienia ataku.",
249-
"description.wurst.setting.generic.face_target.off": "Nie kieruj się na cel w ogóle. Zostanie wykryte przez wtyczki anty-cheat.",
250-
"description.wurst.setting.generic.face_target.server": "Kieruj się na cel po stronie serwera, jednocześnie pozwalając swobodnie poruszać kamerą po stronie klienta.",
251-
"description.wurst.setting.generic.face_target.client": "Kieruj się na cel poprzez poruszanie kamerą po stronie klienta. To najbardziej wiarygodna opcja, ale może być dezorientująca do patrzenia.",
252-
"description.wurst.setting.generic.face_target.spam": "Kieruj się na cel po stronie serwera i wysyłaj oddzielny pakiet za każdym razem. Może pomóc z niektórymi (zepsutymi) wtyczkami anty-cheat, ale bardziej prawdopodobne jest, że po prostu zostaniesz wyrzucony.",
253+
"description.wurst.setting.generic.face_target.off": "W ogóle nie patrz w stronę celu. Zostanie wykryte przez wtyczki anty-cheat.",
254+
"description.wurst.setting.generic.face_target.server": "Obróć się w stronę celu po stronie serwera, jednocześnie pozwalając swobodnie poruszać kamerą po stronie klienta.",
255+
"description.wurst.setting.generic.face_target.client": "Obróć się w stronę celu, przesuwając kamerę po stronie klienta. To najbardziej wiarygodna opcja, jednak może być nieco myląca dla wzroku.",
256+
"description.wurst.setting.generic.face_target.spam": "Obróć się w stronę celu po stronie serwera i za każdym razem wysyłaj osobny pakiet. Może pomóc z niektórymi (uszkodzonymi) wtyczkami anty-cheat, lecz zwiększa szanse na wyrzucenie cię z gry.",
253257
"description.wurst.setting.generic.filter_allays_combat": "Nie będzie atakować otuszków.",
254258
"description.wurst.setting.generic.filter_allays_vision": "Nie będzie pokazywać otuszków.",
255259
"description.wurst.setting.generic.filter_armor_stands_combat": "Nie będzie atakować stojaków na zbroję.",

0 commit comments

Comments
 (0)