@Override
  public ItemStack applyEffectByID(ItemStack artifact, int id, String trigger) {
    if (artifact.stackTagCompound == null) {
      artifact.stackTagCompound = this.createDefault();
    }
    int[] a = artifact.stackTagCompound.getIntArray("allComponents");
    Vector effectsOnItem = new Vector();
    for (int i = 0; i < 5; ++i) {
      if (a[i] != 0) {
        effectsOnItem.add(a[i]);
      }
    }
    int numEff = 0;

    IArtifactComponent c = getComponent(id);
    if (!effectsOnItem.contains(c)) {
      if (trigger == null || trigger.equals("")) trigger = c.getRandomTrigger(rand);
      if (!artifact.stackTagCompound.hasKey(trigger)) {
        effectsOnItem.add(c);
        if (id == 9) {
          int bonus = a.length * 5;
          if (numEff == a.length) {
            numEff = 1;
            bonus = 0;
            artifact.stackSize = 10;
          }
          artifact.stackTagCompound.setInteger("cashBonus", bonus);
        }
        if (id == 7) {
          if (numEff == a.length) {
            if (trigger == "onDropped") {
              numEff = 1;
              artifact.stackSize = 10;
            }
          }
        }
        artifact.stackTagCompound.setInteger(trigger, id);
        for (int i = 0; i < 5; ++i) {
          if (a[i] == 0) {
            a[i] = id;
            i = 99;
          }
        }
        artifact.stackTagCompound.setIntArray("allComponents", a);
      }
    }
    return artifact;
  }
  public ItemStack applyRandomEffects(ItemStack artifact) {
    artifact.stackTagCompound = createDefault();
    String nameChunk = "";
    Amulet = 1;
    Dagger = 1;
    Figurine = 1;
    Ring = 1;
    Staff = 1;
    Sword = 1;
    Trinket = 1;
    Wand = 1;
    Armor = 1;
    Boots = 1;
    Chestplate = 1;
    Helm = 1;
    Leggings = 1;
    int flags, effID;
    String artiName = "";
    Vector effectsOnItem = new Vector();
    IArtifactComponent c;
    int count = 0, a[];
    int numEff = rand.nextInt(5) + 1;
    a = new int[numEff];
    for (; numEff > 0; numEff--) {
      effID = rand.nextInt(effects.size()) + 1;
      if (effID == 17 && a.length < 3) {
        numEff++;
        a = new int[numEff];
      }
      c = getComponent(effID);
      if (effectsOnItem.contains(c)) {
        numEff++;
        continue;
      }
      String trigName = c.getRandomTrigger(rand);
      if (artifact.stackTagCompound.hasKey(trigName)) {
        // make NBTTagLists to remove this condition;
        numEff++;
        continue;
      }
      effectsOnItem.add(c);
      if (effID == 9) {
        int bonus = a.length * 5;
        if (numEff == a.length) {
          numEff = 1;
          bonus = 0;
          artifact.stackSize = 10;
        }
        artifact.stackTagCompound.setInteger("cashBonus", bonus);
      }
      if (effID == 7) {
        if (numEff == a.length) {
          if (trigName == "onDropped") {
            numEff = 1;
            artifact.stackSize = 10;
          }
        }
      }
      // System.out.println(c.getName());
      artifact.stackTagCompound.setInteger(trigName, effID);
      if (trigName == "onHeld") {
        artifact = c.attached(artifact, rand);
      }
      a[numEff - 1] = effID;
      flags = c.getTextureBitflags();
      Amulet += flags % 2;
      flags >>= 1;
      Dagger += flags % 2;
      flags >>= 1;
      Figurine += flags % 2;
      flags >>= 1;
      Ring += flags % 2;
      flags >>= 1;
      Staff += flags % 2;
      flags >>= 1;
      Sword += flags % 2;
      flags >>= 1;
      Trinket += flags % 2;
      flags >>= 1;
      Wand += flags % 2;
      flags >>= 1;
      // Armor += flags % 2;
      flags >>= 1;
      Boots += flags % 2;
      flags >>= 1;
      Chestplate += flags % 2;
      flags >>= 1;
      Helm += flags % 2;
      flags >>= 1;
      Leggings += flags % 2;

      flags = c.getNegTextureBitflags();
      Amulet -= flags % 2;
      flags >>= 1;
      Dagger -= flags % 2;
      flags >>= 1;
      Figurine -= flags % 2;
      flags >>= 1;
      Ring -= flags % 2;
      flags >>= 1;
      Staff -= flags % 2;
      flags >>= 1;
      Sword -= flags % 2;
      flags >>= 1;
      Trinket -= flags % 2;
      flags >>= 1;
      Wand -= flags % 2;
      flags >>= 1;
      Armor -= flags % 2;
      flags >>= 1;
      Boots -= flags % 2;
      flags >>= 1;
      Chestplate -= flags % 2;
      flags >>= 1;
      Helm -= flags % 2;
      flags >>= 1;
      Leggings -= flags % 2;
      if (rand.nextInt(4) == 0) {
        numEff--;
        if (numEff > 0) a[numEff - 1] = 0;
      }
    }
    Amulet = Math.max(Amulet, 0);
    Dagger = Math.max(Dagger, 0);
    Figurine = Math.max(Figurine, 0);
    Ring = Math.max(Ring, 0);
    Staff = Math.max(Staff, 0);
    Sword = Math.max(Sword, 0);
    Trinket = Math.max(Trinket, 0);
    Wand = Math.max(Wand, 0);
    Armor = Math.max(Armor * 4, 0);
    Boots = Math.max(Boots, 0);
    Chestplate = Math.max(Chestplate, 0);
    Helm = Math.max(Helm, 0);
    Leggings = Math.max(Leggings, 0);
    // end loop
    int t = Amulet + Dagger + Figurine + Ring + Staff + Sword + Trinket + Wand;
    int r = 0;
    String iconType;
    artifact.stackTagCompound.setInteger("armorType", -1);
    if (t > 0) {
      r = rand.nextInt(t);
      if ((r -= Amulet) < 0) {
        iconType = "Amulet";
        t = ((FactoryItemIcons) (ArtifactsAPI.itemicons)).numberAmulets;
      } else if ((r -= Dagger) < 0) {
        iconType = "Dagger";
        t = ((FactoryItemIcons) (ArtifactsAPI.itemicons)).numberDaggers;
        if (!effectsOnItem.contains(2)) {
          artifact = baseDamage.attached(artifact, rand);
        }
      } else if ((r -= Figurine) < 0) {
        iconType = "Figurine";
        t = ((FactoryItemIcons) (ArtifactsAPI.itemicons)).numberFigurines;
      } else if ((r -= Ring) < 0) {
        iconType = "Ring";
        t = ((FactoryItemIcons) (ArtifactsAPI.itemicons)).numberRings;
      } else if ((r -= Staff) < 0) {
        iconType = "Staff";
        t = ((FactoryItemIcons) (ArtifactsAPI.itemicons)).numberStaffs;
      } else if ((r -= Sword) < 0) {
        iconType = "Sword";
        t = ((FactoryItemIcons) (ArtifactsAPI.itemicons)).numberSwords;
        if (!effectsOnItem.contains(2)) {
          artifact = baseDamage.attached(artifact, rand);
        }
      } else if ((r -= Trinket) < 0) {
        iconType = "Trinket";
        t = ((FactoryItemIcons) (ArtifactsAPI.itemicons)).numberTrinkets;
      } else if ((r -= Wand) < 0) {
        iconType = "Wand";
        t = ((FactoryItemIcons) (ArtifactsAPI.itemicons)).numberWands;
      } else if ((r -= Armor) < 0) {
        /*t = Boots+Chestplate+Helm+Leggings;
        if(t < 1)
        	t = 1;
        r = rand.nextInt(t);
        if((r -= Boots) < 0) {
        	iconType = "Boots";
        	t = 1;
        	artifact.stackTagCompound.setInteger("armorType", 3);
        }
        else if((r -= Chestplate) < 0) {
        	iconType = "Chestplate";
        	t = 1;
        	artifact.stackTagCompound.setInteger("armorType", 1);
        }
        else if((r -= Helm) < 0) {
        	iconType = "Helm";
        	t = 1;
        	artifact.stackTagCompound.setInteger("armorType", 0);
        }
        else if((r -= Leggings) < 0) {
        	iconType = "Leggings";
        	t = 1;
        	artifact.stackTagCompound.setInteger("armorType", 2);
        }
        else {*/
        iconType = "Artifact";
        t = 1;
        // }
      } else {
        iconType = "Artifact";
        t = 1;
      }
    } else {
      iconType = "Artifact";
      t = 1;
    }
    int r2 = -1, r3 = -1, r4 = rand.nextInt(10);
    String matName = "[Material]";
    switch (r4) {
      case 0:
        matName = "Wood";
        r4 = 0;
        break;
      case 1:
      case 8:
        r4 = 1;
        matName = "Stone";
        break;
      case 2:
      case 7:
      case 9:
        r4 = 2;
        matName = "Iron";
        break;
      case 4:
        r4 = 4;
        matName = "Diamond";
        break;
      case 3:
      case 5:
      case 6:
      case 10:
        r4 = 3;
        matName = "Gold";
        break;
    }
    artifact.stackTagCompound.setString("iconName", iconType);
    artifact.stackTagCompound.setString("matName", matName);
    if (effectsOnItem.size() > 1) {
      r2 = rand.nextInt(effectsOnItem.size());
      c = (IArtifactComponent) effectsOnItem.get(r2);
      // System.out.println("Pre: " + c.getPreAdj(rand));
      nameChunk = c.getPreAdj(rand);
      artifact.stackTagCompound.setString("preadj", nameChunk);
      artiName = nameChunk + " ";
      artiName += matName + " " + iconType;
      do {
        r3 = rand.nextInt(effectsOnItem.size());
      } while (r2 == r3);
      c = (IArtifactComponent) effectsOnItem.get(r3);
      nameChunk = c.getPostAdj(rand);
      artifact.stackTagCompound.setString("postadj", nameChunk);
      artiName += " " + nameChunk;
    } else {
      // System.out.println("Singular");
      if (rand.nextBoolean()) {
        r2 = rand.nextInt(effectsOnItem.size());
        c = (IArtifactComponent) effectsOnItem.get(r2);
        nameChunk = c.getPreAdj(rand);
        artifact.stackTagCompound.setString("preadj", nameChunk);
        artifact.stackTagCompound.setString("postadj", "");
        artiName = nameChunk + " " + matName + " " + iconType;
      } else {
        r3 = rand.nextInt(effectsOnItem.size());
        c = (IArtifactComponent) effectsOnItem.get(r3);
        nameChunk = c.getPostAdj(rand);
        artifact.stackTagCompound.setString("preadj", "");
        artifact.stackTagCompound.setString("postadj", nameChunk);
        artiName = matName + " " + iconType + " " + nameChunk;
      }
    }
    r = rand.nextInt(t);
    artifact.stackTagCompound.setString("name", artiName);
    artifact.stackTagCompound.setString("icon", iconType + (r + 1));
    int col = Color.HSBtoRGB((float) (rand.nextInt(360) / 360F), .8f, 1);
    artifact.stackTagCompound.setLong("overlay_color", col);
    artiName = "";
    artifact.stackTagCompound.setInteger("material", r4);

    artifact.stackTagCompound.setIntArray("allComponents", a);
    if (rand.nextInt(8) == 0) {
      artifact =
          enchantArtifact(artifact, effectsOnItem, (iconType == "Sword" || iconType == "Dagger"));
    }
    return artifact;
  }