Skip to content

Commit 73ab039

Browse files
committed
注入一个去重调试列表,希望能抓到我要的错误
1 parent f5dbec6 commit 73ab039

3 files changed

Lines changed: 192 additions & 0 deletions

File tree

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
package github.kasuminova.novaeng.common.util;
2+
3+
import github.kasuminova.novaeng.NovaEngineeringCore;
4+
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
5+
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
6+
import org.jspecify.annotations.NonNull;
7+
8+
import java.util.AbstractList;
9+
import java.util.Collection;
10+
import java.util.List;
11+
import java.util.Objects;
12+
import java.util.RandomAccess;
13+
import java.util.Set;
14+
15+
public class SetList<T> extends AbstractList<T> implements RandomAccess {
16+
17+
private final List<T> list = new ObjectArrayList<>();
18+
private final Set<T> set = new ObjectOpenHashSet<>();
19+
20+
@Override
21+
public T get(int index) {
22+
return list.get(index);
23+
}
24+
25+
@Override
26+
public int size() {
27+
return list.size();
28+
}
29+
30+
@Override
31+
public boolean contains(Object o) {
32+
return set.contains(o);
33+
}
34+
35+
@Override
36+
public boolean add(T element) {
37+
if (!set.add(element)) {
38+
warnDuplicate(element);
39+
return false;
40+
}
41+
list.add(element);
42+
modCount++;
43+
return true;
44+
}
45+
46+
@Override
47+
public void add(int index, T element) {
48+
if (!set.add(element)) {
49+
warnDuplicate(element);
50+
return;
51+
}
52+
list.add(index, element);
53+
modCount++;
54+
}
55+
56+
@Override
57+
public boolean addAll(@NonNull Collection<? extends T> collection) {
58+
return addAll(list.size(), collection);
59+
}
60+
61+
@Override
62+
public boolean addAll(int index, @NonNull Collection<? extends T> collection) {
63+
int insertIndex = index;
64+
boolean changed = false;
65+
for (T element : collection) {
66+
if (set.add(element)) {
67+
list.add(insertIndex, element);
68+
insertIndex++;
69+
changed = true;
70+
} else {
71+
warnDuplicate(element);
72+
}
73+
}
74+
if (changed) {
75+
modCount++;
76+
}
77+
return changed;
78+
}
79+
80+
@Override
81+
public T set(int index, T element) {
82+
T oldValue = list.get(index);
83+
if (Objects.equals(oldValue, element)) {
84+
return oldValue;
85+
}
86+
87+
int existingIndex = list.indexOf(element);
88+
if (existingIndex >= 0) {
89+
warnDuplicate(element);
90+
list.remove(existingIndex);
91+
if (existingIndex < index) {
92+
index--;
93+
}
94+
list.set(index, element);
95+
set.remove(oldValue);
96+
modCount++;
97+
return oldValue;
98+
}
99+
100+
list.set(index, element);
101+
set.remove(oldValue);
102+
set.add(element);
103+
modCount++;
104+
return oldValue;
105+
}
106+
107+
@Override
108+
public T remove(int index) {
109+
T removed = list.remove(index);
110+
set.remove(removed);
111+
modCount++;
112+
return removed;
113+
}
114+
115+
@Override
116+
public boolean remove(Object o) {
117+
int index = list.indexOf(o);
118+
if (index < 0) {
119+
return false;
120+
}
121+
remove(index);
122+
return true;
123+
}
124+
125+
@Override
126+
public void clear() {
127+
if (list.isEmpty()) {
128+
return;
129+
}
130+
list.clear();
131+
set.clear();
132+
modCount++;
133+
}
134+
135+
@Override
136+
public int indexOf(Object o) {
137+
return list.indexOf(o);
138+
}
139+
140+
@Override
141+
public int lastIndexOf(Object o) {
142+
return list.lastIndexOf(o);
143+
}
144+
145+
private void warnDuplicate(T element) {
146+
NovaEngineeringCore.log.warn("[{}]SetList detected duplicate element: {}", Thread.currentThread().getName(), element);
147+
}
148+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package github.kasuminova.novaeng.mixin.minecraft;
2+
3+
import github.kasuminova.novaeng.common.util.SetList;
4+
import net.minecraft.tileentity.TileEntity;
5+
import net.minecraft.world.World;
6+
import org.objectweb.asm.Opcodes;
7+
import org.spongepowered.asm.mixin.Final;
8+
import org.spongepowered.asm.mixin.Mixin;
9+
import org.spongepowered.asm.mixin.Mutable;
10+
import org.spongepowered.asm.mixin.Shadow;
11+
import org.spongepowered.asm.mixin.injection.At;
12+
import org.spongepowered.asm.mixin.injection.Redirect;
13+
14+
import java.util.List;
15+
16+
@Mixin(World.class)
17+
public class MixinWorld {
18+
19+
@Shadow
20+
@Final
21+
@Mutable
22+
public List<TileEntity> loadedTileEntityList;
23+
@Shadow
24+
@Final
25+
@Mutable
26+
public List<TileEntity> tickableTileEntities;
27+
@Shadow
28+
@Final
29+
@Mutable
30+
private List<TileEntity> addedTileEntityList;
31+
@Shadow
32+
@Final
33+
@Mutable
34+
private List<TileEntity> tileEntitiesToBeRemoved;
35+
36+
@Redirect(method = "<init>",at = @At(value = "FIELD", target = "Lnet/minecraft/world/World;addedTileEntityList:Ljava/util/List;", opcode = Opcodes.PUTFIELD))
37+
public void onInit(World instance, List<TileEntity> value) {
38+
this.loadedTileEntityList = new SetList<>();
39+
this.tickableTileEntities = new SetList<>();
40+
this.addedTileEntityList = new SetList<>();
41+
this.tileEntitiesToBeRemoved = new SetList<>();
42+
}
43+
}

src/main/resources/mixins.novaeng_core.mod.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
"libvulpes.MixinTileFluidHatch",
7979
"lootoverhaul.MixinConfigIdFileGenerator",
8080
"mets.MixinEntityTachyonBullet",
81+
"minecraft.MixinWorld",
8182
"mmce.AccessorAbstractMachine",
8283
"mmce.MixinBlockArrayCache",
8384
"mmce.MixinBlockArrayPreviewRenderHelper",

0 commit comments

Comments
 (0)