Skip to content

Commit 8cb285d

Browse files
Change darkness->blindness in 1.19->1.18.2 (#908)
1 parent 04a6920 commit 8cb285d

File tree

6 files changed

+115
-4
lines changed

6 files changed

+115
-4
lines changed

common/src/main/java/com/viaversion/viabackwards/ViaBackwardsConfig.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public class ViaBackwardsConfig extends Config implements com.viaversion.viaback
3636
private boolean handlePingsAsInvAcknowledgements;
3737
private boolean bedrockAtY0;
3838
private boolean sculkShriekersToCryingObsidian;
39+
private boolean mapDarknessEffect;
3940
private boolean suppressEmulationWarnings;
4041

4142
public ViaBackwardsConfig(File configFile, Logger logger) {
@@ -57,6 +58,7 @@ private void loadFields() {
5758
handlePingsAsInvAcknowledgements = getBoolean("handle-pings-as-inv-acknowledgements", false);
5859
bedrockAtY0 = getBoolean("bedrock-at-y-0", false);
5960
sculkShriekersToCryingObsidian = getBoolean("sculk-shriekers-to-crying-obsidian", false);
61+
mapDarknessEffect = getBoolean("map-darkness-effect", true);
6062
suppressEmulationWarnings = getBoolean("suppress-emulation-warnings", false);
6163
}
6264

@@ -100,6 +102,11 @@ public boolean sculkShriekerToCryingObsidian() {
100102
return sculkShriekersToCryingObsidian;
101103
}
102104

105+
@Override
106+
public boolean mapDarknessEffect() {
107+
return mapDarknessEffect;
108+
}
109+
103110
@Override
104111
public boolean suppressEmulationWarnings() {
105112
return suppressEmulationWarnings;

common/src/main/java/com/viaversion/viabackwards/api/ViaBackwardsConfig.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,13 @@ public interface ViaBackwardsConfig extends Config {
7878
*/
7979
boolean sculkShriekerToCryingObsidian();
8080

81+
/**
82+
* Maps the darkness effect to blindness for 1.18.2 clients on 1.19+ servers.
83+
*
84+
* @return true if enabled
85+
*/
86+
boolean mapDarknessEffect();
87+
8188
/**
8289
* Suppresses warnings of missing emulations for certain features that are not supported (e.g. world height in 1.17+).
8390
*

common/src/main/java/com/viaversion/viabackwards/protocol/v1_19to1_18_2/Protocol1_19To1_18_2.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,19 +28,18 @@
2828
import com.viaversion.viabackwards.protocol.v1_19to1_18_2.rewriter.CommandRewriter1_19;
2929
import com.viaversion.viabackwards.protocol.v1_19to1_18_2.rewriter.EntityPacketRewriter1_19;
3030
import com.viaversion.viabackwards.protocol.v1_19to1_18_2.storage.DimensionRegistryStorage;
31+
import com.viaversion.viabackwards.protocol.v1_19to1_18_2.storage.EntityTracker1_19;
3132
import com.viaversion.viabackwards.protocol.v1_19to1_18_2.storage.NonceStorage;
3233
import com.viaversion.viaversion.api.Via;
3334
import com.viaversion.viaversion.api.connection.UserConnection;
3435
import com.viaversion.viaversion.api.minecraft.RegistryType;
35-
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_19;
3636
import com.viaversion.viaversion.api.minecraft.signature.SignableCommandArgumentsProvider;
3737
import com.viaversion.viaversion.api.minecraft.signature.model.DecoratableMessage;
3838
import com.viaversion.viaversion.api.minecraft.signature.model.MessageMetadata;
3939
import com.viaversion.viaversion.api.minecraft.signature.storage.ChatSession1_19_0;
4040
import com.viaversion.viaversion.api.protocol.packet.State;
4141
import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
4242
import com.viaversion.viaversion.api.type.Types;
43-
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
4443
import com.viaversion.viaversion.libs.gson.JsonElement;
4544
import com.viaversion.viaversion.protocols.base.ClientboundLoginPackets;
4645
import com.viaversion.viaversion.protocols.base.ServerboundLoginPackets;
@@ -364,7 +363,7 @@ public void register() {
364363
@Override
365364
public void init(final UserConnection user) {
366365
user.put(new DimensionRegistryStorage());
367-
addEntityTracker(user, new EntityTrackerBase(user, EntityTypes1_19.PLAYER));
366+
addEntityTracker(user, new EntityTracker1_19(user));
368367
}
369368

370369
@Override

common/src/main/java/com/viaversion/viabackwards/protocol/v1_19to1_18_2/rewriter/EntityPacketRewriter1_19.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,11 @@
2020
import com.viaversion.nbt.tag.CompoundTag;
2121
import com.viaversion.nbt.tag.ListTag;
2222
import com.viaversion.nbt.tag.NumberTag;
23+
import com.viaversion.viabackwards.ViaBackwards;
2324
import com.viaversion.viabackwards.api.rewriters.EntityRewriter;
2425
import com.viaversion.viabackwards.protocol.v1_19to1_18_2.Protocol1_19To1_18_2;
2526
import com.viaversion.viabackwards.protocol.v1_19to1_18_2.storage.DimensionRegistryStorage;
27+
import com.viaversion.viabackwards.protocol.v1_19to1_18_2.storage.EntityTracker1_19;
2628
import com.viaversion.viabackwards.protocol.v1_19to1_18_2.storage.LastDeathPosition;
2729
import com.viaversion.viabackwards.protocol.v1_19to1_18_2.storage.StoredPainting;
2830
import com.viaversion.viaversion.api.data.ParticleMappings;
@@ -111,6 +113,50 @@ public void register() {
111113
handler(wrapper -> {
112114
// Remove factor data
113115
wrapper.read(Types.OPTIONAL_NAMED_COMPOUND_TAG);
116+
117+
if (!ViaBackwards.getConfig().mapDarknessEffect()) {
118+
return;
119+
}
120+
121+
final EntityTracker1_19 tracker = tracker(wrapper.user());
122+
123+
final int entityId = wrapper.get(Types.VAR_INT, 0);
124+
final int effectId = wrapper.get(Types.VAR_INT, 1);
125+
if (effectId == 33) { // Newly added darkness, rewrite to blindness
126+
tracker.getAffectedByDarkness().add(entityId);
127+
wrapper.set(Types.VAR_INT, 1, 15);
128+
} else if (effectId == 15) { // Track actual blindness effect for removal later
129+
tracker.getAffectedByBlindness().add(entityId);
130+
}
131+
});
132+
}
133+
});
134+
135+
protocol.registerClientbound(ClientboundPackets1_19.REMOVE_MOB_EFFECT, new PacketHandlers() {
136+
@Override
137+
protected void register() {
138+
map(Types.VAR_INT); // Entity id
139+
map(Types.VAR_INT); // Effect id
140+
handler(wrapper -> {
141+
if (!ViaBackwards.getConfig().mapDarknessEffect()) {
142+
return;
143+
}
144+
145+
final int entityId = wrapper.get(Types.VAR_INT, 0);
146+
final int effectId = wrapper.get(Types.VAR_INT, 1);
147+
148+
final EntityTracker1_19 tracker = tracker(wrapper.user());
149+
if (effectId == 33) { // Remove darkness and the fake blindness effect if the client doesn't have actual blindness
150+
tracker.getAffectedByDarkness().rem(entityId);
151+
if (!tracker.getAffectedByBlindness().contains(entityId)) {
152+
wrapper.set(Types.VAR_INT, 1, 15);
153+
}
154+
} else if (effectId == 15) { // Remove blindness and cancel if the client has darkness (will be removed by darkness removal)
155+
tracker.getAffectedByBlindness().rem(entityId);
156+
if (tracker.getAffectedByDarkness().contains(entityId)) {
157+
wrapper.cancel();
158+
}
159+
}
114160
});
115161
}
116162
});
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*
2+
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
3+
* Copyright (C) 2016-2024 ViaVersion and contributors
4+
*
5+
* This program is free software: you can redistribute it and/or modify
6+
* it under the terms of the GNU General Public License as published by
7+
* the Free Software Foundation, either version 3 of the License, or
8+
* (at your option) any later version.
9+
*
10+
* This program is distributed in the hope that it will be useful,
11+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
* GNU General Public License for more details.
14+
*
15+
* You should have received a copy of the GNU General Public License
16+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
17+
*/
18+
package com.viaversion.viabackwards.protocol.v1_19to1_18_2.storage;
19+
20+
import com.viaversion.viaversion.api.connection.UserConnection;
21+
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_19;
22+
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
23+
import com.viaversion.viaversion.libs.fastutil.ints.IntArrayList;
24+
import com.viaversion.viaversion.libs.fastutil.ints.IntList;
25+
26+
public final class EntityTracker1_19 extends EntityTrackerBase {
27+
28+
private final IntList affectedByBlindness = new IntArrayList();
29+
private final IntList affectedByDarkness = new IntArrayList();
30+
31+
public EntityTracker1_19(final UserConnection connection) {
32+
super(connection, EntityTypes1_19.PLAYER);
33+
}
34+
35+
@Override
36+
public void removeEntity(final int id) {
37+
super.removeEntity(id);
38+
this.affectedByBlindness.rem(id);
39+
this.affectedByDarkness.rem(id);
40+
}
41+
42+
public IntList getAffectedByBlindness() {
43+
return affectedByBlindness;
44+
}
45+
46+
public IntList getAffectedByDarkness() {
47+
return affectedByDarkness;
48+
}
49+
}

common/src/main/resources/assets/viabackwards/config.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,8 @@ bedrock-at-y-0: false
2828
# If disabled, the client will see them as end portal frames.
2929
sculk-shriekers-to-crying-obsidian: true
3030
#
31+
# Maps the darkness effect to blindness for 1.18.2 clients on 1.19+ servers.
32+
map-darkness-effect: true
33+
#
3134
# Suppresses warnings of missing emulations for certain features that are not supported (e.g. world height in 1.17+).
32-
suppress-emulation-warnings: false
35+
suppress-emulation-warnings: false

0 commit comments

Comments
 (0)