Skip to content

Commit 4bdddf1

Browse files
committed
Attempt to improve parity/reliability of dynamic_entity_renderers
1 parent 211e404 commit 4bdddf1

File tree

1 file changed

+76
-18
lines changed

1 file changed

+76
-18
lines changed

common/src/main/java/org/embeddedt/modernfix/entity/EntityRendererMap.java

Lines changed: 76 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import com.google.common.cache.CacheBuilder;
44
import com.google.common.cache.CacheLoader;
55
import com.google.common.cache.LoadingCache;
6+
import com.google.common.collect.Iterators;
7+
import com.google.common.collect.Maps;
68
import net.minecraft.client.renderer.entity.EntityRenderer;
79
import net.minecraft.client.renderer.entity.EntityRendererProvider;
810
import net.minecraft.client.renderer.entity.EntityRenderers;
@@ -12,14 +14,20 @@
1214
import org.jetbrains.annotations.NotNull;
1315
import org.jetbrains.annotations.Nullable;
1416

17+
import java.util.AbstractCollection;
18+
import java.util.AbstractSet;
1519
import java.util.Collection;
20+
import java.util.Iterator;
1621
import java.util.Map;
22+
import java.util.Objects;
23+
import java.util.Optional;
1724
import java.util.Set;
1825
import java.util.concurrent.ExecutionException;
1926

27+
@SuppressWarnings("OptionalAssignedToNull")
2028
public class EntityRendererMap implements Map<EntityType<?>, EntityRenderer<?>> {
2129
private final Map<EntityType<?>, EntityRendererProvider<?>> rendererProviders;
22-
private final LoadingCache<EntityType<?>, EntityRenderer<?>> rendererMap;
30+
private final LoadingCache<EntityType<?>, Optional<EntityRenderer<?>>> rendererMap;
2331
private final EntityRendererProvider.Context context;
2432

2533
public EntityRendererMap(Map<EntityType<?>, EntityRendererProvider<?>> rendererProviders, EntityRendererProvider.Context context) {
@@ -28,22 +36,22 @@ public EntityRendererMap(Map<EntityType<?>, EntityRendererProvider<?>> rendererP
2836
this.rendererMap = CacheBuilder.newBuilder().build(new RenderConstructor());
2937
}
3038

31-
class RenderConstructor extends CacheLoader<EntityType<?>, EntityRenderer<?>> {
39+
class RenderConstructor extends CacheLoader<EntityType<?>, Optional<EntityRenderer<?>>> {
3240
@Override
33-
public EntityRenderer<?> load(EntityType<?> key) throws Exception {
41+
public Optional<EntityRenderer<?>> load(EntityType<?> key) throws Exception {
3442
EntityRendererProvider<?> provider = rendererProviders.get(key);
43+
if(provider == null)
44+
return Optional.empty();
3545
synchronized(EntityRenderers.class) {
3646
EntityRenderer<?> renderer;
3747
try {
38-
if(provider == null)
39-
throw new RuntimeException("Provider not registered");
4048
renderer = provider.create(context);
4149
ModernFix.LOGGER.info("Loaded entity {}", BuiltInRegistries.ENTITY_TYPE.getKey(key));
4250
} catch(RuntimeException e) {
4351
ModernFix.LOGGER.error("Failed to create entity model for " + BuiltInRegistries.ENTITY_TYPE.getKey(key) + ":", e);
4452
renderer = new ErroredEntityRenderer<>(context);
4553
}
46-
return renderer;
54+
return Optional.ofNullable(renderer);
4755
}
4856
}
4957
}
@@ -71,10 +79,8 @@ public boolean containsValue(Object o) {
7179
@Override
7280
public EntityRenderer<?> get(Object o) {
7381
try {
74-
EntityRenderer<?> renderer = rendererMap.get((EntityType<?>)o);
75-
if(renderer == null)
76-
throw new AssertionError("Returned entity renderer should never be null");
77-
return renderer;
82+
Optional<EntityRenderer<?>> renderer = rendererMap.get((EntityType<?>)o);
83+
return renderer.orElse(null);
7884
} catch (IllegalStateException e) {
7985
return null; /* emulate value not being present if recursive load occurs */
8086
} catch (ExecutionException e) {
@@ -85,21 +91,21 @@ public EntityRenderer<?> get(Object o) {
8591
@Nullable
8692
@Override
8793
public EntityRenderer<?> put(EntityType<?> entityType, EntityRenderer<?> entityRenderer) {
88-
EntityRenderer<?> old = rendererMap.getIfPresent(entityType);
89-
rendererMap.put(entityType, entityRenderer);
90-
return old;
94+
Optional<EntityRenderer<?>> old = rendererMap.getIfPresent(entityType);
95+
rendererMap.put(entityType, Optional.ofNullable(entityRenderer));
96+
return old != null ? old.orElse(null) : null;
9197
}
9298

9399
@Override
94100
public EntityRenderer<?> remove(Object o) {
95-
EntityRenderer<?> r = rendererMap.getIfPresent(o);
101+
Optional<EntityRenderer<?>> old = rendererMap.getIfPresent(o);
96102
rendererMap.invalidate(o);
97-
return r;
103+
return old != null ? old.orElse(null) : null;
98104
}
99105

100106
@Override
101107
public void putAll(@NotNull Map<? extends EntityType<?>, ? extends EntityRenderer<?>> map) {
102-
rendererMap.putAll(map);
108+
rendererMap.putAll(Maps.transformValues(map, Optional::ofNullable));
103109
}
104110

105111
@Override
@@ -116,12 +122,64 @@ public Set<EntityType<?>> keySet() {
116122
@NotNull
117123
@Override
118124
public Collection<EntityRenderer<?>> values() {
119-
return rendererMap.asMap().values();
125+
return new AbstractCollection<>() {
126+
@Override
127+
public Iterator<EntityRenderer<?>> iterator() {
128+
return Iterators.transform(Iterators.unmodifiableIterator(rendererProviders.keySet().iterator()), EntityRendererMap.this::get);
129+
}
130+
131+
@Override
132+
public int size() {
133+
return rendererProviders.size();
134+
}
135+
};
136+
}
137+
138+
private class Entry implements Map.Entry<EntityType<?>, EntityRenderer<?>> {
139+
private final EntityType<?> key;
140+
141+
private Entry(EntityType<?> key) {
142+
this.key = key;
143+
}
144+
145+
@Override
146+
public EntityType<?> getKey() {
147+
return key;
148+
}
149+
150+
@Override
151+
public EntityRenderer<?> getValue() {
152+
return get(key);
153+
}
154+
155+
@Override
156+
public EntityRenderer<?> setValue(EntityRenderer<?> value) {
157+
return put(key, value);
158+
}
120159
}
121160

122161
@NotNull
123162
@Override
124163
public Set<Map.Entry<EntityType<?>, EntityRenderer<?>>> entrySet() {
125-
return rendererMap.asMap().entrySet();
164+
return new AbstractSet<>() {
165+
@Override
166+
public Iterator<Map.Entry<EntityType<?>, EntityRenderer<?>>> iterator() {
167+
return Iterators.transform(Iterators.unmodifiableIterator(rendererProviders.keySet().iterator()), Entry::new);
168+
}
169+
170+
@Override
171+
public boolean contains(Object o) {
172+
if (o instanceof Map.Entry<?,?> e) {
173+
return rendererProviders.containsKey(e.getKey()) && Objects.equals(get(e.getKey()), e.getValue());
174+
} else {
175+
return false;
176+
}
177+
}
178+
179+
@Override
180+
public int size() {
181+
return rendererProviders.size();
182+
}
183+
};
126184
}
127185
}

0 commit comments

Comments
 (0)