Skip to content

Commit b03f0b7

Browse files
committed
Fixed blockstate bugs, fixed incompatibility with CodeChickenLib
- Fixes #150 - Fixes #149 - Fixes #148 - Fixes #146 - Fixes #143 - Fixes #142 - Fixes #149 - Fixes #144 - Fixes #145
1 parent 708ec7e commit b03f0b7

File tree

6 files changed

+87
-47
lines changed

6 files changed

+87
-47
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ sourceSets {
6464
}
6565

6666
minecraft {
67-
version "1.12.2-14.23.4.2703"
67+
version "1.12.2-14.23.5.2768"
6868
runDir "run"
6969
mappings "stable_39"
7070
makeObfSourceJar false
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.dimdev.utils;
2+
3+
import java.util.Objects;
4+
5+
public class Pair<L, R> {
6+
public final L left;
7+
public final R right;
8+
9+
public Pair(L left, R right) {
10+
this.left = left;
11+
this.right = right;
12+
}
13+
14+
@Override
15+
public boolean equals(Object obj) {
16+
return obj instanceof Pair &&
17+
Objects.equals(((Pair<?, ?>) obj).left, left) &&
18+
Objects.equals(((Pair<?, ?>) obj).right, right);
19+
}
20+
21+
@Override
22+
public int hashCode() {
23+
return Objects.hashCode(left) + Objects.hashCode(right) * 31;
24+
}
25+
}

src/main/java/org/dimdev/vanillafix/blockstates/NumericalBlockState.java

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,13 @@
2121
import net.minecraft.world.World;
2222
import net.minecraftforge.fml.relauncher.Side;
2323
import net.minecraftforge.fml.relauncher.SideOnly;
24-
import org.dimdev.utils.LeftIdentityPair;
24+
import org.dimdev.utils.Pair;
2525

2626
import javax.annotation.Nullable;
27-
import java.util.*;
27+
import java.util.Collection;
28+
import java.util.HashMap;
29+
import java.util.List;
30+
import java.util.Map;
2831

2932
/**
3033
* An implementation of IBlockState which stores the properties in a bitfield rather
@@ -35,10 +38,10 @@
3538
*/
3639
@SuppressWarnings("deprecation")
3740
public class NumericalBlockState extends BlockStateBase {
38-
private static final Map<LeftIdentityPair<BlockStateContainer, Integer>, NumericalBlockState> blockStates = new HashMap<>(); // TODO: WeakHashMap?
39-
private static final Map<LeftIdentityPair<IProperty<?>, Comparable<?>>, Integer> valueToNumber = new HashMap<>();
40-
private static final Map<LeftIdentityPair<IProperty<?>, Integer>, Comparable<?>> numberToValue = new HashMap<>();
41-
private static final Map<IProperty<?>, Integer> propertyWidths = new IdentityHashMap<>();
41+
private static final Map<Pair<BlockStateContainer, Integer>, NumericalBlockState> blockStates = new HashMap<>(); // TODO: WeakHashMap?
42+
private static final Map<Pair<IProperty<?>, Comparable<?>>, Integer> valueToNumber = new HashMap<>();
43+
private static final Map<Pair<IProperty<?>, Integer>, Comparable<?>> numberToValue = new HashMap<>();
44+
private static final Map<IProperty<?>, Integer> propertyWidths = new HashMap<>();
4245

4346
protected final BlockStateContainer container;
4447
protected final Block block;
@@ -54,7 +57,7 @@ public static NumericalBlockState get(BlockStateContainer container, int data) {
5457
// Getting it from a cache is necessary to make sure == between two NumericalBlockStates
5558
// with the same container and data will work. The cache is shared for all containers
5659
// to avoid the overhead of many small HashMaps.
57-
LeftIdentityPair<BlockStateContainer, Integer> key = new LeftIdentityPair<>(container, data);
60+
Pair<BlockStateContainer, Integer> key = new Pair<>(container, data);
5861
NumericalBlockState blockState = blockStates.get(key);
5962

6063
if (blockState == null) {
@@ -71,7 +74,7 @@ public static NumericalBlockState fromPropertyValueMap(BlockStateContainer conta
7174
int data = 0;
7275
for (Map.Entry<IProperty<?>, Comparable<?>> entry : map.entrySet()) {
7376
IProperty<?> property = entry.getKey();
74-
data |= valueToNumber.get(new LeftIdentityPair<>(property, entry.getValue())) << offsets.get(property);
77+
data |= valueToNumber.get(new Pair<>(property, entry.getValue())) << offsets.get(property);
7578
}
7679

7780
return get(container, data);
@@ -88,8 +91,8 @@ public static <T extends Comparable<T>> void makePropertyInfo(IProperty<T> prope
8891
// Fill the 'number -> value' and 'value -> number' maps
8992
int i = 0;
9093
for (T value : allowedValues) {
91-
numberToValue.put(new LeftIdentityPair<>(property, i), value);
92-
valueToNumber.put(new LeftIdentityPair<>(property, value), i);
94+
numberToValue.put(new Pair<>(property, i), value);
95+
valueToNumber.put(new Pair<>(property, value), i);
9396
i++;
9497
}
9598
}
@@ -109,7 +112,7 @@ public <T extends Comparable<T>> T getValue(IProperty<T> property) {
109112

110113
int width = propertyWidths.get(property);
111114
int number = data >>> offset & 0xFFFFFFFF >>> 32 - width;
112-
Comparable<?> value = numberToValue.get(new LeftIdentityPair<>(property, number));
115+
Comparable<?> value = numberToValue.get(new Pair<>(property, number));
113116

114117
return property.getValueClass().cast(value);
115118
}
@@ -122,7 +125,7 @@ public <T extends Comparable<T>, V extends T> IBlockState withProperty(IProperty
122125
throw new IllegalArgumentException("Cannot set property " + property + " as it does not exist in " + container);
123126
}
124127

125-
int number = valueToNumber.get(new LeftIdentityPair<>(property, value));
128+
int number = valueToNumber.get(new Pair<>(property, value));
126129
int width = propertyWidths.get(property);
127130
int mask = (0xFFFFFFFF >>> offset & 0xFFFFFFFF >>> 32 - width) << offset;
128131
int newData = data & ~mask | number << offset;

src/main/java/org/dimdev/vanillafix/dynamicresources/DynamicTextureMap.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
import net.minecraft.client.resources.IResource;
77
import net.minecraft.client.resources.IResourceManager;
88
import net.minecraft.util.ResourceLocation;
9-
import net.minecraftforge.client.ForgeHooksClient;
9+
import net.minecraftforge.client.event.TextureStitchEvent;
10+
import net.minecraftforge.client.model.ModelDynBucket;
11+
import net.minecraftforge.client.model.ModelLoader;
1012
import org.apache.logging.log4j.LogManager;
1113
import org.apache.logging.log4j.Logger;
1214

@@ -25,8 +27,8 @@ public class DynamicTextureMap extends TextureMap {
2527
private final Map<String, TextureAtlasSprite> loadedSprites = new ConcurrentHashMap<>();
2628
private final List<TextureAtlasSprite> spritesNeedingUpload = new CopyOnWriteArrayList<>();
2729
private final Lock spriteLoadingLock = new ReentrantLock();
28-
private DynamicStitcher stitcher;
29-
private boolean atlasNeedsExpansion;
30+
private DynamicStitcher stitcher = null;
31+
private boolean atlasNeedsExpansion = false;
3032

3133
public DynamicTextureMap(String basePath) {
3234
super(basePath);
@@ -60,8 +62,11 @@ public void init() {
6062
TextureUtil.allocateTextureImpl(getGlTextureId(), mipmapLevels, stitcher.getImageWidth(), stitcher.getImageHeight());
6163
LOGGER.info("Created {}x{} '{}' atlas", stitcher.getImageWidth(), stitcher.getImageHeight(), basePath);
6264

63-
ForgeHooksClient.onTextureStitchedPre(this);
64-
ForgeHooksClient.onTextureStitchedPost(this);
65+
EventUtil.postEventAllowingErrors(new TextureStitchEvent.Pre(this));
66+
ModelLoader.White.INSTANCE.register(this);
67+
ModelDynBucket.LoaderDynBucket.INSTANCE.register(this);
68+
69+
EventUtil.postEventAllowingErrors(new TextureStitchEvent.Post(this));
6570
}
6671

6772
@Override
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package org.dimdev.vanillafix.dynamicresources;
2+
3+
import net.minecraftforge.common.MinecraftForge;
4+
import net.minecraftforge.fml.common.eventhandler.Event;
5+
import net.minecraftforge.fml.common.eventhandler.EventBus;
6+
import net.minecraftforge.fml.common.eventhandler.IEventListener;
7+
import org.apache.logging.log4j.LogManager;
8+
import org.apache.logging.log4j.Logger;
9+
10+
import java.lang.reflect.Field;
11+
12+
public class EventUtil {
13+
private static final Logger LOGGER = LogManager.getLogger();
14+
15+
public static void postEventAllowingErrors(Event event) {
16+
int busID;
17+
try {
18+
Field busIDField = EventBus.class.getDeclaredField("busID");
19+
busIDField.setAccessible(true);
20+
busID = (int) busIDField.get(MinecraftForge.EVENT_BUS);
21+
} catch (ReflectiveOperationException e) {
22+
throw new RuntimeException(e);
23+
}
24+
25+
IEventListener[] listeners = event.getListenerList().getListeners(busID);
26+
for (IEventListener listener : listeners) {
27+
try {
28+
listener.invoke(event);
29+
} catch (Throwable t) {
30+
LOGGER.error(event + " listener '" + listener + "' threw exception, models may be broken", t);
31+
}
32+
}
33+
}
34+
}

src/main/java/org/dimdev/vanillafix/dynamicresources/mixins/client/MixinModelManager.java

Lines changed: 2 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,9 @@
1212
import net.minecraftforge.client.model.ModelLoader;
1313
import net.minecraftforge.client.model.ModelLoaderRegistry;
1414
import net.minecraftforge.common.ForgeModContainer;
15-
import net.minecraftforge.common.MinecraftForge;
1615
import net.minecraftforge.fluids.FluidRegistry;
17-
import net.minecraftforge.fml.common.eventhandler.Event;
18-
import net.minecraftforge.fml.common.eventhandler.EventBus;
19-
import net.minecraftforge.fml.common.eventhandler.IEventListener;
20-
import org.apache.logging.log4j.LogManager;
21-
import org.apache.logging.log4j.Logger;
2216
import org.dimdev.vanillafix.dynamicresources.DynamicTextureMap;
17+
import org.dimdev.vanillafix.dynamicresources.EventUtil;
2318
import org.dimdev.vanillafix.dynamicresources.model.DynamicBakedModelProvider;
2419
import org.dimdev.vanillafix.dynamicresources.model.DynamicModelProvider;
2520
import org.dimdev.vanillafix.dynamicresources.model.ModelLocationInformation;
@@ -38,8 +33,6 @@ public class MixinModelManager {
3833
@Shadow @Final private BlockModelShapes modelProvider;
3934
@Shadow @Final private TextureMap texMap;
4035

41-
private static final Logger LOGGER = LogManager.getLogger();
42-
4336
/**
4437
* @reason Don't set up the ModelLoader. Instead, set up the caching DynamicModelProvider
4538
* and DynamicBakedModelProviders, which will act as the model registry.
@@ -81,29 +74,9 @@ public void onResourceManagerReload(IResourceManager resourceManager) {
8174

8275
// Post the event, but just log an error if a listener throws an exception. The ModelLoader is
8376
// null, but very few mods use it. Custom support will be needed for those that do.
84-
postEventAllowingErrors(new ModelBakeEvent((ModelManager) (Object) this, modelRegistry, null));
77+
EventUtil.postEventAllowingErrors(new ModelBakeEvent((ModelManager) (Object) this, modelRegistry, null));
8578

8679
// Make the model provider load blockstate to model information. See MixinBlockModelShapes
8780
modelProvider.reloadModels();
8881
}
89-
90-
private static void postEventAllowingErrors(Event event) {
91-
int busID;
92-
try {
93-
Field busIDField = EventBus.class.getDeclaredField("busID");
94-
busIDField.setAccessible(true);
95-
busID = (int) busIDField.get(MinecraftForge.EVENT_BUS);
96-
} catch (ReflectiveOperationException e) {
97-
throw new RuntimeException(e);
98-
}
99-
100-
IEventListener[] listeners = event.getListenerList().getListeners(busID);
101-
for (IEventListener listener : listeners) {
102-
try {
103-
listener.invoke(event);
104-
} catch (Throwable t) {
105-
LOGGER.error(event + " listener '" + listener + "' threw exception, models may be broken", t);
106-
}
107-
}
108-
}
10982
}

0 commit comments

Comments
 (0)