Advertisement
Guest User

Untitled

a guest
Jan 5th, 2022
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.30 KB | None | 0 0
  1. Attach:
  2. @Mod.EventBusSubscriber(modid = "shadowmobs", bus = Mod.EventBusSubscriber.Bus.FORGE)
  3. public class CapSetup {
  4.  
  5. private final static ResourceLocation WORLD_CAP = new ResourceLocation("shadowmobs", "worldcap");
  6. private final static ResourceLocation PLAYER_CAP = new ResourceLocation("shadowmobs", "playercap");
  7.  
  8. @SubscribeEvent
  9. public static void onAttach(AttachCapabilitiesEvent<World> event) {
  10. BooleanCapability.Provider provider = BooleanCapability.Provider.from(ShadowMobs.booleanCapability, BooleanCapability::new);
  11. event.addCapability(WORLD_CAP, provider);
  12. }
  13.  
  14. @SubscribeEvent
  15. public static void onAttachPlayer(AttachCapabilitiesEvent<Entity> event) {
  16. if (!(event.getObject() instanceof PlayerEntity)) return;
  17. BooleanCapability.Provider provider = BooleanCapability.Provider.from(ShadowMobs.booleanCapability, BooleanCapability::new);
  18. event.addCapability(PLAYER_CAP, provider);
  19. }
  20. }
  21.  
  22. Cap-Class:
  23. public class BooleanCapability implements INBTSerializable<CompoundNBT> {
  24.  
  25. private final Map<String, Boolean> data;
  26.  
  27. public BooleanCapability() {
  28. this.data = new HashMap<>();
  29. }
  30.  
  31. public void putData(String key, boolean obj) {
  32. this.data.put(key, obj);
  33. }
  34.  
  35. public boolean getData(String key, boolean def) {
  36. if (!data.containsKey(key)) return def;
  37. return data.get(key);
  38. }
  39.  
  40. public Set<Map.Entry<String, Boolean>> getAllData() {
  41. return this.data.entrySet();
  42. }
  43.  
  44. @Override
  45. public CompoundNBT serializeNBT() {
  46. CompoundNBT nbt = new CompoundNBT();
  47. getAllData().forEach(entry -> {
  48. nbt.putBoolean(entry.getKey(), entry.getValue());
  49. });
  50. return nbt;
  51. }
  52.  
  53. @Override
  54. public void deserializeNBT(CompoundNBT nbt) {
  55. nbt.getAllKeys().forEach(key -> {
  56. putData(key, nbt.getBoolean(key));
  57. });
  58. }
  59.  
  60. public static class Storage implements Capability.IStorage<BooleanCapability> {
  61.  
  62. @Nullable
  63. @Override
  64. public INBT writeNBT(Capability<BooleanCapability> capability, BooleanCapability instance, Direction side) {
  65. return instance.serializeNBT();
  66. }
  67.  
  68. @Override
  69. public void readNBT(Capability<BooleanCapability> capability, BooleanCapability instance, Direction side, INBT inbt) {
  70. instance.deserializeNBT((CompoundNBT) inbt);
  71. }
  72. }
  73.  
  74. public static class Factory implements Callable<BooleanCapability> {
  75.  
  76. @Override
  77. public BooleanCapability call() {
  78. return new BooleanCapability();
  79. }
  80. }
  81.  
  82. public static class Provider implements ICapabilitySerializable<CompoundNBT> {
  83.  
  84. private final Capability<BooleanCapability> capability;
  85. private final LazyOptional<BooleanCapability> implementation;
  86.  
  87. public Provider(Capability<BooleanCapability> capability, LazyOptional<BooleanCapability> implementation) {
  88. this.capability = capability;
  89. this.implementation = implementation;
  90. }
  91.  
  92. public static Provider from(Capability<BooleanCapability> cap, NonNullSupplier<BooleanCapability> impl) {
  93. return new Provider(cap, LazyOptional.of(impl));
  94. }
  95.  
  96. @Nonnull
  97. @Override
  98. public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) {
  99. return implementation.cast();
  100. }
  101.  
  102. @Override
  103. public CompoundNBT serializeNBT() {
  104. AtomicReference<CompoundNBT> tag = new AtomicReference<>(new CompoundNBT());
  105. implementation.resolve().ifPresent(itemHandler -> {
  106. tag.set(itemHandler.serializeNBT());
  107. });
  108. return tag.get();
  109. }
  110.  
  111. @Override
  112. public void deserializeNBT(CompoundNBT nbt) {
  113. implementation.resolve().ifPresent(itemHandler -> {
  114. itemHandler.deserializeNBT(nbt);
  115. });
  116. }
  117.  
  118. public void invalidate() {
  119. implementation.invalidate();
  120. }
  121. }
  122. }
  123.  
  124. Register:
  125. private void onLoad(FMLCommonSetupEvent event) {
  126. CapabilityManager.INSTANCE.register(BooleanCapability.class, new BooleanCapability.Storage(), new BooleanCapability.Factory());
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement