Advertisement
Guest User

Calculator.java

a guest
Jul 21st, 2019
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.01 KB | None | 0 0
  1. package org.styxl.slimefuncalculator;
  2.  
  3.  
  4. import java.io.IOException;
  5.  
  6. import java.util.Map;
  7.  
  8. import org.bukkit.command.CommandSender;
  9.  
  10. import java.util.ArrayList;
  11. import java.util.Arrays;
  12. import java.util.HashMap;
  13. import java.util.List;
  14.  
  15.  
  16. public class Calculator {
  17.    
  18.    
  19.     public static void calculateWrapper(CommandSender sender, String[] args) throws IOException {
  20.        
  21.         String mode = args[0];
  22.         String[] order = Arrays.copyOfRange(args, 1, args.length);
  23.        
  24.         Map<String, Map<String, String>> itemDict = ItemDict.getItemDict();
  25.         Map<String, Integer> recursionMap = new HashMap<String, Integer>();
  26.         Map<String, String> dummyOrderItemRecipe = new HashMap<String, String>();
  27.        
  28.         for (int i = 0; i < (order.length); i += 2) {
  29.            
  30.             String item = order[i];
  31.             Integer coefficient = Integer.valueOf(order[i + 1]);
  32.            
  33.             dummyOrderItemRecipe.put(item, Integer.toString(coefficient));
  34.            
  35.             if (mode == "normal") {
  36.                
  37.                 Map<String, String> recipe = itemDict.get(item);
  38.                
  39.                 for (String material : recipe.keySet()) {
  40.                    
  41.                     itemDict.put(material, null); // block recursive calls for the "normal" usecase by turning all ingredients as "raw"
  42.                    
  43.                 }
  44.                
  45.             }
  46.            
  47.         }
  48.        
  49.         itemDict.put("dummyOrderItem", dummyOrderItemRecipe);
  50.        
  51.         Map<String, Map<String, Integer>> result = calculate("dummyOrderItem", 1, itemDict, new HashMap<String, Integer>(), new HashMap<String, Integer>());
  52.        
  53.         sendResult(sender, mode, dummyOrderItemRecipe, result);
  54.        
  55.     }
  56.    
  57.    
  58.     public static Map<String, Map<String, Integer>> calculate(String item,
  59.                                                               int n,
  60.                                                               Map<String, Map<String, String>> itemDict,
  61.                                                               Map<String, Integer> recursionMap,
  62.                                                               Map<String, Integer> wasteMap) {
  63.        
  64.        
  65.         Map<String, String> recipe = itemDict.get(item);
  66.        
  67.         if (recipe == null) {
  68.            
  69.             if (recursionMap.containsKey(item)) {
  70.                
  71.                 recursionMap.put(item, recursionMap.get(item) + n);
  72.                
  73.             }
  74.            
  75.             else {
  76.                
  77.                 recursionMap.put(item, n);
  78.                
  79.             }
  80.            
  81.         }
  82.        
  83.         else {
  84.            
  85.             for (Map.Entry<String, String> entry : recipe.entrySet()) {
  86.                
  87.                 String material = entry.getKey();
  88.                 String coefficient = entry.getValue();
  89.                
  90.                 int frac = coefficient.indexOf('/');
  91.                
  92.                 if (frac == -1) {
  93.                
  94.                     calculate(material, Integer.parseInt(coefficient) * n, itemDict, recursionMap, wasteMap);
  95.                
  96.                 }
  97.                
  98.                 else {
  99.                    
  100.                     // Handling fractions and by extension waste products
  101.                     int nominator = Integer.parseInt(coefficient.substring(0, frac));
  102.                     int denominator = Integer.parseInt(coefficient.substring(frac + 1, coefficient.length()));
  103.                    
  104.                     int waste = 0;
  105.                     int required = waste + n;
  106.                    
  107.                     boolean found = false;
  108.                     while (!found) {
  109.                        
  110.                         if (required % denominator == 0) {
  111.                            
  112.                             found = true;
  113.                        
  114.                         }
  115.                        
  116.                         else {
  117.                            
  118.                             waste++;
  119.                             required = waste + n;
  120.                            
  121.                         }
  122.                        
  123.                     }
  124.                    
  125.                     int passedOnAmount = nominator * required;
  126.                    
  127.                     if (waste != 0) {
  128.                        
  129.                         wasteMap.put(item, waste);
  130.                    
  131.                     }
  132.                    
  133.                     calculate(material, passedOnAmount, itemDict, recursionMap, wasteMap);
  134.                
  135.                 }
  136.                
  137.             }
  138.            
  139.         }
  140.        
  141.         Map<String, Map<String, Integer>> result = new HashMap<String, Map<String, Integer>>();
  142.         result.put("materials", recursionMap);
  143.         result.put("waste", wasteMap);
  144.        
  145.         return result; 
  146.        
  147.     }
  148.    
  149.    
  150.     public static void sendResult(CommandSender sender, String mode, Map<String, String> order, Map<String, Map<String, Integer>> result) {
  151.        
  152.         String introOrder = "";
  153.         List<String> costs = new ArrayList<String>();
  154.        
  155.         for(Map.Entry<String, String> entry : order.entrySet()) {
  156.             String material = entry.getKey();
  157.             String amount = entry.getValue();
  158.             introOrder += amount + " " + material + ", ";
  159.         }
  160.        
  161.         introOrder = introOrder.substring(0, introOrder.length()-2); //remove trailing comma and whitespace
  162.        
  163.         for(Map.Entry<String, Integer> entry : result.get("materials").entrySet()) {
  164.             String material = entry.getKey();
  165.             Integer amount = entry.getValue();
  166.             int stacks;
  167.            
  168.             if (amount >= 64) {
  169.                 stacks = amount / 64;
  170.             }
  171.             else {
  172.                 stacks = 0;
  173.             }
  174.  
  175.             int stackLeftover = amount - stacks * 64;
  176.             costs.add(String.format("%s: %d stacks, %d items", material, stacks, stackLeftover));
  177.         }
  178.        
  179.         String intro = String.format("%s cost for %s is:", mode, introOrder);
  180.         sender.sendMessage("----------------------SFC-------------------------");
  181.         sender.sendMessage(intro);
  182.         for(String item : costs) {
  183.             sender.sendMessage(item);
  184.         }
  185.         Map<String, Integer> waste = result.get("waste");
  186.         if (!waste.isEmpty()) {
  187.             sender.sendMessage("Waste products:");
  188.             for(Map.Entry<String, Integer> entry : waste.entrySet()) {
  189.                
  190.                 sender.sendMessage(String.format("%s: %d", entry.getKey(), entry.getValue()));
  191.            
  192.             }
  193.         }
  194.         sender.sendMessage("----------------------SFC-------------------------");
  195.        
  196.     }
  197.    
  198.    
  199. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement