Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save Krysztal112233/b0bec96db6b35dcde2c82613cd2aaa33 to your computer and use it in GitHub Desktop.
Save Krysztal112233/b0bec96db6b35dcde2c82613cd2aaa33 to your computer and use it in GitHub Desktop.
package dev.krysztal.immunology.capability;
import dev.krysztal.immunology.Immunology;
import lombok.extern.log4j.Log4j2;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.Direction;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.capabilities.*;
import net.minecraftforge.common.util.INBTSerializable;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.event.AttachCapabilitiesEvent;
import net.minecraftforge.event.entity.player.PlayerEvent;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@Log4j2
public class ImmunologyCapabilityProvider extends CapabilityProvider<ImmunologyCapabilityProvider> implements INBTSerializable<NbtCompound> {
public static final Capability<ImmunologyCapability> INSTANCE = CapabilityManager.get(new CapabilityToken<>() {
});
private final LazyOptional<ImmunologyCapability> immunologyCapabilityLazyOptional;
private static final Identifier IDENTIFIER = Immunology.id("capability");
protected ImmunologyCapabilityProvider() {
super(ImmunologyCapabilityProvider.class);
immunologyCapabilityLazyOptional = LazyOptional.of(ImmunologyCapability::new);
}
@Override
public NbtCompound serializeNBT() {
return immunologyCapabilityLazyOptional.resolve().isPresent() ? immunologyCapabilityLazyOptional.resolve().get().serializeNBT() : new NbtCompound();
}
@Override
public void deserializeNBT(NbtCompound nbtCompound) {
immunologyCapabilityLazyOptional.ifPresent(cap -> cap.deserializeNBT(nbtCompound));
}
@NotNull
@Override
public <T> LazyOptional<T> getCapability(@NotNull Capability<T> cap, @Nullable Direction side) {
return super.getCapability(cap, side);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Process attach capability //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
private static void onRegisterCapability(RegisterCapabilitiesEvent event) {
event.register(ImmunologyCapability.class);
}
private static void onAttachCapabilityToPlayer(AttachCapabilitiesEvent<Entity> event) {
if (event.getObject() instanceof PlayerEntity)
if (!event.getObject().getCapability(ImmunologyCapabilityProvider.INSTANCE).isPresent())
event.addCapability(ImmunologyCapabilityProvider.IDENTIFIER, new ImmunologyCapabilityProvider());
}
private static void onPlayerCloned(PlayerEvent.Clone event) {
PlayerEntity player = event.getPlayer();
var originalCapability = event.getOriginal().getCapability(ImmunologyCapabilityProvider.INSTANCE);
var newCapability = event.getPlayer().getCapability(ImmunologyCapabilityProvider.INSTANCE);
log.info(originalCapability.isPresent());
log.info(newCapability.isPresent());
originalCapability.ifPresent(originalCap -> newCapability.ifPresent(newCap -> newCap.deserializeNBT(originalCap.serializeNBT())));
log.info(event.getPlayer().getCapability(ImmunologyCapabilityProvider.INSTANCE));
}
public static void init() {
var bus = MinecraftForge.EVENT_BUS;
bus.addGenericListener(Entity.class, ImmunologyCapabilityProvider::onAttachCapabilityToPlayer);
bus.addListener(ImmunologyCapabilityProvider::onPlayerCloned);
bus.addListener(ImmunologyCapabilityProvider::onRegisterCapability);
}
public static LazyOptional<ImmunologyCapability> getCapability(PlayerEntity player) {
return player.getCapability(ImmunologyCapabilityProvider.INSTANCE);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment