pie_flavor

BreakDoubleChests.java

Jul 18th, 2016
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.02 KB | None | 0 0
  1. package flavor.pie.plguin;
  2.  
  3. import com.google.common.collect.Lists;
  4. import com.google.common.collect.Maps;
  5. import com.google.inject.Inject;
  6. import org.apache.commons.lang3.tuple.Pair;
  7. import org.spongepowered.api.Game;
  8. import org.spongepowered.api.block.BlockSnapshot;
  9. import org.spongepowered.api.block.BlockState;
  10. import org.spongepowered.api.block.BlockType;
  11. import org.spongepowered.api.block.BlockTypes;
  12. import org.spongepowered.api.data.Transaction;
  13. import org.spongepowered.api.data.key.Keys;
  14. import org.spongepowered.api.entity.Entity;
  15. import org.spongepowered.api.entity.EntityTypes;
  16. import org.spongepowered.api.entity.Item;
  17. import org.spongepowered.api.entity.living.player.Player;
  18. import org.spongepowered.api.event.Listener;
  19. import org.spongepowered.api.event.Order;
  20. import org.spongepowered.api.event.SpongeEventFactory;
  21. import org.spongepowered.api.event.block.ChangeBlockEvent;
  22. import org.spongepowered.api.event.cause.Cause;
  23. import org.spongepowered.api.event.cause.NamedCause;
  24. import org.spongepowered.api.event.cause.entity.spawn.BlockSpawnCause;
  25. import org.spongepowered.api.event.filter.cause.First;
  26. import org.spongepowered.api.event.item.inventory.DropItemEvent;
  27. import org.spongepowered.api.item.ItemType;
  28. import org.spongepowered.api.item.ItemTypes;
  29. import org.spongepowered.api.item.inventory.ItemStack;
  30. import org.spongepowered.api.scheduler.Task;
  31. import org.spongepowered.api.util.Direction;
  32. import org.spongepowered.api.world.Location;
  33. import org.spongepowered.api.world.World;
  34.  
  35. import java.util.List;
  36. import java.util.Map;
  37. import java.util.Optional;
  38. import java.util.Set;
  39.  
  40. public class BreakDoubleChests {
  41.     Map<Location<World>, Pair<Location<World>, BlockType>> tracked = Maps.newHashMap();
  42.     @Inject
  43.     Plguin plguin;
  44.     @Inject
  45.     Game game;
  46.     @Listener(order= Order.BEFORE_POST)
  47.     public void breakDoubleChests(ChangeBlockEvent.Break e, @First Player p) {
  48.         List<Transaction<BlockSnapshot>> list = e.getTransactions();
  49.         for (Transaction<BlockSnapshot> transaction : list) {
  50.             BlockSnapshot snapshot = transaction.getOriginal();
  51.             if (snapshot.getState().getType().equals(BlockTypes.CHEST) || snapshot.getState().getType().equals(BlockTypes.TRAPPED_CHEST)) {
  52.                 Optional<Set<Direction>> set_ = snapshot.get(Keys.CONNECTED_DIRECTIONS);
  53.                 if (set_.isPresent()) {
  54.                     Set<Direction> set = set_.get();
  55.                     if (!set.isEmpty()) {
  56.                         Location<World> location = snapshot.getLocation().get();
  57.                         for (Direction direction : set) {
  58.                             Location<World> relative = location.getRelative(direction);
  59.                             tracked.put(location, Pair.of(relative, relative.getBlockType()));
  60.                             BlockSnapshot originalSnapshot = relative.createSnapshot();
  61.                             BlockState originalState = originalSnapshot.getState();
  62.                             BlockState proposedState = BlockState.builder().from(originalState).blockType(BlockTypes.AIR).build();
  63.                             BlockSnapshot proposedSnapshot = BlockSnapshot.builder().from(originalSnapshot).blockState(proposedState).build();
  64.                             ChangeBlockEvent.Break breakEvent = SpongeEventFactory.createChangeBlockEventBreak(e.getCause(), e.getTargetWorld(), Lists.newArrayList(new Transaction<>(originalSnapshot, proposedSnapshot)));
  65.                             boolean cancelled = game.getEventManager().post(breakEvent);
  66.                             if (!cancelled) {
  67.                                 for (Transaction<BlockSnapshot> newTransaction: breakEvent.getTransactions()) {
  68.                                     newTransaction.getOriginal().getLocation().get().setBlock(newTransaction.getFinal().getState());
  69.                                 }
  70.                             }
  71.                             Task.builder().delayTicks(1).execute(() -> tracked.remove(location)).submit(plguin);
  72.                         }
  73.                     }
  74.                 }
  75.             }
  76.         }
  77.     }
  78.     @Listener
  79.     public void dropItems(DropItemEvent.Destruct e, @First BlockSpawnCause cause) {
  80.         if (e.getCause().contains(plguin)) return;
  81.         Optional<Location<World>> loc_ = cause.getBlockSnapshot().getLocation();
  82.         if (loc_.isPresent()) {
  83.             Location<World> loc = loc_.get();
  84.             if (tracked.containsKey(loc)) {
  85.                 Pair<Location<World>, BlockType> pair = tracked.get(loc);
  86.                 Location<World> relative = pair.getLeft();
  87.                 BlockSnapshot snapshot = relative.createSnapshot();
  88.                 BlockSpawnCause newCause = BlockSpawnCause.builder().from(cause).block(snapshot).build();
  89.                 BlockType blockType = pair.getRight();
  90.                 ItemType itemType;
  91.                 if (blockType.equals(BlockTypes.CHEST)) {
  92.                     itemType = ItemTypes.CHEST;
  93.                 } else if (blockType.equals(BlockTypes.TRAPPED_CHEST)) {
  94.                     itemType = ItemTypes.TRAPPED_CHEST;
  95.                 } else {
  96.                     return;
  97.                 }
  98.                 ItemStack stack = ItemStack.builder().itemType(itemType).build();
  99.                 Item item = (Item) relative.getExtent().createEntity(EntityTypes.ITEM, relative.getPosition()).get();
  100.                 item.offer(Keys.REPRESENTED_ITEM, stack.createSnapshot());
  101.                 DropItemEvent.Destruct newEvent = SpongeEventFactory.createDropItemEventDestruct(Cause.builder().from(e.getCause()).named(NamedCause.of("Plugin", plguin)).build(), Lists.newArrayList(item), relative.getExtent());
  102.                 boolean cancelled = game.getEventManager().post(newEvent);
  103.                 if (!cancelled) {
  104.                     for (Entity entity : newEvent.getEntities()) {
  105.                         newEvent.getTargetWorld().spawnEntity(entity, Cause.of(NamedCause.source(newCause), NamedCause.of("Plugin", plguin)));
  106.                     }
  107.                 }
  108.             }
  109.         }
  110.     }
  111. }
Add Comment
Please, Sign In to add comment