Skip to content

Instantly share code, notes, and snippets.

@Waterpicker
Last active December 17, 2016 10:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Waterpicker/0a2ae682f3875e84bd23ac37c59563b1 to your computer and use it in GitHub Desktop.
Save Waterpicker/0a2ae682f3875e84bd23ac37c59563b1 to your computer and use it in GitHub Desktop.
import com.google.inject.Inject;
import org.slf4j.Logger;
import org.spongepowered.api.Sponge;
import org.spongepowered.api.block.BlockSnapshot;
import org.spongepowered.api.block.BlockTypes;
import org.spongepowered.api.block.tileentity.carrier.Chest;
import org.spongepowered.api.block.tileentity.carrier.TileEntityCarrier;
import org.spongepowered.api.data.key.Keys;
import org.spongepowered.api.data.manipulator.catalog.CatalogBlockData;
import org.spongepowered.api.data.manipulator.catalog.CatalogItemData;
import org.spongepowered.api.data.manipulator.immutable.entity.ImmutableAchievementData;
import org.spongepowered.api.data.manipulator.immutable.item.ImmutableInventoryItemData;
import org.spongepowered.api.data.manipulator.mutable.item.InventoryItemData;
import org.spongepowered.api.effect.particle.ParticleEffect;
import org.spongepowered.api.effect.particle.ParticleTypes;
import org.spongepowered.api.entity.Entity;
import org.spongepowered.api.entity.EntityTypes;
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.event.Listener;
import org.spongepowered.api.event.block.ChangeBlockEvent;
import org.spongepowered.api.event.cause.Cause;
import org.spongepowered.api.event.cause.NamedCause;
import org.spongepowered.api.event.cause.entity.spawn.BlockSpawnCause;
import org.spongepowered.api.event.cause.entity.spawn.EntitySpawnCause;
import org.spongepowered.api.event.cause.entity.spawn.SpawnTypes;
import org.spongepowered.api.event.filter.cause.First;
import org.spongepowered.api.event.game.state.GameInitializationEvent;
import org.spongepowered.api.event.game.state.GamePostInitializationEvent;
import org.spongepowered.api.event.item.inventory.DropItemEvent;
import org.spongepowered.api.event.item.inventory.InteractItemEvent;
import org.spongepowered.api.item.ItemTypes;
import org.spongepowered.api.item.inventory.ItemStack;
import org.spongepowered.api.item.inventory.ItemStackSnapshot;
import org.spongepowered.api.plugin.Plugin;
import org.spongepowered.api.plugin.PluginContainer;
import org.spongepowered.api.world.Location;
import org.spongepowered.api.world.World;
import javax.swing.text.html.Option;
import java.util.*;
import java.util.concurrent.TimeUnit;
@Plugin(id = "chestskeepinventory", name = "Chests Keep Inventorys", version = "1.0")
public class ChestsKeepInventory {
@Inject
private PluginContainer container;
private Map<Location<World>, BlockSnapshot> blocks = new HashMap<>();
@Listener
public void onInitalization(GamePostInitializationEvent event) {
Sponge.getScheduler().createTaskBuilder().interval(50, TimeUnit.MILLISECONDS).execute(() -> blocks.clear()).submit(container);
}
@Listener
public void onChestBreak(ChangeBlockEvent.Break event) {
event.getTransactions().stream().map(snapshot -> snapshot.getOriginal()).filter(block->block.getState().getType() == BlockTypes.CHEST).forEach(chest -> {
chest.getLocation().ifPresent(loc -> blocks.put(loc, chest));
});
}
@Listener
public void onItemDrops(DropItemEvent.Destruct event, @First BlockSpawnCause cause) {
cause.getBlockSnapshot().getLocation().filter(location -> blocks.containsKey(location)).ifPresent(location -> {
BlockSnapshot blockSnapshot = blocks.get(location);
if(blockSnapshot != null) {
event.getEntities().clear();
Entity itemEntity = event.getTargetWorld().createEntity(EntityTypes.ITEM, location.getPosition());
itemEntity.offer(Keys.REPRESENTED_ITEM, ItemStack.builder().fromBlockSnapshot(blocks.get(location)).build().createSnapshot());
event.getEntities().add(itemEntity);
blocks.put(location, null);
} else {
event.getEntities().clear();
}
});
}
@Listener
public void onRightClickWithAir(InteractItemEvent.Primary.MainHand event) {
Cause cause = event.getCause();
Optional<Player> player = cause.first(Player.class);
if(player.isPresent()) {
ItemStackSnapshot stack = event.getItemStack();
if(stack.getType().equals(ItemTypes.CHEST)) {
player.get().openInventory(event.getItemStack().get(ImmutableInventoryItemData.class).get().getInventory(), Cause.of(NamedCause.source(player.get())));
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment