Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package zorg.esinia.server.anvils;
- import java.util.Arrays;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import java.util.Optional;
- import java.util.UUID;
- import java.util.concurrent.TimeUnit;
- import java.util.concurrent.atomic.AtomicInteger;
- import java.util.stream.Collectors;
- import org.spongepowered.api.data.key.Keys;
- import org.spongepowered.api.data.type.HandTypes;
- import org.spongepowered.api.entity.living.player.Player;
- import org.spongepowered.api.event.Listener;
- import org.spongepowered.api.event.block.InteractBlockEvent;
- import org.spongepowered.api.event.cause.Cause;
- import org.spongepowered.api.event.cause.NamedCause;
- import org.spongepowered.api.event.filter.Getter;
- import org.spongepowered.api.event.filter.cause.Root;
- import org.spongepowered.api.event.item.inventory.ClickInventoryEvent;
- import org.spongepowered.api.event.item.inventory.DropItemEvent;
- import org.spongepowered.api.item.ItemType;
- import org.spongepowered.api.item.inventory.Inventory;
- import org.spongepowered.api.item.inventory.InventoryArchetypes;
- import org.spongepowered.api.item.inventory.ItemStack;
- import org.spongepowered.api.item.inventory.ItemStackSnapshot;
- import org.spongepowered.api.item.inventory.property.InventoryDimension;
- import org.spongepowered.api.item.inventory.property.InventoryTitle;
- import org.spongepowered.api.item.inventory.property.SlotPos;
- import org.spongepowered.api.scheduler.Task;
- import org.spongepowered.api.scoreboard.Scoreboard;
- import org.spongepowered.api.scoreboard.critieria.Criteria;
- import org.spongepowered.api.scoreboard.displayslot.DisplaySlots;
- import org.spongepowered.api.scoreboard.objective.Objective;
- import org.spongepowered.api.text.Text;
- import org.spongepowered.api.text.format.TextColor;
- import org.spongepowered.api.text.format.TextColors;
- import org.spongepowered.api.text.serializer.TextSerializers;
- import org.spongepowered.api.world.Location;
- import org.spongepowered.api.world.World;
- import com.google.common.base.Preconditions;
- import com.google.common.collect.ImmutableList;
- import ninja.leaping.configurate.ConfigurationNode;
- import zorg.esinia.server.Config;
- import zorg.esinia.server.Config.CraftingEntry;
- import zorg.esinia.server.Config.CustomCraftingEntry;
- import zorg.esinia.server.Config.ItemEntry;
- import zorg.esinia.server.Config.ItemsEntry;
- import zorg.esinia.server.Esinia;
- //class file name and main method
- public class AnvilStone {
- public Config config;
- private Esinia plugin;
- public AnvilStone(Esinia plugin){
- this.plugin = plugin;
- this.config = plugin.config;
- }
- Map<UUID, Task> tasks = new HashMap<>();
- Map<UUID, Scoreboard> boards = new HashMap<>();
- Map<UUID, Boolean> isCrafting = new HashMap<>();
- //listener for the following event
- @Listener
- public void onRightClickMainHand(InteractBlockEvent.Secondary.MainHand event){
- Player player = event.getCause().first(Player.class).get();
- if (player != null){
- if (player.getItemInHand(HandTypes.MAIN_HAND).isPresent()){
- player.sendMessage(Text.of("Is present 1"));
- ItemStack mainhandItem = player.getItemInHand(HandTypes.MAIN_HAND).get();
- String toolName = mainhandItem.get(Keys.DISPLAY_NAME).orElse(Text.EMPTY).toPlain();
- String blockName = event.getTargetBlock().getState().getType().toString();
- Preconditions.checkNotNull(config, "config");
- Preconditions.checkNotNull(config.customCrafting, "customCrafting");
- Optional<CustomCraftingEntry> customcraftingEntry_ = config.customCrafting.stream().filter(f -> f.toolName.equals(toolName) && f.blockName.equals(blockName)).findFirst();
- if (customcraftingEntry_.isPresent()) {
- player.sendMessage(Text.of("Is present 2"));
- CustomCraftingEntry customcraftingEntry = customcraftingEntry_.get();
- String inventoryName = customcraftingEntry.name;
- int itemCounter = -1;
- int secondaryCounter = 0;
- event.setCancelled(true);
- Inventory craftingInventory = Inventory.builder().of(InventoryArchetypes.DOUBLE_CHEST)
- .property(InventoryDimension.PROPERTY_NAME, new InventoryDimension(9, 4))
- .property(InventoryTitle.PROPERTY_NAME, InventoryTitle.of(Text.of(inventoryName)))
- .build(this.plugin);
- List<ItemsEntry> craftingItems = customcraftingEntry.items;
- for (ItemsEntry craftingItem : craftingItems) {
- itemCounter = itemCounter + 1;
- if (itemCounter > 9){
- itemCounter = 0;
- secondaryCounter = secondaryCounter + 1;
- }
- TextColor itemColor = craftingItem.color;
- ItemType itemID = craftingItem.id;
- String itemName = craftingItem.name;
- List<String> itemLore_ = craftingItem.lore;
- List<Text> itemLore = itemLore_.stream().map(TextSerializers.FORMATTING_CODE::deserialize).collect(Collectors.toList());
- ItemStack item = ItemStack.of(itemID, 1);
- item.offer(Keys.DISPLAY_NAME, Text.of(itemColor, itemName));
- item.offer(Keys.ITEM_LORE, itemLore);
- craftingInventory.query(new SlotPos(secondaryCounter,itemCounter)).set(item);
- }
- player.openInventory(craftingInventory, Cause.of(NamedCause.source(player)));
- }
- } else {
- player.sendMessage(Text.of("You need a tool to use " + event.getTargetBlock().getState().getName() + "."));
- }
- }
- }
- //if (event.getTargetBlock().getState().getType() == BlockTypes.ANVIL){
- // if (mainhanditem.get(Keys.DISPLAY_NAME).get().equals(Text.of("Wooden Hammer"))){
- // event.setCancelled(true);
- // Optional<ItemType> Stoneshovel_ = Sponge.getGame().getRegistry().getType(ItemType.class, "forgecraft:wootzshovel");
- // ItemType StoneShovelType = Stoneshovel_.get();
- // ItemStack stoneShovel = ItemStack.of(StoneShovelType, 1);
- // stoneShovel.offer(Keys.DISPLAY_NAME, Text.of("Stone Shovel"));
- // List<Text> itemShovelLore = new ArrayList<Text>();
- // itemShovelLore.add(Text.of(TextColors.GOLD, "Crafting Requirements:"));
- // itemShovelLore.add(Text.of(TextColors.GOLD, "1 Flat Stone"));
- // itemShovelLore.add(Text.of(TextColors.GOLD, "1 Tool Handle"));
- // stoneShovel.offer(Keys.ITEM_LORE , itemShovelLore);
- //
- // Optional<ItemType> stoneAxe_ = Sponge.getGame().getRegistry().getType(ItemType.class, "forgecraft:wootzaxe");
- // ItemType stoneaxeType = stoneAxe_.get();
- // ItemStack stoneAxe = ItemStack.of(stoneaxeType, 1);
- // List<Text> itemAxeLore = new ArrayList<Text>();
- // itemAxeLore.add(Text.of(TextColors.GOLD, "Crafting Requirements:"));
- // itemAxeLore.add(Text.of(TextColors.GOLD, "1 Stone Axehead"));
- // itemAxeLore.add(Text.of(TextColors.GOLD, "1 Wooden Tool Handle"));
- // stoneAxe.offer(Keys.ITEM_LORE , itemAxeLore);
- //
- // Optional<ItemType> stonePickaxe_ = Sponge.getGame().getRegistry().getType(ItemType.class, "forgecraft:wootzpickaxe");
- // ItemType stonepickaxeType = stonePickaxe_.get();
- // ItemStack stonePickaxe = ItemStack.of(stonepickaxeType, 1);
- // List<Text> itemPickaxeLore = new ArrayList<Text>();
- // itemPickaxeLore.add(Text.of(TextColors.GOLD, "Crafting Requirements:"));
- // itemPickaxeLore.add(Text.of(TextColors.GOLD, "1 Stone Pickaxehead"));
- // itemPickaxeLore.add(Text.of(TextColors.GOLD, "1 Wooden Tool Handle"));
- // stonePickaxe.offer(Keys.ITEM_LORE , itemPickaxeLore);
- //
- // ItemStack stoneSword = ItemStack.of(ItemTypes.STONE_SWORD, 1);
- // stoneSword.offer(Keys.DISPLAY_NAME, Text.of("Stone Sword"));
- // List<Text> itemSwordLore = new ArrayList<Text>();
- // itemSwordLore.add(Text.of(TextColors.GOLD, "Crafting Requirements:"));
- // itemSwordLore.add(Text.of(TextColors.GOLD, "1 Stone Blade"));
- // itemSwordLore.add(Text.of(TextColors.GOLD, "1 Wooden Tool Handle"));
- // stoneSword.offer(Keys.ITEM_LORE , itemPickaxeLore);
- //
- // Inventory BasicAnvilInventory = Inventory.builder().of(InventoryArchetypes.DOUBLE_CHEST)
- // .property(InventoryDimension.PROPERTY_NAME, new InventoryDimension(9, 1))
- // .property(InventoryTitle.PROPERTY_NAME, InventoryTitle.of(Text.of("Stone Working")))
- // .build(this.plugin);
- //
- // BasicAnvilInventory.query(new SlotPos(0,0)).set(stoneShovel);
- // BasicAnvilInventory.query(new SlotPos(1,0)).set(stoneAxe);
- // BasicAnvilInventory.query(new SlotPos(2,0)).set(stonePickaxe);
- // BasicAnvilInventory.query(new SlotPos(3,0)).set(stoneSword);
- // player.openInventory(BasicAnvilInventory, Cause.of(NamedCause.source(player)));
- // }
- // });
- //}
- //}
- @Listener
- public void onInventoryClick(ClickInventoryEvent event, @Root Player player, @Getter("getTargetInventory") Inventory inventory) {
- Location<World> p_Loc = player.getLocation();
- UUID id = player.getUniqueId();
- if (isCrafting.get(id)){
- event.setCancelled(true);
- player.sendMessage(Text.of("You are currently crafting"));
- } else if (inventory.getName().get().contains("Stone Working")){
- event.setCancelled(true);
- ItemStackSnapshot clicked = event.getCursorTransaction().getFinal();
- String name = clicked.get(Keys.DISPLAY_NAME).orElse(Text.EMPTY).toPlain();
- //if (!name.startsWith("&f")) {
- // it does not have the correct name
- //}
- //name = name.replaceAll("^&f", "");
- ItemType itemID = clicked.getType();
- Optional<ItemEntry> itemEntry_ = config.items.stream().filter(f -> f.name.equals(name) && f.id.equals(itemID)).findFirst();
- if (itemEntry_.isPresent()) {
- boolean hasReagents = true;
- ItemEntry itemEntry = itemEntry_.get();
- String itemName = itemEntry.name;
- String craftingType = itemEntry.type;
- TextColor itemColor = itemEntry.color;
- List<String> itemLore = itemEntry.lore;
- int itemQuantity = itemEntry.quantity;
- int itemXP = itemEntry.xp;
- int itemDifficulty = itemEntry.difficulty;
- ConfigurationNode nodeType = plugin.root.getNode(craftingType, player.getUniqueId().toString());
- int level = nodeType.getNode("Level").getInt();
- int xp = nodeType.getNode("XP").getInt();
- List<CraftingEntry> craftingReagents = itemEntry.crafting;
- reagents: for (CraftingEntry craftingReagent : craftingReagents) {
- ItemType reagentID = craftingReagent.id;
- String reagentName = craftingReagent.name;
- int reagentQuantity = craftingReagent.quantity;
- int inventoryreagentQuantity = 0;
- for (Inventory slot : player.getInventory().query(reagentID).slots()){
- ItemStack stack = slot.peek().get();
- if (stack.get(Keys.DISPLAY_NAME).orElse(Text.EMPTY).toPlain().equals(reagentName)){
- inventoryreagentQuantity += stack.getQuantity();
- }
- }
- if (inventoryreagentQuantity < reagentQuantity){
- player.sendMessage(Text.of("You need " + reagentQuantity + " " + reagentName + " to craft " + itemQuantity + " " + itemName + "."));
- hasReagents = false;
- break reagents;
- }
- }
- if (hasReagents){
- Integer time = 1 - (level/100);
- Objective obj = Objective.builder()
- .criterion(Criteria.DUMMY)
- .name("timer")
- .displayName(Text.of(TextColors.DARK_BLUE, "[ ]"))
- .build();
- Scoreboard board = Scoreboard.builder()
- .objectives(ImmutableList.of(obj))
- .build();
- obj.getOrCreateScore(Text.of(player.getName())).setScore(0);
- player.setScoreboard(board);
- board.updateDisplaySlot(obj, DisplaySlots.SIDEBAR);
- boards.put(player.getUniqueId(), board);
- AtomicInteger integer = new AtomicInteger(10);
- tasks.put(id, Task.builder()
- .delay(time, TimeUnit.SECONDS)
- .interval(time, TimeUnit.SECONDS)
- .execute(() -> {
- isCrafting.put(id, true);
- if (player.getLocation() == p_Loc){
- player.setScoreboard(board);
- char[] arr = new char[10];
- Arrays.fill(arr, 0, 11 - integer.decrementAndGet(), '|');
- obj.setDisplayName(Text.of(TextColors.DARK_BLUE, "[", String.valueOf(arr), "]"));
- if (integer.get() == 0) {
- obj.setDisplayName(Text.of(TextColors.DARK_BLUE, "[||||||||||]"));
- int max = itemDifficulty + (itemDifficulty/2);
- int min = level;
- int random = (int )(Math.random() * max + min);
- if (level >= random){
- for (CraftingEntry craftingReagent : craftingReagents) {
- ItemType reagentID = craftingReagent.id;
- String reagentName = craftingReagent.name;
- int reagentQuantity = craftingReagent.quantity;
- for (Inventory slot : player.getInventory().query(reagentID).slots()) {
- ItemStack stack = slot.peek().get();
- if (stack.get(Keys.DISPLAY_NAME).orElse(Text.EMPTY).toPlain().equals(reagentName)) {
- if (stack.getQuantity() >= reagentQuantity) {
- slot.poll(reagentQuantity);
- break;
- } else {
- reagentQuantity -= stack.getQuantity();
- slot.poll();
- }
- }
- }
- }
- ItemStack reward = ItemStack.of(itemID, itemQuantity);
- reward.offer(Keys.DISPLAY_NAME, Text.of(itemColor, itemName));
- List<Text> rewarditemLore = itemLore.stream().map(TextSerializers.FORMATTING_CODE::deserialize).collect(Collectors.toList());
- //itemShovelLore.add(Text.of(TextColors.GOLD, "Crafting Requirements:"));
- //itemShovelLore.add(Text.of(TextColors.GOLD, "1 Flat Stone"));
- //itemShovelLore.add(Text.of(TextColors.GOLD, "1 Tool Handle"));
- reward.offer(Keys.ITEM_LORE, rewarditemLore);
- player.getInventory().offer(reward);
- int rxp = (int) Math.round(100 * Math.exp(0.6931 * level));
- int fxp = xp + itemXP;
- if (fxp >= rxp){
- int newXP = fxp - rxp;
- int fLevel = level + 1;
- nodeType.getNode("XP").setValue(newXP);
- nodeType.getNode("Level").setValue(fLevel);
- player.sendMessage(Text.of("You gained one level."));
- plugin.saveConfig();
- isCrafting.put(id, false);
- tasks.remove(id).cancel();
- boards.remove(id);
- } else{
- nodeType.getNode("XP").setValue(fxp);
- plugin.saveConfig();
- isCrafting.put(id, false);
- tasks.remove(id).cancel();
- boards.remove(id);
- }
- } else {
- player.sendMessage(Text.of("You failed while crafting."));
- int rxp = (int) Math.round(100 * Math.exp(0.6931 * level));
- int fxp = xp + (itemXP/2);
- if (fxp >= rxp){
- int newXP = fxp - rxp;
- int fLevel = level + 1;
- nodeType.getNode("XP").setValue(newXP);
- nodeType.getNode("Level").setValue(fLevel);
- player.sendMessage(Text.of("You gained one level."));
- plugin.saveConfig();
- isCrafting.put(id, false);
- tasks.remove(id).cancel();
- boards.remove(id);
- } else{
- nodeType.getNode("XP").setValue(fxp);
- plugin.saveConfig();
- isCrafting.put(id, false);
- tasks.remove(id).cancel();
- boards.remove(id);
- }
- }
- }
- } else{
- player.sendMessage(Text.of("Don't move while crafting."));
- isCrafting.put(id, false);
- tasks.remove(id).cancel();
- boards.remove(id);
- }
- })
- .submit(this));
- }
- }
- }
- }
- @Listener
- public void onItemDrop(DropItemEvent event, @Root Player p){
- UUID id = p.getUniqueId();
- if (isCrafting.get(id)){
- event.setCancelled(true);
- }
- }
- }
Add Comment
Please, Sign In to add comment