Skip to content

Instantly share code, notes, and snippets.

@Krysztal112233
Last active May 9, 2023 05:26
Show Gist options
  • Save Krysztal112233/6e0a9e34281d38c0fc97de266d06b47e to your computer and use it in GitHub Desktop.
Save Krysztal112233/6e0a9e34281d38c0fc97de266d06b47e to your computer and use it in GitHub Desktop.
package dev.krysztal.immunology.capability;
import dev.krysztal.immunology.network.ImmunologyNetworkChannel;
import dev.krysztal.immunology.network.packet.ImmunologyCapabilitySyncPacket;
import dev.krysztal.immunology.util.CapabilitySyncUtil;
import lombok.Getter;
import lombok.Setter;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraftforge.common.util.INBTSerializable;
import net.minecraftforge.network.PacketDistributor;
public class ImmunologyCapability implements INBTSerializable<NbtCompound> {
@Getter
@Setter
private int immunology = 100;
@Override
public NbtCompound serializeNBT() {
var defaultNBT = new NbtCompound();
defaultNBT.putInt("ImmunologyValue", immunology);
return defaultNBT;
}
@Override
public void deserializeNBT(NbtCompound nbtCompound) {
this.immunology = nbtCompound.getInt("ImmunologyValue");
}
public void sync(ServerPlayerEntity player) {
ImmunologyNetworkChannel.INSTANCE.send(
PacketDistributor.PLAYER.with(() -> player),
new ImmunologyCapabilitySyncPacket(this.serializeNBT())
);
}
}
package dev.krysztal.immunology.capability;
import dev.krysztal.immunology.Immunology;
import lombok.extern.log4j.Log4j2;
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.fml.javafmlmod.FMLJavaModLoadingContext;
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> immunologyCapability;
private static final Identifier IDENTIFIER = Immunology.id("capability");
protected ImmunologyCapabilityProvider() {
super(ImmunologyCapabilityProvider.class);
immunologyCapability = LazyOptional.of(ImmunologyCapability::new);
}
@Override
public NbtCompound serializeNBT() {
return immunologyCapability.resolve().isPresent() ? immunologyCapability.resolve().get().serializeNBT() : new NbtCompound();
}
@Override
public void deserializeNBT(NbtCompound nbtCompound) {
immunologyCapability.ifPresent(cap -> cap.deserializeNBT(nbtCompound));
}
@NotNull
@Override
public <T> LazyOptional<T> getCapability(@NotNull Capability<T> cap, @Nullable Direction side) {
return INSTANCE.orEmpty(cap, immunologyCapability);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Process attach capability //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
private static void onRegisterCapability(final RegisterCapabilitiesEvent event) {
event.register(ImmunologyCapability.class);
}
private static void onAttachCapabilityToPlayer(final AttachCapabilitiesEvent<PlayerEntity> event) {
if (!event.getObject().getCapability(ImmunologyCapabilityProvider.INSTANCE).isPresent())
event.addCapability(ImmunologyCapabilityProvider.IDENTIFIER, new ImmunologyCapabilityProvider());
}
public static void init() {
var forgeBus = MinecraftForge.EVENT_BUS;
var modBus = FMLJavaModLoadingContext.get().getModEventBus();
forgeBus.addGenericListener(PlayerEntity.class, ImmunologyCapabilityProvider::onAttachCapabilityToPlayer);
modBus.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