Compare commits

...

15 Commits

Author SHA1 Message Date
Electroblob77 07acea53e3 A couple of tweaks for backwards compatiblity 2021-01-17 21:33:09 +00:00
Electroblob77 1fcb3a2b1b Reduce capacity of medium mana flask and reduce number of crystals required to craft it accordingly 2021-01-17 20:27:21 +00:00
Electroblob77 16eabc8deb Update version number 2021-01-17 20:23:28 +00:00
Electroblob77 e0efd8d407 Make mana flasks take time to use 2021-01-17 19:25:14 +00:00
Electroblob77 969f0b96fd Have custom large fireballs deal magic damage to ghasts in order to get around vanilla's hardcoded instanceof check, fixes #443 2021-01-17 17:40:09 +00:00
Electroblob77 8a9d88c9ac Guard against null item entities in LivingDropsEvent, fixes #464 2021-01-17 17:19:07 +00:00
Electroblob77 3b55728c75 Actually register font of mana with the event bus, fixes #477 2021-01-17 15:26:30 +00:00
Electroblob77 240bffa7ed Sometimes, I surprise even myself with my own stupidity... fixes #594
(This is literally why I have a helper method. To prevent exactly this error :/)
2021-01-17 15:14:23 +00:00
Electroblob77 c313236eec Disable weather forfeit when invoke weather is disabled, closes #554 2021-01-17 15:08:34 +00:00
Electroblob77 21f7928b9c Guard against null target in remant AI, fixes #600 2021-01-17 14:58:59 +00:00
Electroblob77 1304c11381 People don't listen to me, so let's spell it out to them 2021-01-17 14:41:21 +00:00
Electroblob77 79932e15ab Allow class armour to be imbued properly at the imbuement altar 2021-01-17 13:36:56 +00:00
Electroblob77 25ee166e41 Derp 2021-01-17 13:32:38 +00:00
Electroblob77 299510e663 Add armour classes!
- Added 3 new armour variants - the sage, the battlemage and the warlock - each in the 8 elemental varieties
- Added resplendent thread, crystal silver plating and ethereal crystalweave, used to upgrade regular armour into class armour
- Added the new armour upgrades to loot tables
- Added recipes for the new armour to JEI, along with info pages for the 3 upgrade items
- Added advancements for the new armour classes
- Removed legendary wizard armour
- Removed arcane seal of protection
- Removed the 'legendary' advancement
2021-01-16 23:02:03 +00:00
Electroblob77 d3d76cae16 Update Russian translations, courtesy of DrHesperus 2021-01-05 20:35:42 +00:00
305 changed files with 3621 additions and 1083 deletions
+1 -1
View File
@@ -10,7 +10,7 @@ assignees: ''
Please read the [guide for contributing](https://github.com/Electroblob77/Wizardry/blob/1.12.2/CONTRIBUTING.md) before posting. Please read the [guide for contributing](https://github.com/Electroblob77/Wizardry/blob/1.12.2/CONTRIBUTING.md) before posting.
Minecraft version: 1.12.2 [change as necessary] Minecraft version: 1.12.2 [change as necessary]
Wizardry version: 4.3.2 [change as necessary] Wizardry version: 4.3.3 [change as necessary]
Environment: Singleplayer/LAN game/Server [delete as necessary] Environment: Singleplayer/LAN game/Server [delete as necessary]
Issue details: [describe what you were doing when the issue occurred, what went wrong, what you expected to happen, etc.] Issue details: [describe what you were doing when the issue occurred, what went wrong, what you expected to happen, etc.]
+1 -1
View File
@@ -10,7 +10,7 @@ assignees: ''
Please read the [guide for contributing](https://github.com/Electroblob77/Wizardry/blob/1.12.2/CONTRIBUTING.md) before posting. Please read the [guide for contributing](https://github.com/Electroblob77/Wizardry/blob/1.12.2/CONTRIBUTING.md) before posting.
Minecraft version: 1.12.2 [change as necessary] Minecraft version: 1.12.2 [change as necessary]
Wizardry version: 4.3.2 [change as necessary] Wizardry version: 4.3.3 [change as necessary]
Question details: [explain your question here] Question details: [explain your question here]
+1 -1
View File
@@ -1,7 +1,7 @@
# Credits # Credits
Electroblob's Wizardry Electroblob's Wizardry
Version 4.3.2 Version 4.3.3
For Minecraft 1.12.2 For Minecraft 1.12.2
Designed, coded and textured by Electroblob Designed, coded and textured by Electroblob
+1 -1
View File
@@ -1,7 +1,7 @@
Please read the [guide for contributing](https://github.com/Electroblob77/Wizardry/blob/1.12.2/guide_for_contributing.md) before posting. Please read the [guide for contributing](https://github.com/Electroblob77/Wizardry/blob/1.12.2/guide_for_contributing.md) before posting.
Minecraft version: 1.12.2 [change as necessary] Minecraft version: 1.12.2 [change as necessary]
Wizardry version: 4.3.2 [change as necessary] Wizardry version: 4.3.3 [change as necessary]
Environment: Singleplayer/LAN game/Server [delete as necessary] Environment: Singleplayer/LAN game/Server [delete as necessary]
Issue details: [describe what you were doing when the issue occurred, what went wrong, what you expected to happen, etc.] Issue details: [describe what you were doing when the issue occurred, what went wrong, what you expected to happen, etc.]
+1 -1
View File
@@ -11,7 +11,7 @@ apply plugin: 'net.minecraftforge.gradle.forge'
//Only edit below this line, the above code adds and enables the necessary things for Forge to be setup. //Only edit below this line, the above code adds and enables the necessary things for Forge to be setup.
version = "4.3.2" // There, it matches semver, happy now? version = "4.3.3" // There, it matches semver, happy now?
group= "electroblob.wizardry"// http://maven.apache.org/guides/mini/guide-naming-conventions.html group= "electroblob.wizardry"// http://maven.apache.org/guides/mini/guide-naming-conventions.html
archivesBaseName = "ElectroblobsWizardry" archivesBaseName = "ElectroblobsWizardry"
@@ -10,6 +10,7 @@ import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemArmor.ArmorMaterial;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.SoundCategory; import net.minecraft.util.SoundCategory;
@@ -48,7 +49,7 @@ public class CommonProxy {
public void registerKeyBindings(){} public void registerKeyBindings(){}
public net.minecraft.client.model.ModelBiped getWizardArmourModel(){ public net.minecraft.client.model.ModelBiped getWizardArmourModel(ArmorMaterial material){
return null; return null;
} }
@@ -93,6 +93,8 @@ public final class Settings {
/** The wizardry config file. */ /** The wizardry config file. */
private Configuration config; private Configuration config;
private List<String> redundantKeys = new ArrayList<>();
// Server-only settings. These only affect server-side code and hence are not synced. Changing these locally only // Server-only settings. These only affect server-side code and hence are not synced. Changing these locally only
// has an effect if the local game is the host, i.e. a dedicated server, a LAN host or a singleplayer world. // has an effect if the local game is the host, i.e. a dedicated server, a LAN host or a singleplayer world.
@@ -446,6 +448,8 @@ public final class Settings {
*/ */
void initConfig(FMLPreInitializationEvent event){ void initConfig(FMLPreInitializationEvent event){
redundantKeys.clear();
config = new Configuration(new File(Wizardry.configDirectory, Wizardry.MODID + ".cfg")); config = new Configuration(new File(Wizardry.configDirectory, Wizardry.MODID + ".cfg"));
config.load(); config.load();
@@ -484,6 +488,8 @@ public final class Settings {
/** Called to save changes to the config file after it has been edited in game from the menus. */ /** Called to save changes to the config file after it has been edited in game from the menus. */
void saveConfigChanges(){ void saveConfigChanges(){
redundantKeys.clear();
Wizardry.logger.info("Saving in-game config changes"); Wizardry.logger.info("Saving in-game config changes");
setupGameplayConfig(); setupGameplayConfig();
@@ -500,6 +506,32 @@ public final class Settings {
config.save(); config.save();
} }
void checkForRedundantOptions(String categoryName, Collection<String> validKeys){
ConfigCategory category = config.getCategory(categoryName);
boolean redundantKeysFound = false;
for(String key : category.keySet()){
if(!validKeys.contains(key)){
redundantKeys.add(key);
if(!redundantKeysFound){
redundantKeysFound = true;
Wizardry.logger.info("Config category {} contains redundant options:", categoryName);
}
Wizardry.logger.info(key);
}
}
if(redundantKeysFound){
Wizardry.logger.info("These options will have no effect (they are probably left over from an older version of wizardry). It is recommended to either remove them manually, or delete ebwizardry.cfg and allow a fresh config to be generated.");
}
}
/** Returns true if the config file contains keys that are not valid options (usually because of updates). */
public boolean hasRedundantKeys(){
return !redundantKeys.isEmpty();
}
/** Sends a packet to the specified player's client containing all the <b>synchronised</b> settings. */ /** Sends a packet to the specified player's client containing all the <b>synchronised</b> settings. */
public void sync(EntityPlayerMP player){ public void sync(EntityPlayerMP player){
Wizardry.logger.info("Synchronising config settings for " + player.getName()); Wizardry.logger.info("Synchronising config settings for " + player.getName());
@@ -518,7 +550,10 @@ public final class Settings {
Property property; Property property;
List<String> keys = new ArrayList<>();
for(Spell spell : Spell.getAllSpells()){ for(Spell spell : Spell.getAllSpells()){
keys.add(spell.getRegistryName().toString());
property = config.get(SPELLS_CATEGORY, spell.getRegistryName().toString(), true, property = config.get(SPELLS_CATEGORY, spell.getRegistryName().toString(), true,
"Set to false to disable this spell"); "Set to false to disable this spell");
// Uses the same config key as the spell name, because - well, that's what it's called! // Uses the same config key as the spell name, because - well, that's what it's called!
@@ -527,6 +562,7 @@ public final class Settings {
spell.setEnabled(property.getBoolean(true)); spell.setEnabled(property.getBoolean(true));
} }
checkForRedundantOptions(SPELLS_CATEGORY, keys);
} }
private void setupArtefactsConfig(){ private void setupArtefactsConfig(){
@@ -536,8 +572,11 @@ public final class Settings {
Property property; Property property;
List<String> keys = new ArrayList<>();
for(Item item : Item.REGISTRY){ for(Item item : Item.REGISTRY){
if(item instanceof ItemArtefact){ if(item instanceof ItemArtefact){
keys.add(item.getRegistryName().toString());
property = config.get(ARTEFACTS_CATEGORY, item.getRegistryName().toString(), true, property = config.get(ARTEFACTS_CATEGORY, item.getRegistryName().toString(), true,
"Set to false to disable this item"); "Set to false to disable this item");
// Uses the same config key as the item name, because - well, that's what it's called! // Uses the same config key as the item name, because - well, that's what it's called!
@@ -547,6 +586,7 @@ public final class Settings {
} }
} }
checkForRedundantOptions(ARTEFACTS_CATEGORY, keys);
} }
private void setupGameplayConfig(){ private void setupGameplayConfig(){
@@ -623,6 +663,7 @@ public final class Settings {
bonemealGrowsCrystalFlowers = property.getBoolean(); bonemealGrowsCrystalFlowers = property.getBoolean();
propOrder.add(property.getName()); propOrder.add(property.getName());
checkForRedundantOptions(GAMEPLAY_CATEGORY, propOrder); // Must be before the order is set!
config.setCategoryPropertyOrder(GAMEPLAY_CATEGORY, propOrder); config.setCategoryPropertyOrder(GAMEPLAY_CATEGORY, propOrder);
} }
@@ -730,6 +771,7 @@ public final class Settings {
lightningWraithSpawnRate = property.getInt(); lightningWraithSpawnRate = property.getInt();
propOrder.add(property.getName()); propOrder.add(property.getName());
checkForRedundantOptions(DIFFICULTY_CATEGORY, propOrder); // Must be before the order is set!
config.setCategoryPropertyOrder(DIFFICULTY_CATEGORY, propOrder); config.setCategoryPropertyOrder(DIFFICULTY_CATEGORY, propOrder);
} }
@@ -872,6 +914,7 @@ public final class Settings {
} }
} }
checkForRedundantOptions(TWEAKS_CATEGORY, propOrder); // Must be before the order is set!
config.setCategoryPropertyOrder(TWEAKS_CATEGORY, propOrder); config.setCategoryPropertyOrder(TWEAKS_CATEGORY, propOrder);
} }
@@ -1019,6 +1062,7 @@ public final class Settings {
lootInjectionLocations = getResourceLocationList(property); lootInjectionLocations = getResourceLocationList(property);
propOrder.add(property.getName()); propOrder.add(property.getName());
checkForRedundantOptions(WORLDGEN_CATEGORY, propOrder); // Must be before the order is set!
config.setCategoryPropertyOrder(WORLDGEN_CATEGORY, propOrder); config.setCategoryPropertyOrder(WORLDGEN_CATEGORY, propOrder);
} }
@@ -1120,6 +1164,7 @@ public final class Settings {
donationPerkElement = Element.fromName(property.getString(), null); // Fallback to null for no element donationPerkElement = Element.fromName(property.getString(), null); // Fallback to null for no element
propOrder.add(property.getName()); propOrder.add(property.getName());
checkForRedundantOptions(CLIENT_CATEGORY, propOrder); // Must be before the order is set!
config.setCategoryPropertyOrder(CLIENT_CATEGORY, propOrder); config.setCategoryPropertyOrder(CLIENT_CATEGORY, propOrder);
} }
@@ -1166,6 +1211,7 @@ public final class Settings {
alliesCommandName = property.getString(); alliesCommandName = property.getString();
propOrder.add(property.getName()); propOrder.add(property.getName());
checkForRedundantOptions(COMMANDS_CATEGORY, propOrder); // Must be before the order is set!
config.setCategoryPropertyOrder(COMMANDS_CATEGORY, propOrder); config.setCategoryPropertyOrder(COMMANDS_CATEGORY, propOrder);
} }
@@ -1243,6 +1289,7 @@ public final class Settings {
} }
propOrder.add(property.getName()); propOrder.add(property.getName());
checkForRedundantOptions(RESISTANCES_CATEGORY, propOrder); // Must be before the order is set!
config.setCategoryPropertyOrder(RESISTANCES_CATEGORY, propOrder); config.setCategoryPropertyOrder(RESISTANCES_CATEGORY, propOrder);
} }
@@ -1332,6 +1379,7 @@ public final class Settings {
autoUndergroundLibraryMarkers = property.getBoolean(); autoUndergroundLibraryMarkers = property.getBoolean();
propOrder.add(property.getName()); propOrder.add(property.getName());
checkForRedundantOptions(COMPATIBILITY_CATEGORY, propOrder); // Must be before the order is set!
config.setCategoryPropertyOrder(COMPATIBILITY_CATEGORY, propOrder); config.setCategoryPropertyOrder(COMPATIBILITY_CATEGORY, propOrder);
} }
@@ -1,5 +1,8 @@
package electroblob.wizardry; package electroblob.wizardry;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import electroblob.wizardry.block.BlockBookshelf; import electroblob.wizardry.block.BlockBookshelf;
import electroblob.wizardry.command.CommandCastSpell; import electroblob.wizardry.command.CommandCastSpell;
import electroblob.wizardry.command.CommandDiscoverSpell; import electroblob.wizardry.command.CommandDiscoverSpell;
@@ -36,6 +39,8 @@ import net.minecraftforge.fml.common.registry.GameRegistry;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import java.io.File; import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Calendar; import java.util.Calendar;
/** /**
@@ -69,7 +74,7 @@ public class Wizardry {
* 1.x.x represents Minecraft 1.7.x versions, 2.x.x represents Minecraft 1.10.x versions, 3.x.x represents Minecraft * 1.x.x represents Minecraft 1.7.x versions, 2.x.x represents Minecraft 1.10.x versions, 3.x.x represents Minecraft
* 1.11.x versions, and so on. * 1.11.x versions, and so on.
*/ */
public static final String VERSION = "4.3.2"; public static final String VERSION = "4.3.3";
// IDEA: Triggering of inbuilt Forge events in relevant places? // IDEA: Triggering of inbuilt Forge events in relevant places?
// IDEA: Abstract the vanilla particles behind the particle builder // IDEA: Abstract the vanilla particles behind the particle builder
@@ -144,6 +149,34 @@ public class Wizardry {
@EventHandler @EventHandler
public void init(FMLInitializationEvent event){ public void init(FMLInitializationEvent event){
Gson gson = new GsonBuilder().setPrettyPrinting().create();
for(Item item : Item.REGISTRY){
if(item.getRegistryName().getNamespace().equals(MODID)){
try{
FileWriter writer = new FileWriter("generated\\" + item.getRegistryName().getPath() + ".json");
JsonObject json = new JsonObject();
json.addProperty("parent", "item/generated");
JsonObject textures = new JsonObject();
textures.addProperty("layer0", MODID + ":items/" + item.getRegistryName().getPath());
json.add("textures", textures);
gson.toJson(json, writer);
writer.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
settings.initConfigExtras(); settings.initConfigExtras();
// World generators // World generators
@@ -168,8 +201,6 @@ public class Wizardry {
// Post-registry extras // Post-registry extras
BlockBookshelf.compileBookModelTextures(); BlockBookshelf.compileBookModelTextures();
ContainerBookshelf.initDefaultBookItems(); ContainerBookshelf.initDefaultBookItems();
WizardryItems.populateWandMap();
WizardryItems.populateArmourMap();
WizardryItems.registerDispenseBehaviours(); WizardryItems.registerDispenseBehaviours();
WizardryItems.registerBannerPatterns(); WizardryItems.registerBannerPatterns();
WandHelper.populateUpgradeMap(); WandHelper.populateUpgradeMap();
@@ -261,7 +261,6 @@ public class BlockBookshelf extends BlockHorizontal implements ITileEntityProvid
registerBookModelTexture(() -> WizardryItems.scroll, new ResourceLocation(Wizardry.MODID, "blocks/scrolls_blue")); registerBookModelTexture(() -> WizardryItems.scroll, new ResourceLocation(Wizardry.MODID, "blocks/scrolls_blue"));
registerBookModelTexture(() -> WizardryItems.blank_scroll, new ResourceLocation(Wizardry.MODID, "blocks/scrolls_blue")); registerBookModelTexture(() -> WizardryItems.blank_scroll, new ResourceLocation(Wizardry.MODID, "blocks/scrolls_blue"));
registerBookModelTexture(() -> WizardryItems.identification_scroll, new ResourceLocation(Wizardry.MODID, "blocks/scrolls_purple")); registerBookModelTexture(() -> WizardryItems.identification_scroll, new ResourceLocation(Wizardry.MODID, "blocks/scrolls_purple"));
registerBookModelTexture(() -> WizardryItems.armour_upgrade, new ResourceLocation(Wizardry.MODID, "blocks/scrolls_red"));
// Can't use the map in WandHelper because this is called from preInit (addons will have to add theirs manually) // Can't use the map in WandHelper because this is called from preInit (addons will have to add theirs manually)
registerBookModelTexture(() -> WizardryItems.storage_upgrade, new ResourceLocation(Wizardry.MODID, "blocks/scrolls_wooden")); registerBookModelTexture(() -> WizardryItems.storage_upgrade, new ResourceLocation(Wizardry.MODID, "blocks/scrolls_wooden"));
registerBookModelTexture(() -> WizardryItems.siphon_upgrade, new ResourceLocation(Wizardry.MODID, "blocks/scrolls_wooden")); registerBookModelTexture(() -> WizardryItems.siphon_upgrade, new ResourceLocation(Wizardry.MODID, "blocks/scrolls_wooden"));
@@ -14,6 +14,8 @@ import electroblob.wizardry.client.gui.GuiSpellDisplay;
import electroblob.wizardry.client.gui.config.NamedBooleanEntry; import electroblob.wizardry.client.gui.config.NamedBooleanEntry;
import electroblob.wizardry.client.gui.config.SpellHUDSkinChooserEntry; import electroblob.wizardry.client.gui.config.SpellHUDSkinChooserEntry;
import electroblob.wizardry.client.gui.handbook.GuiWizardHandbook; import electroblob.wizardry.client.gui.handbook.GuiWizardHandbook;
import electroblob.wizardry.client.model.ModelRobeArmour;
import electroblob.wizardry.client.model.ModelSageArmour;
import electroblob.wizardry.client.model.ModelWizardArmour; import electroblob.wizardry.client.model.ModelWizardArmour;
import electroblob.wizardry.client.particle.*; import electroblob.wizardry.client.particle.*;
import electroblob.wizardry.client.particle.ParticleWizardry.IWizardryParticleFactory; import electroblob.wizardry.client.particle.ParticleWizardry.IWizardryParticleFactory;
@@ -39,6 +41,7 @@ import electroblob.wizardry.item.ItemSpellBook;
import electroblob.wizardry.item.ItemWand; import electroblob.wizardry.item.ItemWand;
import electroblob.wizardry.packet.*; import electroblob.wizardry.packet.*;
import electroblob.wizardry.registry.Spells; import electroblob.wizardry.registry.Spells;
import electroblob.wizardry.registry.WizardryItems.Materials;
import electroblob.wizardry.registry.WizardrySounds; import electroblob.wizardry.registry.WizardrySounds;
import electroblob.wizardry.spell.*; import electroblob.wizardry.spell.*;
import electroblob.wizardry.tileentity.*; import electroblob.wizardry.tileentity.*;
@@ -65,6 +68,7 @@ import net.minecraft.entity.monster.EntityBlaze;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.ContainerMerchant; import net.minecraft.inventory.ContainerMerchant;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemArmor.ArmorMaterial;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityDispenser; import net.minecraft.tileentity.TileEntityDispenser;
@@ -120,8 +124,16 @@ public class ClientProxy extends CommonProxy {
} }
} }
// Armour Model // Armour Models
public static final ModelBiped WIZARD_ARMOUR_MODEL = new ModelWizardArmour(0.75f); // Can't use an EnumMap here because our additional values aren't really part of the enum
public static final Map<ArmorMaterial, ModelBiped> wizard_armour_models = new HashMap<>();
static {
wizard_armour_models.put(Materials.SILK, new ModelWizardArmour(0.75f));
wizard_armour_models.put(Materials.SAGE, new ModelSageArmour(0.75f));
wizard_armour_models.put(Materials.BATTLEMAGE, new ModelRobeArmour(0.75f, true));
wizard_armour_models.put(Materials.WARLOCK, new ModelRobeArmour(0.75f, false));
}
/** The wrap width for standard multi-line descriptions (see {@link ClientProxy#addMultiLineDescription(List, String, Style, Object...)}). */ /** The wrap width for standard multi-line descriptions (see {@link ClientProxy#addMultiLineDescription(List, String, Style, Object...)}). */
private static final int TOOLTIP_WRAP_WIDTH = 140; private static final int TOOLTIP_WRAP_WIDTH = 140;
@@ -130,8 +142,8 @@ public class ClientProxy extends CommonProxy {
// =============================================================================================================== // ===============================================================================================================
@Override @Override
public ModelBiped getWizardArmourModel(){ public ModelBiped getWizardArmourModel(ArmorMaterial material){
return WIZARD_ARMOUR_MODEL; return wizard_armour_models.get(material);
} }
@Override @Override
@@ -1,5 +1,6 @@
package electroblob.wizardry.client.gui.config; package electroblob.wizardry.client.gui.config;
import com.mojang.realmsclient.gui.ChatFormatting;
import electroblob.wizardry.Settings; import electroblob.wizardry.Settings;
import electroblob.wizardry.Wizardry; import electroblob.wizardry.Wizardry;
import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.GuiScreen;
@@ -18,9 +19,13 @@ import java.util.List;
public class GuiConfigWizardry extends GuiConfig { public class GuiConfigWizardry extends GuiConfig {
public GuiConfigWizardry(GuiScreen parent){ public GuiConfigWizardry(GuiScreen parent){
super(parent, getConfigEntries(), Wizardry.MODID, false, false, super(parent, getConfigEntries(), Wizardry.MODID, false, false,
Wizardry.NAME + " - " + I18n.format("config." + Wizardry.MODID + ".title.general")); Wizardry.NAME + " - " + I18n.format("config." + Wizardry.MODID + ".title.general"));
// this.titleLine2 = "File location: " + Wizardry.config.getConfigFile().getAbsolutePath();
if(Wizardry.settings.hasRedundantKeys()){
this.titleLine2 = ChatFormatting.GOLD.toString() + I18n.format("config." + Wizardry.MODID + ".redundant_keys");
}
} }
private static List<IConfigElement> getConfigEntries(){ private static List<IConfigElement> getConfigEntries(){
@@ -0,0 +1,66 @@
package electroblob.wizardry.client.model;
import electroblob.wizardry.block.BlockStatue;
import net.minecraft.client.model.ModelRenderer;
import net.minecraft.entity.Entity;
public class ModelRobeArmour extends ModelArmourFixer {
ModelRenderer robe;
private boolean showHeadWithBody;
public ModelRobeArmour(float delta, boolean showHeadWithBody){
super(delta, 0, 64, 64);
this.showHeadWithBody = showHeadWithBody;
bipedBody = new ModelRenderer(this, 16, 16);
bipedBody.addBox(-4F, 0F, -2F, 8, 11, 4, delta);
bipedBody.setRotationPoint(0F, 0F, 0F);
bipedBody.setTextureSize(64, 64);
bipedBody.mirror = true;
setRotation(bipedBody, 0F, 0F, 0F);
robe = new ModelRenderer(this, 40, 32);
robe.addBox(-4F, 0F, -2F, 8, 9, 4, delta);
robe.setRotationPoint(0F, 12, 0F); // 12.5 accounts for the expansion of each box
robe.setTextureSize(64, 64);
robe.mirror = true;
setRotation(robe, 0F, 0F, 0F);
}
public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5){
if(entity.isInvisible() && !entity.getEntityData().getBoolean(BlockStatue.PETRIFIED_NBT_KEY)
&& !entity.getEntityData().getBoolean(BlockStatue.FROZEN_NBT_KEY)) return;
super.render(entity, f, f1, f2, f3, f4, f5);
setRotationAngles(f, f1, f2, f3, f4, f5, entity);
this.robe.render(f5);
}
private void setRotation(ModelRenderer model, float x, float y, float z){
model.rotateAngleX = x;
model.rotateAngleY = y;
model.rotateAngleZ = z;
}
public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity){
super.setRotationAngles(f, f1, f2, f3, f4, f5, entity);
this.robe.showModel = this.bipedBody.showModel;
if(showHeadWithBody) this.bipedHead.showModel = this.bipedBody.showModel;
if(this.isSneak){
//this.robe.rotationPointY = 10.5f;
this.robe.rotationPointZ = 4;
}else{
//this.robe.rotationPointY = 12.5f;
this.robe.rotationPointZ = 0;
}
// The bottom part of the robe takes the y rotation from the rest of the robe but the x/z rotation
// from the average of the two legs
this.robe.rotateAngleX = (this.bipedLeftLeg.rotateAngleX + this.bipedRightLeg.rotateAngleX) / 2f;
this.robe.rotateAngleY = this.bipedBody.rotateAngleY;
this.robe.rotateAngleZ = (this.bipedLeftLeg.rotateAngleZ + this.bipedRightLeg.rotateAngleZ) / 2f;
}
}
@@ -0,0 +1,146 @@
package electroblob.wizardry.client.model;
import electroblob.wizardry.block.BlockStatue;
import net.minecraft.client.model.ModelRenderer;
import net.minecraft.entity.Entity;
public class ModelSageArmour extends ModelArmourFixer {
ModelRenderer hatBrim;
ModelRenderer hatSegment1;
ModelRenderer hatSegment2;
ModelRenderer hatSegment3;
ModelRenderer hatSegment4;
ModelRenderer hatSegment5;
ModelRenderer hatSegment6;
ModelRenderer robe;
ModelRenderer collar;
public ModelSageArmour(float delta){
super(delta, 0, 64, 64);
// This is necessary to stop the head from scaling.
this.bipedHead = new ModelRenderer(this, 0, 0);
// The hat layer has an offset of 0.5, so 0.6 is about the smallest we can get away with
this.bipedHead.addBox(-4.0F, -8.0F, -4.0F, 8, 8, 8, 0.6f);
this.bipedHead.setRotationPoint(0.0F, 0.0F + 0, 0.0F);
hatBrim = new ModelRenderer(this, 10, 45);
// Making the height 1 stops the top and bottom z-fighting when the hat is enchanted
hatBrim.addBox(-9F, -5.7F, -9F, 18, 1, 18, 0.6f);
hatBrim.setRotationPoint(0F, 0F, 0F);
hatBrim.setTextureSize(64, 64);
hatBrim.mirror = true;
setRotation(hatBrim, 0F, 0F, 0F);
hatSegment1 = new ModelRenderer(this, 0, 42);
hatSegment1.addBox(0F, 0F, 0F, 6, 2, 6, 0.2f);
hatSegment1.setRotationPoint(-3F, -10.6F, -3F);
hatSegment1.setTextureSize(64, 64);
hatSegment1.mirror = true;
setRotation(hatSegment1, -0.1396263F, 0F, 0F);
hatSegment2 = new ModelRenderer(this, 0, 50);
hatSegment2.addBox(0F, 0F, 0F, 5, 2, 5, 0.1f);
hatSegment2.setRotationPoint(-2.5F, -12.13333F, -2F);
hatSegment2.setTextureSize(64, 64);
hatSegment2.mirror = true;
setRotation(hatSegment2, -0.2443461F, 0F, 0F);
hatSegment3 = new ModelRenderer(this, 0, 57);
hatSegment3.addBox(0F, 0F, 0F, 4, 2, 4);
hatSegment3.setRotationPoint(-2F, -13.6F, -1F);
hatSegment3.setTextureSize(64, 64);
hatSegment3.mirror = true;
setRotation(hatSegment3, -0.4014257F, 0F, 0F);
hatSegment4 = new ModelRenderer(this, 16, 58);
hatSegment4.addBox(0F, 0F, 0F, 3, 2, 3);
hatSegment4.setRotationPoint(-1.5F, -14.6F, 0F);
hatSegment4.setTextureSize(64, 64);
hatSegment4.mirror = true;
setRotation(hatSegment4, -0.5759587F, 0F, 0F);
hatSegment5 = new ModelRenderer(this, 20, 54);
hatSegment5.addBox(0F, 0F, 0F, 2, 2, 2);
hatSegment5.setRotationPoint(-1F, -14.6F, 0F);
hatSegment5.setTextureSize(64, 64);
hatSegment5.mirror = true;
setRotation(hatSegment5, 0.3316126F, 0F, 0F);
hatSegment6 = new ModelRenderer(this, 20, 50);
hatSegment6.addBox(0F, 0F, 0F, 1, 1, 3);
hatSegment6.setRotationPoint(-0.5F, -15.1F, 2F);
hatSegment6.setTextureSize(64, 64);
hatSegment6.mirror = true;
setRotation(hatSegment6, -0.5585054F, 0F, 0F);
bipedBody = new ModelRenderer(this, 16, 16);
bipedBody.addBox(-4F, 0F, -2F, 8, 11, 4, delta);
bipedBody.setRotationPoint(0F, 0F, 0F);
bipedBody.setTextureSize(64, 64);
bipedBody.mirror = true;
setRotation(bipedBody, 0F, 0F, 0F);
robe = new ModelRenderer(this, 40, 32);
robe.addBox(-4F, 0F, -2F, 8, 9, 4, delta);
robe.setRotationPoint(0F, 12, 0F); // 12.5 accounts for the expansion of each box
robe.setTextureSize(64, 64);
robe.mirror = true;
setRotation(robe, 0F, 0F, 0F);
collar = new ModelRenderer(this, 0, 32);
collar.addBox(-7F, 0F, -2F, 14, 4, 4, 1);
collar.setRotationPoint(0F, 0F, 0F);
collar.setTextureSize(64, 64);
collar.mirror = true;
setRotation(collar, 0F, 0F, 0F);
// Makes the hat rotate with the head.
bipedHead.addChild(hatBrim);
bipedHead.addChild(hatSegment1);
bipedHead.addChild(hatSegment2);
bipedHead.addChild(hatSegment3);
bipedHead.addChild(hatSegment4);
bipedHead.addChild(hatSegment5);
bipedHead.addChild(hatSegment6);
bipedBody.addChild(collar);
}
public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5){
if(entity.isInvisible() && !entity.getEntityData().getBoolean(BlockStatue.PETRIFIED_NBT_KEY)
&& !entity.getEntityData().getBoolean(BlockStatue.FROZEN_NBT_KEY)) return;
super.render(entity, f, f1, f2, f3, f4, f5);
setRotationAngles(f, f1, f2, f3, f4, f5, entity);
this.robe.render(f5);
}
private void setRotation(ModelRenderer model, float x, float y, float z){
model.rotateAngleX = x;
model.rotateAngleY = y;
model.rotateAngleZ = z;
}
public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity){
super.setRotationAngles(f, f1, f2, f3, f4, f5, entity);
this.robe.showModel = this.bipedBody.showModel;
if(this.isSneak){
//this.robe.rotationPointY = 10.5f;
this.robe.rotationPointZ = 4;
}else{
//this.robe.rotationPointY = 12.5f;
this.robe.rotationPointZ = 0;
}
// The bottom part of the robe takes the y rotation from the rest of the robe but the x/z rotation
// from the average of the two legs
this.robe.rotateAngleX = (this.bipedLeftLeg.rotateAngleX + this.bipedRightLeg.rotateAngleX) / 2f;
this.robe.rotateAngleY = this.bipedBody.rotateAngleY;
this.robe.rotateAngleZ = (this.bipedLeftLeg.rotateAngleZ + this.bipedRightLeg.rotateAngleZ) / 2f;
}
}
@@ -22,10 +22,6 @@ public final class Constants {
public static final float STORAGE_INCREASE_PER_LEVEL = 0.15f; public static final float STORAGE_INCREASE_PER_LEVEL = 0.15f;
/** The fraction by which potency is increased for each tier of matching wand. */ /** The fraction by which potency is increased for each tier of matching wand. */
public static final float POTENCY_INCREASE_PER_TIER = 0.15f; public static final float POTENCY_INCREASE_PER_TIER = 0.15f;
/** The fraction by which costs are reduced for each piece of matching armour. */
public static final float COST_REDUCTION_PER_ARMOUR = 0.15f;
/** The extra fraction by which costs are reduced for a full set of elemental armour. */
public static final float FULL_ARMOUR_SET_BONUS = 0.2f;
/** The fraction by which spell duration is increased for each level of duration upgrade. */ /** The fraction by which spell duration is increased for each level of duration upgrade. */
public static final float DURATION_INCREASE_PER_LEVEL = 0.25f; public static final float DURATION_INCREASE_PER_LEVEL = 0.25f;
/** The fraction by which spell range is increased for each level of range upgrade. */ /** The fraction by which spell range is increased for each level of range upgrade. */
@@ -45,7 +45,8 @@ public interface Imbuement {
public static void onLivingDropsEvent(LivingDropsEvent event){ public static void onLivingDropsEvent(LivingDropsEvent event){
// Instantly disenchants an imbued weapon if it is dropped when the player dies. // Instantly disenchants an imbued weapon if it is dropped when the player dies.
for(EntityItem item : event.getDrops()){ for(EntityItem item : event.getDrops()){
removeImbuements(item.getItem()); // Apparently some mods don't behave and shove null items in the list, quite why I have no idea
if(item != null) removeImbuements(item.getItem());
} }
} }
@@ -225,6 +225,7 @@ public class EntityRemnant extends EntityMob {
@Override @Override
public void startExecuting(){ public void startExecuting(){
EntityLivingBase entitylivingbase = EntityRemnant.this.getAttackTarget(); EntityLivingBase entitylivingbase = EntityRemnant.this.getAttackTarget();
if(entitylivingbase == null) return;
Vec3d vec3d = entitylivingbase.getPositionEyes(1.0F); Vec3d vec3d = entitylivingbase.getPositionEyes(1.0F);
EntityRemnant.this.moveHelper.setMoveTo(vec3d.x, vec3d.y, vec3d.z, 1.0D); EntityRemnant.this.moveHelper.setMoveTo(vec3d.x, vec3d.y, vec3d.z, 1.0D);
EntityRemnant.this.setAttacking(true); EntityRemnant.this.setAttacking(true);
@@ -241,6 +242,8 @@ public class EntityRemnant extends EntityMob {
EntityLivingBase entitylivingbase = EntityRemnant.this.getAttackTarget(); EntityLivingBase entitylivingbase = EntityRemnant.this.getAttackTarget();
if(entitylivingbase == null) return;
if(EntityRemnant.this.getEntityBoundingBox().intersects(entitylivingbase.getEntityBoundingBox())){ if(EntityRemnant.this.getEntityBoundingBox().intersects(entitylivingbase.getEntityBoundingBox())){
EntityRemnant.this.attackEntityAsMob(entitylivingbase); EntityRemnant.this.attackEntityAsMob(entitylivingbase);
EntityRemnant.this.setAttacking(false); EntityRemnant.this.setAttacking(false);
@@ -4,9 +4,14 @@ import electroblob.wizardry.Wizardry;
import electroblob.wizardry.registry.Spells; import electroblob.wizardry.registry.Spells;
import electroblob.wizardry.spell.Spell; import electroblob.wizardry.spell.Spell;
import electroblob.wizardry.util.EntityUtils; import electroblob.wizardry.util.EntityUtils;
import electroblob.wizardry.util.MagicDamage;
import electroblob.wizardry.util.MagicDamage.DamageType;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import net.minecraft.entity.Entity;
import net.minecraft.entity.monster.EntityGhast;
import net.minecraft.entity.projectile.EntityLargeFireball; import net.minecraft.entity.projectile.EntityLargeFireball;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.DamageSource;
import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.RayTraceResult;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.event.entity.EntityJoinWorldEvent; import net.minecraftforge.event.entity.EntityJoinWorldEvent;
@@ -47,6 +52,15 @@ public class EntityLargeMagicFireball extends EntityMagicFireball {
return damage == -1 ? Spells.greater_fireball.getProperty(Spell.DAMAGE).floatValue() : damage; return damage == -1 ? Spells.greater_fireball.getProperty(Spell.DAMAGE).floatValue() : damage;
} }
@Override
protected DamageSource getDamageSource(Entity entityHit){
if(entityHit instanceof EntityGhast){
return MagicDamage.causeIndirectMagicDamage(this, this.getThrower(), DamageType.MAGIC).setProjectile();
}else{
return super.getDamageSource(entityHit);
}
}
@Override @Override
protected void onImpact(RayTraceResult rayTrace){ protected void onImpact(RayTraceResult rayTrace){
@@ -10,6 +10,7 @@ import electroblob.wizardry.util.ParticleBuilder;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.monster.EntityGhast;
import net.minecraft.entity.projectile.EntitySmallFireball; import net.minecraft.entity.projectile.EntitySmallFireball;
import net.minecraft.init.Blocks; import net.minecraft.init.Blocks;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
@@ -75,9 +76,9 @@ public class EntityMagicFireball extends EntityMagicProjectile {
float damage = getDamage() * damageMultiplier; float damage = getDamage() * damageMultiplier;
entityHit.attackEntityFrom( DamageSource source = getDamageSource(entityHit);
MagicDamage.causeIndirectMagicDamage(this, this.getThrower(), DamageType.FIRE).setProjectile(),
damage); entityHit.attackEntityFrom(source, damage);
if(!MagicDamage.isEntityImmune(DamageType.FIRE, entityHit) && getBurnDuration() > 0) if(!MagicDamage.isEntityImmune(DamageType.FIRE, entityHit) && getBurnDuration() > 0)
entityHit.setFire(getBurnDuration()); entityHit.setFire(getBurnDuration());
@@ -99,6 +100,10 @@ public class EntityMagicFireball extends EntityMagicProjectile {
} }
} }
protected DamageSource getDamageSource(Entity entityHit){
return MagicDamage.causeIndirectMagicDamage(this, this.getThrower(), DamageType.FIRE).setProjectile();
}
@Override @Override
public void onUpdate(){ public void onUpdate(){
@@ -73,7 +73,9 @@ public class WizardryJEIPlugin implements IModPlugin {
addItemInfo(registry, WizardryItems.identification_scroll, ".desc_extended"); addItemInfo(registry, WizardryItems.identification_scroll, ".desc_extended");
addItemInfo(registry, WizardryItems.spell_book); addItemInfo(registry, WizardryItems.spell_book);
addItemInfo(registry, WizardryItems.scroll); addItemInfo(registry, WizardryItems.scroll);
addItemInfo(registry, WizardryItems.armour_upgrade, ".desc_extended"); addItemInfo(registry, WizardryItems.resplendent_thread, ".desc_extended");
addItemInfo(registry, WizardryItems.crystal_silver_plating, ".desc_extended");
addItemInfo(registry, WizardryItems.ethereal_crystalweave, ".desc_extended");
addItemInfo(registry, WizardryItems.purifying_elixir, ".desc_extended"); addItemInfo(registry, WizardryItems.purifying_elixir, ".desc_extended");
addItemInfo(registry, WizardryItems.astral_diamond); addItemInfo(registry, WizardryItems.astral_diamond);
addItemInfo(registry, WizardryItems.ruined_spell_book); addItemInfo(registry, WizardryItems.ruined_spell_book);
@@ -99,7 +99,9 @@ public class ContainerArcaneWorkbench extends Container implements ISpellSortabl
Set<Item> upgrades = new HashSet<>(WandHelper.getSpecialUpgrades()); // Can't be done statically. Set<Item> upgrades = new HashSet<>(WandHelper.getSpecialUpgrades()); // Can't be done statically.
upgrades.add(WizardryItems.arcane_tome); upgrades.add(WizardryItems.arcane_tome);
upgrades.add(WizardryItems.armour_upgrade); upgrades.add(WizardryItems.resplendent_thread);
upgrades.add(WizardryItems.crystal_silver_plating);
upgrades.add(WizardryItems.ethereal_crystalweave);
this.addSlotToContainer(new SlotItemList(tileentity, UPGRADE_SLOT, 147, 17, 1, upgrades.toArray(new Item[0]))) this.addSlotToContainer(new SlotItemList(tileentity, UPGRADE_SLOT, 147, 17, 1, upgrades.toArray(new Item[0])))
.setBackgroundName(EMPTY_SLOT_UPGRADE.toString()); .setBackgroundName(EMPTY_SLOT_UPGRADE.toString());
@@ -133,7 +133,6 @@ public class ContainerBookshelf extends Container {
registerBookItem(WizardryItems.scroll); registerBookItem(WizardryItems.scroll);
registerBookItem(WizardryItems.blank_scroll); registerBookItem(WizardryItems.blank_scroll);
registerBookItem(WizardryItems.identification_scroll); registerBookItem(WizardryItems.identification_scroll);
registerBookItem(WizardryItems.armour_upgrade);
// Not using the map in WandHelper for consistency with BlockBookshelf (again, addons must add theirs manually) // Not using the map in WandHelper for consistency with BlockBookshelf (again, addons must add theirs manually)
registerBookItem(WizardryItems.storage_upgrade); registerBookItem(WizardryItems.storage_upgrade);
registerBookItem(WizardryItems.siphon_upgrade); registerBookItem(WizardryItems.siphon_upgrade);
@@ -34,7 +34,7 @@ public class ItemArmourUpgrade extends Item {
@Override @Override
@SideOnly(Side.CLIENT) @SideOnly(Side.CLIENT)
public void addInformation(ItemStack stack, @Nullable World worldIn, List<String> tooltip, net.minecraft.client.util.ITooltipFlag flagIn) { public void addInformation(ItemStack stack, @Nullable World worldIn, List<String> tooltip, net.minecraft.client.util.ITooltipFlag flagIn) {
Wizardry.proxy.addMultiLineDescription(tooltip, "item." + this.getRegistryName() + ".desc", "\u00A7d"); Wizardry.proxy.addMultiLineDescription(tooltip, "item." + this.getRegistryName() + ".desc");
} }
} }
@@ -5,14 +5,19 @@ import electroblob.wizardry.registry.WizardrySounds;
import electroblob.wizardry.registry.WizardryTabs; import electroblob.wizardry.registry.WizardryTabs;
import electroblob.wizardry.util.EntityUtils; import electroblob.wizardry.util.EntityUtils;
import electroblob.wizardry.util.InventoryUtils; import electroblob.wizardry.util.InventoryUtils;
import electroblob.wizardry.util.ParticleBuilder;
import electroblob.wizardry.util.ParticleBuilder.Type;
import net.minecraft.client.util.ITooltipFlag; import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.EnumAction;
import net.minecraft.item.EnumRarity; import net.minecraft.item.EnumRarity;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.ActionResult; import net.minecraft.util.ActionResult;
import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumHand; import net.minecraft.util.EnumHand;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
@@ -25,15 +30,17 @@ public class ItemManaFlask extends Item {
public enum Size { public enum Size {
SMALL(75, EnumRarity.COMMON), SMALL(75, 25, EnumRarity.COMMON),
MEDIUM(700, EnumRarity.COMMON), MEDIUM(350, 40, EnumRarity.COMMON),
LARGE(1400, EnumRarity.RARE); LARGE(1400, 60, EnumRarity.RARE);
public int capacity; public int capacity;
public int useDuration;
public EnumRarity rarity; public EnumRarity rarity;
Size(int capacity, EnumRarity rarity){ Size(int capacity, int useDuration, EnumRarity rarity){
this.capacity = capacity; this.capacity = capacity;
this.useDuration = useDuration;
this.rarity = rarity; this.rarity = rarity;
} }
} }
@@ -58,6 +65,16 @@ public class ItemManaFlask extends Item {
Wizardry.proxy.addMultiLineDescription(tooltip, "item." + Wizardry.MODID + ":mana_flask.desc", size.capacity); Wizardry.proxy.addMultiLineDescription(tooltip, "item." + Wizardry.MODID + ":mana_flask.desc", size.capacity);
} }
@Override
public EnumAction getItemUseAction(ItemStack stack){
return EnumAction.BLOCK;
}
@Override
public int getMaxItemUseDuration(ItemStack stack){
return size.useDuration;
}
@Override @Override
public ActionResult<ItemStack> onItemRightClick(World world, EntityPlayer player, EnumHand hand){ public ActionResult<ItemStack> onItemRightClick(World world, EntityPlayer player, EnumHand hand){
@@ -66,25 +83,53 @@ public class ItemManaFlask extends Item {
List<ItemStack> stacks = InventoryUtils.getPrioritisedHotbarAndOffhand(player); List<ItemStack> stacks = InventoryUtils.getPrioritisedHotbarAndOffhand(player);
stacks.addAll(player.inventory.armorInventory); // player#getArmorInventoryList() only returns an Iterable stacks.addAll(player.inventory.armorInventory); // player#getArmorInventoryList() only returns an Iterable
// Find the chargeable item with the least mana if(stacks.stream().anyMatch(s -> s.getItem() instanceof IManaStoringItem && !((IManaStoringItem)s.getItem()).isManaFull(s))){
ItemStack toCharge = stacks.stream() player.setActiveHand(hand);
.filter(s -> s.getItem() instanceof IManaStoringItem && !((IManaStoringItem)s.getItem()).isManaFull(s))
.min(Comparator.comparingDouble(s -> ((IManaStoringItem)s.getItem()).getFullness(s))).orElse(null);
if(toCharge != null){
((IManaStoringItem)toCharge.getItem()).rechargeMana(toCharge, size.capacity);
EntityUtils.playSoundAtPlayer(player, WizardrySounds.ITEM_MANA_FLASK_USE, 1, 1);
EntityUtils.playSoundAtPlayer(player, WizardrySounds.ITEM_MANA_FLASK_RECHARGE, 0.7f, 1.1f);
if(!player.isCreative()) flask.shrink(1);
player.getCooldownTracker().setCooldown(this, 20);
return new ActionResult<>(EnumActionResult.SUCCESS, flask); return new ActionResult<>(EnumActionResult.SUCCESS, flask);
}else{ }else{
return new ActionResult<>(EnumActionResult.FAIL, flask); return new ActionResult<>(EnumActionResult.FAIL, flask);
} }
} }
@Override
public void onUsingTick(ItemStack stack, EntityLivingBase player, int count){
if(player.world.isRemote){
float f = count/(float)getMaxItemUseDuration(stack);
Vec3d pos = player.getPositionEyes(0).subtract(0, 0.2, 0).add(player.getLookVec().scale(0.6));
Vec3d delta = new Vec3d(0, 0.2 * f, 0).rotatePitch(count * 0.5f).rotateYaw((float)Math.toRadians(90 - player.rotationYawHead));
ParticleBuilder.create(Type.DUST).pos(pos.add(delta)).vel(delta.scale(0.2)).time(12 + player.world.rand.nextInt(6))
.clr(1, 1, 0.65f).fade(0.7f, 0, 1).spawn(player.world);
}
}
@Override
public ItemStack onItemUseFinish(ItemStack stack, World world, EntityLivingBase entity){
if(entity instanceof EntityPlayer){
EntityPlayer player = (EntityPlayer)entity;
List<ItemStack> stacks = InventoryUtils.getPrioritisedHotbarAndOffhand(player);
stacks.addAll(player.inventory.armorInventory); // player#getArmorInventoryList() only returns an Iterable
// Find the chargeable item with the least mana
ItemStack toCharge = stacks.stream()
.filter(s -> s.getItem() instanceof IManaStoringItem && !((IManaStoringItem)s.getItem()).isManaFull(s))
.min(Comparator.comparingDouble(s -> ((IManaStoringItem)s.getItem()).getFullness(s))).orElse(null);
if(toCharge != null){
((IManaStoringItem)toCharge.getItem()).rechargeMana(toCharge, size.capacity);
EntityUtils.playSoundAtPlayer(player, WizardrySounds.ITEM_MANA_FLASK_USE, 1, 1);
EntityUtils.playSoundAtPlayer(player, WizardrySounds.ITEM_MANA_FLASK_RECHARGE, 0.7f, 1.1f);
if(!player.isCreative()) stack.shrink(1);
player.getCooldownTracker().setCooldown(this, 20);
}
}
return stack;
}
} }
@@ -101,7 +101,7 @@ public class ItemWand extends Item implements IWorkbenchItem, ISpellCastingItem,
|| s.getItemUseAction() == SpellActions.GRAPPLE || s.getItemUseAction() == SpellActions.GRAPPLE
|| s.getItemUseAction() == SpellActions.SUMMON) ? 1 : 0); || s.getItemUseAction() == SpellActions.SUMMON) ? 1 : 0);
} }
@Override @Override
public Spell getCurrentSpell(ItemStack stack){ public Spell getCurrentSpell(ItemStack stack){
return WandHelper.getCurrentSpell(stack); return WandHelper.getCurrentSpell(stack);
@@ -709,7 +709,7 @@ public class ItemWand extends Item implements IWorkbenchItem, ISpellCastingItem,
if(player != null) WizardData.get(player).setTierReached(tier); if(player != null) WizardData.get(player).setTierReached(tier);
ItemStack newWand = new ItemStack(WizardryItems.getWand(tier, this.element)); ItemStack newWand = new ItemStack(getWand(tier, this.element));
newWand.setTagCompound(wand.getTagCompound()); newWand.setTagCompound(wand.getTagCompound());
// This needs to be done after copying the tag compound so the mana capacity for the new wand // This needs to be done after copying the tag compound so the mana capacity for the new wand
// takes storage upgrades into account // takes storage upgrades into account
@@ -783,6 +783,30 @@ public class ItemWand extends Item implements IWorkbenchItem, ISpellCastingItem,
return wand; return wand;
} }
/**
* Helper method to return the appropriate wand based on tier and element. This replaces the cumbersome wand map in
* {@link WizardryItems} by accessing the item registry dynamically by generating the registry name on the fly.
* <p></p>
* <i><b>This method will only return wands from the base mod.</b> It is unlikely that addons will need it, but it
* has been left public just in case. The intention is that this method is only used where there is no alternative.</i>
*
* @param tier The tier of the wand required.
* @param element The element of the wand required. Null will be converted to {@link Element#MAGIC}.
* @return The wand item which corresponds to the given tier and element, or null if no such item exists.
* @throws NullPointerException if the given tier is null.
*/
// As noted above, in a few SPECIFIC cases this method is necessary (without using a data-driven system, at least,
// which I'm not going to spend the time making in the near future). Wizard trades and gear have been left using the
// WizardryItems version because they need to be replaced with a better system that doesn't use this at all.
public static Item getWand(Tier tier, Element element){
if(tier == null) throw new NullPointerException("The given tier cannot be null.");
if(element == null) element = Element.MAGIC;
String registryName = tier == Tier.NOVICE && element == Element.MAGIC ? "magic" : tier.getUnlocalisedName();
if(element != Element.MAGIC) registryName = registryName + "_" + element.getName();
registryName = registryName + "_wand";
return Item.REGISTRY.getObject(new ResourceLocation(Wizardry.MODID, registryName));
}
@Override @Override
public boolean onApplyButtonPressed(EntityPlayer player, Slot centre, Slot crystals, Slot upgrade, Slot[] spellBooks){ public boolean onApplyButtonPressed(EntityPlayer player, Slot centre, Slot crystals, Slot upgrade, Slot[] spellBooks){
@@ -791,7 +815,7 @@ public class ItemWand extends Item implements IWorkbenchItem, ISpellCastingItem,
if(upgrade.getHasStack()){ if(upgrade.getHasStack()){
ItemStack original = centre.getStack().copy(); ItemStack original = centre.getStack().copy();
centre.putStack(this.applyUpgrade(player, centre.getStack(), upgrade.getStack())); centre.putStack(this.applyUpgrade(player, centre.getStack(), upgrade.getStack()));
changed = ItemStack.areItemStacksEqual(centre.getStack(), original); changed = !ItemStack.areItemStacksEqual(centre.getStack(), original);
} }
// Reads NBT spell metadata array to variable, edits this, then writes it back to NBT. // Reads NBT spell metadata array to variable, edits this, then writes it back to NBT.
@@ -1,17 +1,18 @@
package electroblob.wizardry.item; package electroblob.wizardry.item;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import com.google.common.collect.Streams; import com.google.common.collect.Streams;
import electroblob.wizardry.Wizardry; import electroblob.wizardry.Wizardry;
import electroblob.wizardry.client.DrawingUtils; import electroblob.wizardry.client.DrawingUtils;
import electroblob.wizardry.constants.Constants; import electroblob.wizardry.constants.Constants;
import electroblob.wizardry.constants.Element; import electroblob.wizardry.constants.Element;
import electroblob.wizardry.event.SpellCastEvent; import electroblob.wizardry.event.SpellCastEvent;
import electroblob.wizardry.registry.WizardryAdvancementTriggers;
import electroblob.wizardry.registry.WizardryItems; import electroblob.wizardry.registry.WizardryItems;
import electroblob.wizardry.registry.WizardryItems.Materials;
import electroblob.wizardry.registry.WizardryPotions;
import electroblob.wizardry.registry.WizardryRecipes; import electroblob.wizardry.registry.WizardryRecipes;
import electroblob.wizardry.registry.WizardryTabs; import electroblob.wizardry.registry.WizardryTabs;
import electroblob.wizardry.spell.Spell;
import electroblob.wizardry.util.EntityUtils.Operations;
import electroblob.wizardry.util.InventoryUtils; import electroblob.wizardry.util.InventoryUtils;
import electroblob.wizardry.util.SpellModifiers; import electroblob.wizardry.util.SpellModifiers;
import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.Enchantment;
@@ -24,13 +25,17 @@ import net.minecraft.entity.ai.attributes.AttributeModifier;
import net.minecraft.entity.ai.attributes.IAttributeInstance; import net.minecraft.entity.ai.attributes.IAttributeInstance;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.inventory.EntityEquipmentSlot.Type;
import net.minecraft.inventory.Slot; import net.minecraft.inventory.Slot;
import net.minecraft.item.Item;
import net.minecraft.item.ItemArmor; import net.minecraft.item.ItemArmor;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.PotionEffect;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.text.Style; import net.minecraft.util.text.Style;
import net.minecraft.util.text.TextFormatting; import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.event.entity.living.LivingEquipmentChangeEvent;
import net.minecraftforge.event.entity.living.LivingSetAttackTargetEvent; import net.minecraftforge.event.entity.living.LivingSetAttackTargetEvent;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.EventPriority;
@@ -39,22 +44,69 @@ import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.Arrays; import java.util.*;
import java.util.List; import java.util.function.Supplier;
import java.util.UUID;
@Mod.EventBusSubscriber @Mod.EventBusSubscriber
public class ItemWizardArmour extends ItemArmor implements IWorkbenchItem, IManaStoringItem { public class ItemWizardArmour extends ItemArmor implements IWorkbenchItem, IManaStoringItem {
// VanillaCopy, ItemArmor has this set to private for some reason. // Full set bonuses
public static final UUID[] ARMOR_MODIFIERS = new UUID[] {UUID.fromString("845DB27C-C624-495F-8C9F-6020A9A58B6B"), UUID.fromString("D8499B04-0E66-4726-AB29-64469D734E0D"), UUID.fromString("9F3D476D-C118-4544-8365-64846904B48E"), UUID.fromString("2AD3F246-FEE1-4E67-B886-69FD380BB150")}; private static final float SAGE_OTHER_COST_REDUCTION = 0.2f;
// Damage reduction values that used to be in WizardryItems.SILK [feet, legs, chest, head] private static final float WARLOCK_SPEED_BOOST = 0.2f;
private static int[] reductions = new int[]{2, 4, 5, 2}; private static final UUID WARLOCK_SPEED_BOOST_UUID = UUID.fromString("4bad7152-2663-4b1b-bb59-552e92847031");
public Element element;
public enum ArmourClass {
WIZARD(Materials.SILK, () -> null, "wizard", 0.1f, 0, "hat", "robe", "leggings", "boots"),
SAGE(Materials.SAGE, () -> WizardryItems.resplendent_thread, "sage", 0.2f, 0, "hat", "robe", "leggings", "boots"),
BATTLEMAGE(Materials.BATTLEMAGE, () -> WizardryItems.crystal_silver_plating, "battlemage", 0.05f, 0.15f, "helmet", "chestplate", "leggings", "boots"),
WARLOCK(Materials.WARLOCK, () -> WizardryItems.ethereal_crystalweave, "warlock", 0.1f, 0.3f, "hood", "robe", "leggings", "boots");
/** The armour material to use for this armour class. */
final ArmorMaterial material;
/** The item that upgrades regular wizard armour into this class of armour. */
final Supplier<Item> upgradeItem;
/** The fraction by which spell cost is reduced for each armour piece of this class with the matching element. */
final float elementalCostReduction;
/** The fraction by which spell cooldown is reduced for each armour piece of this class. */
final float cooldownReduction;
/** The first part of the texture filenames for this armour class. Also defines certain translation keys. */
final String name;
/** The middle part of each item name (in the registry) for this armour class, e.g. "hat" or "chestplate". */
final Map<EntityEquipmentSlot, String> armourPieceNames;
ArmourClass(ArmorMaterial material, Supplier<Item> upgradeItem, String name, float elementalCostReduction,
float cooldownReduction, String... armourPieceNames){
this.material = material;
this.upgradeItem = upgradeItem;
this.name = name;
this.elementalCostReduction = elementalCostReduction;
this.cooldownReduction = cooldownReduction;
if(armourPieceNames.length != 4) throw new IllegalArgumentException("armourPieceNames must have a length of 4");
this.armourPieceNames = new EnumMap<>(EntityEquipmentSlot.class);
this.armourPieceNames.put(EntityEquipmentSlot.HEAD, armourPieceNames[0]);
this.armourPieceNames.put(EntityEquipmentSlot.CHEST, armourPieceNames[1]);
this.armourPieceNames.put(EntityEquipmentSlot.LEGS, armourPieceNames[2]);
this.armourPieceNames.put(EntityEquipmentSlot.FEET, armourPieceNames[3]);
}
}
public Element element; // Should be final, but isn't for backwards compatibility
public final ArmourClass armourClass;
@Deprecated // Retained for backwards-compatibility with addons, will be removed in future
public ItemWizardArmour(ArmorMaterial material, int renderIndex, EntityEquipmentSlot armourType, Element element){ public ItemWizardArmour(ArmorMaterial material, int renderIndex, EntityEquipmentSlot armourType, Element element){
super(material, renderIndex, armourType); super(material, renderIndex, armourType);
this.armourClass = ArmourClass.WIZARD;
this.element = element;
setCreativeTab(WizardryTabs.GEAR);
WizardryRecipes.addToManaFlaskCharging(this);
}
public ItemWizardArmour(ArmourClass armourClass, EntityEquipmentSlot armourType, Element element){
super(armourClass.material, 1, armourType);
this.armourClass = armourClass;
this.element = element; this.element = element;
setCreativeTab(WizardryTabs.GEAR); setCreativeTab(WizardryTabs.GEAR);
WizardryRecipes.addToManaFlaskCharging(this); WizardryRecipes.addToManaFlaskCharging(this);
@@ -94,15 +146,75 @@ public class ItemWizardArmour extends ItemArmor implements IWorkbenchItem, IMana
@SideOnly(Side.CLIENT) @SideOnly(Side.CLIENT)
public void addInformation(ItemStack stack, World world, List<String> tooltip, net.minecraft.client.util.ITooltipFlag advanced){ public void addInformation(ItemStack stack, World world, List<String> tooltip, net.minecraft.client.util.ITooltipFlag advanced){
if(stack.hasTagCompound() && stack.getTagCompound().getBoolean("legendary"))
tooltip.add(Wizardry.proxy.translate("item." + Wizardry.MODID + ":wizard_armour.legendary",
new Style().setColor(TextFormatting.LIGHT_PURPLE)));
if(element != null){ if(element != null){
tooltip.add(Wizardry.proxy.translate("item." + Wizardry.MODID + ":wizard_armour.buff", tooltip.add(Wizardry.proxy.translate("item." + Wizardry.MODID + ":wizard_armour.element_cost_reduction",
new Style().setColor(TextFormatting.DARK_GRAY), new Style().setColor(TextFormatting.DARK_GRAY),
(int)(Constants.COST_REDUCTION_PER_ARMOUR * 100), element.getDisplayName())); (int)(armourClass.elementalCostReduction * 100), element.getDisplayName()));
} }
if(armourClass == ArmourClass.SAGE){
tooltip.add(Wizardry.proxy.translate("item." + Wizardry.MODID + ":wizard_armour.enchantability",
new Style().setColor(TextFormatting.BLUE)));
}
if(armourClass.cooldownReduction > 0){
tooltip.add(Wizardry.proxy.translate("item." + Wizardry.MODID + ":wizard_armour.cooldown_reduction",
new Style().setColor(TextFormatting.DARK_GRAY), (int)(armourClass.cooldownReduction * 100)));
}
if(armourClass != ArmourClass.WIZARD){
tooltip.add(Wizardry.proxy.translate("item." + Wizardry.MODID + ":wizard_armour.full_set",
new Style().setColor(TextFormatting.AQUA)));
Object args = new Object[0];
if(armourClass == ArmourClass.SAGE) args = (int)(SAGE_OTHER_COST_REDUCTION * 100);
if(armourClass == ArmourClass.WARLOCK) args = (int)(WARLOCK_SPEED_BOOST * 100);
tooltip.add(Wizardry.proxy.translate("item." + Wizardry.MODID + ":" + armourClass.name
+ "_armour.full_set_bonus", new Style().setColor(TextFormatting.AQUA), args));
}
}
@Override
public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack){
if(armorType == EntityEquipmentSlot.HEAD && isWearingFullSet(player, element, ArmourClass.BATTLEMAGE)
&& player.ticksExisted % 20 == 0){
player.addPotionEffect(new PotionEffect(WizardryPotions.ward, 219, 0, true, false));
}
}
/**
* Allows this armour piece to change the modifiers for spells cast while wearing it. This is called once for
* <b>each piece of wizard armour</b> the caster is wearing. This means if you need to apply a full set bonus, you
* should have only one of the pieces handle it (by convention, this is usually the helmet, but it doesn't matter).
* <p></p>
* <i>N.B. The modifiers object passed into this method is not the actual one from the spell cast event. It is a
* blank one local to armour that then gets combined with the actual one via
* {@link SpellModifiers#combine(SpellModifiers)} after all four pieces have been processed. This is important as it
* allows armour modifiers to stack linearly. This means the values should be <b>added/subtracted rather than multiplied.</b></i>
* @param caster The entity casting the spell and wearing the armour.
* @param spell The spell being cast.
* @param modifiers The modifiers specific to armour to apply to the global ones after all four slots are processed.
*/
protected void applySpellModifiers(EntityLivingBase caster, Spell spell, SpellModifiers modifiers){
if(spell.getElement() == this.element){
modifiers.set(SpellModifiers.COST, modifiers.get(SpellModifiers.COST) - armourClass.elementalCostReduction, false);
}
modifiers.set(WizardryItems.cooldown_upgrade, modifiers.get(WizardryItems.cooldown_upgrade) - armourClass.cooldownReduction, true);
// Full set bonuses
if(this.armorType == EntityEquipmentSlot.HEAD && isWearingFullSet(caster, element, armourClass)){
if(armourClass == ArmourClass.SAGE && spell.getElement() != this.element){
modifiers.set(SpellModifiers.COST, 1 - SAGE_OTHER_COST_REDUCTION, false);
}
}
} }
@Override @Override
@@ -118,25 +230,18 @@ public class ItemWizardArmour extends ItemArmor implements IWorkbenchItem, IMana
// Legs use modelBiped // Legs use modelBiped
if(armourSlot == EntityEquipmentSlot.LEGS && !entityLiving.isInvisible()) return null; if(armourSlot == EntityEquipmentSlot.LEGS && !entityLiving.isInvisible()) return null;
return Wizardry.proxy.getWizardArmourModel(); return Wizardry.proxy.getWizardArmourModel(getArmorMaterial());
} }
@Override @Override
public String getArmorTexture(ItemStack stack, Entity entity, EntityEquipmentSlot slot, String type){ public String getArmorTexture(ItemStack stack, Entity entity, EntityEquipmentSlot slot, String type){
// Returns a completely transparent texture if the player is invisible. This is such an annoyingly easy String s = armourClass.name + "_armour";
// fix, considering how long I spent trying to do this before - a bit of lateral thinking was all it took.
// Do note however that a texture pack could override this.
// if(entity instanceof EntityLivingBase && entity.isInvisible() && !entity.getEntityData().getBoolean(BlockStatue.PETRIFIED_NBT_KEY))
// return "ebwizardry:textures/armour/invisible_armour.png";
String s = "wizard_armour"; if(Wizardry.tisTheSeason && armourClass == ArmourClass.WIZARD){
if(Wizardry.tisTheSeason){
s = s + "_festive"; s = s + "_festive";
}else{ }else{
if(this.element != null) s = s + "_" + this.element.getName(); if(this.element != null) s = s + "_" + this.element.getName();
if(stack.hasTagCompound() && stack.getTagCompound().getBoolean("legendary")) s = "legendary_" + s;
} }
if(slot == EntityEquipmentSlot.LEGS) s = s + "_legs"; if(slot == EntityEquipmentSlot.LEGS) s = s + "_legs";
@@ -155,34 +260,6 @@ public class ItemWizardArmour extends ItemArmor implements IWorkbenchItem, IMana
return !(enchantment instanceof EnchantmentMending) && super.canApplyAtEnchantingTable(stack, enchantment); return !(enchantment instanceof EnchantmentMending) && super.canApplyAtEnchantingTable(stack, enchantment);
} }
/**
* Properly handles the defence value of the armour. This method is responsible for the tooltip on top of
* the armour value. It is also what handles armour toughness.
*/
@Override
public Multimap<String, AttributeModifier> getAttributeModifiers(EntityEquipmentSlot slot, ItemStack stack){
Multimap<String, AttributeModifier> map = HashMultimap.create();
if(!this.isManaEmpty(stack) && this.armorType == slot){
int defense = reductions[slot.getIndex()];
float toughness = 0f;
if(stack.hasTagCompound() && stack.getTagCompound().getBoolean("legendary")) {
defense = ArmorMaterial.DIAMOND.getDamageReductionAmount(slot);
toughness = ArmorMaterial.DIAMOND.getToughness();
}
map.put(SharedMonsterAttributes.ARMOR.getName(), new AttributeModifier(ARMOR_MODIFIERS[slot.getIndex()],
"Armor modifier", defense, 0));
map.put(SharedMonsterAttributes.ARMOR.getName(), new AttributeModifier(ARMOR_MODIFIERS[slot.getIndex()],
"Armor toughness", toughness, 0));
}
return map;
}
// Workbench stuff // Workbench stuff
@Override @Override
@@ -196,17 +273,17 @@ public class ItemWizardArmour extends ItemArmor implements IWorkbenchItem, IMana
@Override @Override
public ItemStack applyUpgrade(@Nullable EntityPlayer player, ItemStack stack, ItemStack upgrade){ public ItemStack applyUpgrade(@Nullable EntityPlayer player, ItemStack stack, ItemStack upgrade){
// Applies legendary upgrade // Apply class upgrades
if(upgrade.getItem() == WizardryItems.armour_upgrade){ if(this.armourClass == ArmourClass.WIZARD){
for(ArmourClass armourClass : ArmourClass.values()){
if(!stack.hasTagCompound()){ if(upgrade.getItem() == armourClass.upgradeItem.get()){
stack.setTagCompound(new NBTTagCompound()); Item newArmour = getArmour(this.element, armourClass, this.getEquipmentSlot());
} ItemStack newStack = new ItemStack(newArmour);
((ItemWizardArmour)newArmour).setMana(newStack, this.getMana(stack));
if(!stack.getTagCompound().hasKey("legendary")){ newStack.setTagCompound(stack.getTagCompound());
stack.getTagCompound().setBoolean("legendary", true); upgrade.shrink(1);
upgrade.shrink(1); return newStack;
if(player != null) WizardryAdvancementTriggers.legendary.triggerFor(player); }
} }
} }
@@ -221,7 +298,7 @@ public class ItemWizardArmour extends ItemArmor implements IWorkbenchItem, IMana
if(upgrade.getHasStack()){ if(upgrade.getHasStack()){
ItemStack original = centre.getStack().copy(); ItemStack original = centre.getStack().copy();
centre.putStack(this.applyUpgrade(player, centre.getStack(), upgrade.getStack())); centre.putStack(this.applyUpgrade(player, centre.getStack(), upgrade.getStack()));
changed = ItemStack.areItemStacksEqual(centre.getStack(), original); changed = !ItemStack.areItemStacksEqual(centre.getStack(), original);
} }
// Charges armour by appropriate amount // Charges armour by appropriate amount
@@ -252,34 +329,43 @@ public class ItemWizardArmour extends ItemArmor implements IWorkbenchItem, IMana
// Event Handlers // Event Handlers
// @SubscribeEvent // Can't use Item#getItemAttributeModifiers because it's not player-sensitive, grrr
// public static void onLivingUpdateEvent(LivingUpdateEvent event){ @SubscribeEvent
// public static void onLivingEquipmentChangeEvent(LivingEquipmentChangeEvent event){
// if(event.getEntityLiving() instanceof EntityPlayer){
// IAttributeInstance movementSpeed = event.getEntityLiving().getAttributeMap().getAttributeInstance(SharedMonsterAttributes.MOVEMENT_SPEED);
// EntityPlayer player = (EntityPlayer)event.getEntityLiving();
// if(isWearingFullSet(event.getEntityLiving(), null, ArmourClass.WARLOCK)){
// for(ItemStack stack : player.getArmorInventoryList()){ // Only apply the modifier once (can't just check this is the helmet since it might not be the last piece equipped)
// if(!(stack.getItem() instanceof ItemWizardArmour)){ if(movementSpeed.getModifier(WARLOCK_SPEED_BOOST_UUID) == null){
// return; // If any of the armour slots doesn't contain wizard armour, don't trigger the achievement. movementSpeed.applyModifier(new AttributeModifier(WARLOCK_SPEED_BOOST_UUID, "Warlock set bonus", WARLOCK_SPEED_BOOST, Operations.MULTIPLY_FLAT));
// } }
// } }else{
// // If it gets this far, then all slots must be wizard armour, so trigger the achievement. movementSpeed.removeModifier(WARLOCK_SPEED_BOOST_UUID);
// WizardryAdvancementTriggers.armour_set.triggerFor(player); }
// } }
// }
@SubscribeEvent(priority = EventPriority.LOW) @SubscribeEvent(priority = EventPriority.LOW)
public static void onSpellCastPreEvent(SpellCastEvent.Pre event){ public static void onSpellCastPreEvent(SpellCastEvent.Pre event){
// Armour cost reduction // Armour cost reduction
if(event.getCaster() == null) return; if(event.getCaster() == null) return;
int armourPieces = getMatchingArmourCount(event.getCaster(), event.getSpell().getElement());
float multiplier = 1f - armourPieces * Constants.COST_REDUCTION_PER_ARMOUR; final SpellModifiers armourModifiers = new SpellModifiers();
if(armourPieces == InventoryUtils.ARMOUR_SLOTS.length) multiplier -= Constants.FULL_ARMOUR_SET_BONUS;
event.getModifiers().set(SpellModifiers.COST, event.getModifiers().get(SpellModifiers.COST) * multiplier, false); Arrays.stream(InventoryUtils.ARMOUR_SLOTS).map(s -> event.getCaster().getItemStackFromSlot(s).getItem())
.filter(i -> i instanceof ItemWizardArmour)
.forEach(i -> ((ItemWizardArmour)i).applySpellModifiers(event.getCaster(), event.getSpell(), armourModifiers));
event.getModifiers().combine(armourModifiers);
} }
/** Counts the number of armour pieces the given entity is wearing that match the given element. */ /**
* Counts the number of armour pieces the given entity is wearing that match the given element.
* @deprecated in favour of {@link ItemWizardArmour#applySpellModifiers(EntityLivingBase, Spell, SpellModifiers)}
* and {@link ItemWizardArmour#isWearingFullSet(EntityLivingBase, Element, ArmourClass)}. Retained for API stability
* between minor versions, will be removed in future.
*/
@Deprecated
public static int getMatchingArmourCount(EntityLivingBase entity, Element element){ public static int getMatchingArmourCount(EntityLivingBase entity, Element element){
return (int)Arrays.stream(InventoryUtils.ARMOUR_SLOTS) return (int)Arrays.stream(InventoryUtils.ARMOUR_SLOTS)
.map(s -> entity.getItemStackFromSlot(s).getItem()) .map(s -> entity.getItemStackFromSlot(s).getItem())
@@ -287,6 +373,49 @@ public class ItemWizardArmour extends ItemArmor implements IWorkbenchItem, IMana
.count(); .count();
} }
/**
* Helper method to return the appropriate wand based on tier and element. This replaces the cumbersome wand map in
* {@link WizardryItems} by accessing the item registry dynamically by generating the registry name on the fly.
* <p></p>
* <i><b>This method will only return armour from the base mod.</b> It is unlikely that addons will need it, but it
* has been left public just in case. The intention is that this method is only used where there is no alternative.</i>
*
* @param element The element of the wand required. Null will be converted to {@link Element#MAGIC}.
* @param armourClass The {@link ArmourClass} required
* @param slot EntityEquipmentSlot of the armour piece required
* @return The wand item which corresponds to the given tier and element, or null if no such item exists.
* @throws NullPointerException if the given tier is null.
*/
// As noted above, in a few SPECIFIC cases this method is necessary (without using a data-driven system, at least,
// which I'm not going to spend the time making in the near future). Wizard trades and gear have been left using the
// WizardryItems version because they need to be replaced with a better system that doesn't use this at all.
public static Item getArmour(Element element, ArmourClass armourClass, EntityEquipmentSlot slot){
if(slot == null || slot.getSlotType() != Type.ARMOR)
throw new IllegalArgumentException("Must be a valid armour slot");
if(element == null) element = Element.MAGIC;
String registryName = armourClass.name + "_" + armourClass.armourPieceNames.get(slot);
if(element != Element.MAGIC) registryName = registryName + "_" + element.getName();
return Item.REGISTRY.getObject(new ResourceLocation(Wizardry.MODID, registryName));
}
/**
* Returns whether the given entity is wearing a full set of wizard armour of the given class and element.
* @param entity The entity to query.
* @param element The element to check, or null to accept any element as long as they are all the same.
* @param armourClass The class to check, or null to accept any class as long as they are all the same.
* @return True if the entity is wearing a full set of the given element and class, false otherwise.
*/
private static boolean isWearingFullSet(EntityLivingBase entity, @Nullable Element element, @Nullable ArmourClass armourClass){
ItemStack helmet = entity.getItemStackFromSlot(EntityEquipmentSlot.HEAD);
if(!(helmet.getItem() instanceof ItemWizardArmour)) return false;
Element e = element == null ? ((ItemWizardArmour)helmet.getItem()).element : element;
ArmourClass ac = armourClass == null ? ((ItemWizardArmour)helmet.getItem()).armourClass : armourClass;
return Arrays.stream(InventoryUtils.ARMOUR_SLOTS)
.allMatch(s -> entity.getItemStackFromSlot(s).getItem() instanceof ItemWizardArmour
&& ((ItemWizardArmour)entity.getItemStackFromSlot(s).getItem()).element == e
&& ((ItemWizardArmour)entity.getItemStackFromSlot(s).getItem()).armourClass == ac);
}
@SubscribeEvent @SubscribeEvent
public static void onLivingSetAttackTargetEvent(LivingSetAttackTargetEvent event){ public static void onLivingSetAttackTargetEvent(LivingSetAttackTargetEvent event){
// Undo the mob detection penalty for wearing armour when invisible // Undo the mob detection penalty for wearing armour when invisible
@@ -306,7 +435,7 @@ public class ItemWizardArmour extends ItemArmor implements IWorkbenchItem, IMana
if(event.getTarget().isSneaking()) followRange *= 0.8; if(event.getTarget().isSneaking()) followRange *= 0.8;
float f = (float)armourPieces / ((EntityPlayer)event.getTarget()).inventory.armorInventory.size(); float f = (float)armourPieces / ((EntityPlayer)event.getTarget()).inventory.armorInventory.size();
if(f < 0.1F) f = 0.1F; if(f < 0.1F) f = 0.1F;
followRange *= (double)(0.7F * f); followRange *= 0.7F * f;
// Don't need to worry about the isSuitableTarget check since it must already have been checked to get this far // Don't need to worry about the isSuitableTarget check since it must already have been checked to get this far
if(event.getTarget().getDistance(event.getEntity()) > followRange) ((EntityLiving)event.getEntityLiving()).setAttackTarget(null); if(event.getTarget().getDistance(event.getEntity()) > followRange) ((EntityLiving)event.getEntityLiving()).setAttackTarget(null);
} }
@@ -15,8 +15,10 @@ import electroblob.wizardry.event.SpellCastEvent;
import electroblob.wizardry.item.ItemArtefact; import electroblob.wizardry.item.ItemArtefact;
import electroblob.wizardry.registry.*; import electroblob.wizardry.registry.*;
import electroblob.wizardry.spell.Banish; import electroblob.wizardry.spell.Banish;
import electroblob.wizardry.spell.Spell;
import electroblob.wizardry.util.BlockUtils; import electroblob.wizardry.util.BlockUtils;
import electroblob.wizardry.util.EntityUtils; import electroblob.wizardry.util.EntityUtils;
import electroblob.wizardry.util.SpellProperties.Context;
import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.effect.EntityLightningBolt;
import net.minecraft.entity.item.EntityFallingBlock; import net.minecraft.entity.item.EntityFallingBlock;
import net.minecraft.entity.passive.EntitySquid; import net.minecraft.entity.passive.EntitySquid;
@@ -296,6 +298,7 @@ public abstract class Forfeit {
})); }));
add(Tier.APPRENTICE, Element.LIGHTNING, create("storm", (w, p) -> { add(Tier.APPRENTICE, Element.LIGHTNING, create("storm", (w, p) -> {
if(!Spells.invoke_weather.isEnabled(Context.WANDS)) return;
int standardWeatherTime = (300 + (new Random()).nextInt(600)) * 20; int standardWeatherTime = (300 + (new Random()).nextInt(600)) * 20;
w.getWorldInfo().setRaining(true); w.getWorldInfo().setRaining(true);
w.getWorldInfo().setRainTime(standardWeatherTime); w.getWorldInfo().setRainTime(standardWeatherTime);
@@ -17,7 +17,6 @@ public final class WizardryAdvancementTriggers {
private WizardryAdvancementTriggers(){} // No instances! private WizardryAdvancementTriggers(){} // No instances!
public static final CustomAdvancementTrigger legendary = new CustomAdvancementTrigger("trigger_legendary");
public static final CustomAdvancementTrigger max_out_wand = new CustomAdvancementTrigger("trigger_max_out_wand"); public static final CustomAdvancementTrigger max_out_wand = new CustomAdvancementTrigger("trigger_max_out_wand");
public static final CustomAdvancementTrigger special_upgrade = new CustomAdvancementTrigger("trigger_special_upgrade"); public static final CustomAdvancementTrigger special_upgrade = new CustomAdvancementTrigger("trigger_special_upgrade");
public static final CustomAdvancementTrigger anger_wizard = new CustomAdvancementTrigger("trigger_anger_wizard"); public static final CustomAdvancementTrigger anger_wizard = new CustomAdvancementTrigger("trigger_anger_wizard");
@@ -35,7 +34,6 @@ public final class WizardryAdvancementTriggers {
public static void register(){ public static void register(){
CriteriaTriggers.register(legendary);
CriteriaTriggers.register(max_out_wand); CriteriaTriggers.register(max_out_wand);
CriteriaTriggers.register(special_upgrade); CriteriaTriggers.register(special_upgrade);
CriteriaTriggers.register(anger_wizard); CriteriaTriggers.register(anger_wizard);
@@ -8,6 +8,7 @@ import electroblob.wizardry.entity.projectile.EntityPoisonBomb;
import electroblob.wizardry.entity.projectile.EntitySmokeBomb; import electroblob.wizardry.entity.projectile.EntitySmokeBomb;
import electroblob.wizardry.entity.projectile.EntitySparkBomb; import electroblob.wizardry.entity.projectile.EntitySparkBomb;
import electroblob.wizardry.item.*; import electroblob.wizardry.item.*;
import electroblob.wizardry.item.ItemWizardArmour.ArmourClass;
import electroblob.wizardry.misc.BehaviourSpellDispense; import electroblob.wizardry.misc.BehaviourSpellDispense;
import electroblob.wizardry.registry.WizardryTabs.CreativeTabListed; import electroblob.wizardry.registry.WizardryTabs.CreativeTabListed;
import electroblob.wizardry.registry.WizardryTabs.CreativeTabSorted; import electroblob.wizardry.registry.WizardryTabs.CreativeTabSorted;
@@ -18,7 +19,6 @@ import net.minecraft.dispenser.BehaviorProjectileDispense;
import net.minecraft.dispenser.IPosition; import net.minecraft.dispenser.IPosition;
import net.minecraft.entity.IProjectile; import net.minecraft.entity.IProjectile;
import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.inventory.EntityEquipmentSlot.Type;
import net.minecraft.item.EnumRarity; import net.minecraft.item.EnumRarity;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.Item.ToolMaterial; import net.minecraft.item.Item.ToolMaterial;
@@ -33,14 +33,10 @@ import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.registry.GameRegistry.ObjectHolder; import net.minecraftforge.fml.common.registry.GameRegistry.ObjectHolder;
import net.minecraftforge.registries.IForgeRegistry; import net.minecraftforge.registries.IForgeRegistry;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap;
import java.util.Locale; import java.util.Locale;
import java.util.Map;
/** /**
* Class responsible for defining, storing and registering all of wizardry's items. Also registers the ItemBlocks for * Class responsible for defining, storing and registering all of wizardry's items. Also registers the ItemBlocks for
@@ -62,8 +58,15 @@ public final class WizardryItems {
public static final ToolMaterial MAGICAL = EnumHelper.addToolMaterial("MAGICAL", 3, 1000, 8.0f, 4.0f, 0); public static final ToolMaterial MAGICAL = EnumHelper.addToolMaterial("MAGICAL", 3, 1000, 8.0f, 4.0f, 0);
public static final ArmorMaterial SILK = EnumHelper.addArmorMaterial("SILK", "wizardry/textures/armour/wizard_armour", // The parameter textureName is incorrectly-named, it's actually the name field in ArmorMaterial
15, new int[]{0, 0, 0, 0}, 15, WizardrySounds.ITEM_ARMOUR_EQUIP_SILK, 0.0F); public static final ArmorMaterial SILK = EnumHelper.addArmorMaterial("SILK", "silk",
15, new int[]{2, 4, 5, 2}, 15, WizardrySounds.ITEM_ARMOUR_EQUIP_SILK, 0.0F);
public static final ArmorMaterial SAGE = EnumHelper.addArmorMaterial("SAGE", "sage",
15, new int[]{2, 5, 6, 3}, 25, WizardrySounds.ITEM_ARMOUR_EQUIP_SAGE, 0.0F);
public static final ArmorMaterial BATTLEMAGE = EnumHelper.addArmorMaterial("BATTLEMAGE", "battlemage",
15, new int[]{3, 6, 8, 3}, 15, WizardrySounds.ITEM_ARMOUR_EQUIP_BATTLEMAGE, 1.0F);
public static final ArmorMaterial WARLOCK = EnumHelper.addArmorMaterial("WARLOCK", "warlock",
20, new int[]{2, 4, 5, 2}, 15, WizardrySounds.ITEM_ARMOUR_EQUIP_WARLOCK, 0.0F);
} }
@@ -148,7 +151,9 @@ public final class WizardryItems {
public static final Item frost_axe = placeholder(); public static final Item frost_axe = placeholder();
public static final Item identification_scroll = placeholder(); public static final Item identification_scroll = placeholder();
public static final Item armour_upgrade = placeholder(); public static final Item resplendent_thread = placeholder();
public static final Item crystal_silver_plating = placeholder();
public static final Item ethereal_crystalweave = placeholder();
public static final Item astral_diamond = placeholder(); public static final Item astral_diamond = placeholder();
public static final Item purifying_elixir = placeholder(); public static final Item purifying_elixir = placeholder();
@@ -199,6 +204,126 @@ public final class WizardryItems {
public static final Item wizard_leggings_healing = placeholder(); public static final Item wizard_leggings_healing = placeholder();
public static final Item wizard_boots_healing = placeholder(); public static final Item wizard_boots_healing = placeholder();
public static final Item sage_hat = placeholder();
public static final Item sage_robe = placeholder();
public static final Item sage_leggings = placeholder();
public static final Item sage_boots = placeholder();
public static final Item sage_hat_fire = placeholder();
public static final Item sage_robe_fire = placeholder();
public static final Item sage_leggings_fire = placeholder();
public static final Item sage_boots_fire = placeholder();
public static final Item sage_hat_ice = placeholder();
public static final Item sage_robe_ice = placeholder();
public static final Item sage_leggings_ice = placeholder();
public static final Item sage_boots_ice = placeholder();
public static final Item sage_hat_lightning = placeholder();
public static final Item sage_robe_lightning = placeholder();
public static final Item sage_leggings_lightning = placeholder();
public static final Item sage_boots_lightning = placeholder();
public static final Item sage_hat_necromancy = placeholder();
public static final Item sage_robe_necromancy = placeholder();
public static final Item sage_leggings_necromancy = placeholder();
public static final Item sage_boots_necromancy = placeholder();
public static final Item sage_hat_earth = placeholder();
public static final Item sage_robe_earth = placeholder();
public static final Item sage_leggings_earth = placeholder();
public static final Item sage_boots_earth = placeholder();
public static final Item sage_hat_sorcery = placeholder();
public static final Item sage_robe_sorcery = placeholder();
public static final Item sage_leggings_sorcery = placeholder();
public static final Item sage_boots_sorcery = placeholder();
public static final Item sage_hat_healing = placeholder();
public static final Item sage_robe_healing = placeholder();
public static final Item sage_leggings_healing = placeholder();
public static final Item sage_boots_healing = placeholder();
public static final Item battlemage_helmet = placeholder();
public static final Item battlemage_chestplate = placeholder();
public static final Item battlemage_leggings = placeholder();
public static final Item battlemage_boots = placeholder();
public static final Item battlemage_helmet_fire = placeholder();
public static final Item battlemage_chestplate_fire = placeholder();
public static final Item battlemage_leggings_fire = placeholder();
public static final Item battlemage_boots_fire = placeholder();
public static final Item battlemage_helmet_ice = placeholder();
public static final Item battlemage_chestplate_ice = placeholder();
public static final Item battlemage_leggings_ice = placeholder();
public static final Item battlemage_boots_ice = placeholder();
public static final Item battlemage_helmet_lightning = placeholder();
public static final Item battlemage_chestplate_lightning = placeholder();
public static final Item battlemage_leggings_lightning = placeholder();
public static final Item battlemage_boots_lightning = placeholder();
public static final Item battlemage_helmet_necromancy = placeholder();
public static final Item battlemage_chestplate_necromancy = placeholder();
public static final Item battlemage_leggings_necromancy = placeholder();
public static final Item battlemage_boots_necromancy = placeholder();
public static final Item battlemage_helmet_earth = placeholder();
public static final Item battlemage_chestplate_earth = placeholder();
public static final Item battlemage_leggings_earth = placeholder();
public static final Item battlemage_boots_earth = placeholder();
public static final Item battlemage_helmet_sorcery = placeholder();
public static final Item battlemage_chestplate_sorcery = placeholder();
public static final Item battlemage_leggings_sorcery = placeholder();
public static final Item battlemage_boots_sorcery = placeholder();
public static final Item battlemage_helmet_healing = placeholder();
public static final Item battlemage_chestplate_healing = placeholder();
public static final Item battlemage_leggings_healing = placeholder();
public static final Item battlemage_boots_healing = placeholder();
public static final Item warlock_hood = placeholder();
public static final Item warlock_robe = placeholder();
public static final Item warlock_leggings = placeholder();
public static final Item warlock_boots = placeholder();
public static final Item warlock_hood_fire = placeholder();
public static final Item warlock_robe_fire = placeholder();
public static final Item warlock_leggings_fire = placeholder();
public static final Item warlock_boots_fire = placeholder();
public static final Item warlock_hood_ice = placeholder();
public static final Item warlock_robe_ice = placeholder();
public static final Item warlock_leggings_ice = placeholder();
public static final Item warlock_boots_ice = placeholder();
public static final Item warlock_hood_lightning = placeholder();
public static final Item warlock_robe_lightning = placeholder();
public static final Item warlock_leggings_lightning = placeholder();
public static final Item warlock_boots_lightning = placeholder();
public static final Item warlock_hood_necromancy = placeholder();
public static final Item warlock_robe_necromancy = placeholder();
public static final Item warlock_leggings_necromancy = placeholder();
public static final Item warlock_boots_necromancy = placeholder();
public static final Item warlock_hood_earth = placeholder();
public static final Item warlock_robe_earth = placeholder();
public static final Item warlock_leggings_earth = placeholder();
public static final Item warlock_boots_earth = placeholder();
public static final Item warlock_hood_sorcery = placeholder();
public static final Item warlock_robe_sorcery = placeholder();
public static final Item warlock_leggings_sorcery = placeholder();
public static final Item warlock_boots_sorcery = placeholder();
public static final Item warlock_hood_healing = placeholder();
public static final Item warlock_robe_healing = placeholder();
public static final Item warlock_leggings_healing = placeholder();
public static final Item warlock_boots_healing = placeholder();
public static final Item spectral_helmet = placeholder(); public static final Item spectral_helmet = placeholder();
public static final Item spectral_chestplate = placeholder(); public static final Item spectral_chestplate = placeholder();
public static final Item spectral_leggings = placeholder(); public static final Item spectral_leggings = placeholder();
@@ -285,46 +410,44 @@ public final class WizardryItems {
public static final Item charm_mount_teleporting = placeholder(); public static final Item charm_mount_teleporting = placeholder();
public static final Item charm_feeding = placeholder(); public static final Item charm_feeding = placeholder();
private static final Map<Pair<Tier, Element>, Item> WAND_MAP = new HashMap<>();
private static final Map<Pair<EntityEquipmentSlot, Element>, Item> ARMOUR_MAP = new HashMap<>();
/** /**
* Helper method to return the appropriate wand based on tier and element. As of Wizardry 2.1, this uses the * Helper method to return the appropriate wand based on tier and element. As of Wizardry 4.3.3, this delegates to
* immutable map stored in {@link WizardryItems#WAND_MAP}. Currently used for upgrading wands, for chest generation * the cleaner replacement method {@link ItemWand#getWand(Tier, Element)}, which accesses the item registry
* and to iterate through wands for charging recipes. * dynamically by generating the registry name on the fly.
* *
* @param tier The tier of the wand required. * @param tier The tier of the wand required.
* @param element The element of the wand required. Null will be converted to {@link Element#MAGIC}. * @param element The element of the wand required. Null will be converted to {@link Element#MAGIC}.
* @return The wand item which corresponds to the given tier and element, or null if no such item exists. * @return The wand item which corresponds to the given tier and element, or null if no such item exists.
* @throws NullPointerException if the given tier is null. * @throws NullPointerException if the given tier is null.
* @deprecated This is being phased out; it is now only used for wizard gear and trades. To add an item to * @deprecated This is being phased out; it is now only used for wizard gear and trades. To add an item to charging
* charging recipes, use {@link WizardryRecipes#addToManaFlaskCharging(Item)}. * recipes, use {@link WizardryRecipes#addToManaFlaskCharging(Item)}. If you absolutely must use this method, usages
* may be replaced with {@link ItemWand#getWand(Tier, Element)}. However, this should only be done in cases where it
* is appropriate to ignore all wands that are not in the base mod.
*/ */
@Deprecated @Deprecated
public static Item getWand(Tier tier, Element element){ public static Item getWand(Tier tier, Element element){
if(tier == null) throw new NullPointerException("The given tier cannot be null."); return ItemWand.getWand(tier, element); // Delegate to replacement method
if(element == null) element = Element.MAGIC;
return WAND_MAP.get(ImmutablePair.of(tier, element));
} }
/** /**
* Helper method to return the appropriate armour item based on element and slot. As of Wizardry 2.1, this uses the * Helper method to return the appropriate armour item based on element and slot. As of Wizardry 4.3.3, this
* immutable map stored in {@link WizardryItems#ARMOUR_MAP}. Currently used to iterate through armour for * delegates to the cleaner replacement method {@link ItemWizardArmour#getArmour(Element, ArmourClass, EntityEquipmentSlot)},
* registering charging recipes and for chest generation. * which accesses the item registry dynamically by generating the registry name on the fly.
* <p></p>
* <i>This method only returns the original, basic armour set ({@link ArmourClass#WIZARD}).</i>
* *
* @param element The EnumElement of the armour required. Null will be converted to {@link Element#MAGIC}. * @param element The EnumElement of the armour required. Null will be converted to {@link Element#MAGIC}.
* @param slot EntityEquipmentSlot of the armour piece required * @param slot EntityEquipmentSlot of the armour piece required
* @return The armour item which corresponds to the given element and slot, or null if no such item exists. * @return The armour item which corresponds to the given element and slot, or null if no such item exists.
* @throws IllegalArgumentException if the given slot is not an armour slot. * @throws IllegalArgumentException if the given slot is not an armour slot.
* @deprecated This is being phased out; it is now only used for wizard gear and trades. To add an item to * @deprecated This is being phased out; it is now only used for wizard gear and trades. To add an item to
* charging recipes, use {@link WizardryRecipes#addToManaFlaskCharging(Item)}. * charging recipes, use {@link WizardryRecipes#addToManaFlaskCharging(Item)}. If you absolutely must use this
* method, usages may be replaced with {@link ItemWand#getWand(Tier, Element)}. However, this should only be done in
* cases where it is appropriate to ignore all armour that is not in the base mod.
*/ */
@Deprecated @Deprecated
public static Item getArmour(Element element, EntityEquipmentSlot slot){ public static Item getArmour(Element element, EntityEquipmentSlot slot){
if(slot == null || slot.getSlotType() != Type.ARMOR) return ItemWizardArmour.getArmour(element, ArmourClass.WIZARD, slot); // Delegate to replacement method
throw new IllegalArgumentException("Must be a valid armour slot");
if(element == null) element = Element.MAGIC;
return ARMOUR_MAP.get(ImmutablePair.of(slot, element));
} }
/** /**
@@ -444,218 +567,340 @@ public final class WizardryItems {
// Items // Items
registerItem(registry, "magic_crystal", new ItemCrystal()); registerItem(registry, "magic_crystal", new ItemCrystal());
registerItem(registry, "crystal_shard", new Item().setCreativeTab(WizardryTabs.WIZARDRY)); registerItem(registry, "crystal_shard", new Item().setCreativeTab(WizardryTabs.WIZARDRY));
registerItem(registry, "grand_crystal", new Item().setCreativeTab(WizardryTabs.WIZARDRY)); registerItem(registry, "grand_crystal", new Item().setCreativeTab(WizardryTabs.WIZARDRY));
registerItem(registry, "wizard_handbook", new ItemWizardHandbook(), true); registerItem(registry, "wizard_handbook", new ItemWizardHandbook(), true);
registerItem(registry, "arcane_tome", new ItemArcaneTome()); registerItem(registry, "arcane_tome", new ItemArcaneTome());
registerItem(registry, "spell_book", new ItemSpellBook(), true); registerItem(registry, "spell_book", new ItemSpellBook(), true);
registerItem(registry, "scroll", new ItemScroll()); registerItem(registry, "scroll", new ItemScroll());
registerItem(registry, "ruined_spell_book", new Item().setCreativeTab(WizardryTabs.WIZARDRY).setMaxStackSize(16)); registerItem(registry, "ruined_spell_book", new Item().setCreativeTab(WizardryTabs.WIZARDRY).setMaxStackSize(16));
registerItem(registry, "magic_wand", new ItemWand(Tier.NOVICE, null)); registerItem(registry, "magic_wand", new ItemWand(Tier.NOVICE, null));
registerItem(registry, "apprentice_wand", new ItemWand(Tier.APPRENTICE, null)); registerItem(registry, "apprentice_wand", new ItemWand(Tier.APPRENTICE, null));
registerItem(registry, "advanced_wand", new ItemWand(Tier.ADVANCED, null)); registerItem(registry, "advanced_wand", new ItemWand(Tier.ADVANCED, null));
registerItem(registry, "master_wand", new ItemWand(Tier.MASTER, null)); registerItem(registry, "master_wand", new ItemWand(Tier.MASTER, null));
registerItem(registry, "novice_fire_wand", new ItemWand(Tier.NOVICE, Element.FIRE)); registerItem(registry, "novice_fire_wand", new ItemWand(Tier.NOVICE, Element.FIRE));
registerItem(registry, "apprentice_fire_wand", new ItemWand(Tier.APPRENTICE, Element.FIRE)); registerItem(registry, "apprentice_fire_wand", new ItemWand(Tier.APPRENTICE, Element.FIRE));
registerItem(registry, "advanced_fire_wand", new ItemWand(Tier.ADVANCED, Element.FIRE)); registerItem(registry, "advanced_fire_wand", new ItemWand(Tier.ADVANCED, Element.FIRE));
registerItem(registry, "master_fire_wand", new ItemWand(Tier.MASTER, Element.FIRE)); registerItem(registry, "master_fire_wand", new ItemWand(Tier.MASTER, Element.FIRE));
registerItem(registry, "novice_ice_wand", new ItemWand(Tier.NOVICE, Element.ICE)); registerItem(registry, "novice_ice_wand", new ItemWand(Tier.NOVICE, Element.ICE));
registerItem(registry, "apprentice_ice_wand", new ItemWand(Tier.APPRENTICE, Element.ICE)); registerItem(registry, "apprentice_ice_wand", new ItemWand(Tier.APPRENTICE, Element.ICE));
registerItem(registry, "advanced_ice_wand", new ItemWand(Tier.ADVANCED, Element.ICE)); registerItem(registry, "advanced_ice_wand", new ItemWand(Tier.ADVANCED, Element.ICE));
registerItem(registry, "master_ice_wand", new ItemWand(Tier.MASTER, Element.ICE)); registerItem(registry, "master_ice_wand", new ItemWand(Tier.MASTER, Element.ICE));
registerItem(registry, "novice_lightning_wand", new ItemWand(Tier.NOVICE, Element.LIGHTNING)); registerItem(registry, "novice_lightning_wand", new ItemWand(Tier.NOVICE, Element.LIGHTNING));
registerItem(registry, "apprentice_lightning_wand", new ItemWand(Tier.APPRENTICE, Element.LIGHTNING)); registerItem(registry, "apprentice_lightning_wand", new ItemWand(Tier.APPRENTICE, Element.LIGHTNING));
registerItem(registry, "advanced_lightning_wand", new ItemWand(Tier.ADVANCED, Element.LIGHTNING)); registerItem(registry, "advanced_lightning_wand", new ItemWand(Tier.ADVANCED, Element.LIGHTNING));
registerItem(registry, "master_lightning_wand", new ItemWand(Tier.MASTER, Element.LIGHTNING)); registerItem(registry, "master_lightning_wand", new ItemWand(Tier.MASTER, Element.LIGHTNING));
registerItem(registry, "novice_necromancy_wand", new ItemWand(Tier.NOVICE, Element.NECROMANCY)); registerItem(registry, "novice_necromancy_wand", new ItemWand(Tier.NOVICE, Element.NECROMANCY));
registerItem(registry, "apprentice_necromancy_wand", new ItemWand(Tier.APPRENTICE, Element.NECROMANCY)); registerItem(registry, "apprentice_necromancy_wand", new ItemWand(Tier.APPRENTICE, Element.NECROMANCY));
registerItem(registry, "advanced_necromancy_wand", new ItemWand(Tier.ADVANCED, Element.NECROMANCY)); registerItem(registry, "advanced_necromancy_wand", new ItemWand(Tier.ADVANCED, Element.NECROMANCY));
registerItem(registry, "master_necromancy_wand", new ItemWand(Tier.MASTER, Element.NECROMANCY)); registerItem(registry, "master_necromancy_wand", new ItemWand(Tier.MASTER, Element.NECROMANCY));
registerItem(registry, "novice_earth_wand", new ItemWand(Tier.NOVICE, Element.EARTH)); registerItem(registry, "novice_earth_wand", new ItemWand(Tier.NOVICE, Element.EARTH));
registerItem(registry, "apprentice_earth_wand", new ItemWand(Tier.APPRENTICE, Element.EARTH)); registerItem(registry, "apprentice_earth_wand", new ItemWand(Tier.APPRENTICE, Element.EARTH));
registerItem(registry, "advanced_earth_wand", new ItemWand(Tier.ADVANCED, Element.EARTH)); registerItem(registry, "advanced_earth_wand", new ItemWand(Tier.ADVANCED, Element.EARTH));
registerItem(registry, "master_earth_wand", new ItemWand(Tier.MASTER, Element.EARTH)); registerItem(registry, "master_earth_wand", new ItemWand(Tier.MASTER, Element.EARTH));
registerItem(registry, "novice_sorcery_wand", new ItemWand(Tier.NOVICE, Element.SORCERY)); registerItem(registry, "novice_sorcery_wand", new ItemWand(Tier.NOVICE, Element.SORCERY));
registerItem(registry, "apprentice_sorcery_wand", new ItemWand(Tier.APPRENTICE, Element.SORCERY)); registerItem(registry, "apprentice_sorcery_wand", new ItemWand(Tier.APPRENTICE, Element.SORCERY));
registerItem(registry, "advanced_sorcery_wand", new ItemWand(Tier.ADVANCED, Element.SORCERY)); registerItem(registry, "advanced_sorcery_wand", new ItemWand(Tier.ADVANCED, Element.SORCERY));
registerItem(registry, "master_sorcery_wand", new ItemWand(Tier.MASTER, Element.SORCERY)); registerItem(registry, "master_sorcery_wand", new ItemWand(Tier.MASTER, Element.SORCERY));
registerItem(registry, "novice_healing_wand", new ItemWand(Tier.NOVICE, Element.HEALING)); registerItem(registry, "novice_healing_wand", new ItemWand(Tier.NOVICE, Element.HEALING));
registerItem(registry, "apprentice_healing_wand", new ItemWand(Tier.APPRENTICE, Element.HEALING)); registerItem(registry, "apprentice_healing_wand", new ItemWand(Tier.APPRENTICE, Element.HEALING));
registerItem(registry, "advanced_healing_wand", new ItemWand(Tier.ADVANCED, Element.HEALING)); registerItem(registry, "advanced_healing_wand", new ItemWand(Tier.ADVANCED, Element.HEALING));
registerItem(registry, "master_healing_wand", new ItemWand(Tier.MASTER, Element.HEALING)); registerItem(registry, "master_healing_wand", new ItemWand(Tier.MASTER, Element.HEALING));
registerItem(registry, "spectral_sword", new ItemSpectralSword(ToolMaterial.IRON)); registerItem(registry, "spectral_sword", new ItemSpectralSword(ToolMaterial.IRON));
registerItem(registry, "spectral_pickaxe", new ItemSpectralPickaxe(ToolMaterial.IRON)); registerItem(registry, "spectral_pickaxe", new ItemSpectralPickaxe(ToolMaterial.IRON));
registerItem(registry, "spectral_bow", new ItemSpectralBow()); registerItem(registry, "spectral_bow", new ItemSpectralBow());
registerItem(registry, "blank_scroll", new ItemBlankScroll()); registerItem(registry, "blank_scroll", new ItemBlankScroll());
registerItem(registry, "magic_silk", new Item().setCreativeTab(WizardryTabs.WIZARDRY)); registerItem(registry, "magic_silk", new Item().setCreativeTab(WizardryTabs.WIZARDRY));
registerItem(registry, "small_mana_flask", new ItemManaFlask(ItemManaFlask.Size.SMALL)); registerItem(registry, "small_mana_flask", new ItemManaFlask(ItemManaFlask.Size.SMALL));
registerItem(registry, "medium_mana_flask", new ItemManaFlask(ItemManaFlask.Size.MEDIUM)); registerItem(registry, "medium_mana_flask", new ItemManaFlask(ItemManaFlask.Size.MEDIUM));
registerItem(registry, "large_mana_flask", new ItemManaFlask(ItemManaFlask.Size.LARGE)); registerItem(registry, "large_mana_flask", new ItemManaFlask(ItemManaFlask.Size.LARGE));
registerItem(registry, "storage_upgrade", new ItemWandUpgrade()); registerItem(registry, "storage_upgrade", new ItemWandUpgrade());
registerItem(registry, "siphon_upgrade", new ItemWandUpgrade()); registerItem(registry, "siphon_upgrade", new ItemWandUpgrade());
registerItem(registry, "condenser_upgrade", new ItemWandUpgrade()); registerItem(registry, "condenser_upgrade", new ItemWandUpgrade());
registerItem(registry, "range_upgrade", new ItemWandUpgrade()); registerItem(registry, "range_upgrade", new ItemWandUpgrade());
registerItem(registry, "duration_upgrade", new ItemWandUpgrade()); registerItem(registry, "duration_upgrade", new ItemWandUpgrade());
registerItem(registry, "cooldown_upgrade", new ItemWandUpgrade()); registerItem(registry, "cooldown_upgrade", new ItemWandUpgrade());
registerItem(registry, "blast_upgrade", new ItemWandUpgrade()); registerItem(registry, "blast_upgrade", new ItemWandUpgrade());
registerItem(registry, "attunement_upgrade", new ItemWandUpgrade()); registerItem(registry, "attunement_upgrade", new ItemWandUpgrade());
registerItem(registry, "melee_upgrade", new ItemWandUpgrade()); registerItem(registry, "melee_upgrade", new ItemWandUpgrade());
registerItem(registry, "flaming_axe", new ItemFlamingAxe(Materials.MAGICAL)); registerItem(registry, "flaming_axe", new ItemFlamingAxe(Materials.MAGICAL));
registerItem(registry, "frost_axe", new ItemFrostAxe(Materials.MAGICAL)); registerItem(registry, "frost_axe", new ItemFrostAxe(Materials.MAGICAL));
registerItem(registry, "identification_scroll", new ItemIdentificationScroll()); registerItem(registry, "identification_scroll", new ItemIdentificationScroll());
registerItem(registry, "armour_upgrade", new ItemArmourUpgrade()); registerItem(registry, "resplendent_thread", new ItemArmourUpgrade());
registerItem(registry, "astral_diamond", new Item(){ @Override public EnumRarity getRarity(ItemStack stack){ return EnumRarity.RARE; }}.setCreativeTab(WizardryTabs.WIZARDRY)); registerItem(registry, "crystal_silver_plating", new ItemArmourUpgrade());
registerItem(registry, "purifying_elixir", new ItemPurifyingElixir()); registerItem(registry, "ethereal_crystalweave", new ItemArmourUpgrade());
registerItem(registry, "astral_diamond", new Item(){ @Override public EnumRarity getRarity(ItemStack stack){ return EnumRarity.RARE; }}.setCreativeTab(WizardryTabs.WIZARDRY));
registerItem(registry, "purifying_elixir", new ItemPurifyingElixir());
registerItem(registry, "firebomb", new ItemFirebomb()); registerItem(registry, "firebomb", new ItemFirebomb());
registerItem(registry, "poison_bomb", new ItemPoisonBomb()); registerItem(registry, "poison_bomb", new ItemPoisonBomb());
registerItem(registry, "smoke_bomb", new ItemSmokeBomb()); registerItem(registry, "smoke_bomb", new ItemSmokeBomb());
registerItem(registry, "spark_bomb", new ItemSparkBomb()); registerItem(registry, "spark_bomb", new ItemSparkBomb());
registerItem(registry, "spectral_dust", new ItemSpectralDust()); registerItem(registry, "spectral_dust", new ItemSpectralDust());
registerItem(registry, "wizard_hat", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.HEAD, null), true); registerItem(registry, "wizard_hat", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.HEAD, null), true);
registerItem(registry, "wizard_robe", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.CHEST, null)); registerItem(registry, "wizard_robe", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.CHEST, null));
registerItem(registry, "wizard_leggings", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.LEGS, null)); registerItem(registry, "wizard_leggings", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.LEGS, null));
registerItem(registry, "wizard_boots", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.FEET, null)); registerItem(registry, "wizard_boots", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.FEET, null));
registerItem(registry, "wizard_hat_fire", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.HEAD, Element.FIRE)); registerItem(registry, "wizard_hat_fire", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.HEAD, Element.FIRE));
registerItem(registry, "wizard_robe_fire", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.CHEST, Element.FIRE)); registerItem(registry, "wizard_robe_fire", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.CHEST, Element.FIRE));
registerItem(registry, "wizard_leggings_fire", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.LEGS, Element.FIRE)); registerItem(registry, "wizard_leggings_fire", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.LEGS, Element.FIRE));
registerItem(registry, "wizard_boots_fire", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.FEET, Element.FIRE)); registerItem(registry, "wizard_boots_fire", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.FEET, Element.FIRE));
registerItem(registry, "wizard_hat_ice", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.HEAD, Element.ICE)); registerItem(registry, "wizard_hat_ice", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.HEAD, Element.ICE));
registerItem(registry, "wizard_robe_ice", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.CHEST, Element.ICE)); registerItem(registry, "wizard_robe_ice", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.CHEST, Element.ICE));
registerItem(registry, "wizard_leggings_ice", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.LEGS, Element.ICE)); registerItem(registry, "wizard_leggings_ice", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.LEGS, Element.ICE));
registerItem(registry, "wizard_boots_ice", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.FEET, Element.ICE)); registerItem(registry, "wizard_boots_ice", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.FEET, Element.ICE));
registerItem(registry, "wizard_hat_lightning", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.HEAD, Element.LIGHTNING)); registerItem(registry, "wizard_hat_lightning", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.HEAD, Element.LIGHTNING));
registerItem(registry, "wizard_robe_lightning", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.CHEST, Element.LIGHTNING)); registerItem(registry, "wizard_robe_lightning", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.CHEST, Element.LIGHTNING));
registerItem(registry, "wizard_leggings_lightning", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.LEGS, Element.LIGHTNING)); registerItem(registry, "wizard_leggings_lightning", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.LEGS, Element.LIGHTNING));
registerItem(registry, "wizard_boots_lightning", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.FEET, Element.LIGHTNING)); registerItem(registry, "wizard_boots_lightning", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.FEET, Element.LIGHTNING));
registerItem(registry, "wizard_hat_necromancy", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.HEAD, Element.NECROMANCY)); registerItem(registry, "wizard_hat_necromancy", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.HEAD, Element.NECROMANCY));
registerItem(registry, "wizard_robe_necromancy", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.CHEST, Element.NECROMANCY)); registerItem(registry, "wizard_robe_necromancy", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.CHEST, Element.NECROMANCY));
registerItem(registry, "wizard_leggings_necromancy", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.LEGS, Element.NECROMANCY)); registerItem(registry, "wizard_leggings_necromancy", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.LEGS, Element.NECROMANCY));
registerItem(registry, "wizard_boots_necromancy", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.FEET, Element.NECROMANCY)); registerItem(registry, "wizard_boots_necromancy", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.FEET, Element.NECROMANCY));
registerItem(registry, "wizard_hat_earth", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.HEAD, Element.EARTH)); registerItem(registry, "wizard_hat_earth", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.HEAD, Element.EARTH));
registerItem(registry, "wizard_robe_earth", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.CHEST, Element.EARTH)); registerItem(registry, "wizard_robe_earth", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.CHEST, Element.EARTH));
registerItem(registry, "wizard_leggings_earth", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.LEGS, Element.EARTH)); registerItem(registry, "wizard_leggings_earth", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.LEGS, Element.EARTH));
registerItem(registry, "wizard_boots_earth", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.FEET, Element.EARTH)); registerItem(registry, "wizard_boots_earth", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.FEET, Element.EARTH));
registerItem(registry, "wizard_hat_sorcery", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.HEAD, Element.SORCERY)); registerItem(registry, "wizard_hat_sorcery", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.HEAD, Element.SORCERY));
registerItem(registry, "wizard_robe_sorcery", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.CHEST, Element.SORCERY)); registerItem(registry, "wizard_robe_sorcery", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.CHEST, Element.SORCERY));
registerItem(registry, "wizard_leggings_sorcery", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.LEGS, Element.SORCERY)); registerItem(registry, "wizard_leggings_sorcery", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.LEGS, Element.SORCERY));
registerItem(registry, "wizard_boots_sorcery", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.FEET, Element.SORCERY)); registerItem(registry, "wizard_boots_sorcery", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.FEET, Element.SORCERY));
registerItem(registry, "wizard_hat_healing", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.HEAD, Element.HEALING)); registerItem(registry, "wizard_hat_healing", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.HEAD, Element.HEALING));
registerItem(registry, "wizard_robe_healing", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.CHEST, Element.HEALING)); registerItem(registry, "wizard_robe_healing", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.CHEST, Element.HEALING));
registerItem(registry, "wizard_leggings_healing", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.LEGS, Element.HEALING)); registerItem(registry, "wizard_leggings_healing", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.LEGS, Element.HEALING));
registerItem(registry, "wizard_boots_healing", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.FEET, Element.HEALING)); registerItem(registry, "wizard_boots_healing", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.FEET, Element.HEALING));
registerItem(registry, "spectral_helmet", new ItemSpectralArmour(ArmorMaterial.IRON, 1, EntityEquipmentSlot.HEAD)); registerItem(registry, "sage_hat", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.HEAD, null));
registerItem(registry, "spectral_chestplate", new ItemSpectralArmour(ArmorMaterial.IRON, 1, EntityEquipmentSlot.CHEST)); registerItem(registry, "sage_robe", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.CHEST, null));
registerItem(registry, "spectral_leggings", new ItemSpectralArmour(ArmorMaterial.IRON, 1, EntityEquipmentSlot.LEGS)); registerItem(registry, "sage_leggings", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.LEGS, null));
registerItem(registry, "spectral_boots", new ItemSpectralArmour(ArmorMaterial.IRON, 1, EntityEquipmentSlot.FEET)); registerItem(registry, "sage_boots", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.FEET, null));
registerItem(registry, "lightning_hammer", new ItemLightningHammer()); registerItem(registry, "sage_hat_fire", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.HEAD, Element.FIRE));
registerItem(registry, "flamecatcher", new ItemFlamecatcher()); registerItem(registry, "sage_robe_fire", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.CHEST, Element.FIRE));
registerItem(registry, "sage_leggings_fire", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.LEGS, Element.FIRE));
registerItem(registry, "sage_boots_fire", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.FEET, Element.FIRE));
registerItem(registry, "ring_condensing", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING)); registerItem(registry, "sage_hat_ice", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.HEAD, Element.ICE));
registerItem(registry, "ring_siphoning", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.RING)); registerItem(registry, "sage_robe_ice", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.CHEST, Element.ICE));
registerItem(registry, "ring_battlemage", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.RING)); registerItem(registry, "sage_leggings_ice", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.LEGS, Element.ICE));
registerItem(registry, "ring_combustion", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.RING)); registerItem(registry, "sage_boots_ice", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.FEET, Element.ICE));
registerItem(registry, "ring_fire_melee", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.RING));
registerItem(registry, "ring_fire_biome", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.RING));
registerItem(registry, "ring_disintegration", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING));
registerItem(registry, "ring_meteor", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.RING));
registerItem(registry, "ring_ice_melee", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.RING));
registerItem(registry, "ring_ice_biome", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.RING));
registerItem(registry, "ring_arcane_frost", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.RING));
registerItem(registry, "ring_shattering", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING));
registerItem(registry, "ring_lightning_melee", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.RING));
registerItem(registry, "ring_storm", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING));
registerItem(registry, "ring_seeking", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.RING));
registerItem(registry, "ring_hammer", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.RING));
registerItem(registry, "ring_stormcloud", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING));
registerItem(registry, "ring_soulbinding", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.RING));
registerItem(registry, "ring_leeching", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING));
registerItem(registry, "ring_necromancy_melee", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.RING));
registerItem(registry, "ring_mind_control", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING));
registerItem(registry, "ring_poison", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING));
registerItem(registry, "ring_earth_melee", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.RING));
registerItem(registry, "ring_earth_biome", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.RING));
registerItem(registry, "ring_full_moon", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING));
registerItem(registry, "ring_evoker", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING));
registerItem(registry, "ring_extraction", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.RING));
registerItem(registry, "ring_mana_return", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.RING));
registerItem(registry, "ring_blockwrangler", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING));
registerItem(registry, "ring_conjurer", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING));
registerItem(registry, "ring_defender", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING));
registerItem(registry, "ring_paladin", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.RING));
registerItem(registry, "ring_interdiction", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.RING));
registerItem(registry, "amulet_arcane_defence", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.AMULET)); registerItem(registry, "sage_hat_lightning", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.HEAD, Element.LIGHTNING));
registerItem(registry, "amulet_warding", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.AMULET)); registerItem(registry, "sage_robe_lightning", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.CHEST, Element.LIGHTNING));
registerItem(registry, "amulet_wisdom", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.AMULET)); registerItem(registry, "sage_leggings_lightning", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.LEGS, Element.LIGHTNING));
registerItem(registry, "amulet_fire_protection", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.AMULET)); registerItem(registry, "sage_boots_lightning", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.FEET, Element.LIGHTNING));
registerItem(registry, "amulet_fire_cloaking", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_ice_immunity", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_ice_protection", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_frost_warding", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_potential", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_channeling", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_lich", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_wither_immunity", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_glide", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_banishing", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_anchoring", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_recovery", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_transience", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_resurrection", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_auto_shield", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_absorption", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.AMULET));
registerItem(registry, "charm_haggler", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.CHARM)); registerItem(registry, "sage_hat_necromancy", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.HEAD, Element.NECROMANCY));
registerItem(registry, "charm_experience_tome", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.CHARM)); registerItem(registry, "sage_robe_necromancy", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.CHEST, Element.NECROMANCY));
registerItem(registry, "charm_move_speed", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.CHARM)); registerItem(registry, "sage_leggings_necromancy", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.LEGS, Element.NECROMANCY));
registerItem(registry, "charm_spell_discovery", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.CHARM)); registerItem(registry, "sage_boots_necromancy", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.FEET, Element.NECROMANCY));
registerItem(registry, "charm_auto_smelt", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.CHARM));
registerItem(registry, "charm_lava_walking", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.CHARM)); registerItem(registry, "sage_hat_earth", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.HEAD, Element.EARTH));
registerItem(registry, "charm_storm", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.CHARM)); registerItem(registry, "sage_robe_earth", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.CHEST, Element.EARTH));
registerItem(registry, "charm_minion_health", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.CHARM)); registerItem(registry, "sage_leggings_earth", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.LEGS, Element.EARTH));
registerItem(registry, "charm_minion_variants", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.CHARM)); registerItem(registry, "sage_boots_earth", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.FEET, Element.EARTH));
registerItem(registry, "charm_undead_helmets", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.CHARM));
registerItem(registry, "charm_hunger_casting", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.CHARM)); registerItem(registry, "sage_hat_sorcery", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.HEAD, Element.SORCERY));
registerItem(registry, "charm_flight", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.CHARM)); registerItem(registry, "sage_robe_sorcery", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.CHEST, Element.SORCERY));
registerItem(registry, "charm_growth", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.CHARM)); registerItem(registry, "sage_leggings_sorcery", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.LEGS, Element.SORCERY));
registerItem(registry, "charm_abseiling", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.CHARM)); registerItem(registry, "sage_boots_sorcery", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.FEET, Element.SORCERY));
registerItem(registry, "charm_silk_touch", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.CHARM));
registerItem(registry, "charm_sixth_sense", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.CHARM)); registerItem(registry, "sage_hat_healing", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.HEAD, Element.HEALING));
registerItem(registry, "charm_stop_time", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.CHARM)); registerItem(registry, "sage_robe_healing", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.CHEST, Element.HEALING));
registerItem(registry, "charm_light", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.CHARM)); registerItem(registry, "sage_leggings_healing", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.LEGS, Element.HEALING));
registerItem(registry, "charm_transportation", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.CHARM)); registerItem(registry, "sage_boots_healing", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.FEET, Element.HEALING));
registerItem(registry, "charm_black_hole", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.CHARM));
registerItem(registry, "charm_mount_teleporting", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.CHARM)); registerItem(registry, "battlemage_helmet", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.HEAD, null));
registerItem(registry, "charm_feeding", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.CHARM)); registerItem(registry, "battlemage_chestplate", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.CHEST, null));
registerItem(registry, "battlemage_leggings", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.LEGS, null));
registerItem(registry, "battlemage_boots", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.FEET, null));
registerItem(registry, "battlemage_helmet_fire", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.HEAD, Element.FIRE));
registerItem(registry, "battlemage_chestplate_fire", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.CHEST, Element.FIRE));
registerItem(registry, "battlemage_leggings_fire", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.LEGS, Element.FIRE));
registerItem(registry, "battlemage_boots_fire", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.FEET, Element.FIRE));
registerItem(registry, "battlemage_helmet_ice", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.HEAD, Element.ICE));
registerItem(registry, "battlemage_chestplate_ice", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.CHEST, Element.ICE));
registerItem(registry, "battlemage_leggings_ice", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.LEGS, Element.ICE));
registerItem(registry, "battlemage_boots_ice", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.FEET, Element.ICE));
registerItem(registry, "battlemage_helmet_lightning", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.HEAD, Element.LIGHTNING));
registerItem(registry, "battlemage_chestplate_lightning", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.CHEST, Element.LIGHTNING));
registerItem(registry, "battlemage_leggings_lightning", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.LEGS, Element.LIGHTNING));
registerItem(registry, "battlemage_boots_lightning", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.FEET, Element.LIGHTNING));
registerItem(registry, "battlemage_helmet_necromancy", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.HEAD, Element.NECROMANCY));
registerItem(registry, "battlemage_chestplate_necromancy", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.CHEST, Element.NECROMANCY));
registerItem(registry, "battlemage_leggings_necromancy", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.LEGS, Element.NECROMANCY));
registerItem(registry, "battlemage_boots_necromancy", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.FEET, Element.NECROMANCY));
registerItem(registry, "battlemage_helmet_earth", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.HEAD, Element.EARTH));
registerItem(registry, "battlemage_chestplate_earth", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.CHEST, Element.EARTH));
registerItem(registry, "battlemage_leggings_earth", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.LEGS, Element.EARTH));
registerItem(registry, "battlemage_boots_earth", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.FEET, Element.EARTH));
registerItem(registry, "battlemage_helmet_sorcery", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.HEAD, Element.SORCERY));
registerItem(registry, "battlemage_chestplate_sorcery", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.CHEST, Element.SORCERY));
registerItem(registry, "battlemage_leggings_sorcery", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.LEGS, Element.SORCERY));
registerItem(registry, "battlemage_boots_sorcery", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.FEET, Element.SORCERY));
registerItem(registry, "battlemage_helmet_healing", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.HEAD, Element.HEALING));
registerItem(registry, "battlemage_chestplate_healing", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.CHEST, Element.HEALING));
registerItem(registry, "battlemage_leggings_healing", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.LEGS, Element.HEALING));
registerItem(registry, "battlemage_boots_healing", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.FEET, Element.HEALING));
registerItem(registry, "warlock_hood", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.HEAD, null));
registerItem(registry, "warlock_robe", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.CHEST, null));
registerItem(registry, "warlock_leggings", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.LEGS, null));
registerItem(registry, "warlock_boots", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.FEET, null));
registerItem(registry, "warlock_hood_fire", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.HEAD, Element.FIRE));
registerItem(registry, "warlock_robe_fire", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.CHEST, Element.FIRE));
registerItem(registry, "warlock_leggings_fire", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.LEGS, Element.FIRE));
registerItem(registry, "warlock_boots_fire", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.FEET, Element.FIRE));
registerItem(registry, "warlock_hood_ice", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.HEAD, Element.ICE));
registerItem(registry, "warlock_robe_ice", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.CHEST, Element.ICE));
registerItem(registry, "warlock_leggings_ice", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.LEGS, Element.ICE));
registerItem(registry, "warlock_boots_ice", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.FEET, Element.ICE));
registerItem(registry, "warlock_hood_lightning", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.HEAD, Element.LIGHTNING));
registerItem(registry, "warlock_robe_lightning", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.CHEST, Element.LIGHTNING));
registerItem(registry, "warlock_leggings_lightning", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.LEGS, Element.LIGHTNING));
registerItem(registry, "warlock_boots_lightning", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.FEET, Element.LIGHTNING));
registerItem(registry, "warlock_hood_necromancy", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.HEAD, Element.NECROMANCY));
registerItem(registry, "warlock_robe_necromancy", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.CHEST, Element.NECROMANCY));
registerItem(registry, "warlock_leggings_necromancy", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.LEGS, Element.NECROMANCY));
registerItem(registry, "warlock_boots_necromancy", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.FEET, Element.NECROMANCY));
registerItem(registry, "warlock_hood_earth", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.HEAD, Element.EARTH));
registerItem(registry, "warlock_robe_earth", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.CHEST, Element.EARTH));
registerItem(registry, "warlock_leggings_earth", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.LEGS, Element.EARTH));
registerItem(registry, "warlock_boots_earth", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.FEET, Element.EARTH));
registerItem(registry, "warlock_hood_sorcery", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.HEAD, Element.SORCERY));
registerItem(registry, "warlock_robe_sorcery", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.CHEST, Element.SORCERY));
registerItem(registry, "warlock_leggings_sorcery", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.LEGS, Element.SORCERY));
registerItem(registry, "warlock_boots_sorcery", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.FEET, Element.SORCERY));
registerItem(registry, "warlock_hood_healing", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.HEAD, Element.HEALING));
registerItem(registry, "warlock_robe_healing", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.CHEST, Element.HEALING));
registerItem(registry, "warlock_leggings_healing", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.LEGS, Element.HEALING));
registerItem(registry, "warlock_boots_healing", new ItemWizardArmour(ArmourClass.WARLOCK, EntityEquipmentSlot.FEET, Element.HEALING));
registerItem(registry, "spectral_helmet", new ItemSpectralArmour(ArmorMaterial.IRON, 1, EntityEquipmentSlot.HEAD));
registerItem(registry, "spectral_chestplate", new ItemSpectralArmour(ArmorMaterial.IRON, 1, EntityEquipmentSlot.CHEST));
registerItem(registry, "spectral_leggings", new ItemSpectralArmour(ArmorMaterial.IRON, 1, EntityEquipmentSlot.LEGS));
registerItem(registry, "spectral_boots", new ItemSpectralArmour(ArmorMaterial.IRON, 1, EntityEquipmentSlot.FEET));
registerItem(registry, "lightning_hammer", new ItemLightningHammer());
registerItem(registry, "flamecatcher", new ItemFlamecatcher());
registerItem(registry, "ring_condensing", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING));
registerItem(registry, "ring_siphoning", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.RING));
registerItem(registry, "ring_battlemage", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.RING));
registerItem(registry, "ring_combustion", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.RING));
registerItem(registry, "ring_fire_melee", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.RING));
registerItem(registry, "ring_fire_biome", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.RING));
registerItem(registry, "ring_disintegration", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING));
registerItem(registry, "ring_meteor", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.RING));
registerItem(registry, "ring_ice_melee", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.RING));
registerItem(registry, "ring_ice_biome", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.RING));
registerItem(registry, "ring_arcane_frost", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.RING));
registerItem(registry, "ring_shattering", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING));
registerItem(registry, "ring_lightning_melee", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.RING));
registerItem(registry, "ring_storm", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING));
registerItem(registry, "ring_seeking", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.RING));
registerItem(registry, "ring_hammer", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.RING));
registerItem(registry, "ring_stormcloud", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING));
registerItem(registry, "ring_soulbinding", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.RING));
registerItem(registry, "ring_leeching", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING));
registerItem(registry, "ring_necromancy_melee", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.RING));
registerItem(registry, "ring_mind_control", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING));
registerItem(registry, "ring_poison", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING));
registerItem(registry, "ring_earth_melee", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.RING));
registerItem(registry, "ring_earth_biome", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.RING));
registerItem(registry, "ring_full_moon", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING));
registerItem(registry, "ring_evoker", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING));
registerItem(registry, "ring_extraction", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.RING));
registerItem(registry, "ring_mana_return", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.RING));
registerItem(registry, "ring_blockwrangler", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING));
registerItem(registry, "ring_conjurer", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING));
registerItem(registry, "ring_defender", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING));
registerItem(registry, "ring_paladin", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.RING));
registerItem(registry, "ring_interdiction", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.RING));
registerItem(registry, "amulet_arcane_defence", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_warding", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_wisdom", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_fire_protection", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_fire_cloaking", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_ice_immunity", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_ice_protection", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_frost_warding", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_potential", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_channeling", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_lich", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_wither_immunity", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_glide", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_banishing", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_anchoring", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_recovery", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_transience", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_resurrection", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_auto_shield", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.AMULET));
registerItem(registry, "amulet_absorption", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.AMULET));
registerItem(registry, "charm_haggler", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.CHARM));
registerItem(registry, "charm_experience_tome", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.CHARM));
registerItem(registry, "charm_move_speed", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.CHARM));
registerItem(registry, "charm_spell_discovery", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.CHARM));
registerItem(registry, "charm_auto_smelt", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.CHARM));
registerItem(registry, "charm_lava_walking", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.CHARM));
registerItem(registry, "charm_storm", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.CHARM));
registerItem(registry, "charm_minion_health", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.CHARM));
registerItem(registry, "charm_minion_variants", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.CHARM));
registerItem(registry, "charm_undead_helmets", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.CHARM));
registerItem(registry, "charm_hunger_casting", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.CHARM));
registerItem(registry, "charm_flight", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.CHARM));
registerItem(registry, "charm_growth", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.CHARM));
registerItem(registry, "charm_abseiling", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.CHARM));
registerItem(registry, "charm_silk_touch", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.CHARM));
registerItem(registry, "charm_sixth_sense", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.CHARM));
registerItem(registry, "charm_stop_time", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.CHARM));
registerItem(registry, "charm_light", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.CHARM));
registerItem(registry, "charm_transportation", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.CHARM));
registerItem(registry, "charm_black_hole", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.CHARM));
registerItem(registry, "charm_mount_teleporting", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.CHARM));
registerItem(registry, "charm_feeding", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.CHARM));
} }
@@ -756,76 +1001,4 @@ public final class WizardryItems {
EnumHelper.addEnum(BannerPattern.class, codeName, new Class[]{String.class, String.class, ItemStack.class}, fileName, hashName, patternItem); EnumHelper.addEnum(BannerPattern.class, codeName, new Class[]{String.class, String.class, ItemStack.class}, fileName, hashName, patternItem);
} }
public static void populateWandMap(){
WAND_MAP.put(ImmutablePair.of(Tier.NOVICE, Element.MAGIC), magic_wand);
WAND_MAP.put(ImmutablePair.of(Tier.NOVICE, Element.FIRE), novice_fire_wand);
WAND_MAP.put(ImmutablePair.of(Tier.NOVICE, Element.ICE), novice_ice_wand);
WAND_MAP.put(ImmutablePair.of(Tier.NOVICE, Element.LIGHTNING), novice_lightning_wand);
WAND_MAP.put(ImmutablePair.of(Tier.NOVICE, Element.NECROMANCY), novice_necromancy_wand);
WAND_MAP.put(ImmutablePair.of(Tier.NOVICE, Element.EARTH), novice_earth_wand);
WAND_MAP.put(ImmutablePair.of(Tier.NOVICE, Element.SORCERY), novice_sorcery_wand);
WAND_MAP.put(ImmutablePair.of(Tier.NOVICE, Element.HEALING), novice_healing_wand);
WAND_MAP.put(ImmutablePair.of(Tier.APPRENTICE, Element.MAGIC), apprentice_wand);
WAND_MAP.put(ImmutablePair.of(Tier.APPRENTICE, Element.FIRE), apprentice_fire_wand);
WAND_MAP.put(ImmutablePair.of(Tier.APPRENTICE, Element.ICE), apprentice_ice_wand);
WAND_MAP.put(ImmutablePair.of(Tier.APPRENTICE, Element.LIGHTNING), apprentice_lightning_wand);
WAND_MAP.put(ImmutablePair.of(Tier.APPRENTICE, Element.NECROMANCY), apprentice_necromancy_wand);
WAND_MAP.put(ImmutablePair.of(Tier.APPRENTICE, Element.EARTH), apprentice_earth_wand);
WAND_MAP.put(ImmutablePair.of(Tier.APPRENTICE, Element.SORCERY), apprentice_sorcery_wand);
WAND_MAP.put(ImmutablePair.of(Tier.APPRENTICE, Element.HEALING), apprentice_healing_wand);
WAND_MAP.put(ImmutablePair.of(Tier.ADVANCED, Element.MAGIC), advanced_wand);
WAND_MAP.put(ImmutablePair.of(Tier.ADVANCED, Element.FIRE), advanced_fire_wand);
WAND_MAP.put(ImmutablePair.of(Tier.ADVANCED, Element.ICE), advanced_ice_wand);
WAND_MAP.put(ImmutablePair.of(Tier.ADVANCED, Element.LIGHTNING), advanced_lightning_wand);
WAND_MAP.put(ImmutablePair.of(Tier.ADVANCED, Element.NECROMANCY), advanced_necromancy_wand);
WAND_MAP.put(ImmutablePair.of(Tier.ADVANCED, Element.EARTH), advanced_earth_wand);
WAND_MAP.put(ImmutablePair.of(Tier.ADVANCED, Element.SORCERY), advanced_sorcery_wand);
WAND_MAP.put(ImmutablePair.of(Tier.ADVANCED, Element.HEALING), advanced_healing_wand);
WAND_MAP.put(ImmutablePair.of(Tier.MASTER, Element.MAGIC), master_wand);
WAND_MAP.put(ImmutablePair.of(Tier.MASTER, Element.FIRE), master_fire_wand);
WAND_MAP.put(ImmutablePair.of(Tier.MASTER, Element.ICE), master_ice_wand);
WAND_MAP.put(ImmutablePair.of(Tier.MASTER, Element.LIGHTNING), master_lightning_wand);
WAND_MAP.put(ImmutablePair.of(Tier.MASTER, Element.NECROMANCY), master_necromancy_wand);
WAND_MAP.put(ImmutablePair.of(Tier.MASTER, Element.EARTH), master_earth_wand);
WAND_MAP.put(ImmutablePair.of(Tier.MASTER, Element.SORCERY), master_sorcery_wand);
WAND_MAP.put(ImmutablePair.of(Tier.MASTER, Element.HEALING), master_healing_wand);
}
public static void populateArmourMap(){
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.HEAD, Element.MAGIC), wizard_hat);
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.HEAD, Element.FIRE), wizard_hat_fire);
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.HEAD, Element.ICE), wizard_hat_ice);
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.HEAD, Element.LIGHTNING), wizard_hat_lightning);
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.HEAD, Element.NECROMANCY), wizard_hat_necromancy);
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.HEAD, Element.EARTH), wizard_hat_earth);
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.HEAD, Element.SORCERY), wizard_hat_sorcery);
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.HEAD, Element.HEALING), wizard_hat_healing);
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.CHEST, Element.MAGIC), wizard_robe);
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.CHEST, Element.FIRE), wizard_robe_fire);
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.CHEST, Element.ICE), wizard_robe_ice);
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.CHEST, Element.LIGHTNING), wizard_robe_lightning);
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.CHEST, Element.NECROMANCY), wizard_robe_necromancy);
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.CHEST, Element.EARTH), wizard_robe_earth);
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.CHEST, Element.SORCERY), wizard_robe_sorcery);
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.CHEST, Element.HEALING), wizard_robe_healing);
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.LEGS, Element.MAGIC), wizard_leggings);
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.LEGS, Element.FIRE), wizard_leggings_fire);
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.LEGS, Element.ICE), wizard_leggings_ice);
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.LEGS, Element.LIGHTNING), wizard_leggings_lightning);
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.LEGS, Element.NECROMANCY), wizard_leggings_necromancy);
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.LEGS, Element.EARTH), wizard_leggings_earth);
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.LEGS, Element.SORCERY), wizard_leggings_sorcery);
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.LEGS, Element.HEALING), wizard_leggings_healing);
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.FEET, Element.MAGIC), wizard_boots);
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.FEET, Element.FIRE), wizard_boots_fire);
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.FEET, Element.ICE), wizard_boots_ice);
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.FEET, Element.LIGHTNING), wizard_boots_lightning);
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.FEET, Element.NECROMANCY), wizard_boots_necromancy);
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.FEET, Element.EARTH), wizard_boots_earth);
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.FEET, Element.SORCERY), wizard_boots_sorcery);
ARMOUR_MAP.put(ImmutablePair.of(EntityEquipmentSlot.FEET, Element.HEALING), wizard_boots_healing);
}
} }
@@ -40,6 +40,9 @@ public final class WizardrySounds {
public static final SoundEvent ITEM_WAND_MELEE = createSound("item.wand.melee"); public static final SoundEvent ITEM_WAND_MELEE = createSound("item.wand.melee");
public static final SoundEvent ITEM_WAND_CHARGEUP = createSound("item.wand.chargeup"); public static final SoundEvent ITEM_WAND_CHARGEUP = createSound("item.wand.chargeup");
public static final SoundEvent ITEM_ARMOUR_EQUIP_SILK = createSound("item.armour.equip_silk"); public static final SoundEvent ITEM_ARMOUR_EQUIP_SILK = createSound("item.armour.equip_silk");
public static final SoundEvent ITEM_ARMOUR_EQUIP_SAGE = createSound("item.armour.equip_sage");
public static final SoundEvent ITEM_ARMOUR_EQUIP_BATTLEMAGE = createSound("item.armour.equip_battlemage");
public static final SoundEvent ITEM_ARMOUR_EQUIP_WARLOCK = createSound("item.armour.equip_warlock");
public static final SoundEvent ITEM_PURIFYING_ELIXIR_DRINK = createSound("item.purifying_elixir.drink"); public static final SoundEvent ITEM_PURIFYING_ELIXIR_DRINK = createSound("item.purifying_elixir.drink");
public static final SoundEvent ITEM_MANA_FLASK_USE = createSound("item.mana_flask.use"); public static final SoundEvent ITEM_MANA_FLASK_USE = createSound("item.mana_flask.use");
public static final SoundEvent ITEM_MANA_FLASK_RECHARGE = createSound("item.mana_flask.recharge"); public static final SoundEvent ITEM_MANA_FLASK_RECHARGE = createSound("item.mana_flask.recharge");
@@ -12,11 +12,13 @@ import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.potion.PotionEffect; import net.minecraft.potion.PotionEffect;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@EventBusSubscriber
public class FontOfMana extends SpellAreaEffect { public class FontOfMana extends SpellAreaEffect {
public FontOfMana(){ public FontOfMana(){
@@ -189,7 +189,9 @@ public class TileEntityArcaneWorkbench extends TileEntity implements IInventory,
}else if(slotNumber == ContainerArcaneWorkbench.UPGRADE_SLOT){ }else if(slotNumber == ContainerArcaneWorkbench.UPGRADE_SLOT){
Set<Item> upgrades = new HashSet<>(WandHelper.getSpecialUpgrades()); Set<Item> upgrades = new HashSet<>(WandHelper.getSpecialUpgrades());
upgrades.add(WizardryItems.arcane_tome); upgrades.add(WizardryItems.arcane_tome);
upgrades.add(WizardryItems.armour_upgrade); upgrades.add(WizardryItems.resplendent_thread);
upgrades.add(WizardryItems.crystal_silver_plating);
upgrades.add(WizardryItems.ethereal_crystalweave);
return upgrades.contains(itemstack.getItem()); return upgrades.contains(itemstack.getItem());
} }
@@ -237,7 +237,7 @@ public class TileEntityImbuementAltar extends TileEntity implements ITickable {
if(Arrays.stream(receptacleElements).distinct().count() == 1 && receptacleElements[0] != null){ // All the same element if(Arrays.stream(receptacleElements).distinct().count() == 1 && receptacleElements[0] != null){ // All the same element
ItemStack result = new ItemStack(WizardryItems.getArmour(receptacleElements[0], ((ItemWizardArmour)input.getItem()).armorType)); ItemStack result = new ItemStack(ItemWizardArmour.getArmour(receptacleElements[0], ((ItemWizardArmour)input.getItem()).armourClass, ((ItemWizardArmour)input.getItem()).armorType));
result.setTagCompound(input.getTagCompound()); result.setTagCompound(input.getTagCompound());
((IManaStoringItem)result.getItem()).setMana(result, ((ItemWizardArmour)input.getItem()).getMana(input)); ((IManaStoringItem)result.getItem()).setMana(result, ((ItemWizardArmour)input.getItem()).getMana(input));
@@ -419,7 +419,7 @@ public final class BlockUtils {
world.setBlockState(pos, Blocks.OBSIDIAN.getDefaultState()); world.setBlockState(pos, Blocks.OBSIDIAN.getDefaultState());
}else if(freezeLava && (block == Blocks.LAVA || block == Blocks.FLOWING_LAVA)){ }else if(freezeLava && (block == Blocks.LAVA || block == Blocks.FLOWING_LAVA)){
world.setBlockState(pos, Blocks.COBBLESTONE.getDefaultState()); world.setBlockState(pos, Blocks.COBBLESTONE.getDefaultState());
}else if(world.getBlockState(pos).getBlock().isReplaceable(world, pos.up()) && Blocks.SNOW_LAYER.canPlaceBlockAt(world, pos.up())){ }else if(canBlockBeReplaced(world, pos.up()) && Blocks.SNOW_LAYER.canPlaceBlockAt(world, pos.up())){
world.setBlockState(pos.up(), Blocks.SNOW_LAYER.getDefaultState()); world.setBlockState(pos.up(), Blocks.SNOW_LAYER.getDefaultState());
}else{ }else{
return false; return false;
@@ -68,6 +68,26 @@ public final class SpellModifiers {
return new SpellModifiers(new HashMap<>(this.multiplierMap), new HashMap<>(this.syncedMultiplierMap)); return new SpellModifiers(new HashMap<>(this.multiplierMap), new HashMap<>(this.syncedMultiplierMap));
} }
/**
* Combines the given SpellModifiers object with this one. More specifically: for each modifier, multiplies the
* values from both objects together and sets it to sync if either object does so. This method changes the object
* it is called on but not the one given as a parameter; apart from this it does not matter which way round the two
* objects are.
* @param modifiers The SpellModifiers object to combine with this one; will not be modified by this method.
* @return The SpellModifiers object, allowing this method to be chained onto the constructor.
*/
public SpellModifiers combine(SpellModifiers modifiers){
for(Entry<String, Float> entry : multiplierMap.entrySet()){
float newValue = entry.getValue() * modifiers.get(entry.getKey());
entry.setValue(newValue);
// Also need to update the synced map if the modifier is synced in either object
if(this.syncedMultiplierMap.containsKey(entry.getKey()) || modifiers.syncedMultiplierMap.containsKey(entry.getKey())){
this.syncedMultiplierMap.put(entry.getKey(), newValue);
}
}
return this;
}
/** /**
* Adds the given multiplier to this SpellModifiers object, using the string identifier that the given wand upgrade * Adds the given multiplier to this SpellModifiers object, using the string identifier that the given wand upgrade
* item was registered with. * item was registered with.
@@ -0,0 +1,309 @@
{
"display": {
"title": {
"translate": "advancement.ebwizardry:battlemage"
},
"description": {
"translate": "advancement.ebwizardry:battlemage.desc"
},
"icon": {
"item": "ebwizardry:battlemage_boots"
},
"frame": "goal"
},
"parent": "ebwizardry:armour_set",
"criteria": {
"head": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_helmet"
}
}
},
"chest": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_chestplate"
}
}
},
"legs": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_leggings"
}
}
},
"feet": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_boots"
}
}
},
"head_fire": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_helmet_fire"
}
}
},
"chest_fire": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_chestplate_fire"
}
}
},
"legs_fire": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_leggings_fire"
}
}
},
"feet_fire": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_boots_fire"
}
}
},
"head_ice": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_helmet_ice"
}
}
},
"chest_ice": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_chestplate_ice"
}
}
},
"legs_ice": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_leggings_ice"
}
}
},
"feet_ice": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_boots_ice"
}
}
},
"head_lightning": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_helmet_lightning"
}
}
},
"chest_lightning": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_chestplate_lightning"
}
}
},
"legs_lightning": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_leggings_lightning"
}
}
},
"feet_lightning": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_boots_lightning"
}
}
},
"head_necromancy": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_helmet_necromancy"
}
}
},
"chest_necromancy": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_chestplate_necromancy"
}
}
},
"legs_necromancy": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_leggings_necromancy"
}
}
},
"feet_necromancy": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_boots_necromancy"
}
}
},
"head_earth": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_helmet_earth"
}
}
},
"chest_earth": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_chestplate_earth"
}
}
},
"legs_earth": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_leggings_earth"
}
}
},
"feet_earth": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_boots_earth"
}
}
},
"head_sorcery": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_helmet_sorcery"
}
}
},
"chest_sorcery": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_chestplate_sorcery"
}
}
},
"legs_sorcery": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_leggings_sorcery"
}
}
},
"feet_sorcery": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_boots_sorcery"
}
}
},
"head_healing": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_helmet_healing"
}
}
},
"chest_healing": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_chestplate_healing"
}
}
},
"legs_healing": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_leggings_healing"
}
}
},
"feet_healing": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:battlemage_boots_healing"
}
}
}
},
"requirements": [
[
"head",
"chest",
"legs",
"feet",
"head_fire",
"chest_fire",
"legs_fire",
"feet_fire",
"head_ice",
"chest_ice",
"legs_ice",
"feet_ice",
"head_lightning",
"chest_lightning",
"legs_lightning",
"feet_lightning",
"head_necromancy",
"chest_necromancy",
"legs_necromancy",
"feet_necromancy",
"head_earth",
"chest_earth",
"legs_earth",
"feet_earth",
"head_sorcery",
"chest_sorcery",
"legs_sorcery",
"feet_sorcery",
"head_healing",
"chest_healing",
"legs_healing",
"feet_healing"
]
]
}
@@ -1,20 +0,0 @@
{
"display": {
"title": {
"translate": "advancement.ebwizardry:legendary"
},
"description": {
"translate": "advancement.ebwizardry:legendary.desc"
},
"icon": {
"item": "ebwizardry:armour_upgrade"
},
"frame": "goal"
},
"parent": "ebwizardry:armour_set",
"criteria": {
"criteria_0": {
"trigger": "ebwizardry:trigger_legendary"
}
}
}
@@ -0,0 +1,309 @@
{
"display": {
"title": {
"translate": "advancement.ebwizardry:sage"
},
"description": {
"translate": "advancement.ebwizardry:sage.desc"
},
"icon": {
"item": "ebwizardry:sage_robe"
},
"frame": "goal"
},
"parent": "ebwizardry:armour_set",
"criteria": {
"head": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_hat"
}
}
},
"chest": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_robe"
}
}
},
"legs": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_leggings"
}
}
},
"feet": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_boots"
}
}
},
"head_fire": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_hat_fire"
}
}
},
"chest_fire": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_robe_fire"
}
}
},
"legs_fire": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_leggings_fire"
}
}
},
"feet_fire": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_boots_fire"
}
}
},
"head_ice": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_hat_ice"
}
}
},
"chest_ice": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_robe_ice"
}
}
},
"legs_ice": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_leggings_ice"
}
}
},
"feet_ice": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_boots_ice"
}
}
},
"head_lightning": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_hat_lightning"
}
}
},
"chest_lightning": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_robe_lightning"
}
}
},
"legs_lightning": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_leggings_lightning"
}
}
},
"feet_lightning": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_boots_lightning"
}
}
},
"head_necromancy": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_hat_necromancy"
}
}
},
"chest_necromancy": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_robe_necromancy"
}
}
},
"legs_necromancy": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_leggings_necromancy"
}
}
},
"feet_necromancy": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_boots_necromancy"
}
}
},
"head_earth": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_hat_earth"
}
}
},
"chest_earth": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_robe_earth"
}
}
},
"legs_earth": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_leggings_earth"
}
}
},
"feet_earth": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_boots_earth"
}
}
},
"head_sorcery": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_hat_sorcery"
}
}
},
"chest_sorcery": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_robe_sorcery"
}
}
},
"legs_sorcery": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_leggings_sorcery"
}
}
},
"feet_sorcery": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_boots_sorcery"
}
}
},
"head_healing": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_hat_healing"
}
}
},
"chest_healing": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_robe_healing"
}
}
},
"legs_healing": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_leggings_healing"
}
}
},
"feet_healing": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:sage_boots_healing"
}
}
}
},
"requirements": [
[
"head",
"chest",
"legs",
"feet",
"head_fire",
"chest_fire",
"legs_fire",
"feet_fire",
"head_ice",
"chest_ice",
"legs_ice",
"feet_ice",
"head_lightning",
"chest_lightning",
"legs_lightning",
"feet_lightning",
"head_necromancy",
"chest_necromancy",
"legs_necromancy",
"feet_necromancy",
"head_earth",
"chest_earth",
"legs_earth",
"feet_earth",
"head_sorcery",
"chest_sorcery",
"legs_sorcery",
"feet_sorcery",
"head_healing",
"chest_healing",
"legs_healing",
"feet_healing"
]
]
}
@@ -0,0 +1,309 @@
{
"display": {
"title": {
"translate": "advancement.ebwizardry:warlock"
},
"description": {
"translate": "advancement.ebwizardry:warlock.desc"
},
"icon": {
"item": "ebwizardry:warlock_hood"
},
"frame": "goal"
},
"parent": "ebwizardry:armour_set",
"criteria": {
"head": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_hood"
}
}
},
"chest": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_robe"
}
}
},
"legs": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_leggings"
}
}
},
"feet": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_boots"
}
}
},
"head_fire": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_hood_fire"
}
}
},
"chest_fire": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_robe_fire"
}
}
},
"legs_fire": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_leggings_fire"
}
}
},
"feet_fire": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_boots_fire"
}
}
},
"head_ice": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_hood_ice"
}
}
},
"chest_ice": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_robe_ice"
}
}
},
"legs_ice": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_leggings_ice"
}
}
},
"feet_ice": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_boots_ice"
}
}
},
"head_lightning": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_hood_lightning"
}
}
},
"chest_lightning": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_robe_lightning"
}
}
},
"legs_lightning": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_leggings_lightning"
}
}
},
"feet_lightning": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_boots_lightning"
}
}
},
"head_necromancy": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_hood_necromancy"
}
}
},
"chest_necromancy": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_robe_necromancy"
}
}
},
"legs_necromancy": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_leggings_necromancy"
}
}
},
"feet_necromancy": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_boots_necromancy"
}
}
},
"head_earth": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_hood_earth"
}
}
},
"chest_earth": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_robe_earth"
}
}
},
"legs_earth": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_leggings_earth"
}
}
},
"feet_earth": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_boots_earth"
}
}
},
"head_sorcery": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_hood_sorcery"
}
}
},
"chest_sorcery": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_robe_sorcery"
}
}
},
"legs_sorcery": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_leggings_sorcery"
}
}
},
"feet_sorcery": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_boots_sorcery"
}
}
},
"head_healing": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_hood_healing"
}
}
},
"chest_healing": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_robe_healing"
}
}
},
"legs_healing": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_leggings_healing"
}
}
},
"feet_healing": {
"trigger": "ebwizardry:arcane_workbench",
"conditions": {
"item": {
"item": "ebwizardry:warlock_boots_healing"
}
}
}
},
"requirements": [
[
"head",
"chest",
"legs",
"feet",
"head_fire",
"chest_fire",
"legs_fire",
"feet_fire",
"head_ice",
"chest_ice",
"legs_ice",
"feet_ice",
"head_lightning",
"chest_lightning",
"legs_lightning",
"feet_lightning",
"head_necromancy",
"chest_necromancy",
"legs_necromancy",
"feet_necromancy",
"head_earth",
"chest_earth",
"legs_earth",
"feet_earth",
"head_sorcery",
"chest_sorcery",
"legs_sorcery",
"feet_sorcery",
"head_healing",
"chest_healing",
"legs_healing",
"feet_healing"
]
]
}
@@ -200,18 +200,32 @@ item.ebwizardry\:identification_scroll.desc=Identifies an unknown spell book or
item.ebwizardry\:identification_scroll.desc_extended=Right-click while holding this scroll to identify the first undiscovered spell book or scroll on your hotbar. item.ebwizardry\:identification_scroll.desc_extended=Right-click while holding this scroll to identify the first undiscovered spell book or scroll on your hotbar.
item.ebwizardry\:identification_scroll.nothing_to_identify=Nothing to identify! item.ebwizardry\:identification_scroll.nothing_to_identify=Nothing to identify!
item.ebwizardry\:armour_upgrade.name=Arcane Seal of Protection item.ebwizardry\:resplendent_thread.name=Resplendent Thread
item.ebwizardry\:armour_upgrade.desc=Upgrades any wizard armour to make it %1$slegendary item.ebwizardry\:resplendent_thread.desc=Upgrades regular wizard armour into sage armour
item.ebwizardry\:armour_upgrade.desc_extended=Apply this upgrade to a piece of wizard armour in the arcane workbench. item.ebwizardry\:resplendent_thread.desc_extended=A shimmering silken thread used to embroider the finest robes with arcane symbols, improving their enchantability.\n\nApply this upgrade to a piece of wizard armour in the arcane workbench.
item.ebwizardry\:crystal_silver_plating.name=Crystal Silver Plating
item.ebwizardry\:crystal_silver_plating.desc=Upgrades regular wizard armour into battlemage armour
item.ebwizardry\:crystal_silver_plating.desc_extended=An almost mythical alloy forged in the foundries of Eldar, with exceptional magic deflection properties.\n\nApply this upgrade to a piece of wizard armour in the arcane workbench.
item.ebwizardry\:ethereal_crystalweave.name=Ethereal Crystalweave
item.ebwizardry\:ethereal_crystalweave.desc=Upgrades regular wizard armour into warlock armour
item.ebwizardry\:ethereal_crystalweave.desc_extended=An enchanted fabric that is as thick as animal hide, yet somehow feels lighter than paper in one's hands.\n\nApply this upgrade to a piece of wizard armour in the arcane workbench.
item.ebwizardry\:magic_silk.name=Magical Silk item.ebwizardry\:magic_silk.name=Magical Silk
item.ebwizardry\:spectral_dust.name=Spectral Dust item.ebwizardry\:spectral_dust.name=Spectral Dust
item.ebwizardry\:wizard_armour.legendary=Legendary item.ebwizardry\:wizard_armour.element_cost_reduction=-%1$s%% %2$s cost
item.ebwizardry\:wizard_armour.buff=-%1$s%% %2$s cost item.ebwizardry\:wizard_armour.cooldown_reduction=-%1$s%% Cooldown
item.ebwizardry\:wizard_armour.enchantability=Extra enchantability
item.ebwizardry\:wizard_armour.mana=Mana\: %1$s/%2$s item.ebwizardry\:wizard_armour.mana=Mana\: %1$s/%2$s
item.ebwizardry\:wizard_armour.full_set=Full set:
item.ebwizardry\:sage_armour.full_set_bonus=-%1$s%% Other element cost
item.ebwizardry\:battlemage_armour.full_set_bonus=Ward I effect
item.ebwizardry\:warlock_armour.full_set_bonus=+%1$s%% Movement speed
item.ebwizardry\:wizard_hat.name=Wizard Hat item.ebwizardry\:wizard_hat.name=Wizard Hat
item.ebwizardry\:wizard_robe.name=Wizard Robes item.ebwizardry\:wizard_robe.name=Wizard Robes
item.ebwizardry\:wizard_leggings.name=Wizard Leggings item.ebwizardry\:wizard_leggings.name=Wizard Leggings
@@ -252,6 +266,126 @@ item.ebwizardry\:wizard_robe_healing.name=Healer Robes
item.ebwizardry\:wizard_leggings_healing.name=Healer Leggings item.ebwizardry\:wizard_leggings_healing.name=Healer Leggings
item.ebwizardry\:wizard_boots_healing.name=Healer Boots item.ebwizardry\:wizard_boots_healing.name=Healer Boots
item.ebwizardry\:sage_hat.name=Sage Hat
item.ebwizardry\:sage_robe.name=Sage Robes
item.ebwizardry\:sage_leggings.name=Sage Leggings
item.ebwizardry\:sage_boots.name=Sage Boots
item.ebwizardry\:sage_hat_fire.name=Pyromancer Sage Hat
item.ebwizardry\:sage_robe_fire.name=Pyromancer Sage Robes
item.ebwizardry\:sage_leggings_fire.name=Pyromancer Sage Leggings
item.ebwizardry\:sage_boots_fire.name=Pyromancer Sage Boots
item.ebwizardry\:sage_hat_ice.name=Ice Sage Hat
item.ebwizardry\:sage_robe_ice.name=Ice Sage Robes
item.ebwizardry\:sage_leggings_ice.name=Ice Sage Leggings
item.ebwizardry\:sage_boots_ice.name=Ice Sage Boots
item.ebwizardry\:sage_hat_lightning.name=Storm Sage Hat
item.ebwizardry\:sage_robe_lightning.name=Storm Sage Robes
item.ebwizardry\:sage_leggings_lightning.name=Storm Sage Leggings
item.ebwizardry\:sage_boots_lightning.name=Storm Sage Boots
item.ebwizardry\:sage_hat_necromancy.name=Necromancer Sage Hat
item.ebwizardry\:sage_robe_necromancy.name=Necromancer Sage Robes
item.ebwizardry\:sage_leggings_necromancy.name=Necromancer Sage Leggings
item.ebwizardry\:sage_boots_necromancy.name=Necromancer Sage Boots
item.ebwizardry\:sage_hat_earth.name=Earth Sage Hat
item.ebwizardry\:sage_robe_earth.name=Earth Sage Robes
item.ebwizardry\:sage_leggings_earth.name=Earth Sage Leggings
item.ebwizardry\:sage_boots_earth.name=Earth Sage Boots
item.ebwizardry\:sage_hat_sorcery.name=Sorcerer Sage Hat
item.ebwizardry\:sage_robe_sorcery.name=Sorcerer Sage Robes
item.ebwizardry\:sage_leggings_sorcery.name=Sorcerer Sage Leggings
item.ebwizardry\:sage_boots_sorcery.name=Sorcerer Sage Boots
item.ebwizardry\:sage_hat_healing.name=Healer Sage Hat
item.ebwizardry\:sage_robe_healing.name=Healer Sage Robes
item.ebwizardry\:sage_leggings_healing.name=Healer Sage Leggings
item.ebwizardry\:sage_boots_healing.name=Healer Sage Boots
item.ebwizardry\:battlemage_helmet.name=Battlemage Helmet
item.ebwizardry\:battlemage_chestplate.name=Battlemage Chestplate
item.ebwizardry\:battlemage_leggings.name=Battlemage Leggings
item.ebwizardry\:battlemage_boots.name=Battlemage Boots
item.ebwizardry\:battlemage_helmet_fire.name=Pyromancer Battlemage Helmet
item.ebwizardry\:battlemage_chestplate_fire.name=Pyromancer Battlemage Chestplate
item.ebwizardry\:battlemage_leggings_fire.name=Pyromancer Battlemage Leggings
item.ebwizardry\:battlemage_boots_fire.name=Pyromancer Battlemage Boots
item.ebwizardry\:battlemage_helmet_ice.name=Ice Battlemage Helmet
item.ebwizardry\:battlemage_chestplate_ice.name=Ice Battlemage Chestplate
item.ebwizardry\:battlemage_leggings_ice.name=Ice Battlemage Leggings
item.ebwizardry\:battlemage_boots_ice.name=Ice Battlemage Boots
item.ebwizardry\:battlemage_helmet_lightning.name=Storm Battlemage Helmet
item.ebwizardry\:battlemage_chestplate_lightning.name=Storm Battlemage Chestplate
item.ebwizardry\:battlemage_leggings_lightning.name=Storm Battlemage Leggings
item.ebwizardry\:battlemage_boots_lightning.name=Storm Battlemage Boots
item.ebwizardry\:battlemage_helmet_necromancy.name=Necromancer Battlemage Helmet
item.ebwizardry\:battlemage_chestplate_necromancy.name=Necromancer Battlemage Chestplate
item.ebwizardry\:battlemage_leggings_necromancy.name=Necromancer Battlemage Leggings
item.ebwizardry\:battlemage_boots_necromancy.name=Necromancer Battlemage Boots
item.ebwizardry\:battlemage_helmet_earth.name=Earth Battlemage Helmet
item.ebwizardry\:battlemage_chestplate_earth.name=Earth Battlemage Chestplate
item.ebwizardry\:battlemage_leggings_earth.name=Earth Battlemage Leggings
item.ebwizardry\:battlemage_boots_earth.name=Earth Battlemage Boots
item.ebwizardry\:battlemage_helmet_sorcery.name=Sorcerer Battlemage Helmet
item.ebwizardry\:battlemage_chestplate_sorcery.name=Sorcerer Battlemage Chestplate
item.ebwizardry\:battlemage_leggings_sorcery.name=Sorcerer Battlemage Leggings
item.ebwizardry\:battlemage_boots_sorcery.name=Sorcerer Battlemage Boots
item.ebwizardry\:battlemage_helmet_healing.name=Healer Battlemage Helmet
item.ebwizardry\:battlemage_chestplate_healing.name=Healer Battlemage Chestplate
item.ebwizardry\:battlemage_leggings_healing.name=Healer Battlemage Leggings
item.ebwizardry\:battlemage_boots_healing.name=Healer Battlemage Boots
item.ebwizardry\:warlock_hood.name=Warlock Hood
item.ebwizardry\:warlock_robe.name=Warlock Robes
item.ebwizardry\:warlock_leggings.name=Warlock Leggings
item.ebwizardry\:warlock_boots.name=Warlock Boots
item.ebwizardry\:warlock_hood_fire.name=Pyromancer Warlock Hood
item.ebwizardry\:warlock_robe_fire.name=Pyromancer Warlock Robes
item.ebwizardry\:warlock_leggings_fire.name=Pyromancer Warlock Leggings
item.ebwizardry\:warlock_boots_fire.name=Pyromancer Warlock Boots
item.ebwizardry\:warlock_hood_ice.name=Ice Warlock Hood
item.ebwizardry\:warlock_robe_ice.name=Ice Warlock Robes
item.ebwizardry\:warlock_leggings_ice.name=Ice Warlock Leggings
item.ebwizardry\:warlock_boots_ice.name=Ice Warlock Boots
item.ebwizardry\:warlock_hood_lightning.name=Storm Warlock Hood
item.ebwizardry\:warlock_robe_lightning.name=Storm Warlock Robes
item.ebwizardry\:warlock_leggings_lightning.name=Storm Warlock Leggings
item.ebwizardry\:warlock_boots_lightning.name=Storm Warlock Boots
item.ebwizardry\:warlock_hood_necromancy.name=Necromancer Warlock Hood
item.ebwizardry\:warlock_robe_necromancy.name=Necromancer Warlock Robes
item.ebwizardry\:warlock_leggings_necromancy.name=Necromancer Warlock Leggings
item.ebwizardry\:warlock_boots_necromancy.name=Necromancer Warlock Boots
item.ebwizardry\:warlock_hood_earth.name=Earth Warlock Hood
item.ebwizardry\:warlock_robe_earth.name=Earth Warlock Robes
item.ebwizardry\:warlock_leggings_earth.name=Earth Warlock Leggings
item.ebwizardry\:warlock_boots_earth.name=Earth Warlock Boots
item.ebwizardry\:warlock_hood_sorcery.name=Sorcerer Warlock Hood
item.ebwizardry\:warlock_robe_sorcery.name=Sorcerer Warlock Robes
item.ebwizardry\:warlock_leggings_sorcery.name=Sorcerer Warlock Leggings
item.ebwizardry\:warlock_boots_sorcery.name=Sorcerer Warlock Boots
item.ebwizardry\:warlock_hood_healing.name=Healer Warlock Hood
item.ebwizardry\:warlock_robe_healing.name=Healer Warlock Robes
item.ebwizardry\:warlock_leggings_healing.name=Healer Warlock Leggings
item.ebwizardry\:warlock_boots_healing.name=Healer Warlock Boots
item.ebwizardry\:spawn_wizard.name=Spawn Wizard item.ebwizardry\:spawn_wizard.name=Spawn Wizard
item.ebwizardry\:spawn_evil_wizard.name=Spawn Evil Wizard item.ebwizardry\:spawn_evil_wizard.name=Spawn Evil Wizard
@@ -711,8 +845,12 @@ advancement.ebwizardry\:craft_lectern.desc=Craft a lectern to keep track of your
advancement.ebwizardry\:armour_set=Now You're A Proper Wizard advancement.ebwizardry\:armour_set=Now You're A Proper Wizard
advancement.ebwizardry\:armour_set.desc=Craft and equip a full set of wizard armour advancement.ebwizardry\:armour_set.desc=Craft and equip a full set of wizard armour
advancement.ebwizardry\:legendary=Legendary advancement.ebwizardry\:sage=The Path Of The Sage
advancement.ebwizardry\:legendary.desc=Obtain a piece of legendary wizard armour advancement.ebwizardry\:sage.desc=Obtain a piece of sage armour
advancement.ebwizardry\:battlemage=The Pledge Of The Battlemage
advancement.ebwizardry\:battlemage.desc=Obtain a piece of battlemage armour
advancement.ebwizardry\:warlock=The Way Of The Warlock
advancement.ebwizardry\:warlock.desc=Obtain a piece of warlock armour
advancement.ebwizardry\:enchant_scroll=Scroll Up! advancement.ebwizardry\:enchant_scroll=Scroll Up!
advancement.ebwizardry\:enchant_scroll.desc=Craft a blank scroll and enchant it with a spell at an arcane workbench advancement.ebwizardry\:enchant_scroll.desc=Craft a blank scroll and enchant it with a spell at an arcane workbench
@@ -1336,6 +1474,8 @@ commands.ebwizardry\:discoverspell.removespell=Removed %1$s from %2$s's spell di
config.ebwizardry.title.general=Mod Options config.ebwizardry.title.general=Mod Options
config.ebwizardry.redundant_keys=Your config file contains redundant options, these will not do anything! [See log for details]
config.ebwizardry.generic.true=Enabled config.ebwizardry.generic.true=Enabled
config.ebwizardry.generic.false=Disabled config.ebwizardry.generic.false=Disabled
@@ -200,18 +200,32 @@ item.ebwizardry\:identification_scroll.desc=Identifies an unknown spell book or
item.ebwizardry\:identification_scroll.desc_extended=Right-click while holding this scroll to identify the first undiscovered spell book or scroll on your hotbar. item.ebwizardry\:identification_scroll.desc_extended=Right-click while holding this scroll to identify the first undiscovered spell book or scroll on your hotbar.
item.ebwizardry\:identification_scroll.nothing_to_identify=Nothing to identify! item.ebwizardry\:identification_scroll.nothing_to_identify=Nothing to identify!
item.ebwizardry\:armour_upgrade.name=Arcane Seal of Protection item.ebwizardry\:resplendent_thread.name=Resplendent Thread
item.ebwizardry\:armour_upgrade.desc=Upgrades any wizard armour to make it %1$slegendary item.ebwizardry\:resplendent_thread.desc=Upgrades regular wizard armor into sage armor
item.ebwizardry\:armour_upgrade.desc_extended=Apply this upgrade to a piece of wizard armour in the arcane workbench. item.ebwizardry\:resplendent_thread.desc_extended=A shimmering silken thread used to embroider the finest robes with arcane symbols, improving their enchantability.\n\nApply this upgrade to a piece of wizard armor in the arcane workbench.
item.ebwizardry\:crystal_silver_plating.name=Crystal Silver Plating
item.ebwizardry\:crystal_silver_plating.desc=Upgrades regular wizard armor into battlemage armor
item.ebwizardry\:crystal_silver_plating.desc_extended=An almost mythical alloy forged in the foundries of Eldar, with exceptional magic deflection properties.\n\nApply this upgrade to a piece of wizard armor in the arcane workbench.
item.ebwizardry\:ethereal_crystalweave.name=Ethereal Crystalweave
item.ebwizardry\:ethereal_crystalweave.desc=Upgrades regular wizard armor into warlock armor
item.ebwizardry\:ethereal_crystalweave.desc_extended=An enchanted fabric that is as thick as animal hide, yet somehow feels lighter than paper in one's hands.\n\nApply this upgrade to a piece of wizard armor in the arcane workbench.
item.ebwizardry\:magic_silk.name=Magical Silk item.ebwizardry\:magic_silk.name=Magical Silk
item.ebwizardry\:spectral_dust.name=Spectral Dust item.ebwizardry\:spectral_dust.name=Spectral Dust
item.ebwizardry\:wizard_armour.legendary=Legendary item.ebwizardry\:wizard_armour.element_cost_reduction=-%1$s%% %2$s cost
item.ebwizardry\:wizard_armour.buff=-%1$s%% %2$s cost item.ebwizardry\:wizard_armour.cooldown_reduction=-%1$s%% Cooldown
item.ebwizardry\:wizard_armour.enchantability=Extra enchantability
item.ebwizardry\:wizard_armour.mana=Mana\: %1$s/%2$s item.ebwizardry\:wizard_armour.mana=Mana\: %1$s/%2$s
item.ebwizardry\:wizard_armour.full_set=Full set:
item.ebwizardry\:sage_armour.full_set_bonus=-%1$s%% Other element cost
item.ebwizardry\:battlemage_armour.full_set_bonus=Ward I effect
item.ebwizardry\:warlock_armour.full_set_bonus=+%1$s%% Movement speed
item.ebwizardry\:wizard_hat.name=Wizard Hat item.ebwizardry\:wizard_hat.name=Wizard Hat
item.ebwizardry\:wizard_robe.name=Wizard Robes item.ebwizardry\:wizard_robe.name=Wizard Robes
item.ebwizardry\:wizard_leggings.name=Wizard Leggings item.ebwizardry\:wizard_leggings.name=Wizard Leggings
@@ -252,6 +266,126 @@ item.ebwizardry\:wizard_robe_healing.name=Healer Robes
item.ebwizardry\:wizard_leggings_healing.name=Healer Leggings item.ebwizardry\:wizard_leggings_healing.name=Healer Leggings
item.ebwizardry\:wizard_boots_healing.name=Healer Boots item.ebwizardry\:wizard_boots_healing.name=Healer Boots
item.ebwizardry\:sage_hat.name=Sage Hat
item.ebwizardry\:sage_robe.name=Sage Robes
item.ebwizardry\:sage_leggings.name=Sage Leggings
item.ebwizardry\:sage_boots.name=Sage Boots
item.ebwizardry\:sage_hat_fire.name=Pyromancer Sage Hat
item.ebwizardry\:sage_robe_fire.name=Pyromancer Sage Robes
item.ebwizardry\:sage_leggings_fire.name=Pyromancer Sage Leggings
item.ebwizardry\:sage_boots_fire.name=Pyromancer Sage Boots
item.ebwizardry\:sage_hat_ice.name=Ice Sage Hat
item.ebwizardry\:sage_robe_ice.name=Ice Sage Robes
item.ebwizardry\:sage_leggings_ice.name=Ice Sage Leggings
item.ebwizardry\:sage_boots_ice.name=Ice Sage Boots
item.ebwizardry\:sage_hat_lightning.name=Storm Sage Hat
item.ebwizardry\:sage_robe_lightning.name=Storm Sage Robes
item.ebwizardry\:sage_leggings_lightning.name=Storm Sage Leggings
item.ebwizardry\:sage_boots_lightning.name=Storm Sage Boots
item.ebwizardry\:sage_hat_necromancy.name=Necromancer Sage Hat
item.ebwizardry\:sage_robe_necromancy.name=Necromancer Sage Robes
item.ebwizardry\:sage_leggings_necromancy.name=Necromancer Sage Leggings
item.ebwizardry\:sage_boots_necromancy.name=Necromancer Sage Boots
item.ebwizardry\:sage_hat_earth.name=Earth Sage Hat
item.ebwizardry\:sage_robe_earth.name=Earth Sage Robes
item.ebwizardry\:sage_leggings_earth.name=Earth Sage Leggings
item.ebwizardry\:sage_boots_earth.name=Earth Sage Boots
item.ebwizardry\:sage_hat_sorcery.name=Sorcerer Sage Hat
item.ebwizardry\:sage_robe_sorcery.name=Sorcerer Sage Robes
item.ebwizardry\:sage_leggings_sorcery.name=Sorcerer Sage Leggings
item.ebwizardry\:sage_boots_sorcery.name=Sorcerer Sage Boots
item.ebwizardry\:sage_hat_healing.name=Healer Sage Hat
item.ebwizardry\:sage_robe_healing.name=Healer Sage Robes
item.ebwizardry\:sage_leggings_healing.name=Healer Sage Leggings
item.ebwizardry\:sage_boots_healing.name=Healer Sage Boots
item.ebwizardry\:battlemage_helmet.name=Battlemage Helmet
item.ebwizardry\:battlemage_chestplate.name=Battlemage Chestplate
item.ebwizardry\:battlemage_leggings.name=Battlemage Leggings
item.ebwizardry\:battlemage_boots.name=Battlemage Boots
item.ebwizardry\:battlemage_helmet_fire.name=Pyromancer Battlemage Helmet
item.ebwizardry\:battlemage_chestplate_fire.name=Pyromancer Battlemage Chestplate
item.ebwizardry\:battlemage_leggings_fire.name=Pyromancer Battlemage Leggings
item.ebwizardry\:battlemage_boots_fire.name=Pyromancer Battlemage Boots
item.ebwizardry\:battlemage_helmet_ice.name=Ice Battlemage Helmet
item.ebwizardry\:battlemage_chestplate_ice.name=Ice Battlemage Chestplate
item.ebwizardry\:battlemage_leggings_ice.name=Ice Battlemage Leggings
item.ebwizardry\:battlemage_boots_ice.name=Ice Battlemage Boots
item.ebwizardry\:battlemage_helmet_lightning.name=Storm Battlemage Helmet
item.ebwizardry\:battlemage_chestplate_lightning.name=Storm Battlemage Chestplate
item.ebwizardry\:battlemage_leggings_lightning.name=Storm Battlemage Leggings
item.ebwizardry\:battlemage_boots_lightning.name=Storm Battlemage Boots
item.ebwizardry\:battlemage_helmet_necromancy.name=Necromancer Battlemage Helmet
item.ebwizardry\:battlemage_chestplate_necromancy.name=Necromancer Battlemage Chestplate
item.ebwizardry\:battlemage_leggings_necromancy.name=Necromancer Battlemage Leggings
item.ebwizardry\:battlemage_boots_necromancy.name=Necromancer Battlemage Boots
item.ebwizardry\:battlemage_helmet_earth.name=Earth Battlemage Helmet
item.ebwizardry\:battlemage_chestplate_earth.name=Earth Battlemage Chestplate
item.ebwizardry\:battlemage_leggings_earth.name=Earth Battlemage Leggings
item.ebwizardry\:battlemage_boots_earth.name=Earth Battlemage Boots
item.ebwizardry\:battlemage_helmet_sorcery.name=Sorcerer Battlemage Helmet
item.ebwizardry\:battlemage_chestplate_sorcery.name=Sorcerer Battlemage Chestplate
item.ebwizardry\:battlemage_leggings_sorcery.name=Sorcerer Battlemage Leggings
item.ebwizardry\:battlemage_boots_sorcery.name=Sorcerer Battlemage Boots
item.ebwizardry\:battlemage_helmet_healing.name=Healer Battlemage Helmet
item.ebwizardry\:battlemage_chestplate_healing.name=Healer Battlemage Chestplate
item.ebwizardry\:battlemage_leggings_healing.name=Healer Battlemage Leggings
item.ebwizardry\:battlemage_boots_healing.name=Healer Battlemage Boots
item.ebwizardry\:warlock_hood.name=Warlock Hood
item.ebwizardry\:warlock_robe.name=Warlock Robes
item.ebwizardry\:warlock_leggings.name=Warlock Leggings
item.ebwizardry\:warlock_boots.name=Warlock Boots
item.ebwizardry\:warlock_hood_fire.name=Pyromancer Warlock Hood
item.ebwizardry\:warlock_robe_fire.name=Pyromancer Warlock Robes
item.ebwizardry\:warlock_leggings_fire.name=Pyromancer Warlock Leggings
item.ebwizardry\:warlock_boots_fire.name=Pyromancer Warlock Boots
item.ebwizardry\:warlock_hood_ice.name=Ice Warlock Hood
item.ebwizardry\:warlock_robe_ice.name=Ice Warlock Robes
item.ebwizardry\:warlock_leggings_ice.name=Ice Warlock Leggings
item.ebwizardry\:warlock_boots_ice.name=Ice Warlock Boots
item.ebwizardry\:warlock_hood_lightning.name=Storm Warlock Hood
item.ebwizardry\:warlock_robe_lightning.name=Storm Warlock Robes
item.ebwizardry\:warlock_leggings_lightning.name=Storm Warlock Leggings
item.ebwizardry\:warlock_boots_lightning.name=Storm Warlock Boots
item.ebwizardry\:warlock_hood_necromancy.name=Necromancer Warlock Hood
item.ebwizardry\:warlock_robe_necromancy.name=Necromancer Warlock Robes
item.ebwizardry\:warlock_leggings_necromancy.name=Necromancer Warlock Leggings
item.ebwizardry\:warlock_boots_necromancy.name=Necromancer Warlock Boots
item.ebwizardry\:warlock_hood_earth.name=Earth Warlock Hood
item.ebwizardry\:warlock_robe_earth.name=Earth Warlock Robes
item.ebwizardry\:warlock_leggings_earth.name=Earth Warlock Leggings
item.ebwizardry\:warlock_boots_earth.name=Earth Warlock Boots
item.ebwizardry\:warlock_hood_sorcery.name=Sorcerer Warlock Hood
item.ebwizardry\:warlock_robe_sorcery.name=Sorcerer Warlock Robes
item.ebwizardry\:warlock_leggings_sorcery.name=Sorcerer Warlock Leggings
item.ebwizardry\:warlock_boots_sorcery.name=Sorcerer Warlock Boots
item.ebwizardry\:warlock_hood_healing.name=Healer Warlock Hood
item.ebwizardry\:warlock_robe_healing.name=Healer Warlock Robes
item.ebwizardry\:warlock_leggings_healing.name=Healer Warlock Leggings
item.ebwizardry\:warlock_boots_healing.name=Healer Warlock Boots
item.ebwizardry\:spawn_wizard.name=Spawn Wizard item.ebwizardry\:spawn_wizard.name=Spawn Wizard
item.ebwizardry\:spawn_evil_wizard.name=Spawn Evil Wizard item.ebwizardry\:spawn_evil_wizard.name=Spawn Evil Wizard
@@ -711,8 +845,12 @@ advancement.ebwizardry\:craft_lectern.desc=Craft a lectern to keep track of your
advancement.ebwizardry\:armour_set=Now You're A Proper Wizard advancement.ebwizardry\:armour_set=Now You're A Proper Wizard
advancement.ebwizardry\:armour_set.desc=Craft and equip a full set of wizard armor advancement.ebwizardry\:armour_set.desc=Craft and equip a full set of wizard armor
advancement.ebwizardry\:legendary=Legendary advancement.ebwizardry\:sage=The Path Of The Sage
advancement.ebwizardry\:legendary.desc=Obtain a piece of legendary wizard armor advancement.ebwizardry\:sage.desc=Obtain a piece of sage armour
advancement.ebwizardry\:battlemage=The Pledge Of The Battlemage
advancement.ebwizardry\:battlemage.desc=Obtain a piece of battlemage armour
advancement.ebwizardry\:warlock=The Way Of The Warlock
advancement.ebwizardry\:warlock.desc=Obtain a piece of warlock armour
advancement.ebwizardry\:enchant_scroll=Scroll Up! advancement.ebwizardry\:enchant_scroll=Scroll Up!
advancement.ebwizardry\:enchant_scroll.desc=Craft a blank scroll and enchant it with a spell at an arcane workbench advancement.ebwizardry\:enchant_scroll.desc=Craft a blank scroll and enchant it with a spell at an arcane workbench
@@ -1336,6 +1474,8 @@ commands.ebwizardry\:discoverspell.removespell=Removed %1$s from %2$s's spell di
config.ebwizardry.title.general=Mod Options config.ebwizardry.title.general=Mod Options
config.ebwizardry.redundant_keys=Your config file contains redundant options, these will not do anything! [See log for details]
config.ebwizardry.generic.true=Enabled config.ebwizardry.generic.true=Enabled
config.ebwizardry.generic.false=Disabled config.ebwizardry.generic.false=Disabled
File diff suppressed because it is too large Load Diff
@@ -95,11 +95,6 @@
"name": "ebwizardry:spark_bomb", "name": "ebwizardry:spark_bomb",
"weight": 8 "weight": 8
}, },
{
"type": "item",
"name": "ebwizardry:armour_upgrade",
"weight": 1
},
{ {
"type": "item", "type": "item",
"name": "ebwizardry:astral_diamond", "name": "ebwizardry:astral_diamond",
@@ -17,6 +17,11 @@
"name": "ebwizardry:subsets/wand_upgrades", "name": "ebwizardry:subsets/wand_upgrades",
"weight": 2 "weight": 2
}, },
{
"type": "loot_table",
"name": "ebwizardry:subsets/armour_upgrades",
"weight": 1
},
{ {
"type": "item", "type": "item",
"name": "ebwizardry:spell_book", "name": "ebwizardry:spell_book",
@@ -38,6 +38,11 @@
"name": "ebwizardry:subsets/wand_upgrades", "name": "ebwizardry:subsets/wand_upgrades",
"weight": 4 "weight": 4
}, },
{
"type": "loot_table",
"name": "ebwizardry:subsets/armour_upgrades",
"weight": 2
},
{ {
"type": "item", "type": "item",
"name": "ebwizardry:spell_book", "name": "ebwizardry:spell_book",
@@ -100,11 +105,6 @@
} }
] ]
}, },
{
"type": "item",
"name": "ebwizardry:armour_upgrade",
"weight": 1
},
{ {
"type": "item", "type": "item",
"name": "ebwizardry:astral_diamond", "name": "ebwizardry:astral_diamond",
@@ -27,6 +27,11 @@
"name": "ebwizardry:subsets/wand_upgrades", "name": "ebwizardry:subsets/wand_upgrades",
"weight": 2 "weight": 2
}, },
{
"type": "loot_table",
"name": "ebwizardry:subsets/armour_upgrades",
"weight": 2
},
{ {
"type": "item", "type": "item",
"name": "ebwizardry:magic_crystal", "name": "ebwizardry:magic_crystal",
@@ -70,11 +75,6 @@
} }
] ]
}, },
{
"type": "item",
"name": "ebwizardry:armour_upgrade",
"weight": 1
},
{ {
"type": "item", "type": "item",
"name": "ebwizardry:identification_scroll", "name": "ebwizardry:identification_scroll",
@@ -0,0 +1,25 @@
{
"pools": [
{
"name": "upgrades",
"rolls": 1,
"entries": [
{
"type": "item",
"name": "ebwizardry:resplendent_thread",
"weight": 1
},
{
"type": "item",
"name": "ebwizardry:crystal_silver_plating",
"weight": 1
},
{
"type": "item",
"name": "ebwizardry:ethereal_crystalweave",
"weight": 1
}
]
}
]
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_boots"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_boots_earth"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_boots_fire"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_boots_healing"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_boots_ice"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_boots_lightning"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_boots_necromancy"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_boots_sorcery"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_chestplate"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_chestplate_earth"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_chestplate_fire"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_chestplate_healing"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_chestplate_ice"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_chestplate_lightning"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_chestplate_necromancy"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_chestplate_sorcery"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_helmet"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_helmet_earth"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_helmet_fire"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_helmet_healing"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_helmet_ice"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_helmet_lightning"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_helmet_necromancy"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_helmet_sorcery"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_leggings"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_leggings_earth"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_leggings_fire"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_leggings_healing"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_leggings_ice"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_leggings_lightning"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_leggings_necromancy"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/battlemage_leggings_sorcery"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/crystal_silver_plating"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/ethereal_crystalweave"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/resplendent_thread"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/sage_boots"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/sage_boots_earth"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/sage_boots_fire"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/sage_boots_healing"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/sage_boots_ice"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/sage_boots_lightning"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/sage_boots_necromancy"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/sage_boots_sorcery"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/sage_hat"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/sage_hat_earth"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/sage_hat_fire"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/sage_hat_healing"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/sage_hat_ice"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/sage_hat_lightning"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/sage_hat_necromancy"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/sage_hat_sorcery"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/sage_leggings"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/sage_leggings_earth"
}
}
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "ebwizardry:items/sage_leggings_fire"
}
}

Some files were not shown because too many files have changed in this diff Show More