33import com .google .common .cache .CacheBuilder ;
44import com .google .common .cache .CacheLoader ;
55import com .google .common .cache .LoadingCache ;
6+ import com .google .common .collect .Iterators ;
7+ import com .google .common .collect .Maps ;
68import net .minecraft .client .renderer .entity .EntityRenderer ;
79import net .minecraft .client .renderer .entity .EntityRendererProvider ;
810import net .minecraft .client .renderer .entity .EntityRenderers ;
1214import org .jetbrains .annotations .NotNull ;
1315import org .jetbrains .annotations .Nullable ;
1416
17+ import java .util .AbstractCollection ;
18+ import java .util .AbstractSet ;
1519import java .util .Collection ;
20+ import java .util .Iterator ;
1621import java .util .Map ;
22+ import java .util .Objects ;
23+ import java .util .Optional ;
1724import java .util .Set ;
1825import java .util .concurrent .ExecutionException ;
1926
27+ @ SuppressWarnings ("OptionalAssignedToNull" )
2028public 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