Compare commits

..

45 Commits

Author SHA1 Message Date
Electroblob77 a490168fa2 Derp 2020-03-19 15:46:42 +00:00
Electroblob77 306137a026 Update version number 2020-03-19 15:38:19 +00:00
Electroblob77 0a5527f3d4 Add backwards compatibility to convert old-format atlas markers to new ones 2020-03-19 15:35:09 +00:00
Electroblob77 4dbe24c8ea This is the problem with everything being a string... 2020-03-19 15:13:25 +00:00
Electroblob77 81bba5e7e0 Add null check to ice spikes, fixes #371 2020-03-19 13:35:36 +00:00
Electroblob77 9c29142e6a Maven-ify all the things and update Antique Atlas 2020-03-19 13:33:34 +00:00
Electroblob77 3151d7d626 Require Antique Atlas 4.6 or newer 2020-03-18 17:18:41 +00:00
Electroblob77 d68f968632 Make sure fall damage stuff is processed on the server only, and reactivate the config option by default 2020-03-18 16:00:23 +00:00
Electroblob77 74d9198522 Convert replaceVanillaFireballs to a synchronised option, fixes #351 2020-03-18 15:50:01 +00:00
Electroblob77 0b56d47022 Replace wildcard with metadata 0 for display purposes, fixes #370
N.B. The output is still not visible for non-zero inputs when using wildcard trades, but for now this is good enough
2020-03-18 15:32:59 +00:00
Electroblob77 587ab1338e Make Magic Protection protect against vanilla magic damage, closes #337 2020-03-18 14:57:04 +00:00
Electroblob77 4816c48aa6 Disable replaceVanillaFallDamage by default 2020-03-18 14:49:12 +00:00
Electroblob77 79b745e005 Randomise y coordinate to search from when spawning structures in 'cavern' dimensions, fixes #372 2020-03-17 23:54:52 +00:00
Electroblob77 6fff0e31d1 *Facepalm* 2020-03-17 23:45:40 +00:00
Electroblob77 11efe56437 Replace old hardcoded spell book text with translation keys, fixes #368 2020-03-17 23:38:25 +00:00
Electroblob77 7f5786c28c Override override override! 2020-03-17 23:22:54 +00:00
Electroblob77 85b49b330a Make tomes of arcana more common in obelisks, shrines and wizard towers, and make tomes generated as loot more likely to be apprentice tier 2020-03-17 23:16:04 +00:00
Electroblob77 d797e72445 Reduce rarity of all structures a bit 2020-03-17 23:13:17 +00:00
Electroblob77 5f21b565cd Make fireballs, large fireballs and iceballs respect the playerBlockDamage config option 2020-03-17 22:44:30 +00:00
Electroblob77 9ed06c9a34 Stop wizards casting heal ally 2020-03-17 22:34:34 +00:00
Electroblob77 50f315666f Fix spanish handbook translations, fixes #365 2020-03-15 19:23:50 +00:00
Electroblob77 62bdbc81e4 Prevent players from picking up items when possessing and prevent players from possessing whilst sneaking, fixes #376 2020-03-15 19:15:28 +00:00
Electroblob77 3a571fd239 Update credits 2020-02-29 11:25:35 +00:00
Electroblob 4fb5452dc4 Merge pull request #363 from chesterccj305/patch-1
Create handbook_zh_tw.json
2020-02-24 16:51:28 +00:00
Electroblob 652f1d2620 Merge pull request #364 from chesterccj305/patch-2
Create zh_tw.lang
2020-02-24 16:51:15 +00:00
Electroblob77 275f514810 Substitute generic damage when caster is null, fixes #362 2020-02-22 11:12:14 +00:00
Electroblob77 7cf09e76f8 Update version number 2020-02-22 00:49:18 +00:00
Electroblob77 61080134fd Add wildcard support for item/block configs 2020-02-22 00:46:37 +00:00
Electroblob77 563bed3b25 Update credits 2020-02-22 00:46:16 +00:00
Electroblob77 75740c388f Add German and Spanish translations 2020-02-22 00:17:52 +00:00
Electroblob77 5d96f4d700 I can't string, and unboxing is weird 2020-02-21 17:55:45 +00:00
Electroblob77 df8fd21c0b Add metadata support to block/item list config options, fixes #353 2020-02-21 17:40:08 +00:00
chesterccj305 046ecb1e41 Create zh_tw.lang 2020-02-21 22:56:45 +08:00
chesterccj305 f3dd7bccd8 Create handbook_zh_tw.json 2020-02-21 22:55:22 +08:00
Electroblob77 d6b64b3576 Move !world.isRemote check to just the block breaking, potentially fixes #359 2020-02-19 21:32:54 +00:00
Electroblob77 22c00c47ff Antique Atlas doesn't like my colons :(
Fixes #323
2020-02-19 21:17:52 +00:00
Electroblob77 6d0e65c2b0 Hmmm so we were ticking this twice all along... 2020-02-19 01:09:12 +00:00
Electroblob77 0a6fd452c1 This is why we test things! 2020-02-19 01:00:32 +00:00
Electroblob77 28a8a4ff2a Merge branch '1.12.2' of https://github.com/Electroblob77/Wizardry into 1.12.2 2020-02-19 00:22:24 +00:00
Electroblob77 71c09cf16d Bye bye empty slot books, it was good knowing ya 2020-02-19 00:12:20 +00:00
Electroblob77 794085660e Move screen shaking effect into a proper method in the client proxy, fix earthquake's version not working and add screen shake to meteor, lightning hammer and shockwave 2020-02-19 00:11:33 +00:00
Electroblob 3d89186308 Merge pull request #352 from Hokorizero/1.12.2
Update Chinese item translation and handbook translation
2020-02-09 13:37:10 +00:00
Hokorizero a0bd7b64d7 Enchantment Descriptions translation done 2020-02-07 18:23:40 +08:00
Hokorizero 4c633c98ff Add files via upload 2020-02-05 19:06:34 +08:00
Hokorizero 45ff70c207 Add files via upload
Thanks by @TUsama,we finally finished the Chinese handbook translation.
2020-02-05 19:05:39 +08:00
57 changed files with 6461 additions and 916 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.2.8 [change as necessary]
Wizardry version: 4.2.10 [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.2.8 [change as necessary]
Wizardry version: 4.2.10 [change as necessary]
Question details: [explain your question here]
+6 -3
View File
@@ -1,7 +1,7 @@
# Credits
Electroblob's Wizardry
Version 4.2.8
Version 4.2.10
For Minecraft 1.12.2
Designed, coded and textured by Electroblob
@@ -27,12 +27,15 @@ In addition, I'd like to thank the following individuals for their contributions
#### Translations
- Spanish and Mexican Spanish: MadWrist
- Spanish: MadWrist, Alsentar
- Mexican Spanish: MadWrist
- Russian: VilagVil, kellixon, bigenergy
- French: Hahdrim
- Brazilian Portuguese: lorrampi
- Chinese: ZHENGLOC, dragon-evol
- Chinese: ZHENGLOC, dragon-evol, Hokorizero, TUsama
- Korean: shejery, rewi_wire
- Polish: Trozuu
- German: BirdyDragon
- Taiwanese: chesterccj305
Lightning ray sound effect from OhhWowProductions
+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.2.8 [change as necessary]
Wizardry version: 4.2.10 [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.]
+8 -36
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.2.8" // There, it matches semver, happy now?
version = "4.2.10" // There, it matches semver, happy now?
group= "electroblob.wizardry"// http://maven.apache.org/guides/mini/guide-naming-conventions.html
archivesBaseName = "ElectroblobsWizardry"
@@ -31,15 +31,10 @@ repositories {
name = "ModMaven"
url = "modmaven.k-4u.nl"
}
flatDir {
// evErYthINg hAS tO Be a mAVeN rEPoSiTOrY... (to use deobfProvided, for some reason)
// The lack of documentation is actually quite impressive, see the following threads:
// http://www.minecraftforge.net/forum/topic/44262-solved-how-to-build-mod-with-dependencies/
// https://www.minecraftforum.net/forums/mapping-and-modding-java-edition/mapping-and-modding-tutorials/2866817-setting-up-dependencies-in-minecraft-forge-with
// http://www.minecraftforge.net/forum/topic/44534-adding-dependencies-to-a-forge-project/
dirs "libsfordeobf" // Don't put src jars in libs or forge will think you have duplicate mods
maven {
name = "Curseforge Maven"
url = "https://minecraft.curseforge.com/api/maven/"
}
}
minecraft {
@@ -56,37 +51,14 @@ minecraft {
}
dependencies {
// you may put jars on which you depend on in ./libs
// or you may define them like so..
//compile "some.group:artifact:version:classifier"
//compile "some.group:artifact:version"
// compile against the JEI API but do not include it at runtime
// Compile against the JEI API but do not include it at runtime
deobfProvided "mezz.jei:jei_${mc_version}:${jei_version}:api"
// at runtime, use the full JEI jar
// At runtime, use the full JEI jar
runtime "mezz.jei:jei_${mc_version}:${jei_version}"
//deobfProvided "baubles:baubles-1.12:1.5.2:api" // #ihavenoideawhatimdoing #itjustworks
//runtime "baubles:baubles-1.12:1.5.2" // If in doubt, copy what already works
//deobfProvided "antiqueatlas:antiqueatlas-1.12.2:4.5.1:src"
//runtime "antiqueatlas:antiqueatlas-1.12.2:4.5.1"
// real examples
//compile 'com.mod-buildcraft:buildcraft:6.0.8:dev' // adds buildcraft to the dev env
//compile 'com.googlecode.efficient-java-matrix-library:ejml:0.24' // adds ejml to the dev env
// the 'provided' configuration is for optional dependencies that exist at compile-time but might not at runtime.
//provided 'com.mod-buildcraft:buildcraft:6.0.8:dev'
// the deobf configurations: 'deobfCompile' and 'deobfProvided' are the same as the normal compile and provided,
// except that these dependencies get remapped to your current MCP mappings
//deobfCompile 'com.mod-buildcraft:buildcraft:6.0.8:dev'
//deobfProvided 'com.mod-buildcraft:buildcraft:6.0.8:dev'
// for more info...
// http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html
// http://www.gradle.org/docs/current/userguide/dependency_management.html
deobfCompile "baubles:Baubles:${mc_version_short}:${baubles_version}"
deobfCompile "antique-atlas:antiqueatlas:${mc_version}:${antique_atlas_version}"
}
+4 -1
View File
@@ -2,4 +2,7 @@
# This is required to provide enough memory for the Minecraft decompilation process.
org.gradle.jvmargs=-Xmx3G
mc_version=1.12.2
jei_version=4.13.1.225
mc_version_short=1.12
jei_version=4.13.1.225
baubles_version=1.5.2
antique_atlas_version=4.6.3
@@ -240,6 +240,13 @@ public class CommonProxy {
/** Starts the first-person blink overlay effect for the specified player. */
public void playBlinkEffect(EntityPlayer player){}
/**
* Starts the client-side screen shake effect for the specified player.
* @param player The player whose screen is to be shaken
* @param intensity The amplitude of the shaking (around 10 looks about right)
*/
public void shakeScreen(EntityPlayer player, float intensity){}
/**
* Gets the client side world using Minecraft.getMinecraft().world. <b>Only to be called client side!</b> Returns
@@ -6,8 +6,10 @@ import electroblob.wizardry.spell.Spell;
import electroblob.wizardry.util.AllyDesignationSystem.FriendlyFire;
import electroblob.wizardry.util.MagicDamage;
import electroblob.wizardry.util.MagicDamage.DamageType;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.EntityList;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.text.translation.I18n;
import net.minecraftforge.common.config.ConfigCategory;
@@ -16,6 +18,8 @@ import net.minecraftforge.common.config.Property;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.oredict.OreDictionary;
import org.apache.commons.lang3.tuple.Pair;
import java.io.File;
import java.util.*;
@@ -90,7 +94,7 @@ public final class Settings {
/** <b>[Server-only]</b> List of dimension ids in which to generate wizard towers. */
public int[] towerDimensions = {0};
/** <b>[Server-only]</b> The rarity of wizard towers, used by the world generator. Larger numbers are rarer. */
public int towerRarity = 900;
public int towerRarity = 700;
/** <b>[Server-only]</b> List of structure file locations for wizard towers without loot chests. */
public ResourceLocation[] towerFiles = {new ResourceLocation(Wizardry.MODID, "wizard_tower_0"),
new ResourceLocation(Wizardry.MODID, "wizard_tower_1"),
@@ -104,7 +108,7 @@ public final class Settings {
/** <b>[Server-only]</b> List of dimension ids in which to generate obelisks. */
public int[] obeliskDimensions = {0, -1};
/** <b>[Server-only]</b> The rarity of obelisks, used by the world generator. Larger numbers are rarer. */
public int obeliskRarity = 800;
public int obeliskRarity = 600;
/** <b>[Server-only]</b> List of structure file locations for obelisks. */
public ResourceLocation[] obeliskFiles = {new ResourceLocation(Wizardry.MODID, "obelisk_0"),
new ResourceLocation(Wizardry.MODID, "obelisk_1"),
@@ -114,7 +118,7 @@ public final class Settings {
/** <b>[Server-only]</b> List of dimension ids in which to generate shrines. */
public int[] shrineDimensions = {0, -1};
/** <b>[Server-only]</b> The rarity of shrines, used by the world generator. Larger numbers are rarer. */
public int shrineRarity = 1500;
public int shrineRarity = 1100;
/** <b>[Server-only]</b> List of structure file locations for shrines. */
public ResourceLocation[] shrineFiles = {new ResourceLocation(Wizardry.MODID, "shrine_0"),
new ResourceLocation(Wizardry.MODID, "shrine_1"),
@@ -125,7 +129,7 @@ public final class Settings {
new ResourceLocation(Wizardry.MODID, "shrine_6"),
new ResourceLocation(Wizardry.MODID, "shrine_7")};
/** <b>[Server-only]</b> List of solid blocks (usually trees) which are ignored by the structure generators. */
public ResourceLocation[] treeBlocks = toResourceLocations(DEFAULT_TREE_BLOCKS);
public Pair<ResourceLocation, Short>[] treeBlocks = parseItemMetaStrings(DEFAULT_TREE_BLOCKS);
/** <b>[Server-only]</b> The chance for wizard towers to generate with an evil wizard and chest inside. */
public double evilWizardChance = 0.2;
/** <b>[Server-only]</b> List of dimension ids in which to generate crystal ore. */
@@ -164,8 +168,6 @@ public final class Settings {
public boolean playerBlockDamage = true;
/** <b>[Server-only]</b> Whether to revert to the old wand upgrade system, which only requires tomes of arcana. */
public boolean legacyWandLevelling = false;
/** <b>[Server-only]</b> Whether to replace Minecraft's own fireballs with wizardry fireballs. */
public boolean replaceVanillaFireballs = true;
/** <b>[Server-only]</b> Whether to replace Minecraft's distance-based fall damage calculation with an equivalent,
* velocity-based one. */
public boolean replaceVanillaFallDamage = true;
@@ -190,15 +192,15 @@ public final class Settings {
* <b>[Server-only]</b> List of registry names of items which cannot be smelted by the pocket furnace spell, in
* addition to armour, tools and weapons.
*/
public ResourceLocation[] pocketFurnaceItemBlacklist = toResourceLocations("cobblestone", "netherrack");
public Pair<ResourceLocation, Short>[] pocketFurnaceItemBlacklist = parseItemMetaStrings("cobblestone", "netherrack");
/** <b>[Server-only]</b> List of registry names of blocks which can be detected by the divination spell. */
public ResourceLocation[] divinationOreWhitelist = {};
public Pair<ResourceLocation, Short>[] divinationOreWhitelist = parseItemMetaStrings(); // That works I guess
/** <b>[Server-only]</b> List of registry names of items which count as swords for imbuement spells. */
public ResourceLocation[] swordItemWhitelist = {};
public Pair<ResourceLocation, Short>[] swordItemWhitelist = parseItemMetaStrings();
/** <b>[Server-only]</b> List of registry names of items which count as bows for imbuement spells. */
public ResourceLocation[] bowItemWhitelist = {};
public Pair<ResourceLocation, Short>[] bowItemWhitelist = parseItemMetaStrings();
/** <b>[Server-only]</b> Map of items to values which wizard trades may use as currency. */
public Map<ResourceLocation, Integer> currencyItems = new HashMap<>();
public Map<Pair<ResourceLocation, Short>, Integer> currencyItems = new HashMap<>();
/** <b>[Server-only]</b> Global damage scaling factor for all player magic damage. */
public double playerDamageScale = 1.0;
/** <b>[Server-only]</b> Global damage scaling factor for all npc magic damage. */
@@ -268,7 +270,9 @@ public final class Settings {
* effect.
*/
public boolean slowTimeAffectsPlayers = true;
/** <b>[Synchronised]</b> Chance of 'misreading' an undiscovered spell and triggering a forfeit instead. */
/** <b>[Synchronised]</b> Whether to replace Minecraft's own fireballs with wizardry fireballs. */
public boolean replaceVanillaFireballs = true;
/** <b>[Synchronised]</b> Chance of 'misreading' an undiscovered spell and triggering a forfeit instead. */
public double forfeitChance = 0.2;
// Client-only settings. These settings only affect client-side code and hence are not synced. Each client obeys
@@ -652,41 +656,42 @@ public final class Settings {
"List of registry names of blocks or items which cannot be smelted by the pocket furnace spell, in addition to armour, tools and weapons. Block/item names are not case sensitive. For mod items, prefix with the mod ID (e.g. " + Wizardry.MODID + ":crystal_ore).");
property.setLanguageKey("config." + Wizardry.MODID + ".pocket_furnace_item_blacklist");
property.setRequiresWorldRestart(true);
pocketFurnaceItemBlacklist = getResourceLocationList(property);
pocketFurnaceItemBlacklist = parseItemMetaStrings(property.getStringList());
propOrder.add(property.getName());
property = config.get(GAMEPLAY_CATEGORY, "divinationOreWhitelist", new String[0], "List of registry names of ore blocks which can be detected by the divination spell. Block names are not case sensitive. For mod blocks, prefix with the mod ID (e.g. " + Wizardry.MODID + ":crystal_ore).");
property.setLanguageKey("config." + Wizardry.MODID + ".divination_ore_whitelist");
property.setRequiresWorldRestart(true);
divinationOreWhitelist = getResourceLocationList(property);
divinationOreWhitelist = parseItemMetaStrings(property.getStringList());
propOrder.add(property.getName());
property = config.get(GAMEPLAY_CATEGORY, "swordItemWhitelist", new String[0], "List of registry names of items which should count as swords for imbuement spells. Most swords should work automatically, but those that don't can be added manually here. Item names are not case sensitive. For mod items, prefix with the mod ID (e.g. tconstruct:broadsword).");
property.setLanguageKey("config." + Wizardry.MODID + ".sword_item_whitelist");
property.setRequiresWorldRestart(true);
swordItemWhitelist = getResourceLocationList(property);
swordItemWhitelist = parseItemMetaStrings(property.getStringList());
propOrder.add(property.getName());
property = config.get(GAMEPLAY_CATEGORY, "bowItemWhitelist", new String[0], "List of registry names of items which should count as bows for imbuement spells. Most bows should work automatically, but those that don't can be added manually here. Item names are not case sensitive. For mod items, prefix with the mod ID (e.g. tconstruct:shortbow).");
property.setLanguageKey("config." + Wizardry.MODID + ".bow_item_whitelist");
property.setRequiresWorldRestart(true);
bowItemWhitelist = getResourceLocationList(property);
bowItemWhitelist = parseItemMetaStrings(property.getStringList());
propOrder.add(property.getName());
property = config.get(GAMEPLAY_CATEGORY, "currencyItems", new String[]{"gold_ingot 3", "emerald 6"}, "List of registry names of items which wizard trades can use as currency (in the first slot; the second slot is unaffected). Each entry in this list should consist of an item registry name, followed by a single space, then an integer which defines the 'value' of the item. Higher values mean fewer of that currency item are required for a given trade.",
Pattern.compile("[A-Za-z:_]+ [0-9]+"));
Pattern.compile("[A-Za-z0-9:_]+ [0-9]+"));
property.setLanguageKey("config." + Wizardry.MODID + ".currency_items");
property.setRequiresWorldRestart(true);
propOrder.add(property.getName());
currencyItems = new HashMap<>();
for(String string : property.getStringList()){
string = string.toLowerCase(Locale.ROOT).trim();
String[] args = string.split(" ");
if(args.length != 2){
Wizardry.logger.warn("Invalid entry in currency items: {}", string);
continue; // Ignore invalid entries, the pattern above should ensure this never happens
}
try {
currencyItems.put(new ResourceLocation(args[0]), Integer.parseInt(args[1]));
currencyItems.put(parseItemMetaString(args[0]), Integer.parseInt(args[1]));
}catch(NumberFormatException e){
Wizardry.logger.warn("Invalid integer in currency items: {}", args[1]);
}
@@ -791,7 +796,7 @@ public final class Settings {
property = config.get(GAMEPLAY_CATEGORY, "treeBlocks", DEFAULT_TREE_BLOCKS, "List of registry names of blocks which can be overwritten by wizardry's structure generators, affecting both fast and fancy structure generation. Most tree blocks and other foliage should work automatically, but those that don't can be added manually here. Block names are not case sensitive. For mod blocks, prefix with the mod ID (e.g. dynamictrees:oakbranch).");
property.setLanguageKey("config." + Wizardry.MODID + ".tree_blocks");
property.setRequiresWorldRestart(true);
treeBlocks = getResourceLocationList(property);
treeBlocks = parseItemMetaStrings(property.getStringList());
propOrder.add(property.getName());
property = config.get(WORLDGEN_CATEGORY, "oreDimensions", new int[]{0}, "List of dimension ids in which crystal ore will generate. Note that removing the overworld (id 0) from this list will make the mod VERY difficult to play!");
@@ -1082,4 +1087,45 @@ public final class Settings {
public static ResourceLocation[] toResourceLocations(String... strings){
return Arrays.stream(strings).map(s -> new ResourceLocation(s.toLowerCase(Locale.ROOT).trim())).toArray(ResourceLocation[]::new);
}
/** Applies {@link Settings#parseItemMetaString(String)} to each input string and returns and array of the resulting
* {@link Pair}s. */
@SuppressWarnings("unchecked") // Shut up java
public static Pair<ResourceLocation, Short>[] parseItemMetaStrings(String... strings){
return Arrays.stream(strings).map(Settings::parseItemMetaString).toArray(Pair[]::new);
}
/** Parses the given input string as an item of the form {@code id:metadata} and returns the resulting
* {@link ResourceLocation} ID and metadata value as a {@link Pair} object. */
public static Pair<ResourceLocation, Short> parseItemMetaString(String string){
string = string.toLowerCase(Locale.ROOT).trim();
String[] itemArgs = string.split(":");
String item;
short meta;
try {
meta = Short.parseShort(itemArgs[itemArgs.length-1]);
item = String.join(":", Arrays.copyOfRange(itemArgs, 0, itemArgs.length-1));
}catch(NumberFormatException e){ // If no metadata is specified
meta = OreDictionary.WILDCARD_VALUE;
item = string;
}
return Pair.of(new ResourceLocation(item), meta);
}
public static boolean containsMetaBlock(Pair<ResourceLocation, Short>[] array, IBlockState block){
return containsMetaThing(array, block.getBlock().getRegistryName(), (short)block.getBlock().getMetaFromState(block));
}
public static boolean containsMetaItem(Pair<ResourceLocation, Short>[] array, ItemStack stack){
return containsMetaThing(array, stack.getItem().getRegistryName(), (short)stack.getMetadata());
}
public static boolean containsMetaThing(Pair<ResourceLocation, Short>[] array, ResourceLocation id, short metadata){
return Arrays.asList(array).contains(Pair.of(id, metadata)) || Arrays.asList(array).contains(Pair.of(id, OreDictionary.WILDCARD_VALUE));
}
}
@@ -46,7 +46,7 @@ import java.util.Calendar;
*/
@Mod(modid = Wizardry.MODID, name = Wizardry.NAME, version = Wizardry.VERSION, acceptedMinecraftVersions = "[1.12.2]",
guiFactory = "electroblob.wizardry.WizardryGuiFactory", dependencies = "required-after:forge@[14.23.5.2814,)")
guiFactory = "electroblob.wizardry.WizardryGuiFactory", dependencies = "required-after:forge@[14.23.5.2814,);after:antiqueatlas@[4.6,)")
public class Wizardry {
@@ -64,7 +64,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.2.8";
public static final String VERSION = "4.2.10";
// IDEA: Triggering of inbuilt Forge events in relevant places?
// IDEA: Abstract the vanilla particles behind the particle builder
@@ -290,7 +290,7 @@ public final class WizardryEventHandler {
EntityLivingBase attacker = (EntityLivingBase)event.getSource().getTrueSource();
// Players can only ever attack with their main hand, so this is the right method to use here.
if(!attacker.getHeldItemMainhand().isEmpty() && ImbueWeapon.isSword(attacker.getHeldItemMainhand().getItem())){
if(!attacker.getHeldItemMainhand().isEmpty() && ImbueWeapon.isSword(attacker.getHeldItemMainhand())){
int level = EnchantmentHelper.getEnchantmentLevel(WizardryEnchantments.flaming_weapon,
attacker.getHeldItemMainhand());
@@ -420,7 +420,7 @@ public final class WizardryEventHandler {
@SubscribeEvent // Priority doesn't matter here, we're only setting event fields so if it's cancelled it won't matter
public static void onLivingFallEvent(LivingFallEvent event){
// Why is fall damage based on distance fallen? Why? Who on earth came up with that? It makes no sense whatsoever!
if(Wizardry.settings.replaceVanillaFallDamage && !Loader.isModLoaded("speedbasedfalldamage")){
if(!event.getEntity().world.isRemote && Wizardry.settings.replaceVanillaFallDamage && !Loader.isModLoaded("speedbasedfalldamage")){
// We want to keep the fall damage EXACTLY THE SAME for free, uninterrupted falls, but fix the weirdness
// caused when something else changes the entity's velocity
// All living entities have a gravity of 0.08b/t^2
@@ -18,6 +18,7 @@ import net.minecraft.item.Item;
import net.minecraft.potion.PotionEffect;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.BlockRenderLayer;
import net.minecraft.util.DamageSource;
import net.minecraft.util.EnumBlockRenderType;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.AxisAlignedBB;
@@ -54,21 +55,24 @@ public class BlockSnare extends Block implements ITileEntityProvider {
@Override
public void onEntityCollision(World world, BlockPos pos, IBlockState state, Entity entity){
if(!world.isRemote && entity instanceof EntityLivingBase){
if(entity instanceof EntityLivingBase){
if(world.getTileEntity(pos) instanceof TileEntityPlayerSave){
TileEntityPlayerSave tileentity = (TileEntityPlayerSave)world.getTileEntity(pos);
if(AllyDesignationSystem.isValidTarget(tileentity.getCaster(), entity)){
entity.attackEntityFrom(MagicDamage.causeDirectMagicDamage(tileentity.getCaster(), DamageType.MAGIC),
Spells.snare.getProperty(Spell.DAMAGE).floatValue());
DamageSource source = tileentity.getCaster() == null ? DamageSource.CACTUS
: MagicDamage.causeDirectMagicDamage(tileentity.getCaster(), DamageType.MAGIC);
entity.attackEntityFrom(source, Spells.snare.getProperty(Spell.DAMAGE).floatValue());
((EntityLivingBase)entity).addPotionEffect(new PotionEffect(MobEffects.SLOWNESS,
Spells.snare.getProperty(Spell.EFFECT_DURATION).intValue(),
Spells.snare.getProperty(Spell.EFFECT_STRENGTH).intValue()));
world.destroyBlock(pos, false);
if(!world.isRemote) world.destroyBlock(pos, false);
}
}
}
@@ -137,9 +137,11 @@ public class BlockThorns extends BlockBush implements ITileEntityProvider {
TileEntity tileentity = world.getTileEntity(pos);
if(tileentity instanceof TileEntityPlayerSaveTimed){
if(AllyDesignationSystem.isValidTarget(((TileEntityPlayerSaveTimed)tileentity).getCaster(), target)){
source = MagicDamage.causeDirectMagicDamage(((TileEntityPlayerSaveTimed)tileentity).getCaster(),
MagicDamage.DamageType.MAGIC);
EntityLivingBase caster = ((TileEntityPlayerSaveTimed)tileentity).getCaster();
if(caster != null && AllyDesignationSystem.isValidTarget(caster, target)){
source = MagicDamage.causeDirectMagicDamage(caster, MagicDamage.DamageType.MAGIC);
}else{
return false; // Don't attack or slow allies of the caster
}
@@ -29,7 +29,6 @@ import electroblob.wizardry.item.ItemScroll;
import electroblob.wizardry.item.ItemSpellBook;
import electroblob.wizardry.item.ItemWand;
import electroblob.wizardry.packet.*;
import electroblob.wizardry.potion.PotionSlowTime;
import electroblob.wizardry.registry.Spells;
import electroblob.wizardry.registry.WizardrySounds;
import electroblob.wizardry.spell.*;
@@ -195,6 +194,11 @@ public class ClientProxy extends CommonProxy {
if(Minecraft.getMinecraft().player == player) WizardryClientEventHandler.playBlinkEffect();
}
@Override
public void shakeScreen(EntityPlayer player, float intensity){
if(Minecraft.getMinecraft().player == player) WizardryClientEventHandler.shakeScreen(intensity);
}
@Override
public Set<String> getSpellHUDSkins(){
return GuiSpellDisplay.getSkinKeys();
@@ -68,19 +68,35 @@ public final class WizardryClientEventHandler {
private static int blinkEffectTimer;
/** The number of ticks the blink effect lasts for. */
private static final int BLINK_EFFECT_DURATION = 8;
/** The remaining time for which the screen shake effect will be active. */
private static int screenShakeCounter = 0;
private static final float SHAKINESS = 0.5f;
/** Starts the first person blink overlay effect. */
/** Starts the first-person blink overlay effect. */
public static void playBlinkEffect(){
blinkEffectTimer = BLINK_EFFECT_DURATION;
}
/** Starts the client-side screen shake effect. */
public static void shakeScreen(float intensity){
screenShakeCounter = (int)(intensity / SHAKINESS);
Minecraft.getMinecraft().player.rotationPitch -= intensity * 0.5f; // Start halfway down
}
@SubscribeEvent
public static void onPlayerTickEvent(TickEvent.PlayerTickEvent event){
if(event.player == Minecraft.getMinecraft().player){
if(event.player == Minecraft.getMinecraft().player && event.phase == TickEvent.Phase.END){
if(blinkEffectTimer > 0) blinkEffectTimer--;
if(screenShakeCounter > 0){
float magnitude = screenShakeCounter * SHAKINESS;
Minecraft.getMinecraft().player.rotationPitch += screenShakeCounter % 2 == 0 ? magnitude : -magnitude;
screenShakeCounter--;
}
// Only seems to work here...
// EntityLiving victim = Possession.getPossessee(Minecraft.getMinecraft().player);
// if(victim != null && victim.getHeldItemMainhand().isEmpty()){
@@ -13,6 +13,7 @@ import net.minecraft.client.Minecraft;
import net.minecraft.client.audio.PositionedSoundRecord;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import org.lwjgl.input.Keyboard;
@@ -32,9 +33,7 @@ public class GuiSpellBook extends GuiScreen {
this.spell = Spell.byMetadata(stack.getItemDamage());
}
/**
* Draws the screen and all the components in it.
*/
@Override
public void drawScreen(int par1, int par2, float par3){
int xPos = this.width / 2 - xSize / 2;
@@ -69,22 +68,18 @@ public class GuiSpellBook extends GuiScreen {
0x777777);
}
//this.fontRenderer.drawString("-------------------", xPos + 17, yPos + 35, 0);
// Novice is usually white but this doesn't show up
String tier = I18n.format("gui.ebwizardry:spell_book.tier", spell.getTier() == Tier.NOVICE ?
"\u00A77" + spell.getTier().getDisplayName() : spell.getTier().getDisplayNameWithFormatting());
this.fontRenderer.drawString(tier, xPos + 17, yPos + 45, 0);
if(spell.getTier() == Tier.NOVICE){
// Novice is usually white but this doesn't show up.
this.fontRenderer.drawString("Tier: \u00A77" + Tier.NOVICE.getDisplayName(), xPos + 17, yPos + 45, 0);
}else{
this.fontRenderer.drawString("Tier: " + spell.getTier().getDisplayNameWithFormatting(), xPos + 17, yPos + 45, 0);
}
String element = "Element: " + spell.getElement().getFormattingCode() + spell.getElement().getDisplayName();
if(!discovered) element = "Element: ?";
String element = I18n.format("gui.ebwizardry:spell_book.element", spell.getElement().getFormattingCode() + spell.getElement().getDisplayName());
if(!discovered) element = I18n.format("gui.ebwizardry:spell_book.element_undiscovered");
this.fontRenderer.drawString(element, xPos + 17, yPos + 57, 0);
String manaCost = "Mana Cost: " + spell.getCost();
if(spell.isContinuous) manaCost = "Mana Cost: " + spell.getCost() + "/second";
if(!discovered) manaCost = "Mana Cost: ?";
String manaCost = I18n.format("gui.ebwizardry:spell_book.mana_cost", spell.getCost());
if(spell.isContinuous) manaCost = I18n.format("gui.ebwizardry:spell_book.mana_cost_continuous", spell.getCost());
if(!discovered) manaCost = I18n.format("gui.ebwizardry:spell_book.mana_cost_undiscovered");
this.fontRenderer.drawString(manaCost, xPos + 17, yPos + 69, 0);
if(discovered){
@@ -95,6 +90,7 @@ public class GuiSpellBook extends GuiScreen {
}
}
@Override
public void initGui(){
super.initGui();
Keyboard.enableRepeatEvents(true);
@@ -103,6 +99,7 @@ public class GuiSpellBook extends GuiScreen {
this.mc.getSoundHandler().playSound(PositionedSoundRecord.getMasterRecord(WizardrySounds.MISC_BOOK_OPEN, 1));
}
@Override
public void onGuiClosed(){
super.onGuiClosed();
Keyboard.enableRepeatEvents(false);
@@ -68,7 +68,7 @@ public class EnchantmentMagicProtection extends Enchantment {
public enum Type {
MAGIC("magic", 1, 5, 8, s -> s instanceof IElementalDamage),
MAGIC("magic", 1, 5, 8, s -> s instanceof IElementalDamage || s.isMagicDamage()),
FROST("frost", 2, 10, 8, s -> s instanceof IElementalDamage && ((IElementalDamage)s).getType() == MagicDamage.DamageType.FROST),
SHOCK("shock", 2, 10, 8, s -> s instanceof IElementalDamage && ((IElementalDamage)s).getType() == MagicDamage.DamageType.SHOCK);
// Fire already exists, and the other types aren't used enough to be worth having
@@ -120,9 +120,9 @@ public interface Imbuement {
ItemStack bow = archer.getHeldItemMainhand();
if(!ImbueWeapon.isBow(bow.getItem())){
if(!ImbueWeapon.isBow(bow)){
bow = archer.getHeldItemOffhand();
if(!ImbueWeapon.isBow(bow.getItem())) return;
if(!ImbueWeapon.isBow(bow)) return;
}
// Taken directly from ItemBow, so it works exactly the same as the power enchantment.
@@ -5,9 +5,11 @@ import electroblob.wizardry.registry.Spells;
import electroblob.wizardry.registry.WizardryBlocks;
import electroblob.wizardry.registry.WizardrySounds;
import electroblob.wizardry.spell.Meteor;
import electroblob.wizardry.util.WizardryUtilities;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.MoverType;
import net.minecraft.entity.item.EntityFallingBlock;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.SoundCategory;
import net.minecraft.world.World;
@@ -61,9 +63,9 @@ public class EntityMeteor extends EntityFallingBlock {
this.motionY *= 0.9800000190734863D;
this.motionZ *= 0.9800000190734863D;
if(!this.world.isRemote){
if(this.onGround){
if(this.onGround){
if(!this.world.isRemote){
this.motionX *= 0.699999988079071D;
this.motionZ *= 0.699999988079071D;
@@ -72,8 +74,13 @@ public class EntityMeteor extends EntityFallingBlock {
Spells.meteor.getProperty(Meteor.BLAST_STRENGTH).floatValue() * blastMultiplier,
damageBlocks, damageBlocks);
this.setDead();
}else{
WizardryUtilities.getEntitiesWithinRadius(15, posX, posY, posZ, world, EntityPlayer.class)
.forEach(p -> Wizardry.proxy.shakeScreen(p, 10));
}
}
}
@Override
@@ -7,7 +7,6 @@ import electroblob.wizardry.util.MagicDamage.DamageType;
import electroblob.wizardry.util.WizardryUtilities;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityFallingBlock;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.init.MobEffects;
import net.minecraft.network.play.server.SPacketEntityVelocity;
@@ -97,18 +96,6 @@ public class EntityEarthquake extends EntityMagicConstruct {
}
}
}
if(!world.isRemote){
// Constant 15 blocks for now
List<EntityPlayer> targets2 = WizardryUtilities.getEntitiesWithinRadius(15, posX, posY, posZ, world, EntityPlayer.class);
float magnitude = 10f * ((float)(this.lifetime - this.ticksExisted))/(float)this.lifetime;
// Makes the screen shake
for(EntityPlayer target : targets2){
target.rotationPitch += this.ticksExisted % 2 == 0 ? magnitude : -magnitude;
}
}
}
}
@@ -169,6 +169,7 @@ public class EntityHammer extends EntityMagicConstruct {
public void fall(float distance, float damageMultiplier){
if(world.isRemote){
for(int i = 0; i < 40; i++){
double particleX = this.posX - 1.0d + 2 * rand.nextDouble();
double particleZ = this.posZ - 1.0d + 2 * rand.nextDouble();
@@ -180,6 +181,12 @@ public class EntityHammer extends EntityMagicConstruct {
particleX - this.posX, 0, particleZ - this.posZ, Block.getStateId(block));
}
}
if(this.fallDistance > 10){
WizardryUtilities.getEntitiesWithinRadius(10, posX, posY, posZ, world, EntityPlayer.class)
.forEach(p -> Wizardry.proxy.shakeScreen(p, 6));
}
}else{
// Just to check the hammer has actually fallen from the sky, rather than the block under it being broken.
if(this.fallDistance > 10){
@@ -10,6 +10,7 @@ import electroblob.wizardry.util.WizardryUtilities;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.MoverType;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.DamageSource;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.Vec3d;
@@ -61,10 +62,9 @@ public class EntityIceSpike extends EntityMagicConstruct {
if(!this.world.isRemote){
for(Object entity : this.world.getEntitiesWithinAABBExcludingEntity(this, this.getEntityBoundingBox())){
if(entity instanceof EntityLivingBase && this.isValidTarget((EntityLivingBase)entity)){
DamageSource source = this.getCaster() == null ? DamageSource.MAGIC : MagicDamage.causeDirectMagicDamage(this.getCaster(), DamageType.FROST);
// Potion effect only gets added if the damage succeeded.
if(((EntityLivingBase)entity).attackEntityFrom(
MagicDamage.causeDirectMagicDamage(this.getCaster(), DamageType.FROST),
Spells.ice_spikes.getProperty(Spell.DAMAGE).floatValue() * this.damageMultiplier))
if(((EntityLivingBase)entity).attackEntityFrom(source, Spells.ice_spikes.getProperty(Spell.DAMAGE).floatValue() * this.damageMultiplier))
((EntityLivingBase)entity).addPotionEffect(new PotionEffect(WizardryPotions.frost,
Spells.ice_spikes.getProperty(Spell.EFFECT_DURATION).intValue(),
Spells.ice_spikes.getProperty(Spell.EFFECT_STRENGTH).intValue()));
@@ -50,6 +50,7 @@ import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.oredict.OreDictionary;
import org.apache.commons.lang3.tuple.Pair;
import javax.annotation.Nullable;
import java.util.*;
@@ -502,7 +503,6 @@ public class EntityWizard extends EntityCreature implements INpc, IMerchant, ISp
ItemStack anySpellBook = new ItemStack(WizardryItems.spell_book, 1, OreDictionary.WILDCARD_VALUE);
ItemStack crystalStack = new ItemStack(WizardryItems.magic_crystal, 5);
// NOTE: For wizardry 1.2, increase the number of uses of this trade. The default is 7, for reference.
this.trades.add(new MerchantRecipe(anySpellBook, crystalStack));
this.addRandomRecipes(3);
@@ -587,12 +587,14 @@ public class EntityWizard extends EntityCreature implements INpc, IMerchant, ISp
// TODO: Switch all of this over to some kind of loot pool system?
@SuppressWarnings("unchecked")
private ItemStack getRandomPrice(Tier tier){
Map<ResourceLocation, Integer> map = Wizardry.settings.currencyItems;
Map<Pair<ResourceLocation, Short>, Integer> map = Wizardry.settings.currencyItems;
// This isn't that efficient but it's not called very often really so it doesn't matter
ResourceLocation itemName = map.keySet().toArray(new ResourceLocation[0])[rand.nextInt(map.size())];
Item item = Item.REGISTRY.getObject(itemName);
Pair<ResourceLocation, Short> itemName = map.keySet().toArray(new Pair[0])[rand.nextInt(map.size())];
Item item = Item.REGISTRY.getObject(itemName.getLeft());
short meta = itemName.getRight();
int value;
if(item == null){
@@ -606,7 +608,7 @@ public class EntityWizard extends EntityCreature implements INpc, IMerchant, ISp
// ((tier.ordinal() + 1) * 16 + rand.nextInt(6)) gives a 'value' for the item being bought
// This is then divided by the value of the currency item to give a price
// The absolute maximum stack size that can result from this calculation (with value = 1) is 64.
return new ItemStack(item, (8 + tier.ordinal() * 16 + rand.nextInt(9)) / value);
return new ItemStack(item, (8 + tier.ordinal() * 16 + rand.nextInt(9)) / value, meta);
}
private ItemStack getRandomItemOfTier(Tier tier){
@@ -9,7 +9,6 @@ import electroblob.wizardry.util.MagicDamage.DamageType;
import electroblob.wizardry.util.ParticleBuilder;
import electroblob.wizardry.util.WizardryUtilities;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.init.Blocks;
import net.minecraft.potion.PotionEffect;
@@ -48,13 +47,7 @@ public class EntityIceball extends EntityMagicProjectile {
}else{
boolean flag = true;
if(this.getThrower() != null && this.getThrower() instanceof EntityLiving){
flag = net.minecraftforge.event.ForgeEventFactory.getMobGriefingEvent(this.world, this.getThrower());
}
if(flag){
if(this.getThrower() == null || WizardryUtilities.canDamageBlocks(this.getThrower(), world)){
BlockPos pos = rayTrace.getBlockPos();
@@ -3,6 +3,7 @@ package electroblob.wizardry.entity.projectile;
import electroblob.wizardry.Wizardry;
import electroblob.wizardry.registry.Spells;
import electroblob.wizardry.spell.Spell;
import electroblob.wizardry.util.WizardryUtilities;
import io.netty.buffer.ByteBuf;
import net.minecraft.entity.projectile.EntityLargeFireball;
import net.minecraft.nbt.NBTTagCompound;
@@ -50,7 +51,7 @@ public class EntityLargeMagicFireball extends EntityMagicFireball {
protected void onImpact(RayTraceResult rayTrace){
if(!world.isRemote){
boolean flag = net.minecraftforge.event.ForgeEventFactory.getMobGriefingEvent(this.world, this.thrower);
boolean flag = this.getThrower() == null || WizardryUtilities.canDamageBlocks(this.getThrower(), world);
this.world.newExplosion(null, this.posX, this.posY, this.posZ, getExplosionPower() * blastMultiplier, flag, flag);
}
@@ -6,9 +6,9 @@ import electroblob.wizardry.spell.Spell;
import electroblob.wizardry.util.MagicDamage;
import electroblob.wizardry.util.MagicDamage.DamageType;
import electroblob.wizardry.util.ParticleBuilder;
import electroblob.wizardry.util.WizardryUtilities;
import io.netty.buffer.ByteBuf;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.projectile.EntitySmallFireball;
import net.minecraft.init.Blocks;
@@ -84,13 +84,7 @@ public class EntityMagicFireball extends EntityMagicProjectile {
}else{
boolean flag = true;
if(this.getThrower() != null && this.getThrower() instanceof EntityLiving){
flag = net.minecraftforge.event.ForgeEventFactory.getMobGriefingEvent(this.world, this.getThrower());
}
if(flag){
if(this.getThrower() == null || WizardryUtilities.canDamageBlocks(this.getThrower(), world)){
BlockPos blockpos = rayTrace.getBlockPos().offset(rayTrace.sideHit);
@@ -1,11 +1,17 @@
package electroblob.wizardry.integration.antiqueatlas;
import electroblob.wizardry.Wizardry;
import hunternif.mc.atlas.AntiqueAtlasMod;
import hunternif.mc.atlas.api.AtlasAPI;
import hunternif.mc.atlas.marker.GlobalMarkersData;
import hunternif.mc.atlas.marker.Marker;
import hunternif.mc.atlas.registry.MarkerType;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.event.world.WorldEvent;
import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
/**
* This class handles all of wizardry's integration with the <i>Antique Atlas</i> mod. This class contains only the code
@@ -15,6 +21,7 @@ import net.minecraftforge.fml.common.Loader;
* @since Wizardry 4.2
* @author Electroblob
*/
@Mod.EventBusSubscriber
public class WizardryAntiqueAtlasIntegration {
public static final String ANTIQUE_ATLAS_MOD_ID = "antiqueatlas";
@@ -38,7 +45,7 @@ public class WizardryAntiqueAtlasIntegration {
* {@link electroblob.wizardry.Settings#autoTowerMarkers} is enabled. Server side only! */
public static void markTower(World world, int x, int z){
if(enabled() && Wizardry.settings.autoTowerMarkers){
AtlasAPI.getMarkerAPI().putGlobalMarker(world, false, TOWER_MARKER.toString(), "integration.antiqueatlas.marker." + TOWER_MARKER.toString(), x, z);
AtlasAPI.getMarkerAPI().putGlobalMarker(world, false, TOWER_MARKER.toString(), "integration.antiqueatlas.marker." + TOWER_MARKER.toString().replace(':', '.'), x, z);
}
}
@@ -46,7 +53,7 @@ public class WizardryAntiqueAtlasIntegration {
* {@link electroblob.wizardry.Settings#autoObeliskMarkers} is enabled. Server side only! */
public static void markObelisk(World world, int x, int z){
if(enabled() && Wizardry.settings.autoObeliskMarkers){
AtlasAPI.getMarkerAPI().putGlobalMarker(world, false, OBELISK_MARKER.toString(), "integration.antiqueatlas.marker." + OBELISK_MARKER.toString(), x, z);
AtlasAPI.getMarkerAPI().putGlobalMarker(world, false, OBELISK_MARKER.toString(), "integration.antiqueatlas.marker." + OBELISK_MARKER.toString().replace(':', '.'), x, z);
}
}
@@ -54,7 +61,7 @@ public class WizardryAntiqueAtlasIntegration {
* {@link electroblob.wizardry.Settings#autoShrineMarkers} is enabled. Server side only! */
public static void markShrine(World world, int x, int z){
if(enabled() && Wizardry.settings.autoShrineMarkers){
AtlasAPI.getMarkerAPI().putGlobalMarker(world, false, SHRINE_MARKER.toString(), "integration.antiqueatlas.marker." + SHRINE_MARKER.toString(), x, z);
AtlasAPI.getMarkerAPI().putGlobalMarker(world, false, SHRINE_MARKER.toString(), "integration.antiqueatlas.marker." + SHRINE_MARKER.toString().replace(':', '.'), x, z);
}
}
@@ -68,4 +75,21 @@ public class WizardryAntiqueAtlasIntegration {
AtlasAPI.getMarkerAPI().registerMarker(new MarkerType(OBELISK_MARKER, new ResourceLocation(Wizardry.MODID, "textures/integration/antiqueatlas/obelisk.png")));
}
@SubscribeEvent
public static void onWorldLoadEvent(WorldEvent.Load event){
if(!enabled()) return;
// Backwards compatibility for existing markers using the old translation key format (with colons)
GlobalMarkersData data = AntiqueAtlasMod.globalMarkersData.getData();
for(Marker marker : data.getMarkersInDimension(event.getWorld().provider.getDimension())){
if(marker.getLabel().contains(":")){
// Remove old-format markers and replace them with new ones
data.removeMarker(marker.getId());
AtlasAPI.getMarkerAPI().putGlobalMarker(event.getWorld(), marker.isVisibleAhead(), marker.getType(),
marker.getLabel().replace(':', '.'), marker.getX(), marker.getZ());
}
}
}
}
@@ -375,7 +375,7 @@ public class ItemArtefact extends Item {
if(artefact == WizardryItems.ring_battlemage){
if(player.getHeldItemOffhand().getItem() instanceof ISpellCastingItem
&& ImbueWeapon.isSword(player.getHeldItemMainhand().getItem())){
&& ImbueWeapon.isSword(player.getHeldItemMainhand())){
modifiers.set(SpellModifiers.POTENCY, 1.1f * potency, false);
}
@@ -7,6 +7,7 @@ import electroblob.wizardry.constants.Tier;
import electroblob.wizardry.data.WizardData;
import electroblob.wizardry.item.ItemScroll;
import electroblob.wizardry.item.ItemSpellBook;
import electroblob.wizardry.registry.Spells;
import electroblob.wizardry.spell.Spell;
import electroblob.wizardry.util.SpellProperties;
import net.minecraft.entity.player.EntityPlayer;
@@ -16,9 +17,9 @@ import net.minecraft.util.ResourceLocation;
import net.minecraft.world.storage.loot.LootContext;
import net.minecraft.world.storage.loot.conditions.LootCondition;
import net.minecraft.world.storage.loot.functions.LootFunction;
import org.apache.commons.lang3.ArrayUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
@@ -76,89 +77,94 @@ public class RandomSpell extends LootFunction {
if(!(stack.getItem() instanceof ItemSpellBook) && !(stack.getItem() instanceof ItemScroll)) Wizardry.logger
.warn("Applying the random_spell loot function to an item that isn't a spell book or scroll.");
Tier tier;
Element element;
if(ignoreWeighting){
if(tiers == null || tiers.isEmpty()){
tier = Tier.values()[random.nextInt(Tier.values().length)];
}else{
tier = tiers.get(random.nextInt(tiers.size()));
}
}else{
if(tiers == null || tiers.isEmpty()){
tier = Tier.getWeightedRandomTier(random);
}else{
tier = Tier.getWeightedRandomTier(random, tiers.toArray(new Tier[0]));
}
}
// Elements aren't weighted
if(elements == null || elements.isEmpty()){
// Element can only be MAGIC if tier is NOVICE
if(tier == Tier.NOVICE){
element = Element.values()[random.nextInt(Element.values().length)];
}else{
Element[] elements = ArrayUtils.removeElement(Element.values(), Element.MAGIC);
element = elements[random.nextInt(elements.length)];
}
}else{
// In theory, swapping this line to the commented one should make absolutely no difference.
element = elements.get(random.nextInt(elements.size()));
// element = null;
}
SpellProperties.Context spellContext = context.getLootedEntity() == null ? SpellProperties.Context.TREASURE
: SpellProperties.Context.LOOTING;
// Here's a thought: does randomly selecting the element beforehand (as opposed to leaving it null and letting
// the spell randomiser use any element) change the overall outcome at all?
List<Spell> spellsList = Spell.getSpells(new Spell.TierElementFilter(tier, element, spellContext));
spellsList.removeIf(s -> !s.applicableForItem(stack.getItem()));
if(stack.getItem() instanceof ItemScroll) spellsList.removeIf(s -> !s.isEnabled(SpellProperties.Context.SCROLL));
if(stack.getItem() instanceof ItemSpellBook) spellsList.removeIf(s -> !s.isEnabled(SpellProperties.Context.BOOK));
// Ensures the tier chosen actually has spells in it, and if not uses NOVICE instead. NOVICE always has at least
// the NONE spell since this spell cannot be disabled.
// Commented out for now because it will interfere with the ability to specify tiers and elements.
// To be honest, I may as well just say that if you disable enough spells to make this important, you deserve
// less loot!
/* if(spells.isEmpty()){ spellsList = Spell.getSpells(new Spell.TierElementFilter(EnumTier.NOVICE, null));
* if(stack.getItem() instanceof ItemScroll) spellsList.retainAll(Spell.getSpells(Spell.nonContinuousSpells));
* } */
if(spells != null && !spells.isEmpty()){
spellsList.retainAll(spells);
}
// This method is badly-named, loot chests pass a player through too, not just mobs
// (And WHY does it only return an entity?! The underlying field is always a player so I'm casting it anyway)
EntityPlayer player = (EntityPlayer)context.getKillerPlayer();
Spell spell = pickRandomSpell(stack, random, spellContext, player);
if(spell == Spells.none) Wizardry.logger.warn("Tried to apply the random_spell loot function to an item, but no"
+ " enabled spells matched the criteria specified. Substituting placeholder (metadata 0) item.");
stack.setItemDamage(spell.metadata());
return stack;
}
private Spell pickRandomSpell(ItemStack stack, Random random, SpellProperties.Context spellContext, EntityPlayer player){
// We're now doing this first because we need to know which spells we have to play with before selecting a tier and element
List<Spell> possibleSpells = Spell.getSpells(s -> s.isEnabled(spellContext) && s.applicableForItem(stack.getItem())
// Remove excluded tiers/elements immediately (mainly because empty tier checks should account for excluded elements)
&& (tiers == null || tiers.contains(s.getTier())) && (elements == null || elements.contains(s.getElement())));
if(spells != null && !spells.isEmpty()){
possibleSpells.retainAll(spells); // Normally you wouldn't specify a spells list AND tiers/elements... but you could!
}
if(stack.getItem() instanceof ItemScroll) possibleSpells.removeIf(s -> !s.isEnabled(SpellProperties.Context.SCROLL));
if(stack.getItem() instanceof ItemSpellBook) possibleSpells.removeIf(s -> !s.isEnabled(SpellProperties.Context.BOOK));
// Select a tier...
List<Tier> possibleTiers = new ArrayList<>();
if(tiers == null || tiers.isEmpty()){
possibleTiers.addAll(Arrays.asList(Tier.values()));
}else{
possibleTiers.addAll(tiers);
}
// Remove all empty tiers
possibleTiers.removeIf(t -> possibleSpells.stream().noneMatch(s -> s.getTier() == t)); // Lambdaception!
if(possibleTiers.isEmpty()) return Spells.none; // Gotta disable a lot of spells for this to happen
Tier tier = ignoreWeighting ? possibleTiers.get(random.nextInt(possibleTiers.size()))
: Tier.getWeightedRandomTier(random, possibleTiers.toArray(new Tier[0]));
// Remove all spells that aren't of the selected tier
possibleSpells.removeIf(s -> s.getTier() != tier);
if(possibleSpells.isEmpty()) return Spells.none; // Should be caught by the no-elements check but we might as well
// Select an element...
List<Element> possibleElements = new ArrayList<>();
// Elements aren't weighted
if(elements == null || elements.isEmpty()){
possibleElements.addAll(Arrays.asList(Element.values()));
}else{
possibleElements.addAll(elements);
}
// Remove all empty elements
possibleElements.removeIf(e -> possibleSpells.stream().noneMatch(s -> s.getElement() == e));
if(possibleElements.isEmpty()) return Spells.none; // A bit more likely I guess, but still pretty unlikely
Element element = possibleElements.get(random.nextInt(possibleElements.size()));
// Remove all spells that aren't of the selected tier
possibleSpells.removeIf(s -> s.getElement() != element);
if(possibleSpells.isEmpty()) return Spells.none; // If it fails anywhere, it'll most likely be here
// Remove either the undiscovered spells or the discovered ones, depending on the bias
if(undiscoveredBias > 0 && player != null){
WizardData data = WizardData.get(player);
int discoveredCount = (int)spellsList.stream().filter(data::hasSpellBeenDiscovered).count();
int discoveredCount = (int)possibleSpells.stream().filter(data::hasSpellBeenDiscovered).count();
// If none have been discovered or they've all been discovered, don't bother!
if(discoveredCount > 0 && discoveredCount < spellsList.size()){
if(discoveredCount > 0 && discoveredCount < possibleSpells.size()){
// Kinda unintuitive but it's very neat!
boolean keepDiscovered = random.nextFloat() < 0.5f + 0.5f * undiscoveredBias;
spellsList.removeIf(s -> keepDiscovered != data.hasSpellBeenDiscovered(s));
possibleSpells.removeIf(s -> keepDiscovered != data.hasSpellBeenDiscovered(s));
}
}
if(spellsList.isEmpty()){
Wizardry.logger.warn("Tried to apply the random_spell loot function to an item, but no enabled spells"
+ "matched the criteria specified. Substituting placeholder (metadata 0) item.");
stack.setItemDamage(0);
}else{
stack.setItemDamage(spellsList.get(random.nextInt(spellsList.size())).metadata());
}
return stack;
return possibleSpells.get(random.nextInt(possibleSpells.size())); // Finally pick a spell
}
public static class Serializer extends LootFunction.Serializer<RandomSpell> {
@@ -1,8 +1,10 @@
package electroblob.wizardry.misc;
import electroblob.wizardry.util.WizardryUtilities;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTUtil;
import net.minecraft.network.PacketBuffer;
import net.minecraft.village.MerchantRecipe;
import net.minecraft.village.MerchantRecipeList;
import net.minecraftforge.oredict.OreDictionary;
@@ -46,12 +48,42 @@ public class WildcardTradeList extends MerchantRecipeList {
}
private boolean areItemStacksExactlyEqual(ItemStack stack1, ItemStack stack2){
// Added to allow wildcards; this line is the only actual change.
// Added to allow wildcards
if((stack1.getItemDamage() == OreDictionary.WILDCARD_VALUE || stack2.getItemDamage() == OreDictionary.WILDCARD_VALUE)
// Can't use ItemStack.areItemsEqualIgnoreDurability because that only works for items with durability, not subtypes.
&& stack1.getItem() == stack2.getItem()) return true;
return ItemStack.areItemsEqual(stack1, stack2) && (!stack2.hasTagCompound() || stack1.hasTagCompound() && NBTUtil.areNBTEquals(stack2.getTagCompound(), stack1.getTagCompound(), false));
}
@Override
public void writeToBuf(PacketBuffer buffer){
buffer.writeByte((byte)(this.size() & 255));
// Trick the client into thinking this is a normal item
for(MerchantRecipe merchantrecipe : this){
ItemStack itemToBuy = merchantrecipe.getItemToBuy();
if(itemToBuy.getMetadata() == OreDictionary.WILDCARD_VALUE) itemToBuy = WizardryUtilities.copyWithMeta(itemToBuy, 0);
buffer.writeItemStack(itemToBuy);
ItemStack itemToSell = merchantrecipe.getItemToSell();
if(itemToSell.getMetadata() == OreDictionary.WILDCARD_VALUE) itemToSell = WizardryUtilities.copyWithMeta(itemToSell, 0);
buffer.writeItemStack(itemToSell);
ItemStack secondItemToBuy = merchantrecipe.getSecondItemToBuy();
buffer.writeBoolean(!secondItemToBuy.isEmpty());
if(!secondItemToBuy.isEmpty()){
if(secondItemToBuy.getMetadata() == OreDictionary.WILDCARD_VALUE) secondItemToBuy = WizardryUtilities.copyWithMeta(secondItemToBuy, 0);
buffer.writeItemStack(secondItemToBuy);
}
buffer.writeBoolean(merchantrecipe.isRecipeDisabled());
buffer.writeInt(merchantrecipe.getToolUses());
buffer.writeInt(merchantrecipe.getMaxTradeUses());
}
}
}
@@ -56,6 +56,7 @@ public class PacketSyncSettings implements IMessageHandler<Message, IMessage> {
settings.discoveryMode = buf.readBoolean();
settings.creativeBypassesArcaneLock = buf.readBoolean();
settings.slowTimeAffectsPlayers = buf.readBoolean();
settings.replaceVanillaFireballs = buf.readBoolean();
settings.forfeitChance = buf.readFloat();
}
@@ -64,6 +65,7 @@ public class PacketSyncSettings implements IMessageHandler<Message, IMessage> {
buf.writeBoolean(settings.discoveryMode);
buf.writeBoolean(settings.creativeBypassesArcaneLock);
buf.writeBoolean(settings.slowTimeAffectsPlayers);
buf.writeBoolean(settings.replaceVanillaFireballs);
buf.writeFloat((float)settings.forfeitChance); // Configs don't have floats but this can only be 0-1 anyway
}
}
@@ -1,5 +1,6 @@
package electroblob.wizardry.spell;
import electroblob.wizardry.Settings;
import electroblob.wizardry.Wizardry;
import electroblob.wizardry.block.BlockCrystalOre;
import electroblob.wizardry.registry.WizardryItems;
@@ -21,6 +22,7 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraft.world.World;
import org.apache.commons.lang3.tuple.Pair;
import java.util.Arrays;
import java.util.Comparator;
@@ -65,11 +67,13 @@ public class Divination extends Spell {
List<BlockPos> sphere = WizardryUtilities.getBlockSphere(caster.getPosition(), range);
sphere.removeIf(b -> !(world.getBlockState(b).getBlock() instanceof BlockOre
|| world.getBlockState(b).getBlock() instanceof BlockRedstoneOre
|| world.getBlockState(b).getBlock() instanceof BlockCrystalOre
|| Arrays.asList(Wizardry.settings.divinationOreWhitelist)
.contains(world.getBlockState(b).getBlock().getRegistryName())));
sphere.removeIf(b -> {
Block block = world.getBlockState(b).getBlock();
return !(block instanceof BlockOre
|| block instanceof BlockRedstoneOre
|| block instanceof BlockCrystalOre
|| Settings.containsMetaBlock(Wizardry.settings.divinationOreWhitelist, world.getBlockState(b)));
});
Strength strength = Strength.NOTHING;
@@ -1,5 +1,6 @@
package electroblob.wizardry.spell;
import electroblob.wizardry.Wizardry;
import electroblob.wizardry.entity.construct.EntityEarthquake;
import electroblob.wizardry.registry.WizardryItems;
import electroblob.wizardry.util.SpellModifiers;
@@ -7,6 +8,7 @@
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.EnumAction;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumParticleTypes;
@@ -53,6 +55,10 @@
world.spawnParticle(EnumParticleTypes.BLOCK_DUST, particleX, y,
particleZ, particleX - x, 0, particleZ - z, Block.getStateId(block));
}
WizardryUtilities.getEntitiesWithinRadius(15, x, y, z, world, EntityPlayer.class)
.forEach(p -> Wizardry.proxy.shakeScreen(p, 12));
}
return super.spawnConstruct(world, x, y, z, side, caster, modifiers);
@@ -31,7 +31,7 @@ public class FlamingWeapon extends Spell {
for(ItemStack stack : WizardryUtilities.getPrioritisedHotbarAndOffhand(caster)){
if((ImbueWeapon.isSword(stack.getItem()) || ImbueWeapon.isBow(stack.getItem()))
if((ImbueWeapon.isSword(stack) || ImbueWeapon.isBow(stack))
&& !EnchantmentHelper.getEnchantments(stack).containsKey(WizardryEnchantments.flaming_weapon)){
// The enchantment level as determined by the damage multiplier. The + 0.5f is so that
// weird float processing doesn't incorrectly round it down.
@@ -37,7 +37,7 @@ public class FreezingWeapon extends Spell {
for(ItemStack stack : WizardryUtilities.getPrioritisedHotbarAndOffhand(caster)){
if((ImbueWeapon.isSword(stack.getItem()) || ImbueWeapon.isBow(stack.getItem()))
if((ImbueWeapon.isSword(stack) || ImbueWeapon.isBow(stack))
&& !EnchantmentHelper.getEnchantments(stack).containsKey(WizardryEnchantments.freezing_weapon)){
// The enchantment level as determined by the damage multiplier. The + 0.5f is so that
// weird float processing doesn't incorrectly round it down.
@@ -4,6 +4,7 @@ import electroblob.wizardry.util.ParticleBuilder;
import electroblob.wizardry.util.SpellModifiers;
import electroblob.wizardry.util.WizardryUtilities;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.item.EnumAction;
import net.minecraft.util.EnumFacing;
@@ -19,6 +20,11 @@ public class HealAlly extends SpellRay {
addProperties(HEALTH);
}
@Override
public boolean canBeCastBy(EntityLiving npc, boolean override){
return false;
}
@Override
protected boolean onEntityHit(World world, Entity target, Vec3d hit, EntityLivingBase caster, Vec3d origin, int ticksInUse, SpellModifiers modifiers){
@@ -1,5 +1,6 @@
package electroblob.wizardry.spell;
import electroblob.wizardry.Settings;
import electroblob.wizardry.Wizardry;
import electroblob.wizardry.constants.Constants;
import electroblob.wizardry.data.WizardData;
@@ -11,9 +12,13 @@ import electroblob.wizardry.util.SpellModifiers;
import electroblob.wizardry.util.WizardryUtilities;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.*;
import net.minecraft.item.EnumAction;
import net.minecraft.item.ItemBow;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemSword;
import net.minecraft.util.EnumHand;
import net.minecraft.world.World;
import org.apache.commons.lang3.tuple.Pair;
import java.util.Arrays;
@@ -32,7 +37,7 @@ public class ImbueWeapon extends Spell {
for(ItemStack stack : WizardryUtilities.getPrioritisedHotbarAndOffhand(caster)){
if(isSword(stack.getItem())
if(isSword(stack)
&& !EnchantmentHelper.getEnchantments(stack).containsKey(WizardryEnchantments.magic_sword)
&& WizardData.get(caster).getImbuementDuration(WizardryEnchantments.magic_sword) <= 0){
// The enchantment level as determined by the damage multiplier. The + 0.5f is so that
@@ -44,7 +49,7 @@ public class ImbueWeapon extends Spell {
WizardData.get(caster).setImbuementDuration(WizardryEnchantments.magic_sword,
(int)(getProperty(EFFECT_DURATION).floatValue() * modifiers.get(WizardryItems.duration_upgrade)));
}else if(isBow(stack.getItem())
}else if(isBow(stack)
&& !EnchantmentHelper.getEnchantments(stack).containsKey(WizardryEnchantments.magic_bow)
&& WizardData.get(caster).getImbuementDuration(WizardryEnchantments.magic_bow) <= 0){
// The enchantment level as determined by the damage multiplier. The + 0.5f is so that
@@ -77,13 +82,13 @@ public class ImbueWeapon extends Spell {
}
/** Returns true if the given item counts as a sword, i.e. it extends {@link ItemSword} or is in the whitelist. */
public static boolean isSword(Item item){
return item instanceof ItemSword || Arrays.asList(Wizardry.settings.swordItemWhitelist).contains(item.getRegistryName());
public static boolean isSword(ItemStack stack){
return stack.getItem() instanceof ItemSword || Settings.containsMetaItem(Wizardry.settings.swordItemWhitelist, stack);
}
/** Returns true if the given item counts as a bow, i.e. it extends {@link ItemBow} or is in the whitelist. */
public static boolean isBow(Item item){
return item instanceof ItemBow || Arrays.asList(Wizardry.settings.bowItemWhitelist).contains(item.getRegistryName());
public static boolean isBow(ItemStack stack){
return stack.getItem() instanceof ItemBow || Settings.containsMetaItem(Wizardry.settings.bowItemWhitelist, stack);
}
}
@@ -1,5 +1,6 @@
package electroblob.wizardry.spell;
import electroblob.wizardry.Settings;
import electroblob.wizardry.Wizardry;
import electroblob.wizardry.util.SpellModifiers;
import electroblob.wizardry.util.WizardryUtilities;
@@ -10,8 +11,6 @@ import net.minecraft.util.EnumHand;
import net.minecraft.util.EnumParticleTypes;
import net.minecraft.world.World;
import java.util.Arrays;
public class PocketFurnace extends Spell {
public static final String ITEMS_SMELTED = "items_smelted";
@@ -37,9 +36,9 @@ public class PocketFurnace extends Spell {
result = FurnaceRecipes.instance().getSmeltingResult(stack);
if(!result.isEmpty() && !(result.getItem() instanceof ItemTool) && !(result.getItem() instanceof ItemSword)
&& !(result.getItem() instanceof ItemArmor)
&& !Arrays.asList(Wizardry.settings.pocketFurnaceItemBlacklist).contains(result.getItem().getRegistryName())){
if(!result.isEmpty() && !(stack.getItem() instanceof ItemTool) && !(stack.getItem() instanceof ItemSword)
&& !(stack.getItem() instanceof ItemArmor)
&& !Settings.containsMetaItem(Wizardry.settings.pocketFurnaceItemBlacklist, stack)){
if(stack.getCount() <= usesLeft){
ItemStack stack2 = new ItemStack(result.getItem(), stack.getCount(), result.getItemDamage());
@@ -201,6 +201,8 @@ public class Possession extends SpellRay {
*/
public boolean possess(EntityPlayer possessor, EntityLiving target, int duration){
if(possessor.isSneaking()) return false;
if(WizardData.get(possessor) != null){
WizardData.get(possessor).setVariable(POSSESSEE_KEY, target);
@@ -683,11 +685,13 @@ public class Possession extends SpellRay {
if(possessee != null){
if(possessee.canPickUpLoot() && possessee.getHeldItemMainhand().isEmpty()){
possessee.setHeldItem(EnumHand.MAIN_HAND, event.getItem().getItem());
}else{
event.setCanceled(true);
}
event.setCanceled(true);
// if(possessee.canPickUpLoot() && possessee.getHeldItemMainhand().isEmpty()){
// possessee.setHeldItem(EnumHand.MAIN_HAND, event.getItem().getItem());
// }else{
// event.setCanceled(true);
// }
}
}
@@ -41,12 +41,17 @@ public class Shockwave extends Spell {
for(EntityLivingBase target : targets){
if(target instanceof EntityPlayer && (!Wizardry.settings.playersMoveEachOther
|| ItemArtefact.isArtefactActive((EntityPlayer)target, WizardryItems.amulet_anchoring))){
if(target instanceof EntityPlayer){
if(!world.isRemote) caster.sendStatusMessage(new TextComponentTranslation("spell.resist",
target.getName(), this.getNameForTranslationFormatted()), true);
return false;
Wizardry.proxy.shakeScreen((EntityPlayer)target, 10);
if(!Wizardry.settings.playersMoveEachOther) continue;
if(ItemArtefact.isArtefactActive((EntityPlayer)target, WizardryItems.amulet_anchoring)){
if(!world.isRemote) caster.sendStatusMessage(new TextComponentTranslation("spell.resist",
target.getName(), this.getNameForTranslationFormatted()), true);
continue;
}
}
if(AllyDesignationSystem.isValidTarget(caster, target)){
@@ -1,6 +1,7 @@
package electroblob.wizardry.util;
import electroblob.wizardry.CommonProxy;
import electroblob.wizardry.Settings;
import electroblob.wizardry.Wizardry;
import electroblob.wizardry.data.WizardData;
import electroblob.wizardry.entity.living.ISpellCaster;
@@ -23,6 +24,7 @@ import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.inventory.EntityEquipmentSlot.Type;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.datasync.DataParameter;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.*;
@@ -298,11 +300,10 @@ public final class WizardryUtilities {
* @return True if the given block is a tree block, false if not.
*/
public static boolean isTreeBlock(World world, BlockPos pos){
return world.getBlockState(pos).getBlock() instanceof BlockLog
|| world.getBlockState(pos).getBlock() instanceof BlockCactus
|| world.getBlockState(pos).getBlock().isLeaves(world.getBlockState(pos), world, pos)
|| world.getBlockState(pos).getBlock().isFoliage(world, pos)
|| Arrays.asList(Wizardry.settings.treeBlocks).contains(world.getBlockState(pos).getBlock().getRegistryName());
Block block = world.getBlockState(pos).getBlock();
return block instanceof BlockLog || block instanceof BlockCactus
|| block.isLeaves(world.getBlockState(pos), world, pos) || block.isFoliage(world, pos)
|| Settings.containsMetaBlock(Wizardry.settings.treeBlocks, world.getBlockState(pos));
}
/**
@@ -795,6 +796,20 @@ public final class WizardryUtilities {
return false;
}
/**
* Returns a new {@link ItemStack} that is identical to the supplied one, except with the metadata changed to the
* new value given.
* @param toCopy The stack to copy
* @param newMetadata The new metadata value
* @return The resulting {@link ItemStack}
*/
public static ItemStack copyWithMeta(ItemStack toCopy, int newMetadata){
ItemStack copy = new ItemStack(toCopy.getItem(), toCopy.getCount(), newMetadata);
NBTTagCompound compound = toCopy.getTagCompound();
if(compound != null) copy.setTagCompound(compound.copy());
return copy;
}
/**
* Checks if the given player is opped on the given server. If the server is a singleplayer or LAN server, this
* means they have cheats enabled.
@@ -144,6 +144,9 @@ public abstract class WorldGenSurfaceStructure implements IWorldGenerator {
// Estimate a starting height for searching for the floor
BlockPos centre = world.getTopSolidOrLiquidBlock(new BlockPos(origin.add(size.getX()/2, 0, size.getZ()/2)));
// Check if we're at the top of the world, and if so just randomise the y pos (accounts for 'cavern' dimensions)
if(centre.getY() >= world.getActualHeight()) centre = new BlockPos(centre.getX(), random.nextInt(world.getActualHeight()), centre.getZ());
Integer startingHeight = WizardryUtilities.getNearestSurface(world, centre, EnumFacing.UP, 32, true,
WizardryUtilities.SurfaceCriteria.COLLIDABLE_IGNORING_TREES);
File diff suppressed because it is too large Load Diff
@@ -1,4 +1,4 @@
#PARSE_ESCAPES
# PARSE_ESCAPES
tile.ebwizardry\:arcane_workbench.name=Arcane Workbench
tile.ebwizardry\:crystal_ore.name=Crystal Ore
tile.ebwizardry\:petrified_stone.name=Petrified Stone
@@ -498,6 +498,13 @@ advancement.ebwizardry\:enchant_scroll.desc=Craft a blank scroll and enchant it
handbook.toast.title=New Handbook Section Unlocked!
gui.ebwizardry\:spell_book.tier=Tier: %s
gui.ebwizardry\:spell_book.element=Element: %s
gui.ebwizardry\:spell_book.element_undiscovered=Element: ?
gui.ebwizardry\:spell_book.mana_cost=Mana Cost: %s
gui.ebwizardry\:spell_book.mana_cost_continuous=Mana Cost: %s/second
gui.ebwizardry\:spell_book.mana_cost_undiscovered=Mana Cost: ?
container.ebwizardry\:arcane_workbench=Arcane Workbench
container.ebwizardry\:arcane_workbench.apply=Apply
container.ebwizardry\:arcane_workbench.mana=Mana\:
@@ -1284,9 +1291,9 @@ config.ebwizardry.auto_place_shrine_markers.tooltip=Controls whether wizardry au
integration.jei.category.ebwizardry\:arcane_workbench=Arcane Workbench
integration.antiqueatlas.marker.ebwizardry\:wizard_tower=Wizard Tower
integration.antiqueatlas.marker.ebwizardry\:obelisk=Obelisk
integration.antiqueatlas.marker.ebwizardry\:shrine=Shrine
integration.antiqueatlas.marker.ebwizardry.wizard_tower=Wizard Tower
integration.antiqueatlas.marker.ebwizardry.obelisk=Obelisk
integration.antiqueatlas.marker.ebwizardry.shrine=Shrine
spell.ebwizardry\:magic_missile_festive=Magic Mistletoe
spell.ebwizardry\:summon_snow_golem_festive=Summon Frosty The Snowman
@@ -498,6 +498,13 @@ advancement.ebwizardry\:enchant_scroll.desc=Craft a blank scroll and enchant it
handbook.toast.title=New Handbook Section Unlocked!
gui.ebwizardry\:spell_book.tier=Tier: %s
gui.ebwizardry\:spell_book.element=Element: %s
gui.ebwizardry\:spell_book.element_undiscovered=Element: ?
gui.ebwizardry\:spell_book.mana_cost=Mana Cost: %s
gui.ebwizardry\:spell_book.mana_cost_continuous=Mana Cost: %s/second
gui.ebwizardry\:spell_book.mana_cost_undiscovered=Mana Cost: ?
container.ebwizardry\:arcane_workbench=Arcane Workbench
container.ebwizardry\:arcane_workbench.apply=Apply
container.ebwizardry\:arcane_workbench.mana=Mana\:
@@ -1284,9 +1291,9 @@ config.ebwizardry.auto_place_shrine_markers.tooltip=Controls whether wizardry au
integration.jei.category.ebwizardry\:arcane_workbench=Arcane Workbench
integration.antiqueatlas.marker.ebwizardry\:wizard_tower=Wizard Tower
integration.antiqueatlas.marker.ebwizardry\:obelisk=Obelisk
integration.antiqueatlas.marker.ebwizardry\:shrine=Shrine
integration.antiqueatlas.marker.ebwizardry.wizard_tower=Wizard Tower
integration.antiqueatlas.marker.ebwizardry.obelisk=Obelisk
integration.antiqueatlas.marker.ebwizardry.shrine=Shrine
spell.ebwizardry\:magic_missile_festive=Magic Mistletoe
spell.ebwizardry\:summon_snow_golem_festive=Summon Frosty The Snowman
@@ -1272,8 +1272,8 @@ config.ebwizardry.auto_place_shrine_markers.tooltip=Kontroluje, czy Wizardry aut
integration.jei.category.ebwizardry\:arcane_workbench=Tajmniczny Stół
integration.antiqueatlas.marker.ebwizardry\:wizard_tower=Wieża Czarodzieja
integration.antiqueatlas.marker.ebwizardry\:obelisk=Obelisk
integration.antiqueatlas.marker.ebwizardry\:shrine=Świątynia
integration.antiqueatlas.marker.ebwizardry.wizard_tower=Wieża Czarodzieja
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
@@ -10,7 +10,7 @@
{
"type": "loot_table",
"name": "ebwizardry:subsets/arcane_tomes",
"weight": 3
"weight": 4
},
{
"type": "loot_table",
@@ -31,7 +31,7 @@
{
"type": "loot_table",
"name": "ebwizardry:subsets/arcane_tomes",
"weight": 6
"weight": 8
},
{
"type": "loot_table",
@@ -20,7 +20,7 @@
{
"type": "loot_table",
"name": "ebwizardry:subsets/arcane_tomes",
"weight": 4
"weight": 5
},
{
"type": "loot_table",
@@ -8,7 +8,7 @@
"type": "item",
"entryName": "apprentice_tome",
"name": "ebwizardry:arcane_tome",
"weight": 3,
"weight": 4,
"functions": [
{
"function": "set_data",
@@ -736,7 +736,7 @@
"Translations:",
"- Spanish and Mexican Spanish: MadWrist \n- Russian: VilagVil, kellixon \n- French: Hahdrim \n- Brazilian Portuguese: lorrampi \n- Chinese: ZHENGLOC, dragon-evol \n- Korean: shejery, rewi_wire \n- Polish: Trozuu",
"- Spanish: MadWrist, Alsentar \n- Mexican Spanish: MadWrist \n- Russian: VilagVil, kellixon, bigenergy \n- French: Hahdrim \n- Brazilian Portuguese: lorrampi \n- Chinese: ZHENGLOC, dragon-evol, Hokorizero, TUsama \n- Korean: shejery, rewi_wire \n- Polish: Trozuu \n-German: BirdyDragon",
"Lightning ray sound effect from OhhWowProductions",
@@ -736,7 +736,7 @@
"Translations:",
"- Spanish and Mexican Spanish: MadWrist \n- Russian: VilagVil, kellixon \n- French: Hahdrim \n- Brazilian Portuguese: lorrampi \n- Chinese: ZHENGLOC, dragon-evol \n- Korean: shejery, rewi_wire \n- Polish: Trozuu",
"- Spanish: MadWrist, Alsentar \n- Mexican Spanish: MadWrist \n- Russian: VilagVil, kellixon, bigenergy \n- French: Hahdrim \n- Brazilian Portuguese: lorrampi \n- Chinese: ZHENGLOC, dragon-evol, Hokorizero, TUsama \n- Korean: shejery, rewi_wire \n- Polish: Trozuu \n-German: BirdyDragon",
"Lightning ray sound effect from OhhWowProductions",
@@ -0,0 +1,750 @@
{
"bookmark_start_section": "introduction",
"colours": {
"text": "#000000",
"caption": "#666666",
"hyperlink": "#601ba0",
"highlight": "#dd4c1d",
"new_section": "#ee88f7"
},
"images": {
"workbench": {
"location": "ebwizardry:textures/gui/arcane_workbench_picture.png",
"caption": "Mesa Arcana",
"u": 0,
"v": 0,
"width": 110,
"height": 110
},
"crystal_ore": {
"location": "ebwizardry:textures/gui/ore_picture.png",
"caption": "Mena de Cristal Mágico",
"u": 0,
"v": 0,
"width": 64,
"height": 64
},
"magic_crystal": {
"location": "ebwizardry:textures/items/crystal_magic.png",
"caption": "Cristal Mágico",
"u": 6,
"v": 6,
"width": 36,
"height": 33,
"texture_width": 48,
"texture_height": 48,
"border": false
},
"magic_wand": {
"location": "ebwizardry:textures/items/wand_novice.png",
"caption": "Varita Mágica",
"u": 0,
"v": 0,
"width": 64,
"height": 64,
"border": false
},
"crystal_flower": {
"location": "ebwizardry:textures/gui/flower_picture.png",
"caption": "Flor de Cristal",
"u": 0,
"v": 0,
"width": 48,
"height": 48
},
"wizard_tower": {
"location": "ebwizardry:textures/gui/tower_picture.png",
"caption": "Torre de mago",
"u": 0,
"v": 0,
"width": 110,
"height": 110
},
"wizard_armour": {
"location": "ebwizardry:textures/gui/armour_picture.png",
"caption": "Conjunto de Armadura de mago",
"u": 0,
"v": 0,
"width": 90,
"height": 90
},
"obelisk": {
"location": "ebwizardry:textures/gui/obelisk_picture.png",
"caption": "Obelisco",
"u": 0,
"v": 0,
"width": 110,
"height": 67
},
"shrine": {
"location": "ebwizardry:textures/gui/shrine_picture.png",
"caption": "Santuario de la tierra",
"u": 0,
"v": 0,
"width": 110,
"height": 67
},
"tiers": {
"location": "ebwizardry:textures/gui/tiers_picture.png",
"caption": "Los 4 niveles en las Varitas",
"u": 0,
"v": 0,
"width": 96,
"height": 24,
"border": false
},
"elements": {
"location": "ebwizardry:textures/gui/elements_picture.png",
"caption": "Los 7 elementos Arcanos",
"u": 0,
"v": 0,
"width": 106,
"height": 20,
"border": false
}
},
"recipes": {
"arcane_workbench": {
"locations": [ "ebwizardry:arcane_workbench" ]
},
"magic_wand": {
"locations": [ "ebwizardry:magic_wand" ]
},
"novice_wands": {
"locations": [
"ebwizardry:magic_wand",
"ebwizardry:wand_fire",
"ebwizardry:wand_ice",
"ebwizardry:wand_lightning",
"ebwizardry:wand_necromancy",
"ebwizardry:wand_earth",
"ebwizardry:wand_sorcery",
"ebwizardry:wand_healing"
]
},
"magic_missile_spell_book": {
"locations": [ "ebwizardry:magic_missile_spell_book" ]
},
"wizard_handbook": {
"locations": [ "ebwizardry:wizard_handbook" ]
},
"crystal_flower_to_crystals": {
"locations": [ "ebwizardry:crystal_flower_to_crystals" ]
},
"crystal_blocks": {
"locations": [
"ebwizardry:crystal_block",
"ebwizardry:crystal_block_fire",
"ebwizardry:crystal_block_ice",
"ebwizardry:crystal_block_lightning",
"ebwizardry:crystal_block_necromancy",
"ebwizardry:crystal_block_earth",
"ebwizardry:crystal_block_sorcery",
"ebwizardry:crystal_block_healing"
]
},
"crystal_blocks_to_crystals": {
"locations": [
"ebwizardry:crystal_block_to_crystals",
"ebwizardry:crystal_block_to_crystals_fire",
"ebwizardry:crystal_block_to_crystals_ice",
"ebwizardry:crystal_block_to_crystals_lightning",
"ebwizardry:crystal_block_to_crystals_necromancy",
"ebwizardry:crystal_block_to_crystals_earth",
"ebwizardry:crystal_block_to_crystals_sorcery",
"ebwizardry:crystal_block_to_crystals_healing"
]
},
"crystal_shard": {
"locations": [ "ebwizardry:crystal_shard" ]
},
"small_mana_flask": {
"locations": [ "ebwizardry:small_mana_flask" ]
},
"medium_mana_flask": {
"locations": [ "ebwizardry:medium_mana_flask" ]
},
"large_mana_flask": {
"locations": [ "ebwizardry:large_mana_flask" ]
},
"runestone": {
"locations": [
"ebwizardry:runestone_fire",
"ebwizardry:runestone_ice",
"ebwizardry:runestone_lightning",
"ebwizardry:runestone_necromancy",
"ebwizardry:runestone_earth",
"ebwizardry:runestone_sorcery",
"ebwizardry:runestone_healing"
]
},
"runestone_pedestal": {
"locations": [
"ebwizardry:runestone_pedestal_fire",
"ebwizardry:runestone_pedestal_ice",
"ebwizardry:runestone_pedestal_lightning",
"ebwizardry:runestone_pedestal_necromancy",
"ebwizardry:runestone_pedestal_earth",
"ebwizardry:runestone_pedestal_sorcery",
"ebwizardry:runestone_pedestal_healing"
]
},
"transportation_stone": {
"locations": [ "ebwizardry:transportation_stone" ]
},
"magic_silk": {
"locations": [ "ebwizardry:magic_silk" ]
},
"wizard_hat": {
"locations": [ "ebwizardry:wizard_hat" ]
},
"wizard_robe": {
"locations": [ "ebwizardry:wizard_robe" ]
},
"wizard_leggings": {
"locations": [ "ebwizardry:wizard_leggings" ]
},
"wizard_boots": {
"locations": [ "ebwizardry:wizard_boots" ]
},
"blank_scroll": {
"locations": [ "ebwizardry:blank_scroll" ]
},
"firebomb": {
"locations": [ "ebwizardry:firebomb" ]
},
"poison_bomb": {
"locations": [ "ebwizardry:poison_bomb" ]
},
"smoke_bomb": {
"locations": [ "ebwizardry:smoke_bomb" ]
},
"spark_bomb": {
"locations": [ "ebwizardry:spark_bomb" ]
}
},
"sections": {
"inside_cover": {
"centre": {
"x": true,
"y": true
},
"text": [
"El Manual del Mago",
"Por Electroblob"
]
},
"introduction": {
"title": "Introduccion",
"text": [
"¡Saludos Mago! Este libro te mostrara los secretos de las artes arcanas, y de cómo usarlas. Este no es un libro común y corriente, ya que su conocimiento y sus páginas aumentarán a medida que descubres más y más sobre mundo mágico.",
"Utiliza los botones en forma de flecha para pasar la página, y los botones de doble flecha para pasar de una sección a otra. Usa el botón de menú central para regresar al índice.",
"Haz clic en cualquier palabra en color purpura para ir directamente al tema en cuestión. Haz clic derecho al marcador rojo para moverlo a la página actual, y clic izquierdo para saltar a la página marcada."
]
},
"main_contents": {
"title": "Índice",
"contents": {
"id": "main_contents",
"hyperlinks": true,
"page_numbers": true,
"separator": "."
}
},
"setting_up": {
"title": "Iniciación",
"include_in_contents": "main_contents",
"text": [
"Para comenzar como mago, necesitarás conseguir lo siguiente:",
"- Una Varita mágica, hecha de la siguiente forma:",
"#recipe magic_wand",
"- Una @arcane_workbench Mesa Arcana@, hecha de a siguiente forma:",
"#recipe arcane_workbench",
"- Un @spells Libro de hechizos@. Estos se pueden encontrar en cofres, recompensas por matar monstruos, y comprado a otros magos. Puedes crear el hechizo Misil Mágico, un hechizo de bajo nivel, de la siguiente forma:",
"#recipe magic_missile_spell_book",
"También necesitaras bastantes Cristales Mágicos para suplir tu varita de @mana@."
]
},
"mana": {
"title": "Maná",
"include_in_contents": "main_contents",
"triggers": [
"ebwizardry:crystal"
],
"text": [
"El Maná es la energía mística que concede a los magos sus habilidades. Mucho más que una sustancia física, el Maná es un aura que impregna la realidad de forma omnipresente. En nuestro mundo, suele acumularse hasta formar cristales sólidos, los cuales pueden ser hallados incrustados en piedra en el subsuelo. Las @wands Varitas@ almacenan Maná dentro de ellas, y este Maná es canalizado hacia fuera al conjurar un @spells Hechizo@. Diferentes Hechizos requieren diferentes cantidades de Maná, dependiendo de que tan poderosos sean y de cuanto duren sus efectos.",
"#image crystal_ore",
"#image magic_crystal",
"Al ser energía pura, el Maná no puede ser creado ni destruido. Cuando se conjura un hechizo, El Maná canalizado simplemente se disipa en el ambiente. Ciertamente, la mayoría de Maná se encuentra esparcido en pequeñas cantidades a través de todo el Cosmos. Sin embargo, para poder ser usado, el Maná debe de estar concentrado. Esto se puede lograr de forma natural a través de miles de años, como pasa con los cristales mágicos, o de forma artificial, un método avanzado no abordado en este libro. También existen diferentes formas de que el Maná sea mejor administrado al conjurar hechizos, y de recuperar una parte del Maná disipado en el ambiente."
]
},
"wands": {
"title": "Varitas",
"include_in_contents": "main_contents",
"triggers": [
"ebwizardry:arcane_initiate"
],
"text": [
"La varita es el arma y herramienta principal de un mago. Con ella, podrás conjurar cualquier @spells hechizo@ que la varita pueda canalizar (véase @tiers Niveles@). Las varitas vienen en diferentes variedades, pero es muy probable que empieces con una varita básica.",
"#image magic_wand",
"La mayoria de varitas comienzan como una estructura simple de un cristal mágico unido a un palo de madera, con una pepita de oro unido en el otro extremo. El cristal es, claro está, la fuente de poder de la varita, ya que provee el foco necesario para canalizar @spells hechizos@. El resto de la varita es importante también, ya que no solo provee un medio para sostener la varita, sino también un circuito interno por el cual el @mana maná@ puede ser canalizado y dirigido.",
"A medida que se conjuren hechizos con la varita, esta se volverá más efectiva en canalizar dichos @spells hechizos@, y eventualmente, en conjurar hechizos mas poderosos. Esto se puede notar debido a ciertos cambios en la varita misma: Mientras mas poderosa se vuelva una varita, su cristal mágico se volverá más brillante, su color puede llegar a cambiar dependiendo de su @elements elemento@, y después de un tiempo, la madera de la que esta hecha comenzara a crecer por si sola y a retorcerse en figuras mas complejas.",
"Mientras sostienes una varita, un pequeño recuadro aparecerá en la esquina de tu pantalla. Este recuadro muestra el hechizo seleccionado actualmente, además de una imagen para representar tal hechizo, si el hechizo ya fue conjurado, y una barra de cooldown indicando el tiempo restante para poder conjurar el hechizo otra vez. Tambien muestra los nombres del hechizo anterior y el hechizo siguiente vinculados a la varita. Para cambiar de hechizo, utiliza las teclas #next_spell_key and #previous_spell_key (Estas pueden ser modificadas en Opciones > Controles). Tambien puedes cambiar de hechizo utilizando la rueda del mouse mientras estas agachado.",
"Cuando veas tu inventario, si pones el mouse sobre la varita, veras cuanto @mana mana@ le queda, junto con el @spells hechizo@ seleccionado actualmente y otras habilidades que tenga. Puedes visualizar más información sobre la varita colocándola en una @arcane_workbench mesa arcana@."
]
},
"spells": {
"title": "Hechizos",
"include_in_contents": "main_contents",
"triggers": [
"ebwizardry:handbook/spells"
],
"text": [
"Sin hechizos para conjurar y lanzar, una @wands varita@ es prácticamente inútil. Los hechizos son grabados en dos formas: en libros, los cual los hace permanentes, y en pergaminos, los cuales son temporales.",
"Los libros de hechizos son inútiles por si mismos, por lo que son usados para vincular el hechizo que contienen a las @wands varitas@. Los libros de hechizos se encuentran pueden ser hallados a través de todo el planeta, y no tomara mucho tiempo encontrarte con uno. Cuando lo encuentres, puedes colocar el mouse sobre el libro de hechizo para ver información básica sobre el hechizo que contiene. También puedes darle clic derecho mientras lo sostienes para leer mas acerca de él.",
"Por otro lado, los pergaminos sirven otro propósito: Haciendo click derecho mientras sostienes uno conjurará el hechizo escrito en el, consumiendo el pergamino. Al igual que los libros de hechizos, los pergaminos pueden ser hallados en muchas partes del mundo, pero también puedes crearlos tu mismo(a) (véase @enchanting_scrolls Encantando Pergaminos@).",
"Los pergaminos son bastante utiles cuando necesitas utilizar un hechizo una o dos veces en una misión específica, y no quieres que tome espacio innecesario en tu @wands varita@. De todas formas, cabe destacar que no son tan efectivas para conjurar hechizos en comparación con las varitas.",
"Desde la perspectiva de alguien común y corriente, los símbolos y runas en los cuales están escritos los hechizos son solo garabatos ilegibles. Pero tú no eres alguien común. ¡Eres un mago, joder! Y como tal, poco a poco iras aprendiendo a descifrar este lenguaje. Para identificar un hechizo podrías, claro está, simplemente conjurarlo y ver que pasa. Pero ten en cuenta que al hacerlo puede haber efectos no deseados, además de que muchos hechizos necesitan ciertas condiciones para funcionar. Además de eso, para novatos es probable leer el hechizo de forma errónea y pueden llegar a haber consecuencias peligrosas dependiendo de que tan poderoso sea el hechizo. Una opción más segura es utilizar un pergamino de identificación, los cuales pueden ser encontrados en cofres o comprados a otros magos. Al hacer click derecho mientras se sostiene uno, se identificará el primer hechizo desconocido en tu inventario, consumiendo el pergamino de identificación."
]
},
"arcane_workbench": {
"title": "Mesa Arcana",
"include_in_contents": "main_contents",
"contents": {
"id": "arcane_workbench_subsections",
"hyperlinks": true,
"page_numbers": true,
"separator": "."
},
"triggers": [
"ebwizardry:handbook/arcane_workbench"
],
"text": [
"La mesa arcana es un bloque similar a la mesa de encantamientos, donde podrás recargar, mejorar, y vincular @spells hechizos@ a tu @wands varita@. Puedes crearla de la siguiente forma:",
"#recipe arcane_workbench",
"Las siguientes paginas explicaran las acciones que puedes hacer en una mesa arcana.",
"#image workbench"
],
"sections": {
"binding_spells": {
"title": "Vinculando Hechizos",
"include_in_contents": "arcane_workbench_subsections",
"triggers": [
"ebwizardry:handbook/arcane_workbench"
],
"text": [
"Para vincular un @spells hechizo@ a tu @wands varita@, solo tienes que colocar la varita en la ranura central de la mesa arcana, luego colocar el libro de hechizo que desees en las ranuras alrededor y presionar “Aplicar”. Como habrás de notar, el acto de vincular un hechizo no afecta al libro, esto es porque al vincular un hechizo, la mesa arcana no “toma” el hechizo del libro, sino que de cierta forma “copia” de forma resumida el hechizo en la varita. De esta forma, puedes cambiar los hechizos vinculados a tu varita tantas veces como quieras con solo repetir el proceso. Puedes vincular hasta cinco hechizos diferentes a una sola varita cada vez, aunque este numero puede aumentar con mejoras de vinculación."
]
},
"charging_wands": {
"title": "Recargando Varitas",
"include_in_contents": "arcane_workbench_subsections",
"triggers": [
"ebwizardry:handbook/arcane_workbench"
],
"text": [
"Para recargar tu @wands varita@, coloca la varita en la ranura central de la mesa arcana, coloca algunos cristales mágicos en la ranura inferior izquierda y luego presiona “Aplicar”. Cada cristal vale #mana_per_crystal @mana maná@, y la varita solo tomara lo que necesita, por lo que puedes dejar una provision de cristales en la mesa arcana para cuando la necesites. Sin embargo, ten en cuenta que la varita solo puede tomar números de cristales enteros, así que si por ejemplo, la varita necesita 30 mas de maná, #example_charging_loss de maná se perderán al cargarla."
]
},
"upgrading_wands": {
"title": "Mejorando Varitas",
"include_in_contents": "arcane_workbench_subsections",
"triggers": [
"ebwizardry:handbook/tome_of_arcana"
],
"text": [
"Para mejorar tu @wands varita@, necesitaras un Tomo de Arcana del @tiers nivel@ adecuado, o también, una mejora especial para tu varita. Los Tomos de Arcana y las mejoras especiales pueden ser hallados en cofres o comprados a otros magos. Para mejorar tu varita, colocala en la ranura central, y coloca el objeto de mejora en la ranura superior derecha, luego presiona “Aplicar”.",
"Mejoras especiales para la varita cambian el aspecto de la varita. Cada tipo de mejora se puede acumular tres veces, y el total de mejoras que una varita puede tomar depende de su nivel. Solo recuerda que las mejoras no pueden ser removidas."
]
},
"enchanting_scrolls": {
"title": "Encantando Pergaminos",
"include_in_contents": "arcane_workbench_subsections",
"triggers": [
"ebwizardry:handbook/scrolls"
],
"text": [
"La mesa Arcana tambien puede ser usada para encantar @spells hechizos@ en pergaminos. Para hacerlo, necesitaras un pergamino en blanco, creado con papel y un poco de cuerda, un libro de hechizo de tu preferencia, y suficientes cristales mágicos para proveer @mana maná@ para conjurar.",
"#recipe blank_scroll",
"Coloca los cristales en la ranura inferior izquierda, el pergamino en blanco en la ranura central, y el libro de hechizos en la sola ranura encima, luego presiona confirmar par encantar le pergamino."
]
}
}
},
"wizard_armour": {
"title": "Armadura de Mago",
"include_in_contents": "main_contents",
"triggers": [
"ebwizardry:arcane_initiate"
],
"text": [
"Como el legendario y poderoso mago que eres, necesitaras algo para protegerte de las criaturas y monstruos que obviamente vencerás. Las armaduras normales son buenas, sí… pero checa eso: Sombrero, túnica, pantalones y botas. A diferencia de las armaduras normales, la armadura de mago no se rompe, ya que utiliza maná para endurecer su tela al punto de simular el metal, y proteger al usuario. Estas armaduras deben de ser recargadas con cristales mágicos, como las varitas. Afortunadamente, estas ropas no consumen mucho @mana maná@. Recárgalas como lo harías con una varita en la @arcane_workbench mesa arcana@ o con @mana_flasks frascos de mana@. Pero ten cuidado, si se le acaba el maná, lo único que te protegerá de aquellos monstruos será simple tela.",
"#image wizard_armour",
"Puedes crear una armadura de mago a partir de tela mágica:",
"#recipe magic_silk",
"#recipe wizard_hat",
"#recipe wizard_robe",
"#recipe wizard_leggings",
"#recipe wizard_boots",
"Puedes encantar una armadura de mago usando una mesa de encantamientos común, y debido a las propiedades de la tela mágica, es bastante efectiva en retener encantamientos. Los encantamientos de Protección contra Magia, Hielo y Electricidad son de particular utilidad para magos como tú, especialmente en defensa contra otros magos.",
"Aquellos magos que se dedican a la práctica de un elemento particular suelen llevar ropas especiales que les proporcionan efectos adicionales para dominar tal elemento. Conjuntos enteros de aquellas ropas son muy buscadas por los magos y no son fáciles de encontrar.",
"Leyendas hablan sobre un sello arcano usado por los magos y brujas mas poderosos. Dicen que aquel sello volverá la armadura de cualquier mago tan resistente como su contraparte mundana…"
]
},
"magical_world": {
"title": "Magia en el Mundo",
"include_in_contents": "main_contents",
"contents": {
"id": "magical_world_subsections",
"hyperlinks": true,
"page_numbers": true,
"separator": "."
},
"triggers": [
"ebwizardry:handbook/on_subsection_unlock"
],
"text": [
"No puedes dominar las artes arcanas quedándote encerrado en tu cuarto ¿o sí? ¡Hay un mundo entero de magia allá afuera para explorar! Ruinas Antiguas, reliquias y seres misteriosos benévolos y malévolos esperan ser descubiertos si sabes donde buscar. Los más grandes magos también son los más curiosos, y mucho de su conocimiento y poder lo encontraron explorando el mundo que los rodea, y experimentando con lo que encuentran.",
"Aunque un mago pasa la mayoría de su tiempo solo, compartir conocimiento es vital para aprender las artes arcanas. Busca a otros practicantes de la magia y aprende todo lo que puedas de ellos. La comunicación es uno de los poderes mas grandes que puedas tener."
],
"sections": {
"crystal_flowers": {
"title": "Flores de Cristal",
"include_in_contents": "magical_world_subsections",
"triggers": [
"ebwizardry:handbook/crystal_flowers"
],
"text": [
"Durante tu travesía, es probable que te encuentre una curiosa y colorida flor que emite luz. Estas interesantes flores se les conoce como flores de cristal, y son altamente concentradas en @mana maná@. Nade sabe el porque de esto, lo que si sabemos es que sus pétalos están hechos de cristales de mana, haciendo de estas flores una fuente útil de mana en la superficie. La cantidad de maná obtenida de esta forma es limitada debido al pequeño tamaño de las flores, y que suelen crecer en grupos pequeños.",
"#image crystal_flower",
"#recipe crystal_flower_to_crystals"
]
},
"wizard_towers": {
"title": "Torres de mago",
"include_in_contents": "magical_world_subsections",
"triggers": [
"ebwizardry:wizard_tower"
],
"text": [
"No temas, no eres el único practicante de magia en este mundo. En tus viajes, puede que te encuentres con una o dos altas torres con techos puntiagudos. Esta es la residencia de un mago. A veces una vida de soledad puede volver a los magos un poco gruñones, pero usualmente son personas amigables que están dispuestos a compartir su conocimiento contigo, por un precio. No te sorprendas si debes pagar raros y preciosos metales y gemas, ya que a cambio recibirás grandes maravillas arcanas.",
"En el caso de que fuese un hechizo de nivel @tiers maestro@ lo que buscas, necesitaras hablar con un especialista.",
"#image wizard_tower",
"Desafortunadamente, existen algunos magos en cuyas puertas los visitantes no son bienvenidos. Estos magos suelen ser marginados, y son hostiles hacia todo aquel que se cruce en su camino. Ten cuidado con estos individuos. Si los encuentras, prepárate para defenderte contra magia poderosa. Véncelos, y su conocimiento será tuyo.",
"Cabe destacar que los magos no toman de buena forma el ser atacados o robados, y siendo ese el caso, no dudarán en tomar la justicia por sus propias manos."
]
},
"obelisks": {
"title": "Obeliscos",
"include_in_contents": "magical_world_subsections",
"triggers": [
"ebwizardry:handbook/obelisks"
],
"text": [
"Vestigios de antiguas civilizaciones yacen esparcidas por todo el mundo. Los mas notables son estructuras de piedra tallada con símbolos y runas. Estas ruinas son todo lo que queda de lo que parece ser alguna clase de civilización antigua. Quien sea, o lo que sea que las haya construido, claramente tenían amplios conocimientos sobre magia, conocimientos que uso para conjurar encantamientos protectores que aun hoy día permanecen en aquellos lugares.",
"Estas estructuras suelen ser de dos tipos. El primero, y el mas común, son los Obeliscos: altas construcciones puntiagudas hechas de piedras rúnicas, con una estructura inferior abierta que contiene reliquias arcanas menores, ya olvidadas en el pasado.",
"#image obelisk",
"Estas estructuras suelen estar protegidas por un encantamiento que invoca @creatures criaturas@ del Caos Elemental cuando un humano se acerca demasiado. Vence a estas criaturas, destruye su invocador, y las reliquias serán tuyas."
]
},
"shrines": {
"title": "Santuarios",
"include_in_contents": "magical_world_subsections",
"triggers": [
"ebwizardry:visit_shrine"
],
"text": [
"El Segundo tipo es mucho mas raro, y son conocidos como santuarios. Estas estructuras consisten en un circulo de pilares de piedras rúnicas rodeando un pedestal central, en el cualse encuentra un cofre que contiene @artefacts artefactos@. Este cofre suele estar protegido por un encantamiento de Cerradura Arcana, impidiendo que cualquiera excepto el dueño lo abra. La estructura completa también esta protegida por un campo de contención, el cual impide el escape de cualquier cosa que se acerque demasiado.",
"#image shrine",
"Debido al gran poder e importancia arcana, sin mencionar las riquezas que contiene, estas estructuras son particularmente atractivas para cualquier mago aspirante. Pero ten cuidado, ha habido reportes de magos quedando atrapados en en el campo de contención y lentamente perdiendo la cordura a medida que pasa el tiempo. Algunos otros, creen que aquellas ocurrencias es un deliberado esfuerzo de la magia protectora del santuario, y que aquellos magos atrapados son controlados para proteger la estructura. Una perspectiva escalofriante sin duda para todo aquel que se atreva a aventurarse cerca…."
]
},
"creatures": {
"title": "Criaturas Magicas",
"include_in_contents": "magical_world_subsections",
"triggers": [
"ebwizardry:handbook/magical_creatures"
],
"text": [
"Además de magos, una gran cantidad de criaturas utilizan magia. Muchas de estas criaturas son de origen arcano, y la mayoría pueden ser invocadas desde el Caos Elemental usando @spells hechizos@. Es posible encontrarse con estas criaturas protegiendo un obelisco o a un poderoso mago invocador. Seres arcanos menores pueden ser encontrados casualmente en la naturaleza."
]
},
"artefacts": {
"title": "Artefactos",
"include_in_contents": "magical_world_subsections",
"triggers": [
"ebwizardry:artefact"
],
"text": [
"Al explorar un @shrines santuario@, puedes ser lo bastante afortunado(a) como para encontrar alguna clase de artefacto mágico antiguo, un objeto capaz de concederle a su portador poderes y habilidades únicas y poderosas. Tres tipos de artefactos se han encontrado son: anillos, lo cuales conceden efectos especiales a hechizos, amuletos, los cuales mejoran habilidades defensivas y talismanes, que conceden efectos de utilidad. Estos artefactos parecen funcionar solo si se llevan de forma apropiada, el simple hecho de tenerla en su persona es insuficiente."
]
}
}
},
"tiers": {
"title": "Niveles",
"include_in_contents": "main_contents",
"triggers": [
"ebwizardry:handbook/tome_of_arcana"
],
"text":[
"Las @wands varitas@ y @spells hechizos@ vienen en cuatro niveles: #colour_novicenovice#colour_reset, #colour_apprenticeapprentice#colour_reset, #colour_advancedadvanced #colour_resetand #colour_mastermaster#colour_reset. Cada nivel es mas poderoso que el anterior.",
"#image tiers",
"#colour_noviceNovice #colour_resetwands son las que pueden ser creadas. Pueden almacenar hasta #novice_max_charge maná, y solo pueden conjurar hechizos de nivel novato. Hechizos de nivel novato son lo bastante simples para ser conjurados por cualquiera y no suelen usar mucho maná. Esto no significa que son inútiles en niveles mas altos, ya que su bajo costo los hace bastante útiles incluso al tener acceso a hechizos de nivel maestro.",
"#colour_apprenticeApprentice #colour_resetwands son el siguiente nivel de varitas después del nivel novato. Pueden almacenar hasta #apprentice_max_charge maná y puede conjurar hechizos de novato y hechizos de aprendiz. Los hechizos de aprendiz son mas impresionantes que los hechizos de novato, pero suelen costar más.",
"#colour_advancedAdvanced #colour_resetwands son mas raras y ponderosas. Pueden conjurar todos los hechizos excepto hechizos de nivel maestro, y almacenan hasta #advanced_max_charge maná. Hechizos de nivel avanzado pueden conceder poderes y habilidades super humanas como inivisibilidad y causar estragos en enemigos.",
"#colour_masterMaster #colour_resetwands son las varitas más poderosas que existen. Almacenan hasta #master_max_charge maná y pueden conjurar cualquier hechizo. Libros de hechizo de nivel maestro son muy raros, y ciertos hechizos pueden causar una terrible devastación no solo a enemigos, sino al mundo mismo. Usar con precaución.",
"Para poder ser mejorada a un nivel mayor, la varita debe de volverse lo suficientemente poderosa como para canalizar hechizos de ese nivel. Las varitas ganan poder a medida de que hechizos son conjurados con ellas. Variedad, poder, efectos elementales y otros fatores externos pueden tener efecto en que tan rápido una varita gana este poder.",
"Una vez que una varita es lo suficientemente poderosa, un tomo de arcana proveerá el catalizador final para elevar a la varita al siguiente nivel (véase @upgrading_wands Mejorando varitas@), una vez que esto pasa, el proceso de maduración para la varita comienza de nuevo."
]
},
"elements": {
"title": "Elementos",
"include_in_contents": "main_contents",
"triggers": [
"ebwizardry:handbook/elements"
],
"text": [
"Los @spells hechizos@ pertenecen a diferentes elementos, los cuales determinan la naturaleza del hechizo y conceden ventajas al ser conjurados por ciertas @wands varitas@.",
"#image elements",
"#colour_fireFire#colour_reset \n Talvez el elemento mas destructivo. El fuego se trata sobre quemar, consumir, lava y explosiones. Un Pirómano poderoso desatará el infierno ante sus enemigos y probablemente incendie el mundo en el proceso. La mayoría de hechizos de fuego envuelven a los enemigos en llamas, causando Daño adicional con el tiempo. Sin embargo, ten en cuenta que los hechizos de fuego no tienen efecto sobre las criaturas provenientes del Nether.",
"#colour_iceIce#colour_reset \n El elemento de hielo contiene todo lo que es frio. Los hechizos gélidos suelen ralentizar a los enemigos o congelarlos completamente, y son especialmente efectivos en criaturas de fuego. Los hechizos de hielo suelen también ser útiles fuera de combate, como por ejemplo, congelar el agua para cruzar un rio.",
"#colour_lightningLightning#colour_reset \n Este es el element que concierne los relámpagos, truenos y rayos, tormentas, lluvias y el clima. Un poderoso mago de la tormenta es una fuerza a temer, y algunos poseen la habilidad de comandar a los rayos a voluntad. Los hechizos de tormenta suelen dañar múltiples enemigos al mismo tiempo e incluso siguen a sus objetivos, haciendo de estos un ataque efectivo contra cualquier enemigo…..pero ten cuidado con los creepers.",
"#colour_necromancyNecromancy#colour_reset \n La necromancia es el elemento de la oscuridad, caos y de la no-muerte. Los necromagos son misteriosos, y suelen considerarse malvados, aunque este no suele ser el caso. Los hechizos de necromancia suelen ser usados para invocar @creatures criaturas@ para pelear por ti o incluso doblegar la voluntad de tus enemigos.",
"#colour_earthEarth#colour_reset \n El elemento de la tierra se enfoca en el mundo natural: animales, plantas, el viento, y cosas por el estilo. Los hechizos de tierra son diversos y toman una gran variedad de formas, desde envenenar enemigos hasta desencadenar la furia del clima terrenal. Los hechizos de tierra suelen ser una mezcla de ataque, defensa y utilidad.",
"#colour_sorcerySorcery#colour_reset \n La hechicería es el elemento del cambio y la fuerza. Los hechiceros manipulan la luz, la gravedad e incluso la realidad misma para que se ajuste a sus necesidades. Los hechizos de hechicería pueden ser usados, entre muchas otras cosas, para darle al mago poderes especiales o mover objetos a voluntad.",
"#colour_healingHealing#colour_reset \n El elemento de curación es un elemento perfectamente válido, ¿verdad? ¡¿Verdad?! Este elemento se trata sobre defensa y regeneración. Los curanderos buscan protegerse a ellos mismos y a sus aliados en los mas posible y por eso suelen ser oponentes formidables. Aunque no suele ser usado de forma ofensiva, la luz purificadora de algunos hechizos de curación hará un Daño considerable a los no-muertos. Los hechizos de curación son indispensables en combate",
"Los límites entre diferentes elementos no son siempre diferentes, y algunos hechizos suelen tener semejanza a otros elementos diferentes al suyo.",
"Si tienes suerte, podrás encontrar un cristal elemental. Los cristales elementales son cristales mágicos que absorbieron propiedades elementales mientras se formaban. Estos cristales pueden ser usados para crear varitas elementales, las cuales potencian los hechizos de tal elemento."
]
},
"miscellaneous": {
"title": "Miscelaneo",
"include_in_contents": "main_contents",
"contents": {
"id": "miscellaneous_subsections",
"hyperlinks": true,
"page_numbers": true,
"separator": "."
},
"triggers": [
"ebwizardry:on_subsection_unlock"
],
"sections": {
"mana_flasks": {
"title": "Frascos de mana",
"include_in_contents": "miscellaneous_subsections",
"triggers": [
"ebwizardry:handbook/mana_flasks"
],
"text": [
"Provisiones Arcanas de Arkendur inc. ¡Objetos mágicos para todas tus necesidades!",
"¿Necesitas recargar tu @wands varita@ de forma rápida? ¡No hay problema! El @mana mana@ ya puede ser embotellado. Simplemente creas un frasco de mana con una botella y ocho cristales mágicos. Cuando quieras usarlo, solo colócalo en la mesa de crafteo con tu varita y cargara cierta parte. *",
"#recipe medium_mana_flask",
"¡NUEVO! Aquí llegaron los nuevos frascos de mana de tamaños pequeños y grandes ¡ahora puedes seleccionar un frasco que satisface tus necesidades!",
"#recipe small_mana_flask",
"#recipe large_mana_flask",
"* Este proceso destruirá la botella. Cierto nivel de mana se pierde durante el embotellamiento."
]
},
"throwable_items": {
"title": "Objetos Arrojables",
"include_in_contents": "miscellaneous_subsections",
"triggers": [
"ebwizardry:handbook/throwables"
],
"text": [
"Algunos @spells hechizos@ conjuran objetos físicos, algunos de estos pueden ser creados directamente. Bombas de fuego, Bombas de veneno, Bombas de chispas y Bombas de humo pueden todas ser creadas:",
"#recipe firebomb",
"#recipe poison_bomb",
"#recipe smoke_bomb",
"#recipe spark_bomb"
]
},
"automated_casting": {
"title": "Conjuracion Automatica",
"include_in_contents": "miscellaneous_subsections",
"triggers": [
"ebwizardry:enchant_scroll"
],
"text": [
"Experimentación reciente ha revelado que es posible automatizar la conjuración de @spells hechizos@, hasta cierto punto, usando nada mas que un dispensador simple. Nadie sabe porque, pero parece que las extrañas propiedades de la piedra roja se extienden hasta la conjuración de un pergamino de hechizo. Poniendo un par de estos en un dispensador y dándole poder serviría como una buena trampa…."
]
}
}
},
"crafting_recipes": {
"title": "Recetas para crafteos",
"include_in_contents": "main_contents",
"text": [
"#recipe arcane_workbench",
"#recipe novice_wands",
"#recipe magic_missile_spell_book",
"#recipe wizard_handbook",
"#recipe crystal_flower_to_crystals",
"#recipe crystal_blocks",
"#recipe crystal_blocks_to_crystals",
"#recipe crystal_shard",
"#recipe small_mana_flask",
"#recipe medium_mana_flask",
"#recipe large_mana_flask",
"#recipe runestone",
"#recipe runestone_pedestal",
"#recipe transportation_stone",
"#recipe magic_silk",
"#recipe wizard_hat",
"#recipe wizard_robe",
"#recipe wizard_leggings",
"#recipe wizard_boots",
"#recipe blank_scroll",
"#recipe firebomb",
"#recipe poison_bomb",
"#recipe smoke_bomb",
"#recipe spark_bomb"
]
},
"credits": {
"title": "Creditos",
"include_in_contents": "main_contents",
"text": [
"Electroblob's Wizardry \nVersion #version \nPara Minecraft #mcversion",
"Diseñado, programado y texturizado por Electroblob",
"Gracias a Minecraft Forge y MCP, cuya presencia hizo posible este mod.",
"¡Gracias también a la Comunidad de Mods de Minecraft, que siempre tiene una respuesta para mis preguntas!",
"Adicionalmente, me gustaría agradecer a los siguientes individuos por sus contribuciones al mod:",
"Codigo:",
"- Corail31 \n- 12foo \n- Shadows-of-Fire \n- HellFirePvP \n- Tora-B \n- Avatair \n- Aeronica",
"Traducciones:",
"- Español: MadWrist, Alsentar \n- Español de Mexico: MadWrist \n- Ruso: VilagVil, kellixon, bigenergy \n- Frances: Hahdrim \n- Portuges Brasileño: lorrampi \n- Chino: ZHENGLOC, dragon-evol, Hokorizero, TUsama \n- Koreano: shejery, rewi_wire \n- Polaco: Trozuu, \nAlemán: BirdyDragon",
"Efecto de sonido para los relámpagos por OhhWowProductions",
"Para mas informacion, revisa nuestra @https://github.com/Electroblob77/Wizardry/wiki wiki@.",
"¿Te encanta este mod? ¡unete al @https://discord.gg/MTmMzMv servidor de Discord@ para las ultimas noticias,discusiones y extras!"
]
}
}
}
@@ -0,0 +1,750 @@
{
"bookmark_start_section": "introduction",
"colours": {
"text": "#000000",
"caption": "#666666",
"hyperlink": "#601ba0",
"highlight": "#dd4c1d",
"new_section": "#ee88f7"
},
"images": {
"workbench": {
"location": "ebwizardry:textures/gui/arcane_workbench_picture.png",
"caption": "The Arcane Workbench",
"u": 0,
"v": 0,
"width": 110,
"height": 110
},
"crystal_ore": {
"location": "ebwizardry:textures/gui/ore_picture.png",
"caption": "Crystal Ore",
"u": 0,
"v": 0,
"width": 64,
"height": 64
},
"magic_crystal": {
"location": "ebwizardry:textures/items/crystal_magic.png",
"caption": "A Magic Crystal",
"u": 6,
"v": 6,
"width": 36,
"height": 33,
"texture_width": 48,
"texture_height": 48,
"border": false
},
"magic_wand": {
"location": "ebwizardry:textures/items/wand_novice.png",
"caption": "A Magic Wand",
"u": 0,
"v": 0,
"width": 64,
"height": 64,
"border": false
},
"crystal_flower": {
"location": "ebwizardry:textures/gui/flower_picture.png",
"caption": "A Crystal Flower",
"u": 0,
"v": 0,
"width": 48,
"height": 48
},
"wizard_tower": {
"location": "ebwizardry:textures/gui/tower_picture.png",
"caption": "A Wizard's Tower",
"u": 0,
"v": 0,
"width": 110,
"height": 110
},
"wizard_armour": {
"location": "ebwizardry:textures/gui/armour_picture.png",
"caption": "A Set Of Wizard Armour",
"u": 0,
"v": 0,
"width": 90,
"height": 90
},
"obelisk": {
"location": "ebwizardry:textures/gui/obelisk_picture.png",
"caption": "An Obelisk",
"u": 0,
"v": 0,
"width": 110,
"height": 67
},
"shrine": {
"location": "ebwizardry:textures/gui/shrine_picture.png",
"caption": "An Earth Shrine",
"u": 0,
"v": 0,
"width": 110,
"height": 67
},
"tiers": {
"location": "ebwizardry:textures/gui/tiers_picture.png",
"caption": "The 4 Tiers Of Wand",
"u": 0,
"v": 0,
"width": 96,
"height": 24,
"border": false
},
"elements": {
"location": "ebwizardry:textures/gui/elements_picture.png",
"caption": "The 7 Arcane Elements",
"u": 0,
"v": 0,
"width": 106,
"height": 20,
"border": false
}
},
"recipes": {
"arcane_workbench": {
"locations": [ "ebwizardry:arcane_workbench" ]
},
"magic_wand": {
"locations": [ "ebwizardry:magic_wand" ]
},
"novice_wands": {
"locations": [
"ebwizardry:magic_wand",
"ebwizardry:wand_fire",
"ebwizardry:wand_ice",
"ebwizardry:wand_lightning",
"ebwizardry:wand_necromancy",
"ebwizardry:wand_earth",
"ebwizardry:wand_sorcery",
"ebwizardry:wand_healing"
]
},
"magic_missile_spell_book": {
"locations": [ "ebwizardry:magic_missile_spell_book" ]
},
"wizard_handbook": {
"locations": [ "ebwizardry:wizard_handbook" ]
},
"crystal_flower_to_crystals": {
"locations": [ "ebwizardry:crystal_flower_to_crystals" ]
},
"crystal_blocks": {
"locations": [
"ebwizardry:crystal_block",
"ebwizardry:crystal_block_fire",
"ebwizardry:crystal_block_ice",
"ebwizardry:crystal_block_lightning",
"ebwizardry:crystal_block_necromancy",
"ebwizardry:crystal_block_earth",
"ebwizardry:crystal_block_sorcery",
"ebwizardry:crystal_block_healing"
]
},
"crystal_blocks_to_crystals": {
"locations": [
"ebwizardry:crystal_block_to_crystals",
"ebwizardry:crystal_block_to_crystals_fire",
"ebwizardry:crystal_block_to_crystals_ice",
"ebwizardry:crystal_block_to_crystals_lightning",
"ebwizardry:crystal_block_to_crystals_necromancy",
"ebwizardry:crystal_block_to_crystals_earth",
"ebwizardry:crystal_block_to_crystals_sorcery",
"ebwizardry:crystal_block_to_crystals_healing"
]
},
"crystal_shard": {
"locations": [ "ebwizardry:crystal_shard" ]
},
"small_mana_flask": {
"locations": [ "ebwizardry:small_mana_flask" ]
},
"medium_mana_flask": {
"locations": [ "ebwizardry:medium_mana_flask" ]
},
"large_mana_flask": {
"locations": [ "ebwizardry:large_mana_flask" ]
},
"runestone": {
"locations": [
"ebwizardry:runestone_fire",
"ebwizardry:runestone_ice",
"ebwizardry:runestone_lightning",
"ebwizardry:runestone_necromancy",
"ebwizardry:runestone_earth",
"ebwizardry:runestone_sorcery",
"ebwizardry:runestone_healing"
]
},
"runestone_pedestal": {
"locations": [
"ebwizardry:runestone_pedestal_fire",
"ebwizardry:runestone_pedestal_ice",
"ebwizardry:runestone_pedestal_lightning",
"ebwizardry:runestone_pedestal_necromancy",
"ebwizardry:runestone_pedestal_earth",
"ebwizardry:runestone_pedestal_sorcery",
"ebwizardry:runestone_pedestal_healing"
]
},
"transportation_stone": {
"locations": [ "ebwizardry:transportation_stone" ]
},
"magic_silk": {
"locations": [ "ebwizardry:magic_silk" ]
},
"wizard_hat": {
"locations": [ "ebwizardry:wizard_hat" ]
},
"wizard_robe": {
"locations": [ "ebwizardry:wizard_robe" ]
},
"wizard_leggings": {
"locations": [ "ebwizardry:wizard_leggings" ]
},
"wizard_boots": {
"locations": [ "ebwizardry:wizard_boots" ]
},
"blank_scroll": {
"locations": [ "ebwizardry:blank_scroll" ]
},
"firebomb": {
"locations": [ "ebwizardry:firebomb" ]
},
"poison_bomb": {
"locations": [ "ebwizardry:poison_bomb" ]
},
"smoke_bomb": {
"locations": [ "ebwizardry:smoke_bomb" ]
},
"spark_bomb": {
"locations": [ "ebwizardry:spark_bomb" ]
}
},
"sections": {
"inside_cover": {
"centre": {
"x": true,
"y": true
},
"text": [
"巫师手札",
"By Electroblob"
]
},
"introduction": {
"title": "介绍",
"text": [
"向你致以敬意, 巫师! 这本书介绍了数种魔法类别以及如何操纵这些元素。 我必须提醒你,这本书并不只是像现在这样,看起来十分普通 —— 当你在不断地探索这个世界时,书中新的内容会不断地具现出来。",
"点击单箭头按钮可以切换页数, 点击双箭头按钮可以在章节之间切换. 点击中心按钮可以返回目录。",
"点击紫色的链接将会直接跳转到相关页面, 右键书签将会把书签移动到当前页面, 左键书签将会返回标记页面。"
]
},
"main_contents": {
"title": "内容",
"contents": {
"id": "main_contents",
"hyperlinks": true,
"page_numbers": true,
"separator": "."
}
},
"setting_up": {
"title": "在最开始",
"include_in_contents": "main_contents",
"text": [
"想要开始你的巫术之旅,你需要:",
"- 一把魔杖, 合成如下所示:",
"#recipe magic_wand",
"- 一个 @arcane_workbench 奥术工作台@ , 合成如下所示:",
"#recipe arcane_workbench",
"- 一本 @spells 法术@ 书. 你可以在战利品箱发现咒语书, 它也会以掉落物形式出现,你也可以与其他巫师交易。当然你也可以制作一本初始的魔法书, 魔法飞弹, 如下所示:",
"#recipe magic_missile_spell_book",
"你还要准备大量的魔法水晶,为你的魔杖注入 @mana 魔力@ ."
]
},
"mana": {
"title": "魔力",
"include_in_contents": "main_contents",
"triggers": [
"ebwizardry:crystal"
],
"text": [
"魔力作为一种奥术能量,是巫师力量的来源。 它自身并不是某种物质; 它是无处不在的场域,充塞于世界上的一切之中. 特殊的情况下,它会以水晶的形式在自然中出现, 通常会镶嵌于地底的石头中. @wands 魔杖@ 可以储存魔力, 而这些魔力会被你引导到你所释放的 @spells 法术@ 中。不同的法术需要的法力各不一样, 魔力损耗取决于法术威力以及时长。",
"#image crystal_ore",
"#image magic_crystal",
"人们普遍认为魔力无法被创生或毁灭, 当释放法术时, 法术所引导的魔力会消散到周围环境中. 这确实是魔力最广泛地存在形式 - 散布于世界的各个角落。然而, 一旦需要利用这些魔力, 你必须将其凝合起来, 就像历经几千年而形成的地底水晶一样。又或者通过人工的方式将其聚合 - 这一精深的课题已经超出了本书的范围了. 当然,也存在着一些方法,能够让你的魔力使用效率提高,或者在施法过程中恢复一些魔力消耗。"
]
},
"wands": {
"title": "魔杖",
"include_in_contents": "main_contents",
"triggers": [
"ebwizardry:arcane_initiate"
],
"text": [
"魔杖是巫师的工具。你能够释放任何你的魔杖能够释放的@spells 法术@ (参见 @tiers 等阶@ ). 魔杖有许多种类型 ,但可以肯定的是,你需要从一把基础魔杖来开启你的巫师之旅。",
"#image magic_wand",
"大多数魔杖的制作,在最开始时无比的简单,将一块魔法水晶固定在木棍的一端,而另一端镶嵌一粒金粒。魔法水晶是魔杖力量的来源, 它提供了必要的,用来引导 @spells 法术@ 的核心. 魔杖的其它部分也很重要, 它不仅能让你方便的手持魔杖进行施法, 而且还作为引导和定向 @mana 魔力@ 流动的通路。",
"随着魔杖释放的法术越多, 它引导 @spells 法术@ 的效率会越来越高, 因此可以可以用它来施放更强大的魔法。这种效果可以从魔杖本身的形状和外观上的细微变化中看出: 而随着魔杖变得越来越强大, 它的魔法晶体将会变得更有活力, 水晶的颜色取决于 @elements 元素@ , 随着魔杖的强化, 制作它的木材将会生长和扭曲,形成更复杂的形状。",
"拿着魔杖的时候, 一个状态显示将会出现在屏幕的角落. 这表示当前选中的咒语及其图形表示, 并且,如果当前法术被施放,指示该法术可以再次施放的时间的冷却条将会显示冷却时间。 它还能显示与魔杖当前使用的法术相连的上一个和下一个咒语的名称. 如要在咒语间切换, 使用 #next_spell_key 和 #previous_spell_key 键 (这些都可以在 选项 -> 控制 中修改). 你也可以在潜行时通过滚动鼠标滚轮来切换咒语。",
"查看库存时, 将鼠标悬停在一根魔杖上,就会显示出还有多少 @mana 魔力@ 储存在其中, 以及当前所应用的 @spells 法术@ 以及任何特殊的能力. 想要查询魔杖的更详细的信息,可将其放置在 @arcane_workbench 奥术工作台@ ."
]
},
"spells": {
"title": "法术",
"include_in_contents": "main_contents",
"triggers": [
"ebwizardry:handbook/spells"
],
"text": [
"一把 @wands 魔杖@ ,如果没有法术,那你就无法使用它. 法术有两种记录的形式: 永久性的写在咒语书中,或者写在一次性的法术卷轴上",
"咒语书本身没什么用;但它们可以将其所包含的咒语绑定到 @wands 魔杖@ 上. 世界中的很多地方都藏有咒语书,你很快就能找到一本. 当你找到咒语书时,将鼠标悬停在在咒语书上就能看到咒语的基本信息。你也可以在拿着一本咒语书右键来阅读更多关于它的内容。",
"卷轴有不同的用途: 右键将会施放与之绑定的法术, 在此过程中卷轴会销毁。像咒语书一样,卷轴可以在世界各地找到,但你也可以自己制作(参见 @enchanting_scrolls 附魔卷轴@ ).",
"当你需要在一些特定的情形下中使用少量特殊的法术,但又不想占用你的 @wands 魔杖@ 格位时,卷轴将会发挥巨大的作用。然而,我必须提醒你,与使用魔杖相比,使用卷轴是一种效率低下的施法方法。",
"对不了解该法术的人而言, 那些用于书写咒语书的魔法符文实在是令人头疼。为了鉴定一个咒语,你可以尝试施放该法术,看看会发生什么 - 尽管这样做可能会产生副作用, 而且许多法术需要一定的条件才能生效。更重要的是,在施放一个你不了解的法术时,总会有误读该法术的可能, 而那些由误读而带来的潜在的危险的强度则取决于该法术的威力.一个更安全、更可靠的选择是使用鉴定卷轴,你可以在箱子里找到或者从巫师那里买到. 手持鉴定卷轴右键,将会识别第一个你所不知道的法术,该过程先将快捷栏的右边开始,然后向左依次检索, 鉴定完毕会消耗鉴定卷轴。"
]
},
"arcane_workbench": {
"title": "奥术工作台",
"include_in_contents": "main_contents",
"contents": {
"id": "arcane_workbench_subsections",
"hyperlinks": true,
"page_numbers": true,
"separator": "."
},
"triggers": [
"ebwizardry:handbook/arcane_workbench"
],
"text": [
"奥术工作台外观上与附魔台很相似,它可以用来为你的魔杖充能、升级 ,以及绑定 @spells 法术@ 到你的 @wands 魔杖@ 。制作方法如下所示:",
"#recipe arcane_workbench",
"以下内容展示了在奥术工作台中可以执行的操作。",
"#image workbench"
],
"sections": {
"binding_spells": {
"title": "绑定法术",
"include_in_contents": "arcane_workbench_subsections",
"triggers": [
"ebwizardry:handbook/arcane_workbench"
],
"text": [
"想要绑定@spells 法术@到你的@wands 魔杖@, 只需将你的魔杖放在工作台中间的凹槽里,然后把咒语书放在周围的一个槽里,然后点击“应用”按钮即可. 你会注意到咒语书在这个过程中并没有发生变化 - 这是因为法术绑定行为不会从咒语书中“取走”法术; 相反,它使魔杖与法术相协调。你可以通过简单地重复法术绑定过程来改变你魔杖上的法术。你可以一次性在一根魔杖上绑定五种法术, 而这个数字可能随魔杖协调升级而增加"
]
},
"charging_wands": {
"title": "魔杖充能",
"include_in_contents": "arcane_workbench_subsections",
"triggers": [
"ebwizardry:handbook/arcane_workbench"
],
"text": [
"想要充能你的 @wands 魔杖@ , 把魔杖放在奥术工作台的中央凹槽里,然后把一些魔法水晶放在左下角的凹槽里, 然后点击“应用”按钮。每个水晶含有#mana_per_crystal @mana 魔力@, 充能时魔杖不会过量吸收魔力, 所以你可以在工作台中常备一些水晶,以便不时之需。不过要记住,魔杖只能吸收一整个水晶中的魔力, 例如,增加30点法力, #example_charging_loss 魔力将会损失。."
]
},
"upgrading_wands": {
"title": "升级魔杖",
"include_in_contents": "arcane_workbench_subsections",
"triggers": [
"ebwizardry:handbook/tome_of_arcana"
],
"text": [
"为了升级你的 @wands 魔杖@ , 你需要一本适当 @tiers 等阶@ 的奥义之书 或者一些特殊的魔杖升级. 两者都可以作为战利品或者从巫师那里购买. 想要升级你的魔杖, 把它放在中央凹槽,升级物品放置在右上角凹槽,然后点击应用。",
"特殊的魔杖升级可以改善魔杖某个方面的能力。每种类型的升级最多可以叠加三次,一根魔杖可以升级的总数取决于它的等级。魔杖的升级不能被移除。"
]
},
"enchanting_scrolls": {
"title": "附魔卷轴",
"include_in_contents": "arcane_workbench_subsections",
"triggers": [
"ebwizardry:handbook/scrolls"
],
"text": [
"奥术工作台也可以用来附魔 @spells 法术@ 卷轴。首先,你需要一个空白卷轴, 空白卷轴由线和纸组成, 以及一本法术书, 还有足够的 @mana 魔力@ 能够成功使其拓印在其上。",
"#recipe blank_scroll",
"将魔法水晶放在左下的凹槽, 空白卷轴放置在中央凹槽, 将一本法术书放置在周围凹槽, 点击应用来附魔该卷轴。"
]
}
}
},
"wizard_armour": {
"title": "巫师护具",
"include_in_contents": "main_contents",
"triggers": [
"ebwizardry:arcane_initiate"
],
"text": [
"作为一名巫师, 你需要一些东西在战斗时保护你不受过高的伤害,普通的盔甲明显不。 充分利用你的魔法, 你需要一套巫师护具: 帽子、长袍、裤子和靴子。 与普通盔甲不同的是,它们耐久归零之后不会消失。 相反,蕴藏在其中的奥术能量将会保护穿戴者。当然,这意味着它们必须使用水晶充能, 这一点和魔杖很相似。幸运的是, 这些衣服不太消耗@mana 魔力@. 你可以像和魔杖那样,将其放置在 @arcane_workbench 奥术工作台@ ,或者使用 @mana_flasks 魔力瓶@ 为其充能, 但是要小心-如果护具们耗尽了魔力,它们将不再提供任何保护。",
"#image wizard_armour",
"你可以用魔法绸缎制造巫师护具:",
"#recipe magic_silk",
"#recipe wizard_hat",
"#recipe wizard_robe",
"#recipe wizard_leggings",
"#recipe wizard_boots",
"你可以用附魔台为巫师护具附魔,而因为魔法绸缎的固有属性, 它们倾向于被附魔上能够使它们留存的更久的附魔. 对巫师具有特殊的实用价值为魔法,冰霜,雷电保护附魔, 这些附魔可以有效抵御其它巫师的进攻。",
"那些沉迷于练习单系魔法的巫师,有时会穿上可以给予额外魔法增益的服装。全套这样的服装在巫师群体中很受欢迎,所以并不容易找到。",
"在传说中,最强大的巫师使用一种神秘的封印来提高他们的护甲。"
]
},
"magical_world": {
"title": "魔法世界",
"include_in_contents": "main_contents",
"contents": {
"id": "magical_world_subsections",
"hyperlinks": true,
"page_numbers": true,
"separator": "."
},
"triggers": [
"ebwizardry:handbook/on_subsection_unlock"
],
"text": [
"一个人仅仅呆在家里是无法掌握奥术之力的 - 这个充塞着魔力的世界等待着你的探索! 古代遗迹,还有那些神秘的,抱着善意或者恶意的生物等待着你发现 - 如果你知道它们在哪。最伟大的巫师往往有着强烈的好奇心, 他们通过对周围环境的探索获得大量的知识和力量, 然后通过实验去验证他们所发现的。",
"而巫师的大部分时间都是一个人度过的, 然而与他人分享彼此的知识,对学习奥术也很重要。寻找那些先行者,尽可能多地向他们学习:交流可以说是最强大的力量了。"
],
"sections": {
"crystal_flowers": {
"title": "魔法水晶花",
"include_in_contents": "magical_world_subsections",
"triggers": [
"ebwizardry:handbook/crystal_flowers"
],
"text": [
"在你的旅行中,你可能在野外会不时地遇到一种奇怪的,发光的花. 这些独特的花朵被称为水晶花,它们能够高效的聚集 @mana 魔力@ - 直到今天,还没有人能确定它高效聚集魔力的原因。但是我们知道,它们可以被收集和制作成魔法水晶,使得它们成为相当有用的地上的魔力来源。然而,因为花的尺寸很小,而且它们无法密集生长,所以通过这种方式收获的魔力并不是很多,",
"#image crystal_flower",
"#recipe crystal_flower_to_crystals"
]
},
"wizard_towers": {
"title": "巫师塔",
"include_in_contents": "magical_world_subsections",
"triggers": [
"ebwizardry:wizard_tower"
],
"text": [
"不要害怕 —— 你不是这个世界上唯一一个使用魔法的人。 在旅行途中,你很可能会遇到一两个有着独特尖顶的高塔。这是其它巫师的住所。孤独的生活有时会让巫师有点暴躁,但他们通常都很友好,愿意与你分享他们的知识 —— 尽管是有代价的。你可以给予他们贵重金属和宝石,作为回报,你将得到许多珍贵的奥术知识。",
"然而,如果你寻找的是 @tiers 大师@ 法术, 你需要去找那些专业人士。",
"#image wizard_tower",
"不幸的是,有一些巫师不欢迎访客的到来。这些巫师早已被逐出巫师群体, 他们对任何路过此地的人抱有敌意. 与这些人打交道要格外谨慎, 并做好防御强大魔法的准备。打败他们,他们的知识就是你的了。",
"还应该指出的是,没有哪个巫师会乐意被攻击或被偷 - 他们更喜欢按他们的规矩来。"
]
},
"obelisks": {
"title": "方尖碑",
"include_in_contents": "magical_world_subsections",
"triggers": [
"ebwizardry:handbook/obelisks"
],
"text": [
"古代魔法遗迹散布在世界各地, 其中最著名的是雕刻着许多符号和符文的石头建筑. 这些遗迹似乎是某种古代文明的遗迹。不管是谁,或者是什么东西建造了它们,它们显然拥有相当丰富的魔法知识, 并使用这些知识在这些地方设置了保护魔法,直到今天还在生效。",
"这些结构大致可分为两类. 第一个,也是最常见的,是方尖碑: 符文石制成的尖顶, 底部有一个开放的结构,其中为次要的魔法遗迹,你在上面还能感受到残留着的被遗忘的过去的气息",
"#image obelisk",
"这些建筑通常受到魔法的保护,一旦有人离得太近,就会召唤敌对 @creatures 生物@ 。击退这些生物并摧毁它们的源头,那么这个遗迹的财富就是你的了。"
]
},
"shrines": {
"title": "祭坛",
"include_in_contents": "magical_world_subsections",
"triggers": [
"ebwizardry:visit_shrine"
],
"text": [
"第二种,也是比较少见的一种,被称为祭坛。这些结构由围绕着中心基座的一圈符文石柱组成, 上面放置着一个箱子,里面装满了古代的 @artefacts 圣遗物@ . 这个箱子通常被一个奥术锁保护着, 防止任何人打开它,除了箱子的主人。整个结构也被一个控制场域保护着, 防止任何离得太近的东西逃跑。",
"#image shrine",
"只要发现祭坛的强大魔力和其重要性, 就不用提里面的财富是多么珍贵了, 这些结构对任何有抱负的巫师都特别有吸引力 - 但是要谨慎。有很多关于巫师被困在封闭空间里,慢慢被逼疯的报道,也许是因为幽闭恐惧症。 然而,越来越多的人相信这种情况的发生也是神殿保护魔法的一部分, 被困在里面的巫师实际上是被控制来保护该结构的。 对于任何胆敢靠近的人来说,这无疑令人不寒而栗....."
]
},
"creatures": {
"title": "魔法生物",
"include_in_contents": "magical_world_subsections",
"triggers": [
"ebwizardry:handbook/magical_creatures"
],
"text": [
"除了巫师,许多其他生物也使用魔法。这些生物很多从出生开始就拥有魔力,而且大部分会施放 @spells 法术@ . 其中一种你可能会在守卫 @obelisks 方尖碑@ 的生物中看到,他们可能是由更强大的召唤师召唤而来。甚至偶尔能够在野外中被发现魔法能力不强的生物。"
]
},
"artefacts": {
"title": "圣遗物",
"include_in_contents": "magical_world_subsections",
"triggers": [
"ebwizardry:artefact"
],
"text": [
"当你在探索神殿时,你可能会幸运地发现一些古老的魔法制品 —— 一些能赋予穿戴者独特而强大的魔法和特殊能力的物品。已发现三种类型: 戒指,给予法术增幅和额外效果,护身符,提高防御能力,还有符咒,能产生特殊效用。 这些魔法制物似乎只有在正确佩戴时才能发挥作用; 简单地把它们放在身上无法发挥效果。"
]
}
}
},
"tiers": {
"title": "等阶",
"include_in_contents": "main_contents",
"triggers": [
"ebwizardry:handbook/tome_of_arcana"
],
"text":[
"@wands 魔杖@ 和 @spells 法术@ 分成四阶: #colour_novice新手#colour_reset, #colour_apprentice学徒#colour_reset, #colour_advanced进阶 #colour_reset 和 #colour_master大师#colour_reset.每一阶都比上一阶更强大。",
"#image tiers",
"#colour_novice新手 #colour_reset魔杖 魔杖可以手工制作. 它们可以容纳 #novice_max_charge 魔力, 且只可以释放基础法术. 基础法术很简单,任何人都可以使用,而且通常情况下不会消耗很多法力。然而,这并不一定意味着在你步入更高等阶后,它们就没有用处了; 即便你已经可以使用大师级魔法,基础法术低廉的魔力消耗依然使得它们备受青睐。",
"#colour_apprentice学徒 #colour_reset魔杖 是新手的下一等阶. 学徒级魔杖可容纳 #apprentice_max_charge 魔力 可以施放基础和学徒法术。学徒法术比新手法术更令人眼前一亮,但通常魔力消耗更多。",
"#colour_advanced进阶 #colour_reset魔杖 魔杖是相当罕见的,而且更强大. 他们可以使用除大师法术以外的所有法术,并能够容纳 #advanced_max_charge 魔力. 进阶法术能够带来超越人类极限的能力,譬如隐形,以及为你的敌人带来浩劫。",
"#colour_master大师 #colour_reset魔杖 魔杖是世界上最强大的魔杖. 他们能够容纳 #master_max_charge 魔力, 并且能够随意施展任何法术.大师等阶的咒语书是非常罕见的,这些法术不仅可以对敌人造成彻底的破坏,甚至可以对世界本身造成破坏。请务必谨慎使用。",
"要升级到更高的等级,一根魔杖首先要有足够的力量来引导该等级的法术。魔杖在施法时会增进自身。法术种类、法术强度、元素效果和其他外部因素都会影响魔杖的成熟速度。",
"一旦一根魔杖足够强大,一本奥义之书就是魔杖提升到下一层所需的最后催化剂 (参见 @upgrading_wands 升级魔杖@ ), 升级过后,魔杖又可以继续成长到下一等阶。"
]
},
"elements": {
"title": "元素",
"include_in_contents": "main_contents",
"triggers": [
"ebwizardry:handbook/elements"
],
"text": [
"@spells 法术@ 分属于不同的元素 , 元素决定了法术的本质并且决定了它会在何种 @wands 魔杖@ 中获得增幅。",
"#image elements",
"#colour_fire火焰#colour_reset \n 它或许是最具破坏性的元素, 火与燃烧、熔岩和爆炸有关。 一位强大的舞焰师能够释放出地狱烈焰灼烧他的敌人,并可能在这个过程中点燃整个世界。大多数攻击型火焰法术都会点燃目标,造成持续的伤害。然而,要注意火系法术可能对下界生物没有效果。",
"#colour_ice冰霜#colour_reset \nThe 冰元素囊括了所有与寒冷有关的事物,冰霜法术通常会让敌人减速或者完全冻结,对火焰生物能造成额外伤害。冰霜魔法在战斗之外也同样有用,比如冻住河流,让你方便的过河。",
"#colour_lightning雷电#colour_reset \n 这种元素与闪电,风暴和天气有关。绝不可忽视的一位强大的驯雷师的力量,他们能够使雷电屈从于他们的意志。闪电法术通常能够一次性伤害多个敌人,并且能够自动寻找目标,使他们有效地攻击任何生物…… 但是要小心爬行者。",
"#colour_necromancy死灵#colour_reset \n 死灵元素与黑暗, 混乱与亡灵相关. 操纵死灵元素的巫师是神秘的,通常被认为是邪恶的,虽然通常不是这样。死灵法术通常能够召唤 @creatures 魔法生物@ 为你而战,甚至可以扭曲你的敌人的意志。",
"#colour_earth大地#colour_reset \nThe 大地元素专注于自然之中: 动物,植物,风,以及与这些相似的。大地魔法种类繁多,形式多样,从毒害敌人到释放天气狂暴的一面。大地法术集合了攻击、防御和效用类法术。",
"#colour_sorcery秘术#colour_reset \n 秘术元素与力场与变化. 巫师操纵光、重力甚至是现实本身来满足他们的需要。此外,秘术法术可以赋予施法者奇特的魔法能力,或者移动其它目标。",
"#colour_healing治愈#colour_reset \n 治愈元素关注防御和再生的能力,治疗师尽可能多地保护他们自己和他们的盟友,因此在特殊情况下会非常难对付。虽然一般不用于攻击,但某些治疗法术的净化之光会对亡灵造成相当大的伤害。治疗法术在战斗中是必不可少的。",
"不同元素之间的界限并不总是泾渭分明的,有些法术反而具有其它元素的特征。",
"如果幸运的话,你可能会遇到元素水晶。元素水晶是一种魔法水晶,它在生长过程中吸收了元素属性 - 尽管这种情况发生的条件和机制仍然是一个谜。 然而,我们确实知道,这些水晶可以用来制造单元素魔杖,这种魔杖会增幅与其相对应的元素的法术强度。"
]
},
"miscellaneous": {
"title": "杂项",
"include_in_contents": "main_contents",
"contents": {
"id": "miscellaneous_subsections",
"hyperlinks": true,
"page_numbers": true,
"separator": "."
},
"triggers": [
"ebwizardry:on_subsection_unlock"
],
"sections": {
"mana_flasks": {
"title": "魔力瓶",
"include_in_contents": "miscellaneous_subsections",
"triggers": [
"ebwizardry:handbook/mana_flasks"
],
"text": [
"Arkendur的魔法物品供应 - 我们有你所想要的魔法物品!",
"想要在旅途中充能你的 @wands 魔杖@ ? 没问题! @mana 魔力@ 现在可以装瓶了。将八颗魔法水晶放入玻璃瓶中,魔法瓶的制作就这样简简单单。 当你想使用它时, 将它与你的魔杖合成一下,它将会为你的魔杖恢复一些魔力。",
"#recipe medium_mana_flask",
"新品!让我们为你介绍崭新的小型魔力瓶和大型魔力瓶 - 现在你可以根据你的需要来挑选适合大小的魔力瓶!",
"#recipe small_mana_flask",
"#recipe large_mana_flask",
"* 这个过程会破坏瓶子。装瓶过程中会不可避免的损失一些魔力。"
]
},
"throwable_items": {
"title": "投掷物",
"include_in_contents": "miscellaneous_subsections",
"triggers": [
"ebwizardry:handbook/throwables"
],
"text": [
"有许多 @spells 法术@ 召唤出物理实体的投掷物, 有些还可以直接制作。 燃烧弹, 毒气弹, 电击弹, 烟雾弹都可以制造:",
"#recipe firebomb",
"#recipe poison_bomb",
"#recipe smoke_bomb",
"#recipe spark_bomb"
]
},
"automated_casting": {
"title": "施法自动化",
"include_in_contents": "miscellaneous_subsections",
"triggers": [
"ebwizardry:enchant_scroll"
],
"text": [
"最近的实验表明,自动化释放 @spells 法术@ 是可能的, 只用一个简单的发射器就可以办到了。 没有人确切知道其中的原理, 但似乎红石的奇怪属性能够激活法术卷轴。在发射器里放一些法术卷轴,然后给它通上红石信号就可以了。"
]
}
}
},
"crafting_recipes": {
"title": "合成配方",
"include_in_contents": "main_contents",
"text": [
"#recipe arcane_workbench",
"#recipe novice_wands",
"#recipe magic_missile_spell_book",
"#recipe wizard_handbook",
"#recipe crystal_flower_to_crystals",
"#recipe crystal_blocks",
"#recipe crystal_blocks_to_crystals",
"#recipe crystal_shard",
"#recipe small_mana_flask",
"#recipe medium_mana_flask",
"#recipe large_mana_flask",
"#recipe runestone",
"#recipe runestone_pedestal",
"#recipe transportation_stone",
"#recipe magic_silk",
"#recipe wizard_hat",
"#recipe wizard_robe",
"#recipe wizard_leggings",
"#recipe wizard_boots",
"#recipe blank_scroll",
"#recipe firebomb",
"#recipe poison_bomb",
"#recipe smoke_bomb",
"#recipe spark_bomb"
]
},
"credits": {
"title": "Credits",
"include_in_contents": "main_contents",
"text": [
"Electroblob's Wizardry \nVersion #version \nFor Minecraft #mcversion",
"Designed, coded and textured by Electroblob",
"Thanks to Minecraft Forge and MCP, without which this mod would not have been possible.",
"Thanks also to the Minecraft modding community, which always has an answer to my modding problems!",
"In addition, I'd like to thank the following individuals for their contributions to the mod:",
"Code:",
"- Corail31 \n- 12foo \n- Shadows-of-Fire \n- HellFirePvP \n- Tora-B \n- Avatair \n- Aeronica",
"Translations:",
"- Spanish: MadWrist, Alsentar \n- Mexican Spanish: MadWrist \n- Russian: VilagVil, kellixon, bigenergy \n- French: Hahdrim \n- Brazilian Portuguese: lorrampi \n- Chinese: ZHENGLOC, dragon-evol, Hokorizero, TUsama \n- Korean: shejery, rewi_wire \n- Polish: Trozuu \n-German: BirdyDragon",
"Lightning ray sound effect from OhhWowProductions",
"For more information, check out the @https://github.com/Electroblob77/Wizardry/wiki wiki@.",
"Can't get enough wizardry? Join the @https://discord.gg/MTmMzMv Discord server@ for the latest news, discussions and extras!"
]
}
}
}
@@ -0,0 +1,750 @@
{
"bookmark_start_section": "introduction",
"colours": {
"text": "#000000",
"caption": "#666666",
"hyperlink": "#601ba0",
"highlight": "#dd4c1d",
"new_section": "#ee88f7"
},
"images": {
"workbench": {
"location": "ebwizardry:textures/gui/arcane_workbench_picture.png",
"caption": "法術工作台",
"u": 0,
"v": 0,
"width": 110,
"height": 110
},
"crystal_ore": {
"location": "ebwizardry:textures/gui/ore_picture.png",
"caption": "水晶礦",
"u": 0,
"v": 0,
"width": 64,
"height": 64
},
"magic_crystal": {
"location": "ebwizardry:textures/items/crystal_magic.png",
"caption": "魔法水晶",
"u": 6,
"v": 6,
"width": 36,
"height": 33,
"texture_width": 48,
"texture_height": 48,
"border": false
},
"magic_wand": {
"location": "ebwizardry:textures/items/wand_novice.png",
"caption": "法杖",
"u": 0,
"v": 0,
"width": 64,
"height": 64,
"border": false
},
"crystal_flower": {
"location": "ebwizardry:textures/gui/flower_picture.png",
"caption": "水晶花",
"u": 0,
"v": 0,
"width": 48,
"height": 48
},
"wizard_tower": {
"location": "ebwizardry:textures/gui/tower_picture.png",
"caption": "法師塔",
"u": 0,
"v": 0,
"width": 110,
"height": 110
},
"wizard_armour": {
"location": "ebwizardry:textures/gui/armour_picture.png",
"caption": "法師服",
"u": 0,
"v": 0,
"width": 90,
"height": 90
},
"obelisk": {
"location": "ebwizardry:textures/gui/obelisk_picture.png",
"caption": "方尖碑",
"u": 0,
"v": 0,
"width": 110,
"height": 67
},
"shrine": {
"location": "ebwizardry:textures/gui/shrine_picture.png",
"caption": "神殿",
"u": 0,
"v": 0,
"width": 110,
"height": 67
},
"tiers": {
"location": "ebwizardry:textures/gui/tiers_picture.png",
"caption": "四種等級的法杖",
"u": 0,
"v": 0,
"width": 96,
"height": 24,
"border": false
},
"elements": {
"location": "ebwizardry:textures/gui/elements_picture.png",
"caption": "七種法術元素",
"u": 0,
"v": 0,
"width": 106,
"height": 20,
"border": false
}
},
"recipes": {
"arcane_workbench": {
"locations": [ "ebwizardry:arcane_workbench" ]
},
"magic_wand": {
"locations": [ "ebwizardry:magic_wand" ]
},
"novice_wands": {
"locations": [
"ebwizardry:magic_wand",
"ebwizardry:wand_fire",
"ebwizardry:wand_ice",
"ebwizardry:wand_lightning",
"ebwizardry:wand_necromancy",
"ebwizardry:wand_earth",
"ebwizardry:wand_sorcery",
"ebwizardry:wand_healing"
]
},
"magic_missile_spell_book": {
"locations": [ "ebwizardry:magic_missile_spell_book" ]
},
"wizard_handbook": {
"locations": [ "ebwizardry:wizard_handbook" ]
},
"crystal_flower_to_crystals": {
"locations": [ "ebwizardry:crystal_flower_to_crystals" ]
},
"crystal_blocks": {
"locations": [
"ebwizardry:crystal_block",
"ebwizardry:crystal_block_fire",
"ebwizardry:crystal_block_ice",
"ebwizardry:crystal_block_lightning",
"ebwizardry:crystal_block_necromancy",
"ebwizardry:crystal_block_earth",
"ebwizardry:crystal_block_sorcery",
"ebwizardry:crystal_block_healing"
]
},
"crystal_blocks_to_crystals": {
"locations": [
"ebwizardry:crystal_block_to_crystals",
"ebwizardry:crystal_block_to_crystals_fire",
"ebwizardry:crystal_block_to_crystals_ice",
"ebwizardry:crystal_block_to_crystals_lightning",
"ebwizardry:crystal_block_to_crystals_necromancy",
"ebwizardry:crystal_block_to_crystals_earth",
"ebwizardry:crystal_block_to_crystals_sorcery",
"ebwizardry:crystal_block_to_crystals_healing"
]
},
"crystal_shard": {
"locations": [ "ebwizardry:crystal_shard" ]
},
"small_mana_flask": {
"locations": [ "ebwizardry:small_mana_flask" ]
},
"medium_mana_flask": {
"locations": [ "ebwizardry:medium_mana_flask" ]
},
"large_mana_flask": {
"locations": [ "ebwizardry:large_mana_flask" ]
},
"runestone": {
"locations": [
"ebwizardry:runestone_fire",
"ebwizardry:runestone_ice",
"ebwizardry:runestone_lightning",
"ebwizardry:runestone_necromancy",
"ebwizardry:runestone_earth",
"ebwizardry:runestone_sorcery",
"ebwizardry:runestone_healing"
]
},
"runestone_pedestal": {
"locations": [
"ebwizardry:runestone_pedestal_fire",
"ebwizardry:runestone_pedestal_ice",
"ebwizardry:runestone_pedestal_lightning",
"ebwizardry:runestone_pedestal_necromancy",
"ebwizardry:runestone_pedestal_earth",
"ebwizardry:runestone_pedestal_sorcery",
"ebwizardry:runestone_pedestal_healing"
]
},
"transportation_stone": {
"locations": [ "ebwizardry:transportation_stone" ]
},
"magic_silk": {
"locations": [ "ebwizardry:magic_silk" ]
},
"wizard_hat": {
"locations": [ "ebwizardry:wizard_hat" ]
},
"wizard_robe": {
"locations": [ "ebwizardry:wizard_robe" ]
},
"wizard_leggings": {
"locations": [ "ebwizardry:wizard_leggings" ]
},
"wizard_boots": {
"locations": [ "ebwizardry:wizard_boots" ]
},
"blank_scroll": {
"locations": [ "ebwizardry:blank_scroll" ]
},
"firebomb": {
"locations": [ "ebwizardry:firebomb" ]
},
"poison_bomb": {
"locations": [ "ebwizardry:poison_bomb" ]
},
"smoke_bomb": {
"locations": [ "ebwizardry:smoke_bomb" ]
},
"spark_bomb": {
"locations": [ "ebwizardry:spark_bomb" ]
}
},
"sections": {
"inside_cover": {
"centre": {
"x": true,
"y": true
},
"text": [
"法師手冊",
"作者: Electroblob\n\n翻譯: Grant"
]
},
"introduction": {
"title": "前言",
"text": [
"你好啊,法師!\n\n本書介紹許多法術相關事物及使用方式。 這不是一本普通的書,其內容會隨著你在魔法世界的探索而逐漸呈現。",
"使用箭頭按鈕來翻頁,按下雙箭頭按鈕則可快速的切換章節,而中間的選單按鈕則是翻回主目錄頁面。",
"點擊任何紫色連結文字直接跳至相關頁面。對書籤點擊滑鼠右鍵可將書籤移到目前這頁,對書籤點擊滑鼠左鍵則可翻回書籤那頁。"
]
},
"main_contents": {
"title": "目錄",
"contents": {
"id": "main_contents",
"hyperlinks": true,
"page_numbers": true,
"separator": "."
}
},
"setting_up": {
"title": "準備",
"include_in_contents": "main_contents",
"text": [
"要開始使用法術,你需要準備:",
"》法杖, 請依圖示合成:",
"#recipe magic_wand",
"\n\n》@arcane_workbench 法術工作台@ 合成方式如圖:",
"#recipe arcane_workbench",
"》@spells 法術書@\n這個可以在箱子裡找到,或從怪物身上掉落,或向法師購買。\n\n\n\n不然你也可以自己合成一個\n初學者法術【魔法彈】,\n如圖所示:",
"#recipe magic_missile_spell_book",
"你還需要準備一大堆魔法水晶\n來為法杖供應@mana 法力@。"
]
},
"mana": {
"title": "法力",
"include_in_contents": "main_contents",
"triggers": [
"ebwizardry:crystal"
],
"text": [
"法力是賦予法師力量的魔法能量,其本身並非實體的物質,反而是可滲入於萬物之中的永恆能量。特別的是,法力蘊藏在於地下岩石中所找到的天然水晶內。\n@wands 法杖@可儲存法力,並在施法時\n將法力引導到@spells 法術@上。\n不同的法術會依其力量強度及持續時間消耗不同的法力值。",
"#image crystal_ore",
"#image magic_crystal",
"人們普遍認為法力無法被創造或消滅,每當施展法術時,其引導的法力就會散失到周圍環境中。事實上這就是大量的法力散布於世界各處的原因。總之無論要如何使用法力,必須從地底下的天然千年水晶中,或本書未涵蓋的高級人工方式將其收集。還有各種方法使法術更有效的使用法力,以及回收在施法過程中逸散的部分法力。"
]
},
"wands": {
"title": "法杖",
"include_in_contents": "main_contents",
"triggers": [
"ebwizardry:arcane_initiate"
],
"text": [
"法杖是法師首選的器具。\n你能用它來施展任何法杖能力\n所及的@spells 法術@(請參閱@tiers 等級@章節)\n。\n法杖的種類很多,不過當然都得從基礎法杖開始。",
"#image magic_wand",
"大多數的法杖都誕生於一個簡單的製作方式。\n準備一顆某種類型的魔法水晶,\n將水晶裝在木棒的一端,\n再於另一端黏上一顆金粒。\n水晶自然是法杖力量的源頭,\n因為它提供了引導@spells 法術@所需的\n焦點。而其餘的部分也很重要,不只是因為提供了握住法杖的地方,更是指引@mana 法力@前進的路徑\n。",
"隨著法杖施展了愈多法術,\n其變得愈能駕馭@spells 法術@,\n因此也能施展更強大的法術。\n這樣的成長可以從法杖外觀上的細微變化中發現,隨著法杖愈來愈強,水晶會變得更加明亮,\n顏色也可能會根據其@elements 元素@而\n產生變化。過了一段時間之後,法杖本身的木材也會開始扭曲生長成各種複雜的形狀。",
"當你拿著法杖時,畫面的角落會顯示出目前法杖所選的法術及其圖示,而在施放法術之後,還會顯示冷卻條來表示直到下次施展所需等待的時間,它還會顯示法杖中的前一個和下一個法術名稱。按下《#next_spell_key 鍵》及《#previous_spell_key 鍵》可切換法術(這些都可在【選項】->【按鍵設定】中變更),你也可以在潛行時使用滑鼠滾輪來切換法術。",
"當你將游標停留在物品欄的法杖上時,會顯示法杖中儲存的\n@mana 法力@,伴隨目前所選的@spells 法術@及其\n特殊能力。\n將法杖放入@arcane_workbench 法術工作台@則可\n看見更詳細的資訊。"
]
},
"spells": {
"title": "法術",
"include_in_contents": "main_contents",
"triggers": [
"ebwizardry:handbook/spells"
],
"text": [
"沒有法術的@wands 法杖@沒有作用。\n法術的記錄形式有兩種:\n一種是永久性的書本,\n一種是暫時性的卷軸。",
"法術書本身無法使用,而是用於將書中記載的法術存入@wands 法杖@。\n在世界各地都能發現法術書,應該用不了多少時間你就能找到一本。當你找到後,可將游標停留在書上,看一下這本法術書的基本資訊,也可以拿著書點擊滑鼠右鍵以閱讀更詳細的資料。",
"相對而言卷軸則有不同的用途: 拿著卷軸點擊滑鼠右鍵便會施展上面的法術並用掉卷軸。跟法術書一樣,卷軸在世界各地都能找到,但你也可以自己@enchanting_scrolls 製作@。",
"在你準備進行某個任務時,有些法術可能只會用到一兩次,\n所以你不想讓那些法術占用\n你的@wands 法杖@空間,此時卷軸就非常\n有用。不過得注意,比起法杖,卷軸還是效率較差的施法方式。",
"未經訓練的眼睛無法閱讀法術中的魔法符文。然而若要鑑定一個法術,你當然可以冒著發生意外的風險來施展看看結果,但即便如此許多法術是要在特定的條件下才會發生作用。不過即便如此,還是有可能在施法時誤用了未鑑定的法術,其潛在的危險性取決於這個法術有多強大。因此更安全可靠的選擇是使用鑑定卷軸,可以在箱子裡找到或是向法師購買。拿著鑑定卷軸點擊滑鼠右鍵便會用掉卷軸並鑑定你快捷欄中第一個未知的法術書或卷軸。"
]
},
"arcane_workbench": {
"title": "法術工作台",
"include_in_contents": "main_contents",
"contents": {
"id": "arcane_workbench_subsections",
"hyperlinks": true,
"page_numbers": true,
"separator": "."
},
"triggers": [
"ebwizardry:handbook/arcane_workbench"
],
"text": [
"法術工作台看起來有點像附魔台, 用來升級你的@wands 法杖@、\n為其補充法力和存入@spells 法術@。\n\n其合成方式如下:",
"#recipe arcane_workbench",
"接下來的頁面將說明法術工作台的各種功用。",
"#image workbench"
],
"sections": {
"binding_spells": {
"title": "抄寫法術",
"include_in_contents": "arcane_workbench_subsections",
"triggers": [
"ebwizardry:handbook/arcane_workbench"
],
"text": [
"要將@spells 法術@存入你的@wands 法杖@,只要將\n法杖放入工作台中央的槽中,然後將法術書放入周圍其中一個槽並按下按鈕。此時你會注意到,在這個過程中,法術書並沒有受到任何影響,這是因為存入法術的動作,並不是將法術從法術書中取走,只是將法術抄寫至法杖中而已。因此你可以重複這個動作,盡量將想要的法術存入你的法杖。你一次最多只能存入五種法術到法杖中,不過可用協調升級來增加法術存量。"
]
},
"charging_wands": {
"title": "法杖補充法力",
"include_in_contents": "arcane_workbench_subsections",
"triggers": [
"ebwizardry:handbook/arcane_workbench"
],
"text": [
"要幫@wands 法杖@補充法力,先將法杖\n放入法術工作台中央的槽,並在左下方那個槽放入魔法水晶,然後按下按鈕。\n每個水晶相當於#mana_per_crystal點的@mana 法力@,\n而法杖只會在需要時用掉水晶,因此你可以將水晶留在工作台內,以便需要時供應。但是請記得,法杖只能取用整數單位的水晶,舉例來說,如果法杖只需要30點法力,那補充法力時會有#example_charging_loss點法力浪費掉。"
]
},
"upgrading_wands": {
"title": "升級法杖",
"include_in_contents": "arcane_workbench_subsections",
"triggers": [
"ebwizardry:handbook/tome_of_arcana"
],
"text": [
"你需要對應@tiers 等級@的法術寶典來\n升級你的@wands 法杖@或進行特殊的法\n杖升級。這兩種東西都可從怪物的掉落物或向法師購買獲得。要升級法杖,先將法杖放入法術工作台中央的槽,並在右上方的槽放入升級物後按下按鈕。",
"特殊的法杖升級可加強法杖某方面的能力,每種升級最高只能疊加三次,而法杖的總升級數取決於法杖的等級。升級後就無法移除。"
]
},
"enchanting_scrolls": {
"title": "製作卷軸",
"include_in_contents": "arcane_workbench_subsections",
"triggers": [
"ebwizardry:handbook/scrolls"
],
"text": [
"法術工作台也能用來將@spells 法術@\n存入卷軸。要製作卷軸,你需要先用一張紙及一些線來合成空白卷軸,然後選一本想要作成卷軸的法術書,最後準備足夠的魔法水晶以提供施展這個法術的@mana 法力@。",
"#recipe blank_scroll",
"先將水晶放入左下方的槽,再將空白卷軸放入中央的槽,然後將法術書放入上方單獨的槽,最後按下按鈕以製成法術卷軸。"
]
}
}
},
"wizard_armour": {
"title": "法師服",
"include_in_contents": "main_contents",
"triggers": [
"ebwizardry:arcane_initiate"
],
"text": [
"身為一位法師,在與生物搏鬥時需要一些東西來保護自己。雖然也能使用一般的護甲,但是為了充分發揮你的法術,你還是需要一套法師服,包括帽子、長袍、褲子和鞋子。\n與一般護甲不同的是,法師服不會破損,其使用魔法能量來保護穿著的人。因此跟法杖一樣,需要魔法水晶來補充能量。不過幸好這些服裝不會消耗太多\n@mana 法力@。\n法師服補充能量的方式也跟法杖一樣,可以用@arcane_workbench 法術工作台@或\n@mana_flasks 法力瓶@來補充,但是必須當心,\n如果法師服的法力耗盡了,你會發現自己毫無防禦力。",
"#image wizard_armour",
"你可以用魔法絲綢來製成法師服:",
"#recipe magic_silk",
"#recipe wizard_hat",
"#recipe wizard_robe",
"#recipe wizard_leggings",
"#recipe wizard_boots",
"使用一般的附魔台就能為法師服附魔,而且由於魔法絲綢本身的特性,附魔後的效果特別好。對一個法師而言,最有用的是魔法、冰凍及衝擊三種防護附魔,有助於對抗敵人的魔法攻擊。",
"有些專注於特定元素的法師會穿著能加強該元素力量的特殊服裝,這種整套的服裝法師們都相當喜歡,但也不容易找到。",
"傳說中最強的法師曾經用一種法術印記來大大強化他們的服裝。"
]
},
"magical_world": {
"title": "魔法世界",
"include_in_contents": "main_contents",
"contents": {
"id": "magical_world_subsections",
"hyperlinks": true,
"page_numbers": true,
"separator": "."
},
"triggers": [
"ebwizardry:handbook/on_subsection_unlock"
],
"text": [
"只是待在家裡是無法成為法術大師的,到外頭探索充滿魔法的世界吧!\n若你勇於挑戰,古代遺址、遺物以及不管好的或壞的神秘生物,都等著你發現。\n最偉大的法師同時也最具好奇心,他們會不斷的探索周遭環境,並嘗試所發現的東西,來獲得豐富的知識及強大的力量。",
"雖然法師不免大多的時間都是孤身一人,但知識的分享也是學習魔法藝術重要的一環。找尋其他法師,盡可能從他們身上學習更多知識,溝通才是一切最大的力量。"
],
"sections": {
"crystal_flowers": {
"title": "水晶花",
"include_in_contents": "magical_world_subsections",
"triggers": [
"ebwizardry:handbook/crystal_flowers"
],
"text": [
"在你的旅途當中,可能在野外會不時遇到奇怪的發光花朵,這些獨特的花稱為水晶花,它們具有聚集@mana 法力@的神奇能力,至今還不\n知道原因。不過我們卻知道這些水晶花,可經由採集製作以提取法力成為水晶,這使它們成為地面上相當有用的法力來源。然而由於這種花並不大,而且生長的土地都很小塊,因此這種方式所能獲得的法力其實很有限。",
"#image crystal_flower",
"#recipe crystal_flower_to_crystals"
]
},
"wizard_towers": {
"title": "法師塔",
"include_in_contents": "magical_world_subsections",
"triggers": [
"ebwizardry:wizard_tower"
],
"text": [
"害怕嗎?你並不是這個世界上唯一會使用魔法的人。\n在你的旅途中,你可能會遇到具有獨特尖頂或雙尖頂的高塔,這些是法師同伴居住的地方。\n隱居的生活使法師們有時候會有點古怪,但是他們通常還是友善的,而且只要你願意付出代價,還是會樂意與你分享他們的知識。\n在支付了貴重金屬及寶石後,你會收到許多驚奇的法術作為回報。",
"如果你想尋找的是@tiers 大師級@法術,\n那你得跟專門的人交談。",
"#image wizard_tower",
"不幸的是,有少數法師並不歡迎訪客。這些法師通常已被驅逐,所以對於任何闖入地盤的人都充滿敵意。\n接近這些傢伙要特別小心,並做好抵擋強大魔法的準備。只要擊敗他們,他們的知識就會成為你的了。",
"有一點必須知道,沒有法師會接受對他們攻擊或盜取他們東西的人,他們肯定不會善罷甘休。"
]
},
"obelisks": {
"title": "方尖碑",
"include_in_contents": "magical_world_subsections",
"triggers": [
"ebwizardry:handbook/obelisks"
],
"text": [
"古老魔法的遺跡散落在世界各處,其中最著名的是刻有許多符號及符文的石頭結構。這些廢墟看起來像是某種古代文明的遺跡,無論建造它們的是誰或是什麼,顯然具有相當豐富的魔法知識,且用來在這些地方設置持續至今的防衛魔法。",
"這些結構大致上分成兩種類型,第一種是較常見的方尖碑:\n以雕刻符文石堆成高高尖頂的結構,底部開著一塊空間,存放著過去所遺留的次等魔法物品。",
"#image obelisk",
"這些結構通常受到魔法保護,一旦有人靠近就會召喚出充滿敵意的@creatures 魔法生物@來攻擊人類。\n對抗這些生物並摧毀其魔法源頭,那些遺物就是你的了。"
]
},
"shrines": {
"title": "神殿",
"include_in_contents": "magical_world_subsections",
"triggers": [
"ebwizardry:visit_shrine"
],
"text": [
"第二種較為罕見的結構稱之為神殿,由一個中央基座及圍繞在四周的符文石柱所組成。基座上方擺著一個裝有古代@artefacts 神器@的\n寶箱,並通常施加了防護魔法鎖,以防他人竊取。整個結構還受到封鎖力場保護,使擅闖者無法逃離。",
"#image shrine",
"由於這些神殿的重要意義及巨大的神秘力量,更別說裡面的寶物,對於志氣高昂的法師特別有吸引力。\n\n但是務必謹慎,有許多關於法師被關在封鎖區內,可能因為幽閉恐懼症導致慢慢發瘋的報導。且愈來愈多人認為,這就是神殿防護魔法的一個部分,而被關在其中的法師,其實是被控制用來守護神殿。這對於膽敢前往冒險的人來說,無疑是令人不寒而慄的結局..."
]
},
"creatures": {
"title": "魔法生物",
"include_in_contents": "magical_world_subsections",
"triggers": [
"ebwizardry:handbook/magical_creatures"
],
"text": [
"除了法師,還有許多其它生物也會使用魔法。其中有許多是源自於魔法,且大部分都能用特定的@spells 法術@召喚。會看到這些生物,\n大多是在守護@obelisks 方尖碑@,但也可能\n遇到了強大的召喚法師。只有非常少數的神秘生物才會偶爾在野外發現。"
]
},
"artefacts": {
"title": "神器",
"include_in_contents": "magical_world_subsections",
"triggers": [
"ebwizardry:artefact"
],
"text": [
"在探索@shrines 神殿@時,你可能會好運的\n發現某種古代魔法神器,一種能夠賦予配戴者獨特而強大能力的物品。\n目前所知的類型有三種:\n為法術附加額外能力及效果的戒指,增強防禦力的項鍊,以及各種應用魔法的寶器。\n這些神器只是放入背包是沒有用的,要擺在身上的正確位置才會發生作用。"
]
}
}
},
"tiers": {
"title": "等級",
"include_in_contents": "main_contents",
"triggers": [
"ebwizardry:handbook/tome_of_arcana"
],
"text":[
"@wands 法杖@和@spells 法術@都分成四個等級: #colour_novice基礎#colour_reset、#colour_apprentice學徒#colour_reset、#colour_advanced進階#colour_reset以及#colour_master大師#colour_reset。每個等級都比前一級還強。",
"#image tiers",
"只有#colour_novice基礎#colour_reset法杖能以合成的方式製作,其最多可儲存#novice_max_charge點法力,且只能施展基礎法術。基礎法術通常不會消耗太多法力,任何人都足以施展。但這並不表示它們相較於高等法術就毫無用處。即便你已經能施展大師級法術,某些基礎法術由於消耗法力低而仍然實用。",
"#colour_apprentice學徒#colour_reset法杖是基礎法杖的下個等級,其最多可儲存#apprentice_max_charge點法力,並可施展基礎及學徒法術。學徒法術比基礎法術更強一些,但通常也消耗更多法力。",
"#colour_advanced進階#colour_reset法杖非常稀有也更加強大,可施展大師級以外的所有法術,並可儲存#advanced_max_charge點法力。進階法術能夠重創敵人,並擁有超人般的能力,例如隱身術。",
"#colour_master大師#colour_reset法杖是現存最強大的法杖,其最多可儲存#master_max_charge點法力,並可施展所有法術。大師級法術書相當罕見,且法術的威力能徹底毀滅的不僅是敵人,甚至包括整個世界。務必謹慎使用!",
"要提升至更高等級,首先法杖必須變得夠強大到足以引導該等級的法術。法杖會隨著施展法術而獲得成長,法術類型、法術力量、元素效果以及其它外部因素都可能會影響法杖的成長速度。",
"當法杖足夠強大,法術寶典為最終將法杖提升至下個等級的關鍵物品(請參閱@upgrading_wands 升級法杖@),\n一旦完成升級,法杖將再次朝下個等級開始成長。"
]
},
"elements": {
"title": "元素",
"include_in_contents": "main_contents",
"triggers": [
"ebwizardry:handbook/elements"
],
"text": [
"@spells 法術@各屬於不同的元素,代表\n法術的本質,且搭配使用對應的@wands 法杖@還會加強效果。",
"#image elements",
"#colour_fire火#colour_reset \n火元素涉及燃燒、岩漿以及爆炸,大概是最具破壞性的元素。一個強大的烈焰法師可使敵人面臨煉獄般的火海,並可能在過程中毀掉這個世界。\n大部分的火系法術會讓目標著火,使他們持續受到傷害,但是對地獄的生物則沒什麼效果。",
"#colour_ice冰#colour_reset \n冰元素來自於所有冰冷的物質。冰系法術通常會讓敵人減速,甚至使他們完全凍結,對於火系生物特別有效。\n冰凍魔法在戰鬥之外也很有用,例如使水面結冰以過河。",
"\n#colour_lightning電#colour_reset \n這個元素涉及雷電、風暴以及天氣。決不可小看一個強大雷電法師的力量,有些甚至能隨意召喚閃電。\n雷電法術經常能一次傷害多個敵人,還會自動搜尋目標,對任何生物都能造成有效的攻擊...但是得當心苦力怕。",
"#colour_necromancy死靈#colour_reset \n死靈是黑暗、渾沌以及不死生物的元素。神秘的死靈法師往往被視為邪惡,儘管通常不是這樣的。\n死靈法術常召喚@creatures 生物@來為他\n戰鬥,或進而扭曲敵人的意志。",
"#colour_earth大地#colour_reset \n大地元素來自於動植物、風等自然界的的力量。大地魔法千變萬化,從毒害敵人到控制天氣,有各式各樣的形式。\n大地法術是綜合攻擊、防禦以及實用的法術。",
"#colour_sorcery秘術#colour_reset \n秘術是力量與變化的元素。\n秘術法師能操縱光線、重力,甚至現實世界本身來符合他們的需求。\n且不提其它用途,秘術法術可用來提供施法者魔法力量,或是任意移動物體。",
"#colour_healing治療#colour_reset \n治療元素包括防禦和再生。\n治療法師會盡可能的保護自己及他們的同伴,因此可能會是非常難以對付的對手。\n治療法術在戰鬥中是不可或缺的,即便其通常不會用來進行攻擊,但是一些治療法術的淨化光芒會對不死生物造成相當大的傷害。",
"不同元素之間的分界並不總是那麼明確,有些法術除了所屬元素的性質外,也會具有其它元素的特性。",
"幸運的話,或許你能發現一種元素水晶,這是種在生長過程中吸收了元素的魔法水晶,不過實際上發生的方式及所需的條件仍然是個謎。但我們知道這種水晶能用來製作元素法杖,用來施展對應的法術,可比平常發揮更大的效果。"
]
},
"miscellaneous": {
"title": "其它",
"include_in_contents": "main_contents",
"contents": {
"id": "miscellaneous_subsections",
"hyperlinks": true,
"page_numbers": true,
"separator": "."
},
"triggers": [
"ebwizardry:on_subsection_unlock"
],
"sections": {
"mana_flasks": {
"title": "法力瓶",
"include_in_contents": "miscellaneous_subsections",
"triggers": [
"ebwizardry:handbook/mana_flasks"
],
"text": [
"亞肯多魔法用品公司 - 為您所需的魔法物品!",
"需要在旅行中為你的@wands 法杖@補充\n法力嗎?\n沒問題! 現在@mana 法力@可以裝瓶。\n只要用一個玻璃瓶及八個魔法水晶合成出法力瓶,就可以隨身攜帶。要用的時候,只要將你的法杖與法力瓶合成,就能將法力存入法杖。(註)",
"#recipe medium_mana_flask",
"好消息! 即日起推出全新的小瓶裝及大瓶裝法力,可依您的需求選擇!",
"#recipe small_mana_flask",
"#recipe large_mana_flask",
"(註)過程中瓶子會用掉,且裝瓶時也會耗損一些法力。"
]
},
"throwable_items": {
"title": "投擲物",
"include_in_contents": "miscellaneous_subsections",
"triggers": [
"ebwizardry:handbook/throwables"
],
"text": [
"各種@spells 法術@的實體物,像是\n火焰彈、毒液彈、煙霧彈,還有電擊彈都能直接合成:",
"#recipe firebomb",
"#recipe poison_bomb",
"#recipe smoke_bomb",
"#recipe spark_bomb"
]
},
"automated_casting": {
"title": "自動施法",
"include_in_contents": "miscellaneous_subsections",
"triggers": [
"ebwizardry:enchant_scroll"
],
"text": [
"近期的實驗顯示,在某種程度上只需要簡單的發射器就能自動施展@spells 法術@。沒有人知道原因,\n但看起來似乎是紅石的神奇特性竟然能觸發法術卷軸。只要將一些卷軸放入發射器,然後提供能量,就完成了這個機關..."
]
}
}
},
"crafting_recipes": {
"title": "合成表",
"include_in_contents": "main_contents",
"text": [
"#recipe arcane_workbench",
"#recipe novice_wands",
"#recipe magic_missile_spell_book",
"#recipe wizard_handbook",
"#recipe crystal_flower_to_crystals",
"#recipe crystal_blocks",
"#recipe crystal_blocks_to_crystals",
"#recipe crystal_shard",
"#recipe small_mana_flask",
"#recipe medium_mana_flask",
"#recipe large_mana_flask",
"#recipe runestone",
"#recipe runestone_pedestal",
"#recipe transportation_stone",
"#recipe magic_silk",
"#recipe wizard_hat",
"#recipe wizard_robe",
"#recipe wizard_leggings",
"#recipe wizard_boots",
"#recipe blank_scroll",
"#recipe firebomb",
"#recipe poison_bomb",
"#recipe smoke_bomb",
"#recipe spark_bomb"
]
},
"credits": {
"title": "製作群",
"include_in_contents": "main_contents",
"text": [
"法術模組\n版本 #version\n支援 Minecraft #mcversion",
"設計、程式及材質: Electroblob",
"感謝 Minecraft Forge 及 MCP\n沒有它們就沒有這個模組。",
"也感謝Minecraft的模組討論區,\n總能回答我的模組問題!",
"\n另外,我要感謝以下各位對本模組的貢獻:",
"程式碼:",
"》Corail31 \n》12foo \n》Shadows-of-Fire \n》HellFirePvP \n》Tora-B \n》Avatair \n》Aeronica",
"\n\n翻譯:",
"》繁體中文: Grant\n》(墨西哥)西班牙文: MadWrist \n》俄文: VilagVil, kellixon\n》法文: Hahdrim\n》巴西葡萄牙文: lorrampi\n》簡體中文: ZHENGLOC, dragon-evol\n》韓文: shejery, rewi_wire\n》波蘭文: Trozuu",
"雷電音效: OhhWowProductions",
"更多資訊請前往 @https://github.com/Electroblob77/Wizardry/wiki wiki@",
"覺得法術模組還有不足之處? 請加入 @https://discord.gg/MTmMzMv Discord 伺服器@以獲得\n最新消息、討論及額外事務!"
]
}
}
}
+2 -2
View File
@@ -2,10 +2,10 @@
{
"modid" : "ebwizardry",
"name" : "Electroblob's Wizardry",
"version" : "4.2.8",
"version" : "4.2.10",
"mcversion" : "1.12.2",
"url" : "https://minecraft.curseforge.com/projects/electroblobs-wizardry",
"credits" : "\nDesigned, coded and textured by Electroblob.\nCode contributed by: Corail31, 12foo, Shadows-of-Fire, Tora-B, Avatair, Aeronica, UltraHex, Azim-Palmer, raoulvdberge.\nTranslators: MadWrist (Spanish, Mexican Spanish), VilagVil, kellixon & bigenergy (Russian), Hahdrim (French), lorrampi (Brazilian Portuguese), ZHENGLOC & dragon-evol (Chinese), shejery & rewi_wire (Korean), Trozuu (Polish).",
"credits" : "\nDesigned, coded and textured by Electroblob.\nCode contributed by: Corail31, 12foo, Shadows-of-Fire, Tora-B, Avatair, Aeronica, UltraHex, Azim-Palmer, raoulvdberge.\nTranslators: MadWrist (Spanish, Mexican Spanish), VilagVil, kellixon & bigenergy (Russian), Hahdrim (French), lorrampi (Brazilian Portuguese), ZHENGLOC & dragon-evol (Chinese), shejery & rewi_wire (Korean), Trozuu (Polish), chesterccj305 (Taiwanese).",
"authorList" : [
"Electroblob"
],