Compare commits

..

18 Commits

Author SHA1 Message Date
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
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
39 changed files with 4267 additions and 822 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.9 [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.9 [change as necessary]
Question details: [explain your question here]
+5 -3
View File
@@ -1,7 +1,7 @@
# Credits
Electroblob's Wizardry
Version 4.2.8
Version 4.2.9
For Minecraft 1.12.2
Designed, coded and textured by Electroblob
@@ -27,12 +27,14 @@ 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
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.9 [change as necessary]
Environment: Singleplayer/LAN game/Server [delete as necessary]
Issue details: [describe what you were doing when the issue occurred, what went wrong, what you expected to happen, etc.]
+1 -1
View File
@@ -11,7 +11,7 @@ apply plugin: 'net.minecraftforge.gradle.forge'
//Only edit below this line, the above code adds and enables the necessary things for Forge to be setup.
version = "4.2.8" // There, it matches semver, happy now?
version = "4.2.9" // There, it matches semver, happy now?
group= "electroblob.wizardry"// http://maven.apache.org/guides/mini/guide-naming-conventions.html
archivesBaseName = "ElectroblobsWizardry"
@@ -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.*;
@@ -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. */
@@ -190,15 +194,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. */
@@ -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));
}
}
@@ -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.9";
// 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());
@@ -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()){
@@ -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){
@@ -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.*;
@@ -587,12 +588,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 +609,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){
@@ -38,7 +38,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().replace(':', '.'), "integration.antiqueatlas.marker." + TOWER_MARKER.toString(), x, z);
}
}
@@ -46,7 +46,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().replace(':', '.'), "integration.antiqueatlas.marker." + OBELISK_MARKER.toString(), x, z);
}
}
@@ -54,7 +54,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().replace(':', '.'), "integration.antiqueatlas.marker." + SHRINE_MARKER.toString(), x, z);
}
}
@@ -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,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.
@@ -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());
@@ -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;
@@ -298,11 +299,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));
}
/**
File diff suppressed because it is too large Load Diff
@@ -1284,9 +1284,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
@@ -1284,9 +1284,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
@@ -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": "introduccion",
"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!"
]
}
}
}
+1 -1
View File
@@ -2,7 +2,7 @@
{
"modid" : "ebwizardry",
"name" : "Electroblob's Wizardry",
"version" : "4.2.8",
"version" : "4.2.9",
"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).",