Compare commits

..

73 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
Electroblob77 0e815c676d Fix conjured items not disappearing in offhand (actually fixes #493) 2021-01-04 00:18:37 +00:00
Electroblob77 f81ad670ed Change donation perk element sync to per-dimension and use EntityJoinWorldEvent instead of PlayerLoggedInEvent, fixes #541 2021-01-03 23:42:27 +00:00
Electroblob77 5b3aebaba1 Update version number 2021-01-03 23:40:57 +00:00
Electroblob77 3ef1afce2f Update credits 2021-01-03 23:27:53 +00:00
Electroblob77 a3c15d673b Set arcane lock data server-side and sync the tile entity properly, fixes #580 2021-01-03 23:18:20 +00:00
Electroblob77 d8f1c5f77c Merge branch '1.12.2' of https://github.com/Electroblob77/Wizardry into 1.12.2 2021-01-01 23:26:43 +00:00
Electroblob77 1ddcdafe50 Fix the utter mess that is spell property syncing (what was I thinking when I wrote this? and how did it ever work in the first place?!)
This fix is kinda cheating but I don't care, it works and it's certainly better than the mess that was there before
2021-01-01 23:26:24 +00:00
Electroblob 3c35eaaf54 Merge pull request #584 from SettingDust/bugfix/lighting-web-concurrent-modification
Try to fix lighting web concurrent modification
2020-12-21 16:39:15 +00:00
SettingDust 094ce5a427 Try to fix #513 #567
Try to fix  ConcurrentModificationException in LightningWeb
2020-12-21 22:38:15 +08:00
Electroblob77 e19d324dca Include offhand inventory in imbued item updating (and armour, while we're at it), fixes #493 2020-12-20 23:32:12 +00:00
Electroblob77 58f6d55b0d Add timeout when crystal flower charm's effect activates to prevent infinite looping when mod plants don't behave, fixes #488 2020-12-20 23:29:05 +00:00
Electroblob77 32e92b4b04 Guard against null element in writeEntityToNBT for wizards and evil wizards, fixes #491 2020-12-20 23:24:30 +00:00
Electroblob77 24a06e0bac Change dire wolf pelt's effect from different marker colours to different marker shapes 2020-12-20 23:12:27 +00:00
Electroblob77 ae9da5b7c1 Query the position using the block at that position, not the one below... 🤦Fixes #519. 2020-12-20 19:13:41 +00:00
Electroblob77 2e39a8bfc1 Remove spaces around hyperlinks in Chinese handbook translation file, fixes #527 2020-12-20 19:02:34 +00:00
Electroblob77 e3130ca936 Cleanup 2020-12-20 18:57:23 +00:00
Electroblob 378e19a614 Add translation tips for languages without spaces 2020-12-20 18:45:27 +00:00
Electroblob77 e2fd978d8b Catch NPEs when accessing IBakedModel#getOverrides from ModelBakeEvent, fixes #537 2020-12-20 17:07:58 +00:00
Electroblob77 8f8ce7a453 Populate model lists in PlayerAnimator when a new player renderer is found, fixes #551
Also adds the missing null check to RenderPlayerPostEvent, just in case
2020-12-20 14:45:20 +00:00
Electroblob77 ddfffd3d31 Guard against IOOBEs when rendering the new spell trade icon, fixes #565 2020-12-20 00:16:17 +00:00
Electroblob77 d23c15476a Guard against null spell HUD skins in all places, fixes #566 2020-12-20 00:10:16 +00:00
Electroblob77 55bb40a684 Copy contents of imbuement altar to new tile entity when activated or deactivated, fixes #576 2020-12-20 00:02:10 +00:00
Electroblob77 c056c490da Update credits 2020-12-19 23:47:46 +00:00
Electroblob77 c483591ea8 Merge branch '1.12.2' of https://github.com/Electroblob77/Wizardry into 1.12.2
# Conflicts:
#	src/main/resources/assets/ebwizardry/lang/ru_ru.lang
2020-12-19 23:41:22 +00:00
Electroblob77 4c3dfb3bc9 Update Russian translations, courtesy of DrHesperus 2020-12-19 23:34:02 +00:00
Electroblob77 0010fafc13 Update German translations, courtesy of Lemopav 2020-12-19 23:25:38 +00:00
Electroblob77 f4cf98089c New contributors 2020-12-19 23:24:38 +00:00
Electroblob77 8e3a33b084 Update Korean translations, courtesy of red1854th 2020-12-19 23:24:26 +00:00
Electroblob b1478de6fe Merge pull request #577 from Aralu115/Fix-Layer-Issue-LycaniteMobs
Re-implement layer fix from Pull Request 312
2020-12-18 16:23:01 +00:00
Aralu 1d247e2d56 Re-implment layer fix from Pull Request 312 2020-12-17 11:39:50 -06:00
Electroblob e8292f1e96 Merge pull request #574 from LWHK/TC
Fix uncorrect file path and add untranslated content to zh_tw.json
2020-12-13 12:00:22 +00:00
TUsama bc0b712e2b add untranslated content
2
2020-12-13 16:33:46 +08:00
TUsama 47135f00d7 fix the file path error 2020-12-13 16:21:53 +08:00
Electroblob c615ad365c Merge pull request #568 from LWHK/TC
Rollback the zh_tw.json to the last UTF-8 code version due to the bug fix
2020-12-11 11:56:30 +00:00
Electroblob 39c3989796 Merge pull request #571 from WinDanesz/patch-1
Update ru_ru.lang fixing mana info on the arcane workbench
2020-12-11 11:55:32 +00:00
WinDanesz e808ab2b1f Update ru_ru.lang fixing mana info on the arcane workbench 2020-12-11 00:37:17 +01:00
TUsama a25f942722 Rollback the zh_tw to the last UTF-8 code version because of the bug fix 2020-12-09 10:16:43 +08:00
Electroblob 14e481a71d Merge pull request #543 from Determancer/patch-3
New Chinese Simplified Translation for Imbuement
2020-11-05 11:39:07 +00:00
Determancer ac226f1444 an untranslated one, oops 2020-11-05 10:49:31 +08:00
Determancer 741d918d9b another tweak 2020-11-05 10:46:53 +08:00
Determancer f504505bf5 New Translation for Imbuement
Changing the current translation based on the latest discussion.
2020-11-05 10:44:49 +08:00
Electroblob77 fb010d3726 Update version number 2020-11-03 01:36:16 +00:00
Electroblob77 c64731e7a9 Fix ClassCastException in player animations, fixes #533
Somehow some unwrapped model parts managed to slip through (exactly *how* is a mystery!) so we're just safety-checking everything, I doubt this incurs much performance cost in the scheme of things.
2020-11-03 01:33:22 +00:00
Electroblob77 d3837a6185 Update credits 2020-11-03 01:20:16 +00:00
Electroblob77 80cf77ecc6 Fix GL stack overflow / weird rendering when arrows are stuck in the player, fixes #529 and #530 2020-11-03 01:08:14 +00:00
Electroblob77 3d3806c20b Prevent receptacles dropping on neighbour change when attached to an imbuement altar, fixes #520 2020-11-03 01:08:11 +00:00
Electroblob77 d952e9b255 Update Polish translations, courtesy of Olej 2020-11-01 15:06:49 +00:00
Electroblob77 33c8f08adf Update spanish handbook translations, courtesy of Alsentar 2020-11-01 10:41:45 +00:00
Electroblob77 315f2e4b02 Reinstate missing null check in SpellRay, fixes part of #519 2020-10-28 23:43:08 +00:00
Electroblob77 d3df59df73 Have PlayerAnimator ignore renderers for which no layers/models are stored, fixes #518
This will stop the crashing but might well mean broken animations - for now there's not much I can do about that
2020-10-28 23:37:51 +00:00
Electroblob77 cfd3e796e1 Make PlayerAnimator disable itself when MoBends is installed 2020-10-28 23:27:04 +00:00
Electroblob77 d97e843f7b Guard against all possible nulls to be on the safe side, fixes #517 2020-10-28 23:20:48 +00:00
Electroblob77 15a153fe11 Merge branch '1.12.2' of https://github.com/Electroblob77/Wizardry into 1.12.2 2020-10-28 23:20:13 +00:00
Electroblob77 d00b7279ee Update Hungarian translations, courtesy of Bombadil 2020-10-28 23:20:06 +00:00
Electroblob77 0142cc05bc Update Korean translations, courtesy of 방통 2020-10-28 23:19:47 +00:00
Electroblob 23621b8045 Merge pull request #526 from LWHK/1.12.2
Update CHS  translation version to 4.3
2020-10-26 23:26:18 +00:00
TUsama 7f2978bc7a Enhance some details
Co-Authored-By: Determancer <49300241+Determancer@users.noreply.github.com>
Co-Authored-By: WuzgXY <62000315+WuzgXY-GitHub@users.noreply.github.com>
2020-10-26 23:08:26 +08:00
TUsama 312364ba77 Update CHS translation version to 4.3
Co-Authored-By: Determancer <49300241+Determancer@users.noreply.github.com>
Co-Authored-By: Hokorizero <50108932+Hokorizero@users.noreply.github.com>
2020-10-26 09:50:21 +08:00
354 changed files with 10607 additions and 3154 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.
Minecraft version: 1.12.2 [change as necessary]
Wizardry version: 4.3 [change as necessary]
Wizardry version: 4.3.3 [change 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.]
+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.
Minecraft version: 1.12.2 [change as necessary]
Wizardry version: 4.3 [change as necessary]
Wizardry version: 4.3.3 [change as necessary]
Question details: [explain your question here]
+3 -1
View File
@@ -49,8 +49,10 @@ Pull requests aren't just for code - if you would like to help translate Wizardr
- `#image tag` adds an image to the text with the given tag. Image tags are defined in the `"images": {...}` block at the start of the file. Each named entry in this block defines a single image with that name as its tag. Each entry is a JSON object containing a file location and optional caption/dimensions.
- `#recipe tag` adds a crafting recipe to the text with the given tag. Similar to image tags, recipe tags are defined in the `"recipes": {...}` block at the start of the file. Each named entry in this block defines a recipe with that name as its tag. Each entry contains a list of one or more locations or recipes to display (if more than one is specified, the display will cycle through the different recipes).
- Anything else with a `#` directly before it (with no space) will be treated as a format argument if possible. This means everything between the `#` and the next space will be replaced with something else at runtime, similar to the `%X$s` bits in a normal .lang file. The current available format arguments can be found [here](https://github.com/Electroblob77/Wizardry/blob/1.12.2/src/main/java/electroblob/wizardry/client/gui/handbook/GuiWizardHandbook.java#L177-L203).
- Anything else with a `#` directly before it (with no space) will be treated as a format argument if possible. This means the text after the `#` will be replaced with something else at runtime, similar to the `%X$s` bits in a normal .lang file, if it matches one of the available format arguments. The current format arguments can be found [here](https://github.com/Electroblob77/Wizardry/blob/1.12.2/src/main/java/electroblob/wizardry/client/gui/handbook/GuiWizardHandbook.java#L177-L203).
- `@section@` adds a hyperlink to the given section, which will display as the name of that section. `@section alt text@` is the same, except alt text is displayed instead of the section name (alt text may contain spaces). It is also possible to hyperlink to a webpage, simply replace the section name with the url (e.g. `@https://example.com/@` or `@https://example.com/ alt text@`).
> Translators for Chinese, Japanese, Korean and similar East Asian languages: Due to how Minecraft's word wrapping works, for best results you should _remove spaces before and after hyperlinks and formatting tags_, excluding images and recipes. However, do not remove the space between a hyperlink's destination and its alt text or the link will break!
If all of that confused you, the simple rule is: _Don't translate anything directly after an `@` symbol, directly after a `#`, or the first word after `#image` or `#recipe`_. However, you should translate the `"caption"` entries in the `images` block.
+7 -5
View File
@@ -1,7 +1,7 @@
# Credits
Electroblob's Wizardry
Version 4.3
Version 4.3.3
For Minecraft 1.12.2
Designed, coded and textured by Electroblob
@@ -25,18 +25,20 @@ In addition, I'd like to thank the following individuals for their contributions
- Azim-Palmer
- raoulvdberge
- rafasoares
- xinyuan-liu
- SettingDust
#### Translations
- Spanish: MadWrist, Alsentar
- Mexican Spanish: MadWrist
- Russian: VilagVil, kellixon, bigenergy, MugGod2
- Russian: VilagVil, kellixon, bigenergy, MugGod2, DrHesperus
- French: Hahdrim
- Brazilian Portuguese: lorrampi
- Chinese (Simplified): ZHENGLOC, dragon-evol, Hokorizero, TUsama, Determancer
- Korean: shejery, rewi_wire
- Polish: Trozuu
- German: BirdyDragon
- Korean: shejery, rewi_wire, 방통, red1854th
- Polish: Trozuu, Olej
- German: BirdyDragon, Lemopav
- Chinese (Traditional): chesterccj305
- Hungarian: Bombadil
+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.
Minecraft version: 1.12.2 [change as necessary]
Wizardry version: 4.3 [change as necessary]
Wizardry version: 4.3.3 [change 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.]
+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.
version = "4.3" // 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
archivesBaseName = "ElectroblobsWizardry"
@@ -10,6 +10,7 @@ import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemArmor.ArmorMaterial;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.SoundCategory;
@@ -48,7 +49,7 @@ public class CommonProxy {
public void registerKeyBindings(){}
public net.minecraft.client.model.ModelBiped getWizardArmourModel(){
public net.minecraft.client.model.ModelBiped getWizardArmourModel(ArmorMaterial material){
return null;
}
@@ -93,6 +93,8 @@ public final class Settings {
/** The wizardry config file. */
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
// 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){
redundantKeys.clear();
config = new Configuration(new File(Wizardry.configDirectory, Wizardry.MODID + ".cfg"));
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. */
void saveConfigChanges(){
redundantKeys.clear();
Wizardry.logger.info("Saving in-game config changes");
setupGameplayConfig();
@@ -500,6 +506,32 @@ public final class Settings {
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. */
public void sync(EntityPlayerMP player){
Wizardry.logger.info("Synchronising config settings for " + player.getName());
@@ -518,7 +550,10 @@ public final class Settings {
Property property;
List<String> keys = new ArrayList<>();
for(Spell spell : Spell.getAllSpells()){
keys.add(spell.getRegistryName().toString());
property = config.get(SPELLS_CATEGORY, spell.getRegistryName().toString(), true,
"Set to false to disable this spell");
// 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));
}
checkForRedundantOptions(SPELLS_CATEGORY, keys);
}
private void setupArtefactsConfig(){
@@ -536,8 +572,11 @@ public final class Settings {
Property property;
List<String> keys = new ArrayList<>();
for(Item item : Item.REGISTRY){
if(item instanceof ItemArtefact){
keys.add(item.getRegistryName().toString());
property = config.get(ARTEFACTS_CATEGORY, item.getRegistryName().toString(), true,
"Set to false to disable this item");
// 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(){
@@ -623,6 +663,7 @@ public final class Settings {
bonemealGrowsCrystalFlowers = property.getBoolean();
propOrder.add(property.getName());
checkForRedundantOptions(GAMEPLAY_CATEGORY, propOrder); // Must be before the order is set!
config.setCategoryPropertyOrder(GAMEPLAY_CATEGORY, propOrder);
}
@@ -730,6 +771,7 @@ public final class Settings {
lightningWraithSpawnRate = property.getInt();
propOrder.add(property.getName());
checkForRedundantOptions(DIFFICULTY_CATEGORY, propOrder); // Must be before the order is set!
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);
}
@@ -1019,6 +1062,7 @@ public final class Settings {
lootInjectionLocations = getResourceLocationList(property);
propOrder.add(property.getName());
checkForRedundantOptions(WORLDGEN_CATEGORY, propOrder); // Must be before the order is set!
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
propOrder.add(property.getName());
checkForRedundantOptions(CLIENT_CATEGORY, propOrder); // Must be before the order is set!
config.setCategoryPropertyOrder(CLIENT_CATEGORY, propOrder);
}
@@ -1166,6 +1211,7 @@ public final class Settings {
alliesCommandName = property.getString();
propOrder.add(property.getName());
checkForRedundantOptions(COMMANDS_CATEGORY, propOrder); // Must be before the order is set!
config.setCategoryPropertyOrder(COMMANDS_CATEGORY, propOrder);
}
@@ -1243,6 +1289,7 @@ public final class Settings {
}
propOrder.add(property.getName());
checkForRedundantOptions(RESISTANCES_CATEGORY, propOrder); // Must be before the order is set!
config.setCategoryPropertyOrder(RESISTANCES_CATEGORY, propOrder);
}
@@ -1332,6 +1379,7 @@ public final class Settings {
autoUndergroundLibraryMarkers = property.getBoolean();
propOrder.add(property.getName());
checkForRedundantOptions(COMPATIBILITY_CATEGORY, propOrder); // Must be before the order is set!
config.setCategoryPropertyOrder(COMPATIBILITY_CATEGORY, propOrder);
}
@@ -1,5 +1,8 @@
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.command.CommandCastSpell;
import electroblob.wizardry.command.CommandDiscoverSpell;
@@ -36,6 +39,8 @@ import net.minecraftforge.fml.common.registry.GameRegistry;
import org.apache.logging.log4j.Logger;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
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.11.x versions, and so on.
*/
public static final String VERSION = "4.3";
public static final String VERSION = "4.3.3";
// IDEA: Triggering of inbuilt Forge events in relevant places?
// IDEA: Abstract the vanilla particles behind the particle builder
@@ -144,6 +149,34 @@ public class Wizardry {
@EventHandler
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();
// World generators
@@ -168,8 +201,6 @@ public class Wizardry {
// Post-registry extras
BlockBookshelf.compileBookModelTextures();
ContainerBookshelf.initDefaultBookItems();
WizardryItems.populateWandMap();
WizardryItems.populateArmourMap();
WizardryItems.registerDispenseBehaviours();
WizardryItems.registerBannerPatterns();
WandHelper.populateUpgradeMap();
@@ -79,13 +79,13 @@ public final class WizardryEventHandler {
public static void onPlayerLoggedInEvent(PlayerLoggedInEvent event){
// When a player logs in, they are sent the glyph data, server settings and spell properties.
if(event.player instanceof EntityPlayerMP){
SpellGlyphData.get(event.player.world).sync((EntityPlayerMP)event.player);
SpellEmitterData.get(event.player.world).sync((EntityPlayerMP)event.player);
Wizardry.settings.sync((EntityPlayerMP)event.player);
syncAdvancements((EntityPlayerMP)event.player, false);
EntityPlayerMP player = (EntityPlayerMP)event.player;
SpellGlyphData.get(player.world).sync(player);
SpellEmitterData.get(player.world).sync(player);
Wizardry.settings.sync(player);
syncAdvancements(player, false);
Spell.syncProperties(player);
}
Spell.syncProperties(event.player);
}
@SubscribeEvent(priority = EventPriority.HIGH)
@@ -261,7 +261,6 @@ public class BlockBookshelf extends BlockHorizontal implements ITileEntityProvid
registerBookModelTexture(() -> WizardryItems.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.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)
registerBookModelTexture(() -> WizardryItems.storage_upgrade, new ResourceLocation(Wizardry.MODID, "blocks/scrolls_wooden"));
registerBookModelTexture(() -> WizardryItems.siphon_upgrade, new ResourceLocation(Wizardry.MODID, "blocks/scrolls_wooden"));
@@ -108,7 +108,18 @@ public class BlockImbuementAltar extends Block implements ITileEntityProvider {
&& world.getBlockState(pos.offset(s)).getValue(BlockReceptacle.FACING) == s);
if(world.getBlockState(pos).getValue(ACTIVE) != shouldBeActive){ // Only set when it actually needs changing
// Get contents of altar before replacing it
TileEntity te = world.getTileEntity(pos);
ItemStack stack = ItemStack.EMPTY;
if(te instanceof TileEntityImbuementAltar) stack = ((TileEntityImbuementAltar)te).getStack();
world.setBlockState(pos, world.getBlockState(pos).withProperty(ACTIVE, shouldBeActive));
// Copy over contents of altar from before to new tile entity
te = world.getTileEntity(pos);
if(te instanceof TileEntityImbuementAltar) ((TileEntityImbuementAltar)te).setStack(stack);
world.checkLight(pos);
}
@@ -132,6 +132,13 @@ public class BlockReceptacle extends BlockTorch implements ITileEntityProvider {
return super.checkForDrop(world, pos, state);
}
@Override
protected boolean onNeighborChangeInternal(World world, BlockPos pos, IBlockState state){
// This is so stupid, BlockTorch DUPLICATES the code that checks for valid placement in the super method instead
// of checking the existing methods...
return !this.checkForDrop(world, pos, state); // Literally all we need. None of the rubbish in super.
}
@Override
public IBlockState getStateForPlacement(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer){
@@ -14,6 +14,8 @@ import electroblob.wizardry.client.gui.GuiSpellDisplay;
import electroblob.wizardry.client.gui.config.NamedBooleanEntry;
import electroblob.wizardry.client.gui.config.SpellHUDSkinChooserEntry;
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.particle.*;
import electroblob.wizardry.client.particle.ParticleWizardry.IWizardryParticleFactory;
@@ -39,6 +41,7 @@ import electroblob.wizardry.item.ItemSpellBook;
import electroblob.wizardry.item.ItemWand;
import electroblob.wizardry.packet.*;
import electroblob.wizardry.registry.Spells;
import electroblob.wizardry.registry.WizardryItems.Materials;
import electroblob.wizardry.registry.WizardrySounds;
import electroblob.wizardry.spell.*;
import electroblob.wizardry.tileentity.*;
@@ -65,6 +68,7 @@ import net.minecraft.entity.monster.EntityBlaze;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.ContainerMerchant;
import net.minecraft.item.Item;
import net.minecraft.item.ItemArmor.ArmorMaterial;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityDispenser;
@@ -120,8 +124,16 @@ public class ClientProxy extends CommonProxy {
}
}
// Armour Model
public static final ModelBiped WIZARD_ARMOUR_MODEL = new ModelWizardArmour(0.75f);
// Armour Models
// 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...)}). */
private static final int TOOLTIP_WRAP_WIDTH = 140;
@@ -130,8 +142,8 @@ public class ClientProxy extends CommonProxy {
// ===============================================================================================================
@Override
public ModelBiped getWizardArmourModel(){
return WIZARD_ARMOUR_MODEL;
public ModelBiped getWizardArmourModel(ArmorMaterial material){
return wizard_armour_models.get(material);
}
@Override
@@ -42,6 +42,8 @@ public class ModelRendererExtended extends ModelRenderer {
this.rotationPointX = delegate.rotationPointX;
this.rotationPointY = delegate.rotationPointY;
this.rotationPointZ = delegate.rotationPointZ;
this.cubeList = delegate.cubeList;
this.childModels = delegate.childModels;
this.resetRotation();
}
@@ -91,6 +93,33 @@ public class ModelRendererExtended extends ModelRenderer {
}
}
/**
* Returns whether the given {@link ModelBiped} is fully wrapped, i.e. all its parts are instances of
* {@code ModelRendererExtended}. If the given model is a {@link ModelPlayer}, this also checks the extra boxes for
* player skin overlays.
*/
public static boolean isWrapped(ModelBiped model){
boolean flag = true;
if(model instanceof ModelPlayer){
flag = flag && ((ModelPlayer)model).bipedBodyWear instanceof ModelRendererExtended;
flag = flag && ((ModelPlayer)model).bipedRightArmwear instanceof ModelRendererExtended;
flag = flag && ((ModelPlayer)model).bipedLeftArmwear instanceof ModelRendererExtended;
flag = flag && ((ModelPlayer)model).bipedRightLegwear instanceof ModelRendererExtended;
flag = flag && ((ModelPlayer)model).bipedLeftLegwear instanceof ModelRendererExtended;
}
return flag
&& model.bipedHead instanceof ModelRendererExtended
&& model.bipedBody instanceof ModelRendererExtended
&& model.bipedRightArm instanceof ModelRendererExtended
&& model.bipedLeftArm instanceof ModelRendererExtended
&& model.bipedRightLeg instanceof ModelRendererExtended
&& model.bipedLeftLeg instanceof ModelRendererExtended
&& model.bipedHeadwear instanceof ModelRendererExtended;
}
/** Resets the rotation of this model part to the angle set by the parent model. */
public void resetRotation(){
this.actualRotationX = Float.NaN;
@@ -25,6 +25,7 @@ import net.minecraft.util.EnumHandSide;
import net.minecraftforge.client.ForgeHooksClient;
import net.minecraftforge.client.event.RenderPlayerEvent;
import net.minecraftforge.client.event.RenderSpecificHandEvent;
import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.ObfuscationReflectionHelper;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
@@ -58,6 +59,9 @@ public class PlayerAnimator {
/** Reflected into {@link RenderLivingBase}{@code #layerRenderers}. */
private static final Field layerRenderers;
/** True if wizardry's player animations have been overridden with another mod (currently only MoBends) */
private static boolean overridden;
static {
layerRenderers = ObfuscationReflectionHelper.findField(RenderLivingBase.class, "field_177097_h");
}
@@ -75,86 +79,113 @@ public class PlayerAnimator {
}
}
// TODO: Figure out if calling this from postInit ensures we catch all the layers, and lazy-load it if not
@SuppressWarnings("unchecked")
/** Returns true if spellcasting animations are enabled, false otherwise. */
public static boolean areAnimationsEnabled(){
return Wizardry.settings.spellcastingAnimations && !overridden;
}
public static void init(){
if(!Wizardry.settings.spellcastingAnimations) return;
if(Loader.isModLoaded("mobends")) overridden = true;
if(!areAnimationsEnabled()) return;
for(RenderPlayer renderer : Minecraft.getMinecraft().getRenderManager().getSkinMap().values()){
loadLayersForRenderer(renderer);
}
}
List<ModelBiped> models = new ArrayList<>();
ModelRendererExtended.wrap(renderer.getMainModel());
models.add(renderer.getMainModel());
@SuppressWarnings("unchecked")
private static void loadLayersForRenderer(RenderPlayer renderer){
try {
List<ModelBiped> models = new ArrayList<>();
ModelRendererExtended.wrap(renderer.getMainModel());
models.add(renderer.getMainModel());
List<LayerRenderer<? extends EntityLivingBase>> layers = (List<LayerRenderer<? extends EntityLivingBase>>)layerRenderers.get(renderer);
try {
// Save armour layers for lazy-loading later (ignore other layers so iteration is faster)
playerLayers.put(renderer, layers.stream().filter(l -> l instanceof LayerBipedArmor).collect(Collectors.toList()));
List<LayerRenderer<? extends EntityLivingBase>> layers = (List<LayerRenderer<? extends EntityLivingBase>>)layerRenderers.get(renderer);
for(LayerRenderer<?> layer : layers){
// Save armour layers for lazy-loading later (ignore other layers so iteration is faster)
playerLayers.put(renderer, layers.stream().filter(l -> l instanceof LayerBipedArmor).collect(Collectors.toList()));
for(Field field : JavaUtils.getAllFields(layer.getClass())){
for(LayerRenderer<?> layer : layers){
field.setAccessible(true);
for(Field field : JavaUtils.getAllFields(layer.getClass())){
// If your layer model doesn't extend ModelBiped, you DESERVE to be incompatible!
// (Just kidding... there's nothing I can do about it anyway)
if(field.get(layer) instanceof ModelBiped){
ModelBiped model = (ModelBiped)field.get(layer);
ModelRendererExtended.wrap(model);
models.add(model);
}
field.setAccessible(true);
// If your layer model doesn't extend ModelBiped, you DESERVE to be incompatible!
// (Just kidding... there's nothing I can do about it anyway)
if(field.get(layer) instanceof ModelBiped){
ModelBiped model = (ModelBiped)field.get(layer);
ModelRendererExtended.wrap(model);
models.add(model);
}
}
}catch(IllegalAccessException e){
Wizardry.logger.error("Error during reflective access of render layers: ", e);
}
playerLayerModels.put(renderer, models);
}catch(IllegalAccessException e){
Wizardry.logger.error("Error during reflective access of render layers: ", e);
}
playerLayerModels.put(renderer, models);
}
private static void updateModels(EntityPlayer player, Render<?> renderer, float partialTicks, boolean firstPerson){
// Biped armour is special because of Forge's armour item render hook
// This needs to be lazy-loaded because we need access to an actual item
for(LayerRenderer<? extends EntityLivingBase> layer : playerLayers.get(renderer)){
if(layer instanceof LayerBipedArmor){
for(EntityEquipmentSlot slot : InventoryUtils.ARMOUR_SLOTS){
// Lazy-load models from custom renderers (some mods assign their custom renderers in postInit, so they might
// not be picked up from PlayerAnimator#init)
if(renderer instanceof RenderPlayer && !playerLayerModels.containsKey(renderer)){
loadLayersForRenderer((RenderPlayer)renderer);
}
ItemStack armour = player.getItemStackFromSlot(slot);
// This method could behave dynamically depending on stuff like NBT so there's not really any way to
// optimise it further, we *have* to retrieve the model every time (shouldn't be too bad though)
ModelBiped model = ForgeHooksClient.getArmorModel(player, armour, slot, ((LayerBipedArmor)layer).getModelFromSlot(slot));
List<ModelBiped> models = playerLayerModels.get(renderer);
List<ModelBiped> models = playerLayerModels.get(renderer);
// If no models were registered for the given renderer, don't do anything
if(models != null){
if(!models.contains(model)){ // Ignore already-wrapped models
models.add(model);
ModelRendererExtended.wrap(model);
List<LayerRenderer<? extends EntityLivingBase>> layers = playerLayers.get(renderer);
// If no layers were registered for the given renderer there's no point trying to lazy-load anything!
if(layers != null){
// Biped armour is special because of Forge's armour item render hook
// This needs to be lazy-loaded because we need access to an actual item
for(LayerRenderer<? extends EntityLivingBase> layer : layers){
if(layer instanceof LayerBipedArmor){
for(EntityEquipmentSlot slot : InventoryUtils.ARMOUR_SLOTS){
ItemStack armour = player.getItemStackFromSlot(slot);
// This method could behave dynamically depending on stuff like NBT so there's not really any way to
// optimise it further, we *have* to retrieve the model every time (shouldn't be too bad though)
ModelBiped model = ForgeHooksClient.getArmorModel(player, armour, slot, ((LayerBipedArmor)layer).getModelFromSlot(slot));
if(!models.contains(model)){ // Ignore already-wrapped models
models.add(model);
ModelRendererExtended.wrap(model);
}
}
}
}
}
}
for(Animation animation : animations){
for(Animation animation : animations){
if(animation.shouldDisplay(player, firstPerson)){
if(animation.shouldDisplay(player, firstPerson)){
boolean autoRotateSecondLayer = animation.autoRotateSecondLayer(player, firstPerson);
boolean autoRotateSecondLayer = animation.autoRotateSecondLayer(player, firstPerson);
for(ModelBiped model : playerLayerModels.get(renderer)){
for(ModelBiped model : models){
animation.setRotationAngles(player, model, partialTicks, firstPerson);
if(!ModelRendererExtended.isWrapped(model)) continue; // Should never happen but somehow it does
if(autoRotateSecondLayer && model instanceof ModelPlayer){
alignSecondLayer((ModelPlayer)model);
animation.setRotationAngles(player, model, partialTicks, firstPerson);
if(autoRotateSecondLayer && model instanceof ModelPlayer){
alignSecondLayer((ModelPlayer)model);
}
}
}
}
@@ -174,7 +205,7 @@ public class PlayerAnimator {
@SubscribeEvent
public static void onRenderHandEvent(RenderSpecificHandEvent event){
if(!Wizardry.settings.spellcastingAnimations) return;
if(!areAnimationsEnabled()) return;
AbstractClientPlayer player = Minecraft.getMinecraft().player;
@@ -193,7 +224,7 @@ public class PlayerAnimator {
@SubscribeEvent
public static void onRenderPlayerPreEvent(RenderPlayerEvent.Pre event){
if(!Wizardry.settings.spellcastingAnimations) return;
if(!areAnimationsEnabled()) return;
// boolean firstPerson = event.getEntityPlayer() == Minecraft.getMinecraft().player
// && Minecraft.getMinecraft().gameSettings.thirdPersonView == 0;
@@ -204,13 +235,17 @@ public class PlayerAnimator {
@SubscribeEvent
public static void onRenderPlayerPostEvent(RenderPlayerEvent.Post event){
if(!Wizardry.settings.spellcastingAnimations) return;
if(!areAnimationsEnabled()) return;
for(ModelBiped model : playerLayerModels.get(event.getRenderer())){
for(ModelRenderer box : model.boxList){ // For ModelPlayer, this will include the second layer
// Some models have extra boxes, they (probably) don't need wrapping but we need this check!
if(box instanceof ModelRendererExtended){
((ModelRendererExtended)box).resetRotation();
List<ModelBiped> models = playerLayerModels.get(event.getRenderer());
if(models != null){
for(ModelBiped model : models){
for(ModelRenderer box : model.boxList){ // For ModelPlayer, this will include the second layer
// Some models have extra boxes, they (probably) don't need wrapping but we need this check!
if(box instanceof ModelRendererExtended){
((ModelRendererExtended)box).resetRotation();
}
}
}
}
@@ -34,12 +34,13 @@ import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.relauncher.Side;
import javax.annotation.Nullable;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.Map.Entry;
import java.nio.charset.StandardCharsets;
@Mod.EventBusSubscriber(Side.CLIENT)
public class GuiSpellDisplay {
@@ -96,9 +97,28 @@ public class GuiSpellDisplay {
return Collections.unmodifiableMap(skins);
}
/** Returns the skin that corresponds to the given key. */
/** Returns the skin that corresponds to the given key. If no such skin exists, returns the default skin as a
* fallback. If the fallback skin is missing, prints a warning to the console and returns null. */
@Nullable
public static Skin getSkin(String key){
return skins.get(key);
Skin skin = skins.get(key);
if(skin == null){
Wizardry.logger.info("The spell HUD skin '" + Wizardry.settings.spellHUDSkin + "' specified in the config"
+ " did not match any of the loaded skins; using the default skin as a fallback.");
skin = skins.get(Settings.DEFAULT_HUD_SKIN_KEY);
if(skin == null){
Wizardry.logger.warn("The default spell HUD skin is missing! A resource pack must have overridden it"
+ " with an invalid JSON file (default.json), please try again without any resource packs.");
return null;
}
}
return skin;
}
// Normally when extending Gui, you'd have to have an instance to access its methods. However, we're not actually
@@ -212,21 +232,9 @@ public class GuiSpellDisplay {
flipX = flipX == ((mainHand ? player.getPrimaryHand() : player.getPrimaryHand().opposite()) == EnumHandSide.LEFT);
}
Skin skin = skins.get(Wizardry.settings.spellHUDSkin);
Skin skin = getSkin(Wizardry.settings.spellHUDSkin);
if(skin == null){
Wizardry.logger.info("The spell HUD skin '" + Wizardry.settings.spellHUDSkin + "' specified in the config"
+ " did not match any of the loaded skins; using the default skin as a fallback.");
skin = skins.get(Settings.DEFAULT_HUD_SKIN_KEY);
if(skin == null){
Wizardry.logger.warn("The default spell HUD skin is missing! A resource pack must have overridden it"
+ " with an invalid JSON file (default.json), please try again without any resource packs.");
return;
}
}
if(skin == null) return; // Can't draw anything if there is no skin loaded!
GlStateManager.pushMatrix();
@@ -90,28 +90,30 @@ public class WizardTradeTweaksHandler {
// New spell indicator
if(gui.inventorySlots instanceof ContainerMerchant){
// Can't use getCurrentRecipe because that only gets updated when the correct items are given
MerchantRecipe recipe = trades.get(tradeIndex);
if(tradeIndex < trades.size()){ // Seems to happen with certain mods' GUIs
if(recipe != null && recipe.getItemToSell().getItem() instanceof ItemSpellBook){
// Can't use getCurrentRecipe because that only gets updated when the correct items are given
MerchantRecipe recipe = trades.get(tradeIndex);
EntityPlayer player = Minecraft.getMinecraft().player;
Spell spell = Spell.byMetadata(recipe.getItemToSell().getMetadata());
if(recipe != null && recipe.getItemToSell().getItem() instanceof ItemSpellBook){
if(Wizardry.settings.discoveryMode && !player.isCreative() && Wizardry.proxy.shouldDisplayDiscovered(spell, recipe.getItemToSell())
&& WizardData.get(player) != null && !WizardData.get(player).hasSpellBeenDiscovered(spell)){
int x = gui.inventorySlots.getSlot(2).xPos + 14;
int y = gui.inventorySlots.getSlot(2).yPos - 17;
EntityPlayer player = Minecraft.getMinecraft().player;
Spell spell = Spell.byMetadata(recipe.getItemToSell().getMetadata());
RenderHelper.enableGUIStandardItemLighting();
GlStateManager.color(1, 1, 1);
Minecraft.getMinecraft().renderEngine.bindTexture(NEW_SPELL_ICON);
if(Wizardry.settings.discoveryMode && !player.isCreative() && Wizardry.proxy.shouldDisplayDiscovered(spell, recipe.getItemToSell())
&& WizardData.get(player) != null && !WizardData.get(player).hasSpellBeenDiscovered(spell)){
int frame = Math.max(player.ticksExisted/ANIMATION_FRAME_TIME % ANIMATION_PERIOD - (ANIMATION_PERIOD - ANIMATION_FRAMES), 0);
DrawingUtils.drawTexturedRect(x, y, 0, frame * ICON_HEIGHT, ICON_WIDTH, ICON_HEIGHT, ICON_WIDTH, ICON_HEIGHT * ANIMATION_FRAMES);
int x = gui.inventorySlots.getSlot(2).xPos + 14;
int y = gui.inventorySlots.getSlot(2).yPos - 17;
RenderHelper.disableStandardItemLighting();
RenderHelper.enableGUIStandardItemLighting();
GlStateManager.color(1, 1, 1);
Minecraft.getMinecraft().renderEngine.bindTexture(NEW_SPELL_ICON);
int frame = Math.max(player.ticksExisted / ANIMATION_FRAME_TIME % ANIMATION_PERIOD - (ANIMATION_PERIOD - ANIMATION_FRAMES), 0);
DrawingUtils.drawTexturedRect(x, y, 0, frame * ICON_HEIGHT, ICON_WIDTH, ICON_HEIGHT, ICON_WIDTH, ICON_HEIGHT * ANIMATION_FRAMES);
RenderHelper.disableStandardItemLighting();
// int mouseX = event.getMouseX() - gui.getGuiLeft();
// int mouseY = event.getMouseY() - gui.getGuiTop();
@@ -120,6 +122,7 @@ public class WizardTradeTweaksHandler {
// GuiUtils.drawHoveringText(Collections.singletonList("You haven't discovered this spell yet"), mouseX,
// mouseY, gui.width, gui.height, 150, Minecraft.getMinecraft().fontRenderer);
// }
}
}
}
}
@@ -1,5 +1,6 @@
package electroblob.wizardry.client.gui.config;
import com.mojang.realmsclient.gui.ChatFormatting;
import electroblob.wizardry.Settings;
import electroblob.wizardry.Wizardry;
import net.minecraft.client.gui.GuiScreen;
@@ -18,9 +19,13 @@ import java.util.List;
public class GuiConfigWizardry extends GuiConfig {
public GuiConfigWizardry(GuiScreen parent){
super(parent, getConfigEntries(), Wizardry.MODID, false, false,
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(){
@@ -59,31 +59,34 @@ public class GuiSelectHUDSkin extends GuiSelectString {
this.drawGradientRect(previewLeft, previewTop, previewRight, previewBottom, 0x88000000, 0x88000000);
int previewBorder = 10;
Skin skin = GuiSpellDisplay.getSkin((String)this.currentValue);
float scale = Math.min((previewRight - previewLeft - 2*previewBorder)/(float)skin.getWidth(),
(previewBottom - previewTop - 2*previewBorder)/(float)skin.getHeight());
float x = (previewLeft + previewRight)/2f - (skin.getWidth()*scale)/2;
float y = (previewBottom + previewTop)/2f + (skin.getHeight()*scale)/2;
GlStateManager.pushMatrix();
GlStateManager.scale(scale, scale, scale);
skin.drawBackground((int)(x/scale), (int)(y/scale), false, false,
Spells.magic_missile.getIcon(), 0.6f, false, false);
skin.drawText((int)(x/scale), (int)(y/scale), false, false,
Spells.none.getDisplayNameWithFormatting(),
Spells.magic_missile.getDisplayNameWithFormatting(),
Spells.none.getDisplayNameWithFormatting(), 0);
GlStateManager.popMatrix();
if(skin != null){
float scale = Math.min((previewRight - previewLeft - 2 * previewBorder) / (float)skin.getWidth(),
(previewBottom - previewTop - 2 * previewBorder) / (float)skin.getHeight());
float x = (previewLeft + previewRight) / 2f - (skin.getWidth() * scale) / 2;
float y = (previewBottom + previewTop) / 2f + (skin.getHeight() * scale) / 2;
GlStateManager.pushMatrix();
GlStateManager.scale(scale, scale, scale);
skin.drawBackground((int)(x / scale), (int)(y / scale), false, false,
Spells.magic_missile.getIcon(), 0.6f, false, false);
skin.drawText((int)(x / scale), (int)(y / scale), false, false,
Spells.none.getDisplayNameWithFormatting(),
Spells.magic_missile.getDisplayNameWithFormatting(),
Spells.none.getDisplayNameWithFormatting(), 0);
GlStateManager.popMatrix();
}
Skin hovered = getHoveredSkin(mouseX, mouseY);
if(hovered != null){
this.drawToolTip(Lists.newArrayList("\u00A7a" + hovered.getName(), "\u00A7e" + hovered.getDescription()),
mouseX, mouseY);
@@ -19,7 +19,7 @@ import java.util.*;
/**
* Instances of this class represent sections in the wizard's handbook. As of wizardry 4.2, this class handles
* everything within the section itself, including JSON parsing, unlock triggers and drawing the actual rawText.
* everything within the section itself, including JSON parsing, unlock triggers and drawing the actual text.
* Sections may now also be nested and have other elements within them, such as images and a table of contents, a
* behaviour which is also handled within this class.
* <p></p>
@@ -313,8 +313,8 @@ class Section {
// The button id only does what you use it for, so we're just not using it at all.
this.buttons.get(pageRelative).add(GuiButtonHyperlink.create(x, y, font, upToLink, arguments, suffix, maxLineNumber - lineNumber - 1, GuiWizardHandbook.isRightPage(page)));
// The link button should exactly overlay the display rawText in the main string
// If the link has no display rawText specified, it displays the unformatted target string
// The link button should exactly overlay the display text in the main string
// If the link has no display text specified, it displays the unformatted target string
paragraph = paragraph.replace(linkRaw, arguments[arguments.length - 1]);
}
@@ -385,7 +385,7 @@ class Section {
if(JsonUtils.hasField(json, "text")){
section.rawText = Streams.stream(JsonUtils.getJsonArray(json, "text"))
.map(e -> JsonUtils.getString(e, "element of array rawText"))
.map(e -> JsonUtils.getString(e, "element of array text"))
.toArray(String[]::new);
}
@@ -119,11 +119,19 @@ public class BakedModelGenerateOverrides implements IBakedModel {
IBakedModel original = event.getModelRegistry().getObject(location);
if(original != null){
original.getOverrides().getOverrides().stream().map(ItemOverride::getLocation)
.filter(l -> l.getPath().contains(OVERRIDE_GENERATORS)).findFirst()
.ifPresent(l -> event.getModelRegistry().putObject(location,
substituteWandModel(event.getModelManager(), location, original, l)));
try{
// Ignore the warnings, IntelliJ is right that these can't be null in the dev environment but certain
// mods seem to be doing ASM hackery that makes it so they can be null
if(original != null && original.getOverrides() != null && original.getOverrides().getOverrides() != null){
original.getOverrides().getOverrides().stream().map(ItemOverride::getLocation)
.filter(l -> l.getPath().contains(OVERRIDE_GENERATORS)).findFirst()
.ifPresent(l -> event.getModelRegistry().putObject(location,
substituteWandModel(event.getModelManager(), location, original, l)));
}
}catch(NullPointerException e){
Wizardry.logger.info("The model {} threw an error when trying to access item overrides, it will be ignored. If you're an addon dev and you made this model, something is wrong with it! Otherwise, please ignore this message.", location);
}
}
}
@@ -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;
}
}
@@ -143,7 +143,7 @@ public abstract class LayerTiledOverlay<T extends EntityLivingBase> implements L
double scaleX = 1, scaleY = 1;
// It's more logical to use the model's texture size, but some classes don't bother setting it properly
// (e.g. ModelVillager), so to get the correct dimensions I'm getting them from the first box instead.
if(model.boxList != null && model.boxList.get(0) != null){
if(model.boxList != null && model.boxList.size() >= 1 && model.boxList.get(0) != null){
scaleX = (double)model.boxList.get(0).textureWidth / textureWidth;
scaleY = (double)model.boxList.get(0).textureHeight / textureHeight;
}else{ // Fallback to model fields; should never be needed
@@ -30,12 +30,11 @@ import org.lwjgl.opengl.GL11;
@EventBusSubscriber(Side.CLIENT)
public class RenderSixthSense {
private static final ResourceLocation MARKER_TEXTURE = new ResourceLocation(Wizardry.MODID, "textures/gui/sixth_sense_marker.png");
private static final ResourceLocation SCREEN_OVERLAY_TEXTURE = new ResourceLocation(Wizardry.MODID, "textures/gui/sixth_sense_overlay.png");
private static final int PASSIVE_MOB_MARKER_COLOUR = 0xc6ff00;
private static final int HOSTILE_MOB_MARKER_COLOUR = 0x004a97;
private static final int PLAYER_MARKER_COLOUR = 0xffffff;
private static final ResourceLocation PASSIVE_MOB_MARKER_TEXTURE = new ResourceLocation(Wizardry.MODID, "textures/gui/sixth_sense_marker_passive.png");
private static final ResourceLocation HOSTILE_MOB_MARKER_TEXTURE = new ResourceLocation(Wizardry.MODID, "textures/gui/sixth_sense_marker_hostile.png");
private static final ResourceLocation PLAYER_MARKER_TEXTURE = new ResourceLocation(Wizardry.MODID, "textures/gui/sixth_sense_marker_player.png");
@SubscribeEvent
public static void onRenderGameOverlayEvent(RenderGameOverlayEvent.Post event){
@@ -88,26 +87,19 @@ public class RenderSixthSense {
GlStateManager.rotate(180 - renderManager.playerViewY, 0.0F, 1.0F, 0.0F);
GlStateManager.rotate(yaw, 1.0F, 0.0F, 0.0F);
// Makes the colour add to the colour of the texture pixels, rather than the default multiplying
GlStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_ADD);
GlStateManager.color(1, 1, 1, 1);
int colour = PASSIVE_MOB_MARKER_COLOUR;
ResourceLocation texture = PASSIVE_MOB_MARKER_TEXTURE;
if(ItemArtefact.isArtefactActive(mc.player, WizardryItems.charm_sixth_sense)){
if(event.getEntity() instanceof IMob) colour = HOSTILE_MOB_MARKER_COLOUR;
else if(event.getEntity() instanceof EntityPlayer) colour = PLAYER_MARKER_COLOUR;
if(event.getEntity() instanceof IMob) texture = HOSTILE_MOB_MARKER_TEXTURE;
else if(event.getEntity() instanceof EntityPlayer) texture = PLAYER_MARKER_TEXTURE;
}
int r = colour >> 16 & 255;
int g = colour >> 8 & 255;
int b = colour & 255;
GlStateManager.color(r/255f, g/255f, b/255f, 1);
mc.renderEngine.bindTexture(texture);
buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX);
mc.renderEngine.bindTexture(MARKER_TEXTURE);
buffer.pos(-0.6, 0.6, 0).tex(0, 0).endVertex();
buffer.pos(0.6, 0.6, 0).tex(1, 0).endVertex();
buffer.pos(0.6, -0.6, 0).tex(1, 1).endVertex();
@@ -119,8 +111,6 @@ public class RenderSixthSense {
GlStateManager.disableBlend();
GlStateManager.enableLighting();
GlStateManager.enableDepth();
// Reverses the colour addition change from before
GlStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_MODULATE);
GlStateManager.popMatrix();
}
@@ -22,10 +22,6 @@ public final class Constants {
public static final float STORAGE_INCREASE_PER_LEVEL = 0.15f;
/** The fraction by which potency is increased for each tier of matching wand. */
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. */
public static final float DURATION_INCREASE_PER_LEVEL = 0.25f;
/** The fraction by which spell range is increased for each level of range upgrade. */
@@ -346,35 +346,47 @@ public class WizardData implements INBTSerializable<NBTTagCompound> {
// For each item in the player's inventory
for(ItemStack stack : player.inventory.mainInventory){
if(stack.isItemEnchanted()){
updateImbutedItem(stack, activeImbuements);
}
for(ItemStack stack : player.inventory.armorInventory){
updateImbutedItem(stack, activeImbuements);
}
for(ItemStack stack : player.inventory.offHandInventory){
updateImbutedItem(stack, activeImbuements);
}
NBTTagList enchantmentList = stack.getItem() == Items.ENCHANTED_BOOK ?
ItemEnchantedBook.getEnchantments(stack) : stack.getEnchantmentTagList();
// Removes all imbuements from the map that are no longer active
this.imbuementDurations.keySet().retainAll(activeImbuements);
}
Iterator<NBTBase> iterator = enchantmentList.iterator();
// For each of the item's enchantments
while(iterator.hasNext()){
NBTTagCompound enchantmentTag = (NBTTagCompound) iterator.next();
Enchantment enchantment = Enchantment.getEnchantmentByID(enchantmentTag.getShort("id"));
// Ignores the enchantment unless it is an imbuement
if(enchantment instanceof Imbuement){
int duration = this.getImbuementDuration(enchantment);
// If the imbuement is still active:
if(duration > 0){
// Decrements the timer
this.imbuementDurations.put((Imbuement)enchantment, duration - IMBUEMENT_UPDATE_INTERVAL);
// Adds this imbuement to the set of imbuements that need to be kept
activeImbuements.add((Imbuement)enchantment);
}else{
// Otherwise, removes the enchantment from the item
iterator.remove(); // FIXME: Apparently this can cause a CME
}
private void updateImbutedItem(ItemStack stack, Set<Imbuement> activeImbuements){
if(stack.isItemEnchanted()){
NBTTagList enchantmentList = stack.getItem() == Items.ENCHANTED_BOOK ?
ItemEnchantedBook.getEnchantments(stack) : stack.getEnchantmentTagList();
Iterator<NBTBase> iterator = enchantmentList.iterator();
// For each of the item's enchantments
while(iterator.hasNext()){
NBTTagCompound enchantmentTag = (NBTTagCompound) iterator.next();
Enchantment enchantment = Enchantment.getEnchantmentByID(enchantmentTag.getShort("id"));
// Ignores the enchantment unless it is an imbuement
if(enchantment instanceof Imbuement){
int duration = this.getImbuementDuration(enchantment);
// If the imbuement is still active:
if(duration > 0){
// Decrements the timer
this.imbuementDurations.put((Imbuement)enchantment, duration - IMBUEMENT_UPDATE_INTERVAL);
// Adds this imbuement to the set of imbuements that need to be kept
activeImbuements.add((Imbuement)enchantment);
}else{
// Otherwise, removes the enchantment from the item
iterator.remove(); // FIXME: Apparently this can cause a CME
}
}
}
}
// Removes all imbuements from the map that are no longer active
this.imbuementDurations.keySet().retainAll(activeImbuements);
}
// Ally designation system
@@ -45,7 +45,8 @@ public interface Imbuement {
public static void onLivingDropsEvent(LivingDropsEvent event){
// Instantly disenchants an imbued weapon if it is dropped when the player dies.
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());
}
}
@@ -278,7 +278,8 @@ public class EntityEvilWizard extends EntityMob implements ISpellCaster, IEntity
@Override
public void writeEntityToNBT(NBTTagCompound nbt){
super.writeEntityToNBT(nbt);
nbt.setInteger("element", this.getElement().ordinal());
Element element = this.getElement();
nbt.setInteger("element", element == null ? 0 : element.ordinal());
nbt.setInteger("skin", this.textureIndex);
NBTExtras.storeTagSafely(nbt, "spells", NBTExtras.listToNBT(spells, spell -> new NBTTagInt(spell.metadata())));
nbt.setBoolean("hasStructure", this.hasStructure);
@@ -225,6 +225,7 @@ public class EntityRemnant extends EntityMob {
@Override
public void startExecuting(){
EntityLivingBase entitylivingbase = EntityRemnant.this.getAttackTarget();
if(entitylivingbase == null) return;
Vec3d vec3d = entitylivingbase.getPositionEyes(1.0F);
EntityRemnant.this.moveHelper.setMoveTo(vec3d.x, vec3d.y, vec3d.z, 1.0D);
EntityRemnant.this.setAttacking(true);
@@ -241,6 +242,8 @@ public class EntityRemnant extends EntityMob {
EntityLivingBase entitylivingbase = EntityRemnant.this.getAttackTarget();
if(entitylivingbase == null) return;
if(EntityRemnant.this.getEntityBoundingBox().intersects(entitylivingbase.getEntityBoundingBox())){
EntityRemnant.this.attackEntityAsMob(entitylivingbase);
EntityRemnant.this.setAttacking(false);
@@ -404,7 +404,8 @@ public class EntityWizard extends EntityCreature implements INpc, IMerchant, ISp
NBTExtras.storeTagSafely(nbt, "trades", this.trades.getRecipiesAsTags());
}
nbt.setInteger("element", this.getElement().ordinal());
Element element = this.getElement();
nbt.setInteger("element", element == null ? 0 : element.ordinal());
nbt.setInteger("skin", this.textureIndex);
NBTExtras.storeTagSafely(nbt, "spells", NBTExtras.listToNBT(spells, spell -> new NBTTagInt(spell.metadata())));
@@ -4,9 +4,14 @@ import electroblob.wizardry.Wizardry;
import electroblob.wizardry.registry.Spells;
import electroblob.wizardry.spell.Spell;
import electroblob.wizardry.util.EntityUtils;
import electroblob.wizardry.util.MagicDamage;
import electroblob.wizardry.util.MagicDamage.DamageType;
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.nbt.NBTTagCompound;
import net.minecraft.util.DamageSource;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.world.World;
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;
}
@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
protected void onImpact(RayTraceResult rayTrace){
@@ -10,6 +10,7 @@ import electroblob.wizardry.util.ParticleBuilder;
import io.netty.buffer.ByteBuf;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.monster.EntityGhast;
import net.minecraft.entity.projectile.EntitySmallFireball;
import net.minecraft.init.Blocks;
import net.minecraft.nbt.NBTTagCompound;
@@ -75,9 +76,9 @@ public class EntityMagicFireball extends EntityMagicProjectile {
float damage = getDamage() * damageMultiplier;
entityHit.attackEntityFrom(
MagicDamage.causeIndirectMagicDamage(this, this.getThrower(), DamageType.FIRE).setProjectile(),
damage);
DamageSource source = getDamageSource(entityHit);
entityHit.attackEntityFrom(source, damage);
if(!MagicDamage.isEntityImmune(DamageType.FIRE, entityHit) && getBurnDuration() > 0)
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
public void onUpdate(){
@@ -73,7 +73,9 @@ public class WizardryJEIPlugin implements IModPlugin {
addItemInfo(registry, WizardryItems.identification_scroll, ".desc_extended");
addItemInfo(registry, WizardryItems.spell_book);
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.astral_diamond);
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.
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])))
.setBackgroundName(EMPTY_SLOT_UPGRADE.toString());
@@ -133,7 +133,6 @@ public class ContainerBookshelf extends Container {
registerBookItem(WizardryItems.scroll);
registerBookItem(WizardryItems.blank_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)
registerBookItem(WizardryItems.storage_upgrade);
registerBookItem(WizardryItems.siphon_upgrade);
@@ -34,7 +34,7 @@ public class ItemArmourUpgrade extends Item {
@Override
@SideOnly(Side.CLIENT)
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");
}
}
@@ -1,11 +1,11 @@
package electroblob.wizardry.item;
import electroblob.wizardry.Wizardry;
import electroblob.wizardry.client.DrawingUtils;
import electroblob.wizardry.entity.projectile.EntityFlamecatcherArrow;
import electroblob.wizardry.registry.Spells;
import electroblob.wizardry.registry.WizardrySounds;
import electroblob.wizardry.spell.Flamecatcher;
import electroblob.wizardry.util.InventoryUtils;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
@@ -111,7 +111,7 @@ public class ItemFlamecatcher extends ItemBow implements IConjuredItem {
@Override
public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean selected){
int damage = stack.getItemDamage();
if(damage > stack.getMaxDamage()) entity.replaceItemInInventory(slot, ItemStack.EMPTY);
if(damage > stack.getMaxDamage()) InventoryUtils.replaceItemInInventory(entity, slot, stack, ItemStack.EMPTY);
stack.setItemDamage(damage + 1);
}
@@ -4,6 +4,7 @@ import com.google.common.collect.Multimap;
import electroblob.wizardry.registry.Spells;
import electroblob.wizardry.spell.Spell;
import electroblob.wizardry.util.EntityUtils;
import electroblob.wizardry.util.InventoryUtils;
import electroblob.wizardry.util.MagicDamage;
import electroblob.wizardry.util.MagicDamage.DamageType;
import net.minecraft.entity.Entity;
@@ -81,7 +82,7 @@ public class ItemFlamingAxe extends ItemAxe implements IConjuredItem {
@Override
public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean selected){
int damage = stack.getItemDamage();
if(damage > stack.getMaxDamage()) entity.replaceItemInInventory(slot, ItemStack.EMPTY);
if(damage > stack.getMaxDamage()) InventoryUtils.replaceItemInInventory(entity, slot, stack, ItemStack.EMPTY);
stack.setItemDamage(damage + 1);
}
@@ -5,6 +5,7 @@ import electroblob.wizardry.registry.Spells;
import electroblob.wizardry.registry.WizardryPotions;
import electroblob.wizardry.spell.Spell;
import electroblob.wizardry.util.EntityUtils;
import electroblob.wizardry.util.InventoryUtils;
import electroblob.wizardry.util.MagicDamage;
import electroblob.wizardry.util.MagicDamage.DamageType;
import net.minecraft.entity.Entity;
@@ -83,7 +84,7 @@ public class ItemFrostAxe extends ItemAxe implements IConjuredItem {
@Override
public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean selected){
int damage = stack.getItemDamage();
if(damage > stack.getMaxDamage()) entity.replaceItemInInventory(slot, ItemStack.EMPTY);
if(damage > stack.getMaxDamage()) InventoryUtils.replaceItemInInventory(entity, slot, stack, ItemStack.EMPTY);
stack.setItemDamage(damage + 1);
}
@@ -7,6 +7,7 @@ import electroblob.wizardry.registry.WizardrySounds;
import electroblob.wizardry.spell.LightningHammer;
import electroblob.wizardry.spell.Spell;
import electroblob.wizardry.util.EntityUtils;
import electroblob.wizardry.util.InventoryUtils;
import electroblob.wizardry.util.MagicDamage;
import electroblob.wizardry.util.MagicDamage.DamageType;
import electroblob.wizardry.util.ParticleBuilder;
@@ -112,7 +113,7 @@ public class ItemLightningHammer extends Item implements IConjuredItem {
@Override
public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean selected){
int damage = stack.getItemDamage();
if(damage > stack.getMaxDamage()) entity.replaceItemInInventory(slot, ItemStack.EMPTY);
if(damage > stack.getMaxDamage()) InventoryUtils.replaceItemInInventory(entity, slot, stack, ItemStack.EMPTY);
stack.setItemDamage(damage + 1);
}
@@ -5,14 +5,19 @@ import electroblob.wizardry.registry.WizardrySounds;
import electroblob.wizardry.registry.WizardryTabs;
import electroblob.wizardry.util.EntityUtils;
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.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.EnumAction;
import net.minecraft.item.EnumRarity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ActionResult;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumHand;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
@@ -25,15 +30,17 @@ public class ItemManaFlask extends Item {
public enum Size {
SMALL(75, EnumRarity.COMMON),
MEDIUM(700, EnumRarity.COMMON),
LARGE(1400, EnumRarity.RARE);
SMALL(75, 25, EnumRarity.COMMON),
MEDIUM(350, 40, EnumRarity.COMMON),
LARGE(1400, 60, EnumRarity.RARE);
public int capacity;
public int useDuration;
public EnumRarity rarity;
Size(int capacity, EnumRarity rarity){
Size(int capacity, int useDuration, EnumRarity rarity){
this.capacity = capacity;
this.useDuration = useDuration;
this.rarity = rarity;
}
}
@@ -58,6 +65,16 @@ public class ItemManaFlask extends Item {
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
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);
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()) flask.shrink(1);
player.getCooldownTracker().setCooldown(this, 20);
if(stacks.stream().anyMatch(s -> s.getItem() instanceof IManaStoringItem && !((IManaStoringItem)s.getItem()).isManaFull(s))){
player.setActiveHand(hand);
return new ActionResult<>(EnumActionResult.SUCCESS, flask);
}else{
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;
}
}
@@ -2,6 +2,7 @@ package electroblob.wizardry.item;
import electroblob.wizardry.Wizardry;
import electroblob.wizardry.registry.Spells;
import electroblob.wizardry.util.InventoryUtils;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
@@ -105,7 +106,7 @@ public class ItemSpectralBow extends ItemBow implements IConjuredItem {
@Override
public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean selected){
int damage = stack.getItemDamage();
if(damage > stack.getMaxDamage()) entity.replaceItemInInventory(slot, ItemStack.EMPTY);
if(damage > stack.getMaxDamage()) InventoryUtils.replaceItemInInventory(entity, slot, stack, ItemStack.EMPTY);
stack.setItemDamage(damage + 1);
}
@@ -1,6 +1,7 @@
package electroblob.wizardry.item;
import electroblob.wizardry.registry.Spells;
import electroblob.wizardry.util.InventoryUtils;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
@@ -62,7 +63,7 @@ public class ItemSpectralPickaxe extends ItemPickaxe implements IConjuredItem {
@Override
public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean selected){
int damage = stack.getItemDamage();
if(damage > stack.getMaxDamage()) entity.replaceItemInInventory(slot, ItemStack.EMPTY);
if(damage > stack.getMaxDamage()) InventoryUtils.replaceItemInInventory(entity, slot, stack, ItemStack.EMPTY);
stack.setItemDamage(damage + 1);
}
@@ -3,6 +3,7 @@ package electroblob.wizardry.item;
import com.google.common.collect.Multimap;
import electroblob.wizardry.registry.Spells;
import electroblob.wizardry.util.EntityUtils;
import electroblob.wizardry.util.InventoryUtils;
import net.minecraft.entity.Entity;
import net.minecraft.entity.SharedMonsterAttributes;
import net.minecraft.entity.ai.attributes.AttributeModifier;
@@ -77,7 +78,7 @@ public class ItemSpectralSword extends ItemSword implements IConjuredItem {
@Override
public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean selected){
int damage = stack.getItemDamage();
if(damage > stack.getMaxDamage()) entity.replaceItemInInventory(slot, ItemStack.EMPTY);
if(damage > stack.getMaxDamage()) InventoryUtils.replaceItemInInventory(entity, slot, stack, ItemStack.EMPTY);
stack.setItemDamage(damage + 1);
}
@@ -101,7 +101,7 @@ public class ItemWand extends Item implements IWorkbenchItem, ISpellCastingItem,
|| s.getItemUseAction() == SpellActions.GRAPPLE
|| s.getItemUseAction() == SpellActions.SUMMON) ? 1 : 0);
}
@Override
public Spell getCurrentSpell(ItemStack 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);
ItemStack newWand = new ItemStack(WizardryItems.getWand(tier, this.element));
ItemStack newWand = new ItemStack(getWand(tier, this.element));
newWand.setTagCompound(wand.getTagCompound());
// This needs to be done after copying the tag compound so the mana capacity for the new wand
// takes storage upgrades into account
@@ -783,6 +783,30 @@ public class ItemWand extends Item implements IWorkbenchItem, ISpellCastingItem,
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
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()){
ItemStack original = centre.getStack().copy();
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.
@@ -1,17 +1,18 @@
package electroblob.wizardry.item;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import com.google.common.collect.Streams;
import electroblob.wizardry.Wizardry;
import electroblob.wizardry.client.DrawingUtils;
import electroblob.wizardry.constants.Constants;
import electroblob.wizardry.constants.Element;
import electroblob.wizardry.event.SpellCastEvent;
import electroblob.wizardry.registry.WizardryAdvancementTriggers;
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.WizardryTabs;
import electroblob.wizardry.spell.Spell;
import electroblob.wizardry.util.EntityUtils.Operations;
import electroblob.wizardry.util.InventoryUtils;
import electroblob.wizardry.util.SpellModifiers;
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.player.EntityPlayer;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.inventory.EntityEquipmentSlot.Type;
import net.minecraft.inventory.Slot;
import net.minecraft.item.Item;
import net.minecraft.item.ItemArmor;
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.TextFormatting;
import net.minecraft.world.World;
import net.minecraftforge.event.entity.living.LivingEquipmentChangeEvent;
import net.minecraftforge.event.entity.living.LivingSetAttackTargetEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
@@ -39,22 +44,69 @@ import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import javax.annotation.Nullable;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import java.util.*;
import java.util.function.Supplier;
@Mod.EventBusSubscriber
public class ItemWizardArmour extends ItemArmor implements IWorkbenchItem, IManaStoringItem {
// VanillaCopy, ItemArmor has this set to private for some reason.
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")};
// Damage reduction values that used to be in WizardryItems.SILK [feet, legs, chest, head]
private static int[] reductions = new int[]{2, 4, 5, 2};
public Element element;
// Full set bonuses
private static final float SAGE_OTHER_COST_REDUCTION = 0.2f;
private static final float WARLOCK_SPEED_BOOST = 0.2f;
private static final UUID WARLOCK_SPEED_BOOST_UUID = UUID.fromString("4bad7152-2663-4b1b-bb59-552e92847031");
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){
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;
setCreativeTab(WizardryTabs.GEAR);
WizardryRecipes.addToManaFlaskCharging(this);
@@ -94,15 +146,75 @@ public class ItemWizardArmour extends ItemArmor implements IWorkbenchItem, IMana
@SideOnly(Side.CLIENT)
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){
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),
(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
@@ -118,25 +230,18 @@ public class ItemWizardArmour extends ItemArmor implements IWorkbenchItem, IMana
// Legs use modelBiped
if(armourSlot == EntityEquipmentSlot.LEGS && !entityLiving.isInvisible()) return null;
return Wizardry.proxy.getWizardArmourModel();
return Wizardry.proxy.getWizardArmourModel(getArmorMaterial());
}
@Override
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
// 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 = armourClass.name + "_armour";
String s = "wizard_armour";
if(Wizardry.tisTheSeason){
if(Wizardry.tisTheSeason && armourClass == ArmourClass.WIZARD){
s = s + "_festive";
}else{
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";
@@ -155,34 +260,6 @@ public class ItemWizardArmour extends ItemArmor implements IWorkbenchItem, IMana
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
@Override
@@ -196,17 +273,17 @@ public class ItemWizardArmour extends ItemArmor implements IWorkbenchItem, IMana
@Override
public ItemStack applyUpgrade(@Nullable EntityPlayer player, ItemStack stack, ItemStack upgrade){
// Applies legendary upgrade
if(upgrade.getItem() == WizardryItems.armour_upgrade){
if(!stack.hasTagCompound()){
stack.setTagCompound(new NBTTagCompound());
}
if(!stack.getTagCompound().hasKey("legendary")){
stack.getTagCompound().setBoolean("legendary", true);
upgrade.shrink(1);
if(player != null) WizardryAdvancementTriggers.legendary.triggerFor(player);
// Apply class upgrades
if(this.armourClass == ArmourClass.WIZARD){
for(ArmourClass armourClass : ArmourClass.values()){
if(upgrade.getItem() == armourClass.upgradeItem.get()){
Item newArmour = getArmour(this.element, armourClass, this.getEquipmentSlot());
ItemStack newStack = new ItemStack(newArmour);
((ItemWizardArmour)newArmour).setMana(newStack, this.getMana(stack));
newStack.setTagCompound(stack.getTagCompound());
upgrade.shrink(1);
return newStack;
}
}
}
@@ -221,7 +298,7 @@ public class ItemWizardArmour extends ItemArmor implements IWorkbenchItem, IMana
if(upgrade.getHasStack()){
ItemStack original = centre.getStack().copy();
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
@@ -252,34 +329,43 @@ public class ItemWizardArmour extends ItemArmor implements IWorkbenchItem, IMana
// Event Handlers
// @SubscribeEvent
// public static void onLivingUpdateEvent(LivingUpdateEvent event){
//
// if(event.getEntityLiving() instanceof EntityPlayer){
//
// EntityPlayer player = (EntityPlayer)event.getEntityLiving();
//
// for(ItemStack stack : player.getArmorInventoryList()){
// if(!(stack.getItem() instanceof ItemWizardArmour)){
// return; // If any of the armour slots doesn't contain wizard armour, don't trigger the achievement.
// }
// }
// // If it gets this far, then all slots must be wizard armour, so trigger the achievement.
// WizardryAdvancementTriggers.armour_set.triggerFor(player);
// }
// }
// Can't use Item#getItemAttributeModifiers because it's not player-sensitive, grrr
@SubscribeEvent
public static void onLivingEquipmentChangeEvent(LivingEquipmentChangeEvent event){
IAttributeInstance movementSpeed = event.getEntityLiving().getAttributeMap().getAttributeInstance(SharedMonsterAttributes.MOVEMENT_SPEED);
if(isWearingFullSet(event.getEntityLiving(), null, ArmourClass.WARLOCK)){
// Only apply the modifier once (can't just check this is the helmet since it might not be the last piece equipped)
if(movementSpeed.getModifier(WARLOCK_SPEED_BOOST_UUID) == null){
movementSpeed.applyModifier(new AttributeModifier(WARLOCK_SPEED_BOOST_UUID, "Warlock set bonus", WARLOCK_SPEED_BOOST, Operations.MULTIPLY_FLAT));
}
}else{
movementSpeed.removeModifier(WARLOCK_SPEED_BOOST_UUID);
}
}
@SubscribeEvent(priority = EventPriority.LOW)
public static void onSpellCastPreEvent(SpellCastEvent.Pre event){
// Armour cost reduction
if(event.getCaster() == null) return;
int armourPieces = getMatchingArmourCount(event.getCaster(), event.getSpell().getElement());
float multiplier = 1f - armourPieces * Constants.COST_REDUCTION_PER_ARMOUR;
if(armourPieces == InventoryUtils.ARMOUR_SLOTS.length) multiplier -= Constants.FULL_ARMOUR_SET_BONUS;
event.getModifiers().set(SpellModifiers.COST, event.getModifiers().get(SpellModifiers.COST) * multiplier, false);
final SpellModifiers armourModifiers = new SpellModifiers();
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){
return (int)Arrays.stream(InventoryUtils.ARMOUR_SLOTS)
.map(s -> entity.getItemStackFromSlot(s).getItem())
@@ -287,6 +373,49 @@ public class ItemWizardArmour extends ItemArmor implements IWorkbenchItem, IMana
.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
public static void onLivingSetAttackTargetEvent(LivingSetAttackTargetEvent event){
// 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;
float f = (float)armourPieces / ((EntityPlayer)event.getTarget()).inventory.armorInventory.size();
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
if(event.getTarget().getDistance(event.getEntity()) > followRange) ((EntityLiving)event.getEntityLiving()).setAttackTarget(null);
}
@@ -9,9 +9,9 @@ import electroblob.wizardry.packet.WizardryPacketHandler;
import electroblob.wizardry.util.Box;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraftforge.event.entity.EntityJoinWorldEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.PlayerEvent.PlayerLoggedInEvent;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import java.util.List;
@@ -37,6 +37,9 @@ public class DonationPerksHandler {
.put(UUID.fromString("32ca0099-c1d6-4682-82ab-8f06059bb801"), new Box<>(Element.MAGIC))
.put(UUID.fromString("0a704e20-1e7a-413e-9122-fae5b244a05e"), new Box<>(Element.MAGIC))
.put(UUID.fromString("41fec037-12a5-4b19-868e-b62e39952e96"), new Box<>(Element.MAGIC))
.put(UUID.fromString("3f5e0cec-949a-4dd4-ae60-f4eae481dd06"), new Box<>(Element.MAGIC))
.put(UUID.fromString("3ad78c5f-d8cf-47f1-bff9-a890f8e638ff"), new Box<>(Element.MAGIC))
.put(UUID.fromString("93479771-d23a-4d80-8868-2950e144500b"), new Box<>(Element.MAGIC))
.build();
/** Returns true if the given player's UUID appears in the list of donor UUIDs, false otherwise (thread-safe). */
@@ -59,7 +62,7 @@ public class DonationPerksHandler {
Box<Element> box = DONOR_UUID_MAP.get(player.getUniqueID());
if(box != null && box.get() != element){
box.set(element);
syncAll();
syncAll(player.dimension);
}
}
@@ -70,11 +73,11 @@ public class DonationPerksHandler {
return box == null ? null : box.get();
}
/** Sends the current donor perk information to all connected players (server-side only). */
private static void syncAll(){
/** Sends the current donor perk information to all players in the given dimension (server-side only). */
private static void syncAll(int dimension){
Wizardry.logger.info("Sending global donation perk settings to all players");
PacketSyncDonationPerks.Message packet = new PacketSyncDonationPerks.Message(DONOR_UUID_MAP.values().stream().map(Box::get).collect(Collectors.toList()));
WizardryPacketHandler.net.sendToAll(packet);
WizardryPacketHandler.net.sendToDimension(packet, dimension);
}
/** Sends the current donor perk information to the given player (server-side only). */
@@ -92,13 +95,13 @@ public class DonationPerksHandler {
}
@SubscribeEvent
public static void onPlayerLoggedInEvent(PlayerLoggedInEvent event){
if(event.player instanceof EntityPlayerMP){
public static void onEntityJoinWorldEvent(EntityJoinWorldEvent event){
if(event.getEntity() instanceof EntityPlayerMP){
// Send donation perks to anyone who logs in
syncWith((EntityPlayerMP)event.player);
}else{
syncWith((EntityPlayerMP)event.getEntity());
}else if(event.getEntity() instanceof EntityPlayer){
// Send donation perks setting to the server if the player is a donor
if(isDonor(event.player)) sendToServer(event.player);
if(isDonor((EntityPlayer)event.getEntity())) sendToServer((EntityPlayer)event.getEntity());
}
}
@@ -15,8 +15,10 @@ import electroblob.wizardry.event.SpellCastEvent;
import electroblob.wizardry.item.ItemArtefact;
import electroblob.wizardry.registry.*;
import electroblob.wizardry.spell.Banish;
import electroblob.wizardry.spell.Spell;
import electroblob.wizardry.util.BlockUtils;
import electroblob.wizardry.util.EntityUtils;
import electroblob.wizardry.util.SpellProperties.Context;
import net.minecraft.entity.effect.EntityLightningBolt;
import net.minecraft.entity.item.EntityFallingBlock;
import net.minecraft.entity.passive.EntitySquid;
@@ -296,6 +298,7 @@ public abstract class Forfeit {
}));
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;
w.getWorldInfo().setRaining(true);
w.getWorldInfo().setRainTime(standardWeatherTime);
@@ -3,7 +3,6 @@ package electroblob.wizardry.packet;
import electroblob.wizardry.spell.Spell;
import electroblob.wizardry.util.SpellProperties;
import io.netty.buffer.ByteBuf;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
@@ -18,13 +17,11 @@ public class PacketSpellProperties implements IMessageHandler<PacketSpellPropert
public IMessage onMessage(Message message, MessageContext ctx){
// Just to make sure that the side is correct
if(ctx.side.isServer()){
if(ctx.side.isClient()){
final EntityPlayerMP player = ctx.getServerHandler().player;
player.getServerWorld().addScheduledTask(() -> {
net.minecraft.client.Minecraft.getMinecraft().addScheduledTask(() -> {
for(int i=0; i<message.propertiesArray.length; i++){
Spell.byNetworkID(i).setProperties(message.propertiesArray[i]);
Spell.byNetworkID(i).setPropertiesClient(message.propertiesArray[i]);
}
});
}
@@ -17,7 +17,6 @@ public final class WizardryAdvancementTriggers {
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 special_upgrade = new CustomAdvancementTrigger("trigger_special_upgrade");
public static final CustomAdvancementTrigger anger_wizard = new CustomAdvancementTrigger("trigger_anger_wizard");
@@ -35,7 +34,6 @@ public final class WizardryAdvancementTriggers {
public static void register(){
CriteriaTriggers.register(legendary);
CriteriaTriggers.register(max_out_wand);
CriteriaTriggers.register(special_upgrade);
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.EntitySparkBomb;
import electroblob.wizardry.item.*;
import electroblob.wizardry.item.ItemWizardArmour.ArmourClass;
import electroblob.wizardry.misc.BehaviourSpellDispense;
import electroblob.wizardry.registry.WizardryTabs.CreativeTabListed;
import electroblob.wizardry.registry.WizardryTabs.CreativeTabSorted;
@@ -18,7 +19,6 @@ import net.minecraft.dispenser.BehaviorProjectileDispense;
import net.minecraft.dispenser.IPosition;
import net.minecraft.entity.IProjectile;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.inventory.EntityEquipmentSlot.Type;
import net.minecraft.item.EnumRarity;
import net.minecraft.item.Item;
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.registry.GameRegistry.ObjectHolder;
import net.minecraftforge.registries.IForgeRegistry;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
import javax.annotation.Nonnull;
import java.util.Arrays;
import java.util.HashMap;
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
@@ -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 ArmorMaterial SILK = EnumHelper.addArmorMaterial("SILK", "wizardry/textures/armour/wizard_armour",
15, new int[]{0, 0, 0, 0}, 15, WizardrySounds.ITEM_ARMOUR_EQUIP_SILK, 0.0F);
// The parameter textureName is incorrectly-named, it's actually the name field in ArmorMaterial
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 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 purifying_elixir = placeholder();
@@ -199,6 +204,126 @@ public final class WizardryItems {
public static final Item wizard_leggings_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_chestplate = 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_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
* immutable map stored in {@link WizardryItems#WAND_MAP}. Currently used for upgrading wands, for chest generation
* and to iterate through wands for charging recipes.
* Helper method to return the appropriate wand based on tier and element. As of Wizardry 4.3.3, this delegates to
* the cleaner replacement method {@link ItemWand#getWand(Tier, Element)}, which accesses the item registry
* dynamically by generating the registry name on the fly.
*
* @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.
* @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)}.
* @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)}. 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
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;
return WAND_MAP.get(ImmutablePair.of(tier, element));
return ItemWand.getWand(tier, element); // Delegate to replacement method
}
/**
* Helper method to return the appropriate armour item based on element and slot. As of Wizardry 2.1, this uses the
* immutable map stored in {@link WizardryItems#ARMOUR_MAP}. Currently used to iterate through armour for
* registering charging recipes and for chest generation.
* Helper method to return the appropriate armour item based on element and slot. As of Wizardry 4.3.3, this
* delegates to the cleaner replacement method {@link ItemWizardArmour#getArmour(Element, ArmourClass, EntityEquipmentSlot)},
* 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 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.
* @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
* 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
public static Item getArmour(Element element, EntityEquipmentSlot slot){
if(slot == null || slot.getSlotType() != Type.ARMOR)
throw new IllegalArgumentException("Must be a valid armour slot");
if(element == null) element = Element.MAGIC;
return ARMOUR_MAP.get(ImmutablePair.of(slot, element));
return ItemWizardArmour.getArmour(element, ArmourClass.WIZARD, slot); // Delegate to replacement method
}
/**
@@ -444,218 +567,340 @@ public final class WizardryItems {
// Items
registerItem(registry, "magic_crystal", new ItemCrystal());
registerItem(registry, "magic_crystal", new ItemCrystal());
registerItem(registry, "crystal_shard", new Item().setCreativeTab(WizardryTabs.WIZARDRY));
registerItem(registry, "grand_crystal", 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, "wizard_handbook", new ItemWizardHandbook(), true);
registerItem(registry, "arcane_tome", new ItemArcaneTome());
registerItem(registry, "spell_book", new ItemSpellBook(), true);
registerItem(registry, "scroll", new ItemScroll());
registerItem(registry, "ruined_spell_book", new Item().setCreativeTab(WizardryTabs.WIZARDRY).setMaxStackSize(16));
registerItem(registry, "wizard_handbook", new ItemWizardHandbook(), true);
registerItem(registry, "arcane_tome", new ItemArcaneTome());
registerItem(registry, "spell_book", new ItemSpellBook(), true);
registerItem(registry, "scroll", new ItemScroll());
registerItem(registry, "ruined_spell_book", new Item().setCreativeTab(WizardryTabs.WIZARDRY).setMaxStackSize(16));
registerItem(registry, "magic_wand", new ItemWand(Tier.NOVICE, null));
registerItem(registry, "apprentice_wand", new ItemWand(Tier.APPRENTICE, null));
registerItem(registry, "advanced_wand", new ItemWand(Tier.ADVANCED, null));
registerItem(registry, "master_wand", new ItemWand(Tier.MASTER, null));
registerItem(registry, "magic_wand", new ItemWand(Tier.NOVICE, null));
registerItem(registry, "apprentice_wand", new ItemWand(Tier.APPRENTICE, null));
registerItem(registry, "advanced_wand", new ItemWand(Tier.ADVANCED, null));
registerItem(registry, "master_wand", new ItemWand(Tier.MASTER, null));
registerItem(registry, "novice_fire_wand", new ItemWand(Tier.NOVICE, 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, "master_fire_wand", new ItemWand(Tier.MASTER, 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, "advanced_fire_wand", new ItemWand(Tier.ADVANCED, 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, "apprentice_ice_wand", new ItemWand(Tier.APPRENTICE, 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, "novice_ice_wand", new ItemWand(Tier.NOVICE, 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, "master_ice_wand", new ItemWand(Tier.MASTER, Element.ICE));
registerItem(registry, "novice_lightning_wand", new ItemWand(Tier.NOVICE, 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, "master_lightning_wand", new ItemWand(Tier.MASTER, 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, "advanced_lightning_wand", new ItemWand(Tier.ADVANCED, 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, "apprentice_necromancy_wand", new ItemWand(Tier.APPRENTICE, 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, "novice_necromancy_wand", new ItemWand(Tier.NOVICE, 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, "master_necromancy_wand", new ItemWand(Tier.MASTER, Element.NECROMANCY));
registerItem(registry, "novice_earth_wand", new ItemWand(Tier.NOVICE, 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, "master_earth_wand", new ItemWand(Tier.MASTER, 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, "advanced_earth_wand", new ItemWand(Tier.ADVANCED, 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, "apprentice_sorcery_wand", new ItemWand(Tier.APPRENTICE, 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, "novice_sorcery_wand", new ItemWand(Tier.NOVICE, 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, "master_sorcery_wand", new ItemWand(Tier.MASTER, Element.SORCERY));
registerItem(registry, "novice_healing_wand", new ItemWand(Tier.NOVICE, 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, "master_healing_wand", new ItemWand(Tier.MASTER, 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, "advanced_healing_wand", new ItemWand(Tier.ADVANCED, Element.HEALING));
registerItem(registry, "master_healing_wand", new ItemWand(Tier.MASTER, Element.HEALING));
registerItem(registry, "spectral_sword", new ItemSpectralSword(ToolMaterial.IRON));
registerItem(registry, "spectral_pickaxe", new ItemSpectralPickaxe(ToolMaterial.IRON));
registerItem(registry, "spectral_bow", new ItemSpectralBow());
registerItem(registry, "spectral_sword", new ItemSpectralSword(ToolMaterial.IRON));
registerItem(registry, "spectral_pickaxe", new ItemSpectralPickaxe(ToolMaterial.IRON));
registerItem(registry, "spectral_bow", new ItemSpectralBow());
registerItem(registry, "blank_scroll", new ItemBlankScroll());
registerItem(registry, "magic_silk", new Item().setCreativeTab(WizardryTabs.WIZARDRY));
registerItem(registry, "blank_scroll", new ItemBlankScroll());
registerItem(registry, "magic_silk", new Item().setCreativeTab(WizardryTabs.WIZARDRY));
registerItem(registry, "small_mana_flask", new ItemManaFlask(ItemManaFlask.Size.SMALL));
registerItem(registry, "medium_mana_flask", new ItemManaFlask(ItemManaFlask.Size.MEDIUM));
registerItem(registry, "large_mana_flask", new ItemManaFlask(ItemManaFlask.Size.LARGE));
registerItem(registry, "small_mana_flask", new ItemManaFlask(ItemManaFlask.Size.SMALL));
registerItem(registry, "medium_mana_flask", new ItemManaFlask(ItemManaFlask.Size.MEDIUM));
registerItem(registry, "large_mana_flask", new ItemManaFlask(ItemManaFlask.Size.LARGE));
registerItem(registry, "storage_upgrade", new ItemWandUpgrade());
registerItem(registry, "siphon_upgrade", new ItemWandUpgrade());
registerItem(registry, "condenser_upgrade", new ItemWandUpgrade());
registerItem(registry, "range_upgrade", new ItemWandUpgrade());
registerItem(registry, "duration_upgrade", new ItemWandUpgrade());
registerItem(registry, "cooldown_upgrade", new ItemWandUpgrade());
registerItem(registry, "blast_upgrade", new ItemWandUpgrade());
registerItem(registry, "attunement_upgrade", new ItemWandUpgrade());
registerItem(registry, "melee_upgrade", new ItemWandUpgrade());
registerItem(registry, "storage_upgrade", new ItemWandUpgrade());
registerItem(registry, "siphon_upgrade", new ItemWandUpgrade());
registerItem(registry, "condenser_upgrade", new ItemWandUpgrade());
registerItem(registry, "range_upgrade", new ItemWandUpgrade());
registerItem(registry, "duration_upgrade", new ItemWandUpgrade());
registerItem(registry, "cooldown_upgrade", new ItemWandUpgrade());
registerItem(registry, "blast_upgrade", new ItemWandUpgrade());
registerItem(registry, "attunement_upgrade", new ItemWandUpgrade());
registerItem(registry, "melee_upgrade", new ItemWandUpgrade());
registerItem(registry, "flaming_axe", new ItemFlamingAxe(Materials.MAGICAL));
registerItem(registry, "frost_axe", new ItemFrostAxe(Materials.MAGICAL));
registerItem(registry, "flaming_axe", new ItemFlamingAxe(Materials.MAGICAL));
registerItem(registry, "frost_axe", new ItemFrostAxe(Materials.MAGICAL));
registerItem(registry, "identification_scroll", new ItemIdentificationScroll());
registerItem(registry, "armour_upgrade", 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, "identification_scroll", new ItemIdentificationScroll());
registerItem(registry, "resplendent_thread", new ItemArmourUpgrade());
registerItem(registry, "crystal_silver_plating", new ItemArmourUpgrade());
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, "poison_bomb", new ItemPoisonBomb());
registerItem(registry, "smoke_bomb", new ItemSmokeBomb());
registerItem(registry, "spark_bomb", new ItemSparkBomb());
registerItem(registry, "firebomb", new ItemFirebomb());
registerItem(registry, "poison_bomb", new ItemPoisonBomb());
registerItem(registry, "smoke_bomb", new ItemSmokeBomb());
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_robe", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.CHEST, null));
registerItem(registry, "wizard_leggings", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.LEGS, null));
registerItem(registry, "wizard_boots", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.FEET, null));
registerItem(registry, "wizard_hat", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.HEAD, null), true);
registerItem(registry, "wizard_robe", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.CHEST, null));
registerItem(registry, "wizard_leggings", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.LEGS, 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_robe_fire", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.CHEST, Element.FIRE));
registerItem(registry, "wizard_leggings_fire", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.LEGS, Element.FIRE));
registerItem(registry, "wizard_boots_fire", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.FEET, Element.FIRE));
registerItem(registry, "wizard_hat_fire", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.HEAD, Element.FIRE));
registerItem(registry, "wizard_robe_fire", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.CHEST, Element.FIRE));
registerItem(registry, "wizard_leggings_fire", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.LEGS, 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_robe_ice", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.CHEST, Element.ICE));
registerItem(registry, "wizard_leggings_ice", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.LEGS, Element.ICE));
registerItem(registry, "wizard_boots_ice", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.FEET, Element.ICE));
registerItem(registry, "wizard_hat_ice", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.HEAD, Element.ICE));
registerItem(registry, "wizard_robe_ice", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.CHEST, Element.ICE));
registerItem(registry, "wizard_leggings_ice", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.LEGS, 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_robe_lightning", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.CHEST, Element.LIGHTNING));
registerItem(registry, "wizard_leggings_lightning", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.LEGS, Element.LIGHTNING));
registerItem(registry, "wizard_boots_lightning", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.FEET, Element.LIGHTNING));
registerItem(registry, "wizard_hat_lightning", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.HEAD, Element.LIGHTNING));
registerItem(registry, "wizard_robe_lightning", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.CHEST, Element.LIGHTNING));
registerItem(registry, "wizard_leggings_lightning", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.LEGS, 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_robe_necromancy", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.CHEST, Element.NECROMANCY));
registerItem(registry, "wizard_leggings_necromancy", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.LEGS, Element.NECROMANCY));
registerItem(registry, "wizard_boots_necromancy", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.FEET, Element.NECROMANCY));
registerItem(registry, "wizard_hat_necromancy", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.HEAD, Element.NECROMANCY));
registerItem(registry, "wizard_robe_necromancy", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.CHEST, Element.NECROMANCY));
registerItem(registry, "wizard_leggings_necromancy", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.LEGS, 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_robe_earth", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.CHEST, Element.EARTH));
registerItem(registry, "wizard_leggings_earth", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.LEGS, Element.EARTH));
registerItem(registry, "wizard_boots_earth", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.FEET, Element.EARTH));
registerItem(registry, "wizard_hat_earth", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.HEAD, Element.EARTH));
registerItem(registry, "wizard_robe_earth", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.CHEST, Element.EARTH));
registerItem(registry, "wizard_leggings_earth", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.LEGS, 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_robe_sorcery", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.CHEST, Element.SORCERY));
registerItem(registry, "wizard_leggings_sorcery", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.LEGS, Element.SORCERY));
registerItem(registry, "wizard_boots_sorcery", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.FEET, Element.SORCERY));
registerItem(registry, "wizard_hat_sorcery", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.HEAD, Element.SORCERY));
registerItem(registry, "wizard_robe_sorcery", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.CHEST, Element.SORCERY));
registerItem(registry, "wizard_leggings_sorcery", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.LEGS, 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_robe_healing", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.CHEST, Element.HEALING));
registerItem(registry, "wizard_leggings_healing", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.LEGS, Element.HEALING));
registerItem(registry, "wizard_boots_healing", new ItemWizardArmour(Materials.SILK, 1, EntityEquipmentSlot.FEET, Element.HEALING));
registerItem(registry, "wizard_hat_healing", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.HEAD, Element.HEALING));
registerItem(registry, "wizard_robe_healing", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.CHEST, Element.HEALING));
registerItem(registry, "wizard_leggings_healing", new ItemWizardArmour(ArmourClass.WIZARD, EntityEquipmentSlot.LEGS, 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, "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, "sage_hat", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.HEAD, null));
registerItem(registry, "sage_robe", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.CHEST, null));
registerItem(registry, "sage_leggings", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.LEGS, null));
registerItem(registry, "sage_boots", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.FEET, null));
registerItem(registry, "lightning_hammer", new ItemLightningHammer());
registerItem(registry, "flamecatcher", new ItemFlamecatcher());
registerItem(registry, "sage_hat_fire", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.HEAD, Element.FIRE));
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, "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, "sage_hat_ice", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.HEAD, Element.ICE));
registerItem(registry, "sage_robe_ice", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.CHEST, Element.ICE));
registerItem(registry, "sage_leggings_ice", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.LEGS, Element.ICE));
registerItem(registry, "sage_boots_ice", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.FEET, Element.ICE));
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, "sage_hat_lightning", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.HEAD, Element.LIGHTNING));
registerItem(registry, "sage_robe_lightning", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.CHEST, Element.LIGHTNING));
registerItem(registry, "sage_leggings_lightning", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.LEGS, Element.LIGHTNING));
registerItem(registry, "sage_boots_lightning", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.FEET, Element.LIGHTNING));
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));
registerItem(registry, "sage_hat_necromancy", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.HEAD, Element.NECROMANCY));
registerItem(registry, "sage_robe_necromancy", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.CHEST, Element.NECROMANCY));
registerItem(registry, "sage_leggings_necromancy", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.LEGS, Element.NECROMANCY));
registerItem(registry, "sage_boots_necromancy", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.FEET, Element.NECROMANCY));
registerItem(registry, "sage_hat_earth", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.HEAD, Element.EARTH));
registerItem(registry, "sage_robe_earth", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.CHEST, Element.EARTH));
registerItem(registry, "sage_leggings_earth", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.LEGS, Element.EARTH));
registerItem(registry, "sage_boots_earth", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.FEET, Element.EARTH));
registerItem(registry, "sage_hat_sorcery", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.HEAD, Element.SORCERY));
registerItem(registry, "sage_robe_sorcery", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.CHEST, Element.SORCERY));
registerItem(registry, "sage_leggings_sorcery", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.LEGS, Element.SORCERY));
registerItem(registry, "sage_boots_sorcery", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.FEET, Element.SORCERY));
registerItem(registry, "sage_hat_healing", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.HEAD, Element.HEALING));
registerItem(registry, "sage_robe_healing", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.CHEST, Element.HEALING));
registerItem(registry, "sage_leggings_healing", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.LEGS, Element.HEALING));
registerItem(registry, "sage_boots_healing", new ItemWizardArmour(ArmourClass.SAGE, EntityEquipmentSlot.FEET, Element.HEALING));
registerItem(registry, "battlemage_helmet", new ItemWizardArmour(ArmourClass.BATTLEMAGE, EntityEquipmentSlot.HEAD, null));
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);
}
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_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_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_MANA_FLASK_USE = createSound("item.mana_flask.use");
public static final SoundEvent ITEM_MANA_FLASK_RECHARGE = createSound("item.mana_flask.recharge");
@@ -47,10 +47,12 @@ public class ArcaneLock extends SpellRay {
if(caster instanceof EntityPlayer){
if(toggleLock(world, pos, (EntityPlayer)caster)){
BlockPos otherHalf = BlockUtils.getConnectedChest(world, pos);
if(otherHalf != null) toggleLock(world, otherHalf, (EntityPlayer)caster);
return true;
if(!world.isRemote){
if(toggleLock(world, pos, (EntityPlayer)caster)){
BlockPos otherHalf = BlockUtils.getConnectedChest(world, pos);
if(otherHalf != null) toggleLock(world, otherHalf, (EntityPlayer)caster);
return true;
}
}
}
@@ -67,11 +69,13 @@ public class ArcaneLock extends SpellRay {
// Unlocking
if(world.getPlayerEntityByUUID(tileentity.getTileData().getUniqueId(NBT_KEY)) == player){
NBTExtras.removeUniqueId(tileentity.getTileData(), NBT_KEY);
world.markAndNotifyBlock(pos, null, world.getBlockState(pos), world.getBlockState(pos), 3);
return true;
}
}else{
// Locking
tileentity.getTileData().setUniqueId(NBT_KEY, player.getUniqueID());
world.markAndNotifyBlock(pos, null, world.getBlockState(pos), world.getBlockState(pos), 3);
return true;
}
}
@@ -12,11 +12,13 @@ import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.math.Vec3d;
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.SubscribeEvent;
import javax.annotation.Nullable;
@EventBusSubscriber
public class FontOfMana extends SpellAreaEffect {
public FontOfMana(){
@@ -17,6 +17,8 @@ import java.util.List;
public class GrowthAura extends Spell {
private static final int FULL_GROWTH_TIMEOUT = 100;
public GrowthAura(){
super("growth_aura", SpellActions.POINT_DOWN, false);
addProperties(EFFECT_RADIUS);
@@ -49,7 +51,8 @@ public class GrowthAura extends Spell {
if(!world.isRemote){
if(plant.canUseBonemeal(world, world.rand, pos, state)){
if(world.rand.nextFloat() < 0.35f && ItemArtefact.isArtefactActive(caster, WizardryItems.charm_growth)){
while(plant.canGrow(world, pos, state, false)){
int i = 0;
while(plant.canGrow(world, pos, state, false) && i++ < FULL_GROWTH_TIMEOUT){
plant.grow(world, world.rand, pos, state);
state = world.getBlockState(pos); // Update the state with the new one
plant = (IGrowable)state.getBlock(); // Update the block with the new one
@@ -49,52 +49,62 @@ public class LightningWeb extends SpellRay {
protected void playSound(World world, double x, double y, double z, int ticksInUse, int duration, SpellModifiers modifiers, String... sounds){
this.playSoundLoop(world, x, y, z, ticksInUse, duration);
}
@Override
protected boolean onEntityHit(World world, Entity target, Vec3d hit, EntityLivingBase caster, Vec3d origin, int ticksInUse, SpellModifiers modifiers){
if(EntityUtils.isLiving(target)){
electrocute(world, caster, origin, target, getProperty(PRIMARY_DAMAGE).floatValue()
* modifiers.get(SpellModifiers.POTENCY), ticksInUse);
// Secondary chaining effect
List<EntityLivingBase> secondaryTargets = EntityUtils.getLivingWithinRadius(
getProperty(SECONDARY_RANGE).floatValue(), target.posX, target.posY + target.height / 2,
target.posZ, world);
secondaryTargets.remove(target);
secondaryTargets.removeIf(e -> !EntityUtils.isLiving(e));
secondaryTargets.removeIf(e -> !AllyDesignationSystem.isValidTarget(caster, e));
if(secondaryTargets.size() > getProperty(SECONDARY_MAX_TARGETS).intValue())
secondaryTargets = secondaryTargets.subList(0, getProperty(SECONDARY_MAX_TARGETS).intValue());
// Secondary chaining effect
for(EntityLivingBase secondaryTarget : secondaryTargets){
List<EntityLivingBase> secondaryTargets = EntityUtils.getLivingWithinRadius(
getProperty(SECONDARY_RANGE).floatValue(), target.posX, target.posY + target.height / 2,
target.posZ, world);
electrocute(world, caster, target.getPositionVector().add(0, target.height/2, 0), secondaryTarget,
getProperty(SECONDARY_DAMAGE).floatValue() * modifiers.get(SpellModifiers.POTENCY), ticksInUse);
secondaryTargets.stream()
.filter(entity -> !entity.equals(target))
.filter(EntityUtils::isLiving)
.filter(e -> AllyDesignationSystem.isValidTarget(caster, e))
.limit(getProperty(SECONDARY_MAX_TARGETS).intValue())
.forEach(secondaryTarget -> {
electrocute(world, caster,
target.getPositionVector().add(0, target.height / 2, 0),
secondaryTarget,
getProperty(SECONDARY_DAMAGE).floatValue() * modifiers.get(SpellModifiers.POTENCY),
ticksInUse
);
// Tertiary chaining effect
// Tertiary chaining effect
List<EntityLivingBase> tertiaryTargets = EntityUtils.getLivingWithinRadius(
getProperty(TERTIARY_RANGE).floatValue(), secondaryTarget.posX,
secondaryTarget.posY + secondaryTarget.height / 2, secondaryTarget.posZ, world);
tertiaryTargets.remove(target);
tertiaryTargets.removeAll(secondaryTargets);
tertiaryTargets.removeIf(e -> !EntityUtils.isLiving(e));
tertiaryTargets.removeIf(e -> !AllyDesignationSystem.isValidTarget(caster, e));
if(tertiaryTargets.size() > getProperty(TERTIARY_MAX_TARGETS).intValue())
tertiaryTargets = tertiaryTargets.subList(0, getProperty(TERTIARY_MAX_TARGETS).intValue());
List<EntityLivingBase> tertiaryTargets =
EntityUtils.getLivingWithinRadius(
getProperty(TERTIARY_RANGE).floatValue(),
secondaryTarget.posX,
secondaryTarget.posY + secondaryTarget.height / 2,
secondaryTarget.posZ,
world
);
for(EntityLivingBase tertiaryTarget : tertiaryTargets){
electrocute(world, caster, secondaryTarget.getPositionVector().add(0, secondaryTarget.height/2, 0),
tertiaryTarget, getProperty(TERTIARY_DAMAGE).floatValue() * modifiers.get(SpellModifiers.POTENCY), ticksInUse);
}
}
tertiaryTargets.stream()
.filter(entity -> !secondaryTargets.contains(entity))
.filter(entity -> !entity.equals(target))
.filter(EntityUtils::isLiving)
.filter(e -> AllyDesignationSystem.isValidTarget(caster, e))
.limit(getProperty(TERTIARY_MAX_TARGETS).intValue())
.forEach(tertiaryTarget ->
electrocute(world, caster,
secondaryTarget.getPositionVector().add(0, secondaryTarget.height / 2, 0),
tertiaryTarget,
getProperty(TERTIARY_DAMAGE).floatValue() * modifiers.get(SpellModifiers.POTENCY),
ticksInUse
)
);
});
}
return true;
}
@@ -128,10 +138,10 @@ public class LightningWeb extends SpellRay {
}
}
}
return true;
}
private void electrocute(World world, Entity caster, Vec3d origin, Entity target, float damage, int ticksInUse){
if(MagicDamage.isEntityImmune(DamageType.SHOCK, target)){
@@ -142,12 +152,12 @@ public class LightningWeb extends SpellRay {
EntityUtils.attackEntityWithoutKnockback(target,
MagicDamage.causeDirectMagicDamage(caster, DamageType.SHOCK), damage);
}
if(world.isRemote){
ParticleBuilder.create(Type.BEAM).entity(caster).clr(0.2f, 0.6f, 1)
.pos(caster != null ? origin.subtract(caster.getPositionVector()) : origin).target(target).spawn(world);
if(ticksInUse % 3 == 0){
ParticleBuilder.create(Type.LIGHTNING).entity(caster)
.pos(caster != null ? origin.subtract(caster.getPositionVector()) : origin).target(target).spawn(world);
@@ -31,9 +31,11 @@ import net.minecraft.util.text.TextComponentTranslation;
import net.minecraft.world.World;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.event.world.WorldEvent;
import net.minecraftforge.fml.common.FMLCommonHandler;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.network.FMLNetworkEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.registries.ForgeRegistry;
import net.minecraftforge.registries.IForgeRegistry;
import net.minecraftforge.registries.IForgeRegistryEntry;
@@ -136,6 +138,14 @@ public abstract class Spell extends IForgeRegistryEntry.Impl<Spell> implements C
/** The unlocalised name of the spell. */
private final String unlocalisedName;
// The spell properties system turned out to be a bit of a pain. Ideally I'd attach them to a world or whatever, but
// often we're accessing spell properties from places where a world is not available (and besides, I don't want to
// change the API now). Since spell properties are immutable and don't get reassigned while a world is loaded, in
// theory that makes them thread-safe (at least while the world is open, and they get wiped after that anyway).
// We still need to send them to clients in multiplayer (and LAN guests) so the simplest thing to do is send them
// to players' clients and only assign them if they haven't already been assigned, but without printing a warning.
// Yes, *technically* this is reaching across sides but the fields are effectively immutable so it doesn't matter.
/** This spell's associated SpellProperties object. */
private SpellProperties properties;
/** A reference to the global spell properties for this spell, so they are only loaded once. */
@@ -283,7 +293,7 @@ public abstract class Spell extends IForgeRegistryEntry.Impl<Spell> implements C
}
/** Sets this spell's properties to the given {@link SpellProperties} object, but only if it doesn't already
* have one. This prevents spell properties from being changed after initialisation. */
* have one. This prevents spell properties from being changed after initialisation. <b>Server-side only!</b> */
public void setProperties(@Nonnull SpellProperties properties){
if(!arePropertiesInitialised()){
@@ -294,20 +304,23 @@ public abstract class Spell extends IForgeRegistryEntry.Impl<Spell> implements C
}
}
/** <b>Internal, do not use.</b> Use {@link Spell#setProperties(SpellProperties)} to set a spell's properties. */
public void setPropertiesClient(SpellProperties properties){
// Quick sanity check
if(FMLCommonHandler.instance().getEffectiveSide() != Side.CLIENT) Wizardry.logger.warn("Spell#setPropertiesClient called from the server side!");
// This is like the other method but with no logging or global properties so that we can silently ignore syncing
// in singleplayer (LAN is like singleplayer because the host receives the packet before opening to LAN anyway)
if(!arePropertiesInitialised()) this.properties = properties;
}
/** Called from the event handler when a player logs in. */
public static void syncProperties(EntityPlayer player){
if(player instanceof EntityPlayerMP){
// On the server side, send a packet to the player to synchronise their spell properties
// To avoid sending extra data unnecessarily, the spell properties are sent in order of spell ID
List<Spell> spells = new ArrayList<>(registry.getValuesCollection());
spells.sort(Comparator.comparingInt(Spell::networkID));
WizardryPacketHandler.net.sendToAll(new PacketSpellProperties.Message(spells.stream()
.map(s -> s.properties).toArray(SpellProperties[]::new)));
}else{
// On the client side, wipe the spell properties so the new ones can be set
// Not sure if we can guarantee this happens before the packet arrives, but it hasn't caused any problems yet!
clearProperties();
}
public static void syncProperties(EntityPlayerMP player){
// On the server side, send a packet to the player to synchronise their spell properties
// To avoid sending extra data unnecessarily, the spell properties are sent in order of spell ID
List<Spell> spells = new ArrayList<>(registry.getValuesCollection());
spells.sort(Comparator.comparingInt(Spell::networkID));
WizardryPacketHandler.net.sendTo(new PacketSpellProperties.Message(spells.stream()
.map(s -> s.properties).toArray(SpellProperties[]::new)), player);
}
private static void clearProperties(){
@@ -561,32 +574,32 @@ public abstract class Spell extends IForgeRegistryEntry.Impl<Spell> implements C
/** Returns the tier that this spell belongs to. */
public final Tier getTier(){
return properties.tier;
return arePropertiesInitialised() ? properties.tier : Tier.NOVICE;
}
/** Returns the element that this spell belongs to. */
public final Element getElement(){
return properties.element;
return arePropertiesInitialised() ? properties.element : Element.MAGIC;
}
/** Returns the type of spell this is classified as. */
public final SpellType getType(){
return properties.type;
return arePropertiesInitialised() ? properties.type : SpellType.UTILITY;
}
/** Returns the mana cost of the spell. If it is a continuous spell the cost is per second. */
public final int getCost(){
return properties.cost;
return arePropertiesInitialised() ? properties.cost : 0;
}
/** Returns the charge-up time for the spell in ticks. */
public final int getChargeup(){
return properties.chargeup;
return arePropertiesInitialised() ? properties.chargeup : 0;
}
/** Returns the cooldown for the spell in ticks. */
public final int getCooldown(){
return properties.cooldown;
return arePropertiesInitialised() ? properties.cooldown : 0;
}
/**
@@ -595,7 +608,7 @@ public abstract class Spell extends IForgeRegistryEntry.Impl<Spell> implements C
* @return True if a property has been defined for the given identifier, false if not.
*/
public final boolean hasProperty(String identifier){
return properties.hasBaseValue(identifier);
return arePropertiesInitialised() && properties.hasBaseValue(identifier);
}
/**
@@ -611,7 +624,7 @@ public abstract class Spell extends IForgeRegistryEntry.Impl<Spell> implements C
* @throws IllegalArgumentException if no property was defined with the given identifier.
*/
public final Number getProperty(String identifier){
return properties.getBaseValue(identifier);
return arePropertiesInitialised() ? properties.getBaseValue(identifier) : 0;
}
/**
@@ -1061,6 +1074,23 @@ public abstract class Spell extends IForgeRegistryEntry.Impl<Spell> implements C
}
}
@SubscribeEvent
public static void onClientConnectEvent(FMLNetworkEvent.ClientConnectedToServerEvent event){
// Right. Read carefully!
// This code would actually work perfectly well on a dedicated server. In singleplayer, however, it is a problem
// because the client and server SHARE STATIC VARIABLES (because they share the same JVM... stupid I know). LAN
// also has the same problem. The proper solution, of course, is to tie it to something that is different on
// different logical sides, or to simply use different variables and decide which to query on-the-fly.
// However, there's a bit of a problem because both of those 'proper' solutions need a world object to know
// which properties to access. Thing is, we can actually kind of cheat here: spell properties can't change from
// within a world, so they are effectively constants... so they are necessarily the same on both sides. Let's
// not fight against the same-JVM thing, let's just ignore the packet completely when it's in the same JVM.
// (What could possibly go wrong?!)
// If this is not a singleplayer game, clear the spell properties in preparation for receiving server ones
if(!event.isLocal()) clearProperties();
}
@SubscribeEvent
public static void onClientDisconnectEvent(FMLNetworkEvent.ClientDisconnectionFromServerEvent event){
// Why does the world UNLOAD event happen during world LOADING? How does that even work?!
@@ -178,20 +178,23 @@ public abstract class SpellRay extends Spell {
Vec3d origin = new Vec3d(caster.posX, caster.posY + caster.getEyeHeight() - Y_OFFSET, caster.posZ);
Vec3d targetPos = null;
if(!ignoreLivingEntities || !EntityUtils.isLiving(target)){
targetPos = new Vec3d(target.posX, target.posY + target.height / 2, target.posZ);
if(target != null){
}else{
if(!ignoreLivingEntities || !EntityUtils.isLiving(target)){
targetPos = new Vec3d(target.posX, target.posY + target.height / 2, target.posZ);
int x = MathHelper.floor(target.posX);
int y = (int)target.posY - 1; // -1 because we need the block under the target
int z = MathHelper.floor(target.posZ);
BlockPos pos = new BlockPos(x, y, z);
}else{
// This works as if the NPC had actually aimed at the floor beneath the target, so it needs to check that
// the block is not air and (optionally) not a liquid.
if(!world.isAirBlock(pos) && (!world.getBlockState(pos).getMaterial().isLiquid() || hitLiquids)){
targetPos = new Vec3d(x + 0.5, y + 1, z + 0.5);
int x = MathHelper.floor(target.posX);
int y = (int)target.posY - 1; // -1 because we need the block under the target
int z = MathHelper.floor(target.posZ);
BlockPos pos = new BlockPos(x, y, z);
// This works as if the NPC had actually aimed at the floor beneath the target, so it needs to check that
// the block is not air and (optionally) not a liquid.
if(!world.isAirBlock(pos) && (!world.getBlockState(pos).getMaterial().isLiquid() || hitLiquids)){
targetPos = new Vec3d(x + 0.5, y + 1, z + 0.5);
}
}
}
@@ -189,7 +189,9 @@ public class TileEntityArcaneWorkbench extends TileEntity implements IInventory,
}else if(slotNumber == ContainerArcaneWorkbench.UPGRADE_SLOT){
Set<Item> upgrades = new HashSet<>(WandHelper.getSpecialUpgrades());
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());
}
@@ -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
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());
((IManaStoringItem)result.getItem()).setMana(result, ((ItemWizardArmour)input.getItem()).getMana(input));
@@ -419,7 +419,7 @@ public final class BlockUtils {
world.setBlockState(pos, Blocks.OBSIDIAN.getDefaultState());
}else if(freezeLava && (block == Blocks.LAVA || block == Blocks.FLOWING_LAVA)){
world.setBlockState(pos, Blocks.COBBLESTONE.getDefaultState());
}else if(block.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());
}else{
return false;
@@ -1,5 +1,6 @@
package electroblob.wizardry.util;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.EntityEquipmentSlot;
@@ -10,6 +11,7 @@ import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumHand;
import net.minecraft.util.EnumHandSide;
import net.minecraft.util.NonNullList;
import net.minecraft.world.World;
import java.util.ArrayList;
import java.util.Arrays;
@@ -142,4 +144,28 @@ public final class InventoryUtils {
&& ItemStack.areItemStackTagsEqual(stack1, stack2);
}
/**
* A version of {@link Entity#replaceItemInInventory(int, ItemStack)} that takes a slot index specific to the main,
* armour and offhand inventories, as passed to {@link Item#onUpdate(ItemStack, World, Entity, int, boolean)},
* rather than the proper slot index used everywhere else (just <i>why</i>, Mojang?).
* @param entity The entity to replace the item for
* @param slot The slot index to replace
* @param original The item stack currently in the slot (required for technical reasons)
* @param replacement The new item stack
* @return True if an item was replaced, false if not
*/
public static boolean replaceItemInInventory(Entity entity, int slot, ItemStack original, ItemStack replacement){
// Check slots that aren't in the main inventory first by comparing with the existing item
if(entity instanceof EntityLivingBase){
for(EntityEquipmentSlot eslot : EntityEquipmentSlot.values()){
if(((EntityLivingBase)entity).getItemStackFromSlot(eslot) == original){
entity.setItemStackToSlot(eslot, replacement);
return true;
}
}
}
// Otherwise use the normal behaviour
return entity.replaceItemInInventory(slot, replacement);
}
}
@@ -68,6 +68,26 @@ public final class SpellModifiers {
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
* 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"
]
]
}
@@ -16,6 +16,8 @@ tile.ebwizardry\:runestone_pedestal.name=Runenstein Sockel
tile.ebwizardry\:thorns.name=Dornen
tile.ebwizardry\:obsidian_crust.name=Obsidian Kruste
tile.ebwizardry\:dry_frosted_ice.name=Gefrohrenes Trockeneis
tile.ebwizardry\:crystal_flower_pot.name=Blumentopf
tile.ebwizardry\:permafrost.name=Permafrost
tile.ebwizardry\:magic_crystal_block.name=Kristallblock
tile.ebwizardry\:fire_crystal_block.name=Block aus feurigem Kristall
@@ -26,12 +28,37 @@ tile.ebwizardry\:earth_crystal_block.name=Block aus erdgebundenem Kristall
tile.ebwizardry\:sorcery_crystal_block.name=Block des mystischen Kristall
tile.ebwizardry\:healing_crystal_block.name=Block aus strahlendem Kristall
tile.ebwizardry\:oak_gilded_wood.name=Vergoldetes Eichenholz
tile.ebwizardry\:spruce_gilded_wood.name=Vergoldetes Fichtenholz
tile.ebwizardry\:birch_gilded_wood.name=Vergoldetes Birkenholz
tile.ebwizardry\:jungle_gilded_wood.name=Vergoldetes Jungelholz
tile.ebwizardry\:acacia_gilded_wood.name=Vergoldetes Akazienholz
tile.ebwizardry\:dark_oak_gilded_wood.name=Vergoldetes Schwarzeichenholz
tile.ebwizardry\:oak_bookshelf.name=Eichenbücherregal
tile.ebwizardry\:spruce_bookshelf.name=Fichtenholz Bücherregal
tile.ebwizardry\:birch_bookshelf.name=Brikenholz Bücherregal
tile.ebwizardry\:jungle_bookshelf.name=Jungelholz Bücherregal
tile.ebwizardry\:acacia_bookshelf.name=Akazienholz Bücherregal
tile.ebwizardry\:dark_oak_bookshelf.name=Schwarzeichenholz Bücherregal
tile.ebwizardry\:oak_lectern.name=Eichenpult
tile.ebwizardry\:spruce_lectern.name=Fichtenholz Pult
tile.ebwizardry\:birch_lectern.name=Birkenholz Pult
tile.ebwizardry\:jungle_lectern.name=Jungelholz Pult
tile.ebwizardry\:acacia_lectern.name=Akazienholz Pult
tile.ebwizardry\:dark_oak_lectern.name=Schwarzeichenholz Pult
tile.ebwizardry\:receptacle.name=Gefäß
tile.ebwizardry\:imbuement_altar.name=Ermächtungsaltar
item.ebwizardry\:crystal_magic.name=Magischer Kristall
item.ebwizardry\:crystal_fire.name=Feuriger Kristall
item.ebwizardry\:crystal_ice.name=Eisiger Kristall
item.ebwizardry\:crystal_lightning.name=Stürmischer Kristall
item.ebwizardry\:crystal_necromancy.name=Dunkler Kristall
item.ebwizardry\:crystal_earth.name=Erdgebundener Kristall
item.ebwizardry\:crystal_earth.name=Erdkristall
item.ebwizardry\:crystal_sorcery.name=Mystischer Kristall
item.ebwizardry\:crystal_healing.name=Strahlender Kristall
@@ -51,7 +78,7 @@ item.ebwizardry\:wizard_handbook.desc=Von %1$s
item.ebwizardry\:wand.generic=Zauberstab
item.ebwizardry\:wand.buff=+%1$s %2$s Wirkung
item.ebwizardry\:wand.buff=+%1$s%% %2$s Potenz
item.ebwizardry\:wand.spell=Derzeitiger Zauber\: %1$s
item.ebwizardry\:wand.mana=Mana\: %1$s/%2$s
item.ebwizardry\:wand.progression=Verbesserung\: %1$s/%2$s
@@ -112,18 +139,18 @@ item.ebwizardry\:astral_diamond.name=Astral-Diamant
item.ebwizardry\:purifying_elixir.name=Reinigendes Elixier
item.ebwizardry\:purifying_elixir.desc=Entfernt Flüche beim Konsumieren
item.ebwizardry\:storage_upgrade.name=Aufwertung des Manaspeichers
item.ebwizardry\:siphon_upgrade.name=Aufwertung Blut - in - Mana
item.ebwizardry\:condenser_upgrade.name=Aufwertung des regenerativen Mana
item.ebwizardry\:range_upgrade.name=Aufwertung der Zauberreichweite
item.ebwizardry\:duration_upgrade.name=Aufwertung der Effektdauer
item.ebwizardry\:cooldown_upgrade.name=Aufwertung der Abklingzeiten
item.ebwizardry\:blast_upgrade.name=Aufwertung der Wirkungsbereichgröße
item.ebwizardry\:attunement_upgrade.name=Aufwertung der Zauber-Slots
item.ebwizardry\:melee_upgrade.name=Aufwertung des Nahkampfes
item.ebwizardry\:storage_upgrade.name=Manaspreicher Verbesserung
item.ebwizardry\:siphon_upgrade.name=Manaentzugs Verbesserung
item.ebwizardry\:condenser_upgrade.name=Manaregenerations Verbesserung
item.ebwizardry\:range_upgrade.name=Zauberreichweiten Verbesserung
item.ebwizardry\:duration_upgrade.name=Effektdauer Verbesserung
item.ebwizardry\:cooldown_upgrade.name=Abklingzeiten Verbesserung
item.ebwizardry\:blast_upgrade.name=Wirkungsbereichs Verbesserung
item.ebwizardry\:attunement_upgrade.name=Zauber-Slot Verbesserung
item.ebwizardry\:melee_upgrade.name=Nahkampfverbesserung
item.ebwizardry\:storage_upgrade.desc=Erhöht die maximale Mana - Anzahl
item.ebwizardry\:siphon_upgrade.desc=Entzieht getöteten Lebewesen Mana das den Stab aufläd
item.ebwizardry\:storage_upgrade.desc=Erhöht das maximale Mana.
item.ebwizardry\:siphon_upgrade.desc=Entzieht getöteten Lebewesen Mana.
item.ebwizardry\:condenser_upgrade.desc=Generiert langsarm Mana
item.ebwizardry\:range_upgrade.desc=Erhöht die Reichweite von Projektilzaubern und Beschwörungen
item.ebwizardry\:duration_upgrade.desc=Verlängert Effekte von Zaubern
@@ -147,16 +174,18 @@ item.ebwizardry\:blank_scroll.name=Leere Schriftrolle
item.ebwizardry\:scroll.generic=Schriftrolle
item.ebwizardry\:scroll.name=Schriftrolle %1$s
item.ebwizardry\:scroll.undiscovered.name=Schriftrolle "%1$s"
item.ebwizardry\:identification_scroll.name=Schriftrolle der Enthüllung
item.ebwizardry\:identification_scroll.desc=Erkennt ein unbekanntes Zauberbuch oder eine unbekannte Schriftrolle
item.ebwizardry\:identification_scroll.nothing_to_identify=Nichts zu enthüllen!
item.ebwizardry\:identification_scroll.name=Schriftrolle der Offenbarung
item.ebwizardry\:identification_scroll.desc=Offenbart ein unbekanntes Zauberbuch oder eine unbekannte Schriftrolle
item.ebwizardry\:identification_scroll.nothing_to_identify=Nichts zu Offenbaren!
item.ebwizardry\:armour_upgrade.name=Arkanes Schutzsiegel
item.ebwizardry\:armour_upgrade.desc1=%1$sVerbessert jede Magierrüstung
item.ebwizardry\:armour_upgrade.desc2=%1$sum sie %2$slegendär zu machen
item.ebwizardry\:armour_upgrade.desc=%1$sVerbessert jede Magierrüstung
item.ebwizardry\:armour_upgrade.desc_extended=%1$sum sie %2$slegendär zu machen
item.ebwizardry\:magic_silk.name=Magische Seide
item.ebwizardry\:spectral_dust.name=Spektraler Staub
item.ebwizardry\:wizard_armour.legendary=Legendär
item.ebwizardry\:wizard_armour.buff=-%1$s %2$s Kosten
item.ebwizardry\:wizard_armour.mana=Mana\: %1$s/%2$s
@@ -211,6 +240,8 @@ item.ebwizardry\:spectral_boots.name=Spektralschuhe
item.ebwizardry\:lightning_hammer.name=Blitzhammer
item.ebwizardry\:flamecatcher.name=Flammenfänger
item.ebwizardry\:ring_condensing.name=Ring der Managenerierung
item.ebwizardry\:ring_condensing.desc=Regeneriert langsam Mana für alle Zauberstäbe in der Hotbar
item.ebwizardry\:ring_siphoning.name=Ring der Konvertierung
@@ -233,7 +264,7 @@ item.ebwizardry\:ring_arcane_frost.name=Ring des arkanen Frostes
item.ebwizardry\:ring_arcane_frost.desc=Mit Eis getötete Lebewesen explodieren in Eissplitter
item.ebwizardry\:ring_shattering.name=Ring der Zerbrechlichkeit
item.ebwizardry\:ring_shattering.desc=Schlage Kreaturen die gerade Frostbiss haben, zersplittern manchmal direkt
item.ebwizardry\:ring_lightning_melee.name=Ring der Lichtkette
item.ebwizardry\:ring_lightning_melee.name=Ring der Blitzkette
item.ebwizardry\:ring_lightning_melee.desc=Schlage eine Kreatur um nahe Kreaturen mit Blitzen abzuschießen
item.ebwizardry\:ring_storm.name=Ring des aufziehenden Sturms
item.ebwizardry\:ring_storm.desc=Während eines gewitters haben Blitzzauber kaum mehr Abklingzeit
@@ -246,7 +277,7 @@ item.ebwizardry\:ring_soulbinding.desc=Kreaturen die du mit verbotenen Künsten
item.ebwizardry\:ring_leeching.name=Ring des Blutsaugers
item.ebwizardry\:ring_leeching.desc=Alle Zauber der verbotenen Kunst haben eine 30%% chance, Leben zu absorbieren
item.ebwizardry\:ring_necromancy_melee.name=Ring der verbotenen Berührung
item.ebwizardry\:ring_necromancy_melee.desc=Schlae eine Kreatur mit dem Zauberstab, um sie zu verdorren
item.ebwizardry\:ring_necromancy_melee.desc=Schlage eine Kreatur mit dem Zauberstab, um sie zu verdorren
item.ebwizardry\:ring_mind_control.name=Ring der Massenpsyche
item.ebwizardry\:ring_mind_control.desc=Kreaturen unter Gedankenkontrolle haben die chance, andere Kreaturen in der Umgebung auch damit anzustecken
item.ebwizardry\:ring_poison.name=Ring der Giftschlange
@@ -308,27 +339,30 @@ item.ebwizardry\:amulet_resurrection.name=Amulett des Unsterblichen
item.ebwizardry\:amulet_resurrection.desc=Der Totenbeschwören - Zauber kann von jenseits des Grabes an einem selbst angewendet werden
item.ebwizardry\:amulet_auto_shield.name=Amulett von Hyeleth
item.ebwizardry\:amulet_auto_shield.desc=Gewährt eine 25%% Chance, den Schild-Zauber für einige Sekunden auszulösen, wenn er an einen Zauberstab an Ihrem Hotbar gebunden ist
item.ebwizardry\:amulet_absorption.name=Amulett der Gesundheit
item.ebwizardry\:amulet_absorption.desc=Überheilung von Zaubern erschafft einen Absorbierungseffekt.
item.ebwizardry\:charm_haggler.name=Zeichen des Wortgewandten
item.ebwizardry\:charm_haggler.desc=Die Zauberer bieten garantiert jedes Mal ein neues Angebot an, wenn du mit ihnen handelst
item.ebwizardry\:charm_experience_tome.name=Leitfaden des Fleißigen
item.ebwizardry\:charm_experience_tome.desc=Erhöht die Geschwindigkeit, mit der Zauberstäbe Fortschritte erlangen, um 50%%
item.ebwizardry\:charm_experience_tome.desc=Erhöht die Geschwindigkeit, mit Zauberstäben Fortschritte zu erlangen, um 50%%
item.ebwizardry\:charm_auto_smelt.name=Das Zeichen des Metallurgen
item.ebwizardry\:charm_auto_smelt.desc=Der Taschenofen löst sich automatisch aus, wenn er an einen Stab auf Ihrem Hotbar gebunden wird
item.ebwizardry\:charm_auto_smelt.desc=Der Taschenofen-zauber löst automatisch aus, wenn er an einen Stab auf der Hotbar gebunden ist.
item.ebwizardry\:charm_lava_walking.name=Eisiges Nether-Herz
item.ebwizardry\:charm_lava_walking.desc=Schritte erstarren Lava zu einer Obsidiankruste
item.ebwizardry\:charm_storm.name=Gewitterwolke in der Flasche
item.ebwizardry\:charm_storm.desc=Beschwört einen aufziehenden Sturm
item.ebwizardry\:charm_storm.desc=Der Wetteränderungszauber beschwört immer einen Sturm
item.ebwizardry\:charm_minion_health.name=Zombiekopf aus Obsidian
item.ebwizardry\:charm_minion_health.desc=Beschwörungen sind 25%% stärker
item.ebwizardry\:charm_minion_health.desc=Beschworene Kreaturen sind 25%% stärker
item.ebwizardry\:charm_minion_variants.name=Talisman der Transformation
item.ebwizardry\:charm_minion_variants.desc=Beschworene Zombies und Skelette werden zu einer stärkeren Variante
item.ebwizardry\:charm_flight.name=Käferflügel aus Smaragt
item.ebwizardry\:charm_flight.desc=Fliegen und Gleiten sind um 50%% schneller
item.ebwizardry\:charm_growth.name=Neid der Kristallblume
item.ebwizardry\:charm_growth.desc=Die Wachstumsaura hat eine 35%% Chance, dass die Pflanzen sofort ausgewachsen sind
item.ebwizardry\:charm_growth.desc=Die Wachstumsaura hat eine chance von 35%%, dass die Pflanzen sofort ausgewachsen sind
item.ebwizardry\:charm_abseiling.name=Verzaubertes Seil
item.ebwizardry\:charm_abseiling.desc=Drücke Shift während des Greifens um das Seil langsarm auszufahren
item.ebwizardry\:charm_abseiling.desc=Drücke Shift während des Kletterrankengreifhaken-zaubers um das Seil langsarm auszufahren
item.ebwizardry\:charm_silk_touch.name=Mondsteinkugel
item.ebwizardry\:charm_silk_touch.desc=Blöcke, die mit dem Minenzauber abgebaut werden, werden Behutsam als sich selbst gedroppt
item.ebwizardry\:charm_stop_time.name=Seltsame Taschenuhr
@@ -340,6 +374,33 @@ item.ebwizardry\:charm_transportation.desc=Bis zu vier Steinkreise können bei d
item.ebwizardry\:charm_feeding.name=Bodenlose Vorräte
item.ebwizardry\:charm_feeding.desc=Hunger wiederherstellen wird sofort gewirkt, wenn der Stab sich mit dem Zauber in der Hotbar befindet
item.ebwizardry\:charm_sixth_sense.name=Pelz eines Schreckenwolfes
item.ebwizardry\:charm_sixth_sense.desc=Der Zauber "Sechster Sinn" verleiht farben entsprechend des Types.
item.ebwizardry\:charm_black_hole.name=Opal der Leere
item.ebwizardry\:charm_black_hole.desc=Schwarze Löcher saugen nun auch Blöcke ein und zerstören sie.
item.ebwizardry\:charm_mount_teleporting.name=Spektrale Zügel
item.ebwizardry\:charm_mount_teleporting.desc=Teleportierst du dich auf einem Reittier, Boot oder Lore wird es mit teleportiert.
item.ebwizardry\:ring_meteor.name=Ring von Volthraa
item.ebwizardry\:ring_meteor.desc=Meteore können wie ein Projektil verschossen werden, anstatt vom Himmel zu fallen.
item.ebwizardry\:ring_stormcloud.name=Lokenzen's Ring
item.ebwizardry\:ring_stormcloud.desc=Sturmwolken bewegen sich auf Ziele zu und halten bei treffer länger
item.ebwizardry\:ring_evoker.name=Evoker's Ring
item.ebwizardry\:ring_evoker.desc=Schleichen wärend du Fänge wirkst, erschafft einen Ring um den Zaubernden
item.ebwizardry\:amulet_frost_warding.name=Amulett von Esundor
item.ebwizardry\:amulet_frost_warding.desc=Gewährt einen Magischen Schutz, während du hinter einer Eiswand stehst.
item.ebwizardry\:charm_spell_discovery.name=Archivars Monokel
item.ebwizardry\:charm_spell_discovery.desc=Zauberbücher aus Schatzkisten werden mit höherer Chance welche sein, die dir noch unbekannt sind
item.ebwizardry\:charm_move_speed.name=Icarus' Medallion
item.ebwizardry\:charm_move_speed.desc=Bewege dich beim Zauberwirken nahezu normal schnell
item.ebwizardry\:charm_undead_helmets.name=Verfluchter Helm
item.ebwizardry\:charm_undead_helmets.desc=Beschworene Untote Kreaturen tragen nun einen Lederhelm gegen die Sonne
item.ebwizardry\:charm_hunger_casting.name=Dämonisches Siegel
item.ebwizardry\:charm_hunger_casting.desc=Es werden Hungerpunkte verwendet, solltest du kein Mana mehr haben
item.ebwizardry\:ruined_spell_book.name=Zerstörtes Zauberbuch
item.ebwizardry\:ruined_spell_book.desc=Die Seiten dieses alten Zauberbuches sind auf unleserlichkeit zerstört. Dennoch ist eine leichte menge an Magie zu spüren. Vielleicht gibt es einen Weg diese zu entfesseln...
item.charge_status.full=Voll
item.charge_status.almost_full=Fast Voll
item.charge_status.mostly_full=Größtenteils Voll
@@ -348,6 +409,126 @@ item.charge_status.mostly_empty=Bald Leer
item.charge_status.almost_empty=Fast Leer
item.charge_status.empty=Leer
item.banner.wizardry_fire.black=Schwarzes Feuer Emblem
item.banner.wizardry_fire.red=Rotes Feuer Emblem
item.banner.wizardry_fire.green=Grünes Feuer Emblem
item.banner.wizardry_fire.brown=Braunes Feuer Emblem
item.banner.wizardry_fire.blue=Blaues Feuer Emblem
item.banner.wizardry_fire.purple=Lilanes Feuer Emblem
item.banner.wizardry_fire.cyan=Türkises Feuer Emblem
item.banner.wizardry_fire.silver=Hellgrau Feuer Emblem
item.banner.wizardry_fire.gray=Graues Feuer Emblem
item.banner.wizardry_fire.pink=Rosanes Feuer Emblem
item.banner.wizardry_fire.lime=Limonen Grünes Feuer Emblem
item.banner.wizardry_fire.yellow=Gelbes Feuer Emblem
item.banner.wizardry_fire.lightBlue=Hellblaues Feuer Emblem
item.banner.wizardry_fire.magenta=Magenta farbenes Feuer Emblem
item.banner.wizardry_fire.orange=Orange farbenes Feuer Emblem
item.banner.wizardry_fire.white=Weißes Feuer Emblem
item.banner.wizardry_ice.black=Schwarzes Eis Emblem
item.banner.wizardry_ice.red=Red Eis Emblem
item.banner.wizardry_ice.green=Grünes Eis Emblem
item.banner.wizardry_ice.brown=Braunes Eis Emblem
item.banner.wizardry_ice.blue=Blaues Eis Emblem
item.banner.wizardry_ice.purple=Lilanes Eis Emblem
item.banner.wizardry_ice.cyan=Türkises Eis Emblem
item.banner.wizardry_ice.silver=Hellgrau Eis Emblem
item.banner.wizardry_ice.gray=Graues Eis Emblem
item.banner.wizardry_ice.pink=Rosanes Eis Emblem
item.banner.wizardry_ice.lime=Limonen Grünes Eis Emblem
item.banner.wizardry_ice.yellow=Gelbes Eis Emblem
item.banner.wizardry_ice.lightBlue=Hellblaues Eis Emblem
item.banner.wizardry_ice.magenta=Magenta farbenes Eis Emblem
item.banner.wizardry_ice.orange=Orange farbenes Eis Emblem
item.banner.wizardry_ice.white=Weißes Eis Emblem
item.banner.wizardry_lightning.black=Schwarzes Sturm Emblem
item.banner.wizardry_lightning.red=Red Sturm Emblem
item.banner.wizardry_lightning.green=Grünes Sturm Emblem
item.banner.wizardry_lightning.brown=Braunes Sturm Emblem
item.banner.wizardry_lightning.blue=Blaues Sturm Emblem
item.banner.wizardry_lightning.purple=Lilanes Sturm Emblem
item.banner.wizardry_lightning.cyan=Türkises Sturm Emblem
item.banner.wizardry_lightning.silver=Hellgrau Sturm Emblem
item.banner.wizardry_lightning.gray=Graues Sturm Emblem
item.banner.wizardry_lightning.pink=Rosanes Sturm Emblem
item.banner.wizardry_lightning.lime=Limonen Grünes Sturm Emblem
item.banner.wizardry_lightning.yellow=Gelbes Sturm Emblem
item.banner.wizardry_lightning.lightBlue=Hellblaues Sturm Emblem
item.banner.wizardry_lightning.magenta=Magenta farbenes Sturm Emblem
item.banner.wizardry_lightning.orange=Orange farbenes Sturm Emblem
item.banner.wizardry_lightning.white=Weißes Sturm Emblem
item.banner.wizardry_necromancy.black=Schwarzes Dunkles Emblem
item.banner.wizardry_necromancy.red=Red Dunkles Emblem
item.banner.wizardry_necromancy.green=Grünes Dunkles Emblem
item.banner.wizardry_necromancy.brown=Braunes Dunkles Emblem
item.banner.wizardry_necromancy.blue=Blaues Dunkles Emblem
item.banner.wizardry_necromancy.purple=Lilanes Dunkles Emblem
item.banner.wizardry_necromancy.cyan=Türkises Dunkles Emblem
item.banner.wizardry_necromancy.silver=Hellgrau Dunkles Emblem
item.banner.wizardry_necromancy.gray=Graues Dunkles Emblem
item.banner.wizardry_necromancy.pink=Rosanes Dunkles Emblem
item.banner.wizardry_necromancy.lime=Limonen Grünes Dunkles Emblem
item.banner.wizardry_necromancy.yellow=Gelbes Dunkles Emblem
item.banner.wizardry_necromancy.lightBlue=Hellblaues Dunkles Emblem
item.banner.wizardry_necromancy.magenta=Magenta farbenes Dunkles Emblem
item.banner.wizardry_necromancy.orange=Orange farbenes Dunkles Emblem
item.banner.wizardry_necromancy.white=Weißes Dunkles Emblem
item.banner.wizardry_earth.black=Schwarzes Erd Emblem
item.banner.wizardry_earth.red=Red Erd Emblem
item.banner.wizardry_earth.green=Grünes Erd Emblem
item.banner.wizardry_earth.brown=Braunes Erd Emblem
item.banner.wizardry_earth.blue=Blaues Erd Emblem
item.banner.wizardry_earth.purple=Lilanes Erd Emblem
item.banner.wizardry_earth.cyan=Türkises Erd Emblem
item.banner.wizardry_earth.silver=Hellgrau Erd Emblem
item.banner.wizardry_earth.gray=Graues Erd Emblem
item.banner.wizardry_earth.pink=Rosanes Erd Emblem
item.banner.wizardry_earth.lime=Limonen Grünes Erd Emblem
item.banner.wizardry_earth.yellow=Gelbes Erd Emblem
item.banner.wizardry_earth.lightBlue=Hellblaues Erd Emblem
item.banner.wizardry_earth.magenta=Magenta farbenes Erd Emblem
item.banner.wizardry_earth.orange=Orange farbenes Erd Emblem
item.banner.wizardry_earth.white=Weißes Erd Emblem
item.banner.wizardry_sorcery.black=Schwarzes Mystisches Emblem
item.banner.wizardry_sorcery.red=Red Mystisches Emblem
item.banner.wizardry_sorcery.green=Grünes Mystisches Emblem
item.banner.wizardry_sorcery.brown=Braunes Mystisches Emblem
item.banner.wizardry_sorcery.blue=Blaues Mystisches Emblem
item.banner.wizardry_sorcery.purple=Lilanes Mystisches Emblem
item.banner.wizardry_sorcery.cyan=Türkises Mystisches Emblem
item.banner.wizardry_sorcery.silver=Hellgrau Mystisches Emblem
item.banner.wizardry_sorcery.gray=Graues Mystisches Emblem
item.banner.wizardry_sorcery.pink=Rosanes Mystisches Emblem
item.banner.wizardry_sorcery.lime=Limonen Grünes Mystisches Emblem
item.banner.wizardry_sorcery.yellow=Gelbes Mystisches Emblem
item.banner.wizardry_sorcery.lightBlue=Hellblaues Mystisches Emblem
item.banner.wizardry_sorcery.magenta=Magenta farbenes Mystisches Emblem
item.banner.wizardry_sorcery.orange=Orange farbenes Mystisches Emblem
item.banner.wizardry_sorcery.white=Weißes Mystisches Emblem
item.banner.wizardry_healing.black=Schwarzes Heilig Emblem
item.banner.wizardry_healing.red=Red Heilig Emblem
item.banner.wizardry_healing.green=Grünes Heilig Emblem
item.banner.wizardry_healing.brown=Braunes Heilig Emblem
item.banner.wizardry_healing.blue=Blaues Heilig Emblem
item.banner.wizardry_healing.purple=Lilanes Heilig Emblem
item.banner.wizardry_healing.cyan=Türkises Heilig Emblem
item.banner.wizardry_healing.silver=Hellgrau Heilig Emblem
item.banner.wizardry_healing.gray=Graues Heilig Emblem
item.banner.wizardry_healing.pink=Rosanes Heilig Emblem
item.banner.wizardry_healing.lime=Limonen Grünes Heilig Emblem
item.banner.wizardry_healing.yellow=Gelbes Heilig Emblem
item.banner.wizardry_healing.lightBlue=Hellblaues Heilig Emblem
item.banner.wizardry_healing.magenta=Magenta farbenes Heilig Emblem
item.banner.wizardry_healing.orange=Orange farbenes Heilig Emblem
item.banner.wizardry_healing.white=Weißes Heilig Emblem
entity.ebwizardry\:summonedcreature.nameplate=%1$s von %2$s
entity.ebwizardry\:summonedcreature.nameplate_fallback=Erscheinung von %1$s
@@ -384,7 +565,7 @@ entity.ebwizardry\:blaze_minion.name=Lohe
entity.ebwizardry\:wither_skeleton_minion.name=Witherskelett
entity.ebwizardry\:ice_wraith.name=Eis-Geist
entity.ebwizardry\:lightning_wraith.name=Donner-Geist
entity.ebwizardry\:shadow_wraith.name=Verbotener-Geist
entity.ebwizardry\:shadow_wraith.name=Dunkler Geist
entity.ebwizardry\:spirit_wolf.name=Geisterwolf
entity.ebwizardry\:spirit_horse.name=Gersterpferd
entity.ebwizardry\:ice_giant.name=Eis-Gigant
@@ -396,6 +577,7 @@ entity.ebwizardry\:storm_elemental.name=Sturm-Elementar
entity.ebwizardry\:evil_wizard.name=Zauberer
entity.ebwizardry\:decoy.name=Trugbild
entity.ebwizardry\:vex_minion.name=Vex
entity.ebwizardry\:remnant.name=Magiespur
entity.ebwizardry\:magic_missile.name=Magie
entity.ebwizardry\:arc.name=Magie
@@ -436,6 +618,11 @@ entity.ebwizardry\:ring_of_fire.name=Feuerring
entity.ebwizardry\:earthquake.name=Erdbeben
entity.ebwizardry\:hailstorm.name=Hagelsturm
entity.ebwizardry\:lightning_pulse.name=Schockimpuls
entity.ebwizardry\:stormcloud.name=Sturmwolke
entity.ebwizardry\:zombie_spawner.name=Zombie Spawner
entity.ebwizardry\:boulder.name=Felsbrocken
entity.ebwizardry\:radiant_totem.name=Strahlendes Totem
entity.ebwizardry\:withering_totem.name=Verwitterungs Totem
itemGroup.ebwizardry=Zauberei
itemGroup.ebwizardryspells=Zauber
@@ -458,14 +645,14 @@ advancement.ebwizardry\:master=Arkarner Meister
advancement.ebwizardry\:master.desc=Beschaffe einen Meisterzauberstab
advancement.ebwizardry\:max_out_wand=Voll Ausgerüstet
advancement.ebwizardry\:max_out_wand.desc=Stoße an die Grenze von Aufwertungen auf einen Stab
advancement.ebwizardry\:all_spells=Ein Magier für aller Art
advancement.ebwizardry\:all_spells.desc=Jeden einzelnen Zauberspruch im Spiel nutzen
advancement.ebwizardry\:all_spells=Ein Magier für alle fälle
advancement.ebwizardry\:all_spells.desc=Jeden einzelnen Zauberspruch im Spiel gewirkt
advancement.ebwizardry\:wizard_tower=Wer wohnt hier?
advancement.ebwizardry\:wizard_tower.desc=Besuche einen Magierturm
advancement.ebwizardry\:wizard_trade=Magischer Handel
advancement.ebwizardry\:wizard_trade.desc=Kaufe ein Angebot eines Zauberers
advancement.ebwizardry\:anger_wizard=Du wirst es bereuen
advancement.ebwizardry\:anger_wizard=Das wirst du bereuen
advancement.ebwizardry\:anger_wizard.desc=Mache einen Magier zornig
advancement.ebwizardry\:defeat_evil_wizard=Rechtschaffend
advancement.ebwizardry\:defeat_evil_wizard.desc=Bezwinge einen bösen Magier
@@ -475,26 +662,39 @@ advancement.ebwizardry\:buy_master_spell.desc=Kaufe einen Zauber von einem Magie
advancement.ebwizardry\:discover_spell=So lange bis es klappt
advancement.ebwizardry\:discover_spell.desc=Enthülle einen unbekannten Zauberspruch, indem du ihn wirkst und siehst, was passiert
advancement.ebwizardry\:identify_spell=Arkane Wertschätzung
advancement.ebwizardry\:identify_spell.desc=Finden Sie eine zuverlässigere Methode zur Definition von Zaubersprüchen
advancement.ebwizardry\:identify_spell.desc=Finde eine zuverlässigere Methode zur Definition von Zaubersprüchen
advancement.ebwizardry\:spell_failure=Das ist nach hinten losgegangen
advancement.ebwizardry\:spell_failure.desc=Finde auf die harte Tour heraus, wie Zaubersprüche schief gehen können
advancement.ebwizardry\:discover_master_spell=Die Gefahr auswürfeln
advancement.ebwizardry\:discover_master_spell.desc=Erfolgreiche enthüllung eines Meisterzaubers durch probieren
advancement.ebwizardry\:visit_shrine=Erweckt
advancement.ebwizardry\:visit_shrine.desc=Betreten Sie einen Schrein und erwecken Sie seine alte Magie
advancement.ebwizardry\:visit_shrine.desc=Betrete einen Schrein und erwecke seine alte Magie
advancement.ebwizardry\:artefact=Ein vergessenes Relikt
advancement.ebwizardry\:artefact.desc=Heben Sie die schützenden Verzauberungen von einem Schrein auf und beanspruchen Sie die Schätze darin
advancement.ebwizardry\:artefact.desc=Hebe die schützenden Verzauberungen von einem Schrein auf und beanspruche die Schätze darin
advancement.ebwizardry\:all_artefacts=Ein wahres Museum
advancement.ebwizardry\:all_artefacts.desc=Sammeln Sie alle Ringe, Amulette und Talismane
advancement.ebwizardry\:all_artefacts.desc=Sammel alle Ringe, Amulette und Talismane
advancement.ebwizardry\:defeat_remnant=Entstaube deine Pfeile
advancement.ebwizardry\:defeat_remnant.desc=Töte "Magiespuren" und erhalte ihren Sprektralen Staub
advancement.ebwizardry\:find_library_ruins=Ich glaube meine Bücher sind veraltet
advancement.ebwizardry\:find_library_ruins.desc=Finde eine vergessene Bibliothek
advancement.ebwizardry\:restore_imbuement_altar=So gut wie neu
advancement.ebwizardry\:restore_imbuement_altar.desc=Stelle einen Ermächtungsaltar zu seinem alten Glanz wiederher.
advancement.ebwizardry\:create_elemental_armour=Kleidung wechseln
advancement.ebwizardry\:create_elemental_armour.desc=Erfülle eine Magierrüstung mit Spektralem Staub
advancement.ebwizardry\:restore_ruined_book=Arkaner Archeologe
advancement.ebwizardry\:restore_ruined_book.desc=Stelle ein Zerstörtes Zauberbuch an einem Ermächtigungsaltar wiederher.
advancement.ebwizardry\:craft_lectern=Arkane Encyclopaedia
advancement.ebwizardry\:craft_lectern.desc=Baue ein Buchpult um übersicht von deinen Zaubern zu haben.
advancement.ebwizardry\:armour_set=Jetzt bist du ein wahrer Magier!
advancement.ebwizardry\:armour_set.desc=Fertigen und rüsten Sie einen vollständigen Satz Zauberer-Rüstungen!
advancement.ebwizardry\:armour_set.desc=Fertige und rüste einen vollständigen Satz Zauberer-Rüstung aus!
advancement.ebwizardry\:legendary=Legendär!
advancement.ebwizardry\:legendary.desc=Erhalten Sie ein Stück der legendären Zauberer-Rüstung
advancement.ebwizardry\:legendary.desc=Erhalte ein Stück der legendären Zauberer-Rüstung
advancement.ebwizardry\:enchant_scroll=Abpausen auf Pergament
advancement.ebwizardry\:enchant_scroll.desc=Fertigen Sie eine leere Schriftrolle an und verzaubern Sie sie mit einem Zauberspruch an einer arkanen Werkbank
advancement.ebwizardry\:enchant_scroll.desc=Fertige eine leere Schriftrolle an und verzauber Sie sie mit einem Zauberspruch an einer arkanen Werkbank
handbook.toast.title=Neuer Abschnitt des Handbuchs freigeschaltet!
@@ -503,25 +703,43 @@ container.ebwizardry\:arcane_workbench.apply=Fertigen
container.ebwizardry\:arcane_workbench.mana=Mana\:
container.ebwizardry\:arcane_workbench.upgrades=Bestehende Aufwertungen\:
gui.ebwizardry\:spell_book.tier=Rang: %s
gui.ebwizardry\:spell_book.element=Element: %s
gui.ebwizardry\:spell_book.element_undiscovered=Element: ?
gui.ebwizardry\:spell_book.mana_cost=Manakosten: %s
gui.ebwizardry\:spell_book.mana_cost_continuous=Manakosten: %s/sekunde
gui.ebwizardry\:spell_book.mana_cost_undiscovered=Manakosten: ?
gui.ebwizardry\:lectern.title=Zaubersuche
container.ebwizardry\:arcane_workbench.bookshelves=Bücherregale
container.ebwizardry\:arcane_workbench.sort_tier=Sortieren nach Rang
container.ebwizardry\:arcane_workbench.sort_element=Sortieren nach Element
container.ebwizardry\:arcane_workbench.sort_alphabetical=Alphabethisch sortieren
container.ebwizardry\:arcane_workbench.search_tooltip=%1$sSuch Tipp\n\ntier=%2$s, %1$st=%2$s: Suche Rang\n%1$selement=%2$s, %1$se=%2$s: Suche Element\n%1$stype=%2$s, %1$sp=%2$s: Suche Zaubertyp\n%1$sdiscovered=true/false%2$s, %1$sd=t/f%2$s: Suche nur Endeckte oder unentdecke\n%1$smodid=%2$s, %1$sm=%2$s: Suche nach mod IDs\n\nTrenne mehrere suchanfragen mit %1$s,%2$s\nTrenne mehrere Kriterien mit %1$s;
container.ebwizardry\:bookshelf=Bücherregal
tier.novice=Novize
tier.apprentice=Lehrling
tier.advanced=Höherer
tier.advanced=Geselle
tier.master=Meister
element.magic=Keines
element.fire=Feuer
element.ice=Eis
element.lightning=Blitz
element.necromancy=Verboten
element.earth=Erdgebunden
element.necromancy=Dunkelheit
element.earth=Erd
element.sorcery=Mystisch
element.healing=Heilend
element.healing=Heil
element.magic.wizard=Zauberer
element.fire.wizard=Pyromant
element.ice.wizard=Eismagier
element.lightning.wizard=Blitzmagier
element.necromancy.wizard=Magier des Verbotenen
element.necromancy.wizard=Magier der Dunkelheit
element.earth.wizard=Erdgebundener Magier
element.sorcery.wizard=Mystischer Magier
element.healing.wizard=Heiler
@@ -529,7 +747,7 @@ element.healing.wizard=Heiler
spelltype.attack=Offensiv
spelltype.defence=Deffensiv
spelltype.utility=Werkzeug
spelltype.minion=Erscheinung
spelltype.minion=Diener
spelltype.buff=Effekt
spelltype.construct=Gebilde
spelltype.projectile=Projektil
@@ -546,9 +764,12 @@ spell.ebwizardry\:arcane_lock=Arkarnes Schloss
spell.ebwizardry\:arrow_rain=Pfeilhagel
spell.ebwizardry\:banish=Bannen
spell.ebwizardry\:black_hole=Schwarzes Loch
spell.ebwizardry\:blink=Augenzwinker
spell.ebwizardry\:blink=Blinzeln
spell.ebwizardry\:blinding_flash=Blendendes Licht
spell.ebwizardry\:blizzard=Eissturm
spell.ebwizardry\:boulder=Felsbrocken
spell.ebwizardry\:bubble=Luftblase
spell.ebwizardry\:celestial_smite=Himmlisches Richten
spell.ebwizardry\:chain_lightning=Kettenblitz
spell.ebwizardry\:charge=Statisch Voranstürmen
spell.ebwizardry\:clairvoyance=Echo der Vergangenheit
@@ -564,7 +785,7 @@ spell.ebwizardry\:cure_effects=Reinigung der Effekte
spell.ebwizardry\:curse_of_enfeeblement=Fluch der Entkräftung
spell.ebwizardry\:curse_of_soulbinding=Fluch des Seelengebundenen
spell.ebwizardry\:curse_of_undeath=Fluch der Untoten
spell.ebwizardry\:darkness_orb=Sphere des Verbotenen
spell.ebwizardry\:darkness_orb=Sphere der Dunkelheit
spell.ebwizardry\:darkvision=Nachtsicht
spell.ebwizardry\:dart=Dart
spell.ebwizardry\:decay=Verderben
@@ -578,27 +799,30 @@ spell.ebwizardry\:earthquake=Erdbeben
spell.ebwizardry\:empowering_presence=Magisch-Ermächtigende Präsenz
spell.ebwizardry\:entrapment=Sphere des verbotenen Aufstiegs
spell.ebwizardry\:evade=Umgehen
spell.ebwizardry\:fangs=Fänge
spell.ebwizardry\:fireball=Feuerball
spell.ebwizardry\:firebolt=Feuerbolzen
spell.ebwizardry\:firebolt=Feuerblitz
spell.ebwizardry\:firebomb=Feuerbombe
spell.ebwizardry\:fire_resistance=Feuerresistenz
spell.ebwizardry\:fire_sigil=Feuriges Siegel
spell.ebwizardry\:fireskin=Feuerhaut
spell.ebwizardry\:fire_breath=Flammender Atem
spell.ebwizardry\:flamecatcher=Flammenfänger
spell.ebwizardry\:flame_ray=Flammenstrahl
spell.ebwizardry\:flaming_axe=Brennende Axt
spell.ebwizardry\:flaming_weapon=Brennende Waffe
spell.ebwizardry\:flight=Fliegen
spell.ebwizardry\:font_of_mana=Das Wesen des Mana
spell.ebwizardry\:font_of_vitality=Das Wesen der Vitalität
spell.ebwizardry\:font_of_mana=Brunnen des Manas
spell.ebwizardry\:font_of_vitality=Brunnen der Vitalität
spell.ebwizardry\:force_arrow=Kraftfeldpfeil
spell.ebwizardry\:forcefield=Kraftfeld
spell.ebwizardry\:force_orb=Kraftfeldkugel
spell.ebwizardry\:forests_curse=Wälderfluch
spell.ebwizardry\:forests_curse=Fluch des Waldes
spell.ebwizardry\:forest_of_thorns=Wald aus Dornen
spell.ebwizardry\:freeze=Erfrieren
spell.ebwizardry\:freezing_weapon=Eisige Waffe
spell.ebwizardry\:frost_axe=Eisige Axt
spell.ebwizardry\:frost_barrier=Frostbarriere
spell.ebwizardry\:frost_ray=Eisstrahl
spell.ebwizardry\:frost_sigil=Eisiges Siegel
spell.ebwizardry\:frost_step=Frostschritte
@@ -608,58 +832,63 @@ spell.ebwizardry\:greater_fireball=Größerer Feuerball
spell.ebwizardry\:greater_heal=Große Heilung
spell.ebwizardry\:greater_telekinesis=Mächtige Telekinese
spell.ebwizardry\:greater_ward=Mächtiges Kraftschild
spell.ebwizardry\:group_heal=Gruppenheilung
spell.ebwizardry\:group_heal=Massenheilung
spell.ebwizardry\:growth_aura=Wachstumsaura
spell.ebwizardry\:guardian_beam=Strahl des Wächters
spell.ebwizardry\:hailstorm=Hagelsturm
spell.ebwizardry\:heal=Heilen
spell.ebwizardry\:heal_ally=Verbündeten Heilen
spell.ebwizardry\:healing_aura=Heilende Aura
spell.ebwizardry\:homing_spark=Zielender Funke
spell.ebwizardry\:homing_spark=Verfolgender Funke
spell.ebwizardry\:iceball=Eisball
spell.ebwizardry\:ice_age=Eiszeit
spell.ebwizardry\:ice_charge=Aufgeladenes Eis
spell.ebwizardry\:ice_lance=Eis Lanze
spell.ebwizardry\:ice_shard=Eis Splitter
spell.ebwizardry\:ice_charge=Eisladung
spell.ebwizardry\:ice_lance=Eislanze
spell.ebwizardry\:ice_shard=Eissplitter
spell.ebwizardry\:ice_shroud=Eisige Haut
spell.ebwizardry\:ice_spikes=Eisstachel
spell.ebwizardry\:ice_statue=Eisblock
spell.ebwizardry\:ignite=Entzünden
spell.ebwizardry\:imbue_weapon=Perfekter Schliff der Waffe
spell.ebwizardry\:imbue_weapon=Waffe ermächtigen
spell.ebwizardry\:intimidate=Einschüchtern
spell.ebwizardry\:invigorating_presence=Ermächtigende Präsenz
spell.ebwizardry\:invisibility=Unsichtbarkeit
spell.ebwizardry\:invoke_weather=Sturm Heraufziehen
spell.ebwizardry\:invoke_weather=Wetteränderung
spell.ebwizardry\:ironflesh=Eisenhaut
spell.ebwizardry\:leap=Sprung
spell.ebwizardry\:levitation=Aufsteigende Winde
spell.ebwizardry\:life_drain=Blut Saugen
spell.ebwizardry\:levitation=Schweben
spell.ebwizardry\:life_drain=Blut saugen
spell.ebwizardry\:light=Lichtkugel
spell.ebwizardry\:lightning_arrow=Blitzpfeil
spell.ebwizardry\:lightning_bolt=Blitzeinschlag
spell.ebwizardry\:lightning_disc=Lichtscheibe
spell.ebwizardry\:lightning_disc=Blitzscheibe
spell.ebwizardry\:lightning_hammer=Blitzhammer
spell.ebwizardry\:lightning_pulse=Blitzimpuls
spell.ebwizardry\:lightning_ray=Lichtbogenstrahl
spell.ebwizardry\:lightning_ray=Blitzstrahl
spell.ebwizardry\:lightning_sigil=Zappendes Siegel
spell.ebwizardry\:lightning_web=Blitzvernetzung
spell.ebwizardry\:lightning_web=Blitznetz
spell.ebwizardry\:magic_missile=Magisches Geschoss
spell.ebwizardry\:mark_sacrifice=Opfer Markieren
spell.ebwizardry\:metamorphosis=Metamorphose
spell.ebwizardry\:meteor=Meteor
spell.ebwizardry\:mind_control=Gedankenkontrolle
spell.ebwizardry\:mind_trick=Gedanken-Nebel
spell.ebwizardry\:mine=Zerbrechlichkeit von Materie
spell.ebwizardry\:mirage=Spiegel
spell.ebwizardry\:muffle=Leise Schritte
spell.ebwizardry\:none=[Leerer Platz]
spell.ebwizardry\:oakflesh=Eichenhaut
spell.ebwizardry\:paralysis=Lähmung
spell.ebwizardry\:permafrost=Permafrost
spell.ebwizardry\:petrify=Versteinern
spell.ebwizardry\:phase_step=Geister-Gänge
spell.ebwizardry\:phase_step=Phasenschritt
spell.ebwizardry\:plague_of_darkness=Pest der Dunkelheit
spell.ebwizardry\:pocket_furnace=Taschenofen
spell.ebwizardry\:pocket_workbench=Taschenwerkbank
spell.ebwizardry\:poison=Gift
spell.ebwizardry\:poison_bomb=Giftbombe
spell.ebwizardry\:possession=Besitz
spell.ebwizardry\:possession=Besitz ergreifen
spell.ebwizardry\:radiant_totem=Strahlendes Totem
spell.ebwizardry\:ray_of_purification=Strahl der Läuterung
spell.ebwizardry\:remove_curse=Fluch entfernen
spell.ebwizardry\:replenish_hunger=Kleinen Hunger stillen
@@ -667,7 +896,7 @@ spell.ebwizardry\:resurrection=Wiederbelebung
spell.ebwizardry\:reversal=Umkehrung
spell.ebwizardry\:ring_of_fire=Feuerring
spell.ebwizardry\:satiety=Sättigung
spell.ebwizardry\:shadow_ward=Verbotener Schild-Zauber
spell.ebwizardry\:shadow_ward=Dunkler Schild-Zauber
spell.ebwizardry\:shield=Schild-Zauber
spell.ebwizardry\:shockwave=Schockwelle
spell.ebwizardry\:shulker_bullet=Shulker-Schuss
@@ -683,13 +912,14 @@ spell.ebwizardry\:spectral_pathway=Spektraler Pfad
spell.ebwizardry\:speed_time=Zeit verschnellern
spell.ebwizardry\:spider_swarm=Spinnen-Schwarm
spell.ebwizardry\:static_aura=Statisch geladene Aura
spell.ebwizardry\:stormcloud=Sturmwolke
spell.ebwizardry\:summon_blaze=Beschwöre Lohe
spell.ebwizardry\:summon_ice_giant=Beschwöre Eis-Gigant
spell.ebwizardry\:summon_ice_wraith=Beschwöre Eis-Geist
spell.ebwizardry\:summon_iron_golem=Beschwöre Eisen Golem
spell.ebwizardry\:summon_iron_golem=Beschwöre Eisengolem
spell.ebwizardry\:summon_lightning_wraith=Beschwöre Blitz-Geist
spell.ebwizardry\:summon_phoenix=Beschwöre Phönix
spell.ebwizardry\:summon_shadow_wraith=Beschwöre Verbotenen-Geist
spell.ebwizardry\:summon_shadow_wraith=Beschwöre Dunkler Geist
spell.ebwizardry\:summon_skeleton=Beschwöre Skelett
spell.ebwizardry\:summon_skeleton_legion=Beschwöre Skelett-Legion
spell.ebwizardry\:summon_snow_golem=Beschwöre Schneemann
@@ -700,11 +930,11 @@ spell.ebwizardry\:summon_wither_skeleton=Beschwöre Witherskelett
spell.ebwizardry\:summon_zombie=Beschwöre Zombie
spell.ebwizardry\:telekinesis=Telekinese
spell.ebwizardry\:thunderbolt=Blitzeinschlag
spell.ebwizardry\:thunderstorm=Mächtige Blitz-Adern
spell.ebwizardry\:thunderstorm=Donnersturm
spell.ebwizardry\:tornado=Tornado
spell.ebwizardry\:transience=Vergangenheit
spell.ebwizardry\:transience=Phasenverschieben
spell.ebwizardry\:transportation=Transportation
spell.ebwizardry\:vanishing_box=Fluktuirender Endspeicher
spell.ebwizardry\:vanishing_box=Geisterhafte Kiste
spell.ebwizardry\:vex_swarm=Vex Schwarm
spell.ebwizardry\:wall_of_frost=Wand des Eises
spell.ebwizardry\:ward=Schutz
@@ -712,6 +942,8 @@ spell.ebwizardry\:water_breathing=Wasseratmung
spell.ebwizardry\:whirlwind=Wirbelwind
spell.ebwizardry\:wither=Wither
spell.ebwizardry\:wither_skull=Wither Schädel
spell.ebwizardry\:withering_totem=Verberbtes Totem
spell.ebwizardry\:zombie_apocalypse=Zombie Apocalypse
spell.ebwizardry\:agility.desc=Gewährt dem Magier eine höhere Bewegungsgeschwindigkeit und eine größere Sprunghöhe für 30 Sekunden.
spell.ebwizardry\:arc.desc=Feuert einen Blitzfunken auf das Ziel ab.
@@ -720,20 +952,23 @@ spell.ebwizardry\:arcane_lock.desc=Erzeugt eine undurchdringliche Kraftbarriere
spell.ebwizardry\:arrow_rain.desc="Schützen, Feuert!"
spell.ebwizardry\:banish.desc=Teleportiert das Ziel gegen seinen Willen an einen zufälligen Ort innerhalb einer bestimmten Reichweite.
spell.ebwizardry\:black_hole.desc=Zerreißen Sie die Realität.
spell.ebwizardry\:blinding_flash.desc=Erzeugt ein starkes helles Licht, das alle in der nähe kurz blendet.
spell.ebwizardry\:blink.desc=Teleportiert den Magier über eine kurze Distanz dorthin, wohin er gerade zeigt.
spell.ebwizardry\:blizzard.desc=Schafft eine Zone mit wirbelndem eisigen Wind, der alles, was sich darin verfängt, verlangsamt und ständig beschädigt. Der Magier ist gegen den Schaden immun, wird aber dennoch verlangsamt.
spell.ebwizardry\:bubble.desc=Feuert einen Blasenstrahl ab, der alles, was er trifft, hilflos nach oben schweben lässt. Das Ziel fällt nach einer bestimmten Zeit oder wenn es beschädigt ist.
spell.ebwizardry\:blizzard.desc=Schafft eine Zone mit wirbelndem eisigen Wind, der alles, was sich darin verfängt, verlangsamt und ständig schaden zufügt. Der Zaubernde ist gegen den Schaden immun, wird aber dennoch verlangsamt.
spell.ebwizardry\:boulder.desc="Lasset die Welt meine Bowlingbahn sein. Meine Gegner die Pins!"
spell.ebwizardry\:bubble.desc=Feuert einen Blasenstrahl ab, der alles, was er trifft, hilflos nach oben schweben lässt. Das Ziel fällt nach einer bestimmten Zeit oder wenn es schaden bekommt.
spell.ebwizardry\:celestial_smite.desc="Oh Heilige Kräfte,Ich rufe euch nun! Zerreiße dieses Land der Dunkelheit!"
spell.ebwizardry\:chain_lightning.desc=Feuert einen Blitzfunken auf das Ziel ab, das sich dann bis zu zweimal an weitere Ziele kettet.
spell.ebwizardry\:charge.desc=Veranlasst den Magier, schnell in die Richtung geschleudert, in die er schaut, wobei er alles, was sich ihm in den Weg stellt, beschädigt und zurückwirft.
spell.ebwizardry\:clairvoyance.desc=Enthüllt den Weg zu einem gespeicherten Ort. Wenn dieser Zauberspruch ausgewählt ist, klicken Sie mit der rechten Maustaste auf einen Block, um den Ort festzulegen. Sprechen Sie diesen Zauber normal, um den Pfad aufzudecken. Der Pfad wird nach 90 Sekunden verblassen.
spell.ebwizardry\:cobwebs.desc=Erzeugt Spinnennetze, auf die Sie zeigen, die die Bewegung der Kreaturen, die sich unter ihnen befinden, stark behindern. Die Spinnennetze verschwinden nach 20 Sekunden oder wenn sie gebrochen sind.
spell.ebwizardry\:combustion_rune.desc=Platziert eine magische Landmine auf dem Boden, auf den Sie zeigen, die beim Betreten explodiert.
spell.ebwizardry\:charge.desc=Veranlasst den Magier, schnell in die Richtung geschleudert zu werden, in die er schaut, wobei er alles, was sich ihm in den Weg stellt, beschädigt und zurückwirft.
spell.ebwizardry\:clairvoyance.desc=Enthüllt den Weg zu einem gespeicherten Ort. Wenn dieser Zauberspruch ausgewählt ist, klicken sie mit der rechten Maustaste auf einen Block, um den Ort festzulegen. Sprechen Sie diesen Zauber normal, um den Pfad aufzudecken. Der Pfad wird nach 90 Sekunden verblassen.
spell.ebwizardry\:cobwebs.desc=Erzeugt Spinnennetze, die die Bewegung der Kreaturen, die sich unter ihnen befinden, stark behindern. Die Spinnennetze verschwinden nach 20 Sekunden oder wenn sie gebrochen sind.
spell.ebwizardry\:combustion_rune.desc=Platziert eine magische Landmine auf dem Boden, die beim Betreten explodiert.
spell.ebwizardry\:conjure_armour.desc=Erzeugt eine spektrale Rüstung um den Zaubernden, die den gleichen Schutz wie eine eiserne Rüstung bietet. Die Panzerung hält 60 Sekunden lang an. Der Zaubernde darf keine Rüstung anhaben.
spell.ebwizardry\:conjure_block.desc=Beschwört einen spektralen Block, auf den Ihr zeigt. Der Spektralblock verschwindet nach 45 Sekunden, oder man kann ihn durch erneutes Zaubern mit diesem Zauberspruch aufheben.
spell.ebwizardry\:conjure_bow.desc=Erstellt einen Spektralbogen mit unbegrenzten Pfeilen, der 30 Sekunden lang hält.
spell.ebwizardry\:conjure_pickaxe.desc=Erstellt eine Spektralspitzhacke von gleicher Stärke wie eine Eisenspitzhacke, die 30 Sekunden lang hält.
spell.ebwizardry\:conjure_sword.desc=Erstellt ein Spektralschwert von gleicher Stärke wie ein Eisenschwert, das 30 Sekunden lang hält.
spell.ebwizardry\:containment.desc=Wurzelt das Ziel für 20 Sekunden an.
spell.ebwizardry\:conjure_block.desc=Beschwört einen spektralen Block. Der Spektralblock verschwindet nach 45 Sekunden, oder man kann ihn durch erneutes Zaubern mit diesem Zauberspruch aufheben.
spell.ebwizardry\:conjure_bow.desc=Beschwört einen Spektralbogen mit unbegrenzten Pfeilen, der 30 Sekunden lang hält.
spell.ebwizardry\:conjure_pickaxe.desc=Beschwört eine Spektrale Eisenspitzhacke, die 30 Sekunden lang hält.
spell.ebwizardry\:conjure_sword.desc=Beschwört ein Spektrales Eisenschwert, das 30 Sekunden lang hält.
spell.ebwizardry\:containment.desc=Wurzelt das Ziel für 20 Sekunden fest.
spell.ebwizardry\:cure_effects.desc=Entfernt alle Effekte, die den Zaubernden derzeit beeinflussen, ob gut oder schlecht.
spell.ebwizardry\:curse_of_enfeeblement.desc="Er war plötzlich geschwächt, als ob ihm das Leben aus seinem Inneren gerissen worden wäre. - Zeugnis der einzigen Person, von der bekannt ist, dass sie einem Mitglied des Seelenwandererkults begegnet ist und überlebt hat.
spell.ebwizardry\:curse_of_soulbinding.desc=Verursacht, dass die Seele des Ziels untrennbar mit der des Magiers verbunden ist, was bedeutet, dass der gesamte dem Magier zugefügte Schaden auch dem Opfer zugefügt wird. Dauert so lange, bis entweder das Opfer oder der Magier stirbt.
@@ -741,26 +976,30 @@ spell.ebwizardry\:curse_of_undeath.desc=Verflucht das Ziel mit Untotsein, was da
spell.ebwizardry\:darkness_orb.desc=Feuert sich langsam bewegende dunkle Energie in die Richtung, in die Sie zeigen, die verdorrt, was immer sie trifft.
spell.ebwizardry\:darkvision.desc=Erlaubt dem Magier eine Nachtsicht für 45 Sekunden.
spell.ebwizardry\:dart.desc=Feuert einen Dart in die Richtung, in die Sie zeigen, was sein Ziel beschädigt und schwächt.
spell.ebwizardry\:decay.desc=Erzeugt am Boden einen Zerfallsfleck, der jedes Lebewesen, das ihn berührt, infiziert, wodurch im Laufe der Zeit Schaden verursacht werden und sich der Zerfall überall, wo es läuft, weiter ausbreitet.
spell.ebwizardry\:decay.desc=Erzeugt am Boden einen Zerfallsfleck, der jedes Lebewesen, das ihn berührt, infiziert, wodurch im Laufe der Zeit Schaden verursacht wird und sich der Zerfall überall, wo es läuft, weiter ausbreitet.
spell.ebwizardry\:decoy.desc=Erstellt einen illusionären Klon des Magiers, der Mobs dazu bringt, ihn stattdessen anzugreifen. Der Köder wird nach 30 Sekunden verschwinden.
spell.ebwizardry\:detonate.desc=Verursacht eine Explosion an der Stelle, auf die Sie zeigen, und schädigt alle Lebewesen in der Nähe - einschließlich des Magiers, wenn sie zu nah sind.
spell.ebwizardry\:detonate.desc=Verursacht eine Explosion an der Stelle, auf die Sie zeigen, und schädigt alle Lebewesen in der Nähe - einschließlich des Magiers, wenn er zu nah sind.
spell.ebwizardry\:diamondflesh.desc="Deine Pfeile sind kein Hinderniss für mich!"
spell.ebwizardry\:disintegration.desc=Schießt einen kräftigen Flammenstoß aus kurzer Entfernung vor sich her, der die Ziele beim Töten in brennende Glut explodieren lässt. Geschöpfe, die auf die Glut treten, werden in Brand gesetzt.
spell.ebwizardry\:divination.desc=Führt den Magier zu nahe gelegenen Erzen und Ressourcen. Die Wirksamkeit erhöht die Chance, wertvollere Erze zu finden.
spell.ebwizardry\:dragon_fireball.desc=Wirft einen Enderdrachen-Feuerball in die von Ihnen angegebene Richtung ab, der beim Aufprall verweilende Giftwolken freisetzt.
spell.ebwizardry\:dragon_fireball.desc=Schießt einen Enderdrachen-Feuerball in die von Ihnen angegebene Richtung ab, der beim Aufprall verweilende Giftwolken freisetzt.
spell.ebwizardry\:earthquake.desc=Ein wahrer Meister der Erdmagie kann Berge versetzen.
spell.ebwizardry\:empowering_presence.desc=Gewährt dem Zaubernden und Verbündeten in der Nähe 30 Sekunden lang erhöhten magischen Schaden.
spell.ebwizardry\:entrapment.desc=Fängt das Ziel in einer Sphäre der Dunkelheit ein, die es hilflos nach oben zieht und es ständig schadet.
spell.ebwizardry\:enrage.desc=Lässt nahe Kreaturen in einen Wutanfall verfallen und zwingt sie unter allen umständen euch anzugreifen.
spell.ebwizardry\:entrapment.desc=Fängt das Ziel in einer Sphäre aus Dunkelheit ein, die es hilflos nach oben zieht und ihm Schaden zufügt.
spell.ebwizardry\:evade.desc=Veranlasst den Magier, schnell zur Seite zu springen, um eingehenden Angriffen auszuweichen.
spell.ebwizardry\:fangs.desc=Beschwört eine reihe an Fängen die aus dem Boden ragen und alles beißen das sich über ihnen befindet.
spell.ebwizardry\:fireball.desc=Schießt einen Feuerball in die von Ihnen angegebene Richtung ab.
spell.ebwizardry\:firebolt.desc=Schießt einen Feuerstrahl kurzer Entfernung vor sich her.
spell.ebwizardry\:firebomb.desc=Lässt eine Feuerbombe in die Richtung, in die Sie zeigen, die beim Aufprall explodiert und dabei Ziele in Brand setzt los.
spell.ebwizardry\:firebolt.desc=Schießt einen Feuerstrahl kurzer Reichweite vor sich her.
spell.ebwizardry\:firebomb.desc=Feuert eine Feuerbombe in die Richtung, in die Sie zeigen, die beim Aufprall explodiert und dabei Ziele in Brand setzt.
spell.ebwizardry\:fire_resistance.desc=Gewährt dem Magier Feuerresistenz für 30 Sekunden.
spell.ebwizardry\:fire_sigil.desc=Stellt eine magische Feuerfalle auf den Boden, die die Kreatur, die sie auslöst, schadet und in Brand setzt.
spell.ebwizardry\:fire_sigil.desc=Beschwört eine magische Feuerfalle auf dem Boden, die die Kreatur, die sie auslöst, schadet und in Brand setzt.
spell.ebwizardry\:fireskin.desc=Verhüllt den Magier für 30 Sekunden in Flammen und lässt alles, was ihn angreift, in Flammen aufgehen.
spell.ebwizardry\:fire_breath.desc="Ich bin der Drache."
spell.ebwizardry\:flame_ray.desc=Erzeugt einen Flammenstrom in die Richtung, in die Sie zeigen, der ein Feuer entfacht und kontinuierlich Ziele schadet.
spell.ebwizardry\:flaming_axe.desc=Erstellt eine flammende Axt, die den Feind beim Treffer in Brand setzt. Hält 30 Sekunden lang an.
spell.ebwizardry\:firestorm.desc="Läutere das Land und läutere den Boden!\nBäume sollen brennen und Flüsse brodeln!\nEntfache das Holz und verbenne den Stein!\nIm Feuer sollen alle nur noch Asche sein!"
spell.ebwizardry\:fire_breath.desc="Ich bin ein Drache!"
spell.ebwizardry\:flamecatcher.desc=Die Legende spricht vom Flammenfänger, die ihre Kraft in der Not den Sterblichen Feuermagiern bringt.
spell.ebwizardry\:flame_ray.desc=Erzeugt einen Flammensturm in die Richtung, in die Sie zeigen, der ein Feuer entfacht und kontinuierlich Ziele schadet.
spell.ebwizardry\:flaming_axe.desc=Beschwört eine flammende Axt, die den Feind beim Treffer in Brand setzt. Hält 30 Sekunden lang an.
spell.ebwizardry\:flaming_weapon.desc=Er verleiht der ersten Waffe auf dem Hotbar des Magiers vorübergehend die Kraft der Flamme, wodurch sie ihre Opfer in Brand setzt. Die Magie lässt nach 45 Sekunden nach.
spell.ebwizardry\:flight.desc=Aufsteigen wie ein Adler.
spell.ebwizardry\:font_of_mana.desc="Wir sind von einer intensiven magischen Energie erfüllt, die aus dem Zentrum des..." - Auszug aus dem Tagebuch eines vergessenen Magiers; der Rest der Seite ist weggebrannt.
@@ -769,36 +1008,38 @@ spell.ebwizardry\:force_arrow.desc=Schießt einen Kraftpfeil in die Richtung, in
spell.ebwizardry\:forcefield.desc=Erzeugt ein Kraftfeld um den Magier, das Kreaturen abstößt und Geschosse ablenkt.
spell.ebwizardry\:force_orb.desc=Erzeugt ein Kraftfeld, das beim Aufprall nahegelegene Lebewesen schädigt und abstößt.
spell.ebwizardry\:forests_curse.desc="Wie könnt ihr es wagen, meinen Wald zu betreten?"
spell.ebwizardry\:forest_of_thorns.desc=Inmitten des Waldes liegt eine verborgene Lichtung,\nIn der Lichtung vollführt ein Zauberer,\nMagical Künste einer unerzählten Ordnung,\nDeep im Dornenwald.
spell.ebwizardry\:freeze.desc=Friert das Ziel für 10 Sekunden ein. Es friert auch Wasser ein und erzeugt Schnee auf dem Boden.
spell.ebwizardry\:forest_of_thorns.desc=Inmitten des Waldes liegt eine verborgene Lichtung,\nIn der Lichtung vollführt ein Zauberer,\nMagische Künste einer unerzählten Ordnung,\nTief im Dornenwald.
spell.ebwizardry\:freeze.desc=Friert das Ziel für 10 Sekunden ein. Dieser Zauber friert auch Wasser ein und erzeugt Schnee auf dem Boden.
spell.ebwizardry\:freezing_weapon.desc=Er verleiht der ersten Waffe auf der Hotbar des Magiers vorübergehend die Kraft des Frostes, wodurch sie ihre Opfer einfrieren lässt. Die Magie lässt nach 45 Sekunden nach.
spell.ebwizardry\:frost_axe.desc=Erstellt eine eingefrorene Axt, die Feinde beim Schlagen einfriert. Hält 30 Sekunden lang an.
spell.ebwizardry\:frost_axe.desc=Beschwört eine eingefrorene Axt, die Feinde beim Schlagen einfriert. Hält 30 Sekunden lang an.
spell.ebwizardry\:frost_barrier.desc=Erschafft eine Barrikade aus Eis vor dem Zaubernden. Die Barrikade hält 20 Sekunden lang an.
spell.ebwizardry\:frost_ray.desc=Erzeugt einen Froststrahl in die Richtung, in die Sie zeigen, der die Ziele verlangsamt und kontinuierlich schadet.
spell.ebwizardry\:frost_sigil.desc=Stellt eine magische Eisfalle auf den Boden, die das Wesen, das sie auslöst, schädigt und einfriert.
spell.ebwizardry\:frost_sigil.desc=Beschwört eine magische Eisfalle auf den Boden, die das Wesen, das sie auslöst, schädigt und einfriert.
spell.ebwizardry\:frost_step.desc=Erlaubt es dem Magier, das Wasser beim Gehen 30 Sekunden lang einzufrieren.
spell.ebwizardry\:grapple.desc=Schießt eine magische Ranke, die es dem Magier erlaubt, sich an Blöcken festzuhalten oder Wesen einzuholen. Lassen Sie rechte Maustaste los, um den Block oder das Objekt loszulassen.
spell.ebwizardry\:grapple.desc=Schießt eine magische Ranke, die es dem Magier erlaubt, sich an Blöcken festzuhalten oder Ziele heranzuziehen. Lassen Sie rechte Maustaste los, um den Block oder das Objekt loszulassen.
spell.ebwizardry\:glide.desc=Erlaubt es dem Magier, nach unten zu gleiten, während er sich in der Luft befindet und den Stab gedrückt hält.
spell.ebwizardry\:greater_fireball.desc=Schießt einen großen Feuerball in die von Ihnen angegebene Richtung ab, der beim Aufprall explodiert.
spell.ebwizardry\:greater_heal.desc=Heilt den Magier um 4 Herzen.
spell.ebwizardry\:greater_telekinesis.desc=Erlaubt es dem Magier, einen Block oder eine Kreatur aufzuheben und sie in der Luft zu halten, solange die Taste gedrückt wird. Schleichen, während man einen Block oder eine Kreatur hält, wirft ihn eine kurze Distanz.
spell.ebwizardry\:greater_ward.desc=Gewährt dem Zaubernden eine starke Abschirmwirkung, die den einfallenden magischen Schaden 30 Sekunden lang stark reduziert.
spell.ebwizardry\:group_heal.desc=Heilt den Zaubernden und alle in der Nähe befindlichen Verbündeten und beschworenen Kreaturen um 3 Herzen.
spell.ebwizardry\:growth_aura.desc=Pflanzen werden in der Nähe des Magiers erzeugt. Wächst auch hohes Gras und Blumen auf Gras.
spell.ebwizardry\:growth_aura.desc=Pflanzen blühen in der Nähe des Magiers auf. Lässt auch hohes Gras und Blumen auf Grasblöcken blühen.
spell.ebwizardry\:guardian_beam.desc=Feuert einen Strahl des Wächters der dem Ziel Schaden zufügt und ihm dem Atem nimmt, falls er unterwasser ist.
spell.ebwizardry\:hailstorm.desc=Es war während des großen Winters des dritten Zeitalters, als die Eismagier ihre wahre Macht entdeckten.
spell.ebwizardry\:heal.desc=Heilt den Magier um 2 Herzen.
spell.ebwizardry\:heal_ally.desc=Heilt as Ziel um 2 und ein halbes Herzen.
spell.ebwizardry\:healing_aura.desc=Schafft eine Zone der heilenden Energie, die die Gesundheit jedes Verbündeten in ihrem Inneren regeneriert. Jeder Untote innerhalb der heilenden Aura wird Schaden nehmen.
spell.ebwizardry\:homing_spark.desc=Erzeugt einen schwebenden Funken, der sich auf die Feinde zubewegt.
spell.ebwizardry\:iceball.desc=Startet einen Eisball in die von Ihnen angegebene Richtung.
spell.ebwizardry\:iceball.desc=Feuert einen Eisball in die von Ihnen angegebene Richtung.
spell.ebwizardry\:ice_age.desc="Du sollst für die Ewigkeit eingefroren sein!"
spell.ebwizardry\:ice_charge.desc=Schießt eine Eisladung ab, die beim Aufprall explodiert, wobei nahe stehende Lebewesen eingefroren werden und Scherben in alle Richtungen freigesetzt werden.
spell.ebwizardry\:ice_lance.desc=Feuert einen großen Eisspeer in die Richtung, in die Sie zeigen, der übermäßig in die Ziele eindringt und sie dabei schadet und einfriert.
spell.ebwizardry\:ice_lance.desc=Feuert einen großen Eisspeer in die Richtung, in die Sie zeigen, der Kräftig in die Ziele eindringt und sie dabei beschädigt und einfriert.
spell.ebwizardry\:ice_shard.desc=Feuert einen Eissplitter in die Richtung, in die Sie zeigen, was die Ziele beim Treffer beschädigt und verlangsamt.
spell.ebwizardry\:ice_shroud.desc=Erzeugt 30 Sekunden lang einen Kälteschleier um den Magier, wodurch alles, was ihn angreift, eingefroren wird.
spell.ebwizardry\:ice_spikes.desc=Verursacht rasiermesserscharfe Eisspitzen, die an der Stelle, auf die Sie zeigen, vom Boden aufsteigen und alle Kreaturen aufspießen, die dort sind.
spell.ebwizardry\:ice_statue.desc=Friert das Ziel für 20 Sekunden oder bis zum Ausbruch ein. Das Ziel kann sich im gefrorenen Zustand nicht bewegen oder etwas tun, ist aber auch gegen jeglichen Schaden unempfindlich.
spell.ebwizardry\:ignite.desc=Setzt das Ziel 10 Sekunden lang in Brand. Funktioniert auch wie ein Feuerstein und Stahl.
spell.ebwizardry\:imbue_weapon.desc=Verzaubert vorübergehend die erste Waffe auf dem Hotbar des Magiers mit Magie, wodurch sie stärker wird. Die Magie lässt nach 45 Sekunden nach.
spell.ebwizardry\:ice_statue.desc=Friert das Ziel für 20 Sekunden oder bis zum Ausbruch ein. Das Ziel kann sich im gefrorenen Zustand nicht bewegen oder etwas tun, ist aber auch gegen jeglichen Schaden Immun.
spell.ebwizardry\:ignite.desc=Setzt das Ziel 10 Sekunden lang in Brand. Der Zauber funktioniert auch wie ein Feuerzeug.
spell.ebwizardry\:imbue_weapon.desc=Verzaubert vorübergehend die erste Waffe auf der Hotbar des Magiers mit Magie, wodurch sie stärker wird. Die Magie lässt nach 45 Sekunden nach.
spell.ebwizardry\:intimidate.desc=Emittiert ein einschüchterndes Brüllen, das nahegelegene Kreaturen in Angst weglaufen lässt. Von Angst befallene Kreaturen erholen sich nach 30 Sekunden.
spell.ebwizardry\:invigorating_presence.desc=Gewährt dem Magier und allen Verbündeten in der Nähe 45 Sekunden lang erhöhte Stärke.
spell.ebwizardry\:invisibility.desc=Macht den Magier 30 Sekunden lang unsichtbar.
@@ -810,30 +1051,34 @@ spell.ebwizardry\:life_drain.desc=Erzeugt einen Strahl Energie in die von Ihnen
spell.ebwizardry\:light.desc=Erzeugt einen magischen Lichtpunkt, der die Umgebung beleuchtet. Hält 30 Sekunden lang an.
spell.ebwizardry\:lightning_arrow.desc=Schießt einen Blitzpfeil in die Richtung, in die Sie zeigen.
spell.ebwizardry\:lightning_bolt.desc=Verursacht einen Blitz, der dort einschlägt, wo Sie hinzielen.
spell.ebwizardry\:lightning_disc.desc=Sendet eine Blitzscheibe, die in die Richtung fliegt, in die Sie zeigen, und die Ziele sucht.
spell.ebwizardry\:lightning_disc.desc=Beschwört eine Blitzscheibe, die in die Richtung fliegt, in die Sie zeigen. Sie verfolgt Gegner
spell.ebwizardry\:lightning_hammer.desc="Ich zerschlage euch mit dem Zorn des Himmels!"
spell.ebwizardry\:lightning_pulse.desc=Lädt den Boden um den Magier herum mit Blitzen auf, wodurch nahe stehende Lebewesen schaden nehmen und abgestoßen werden.
spell.ebwizardry\:lightning_ray.desc=Erzeugt einen Blitzstrom in die Richtung, in die Sie zeigen, der ständig Ziele beschädigt.
spell.ebwizardry\:lightning_sigil.desc=Stellt eine magische Blitzfalle auf den Boden, die die auslösende Kreatur schädigt und kettet Blitze an andere Kreaturen in der Nähe.
spell.ebwizardry\:lightning_sigil.desc=Beschwört eine magische Blitzfalle auf den Boden, die die auslösende Kreatur schädigt und Kettenblitze an andere Kreaturen in der Nähe schießt.
spell.ebwizardry\:lightning_web.desc="Fokus. Lenken Sie den Sturm in Ihrem Geist durch Ihren Zauberstab und entfesseln Sie seine Wut."
spell.ebwizardry\:magic_missile.desc=Feuert magische Energie in die Richtung, in die Sie zeigen.
spell.ebwizardry\:mark_sacrifice.desc=Zeichnet das Ziel als ein Heiliges Opfer. Der nächste Magische angriff verursacht 60%% mehr Schaden bei einem gezeichneten Ziel. Dieser Zauber ist Stappelbar.
spell.ebwizardry\:metamorphosis.desc=Ändert das Ziel in eine andere Form. Funktioniert nur bei einigen Kreaturen wie zum Beispiel einem Schwein.
spell.ebwizardry\:meteor.desc=Manche Zauberer wollen die Welt einfach nur brennen sehen...
spell.ebwizardry\:mind_control.desc=Übernimmt 30 Sekunden lang die Kontrolle über den Verstand des Ziels, so dass es die Seite wechselt und stattdessen für den Magier kämpft. Wirkt nicht auf Kreaturen, die zu willensstark sind.
spell.ebwizardry\:mind_trick.desc=Verwirrt und desorientiert das Ziel 15 Sekunden lang, so dass es nicht mehr in der Lage ist, effektiv anzugreifen. Der Effekt wird beendet, wenn das Ziel Schaden nimmt.
spell.ebwizardry\:mine.desc=Zerbricht den Block, auf den der Magier schaut. Hohe stufen erlauben es, härtere Blöcke zu brechen.
spell.ebwizardry\:mirage.desc=Erschafft eine Magische Kopie vom Zaubernden, die sich alle paar sekunden woanders hin teleportiert. Die Kopie bleibt 20 Sekunden bestehen.
spell.ebwizardry\:muffle.desc=Dämpft 30 Sekunden lang alle Geräusche, die der Magier macht. Wenn sie gedämpft sind, können die Mobs Sie nur erkennen, wenn sie auf Sie schauen.
spell.ebwizardry\:none.desc=Um ein Zauberbuch mit dem /give command zu bekommen, nutze id\: /give [player] ebwizardry\:spell_book 1 [spell id] (Wenn Sie dieses Buch in einer Truhe gefunden haben, hat irgendein anderer Mod die Sache versaut).
spell.ebwizardry\:none.desc=Um ein Zauberbuch mit dem /give command zu bekommen, nutze id\: /give [player] ebwizardry\:spell_book 1 [spell id] (Wenn Sie dieses Buch in einer Truhe gefunden haben, hat irgendeine andere Mod die Sache versaut).
spell.ebwizardry\:oakflesh.desc=Verbessert die Schadensresistenz des Magiers für 30 Sekunden.
spell.ebwizardry\:permafrost.desc=Sprüht eine schicht aus rutschigen Eis auf den Boden. Die Starke kälte lässt kreaturen darauf langsam Schaden nehmen.
spell.ebwizardry\:paralysis.desc=Erzeugt einen starken Blitz, der Ziele für 5 Sekunden lahmlegt. Gelähmte Kreaturen können sich nicht bewegen und werden trotzdem Schaden nehmen - aber zu viel wird die Kreatur aus der Lähmung reißen.
spell.ebwizardry\:petrify.desc=Verwandelt das Ziel in Stein, bis es ausgebrochen wird, mit der Chance, dass es ausbricht, wenn es dunkel ist. Das Ziel kann sich nicht bewegen oder etwas tun, wenn es versteinert ist, aber es ist auch unempfindlich gegen jeglichen Schaden.
spell.ebwizardry\:petrify.desc=Verwandelt das Ziel in Stein, mit der Chance, dass es ausbricht. Die Chance steigt wenn es dunkel ist. Das Ziel kann sich nicht bewegen oder etwas tun, wenn es versteinert ist, aber es ist auch unempfindlich gegen jeglichen Schaden.
spell.ebwizardry\:phase_step.desc=Teleportiert den Magier eine kurze Strecke vor sich her, auch durch Wände hindurch. Reichweiten-Upgrades erhöhen die Wandstärke, durch die Sie teleportieren können.
spell.ebwizardry\:plague_of_darkness.desc=Die Dunkelheit wird sie alle verzehren...
spell.ebwizardry\:pocket_furnace.desc=Schmelzt bis zu 5 schmelzbare Gegenstände aus dem Inventar. Die Gegenstände auf der Hotbar werden zuerst eingeschmolzen.
spell.ebwizardry\:pocket_workbench.desc=Erlaubt dem Magier, Gegenstände wie an einer Werkbank herzustellen.
spell.ebwizardry\:pocket_workbench.desc=Erlaubt dem Magier, Zugriff auf eine Magisch erzeugte Werkbank.
spell.ebwizardry\:poison.desc=Feuert Gift in die von Ihnen angegebene Richtung.
spell.ebwizardry\:poison_bomb.desc=Schießt eine Giftbombe in die Richtung, in die Sie zeigen, die beim Aufprall explodiert und nahegelegene Lebewesen vergiftet.
spell.ebwizardry\:possession.desc="Werde dein Feind."
spell.ebwizardry\:radiant_totem.desc=Beschwört ein Strahlendes Totem das Heilige Strahlen auf Lebewesen feuert. Diese Heilen verbündete aber schaden feinden. Hält 30 Sekunden lang an. Die Kraft des Totems steigt mit jedem lebewesen, das es trifft.
spell.ebwizardry\:ray_of_purification.desc=Sendet einen blendenden Lichtstrahl aus, der seine Ziele verletzt und blendet. Untote Kreaturen erleiden doppelten Schaden und werden in Brand gesteckt.
spell.ebwizardry\:remove_curse.desc=Entfernt alle Flüche, die den Magier derzeit betreffen.
spell.ebwizardry\:replenish_hunger.desc=Füllt den Hungerbalken des Magiers um 3 Hungerpunkte auf.
@@ -845,24 +1090,25 @@ spell.ebwizardry\:shadow_ward.desc=Erzeugt eine Wand der Dunkelheit vor dem Magi
spell.ebwizardry\:shield.desc=Schafft eine schützende Kraftbarriere, die Geschosse und Magie blockiert. Gewährt dem Magier auch einen schwachen Widerstandseffekt.
spell.ebwizardry\:shockwave.desc=Boom.
spell.ebwizardry\:shulker_bullet.desc=Schießt ein Shulker-Geschoss, das nach Zielen sucht und diese beim Treffer zum Schweben bringt.
spell.ebwizardry\:silverfish_swarm.desc="Ahhhh! Sie vermengen sich!"
spell.ebwizardry\:silverfish_swarm.desc="Ahhhh! Sie vermehren sich!"
spell.ebwizardry\:sixth_sense.desc=Erlaubt es dem Magier, für 20 Sekunden die Positionen von nahegelegenen Kreaturen zu erspüren, sogar durch Wände hindurch.
spell.ebwizardry\:slime.desc=Verschlingt das Ziel in Schleim, der es verlangsamt und kontinuierlich schädigt. Der Schleim zerplatzt nach 10 Sekunden.
spell.ebwizardry\:slow_time.desc=Chronomantik ist die Kunst, die Zeit selbst zu manipulieren, um sie den eigenen Bedürfnissen anzupassen. Man glaubte, sie sei in der Vergangenheit verloren gegangen... bis heute.
spell.ebwizardry\:smoke_bomb.desc=Schießt eine Rauchbombe in die von Ihnen angegebene Richtung ab, die beim Aufprall explodiert und dabei Rauch freisetzt und nahe stehende Lebewesen für kurze Zeit blendet.
spell.ebwizardry\:snare.desc=Stellt eine Falle auf den Boden, die die auslösende Kreatur beschädigt und kurzzeitig verlangsamt.
spell.ebwizardry\:snare.desc=Beschwört eine Falle auf den Boden, die die auslösende Kreatur beschädigt und kurzzeitig verlangsamt.
spell.ebwizardry\:snowball.desc=Wirft einen Schneeball in die von Ihnen angegebene Richtung.
spell.ebwizardry\:spark_bomb.desc=Schießt eine Schockladung in die von Ihnen angegebene Richtung ab, die beim Aufprall Funken auf nahegelegene Feinde auslöst.
spell.ebwizardry\:spectral_pathway.desc=Erschafft vor Ihnen eine unzerstörbare magische Brücke, die sich über 15 Blöcke erstreckt. Die Brücke verschwindet nach 60 Sekunden.
spell.ebwizardry\:speed_time.desc=...Tag, Nacht, Morgen- und Abenddämmerung, Sonnenauf- und -untergang\: So ist der Lauf der Zeit, der uns in einem endlosen Zyklus von...
spell.ebwizardry\:spider_swarm.desc=Beschwört einen Schwarm giftiger Spinnen, um für Sie zu kämpfen. Die Spinnen verschwinden nach 30 Sekunden oder wenn sie getötet werden.
spell.ebwizardry\:static_aura.desc=Umgibt den Magier 30 Sekunden lang mit einem Blitz und feuert einen Blitzfunken auf alles, was ihn trifft.
spell.ebwizardry\:summon_blaze.desc=Beschwört ein Lohe, um für Sie zu kämpfen. Der Lohe verschwindet nach 30 Sekunden oder wenn es getötet wird.
spell.ebwizardry\:summon_ice_giant.desc="Zerschmettern Sie sie!"
spell.ebwizardry\:summon_ice_wraith.desc=Ruft einen Eis-Geist herbei, das für Sie kämpft. der Eis-Geist verschwindet nach 30 Sekunden oder wenn es getötet wird.
spell.ebwizardry\:stormcloud.desc=Beschwört eine Sturmwolke am zielort, das Blitze zum Boden schickt und dabei Lebewesen schaden zufügt.
spell.ebwizardry\:summon_blaze.desc=Beschwört ein Lohe, um für Sie zu kämpfen. Die Lohe verschwindet nach 30 Sekunden oder wenn sie getötet wird.
spell.ebwizardry\:summon_ice_giant.desc="Zerschmettere sie!"
spell.ebwizardry\:summon_ice_wraith.desc=Ruft einen Eis-Geist herbei, der für Sie kämpft. Der Eis-Geist verschwindet nach 30 Sekunden oder wenn es getötet wird.
spell.ebwizardry\:summon_iron_golem.desc=Automatischer autonomer Automat.
spell.ebwizardry\:summon_lightning_wraith.desc=Beschwört ein Geist des Blitzes, um für Sie zu kämpfen. Das Blitz-Gespenst verschwindet nach 30 Sekunden oder wenn es getötet wird.
spell.ebwizardry\:summon_phoenix.desc=Von den Aschen auferstanden...
spell.ebwizardry\:summon_phoenix.desc=Aus der Asche neu geboren...
spell.ebwizardry\:summon_shadow_wraith.desc=Beschwört einen Schatten-Geist, um für Sie zu kämpfen.
spell.ebwizardry\:summon_skeleton.desc=Beschwört ein Skelett, um für Sie zu kämpfen. Das Skelett verschwindet nach 30 Sekunden oder wenn es getötet wird.
spell.ebwizardry\:summon_skeleton_legion.desc="Erhebt euch, untote Armee!"
@@ -876,7 +1122,7 @@ spell.ebwizardry\:telekinesis.desc=Bewegt ein Element oder ein anderes kleines O
spell.ebwizardry\:thunderbolt.desc=Schießt einen Donnerkeil ab, der Ziele zurückwirft.
spell.ebwizardry\:thunderstorm.desc="Mwahahahahahaha!"
spell.ebwizardry\:tornado.desc=Entfesselt einen Tornado in die von Ihnen angegebene Richtung, der alles, was ihm in den Weg kommt, in den Himmel schleudert.
spell.ebwizardry\:transience.desc=Macht den Magier für 20 Sekunden nicht mehr Ansprechbar. Der Magier ist immun gegen alle Schäden, die er während der Transiente erleidet, aber er kann nicht brechen, Blöcke platzieren oder Schaden verursachen.
spell.ebwizardry\:transience.desc=Macht den Magier für 20 Sekunden unantastbar. Der Magier ist immun gegen alle Schäden, die er währenddessen erleidet, aber er kann nichts abbauen, Blöcke platzieren oder Schaden verursachen.
spell.ebwizardry\:transportation.desc=Bringt die Magier zu ihrem gespeicherten Steinkreis. Um diesen Zauberspruch anzuwenden, machen Sie einen Kreis aus Transportsteinen und klicken Sie dann mit einem Zauberstab mit der rechten Maustaste darauf.
spell.ebwizardry\:vanishing_box.desc=Gewährt dem Magier Zugang zu seinem Endtruhenspeicher.
spell.ebwizardry\:vex_swarm.desc=Beschwört einen Schwarm von fliegenden Vex, um für Sie zu kämpfen. Die Vex verschwinden nach 30 Sekunden oder wenn sie getötet werden.
@@ -886,13 +1132,15 @@ spell.ebwizardry\:water_breathing.desc=Erlaubt dem Magier, 60 Sekunden lang unte
spell.ebwizardry\:whirlwind.desc=Verursacht, dass das Ziel mit hoher Geschwindigkeit nach oben und von Ihnen weggeblasen wird.
spell.ebwizardry\:wither.desc=Feuert einen Strahl der Dunkelheit ab, der alles verdorrt, was er berührt.
spell.ebwizardry\:wither_skull.desc=Feuert einen Wither Schädel in die Richtung, in die Sie zeigen.
spell.ebwizardry\:withering_totem.desc=Beschwört ein Verderbtes Totem, das nahen Lebewesen Leben entzieht. Das Totem Explodiert nach 30 Sekunden, fügt das Absorbierte Leben als Schaden nahen Lebewesen zu.
spell.ebwizardry\:zombie_apocalypse.desc=Ein Portal in die Unterwelt zu öffnen ist einfach. Das Problem ist es, es wieder zu schließen wenn etwas schief geht...
spell.ebwizardry\:invoke_weather.sun=Der Regen hört allmählich auf...
spell.ebwizardry\:invoke_weather.rain=Der Himmel öffnet sich...
spell.ebwizardry\:transportation.missing=Der Steinkreis fehlt oder ist versperrt...
spell.ebwizardry\:transportation.missing=Der Steinkreis fehlt oder ist Blockiert...
spell.ebwizardry\:transportation.undefined=Sie müssen sich zuerst an die Lage eines Steinkreises erinnern!
spell.ebwizardry\:transportation.wrongdimension=Kein gespeicherter Steinkreis in dieser Dimension...
spell.ebwizardry\:clairvoyance.searching=Suchen...
spell.ebwizardry\:clairvoyance.searching=Suche...
spell.ebwizardry\:clairvoyance.confirm=Der Weg, der sich beim deuten von %1$s offenbart hat, führt nun zurück zu diesem Punkt
spell.ebwizardry\:clairvoyance.outofrange=Ihr gespeicherter Standort ist zu weit entfernt oder unzugänglich...
spell.ebwizardry\:clairvoyance.undefined=Sie müssen sich zuerst einen Ort merken!
@@ -979,7 +1227,7 @@ potion.ebwizardry\:sixth_sense=Sechster Sinn
potion.ebwizardry\:arcane_jammer=Magieblock
potion.ebwizardry\:mind_trick=Gedanken-Nebel
potion.ebwizardry\:mind_control=Gedankenkontrolle
potion.ebwizardry\:font_of_mana=Das Wesen des Mana
potion.ebwizardry\:font_of_mana=Brunnen des Manas
potion.ebwizardry\:fear=Angst
potion.ebwizardry\:curse_of_soulbinding=Fluch des Seelengebundenen
potion.ebwizardry\:paralysis=Lähmung
@@ -988,9 +1236,11 @@ potion.ebwizardry\:ward=Schild
potion.ebwizardry\:slow_time=Zeit Verlangsamen
potion.ebwizardry\:empowerment=Starke Magie
potion.ebwizardry\:curse_of_enfeeblement=Ableben
potion.ebwizardry\:curse_of_undeath=Fluch des Untotsein
potion.ebwizardry\:containment=Aufbewahrung
potion.ebwizardry\:curse_of_undeath=Fluch des Todes
potion.ebwizardry\:containment=Eingeschlossen!
potion.ebwizardry\:frost_step=Frostschritt
potion.ebwizardry\:mark_of_sacrifice=Opfer Markiert
potion.ebwizardry\:mirage=Spiegel
enchantment.ebwizardry\:magic_sword=Verstärkt
enchantment.ebwizardry\:magic_bow=Verstärkt
@@ -1008,19 +1258,27 @@ enchantment.ebwizardry.flaming_weapon.desc=Teil des Zaubers "Flammenwaffe"; im
enchantment.ebwizardry.freezing_weapon.desc=Teil des Zaubers "Gefrohrene Waffe"; im Überlebensmodus unerreichbar (das Buch wird nicht funktionieren).
enchantment.ebwizardry.shocking_weapon.desc=Teil des Zaubers "Schockwaffe"; im Überlebensmodus unerreichbar (das Buch wird nicht funktionieren).
enchantment.ebwizardry.magic_protection.desc=Zeduziert magischen Schaden jeder Art.
enchantment.ebwizardry.frost_protection.desc=Zeduziert magischen Frostschaden.
enchantment.ebwizardry.shock_protection.desc=Zeduziert magischen Schockschaden.
enchantment.ebwizardry.magic_protection.desc=Reduziert magischen Schaden jeder Art.
enchantment.ebwizardry.frost_protection.desc=Reduziert magischen Frostschaden.
enchantment.ebwizardry.shock_protection.desc=Reduziert magischen Schockschaden.
key.categories.ebwizardry=Zauberei
key.ebwizardry.next_spell=Nächster Zauber
key.ebwizardry.previous_spell=Vorheriger Zauber
key.ebwizardry.spell_1=Zauber Slot 1
key.ebwizardry.spell_2=Zauber Slot 2
key.ebwizardry.spell_3=Zauber Slot 3
key.ebwizardry.spell_4=Zauber Slot 4
key.ebwizardry.spell_5=Zauber Slot 5
key.ebwizardry.spell_6=Zauber Slot 6
key.ebwizardry.spell_7=Zauber Slot 7
key.ebwizardry.spell_8=Zauber Slot 8
death.attack.wizardry_magic=%1$s wurde von %2$s mit Magie getötet
death.attack.indirect_wizardry_magic=%1$s wurde von %2$s mit Magie getötet
soundCategory.ebwizardry_spells=Spells
soundCategory.ebwizardry_spells=Zauber
commands.ebwizardry\:cast.usage=/%1$s <zauber> [spieler | x y z richtung] [dauer] [modifiers]
commands.ebwizardry\:cast.success=Erfolgreich %s gezaubert
@@ -1071,14 +1329,14 @@ config.ebwizardry.title.gameplay=Gameplay-Einstellungen
config.ebwizardry.subtitle.gameplay=Globale Einstellungen, die sich auf die Spielmechanik auswirken.
config.ebwizardry.discovery_mode=Enthüllmodus
config.ebwizardry.discovery_mode.tooltip=Für diejenigen, die einen Sinn für das Geheimnisvolle mögen! Wenn Sie diese Option aktivieren, sind Zaubersprüche, die Sie noch nicht gewirkt haben, erst dann lesbar, wenn Sie sie (Für jede Welt einzeln) gewirkt haben. Im kreativen Modus hat sie keine Wirkung. Enthüllungszauber sind im Überlebensmodus nicht erreichbar, wenn dieser deaktiviert ist.
config.ebwizardry.discovery_mode.tooltip=Für diejenigen, die das Geheimnisvolle mögen! Wenn Sie diese Option aktivieren, sind Zaubersprüche, die Sie noch nicht gewirkt haben, erst dann lesbar, wenn Sie sie (Für jede Welt einzeln) gewirkt haben. Im kreativen Modus hat sie keine Wirkung. Enthüllungszauber sind im Überlebensmodus nicht erreichbar, wenn dieser deaktiviert ist.
config.ebwizardry.legacy_wand_levelling=Altes Zauberstab-Aufwertungssystem
config.ebwizardry.legacy_wand_levelling.tooltip=Steuert, ob die Zauberstäbe vor dem Aufsteigen in die nächste Stufe Zeit brauchen. Aktivieren Sie diese Option, um zum System vor 4.2 zurückzukehren, das nur Leitfäden der Arkanen Künste benötigt. Die Zauberstäbe werden auch dann noch Fortschritte machen, wenn diese Option aktiviert ist, so dass Sie bei der Rückkehr zum neuen System keinen Fortschritt verlieren.
config.ebwizardry.legacy_wand_levelling.true=Ja - es hat mir gefallen, wie es war!
config.ebwizardry.legacy_wand_levelling.false=Nein, ich will Leveln!
config.ebwizardry.friendly_fire=Friendly Fire
config.ebwizardry.friendly_fire.tooltip=Kontrolliert, welche Kreaturen durch Ihre Magie beschädigt werden können, wenn sie mit Ihnen verbündet sind. Eure Zauber werden unabhängig von dieser Einstellung nicht auf Eure Verbündeten oder die von ihnen beschworenen/besessenen Kreaturen abzielen, aber diese Einstellung macht sie völlig immun, wenn sie deaktiviert wird.
config.ebwizardry.minion_revenge_targeting=Beschwörungen haben Rache
config.ebwizardry.minion_revenge_targeting=Beschwörungen nehmen Rache
config.ebwizardry.minion_revenge_targeting.tooltip=Ob beschworene Kreaturen Rache nehmen können - Spieler oder Kreaturen, die sie sonst nicht angreifen könnten.
config.ebwizardry.minion_revenge_targeting.true=Ja - ich würde ihnen nie wehtun!
config.ebwizardry.minion_revenge_targeting.false=Nein - sie müssen mir immer gehorchen!
@@ -1289,7 +1547,7 @@ integration.antiqueatlas.marker.ebwizardry\:obelisk=Obelisk
integration.antiqueatlas.marker.ebwizardry\:shrine=Schrein
spell.ebwizardry\:magic_missile_festive=Magisches - Raketenfest
spell.ebwizardry\:summon_snow_golem_festive=Erschaffe Frosty The Snowman
spell.ebwizardry\:summon_snow_golem_festive=Erschaffe Frosty Der Schneemann
spell.ebwizardry\:invigorating_presence_festive=Ermächtigende Präsenz
spell.ebwizardry\:empowering_presence_festive=Magisch-Ermächtigende Präsenz
@@ -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.nothing_to_identify=Nothing to identify!
item.ebwizardry\:armour_upgrade.name=Arcane Seal of Protection
item.ebwizardry\:armour_upgrade.desc=Upgrades any wizard armour to make it %1$slegendary
item.ebwizardry\:armour_upgrade.desc_extended=Apply this upgrade to a piece of wizard armour in the arcane workbench.
item.ebwizardry\:resplendent_thread.name=Resplendent Thread
item.ebwizardry\:resplendent_thread.desc=Upgrades regular wizard armour into sage armour
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\:spectral_dust.name=Spectral Dust
item.ebwizardry\:wizard_armour.legendary=Legendary
item.ebwizardry\:wizard_armour.buff=-%1$s%% %2$s cost
item.ebwizardry\:wizard_armour.element_cost_reduction=-%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.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_robe.name=Wizard Robes
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_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_evil_wizard.name=Spawn Evil Wizard
@@ -408,7 +542,7 @@ item.ebwizardry\:charm_abseiling.desc=Holding sneak whilst grappling slowly pays
item.ebwizardry\:charm_silk_touch.name=Moonstone Orb
item.ebwizardry\:charm_silk_touch.desc=Blocks broken with the mine spell always drop themselves
item.ebwizardry\:charm_sixth_sense.name=Dire Wolf Pelt
item.ebwizardry\:charm_sixth_sense.desc=Sixth sense displays different colours for passive, neutral and hostile mobs
item.ebwizardry\:charm_sixth_sense.desc=Sixth sense displays different shapes for passive, neutral and hostile mobs
item.ebwizardry\:charm_stop_time.name=Peculiar Pocketwatch
item.ebwizardry\:charm_stop_time.desc=The slow time spell makes time stand still
item.ebwizardry\:charm_light.name=Elevinia's Everburning Lantern
@@ -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.desc=Craft and equip a full set of wizard armour
advancement.ebwizardry\:legendary=Legendary
advancement.ebwizardry\:legendary.desc=Obtain a piece of legendary wizard armour
advancement.ebwizardry\:sage=The Path Of The Sage
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.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.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.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.nothing_to_identify=Nothing to identify!
item.ebwizardry\:armour_upgrade.name=Arcane Seal of Protection
item.ebwizardry\:armour_upgrade.desc=Upgrades any wizard armour to make it %1$slegendary
item.ebwizardry\:armour_upgrade.desc_extended=Apply this upgrade to a piece of wizard armour in the arcane workbench.
item.ebwizardry\:resplendent_thread.name=Resplendent Thread
item.ebwizardry\:resplendent_thread.desc=Upgrades regular wizard armor into sage armor
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\:spectral_dust.name=Spectral Dust
item.ebwizardry\:wizard_armour.legendary=Legendary
item.ebwizardry\:wizard_armour.buff=-%1$s%% %2$s cost
item.ebwizardry\:wizard_armour.element_cost_reduction=-%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.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_robe.name=Wizard Robes
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_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_evil_wizard.name=Spawn Evil Wizard
@@ -408,7 +542,7 @@ item.ebwizardry\:charm_abseiling.desc=Holding sneak whilst grappling slowly pays
item.ebwizardry\:charm_silk_touch.name=Moonstone Orb
item.ebwizardry\:charm_silk_touch.desc=Blocks broken with the mine spell always drop themselves
item.ebwizardry\:charm_sixth_sense.name=Dire Wolf Pelt
item.ebwizardry\:charm_sixth_sense.desc=Sixth sense displays different colors for passive, neutral and hostile mobs
item.ebwizardry\:charm_sixth_sense.desc=Sixth sense displays different shapes for passive, neutral and hostile mobs
item.ebwizardry\:charm_stop_time.name=Peculiar Pocketwatch
item.ebwizardry\:charm_stop_time.desc=The slow time spell makes time stand still
item.ebwizardry\:charm_light.name=Elevinia's Everburning Lantern
@@ -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.desc=Craft and equip a full set of wizard armor
advancement.ebwizardry\:legendary=Legendary
advancement.ebwizardry\:legendary.desc=Obtain a piece of legendary wizard armor
advancement.ebwizardry\:sage=The Path Of The Sage
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.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.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.false=Disabled
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,5 +1,5 @@
#PARSE_ESCAPES
tile.ebwizardry\:arcane_workbench.name=Tajmeniczy Stół
tile.ebwizardry\:arcane_workbench.name=Tajemniczy Stół
tile.ebwizardry\:crystal_ore.name=Ruda Kryształu
tile.ebwizardry\:petrified_stone.name=Skamieniałości
tile.ebwizardry\:ice_statue.name=Lodowa Statua
@@ -15,7 +15,10 @@ tile.ebwizardry\:runestone.name=Kamień Runiczny
tile.ebwizardry\:runestone_pedestal.name=Pilar Runicznego Kamienia
tile.ebwizardry\:thorns.name=Ciernie
tile.ebwizardry\:obsidian_crust.name=Obsydianowa Skorupa
tile.ebwizardry\:dry_frosted_ice.name=Zaschły Mrożny Lód
tile.ebwizardry\:dry_frosted_ice.name=Zaschły Lód
tile.ebwizardry\:crystal_flower_pot.name=Garnek Kwiatu
tile.ebwizardry\:permafrost.name=Wieczna Zmarzlina
tile.ebwizardry\:magic_crystal_block.name=Blok Kryształu
tile.ebwizardry\:fire_crystal_block.name=Blok Ognistego Kryształu
@@ -26,6 +29,32 @@ tile.ebwizardry\:earth_crystal_block.name=Blok Zielnego Kryształu
tile.ebwizardry\:sorcery_crystal_block.name=Blok Mistycznego Kryształu
tile.ebwizardry\:healing_crystal_block.name=Blok Promienistego Kryształu
tile.ebwizardry\:oak_gilded_wood.name=Złociste dębowe drewno
tile.ebwizardry\:spruce_gilded_wood.name=Złociste świerkowe drewno
tile.ebwizardry\:birch_gilded_wood.name=Złociste drewno brzozowe
tile.ebwizardry\:jungle_gilded_wood.name=Złociste dżunglowe drewno
tile.ebwizardry\:acacia_gilded_wood.name=Złociste drewno akacjowe
tile.ebwizardry\:dark_oak_gilded_wood.name=Złociste ciemne dębowe drewno
tile.ebwizardry\:oak_bookshelf.name=Dębowa półka na książki
tile.ebwizardry\:spruce_bookshelf.name=Świerkowa półka na książki
tile.ebwizardry\:birch_bookshelf.name=Brzozowa półka na książki
tile.ebwizardry\:jungle_bookshelf.name=Dżunglowa półka na książki
tile.ebwizardry\:acacia_bookshelf.name=Akacjowa półka na książki
tile.ebwizardry\:dark_oak_bookshelf.name=Złocisto ciemna półka na książki
tile.ebwizardry\:oak_lectern.name=Dębowy pulpit
tile.ebwizardry\:spruce_lectern.name=Świerkowy pulpit
tile.ebwizardry\:birch_lectern.name=Brzozowy pulpit
tile.ebwizardry\:jungle_lectern.name=Dżunglowy pulpit
tile.ebwizardry\:acacia_lectern.name=Akacjowy pulpit
tile.ebwizardry\:dark_oak_lectern.name=Złocisto ciemny pulpit
tile.ebwizardry\:receptacle.name=Naczynie
tile.ebwizardry\:imbuement_altar.name=Nasycony Ołtarz
item.ebwizardry\:crystal_magic.name=Magiczny Kryształ
item.ebwizardry\:crystal_fire.name=Ognisty Kryształ
item.ebwizardry\:crystal_ice.name=Lodowy Kryształ
@@ -43,9 +72,12 @@ item.ebwizardry\:spell_book.name=Księga Zaklęć
item.ebwizardry\:spell_book.apply_to_wizard=Zastąpiono zaklęcie %1$sa %2$s na %3$s
item.ebwizardry\:ruined_spell_book.name=Księga Zaklęć
item.ebwizardry\:ruined_spell_book.desc=Strony tej poszarpanej książki o zaklęciach są zbyt zniszczone, by można je było prawidłowo odczytać, ale jakoś czujesz, że w niej jest jeszcze magia - gdyby tylko można było ją przywrócić...
item.ebwizardry\:arcane_tome.name=Tajemnicza Księga
item.ebwizardry\:arcane_tome.desc1=Ulepsza różdżkę %1$s
item.ebwizardry\:arcane_tome.desc2=do poziomu %1$s
item.ebwizardry\:arcane_tome.desc=Ulepsza dowolną %1$s różdżkę z odpowiednim progresem do poziomu %2$s
item.ebwizardry\:wizard_handbook.name=Podręczna Księga Czarodzieja
item.ebwizardry\:wizard_handbook.desc=stworzona przez %1$s
@@ -70,26 +102,26 @@ item.ebwizardry\:novice_earth_wand.name=Różdżka Lasu
item.ebwizardry\:novice_sorcery_wand.name=Różdżka Mistyka
item.ebwizardry\:novice_healing_wand.name=Różdżka Uzdrowienia
item.ebwizardry\:apprentice_fire_wand.name=Uczniowska Różdżka Pyromancera
item.ebwizardry\:apprentice_fire_wand.name=Uczniowska Różdżka Piromanty
item.ebwizardry\:apprentice_ice_wand.name=Uczniowska Różdżka Maga Lodu
item.ebwizardry\:apprentice_lightning_wand.name=Uczniowska Różdżka Maga Sztormu
item.ebwizardry\:apprentice_necromancy_wand.name=Uczniowska Różdżka Necromancera
item.ebwizardry\:apprentice_necromancy_wand.name=Uczniowska Różdżka Nekromanty
item.ebwizardry\:apprentice_earth_wand.name=Uczniowska Różdżka Maga Ziemi
item.ebwizardry\:apprentice_sorcery_wand.name=Uczniowska Różdżka Czarnoksiężnika
item.ebwizardry\:apprentice_healing_wand.name=Uczniowska Różdżka Uzdrowiciela
item.ebwizardry\:advanced_fire_wand.name=Różdżka Pyromancera
item.ebwizardry\:advanced_fire_wand.name=Różdżka Piromanty
item.ebwizardry\:advanced_ice_wand.name=Różdżka Maga Lodu
item.ebwizardry\:advanced_lightning_wand.name=Różdżka Maga Sztormu
item.ebwizardry\:advanced_necromancy_wand.name=Różdżka Necromancera
item.ebwizardry\:advanced_necromancy_wand.name=Różdżka Nekromanty
item.ebwizardry\:advanced_earth_wand.name=Różdźka Maga Ziemi
item.ebwizardry\:advanced_sorcery_wand.name=Różdżka Czarnoksiężnika
item.ebwizardry\:advanced_healing_wand.name=Różdżka Uzdrowiciela
item.ebwizardry\:master_fire_wand.name=Mistrzowska Różdżka Pyromancera
item.ebwizardry\:master_fire_wand.name=Mistrzowska Różdżka Piromanty
item.ebwizardry\:master_ice_wand.name=Mistrzowska Różdżka Maga Lodu
item.ebwizardry\:master_lightning_wand.name=Mistrzowska Różdżka Maga Sztormu
item.ebwizardry\:master_necromancy_wand.name=Mistrzowska Różdżka Necromancera
item.ebwizardry\:master_necromancy_wand.name=Mistrzowska Różdżka Nekromanty
item.ebwizardry\:master_earth_wand.name=Mistrzowska Różdżka Maga Ziemi
item.ebwizardry\:master_sorcery_wand.name=Mistrzowska Różdżka Czarnoksiężnika
item.ebwizardry\:master_healing_wand.name=Mistrzowska Różdżka Uzdrowiciela
@@ -105,6 +137,8 @@ item.ebwizardry\:small_mana_flask.name=Mała Butelka Many
item.ebwizardry\:medium_mana_flask.name=Średnia Butelka Many
item.ebwizardry\:large_mana_flask.name=Duża Butelka Many
item.ebwizardry\:mana_flask.desc=Stwórz z różdżką lub kawałkiem zbroi czarodzieja aby przywrócić %s many
item.ebwizardry\:grand_crystal.name=Wielki Magiczny Kryształ
item.ebwizardry\:crystal_shard.name=Odłamek Magicznego Kryształu
@@ -124,7 +158,7 @@ item.ebwizardry\:attunement_upgrade.name=Ulepszenie Dostrojenia Różdżki
item.ebwizardry\:melee_upgrade.name=Ulepszenie Obrażeń Różdżki
item.ebwizardry\:storage_upgrade.desc=Zwiększa pojemność many w różdżce
item.ebwizardry\:siphon_upgrade.desc=Ulepsza różdżkę tak, aby wydobywać manę z mobów po ich śmierci
item.ebwizardry\:siphon_upgrade.desc=Ulepsza różdżkę tak, aby wydobywać manę z potworów po ich śmierci
item.ebwizardry\:condenser_upgrade.desc=Ulepsza różdżkę tak, aby mana ładowała się szybciej
item.ebwizardry\:range_upgrade.desc=Ulepsza zasięg rzucanych zaklęć przez różdżkę
item.ebwizardry\:duration_upgrade.desc=Wydłuża czas działania efektów rzucanych przez różdżkę
@@ -148,16 +182,18 @@ item.ebwizardry\:blank_scroll.name=Pusty Zwój
item.ebwizardry\:scroll.generic=Zwój
item.ebwizardry\:scroll.name=Zwój %1$s
item.ebwizardry\:scroll.undiscovered.name=Zwój "%1$s"
item.ebwizardry\:identification_scroll.name=Zwój Indyfikacji
item.ebwizardry\:identification_scroll.name=Zwój Identyfikacji
item.ebwizardry\:identification_scroll.desc=Identyfikuje nieznaną księgę zaklęć lub zwój
item.ebwizardry\:identification_scroll.nothing_to_identify=Nic do zidentyfikowania!
item.ebwizardry\:armour_upgrade.name=Tajemna Pieczęć Ochrony
item.ebwizardry\:armour_upgrade.desc1=%1$sUlepsza każdą zbroję czarodzieja
item.ebwizardry\:armour_upgrade.desc2=%1$sdo %2$slegendarnego poziomu
item.ebwizardry\:armour_upgrade.desc=%1$sUlepsza każdą zbroję czarodzieja
item.ebwizardry\:armour_upgrade.desc_extended=%1$sdo %2$slegendarnego poziomu
item.ebwizardry\:magic_silk.name=Magiczny Jedwab
item.ebwizardry\:spectral_dust.name=Widmowy pył
item.ebwizardry\:wizard_armour.legendary=Legendarna
item.ebwizardry\:wizard_armour.buff=-%1$s %2$s koszt
item.ebwizardry\:wizard_armour.mana=Mana\: %1$s/%2$s
@@ -167,10 +203,11 @@ item.ebwizardry\:wizard_robe.name=Szaty Czarodzieja
item.ebwizardry\:wizard_leggings.name=Spodnie Czarodzieja
item.ebwizardry\:wizard_boots.name=Buty Czarodzieja
item.ebwizardry\:wizard_hat_fire.name=Czapka Pyromancera
item.ebwizardry\:wizard_robe_fire.name=Szaty Pyromancera
item.ebwizardry\:wizard_leggings_fire.name=Spodnie Pyromancera
item.ebwizardry\:wizard_boots_fire.name=Buty Pyromancera
item.ebwizardry\:wizard_hat_fire.name=Czapka Piromanty
item.ebwizardry\:wizard_robe_fire.name=Szaty Piromanty
item.ebwizardry\:wizard_leggings_fire.name=Spodnie Piromanty
item.ebwizardry\:wizard_boots_fire.name=Buty Piromanty
item.ebwizardry\:wizard_hat_ice.name=Czapka Maga Lodu
item.ebwizardry\:wizard_robe_ice.name=Szaty Maga Lodu
@@ -182,10 +219,11 @@ item.ebwizardry\:wizard_robe_lightning.name=Szaty Maga Sztormu
item.ebwizardry\:wizard_leggings_lightning.name=Spodnie Maga Sztormu
item.ebwizardry\:wizard_boots_lightning.name=Buty Maga Sztormu
item.ebwizardry\:wizard_hat_necromancy.name=Czapka Necromancera
item.ebwizardry\:wizard_robe_necromancy.name=Szaty Necromancera
item.ebwizardry\:wizard_leggings_necromancy.name=Spodnie Necromancera
item.ebwizardry\:wizard_boots_necromancy.name=Buty Necromancera
item.ebwizardry\:wizard_hat_necromancy.name=Czapka Nekromanty
item.ebwizardry\:wizard_robe_necromancy.name=Szaty Nekromanty
item.ebwizardry\:wizard_leggings_necromancy.name=Spodnie Nekromanty
item.ebwizardry\:wizard_boots_necromancy.name=Buty Nekromanty
item.ebwizardry\:wizard_hat_earth.name=Czapka Maga Ziemi
item.ebwizardry\:wizard_robe_earth.name=Szaty Maga Ziemi
@@ -212,6 +250,14 @@ item.ebwizardry\:spectral_boots.name=Spektralne Buty
item.ebwizardry\:lightning_hammer.name=Młot Piorunów
item.ebwizardry\:flamecatcher.name=Łapacz Płomieni
item.ebwizardry\:generic.disabled=Ta pozycja została wyłączona w konfiguracji
item.ebwizardry\:ring.generic.desc=Zapisz ten pierścionek w spisie pierścionków lub umieszczając go na swoim pasku dostępu. Można wyposażyć do 2 pierścionków na raz.
item.ebwizardry\:amulet.generic.desc=Wypakuj ten amulet do inwentarza amuletów lub umieszczając go na pasku informacyjnym. Tylko jeden amulet może być wyposażony na raz.
item.ebwizardry\:amulet.generic.desc=Wyposaż ten amulet w inwentaryzację amuletów lub umieszczając go na swoim pasku dostępu. Tylko jeden amulet może być wyposażony na raz.
item.ebwizardry\:ring_condensing.name=Pierścień Kondensacji
item.ebwizardry\:ring_condensing.desc=Regeneruje manę w wolnym tempie dla wszystkich różdżek na twoim pasku
item.ebwizardry\:ring_siphoning.name=Pierścień Syfonowania
@@ -226,6 +272,8 @@ item.ebwizardry\:ring_fire_biome.name=Pierścień Pustynnego Słońca
item.ebwizardry\:ring_fire_biome.desc=Zaklęcia ognia są o 30%% silniejsze w gorących biomach
item.ebwizardry\:ring_disintegration.name=Pierścień Wzburzonego Żaru
item.ebwizardry\:ring_disintegration.desc=Wszystkie zaklęcia ognia powodują natychmiastowy rozpada mobów z nimi zetkniętych
item.ebwizardry\:ring_meteor.name=Pierścień Volthraa
item.ebwizardry\:ring_meteor.desc= Zamiast spadać z nieba, meteor może być wycelowany jak pocisk
item.ebwizardry\:ring_ice_melee.name=Pierścień Lodowego Dotyku
item.ebwizardry\:ring_ice_melee.desc=Trafienie potwora Lodową Różdżką daje mu efekt zamrożenia
item.ebwizardry\:ring_ice_biome.name=Pierścień Zlodowacenia
@@ -242,12 +290,14 @@ item.ebwizardry\:ring_seeking.name=Pierścień Przyciągania
item.ebwizardry\:ring_seeking.desc=Wszystkie zaklęcia pociskowe namierzają cel
item.ebwizardry\:ring_hammer.name=Pierścień Thalka Wszechmogącego
item.ebwizardry\:ring_hammer.desc=Młot Thora może zostać podniesiony i rzucony w innym kierunku
item.ebwizardry\:ring_stormcloud.name=Pierścień Lokenzena
item.ebwizardry\:ring_stormcloud.desc=Chmura burzowa przesuwa się w kierunku celów i trwa dłużej z każdym uderzeniem
item.ebwizardry\:ring_soulbinding.name=Pierścień Duchowego Przechodnia
item.ebwizardry\:ring_soulbinding.desc=Stworzenia zetknięte z zaklęciami nekromancji zostają powiązane z tobą duszą
item.ebwizardry\:ring_leeching.name=Pierścień Pijawki
item.ebwizardry\:ring_leeching.desc=Wszystkie zaklęcia nekromancji mają 30%% szans na wywołanie efektu wysysania życia
item.ebwizardry\:ring_necromancy_melee.name=Pierścień Nekrotycznego Dotyku
item.ebwizardry\:ring_necromancy_melee.desc=Uderzenie potwora Różdżką Necromanty powoduje obumieranie ofiary
item.ebwizardry\:ring_necromancy_melee.desc=Uderzenie potwora Różdżką Nekromanty powoduje obumieranie ofiary
item.ebwizardry\:ring_mind_control.name=Pierścień Psychiki
item.ebwizardry\:ring_mind_control.desc=Stworzenia, które mają kontrolowany umysł mają szansę na kontrolowanie umysłu innych pobliskich stworzeń
item.ebwizardry\:ring_poison.name=Serpentynowy Pierścień
@@ -258,11 +308,13 @@ item.ebwizardry\:ring_earth_biome.name=Pierścień Driady
item.ebwizardry\:ring_earth_biome.desc=Zaklęcia Ziemi są o 30%% silniejsze w lasach i w puszczy
item.ebwizardry\:ring_full_moon.name=Pierścień Wyjącego Wilka
item.ebwizardry\:ring_full_moon.desc=Zaklęcia Ziemi znacznie skróciły swój czas odnawiania się podczas pełni księżyca
item.ebwizardry\:ring_evoker.name=Pierścień Przywoływacza
item.ebwizardry\:ring_evoker.desc=Skradanie się podczas rzucania kłami przywołuje koło obronne zamiast linii
item.ebwizardry\:ring_extraction.name=Pierścień Ekstrakcyjny
item.ebwizardry\:ring_extraction.desc=Zabójstwa popełnione przez Czarnoksięskie zaklęcia daja premię do many
item.ebwizardry\:ring_mana_return.name=Pierścień Perfekcjonisty
item.ebwizardry\:ring_mana_return.desc=Strzały Mocy, które nie trafiły w cel, zwracają manę z powrotem do różdżki
item.ebwizardry\:ring_blockwrangler.name=Pierścień Blockwranglera
item.ebwizardry\:ring_blockwrangler.name=Pierścień Bloków
item.ebwizardry\:ring_blockwrangler.desc=Rzucane bloki zadają dwa razy więcej obrażeń niż normalne
item.ebwizardry\:ring_conjurer.name=Pierścień Zaklinacza
item.ebwizardry\:ring_conjurer.desc=Zaklęte przedmioty mają dwa razy dłuższy efekty zaklęcia
@@ -274,7 +326,7 @@ item.ebwizardry\:ring_interdiction.name=Pierścień Ubezwłasnowolnienia
item.ebwizardry\:ring_interdiction.desc=Twoje pole siłowe uszkadza stwory, które się z nim zetknął
item.ebwizardry\:amulet_arcane_defence.name=Amulet Tajemnej Obrony
item.ebwizardry\:amulet_arcane_defence.desc=Powoli regenneruje mane wszystkim pobliskim czarodzieją
item.ebwizardry\:amulet_arcane_defence.desc=Powoli regeneruje mane wszystkim pobliskim czarodziejom
item.ebwizardry\:amulet_warding.name=Amulet Strażnictwa
item.ebwizardry\:amulet_warding.desc=Zmniejsza wszystkie przychodzące magiczne obrażenia o 10%%
item.ebwizardry\:amulet_wisdom.name=Amulet Mądrości
@@ -287,14 +339,16 @@ item.ebwizardry\:amulet_ice_immunity.name=Amulet Wiecznej Zmarzliny
item.ebwizardry\:amulet_ice_immunity.desc=Daje całkowitą odporność na zamrożenie
item.ebwizardry\:amulet_ice_protection.name=Amulet Oszronienia
item.ebwizardry\:amulet_ice_protection.desc=Zmniejsza obrażenia od lodu o 30%%
item.ebwizardry\:amulet_frost_warding.name=Amulet Esundora
item.ebwizardry\:amulet_frost_warding.desc=Dodaje efekt ochronny gdy stoisz za ścianą lodu
item.ebwizardry\:amulet_potential.name=Amulet Potencjału
item.ebwizardry\:amulet_potential.desc=Daje 15%% szansy na wystrzelenie błyskawicy w stwory atakujące cię w zwarciu
item.ebwizardry\:amulet_channeling.name=Amulet Kanalizacji
item.ebwizardry\:amulet_channeling.name=Amulet Kopania
item.ebwizardry\:amulet_channeling.desc=Daje 30%% szansy na zniwelowanie nadchodzących szokujących obrażeń
item.ebwizardry\:amulet_lich.name=Amulet Licha
item.ebwizardry\:amulet_lich.name=Amulet Lisza
item.ebwizardry\:amulet_lich.desc=Daje 15%% szansy, że nadchdzące obrażenia przejdą na inne istoty
item.ebwizardry\:amulet_wither_immunity.name=Amulet Witherowej Perły
item.ebwizardry\:amulet_wither_immunity.desc=Daje całkowita odporność na obumieranie
item.ebwizardry\:amulet_wither_immunity.name=Amulet Obumarłej Perły
item.ebwizardry\:amulet_wither_immunity.desc=Daje całkowita odporność na obumieranie.
item.ebwizardry\:amulet_glide.name=Amulet Wiatru
item.ebwizardry\:amulet_glide.desc=Upadek większy niż 3 bloki ma 50%% szans na aktywację efektu opadania
item.ebwizardry\:amulet_banishing.name=Amulet Endermana
@@ -309,11 +363,19 @@ item.ebwizardry\:amulet_resurrection.name=Amulet Nieśmiertelności
item.ebwizardry\:amulet_resurrection.desc=Zaklęcie Zmartwychwstania może być użyte na tobie spoza grobu
item.ebwizardry\:amulet_auto_shield.name=Amulet Hyeleth
item.ebwizardry\:amulet_auto_shield.desc=Daje 25%% szansy na wywołanie zaklęcia tarczy na kilka sekund po związaniu różdżki z twoim paskiem
item.ebwizardry\:amulet_absorption.name=Amulet Witalności
item.ebwizardry\:amulet_absorption.desc= Nadmiar zdrowia z zaklęć leczniczych zamienia się w serca
item.ebwizardry\:charm_haggler.name=Oznaka Hagglera
item.ebwizardry\:charm_haggler.desc=Czarodzieje mają gwarancję zaoferowania nowego handlu za każdym razem, gdy z nimi handlujesz
item.ebwizardry\:charm_experience_tome.name=Tom Pilności
item.ebwizardry\:charm_experience_tome.desc=Zwiększa szybkość procesu różdżek o 40%%
item.ebwizardry\:charm_move_speed.name= Medalion Ikara
item.ebwizardry\:charm_move_speed.desc=Pełna szybkość przy rzuceniu zaklęcia
item.ebwizardry\:charm_spell_discovery.name=Okulary Marchiwisty
item.ebwizardry\:charm_spell_discovery.desc=Książki o zaklęciach znalezione w skrzyniach są znacznie bardziej prawdopodobne, że to te, których jeszcze nie odkryłeś
item.ebwizardry\:charm_auto_smelt.name=Znak Metalurga
item.ebwizardry\:charm_auto_smelt.desc=Kieszonkowy piec uruchamia się automatycznie po związaniu różdżki z twoim paskiem
item.ebwizardry\:charm_lava_walking.name=Lodowy Rdzeń Netheru
@@ -324,20 +386,30 @@ item.ebwizardry\:charm_minion_health.name=Obsydianowa Głowa Zombi
item.ebwizardry\:charm_minion_health.desc=Przywołane stworzenia są o 25%% silniejsze
item.ebwizardry\:charm_minion_variants.name=Talizman Transformacji
item.ebwizardry\:charm_minion_variants.desc=Przywołane zombi to posuchy; przywołane szkielety to tułacze
item.ebwizardry\:charm_undead_helmets.name=Przeklęty Hełm
item.ebwizardry\:charm_undead_helmets.desc=Przyzwane szkielety są odporne na słońce
item.ebwizardry\:charm_hunger_casting.name=Demoniczna Pieczęć
item.ebwizardry\:charm_hunger_casting.desc=Kiedy brak many, głód może być używany do rzucania zaklęć
item.ebwizardry\:charm_flight.name=Szmaragdowe Skrzydło Chrząszcza
item.ebwizardry\:charm_flight.desc=Lot i opadanie są o 50%% szybsze
item.ebwizardry\:charm_growth.name=Urok Kryształowego Kwiatu
item.ebwizardry\:charm_growth.desc=Aura wzrostu ma 35%% szansy na natychmiastowy wzrost upraw aż do osiągnięcia pełnej dojrzałości
item.ebwizardry\:charm_abseiling.name=Zaczarowany Sznurek
item.ebwizardry\:charm_abseiling.desc=Przytrzymywanie shifta podczas wspinaczki zkalęciem lijany powoduje schodzenie z niej
item.ebwizardry\:charm_abseiling.desc=Przytrzymywanie shifta podczas wspinaczki zaklęciem lijany powoduje schodzenie z niej
item.ebwizardry\:charm_silk_touch.name=Księżycowa Kula
item.ebwizardry\:charm_silk_touch.desc=Bloki zniszczone zaklęciem Magicznego Zniszczenia zawsze wypadają
item.ebwizardry\:charm_sixth_sense.name=Skóra Strasznego Wilka
item.ebwizardry\:charm_sixth_sense.desc=Szósty zmysł wyświetla różne kolory pasywnych, neutralnych i wrogich potworów
item.ebwizardry\:charm_stop_time.name=Osobliwy Zegarek Kieszonkowy
item.ebwizardry\:charm_stop_time.desc=Zaklęcie Spowolnienia Czasu sprawia, że czas stoi w miejscu
item.ebwizardry\:charm_light.name=Wiecznie Żarząca Latarnia Elviniana
item.ebwizardry\:charm_light.desc=Zaklęcie Światła będzie trwało wiecznie i może zostać wygaszone poprzez kliknięcie PPM różdżką na światło
item.ebwizardry\:charm_transportation.name=Starożytny Kompas
item.ebwizardry\:charm_transportation.desc=Zapamietuje connajmniej cztery kamienne okręgi, które można wybrać jako transport
item.ebwizardry\:charm_black_hole.name=Opal Pustki
item.ebwizardry\:charm_black_hole.desc=Czarna dziura zasysa i niszczy bloki
item.ebwizardry\:charm_mount_teleporting.name=Widmowy Łańcuch
item.ebwizardry\:charm_mount_teleporting.desc=Teleportowanie podczas jazdy zwierzęciem lub pojazdem zabiera go ze sobą
item.ebwizardry\:charm_feeding.name=Podręczny Worek
item.ebwizardry\:charm_feeding.desc=Potrzeba Głodu uzupełnia się automatycznie po związaniu różdżki z paskiem
@@ -382,7 +454,7 @@ entity.ebwizardry\:skeleton_minion.name=Szkielet
entity.ebwizardry\:stray_minion.name=Tułacz
entity.ebwizardry\:spider_minion.name=Pająk
entity.ebwizardry\:blaze_minion.name=Płomyk
entity.ebwizardry\:wither_skeleton_minion.name=Witherowy Szkielet
entity.ebwizardry\:wither_skeleton_minion.name=Obumary Szkielet
entity.ebwizardry\:ice_wraith.name=Sługa Lodu
entity.ebwizardry\:lightning_wraith.name=Sługa Piorunów
entity.ebwizardry\:shadow_wraith.name=Sługa Cienia
@@ -398,30 +470,31 @@ entity.ebwizardry\:evil_wizard.name=Zły Czarodziej
entity.ebwizardry\:decoy.name=Klon
entity.ebwizardry\:vex_minion.name=Dręczyciel
entity.ebwizardry\:magic_missile.name=Magia
entity.ebwizardry\:arc.name=Magia
entity.ebwizardry\:spark_bomb.name=Magia
entity.ebwizardry\:ice_shard.name=Magia
entity.ebwizardry\:firebomb.name=Magia
entity.ebwizardry\:poison_bomb.name=Magia
entity.ebwizardry\:force_orb.name=Magia
entity.ebwizardry\:spark.name=Magia
entity.ebwizardry\:darkness_orb.name=Magia
entity.ebwizardry\:fire_sigil.name=Magia
entity.ebwizardry\:frost_sigil.name=Magia
entity.ebwizardry\:lightning_sigil.name=Magia
entity.ebwizardry\:lightning_arrow.name=Magia
entity.ebwizardry\:firebolt.name=Magia
entity.ebwizardry\:ice_charge.name=Magia
entity.ebwizardry\:force_arrow.name=Magia
entity.ebwizardry\:dart.name=Magia
entity.ebwizardry\:lightning_disc.name=Magia
entity.ebwizardry\:thunderbolt.name=Magia
entity.ebwizardry\:decay.name=Magia
entity.ebwizardry\:ice_lance.name=Magia
entity.ebwizardry\:smoke_bomb.name=Magia
entity.ebwizardry\:ice_spike.name=Magia
entity.ebwizardry\:combustion_rune.name=Magia
entity.ebwizardry\:magic_missile.name=Magiczny Pocisk
entity.ebwizardry\:arc.name=Łuk
entity.ebwizardry\:spark_bomb.name=Bomba Rozpryskowa
entity.ebwizardry\:ice_shard.name=Odłamek Lodu
entity.ebwizardry\:firebomb.name=Ognista Bomba
entity.ebwizardry\:poison_bomb.name=Trująca Bomba
entity.ebwizardry\:force_orb.name=Kula Siły
entity.ebwizardry\:spark.name=Iskry
entity.ebwizardry\:darkness_orb.name=Ciemność
entity.ebwizardry\:fire_sigil.name=Ognista Pieczęć
entity.ebwizardry\:frost_sigil.name=Lodowa Pieczęć
entity.ebwizardry\:lightning_sigil.name=Pieczęć Błyskawic
entity.ebwizardry\:lightning_arrow.name=Strzała Błyskawic
entity.ebwizardry\:firebolt.name=Ognisty Piorun
entity.ebwizardry\:ice_charge.name=Lodowy Ładunek
entity.ebwizardry\:force_arrow.name=Strzała Siły
entity.ebwizardry\:dart.name=Strzałka
entity.ebwizardry\:lightning_disc.name=Dysk Błyskawic
entity.ebwizardry\:thunderbolt.name=Błyskawica
entity.ebwizardry\:decay.name=Rozkład
entity.ebwizardry\:ice_lance.name=Lodowa Lanca
entity.ebwizardry\:smoke_bomb.name=Bomba Dymna
entity.ebwizardry\:ice_spike.name=Lodowy Kolec
entity.ebwizardry\:combustion_rune.name=Runa Zapłonu
entity.ebwizardry\:flamecatcher_arrow.name=Strzała Łapacza Płomieni
entity.ebwizardry\:black_hole.name=Czarna Dziura
entity.ebwizardry\:shield.name=Tarcza
@@ -437,12 +510,17 @@ entity.ebwizardry\:ring_of_fire.name=Pierścień Ognia
entity.ebwizardry\:earthquake.name=Trzęsienie Ziemi
entity.ebwizardry\:hailstorm.name=Gradobicie
entity.ebwizardry\:lightning_pulse.name=Elektryczny Puls
entity.ebwizardry\:stormcloud.name=Chmura Burzowa
entity.ebwizardry\:zombie_spawner.name=Tworzenie Zombi
entity.ebwizardry\:boulder.name=Głaz
entity.ebwizardry\:radiant_totem.name=Promienny Totem
entity.ebwizardry\:withering_totem.name=Obumarły Totem
itemGroup.ebwizardry=Wizardry
itemGroup.ebwizardry=Czary
itemGroup.ebwizardryspells=Zaklęcia
itemGroup.ebwizardrygear=Sprzęt Czarodzieja
advancement.ebwizardry\:root=Wizardry
advancement.ebwizardry\:root=Czary
advancement.ebwizardry\:root.desc=Podróż Czarodzieja do mistrza magii
advancement.ebwizardry\:crystal=Ciekawy kryształ...
advancement.ebwizardry\:crystal.desc=Wykop magiczny kryształ
@@ -497,7 +575,7 @@ advancement.ebwizardry\:legendary.desc=Zdobądź legendarną zbroję czarodzieja
advancement.ebwizardry\:enchant_scroll=Rozwiń Zwój!
advancement.ebwizardry\:enchant_scroll.desc=Stwórz pusty zwój i zaczaruj go zaklęciem w tajemniczym stole
handbook.toast.title=Nowa rodział w podręczniku zpostał odblokowany!
handbook.toast.title=Nowa rodział w podręczniku postaci odblokowany!
container.ebwizardry\:arcane_workbench=Tajmeniczny Stół
container.ebwizardry\:arcane_workbench.apply=Zastosuj
@@ -509,20 +587,20 @@ tier.apprentice=Uczeń
tier.advanced=Zaawansowany
tier.master=Mistrz
element.magic=Brak
element.magic=Magia
element.fire=Ogień
element.ice=Lód
element.lightning=Piorun
element.necromancy=Necromancja
element.necromancy=Nekromancja
element.earth=Ziemia
element.sorcery=Czarnoksięstwo
element.healing=Uzdrawianie
element.magic.wizard=Czarodziej
element.fire.wizard=Pyromancer
element.fire.wizard=Piromanta
element.ice.wizard=Mag Lodu
element.lightning.wizard=Mag Sztormu
element.necromancy.wizard=Necromancer
element.necromancy.wizard=Nekromanta
element.earth.wizard=Mag Ziemi
element.sorcery.wizard=Czarnoksiężnik
element.healing.wizard=Uzdrowiciel
@@ -547,9 +625,12 @@ spell.ebwizardry\:arcane_lock=Magiczny Zamek
spell.ebwizardry\:arrow_rain=Deszcz Strzał
spell.ebwizardry\:banish=Wygnanie
spell.ebwizardry\:black_hole=Czarna Dziura
spell.ebwizardry\:blinding_flash=Oślepiające Światło
spell.ebwizardry\:blink=Teleportacja
spell.ebwizardry\:blizzard=Burza Śnieżna
spell.ebwizardry\:bubble=Bańka
spell.ebwizardry\:boulder=Głaz
spell.ebwizardry\:celestial_smite=Niebiańskie Uderzenie
spell.ebwizardry\:chain_lightning=Łańcuch Piorunów
spell.ebwizardry\:charge=Błysk
spell.ebwizardry\:clairvoyance=Jasnowidzenie
@@ -578,14 +659,18 @@ spell.ebwizardry\:dragon_fireball=Kula Smoka
spell.ebwizardry\:earthquake=Trzęsienie Ziemi
spell.ebwizardry\:empowering_presence=Wzmocnienie Obecności
spell.ebwizardry\:entrapment=Uwięzienie
spell.ebwizardry\:enrage=Wściekłość
spell.ebwizardry\:evade=Unik
spell.ebwizardry\:fangs=Kieł
spell.ebwizardry\:fireball=Kula Ognia
spell.ebwizardry\:firebolt=Ognisty Pocisk
spell.ebwizardry\:firebomb=Ognista Bomba
spell.ebwizardry\:fire_resistance=Ognista Więź
spell.ebwizardry\:fire_sigil=Pieczęć Ognia
spell.ebwizardry\:fireskin=Ognista Skóra
spell.ebwizardry\:fire_breath=Fire Breath
spell.ebwizardry\:firestorm=Ognisty Sztorm
spell.ebwizardry\:fire_breath=Ognisty Oddech
spell.ebwizardry\:flamecatcher=Łapacz Płomieni
spell.ebwizardry\:flame_ray=Ognisty Promień
spell.ebwizardry\:flaming_axe=Ognisty Topór
spell.ebwizardry\:flaming_weapon=Ogniste Zaczarowanie
@@ -600,17 +685,19 @@ spell.ebwizardry\:forest_of_thorns=Cierniowy Okrąg
spell.ebwizardry\:freeze=Zamrożenie
spell.ebwizardry\:freezing_weapon=Lodowe Zaczarowanie
spell.ebwizardry\:frost_axe=Lodowy Topór
spell.ebwizardry\:frost_barrier=Lodowa Bariera
spell.ebwizardry\:frost_ray=Lodowy Promień
spell.ebwizardry\:frost_sigil=Lodowa Pieczęć
spell.ebwizardry\:frost_step=Lodowe Kroki
spell.ebwizardry\:glide=Opadanie
spell.ebwizardry\:grapple=Lijana
spell.ebwizardry\:greater_fireball=Wileka Kula Ognia
spell.ebwizardry\:greater_fireball=Wielka Kula Ognia
spell.ebwizardry\:greater_heal=Super Uleczanie
spell.ebwizardry\:greater_telekinesis=Mistrzowska Telekineza
spell.ebwizardry\:greater_ward=Silny Totem
spell.ebwizardry\:group_heal=Grupowe Uleczenie
spell.ebwizardry\:growth_aura=Aura Wzrostu
spell.ebwizardry\:guardian_beam=Strażniczy Promień
spell.ebwizardry\:hailstorm=Gradobicie
spell.ebwizardry\:heal=Uleczenie
spell.ebwizardry\:heal_ally=Uleczenie Sojusznika
@@ -634,7 +721,7 @@ spell.ebwizardry\:ironflesh=Żelazna Skóra
spell.ebwizardry\:leap=Skok
spell.ebwizardry\:levitation=Lewitacja
spell.ebwizardry\:life_drain=Wysysanie Życia
spell.ebwizardry\:light=Świtło
spell.ebwizardry\:light=Światło
spell.ebwizardry\:lightning_arrow=Strzała Pioruna
spell.ebwizardry\:lightning_bolt=Uderzenie Pioruna
spell.ebwizardry\:lightning_disc=Elektryczny Dysk
@@ -644,15 +731,18 @@ spell.ebwizardry\:lightning_ray=Elektryczny Promień
spell.ebwizardry\:lightning_sigil=Pieczęć Pioruna
spell.ebwizardry\:lightning_web=Elektryczna Sieć
spell.ebwizardry\:magic_missile=Magiczny Pocisk
spell.ebwizardry\:mark_sacrifice=Znak Poświęcenia
spell.ebwizardry\:metamorphosis=Metamorfoza
spell.ebwizardry\:meteor=Meteor
spell.ebwizardry\:mind_control=Kontrola Umysłu
spell.ebwizardry\:mind_trick=Zagrywka Psychiczna
spell.ebwizardry\:mine=Magiczne Zniszczenie
spell.ebwizardry\:mirage=Iluzja
spell.ebwizardry\:muffle=Rozproszenie
spell.ebwizardry\:none=[Puste miejsce]
spell.ebwizardry\:oakflesh=Dębowa Skóra
spell.ebwizardry\:paralysis=Paralizacja
spell.ebwizardry\:paralysis=Paraliż
spell.ebwizardry\:permafrost=Permanentny Mróz
spell.ebwizardry\:petrify=Skamieniałość
spell.ebwizardry\:phase_step=Szybki Krok
spell.ebwizardry\:plague_of_darkness=Plaga Ciemności
@@ -661,15 +751,16 @@ spell.ebwizardry\:pocket_workbench=Kieszonkowy Stół Rzemieślniczy
spell.ebwizardry\:poison=Zatrucie
spell.ebwizardry\:poison_bomb=Zatruta Bomba
spell.ebwizardry\:possession=Opętanie
spell.ebwizardry\:radiant_totem=Promienny Totem
spell.ebwizardry\:ray_of_purification=Promień Oczyszczenia
spell.ebwizardry\:remove_curse=Zniewolenie Klątwy
spell.ebwizardry\:replenish_hunger=Bogosławieństwo Głodu
spell.ebwizardry\:replenish_hunger=Błogosławieństwo Głodu
spell.ebwizardry\:resurrection=Zmartwychwstanie
spell.ebwizardry\:reversal=Efektowna Zamiana
spell.ebwizardry\:ring_of_fire=Pierścień Ognia
spell.ebwizardry\:satiety=Nasycenie
spell.ebwizardry\:shadow_ward=Sługa Cienia
spell.ebwizardry\:shield=Tracza
spell.ebwizardry\:shield=Tarcza
spell.ebwizardry\:shockwave=Fala Uderzeniowa
spell.ebwizardry\:shulker_bullet=Kula Shulkera
spell.ebwizardry\:silverfish_swarm=Rój Mszyc
@@ -684,6 +775,7 @@ spell.ebwizardry\:spectral_pathway=Spektralny Chodnik
spell.ebwizardry\:speed_time=Przyśpieszanie Czasu
spell.ebwizardry\:spider_swarm=Rój Pająków
spell.ebwizardry\:static_aura=Statyczna Aura
spell.ebwizardry\:stormcloud=Chmura Burzowa
spell.ebwizardry\:summon_blaze=Przywołanie Płomyka
spell.ebwizardry\:summon_ice_giant=Przywołanie Lodowego Olbrzyma
spell.ebwizardry\:summon_ice_wraith=Przywołanie Lodowego Sługi
@@ -697,7 +789,7 @@ spell.ebwizardry\:summon_snow_golem=Przywołanie Śnieżnego Golema
spell.ebwizardry\:summon_spirit_horse=Przywołanie Duchowego Konia
spell.ebwizardry\:summon_spirit_wolf=Przywołanie Duchowego Wilka
spell.ebwizardry\:summon_storm_elemental=Przywołanie Sługi Sztormu
spell.ebwizardry\:summon_wither_skeleton=Przywołanie Witherowego Szkieleta
spell.ebwizardry\:summon_wither_skeleton=Przywołanie Obumarłego Szkieleta
spell.ebwizardry\:summon_zombie=Przywołanie Zombi
spell.ebwizardry\:telekinesis=Telekineza
spell.ebwizardry\:thunderbolt=Wybuchowy Piorun
@@ -711,8 +803,10 @@ spell.ebwizardry\:wall_of_frost=Lodowa Ściana
spell.ebwizardry\:ward=Totem
spell.ebwizardry\:water_breathing=Silne Płuca
spell.ebwizardry\:whirlwind=Podmuch Wiatru
spell.ebwizardry\:wither=Wither
spell.ebwizardry\:wither_skull=Czaszka Withera
spell.ebwizardry\:wither=Obumieranie
spell.ebwizardry\:wither_skull=Czaszka Obumierania
spell.ebwizardry\:withering_totem=Obumarły Totem
spell.ebwizardry\:zombie_apocalypse=Apokalipsa Zombi
spell.ebwizardry\:agility.desc=Zapewnia rzucającemu szybszą prędkość ruchu i większą wysokość skoku na 30 sekund.
spell.ebwizardry\:arc.desc=Wystrzeliwuje iskierkę błyskawicy w cel.
@@ -721,8 +815,10 @@ spell.ebwizardry\:arcane_lock.desc=Tworzy nieprzenikalną barierę wokół skrzy
spell.ebwizardry\:arrow_rain.desc="Łucznicy, ogień!"
spell.ebwizardry\:banish.desc=Teleportuje cel wbrew swojej woli do losowych lokalizacji w określonym zasięgu.
spell.ebwizardry\:black_hole.desc=Łza rzeczywistości rozrywa się.
spell.ebwizardry\:blinding_flash.desc=Emituje intensywny błysk światła, który oślepia wszystkie pobliskie stworzenia
spell.ebwizardry\:blink.desc=Teleportuje rzucającego na niewielką odległość do miejsca, w które wskazał.
spell.ebwizardry\:blizzard.desc=Tworzy strefę wirującego lodowatego wiatru, który spowalnia i nieustannie niszczy wszystko uwięzione w środku. Rzucający jest odporny na obrażenia, ale zostanie także spowolniony.
spell.ebwizardry\:boulder.desc=""Niech świat będzie moją kręgielnią"
spell.ebwizardry\:bubble.desc=Wystrzeliwuje strumień bąbelków, który sprawia, że wszystko, co uderzy, unosi się bezradnie w górę. Cel spadnie po pewnym czasie lub gdy zostanie zraniony.
spell.ebwizardry\:chain_lightning.desc=Wystrzeliwuje iskierkę pioruna w cel, który następnie łączy się z dodatkowymi celami przekazując piorun nawet dwukrotnie.
spell.ebwizardry\:charge.desc=Powoduje, że rzucający wyrzuca się szybko w kierunku, w którym patrzy, uszkadzając i odrzucając wszystko na swojej drodze.
@@ -747,19 +843,23 @@ spell.ebwizardry\:decoy.desc=Tworzy iluzjonistyczny klon rzucającego, który zm
spell.ebwizardry\:detonate.desc=Powoduje eksplozję w miejscu, w które celujesz, uszkadzając wszystkie pobliskie stworzenia - w tym rzucającego, jeśli stoi zbyt blisko.
spell.ebwizardry\:diamondflesh.desc="Twoje strzały nie pasują do mnie!"
spell.ebwizardry\:disintegration.desc=Wystrzeliwuje potężny pocisk ognia w bliskiej odległości przed tobą, co powoduje, że cele zabijają wybuchające płomienie. Stwory, które nadepną na żar, zostaną podpalone.
spell.ebwizardry\:divination.desc=Prowadzi rzucającego do pobliskich rud i zasobów. Potencja zwiększy szansę na znalezienie cenniejszych rud.
spell.ebwizardry\:divination.desc=Prowadzi rzucającego do pobliskich rud i zasobów. Potencjał zwiększy szansę na znalezienie cenniejszych rud.
spell.ebwizardry\:dragon_fireball.desc=Wystrzeliwuje kulę Smoka Endu we wskazanym przez ciebie kierunku, która przy uderzeniu uwalnia trującą chmurę.
spell.ebwizardry\:earthquake.desc=Prawdziwy mistrz magii ziemi może przenosić góry.
spell.ebwizardry\:empowering_presence.desc=Zapewnia rzucającemu i pobliskim sojusznikom zwiększone obrażenia magiczne na 30 sekund.
spell.ebwizardry\:enrage.desc=Powoduje, że pobliskie stworzenia wpadają w furię atakując wszystko oprócz ciebie.
spell.ebwizardry\:entrapment.desc=Zniewala cel w kuli ciemności, która ciągnie go bezradnie w górę i nieustannie go uszkadza.
spell.ebwizardry\:evade.desc=Powoduje, że rzucający szybko skacze na boki, aby unikać nadchodzących ataków.
spell.ebwizardry\\:fangs.desc=Wyciąga rząd przywołujących kłów przed kółkiem, które wznoszą się z ziemi, gryząc tłumy na swojej drodze.
spell.ebwizardry\:fireball.desc=Wystrzeliwuje ognistą kulę we wskazanym kierunku.
spell.ebwizardry\:firebolt.desc=Wystrzeliwuje strumień ognia na niewielką odległość.
spell.ebwizardry\:firebomb.desc=Wyrzuca ognistą bombę w kierunku, w którym wskazujesz, który eksploduje przy uderzeniu, podpalając cele.
spell.ebwizardry\:fire_resistance.desc=Zapewnia rzucającej odporność na ogień na 30 sekund.
spell.ebwizardry\:fire_sigil.desc=Umieszcza na ziemi magiczną pułapkę ognia, która uszkadza i podpala stworzenie, które na nią nadepnie.
spell.ebwizardry\:fireskin.desc=Ukrywa rzucającego w płomieniach na 30 sekund, powodując, że wszystko, co go zaatakuje, zapali się.
spell.ebwizardry\:firestorm.desc="Oczyścić ziemię! Drzewa będą płonąć, a jeziora gotować się będą!
spell.ebwizardry\:fire_breath.desc="Jestem smokiem."
spell.ebwizardry\:flamecatcher.desc= Mówi się, że w czasach potrzeby, oferuje swoją moc godnym Piromanom.
spell.ebwizardry\:flame_ray.desc=Tworzy strumień płomieni w kierunku, który wskazujesz, jednocześnie podpalając i nieustannie niszcząc cele.
spell.ebwizardry\:flaming_axe.desc=Tworzy płonący topór, który po trafieniu podpala wrogów. Utrzymuje się przez 30 sekund.
spell.ebwizardry\:flaming_weapon.desc=Tymczasowo nasyca pierwszą broń na pasku rzucającego mocą ognia, powodując, że podpala ona ofiary. Zaklęcie znika po 45 sekundach.
@@ -823,6 +923,7 @@ spell.ebwizardry\:meteor.desc=Niektórzy czarodzieje chcą tylko, aby świat pł
spell.ebwizardry\:mind_control.desc=Przejmuje kontrolę nad umysłem celu przez 30 sekund, powodując, że zmienia on stronę bitwy i zamiast tego walczy po stronie rzucającego. Nie działa na stworzenia o zbyt silnej woli.
spell.ebwizardry\:mind_trick.desc=Myli i dezorientuje cel na 15 sekund, uniemożliwiając mu skuteczny atak. Efekt zostanie rozproszony, jeśli cel zada jakiekolwiek obrażenia.
spell.ebwizardry\:mine.desc=Niszczy blok, na który patrzy rzucający. Potencja pozwoli przełamać trudniejsze bloki.
spell.ebwizardry\:mirage.desc=Tworzy iluzję. Iluzja utrzymuje się przez 20 sekund.
spell.ebwizardry\:muffle.desc=Wycisza wszelkie dźwięki wydawane przez rzucającego na 30 sekund. Po stłumieniu moby mogą cię wykryć tylko w przypadku patrzenia na ciebie.
spell.ebwizardry\:none.desc=Aby zdobyć księgę zkalęć za pomocą /give command, użyj id\: /give [gracz] ebwizardry\:spell_book 1 [spell id] (jeśli znalazłeś tę książkę w skrzyni, to jakiś inny mod coś popsuł).
spell.ebwizardry\:oakflesh.desc=Zwiększa odporność rzucającego na obrażenia na 30 sekund.
@@ -835,6 +936,7 @@ spell.ebwizardry\:pocket_workbench.desc=Pozwala rzucającemu tworzyć przedmioty
spell.ebwizardry\:poison.desc=Wystrzeliwuje truciznę we wskazanym kierunku.
spell.ebwizardry\:poison_bomb.desc=Wystrzeliwuje trującą bombę w pożądanym kierunku, która wybucha przy uderzeniu, zatruwając pobliskie stworzenia.
spell.ebwizardry\:possession.desc="Zostań swoim wrogiem."
spell.ebwizardry\:radiant_totem.desc=Tworzy promienny totem, który strzela promieniem światła do pobliskich stworzeń, lecząc sojuszników, ale niszcząc tłumy.
spell.ebwizardry\:ray_of_purification.desc=Emituje promień oślepiającego światła, który uszkadza i oślepia cele. Nieumarłe stworzenia otrzymują podwójne obrażenia i zostają podpalone.
spell.ebwizardry\:remove_curse.desc=Usuwa wszelkie klątwy, które dzierży rzucający.
spell.ebwizardry\:replenish_hunger.desc=Uzupełnia poziom głodu rzucającego o 3 punkty.
@@ -858,6 +960,7 @@ spell.ebwizardry\:spectral_pathway.desc=Tworzy przed sobą niezniszczalny magicz
spell.ebwizardry\:speed_time.desc=...dzień, noc, świt, zmierzch, wschód i zachód słońca\: tak czas uwięził nas w niekończącym się cyklu...
spell.ebwizardry\:spider_swarm.desc=Przywołuje rój jadowitych pająków, które walczą po twojej stronie. Pająki znikną po 30 sekundach lub gdy zostaną zabite.
spell.ebwizardry\:static_aura.desc=Otacza rzucającego elektryczną aurą przez 30 sekund, wystrzeliwując błyskawice we wszystko, co go trafi.
spell.ebwizardry\:stormcloud.desc=Wyczarowuje pływającą pod którą uderza piorun.
spell.ebwizardry\:summon_blaze.desc=Przywołuje płomyka, która pomoże ci w walce. Płomyk zniknie po 30 sekundach lub po zabiciu.
spell.ebwizardry\:summon_ice_giant.desc="Rozbić je!"
spell.ebwizardry\:summon_ice_wraith.desc=Przywołuje sługe lodu, by walczył za ciebie. Lodowy sługa zniknie po 30 sekundach lub po zabiciu.
@@ -871,7 +974,7 @@ spell.ebwizardry\:summon_snow_golem.desc=Tworzy śnieżnego golema, aby wlaczył
spell.ebwizardry\:summon_spirit_horse.desc=Przywołuje duchowego konia, abyś mógł na nim jeździć. Duchowy koń zniknie niedługo po zejściu z niego lub możesz go odesłać, klikając na niego dowolną różdżką z klaiwszem shift.
spell.ebwizardry\:summon_spirit_wolf.desc=Przywołuje duchowego wilka, który walczy po twojej stronie. Duchowy wilk zniknie tylko wtedy, gdy zostanie zabity, lub zostanie odesłany poprzez kliknięcie na niego różdżką z klawiszem shift.
spell.ebwizardry\:summon_storm_elemental.desc="Element Sztormu\: Starożytna manifestacja żywiołów, z trudem może zawierać w sobie surową moc." - Przewodnik czarodzieja o tajemnych istotach, Tom II
spell.ebwizardry\:summon_wither_skeleton.desc=Przywołuje witherowego szkieleta, by walczył dla ciebie. Witherowy szkielet zniknie po 30 sekundach lub gdy zostanie zabity.
spell.ebwizardry\:summon_wither_skeleton.desc=Przywołuje obumarłego szkieleta, by walczył dla ciebie. Niszczący szkielet zniknie po 30 sekundach lub gdy zostanie zabity.
spell.ebwizardry\:summon_zombie.desc=Przywołuje zombi, który walczy dla ciebie. Zombi zniknie po 30 sekundach lub gdy zostanie zabity.
spell.ebwizardry\:telekinesis.desc=Przyciąga przedmiot lub inny mały obiekt w twoim kierunku za jednym machnięciem różdżki. Może być również użyty do rozbrojenia graczy.
spell.ebwizardry\:thunderbolt.desc=Wystrzeliwuje elektryczną wiązkę, który odrzuca cele.
@@ -886,7 +989,9 @@ spell.ebwizardry\:ward.desc=Daje rzucającemu efekt osłony, który zmniejsza ot
spell.ebwizardry\:water_breathing.desc=Pozwala rzucającemu oddychać pod wodą przez 60 sekund.
spell.ebwizardry\:whirlwind.desc=Powoduje, że cel jest wybijany przez rzucającego.
spell.ebwizardry\:wither.desc=Wystrzeliwuje promień ciemności, który sprowadza obumieranie na wszystko co stoi mu na drodze.
spell.ebwizardry\:wither_skull.desc=Wystrzeliwuje witherową czaszkę wskazywanym przez ciebie kierunku.
spell.ebwizardry\:wither_skull.desc=Wystrzeliwuje obumarłą czaszkę we wskazywanym przez ciebie kierunku.
spell.ebwizardry\:withering_totem.desc=Przywołuje obumarły totem. Totem eksploduje po 30 sekundach, zadając tym więcej szkód, im więcej zdrowia wycieka.
spell.ebwizardry\:zombie_apocalypse.desc=Otworzenie portalu do podziemia jest łatwe. Trudność polega na zamknięciu go ponownie, gdy coś pójdzie źle.
spell.ebwizardry\:invoke_weather.sun=Deszcz przestaje padać...
spell.ebwizardry\:invoke_weather.rain=Niebiosa otwierają się...
@@ -982,7 +1087,7 @@ potion.ebwizardry\:mind_trick=Zagrywka Psychiczna
potion.ebwizardry\:mind_control=Kontrola umysłu
potion.ebwizardry\:font_of_mana=Bogosławieństwo Many
potion.ebwizardry\:fear=Strach
potion.ebwizardry\:curse_of_soulbinding=Fear
potion.ebwizardry\:curse_of_soulbinding=Strach
potion.ebwizardry\:paralysis=Paraliż
potion.ebwizardry\:muffle=Unik
potion.ebwizardry\:ward=Totem
@@ -992,6 +1097,9 @@ potion.ebwizardry\:curse_of_enfeeblement=Klątwa Osłabienia
potion.ebwizardry\:curse_of_undeath=Klątwa Nieumarłych
potion.ebwizardry\:containment=Wygaszenie
potion.ebwizardry\:frost_step=Lodowe Stopy
potion.ebwizardry\:mark_of_sacrifice=Znak Ofiary
potion.ebwizardry\:mirage=Iluzja
enchantment.ebwizardry\:magic_sword=Nasycenie
enchantment.ebwizardry\:magic_bow=Nasycenie
@@ -999,11 +1107,11 @@ enchantment.ebwizardry\:flaming_weapon=Ogniste Nasycenie
enchantment.ebwizardry\:freezing_weapon=Lodowe Nasycenie
enchantment.ebwizardry\:shocking_weapon=Pioronujące Nasycenie
enchantment.ebwizardry\:magic_protection=Ochrona prze magią
enchantment.ebwizardry\:frost_protection=Ochrona prze mrozem
enchantment.ebwizardry\:magic_protection=Ochrona przed magią
enchantment.ebwizardry\:frost_protection=Ochrona przed mrozem
enchantment.ebwizardry\:shock_protection=Ochrona przed porażeniem
key.categories.ebwizardry=Wizardry
key.categories.ebwizardry=Czary
key.ebwizardry.next_spell=Następne zaklęcie
key.ebwizardry.previous_spell=Poprzednie zaklęcie
@@ -1234,7 +1342,7 @@ config.ebwizardry.allies_command_name.tooltip=Nazwa pod komendą /allies . To je
config.ebwizardry.category.resistances=Konfiguracja odporości
config.ebwizardry.category.resistances.tooltip=Skonfiguruj, które moby są odporne na różne rodzaje magii
config.ebwizardry.title.resistances=Konfiguracja odporości
config.ebwizardry.title.resistances=Konfiguracja odporności
config.ebwizardry.subtitle.resistances=Ustawienia, które pozwalają by moby stały się odporne na niektóre rodzaje magii.
config.ebwizardry.mobs_immune_to_fire=Moby odporne na ogień
@@ -1277,3 +1385,6 @@ integration.antiqueatlas.marker.ebwizardry.obelisk=Obelisk
integration.antiqueatlas.marker.ebwizardry.shrine=Świątynia
wizard.debug=%1$s, %2$s, %3$s
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -95,11 +95,6 @@
"name": "ebwizardry:spark_bomb",
"weight": 8
},
{
"type": "item",
"name": "ebwizardry:armour_upgrade",
"weight": 1
},
{
"type": "item",
"name": "ebwizardry:astral_diamond",
@@ -17,6 +17,11 @@
"name": "ebwizardry:subsets/wand_upgrades",
"weight": 2
},
{
"type": "loot_table",
"name": "ebwizardry:subsets/armour_upgrades",
"weight": 1
},
{
"type": "item",
"name": "ebwizardry:spell_book",
@@ -38,6 +38,11 @@
"name": "ebwizardry:subsets/wand_upgrades",
"weight": 4
},
{
"type": "loot_table",
"name": "ebwizardry:subsets/armour_upgrades",
"weight": 2
},
{
"type": "item",
"name": "ebwizardry:spell_book",
@@ -100,11 +105,6 @@
}
]
},
{
"type": "item",
"name": "ebwizardry:armour_upgrade",
"weight": 1
},
{
"type": "item",
"name": "ebwizardry:astral_diamond",
@@ -27,6 +27,11 @@
"name": "ebwizardry:subsets/wand_upgrades",
"weight": 2
},
{
"type": "loot_table",
"name": "ebwizardry:subsets/armour_upgrades",
"weight": 2
},
{
"type": "item",
"name": "ebwizardry:magic_crystal",
@@ -70,11 +75,6 @@
}
]
},
{
"type": "item",
"name": "ebwizardry:armour_upgrade",
"weight": 1
},
{
"type": "item",
"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"
}
}

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