Compare commits
84 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 937617d7af | |||
| 94751a6fd5 | |||
| 01ab50cb27 | |||
| d0bcbc8ed8 | |||
| b660b02e0e | |||
| 153ea74966 | |||
| c81830efec | |||
| 6ec2e716cb | |||
| 96e7c5885b | |||
| 41d575c9c9 | |||
| 7f31fc6259 | |||
| 817fd26dcf | |||
| 7237840a2a | |||
| 8ad6b5590b | |||
| 1c2c267e1a | |||
| e45bfb9248 | |||
| 0d48606b51 | |||
| 3c0b65c485 | |||
| 771118afde | |||
| 29b9e0de8b | |||
| f26f537f50 | |||
| 91c9a5392b | |||
| 6ae9df1204 | |||
| d46600ac86 | |||
| 004782a1e4 | |||
| b2b48cd8a1 | |||
| 2277f6b278 | |||
| ba59d9786f | |||
| bdf5aa5b64 | |||
| a384a57622 | |||
| 586840aa53 | |||
| 1ab674136b | |||
| 64e7e3844e | |||
| 51a3d2a63e | |||
| 7c2e786d0b | |||
| a7ee0ad847 | |||
| 033d90ed3e | |||
| 52214f81cf | |||
| 516d7948ee | |||
| a490168fa2 | |||
| 306137a026 | |||
| 0a5527f3d4 | |||
| 4dbe24c8ea | |||
| 5477725b7e | |||
| 81bba5e7e0 | |||
| 9c29142e6a | |||
| 3dc3a3a378 | |||
| 3151d7d626 | |||
| d68f968632 | |||
| 74d9198522 | |||
| 0b56d47022 | |||
| 587ab1338e | |||
| 4816c48aa6 | |||
| 2456589fa7 | |||
| d7849a94b1 | |||
| cfb9f4fe25 | |||
| a269cf339b | |||
| 1c8e4f86ee | |||
| f2835c245f | |||
| 462512ad30 | |||
| db5a7dcfde | |||
| 17bba5dea8 | |||
| fbdb5cd844 | |||
| 393fb1c1b0 | |||
| 08e89b1aef | |||
| 1f25d95b1b | |||
| 1f3a71797e | |||
| a821ef2aef | |||
| 6845279c49 | |||
| 79b745e005 | |||
| 6fff0e31d1 | |||
| 11efe56437 | |||
| 7f5786c28c | |||
| 85b49b330a | |||
| d797e72445 | |||
| 5f21b565cd | |||
| 9ed06c9a34 | |||
| 50f315666f | |||
| 62bdbc81e4 | |||
| 3a571fd239 | |||
| 4fb5452dc4 | |||
| 652f1d2620 | |||
| 046ecb1e41 | |||
| f3dd7bccd8 |
@@ -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.9 [change as necessary]
|
||||
Wizardry version: 4.2.11 [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.]
|
||||
|
||||
@@ -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.9 [change as necessary]
|
||||
Wizardry version: 4.2.11 [change as necessary]
|
||||
|
||||
Question details: [explain your question here]
|
||||
|
||||
|
||||
+4
-2
@@ -1,7 +1,7 @@
|
||||
# Credits
|
||||
|
||||
Electroblob's Wizardry
|
||||
Version 4.2.9
|
||||
Version 4.2.11
|
||||
For Minecraft 1.12.2
|
||||
|
||||
Designed, coded and textured by Electroblob
|
||||
@@ -24,6 +24,7 @@ In addition, I'd like to thank the following individuals for their contributions
|
||||
- UltraHex
|
||||
- Azim-Palmer
|
||||
- raoulvdberge
|
||||
- rafasoares
|
||||
|
||||
#### Translations
|
||||
|
||||
@@ -32,9 +33,10 @@ In addition, I'd like to thank the following individuals for their contributions
|
||||
- Russian: VilagVil, kellixon, bigenergy
|
||||
- French: Hahdrim
|
||||
- Brazilian Portuguese: lorrampi
|
||||
- Chinese: ZHENGLOC, dragon-evol, Hokorizero, TUsama
|
||||
- Chinese: ZHENGLOC, dragon-evol, Hokorizero, TUsama, Determancer
|
||||
- Korean: shejery, rewi_wire
|
||||
- Polish: Trozuu
|
||||
- German: BirdyDragon
|
||||
- Taiwanese: chesterccj305
|
||||
|
||||
Lightning ray sound effect from OhhWowProductions
|
||||
|
||||
+1
-1
@@ -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.9 [change as necessary]
|
||||
Wizardry version: 4.2.11 [change as necessary]
|
||||
Environment: Singleplayer/LAN game/Server [delete as necessary]
|
||||
|
||||
Issue details: [describe what you were doing when the issue occurred, what went wrong, what you expected to happen, etc.]
|
||||
|
||||
+8
-36
@@ -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.9" // There, it matches semver, happy now?
|
||||
version = "4.2.11" // There, it matches semver, happy now?
|
||||
group= "electroblob.wizardry"// http://maven.apache.org/guides/mini/guide-naming-conventions.html
|
||||
archivesBaseName = "ElectroblobsWizardry"
|
||||
|
||||
@@ -31,15 +31,10 @@ repositories {
|
||||
name = "ModMaven"
|
||||
url = "modmaven.k-4u.nl"
|
||||
}
|
||||
flatDir {
|
||||
// evErYthINg hAS tO Be a mAVeN rEPoSiTOrY... (to use deobfProvided, for some reason)
|
||||
// The lack of documentation is actually quite impressive, see the following threads:
|
||||
// http://www.minecraftforge.net/forum/topic/44262-solved-how-to-build-mod-with-dependencies/
|
||||
// https://www.minecraftforum.net/forums/mapping-and-modding-java-edition/mapping-and-modding-tutorials/2866817-setting-up-dependencies-in-minecraft-forge-with
|
||||
// http://www.minecraftforge.net/forum/topic/44534-adding-dependencies-to-a-forge-project/
|
||||
dirs "libsfordeobf" // Don't put src jars in libs or forge will think you have duplicate mods
|
||||
maven {
|
||||
name = "Curseforge Maven"
|
||||
url = "https://minecraft.curseforge.com/api/maven/"
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
minecraft {
|
||||
@@ -56,37 +51,14 @@ minecraft {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
// you may put jars on which you depend on in ./libs
|
||||
// or you may define them like so..
|
||||
//compile "some.group:artifact:version:classifier"
|
||||
//compile "some.group:artifact:version"
|
||||
|
||||
// compile against the JEI API but do not include it at runtime
|
||||
// Compile against the JEI API but do not include it at runtime
|
||||
deobfProvided "mezz.jei:jei_${mc_version}:${jei_version}:api"
|
||||
// at runtime, use the full JEI jar
|
||||
// At runtime, use the full JEI jar
|
||||
runtime "mezz.jei:jei_${mc_version}:${jei_version}"
|
||||
|
||||
//deobfProvided "baubles:baubles-1.12:1.5.2:api" // #ihavenoideawhatimdoing #itjustworks
|
||||
//runtime "baubles:baubles-1.12:1.5.2" // If in doubt, copy what already works
|
||||
|
||||
//deobfProvided "antiqueatlas:antiqueatlas-1.12.2:4.5.1:src"
|
||||
//runtime "antiqueatlas:antiqueatlas-1.12.2:4.5.1"
|
||||
|
||||
// real examples
|
||||
//compile 'com.mod-buildcraft:buildcraft:6.0.8:dev' // adds buildcraft to the dev env
|
||||
//compile 'com.googlecode.efficient-java-matrix-library:ejml:0.24' // adds ejml to the dev env
|
||||
|
||||
// the 'provided' configuration is for optional dependencies that exist at compile-time but might not at runtime.
|
||||
//provided 'com.mod-buildcraft:buildcraft:6.0.8:dev'
|
||||
|
||||
// the deobf configurations: 'deobfCompile' and 'deobfProvided' are the same as the normal compile and provided,
|
||||
// except that these dependencies get remapped to your current MCP mappings
|
||||
//deobfCompile 'com.mod-buildcraft:buildcraft:6.0.8:dev'
|
||||
//deobfProvided 'com.mod-buildcraft:buildcraft:6.0.8:dev'
|
||||
|
||||
// for more info...
|
||||
// http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html
|
||||
// http://www.gradle.org/docs/current/userguide/dependency_management.html
|
||||
deobfCompile "baubles:Baubles:${mc_version_short}:${baubles_version}"
|
||||
deobfCompile "antique-atlas:antiqueatlas:${mc_version}:${antique_atlas_version}"
|
||||
|
||||
}
|
||||
|
||||
|
||||
+4
-1
@@ -2,4 +2,7 @@
|
||||
# This is required to provide enough memory for the Minecraft decompilation process.
|
||||
org.gradle.jvmargs=-Xmx3G
|
||||
mc_version=1.12.2
|
||||
jei_version=4.13.1.225
|
||||
mc_version_short=1.12
|
||||
jei_version=4.13.1.225
|
||||
baubles_version=1.5.2
|
||||
antique_atlas_version=4.6.3
|
||||
@@ -247,6 +247,13 @@ public class CommonProxy {
|
||||
* @param intensity The amplitude of the shaking (around 10 looks about right)
|
||||
*/
|
||||
public void shakeScreen(EntityPlayer player, float intensity){}
|
||||
|
||||
/**
|
||||
* Loads the given shader for the given player, if they have shaders enabled.
|
||||
* @param player The player to load the shader for
|
||||
* @param shader The location of the shader to load
|
||||
*/
|
||||
public void loadShader(EntityPlayer player, ResourceLocation shader){}
|
||||
|
||||
/**
|
||||
* Gets the client side world using Minecraft.getMinecraft().world. <b>Only to be called client side!</b> Returns
|
||||
|
||||
@@ -94,7 +94,7 @@ public final class Settings {
|
||||
/** <b>[Server-only]</b> List of dimension ids in which to generate wizard towers. */
|
||||
public int[] towerDimensions = {0};
|
||||
/** <b>[Server-only]</b> The rarity of wizard towers, used by the world generator. Larger numbers are rarer. */
|
||||
public int towerRarity = 900;
|
||||
public int towerRarity = 700;
|
||||
/** <b>[Server-only]</b> List of structure file locations for wizard towers without loot chests. */
|
||||
public ResourceLocation[] towerFiles = {new ResourceLocation(Wizardry.MODID, "wizard_tower_0"),
|
||||
new ResourceLocation(Wizardry.MODID, "wizard_tower_1"),
|
||||
@@ -108,7 +108,7 @@ public final class Settings {
|
||||
/** <b>[Server-only]</b> List of dimension ids in which to generate obelisks. */
|
||||
public int[] obeliskDimensions = {0, -1};
|
||||
/** <b>[Server-only]</b> The rarity of obelisks, used by the world generator. Larger numbers are rarer. */
|
||||
public int obeliskRarity = 800;
|
||||
public int obeliskRarity = 600;
|
||||
/** <b>[Server-only]</b> List of structure file locations for obelisks. */
|
||||
public ResourceLocation[] obeliskFiles = {new ResourceLocation(Wizardry.MODID, "obelisk_0"),
|
||||
new ResourceLocation(Wizardry.MODID, "obelisk_1"),
|
||||
@@ -118,7 +118,7 @@ public final class Settings {
|
||||
/** <b>[Server-only]</b> List of dimension ids in which to generate shrines. */
|
||||
public int[] shrineDimensions = {0, -1};
|
||||
/** <b>[Server-only]</b> The rarity of shrines, used by the world generator. Larger numbers are rarer. */
|
||||
public int shrineRarity = 1500;
|
||||
public int shrineRarity = 1100;
|
||||
/** <b>[Server-only]</b> List of structure file locations for shrines. */
|
||||
public ResourceLocation[] shrineFiles = {new ResourceLocation(Wizardry.MODID, "shrine_0"),
|
||||
new ResourceLocation(Wizardry.MODID, "shrine_1"),
|
||||
@@ -168,8 +168,6 @@ public final class Settings {
|
||||
public boolean playerBlockDamage = true;
|
||||
/** <b>[Server-only]</b> Whether to revert to the old wand upgrade system, which only requires tomes of arcana. */
|
||||
public boolean legacyWandLevelling = false;
|
||||
/** <b>[Server-only]</b> Whether to replace Minecraft's own fireballs with wizardry fireballs. */
|
||||
public boolean replaceVanillaFireballs = true;
|
||||
/** <b>[Server-only]</b> Whether to replace Minecraft's distance-based fall damage calculation with an equivalent,
|
||||
* velocity-based one. */
|
||||
public boolean replaceVanillaFallDamage = true;
|
||||
@@ -272,7 +270,9 @@ public final class Settings {
|
||||
* effect.
|
||||
*/
|
||||
public boolean slowTimeAffectsPlayers = true;
|
||||
/** <b>[Synchronised]</b> Chance of 'misreading' an undiscovered spell and triggering a forfeit instead. */
|
||||
/** <b>[Synchronised]</b> Whether to replace Minecraft's own fireballs with wizardry fireballs. */
|
||||
public boolean replaceVanillaFireballs = true;
|
||||
/** <b>[Synchronised]</b> Chance of 'misreading' an undiscovered spell and triggering a forfeit instead. */
|
||||
public double forfeitChance = 0.2;
|
||||
|
||||
// Client-only settings. These settings only affect client-side code and hence are not synced. Each client obeys
|
||||
@@ -300,6 +300,10 @@ public final class Settings {
|
||||
public boolean booksPauseGame = true;
|
||||
/** <b>[Client-only]</b> Whether to use custom shaders for certain spells. */
|
||||
public boolean useShaders = true;
|
||||
/** <b>[Client-only]</b> Whether to use the screen shake effect for certain spells. */
|
||||
public boolean screenShake = true;
|
||||
/** <b>[Client-only]</b> Whether to use the screen blink effect for teleportation spells. */
|
||||
public boolean blinkEffect = true;
|
||||
/** <b>[Client-only]</b> The position of the spell HUD. */
|
||||
public GuiPosition spellHUDPosition = GuiPosition.BOTTOM_LEFT;
|
||||
|
||||
@@ -878,6 +882,18 @@ public final class Settings {
|
||||
useShaders = property.getBoolean();
|
||||
propOrder.add(property.getName());
|
||||
|
||||
property = config.get(CLIENT_CATEGORY, "screenShake", true, "Whether to use the screen shake effect for certain spells.");
|
||||
property.setLanguageKey("config." + Wizardry.MODID + ".screen_shake");
|
||||
Wizardry.proxy.setToNamedBooleanEntry(property);
|
||||
screenShake = property.getBoolean();
|
||||
propOrder.add(property.getName());
|
||||
|
||||
property = config.get(CLIENT_CATEGORY, "blinkEffect", true, "Whether to use the screen blink effect for teleportation spells.");
|
||||
property.setLanguageKey("config." + Wizardry.MODID + ".blink_effect");
|
||||
Wizardry.proxy.setToNamedBooleanEntry(property);
|
||||
blinkEffect = property.getBoolean();
|
||||
propOrder.add(property.getName());
|
||||
|
||||
config.setCategoryPropertyOrder(CLIENT_CATEGORY, propOrder);
|
||||
}
|
||||
|
||||
@@ -1125,7 +1141,7 @@ public final class Settings {
|
||||
}
|
||||
|
||||
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));
|
||||
return Arrays.asList(array).contains(Pair.of(id, metadata)) || Arrays.asList(array).contains(Pair.of(id, (short)OreDictionary.WILDCARD_VALUE));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@ import java.util.Calendar;
|
||||
*/
|
||||
|
||||
@Mod(modid = Wizardry.MODID, name = Wizardry.NAME, version = Wizardry.VERSION, acceptedMinecraftVersions = "[1.12.2]",
|
||||
guiFactory = "electroblob.wizardry.WizardryGuiFactory", dependencies = "required-after:forge@[14.23.5.2814,)")
|
||||
guiFactory = "electroblob.wizardry.WizardryGuiFactory", dependencies = "required-after:forge@[14.23.5.2814,);after:antiqueatlas@[4.6,)")
|
||||
|
||||
public class Wizardry {
|
||||
|
||||
@@ -64,7 +64,7 @@ public class Wizardry {
|
||||
* 1.x.x represents Minecraft 1.7.x versions, 2.x.x represents Minecraft 1.10.x versions, 3.x.x represents Minecraft
|
||||
* 1.11.x versions, and so on.
|
||||
*/
|
||||
public static final String VERSION = "4.2.9";
|
||||
public static final String VERSION = "4.2.11";
|
||||
|
||||
// IDEA: Triggering of inbuilt Forge events in relevant places?
|
||||
// IDEA: Abstract the vanilla particles behind the particle builder
|
||||
|
||||
@@ -420,7 +420,7 @@ public final class WizardryEventHandler {
|
||||
@SubscribeEvent // Priority doesn't matter here, we're only setting event fields so if it's cancelled it won't matter
|
||||
public static void onLivingFallEvent(LivingFallEvent event){
|
||||
// Why is fall damage based on distance fallen? Why? Who on earth came up with that? It makes no sense whatsoever!
|
||||
if(Wizardry.settings.replaceVanillaFallDamage && !Loader.isModLoaded("speedbasedfalldamage")){
|
||||
if(!event.getEntity().world.isRemote && Wizardry.settings.replaceVanillaFallDamage && !Loader.isModLoaded("speedbasedfalldamage")){
|
||||
// We want to keep the fall damage EXACTLY THE SAME for free, uninterrupted falls, but fix the weirdness
|
||||
// caused when something else changes the entity's velocity
|
||||
// All living entities have a gravity of 0.08b/t^2
|
||||
|
||||
@@ -107,7 +107,9 @@ public class BlockPedestal extends Block implements ITileEntityProvider {
|
||||
natural = true;
|
||||
metadata -= ELEMENT.getAllowedValues().size();
|
||||
}
|
||||
return this.getDefaultState().withProperty(ELEMENT, Element.values()[metadata]).withProperty(NATURAL, natural);
|
||||
Element element = Element.values()[metadata];
|
||||
if(!ELEMENT.getAllowedValues().contains(element)) return this.getDefaultState().withProperty(NATURAL, natural);
|
||||
return this.getDefaultState().withProperty(ELEMENT, element).withProperty(NATURAL, natural);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -69,7 +69,9 @@ public class BlockRunestone extends Block {
|
||||
|
||||
@Override
|
||||
public IBlockState getStateFromMeta(int metadata){
|
||||
return this.getDefaultState().withProperty(ELEMENT, Element.values()[metadata]);
|
||||
Element element = Element.values()[metadata];
|
||||
if(!ELEMENT.getAllowedValues().contains(element)) return this.getDefaultState();
|
||||
return this.getDefaultState().withProperty(ELEMENT, element);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -199,6 +199,13 @@ public class ClientProxy extends CommonProxy {
|
||||
if(Minecraft.getMinecraft().player == player) WizardryClientEventHandler.shakeScreen(intensity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadShader(EntityPlayer player, ResourceLocation shader){
|
||||
if(Minecraft.getMinecraft().player == player && Wizardry.settings.useShaders
|
||||
&& !Minecraft.getMinecraft().entityRenderer.isShaderActive())
|
||||
Minecraft.getMinecraft().entityRenderer.loadShader(shader);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<String> getSpellHUDSkins(){
|
||||
return GuiSpellDisplay.getSkinKeys();
|
||||
@@ -553,6 +560,12 @@ public class ClientProxy extends CommonProxy {
|
||||
data.randomDescriptions = new HashMap<>();
|
||||
|
||||
for(Spell spell : Spell.getAllSpells()){
|
||||
|
||||
if(spell.networkID() > message.names.size()){
|
||||
Wizardry.logger.warn("Received no glyph data for spell {}, skipping", spell.getRegistryName());
|
||||
continue;
|
||||
}
|
||||
|
||||
// -1 because the none spell isn't included
|
||||
// This is a case where we must use the network ID, not the metadata
|
||||
data.randomNames.put(spell, message.names.get(spell.networkID() - 1));
|
||||
|
||||
@@ -75,13 +75,15 @@ public final class WizardryClientEventHandler {
|
||||
|
||||
/** Starts the first-person blink overlay effect. */
|
||||
public static void playBlinkEffect(){
|
||||
blinkEffectTimer = BLINK_EFFECT_DURATION;
|
||||
if(Wizardry.settings.blinkEffect) 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
|
||||
if(Wizardry.settings.screenShake){
|
||||
screenShakeCounter = (int)(intensity / SHAKINESS);
|
||||
Minecraft.getMinecraft().player.rotationPitch -= intensity * 0.5f; // Start halfway down
|
||||
}
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
@@ -89,12 +91,20 @@ public final class WizardryClientEventHandler {
|
||||
|
||||
if(event.player == Minecraft.getMinecraft().player && event.phase == TickEvent.Phase.END){
|
||||
|
||||
if(blinkEffectTimer > 0) blinkEffectTimer--;
|
||||
if(Wizardry.settings.blinkEffect){
|
||||
if(blinkEffectTimer > 0) blinkEffectTimer--;
|
||||
}else{
|
||||
blinkEffectTimer = 0;
|
||||
}
|
||||
|
||||
if(screenShakeCounter > 0){
|
||||
float magnitude = screenShakeCounter * SHAKINESS;
|
||||
Minecraft.getMinecraft().player.rotationPitch += screenShakeCounter % 2 == 0 ? magnitude : -magnitude;
|
||||
screenShakeCounter--;
|
||||
if(Wizardry.settings.screenShake){
|
||||
if(screenShakeCounter > 0){
|
||||
float magnitude = screenShakeCounter * SHAKINESS;
|
||||
Minecraft.getMinecraft().player.rotationPitch += screenShakeCounter % 2 == 0 ? magnitude : -magnitude;
|
||||
screenShakeCounter--;
|
||||
}
|
||||
}else{
|
||||
screenShakeCounter = 0;
|
||||
}
|
||||
|
||||
// Only seems to work here...
|
||||
|
||||
@@ -13,6 +13,7 @@ import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.audio.PositionedSoundRecord;
|
||||
import net.minecraft.client.gui.GuiScreen;
|
||||
import net.minecraft.client.renderer.GlStateManager;
|
||||
import net.minecraft.client.resources.I18n;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import org.lwjgl.input.Keyboard;
|
||||
@@ -32,9 +33,7 @@ public class GuiSpellBook extends GuiScreen {
|
||||
this.spell = Spell.byMetadata(stack.getItemDamage());
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws the screen and all the components in it.
|
||||
*/
|
||||
@Override
|
||||
public void drawScreen(int par1, int par2, float par3){
|
||||
|
||||
int xPos = this.width / 2 - xSize / 2;
|
||||
@@ -69,22 +68,18 @@ public class GuiSpellBook extends GuiScreen {
|
||||
0x777777);
|
||||
}
|
||||
|
||||
//this.fontRenderer.drawString("-------------------", xPos + 17, yPos + 35, 0);
|
||||
// Novice is usually white but this doesn't show up
|
||||
String tier = I18n.format("gui.ebwizardry:spell_book.tier", spell.getTier() == Tier.NOVICE ?
|
||||
"\u00A77" + spell.getTier().getDisplayName() : spell.getTier().getDisplayNameWithFormatting());
|
||||
this.fontRenderer.drawString(tier, xPos + 17, yPos + 45, 0);
|
||||
|
||||
if(spell.getTier() == Tier.NOVICE){
|
||||
// Novice is usually white but this doesn't show up.
|
||||
this.fontRenderer.drawString("Tier: \u00A77" + Tier.NOVICE.getDisplayName(), xPos + 17, yPos + 45, 0);
|
||||
}else{
|
||||
this.fontRenderer.drawString("Tier: " + spell.getTier().getDisplayNameWithFormatting(), xPos + 17, yPos + 45, 0);
|
||||
}
|
||||
|
||||
String element = "Element: " + spell.getElement().getFormattingCode() + spell.getElement().getDisplayName();
|
||||
if(!discovered) element = "Element: ?";
|
||||
String element = I18n.format("gui.ebwizardry:spell_book.element", spell.getElement().getFormattingCode() + spell.getElement().getDisplayName());
|
||||
if(!discovered) element = I18n.format("gui.ebwizardry:spell_book.element_undiscovered");
|
||||
this.fontRenderer.drawString(element, xPos + 17, yPos + 57, 0);
|
||||
|
||||
String manaCost = "Mana Cost: " + spell.getCost();
|
||||
if(spell.isContinuous) manaCost = "Mana Cost: " + spell.getCost() + "/second";
|
||||
if(!discovered) manaCost = "Mana Cost: ?";
|
||||
String manaCost = I18n.format("gui.ebwizardry:spell_book.mana_cost", spell.getCost());
|
||||
if(spell.isContinuous) manaCost = I18n.format("gui.ebwizardry:spell_book.mana_cost_continuous", spell.getCost());
|
||||
if(!discovered) manaCost = I18n.format("gui.ebwizardry:spell_book.mana_cost_undiscovered");
|
||||
this.fontRenderer.drawString(manaCost, xPos + 17, yPos + 69, 0);
|
||||
|
||||
if(discovered){
|
||||
@@ -95,6 +90,7 @@ public class GuiSpellBook extends GuiScreen {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initGui(){
|
||||
super.initGui();
|
||||
Keyboard.enableRepeatEvents(true);
|
||||
@@ -103,6 +99,7 @@ public class GuiSpellBook extends GuiScreen {
|
||||
this.mc.getSoundHandler().playSound(PositionedSoundRecord.getMasterRecord(WizardrySounds.MISC_BOOK_OPEN, 1));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onGuiClosed(){
|
||||
super.onGuiClosed();
|
||||
Keyboard.enableRepeatEvents(false);
|
||||
|
||||
@@ -96,7 +96,10 @@ public class GuiSpellDisplay {
|
||||
// Normally when extending Gui, you'd have to have an instance to access its methods. However, we're not actually
|
||||
// using any of them, so this class may as well not bother and just be a static event handler. Neat!
|
||||
@SubscribeEvent
|
||||
public static void draw(RenderGameOverlayEvent event){
|
||||
public static void draw(RenderGameOverlayEvent.Post event){
|
||||
|
||||
if(event.getType() != RenderGameOverlayEvent.ElementType.TEXT
|
||||
&& event.getType() != RenderGameOverlayEvent.ElementType.HOTBAR) return;
|
||||
|
||||
Minecraft mc = Minecraft.getMinecraft();
|
||||
|
||||
|
||||
@@ -20,9 +20,6 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
import net.minecraftforge.fml.relauncher.Side;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@Mod.EventBusSubscriber(Side.CLIENT)
|
||||
public class RenderArcaneLock {
|
||||
|
||||
@@ -39,36 +36,44 @@ public class RenderArcaneLock {
|
||||
|
||||
EntityPlayer player = Minecraft.getMinecraft().player;
|
||||
World world = Minecraft.getMinecraft().world;
|
||||
|
||||
GlStateManager.pushMatrix();
|
||||
GlStateManager.enableBlend();
|
||||
boolean lighting = GL11.glIsEnabled(GL11.GL_LIGHTING);
|
||||
GlStateManager.disableLighting();
|
||||
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240, 240);
|
||||
GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
|
||||
|
||||
Vec3d origin = player.getPositionEyes(event.getPartialTicks());
|
||||
GlStateManager.translate(-origin.x, -origin.y + player.getEyeHeight(), -origin.z);
|
||||
|
||||
GlStateManager.color(1, 1, 1, 1);
|
||||
|
||||
Minecraft.getMinecraft().renderEngine.bindTexture(textures[(player.ticksExisted % (textures.length * 2))/2]);
|
||||
|
||||
Tessellator tessellator = Tessellator.getInstance();
|
||||
BufferBuilder buffer = tessellator.getBuffer();
|
||||
buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX);
|
||||
|
||||
// Someone managed to get a CME here so let's just copy the list to be safe
|
||||
boolean flag = false;
|
||||
boolean lighting = false;
|
||||
|
||||
// Someone managed to get a CME here so let's iterate manually to be safe (don't copy the list, it's expensive!)
|
||||
// It's only cosmetic so if a tileentity somehow gets removed while we're rendering them it's not a big deal
|
||||
List<TileEntity> tileentities = new ArrayList<>(world.loadedTileEntityList);
|
||||
for(int i=0; i<world.loadedTileEntityList.size(); i++){
|
||||
|
||||
for(TileEntity tileentity : tileentities){
|
||||
TileEntity tileentity = world.loadedTileEntityList.get(i);
|
||||
|
||||
if(tileentity == null) continue; // What the heck VoxelMap
|
||||
|
||||
if(tileentity.getDistanceSq(origin.x, origin.y, origin.z) <= tileentity.getMaxRenderDistanceSquared()
|
||||
&& tileentity.getTileData().hasUniqueId(ArcaneLock.NBT_KEY)){
|
||||
|
||||
if(!flag){
|
||||
|
||||
flag = true;
|
||||
|
||||
GlStateManager.pushMatrix();
|
||||
GlStateManager.enableBlend();
|
||||
lighting = GL11.glIsEnabled(GL11.GL_LIGHTING);
|
||||
GlStateManager.disableLighting();
|
||||
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240, 240);
|
||||
GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
|
||||
|
||||
GlStateManager.translate(-origin.x, -origin.y + player.getEyeHeight(), -origin.z);
|
||||
|
||||
GlStateManager.color(1, 1, 1, 1);
|
||||
|
||||
Minecraft.getMinecraft().renderEngine.bindTexture(textures[(player.ticksExisted % (textures.length * 2))/2]);
|
||||
|
||||
buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX);
|
||||
}
|
||||
|
||||
Vec3d[] vertices = WizardryUtilities.getVertices(world.getBlockState(tileentity.getPos()).getBoundingBox(world, tileentity.getPos()).grow(0.05).offset(tileentity.getPos()));
|
||||
|
||||
drawFace(buffer, vertices[0], vertices[1], vertices[3], vertices[2], 0, 0, 1, 1); // Bottom
|
||||
@@ -81,15 +86,19 @@ public class RenderArcaneLock {
|
||||
}
|
||||
}
|
||||
|
||||
tessellator.draw();
|
||||
if(flag){
|
||||
|
||||
GlStateManager.disableBlend();
|
||||
GlStateManager.enableTexture2D();
|
||||
if (lighting) {
|
||||
GlStateManager.enableLighting();
|
||||
tessellator.draw();
|
||||
|
||||
GlStateManager.disableBlend();
|
||||
GlStateManager.enableTexture2D();
|
||||
if(lighting){
|
||||
GlStateManager.enableLighting();
|
||||
}
|
||||
GlStateManager.disableRescaleNormal();
|
||||
GlStateManager.popMatrix();
|
||||
}
|
||||
GlStateManager.disableRescaleNormal();
|
||||
GlStateManager.popMatrix();
|
||||
|
||||
}
|
||||
|
||||
private static void drawFace(BufferBuilder buffer, Vec3d topLeft, Vec3d topRight, Vec3d bottomLeft, Vec3d bottomRight, float u1, float v1, float u2, float v2){
|
||||
|
||||
@@ -68,7 +68,7 @@ public class EnchantmentMagicProtection extends Enchantment {
|
||||
|
||||
public enum Type {
|
||||
|
||||
MAGIC("magic", 1, 5, 8, s -> s instanceof IElementalDamage),
|
||||
MAGIC("magic", 1, 5, 8, s -> s instanceof IElementalDamage || s.isMagicDamage()),
|
||||
FROST("frost", 2, 10, 8, s -> s instanceof IElementalDamage && ((IElementalDamage)s).getType() == MagicDamage.DamageType.FROST),
|
||||
SHOCK("shock", 2, 10, 8, s -> s instanceof IElementalDamage && ((IElementalDamage)s).getType() == MagicDamage.DamageType.SHOCK);
|
||||
// Fire already exists, and the other types aren't used enough to be worth having
|
||||
|
||||
@@ -10,6 +10,7 @@ import electroblob.wizardry.util.WizardryUtilities;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.entity.MoverType;
|
||||
import net.minecraft.potion.PotionEffect;
|
||||
import net.minecraft.util.DamageSource;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
@@ -61,10 +62,9 @@ public class EntityIceSpike extends EntityMagicConstruct {
|
||||
if(!this.world.isRemote){
|
||||
for(Object entity : this.world.getEntitiesWithinAABBExcludingEntity(this, this.getEntityBoundingBox())){
|
||||
if(entity instanceof EntityLivingBase && this.isValidTarget((EntityLivingBase)entity)){
|
||||
DamageSource source = this.getCaster() == null ? DamageSource.MAGIC : MagicDamage.causeDirectMagicDamage(this.getCaster(), DamageType.FROST);
|
||||
// Potion effect only gets added if the damage succeeded.
|
||||
if(((EntityLivingBase)entity).attackEntityFrom(
|
||||
MagicDamage.causeDirectMagicDamage(this.getCaster(), DamageType.FROST),
|
||||
Spells.ice_spikes.getProperty(Spell.DAMAGE).floatValue() * this.damageMultiplier))
|
||||
if(((EntityLivingBase)entity).attackEntityFrom(source, Spells.ice_spikes.getProperty(Spell.DAMAGE).floatValue() * this.damageMultiplier))
|
||||
((EntityLivingBase)entity).addPotionEffect(new PotionEffect(WizardryPotions.frost,
|
||||
Spells.ice_spikes.getProperty(Spell.EFFECT_DURATION).intValue(),
|
||||
Spells.ice_spikes.getProperty(Spell.EFFECT_STRENGTH).intValue()));
|
||||
|
||||
@@ -120,8 +120,10 @@ public class EntityMagicSlime extends EntitySlime implements ISummonedCreature {
|
||||
&& ((EntityLivingBase)this.getRidingEntity()).getHealth() > 0){
|
||||
if(this.ticksExisted % 16 == 1){
|
||||
this.getRidingEntity().attackEntityFrom(DamageSource.MAGIC, 1);
|
||||
((EntityLivingBase)this.getRidingEntity())
|
||||
.addPotionEffect(new PotionEffect(MobEffects.SLOWNESS, 20, 2));
|
||||
if(this.getRidingEntity() != null){ // Some mobs force-dismount when attacked (normally when dying)
|
||||
((EntityLivingBase)this.getRidingEntity())
|
||||
.addPotionEffect(new PotionEffect(MobEffects.SLOWNESS, 20, 2));
|
||||
}
|
||||
this.playSound(WizardrySounds.ENTITY_MAGIC_SLIME_ATTACK, 1.0f, 1.0f);
|
||||
this.squishAmount = 0.5F;
|
||||
}
|
||||
|
||||
@@ -503,7 +503,6 @@ public class EntityWizard extends EntityCreature implements INpc, IMerchant, ISp
|
||||
ItemStack anySpellBook = new ItemStack(WizardryItems.spell_book, 1, OreDictionary.WILDCARD_VALUE);
|
||||
ItemStack crystalStack = new ItemStack(WizardryItems.magic_crystal, 5);
|
||||
|
||||
// NOTE: For wizardry 1.2, increase the number of uses of this trade. The default is 7, for reference.
|
||||
this.trades.add(new MerchantRecipe(anySpellBook, crystalStack));
|
||||
|
||||
this.addRandomRecipes(3);
|
||||
|
||||
@@ -9,7 +9,6 @@ import electroblob.wizardry.util.MagicDamage.DamageType;
|
||||
import electroblob.wizardry.util.ParticleBuilder;
|
||||
import electroblob.wizardry.util.WizardryUtilities;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.EntityLiving;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.potion.PotionEffect;
|
||||
@@ -48,13 +47,7 @@ public class EntityIceball extends EntityMagicProjectile {
|
||||
|
||||
}else{
|
||||
|
||||
boolean flag = true;
|
||||
|
||||
if(this.getThrower() != null && this.getThrower() instanceof EntityLiving){
|
||||
flag = net.minecraftforge.event.ForgeEventFactory.getMobGriefingEvent(this.world, this.getThrower());
|
||||
}
|
||||
|
||||
if(flag){
|
||||
if(this.getThrower() == null || WizardryUtilities.canDamageBlocks(this.getThrower(), world)){
|
||||
|
||||
BlockPos pos = rayTrace.getBlockPos();
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ package electroblob.wizardry.entity.projectile;
|
||||
import electroblob.wizardry.Wizardry;
|
||||
import electroblob.wizardry.registry.Spells;
|
||||
import electroblob.wizardry.spell.Spell;
|
||||
import electroblob.wizardry.util.WizardryUtilities;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import net.minecraft.entity.projectile.EntityLargeFireball;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
@@ -50,7 +51,7 @@ public class EntityLargeMagicFireball extends EntityMagicFireball {
|
||||
protected void onImpact(RayTraceResult rayTrace){
|
||||
|
||||
if(!world.isRemote){
|
||||
boolean flag = net.minecraftforge.event.ForgeEventFactory.getMobGriefingEvent(this.world, this.thrower);
|
||||
boolean flag = this.getThrower() == null || WizardryUtilities.canDamageBlocks(this.getThrower(), world);
|
||||
this.world.newExplosion(null, this.posX, this.posY, this.posZ, getExplosionPower() * blastMultiplier, flag, flag);
|
||||
}
|
||||
|
||||
|
||||
@@ -6,9 +6,9 @@ import electroblob.wizardry.spell.Spell;
|
||||
import electroblob.wizardry.util.MagicDamage;
|
||||
import electroblob.wizardry.util.MagicDamage.DamageType;
|
||||
import electroblob.wizardry.util.ParticleBuilder;
|
||||
import electroblob.wizardry.util.WizardryUtilities;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.EntityLiving;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.entity.projectile.EntitySmallFireball;
|
||||
import net.minecraft.init.Blocks;
|
||||
@@ -84,13 +84,7 @@ public class EntityMagicFireball extends EntityMagicProjectile {
|
||||
|
||||
}else{
|
||||
|
||||
boolean flag = true;
|
||||
|
||||
if(this.getThrower() != null && this.getThrower() instanceof EntityLiving){
|
||||
flag = net.minecraftforge.event.ForgeEventFactory.getMobGriefingEvent(this.world, this.getThrower());
|
||||
}
|
||||
|
||||
if(flag){
|
||||
if(this.getThrower() == null || WizardryUtilities.canDamageBlocks(this.getThrower(), world)){
|
||||
|
||||
BlockPos blockpos = rayTrace.getBlockPos().offset(rayTrace.sideHit);
|
||||
|
||||
|
||||
+27
-3
@@ -1,11 +1,17 @@
|
||||
package electroblob.wizardry.integration.antiqueatlas;
|
||||
|
||||
import electroblob.wizardry.Wizardry;
|
||||
import hunternif.mc.atlas.AntiqueAtlasMod;
|
||||
import hunternif.mc.atlas.api.AtlasAPI;
|
||||
import hunternif.mc.atlas.marker.GlobalMarkersData;
|
||||
import hunternif.mc.atlas.marker.Marker;
|
||||
import hunternif.mc.atlas.registry.MarkerType;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.event.world.WorldEvent;
|
||||
import net.minecraftforge.fml.common.Loader;
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
|
||||
/**
|
||||
* This class handles all of wizardry's integration with the <i>Antique Atlas</i> mod. This class contains only the code
|
||||
@@ -15,6 +21,7 @@ import net.minecraftforge.fml.common.Loader;
|
||||
* @since Wizardry 4.2
|
||||
* @author Electroblob
|
||||
*/
|
||||
@Mod.EventBusSubscriber
|
||||
public class WizardryAntiqueAtlasIntegration {
|
||||
|
||||
public static final String ANTIQUE_ATLAS_MOD_ID = "antiqueatlas";
|
||||
@@ -38,7 +45,7 @@ public class WizardryAntiqueAtlasIntegration {
|
||||
* {@link electroblob.wizardry.Settings#autoTowerMarkers} is enabled. Server side only! */
|
||||
public static void markTower(World world, int x, int z){
|
||||
if(enabled() && Wizardry.settings.autoTowerMarkers){
|
||||
AtlasAPI.getMarkerAPI().putGlobalMarker(world, false, TOWER_MARKER.toString().replace(':', '.'), "integration.antiqueatlas.marker." + TOWER_MARKER.toString(), x, z);
|
||||
AtlasAPI.getMarkerAPI().putGlobalMarker(world, false, TOWER_MARKER.toString(), "integration.antiqueatlas.marker." + TOWER_MARKER.toString().replace(':', '.'), x, z);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,7 +53,7 @@ public class WizardryAntiqueAtlasIntegration {
|
||||
* {@link electroblob.wizardry.Settings#autoObeliskMarkers} is enabled. Server side only! */
|
||||
public static void markObelisk(World world, int x, int z){
|
||||
if(enabled() && Wizardry.settings.autoObeliskMarkers){
|
||||
AtlasAPI.getMarkerAPI().putGlobalMarker(world, false, OBELISK_MARKER.toString().replace(':', '.'), "integration.antiqueatlas.marker." + OBELISK_MARKER.toString(), x, z);
|
||||
AtlasAPI.getMarkerAPI().putGlobalMarker(world, false, OBELISK_MARKER.toString(), "integration.antiqueatlas.marker." + OBELISK_MARKER.toString().replace(':', '.'), x, z);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,7 +61,7 @@ public class WizardryAntiqueAtlasIntegration {
|
||||
* {@link electroblob.wizardry.Settings#autoShrineMarkers} is enabled. Server side only! */
|
||||
public static void markShrine(World world, int x, int z){
|
||||
if(enabled() && Wizardry.settings.autoShrineMarkers){
|
||||
AtlasAPI.getMarkerAPI().putGlobalMarker(world, false, SHRINE_MARKER.toString().replace(':', '.'), "integration.antiqueatlas.marker." + SHRINE_MARKER.toString(), x, z);
|
||||
AtlasAPI.getMarkerAPI().putGlobalMarker(world, false, SHRINE_MARKER.toString(), "integration.antiqueatlas.marker." + SHRINE_MARKER.toString().replace(':', '.'), x, z);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -68,4 +75,21 @@ public class WizardryAntiqueAtlasIntegration {
|
||||
AtlasAPI.getMarkerAPI().registerMarker(new MarkerType(OBELISK_MARKER, new ResourceLocation(Wizardry.MODID, "textures/integration/antiqueatlas/obelisk.png")));
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public static void onWorldLoadEvent(WorldEvent.Load event){
|
||||
|
||||
if(!enabled()) return;
|
||||
|
||||
// Backwards compatibility for existing markers using the old translation key format (with colons)
|
||||
GlobalMarkersData data = AntiqueAtlasMod.globalMarkersData.getData();
|
||||
for(Marker marker : data.getMarkersInDimension(event.getWorld().provider.getDimension())){
|
||||
if(marker.getLabel().contains(":")){
|
||||
// Remove old-format markers and replace them with new ones
|
||||
data.removeMarker(marker.getId());
|
||||
AtlasAPI.getMarkerAPI().putGlobalMarker(event.getWorld(), marker.isVisibleAhead(), marker.getType(),
|
||||
marker.getLabel().replace(':', '.'), marker.getX(), marker.getZ());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -13,6 +13,8 @@ import electroblob.wizardry.registry.WizardryRecipes;
|
||||
import electroblob.wizardry.registry.WizardryTabs;
|
||||
import electroblob.wizardry.util.SpellModifiers;
|
||||
import electroblob.wizardry.util.WizardryUtilities;
|
||||
import net.minecraft.enchantment.Enchantment;
|
||||
import net.minecraft.enchantment.EnchantmentMending;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.EntityLiving;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
@@ -194,7 +196,13 @@ public class ItemWizardArmour extends ItemArmor implements IWorkbenchItem, IMana
|
||||
public boolean getIsRepairable(ItemStack stack, ItemStack material){
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// This is misleadingly-named, it also applies to enchanting with books at an anvil
|
||||
@Override
|
||||
public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment){
|
||||
return !(enchantment instanceof EnchantmentMending) && super.canApplyAtEnchantingTable(stack, enchantment);
|
||||
}
|
||||
|
||||
/**
|
||||
* Properly handles the defence value of the armour. This method is responsible for the tooltip on top of
|
||||
* the armour value. It is also what handles armour toughness.
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
package electroblob.wizardry.misc;
|
||||
|
||||
import electroblob.wizardry.util.WizardryUtilities;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.nbt.NBTUtil;
|
||||
import net.minecraft.network.PacketBuffer;
|
||||
import net.minecraft.village.MerchantRecipe;
|
||||
import net.minecraft.village.MerchantRecipeList;
|
||||
import net.minecraftforge.oredict.OreDictionary;
|
||||
@@ -46,12 +48,42 @@ public class WildcardTradeList extends MerchantRecipeList {
|
||||
}
|
||||
|
||||
private boolean areItemStacksExactlyEqual(ItemStack stack1, ItemStack stack2){
|
||||
// Added to allow wildcards; this line is the only actual change.
|
||||
// Added to allow wildcards
|
||||
if((stack1.getItemDamage() == OreDictionary.WILDCARD_VALUE || stack2.getItemDamage() == OreDictionary.WILDCARD_VALUE)
|
||||
// Can't use ItemStack.areItemsEqualIgnoreDurability because that only works for items with durability, not subtypes.
|
||||
&& stack1.getItem() == stack2.getItem()) return true;
|
||||
|
||||
return ItemStack.areItemsEqual(stack1, stack2) && (!stack2.hasTagCompound() || stack1.hasTagCompound() && NBTUtil.areNBTEquals(stack2.getTagCompound(), stack1.getTagCompound(), false));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToBuf(PacketBuffer buffer){
|
||||
|
||||
buffer.writeByte((byte)(this.size() & 255));
|
||||
|
||||
// Trick the client into thinking this is a normal item
|
||||
for(MerchantRecipe merchantrecipe : this){
|
||||
|
||||
ItemStack itemToBuy = merchantrecipe.getItemToBuy();
|
||||
if(itemToBuy.getMetadata() == OreDictionary.WILDCARD_VALUE) itemToBuy = WizardryUtilities.copyWithMeta(itemToBuy, 0);
|
||||
buffer.writeItemStack(itemToBuy);
|
||||
|
||||
ItemStack itemToSell = merchantrecipe.getItemToSell();
|
||||
if(itemToSell.getMetadata() == OreDictionary.WILDCARD_VALUE) itemToSell = WizardryUtilities.copyWithMeta(itemToSell, 0);
|
||||
buffer.writeItemStack(itemToSell);
|
||||
|
||||
ItemStack secondItemToBuy = merchantrecipe.getSecondItemToBuy();
|
||||
buffer.writeBoolean(!secondItemToBuy.isEmpty());
|
||||
|
||||
if(!secondItemToBuy.isEmpty()){
|
||||
if(secondItemToBuy.getMetadata() == OreDictionary.WILDCARD_VALUE) secondItemToBuy = WizardryUtilities.copyWithMeta(secondItemToBuy, 0);
|
||||
buffer.writeItemStack(secondItemToBuy);
|
||||
}
|
||||
|
||||
buffer.writeBoolean(merchantrecipe.isRecipeDisabled());
|
||||
buffer.writeInt(merchantrecipe.getToolUses());
|
||||
buffer.writeInt(merchantrecipe.getMaxTradeUses());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@ public class PacketSyncSettings implements IMessageHandler<Message, IMessage> {
|
||||
Wizardry.settings.discoveryMode = message.settings.discoveryMode;
|
||||
Wizardry.settings.creativeBypassesArcaneLock = message.settings.creativeBypassesArcaneLock;
|
||||
Wizardry.settings.slowTimeAffectsPlayers = message.settings.slowTimeAffectsPlayers;
|
||||
Wizardry.settings.replaceVanillaFireballs = message.settings.replaceVanillaFireballs;
|
||||
Wizardry.settings.forfeitChance = message.settings.forfeitChance;
|
||||
}
|
||||
|
||||
@@ -56,6 +57,7 @@ public class PacketSyncSettings implements IMessageHandler<Message, IMessage> {
|
||||
settings.discoveryMode = buf.readBoolean();
|
||||
settings.creativeBypassesArcaneLock = buf.readBoolean();
|
||||
settings.slowTimeAffectsPlayers = buf.readBoolean();
|
||||
settings.replaceVanillaFireballs = buf.readBoolean();
|
||||
settings.forfeitChance = buf.readFloat();
|
||||
}
|
||||
|
||||
@@ -64,6 +66,7 @@ public class PacketSyncSettings implements IMessageHandler<Message, IMessage> {
|
||||
buf.writeBoolean(settings.discoveryMode);
|
||||
buf.writeBoolean(settings.creativeBypassesArcaneLock);
|
||||
buf.writeBoolean(settings.slowTimeAffectsPlayers);
|
||||
buf.writeBoolean(settings.replaceVanillaFireballs);
|
||||
buf.writeFloat((float)settings.forfeitChance); // Configs don't have floats but this can only be 0-1 anyway
|
||||
}
|
||||
}
|
||||
|
||||
@@ -172,9 +172,9 @@ public class PotionSlowTime extends PotionMagicEffect implements ISyncedPotion {
|
||||
@SubscribeEvent
|
||||
public static void onPotionAddedEvent(PotionEvent.PotionAddedEvent event){
|
||||
if(event.getEntity().world.isRemote && event.getPotionEffect().getPotion() == WizardryPotions.slow_time
|
||||
&& event.getEntity() == net.minecraft.client.Minecraft.getMinecraft().player){
|
||||
if(Wizardry.settings.useShaders) net.minecraft.client.Minecraft.getMinecraft().entityRenderer.loadShader(SlowTime.SHADER);
|
||||
electroblob.wizardry.client.WizardryClientEventHandler.playBlinkEffect();
|
||||
&& event.getEntity() instanceof EntityPlayer){
|
||||
Wizardry.proxy.loadShader((EntityPlayer)event.getEntity(), SlowTime.SHADER);
|
||||
Wizardry.proxy.playBlinkEffect((EntityPlayer)event.getEntity());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -67,6 +67,9 @@ public final class WizardryLoot {
|
||||
LootTableList.register(new ResourceLocation(Wizardry.MODID, "subsets/wizard_armour"));
|
||||
LootTableList.register(new ResourceLocation(Wizardry.MODID, "subsets/arcane_tomes"));
|
||||
LootTableList.register(new ResourceLocation(Wizardry.MODID, "subsets/wand_upgrades"));
|
||||
LootTableList.register(new ResourceLocation(Wizardry.MODID, "subsets/uncommon_artefacts"));
|
||||
LootTableList.register(new ResourceLocation(Wizardry.MODID, "subsets/rare_artefacts"));
|
||||
LootTableList.register(new ResourceLocation(Wizardry.MODID, "subsets/epic_artefacts"));
|
||||
LootTableList.register(new ResourceLocation(Wizardry.MODID, "entities/evil_wizard"));
|
||||
LootTableList.register(new ResourceLocation(Wizardry.MODID, "entities/mob_additions"));
|
||||
|
||||
|
||||
@@ -91,9 +91,6 @@ public class Divination extends Spell {
|
||||
(float)(target.getY() + 0.5 - (caster.getEntityBoundingBox().minY + caster.getEyeHeight())),
|
||||
(float)(target.getZ() + 0.5 - caster.posZ));
|
||||
|
||||
if(world.isRemote) ParticleBuilder.create(ParticleBuilder.Type.SPARKLE).pos(target.getX() + 0.5,
|
||||
target.getY() + 1.5, target.getZ() + 0.5).spawn(world);
|
||||
|
||||
strength = Strength.forWeight(calculateWeight(world, caster, target, range, modifiers));
|
||||
}
|
||||
|
||||
|
||||
@@ -210,6 +210,8 @@ public class Grapple extends Spell {
|
||||
@Override
|
||||
public boolean cast(World world, EntityLiving caster, EnumHand hand, int ticksInUse, EntityLivingBase target, SpellModifiers modifiers){
|
||||
|
||||
if(target == null) return false;
|
||||
|
||||
Vec3d origin = new Vec3d(caster.posX, caster.getEntityBoundingBox().minY + caster.getEyeHeight(), caster.posZ);
|
||||
|
||||
// If the target is an entity, we need to use the entity's centre rather than the original hit position
|
||||
|
||||
@@ -18,6 +18,7 @@ import net.minecraft.item.EnumAction;
|
||||
import net.minecraft.network.play.server.SPacketEntityVelocity;
|
||||
import net.minecraft.tileentity.TileEntityDispenser;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.EnumHand;
|
||||
import net.minecraft.util.SoundEvent;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
@@ -86,7 +87,8 @@ public class GreaterTelekinesis extends SpellRay {
|
||||
|
||||
Vec3d look = caster.getLookVec().scale(getProperty(THROW_VELOCITY).floatValue() * modifiers.get(WizardryItems.range_upgrade));
|
||||
target.addVelocity(look.x, look.y, look.z);
|
||||
if(caster instanceof EntityPlayer) caster.swingArm(caster.getActiveHand());
|
||||
// No IntelliJ, it's not always false, that's not how polymorphism works
|
||||
if(caster instanceof EntityPlayer) caster.swingArm(caster.getActiveHand() == null ? EnumHand.MAIN_HAND : caster.getActiveHand());
|
||||
|
||||
}else{
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ import electroblob.wizardry.util.ParticleBuilder;
|
||||
import electroblob.wizardry.util.SpellModifiers;
|
||||
import electroblob.wizardry.util.WizardryUtilities;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.EntityLiving;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.item.EnumAction;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
@@ -19,6 +20,11 @@ public class HealAlly extends SpellRay {
|
||||
addProperties(HEALTH);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canBeCastBy(EntityLiving npc, boolean override){
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onEntityHit(World world, Entity target, Vec3d hit, EntityLivingBase caster, Vec3d origin, int ticksInUse, SpellModifiers modifiers){
|
||||
|
||||
|
||||
@@ -201,6 +201,8 @@ public class Possession extends SpellRay {
|
||||
*/
|
||||
public boolean possess(EntityPlayer possessor, EntityLiving target, int duration){
|
||||
|
||||
if(possessor.isSneaking()) return false;
|
||||
|
||||
if(WizardData.get(possessor) != null){
|
||||
|
||||
WizardData.get(possessor).setVariable(POSSESSEE_KEY, target);
|
||||
@@ -210,6 +212,7 @@ public class Possession extends SpellRay {
|
||||
possessor.eyeHeight = target.getEyeHeight();
|
||||
setSize(possessor, target.width, target.height);
|
||||
|
||||
target.dismountRidingEntity();
|
||||
target.setDead();
|
||||
target.setNoAI(true);
|
||||
target.setAttackTarget(null);
|
||||
@@ -249,10 +252,10 @@ public class Possession extends SpellRay {
|
||||
}
|
||||
}
|
||||
|
||||
if(possessor.world.isRemote && possessor == net.minecraft.client.Minecraft.getMinecraft().player){
|
||||
if(possessor.world.isRemote){
|
||||
// Shaders and effects
|
||||
if(Wizardry.settings.useShaders) net.minecraft.client.Minecraft.getMinecraft().entityRenderer.loadShader(SHADER);
|
||||
electroblob.wizardry.client.WizardryClientEventHandler.playBlinkEffect(); // Looks quite nice...
|
||||
Wizardry.proxy.loadShader(possessor, SHADER);
|
||||
Wizardry.proxy.playBlinkEffect(possessor);
|
||||
|
||||
}else{
|
||||
|
||||
@@ -346,7 +349,7 @@ public class Possession extends SpellRay {
|
||||
|
||||
if(player.world.isRemote && player == net.minecraft.client.Minecraft.getMinecraft().player){
|
||||
net.minecraft.client.Minecraft.getMinecraft().entityRenderer.stopUseShader();
|
||||
electroblob.wizardry.client.WizardryClientEventHandler.playBlinkEffect(); // Looks quite nice...
|
||||
Wizardry.proxy.playBlinkEffect(player);
|
||||
}
|
||||
|
||||
for(IAttribute attribute : INHERITED_ATTRIBUTES.keySet()){
|
||||
@@ -397,9 +400,7 @@ public class Possession extends SpellRay {
|
||||
|
||||
if(player.world.isRemote){
|
||||
ParticleBuilder.create(Type.DARK_MAGIC, player).clr(0.1f, 0, 0.3f).spawn(player.world);
|
||||
// TODO: This (and a few other similar uses) needs ClientProxy-ing.
|
||||
if(!net.minecraft.client.Minecraft.getMinecraft().entityRenderer.isShaderActive())
|
||||
if(Wizardry.settings.useShaders) net.minecraft.client.Minecraft.getMinecraft().entityRenderer.loadShader(SHADER);
|
||||
Wizardry.proxy.loadShader(player, SHADER);
|
||||
}
|
||||
|
||||
}else{
|
||||
@@ -683,11 +684,13 @@ public class Possession extends SpellRay {
|
||||
|
||||
if(possessee != null){
|
||||
|
||||
if(possessee.canPickUpLoot() && possessee.getHeldItemMainhand().isEmpty()){
|
||||
possessee.setHeldItem(EnumHand.MAIN_HAND, event.getItem().getItem());
|
||||
}else{
|
||||
event.setCanceled(true);
|
||||
}
|
||||
event.setCanceled(true);
|
||||
|
||||
// if(possessee.canPickUpLoot() && possessee.getHeldItemMainhand().isEmpty()){
|
||||
// possessee.setHeldItem(EnumHand.MAIN_HAND, event.getItem().getItem());
|
||||
// }else{
|
||||
// event.setCanceled(true);
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -39,9 +39,9 @@ public class SixthSense extends Spell {
|
||||
(int)(getProperty(EFFECT_DURATION).floatValue() * modifiers.get(WizardryItems.duration_upgrade)),
|
||||
(int)((modifiers.get(WizardryItems.range_upgrade) - 1f) / Constants.RANGE_INCREASE_PER_LEVEL)));
|
||||
|
||||
if(world.isRemote && caster == net.minecraft.client.Minecraft.getMinecraft().player){
|
||||
if(Wizardry.settings.useShaders) net.minecraft.client.Minecraft.getMinecraft().entityRenderer.loadShader(SHADER);
|
||||
electroblob.wizardry.client.WizardryClientEventHandler.playBlinkEffect();
|
||||
if(world.isRemote){
|
||||
Wizardry.proxy.loadShader(caster, SHADER);
|
||||
Wizardry.proxy.playBlinkEffect(caster);
|
||||
}
|
||||
|
||||
this.playSound(world, caster, ticksInUse, -1, modifiers);
|
||||
@@ -51,9 +51,9 @@ public class SixthSense extends Spell {
|
||||
@SubscribeEvent
|
||||
public static void onPotionAddedEvent(PotionEvent.PotionAddedEvent event){
|
||||
if(event.getEntity().world.isRemote && event.getPotionEffect().getPotion() == WizardryPotions.sixth_sense
|
||||
&& event.getEntity() == net.minecraft.client.Minecraft.getMinecraft().player){
|
||||
if(Wizardry.settings.useShaders) net.minecraft.client.Minecraft.getMinecraft().entityRenderer.loadShader(SHADER);
|
||||
electroblob.wizardry.client.WizardryClientEventHandler.playBlinkEffect();
|
||||
&& event.getEntity() instanceof EntityPlayer){
|
||||
Wizardry.proxy.loadShader((EntityPlayer)event.getEntity(), SHADER);
|
||||
Wizardry.proxy.playBlinkEffect((EntityPlayer)event.getEntity());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -24,8 +24,8 @@ public class SlowTime extends SpellBuff {
|
||||
@Override
|
||||
public boolean cast(World world, EntityPlayer caster, EnumHand hand, int ticksInUse, SpellModifiers modifiers){
|
||||
|
||||
if(caster.world.isRemote && caster == net.minecraft.client.Minecraft.getMinecraft().player){
|
||||
if(Wizardry.settings.useShaders) net.minecraft.client.Minecraft.getMinecraft().entityRenderer.loadShader(SHADER);
|
||||
if(caster.world.isRemote){
|
||||
Wizardry.proxy.loadShader(caster, SHADER);
|
||||
}
|
||||
|
||||
return super.cast(world, caster, hand, ticksInUse, modifiers);
|
||||
|
||||
@@ -38,9 +38,9 @@ public class Transience extends Spell {
|
||||
@Override
|
||||
public boolean cast(World world, EntityPlayer caster, EnumHand hand, int ticksInUse, SpellModifiers modifiers){
|
||||
|
||||
if(world.isRemote && caster == net.minecraft.client.Minecraft.getMinecraft().player){
|
||||
if(Wizardry.settings.useShaders) net.minecraft.client.Minecraft.getMinecraft().entityRenderer.loadShader(SHADER);
|
||||
electroblob.wizardry.client.WizardryClientEventHandler.playBlinkEffect();
|
||||
if(world.isRemote){
|
||||
Wizardry.proxy.loadShader(caster, SHADER);
|
||||
Wizardry.proxy.playBlinkEffect(caster);
|
||||
}
|
||||
|
||||
if(!caster.isPotionActive(WizardryPotions.transience)){
|
||||
@@ -87,9 +87,9 @@ public class Transience extends Spell {
|
||||
@SubscribeEvent
|
||||
public static void onPotionAddedEvent(PotionEvent.PotionAddedEvent event){
|
||||
if(event.getEntity().world.isRemote && event.getPotionEffect().getPotion() == WizardryPotions.transience
|
||||
&& event.getEntity() == net.minecraft.client.Minecraft.getMinecraft().player){
|
||||
if(Wizardry.settings.useShaders) net.minecraft.client.Minecraft.getMinecraft().entityRenderer.loadShader(SHADER);
|
||||
electroblob.wizardry.client.WizardryClientEventHandler.playBlinkEffect();
|
||||
&& event.getEntity() instanceof EntityPlayer){
|
||||
Wizardry.proxy.loadShader((EntityPlayer)event.getEntity(), SHADER);
|
||||
Wizardry.proxy.playBlinkEffect((EntityPlayer)event.getEntity());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@ import net.minecraft.inventory.EntityEquipmentSlot;
|
||||
import net.minecraft.inventory.EntityEquipmentSlot.Type;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.network.datasync.DataParameter;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.util.*;
|
||||
@@ -634,7 +635,7 @@ public final class WizardryUtilities {
|
||||
// This is a perfect example of where you need to use .equals() and not ==. For most applications,
|
||||
// this was unnoticeable until world reload because the UUID instance or entity instance is stored.
|
||||
// Fixed now though.
|
||||
if(entity.getUniqueID().equals(id)){
|
||||
if(entity != null && entity.getUniqueID() != null && entity.getUniqueID().equals(id)){
|
||||
return entity;
|
||||
}
|
||||
}
|
||||
@@ -795,6 +796,20 @@ public final class WizardryUtilities {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a new {@link ItemStack} that is identical to the supplied one, except with the metadata changed to the
|
||||
* new value given.
|
||||
* @param toCopy The stack to copy
|
||||
* @param newMetadata The new metadata value
|
||||
* @return The resulting {@link ItemStack}
|
||||
*/
|
||||
public static ItemStack copyWithMeta(ItemStack toCopy, int newMetadata){
|
||||
ItemStack copy = new ItemStack(toCopy.getItem(), toCopy.getCount(), newMetadata);
|
||||
NBTTagCompound compound = toCopy.getTagCompound();
|
||||
if(compound != null) copy.setTagCompound(compound.copy());
|
||||
return copy;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the given player is opped on the given server. If the server is a singleplayer or LAN server, this
|
||||
* means they have cheats enabled.
|
||||
|
||||
@@ -144,6 +144,9 @@ public abstract class WorldGenSurfaceStructure implements IWorldGenerator {
|
||||
|
||||
// Estimate a starting height for searching for the floor
|
||||
BlockPos centre = world.getTopSolidOrLiquidBlock(new BlockPos(origin.add(size.getX()/2, 0, size.getZ()/2)));
|
||||
// Check if we're at the top of the world, and if so just randomise the y pos (accounts for 'cavern' dimensions)
|
||||
if(centre.getY() >= world.getActualHeight()) centre = new BlockPos(centre.getX(), random.nextInt(world.getActualHeight()), centre.getZ());
|
||||
|
||||
Integer startingHeight = WizardryUtilities.getNearestSurface(world, centre, EnumFacing.UP, 32, true,
|
||||
WizardryUtilities.SurfaceCriteria.COLLIDABLE_IGNORING_TREES);
|
||||
|
||||
|
||||
@@ -836,7 +836,7 @@ spell.ebwizardry\:poison_bomb.desc=Schießt eine Giftbombe in die Richtung, in d
|
||||
spell.ebwizardry\:possession.desc="Werde dein Feind."
|
||||
spell.ebwizardry\:ray_of_purification.desc=Sendet einen blendenden Lichtstrahl aus, der seine Ziele verletzt und blendet. Untote Kreaturen erleiden doppelten Schaden und werden in Brand gesteckt.
|
||||
spell.ebwizardry\:remove_curse.desc=Entfernt alle Flüche, die den Magier derzeit betreffen.
|
||||
spell.ebwizardry\:replenish_hunger.desc=Füllt den Hungerbalken des Magiers um 4 Hungerpunkte auf.
|
||||
spell.ebwizardry\:replenish_hunger.desc=Füllt den Hungerbalken des Magiers um 3 Hungerpunkte auf.
|
||||
spell.ebwizardry\:resurrection.desc=Mit einem Meisterheiler an Ihrer Seite, ist tot zu sein... optional.
|
||||
spell.ebwizardry\:reversal.desc=Entfernt einen zufälligen negativen Trankeffekt und fügt ihn dem Ziel zu, das diesen Effekt für die verbleibende Dauer erleiden wird. Die Stufe erhöht die Anzahl der Effekte, die umgekehrt werden.
|
||||
spell.ebwizardry\:ring_of_fire.desc=Erzeugt einen Feuerring um den Magier, der alle Feinde in der Nähe schädigt und sie in Brand setzt.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#PARSE_ESCAPES
|
||||
# PARSE_ESCAPES
|
||||
tile.ebwizardry\:arcane_workbench.name=Arcane Workbench
|
||||
tile.ebwizardry\:crystal_ore.name=Crystal Ore
|
||||
tile.ebwizardry\:petrified_stone.name=Petrified Stone
|
||||
@@ -498,6 +498,13 @@ advancement.ebwizardry\:enchant_scroll.desc=Craft a blank scroll and enchant it
|
||||
|
||||
handbook.toast.title=New Handbook Section Unlocked!
|
||||
|
||||
gui.ebwizardry\:spell_book.tier=Tier: %s
|
||||
gui.ebwizardry\:spell_book.element=Element: %s
|
||||
gui.ebwizardry\:spell_book.element_undiscovered=Element: ?
|
||||
gui.ebwizardry\:spell_book.mana_cost=Mana Cost: %s
|
||||
gui.ebwizardry\:spell_book.mana_cost_continuous=Mana Cost: %s/second
|
||||
gui.ebwizardry\:spell_book.mana_cost_undiscovered=Mana Cost: ?
|
||||
|
||||
container.ebwizardry\:arcane_workbench=Arcane Workbench
|
||||
container.ebwizardry\:arcane_workbench.apply=Apply
|
||||
container.ebwizardry\:arcane_workbench.mana=Mana\:
|
||||
@@ -836,7 +843,7 @@ spell.ebwizardry\:poison_bomb.desc=Lanches a poison bomb in the direction you ar
|
||||
spell.ebwizardry\:possession.desc="Become thy enemy."
|
||||
spell.ebwizardry\:ray_of_purification.desc=Emits a ray of blinding light that damages and blinds its targets. Undead creatures take double damage and are set on fire.
|
||||
spell.ebwizardry\:remove_curse.desc=Removes any curse currently affecting the caster.
|
||||
spell.ebwizardry\:replenish_hunger.desc=Replenishes the caster's food level by 4 hunger points.
|
||||
spell.ebwizardry\:replenish_hunger.desc=Replenishes the caster's food level by 3 hunger points.
|
||||
spell.ebwizardry\:resurrection.desc=With a master healer by your side, being dead is... optional.
|
||||
spell.ebwizardry\:reversal.desc=Removes a random negative potion effect and inflicts it upon the target, which will suffer that effect for the remaining duration. Potency increases the number of effects that are reversed.
|
||||
spell.ebwizardry\:ring_of_fire.desc=Creates a ring of fire around the caster, damaging all nearby enemies and setting them on fire.
|
||||
@@ -1227,6 +1234,10 @@ config.ebwizardry.use_shaders=Use Custom Shaders
|
||||
config.ebwizardry.use_shaders.tooltip=Whether to use custom shaders for certain spells. These use the vanilla shader system (like mob spectating shaders) and shouldn't have much of an effect on performance in most cases, but they may conflict with other shaders.
|
||||
config.ebwizardry.use_shaders.true=Yes - gimme those sweet shaders!
|
||||
config.ebwizardry.use_shaders.false=No - I'm running this on a potato
|
||||
config.ebwizardry.screen_shake=Screen Shake
|
||||
config.ebwizardry.screen_shake.tooltip=Whether to use the screen shake effect for certain spells.
|
||||
config.ebwizardry.blink_effect=Blink Effect
|
||||
config.ebwizardry.blink_effect.tooltip=Whether to use the screen blink effect for teleportation spells.
|
||||
|
||||
config.ebwizardry.category.commands=Command Settings
|
||||
config.ebwizardry.category.commands.tooltip=Configure wizardry's commands
|
||||
|
||||
@@ -498,6 +498,13 @@ advancement.ebwizardry\:enchant_scroll.desc=Craft a blank scroll and enchant it
|
||||
|
||||
handbook.toast.title=New Handbook Section Unlocked!
|
||||
|
||||
gui.ebwizardry\:spell_book.tier=Tier: %s
|
||||
gui.ebwizardry\:spell_book.element=Element: %s
|
||||
gui.ebwizardry\:spell_book.element_undiscovered=Element: ?
|
||||
gui.ebwizardry\:spell_book.mana_cost=Mana Cost: %s
|
||||
gui.ebwizardry\:spell_book.mana_cost_continuous=Mana Cost: %s/second
|
||||
gui.ebwizardry\:spell_book.mana_cost_undiscovered=Mana Cost: ?
|
||||
|
||||
container.ebwizardry\:arcane_workbench=Arcane Workbench
|
||||
container.ebwizardry\:arcane_workbench.apply=Apply
|
||||
container.ebwizardry\:arcane_workbench.mana=Mana\:
|
||||
@@ -836,7 +843,7 @@ spell.ebwizardry\:poison_bomb.desc=Lanches a poison bomb in the direction you ar
|
||||
spell.ebwizardry\:possession.desc="Become thy enemy."
|
||||
spell.ebwizardry\:ray_of_purification.desc=Emits a ray of blinding light that damages and blinds its targets. Undead creatures take double damage and are set on fire.
|
||||
spell.ebwizardry\:remove_curse.desc=Removes any curse currently affecting the caster.
|
||||
spell.ebwizardry\:replenish_hunger.desc=Replenishes the caster's food level by 4 hunger points.
|
||||
spell.ebwizardry\:replenish_hunger.desc=Replenishes the caster's food level by 3 hunger points.
|
||||
spell.ebwizardry\:resurrection.desc=With a master healer by your side, being dead is... optional.
|
||||
spell.ebwizardry\:reversal.desc=Removes a random negative potion effect and inflicts it upon the target, which will suffer that effect for the remaining duration. Potency increases the number of effects that are reversed.
|
||||
spell.ebwizardry\:ring_of_fire.desc=Creates a ring of fire around the caster, damaging all nearby enemies and setting them on fire.
|
||||
@@ -1227,6 +1234,10 @@ config.ebwizardry.use_shaders=Use Custom Shaders
|
||||
config.ebwizardry.use_shaders.tooltip=Whether to use custom shaders for certain spells. These use the vanilla shader system (like mob spectating shaders) and shouldn't have much of an effect on performance in most cases, but they may conflict with other shaders.
|
||||
config.ebwizardry.use_shaders.true=Yes - gimme those sweet shaders!
|
||||
config.ebwizardry.use_shaders.false=No - I'm running this on a potato
|
||||
config.ebwizardry.screen_shake=Screen Shake
|
||||
config.ebwizardry.screen_shake.tooltip=Whether to use the screen shake effect for certain spells.
|
||||
config.ebwizardry.blink_effect=Blink Effect
|
||||
config.ebwizardry.blink_effect.tooltip=Whether to use the screen blink effect for teleportation spells.
|
||||
|
||||
config.ebwizardry.category.commands=Command Settings
|
||||
config.ebwizardry.category.commands.tooltip=Configure wizardry's commands
|
||||
|
||||
@@ -837,7 +837,7 @@ spell.ebwizardry\:poison_bomb.desc=Wystrzeliwuje trującą bombę w pożądanym
|
||||
spell.ebwizardry\:possession.desc="Zostań swoim wrogiem."
|
||||
spell.ebwizardry\:ray_of_purification.desc=Emituje promień oślepiającego światła, który uszkadza i oślepia cele. Nieumarłe stworzenia otrzymują podwójne obrażenia i zostają podpalone.
|
||||
spell.ebwizardry\:remove_curse.desc=Usuwa wszelkie klątwy, które dzierży rzucający.
|
||||
spell.ebwizardry\:replenish_hunger.desc=Uzupełnia poziom głodu rzucającego o 4 punkty.
|
||||
spell.ebwizardry\:replenish_hunger.desc=Uzupełnia poziom głodu rzucającego o 3 punkty.
|
||||
spell.ebwizardry\:resurrection.desc=U boku głównego uzdrowiciela jest martwe... opcjonalne.
|
||||
spell.ebwizardry\:reversal.desc=Usuwa losowy zły efekt mikstury i przekazuje go celowi, który odczuje ten efekt przez pozostały czas. Potencja zwiększa liczbę odwróconych efektów.
|
||||
spell.ebwizardry\:ring_of_fire.desc=Tworzy pierścień ognia wokół rzucającego, uszkadzając wszystkich pobliskich wrogów i podpalając ich.
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -10,7 +10,7 @@
|
||||
{
|
||||
"type": "loot_table",
|
||||
"name": "ebwizardry:subsets/arcane_tomes",
|
||||
"weight": 3
|
||||
"weight": 4
|
||||
},
|
||||
{
|
||||
"type": "loot_table",
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
{
|
||||
"type": "loot_table",
|
||||
"name": "ebwizardry:subsets/arcane_tomes",
|
||||
"weight": 6
|
||||
"weight": 8
|
||||
},
|
||||
{
|
||||
"type": "loot_table",
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
{
|
||||
"type": "loot_table",
|
||||
"name": "ebwizardry:subsets/arcane_tomes",
|
||||
"weight": 4
|
||||
"weight": 5
|
||||
},
|
||||
{
|
||||
"type": "loot_table",
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
"type": "item",
|
||||
"entryName": "apprentice_tome",
|
||||
"name": "ebwizardry:arcane_tome",
|
||||
"weight": 3,
|
||||
"weight": 4,
|
||||
"functions": [
|
||||
{
|
||||
"function": "set_data",
|
||||
|
||||
@@ -7,7 +7,8 @@
|
||||
],
|
||||
"key": {
|
||||
"x": {
|
||||
"item": "minecraft:string"
|
||||
"type": "forge:ore_dict",
|
||||
"ore": "string"
|
||||
},
|
||||
"y": [
|
||||
{
|
||||
@@ -48,4 +49,4 @@
|
||||
"item": "ebwizardry:magic_silk",
|
||||
"count": 2
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
"chargeup": 0,
|
||||
"cooldown": 30,
|
||||
"base_properties": {
|
||||
"hunger_points": 3,
|
||||
"hunger_points": 6,
|
||||
"saturation_modifier": 0.1
|
||||
}
|
||||
}
|
||||
@@ -17,7 +17,7 @@
|
||||
"chargeup": 0,
|
||||
"cooldown": 50,
|
||||
"base_properties": {
|
||||
"hunger_points": 8,
|
||||
"hunger_points": 16,
|
||||
"saturation_modifier": 0.1
|
||||
}
|
||||
}
|
||||
@@ -732,11 +732,11 @@
|
||||
|
||||
"Code:",
|
||||
|
||||
"- Corail31 \n- 12foo \n- Shadows-of-Fire \n- HellFirePvP \n- Tora-B \n- Avatair \n- Aeronica",
|
||||
"- Corail31 \n- 12foo \n- Shadows-of-Fire \n- HellFirePvP \n- Tora-B \n- Avatair \n- Aeronica \n- UltraHex \n- Azim-Palmer \n- raoulvdberge \n- rafasoares",
|
||||
|
||||
"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",
|
||||
"- 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, Determancer \n- Korean: shejery, rewi_wire \n- Polish: Trozuu \n-German: BirdyDragon \n-Taiwanese: chesterccj305",
|
||||
|
||||
"Lightning ray sound effect from OhhWowProductions",
|
||||
|
||||
|
||||
@@ -732,11 +732,11 @@
|
||||
|
||||
"Code:",
|
||||
|
||||
"- Corail31 \n- 12foo \n- Shadows-of-Fire \n- HellFirePvP \n- Tora-B \n- Avatair \n- Aeronica",
|
||||
"- Corail31 \n- 12foo \n- Shadows-of-Fire \n- HellFirePvP \n- Tora-B \n- Avatair \n- Aeronica \n- UltraHex \n- Azim-Palmer \n- raoulvdberge \n- rafasoares",
|
||||
|
||||
"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",
|
||||
"- 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, Determancer \n- Korean: shejery, rewi_wire \n- Polish: Trozuu \n-German: BirdyDragon \n-Taiwanese: chesterccj305",
|
||||
|
||||
"Lightning ray sound effect from OhhWowProductions",
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"bookmark_start_section": "introduccion",
|
||||
|
||||
"bookmark_start_section": "introduction",
|
||||
|
||||
"colours": {
|
||||
"text": "#000000",
|
||||
"caption": "#666666",
|
||||
@@ -8,7 +8,7 @@
|
||||
"highlight": "#dd4c1d",
|
||||
"new_section": "#ee88f7"
|
||||
},
|
||||
|
||||
|
||||
"images": {
|
||||
"workbench": {
|
||||
"location": "ebwizardry:textures/gui/arcane_workbench_picture.png",
|
||||
@@ -226,26 +226,26 @@
|
||||
"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.",
|
||||
@@ -676,13 +676,13 @@
|
||||
"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",
|
||||
@@ -714,12 +714,12 @@
|
||||
"#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",
|
||||
@@ -732,11 +732,11 @@
|
||||
|
||||
"Codigo:",
|
||||
|
||||
"- Corail31 \n- 12foo \n- Shadows-of-Fire \n- HellFirePvP \n- Tora-B \n- Avatair \n- Aeronica",
|
||||
"- Corail31 \n- 12foo \n- Shadows-of-Fire \n- HellFirePvP \n- Tora-B \n- Avatair \n- Aeronica \n- UltraHex \n- Azim-Palmer \n- raoulvdberge \n- rafasoares",
|
||||
|
||||
"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",
|
||||
"- 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, Determancer \n- Koreano: shejery, rewi_wire \n- Polaco: Trozuu, \nAlemán: BirdyDragon",
|
||||
|
||||
"Efecto de sonido para los relámpagos por OhhWowProductions",
|
||||
|
||||
@@ -745,6 +745,6 @@
|
||||
"¿Te encanta este mod? ¡unete al @https://discord.gg/MTmMzMv servidor de Discord@ para las ultimas noticias,discusiones y extras!"
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,319 +0,0 @@
|
||||
PAGEBREAK
|
||||
LINEBREAK
|
||||
|
||||
|
||||
|
||||
|
||||
El Manual del Mago
|
||||
|
||||
|
||||
|
||||
Por Electroblob
|
||||
PAGEBREAK
|
||||
Introduccion
|
||||
--------------------
|
||||
|
||||
Saludos, mago! Este libro explica las diferentes formas de lo arcano y como
|
||||
usarlas.
|
||||
|
||||
Si alguna vez pierde este libro, lo puede volver a fabricar con un libro y un cristal magico.
|
||||
PAGEBREAK
|
||||
Contents
|
||||
--------------------
|
||||
PAGEBREAK
|
||||
SECTION Comenzando
|
||||
Comenzando
|
||||
--------------------
|
||||
Para iniciar con Wizardry, necesitaras algunas cosas:
|
||||
|
||||
- Una varita magica, crafteada con una pepita de oro, un palo y un cristal magico.
|
||||
|
||||
- Una Mesa de Trabajo Arcana, crafteada con 3 piedras, 1 bloque de lapis lazuli,
|
||||
2 cristales magicos, 2 pepitas de oro y 1 alfombra morada.
|
||||
|
||||
- Un libro de hechizos. Estos pueden ser encontrados en cofres, arrojados como botin,
|
||||
comprados a magos, o puedes hacer el hechizo del aprendiz, Misil Magico, con un
|
||||
libro y 4 cristales magicos.
|
||||
|
||||
Tambien necesitaras un monton de cristales magicos para suplir tu varita con mana.
|
||||
PAGEBREAK
|
||||
SECTION Mana
|
||||
Mana
|
||||
--------------------
|
||||
Mana es la energia arcana que le da a los magos sus poderes. Se manifiesta en cristales que aparecen naturalmente, los cuales aparecen incrustados bajo roca. Las varitas almacenan mana dentro de ellas, y este mana es canalizado en los hechizos que tu lanzas. Cada hechizo cuesta una cantidad diferente de mana, dependiendo de que tan
|
||||
poderosos sean y que tanto duran.
|
||||
|
||||
Coloca tu raton sobre una varita para ver la cantidad de mana que tiene.
|
||||
IMAGE CRYSTAL
|
||||
LINEBREAK
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Mena
|
||||
de Cristal Magico Cristal
|
||||
PAGEBREAK
|
||||
SECTION Varitas
|
||||
Varitas
|
||||
--------------------
|
||||
La varita es la herramienta de eleccion de un mago. Con ella, puedes lanzar cualquier
|
||||
hechizo, solo si la varita contiene dicho poder (ver Nivel de varitas para entender mejor).
|
||||
Las varitas vienen en variedades diferentes, es muy probable que empieces con la varita magica
|
||||
basica.
|
||||
|
||||
Cuando tienes una varita en tu mano, aparecera una pequena ventana en el esquina de la
|
||||
pantalla. Esto indica el hechizo que esta seleccionado actualmente con una representacion
|
||||
de este, y, si el hechizo ha sido lanzado, una barra con el tiempo de reactivacion para que
|
||||
el hechizo pueda volcver a ser lanzado de nuevo.
|
||||
PAGEBREAK
|
||||
SECTION Hechizos
|
||||
Hechizos
|
||||
--------------------
|
||||
Una varita es inservible sin hechizos que lanzar. Los hechizos estan guardados en dos
|
||||
formas: en libros, los cuales son permanentes, y en pergaminos, que son temporales.
|
||||
|
||||
Los libros de hechizos son poco utiles ellos solos, por eso se suele ligar el hechizo
|
||||
que contienen a las varitas. Los libros de hechizos pueden ser encontrados por todo el
|
||||
mundo. Cuando encuentres uno, puedes colocar el raton sobre el libro para ver su informacion.
|
||||
Tambien puede hacer clic derecho mientras lo tiene en su mano para ver mas informacion.
|
||||
|
||||
Pergaminos, por otro lado, sirven un proposito diferente: hacer clic derecho con
|
||||
el en la mano, lanzara el hechizo que tenga ligado a el, destruyendo el papel en el
|
||||
proceso. Como los libros, los hechizos pueden ser encontrados por todo el mundo, pero
|
||||
tambien puedes hacerlos tu mismo al craftear un pergamino vacio con papel y un poco de
|
||||
hilo. Puedes ligarle un hechizo usando una Mesa de Trabajo Arcana, pero solo si ya conoces
|
||||
dicho hechizo. Hacer esto consumira un cantidad de cristales magicos equivalente al mana
|
||||
que cuesta lanzar el hechizo (redondeado al MANA_PER_CRYSTAL mas cercano).
|
||||
|
||||
Para el ojo sin experiencia, las runas magicas con las cuales los hechizos son escritos
|
||||
son ilegibles. Por eso, para identificar un hechizo, podrias lanzarlo y ver sus efectos
|
||||
pero quizas ocasione efectos no deseados, y algunos hechizos necesitan condicione necesarias
|
||||
para funcionar. Una forma mas segura, es usar un Pergamino de la Identificacion, el cual
|
||||
puede ser comprado a magos. Hacer clic derecho con uno en la mano identificara el
|
||||
primer hechizo desconocido en tu barra.
|
||||
|
||||
Los pergaminos son utiles cuando necesitas lanzar un hechizo una o dos veces en una
|
||||
ocasion en particular pero no quieres que te ocupe un espacio en tu varita. Hay que
|
||||
resaltar, como sea, que los pergaminos son un metodo ineficiente de lanzar hechizos.
|
||||
PAGEBREAK
|
||||
SECTION Mesa de Trabajo Arcana
|
||||
La Mesa de Trabajo Arcana
|
||||
--------------------
|
||||
La Mesa de Trabajo Arcana es un bloque similar en apariencia a la mesa de encantamiento
|
||||
donde puedes cargar, mejorar y ligar hechizos a una varita. Simplemente coloca donde sea
|
||||
y haz clic derecho, y veras una interfaz aparecer parecida a la de la derecha.
|
||||
PAGEBREAK
|
||||
IMAGE WORKBENCH
|
||||
LINEBREAK
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
La Mesa de Trabajo Arcana
|
||||
PAGEBREAK
|
||||
SECTION Ligando Hechizos
|
||||
Ligando Hechizos
|
||||
--------------------
|
||||
Para ligar un hechizo a tu varita, simplemente coloca tu varita en el espacio central
|
||||
de la Mesa de Trabajo Arcana, luego coloca el libro de hechizo en uno de los espacios
|
||||
que estan alrededor y pulsa Aplicar. Puedes ligar 5 hechizos a la vez, esto puede ser
|
||||
aumentado con mejoras. Cuando tienes una varita en la mano, puedes cambiar los hechizos
|
||||
con las NEXT_SPELL_KEY y PREVIOUS_SPELL_KEY teclas. Tambien puedes cambiarlo al agacharte
|
||||
y moviendo la rueda del raton.
|
||||
|
||||
SECTION Cargando varitas
|
||||
Cargando varitas
|
||||
--------------------
|
||||
Para cargar tu varita, coloca la varita en el espacio central de la Mesa de Trabajo Arcana
|
||||
y coloca algunos cristales magicos en el espacio mas arriba en la izquierda, y despues
|
||||
pulsa Aplicar. Cada cristal vale MANA_PER_CRYSTAL mana, y la varita solo toma lo que
|
||||
necesita, asi que puedes mantener cristales en la Mesa de Trabajo Arcana para cuando
|
||||
los necesites. Todas las varitas tomaran un numero exacto de cristales para cargarla si esta
|
||||
vacia, a menos que tengan una mejora de almacenamiento aplicada.
|
||||
|
||||
SECTION Mejorando varitas
|
||||
Mejorando tu varita
|
||||
--------------------
|
||||
Para mejorar tu varita, necesitaras un Tomo de lo Arcano de tu nivel apropiado (ver
|
||||
Niveles) o una mejora de varita especial. Ambos pueden ser encontrados como botin o
|
||||
comprado a un mago. Para mejorar tu varita, colocala en el espacio central de la
|
||||
Mesa de Trabajo Arcana y la mejora en el espacio inferior a la izquierda, y pulsar Aplicar.
|
||||
|
||||
Mejoras de varita especiales mejorar un aspecto particular de la varita. Cada tipo de mejora
|
||||
se puede apilar 3 veces, y el total de mejoras que puede tener una varita depende del nivel.
|
||||
Las mejoras no pueden ser removidas.
|
||||
PAGEBREAK
|
||||
SECTION Flores y Frascos
|
||||
Flores y Frascos
|
||||
--------------------
|
||||
Es probable que te encuentres con flores brillantes creciendo en el suelo de tiempo
|
||||
en tiempo. Esas son flores de cristal magico, una fuente de mana natural. Pueden ser
|
||||
cosechadas y crafteadas para extraer mana en cristales.
|
||||
|
||||
Necesitas recargar tu varita de camino? No hay problema! El mana puede ser enfrascado.
|
||||
Simplemente craftea un frasco de mana con una botella de cristal y ocho cristales magicos
|
||||
y llevatelo contigo. Cuando necesites mana, solo craftea la varita con el frasco para
|
||||
recargar un poco. Este proceso consumira la botella. Un poco de mana se perdera en el
|
||||
proceso de enfrascamiento.
|
||||
PAGEBREAK
|
||||
SECTION Niveles
|
||||
Niveles
|
||||
--------------------
|
||||
Las varitas y los hechizos vienen en cuatro niveles: BASIC_COLOURBasicoRESET_COLOUR, APPRENTICE_COLOURAprendizRESET_COLOUR, ADVANCED_COLOURAvanzadoRESET_COLOUR y MASTER_COLOURMaestroRESET_COLOUR. Cada nivel es mejor que el anterior.
|
||||
|
||||
Las varitas BASIC_COLOURBasico RESET_COLOURson las que pueden ser crafteadas. Almacenan
|
||||
BASIC_MAX_CHARGE mana, y solo pueden lanzar hechizos basicos. Hechizos basicos son suficientemente simples para ser lanzados por cualquiera y no usan mucho mana. Esto
|
||||
no significa que son inservibles en niveles mas altos, sin embargo; su costo pequeno
|
||||
hace que algunos hechizos basicos sean utiles cuando tienes acceso a hechizos maestros.
|
||||
|
||||
Las varitas APPRENTICE_COLOURAprendiz RESET_COLOURson el siguiente nivel despues de las
|
||||
varitas basicas. Almacenan APPRENTICE_MAX_CHARGE mana y pueden lanzar hechizos basicos y de
|
||||
aprendiz. Los hechizos de aprendiz son mas llamativos que los basicos, pero cuestan mas.
|
||||
|
||||
Las varitas ADVANCED_COLOURAvanzado RESET_COLOURson muy raras y mucho mas poderosas.
|
||||
Pueden lanzar todos los hechizos excepto los maestros, y almacenar ADVANCED_MAX_CHARGE mana.
|
||||
Los hechizos avanzados pueden otorgar poderes de superhumano como invisibilidad y causar
|
||||
mucho dano a los enemigos.
|
||||
|
||||
Las varitas MASTER_COLOURMaestro RESET_COLOURson las mas poderosas varitas que existen. Almacenan MASTER_MAX_CHARGE mana, y pueden lanzar cualquier hechizo. Los libros de hechizos
|
||||
maestros son muy raros y los hechizos pueden causar una gran devastacion, no solo a los enemigos
|
||||
si no al mundo en si. Usar con precaucion.
|
||||
PAGEBREAK
|
||||
SECTION Elementos
|
||||
Elementos
|
||||
--------------------
|
||||
Los hechizos pertenecen a diferentes elementos, los cuales describen la naturaleza
|
||||
del hechizo y tambien tienen ventajas cuando son lanzados con ciertas varitas.
|
||||
|
||||
FIRE_COLOURFuego
|
||||
Quizas el elemento mas destructivo, fuego conlleva quemaduras, lava, y explosiones. Un piromano poderoso desatara el infierno sobre sus enemigos y probablemente encienda
|
||||
el mundo en el proceso. La mayoria de los ataques de fuego queman a sus objetivos,
|
||||
causando dano extra sobre el tiempo. Sin embargo, te en cuenta que no tendran efecto
|
||||
en monstruos del Nether.
|
||||
|
||||
ICE_COLOURHielo
|
||||
El elemento de hielo esta formado por todo lo que es frio. Los hechizos de hielo
|
||||
frencuentemente ralentizan a los enemigos o los congelan completamente, y son
|
||||
efectivos contra criaturas de fuego. La magia de hielo puede ser util fuera de
|
||||
combate, como para congelar un rio para poder cruzarlo a pie.
|
||||
|
||||
LIGHTNING_COLOURRayo
|
||||
Este elemento conlleva relampagos, tormentas y el clima. Un mago de tormenta poderoso
|
||||
es una fuerza dura de vencer, y algunos son capaces de llamar rayos a voluntad. Los
|
||||
hechizos de rayo con frecuencia hacen dano a varios enemigos a la vez y usualmente
|
||||
persiguen a su objetivo, haciendolos efectivos para atacar a cualquier monstruo...
|
||||
pero cuidado con los creepers.
|
||||
|
||||
NECROMANCY_COLOURNigromancia
|
||||
Nigromancia es el elemento de oscuridad, caos y lo no-muerto. Nigromantes son
|
||||
misteriosos y a veces considerados malos, aunque no siempre es el casp. Los
|
||||
hechizos de nigromancia son usados para invocar criaturas que pelearan por ti o
|
||||
hasta controlar la voluntad de tus enemigos.
|
||||
|
||||
EARTH_COLOURTierra
|
||||
El elemento de tierra esta enfocado en el mundo natural: animales, plantas, el viento, y cosas asi. La magia de tierra es diversa y toma una gran variedad de formas, desde envenerar enemigos hasta desatar la furia del clima. Los hechizos de tierra son una liga de ataque, defensa y utilidad.
|
||||
|
||||
SORCERY_COLOURHechiceria
|
||||
La hechiceria es el elemento de la fuerza y el cambio. Los hechiceros manipulan la luz,
|
||||
la gravedad y hasta la realidad para su beneficio. Los hechizos de hechiceria pueden
|
||||
ser usados, entre otras cosas, para conceder poderes magicos y mover objetos.
|
||||
|
||||
HEALING_COLOURCuracion
|
||||
El elemento de curacion conlleva defensa y regeneracion. Los sanadores buscan
|
||||
protegerse y a sus aliados lo mas posble, lo cual puede ser dificil para los
|
||||
oponentes. A pesar de no considerarse como un ataque, la luz purificadora de sus
|
||||
hechizos de curacion puede ser letales para los no-muertos. Los hechizos de
|
||||
curacion son indispensables cuando se esta dentro de combate.
|
||||
|
||||
Los limites entre los diferentes elementos no siempre son distintos, y algunos hechizos
|
||||
tienen atributos de otros elementos mas que del suyo.
|
||||
|
||||
Si eres suertudo, puedes que te encuentres una varita elemental. Estas varitas te
|
||||
permiten lanzar hechizos del elemento correcto con mas potencia de lo usual.
|
||||
PAGEBREAK
|
||||
SECTION Armadura de Mago
|
||||
Armadura de Mago
|
||||
--------------------
|
||||
Como mago, necesitaras algo para protegerte de las criaturas que combates.
|
||||
Ninguna armadura ordinal valdra. Para sacarle provecho a tus hechizos, necesitas
|
||||
armadura de mago: sombrero, tunica, pantalones y botas. A diferencia de las otras,
|
||||
estas no se romperan. Sin embargo, usaran energia arcana para proteger al usuario.
|
||||
Esto significa que deben ser cargados con cristales magicos. Ventajosamente no
|
||||
consumen mucho mana. Recargalos en la mesa o con frascos.
|
||||
|
||||
Puedes obtener armadura de mago crafteandola con Seda Magica, obtenida al craftear
|
||||
hilo con un cristal magico.
|
||||
|
||||
Esos magos que se dedican a practicar un solo elemento algunas veces visten
|
||||
piezas especiales las cuales ofrecen bonus a dicho elemento. Los sets completos
|
||||
de esta armadura son muy codiciados entre magos y no son faciles de conseguir.
|
||||
|
||||
Hay una legenda que habla sobre un sello arcano usado por los magos mas poderosos
|
||||
para mejorar en sobre manera su armadura.
|
||||
PAGEBREAK
|
||||
SECTION Magos y Torres
|
||||
Magos y Torres
|
||||
--------------------
|
||||
No temas - no eres el unico que practica magia en este mundo. En tus viajes, te encontraras con torres altas con unos distintivos techos puntiagudos.
|
||||
Estas son las residencias de varios magos. Una vida de soledad puede hacer que los magos se vuelvan grunones, pero usualmente son seres amigables que estan
|
||||
dispuestos a compartir su conocimiento contigo - con un precio. Preparate para pagar con gemas y metales preciosos, y a cambio recibiras grandezas arcanas.
|
||||
Si, en dado caso, un hechizo maestro es lo que buscas, deberar hablar con un especialista en dicho elemento.
|
||||
|
||||
Desafortunadamente, hay algunos magos que no le dan la bienvenida a los visitantes. Estos magos son marginados y son hostiles hacia cualquiera que cruce su camino. Aproximate a ellos con cautela, y preparate para defenderte contra magia sumamente poderosa. Derrotalos, y su conocimiento sera tuyo.
|
||||
PAGEBREAK
|
||||
SECTION Recetas de Crafteo
|
||||
Recetas de Crafteo
|
||||
--------------------
|
||||
PAGEBREAK
|
||||
PAGEBREAK
|
||||
Recetas de Crafteo
|
||||
--------------------
|
||||
PAGEBREAK
|
||||
PAGEBREAK
|
||||
Recetas de Crafteo
|
||||
--------------------
|
||||
PAGEBREAK
|
||||
PAGEBREAK
|
||||
Recetas de Crafteo
|
||||
--------------------
|
||||
PAGEBREAK
|
||||
PAGEBREAK
|
||||
Creditos
|
||||
--------------------
|
||||
Electroblob's Wizardry
|
||||
Version VERSION
|
||||
Para Minecraft MCVERSION
|
||||
|
||||
Disenado, codificado y texturizado por Electroblob
|
||||
|
||||
Gracias a Minecraft Forge y MCP, porque sin estos esto no hubiese sido posible.
|
||||
|
||||
Gracias tambien a la comunidad de Minecraft que crea mods, la cual siempre tiene una respuesta para mis problemas!
|
||||
|
||||
In addition, I'd like to thank the following individuals for their contributions to the mod:
|
||||
|
||||
Code:
|
||||
|
||||
- Corail31
|
||||
- 12foo
|
||||
- Shadows-of-Fire
|
||||
- HellFirePvP
|
||||
|
||||
Translations:
|
||||
|
||||
- Russian: VilagVil
|
||||
- Spanish and Mexican Spanish: MadWrist
|
||||
- Chinese: ZHENGLOC and dragon-evol
|
||||
|
||||
Lightning ray sound effect from OhhWowProductions
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,225 +0,0 @@
|
||||
PAGEBREAK
|
||||
LINEBREAK
|
||||
|
||||
|
||||
|
||||
|
||||
巫师手册
|
||||
|
||||
|
||||
|
||||
作者 Electroblob
|
||||
PAGEBREAK
|
||||
简介
|
||||
--------------------
|
||||
|
||||
欢迎您,伟大的巫师!本书将会向您阐释奥术的工作原理以及使用它们的方法。
|
||||
|
||||
如果您不慎遗失了本书,您可以在工作台上用书和魔法水晶制作一本新的。
|
||||
PAGEBREAK
|
||||
内容
|
||||
--------------------
|
||||
PAGEBREAK
|
||||
SECTION 准备工作
|
||||
准备工作
|
||||
--------------------
|
||||
要打开通向巫术的大门,您将会需要以下几样东西:
|
||||
|
||||
- 一根法杖,由一粒金粒,一根木棍和一块魔法水晶合成。
|
||||
|
||||
- 一个奥术工作台,由三块石头,一块青金石块,两块魔法水晶,两粒金粒和一块紫色地毯合成。
|
||||
|
||||
- 一本法术书,它们可以在箱子中找到,由怪物掉落或向巫师们购买。当然您也可以用一本书和四块魔法水晶制作一个初学者的法术“魔法飞弹”。
|
||||
|
||||
此外,您将会需要更多的魔法水晶来为您的法杖提供魔力。
|
||||
PAGEBREAK
|
||||
SECTION 魔力
|
||||
魔力
|
||||
--------------------
|
||||
魔力是给予巫师们力量的奥术能量。它在自然界中以水晶的形式存在,这些水晶嵌在石缝中,可以在地下被找到。法杖中可以储存魔力,而这些魔力将被塑造为您施展的法术。不同的法术会消耗不同数量的魔力,这取决于它们有多么强大以及它们会持续多久。
|
||||
|
||||
将鼠标悬停在法杖上就可以看到其中的魔力储量。
|
||||
IMAGE CRYSTAL
|
||||
LINEBREAK
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
魔法
|
||||
水晶矿 水晶
|
||||
PAGEBREAK
|
||||
SECTION 法杖
|
||||
法杖
|
||||
--------------------
|
||||
法杖是一个巫师的实用之选。有了法杖,您就可以施展任何法术,只要法杖能够承受它的力量(更深入的解释在“等级”一节中)。
|
||||
法杖有许多不同的种类,但您将从最基本的法杖开始。
|
||||
|
||||
拿着法杖时,屏幕的角落会出现一个小小的提示,它会显示当前选择的法术及其图标。此外,如果一个法术被施展了,会有一个冷却条显示还有多久才能再次施展这个法术。
|
||||
PAGEBREAK
|
||||
SECTION 法术
|
||||
法术
|
||||
--------------------
|
||||
一根没有法术可施展的法杖是毫无用处的。法术可以通过两种方式被记录下来:永久地记录在书上,或者暂时地记录在卷轴上。
|
||||
|
||||
法术书本身没有什么用处,它们是用来将其中记录的法术绑定到法杖上的。法术书可以在世界各处被发现,而且您肯定很快就会找到一本。当您发现了一本法术书时,您可以将鼠标悬停在上面来看一下法术的基本信息,您也可以拿着法术书按下右键来阅读法术的详细信息。
|
||||
|
||||
与之相反,卷轴的使用方式是不一样的:拿着卷轴右击将会施展其中绑定的法术,而在这个过程中卷轴将会被摧毁。像法术书一样,卷轴可以在世界各处被发现,但您也可以自己制作它们。首先拿一张纸和一些线合成空白卷轴,然后您可以在奥术工作台上将法术绑定到卷轴上,前提是您拥有关于这个法术的知识。这么做将会消耗与法术的魔力消耗相对应数量的魔法水晶(消耗的魔法水晶个数是向上取整的)。
|
||||
|
||||
对于未经训练的人来说,用于书写法术的魔法符文是无法辨识的。为了鉴定一个法术,您当然可以施展它然后看看发生了什么 - 但这么做可能会产生您不想看到的副作用,而且许多法术需要在特定的条件下才能起作用。一种更安全可靠的选择是使用鉴定卷轴,它可以在箱子里找到或向巫师购买。拿着它右击将会鉴定您热键栏中第一个未知的法术书或卷轴,并消耗鉴定卷轴。
|
||||
|
||||
如果您需要在一次探险中使用某个法术一两次但又不希望它占用您法杖的一个槽,那卷轴是十分有用的。但值得注意的是卷轴是一种相当没有效率的施法方式。
|
||||
PAGEBREAK
|
||||
SECTION 奥术工作台
|
||||
奥术工作台
|
||||
--------------------
|
||||
奥术工作台的外观和附魔台很像,您可以在其中给法杖充能、升级或绑定法术。只要放下它并右击,您就会看到一个界面出现,就像右边展示的一样。
|
||||
PAGEBREAK
|
||||
IMAGE WORKBENCH
|
||||
LINEBREAK
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
奥术工作台
|
||||
PAGEBREAK
|
||||
SECTION 绑定法术
|
||||
绑定法术
|
||||
--------------------
|
||||
要把一个法术绑定到法杖上,只要把法杖放在奥术工作台中央的格子里,然后把法术书放在周围的任意一个格子里并按下“应用”。您至多可以在一根法杖上绑定五个法术,当然这一数量可以通过法杖协调升级来增加。拿着法杖时,您可以通过 NEXT_SPELL_KEY 键和 PREVIOUS_SPELL_KEY 键在不同的法术间切换(按键可以在选项 -> 控制里调整)。您也可以在潜行时上下滚动鼠标滚轮来切换法术。
|
||||
|
||||
SECTION 法杖充能
|
||||
法杖充能
|
||||
--------------------
|
||||
要给法杖充能,只要把法杖放在奥术工作台中央的格子里,然后在左侧两个格子靠上的那个放一些魔法水晶并按下“应用”。每个水晶等同于 MANA_PER_CRYSTAL 魔力,而法杖只会吸收它所需要的数量,所以您可以在奥术工作台中储备一些魔力水晶以便随时使用。然而,谨记法杖只能整块地吸收魔法水晶。所以如果法杖仅仅还需要 30 魔力,那么 MANA_PER_CRYSTAL_MINUS_30 魔力就会在充能过程中流失。在内部没有魔力时,所有的法杖都会吸收确定数量的魔法水晶来充能,除非它们拥有法杖存储升级。
|
||||
|
||||
SECTION 升级法杖
|
||||
升级法杖
|
||||
--------------------
|
||||
要升级法杖,您需要一本对应等级的(参见“等级”)奥法宝典或者某种法杖升级。这两种东西都可以作为战利品得到或者向巫师购买。要升级法杖,只要把法杖放在奥术工作台中央的格子里,然后在左侧两个格子靠下的那个放上法杖升级并按下“应用”。
|
||||
|
||||
法杖升级会提升法杖某一方面的性能。每种法杖升级可以叠加至多三次,而法杖能升级的总次数取决于其等级。升级是不可逆的,无法被重新移除。
|
||||
PAGEBREAK
|
||||
SECTION 鲜花与烧瓶
|
||||
鲜花与烧瓶
|
||||
--------------------
|
||||
您很可能时不时在野外见到一些神秘的闪着光芒的花。这些是水晶花,是一种自然产生的魔力来源。它们可以被采集,其中的魔力可以像魔力水晶一样被提取出来。
|
||||
|
||||
需要在路上给您的法杖充能?没问题!魔力现在可以被装瓶了。用一个玻璃瓶和八个魔力水晶制作一个魔力瓶并带在身上,当您需要使用它时,将它和您的法杖放在一起合成,法杖就会回复一些魔力,而魔力瓶会被消耗掉。在装瓶过程中魔力会有耗损。
|
||||
PAGEBREAK
|
||||
SECTION 等级
|
||||
等级
|
||||
--------------------
|
||||
法杖和法术有四个等级:BASIC_COLOUR新手RESET_COLOUR,APPRENTICE_COLOUR学徒RESET_COLOUR,ADVANCED_COLOUR进阶RESET_COLOUR和MASTER_COLOUR大师RESET_COLOUR。每一个等级都比上一个等级更加强大。
|
||||
|
||||
BASIC_COLOUR新手RESET_COLOUR法杖是可以被合成出来的法杖。它们至多储存 BASIC_MAX_CHARGE 魔力,并且只能施展新手级的法术。新手法术非常简单,可以被任何人施展并且一般不消耗很多魔力。然而这并不一定意味着等级很高时他们就毫无用处,它们的低消耗使得一些新手法术在您达到大师级之后仍十分有用。
|
||||
|
||||
APPRENTICE_COLOUR学徒RESET_COLOUR法杖是新手法杖的下一等级。它们至多储存 APPRENTICE_MAX_CHARGE 魔力,并且可以施展新手和学徒级的法术。学徒法术比起新手法术更令人印象深刻,但通常消耗更高。
|
||||
|
||||
ADVANCED_COLOUR进阶RESET_COLOUR法杖十分稀有且比前两级强大得多。它们可以施展除了大师级之外的所有法术,并储存 ADVANCED_MAX_CHARGE 魔力。进阶法术可以赋予巫师超人的力量,例如隐身,并在敌人头上倾泻毁灭。
|
||||
|
||||
MASTER_COLOUR大师RESET_COLOUR法杖是现存最强大的法杖。他们至多储存 MASTER_MAX_CHARGE 魔力,并且可以施展任何法术。大师级法术书非常稀有,而大师级法术可以给敌人带来完全的湮灭,甚至可以摧毁世界本身。慎重使用。
|
||||
PAGEBREAK
|
||||
SECTION 元素
|
||||
元素
|
||||
--------------------
|
||||
法术分属不同的元素,元素表现了法术的本质,并且在被特定的法杖使用时会有额外的效果。
|
||||
|
||||
FIRE_COLOUR火
|
||||
这也许是最具毁灭性的元素。火元素掌控燃烧、熔岩和爆炸。一位强大的烈焰法师能够在敌人头顶打开地狱之门,并能在这个过程中点燃世界。绝大多数火属性攻击法术会点燃其目标,造成持续伤害。但是,注意火属性法术也许对下界生物毫无效果。
|
||||
|
||||
ICE_COLOUR冰
|
||||
冰元素是一切寒冷之物的集合。冰属性法术通常会减速敌人或完全冻住他们,并且对火属性生物极为有效。冰属性魔法在战斗外同样有用,例如冻结水面来顺利过河。
|
||||
|
||||
LIGHTNING_COLOUR闪电
|
||||
这一元素掌控闪电、风暴和天气。一位强大的风暴法师是一股不可忽视的力量,而且他们中的某些人拥有随意降下闪电的能力。闪电法术通常会同时伤害多个敌人并且自动寻找目标,这使它们成为攻击任何生物的有效手段...但小心爬行者。
|
||||
|
||||
NECROMANCY_COLOUR死灵
|
||||
死灵是属于黑暗、混沌和不死生物的元素。死灵法师十分神秘并且常常被认为是邪恶的,虽然一般不是这回事。死灵法术通常被用来召唤为您而战的生物,甚至可以扭曲敌人的意志。
|
||||
|
||||
EARTH_COLOUR大地
|
||||
大地元素专注于自然界:动物,植物,风,凡此种种。大地魔法差异巨大且呈现形式多种多样,从让敌人中毒到释放大气的怒火。大地法术是攻击、防御和实用的综合。
|
||||
|
||||
SORCERY_COLOUR妖术
|
||||
妖术是操纵力和变化的元素。妖术法师操纵光、重力甚至是现实本身来迎合他们的需要。妖术也可以用在别的领域,例如赋予施法者魔法力量或者用意念移动物体。
|
||||
|
||||
HEALING_COLOUR治愈
|
||||
治愈元素掌控防御和再生。治愈法师尽可能地保护他们自己以及他们的盟友,因此可能是非常难缠的对手。尽管一般不用来攻击,某些治愈法术的净化光芒会对不死生物造成可观的伤害。治愈法术在战斗中是不可或缺的。
|
||||
|
||||
不同元素之间并不总是泾渭分明的,并且有些法术展现出除自身外的其他元素的特点。
|
||||
|
||||
如果您很幸运,您可能会邂逅一根元素法杖。这些法杖会让您在施展正确元素的法术时比平时拥有更强的能力。
|
||||
PAGEBREAK
|
||||
SECTION 巫师护甲
|
||||
巫师护甲
|
||||
--------------------
|
||||
作为一名巫师,您需要一些东西来保护您免受与您作战的生物的伤害。普通的护甲无法做到这一点。为了最大化利用您的法术,您将会需要巫师护甲:帽子,法袍,护腿和靴子。不像普通的护甲,这些护甲不会损坏。作为替代,它们使用奥术能量来保护穿戴者。这当然意味着它们需要像法杖一样用魔法水晶充能。幸运的是,这些服装并不会消耗很多魔力。像法杖一样用奥术工作台或魔力瓶充能它们,但小心了 - 如果它们没有了魔力,您将发现自己毫无防御力。
|
||||
|
||||
您可以用魔法丝绸来制作巫师护甲,魔法丝绸可以用线和一块魔法水晶合成。
|
||||
|
||||
那些完全专注于一种元素的巫师有时会穿上特殊的服装来让这一元素获得额外的增强。整套的此类服装十分受某些巫师的追捧而且不容易找到。
|
||||
|
||||
传说中最强大的巫师用一种奥术戳记来极大地强化他们的护甲。
|
||||
PAGEBREAK
|
||||
SECTION 巫师和巫师塔
|
||||
巫师和巫师塔
|
||||
--------------------
|
||||
别害怕 - 您不是这个世界里唯一的魔法使用者。在您的旅途中,您可能会遇到拥有标志性尖顶的高塔。这些是您巫师同僚的居所。孤独的生活有时可能会让巫师们变得有些性情乖戾,但他们通常是友好的人,并且乐意与您分享他们的知识 - 尽管要付出些代价。交给他们一些珍贵的金属和宝石,您将收获数不尽的奥术奇迹作为回报。但如果您要寻找的是大师级的法术,您需要与专家谈谈才行。
|
||||
|
||||
不幸的是,少数巫师并不欢迎访客。这些巫师通常是被放逐的人,并且对任何挡路者都怀有敌意。小心地接近他们,并准备好在强大的魔法洗礼下防卫自己。然而,如果您击败了他们,您就可以将他们的知识全部收入囊中。
|
||||
PAGEBREAK
|
||||
SECTION 合成配方
|
||||
合成配方
|
||||
--------------------
|
||||
PAGEBREAK
|
||||
PAGEBREAK
|
||||
合成配方
|
||||
--------------------
|
||||
PAGEBREAK
|
||||
PAGEBREAK
|
||||
合成配方
|
||||
--------------------
|
||||
PAGEBREAK
|
||||
PAGEBREAK
|
||||
合成配方
|
||||
--------------------
|
||||
PAGEBREAK
|
||||
PAGEBREAK
|
||||
鸣谢
|
||||
--------------------
|
||||
Electroblob's Wizardry
|
||||
Version VERSION
|
||||
For 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
|
||||
- 12foo
|
||||
- Shadows-of-Fire
|
||||
- HellFirePvP
|
||||
|
||||
Translations:
|
||||
|
||||
- Russian: VilagVil
|
||||
- Spanish and Mexican Spanish: MadWrist
|
||||
- Chinese: ZHENGLOC and dragon-evol
|
||||
|
||||
Lightning ray sound effect from OhhWowProductions
|
||||
@@ -0,0 +1,750 @@
|
||||
{
|
||||
"bookmark_start_section": "introduction",
|
||||
|
||||
"colours": {
|
||||
"text": "#000000",
|
||||
"caption": "#666666",
|
||||
"hyperlink": "#601ba0",
|
||||
"highlight": "#dd4c1d",
|
||||
"new_section": "#ee88f7"
|
||||
},
|
||||
|
||||
"images": {
|
||||
"workbench": {
|
||||
"location": "ebwizardry:textures/gui/arcane_workbench_picture.png",
|
||||
"caption": "法術工作台",
|
||||
"u": 0,
|
||||
"v": 0,
|
||||
"width": 110,
|
||||
"height": 110
|
||||
},
|
||||
"crystal_ore": {
|
||||
"location": "ebwizardry:textures/gui/ore_picture.png",
|
||||
"caption": "水晶礦",
|
||||
"u": 0,
|
||||
"v": 0,
|
||||
"width": 64,
|
||||
"height": 64
|
||||
},
|
||||
"magic_crystal": {
|
||||
"location": "ebwizardry:textures/items/crystal_magic.png",
|
||||
"caption": "魔法水晶",
|
||||
"u": 6,
|
||||
"v": 6,
|
||||
"width": 36,
|
||||
"height": 33,
|
||||
"texture_width": 48,
|
||||
"texture_height": 48,
|
||||
"border": false
|
||||
},
|
||||
"magic_wand": {
|
||||
"location": "ebwizardry:textures/items/wand_novice.png",
|
||||
"caption": "法杖",
|
||||
"u": 0,
|
||||
"v": 0,
|
||||
"width": 64,
|
||||
"height": 64,
|
||||
"border": false
|
||||
},
|
||||
"crystal_flower": {
|
||||
"location": "ebwizardry:textures/gui/flower_picture.png",
|
||||
"caption": "水晶花",
|
||||
"u": 0,
|
||||
"v": 0,
|
||||
"width": 48,
|
||||
"height": 48
|
||||
},
|
||||
"wizard_tower": {
|
||||
"location": "ebwizardry:textures/gui/tower_picture.png",
|
||||
"caption": "法師塔",
|
||||
"u": 0,
|
||||
"v": 0,
|
||||
"width": 110,
|
||||
"height": 110
|
||||
},
|
||||
"wizard_armour": {
|
||||
"location": "ebwizardry:textures/gui/armour_picture.png",
|
||||
"caption": "法師服",
|
||||
"u": 0,
|
||||
"v": 0,
|
||||
"width": 90,
|
||||
"height": 90
|
||||
},
|
||||
"obelisk": {
|
||||
"location": "ebwizardry:textures/gui/obelisk_picture.png",
|
||||
"caption": "方尖碑",
|
||||
"u": 0,
|
||||
"v": 0,
|
||||
"width": 110,
|
||||
"height": 67
|
||||
},
|
||||
"shrine": {
|
||||
"location": "ebwizardry:textures/gui/shrine_picture.png",
|
||||
"caption": "神殿",
|
||||
"u": 0,
|
||||
"v": 0,
|
||||
"width": 110,
|
||||
"height": 67
|
||||
},
|
||||
"tiers": {
|
||||
"location": "ebwizardry:textures/gui/tiers_picture.png",
|
||||
"caption": "四種等級的法杖",
|
||||
"u": 0,
|
||||
"v": 0,
|
||||
"width": 96,
|
||||
"height": 24,
|
||||
"border": false
|
||||
},
|
||||
"elements": {
|
||||
"location": "ebwizardry:textures/gui/elements_picture.png",
|
||||
"caption": "七種法術元素",
|
||||
"u": 0,
|
||||
"v": 0,
|
||||
"width": 106,
|
||||
"height": 20,
|
||||
"border": false
|
||||
}
|
||||
},
|
||||
|
||||
"recipes": {
|
||||
"arcane_workbench": {
|
||||
"locations": [ "ebwizardry:arcane_workbench" ]
|
||||
},
|
||||
"magic_wand": {
|
||||
"locations": [ "ebwizardry:magic_wand" ]
|
||||
},
|
||||
"novice_wands": {
|
||||
"locations": [
|
||||
"ebwizardry:magic_wand",
|
||||
"ebwizardry:wand_fire",
|
||||
"ebwizardry:wand_ice",
|
||||
"ebwizardry:wand_lightning",
|
||||
"ebwizardry:wand_necromancy",
|
||||
"ebwizardry:wand_earth",
|
||||
"ebwizardry:wand_sorcery",
|
||||
"ebwizardry:wand_healing"
|
||||
]
|
||||
},
|
||||
"magic_missile_spell_book": {
|
||||
"locations": [ "ebwizardry:magic_missile_spell_book" ]
|
||||
},
|
||||
"wizard_handbook": {
|
||||
"locations": [ "ebwizardry:wizard_handbook" ]
|
||||
},
|
||||
"crystal_flower_to_crystals": {
|
||||
"locations": [ "ebwizardry:crystal_flower_to_crystals" ]
|
||||
},
|
||||
"crystal_blocks": {
|
||||
"locations": [
|
||||
"ebwizardry:crystal_block",
|
||||
"ebwizardry:crystal_block_fire",
|
||||
"ebwizardry:crystal_block_ice",
|
||||
"ebwizardry:crystal_block_lightning",
|
||||
"ebwizardry:crystal_block_necromancy",
|
||||
"ebwizardry:crystal_block_earth",
|
||||
"ebwizardry:crystal_block_sorcery",
|
||||
"ebwizardry:crystal_block_healing"
|
||||
]
|
||||
},
|
||||
"crystal_blocks_to_crystals": {
|
||||
"locations": [
|
||||
"ebwizardry:crystal_block_to_crystals",
|
||||
"ebwizardry:crystal_block_to_crystals_fire",
|
||||
"ebwizardry:crystal_block_to_crystals_ice",
|
||||
"ebwizardry:crystal_block_to_crystals_lightning",
|
||||
"ebwizardry:crystal_block_to_crystals_necromancy",
|
||||
"ebwizardry:crystal_block_to_crystals_earth",
|
||||
"ebwizardry:crystal_block_to_crystals_sorcery",
|
||||
"ebwizardry:crystal_block_to_crystals_healing"
|
||||
]
|
||||
},
|
||||
"crystal_shard": {
|
||||
"locations": [ "ebwizardry:crystal_shard" ]
|
||||
},
|
||||
"small_mana_flask": {
|
||||
"locations": [ "ebwizardry:small_mana_flask" ]
|
||||
},
|
||||
"medium_mana_flask": {
|
||||
"locations": [ "ebwizardry:medium_mana_flask" ]
|
||||
},
|
||||
"large_mana_flask": {
|
||||
"locations": [ "ebwizardry:large_mana_flask" ]
|
||||
},
|
||||
"runestone": {
|
||||
"locations": [
|
||||
"ebwizardry:runestone_fire",
|
||||
"ebwizardry:runestone_ice",
|
||||
"ebwizardry:runestone_lightning",
|
||||
"ebwizardry:runestone_necromancy",
|
||||
"ebwizardry:runestone_earth",
|
||||
"ebwizardry:runestone_sorcery",
|
||||
"ebwizardry:runestone_healing"
|
||||
]
|
||||
},
|
||||
"runestone_pedestal": {
|
||||
"locations": [
|
||||
"ebwizardry:runestone_pedestal_fire",
|
||||
"ebwizardry:runestone_pedestal_ice",
|
||||
"ebwizardry:runestone_pedestal_lightning",
|
||||
"ebwizardry:runestone_pedestal_necromancy",
|
||||
"ebwizardry:runestone_pedestal_earth",
|
||||
"ebwizardry:runestone_pedestal_sorcery",
|
||||
"ebwizardry:runestone_pedestal_healing"
|
||||
]
|
||||
},
|
||||
"transportation_stone": {
|
||||
"locations": [ "ebwizardry:transportation_stone" ]
|
||||
},
|
||||
"magic_silk": {
|
||||
"locations": [ "ebwizardry:magic_silk" ]
|
||||
},
|
||||
"wizard_hat": {
|
||||
"locations": [ "ebwizardry:wizard_hat" ]
|
||||
},
|
||||
"wizard_robe": {
|
||||
"locations": [ "ebwizardry:wizard_robe" ]
|
||||
},
|
||||
"wizard_leggings": {
|
||||
"locations": [ "ebwizardry:wizard_leggings" ]
|
||||
},
|
||||
"wizard_boots": {
|
||||
"locations": [ "ebwizardry:wizard_boots" ]
|
||||
},
|
||||
"blank_scroll": {
|
||||
"locations": [ "ebwizardry:blank_scroll" ]
|
||||
},
|
||||
"firebomb": {
|
||||
"locations": [ "ebwizardry:firebomb" ]
|
||||
},
|
||||
"poison_bomb": {
|
||||
"locations": [ "ebwizardry:poison_bomb" ]
|
||||
},
|
||||
"smoke_bomb": {
|
||||
"locations": [ "ebwizardry:smoke_bomb" ]
|
||||
},
|
||||
"spark_bomb": {
|
||||
"locations": [ "ebwizardry:spark_bomb" ]
|
||||
}
|
||||
},
|
||||
|
||||
"sections": {
|
||||
|
||||
"inside_cover": {
|
||||
"centre": {
|
||||
"x": true,
|
||||
"y": true
|
||||
},
|
||||
"text": [
|
||||
|
||||
"法師手冊",
|
||||
|
||||
"作者: Electroblob\n\n翻譯: Grant"
|
||||
]
|
||||
},
|
||||
|
||||
"introduction": {
|
||||
"title": "前言",
|
||||
"text": [
|
||||
|
||||
"你好啊,法師!\n\n本書介紹許多法術相關事物及使用方式。 這不是一本普通的書,其內容會隨著你在魔法世界的探索而逐漸呈現。",
|
||||
|
||||
"使用箭頭按鈕來翻頁,按下雙箭頭按鈕則可快速的切換章節,而中間的選單按鈕則是翻回主目錄頁面。",
|
||||
|
||||
"點擊任何紫色連結文字直接跳至相關頁面。對書籤點擊滑鼠右鍵可將書籤移到目前這頁,對書籤點擊滑鼠左鍵則可翻回書籤那頁。"
|
||||
]
|
||||
},
|
||||
|
||||
"main_contents": {
|
||||
"title": "目錄",
|
||||
"contents": {
|
||||
"id": "main_contents",
|
||||
"hyperlinks": true,
|
||||
"page_numbers": true,
|
||||
"separator": "."
|
||||
}
|
||||
},
|
||||
|
||||
"setting_up": {
|
||||
"title": "準備",
|
||||
"include_in_contents": "main_contents",
|
||||
"text": [
|
||||
|
||||
"要開始使用法術,你需要準備:",
|
||||
|
||||
"》法杖, 請依圖示合成:",
|
||||
|
||||
"#recipe magic_wand",
|
||||
|
||||
"\n\n》@arcane_workbench 法術工作台@, 合成方式如圖:",
|
||||
|
||||
"#recipe arcane_workbench",
|
||||
|
||||
"》@spells 法術書@\n這個可以在箱子裡找到,或從怪物身上掉落,或向法師購買。\n\n\n\n不然你也可以自己合成一個\n初學者法術【魔法彈】,\n如圖所示:",
|
||||
|
||||
"#recipe magic_missile_spell_book",
|
||||
|
||||
"你還需要準備一大堆魔法水晶\n來為法杖供應@mana 法力@。"
|
||||
]
|
||||
},
|
||||
|
||||
"mana": {
|
||||
"title": "法力",
|
||||
"include_in_contents": "main_contents",
|
||||
"triggers": [
|
||||
"ebwizardry:crystal"
|
||||
],
|
||||
"text": [
|
||||
|
||||
"法力是賦予法師力量的魔法能量,其本身並非實體的物質,反而是可滲入於萬物之中的永恆能量。特別的是,法力蘊藏在於地下岩石中所找到的天然水晶內。\n@wands 法杖@可儲存法力,並在施法時\n將法力引導到@spells 法術@上。\n不同的法術會依其力量強度及持續時間消耗不同的法力值。",
|
||||
|
||||
"#image crystal_ore",
|
||||
|
||||
"#image magic_crystal",
|
||||
|
||||
"人們普遍認為法力無法被創造或消滅,每當施展法術時,其引導的法力就會散失到周圍環境中。事實上這就是大量的法力散布於世界各處的原因。總之無論要如何使用法力,必須從地底下的天然千年水晶中,或本書未涵蓋的高級人工方式將其收集。還有各種方法使法術更有效的使用法力,以及回收在施法過程中逸散的部分法力。"
|
||||
]
|
||||
},
|
||||
|
||||
"wands": {
|
||||
"title": "法杖",
|
||||
"include_in_contents": "main_contents",
|
||||
"triggers": [
|
||||
"ebwizardry:arcane_initiate"
|
||||
],
|
||||
"text": [
|
||||
|
||||
"法杖是法師首選的器具。\n你能用它來施展任何法杖能力\n所及的@spells 法術@(請參閱@tiers 等級@章節)\n。\n法杖的種類很多,不過當然都得從基礎法杖開始。",
|
||||
|
||||
"#image magic_wand",
|
||||
|
||||
"大多數的法杖都誕生於一個簡單的製作方式。\n準備一顆某種類型的魔法水晶,\n將水晶裝在木棒的一端,\n再於另一端黏上一顆金粒。\n水晶自然是法杖力量的源頭,\n因為它提供了引導@spells 法術@所需的\n焦點。而其餘的部分也很重要,不只是因為提供了握住法杖的地方,更是指引@mana 法力@前進的路徑\n。",
|
||||
|
||||
"隨著法杖施展了愈多法術,\n其變得愈能駕馭@spells 法術@,\n因此也能施展更強大的法術。\n這樣的成長可以從法杖外觀上的細微變化中發現,隨著法杖愈來愈強,水晶會變得更加明亮,\n顏色也可能會根據其@elements 元素@而\n產生變化。過了一段時間之後,法杖本身的木材也會開始扭曲生長成各種複雜的形狀。",
|
||||
|
||||
"當你拿著法杖時,畫面的角落會顯示出目前法杖所選的法術及其圖示,而在施放法術之後,還會顯示冷卻條來表示直到下次施展所需等待的時間,它還會顯示法杖中的前一個和下一個法術名稱。按下《#next_spell_key 鍵》及《#previous_spell_key 鍵》可切換法術(這些都可在【選項】->【按鍵設定】中變更),你也可以在潛行時使用滑鼠滾輪來切換法術。",
|
||||
|
||||
"當你將游標停留在物品欄的法杖上時,會顯示法杖中儲存的\n@mana 法力@,伴隨目前所選的@spells 法術@及其\n特殊能力。\n將法杖放入@arcane_workbench 法術工作台@則可\n看見更詳細的資訊。"
|
||||
]
|
||||
},
|
||||
|
||||
"spells": {
|
||||
"title": "法術",
|
||||
"include_in_contents": "main_contents",
|
||||
"triggers": [
|
||||
"ebwizardry:handbook/spells"
|
||||
],
|
||||
"text": [
|
||||
|
||||
"沒有法術的@wands 法杖@沒有作用。\n法術的記錄形式有兩種:\n一種是永久性的書本,\n一種是暫時性的卷軸。",
|
||||
|
||||
"法術書本身無法使用,而是用於將書中記載的法術存入@wands 法杖@。\n在世界各地都能發現法術書,應該用不了多少時間你就能找到一本。當你找到後,可將游標停留在書上,看一下這本法術書的基本資訊,也可以拿著書點擊滑鼠右鍵以閱讀更詳細的資料。",
|
||||
|
||||
"相對而言卷軸則有不同的用途: 拿著卷軸點擊滑鼠右鍵便會施展上面的法術並用掉卷軸。跟法術書一樣,卷軸在世界各地都能找到,但你也可以自己@enchanting_scrolls 製作@。",
|
||||
|
||||
"在你準備進行某個任務時,有些法術可能只會用到一兩次,\n所以你不想讓那些法術占用\n你的@wands 法杖@空間,此時卷軸就非常\n有用。不過得注意,比起法杖,卷軸還是效率較差的施法方式。",
|
||||
|
||||
"未經訓練的眼睛無法閱讀法術中的魔法符文。然而若要鑑定一個法術,你當然可以冒著發生意外的風險來施展看看結果,但即便如此許多法術是要在特定的條件下才會發生作用。不過即便如此,還是有可能在施法時誤用了未鑑定的法術,其潛在的危險性取決於這個法術有多強大。因此更安全可靠的選擇是使用鑑定卷軸,可以在箱子裡找到或是向法師購買。拿著鑑定卷軸點擊滑鼠右鍵便會用掉卷軸並鑑定你快捷欄中第一個未知的法術書或卷軸。"
|
||||
]
|
||||
},
|
||||
|
||||
"arcane_workbench": {
|
||||
"title": "法術工作台",
|
||||
"include_in_contents": "main_contents",
|
||||
"contents": {
|
||||
"id": "arcane_workbench_subsections",
|
||||
"hyperlinks": true,
|
||||
"page_numbers": true,
|
||||
"separator": "."
|
||||
},
|
||||
"triggers": [
|
||||
"ebwizardry:handbook/arcane_workbench"
|
||||
],
|
||||
"text": [
|
||||
|
||||
"法術工作台看起來有點像附魔台, 用來升級你的@wands 法杖@、\n為其補充法力和存入@spells 法術@。\n\n其合成方式如下:",
|
||||
|
||||
"#recipe arcane_workbench",
|
||||
|
||||
"接下來的頁面將說明法術工作台的各種功用。",
|
||||
|
||||
"#image workbench"
|
||||
],
|
||||
"sections": {
|
||||
"binding_spells": {
|
||||
"title": "抄寫法術",
|
||||
"include_in_contents": "arcane_workbench_subsections",
|
||||
"triggers": [
|
||||
"ebwizardry:handbook/arcane_workbench"
|
||||
],
|
||||
"text": [
|
||||
|
||||
"要將@spells 法術@存入你的@wands 法杖@,只要將\n法杖放入工作台中央的槽中,然後將法術書放入周圍其中一個槽並按下按鈕。此時你會注意到,在這個過程中,法術書並沒有受到任何影響,這是因為存入法術的動作,並不是將法術從法術書中取走,只是將法術抄寫至法杖中而已。因此你可以重複這個動作,盡量將想要的法術存入你的法杖。你一次最多只能存入五種法術到法杖中,不過可用協調升級來增加法術存量。"
|
||||
]
|
||||
},
|
||||
"charging_wands": {
|
||||
"title": "法杖補充法力",
|
||||
"include_in_contents": "arcane_workbench_subsections",
|
||||
"triggers": [
|
||||
"ebwizardry:handbook/arcane_workbench"
|
||||
],
|
||||
"text": [
|
||||
|
||||
"要幫@wands 法杖@補充法力,先將法杖\n放入法術工作台中央的槽,並在左下方那個槽放入魔法水晶,然後按下按鈕。\n每個水晶相當於#mana_per_crystal點的@mana 法力@,\n而法杖只會在需要時用掉水晶,因此你可以將水晶留在工作台內,以便需要時供應。但是請記得,法杖只能取用整數單位的水晶,舉例來說,如果法杖只需要30點法力,那補充法力時會有#example_charging_loss點法力浪費掉。"
|
||||
]
|
||||
},
|
||||
"upgrading_wands": {
|
||||
"title": "升級法杖",
|
||||
"include_in_contents": "arcane_workbench_subsections",
|
||||
"triggers": [
|
||||
"ebwizardry:handbook/tome_of_arcana"
|
||||
],
|
||||
"text": [
|
||||
|
||||
"你需要對應@tiers 等級@的法術寶典來\n升級你的@wands 法杖@或進行特殊的法\n杖升級。這兩種東西都可從怪物的掉落物或向法師購買獲得。要升級法杖,先將法杖放入法術工作台中央的槽,並在右上方的槽放入升級物後按下按鈕。",
|
||||
|
||||
"特殊的法杖升級可加強法杖某方面的能力,每種升級最高只能疊加三次,而法杖的總升級數取決於法杖的等級。升級後就無法移除。"
|
||||
]
|
||||
},
|
||||
"enchanting_scrolls": {
|
||||
"title": "製作卷軸",
|
||||
"include_in_contents": "arcane_workbench_subsections",
|
||||
"triggers": [
|
||||
"ebwizardry:handbook/scrolls"
|
||||
],
|
||||
"text": [
|
||||
|
||||
"法術工作台也能用來將@spells 法術@\n存入卷軸。要製作卷軸,你需要先用一張紙及一些線來合成空白卷軸,然後選一本想要作成卷軸的法術書,最後準備足夠的魔法水晶以提供施展這個法術的@mana 法力@。",
|
||||
|
||||
"#recipe blank_scroll",
|
||||
|
||||
"先將水晶放入左下方的槽,再將空白卷軸放入中央的槽,然後將法術書放入上方單獨的槽,最後按下按鈕以製成法術卷軸。"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"wizard_armour": {
|
||||
"title": "法師服",
|
||||
"include_in_contents": "main_contents",
|
||||
"triggers": [
|
||||
"ebwizardry:arcane_initiate"
|
||||
],
|
||||
"text": [
|
||||
|
||||
"身為一位法師,在與生物搏鬥時需要一些東西來保護自己。雖然也能使用一般的護甲,但是為了充分發揮你的法術,你還是需要一套法師服,包括帽子、長袍、褲子和鞋子。\n與一般護甲不同的是,法師服不會破損,其使用魔法能量來保護穿著的人。因此跟法杖一樣,需要魔法水晶來補充能量。不過幸好這些服裝不會消耗太多\n@mana 法力@。\n法師服補充能量的方式也跟法杖一樣,可以用@arcane_workbench 法術工作台@或\n@mana_flasks 法力瓶@來補充,但是必須當心,\n如果法師服的法力耗盡了,你會發現自己毫無防禦力。",
|
||||
|
||||
"#image wizard_armour",
|
||||
|
||||
"你可以用魔法絲綢來製成法師服:",
|
||||
|
||||
"#recipe magic_silk",
|
||||
"#recipe wizard_hat",
|
||||
"#recipe wizard_robe",
|
||||
"#recipe wizard_leggings",
|
||||
"#recipe wizard_boots",
|
||||
|
||||
"使用一般的附魔台就能為法師服附魔,而且由於魔法絲綢本身的特性,附魔後的效果特別好。對一個法師而言,最有用的是魔法、冰凍及衝擊三種防護附魔,有助於對抗敵人的魔法攻擊。",
|
||||
|
||||
"有些專注於特定元素的法師會穿著能加強該元素力量的特殊服裝,這種整套的服裝法師們都相當喜歡,但也不容易找到。",
|
||||
|
||||
"傳說中最強的法師曾經用一種法術印記來大大強化他們的服裝。"
|
||||
]
|
||||
},
|
||||
|
||||
"magical_world": {
|
||||
"title": "魔法世界",
|
||||
"include_in_contents": "main_contents",
|
||||
"contents": {
|
||||
"id": "magical_world_subsections",
|
||||
"hyperlinks": true,
|
||||
"page_numbers": true,
|
||||
"separator": "."
|
||||
},
|
||||
"triggers": [
|
||||
"ebwizardry:handbook/on_subsection_unlock"
|
||||
],
|
||||
"text": [
|
||||
|
||||
"只是待在家裡是無法成為法術大師的,到外頭探索充滿魔法的世界吧!\n若你勇於挑戰,古代遺址、遺物以及不管好的或壞的神秘生物,都等著你發現。\n最偉大的法師同時也最具好奇心,他們會不斷的探索周遭環境,並嘗試所發現的東西,來獲得豐富的知識及強大的力量。",
|
||||
|
||||
"雖然法師不免大多的時間都是孤身一人,但知識的分享也是學習魔法藝術重要的一環。找尋其他法師,盡可能從他們身上學習更多知識,溝通才是一切最大的力量。"
|
||||
],
|
||||
"sections": {
|
||||
"crystal_flowers": {
|
||||
"title": "水晶花",
|
||||
"include_in_contents": "magical_world_subsections",
|
||||
"triggers": [
|
||||
"ebwizardry:handbook/crystal_flowers"
|
||||
],
|
||||
"text": [
|
||||
|
||||
"在你的旅途當中,可能在野外會不時遇到奇怪的發光花朵,這些獨特的花稱為水晶花,它們具有聚集@mana 法力@的神奇能力,至今還不\n知道原因。不過我們卻知道這些水晶花,可經由採集製作以提取法力成為水晶,這使它們成為地面上相當有用的法力來源。然而由於這種花並不大,而且生長的土地都很小塊,因此這種方式所能獲得的法力其實很有限。",
|
||||
|
||||
"#image crystal_flower",
|
||||
"#recipe crystal_flower_to_crystals"
|
||||
]
|
||||
},
|
||||
"wizard_towers": {
|
||||
"title": "法師塔",
|
||||
"include_in_contents": "magical_world_subsections",
|
||||
"triggers": [
|
||||
"ebwizardry:wizard_tower"
|
||||
],
|
||||
"text": [
|
||||
|
||||
"害怕嗎?你並不是這個世界上唯一會使用魔法的人。\n在你的旅途中,你可能會遇到具有獨特尖頂或雙尖頂的高塔,這些是法師同伴居住的地方。\n隱居的生活使法師們有時候會有點古怪,但是他們通常還是友善的,而且只要你願意付出代價,還是會樂意與你分享他們的知識。\n在支付了貴重金屬及寶石後,你會收到許多驚奇的法術作為回報。",
|
||||
|
||||
"如果你想尋找的是@tiers 大師級@法術,\n那你得跟專門的人交談。",
|
||||
|
||||
"#image wizard_tower",
|
||||
|
||||
"不幸的是,有少數法師並不歡迎訪客。這些法師通常已被驅逐,所以對於任何闖入地盤的人都充滿敵意。\n接近這些傢伙要特別小心,並做好抵擋強大魔法的準備。只要擊敗他們,他們的知識就會成為你的了。",
|
||||
|
||||
"有一點必須知道,沒有法師會接受對他們攻擊或盜取他們東西的人,他們肯定不會善罷甘休。"
|
||||
]
|
||||
},
|
||||
"obelisks": {
|
||||
"title": "方尖碑",
|
||||
"include_in_contents": "magical_world_subsections",
|
||||
"triggers": [
|
||||
"ebwizardry:handbook/obelisks"
|
||||
],
|
||||
"text": [
|
||||
|
||||
"古老魔法的遺跡散落在世界各處,其中最著名的是刻有許多符號及符文的石頭結構。這些廢墟看起來像是某種古代文明的遺跡,無論建造它們的是誰或是什麼,顯然具有相當豐富的魔法知識,且用來在這些地方設置持續至今的防衛魔法。",
|
||||
|
||||
"這些結構大致上分成兩種類型,第一種是較常見的方尖碑:\n以雕刻符文石堆成高高尖頂的結構,底部開著一塊空間,存放著過去所遺留的次等魔法物品。",
|
||||
|
||||
"#image obelisk",
|
||||
|
||||
"這些結構通常受到魔法保護,一旦有人靠近就會召喚出充滿敵意的@creatures 魔法生物@來攻擊人類。\n對抗這些生物並摧毀其魔法源頭,那些遺物就是你的了。"
|
||||
]
|
||||
},
|
||||
"shrines": {
|
||||
"title": "神殿",
|
||||
"include_in_contents": "magical_world_subsections",
|
||||
"triggers": [
|
||||
"ebwizardry:visit_shrine"
|
||||
],
|
||||
"text": [
|
||||
|
||||
"第二種較為罕見的結構稱之為神殿,由一個中央基座及圍繞在四周的符文石柱所組成。基座上方擺著一個裝有古代@artefacts 神器@的\n寶箱,並通常施加了防護魔法鎖,以防他人竊取。整個結構還受到封鎖力場保護,使擅闖者無法逃離。",
|
||||
|
||||
"#image shrine",
|
||||
|
||||
"由於這些神殿的重要意義及巨大的神秘力量,更別說裡面的寶物,對於志氣高昂的法師特別有吸引力。\n\n但是務必謹慎,有許多關於法師被關在封鎖區內,可能因為幽閉恐懼症導致慢慢發瘋的報導。且愈來愈多人認為,這就是神殿防護魔法的一個部分,而被關在其中的法師,其實是被控制用來守護神殿。這對於膽敢前往冒險的人來說,無疑是令人不寒而慄的結局..."
|
||||
]
|
||||
},
|
||||
"creatures": {
|
||||
"title": "魔法生物",
|
||||
"include_in_contents": "magical_world_subsections",
|
||||
"triggers": [
|
||||
"ebwizardry:handbook/magical_creatures"
|
||||
],
|
||||
"text": [
|
||||
|
||||
"除了法師,還有許多其它生物也會使用魔法。其中有許多是源自於魔法,且大部分都能用特定的@spells 法術@召喚。會看到這些生物,\n大多是在守護@obelisks 方尖碑@,但也可能\n遇到了強大的召喚法師。只有非常少數的神秘生物才會偶爾在野外發現。"
|
||||
]
|
||||
},
|
||||
"artefacts": {
|
||||
"title": "神器",
|
||||
"include_in_contents": "magical_world_subsections",
|
||||
"triggers": [
|
||||
"ebwizardry:artefact"
|
||||
],
|
||||
"text": [
|
||||
|
||||
"在探索@shrines 神殿@時,你可能會好運的\n發現某種古代魔法神器,一種能夠賦予配戴者獨特而強大能力的物品。\n目前所知的類型有三種:\n為法術附加額外能力及效果的戒指,增強防禦力的項鍊,以及各種應用魔法的寶器。\n這些神器只是放入背包是沒有用的,要擺在身上的正確位置才會發生作用。"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"tiers": {
|
||||
"title": "等級",
|
||||
"include_in_contents": "main_contents",
|
||||
"triggers": [
|
||||
"ebwizardry:handbook/tome_of_arcana"
|
||||
],
|
||||
"text":[
|
||||
|
||||
"@wands 法杖@和@spells 法術@都分成四個等級: #colour_novice基礎#colour_reset、#colour_apprentice學徒#colour_reset、#colour_advanced進階#colour_reset以及#colour_master大師#colour_reset。每個等級都比前一級還強。",
|
||||
|
||||
"#image tiers",
|
||||
|
||||
"只有#colour_novice基礎#colour_reset法杖能以合成的方式製作,其最多可儲存#novice_max_charge點法力,且只能施展基礎法術。基礎法術通常不會消耗太多法力,任何人都足以施展。但這並不表示它們相較於高等法術就毫無用處。即便你已經能施展大師級法術,某些基礎法術由於消耗法力低而仍然實用。",
|
||||
|
||||
"#colour_apprentice學徒#colour_reset法杖是基礎法杖的下個等級,其最多可儲存#apprentice_max_charge點法力,並可施展基礎及學徒法術。學徒法術比基礎法術更強一些,但通常也消耗更多法力。",
|
||||
|
||||
"#colour_advanced進階#colour_reset法杖非常稀有也更加強大,可施展大師級以外的所有法術,並可儲存#advanced_max_charge點法力。進階法術能夠重創敵人,並擁有超人般的能力,例如隱身術。",
|
||||
|
||||
"#colour_master大師#colour_reset法杖是現存最強大的法杖,其最多可儲存#master_max_charge點法力,並可施展所有法術。大師級法術書相當罕見,且法術的威力能徹底毀滅的不僅是敵人,甚至包括整個世界。務必謹慎使用!",
|
||||
|
||||
"要提升至更高等級,首先法杖必須變得夠強大到足以引導該等級的法術。法杖會隨著施展法術而獲得成長,法術類型、法術力量、元素效果以及其它外部因素都可能會影響法杖的成長速度。",
|
||||
|
||||
"當法杖足夠強大,法術寶典為最終將法杖提升至下個等級的關鍵物品(請參閱@upgrading_wands 升級法杖@),\n一旦完成升級,法杖將再次朝下個等級開始成長。"
|
||||
]
|
||||
},
|
||||
|
||||
"elements": {
|
||||
"title": "元素",
|
||||
"include_in_contents": "main_contents",
|
||||
"triggers": [
|
||||
"ebwizardry:handbook/elements"
|
||||
],
|
||||
"text": [
|
||||
|
||||
"@spells 法術@各屬於不同的元素,代表\n法術的本質,且搭配使用對應的@wands 法杖@還會加強效果。",
|
||||
|
||||
"#image elements",
|
||||
|
||||
"#colour_fire火#colour_reset \n火元素涉及燃燒、岩漿以及爆炸,大概是最具破壞性的元素。一個強大的烈焰法師可使敵人面臨煉獄般的火海,並可能在過程中毀掉這個世界。\n大部分的火系法術會讓目標著火,使他們持續受到傷害,但是對地獄的生物則沒什麼效果。",
|
||||
|
||||
"#colour_ice冰#colour_reset \n冰元素來自於所有冰冷的物質。冰系法術通常會讓敵人減速,甚至使他們完全凍結,對於火系生物特別有效。\n冰凍魔法在戰鬥之外也很有用,例如使水面結冰以過河。",
|
||||
|
||||
"\n#colour_lightning電#colour_reset \n這個元素涉及雷電、風暴以及天氣。決不可小看一個強大雷電法師的力量,有些甚至能隨意召喚閃電。\n雷電法術經常能一次傷害多個敵人,還會自動搜尋目標,對任何生物都能造成有效的攻擊...但是得當心苦力怕。",
|
||||
|
||||
"#colour_necromancy死靈#colour_reset \n死靈是黑暗、渾沌以及不死生物的元素。神秘的死靈法師往往被視為邪惡,儘管通常不是這樣的。\n死靈法術常召喚@creatures 生物@來為他\n戰鬥,或進而扭曲敵人的意志。",
|
||||
|
||||
"#colour_earth大地#colour_reset \n大地元素來自於動植物、風等自然界的的力量。大地魔法千變萬化,從毒害敵人到控制天氣,有各式各樣的形式。\n大地法術是綜合攻擊、防禦以及實用的法術。",
|
||||
|
||||
"#colour_sorcery秘術#colour_reset \n秘術是力量與變化的元素。\n秘術法師能操縱光線、重力,甚至現實世界本身來符合他們的需求。\n且不提其它用途,秘術法術可用來提供施法者魔法力量,或是任意移動物體。",
|
||||
|
||||
"#colour_healing治療#colour_reset \n治療元素包括防禦和再生。\n治療法師會盡可能的保護自己及他們的同伴,因此可能會是非常難以對付的對手。\n治療法術在戰鬥中是不可或缺的,即便其通常不會用來進行攻擊,但是一些治療法術的淨化光芒會對不死生物造成相當大的傷害。",
|
||||
|
||||
"不同元素之間的分界並不總是那麼明確,有些法術除了所屬元素的性質外,也會具有其它元素的特性。",
|
||||
|
||||
"幸運的話,或許你能發現一種元素水晶,這是種在生長過程中吸收了元素的魔法水晶,不過實際上發生的方式及所需的條件仍然是個謎。但我們知道這種水晶能用來製作元素法杖,用來施展對應的法術,可比平常發揮更大的效果。"
|
||||
]
|
||||
},
|
||||
|
||||
"miscellaneous": {
|
||||
"title": "其它",
|
||||
"include_in_contents": "main_contents",
|
||||
"contents": {
|
||||
"id": "miscellaneous_subsections",
|
||||
"hyperlinks": true,
|
||||
"page_numbers": true,
|
||||
"separator": "."
|
||||
},
|
||||
"triggers": [
|
||||
"ebwizardry:on_subsection_unlock"
|
||||
],
|
||||
"sections": {
|
||||
"mana_flasks": {
|
||||
"title": "法力瓶",
|
||||
"include_in_contents": "miscellaneous_subsections",
|
||||
"triggers": [
|
||||
"ebwizardry:handbook/mana_flasks"
|
||||
],
|
||||
"text": [
|
||||
|
||||
"亞肯多魔法用品公司 - 為您所需的魔法物品!",
|
||||
|
||||
"需要在旅行中為你的@wands 法杖@補充\n法力嗎?\n沒問題! 現在@mana 法力@可以裝瓶。\n只要用一個玻璃瓶及八個魔法水晶合成出法力瓶,就可以隨身攜帶。要用的時候,只要將你的法杖與法力瓶合成,就能將法力存入法杖。(註)",
|
||||
|
||||
"#recipe medium_mana_flask",
|
||||
|
||||
"好消息! 即日起推出全新的小瓶裝及大瓶裝法力,可依您的需求選擇!",
|
||||
|
||||
"#recipe small_mana_flask",
|
||||
"#recipe large_mana_flask",
|
||||
|
||||
"(註)過程中瓶子會用掉,且裝瓶時也會耗損一些法力。"
|
||||
]
|
||||
},
|
||||
"throwable_items": {
|
||||
"title": "投擲物",
|
||||
"include_in_contents": "miscellaneous_subsections",
|
||||
"triggers": [
|
||||
"ebwizardry:handbook/throwables"
|
||||
],
|
||||
"text": [
|
||||
|
||||
"各種@spells 法術@的實體物,像是\n火焰彈、毒液彈、煙霧彈,還有電擊彈都能直接合成:",
|
||||
|
||||
"#recipe firebomb",
|
||||
"#recipe poison_bomb",
|
||||
"#recipe smoke_bomb",
|
||||
"#recipe spark_bomb"
|
||||
]
|
||||
},
|
||||
"automated_casting": {
|
||||
"title": "自動施法",
|
||||
"include_in_contents": "miscellaneous_subsections",
|
||||
"triggers": [
|
||||
"ebwizardry:enchant_scroll"
|
||||
],
|
||||
"text": [
|
||||
|
||||
"近期的實驗顯示,在某種程度上只需要簡單的發射器就能自動施展@spells 法術@。沒有人知道原因,\n但看起來似乎是紅石的神奇特性竟然能觸發法術卷軸。只要將一些卷軸放入發射器,然後提供能量,就完成了這個機關..."
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"crafting_recipes": {
|
||||
"title": "合成表",
|
||||
"include_in_contents": "main_contents",
|
||||
"text": [
|
||||
|
||||
"#recipe arcane_workbench",
|
||||
"#recipe novice_wands",
|
||||
"#recipe magic_missile_spell_book",
|
||||
"#recipe wizard_handbook",
|
||||
"#recipe crystal_flower_to_crystals",
|
||||
"#recipe crystal_blocks",
|
||||
"#recipe crystal_blocks_to_crystals",
|
||||
"#recipe crystal_shard",
|
||||
"#recipe small_mana_flask",
|
||||
"#recipe medium_mana_flask",
|
||||
"#recipe large_mana_flask",
|
||||
"#recipe runestone",
|
||||
"#recipe runestone_pedestal",
|
||||
"#recipe transportation_stone",
|
||||
"#recipe magic_silk",
|
||||
"#recipe wizard_hat",
|
||||
"#recipe wizard_robe",
|
||||
"#recipe wizard_leggings",
|
||||
"#recipe wizard_boots",
|
||||
"#recipe blank_scroll",
|
||||
"#recipe firebomb",
|
||||
"#recipe poison_bomb",
|
||||
"#recipe smoke_bomb",
|
||||
"#recipe spark_bomb"
|
||||
]
|
||||
},
|
||||
|
||||
"credits": {
|
||||
"title": "製作群",
|
||||
"include_in_contents": "main_contents",
|
||||
"text": [
|
||||
|
||||
"法術模組\n版本 #version\n支援 Minecraft #mcversion",
|
||||
|
||||
"設計、程式及材質: Electroblob",
|
||||
|
||||
"感謝 Minecraft Forge 及 MCP,\n沒有它們就沒有這個模組。",
|
||||
|
||||
"也感謝Minecraft的模組討論區,\n總能回答我的模組問題!",
|
||||
|
||||
"\n另外,我要感謝以下各位對本模組的貢獻:",
|
||||
|
||||
"程式碼:",
|
||||
|
||||
"》Corail31 \n》12foo \n》Shadows-of-Fire \n》HellFirePvP \n》Tora-B \n》Avatair \n》Aeronica \n》UltraHex \n》Azim-Palmer \n》raoulvdberge \n》rafasoares",
|
||||
|
||||
"\n\n翻譯:",
|
||||
|
||||
"》繁體中文: Grant\n》(墨西哥)西班牙文: MadWrist \n》俄文: VilagVil, kellixon\n》法文: Hahdrim\n》巴西葡萄牙文: lorrampi\n》簡體中文: ZHENGLOC, dragon-evol\n》韓文: shejery, rewi_wire\n》波蘭文: Trozuu",
|
||||
|
||||
"雷電音效: OhhWowProductions",
|
||||
|
||||
"更多資訊請前往 @https://github.com/Electroblob77/Wizardry/wiki wiki@",
|
||||
|
||||
"覺得法術模組還有不足之處? 請加入 @https://discord.gg/MTmMzMv Discord 伺服器@以獲得\n最新消息、討論及額外事務!"
|
||||
]
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -2,10 +2,10 @@
|
||||
{
|
||||
"modid" : "ebwizardry",
|
||||
"name" : "Electroblob's Wizardry",
|
||||
"version" : "4.2.9",
|
||||
"version" : "4.2.11",
|
||||
"mcversion" : "1.12.2",
|
||||
"url" : "https://minecraft.curseforge.com/projects/electroblobs-wizardry",
|
||||
"credits" : "\nDesigned, coded and textured by Electroblob.\nCode contributed by: Corail31, 12foo, Shadows-of-Fire, Tora-B, Avatair, Aeronica, UltraHex, Azim-Palmer, raoulvdberge.\nTranslators: MadWrist (Spanish, Mexican Spanish), VilagVil, kellixon & bigenergy (Russian), Hahdrim (French), lorrampi (Brazilian Portuguese), ZHENGLOC & dragon-evol (Chinese), shejery & rewi_wire (Korean), Trozuu (Polish).",
|
||||
"credits" : "\nDesigned, coded and textured by Electroblob.\nCode contributed by: Corail31, 12foo, Shadows-of-Fire, Tora-B, Avatair, Aeronica, UltraHex, Azim-Palmer, raoulvdberge.\nTranslators: MadWrist (Spanish, Mexican Spanish), VilagVil, kellixon & bigenergy (Russian), Hahdrim (French), lorrampi (Brazilian Portuguese), ZHENGLOC & dragon-evol (Chinese), shejery & rewi_wire (Korean), Trozuu (Polish), chesterccj305 (Taiwanese).",
|
||||
"authorList" : [
|
||||
"Electroblob"
|
||||
],
|
||||
|
||||
Reference in New Issue
Block a user