gt22

Untitled

Jun 2nd, 2017
268
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.35 KB | None | 0 0
  1. package com.uadaf.astral.apiimpl;
  2.  
  3. import cofh.api.energy.EnergyStorage;
  4. import com.google.common.collect.Lists;
  5. import com.google.common.collect.Maps;
  6. import com.google.common.collect.Sets;
  7. import com.uadaf.astral.AstralMod;
  8. import com.uadaf.astral.api.energy.IAstralBindableTile;
  9. import com.uadaf.astral.api.energy.IAstralEnergyStorer;
  10. import com.uadaf.astral.api.energy.IAstralNetwork;
  11. import com.uadaf.astral.api.event.network.AstralNetworkAccessBlockedEvent;
  12. import com.uadaf.astral.api.event.network.AstralNetworkAccessGrantedEvent;
  13. import com.uadaf.astral.utils.SideCheck;
  14. import net.minecraft.entity.player.EntityPlayer;
  15. import net.minecraft.tileentity.TileEntity;
  16. import net.minecraft.world.World;
  17. import net.minecraftforge.common.MinecraftForge;
  18.  
  19. import javax.annotation.Nullable;
  20. import java.util.*;
  21.  
  22. class AstralNetworkImpl implements IAstralNetwork {
  23.  
  24.     private final int color;
  25.     private final UUID owner;
  26.     private final Set<IAstralBindableTile> bound = Sets.newHashSet(), immutableBoundView = Collections.unmodifiableSet(bound);
  27.     private final Set<UUID> accessedPlayers = Sets.newHashSet(), immutableAccessedPlayersView = Collections.unmodifiableSet(accessedPlayers);
  28.     private final List<PlayerDiff> playerDiff = Lists.newArrayList(), immutablePlayerDiffView = Collections.unmodifiableList(playerDiff);
  29.     private final List<BoundDiff> boundDiff = Lists.newArrayList(), immutableBoundDiffView = Collections.unmodifiableList(boundDiff);
  30.     private final EnergyStorage energyStorage = new EnergyStorage(0);
  31.     private final HashMap<Integer, List<BoundDiff>> queuedBindings = Maps.newHashMap();
  32.     private int energyDiff = 0;
  33.     AstralNetworkImpl(int color, UUID owner) {
  34.         this.color = color;
  35.         this.owner = owner;
  36.         accessedPlayers.add(owner);
  37.     }
  38.  
  39.     @Override
  40.     public int getNetworkColor() {
  41.         return color;
  42.     }
  43.  
  44.     @Override
  45.     public void destroy() {
  46.         bound.forEach(b -> b.onUnbound(this));
  47.         bound.clear();
  48.     }
  49.  
  50.     @Override
  51.     public Set<IAstralBindableTile> getBound() {
  52.         return immutableBoundView; //Unmodifiable set reflects all changes int base set
  53.     }
  54.  
  55.     @Override
  56.     public void bind(IAstralBindableTile bindable) {
  57.         if(SideCheck.isServer() && bound.add(bindable)) {
  58.             bindable.onBound(this);
  59.             boundDiff.add(new BoundDiff(bindable.getPos(), true, bindable.getWorld().provider.getDimension()));
  60.             if(bindable instanceof IAstralEnergyStorer) {
  61.                 recalculateStorage();
  62.             }
  63.         }
  64.     }
  65.  
  66.     @Override
  67.     public void unbind(IAstralBindableTile bindable) {
  68.         if(SideCheck.isServer() && bound.remove(bindable)) {
  69.             bindable.onUnbound(this);
  70.             boundDiff.add(new BoundDiff(bindable.getPos(), false, bindable.getWorld().provider.getDimension()));
  71.             if(bindable instanceof IAstralEnergyStorer) {
  72.                 recalculateStorage();
  73.             }
  74.         }
  75.     }
  76.  
  77.     @Override
  78.     public void queueBinding(BoundDiff binding) {
  79.         queuedBindings.compute(binding.dimension, (dim, queue) -> {
  80.             if(queue == null) {
  81.                 queue = Lists.newArrayList();
  82.             }
  83.             queue.add(binding);
  84.             return queue;
  85.         });
  86.     }
  87.  
  88.     @Override
  89.     public void performQueue(World world) {
  90.         List<BoundDiff> queue = queuedBindings.get(world.provider.getDimension());
  91.         if(queue != null) {
  92.             queue.forEach(diff -> {
  93.                 TileEntity t = world.getTileEntity(diff.pos);
  94.                 if(!(t instanceof IAstralBindableTile)) {
  95.                     AstralMod.log.warn("TileEntity " + t + "---" + diff.pos + " doesn't implement " + IAstralBindableTile.class + ", but was received from sync packet");
  96.                     return;
  97.                 }
  98.                 bind((IAstralBindableTile) t);
  99.             });
  100.         }
  101.     }
  102.  
  103.     @Override
  104.     public List<BoundDiff> getBoundDiff() {
  105.         return immutableBoundDiffView;
  106.     }
  107.  
  108.     @Override
  109.     public void resetBoundDiff() {
  110.         boundDiff.clear();
  111.     }
  112.  
  113.     private void recalculateStorage() {
  114.         int newCapacity = getBound().stream()
  115.             .filter(b -> b instanceof IAstralEnergyStorer)
  116.             .map(b -> (IAstralEnergyStorer) b)
  117.             .map(s -> {
  118.                 AstralMod.log.info("Storer: " + s + ", en: " + s.getMaxStoredEnergy() + ", pos: " + s.getPos());
  119.                 return s.getMaxStoredEnergy();
  120.             })
  121.             .reduce((i, j) -> i + j)
  122.             .orElse(0);
  123.         energyStorage.setCapacity(newCapacity);
  124.         energyStorage.setMaxTransfer(newCapacity);
  125.     }
  126.  
  127.     @Override
  128.     public void modifyEnergy(int mod) {
  129.         energyDiff += mod;
  130.         energyStorage.modifyEnergyStored(mod);
  131.     }
  132.  
  133.     @Override
  134.     public int getEnergyDiff() {
  135.         return energyDiff;
  136.     }
  137.  
  138.     @Override
  139.     public void resetEnergyDiff() {
  140.         energyDiff = 0;
  141.     }
  142.  
  143.     @Nullable
  144.     @Override
  145.     public UUID getOwner() {
  146.         return owner;
  147.     }
  148.  
  149.     @Override
  150.     public List<PlayerDiff> getPlayerDiff() {
  151.         return immutablePlayerDiffView; //Unmodifiable set reflects all changes int base set
  152.     }
  153.  
  154.     @Override
  155.     public Set<UUID> getAccessedPlayers() {
  156.         return immutableAccessedPlayersView; //Unmodifiable set reflects all changes int base set
  157.     }
  158.  
  159.     @Override
  160.     public boolean allowAccess(UUID player) {
  161.         playerDiff.add(new PlayerDiff(player, true));
  162.         boolean ret = accessedPlayers.add(player);
  163.         if(ret) {
  164.             MinecraftForge.EVENT_BUS.post(new AstralNetworkAccessGrantedEvent(this, player));
  165.         }
  166.         return ret;
  167.     }
  168.  
  169.     @Override
  170.     public boolean blockAccess(UUID player) {
  171.         playerDiff.add(new PlayerDiff(player, false));
  172.         boolean ret = accessedPlayers.remove(player);
  173.         if(ret) {
  174.             MinecraftForge.EVENT_BUS.post(new AstralNetworkAccessBlockedEvent(this, player));
  175.         }
  176.         return ret;
  177.     }
  178.  
  179.     @Override
  180.     public boolean hasAccess(EntityPlayer player) {
  181.         return hasAccess(player.getGameProfile().getId());
  182.     }
  183.  
  184.     @Override
  185.     public boolean hasAccess(UUID player) {
  186.         return accessedPlayers.contains(player);
  187.     }
  188.  
  189.     @Override
  190.     public void resetPlayerDiff() {
  191.         playerDiff.clear();
  192.     }
  193.  
  194.     @Override
  195.     public int receiveEnergy(int maxReceive, boolean simulate) {
  196.         int e = energyStorage.receiveEnergy(maxReceive, simulate);
  197.         if(!simulate) {
  198.             energyDiff += e;
  199.         }
  200.         return e;
  201.     }
  202.  
  203.     @Override
  204.     public int extractEnergy(int maxExtract, boolean simulate) {
  205.         int e = energyStorage.extractEnergy(maxExtract, simulate);
  206.         if(!simulate) {
  207.             energyDiff -= maxExtract;
  208.         }
  209.         return e;
  210.     }
  211.  
  212.     @Override
  213.     public int getEnergyStored() {
  214.         return energyStorage.getEnergyStored();
  215.     }
  216.  
  217.     @Override
  218.     public int getMaxEnergyStored() {
  219.         return energyStorage.getMaxEnergyStored();
  220.     }
  221.  
  222.     @Override
  223.     public boolean canExtract() {
  224.         return energyStorage.extractEnergy(1, true) == 1;
  225.     }
  226.  
  227.     @Override
  228.     public boolean canReceive() {
  229.         return energyStorage.receiveEnergy(1, true) == 1;
  230.     }
  231. }
Advertisement
Add Comment
Please, Sign In to add comment