mirror of
https://github.com/MineLittlePony/MineLittlePony.git
synced 2024-11-25 22:07:59 +01:00
Change Pony into a record and track whether a IPony instance was returned as a default skin or not separate from the texture id
This commit is contained in:
parent
d7d0c71ca5
commit
84a78ce4b9
6 changed files with 40 additions and 65 deletions
|
@ -7,6 +7,7 @@ import org.jetbrains.annotations.Nullable;
|
||||||
import com.google.common.collect.ComparisonChain;
|
import com.google.common.collect.ComparisonChain;
|
||||||
import com.minelittlepony.api.pony.meta.Race;
|
import com.minelittlepony.api.pony.meta.Race;
|
||||||
import com.minelittlepony.client.MineLittlePony;
|
import com.minelittlepony.client.MineLittlePony;
|
||||||
|
import com.minelittlepony.settings.PonyConfig;
|
||||||
|
|
||||||
public interface IPony extends Comparable<IPony> {
|
public interface IPony extends Comparable<IPony> {
|
||||||
|
|
||||||
|
@ -41,7 +42,9 @@ public interface IPony extends Comparable<IPony> {
|
||||||
/**
|
/**
|
||||||
* Gets the race associated with this pony.
|
* Gets the race associated with this pony.
|
||||||
*/
|
*/
|
||||||
Race race();
|
default Race race() {
|
||||||
|
return PonyConfig.getEffectiveRace(metadata().getRace());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the texture used for rendering this pony.
|
* Gets the texture used for rendering this pony.
|
||||||
|
|
|
@ -7,13 +7,13 @@ import com.minelittlepony.api.pony.IPony;
|
||||||
import com.minelittlepony.api.pony.IPonyManager;
|
import com.minelittlepony.api.pony.IPonyManager;
|
||||||
import com.minelittlepony.client.IPreviewModel;
|
import com.minelittlepony.client.IPreviewModel;
|
||||||
import com.minelittlepony.client.MineLittlePony;
|
import com.minelittlepony.client.MineLittlePony;
|
||||||
import com.minelittlepony.client.pony.Pony;
|
import com.minelittlepony.client.render.EquineRenderManager;
|
||||||
import com.minelittlepony.hdskins.client.dummy.*;
|
import com.minelittlepony.hdskins.client.dummy.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dummy model used for the skin uploading screen.
|
* Dummy model used for the skin uploading screen.
|
||||||
*/
|
*/
|
||||||
class DummyPony extends DummyPlayer implements IPreviewModel, ModelAttributes.Swimmer, IPonyManager.ForcedPony, Pony.RegistrationHandler {
|
class DummyPony extends DummyPlayer implements IPreviewModel, ModelAttributes.Swimmer, IPonyManager.ForcedPony, EquineRenderManager.RegistrationHandler {
|
||||||
|
|
||||||
public DummyPony(ClientWorld world, PlayerSkins<?> textures) {
|
public DummyPony(ClientWorld world, PlayerSkins<?> textures) {
|
||||||
super(world, textures);
|
super(world, textures);
|
||||||
|
|
|
@ -3,6 +3,7 @@ package com.minelittlepony.client.mixin;
|
||||||
import com.minelittlepony.api.pony.IPony;
|
import com.minelittlepony.api.pony.IPony;
|
||||||
import com.minelittlepony.client.MineLittlePony;
|
import com.minelittlepony.client.MineLittlePony;
|
||||||
import com.minelittlepony.client.pony.Pony;
|
import com.minelittlepony.client.pony.Pony;
|
||||||
|
import com.minelittlepony.client.render.EquineRenderManager;
|
||||||
|
|
||||||
import net.minecraft.client.network.AbstractClientPlayerEntity;
|
import net.minecraft.client.network.AbstractClientPlayerEntity;
|
||||||
import net.minecraft.client.network.ClientPlayerEntity;
|
import net.minecraft.client.network.ClientPlayerEntity;
|
||||||
|
@ -18,7 +19,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
@Mixin(ClientPlayerEntity.class)
|
@Mixin(ClientPlayerEntity.class)
|
||||||
abstract class MixinClientPlayerEntity extends AbstractClientPlayerEntity implements Pony.RegistrationHandler {
|
abstract class MixinClientPlayerEntity extends AbstractClientPlayerEntity implements EquineRenderManager.RegistrationHandler {
|
||||||
public MixinClientPlayerEntity() { super(null, null); }
|
public MixinClientPlayerEntity() { super(null, null); }
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
|
|
|
@ -1,76 +1,32 @@
|
||||||
package com.minelittlepony.client.pony;
|
package com.minelittlepony.client.pony;
|
||||||
|
|
||||||
import com.google.common.base.MoreObjects;
|
|
||||||
import com.minelittlepony.api.pony.IPony;
|
import com.minelittlepony.api.pony.IPony;
|
||||||
import com.minelittlepony.api.pony.IPonyData;
|
import com.minelittlepony.api.pony.IPonyData;
|
||||||
import com.minelittlepony.api.pony.meta.Race;
|
|
||||||
import com.minelittlepony.api.pony.network.MsgPonyData;
|
import com.minelittlepony.api.pony.network.MsgPonyData;
|
||||||
import com.minelittlepony.settings.PonyConfig;
|
|
||||||
|
|
||||||
import net.minecraft.util.Identifier;
|
import net.minecraft.util.Identifier;
|
||||||
|
|
||||||
import org.jetbrains.annotations.Unmodifiable;
|
public record Pony (
|
||||||
|
Identifier texture,
|
||||||
@Unmodifiable
|
Memoize<IPonyData> memoizedData,
|
||||||
public class Pony implements IPony {
|
boolean defaulted
|
||||||
private final Identifier texture;
|
) implements IPony {
|
||||||
private final Memoize<IPonyData> metadata;
|
|
||||||
|
|
||||||
private boolean defaulted;
|
|
||||||
|
|
||||||
Pony(Identifier resource, Memoize<IPonyData> data) {
|
|
||||||
texture = resource;
|
|
||||||
metadata = data;
|
|
||||||
}
|
|
||||||
|
|
||||||
Pony(Identifier resource) {
|
Pony(Identifier resource) {
|
||||||
this(resource, PonyData.parse(resource));
|
this(resource, PonyData.parse(resource), false);
|
||||||
}
|
|
||||||
|
|
||||||
public IPony markDefaulted() {
|
|
||||||
defaulted = true;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean defaulted() {
|
|
||||||
return defaulted;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasMetadata() {
|
public boolean hasMetadata() {
|
||||||
return metadata.isPresent();
|
return memoizedData.isPresent();
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Race race() {
|
|
||||||
return PonyConfig.getEffectiveRace(metadata().getRace());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Identifier texture() {
|
|
||||||
return texture;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IPonyData metadata() {
|
public IPonyData metadata() {
|
||||||
return metadata.get(PonyData.NULL);
|
return memoizedData.get(PonyData.NULL);
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return MoreObjects.toStringHelper(this)
|
|
||||||
.add("texture", texture)
|
|
||||||
.add("metadata", metadata)
|
|
||||||
.add("defaulted", defaulted)
|
|
||||||
.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface RegistrationHandler {
|
|
||||||
boolean shouldUpdateRegistration(IPony pony);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IPony snapshot(IPony pony) {
|
public static IPony snapshot(IPony pony) {
|
||||||
return new Pony(pony.texture(), Memoize.of(new MsgPonyData(pony.metadata(), pony.defaulted())));
|
return new Pony(pony.texture(), Memoize.of(new MsgPonyData(pony.metadata(), pony.defaulted())), pony.defaulted());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
package com.minelittlepony.client.pony;
|
package com.minelittlepony.client.pony;
|
||||||
|
|
||||||
import com.google.common.cache.CacheBuilder;
|
import com.google.common.cache.*;
|
||||||
import com.google.common.cache.CacheLoader;
|
|
||||||
import com.google.common.cache.LoadingCache;
|
|
||||||
import com.minelittlepony.api.pony.IPony;
|
import com.minelittlepony.api.pony.IPony;
|
||||||
import com.minelittlepony.api.pony.IPonyManager;
|
import com.minelittlepony.api.pony.IPonyManager;
|
||||||
import com.minelittlepony.client.MineLittlePony;
|
import com.minelittlepony.client.MineLittlePony;
|
||||||
|
@ -38,6 +36,10 @@ public class PonyManager implements IPonyManager, SimpleSynchronousResourceReloa
|
||||||
|
|
||||||
private final PonyConfig config;
|
private final PonyConfig config;
|
||||||
|
|
||||||
|
private final Cache<Identifier, IPony> defaultedPoniesCache = CacheBuilder.newBuilder()
|
||||||
|
.expireAfterAccess(30, TimeUnit.SECONDS)
|
||||||
|
.build();
|
||||||
|
|
||||||
private final LoadingCache<Identifier, IPony> poniesCache = CacheBuilder.newBuilder()
|
private final LoadingCache<Identifier, IPony> poniesCache = CacheBuilder.newBuilder()
|
||||||
.expireAfterAccess(30, TimeUnit.SECONDS)
|
.expireAfterAccess(30, TimeUnit.SECONDS)
|
||||||
.build(CacheLoader.from(Pony::new));
|
.build(CacheLoader.from(Pony::new));
|
||||||
|
@ -67,7 +69,7 @@ public class PonyManager implements IPonyManager, SimpleSynchronousResourceReloa
|
||||||
try {
|
try {
|
||||||
return poniesCache.get(resource);
|
return poniesCache.get(resource);
|
||||||
} catch (ExecutionException e) {
|
} catch (ExecutionException e) {
|
||||||
return new Pony(resource, PonyData.MEM_NULL);
|
return new Pony(resource, PonyData.MEM_NULL, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,10 +113,18 @@ public class PonyManager implements IPonyManager, SimpleSynchronousResourceReloa
|
||||||
return pony;
|
return pony;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private IPony getAsDefaulted(IPony pony) {
|
||||||
|
try {
|
||||||
|
return defaultedPoniesCache.get(pony.texture(), () -> new Pony(pony.texture(), ((Pony)pony).memoizedData(), true));
|
||||||
|
} catch (ExecutionException e) {
|
||||||
|
return pony;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IPony getDefaultPony(UUID uuid) {
|
public IPony getDefaultPony(UUID uuid) {
|
||||||
if (config.ponyLevel.get() != PonyLevel.PONIES) {
|
if (config.ponyLevel.get() != PonyLevel.PONIES) {
|
||||||
return ((Pony)getPony(DefaultSkinHelper.getTexture(uuid))).markDefaulted();
|
return getAsDefaulted(getPony(DefaultSkinHelper.getTexture(uuid)));
|
||||||
}
|
}
|
||||||
|
|
||||||
return getBackgroundPony(uuid);
|
return getBackgroundPony(uuid);
|
||||||
|
@ -122,17 +132,19 @@ public class PonyManager implements IPonyManager, SimpleSynchronousResourceReloa
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IPony getBackgroundPony(UUID uuid) {
|
public IPony getBackgroundPony(UUID uuid) {
|
||||||
return ((Pony)getPony(MineLittlePony.getInstance().getVariatedTextures().get(BACKGROUND_PONIES, uuid))).markDefaulted();
|
return getAsDefaulted(getPony(MineLittlePony.getInstance().getVariatedTextures().get(BACKGROUND_PONIES, uuid)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void removePony(Identifier resource) {
|
public void removePony(Identifier resource) {
|
||||||
poniesCache.invalidate(resource);
|
poniesCache.invalidate(resource);
|
||||||
|
defaultedPoniesCache.invalidate(resource);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void clearCache() {
|
public void clearCache() {
|
||||||
MineLittlePony.logger.info("Flushed {} cached ponies.", poniesCache.size());
|
MineLittlePony.logger.info("Flushed {} cached ponies.", poniesCache.size());
|
||||||
poniesCache.invalidateAll();
|
poniesCache.invalidateAll();
|
||||||
|
defaultedPoniesCache.invalidateAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -8,7 +8,6 @@ import com.minelittlepony.api.pony.network.fabric.PonyDataCallback;
|
||||||
import com.minelittlepony.client.MineLittlePony;
|
import com.minelittlepony.client.MineLittlePony;
|
||||||
import com.minelittlepony.client.model.IPonyModel;
|
import com.minelittlepony.client.model.IPonyModel;
|
||||||
import com.minelittlepony.client.model.ModelWrapper;
|
import com.minelittlepony.client.model.ModelWrapper;
|
||||||
import com.minelittlepony.client.pony.Pony;
|
|
||||||
import com.minelittlepony.client.transform.PonyPosture;
|
import com.minelittlepony.client.transform.PonyPosture;
|
||||||
import com.minelittlepony.mson.api.ModelKey;
|
import com.minelittlepony.mson.api.ModelKey;
|
||||||
import com.minelittlepony.util.MathUtil;
|
import com.minelittlepony.util.MathUtil;
|
||||||
|
@ -168,7 +167,7 @@ public class EquineRenderManager<T extends LivingEntity, M extends EntityModel<T
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateForEntity(IPony pony, Entity entity) {
|
private void updateForEntity(IPony pony, Entity entity) {
|
||||||
if (pony.hasMetadata() && entity instanceof Pony.RegistrationHandler && ((Pony.RegistrationHandler)entity).shouldUpdateRegistration(pony)) {
|
if (pony.hasMetadata() && entity instanceof RegistrationHandler && ((RegistrationHandler)entity).shouldUpdateRegistration(pony)) {
|
||||||
entity.calculateDimensions();
|
entity.calculateDimensions();
|
||||||
|
|
||||||
PlayerEntity clientPlayer = MinecraftClient.getInstance().player;
|
PlayerEntity clientPlayer = MinecraftClient.getInstance().player;
|
||||||
|
@ -216,4 +215,8 @@ public class EquineRenderManager<T extends LivingEntity, M extends EntityModel<T
|
||||||
|
|
||||||
return y;
|
return y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public interface RegistrationHandler {
|
||||||
|
boolean shouldUpdateRegistration(IPony pony);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue