|
1 | 1 | package net.blay09.mods.balm.api.block.entity;
|
2 | 2 |
|
3 |
| -import com.google.common.collect.HashBasedTable; |
4 |
| -import com.google.common.collect.Table; |
5 |
| -import com.mojang.datafixers.util.Pair; |
6 |
| -import net.blay09.mods.balm.api.Balm; |
7 |
| -import net.blay09.mods.balm.api.energy.EnergyStorage; |
8 |
| -import net.blay09.mods.balm.api.fluid.FluidTank; |
9 |
| -import net.blay09.mods.balm.api.provider.BalmProvider; |
10 |
| -import net.blay09.mods.balm.api.provider.BalmProviderHolder; |
11 |
| -import net.blay09.mods.balm.neoforge.container.BalmInvWrapper; |
12 |
| -import net.blay09.mods.balm.neoforge.energy.NeoForgeEnergyStorage; |
13 |
| -import net.blay09.mods.balm.neoforge.fluid.NeoForgeFluidTank; |
14 |
| -import net.blay09.mods.balm.neoforge.provider.NeoForgeBalmProviders; |
15 | 3 | import net.minecraft.core.BlockPos;
|
16 |
| -import net.minecraft.core.Direction; |
17 |
| -import net.minecraft.world.Container; |
18 | 4 | import net.minecraft.world.level.block.entity.BlockEntity;
|
19 | 5 | import net.minecraft.world.level.block.entity.BlockEntityType;
|
20 | 6 | import net.minecraft.world.level.block.state.BlockState;
|
21 |
| -import net.neoforged.neoforge.common.capabilities.Capabilities; |
22 |
| -import net.neoforged.neoforge.common.capabilities.Capability; |
23 |
| -import net.neoforged.neoforge.common.util.LazyOptional; |
24 |
| -import org.jetbrains.annotations.NotNull; |
25 |
| -import org.jetbrains.annotations.Nullable; |
26 |
| - |
27 |
| -import java.util.ArrayList; |
28 |
| -import java.util.HashMap; |
29 | 7 | import java.util.List;
|
30 |
| -import java.util.Map; |
31 | 8 |
|
32 | 9 | public abstract class BalmBlockEntityBase extends BlockEntity {
|
33 | 10 |
|
34 |
| - private final Map<Capability<?>, LazyOptional<?>> capabilities = new HashMap<>(); |
35 |
| - private final Table<Capability<?>, Direction, LazyOptional<?>> sidedCapabilities = HashBasedTable.create(); |
36 |
| - private boolean capabilitiesInitialized; |
37 |
| - |
38 | 11 | public BalmBlockEntityBase(BlockEntityType<?> blockEntityType, BlockPos blockPos, BlockState blockState) {
|
39 | 12 | super(blockEntityType, blockPos, blockState);
|
40 | 13 | }
|
41 | 14 |
|
42 |
| - private void addCapabilities(BalmProvider<?> provider, Map<Capability<?>, LazyOptional<?>> capabilities) { |
43 |
| - NeoForgeBalmProviders forgeProviders = (NeoForgeBalmProviders) Balm.getProviders(); |
44 |
| - Capability<?> capability = forgeProviders.getCapability(provider.getProviderClass()); |
45 |
| - capabilities.put(capability, LazyOptional.of(provider::getInstance)); |
46 |
| - |
47 |
| - if (provider.getProviderClass() == Container.class) { |
48 |
| - capabilities.put(Capabilities.ITEM_HANDLER, LazyOptional.of(() -> new BalmInvWrapper((Container) provider.getInstance()))); |
49 |
| - } else if (provider.getProviderClass() == FluidTank.class) { |
50 |
| - capabilities.put(Capabilities.FLUID_HANDLER, LazyOptional.of(() -> new NeoForgeFluidTank((FluidTank) provider.getInstance()))); |
51 |
| - } else if (provider.getProviderClass() == EnergyStorage.class) { |
52 |
| - capabilities.put(Capabilities.ENERGY, LazyOptional.of(() -> new NeoForgeEnergyStorage((EnergyStorage) provider.getInstance()))); |
53 |
| - } |
54 |
| - } |
55 |
| - |
56 |
| - @SuppressWarnings("unchecked") |
57 |
| - public <T> T getProvider(Class<T> clazz) { |
58 |
| - NeoForgeBalmProviders forgeProviders = (NeoForgeBalmProviders) Balm.getProviders(); |
59 |
| - Capability<?> capability = forgeProviders.getCapability(clazz); |
60 |
| - return (T) getCapability(capability).resolve().orElse(null); |
61 |
| - } |
62 |
| - |
63 |
| - @NotNull |
64 |
| - @Override |
65 |
| - public <T> LazyOptional<T> getCapability(@NotNull Capability<T> cap, @Nullable Direction side) { |
66 |
| - if (!capabilitiesInitialized) { |
67 |
| - List<Object> providers = new ArrayList<>(); |
68 |
| - buildProviders(providers); |
69 |
| - |
70 |
| - for (Object holder : providers) { |
71 |
| - BalmProviderHolder providerHolder = (BalmProviderHolder) holder; |
72 |
| - for (BalmProvider<?> provider : providerHolder.getProviders()) { |
73 |
| - addCapabilities(provider, capabilities); |
74 |
| - } |
75 |
| - |
76 |
| - for (Pair<Direction, BalmProvider<?>> pair : providerHolder.getSidedProviders()) { |
77 |
| - Direction direction = pair.getFirst(); |
78 |
| - BalmProvider<?> provider = pair.getSecond(); |
79 |
| - Map<Capability<?>, LazyOptional<?>> sidedCapabilities = this.sidedCapabilities.column(direction); |
80 |
| - addCapabilities(provider, sidedCapabilities); |
81 |
| - } |
82 |
| - } |
83 |
| - capabilitiesInitialized = true; |
84 |
| - } |
85 |
| - |
86 |
| - LazyOptional<?> result = null; |
87 |
| - if (side != null) { |
88 |
| - result = sidedCapabilities.get(cap, side); |
89 |
| - } |
90 |
| - if (result == null) { |
91 |
| - result = capabilities.get(cap); |
92 |
| - } |
93 |
| - return result != null ? result.cast() : super.getCapability(cap, side); |
94 |
| - } |
95 |
| - |
96 | 15 | protected abstract void buildProviders(List<Object> providers);
|
97 | 16 |
|
98 | 17 | }
|
0 commit comments