Advertisement
Guest User

Untitled

a guest
Aug 25th, 2016
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 16.08 KB | None | 0 0
  1. package com.negafinity.cratereloaded.event;
  2.  
  3. import com.google.common.collect.Lists;
  4. import com.negafinity.cratereloaded.CrateReloaded;
  5. import com.negafinity.cratereloaded.command.RewardListItem;
  6. import com.negafinity.cratereloaded.command.RewardListItem.RewardType;
  7. import com.negafinity.cratereloaded.command.YAMLCoordinates;
  8. import net.minecraft.block.BlockChest;
  9. import net.minecraft.command.ICommandManager;
  10. import net.minecraft.enchantment.Enchantment;
  11. import net.minecraft.entity.player.EntityPlayer;
  12. import net.minecraft.entity.player.EntityPlayerMP;
  13. import net.minecraft.init.Blocks;
  14. import net.minecraft.init.SoundEvents;
  15. import net.minecraft.item.ItemStack;
  16. import net.minecraft.nbt.NBTTagCompound;
  17. import net.minecraft.nbt.NBTTagList;
  18. import net.minecraft.nbt.NBTTagString;
  19. import net.minecraft.network.play.server.SPacketEntityVelocity;
  20. import net.minecraft.tileentity.TileEntityChest;
  21. import net.minecraft.util.EnumHand;
  22. import net.minecraft.util.EnumParticleTypes;
  23. import net.minecraft.util.ResourceLocation;
  24. import net.minecraft.util.SoundCategory;
  25. import net.minecraft.util.SoundEvent;
  26. import net.minecraft.util.math.BlockPos;
  27. import net.minecraft.util.text.TextComponentString;
  28. import net.minecraft.util.text.TextFormatting;
  29. import net.minecraft.world.World;
  30. import net.minecraft.world.WorldServer;
  31. import net.minecraftforge.event.entity.player.PlayerInteractEvent;
  32. import net.minecraftforge.event.world.BlockEvent;
  33. import net.minecraftforge.fml.common.FMLCommonHandler;
  34. import net.minecraftforge.fml.common.eventhandler.EventPriority;
  35. import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
  36.  
  37. import java.math.BigDecimal;
  38. import java.math.RoundingMode;
  39. import java.util.ArrayList;
  40. import java.util.List;
  41. import java.util.Random;
  42.  
  43. public class EventHandler
  44. {
  45.     @SubscribeEvent(priority = EventPriority.LOWEST)
  46.     public void rightClickEvent(PlayerInteractEvent event)
  47.     {
  48.         ItemStack stack = event.getEntityPlayer().getHeldItem(EnumHand.MAIN_HAND);
  49.  
  50.         if (stack != null)
  51.         {
  52.             if (stack.hasTagCompound())
  53.             {
  54.                 if (stack.getTagCompound().hasKey("IsCrate"))
  55.                 {
  56.                     giveRewardsForMysteryCrate(event, stack);
  57.                 }
  58.                 else if (stack.getTagCompound().hasKey("IsCrateKey"))
  59.                 {
  60.                     giveRewardsFromKey(event, stack);
  61.                 }
  62.             }
  63.         }
  64.  
  65.         if (event instanceof PlayerInteractEvent.LeftClickBlock)
  66.         {
  67.             if (showRewards(event.getPos(), event.getWorld(), (EntityPlayerMP) event.getEntityPlayer()))
  68.             {
  69.                 event.setCanceled(true);
  70.             }
  71.         }
  72.         else if (event instanceof PlayerInteractEvent.RightClickBlock)
  73.         {
  74.             BlockPos pos = event.getPos();
  75.  
  76.             for (String crateName : CrateReloaded.instance.getCratesOfType("KEYCRATE"))
  77.             {
  78.                 YAMLCoordinates yaml = new YAMLCoordinates(pos.getX(), pos.getY(), pos.getZ(), event.getWorld().provider.getDimension());
  79.  
  80.                 if (CrateReloaded.instance.getValuesOfChildrenOfKeyLocations("Locations", crateName).contains(yaml.forYAML()))
  81.                 {
  82.                     event.setCanceled(true);
  83.                 }
  84.             }
  85.         }
  86.     }
  87.  
  88.     @SubscribeEvent
  89.     public void blockBreak(BlockEvent.BreakEvent event)
  90.     {
  91.         if (showRewards(event.getPos(), event.getWorld(), (EntityPlayerMP) event.getPlayer()))
  92.         {
  93.             event.setCanceled(true);
  94.         }
  95.     }
  96.  
  97.     public static double round(double value, int places)
  98.     {
  99.         if (places < 0)
  100.             throw new IllegalArgumentException();
  101.  
  102.         BigDecimal bd = new BigDecimal(value);
  103.         bd = bd.setScale(places, RoundingMode.HALF_UP);
  104.         return bd.doubleValue();
  105.     }
  106.  
  107.     public EnumParticleTypes getParticleFromName(String name)
  108.     {
  109.         for (int i = 0; i < EnumParticleTypes.getParticleNames().size(); i++)
  110.         {
  111.             String s = Lists.newArrayList(EnumParticleTypes.getParticleNames()).get(i);
  112.  
  113.             if (s.equals(name))
  114.             {
  115.                 return EnumParticleTypes.getParticleFromId(i);
  116.             }
  117.         }
  118.         return null;
  119.     }
  120.  
  121.     public void giveRewardsForMysteryCrate(PlayerInteractEvent event, ItemStack stack)
  122.     {
  123.         if (event instanceof PlayerInteractEvent.RightClickItem)
  124.         {
  125.             giveRewards(event, stack, false);
  126.         }
  127.     }
  128.  
  129.     public void giveRewardsFromKey(PlayerInteractEvent event, ItemStack stack)
  130.     {
  131.         if (event instanceof PlayerInteractEvent.RightClickBlock)
  132.         {
  133.             BlockPos pos = event.getPos();
  134.             String crateName = stack.getTagCompound().getString("CrateName");
  135.             YAMLCoordinates yaml = new YAMLCoordinates(pos.getX(), pos.getY(), pos.getZ(), event.getWorld().provider.getDimension());
  136.  
  137.             if (CrateReloaded.instance.getValuesOfChildrenOfKeyLocations("Locations", crateName).contains(yaml.forYAML()))
  138.             {
  139.                 giveRewards(event, stack, true);
  140.             }
  141.             else
  142.             {
  143.                 event.getEntityPlayer().addChatComponentMessage(new TextComponentString(CrateReloaded.prefix + "This is not a designated crate for this key!"));
  144.  
  145.                 if (CrateReloaded.instance.getConfig().isPushBackEnabled())
  146.                 {
  147.                     event.getEntityPlayer().addVelocity(1, 1, 1);
  148.                     ((EntityPlayerMP) event.getEntityPlayer()).connection.sendPacket(new SPacketEntityVelocity(event.getEntityPlayer()));
  149.                 }
  150.  
  151.                 event.setCanceled(true);
  152.             }
  153.         }
  154.  
  155.     }
  156.  
  157.     public static List<RewardListItem> getRewardsFromList(List<String> listItemsInput)
  158.     {
  159.         List<RewardListItem> rewards = new ArrayList<RewardListItem>();
  160.         for (String s : listItemsInput)
  161.         {
  162.             listItemsInput.set(listItemsInput.indexOf(s), s.replace("&", "\u00A7"));
  163.             RewardListItem reward = new RewardListItem(s);
  164.             rewards.add(reward);
  165.         }
  166.         return rewards;
  167.     }
  168.  
  169.     public void giveRewards(PlayerInteractEvent event, ItemStack stack, boolean isBlock)
  170.     {
  171.         String crateName = stack.getTagCompound().getString("CrateName");
  172.         ArrayList<RewardListItem> rewards = new ArrayList<RewardListItem>();
  173.         List<String> rewardInput = CrateReloaded.instance.getValuesOfChildrenOfKey(crateName, "reward", "rewards");
  174.         for (String s : rewardInput)
  175.         {
  176.             RewardListItem rli = new RewardListItem(s);
  177.             rewards.add(rli);
  178.         }
  179.         ArrayList<RewardListItem> rewardsToGive = new ArrayList<RewardListItem>();
  180.         double totalWeight = 0;
  181.         for (RewardListItem reward : rewards)
  182.         {
  183.             totalWeight += reward.getChance();
  184.         }
  185.         String minNumRewardsInput = CrateReloaded.instance.getValueOfKey(crateName + ".reward.minimumRewards").toString();
  186.         String maxNumRewardsInput = CrateReloaded.instance.getValueOfKey(crateName + ".reward.maximumRewards").toString();
  187.         int minNumRewards = Integer.parseInt(minNumRewardsInput);
  188.         int maxNumRewards = Integer.parseInt(maxNumRewardsInput);
  189.         int numRewardsToGive = new Random().nextInt((maxNumRewards - minNumRewards) + 1) + minNumRewards;
  190.         for (int j = 0; j < numRewardsToGive; j++)
  191.         {
  192.             RewardListItem rewardToGive = null;
  193.             int randomIndex = -1;
  194.             while (rewardToGive == null || (!rewardToGive.duplicates() && rewardsToGive.contains(rewardToGive)))
  195.             {
  196.                 randomIndex = -1;
  197.                 double random = Math.random() * totalWeight;
  198.                 for (int i = 0; i < rewards.size(); i++)
  199.                 {
  200.                     random -= rewards.get(i).getChance();
  201.                     if (random <= 0)
  202.                     {
  203.                         randomIndex = i;
  204.                         break;
  205.                     }
  206.                 }
  207.                 rewardToGive = rewards.get(randomIndex);
  208.             }
  209.             rewardsToGive.add(rewards.get(randomIndex));
  210.         }
  211.         for (RewardListItem reward : rewardsToGive)
  212.         {
  213.             if (reward.getRewardType() == RewardType.ITEM)
  214.             {
  215.                 // Where the actual item is created
  216.                 ItemStack is = new ItemStack(reward.getItem(), reward.getAmount(), reward.getMeta());
  217.                 is.setTagCompound(new NBTTagCompound());
  218.  
  219.                 // Add modifiers here
  220.                 for (int id : reward.getEnchantmentIdSet())
  221.                 {
  222.                     is.addEnchantment(Enchantment.getEnchantmentByID(id), reward.getLevelOfEnchantment(id));
  223.                 }
  224.                 NBTTagCompound display = new NBTTagCompound();
  225.                 NBTTagList lore = new NBTTagList();
  226.                 if (!reward.getItemLore().equals(""))
  227.                 {
  228.                     lore.appendTag(new NBTTagString(reward.getItemLore()));
  229.                 }
  230.                 display.setTag("Lore", lore);
  231.  
  232.                 is.getTagCompound().setTag("display", display);
  233.                 if (!reward.getCustomName().equals(""))
  234.                 {
  235.                     is.setStackDisplayName(reward.getCustomName());
  236.                 }
  237.                 // ITEM STUFF
  238.                 event.getEntityPlayer().inventory.addItemStackToInventory(is);
  239.                 if (reward.hasOtherItems())
  240.                 {
  241.                     for (int i = 0; i < reward.getNumberOfOtherItems(); i++)
  242.                     {
  243.                         ItemStack is2 = new ItemStack(reward.otherItem(i), reward.otherAmount(i), reward.otherMeta(i));
  244.                         is2.setTagCompound(new NBTTagCompound());
  245.  
  246.                         // Add modifiers here
  247.                         for (int id : reward.getOtherEnchantmentIdSet(i))
  248.                         {
  249.                             is2.addEnchantment(Enchantment.getEnchantmentByID(id), reward.getLevelOfOtherEnchantment(i, id));
  250.                         }
  251.  
  252.                         NBTTagCompound display2 = new NBTTagCompound();
  253.                         NBTTagList lore2 = new NBTTagList();
  254.  
  255.                         if (reward.hasOtherLore(i))
  256.                         {
  257.                             lore2.appendTag(new NBTTagString(reward.getOtherLore(i)));
  258.                         }
  259.  
  260.                         display2.setTag("Lore", lore2);
  261.  
  262.                         is2.getTagCompound().setTag("display", display2);
  263.  
  264.                         if (reward.hasOtherCustomName(i))
  265.                         {
  266.                             is2.setStackDisplayName(reward.getOtherName(i));
  267.                         }
  268.  
  269.                         event.getEntityPlayer().inventory.addItemStackToInventory(is2);
  270.                     }
  271.                 }
  272.  
  273.                 event.getEntityPlayer().worldObj.playSound(event.getEntityPlayer(), event.getEntityPlayer().getPosition(), SoundEvents.BLOCK_LAVA_POP, SoundCategory.AMBIENT, 0.2F, ((event.getEntityPlayer().getRNG().nextFloat() - event.getEntityPlayer().getRNG().nextFloat()) * 0.7F + 1.0F) * 2.0F);
  274.                 event.getEntityPlayer().inventoryContainer.detectAndSendChanges();
  275.             }
  276.             else
  277.             {
  278.                 if (!event.getWorld().isRemote)
  279.                 {
  280.                     ICommandManager handler = FMLCommonHandler.instance().getSidedDelegate().getServer().getCommandManager();
  281.                     handler.executeCommand(FMLCommonHandler.instance().getSidedDelegate().getServer(), reward.getCommand().replace("%player%", event.getEntityPlayer().getName()).replace("%x%", event.getEntityPlayer().posX + "").replace("%y%", event.getEntityPlayer().posY + "").replace("%z%", event.getEntityPlayer().posZ + ""));
  282.                     if (reward.hasOtherCommands())
  283.                     {
  284.                         for (String command : reward.getOtherCommands())
  285.                         {
  286.                             handler.executeCommand(FMLCommonHandler.instance().getSidedDelegate().getServer(), command.replace("%player%", event.getEntityPlayer().getName()).replace("%x%", event.getEntityPlayer().posX + "").replace("%y%", event.getEntityPlayer().posY + "").replace("%z%", event.getEntityPlayer().posZ + ""));
  287.                         }
  288.                     }
  289.                     if (!reward.getCommandCompletionMessage().equals(""))
  290.                     {
  291.                         event.getEntityPlayer().addChatComponentMessage(new TextComponentString(CrateReloaded.prefix + TextFormatting.GRAY + reward.getCommandCompletionMessage()));
  292.                     }
  293.                 }
  294.             }
  295.         }
  296.  
  297.         System.out.println("Item before: " + event.getEntityPlayer().getHeldItemMainhand().getDisplayName());
  298.         event.getEntityPlayer().inventory.decrStackSize(event.getEntityPlayer().inventory.currentItem, 1);
  299.         event.getEntityPlayer().inventoryContainer.detectAndSendChanges();
  300.         System.out.println("Item after: " + event.getEntityPlayer().getHeldItemMainhand());
  301.  
  302.         // PLAYER MESSAGE
  303.         if (CrateReloaded.instance.hasKey("message", crateName))
  304.         {
  305.             if (CrateReloaded.instance.hasKey("onOpen", crateName, "message"))
  306.             {
  307.                 String message = CrateReloaded.instance.getValueOfKey(crateName + ".message.onOpen").toString().replace("&", "\u00A7");
  308.                 if (!message.equals(""))
  309.                 {
  310.                     if (!event.getWorld().isRemote)
  311.                     {
  312.                         event.getEntityPlayer().addChatComponentMessage(new TextComponentString(CrateReloaded.prefix + message));
  313.                     }
  314.                 }
  315.             }
  316.             if (CrateReloaded.instance.hasKey("broadcast", crateName, "message"))
  317.             {
  318.                 String s1 = CrateReloaded.instance.getValueOfKey(crateName + ".message.broadcast").toString();
  319.                 if (!s1.equals(""))
  320.                 {
  321.                     if (!event.getWorld().isRemote)
  322.                     {
  323.                         String s = s1.replaceAll("%player%", event.getEntityPlayer().getName()).replace("&", "\u00A7");
  324.                         FMLCommonHandler.instance().getSidedDelegate().getServer().addChatMessage(new TextComponentString(CrateReloaded.prefix + s));
  325.                     }
  326.                 }
  327.             }
  328.         }
  329.  
  330.         String[] openEffects = new String[0];
  331.         if (CrateReloaded.instance.hasKey("onOpenEffects", crateName, "effect"))
  332.         {
  333.             openEffects = CrateReloaded.instance.getValueOfKey(crateName + ".effect.onOpenEffects").toString().split(",");
  334.         }
  335.         EntityPlayer player = event.getEntityPlayer();
  336.         // PARTICLES
  337.         for (String s : openEffects)
  338.         {
  339.             if (getParticleFromName(s.trim()) != null)
  340.             {
  341.                 if (event.getWorld() instanceof WorldServer)
  342.                 {
  343.                     double posX = isBlock ? event.getPos().getX() + 0.5 : player.posX;
  344.                     double posY = isBlock ? event.getPos().getY() : player.posY;
  345.                     double posZ = isBlock ? event.getPos().getZ() + 0.5 : player.posZ;
  346.                     double offset = isBlock ? 0.4 : player.width * 0.4;
  347.                     ((WorldServer) event.getWorld()).spawnParticle(getParticleFromName(s.trim()), getParticleFromName(s.trim()).getShouldIgnoreRange(), posX, posY, posZ, 20, offset, 0.5, offset, 0.1, new int[0]);
  348.                 }
  349.             }
  350.         }
  351.         // SOUNDS
  352.         if (CrateReloaded.instance.hasKey("onOpenSounds", crateName, "effect"))
  353.         {
  354.             String[] openSounds = CrateReloaded.instance.getValueOfKey(crateName + ".effect.onOpenSounds").toString().split(",");
  355.             for (String s : openSounds)
  356.             {
  357.                 String[] id = s.trim().split(":");
  358.                 String modid = s.length() == 2 ? id[0] : "minecraft";
  359.                 String thing = s.length() == 2 ? id[1] : id[0];
  360.  
  361.                 event.getWorld().playSound(player, player.getPosition(), SoundEvent.REGISTRY.getObject(new ResourceLocation(modid, thing)), SoundCategory.AMBIENT, 1f, 1f);
  362.             }
  363.         }
  364.  
  365.         event.setCanceled(true);
  366.     }
  367.  
  368.     public boolean showRewards(BlockPos bpos, World world, EntityPlayerMP player)
  369.     {
  370.         BlockPos pos = bpos;
  371.         int dimId = world.provider.getDimension();
  372.         YAMLCoordinates yaml = new YAMLCoordinates(pos.getX(), pos.getY(), pos.getZ(), dimId);
  373.  
  374.         if (world.getBlockState(pos).getBlock() == Blocks.CHEST)
  375.         {
  376.             BlockChest chest = (BlockChest) world.getBlockState(pos).getBlock();
  377.             for (String crateName : CrateReloaded.instance.getCratesOfType("KEYCRATE"))
  378.             {
  379.                 if (CrateReloaded.instance.getValuesOfChildrenOfKeyLocations("Locations", crateName).contains(yaml.forYAML()))
  380.                 {
  381.                     if (CrateReloaded.instance.hasKey("preview", crateName))
  382.                     {
  383.                         if (CrateReloaded.instance.getValueOfKey(crateName, "preview", "enabled").toString().equalsIgnoreCase("true"))
  384.                         {
  385.                             TileEntityChest te = (TileEntityChest) world.getTileEntity(pos);
  386.                             te.clear();
  387.                             if (CrateReloaded.instance.hasKey("displayName", crateName))
  388.                             {
  389.                                 String s = CrateReloaded.instance.getValueOfKey(crateName, "displayName").toString().replace("&", "\u00A7");
  390.                                 te.setCustomName(s);
  391.                             }
  392.                             List<RewardListItem> RLIs = getRewardsFromList(CrateReloaded.instance.getValuesOfChildrenOfKey(crateName, "reward", "rewards"));
  393.                             int totalChance = 0;
  394.                             for (RewardListItem reward : RLIs)
  395.                             {
  396.                                 totalChance += reward.getChance() * 100;
  397.                             }
  398.                             for (int i = 0; i < RLIs.size() && i < te.getSizeInventory(); i++)
  399.                             {
  400.                                 RewardListItem reward = RLIs.get(i);
  401.                                 if (reward.getRewardType() == RewardType.ITEM)
  402.                                 {
  403.                                     ItemStack is = new ItemStack(reward.getItem(), reward.getAmount(), reward.getMeta());
  404.                                     is.setTagCompound(new NBTTagCompound());
  405.                                     for (int id : reward.getEnchantmentIdSet())
  406.                                     {
  407.                                         is.addEnchantment(Enchantment.getEnchantmentByID(id), reward.getLevelOfEnchantment(id));
  408.                                     }
  409.                                     NBTTagCompound display = new NBTTagCompound();
  410.                                     NBTTagList lore = new NBTTagList();
  411.                                     if (reward.hasLore())
  412.                                     {
  413.                                         lore.appendTag(new NBTTagString(reward.getItemLore()));
  414.                                     }
  415.                                     display.setTag("Lore", lore);
  416.                                     is.getTagCompound().setTag("display", display);
  417.                                     if (reward.hasCustomName())
  418.                                     {
  419.                                         is.setStackDisplayName(reward.getCustomName());
  420.                                     }
  421.                                     te.setInventorySlotContents(i, is);
  422.                                 }
  423.                                 else
  424.                                 {
  425.                                     ItemStack display = reward.getCommandDisplayItem();
  426.                                     te.setInventorySlotContents(i, reward.getCommandDisplayItem());
  427.                                 }
  428.                             }
  429.                             try
  430.                             {
  431.                                 Utils.displayInventory(player, player.inventory, te);
  432.                             }
  433.                             catch (Exception e)
  434.                             {
  435.                                 e.printStackTrace();
  436.                             }
  437.                         }
  438.                     }
  439.                     return true;
  440.                 }
  441.             }
  442.         }
  443.         return false;
  444.     }
  445. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement