diff --git a/changelog.txt b/changelog.txt index 0595047d..98c18c43 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,101 @@ +------------------------------------------------------ +Version 2.4.3 +------------------------------------------------------ + +- Fixed Lava Crystals causing crash when used while not yet bound +- Fixed Teleposers sending entities at the destination position the wrong way +- Fixed Speed Runes not working on Tier 2 altars +- Fixed crash when checking tasks for some entities +- Fixed crash when checking some entities for potion effects +- Re-implemented the Boost potion + - The PR still had TODOs in the description when I merged so this may not be complete yet + +------------------------------------------------------ +Version 2.4.2 +------------------------------------------------------ +Now with no guarantees for working textures! + +Blood Altar: + - A Blood Altar with a Redstone Lamp below it will now emit a redstone signal upon finishing crafting (#1635) + - Fixed Blood Altar being able to obtain negative progress (#1649) + +Living Armor: + - Fixed Storm Trooper Level 4 costing 65 instead of -65 upgrade points (#1631) + +Rituals: + - Fixed Ritual of the Eternal Soul (Ritual Stone layout & didn't work) (#1633) + - Fixed Ritual Tinkerer (ritual area is now unique per ritual instance), added the ability to reset the ritual ranges to default (#1636) + +Misc: + - Lava Crystals can now set things on fire (#1652) + - Fixed parts of the German translation. Other translations still need to be reworked to accomodate changed translation keys (#1640) + - Fixed Guidebook showing wrong recipes (Rune of Self-Sacrifice instead of others) (#1641) + - Wooden Paths now behave like wood instead of stone (sound & efficient tool) (#1638) + + +Technical Stuff: + - Fixed Veil of Evil and Ward of Sacrosanctity console spam (which could eventually lead to an out of memory exception) (#1639) + - Fixed GLSL shader compilation errors (affected Mesa driver (AMD GPU) on Linux) (#1624) + - Fixed `/bloodmagic network` command permissions (#1613) + - Fixed a rare crash that could occur when summoning mobs (#1618) + +------------------------------------------------------ +Version 2.4.1 +------------------------------------------------------ + +Nut was too lazy to create a changelog, it's AEon's turn now! +Changes made from Feb 02 - now (Fill end date in later) + + +Living Armor: + - Fixed "Soft Fall" not preventing damage + - "Nocturnal Prowess" should not flash anymore + - "Trickshot" now ignores HurtResistanceTime + - "Trickshot" now works properly with sentient arrows + - "Step Assist" does not take effect while sneaking + +Sentient Bow: + - Fixed Destructive Will arrows exploding continuously + - Fixed Tipped Arrows getting improved even if no Will can be used + +Sigils: + - Buffed "Sigil of the Fast Miner" to be in accordance to the "Sanguine Scientium" + - Fixed a bug where "Sigil of the Fast Miner" would also cause the whirlwind effect + - Added "Whirlwind" to the potion registry + - Fixed broken Sigil tooltip formatting + - Fixed Sigil of Holding not updating some Sigil data, allowing for exploits + - Greatly improved "Sigil of Compression" performance + - Fixed "Sigil of Compression" bug that would eat leftover items (usually everything between 55 and 64 items for a 3x3 compression) + + +Rituals: + - Ported Veil of Evil & Ward of Sacrosanctity + - Fixed "Serenade of the Nether" replacing lava source blocks with lava (fixed underlying function to detect flowing liquids) + - Added configurability to Ritual of the High Jump by modifying a new ritual area with the Ritual Tinkerer + +Misc: + - Fixed routing node oredict filter (crashes) + - Fixed mimic vanishing in some cases + - Fixed "Blood Letter's Pack" and "Coat of Arms" always being used in the main hand slot (action bar/hotbar) + - Stop insertions into Demon Crucible if the inventory is not empty + - Fixed abnormal deaths at your own hands through the sacrificial dagger (hopefully) (Gravestone bugginess) + - Fixed "Unmending" mod incompatibility + - Fixed Teleposers crashing the game if someone force-fed it junk + - added Nut being angery at contributors for messing stuff up + - Added some Russian language strings for the guide book + - Added repair recipes for Sentient Tools & Living Armor to JEI + - Many translation keys have changed which makes affected translations fall back to english + +Technical Stuff no player cares about: + - Formatted Project code + - Fixed BlockState parsing (mimic vanishing) + - Fixed some and streamlined ritual block ranges + - Mystery drain still mysterious + - Use TextFormatting rather than color codes in block lang names + - Fixed world unload crash (may happen if a world is loaded by world generators or JEI Resource graphing) + - Fixed `/bloodmagic network get` command + - Added translation keys for tickethistory command help strings + ------------------------------------------------------ Version 2.4.0 ------------------------------------------------------ @@ -1107,4 +1205,4 @@ Changed - A graphical overhaul of everything has been implemented. These textures were provided by CyanideX's Unity texture pack. BBoldt and Yulife (Inap) from the Unity team are our new permanent texture artists. Bug Fixes -- \ No newline at end of file +- diff --git a/gradle.properties b/gradle.properties index 0e38a009..e1c95353 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.4.0 +mod_version=2.4.3 mc_version=1.12.2 forge_version=14.23.5.2808 curse_id=224791 diff --git a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java index 3681b7af..c00b81d5 100644 --- a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java @@ -9,90 +9,82 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @Config(modid = BloodMagic.MODID, name = BloodMagic.MODID + "/" + BloodMagic.MODID, category = "") @Mod.EventBusSubscriber(modid = BloodMagic.MODID) -public class ConfigHandler -{ +public class ConfigHandler { - @Config.Comment({ "General settings" }) + @Config.Comment({"General settings"}) public static ConfigGeneral general = new ConfigGeneral(); - @Config.Comment({ "Blacklist options for various features" }) + @Config.Comment({"Blacklist options for various features"}) public static ConfigBlacklist blacklist = new ConfigBlacklist(); - @Config.Comment({ "Value modifiers for various features" }) + @Config.Comment({"Value modifiers for various features"}) public static ConfigValues values = new ConfigValues(); - @Config.Comment({ "Settings that only pertain to the client" }) + @Config.Comment({"Settings that only pertain to the client"}) public static ConfigClient client = new ConfigClient(); - @Config.Comment({ "Compatibility settings" }) + @Config.Comment({"Compatibility settings"}) public static ConfigCompat compat = new ConfigCompat(); @SubscribeEvent - public static void onConfigChanged(ConfigChangedEvent.OnConfigChangedEvent event) - { - if (event.getModID().equals(BloodMagic.MODID)) - { + public static void onConfigChanged(ConfigChangedEvent.OnConfigChangedEvent event) { + if (event.getModID().equals(BloodMagic.MODID)) { ConfigManager.sync(event.getModID(), Config.Type.INSTANCE); // Sync config values BloodMagic.RITUAL_MANAGER.syncConfig(); MeteorConfigHandler.handleMeteors(false); // Reload meteors } } - public static class ConfigGeneral - { - @Config.Comment({ "Enables extra information to be printed to the log.", "Warning: May drastically increase log size." }) + public static class ConfigGeneral { + @Config.Comment({"Enables extra information to be printed to the log.", "Warning: May drastically increase log size."}) public boolean enableDebugLogging = false; - @Config.Comment({ "Enables extra information to be printed to the log." }) + @Config.Comment({"Enables extra information to be printed to the log."}) public boolean enableAPILogging = false; - @Config.Comment({ "Enables extra information to be printed to the log.", "Warning: May drastically increase log size." }) + @Config.Comment({"Enables extra information to be printed to the log.", "Warning: May drastically increase log size."}) public boolean enableVerboseAPILogging = false; - @Config.Comment({ "Enables tier 6 related registrations. This is for pack makers."}) + @Config.Comment({"Enables tier 6 related registrations. This is for pack makers."}) @Config.RequiresMcRestart public boolean enableTierSixEvenThoughThereIsNoContent = false; } - public static class ConfigBlacklist - { - @Config.Comment({ "Stops listed blocks and entities from being teleposed.", "Use the registry name of the block or entity. Vanilla objects do not require the modid.", "If a block is specified, you can list the variants to only blacklist a given state." }) - public String[] teleposer = { "bedrock", "mob_spawner" }; - @Config.Comment({ "Stops listed blocks from being transposed.", "Use the registry name of the block. Vanilla blocks do not require the modid." }) - public String[] transposer = { "bedrock", "mob_spawner" }; - @Config.Comment({ "Stops the listed entities from being used in the Well of Suffering.", "Use the registry name of the entity. Vanilla entities do not require the modid." }) + public static class ConfigBlacklist { + @Config.Comment({"Stops listed blocks and entities from being teleposed.", "Use the registry name of the block or entity. Vanilla objects do not require the modid.", "If a block is specified, you can list the variants to only blacklist a given state."}) + public String[] teleposer = {"bedrock", "mob_spawner"}; + @Config.Comment({"Stops listed blocks from being transposed.", "Use the registry name of the block. Vanilla blocks do not require the modid."}) + public String[] transposer = {"bedrock", "mob_spawner"}; + @Config.Comment({"Stops the listed entities from being used in the Well of Suffering.", "Use the registry name of the entity. Vanilla entities do not require the modid."}) public String[] wellOfSuffering = {}; } - public static class ConfigValues - { - @Config.Comment({ "Declares the amount of LP gained per HP sacrificed for the given entity.", "Setting the value to 0 will blacklist it.", "Use the registry name of the entity followed by a ';' and then the value you want.", "Vanilla entities do not require the modid." }) - public String[] sacrificialValues = { "villager;100", "slime;15", "enderman;10", "cow;100", "chicken;100", "horse;100", "sheep;100", "wolf;100", "ocelot;100", "pig;100", "rabbit;100" }; - @Config.Comment({ "Amount of LP the Coat of Arms should provide for each damage dealt." }) + public static class ConfigValues { + @Config.Comment({"Declares the amount of LP gained per HP sacrificed for the given entity.", "Setting the value to 0 will blacklist it.", "Use the registry name of the entity followed by a ';' and then the value you want.", "Vanilla entities do not require the modid."}) + public String[] sacrificialValues = {"villager;100", "slime;15", "enderman;10", "cow;100", "chicken;100", "horse;100", "sheep;100", "wolf;100", "ocelot;100", "pig;100", "rabbit;100"}; + @Config.Comment({"Amount of LP the Coat of Arms should provide for each damage dealt."}) @Config.RangeInt(min = 0, max = 100) public int coatOfArmsConversion = 20; - @Config.Comment({ "Amount of LP the Sacrificial Dagger should provide for each damage dealt." }) + @Config.Comment({"Amount of LP the Sacrificial Dagger should provide for each damage dealt."}) @Config.RangeInt(min = 0, max = 10000) public int sacrificialDaggerConversion = 100; - @Config.Comment({ "Will rewrite any default meteor types with new versions.", "Disable this if you want any of your changes to stay, or do not want default meteor types regenerated." }) + @Config.Comment({"Will rewrite any default meteor types with new versions.", "Disable this if you want any of your changes to stay, or do not want default meteor types regenerated."}) public boolean shouldResyncMeteors = true; - @Config.Comment({ "Should mobs that die through the Well of Suffering Ritual drop items?"}) + @Config.Comment({"Should mobs that die through the Well of Suffering Ritual drop items?"}) public boolean wellOfSufferingDrops = true; } - public static class ConfigClient - { - @Config.Comment({ "Always render the beams between routing nodes.", "If disabled, the beams will only render while the Node Router is held." }) + public static class ConfigClient { + @Config.Comment({"Always render the beams between routing nodes.", "If disabled, the beams will only render while the Node Router is held."}) public boolean alwaysRenderRoutingLines = false; - @Config.Comment({ "Completely hide spectral blocks from view.", "If disabled, a transparent block will be displayed." }) + @Config.Comment({"Completely hide spectral blocks from view.", "If disabled, a transparent block will be displayed."}) public boolean invisibleSpectralBlocks = true; - @Config.Comment({ "When cycling through slots, the Sigil of Holding will skip over empty slots and move to the next occupied one.", "If disabled, it will behave identically to the default hotbar." }) + @Config.Comment({"When cycling through slots, the Sigil of Holding will skip over empty slots and move to the next occupied one.", "If disabled, it will behave identically to the default hotbar."}) public boolean sigilHoldingSkipsEmptySlots = false; } - public static class ConfigCompat - { - @Config.Comment({ "The display mode to use when looking at a Blood Altar.", "ALWAYS - Always display information.", "SIGIL_HELD - Only display information when a Divination or Seers sigil is held in either hand.", "SIGIL_CONTAINED - Only display information when a Divination or Seers sigil is somewhere in the inventory." }) + public static class ConfigCompat { + @Config.Comment({"The display mode to use when looking at a Blood Altar.", "ALWAYS - Always display information.", "SIGIL_HELD - Only display information when a Divination or Seers sigil is held in either hand.", "SIGIL_CONTAINED - Only display information when a Divination or Seers sigil is somewhere in the inventory."}) public AltarDisplayMode wailaAltarDisplayMode = AltarDisplayMode.SIGIL_HELD; - public enum AltarDisplayMode - { + public enum AltarDisplayMode { ALWAYS, SIGIL_HELD, - SIGIL_CONTAINED, ; + SIGIL_CONTAINED, + ; } } } diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectArrowTurret.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectArrowTurret.java index ccebac1f..67dc2ac6 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectArrowTurret.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectArrowTurret.java @@ -22,8 +22,7 @@ import net.minecraft.world.World; import net.minecraftforge.items.IItemHandler; import WayofTime.bloodmagic.util.Utils; -public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect -{ +public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect { public EntityLiving target; public int arrowTimer; public static final int ARROW_WINDUP = 50; @@ -34,49 +33,39 @@ public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect private double yaw = 0; private double lastYaw = 0; - public AlchemyArrayEffectArrowTurret(String key) - { + public AlchemyArrayEffectArrowTurret(String key) { super(key); } @Override - public boolean update(TileEntity tile, int ticksActive) - { + public boolean update(TileEntity tile, int ticksActive) { BlockPos pos = tile.getPos(); World world = tile.getWorld(); BlockPos chestPos = pos.down(); TileEntity chestTile = world.getTileEntity(chestPos); - if (chestTile == null) - { + if (chestTile == null) { return false; } IItemHandler itemHandler = Utils.getInventory(chestTile, EnumFacing.UP); - if (itemHandler == null) - { + if (itemHandler == null) { return false; } ItemStack arrowStack = new ItemStack(Items.AIR); - if (lastChestSlot >= 0 && lastChestSlot < itemHandler.getSlots()) - { + if (lastChestSlot >= 0 && lastChestSlot < itemHandler.getSlots()) { ItemStack testStack = itemHandler.extractItem(lastChestSlot, 1, true); - if (testStack.isEmpty() || !(testStack.getItem() instanceof ItemArrow)) - { + if (testStack.isEmpty() || !(testStack.getItem() instanceof ItemArrow)) { lastChestSlot = -1; - } else - { + } else { arrowStack = testStack; } } - if (lastChestSlot < 0) - { - for (int i = 0; i < itemHandler.getSlots(); i++) - { + if (lastChestSlot < 0) { + for (int i = 0; i < itemHandler.getSlots(); i++) { ItemStack testStack = itemHandler.extractItem(i, 1, true); - if (!testStack.isEmpty() && testStack.getItem() instanceof ItemArrow) - { + if (!testStack.isEmpty() && testStack.getItem() instanceof ItemArrow) { arrowStack = testStack; lastChestSlot = i; break; @@ -85,13 +74,11 @@ public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect } - if (lastChestSlot < 0) - { + if (lastChestSlot < 0) { return false; //No arrows in the chest. Welp! } - if (canFireOnMob(world, pos, target)) - { + if (canFireOnMob(world, pos, target)) { Vector2d pitchYaw = getPitchYaw(pos, target); lastPitch = pitch; lastYaw = yaw; @@ -99,27 +86,23 @@ public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect yaw = pitchYaw.y; arrowTimer++; - if (arrowTimer >= ARROW_WINDUP) - { + if (arrowTimer >= ARROW_WINDUP) { // ItemStack arrowStack = new ItemStack(Items.ARROW); fireOnTarget(world, pos, arrowStack, target); - if (!world.isRemote) - { + if (!world.isRemote) { itemHandler.extractItem(lastChestSlot, 1, false); } arrowTimer = 0; } return false; - } else - { + } else { target = null; arrowTimer = -1; } List mobsInRange = world.getEntitiesWithinAABB(EntityMob.class, getBounds(pos)); - for (EntityMob entity : mobsInRange) - { + for (EntityMob entity : mobsInRange) { if (canFireOnMob(world, pos, entity))// && isMobInFilter(ent)) { target = entity; @@ -133,34 +116,27 @@ public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect return false; } - public double getPitch() - { + public double getPitch() { return pitch; } - public double getLastPitch() - { + public double getLastPitch() { return lastPitch; } - public double getYaw() - { + public double getYaw() { return yaw; } - public double getLastYaw() - { + public double getLastYaw() { return lastYaw; } - public void fireOnTarget(World world, BlockPos pos, ItemStack arrowStack, EntityLiving targetMob) - { + public void fireOnTarget(World world, BlockPos pos, ItemStack arrowStack, EntityLiving targetMob) { float vel = 3f; double damage = 2; - if (!world.isRemote) - { - if (arrowStack.getItem() instanceof ItemArrow) - { + if (!world.isRemote) { + if (arrowStack.getItem() instanceof ItemArrow) { // ItemArrow arrow = (ItemArrow) arrowStack.getItem(); // EntityArrow entityarrow = arrow.createArrow(world, arrowStack, targetMob); EntityTippedArrow entityarrow = new EntityTippedArrow(world); @@ -180,10 +156,8 @@ public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect } } - public static Vector2d getPitchYaw(BlockPos pos, Entity entityIn) - { - if (entityIn == null) - { + public static Vector2d getPitchYaw(BlockPos pos, Entity entityIn) { + if (entityIn == null) { return new Vector2d(0, 0); } @@ -197,46 +171,38 @@ public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect return new Vector2d(pitch, yaw); } - public boolean canEntityBeSeen(World world, BlockPos pos, Entity entityIn) - { + public boolean canEntityBeSeen(World world, BlockPos pos, Entity entityIn) { return world.rayTraceBlocks(new Vec3d(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5), new Vec3d(entityIn.posX, entityIn.posY + (double) entityIn.getEyeHeight(), entityIn.posZ), false, true, false) == null; } - public boolean canFireOnMob(World world, BlockPos pos, Entity entityIn) - { + public boolean canFireOnMob(World world, BlockPos pos, Entity entityIn) { return entityIn != null && !entityIn.isDead && entityIn.getDistanceSqToCenter(pos) <= getRange() * getRange() && entityIn.getDistanceSqToCenter(pos) >= getMinRange() * getMinRange() && canEntityBeSeen(world, pos, entityIn); } - public AxisAlignedBB getBounds(BlockPos pos) - { + public AxisAlignedBB getBounds(BlockPos pos) { return new AxisAlignedBB(pos).grow(getRange(), getRange(), getRange()); } - public float getRange() - { + public float getRange() { return 32; } - public float getMinRange() - { + public float getMinRange() { return 3; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { } @Override - public AlchemyArrayEffect getNewCopy() - { + public AlchemyArrayEffect getNewCopy() { return new AlchemyArrayEffectArrowTurret(key); } diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java index c21135ac..16ce80b1 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java @@ -17,25 +17,21 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -public class AlchemyArrayEffectFurnaceFuel extends AlchemyArrayEffect -{ +public class AlchemyArrayEffectFurnaceFuel extends AlchemyArrayEffect { static double radius = 10; static int burnTicksAdded = 401; //Set to +1 more than it needs to be due to a hacky method - basically done so that the array doesn't double dip your health if you only add one item. - public AlchemyArrayEffectFurnaceFuel(String key) - { + public AlchemyArrayEffectFurnaceFuel(String key) { super(key); } @Override - public boolean update(TileEntity tile, int ticksActive) - { + public boolean update(TileEntity tile, int ticksActive) { BlockPos pos = tile.getPos(); World world = tile.getWorld(); EntityPlayer sacrifice = null; - for (EnumFacing face : EnumFacing.VALUES) - { + for (EnumFacing face : EnumFacing.VALUES) { BlockPos furnacePos = pos.offset(face); Block block = world.getBlockState(furnacePos).getBlock(); if (block != Blocks.FURNACE) //This will only work vanilla furnaces. No others! @@ -44,33 +40,25 @@ public class AlchemyArrayEffectFurnaceFuel extends AlchemyArrayEffect } TileEntity bottomTile = world.getTileEntity(furnacePos); - if (bottomTile instanceof TileEntityFurnace) - { + if (bottomTile instanceof TileEntityFurnace) { TileEntityFurnace furnaceTile = (TileEntityFurnace) bottomTile; - if (canFurnaceSmelt(furnaceTile) && !furnaceTile.isBurning()) - { - if (sacrifice == null || sacrifice.isDead) - { + if (canFurnaceSmelt(furnaceTile) && !furnaceTile.isBurning()) { + if (sacrifice == null || sacrifice.isDead) { AxisAlignedBB bb = new AxisAlignedBB(pos).grow(radius); List playerList = world.getEntitiesWithinAABB(EntityPlayer.class, bb); - for (EntityPlayer player : playerList) - { - if (!player.isDead) - { + for (EntityPlayer player : playerList) { + if (!player.isDead) { sacrifice = player; } } } - if (sacrifice == null || sacrifice.isDead) - { + if (sacrifice == null || sacrifice.isDead) { return false; } - if (addFuelTime(furnaceTile, world, furnacePos, burnTicksAdded)) - { - if (!sacrifice.capabilities.isCreativeMode) - { + if (addFuelTime(furnaceTile, world, furnacePos, burnTicksAdded)) { + if (!sacrifice.capabilities.isCreativeMode) { sacrifice.hurtResistantTime = 0; sacrifice.attackEntityFrom(DamageSourceBloodMagic.INSTANCE, 1.0F); //No. } @@ -82,41 +70,32 @@ public class AlchemyArrayEffectFurnaceFuel extends AlchemyArrayEffect return false; } - public static boolean addFuelTime(TileEntityFurnace furnaceTile, World world, BlockPos furnacePos, int cookTime) - { + public static boolean addFuelTime(TileEntityFurnace furnaceTile, World world, BlockPos furnacePos, int cookTime) { furnaceTile.setField(0, cookTime); BlockFurnace.setState(true, world, furnacePos); return true; } - public static boolean canFurnaceSmelt(TileEntityFurnace furnaceTile) - { + public static boolean canFurnaceSmelt(TileEntityFurnace furnaceTile) { ItemStack burnStack = furnaceTile.getStackInSlot(0); - if (burnStack.isEmpty()) - { + if (burnStack.isEmpty()) { return false; - } else - { + } else { ItemStack resultStack = FurnaceRecipes.instance().getSmeltingResult(burnStack); - if (resultStack.isEmpty()) - { + if (resultStack.isEmpty()) { return false; - } else - { + } else { ItemStack finishStack = furnaceTile.getStackInSlot(2); - if (finishStack.isEmpty()) - { + if (finishStack.isEmpty()) { return true; - } else if (!finishStack.isItemEqual(resultStack)) - { + } else if (!finishStack.isItemEqual(resultStack)) { return false; } else if (finishStack.getCount() + resultStack.getCount() <= furnaceTile.getInventoryStackLimit() && finishStack.getCount() + resultStack.getCount() <= finishStack.getMaxStackSize()) // Forge fix: make furnace respect stack sizes in furnace recipes { return true; - } else - { + } else { return finishStack.getCount() + resultStack.getCount() <= resultStack.getMaxStackSize(); // Forge fix: make furnace respect stack sizes in furnace recipes } } @@ -124,20 +103,17 @@ public class AlchemyArrayEffectFurnaceFuel extends AlchemyArrayEffect } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { } @Override - public AlchemyArrayEffect getNewCopy() - { + public AlchemyArrayEffect getNewCopy() { return new AlchemyArrayEffectFurnaceFuel(key); } } \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java index ce64e7f3..1368cb50 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java @@ -13,8 +13,7 @@ import WayofTime.bloodmagic.tile.TileAlchemyArray; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.util.Utils; -public class AlchemyArrayEffectLaputa extends AlchemyArrayEffect -{ +public class AlchemyArrayEffectLaputa extends AlchemyArrayEffect { public static final int TELEPOSE_DELAY = 4; private BlockPos currentPos = BlockPos.ORIGIN; @@ -22,20 +21,16 @@ public class AlchemyArrayEffectLaputa extends AlchemyArrayEffect private int radius = -1; private int teleportHeightOffset = 5; - public AlchemyArrayEffectLaputa(String key) - { + public AlchemyArrayEffectLaputa(String key) { super(key); } @Override - public boolean update(TileEntity tile, int ticksActive) - { - if (ticksActive >= 100) - { + public boolean update(TileEntity tile, int ticksActive) { + if (ticksActive >= 100) { World world = tile.getWorld(); - if (radius == -1) - { + if (radius == -1) { ((TileAlchemyArray) tile).setItemDrop(false); radius = getRandomRadius(world.rand); teleportHeightOffset = getRandomHeightOffset(world.rand); @@ -43,8 +38,7 @@ public class AlchemyArrayEffectLaputa extends AlchemyArrayEffect } BlockPos pos = tile.getPos(); - if (world.isRemote) - { + if (world.isRemote) { return false; } @@ -52,8 +46,7 @@ public class AlchemyArrayEffectLaputa extends AlchemyArrayEffect int i = -radius; int k = -radius; - if (currentPos != null) - { + if (currentPos != null) { j = currentPos.getY(); i = currentPos.getX(); k = currentPos.getZ(); @@ -61,34 +54,27 @@ public class AlchemyArrayEffectLaputa extends AlchemyArrayEffect int checks = 0; int maxChecks = 100; - while (j <= radius) - { - while (i <= radius) - { - while (k <= radius) - { - if (i == 0 && j == 0 && k == 0) - { + while (j <= radius) { + while (i <= radius) { + while (k <= radius) { + if (i == 0 && j == 0 && k == 0) { k++; continue; } checks++; - if (checks >= maxChecks) - { + if (checks >= maxChecks) { this.currentPos = new BlockPos(i, j, k); return false; } - if (checkIfSphere(radius, i, j, k)) - { + if (checkIfSphere(radius, i, j, k)) { BlockPos newPos = pos.add(i, j, k); BlockPos offsetPos = newPos.up(teleportHeightOffset); IBlockState state = world.getBlockState(newPos); TeleposeEvent event = new TeleposeEvent(world, newPos, world, offsetPos); - if (state.getBlockHardness(world, newPos) > 0 && !MinecraftForge.EVENT_BUS.post(event) && Utils.swapLocations(event.initalWorld, event.initialBlockPos, event.finalWorld, event.finalBlockPos)) - { + if (state.getBlockHardness(world, newPos) > 0 && !MinecraftForge.EVENT_BUS.post(event) && Utils.swapLocations(event.initalWorld, event.initialBlockPos, event.finalWorld, event.finalBlockPos)) { k++; this.currentPos = new BlockPos(i, j, k); @@ -112,25 +98,21 @@ public class AlchemyArrayEffectLaputa extends AlchemyArrayEffect return false; } - public boolean checkIfSphere(float radius, float xOff, float yOff, float zOff) - { + public boolean checkIfSphere(float radius, float xOff, float yOff, float zOff) { float possOffset = 0.5f; return xOff * xOff + yOff * yOff + zOff * zOff <= ((radius + possOffset) * (radius + possOffset)); } - public int getRandomRadius(Random rand) - { + public int getRandomRadius(Random rand) { return rand.nextInt(5) + 4; } - public int getRandomHeightOffset(Random rand) - { + public int getRandomHeightOffset(Random rand) { return radius * 2 + 1 + rand.nextInt(5); } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { tag.setInteger("radius", radius); tag.setInteger("teleportHeightOffset", teleportHeightOffset); tag.setInteger(Constants.NBT.X_COORD, currentPos.getX()); @@ -139,16 +121,14 @@ public class AlchemyArrayEffectLaputa extends AlchemyArrayEffect } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { radius = tag.getInteger("radius"); teleportHeightOffset = tag.getInteger("teleportHeightOffset"); currentPos = new BlockPos(tag.getInteger(Constants.NBT.X_COORD), tag.getInteger(Constants.NBT.Y_COORD), tag.getInteger(Constants.NBT.Z_COORD)); } @Override - public AlchemyArrayEffect getNewCopy() - { + public AlchemyArrayEffect getNewCopy() { return new AlchemyArrayEffectLaputa(key); } } diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMobSacrifice.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMobSacrifice.java index 77224e58..d0b08483 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMobSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMobSacrifice.java @@ -29,29 +29,24 @@ import WayofTime.bloodmagic.ritual.AreaDescriptor; import WayofTime.bloodmagic.util.DamageSourceBloodMagic; import WayofTime.bloodmagic.util.helper.PurificationHelper; -public class AlchemyArrayEffectMobSacrifice extends AlchemyArrayEffect -{ +public class AlchemyArrayEffectMobSacrifice extends AlchemyArrayEffect { public static final AreaDescriptor itemDescriptor = new AreaDescriptor.Rectangle(new BlockPos(-5, -5, -5), 11); public static final AreaDescriptor mobDescriptor = new AreaDescriptor.Rectangle(new BlockPos(-5, -5, -5), 11); public int craftTime = 0; public static final int REQUIRED_CRAFT_TIME = 200; - public AlchemyArrayEffectMobSacrifice(String key) - { + public AlchemyArrayEffectMobSacrifice(String key) { super(key); } @Override - public boolean update(TileEntity tile, int ticksActive) - { + public boolean update(TileEntity tile, int ticksActive) { World world = tile.getWorld(); - if (world.isRemote && ticksActive < 200 && ticksActive > 40) - { + if (world.isRemote && ticksActive < 200 && ticksActive > 40) { BlockPos pos = tile.getPos(); Random rand = world.rand; - for (int i = 0; i < 2; i++) - { + for (int i = 0; i < 2; i++) { double d0 = (double) pos.getX() + 0.5D + (rand.nextDouble() - 0.5D) * 2.5D; double d1 = (double) pos.getY() + 0.2D + (rand.nextDouble() - 0.5D) * 0.2D; double d2 = (double) pos.getZ() + 0.5D + (rand.nextDouble() - 0.5D) * 2.5D; @@ -61,26 +56,22 @@ public class AlchemyArrayEffectMobSacrifice extends AlchemyArrayEffect //We need to do the check on both sides to correctly do particles. - if (ticksActive >= 200) - { + if (ticksActive >= 200) { BlockPos pos = tile.getPos(); List itemList = world.getEntitiesWithinAABB(EntityItem.class, itemDescriptor.getAABB(pos)); List inputList = new ArrayList(); - for (EntityItem entityItem : itemList) - { - if (entityItem.isDead || entityItem.getItem().isEmpty()) - { + for (EntityItem entityItem : itemList) { + if (entityItem.isDead || entityItem.getItem().isEmpty()) { continue; } inputList.add(entityItem.getItem().copy()); } - if (inputList.isEmpty()) - { + if (inputList.isEmpty()) { return false; } @@ -90,52 +81,42 @@ public class AlchemyArrayEffectMobSacrifice extends AlchemyArrayEffect } RecipeSacrificeCraft recipe = BloodMagicAPI.INSTANCE.getRecipeRegistrar().getSacrificeCraft(inputList); - if (recipe != null) - { + if (recipe != null) { double healthRequired = recipe.getHealthRequired(); double healthAvailable = 0; List livingEntities = world.getEntitiesWithinAABB(EntityLivingBase.class, mobDescriptor.getAABB(pos)); - for (EntityLivingBase living : livingEntities) - { + for (EntityLivingBase living : livingEntities) { double health = getEffectiveHealth(living); - if (health > 0) - { + if (health > 0) { healthAvailable += health; } } - if (healthAvailable < healthRequired) - { + if (healthAvailable < healthRequired) { craftTime = 0; return false; } craftTime++; - if (craftTime >= REQUIRED_CRAFT_TIME) - { - if (!world.isRemote) - { - for (EntityLivingBase living : livingEntities) - { + if (craftTime >= REQUIRED_CRAFT_TIME) { + if (!world.isRemote) { + for (EntityLivingBase living : livingEntities) { double health = getEffectiveHealth(living); - if (healthAvailable > 0 && health > 0) - { + if (healthAvailable > 0 && health > 0) { healthAvailable -= health; living.getEntityWorld().playSound(null, living.posX, living.posY, living.posZ, SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.BLOCKS, 0.5F, 2.6F + (living.getEntityWorld().rand.nextFloat() - living.getEntityWorld().rand.nextFloat()) * 0.8F); living.setHealth(-1); living.onDeath(DamageSourceBloodMagic.INSTANCE); } - if (healthAvailable <= 0) - { + if (healthAvailable <= 0) { break; } } - for (EntityItem itemEntity : itemList) - { + for (EntityItem itemEntity : itemList) { itemEntity.getItem().setCount(itemEntity.getItem().getCount() - 1); if (itemEntity.getItem().isEmpty()) //TODO: Check container { @@ -146,13 +127,10 @@ public class AlchemyArrayEffectMobSacrifice extends AlchemyArrayEffect world.spawnEntity(new EntityItem(world, pos.getX() + 0.5, pos.getY() + 2.5, pos.getZ() + 0.5, recipe.getOutput())); craftTime = 0; } - } else - { - if (world.isRemote) - { + } else { + if (world.isRemote) { Vec3d spawnPosition = new Vec3d(pos.getX() + 0.5, pos.getY() + 2.5, pos.getZ() + 0.5); - for (EntityItem itemEntity : itemList) - { + for (EntityItem itemEntity : itemList) { ItemStack stack = itemEntity.getItem(); double velocityFactor = 0.1; @@ -168,11 +146,9 @@ public class AlchemyArrayEffectMobSacrifice extends AlchemyArrayEffect // world.spawnParticle(EnumParticleTypes.ITEM_CRACK, spawnPosition.x, spawnPosition.y, spawnPosition.z, velVec2.x, velVec2.y, velVec2.z, Item.getIdFromItem(stack.getItem()), stack.getMetadata()); } - for (EntityLivingBase living : livingEntities) - { + for (EntityLivingBase living : livingEntities) { double health = getEffectiveHealth(living); - if (health <= 0) - { + if (health <= 0) { continue; } double d0 = (double) living.posX + (world.rand.nextDouble() - 0.5D) * 0.5D; @@ -189,8 +165,7 @@ public class AlchemyArrayEffectMobSacrifice extends AlchemyArrayEffect } //Future-proofing in case I want to make different mobs give different effective health - public double getEffectiveHealth(EntityLivingBase living) - { + public double getEffectiveHealth(EntityLivingBase living) { if (living == null) return 0; @@ -214,20 +189,17 @@ public class AlchemyArrayEffectMobSacrifice extends AlchemyArrayEffect } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { } @Override - public AlchemyArrayEffect getNewCopy() - { + public AlchemyArrayEffect getNewCopy() { return new AlchemyArrayEffectMobSacrifice(key); } } diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSpike.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSpike.java index a0bbf514..57d7f774 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSpike.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSpike.java @@ -10,43 +10,35 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import WayofTime.bloodmagic.iface.IAlchemyArray; -public class AlchemyArrayEffectSpike extends AlchemyArrayEffect -{ - public AlchemyArrayEffectSpike(String key) - { +public class AlchemyArrayEffectSpike extends AlchemyArrayEffect { + public AlchemyArrayEffectSpike(String key) { super(key); } @Override - public boolean update(TileEntity tile, int ticksActive) - { + public boolean update(TileEntity tile, int ticksActive) { return false; } @Override - public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, IBlockState state, Entity entity) - { - if (entity instanceof EntityLivingBase) - { + public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, IBlockState state, Entity entity) { + if (entity instanceof EntityLivingBase) { entity.attackEntityFrom(DamageSource.CACTUS, 2); } } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { } @Override - public AlchemyArrayEffect getNewCopy() - { + public AlchemyArrayEffect getNewCopy() { return new AlchemyArrayEffectSpike(key); } } \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectTeleport.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectTeleport.java index 9437e86b..82b16d12 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectTeleport.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectTeleport.java @@ -17,58 +17,47 @@ import net.minecraft.world.WorldServer; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.iface.IAlchemyArray; -public class AlchemyArrayEffectTeleport extends AlchemyArrayEffect -{ +public class AlchemyArrayEffectTeleport extends AlchemyArrayEffect { public static final int MAX_SEARCH = 20; public static final int TELEPORT_DELAY = 40; - public AlchemyArrayEffectTeleport(String key) - { + public AlchemyArrayEffectTeleport(String key) { super(key); } @Override - public boolean update(TileEntity tile, int ticksActive) - { + public boolean update(TileEntity tile, int ticksActive) { return false; } @Override - public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, IBlockState state, Entity entity) - { + public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, IBlockState state, Entity entity) { EnumFacing direction = array.getRotation(); teleportEntityInDirection(world, pos, entity, direction); } - public void teleportEntityInDirection(World world, BlockPos currentPos, Entity entity, EnumFacing direction) - { - if (entity != null && entity.timeUntilPortal <= 0) - { - for (int i = 1; i <= MAX_SEARCH; i++) - { + public void teleportEntityInDirection(World world, BlockPos currentPos, Entity entity, EnumFacing direction) { + if (entity != null && entity.timeUntilPortal <= 0) { + for (int i = 1; i <= MAX_SEARCH; i++) { BlockPos offsetPos = currentPos.offset(direction, i); Block testBlock = world.getBlockState(offsetPos).getBlock(); - if (testBlock == RegistrarBloodMagicBlocks.ALCHEMY_ARRAY) - { + if (testBlock == RegistrarBloodMagicBlocks.ALCHEMY_ARRAY) { int x = offsetPos.getX(); int y = offsetPos.getY(); int z = offsetPos.getZ(); entity.getEntityWorld().playSound(x, y, z, SoundEvents.ENTITY_ENDERMEN_TELEPORT, SoundCategory.AMBIENT, 1.0F, 1.0F, false); entity.timeUntilPortal = TELEPORT_DELAY; - if (!world.isRemote) - { - if (entity instanceof EntityPlayer) - { + if (!world.isRemote) { + if (entity instanceof EntityPlayer) { EntityPlayerMP player = (EntityPlayerMP) entity; player.setPositionAndUpdate(x + 0.5, y + 0.5, z + 0.5); player.getEntityWorld().updateEntityWithOptionalForce(player, false); player.connection.sendPacket(new SPacketUpdateHealth(player.getHealth(), player.getFoodStats().getFoodLevel(), player.getFoodStats().getSaturationLevel())); - } else - { + } else { WorldServer worldServer = (WorldServer) entity.getEntityWorld(); entity.setPosition(x + 0.5, y + 0.5, z + 0.5); @@ -82,20 +71,17 @@ public class AlchemyArrayEffectTeleport extends AlchemyArrayEffect } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { } @Override - public AlchemyArrayEffect getNewCopy() - { + public AlchemyArrayEffect getNewCopy() { return new AlchemyArrayEffectTeleport(key); } } diff --git a/src/main/java/WayofTime/bloodmagic/altar/AltarTier.java b/src/main/java/WayofTime/bloodmagic/altar/AltarTier.java index 906c61e3..a347fa15 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/AltarTier.java +++ b/src/main/java/WayofTime/bloodmagic/altar/AltarTier.java @@ -127,7 +127,7 @@ public enum AltarTier { } }; - public static final int MAXTIERS = ConfigHandler.general.enableTierSixEvenThoughThereIsNoContent ? values().length : values().length-1; + public static final int MAXTIERS = ConfigHandler.general.enableTierSixEvenThoughThereIsNoContent ? values().length : values().length - 1; private List altarComponents; diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index f92049e7..e35cdcdf 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -3,17 +3,20 @@ package WayofTime.bloodmagic.altar; import WayofTime.bloodmagic.api.event.BloodMagicCraftedEvent; import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import WayofTime.bloodmagic.api.impl.recipe.RecipeBloodAltar; +import WayofTime.bloodmagic.block.BlockAltar; +import WayofTime.bloodmagic.block.BlockLifeEssence; import WayofTime.bloodmagic.block.enums.BloodRuneType; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.core.data.SoulTicket; import WayofTime.bloodmagic.iface.IBindable; -import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.orb.BloodOrb; import WayofTime.bloodmagic.orb.IBloodOrb; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.block.BlockLifeEssence; import WayofTime.bloodmagic.tile.TileAltar; +import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.util.helper.NetworkHelper; import com.google.common.base.Enums; +import net.minecraft.block.BlockRedstoneLight; import net.minecraft.block.state.IBlockState; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -31,8 +34,7 @@ import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidTankProperties; import net.minecraftforge.items.ItemHandlerHelper; -public class BloodAltar implements IFluidHandler -{ +public class BloodAltar implements IFluidHandler { public boolean isActive; protected FluidStack fluidOutput = new FluidStack(BlockLifeEssence.getLifeEssence(), 0); @@ -69,15 +71,12 @@ public class BloodAltar implements IFluidHandler private RecipeBloodAltar recipe; private AltarTier currentTierDisplayed = AltarTier.ONE; - public BloodAltar(TileAltar tileAltar) - { + public BloodAltar(TileAltar tileAltar) { this.tileAltar = tileAltar; } - public void readFromNBT(NBTTagCompound tagCompound) - { - if (!tagCompound.hasKey(Constants.NBT.EMPTY)) - { + public void readFromNBT(NBTTagCompound tagCompound) { + if (!tagCompound.hasKey(Constants.NBT.EMPTY)) { FluidStack fluid = FluidStack.loadFluidStackFromNBT(tagCompound); if (fluid != null) @@ -120,8 +119,7 @@ public class BloodAltar implements IFluidHandler currentTierDisplayed = Enums.getIfPresent(AltarTier.class, tagCompound.getString(Constants.NBT.ALTAR_CURRENT_TIER_DISPLAYED)).or(AltarTier.ONE); } - public void writeToNBT(NBTTagCompound tagCompound) - { + public void writeToNBT(NBTTagCompound tagCompound) { if (fluid != null) fluid.writeToNBT(tagCompound); @@ -164,8 +162,7 @@ public class BloodAltar implements IFluidHandler tagCompound.setString(Constants.NBT.ALTAR_CURRENT_TIER_DISPLAYED, currentTierDisplayed.name()); } - public void startCycle() - { + public void startCycle() { if (tileAltar.getWorld() != null) tileAltar.getWorld().notifyBlockUpdate(tileAltar.getPos(), tileAltar.getWorld().getBlockState(tileAltar.getPos()), tileAltar.getWorld().getBlockState(tileAltar.getPos()), 3); @@ -179,14 +176,11 @@ public class BloodAltar implements IFluidHandler ItemStack input = tileAltar.getStackInSlot(0); - if (!input.isEmpty()) - { + if (!input.isEmpty()) { // Do recipes RecipeBloodAltar recipe = BloodMagicAPI.INSTANCE.getRecipeRegistrar().getBloodAltar(input); - if (recipe != null) - { - if (recipe.getMinimumTier().ordinal() <= altarTier.ordinal()) - { + if (recipe != null) { + if (recipe.getMinimumTier().ordinal() <= altarTier.ordinal()) { this.isActive = true; this.recipe = recipe; this.liquidRequired = recipe.getSyphon(); @@ -195,8 +189,7 @@ public class BloodAltar implements IFluidHandler this.canBeFilled = false; return; } - } else if (input.getItem() instanceof IBloodOrb) - { + } else if (input.getItem() instanceof IBloodOrb) { BloodOrb orb = ((IBloodOrb) input.getItem()).getOrb(input); this.isActive = canBeFilled = orb != null && altarTier.toInt() >= orb.getTier(); return; @@ -206,8 +199,7 @@ public class BloodAltar implements IFluidHandler isActive = false; } - public void update() - { + public void update() { World world = tileAltar.getWorld(); BlockPos pos = tileAltar.getPos(); @@ -220,17 +212,14 @@ public class BloodAltar implements IFluidHandler if (lockdownDuration > 0) lockdownDuration--; - if (internalCounter % 20 == 0) - { - for (EnumFacing facing : EnumFacing.VALUES) - { + if (internalCounter % 20 == 0) { + for (EnumFacing facing : EnumFacing.VALUES) { BlockPos newPos = pos.offset(facing); IBlockState block = world.getBlockState(newPos); block.getBlock().onNeighborChange(world, newPos, pos); } } - if (internalCounter % (Math.max(20 - this.accelerationUpgrades, 1)) == 0) - { + if (internalCounter % (Math.max(20 - this.accelerationUpgrades, 1)) == 0) { int syphonMax = (int) (20 * this.dislocationMultiplier); int fluidInputted; int fluidOutputted; @@ -245,8 +234,7 @@ public class BloodAltar implements IFluidHandler tileAltar.getWorld().notifyBlockUpdate(tileAltar.getPos(), tileAltar.getWorld().getBlockState(tileAltar.getPos()), tileAltar.getWorld().getBlockState(tileAltar.getPos()), 3); } - if (internalCounter % this.getChargingFrequency() == 0 && !this.isActive) - { + if (internalCounter % this.getChargingFrequency() == 0 && !this.isActive) { int chargeInputted = Math.min(chargingRate, this.fluid.amount); chargeInputted = Math.min(chargeInputted, maxCharge - totalCharge); totalCharge += chargeInputted; @@ -254,23 +242,27 @@ public class BloodAltar implements IFluidHandler tileAltar.getWorld().notifyBlockUpdate(tileAltar.getPos(), tileAltar.getWorld().getBlockState(tileAltar.getPos()), tileAltar.getWorld().getBlockState(tileAltar.getPos()), 3); } - if (internalCounter % 100 == 0 && (this.isActive || this.cooldownAfterCrafting <= 0)) + if (internalCounter % 100 == 0 && (this.isActive || this.cooldownAfterCrafting <= 0)) { + /* Redstone Lamp below altar: Switch Off */ + IBlockState state = world.getBlockState(pos); + if (state.getValue(BlockAltar.POWERED)) { + world.setBlockState(pos, state.cycleProperty(BlockAltar.POWERED), 3); + world.notifyNeighborsOfStateChange(pos, RegistrarBloodMagicBlocks.ALTAR, false); + } startCycle(); + } updateAltar(); } - private void updateAltar() - { - if (!isActive) - { + private void updateAltar() { + if (!isActive) { if (cooldownAfterCrafting > 0) cooldownAfterCrafting--; return; } - if (!canBeFilled && recipe == null) - { + if (!canBeFilled && recipe == null) { startCycle(); return; } @@ -286,13 +278,11 @@ public class BloodAltar implements IFluidHandler if (world.isRemote) return; - if (!canBeFilled) - { + if (!canBeFilled) { boolean hasOperated = false; int stackSize = input.getCount(); - if (totalCharge > 0) - { + if (totalCharge > 0) { int chargeDrained = Math.min(liquidRequired * stackSize - progress, totalCharge); totalCharge -= chargeDrained; @@ -300,9 +290,8 @@ public class BloodAltar implements IFluidHandler hasOperated = true; } - if (fluid != null && fluid.amount >= 1) - { - int liquidDrained = Math.min((int) (altarTier.ordinal() >= 2 ? consumptionRate * (1 + consumptionMultiplier) : consumptionRate), fluid.amount); + if (fluid != null && fluid.amount >= 1) { + int liquidDrained = Math.min((int) (consumptionRate * (1 + consumptionMultiplier)), fluid.amount); if (liquidDrained > (liquidRequired * stackSize - progress)) liquidDrained = liquidRequired * stackSize - progress; @@ -312,27 +301,22 @@ public class BloodAltar implements IFluidHandler hasOperated = true; - if (internalCounter % 4 == 0 && world instanceof WorldServer) - { + if (internalCounter % 4 == 0 && world instanceof WorldServer) { WorldServer server = (WorldServer) world; server.spawnParticle(EnumParticleTypes.REDSTONE, pos.getX() + 0.5, pos.getY() + 1, pos.getZ() + 0.5, 1, 0.2, 0, 0.2, 0); } - } else if (!hasOperated && progress > 0) - { - progress -= (int) (efficiencyMultiplier * drainRate); + } else if (!hasOperated && progress > 0) { + progress = Math.max(0, progress - (int) (efficiencyMultiplier * drainRate)); - if (internalCounter % 2 == 0 && world instanceof WorldServer) - { + if (internalCounter % 2 == 0 && world instanceof WorldServer) { WorldServer server = (WorldServer) world; server.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, pos.getX() + 0.5, pos.getY() + 1, pos.getZ() + 0.5, 1, 0.1, 0, 0.1, 0); } } - if (hasOperated) - { - if (progress >= liquidRequired * stackSize) - { + if (hasOperated) { + if (progress >= liquidRequired * stackSize) { ItemStack result = ItemHandlerHelper.copyStackWithSize(recipe.getOutput(), stackSize); BloodMagicCraftedEvent.Altar event = new BloodMagicCraftedEvent.Altar(result, input.copy()); @@ -340,18 +324,23 @@ public class BloodAltar implements IFluidHandler tileAltar.setInventorySlotContents(0, event.getOutput()); progress = 0; - if (world instanceof WorldServer) - { + if (world instanceof WorldServer) { WorldServer server = (WorldServer) world; server.spawnParticle(EnumParticleTypes.REDSTONE, pos.getX() + 0.5, pos.getY() + 1, pos.getZ() + 0.5, 40, 0.3, 0, 0.3, 0); } + /* Redstone Lamp below altar: Switch On */ + /* Switches on when crafting finishes */ + if (world.getBlockState(pos.down()).getBlock() instanceof BlockRedstoneLight) { + world.setBlockState(pos, world.getBlockState(pos).cycleProperty(BlockAltar.POWERED), 3); + world.notifyNeighborsOfStateChange(pos, RegistrarBloodMagicBlocks.ALTAR, false); + } + this.cooldownAfterCrafting = 30; this.isActive = false; } } - } else - { + } else { ItemStack contained = tileAltar.getStackInSlot(0); if (contained.isEmpty() || !(contained.getItem() instanceof IBloodOrb) || !(contained.getItem() instanceof IBindable)) @@ -363,14 +352,12 @@ public class BloodAltar implements IFluidHandler if (binding == null || orb == null) return; - if (fluid != null && fluid.amount >= 1) - { - int liquidDrained = Math.min((int) (altarTier.ordinal() >= 2 ? orb.getFillRate() * (1 + consumptionMultiplier) : orb.getFillRate()), fluid.amount); + if (fluid != null && fluid.amount >= 1) { + int liquidDrained = Math.min((int) (orb.getFillRate() * (1 + consumptionMultiplier)), fluid.amount); int drain = NetworkHelper.getSoulNetwork(binding).add(SoulTicket.block(world, pos, liquidDrained), (int) (orb.getCapacity() * this.orbCapacityMultiplier)); fluid.amount = fluid.amount - drain; - if (drain > 0 && internalCounter % 4 == 0 && world instanceof WorldServer) - { + if (drain > 0 && internalCounter % 4 == 0 && world instanceof WorldServer) { WorldServer server = (WorldServer) world; server.spawnParticle(EnumParticleTypes.SPELL_WITCH, pos.getX() + 0.5, pos.getY() + 1, pos.getZ() + 0.5, 1, 0, 0, 0, 0.001); } @@ -380,8 +367,7 @@ public class BloodAltar implements IFluidHandler tileAltar.getWorld().notifyBlockUpdate(tileAltar.getPos(), tileAltar.getWorld().getBlockState(tileAltar.getPos()), tileAltar.getWorld().getBlockState(tileAltar.getPos()), 3); } - public void checkTier() - { + public void checkTier() { AltarTier tier = AltarUtil.getTier(tileAltar.getWorld(), tileAltar.getPos()); this.altarTier = tier; @@ -390,8 +376,7 @@ public class BloodAltar implements IFluidHandler if (tier.equals(currentTierDisplayed)) currentTierDisplayed = AltarTier.ONE; - if (tier.equals(AltarTier.ONE)) - { + if (tier.equals(AltarTier.ONE)) { upgrade = null; isUpgraded = false; this.consumptionMultiplier = 0; @@ -407,8 +392,7 @@ public class BloodAltar implements IFluidHandler this.maxCharge = 0; this.totalCharge = 0; return; - } else if (!tier.equals(AltarTier.ONE)) - { + } else if (!tier.equals(AltarTier.ONE)) { this.isUpgraded = true; this.accelerationUpgrades = upgrade.getLevel(BloodRuneType.ACCELERATION); this.consumptionMultiplier = (float) (0.20 * upgrade.getLevel(BloodRuneType.SPEED)); @@ -438,128 +422,103 @@ public class BloodAltar implements IFluidHandler tileAltar.getWorld().notifyBlockUpdate(tileAltar.getPos(), tileAltar.getWorld().getBlockState(tileAltar.getPos()), tileAltar.getWorld().getBlockState(tileAltar.getPos()), 3); } - public int fillMainTank(int amount) - { + public int fillMainTank(int amount) { int filledAmount = Math.min(capacity - fluid.amount, amount); fluid.amount += filledAmount; return filledAmount; } - public void sacrificialDaggerCall(int amount, boolean isSacrifice) - { - if (this.lockdownDuration > 0) - { + public void sacrificialDaggerCall(int amount, boolean isSacrifice) { + if (this.lockdownDuration > 0) { int amt = (int) Math.min(bufferCapacity - fluidInput.amount, (isSacrifice ? 1 + sacrificeEfficiencyMultiplier : 1 + selfSacrificeEfficiencyMultiplier) * amount); fluidInput.amount += amt; - } else - { + } else { fluid.amount += Math.min(capacity - fluid.amount, (isSacrifice ? 1 + sacrificeEfficiencyMultiplier : 1 + selfSacrificeEfficiencyMultiplier) * amount); } } - public void setMainFluid(FluidStack fluid) - { + public void setMainFluid(FluidStack fluid) { this.fluid = fluid; } - public void setOutputFluid(FluidStack fluid) - { + public void setOutputFluid(FluidStack fluid) { this.fluidOutput = fluid; } - public void setInputFluid(FluidStack fluid) - { + public void setInputFluid(FluidStack fluid) { this.fluidInput = fluid; } - public AltarUpgrade getUpgrade() - { + public AltarUpgrade getUpgrade() { return upgrade; } - public void setUpgrade(AltarUpgrade upgrade) - { + public void setUpgrade(AltarUpgrade upgrade) { this.upgrade = upgrade; } - public int getCapacity() - { + public int getCapacity() { return capacity; } - public FluidStack getFluid() - { + public FluidStack getFluid() { return fluid; } - public int getFluidAmount() - { + public int getFluidAmount() { return fluid.amount; } - public int getCurrentBlood() - { + public int getCurrentBlood() { return getFluidAmount(); } - public AltarTier getTier() - { + public AltarTier getTier() { return altarTier; } - public void setTier(AltarTier tier) - { + public void setTier(AltarTier tier) { this.altarTier = tier; } - public int getProgress() - { + public int getProgress() { return progress; } - public float getSacrificeMultiplier() - { + public float getSacrificeMultiplier() { return sacrificeEfficiencyMultiplier; } - public float getSelfSacrificeMultiplier() - { + public float getSelfSacrificeMultiplier() { return selfSacrificeEfficiencyMultiplier; } - public float getOrbMultiplier() - { + public float getOrbMultiplier() { return orbCapacityMultiplier; } - public float getDislocationMultiplier() - { + public float getDislocationMultiplier() { return dislocationMultiplier; } - public float getConsumptionMultiplier() - { + public float getConsumptionMultiplier() { return consumptionMultiplier; } - public float getConsumptionRate() - { + public float getConsumptionRate() { return consumptionRate; } - public int getLiquidRequired() - { + public int getLiquidRequired() { return liquidRequired; } - public int getBufferCapacity() - { + public int getBufferCapacity() { return bufferCapacity; } - public boolean setCurrentTierDisplayed(AltarTier altarTier) - { + public boolean setCurrentTierDisplayed(AltarTier altarTier) { if (currentTierDisplayed == altarTier) return false; else @@ -567,99 +526,79 @@ public class BloodAltar implements IFluidHandler return true; } - public void addToDemonBloodDuration(int dur) - { + public void addToDemonBloodDuration(int dur) { this.demonBloodDuration += dur; } - public boolean hasDemonBlood() - { + public boolean hasDemonBlood() { return this.demonBloodDuration > 0; } - public void decrementDemonBlood() - { + public void decrementDemonBlood() { this.demonBloodDuration = Math.max(0, this.demonBloodDuration - 1); } - public void setActive() - { - if (tileAltar.getStackInSlot(0).isEmpty()) - { + public void setActive() { + if (tileAltar.getStackInSlot(0).isEmpty()) { isActive = false; } } - public boolean isActive() - { + public boolean isActive() { return isActive; } - public void requestPauseAfterCrafting(int amount) - { - if (this.isActive) - { + public void requestPauseAfterCrafting(int amount) { + if (this.isActive) { this.cooldownAfterCrafting = amount; } } - public int getChargingRate() - { + public int getChargingRate() { return chargingRate; } - public int getTotalCharge() - { + public int getTotalCharge() { return totalCharge; } - public int getChargingFrequency() - { + public int getChargingFrequency() { return chargingFrequency == 0 ? 1 : chargingFrequency; } @Override - public int fill(FluidStack resource, boolean doFill) - { - if (resource == null || resource.getFluid() != BlockLifeEssence.getLifeEssence()) - { + public int fill(FluidStack resource, boolean doFill) { + if (resource == null || resource.getFluid() != BlockLifeEssence.getLifeEssence()) { return 0; } - if (!doFill) - { - if (fluidInput == null) - { + if (!doFill) { + if (fluidInput == null) { return Math.min(bufferCapacity, resource.amount); } - if (!fluidInput.isFluidEqual(resource)) - { + if (!fluidInput.isFluidEqual(resource)) { return 0; } return Math.min(bufferCapacity - fluidInput.amount, resource.amount); } - if (fluidInput == null) - { + if (fluidInput == null) { fluidInput = new FluidStack(resource, Math.min(bufferCapacity, resource.amount)); return fluidInput.amount; } - if (!fluidInput.isFluidEqual(resource)) - { + if (!fluidInput.isFluidEqual(resource)) { return 0; } int filled = bufferCapacity - fluidInput.amount; - if (resource.amount < filled) - { + if (resource.amount < filled) { fluidInput.amount += resource.amount; filled = resource.amount; - } else - { + } else { fluidInput.amount = bufferCapacity; } @@ -667,45 +606,37 @@ public class BloodAltar implements IFluidHandler } @Override - public FluidStack drain(FluidStack resource, boolean doDrain) - { - if (resource == null || !resource.isFluidEqual(fluidOutput)) - { + public FluidStack drain(FluidStack resource, boolean doDrain) { + if (resource == null || !resource.isFluidEqual(fluidOutput)) { return null; } return drain(resource.amount, doDrain); } @Override - public FluidStack drain(int maxDrain, boolean doDrain) - { - if (fluidOutput == null) - { + public FluidStack drain(int maxDrain, boolean doDrain) { + if (fluidOutput == null) { return null; } int drained = maxDrain; - if (fluidOutput.amount < drained) - { + if (fluidOutput.amount < drained) { drained = fluidOutput.amount; } FluidStack stack = new FluidStack(fluidOutput, drained); - if (doDrain) - { + if (doDrain) { fluidOutput.amount -= drained; } return stack; } @Override - public IFluidTankProperties[] getTankProperties() - { - return new IFluidTankProperties[] { new FluidTankPropertiesWrapper(new FluidTank(fluid, capacity)) }; + public IFluidTankProperties[] getTankProperties() { + return new IFluidTankProperties[]{new FluidTankPropertiesWrapper(new FluidTank(fluid, capacity))}; } - public AltarTier getCurrentTierDisplayed() - { + public AltarTier getCurrentTierDisplayed() { return currentTierDisplayed; } } diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java index 1725d095..c59bbbe6 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java @@ -23,12 +23,10 @@ import net.minecraftforge.fml.common.registry.EntityEntry; import net.minecraftforge.fml.common.registry.ForgeRegistries; @BloodMagicPlugin -public class BloodMagicCorePlugin implements IBloodMagicPlugin -{ +public class BloodMagicCorePlugin implements IBloodMagicPlugin { @Override - public void register(IBloodMagicAPI apiInterface) - { + public void register(IBloodMagicAPI apiInterface) { BloodMagicAPI api = (BloodMagicAPI) apiInterface; // Add forced blacklistings api.getBlacklist().addTeleposer(RegistrarBloodMagicBlocks.INPUT_ROUTING_NODE); @@ -84,8 +82,7 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin } @Override - public void registerRecipes(IBloodMagicRecipeRegistrar recipeRegistrar) - { + public void registerRecipes(IBloodMagicRecipeRegistrar recipeRegistrar) { RegistrarBloodMagicRecipes.registerAltarRecipes((BloodMagicRecipeRegistrar) recipeRegistrar); RegistrarBloodMagicRecipes.registerAlchemyTableRecipes((BloodMagicRecipeRegistrar) recipeRegistrar); RegistrarBloodMagicRecipes.registerTartaricForgeRecipes((BloodMagicRecipeRegistrar) recipeRegistrar); @@ -93,10 +90,8 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin RegistrarBloodMagicRecipes.registerSacrificeCraftRecipes((BloodMagicRecipeRegistrar) recipeRegistrar); } - private static void handleConfigValues(BloodMagicAPI api) - { - for (String value : ConfigHandler.values.sacrificialValues) - { + private static void handleConfigValues(BloodMagicAPI api) { + for (String value : ConfigHandler.values.sacrificialValues) { String[] split = value.split(";"); if (split.length != 2) // Not valid format continue; @@ -104,18 +99,15 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin api.getValueManager().setSacrificialValue(new ResourceLocation(split[0]), Integer.parseInt(split[1])); } - for (String value : ConfigHandler.blacklist.teleposer) - { + for (String value : ConfigHandler.blacklist.teleposer) { EntityEntry entityEntry = ForgeRegistries.ENTITIES.getValue(new ResourceLocation(value)); - if (entityEntry == null) - { // It's not an entity (or at least not a valid one), so let's try a block. + if (entityEntry == null) { // It's not an entity (or at least not a valid one), so let's try a block. String[] blockData = value.split("\\["); Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(blockData[0])); if (block == Blocks.AIR || block == null) // Not a valid block either continue; - if (blockData.length > 1) - { // We have properties listed, so let's build a state. + if (blockData.length > 1) { // We have properties listed, so let's build a state. api.getBlacklist().addTeleposer(StateUtil.parseState(value)); continue; } @@ -127,15 +119,13 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin api.getBlacklist().addTeleposer(entityEntry.getRegistryName()); } - for (String value : ConfigHandler.blacklist.transposer) - { + for (String value : ConfigHandler.blacklist.transposer) { String[] blockData = value.split("\\["); Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(blockData[0])); if (block == Blocks.AIR || block == null) // Not a valid block continue; - if (blockData.length > 1) - { // We have properties listed, so let's build a state. + if (blockData.length > 1) { // We have properties listed, so let's build a state. api.getBlacklist().addTeleposer(StateUtil.parseState(value)); continue; } @@ -143,8 +133,7 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin api.getBlacklist().addTeleposer(block); } - for (String value : ConfigHandler.blacklist.wellOfSuffering) - { + for (String value : ConfigHandler.blacklist.wellOfSuffering) { EntityEntry entityEntry = ForgeRegistries.ENTITIES.getValue(new ResourceLocation(value)); if (entityEntry == null) // Not a valid entity continue; diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java index 776d762d..215f3981 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java @@ -27,8 +27,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; import com.google.common.collect.Sets; -public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar -{ +public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar { private final Set altarRecipes; private final Set alchemyRecipes; @@ -36,8 +35,7 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar private final Set alchemyArrayRecipes; private final Set sacrificeCraftRecipes; - public BloodMagicRecipeRegistrar() - { + public BloodMagicRecipeRegistrar() { this.altarRecipes = Sets.newHashSet(); this.alchemyRecipes = Sets.newHashSet(); this.tartaricForgeRecipes = Sets.newHashSet(); @@ -46,8 +44,7 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar } @Override - public void addBloodAltar(@Nonnull Ingredient input, @Nonnull ItemStack output, @Nonnegative int minimumTier, @Nonnegative int syphon, @Nonnegative int consumeRate, @Nonnegative int drainRate) - { + public void addBloodAltar(@Nonnull Ingredient input, @Nonnull ItemStack output, @Nonnegative int minimumTier, @Nonnegative int syphon, @Nonnegative int consumeRate, @Nonnegative int drainRate) { Preconditions.checkNotNull(input, "input cannot be null."); Preconditions.checkNotNull(output, "output cannot be null."); Preconditions.checkArgument(minimumTier >= 0, "minimumTier cannot be negative."); @@ -59,16 +56,14 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar } @Override - public boolean removeBloodAltar(@Nonnull ItemStack input) - { + public boolean removeBloodAltar(@Nonnull ItemStack input) { Preconditions.checkNotNull(input, "input cannot be null."); return altarRecipes.remove(getBloodAltar(input)); } @Override - public void addAlchemyTable(@Nonnull ItemStack output, @Nonnegative int syphon, @Nonnegative int ticks, @Nonnegative int minimumTier, @Nonnull Ingredient... input) - { + public void addAlchemyTable(@Nonnull ItemStack output, @Nonnegative int syphon, @Nonnegative int ticks, @Nonnegative int minimumTier, @Nonnull Ingredient... input) { Preconditions.checkNotNull(output, "output cannot be null."); Preconditions.checkArgument(syphon >= 0, "syphon cannot be negative."); Preconditions.checkArgument(ticks >= 0, "ticks cannot be negative."); @@ -79,8 +74,7 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar alchemyRecipes.add(new RecipeAlchemyTable(inputs, output, syphon, ticks, minimumTier)); } - public void addAlchemyTable(@Nonnull ItemStack output, @Nonnegative int syphon, @Nonnegative int ticks, @Nonnegative int minimumTier, @Nonnull Object... input) - { + public void addAlchemyTable(@Nonnull ItemStack output, @Nonnegative int syphon, @Nonnegative int ticks, @Nonnegative int minimumTier, @Nonnull Object... input) { Preconditions.checkNotNull(output, "output cannot be null."); Preconditions.checkArgument(syphon >= 0, "syphon cannot be negative."); Preconditions.checkArgument(ticks >= 0, "ticks cannot be negative."); @@ -88,10 +82,8 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar Preconditions.checkNotNull(input, "input cannot be null."); List ingredients = Lists.newArrayList(); - for (Object object : input) - { - if (object instanceof ItemStack && ((ItemStack) object).getItem() instanceof IBloodOrb) - { + for (Object object : input) { + if (object instanceof ItemStack && ((ItemStack) object).getItem() instanceof IBloodOrb) { ingredients.add(new IngredientBloodOrb(((IBloodOrb) ((ItemStack) object).getItem()).getOrb((ItemStack) object))); continue; } @@ -102,14 +94,12 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar addAlchemyTable(output, syphon, ticks, minimumTier, ingredients.toArray(new Ingredient[0])); } - public void addAlchemyTable(RecipeAlchemyTable recipe) - { + public void addAlchemyTable(RecipeAlchemyTable recipe) { alchemyRecipes.add(recipe); } @Override - public boolean removeAlchemyTable(@Nonnull ItemStack... input) - { + public boolean removeAlchemyTable(@Nonnull ItemStack... input) { Preconditions.checkNotNull(input, "inputs cannot be null."); for (ItemStack stack : input) @@ -119,8 +109,7 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar } @Override - public void addTartaricForge(@Nonnull ItemStack output, @Nonnegative double minimumSouls, @Nonnegative double soulDrain, @Nonnull Ingredient... input) - { + public void addTartaricForge(@Nonnull ItemStack output, @Nonnegative double minimumSouls, @Nonnegative double soulDrain, @Nonnull Ingredient... input) { Preconditions.checkNotNull(output, "output cannot be null."); Preconditions.checkArgument(minimumSouls >= 0, "minimumSouls cannot be negative."); Preconditions.checkArgument(soulDrain >= 0, "soulDrain cannot be negative."); @@ -131,8 +120,7 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar } @Override - public boolean removeTartaricForge(@Nonnull ItemStack... input) - { + public boolean removeTartaricForge(@Nonnull ItemStack... input) { Preconditions.checkNotNull(input, "inputs cannot be null."); for (ItemStack stack : input) @@ -141,18 +129,15 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar return tartaricForgeRecipes.remove(getTartaricForge(Lists.newArrayList(input))); } - public void addTartaricForge(@Nonnull ItemStack output, @Nonnegative double minimumSouls, @Nonnegative double soulDrain, @Nonnull Object... input) - { + public void addTartaricForge(@Nonnull ItemStack output, @Nonnegative double minimumSouls, @Nonnegative double soulDrain, @Nonnull Object... input) { Preconditions.checkNotNull(output, "output cannot be null."); Preconditions.checkArgument(minimumSouls >= 0, "minimumSouls cannot be negative."); Preconditions.checkArgument(soulDrain >= 0, "soulDrain cannot be negative."); Preconditions.checkNotNull(input, "input cannot be null."); List ingredients = Lists.newArrayList(); - for (Object object : input) - { - if (object instanceof ItemStack && ((ItemStack) object).getItem() instanceof IBloodOrb) - { + for (Object object : input) { + if (object instanceof ItemStack && ((ItemStack) object).getItem() instanceof IBloodOrb) { ingredients.add(new IngredientBloodOrb(((IBloodOrb) ((ItemStack) object).getItem()).getOrb((ItemStack) object))); continue; } @@ -164,8 +149,7 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar } @Override - public void addAlchemyArray(@Nonnull Ingredient input, @Nonnull Ingredient catalyst, @Nonnull ItemStack output, @Nullable ResourceLocation circleTexture) - { + public void addAlchemyArray(@Nonnull Ingredient input, @Nonnull Ingredient catalyst, @Nonnull ItemStack output, @Nullable ResourceLocation circleTexture) { Preconditions.checkNotNull(input, "input cannot be null."); Preconditions.checkNotNull(catalyst, "catalyst cannot be null."); Preconditions.checkNotNull(output, "output cannot be null."); @@ -174,16 +158,14 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar } @Override - public boolean removeAlchemyArray(@Nonnull ItemStack input, @Nonnull ItemStack catalyst) - { + public boolean removeAlchemyArray(@Nonnull ItemStack input, @Nonnull ItemStack catalyst) { Preconditions.checkNotNull(input, "input cannot be null."); Preconditions.checkNotNull(catalyst, "catalyst cannot be null."); return alchemyArrayRecipes.remove(getAlchemyArray(input, catalyst)); } - public void addAlchemyArray(@Nonnull ItemStack input, @Nonnull ItemStack catalyst, @Nonnull ItemStack output, @Nullable ResourceLocation circleTexture) - { + public void addAlchemyArray(@Nonnull ItemStack input, @Nonnull ItemStack catalyst, @Nonnull ItemStack output, @Nullable ResourceLocation circleTexture) { Preconditions.checkNotNull(input, "input cannot be null."); Preconditions.checkNotNull(catalyst, "catalyst cannot be null."); Preconditions.checkNotNull(output, "output cannot be null."); @@ -191,17 +173,14 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar addAlchemyArray(Ingredient.fromStacks(input), Ingredient.fromStacks(catalyst), output, circleTexture); } - public void addSacrificeCraft(@Nonnull ItemStack output, @Nonnegative double healthRequired, @Nonnull Object... input) - { + public void addSacrificeCraft(@Nonnull ItemStack output, @Nonnegative double healthRequired, @Nonnull Object... input) { Preconditions.checkNotNull(output, "output cannot be null."); Preconditions.checkArgument(healthRequired >= 0, "healthRequired cannot be negative."); Preconditions.checkNotNull(input, "input cannot be null."); List ingredients = Lists.newArrayList(); - for (Object object : input) - { - if (object instanceof ItemStack && ((ItemStack) object).getItem() instanceof IBloodOrb) - { + for (Object object : input) { + if (object instanceof ItemStack && ((ItemStack) object).getItem() instanceof IBloodOrb) { ingredients.add(new IngredientBloodOrb(((IBloodOrb) ((ItemStack) object).getItem()).getOrb((ItemStack) object))); continue; } @@ -213,8 +192,7 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar } @Override - public boolean removeSacrificeCraft(@Nonnull ItemStack... input) - { + public boolean removeSacrificeCraft(@Nonnull ItemStack... input) { Preconditions.checkNotNull(input, "inputs cannot be null."); for (ItemStack stack : input) @@ -224,8 +202,7 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar } @Override - public void addSacrificeCraft(@Nonnull ItemStack output, @Nonnegative double healthRequired, @Nonnull Ingredient... input) - { + public void addSacrificeCraft(@Nonnull ItemStack output, @Nonnegative double healthRequired, @Nonnull Ingredient... input) { Preconditions.checkNotNull(output, "output cannot be null."); Preconditions.checkArgument(healthRequired >= 0, "healthRequired cannot be negative."); Preconditions.checkNotNull(input, "input cannot be null."); @@ -235,8 +212,7 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar } @Nullable - public RecipeBloodAltar getBloodAltar(@Nonnull ItemStack input) - { + public RecipeBloodAltar getBloodAltar(@Nonnull ItemStack input) { Preconditions.checkNotNull(input, "input cannot be null."); if (input.isEmpty()) return null; @@ -249,27 +225,23 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar } @Nullable - public RecipeAlchemyTable getAlchemyTable(@Nonnull List input) - { + public RecipeAlchemyTable getAlchemyTable(@Nonnull List input) { Preconditions.checkNotNull(input, "input cannot be null."); if (input.isEmpty()) return null; - mainLoop: for (RecipeAlchemyTable recipe : alchemyRecipes) - { + mainLoop: + for (RecipeAlchemyTable recipe : alchemyRecipes) { if (recipe.getInput().size() != input.size()) continue; List recipeInput = new ArrayList<>(recipe.getInput()); - for (int i = 0; i < input.size(); i++) - { + for (int i = 0; i < input.size(); i++) { boolean matched = false; - for (int j = 0; j < recipeInput.size(); j++) - { + for (int j = 0; j < recipeInput.size(); j++) { Ingredient ingredient = recipeInput.get(j); - if (ingredient.apply(input.get(i))) - { + if (ingredient.apply(input.get(i))) { matched = true; recipeInput.remove(j); break; @@ -287,27 +259,23 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar } @Nullable - public RecipeTartaricForge getTartaricForge(@Nonnull List input) - { + public RecipeTartaricForge getTartaricForge(@Nonnull List input) { Preconditions.checkNotNull(input, "input cannot be null."); if (input.isEmpty()) return null; - mainLoop: for (RecipeTartaricForge recipe : tartaricForgeRecipes) - { + mainLoop: + for (RecipeTartaricForge recipe : tartaricForgeRecipes) { if (recipe.getInput().size() != input.size()) continue; List recipeInput = new ArrayList<>(recipe.getInput()); - for (int i = 0; i < input.size(); i++) - { + for (int i = 0; i < input.size(); i++) { boolean matched = false; - for (int j = 0; j < recipeInput.size(); j++) - { + for (int j = 0; j < recipeInput.size(); j++) { Ingredient ingredient = recipeInput.get(j); - if (ingredient.apply(input.get(i))) - { + if (ingredient.apply(input.get(i))) { matched = true; recipeInput.remove(j); break; @@ -325,27 +293,23 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar } @Nullable - public RecipeSacrificeCraft getSacrificeCraft(@Nonnull List input) - { + public RecipeSacrificeCraft getSacrificeCraft(@Nonnull List input) { Preconditions.checkNotNull(input, "input cannot be null."); if (input.isEmpty()) return null; - mainLoop: for (RecipeSacrificeCraft recipe : sacrificeCraftRecipes) - { + mainLoop: + for (RecipeSacrificeCraft recipe : sacrificeCraftRecipes) { if (recipe.getInput().size() != input.size()) continue; List recipeInput = new ArrayList<>(recipe.getInput()); - for (int i = 0; i < input.size(); i++) - { + for (int i = 0; i < input.size(); i++) { boolean matched = false; - for (int j = 0; j < recipeInput.size(); j++) - { + for (int j = 0; j < recipeInput.size(); j++) { Ingredient ingredient = recipeInput.get(j); - if (ingredient.apply(input.get(i))) - { + if (ingredient.apply(input.get(i))) { matched = true; recipeInput.remove(j); break; @@ -363,8 +327,7 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar } @Nullable - public RecipeAlchemyArray getAlchemyArray(@Nonnull ItemStack input, @Nonnull ItemStack catalyst) - { + public RecipeAlchemyArray getAlchemyArray(@Nonnull ItemStack input, @Nonnull ItemStack catalyst) { Preconditions.checkNotNull(input, "input cannot be null."); if (input.isEmpty()) return null; @@ -376,23 +339,19 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar return null; } - public Set getAltarRecipes() - { + public Set getAltarRecipes() { return ImmutableSet.copyOf(altarRecipes); } - public Set getAlchemyRecipes() - { + public Set getAlchemyRecipes() { return ImmutableSet.copyOf(alchemyRecipes); } - public Set getTartaricForgeRecipes() - { + public Set getTartaricForgeRecipes() { return ImmutableSet.copyOf(tartaricForgeRecipes); } - public Set getAlchemyArrayRecipes() - { + public Set getAlchemyArrayRecipes() { return ImmutableSet.copyOf(alchemyArrayRecipes); } } diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeSacrificeCraft.java b/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeSacrificeCraft.java index 95bf3354..f2e000f6 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeSacrificeCraft.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeSacrificeCraft.java @@ -8,8 +8,7 @@ import net.minecraft.util.NonNullList; import javax.annotation.Nonnegative; import javax.annotation.Nonnull; -public class RecipeSacrificeCraft -{ +public class RecipeSacrificeCraft { @Nonnull private final NonNullList input; @Nonnull @@ -17,8 +16,7 @@ public class RecipeSacrificeCraft @Nonnegative private final double healthRequired; - public RecipeSacrificeCraft(@Nonnull NonNullList input, @Nonnull ItemStack output, @Nonnegative double healthRequired) - { + public RecipeSacrificeCraft(@Nonnull NonNullList input, @Nonnull ItemStack output, @Nonnegative double healthRequired) { Preconditions.checkNotNull(input, "input cannot be null."); Preconditions.checkNotNull(output, "output cannot be null."); Preconditions.checkArgument(healthRequired >= 0, "healthRequired cannot be negative."); @@ -29,20 +27,17 @@ public class RecipeSacrificeCraft } @Nonnull - public final NonNullList getInput() - { + public final NonNullList getInput() { return input; } @Nonnull - public final ItemStack getOutput() - { + public final ItemStack getOutput() { return output; } @Nonnegative - public final double getHealthRequired() - { + public final double getHealthRequired() { return healthRequired; } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java index 73923dcb..712adb94 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java @@ -18,7 +18,10 @@ import WayofTime.bloodmagic.util.Utils; import WayofTime.bloodmagic.util.helper.NetworkHelper; import net.minecraft.block.Block; import net.minecraft.block.material.Material; +import net.minecraft.block.properties.PropertyBool; +import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; @@ -39,10 +42,13 @@ import java.util.ArrayList; import java.util.List; public class BlockAltar extends Block implements IVariantProvider, IDocumentedBlock, IBMBlock { + public static final PropertyBool POWERED = PropertyBool.create("powered"); private static final AxisAlignedBB BODY = new AxisAlignedBB(0, 0, 0, 16 / 16F, 12 / 16F, 16 / 16F); public BlockAltar() { super(Material.ROCK); + this.setDefaultState(this.blockState.getBaseState().withProperty(POWERED, false)); + setTranslationKey(BloodMagic.MODID + ".altar"); setCreativeTab(BloodMagic.TAB_BM); @@ -180,4 +186,39 @@ public class BlockAltar extends Block implements IVariantProvider, IDocumentedBl public ItemBlock getItem() { return new ItemBlock(this); } + + /* Redstone code, taken from BlockLever */ + + public int getWeakPower(IBlockState blockState, IBlockAccess blockAccess, BlockPos pos, EnumFacing side) { + return blockState.getValue(POWERED) ? 15 : 0; + } + + public int getStrongPower(IBlockState blockState, IBlockAccess blockAccess, BlockPos pos, EnumFacing side) { + if (!blockState.getValue(POWERED)) { + return 0; + } else { + return 15; + } + } + + public boolean canProvidePower(IBlockState state) { + return true; + } + + public IBlockState getStateFromMeta(int meta) { + return this.getDefaultState().withProperty(POWERED, meta > 0); + } + + public int getMetaFromState(IBlockState state) { + return state.getValue(POWERED) ? 1 : 0; + } + + protected BlockStateContainer createBlockState() { + return new BlockStateContainer(this, POWERED); + } + + public IBlockState getStateForPlacement(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer) { + + return this.getDefaultState().withProperty(POWERED, false); + } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java b/src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java index 065f340e..12a14983 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java @@ -24,7 +24,7 @@ public class BlockDecorative extends BlockEnum { @Override public void getSubBlocks(CreativeTabs tab, NonNullList subBlocks) { - for (EnumDecorative type : EnumDecorative.values()){ + for (EnumDecorative type : EnumDecorative.values()) { if (!ConfigHandler.general.enableTierSixEvenThoughThereIsNoContent && (type == EnumDecorative.CRYSTAL_TILE || type == EnumDecorative.CRYSTAL_BRICK)) continue; subBlocks.add(new ItemStack(this, 1, type.ordinal())); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java b/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java index 38b9ac62..6675b63e 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java @@ -219,7 +219,7 @@ public class BlockMimic extends BlockEnum implements IAltarComponent } return null; } - + @Override public ItemBlock getItem() { return new ItemBlockMimic(this); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockPath.java b/src/main/java/WayofTime/bloodmagic/block/BlockPath.java index 779c1389..fc60a3b5 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockPath.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockPath.java @@ -9,10 +9,12 @@ import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.entity.Entity; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import javax.annotation.Nullable; import java.util.List; public class BlockPath extends BlockEnum implements IIncensePath { @@ -26,14 +28,14 @@ public class BlockPath extends BlockEnum implements IIncensePath { setResistance(5.0F); setSoundType(SoundType.STONE); - setHarvestLevel("axe", 0, getStateFromMeta(0)); - setHarvestLevel("axe", 0, getStateFromMeta(1)); - setHarvestLevel("pickaxe", 0, getStateFromMeta(2)); - setHarvestLevel("pickaxe", 0, getStateFromMeta(3)); - setHarvestLevel("pickaxe", 0, getStateFromMeta(4)); - setHarvestLevel("pickaxe", 0, getStateFromMeta(5)); - setHarvestLevel("pickaxe", 3, getStateFromMeta(6)); - setHarvestLevel("pickaxe", 3, getStateFromMeta(7)); + setHarvestLevel("axe", 0, getDefaultState().withProperty(getProperty(), EnumPath.WOOD)); + setHarvestLevel("axe", 0, getDefaultState().withProperty(getProperty(), EnumPath.WOODTILE)); + setHarvestLevel("pickaxe", 0, getDefaultState().withProperty(getProperty(), EnumPath.STONE)); + setHarvestLevel("pickaxe", 0, getDefaultState().withProperty(getProperty(), EnumPath.STONETILE)); + setHarvestLevel("pickaxe", 0, getDefaultState().withProperty(getProperty(), EnumPath.WORNSTONE)); + setHarvestLevel("pickaxe", 0, getDefaultState().withProperty(getProperty(), EnumPath.WORNSTONETILE)); + setHarvestLevel("pickaxe", 3, getDefaultState().withProperty(getProperty(), EnumPath.OBSIDIAN)); + setHarvestLevel("pickaxe", 3, getDefaultState().withProperty(getProperty(), EnumPath.OBSIDIANTILE)); } @Override @@ -42,6 +44,24 @@ public class BlockPath extends BlockEnum implements IIncensePath { super.addInformation(stack, world, tooltip, tooltipFlag); } + @Override + public Material getMaterial(IBlockState state) { + EnumPath path = state.getValue(getProperty()); + if (path.equals(EnumPath.WOOD) || path.equals(EnumPath.WOODTILE)) + return Material.WOOD; + else + return Material.ROCK; + } + + @Override + public SoundType getSoundType(IBlockState state, World world, BlockPos pos, @Nullable Entity entity) { + EnumPath path = state.getValue(getProperty()); + if (path.equals(EnumPath.WOOD) || path.equals(EnumPath.WOODTILE)) + return SoundType.WOOD; + else + return super.getSoundType(); + } + @Override public int getLevelOfPath(World world, BlockPos pos, IBlockState state) { switch (this.getMetaFromState(state)) { diff --git a/src/main/java/WayofTime/bloodmagic/block/enums/EnumRitualController.java b/src/main/java/WayofTime/bloodmagic/block/enums/EnumRitualController.java index 531ab6a2..bfc67190 100644 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/block/enums/EnumRitualController.java @@ -7,7 +7,8 @@ import java.util.Locale; public enum EnumRitualController implements IStringSerializable { MASTER, IMPERFECT, - INVERTED,; + INVERTED, + ; @Override public String toString() { diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/ElementRegistry.java b/src/main/java/WayofTime/bloodmagic/client/hud/ElementRegistry.java index d83cb03c..9c62ee31 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/ElementRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/ElementRegistry.java @@ -98,7 +98,8 @@ public class ElementRegistry { return; try (FileReader reader = new FileReader(CONFIG)) { - Map toLoad = GSON.fromJson(reader, new TypeToken>() {}.getType()); + Map toLoad = GSON.fromJson(reader, new TypeToken>() { + }.getType()); for (Map.Entry entry : toLoad.entrySet()) { ElementInfo info = ELEMENT_INFO.get(new ResourceLocation(entry.getKey())); if (info != null) diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/GuiEditHUD.java b/src/main/java/WayofTime/bloodmagic/client/hud/GuiEditHUD.java index a25a5b6c..94531576 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/GuiEditHUD.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/GuiEditHUD.java @@ -34,7 +34,9 @@ public class GuiEditHUD extends GuiScreen { public void initGui() { super.initGui(); - addButton(new GuiButtonExt(0, width / 2 - 155, height - 30, 70, 20, I18n.format("gui.bloodmagic.toggle")){{enabled = false;}}); + addButton(new GuiButtonExt(0, width / 2 - 155, height - 30, 70, 20, I18n.format("gui.bloodmagic.toggle")) {{ + enabled = false; + }}); addButton(new GuiButtonExt(1, width / 2 - 75, height - 30, 70, 20, I18n.format("gui.bloodmagic.default"))); addButton(new GuiButtonExt(2, width / 2 + 5, height - 30, 70, 20, I18n.format("gui.bloodmagic.save"))); addButton(new GuiButtonExt(3, width / 2 + 90, height - 30, 70, 20, I18n.format("gui.bloodmagic.cancel"))); diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDivinedInformation.java b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDivinedInformation.java index c072b646..0d9beb6c 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDivinedInformation.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDivinedInformation.java @@ -55,7 +55,7 @@ public abstract class ElementDivinedInformation extends El if (sigilStack.getItem() instanceof ItemSigilHolding) { List internalInv = ItemSigilHolding.getInternalInventory(sigilStack); int currentSlot = ItemSigilHolding.getCurrentItemOrdinal(sigilStack); - if(internalInv != null && !internalInv.get(currentSlot).isEmpty()) { + if (internalInv != null && !internalInv.get(currentSlot).isEmpty()) { return (internalInv.get(currentSlot).getItem() == RegistrarBloodMagicItems.SIGIL_SEER && !simple) || (internalInv.get(currentSlot).getItem() == RegistrarBloodMagicItems.SIGIL_DIVINATION && simple); } } diff --git a/src/main/java/WayofTime/bloodmagic/client/key/KeyBindings.java b/src/main/java/WayofTime/bloodmagic/client/key/KeyBindings.java index a9d8a8af..6fa069bd 100644 --- a/src/main/java/WayofTime/bloodmagic/client/key/KeyBindings.java +++ b/src/main/java/WayofTime/bloodmagic/client/key/KeyBindings.java @@ -46,7 +46,8 @@ public enum KeyBindings { if (player.getHeldItemMainhand().getItem() instanceof ItemSigilHolding) ClientHandler.cycleSigil(player.getHeldItemMainhand(), player, 1); } - },; + }, + ; // @formatter:on private final IKeyConflictContext keyConflictContext; diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/LowAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/LowAlchemyCircleRenderer.java index bce8f30f..687ecdc8 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/LowAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/LowAlchemyCircleRenderer.java @@ -2,21 +2,17 @@ package WayofTime.bloodmagic.client.render.alchemyArray; import net.minecraft.util.ResourceLocation; -public class LowAlchemyCircleRenderer extends SingleAlchemyCircleRenderer -{ - public LowAlchemyCircleRenderer() - { +public class LowAlchemyCircleRenderer extends SingleAlchemyCircleRenderer { + public LowAlchemyCircleRenderer() { this(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SkeletonTurret1.png")); } - public LowAlchemyCircleRenderer(ResourceLocation arrayResource) - { + public LowAlchemyCircleRenderer(ResourceLocation arrayResource) { super(arrayResource); } @Override - public float getVerticalOffset(float craftTime) - { + public float getVerticalOffset(float craftTime) { return 0; } } diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/LowStaticAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/LowStaticAlchemyCircleRenderer.java index 0256ec93..8b57713b 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/LowStaticAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/LowStaticAlchemyCircleRenderer.java @@ -2,25 +2,20 @@ package WayofTime.bloodmagic.client.render.alchemyArray; import net.minecraft.util.ResourceLocation; -public class LowStaticAlchemyCircleRenderer extends LowAlchemyCircleRenderer -{ - public LowStaticAlchemyCircleRenderer() - { +public class LowStaticAlchemyCircleRenderer extends LowAlchemyCircleRenderer { + public LowStaticAlchemyCircleRenderer() { this(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SkeletonTurret1.png")); } - public LowStaticAlchemyCircleRenderer(ResourceLocation arrayResource) - { + public LowStaticAlchemyCircleRenderer(ResourceLocation arrayResource) { super(arrayResource); } @Override - public float getRotation(float craftTime) - { + public float getRotation(float craftTime) { float offset = 2; float duration = 180; - if (craftTime >= offset && craftTime < offset + duration) - { + if (craftTime >= offset && craftTime < offset + duration) { float modifier = (craftTime - offset) * 2f; return modifier * 1f; } diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/MobSacrificeAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/MobSacrificeAlchemyCircleRenderer.java index 2f5bdfc7..76a98ab3 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/MobSacrificeAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/MobSacrificeAlchemyCircleRenderer.java @@ -13,41 +13,33 @@ import net.minecraft.world.World; import WayofTime.bloodmagic.alchemyArray.AlchemyCircleRenderer; import WayofTime.bloodmagic.tile.TileAlchemyArray; -public class MobSacrificeAlchemyCircleRenderer extends AlchemyCircleRenderer -{ +public class MobSacrificeAlchemyCircleRenderer extends AlchemyCircleRenderer { private ResourceLocation bottomArrayResource = new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/MovementArray.png"); private ResourceLocation mobSacrificeSwirlResource = new ResourceLocation("bloodmagic", "textures/models/mobsacrificeswirl.png"); - public MobSacrificeAlchemyCircleRenderer(ResourceLocation location) - { + public MobSacrificeAlchemyCircleRenderer(ResourceLocation location) { super(location); } - public MobSacrificeAlchemyCircleRenderer() - { + public MobSacrificeAlchemyCircleRenderer() { this(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/mobsacrifice.png")); } @Override - public float getSizeModifier(float craftTime) - { - if (craftTime < 40) - { + public float getSizeModifier(float craftTime) { + if (craftTime < 40) { return 0; - } else if (craftTime > 40 && craftTime < 100) - { + } else if (craftTime > 40 && craftTime < 100) { return (craftTime - 40) / 60f; } return 1; } @Override - public float getRotation(float craftTime) - { + public float getRotation(float craftTime) { float offset = 50; - if (craftTime >= offset) - { + if (craftTime >= offset) { float modifier = (craftTime - offset) * 5f; return modifier * 1f; } @@ -55,16 +47,13 @@ public class MobSacrificeAlchemyCircleRenderer extends AlchemyCircleRenderer } @Override - public float getSecondaryRotation(float craftTime) - { + public float getSecondaryRotation(float craftTime) { return 0; } @Override - public void renderAt(TileEntity tile, double x, double y, double z, float craftTime) - { - if (!(tile instanceof TileAlchemyArray)) - { + public void renderAt(TileEntity tile, double x, double y, double z, float craftTime) { + if (!(tile instanceof TileAlchemyArray)) { return; } @@ -94,30 +83,29 @@ public class MobSacrificeAlchemyCircleRenderer extends AlchemyCircleRenderer GlStateManager.translate(sideHit.getXOffset() * offsetFromFace, sideHit.getYOffset() * offsetFromFace, sideHit.getZOffset() * offsetFromFace); - switch (sideHit) - { - case DOWN: - GlStateManager.translate(0, 0, 1); - GlStateManager.rotate(-90.0f, 1, 0, 0); - break; - case EAST: - GlStateManager.rotate(-90.0f, 0, 1, 0); - GlStateManager.translate(0, 0, -1); - break; - case NORTH: - break; - case SOUTH: - GlStateManager.rotate(180.0f, 0, 1, 0); - GlStateManager.translate(-1, 0, -1); - break; - case UP: - GlStateManager.translate(0, 1, 0); - GlStateManager.rotate(90.0f, 1, 0, 0); - break; - case WEST: - GlStateManager.translate(0, 0, 1); - GlStateManager.rotate(90.0f, 0, 1, 0); - break; + switch (sideHit) { + case DOWN: + GlStateManager.translate(0, 0, 1); + GlStateManager.rotate(-90.0f, 1, 0, 0); + break; + case EAST: + GlStateManager.rotate(-90.0f, 0, 1, 0); + GlStateManager.translate(0, 0, -1); + break; + case NORTH: + break; + case SOUTH: + GlStateManager.rotate(180.0f, 0, 1, 0); + GlStateManager.translate(-1, 0, -1); + break; + case UP: + GlStateManager.translate(0, 1, 0); + GlStateManager.rotate(90.0f, 1, 0, 0); + break; + case WEST: + GlStateManager.translate(0, 0, 1); + GlStateManager.rotate(90.0f, 0, 1, 0); + break; } GlStateManager.pushMatrix(); @@ -136,8 +124,7 @@ public class MobSacrificeAlchemyCircleRenderer extends AlchemyCircleRenderer // GlStateManager.rotate((float) (yaw + 360 * getStartupPitchYawRatio(craftTime)), 0, 0, 1); // GlStateManager.rotate((float) ((pitch + 90) * getStartupPitchYawRatio(craftTime)), 1, 0, 0); - for (int i = 1; i <= 3; i++) - { + for (int i = 1; i <= 3; i++) { GlStateManager.pushMatrix(); Minecraft.getMinecraft().renderEngine.bindTexture(bottomArrayResource); translateAndRotateFloatingArray(tessellator, wr, size, rot, craftTime, i); @@ -153,11 +140,9 @@ public class MobSacrificeAlchemyCircleRenderer extends AlchemyCircleRenderer //Render the swirlz float swirlSize = 3; - if (craftTime <= 40) - { + if (craftTime <= 40) { swirlSize = 0; - } else if (craftTime <= 100) - { + } else if (craftTime <= 100) { swirlSize = 3 * (craftTime - 40) / 60; } GlStateManager.pushMatrix(); @@ -180,66 +165,58 @@ public class MobSacrificeAlchemyCircleRenderer extends AlchemyCircleRenderer GlStateManager.popMatrix(); } - public float getStartupPitchYawRatio(float craftTime) - { - if (craftTime <= 80) - { + public float getStartupPitchYawRatio(float craftTime) { + if (craftTime <= 80) { return 0; - } else if (craftTime > 80 && craftTime < 140) - { + } else if (craftTime > 80 && craftTime < 140) { return (craftTime - 80) / 60f; } return 1; } - private void translateAndRotateFloatingArray(Tessellator tessellator, BufferBuilder builder, double size, float rotation, float craftTime, int circle) - { + private void translateAndRotateFloatingArray(Tessellator tessellator, BufferBuilder builder, double size, float rotation, float craftTime, int circle) { double verticalOffset = 2; float primaryRotation = 0; float secondaryRotation = 0; - if (craftTime >= 40) - { + if (craftTime >= 40) { primaryRotation = (craftTime - 40) * 4f; secondaryRotation = (craftTime - 40) * 2f; } float translationOffset = 1; - if (craftTime < 80) - { + if (craftTime < 80) { translationOffset = 0; - } else if (craftTime < 140) - { + } else if (craftTime < 140) { translationOffset = (craftTime - 80) / 60; } - switch (circle) - { - case 1: - GlStateManager.translate(0, 0, -verticalOffset); - GlStateManager.rotate(rotation / 200, 1, 0, 0); - GlStateManager.rotate(rotation / 10, 0, 0, 1); - GlStateManager.translate(1.7 * translationOffset, 0, 0); - break; - case 2: - GlStateManager.translate(0, 0, -verticalOffset); + switch (circle) { + case 1: + GlStateManager.translate(0, 0, -verticalOffset); + GlStateManager.rotate(rotation / 200, 1, 0, 0); + GlStateManager.rotate(rotation / 10, 0, 0, 1); + GlStateManager.translate(1.7 * translationOffset, 0, 0); + break; + case 2: + GlStateManager.translate(0, 0, -verticalOffset); // GlStateManager.rotate(254, 0, 0, 1); - GlStateManager.rotate((float) (rotation / 150 + 120), 1, 0, 0); - GlStateManager.rotate(120, 0, 1, 0); - GlStateManager.rotate(-rotation / 10, 0, 0, 1); - GlStateManager.translate(1.2 * translationOffset, 0, 0); - break; - case 3: - GlStateManager.translate(0, 0, -verticalOffset); + GlStateManager.rotate((float) (rotation / 150 + 120), 1, 0, 0); + GlStateManager.rotate(120, 0, 1, 0); + GlStateManager.rotate(-rotation / 10, 0, 0, 1); + GlStateManager.translate(1.2 * translationOffset, 0, 0); + break; + case 3: + GlStateManager.translate(0, 0, -verticalOffset); // GlStateManager.rotate(130, 0, 0, 1); - GlStateManager.rotate((float) (rotation / 100 + 284), 1, 0, 0); - GlStateManager.rotate(240, 0, 1, 0); - GlStateManager.rotate(-rotation / 7 + 180, 0, 0, 1); - GlStateManager.translate(2 * translationOffset, 0, 0); - break; - default: - //What are you doing, Way??? + GlStateManager.rotate((float) (rotation / 100 + 284), 1, 0, 0); + GlStateManager.rotate(240, 0, 1, 0); + GlStateManager.rotate(-rotation / 7 + 180, 0, 0, 1); + GlStateManager.translate(2 * translationOffset, 0, 0); + break; + default: + //What are you doing, Way??? } GlStateManager.rotate(primaryRotation, 0, 1, 0); @@ -249,8 +226,7 @@ public class MobSacrificeAlchemyCircleRenderer extends AlchemyCircleRenderer renderStandardCircle(tessellator, builder, size); } - private void renderStandardCircle(Tessellator tessellator, BufferBuilder builder, double size) - { + private void renderStandardCircle(Tessellator tessellator, BufferBuilder builder, double size) { double var31 = 0.0D; double var33 = 1.0D; double var35 = 0; diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java index 35702b83..b9967d3a 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java @@ -15,33 +15,27 @@ import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectArrowTurret; import WayofTime.bloodmagic.alchemyArray.AlchemyCircleRenderer; import WayofTime.bloodmagic.tile.TileAlchemyArray; -public class TurretAlchemyCircleRenderer extends AlchemyCircleRenderer -{ +public class TurretAlchemyCircleRenderer extends AlchemyCircleRenderer { private ResourceLocation bottomArrayResource = new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/MovementArray.png"); private ResourceLocation middleArrayResource = new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SkeletonTurret2.png"); - public TurretAlchemyCircleRenderer(ResourceLocation location) - { + public TurretAlchemyCircleRenderer(ResourceLocation location) { super(location); } - public TurretAlchemyCircleRenderer() - { + public TurretAlchemyCircleRenderer() { this(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/MovementArray.png")); } @Override - public float getSizeModifier(float craftTime) - { + public float getSizeModifier(float craftTime) { return 1; } @Override - public float getRotation(float craftTime) - { + public float getRotation(float craftTime) { float offset = 50; - if (craftTime >= offset) - { + if (craftTime >= offset) { float modifier = (craftTime - offset) * 5f; return modifier * 1f; } @@ -49,16 +43,13 @@ public class TurretAlchemyCircleRenderer extends AlchemyCircleRenderer } @Override - public float getSecondaryRotation(float craftTime) - { + public float getSecondaryRotation(float craftTime) { return 0; } @Override - public void renderAt(TileEntity tile, double x, double y, double z, float craftTime) - { - if (!(tile instanceof TileAlchemyArray)) - { + public void renderAt(TileEntity tile, double x, double y, double z, float craftTime) { + if (!(tile instanceof TileAlchemyArray)) { return; } @@ -69,8 +60,7 @@ public class TurretAlchemyCircleRenderer extends AlchemyCircleRenderer double pitch = 0; double yaw = 0; int arrowTimer = -1; - if (effect instanceof AlchemyArrayEffectArrowTurret) - { + if (effect instanceof AlchemyArrayEffectArrowTurret) { AlchemyArrayEffectArrowTurret turretEffect = (AlchemyArrayEffectArrowTurret) effect; pitch = (turretEffect.getPitch() - turretEffect.getLastPitch()) * f + turretEffect.getLastPitch(); yaw = (turretEffect.getYaw() - turretEffect.getLastYaw()) * f + turretEffect.getLastYaw(); @@ -103,30 +93,29 @@ public class TurretAlchemyCircleRenderer extends AlchemyCircleRenderer GlStateManager.translate(sideHit.getXOffset() * offsetFromFace, sideHit.getYOffset() * offsetFromFace, sideHit.getZOffset() * offsetFromFace); - switch (sideHit) - { - case DOWN: - GlStateManager.translate(0, 0, 1); - GlStateManager.rotate(-90.0f, 1, 0, 0); - break; - case EAST: - GlStateManager.rotate(-90.0f, 0, 1, 0); - GlStateManager.translate(0, 0, -1); - break; - case NORTH: - break; - case SOUTH: - GlStateManager.rotate(180.0f, 0, 1, 0); - GlStateManager.translate(-1, 0, -1); - break; - case UP: - GlStateManager.translate(0, 1, 0); - GlStateManager.rotate(90.0f, 1, 0, 0); - break; - case WEST: - GlStateManager.translate(0, 0, 1); - GlStateManager.rotate(90.0f, 0, 1, 0); - break; + switch (sideHit) { + case DOWN: + GlStateManager.translate(0, 0, 1); + GlStateManager.rotate(-90.0f, 1, 0, 0); + break; + case EAST: + GlStateManager.rotate(-90.0f, 0, 1, 0); + GlStateManager.translate(0, 0, -1); + break; + case NORTH: + break; + case SOUTH: + GlStateManager.rotate(180.0f, 0, 1, 0); + GlStateManager.translate(-1, 0, -1); + break; + case UP: + GlStateManager.translate(0, 1, 0); + GlStateManager.rotate(90.0f, 1, 0, 0); + break; + case WEST: + GlStateManager.translate(0, 0, 1); + GlStateManager.rotate(90.0f, 0, 1, 0); + break; } GlStateManager.pushMatrix(); @@ -177,93 +166,71 @@ public class TurretAlchemyCircleRenderer extends AlchemyCircleRenderer GlStateManager.popMatrix(); } - public float getStartupPitchYawRatio(float craftTime) - { - if (craftTime <= 80) - { + public float getStartupPitchYawRatio(float craftTime) { + if (craftTime <= 80) { return 0; - } else if (craftTime > 80 && craftTime < 140) - { + } else if (craftTime > 80 && craftTime < 140) { return (craftTime - 80) / 60f; } return 1; } - public double getBottomHeightOffset(double craftTime, double arrowAnimation) - { - if (craftTime <= 40) - { + public double getBottomHeightOffset(double craftTime, double arrowAnimation) { + if (craftTime <= 40) { return 0; - } else if (craftTime > 40 && craftTime < 100) - { + } else if (craftTime > 40 && craftTime < 100) { return -0.4 * (craftTime - 40) / 60d; - } else if (craftTime >= 100 && craftTime < 140) - { + } else if (craftTime >= 100 && craftTime < 140) { return -0.4 * (140 - craftTime) / 40d; } - if (arrowAnimation > 0 && arrowAnimation < 45) - { + if (arrowAnimation > 0 && arrowAnimation < 45) { return -0.4 * (arrowAnimation) / 45; - } else if (arrowAnimation >= 45 && arrowAnimation < 50) - { + } else if (arrowAnimation >= 45 && arrowAnimation < 50) { return -0.4 * (50 - arrowAnimation) / 5; } return 0; } - public double getMiddleHeightOffset(double craftTime, double arrowAnimation) - { - if (craftTime <= 40) - { + public double getMiddleHeightOffset(double craftTime, double arrowAnimation) { + if (craftTime <= 40) { return 0; - } else if (craftTime > 40 && craftTime < 100) - { + } else if (craftTime > 40 && craftTime < 100) { return 0.1 * (craftTime - 40) / 60d; - } else if (craftTime >= 100 && craftTime < 140) - { + } else if (craftTime >= 100 && craftTime < 140) { return 0.1 * (140 - craftTime) / 40d; } - if (arrowAnimation > 0 && arrowAnimation < 45) - { + if (arrowAnimation > 0 && arrowAnimation < 45) { return 0.1 * (arrowAnimation) / 45; - } else if (arrowAnimation >= 45 && arrowAnimation < 50) - { + } else if (arrowAnimation >= 45 && arrowAnimation < 50) { return 0.1 * (50 - arrowAnimation) / 5; } return 0; } - public double getTopHeightOffset(double craftTime, double arrowAnimation) - { - if (craftTime <= 40) - { + public double getTopHeightOffset(double craftTime, double arrowAnimation) { + if (craftTime <= 40) { return 0; - } else if (craftTime > 40 && craftTime < 100) - { + } else if (craftTime > 40 && craftTime < 100) { return 0.4 * (craftTime - 40) / 60d; - } else if (craftTime >= 100 && craftTime < 140) - { + } else if (craftTime >= 100 && craftTime < 140) { return 0.4 * (140 - craftTime) / 40d; } - if (arrowAnimation > 0 && arrowAnimation < 45) - { + if (arrowAnimation > 0 && arrowAnimation < 45) { return 0.4 * (arrowAnimation) / 45; - } else if (arrowAnimation >= 45 && arrowAnimation < 50) - { + } else if (arrowAnimation >= 45 && arrowAnimation < 50) { return 0.4 * (50 - arrowAnimation) / 5; } return 0; } - private void renderStandardCircle(Tessellator tessellator, BufferBuilder builder, double size) - { + private void renderStandardCircle(Tessellator tessellator, BufferBuilder builder, double size) { double var31 = 0.0D; double var33 = 1.0D; double var35 = 0; diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java index 1cf0b421..ff1038c8 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java @@ -50,6 +50,11 @@ public class SubCommandNetwork extends CommandTreeBase { public SoulNetwork network; public String uuid; + @Override + public int getRequiredPermissionLevel() { + return 2; + } + public Integer commandHelperAmount(MinecraftServer server, ICommandSender sender, String[] args) { int amount; if (args.length == 0) @@ -85,11 +90,11 @@ public class SubCommandNetwork extends CommandTreeBase { @Override public final void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { + if (args.length == 1 && (args[0].equals("?") || args[0].equals("help"))) { + sender.sendMessage(new TextComponentTranslation(getHelp())); + return; + } if (!getName().equals("get")) { - if (args.length == 1 && (args[0].equals("?") || args[0].equals("help"))) { - sender.sendMessage(new TextComponentTranslation(getHelp())); - return; - } this.player = args.length < 2 ? getCommandSenderAsPlayer(sender) : getPlayer(server, sender, args[0]); this.uuid = PlayerHelper.getUUIDFromPlayer(player).toString(); this.network = NetworkHelper.getSoulNetwork(uuid); @@ -164,11 +169,9 @@ public class SubCommandNetwork extends CommandTreeBase { @Override public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { - if (args.length == 1 && (args[0].equals("?") || args[0].equals("help"))) { - sender.sendMessage(new TextComponentTranslation(getHelp())); - return; - } this.player = args.length < 1 ? getCommandSenderAsPlayer(sender) : getPlayer(server, sender, args[0]); + this.uuid = PlayerHelper.getUUIDFromPlayer(player).toString(); + this.network = NetworkHelper.getSoulNetwork(uuid); sender.sendMessage(new TextComponentString((player != sender ? player.getDisplayName().getFormattedText() + " " : "" + new TextComponentTranslation("tooltip.bloodmagic.sigil.divination.currentEssence", network.getCurrentEssence()).getFormattedText()))); } } @@ -216,7 +219,7 @@ public class SubCommandNetwork extends CommandTreeBase { @Override public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { List tickethistory = network.getTicketHistory(); - if (tickethistory.isEmpty()) + if (!tickethistory.isEmpty()) for (SoulTicket i : network.getTicketHistory()) sender.sendMessage(i.getDescription()); sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.success", player.getDisplayName().getFormattedText())); diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandRitual.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandRitual.java index db0ec96d..b64efcf9 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandRitual.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandRitual.java @@ -49,6 +49,7 @@ public class SubCommandRitual extends CommandTreeBase { class RitualCreate extends CommandTreeBase { public List ritualList = new ArrayList<>(); + public RitualCreate() { for (Ritual ritual : BloodMagic.RITUAL_MANAGER.getRituals()) { ritualList.add(BloodMagic.RITUAL_MANAGER.getId(ritual)); diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java index 307cc083..f0b66b63 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.compat.guideapi.book; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.recipe.TartaricForgeRecipe; import WayofTime.bloodmagic.compat.guideapi.BookUtils; import WayofTime.bloodmagic.compat.guideapi.entry.EntryText; import WayofTime.bloodmagic.compat.guideapi.page.PageAlchemyArray; import WayofTime.bloodmagic.compat.guideapi.page.PageTartaricForgeRecipe; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.recipe.TartaricForgeRecipe; import WayofTime.bloodmagic.util.helper.RecipeHelper; import WayofTime.bloodmagic.util.helper.TextHelper; import amerifrance.guideapi.api.IPage; @@ -63,6 +63,20 @@ public class CategoryAlchemy speedPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "speed" + ".info"), 370)); entries.put(new ResourceLocation(keyBase + "speed"), new EntryText(speedPages, TextHelper.localize(keyBase + "speed"), true)); + List buffPages = new ArrayList<>(); + + buffPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "buff" + ".info"), 370)); + entries.put(new ResourceLocation(keyBase + "buff"), new EntryText(buffPages, TextHelper.localize(keyBase + "buff"), true)); + + List fastMinerPages = new ArrayList<>(); + + PageAlchemyArray fastMinerRecipePage = BookUtils.getAlchemyPage("fastMiner"); + if (fastMinerRecipePage != null) { + fastMinerPages.add(fastMinerRecipePage); + } + fastMinerPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "fastMiner" + ".info"), 370)); + entries.put(new ResourceLocation(keyBase + "fastMiner"), new EntryText(fastMinerPages, TextHelper.localize(keyBase + "fastMiner"), true)); + List updraftPages = new ArrayList<>(); PageAlchemyArray updraftRecipePage = BookUtils.getAlchemyPage("updraft"); @@ -123,21 +137,6 @@ public class CategoryAlchemy laputaPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "laputa" + ".info"), 370)); entries.put(new ResourceLocation(keyBase + "laputa"), new EntryText(laputaPages, TextHelper.localize(keyBase + "laputa"), true)); - List buffPages = new ArrayList<>(); - - buffPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "buff" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "buff"), new EntryText(buffPages, TextHelper.localize(keyBase + "buff"), true)); - - List fastMinerPages = new ArrayList<>(); - - PageAlchemyArray fastMinerRecipePage = BookUtils.getAlchemyPage("fastMiner"); - if (fastMinerRecipePage != null) - { - fastMinerPages.add(fastMinerRecipePage); - } - fastMinerPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "fastMiner" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "fastMiner"), new EntryText(fastMinerPages, TextHelper.localize(keyBase + "fastMiner"), true)); - for (Entry entry : entries.entrySet()) { for (IPage page : entry.getValue().pageList) diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java index ac330963..005e7ced 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java @@ -1,9 +1,6 @@ package WayofTime.bloodmagic.compat.guideapi.book; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.recipe.TartaricForgeRecipe; -import WayofTime.bloodmagic.core.registry.AltarRecipeRegistry.AltarRecipe; -import WayofTime.bloodmagic.core.registry.OrbRegistry; import WayofTime.bloodmagic.compat.guideapi.BookUtils; import WayofTime.bloodmagic.compat.guideapi.entry.EntryText; import WayofTime.bloodmagic.compat.guideapi.page.PageAlchemyArray; @@ -12,7 +9,10 @@ import WayofTime.bloodmagic.compat.guideapi.page.PageTartaricForgeRecipe; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.registry.AltarRecipeRegistry.AltarRecipe; +import WayofTime.bloodmagic.core.registry.OrbRegistry; import WayofTime.bloodmagic.item.types.ComponentTypes; +import WayofTime.bloodmagic.recipe.TartaricForgeRecipe; import WayofTime.bloodmagic.util.helper.RecipeHelper; import WayofTime.bloodmagic.util.helper.TextHelper; import amerifrance.guideapi.api.IPage; @@ -60,6 +60,16 @@ public class CategoryArchitect altarPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "bloodaltar" + ".info.2"), 370)); entries.put(new ResourceLocation(keyBase + "bloodaltar"), new EntryText(altarPages, TextHelper.localize(keyBase + "bloodaltar"), true)); + List daggerPages = new ArrayList<>(); + + AltarRecipe daggerOfSacrificeRecipe = RecipeHelper.getAltarRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.DAGGER_OF_SACRIFICE)); + if (daggerOfSacrificeRecipe != null) { + daggerPages.add(new PageAltarRecipe(daggerOfSacrificeRecipe)); + } + + daggerPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "dagger" + ".info.1"), 370)); + entries.put(new ResourceLocation(keyBase + "dagger"), new EntryText(daggerPages, TextHelper.localize(keyBase + "dagger"), true)); + List ashPages = new ArrayList<>(); TartaricForgeRecipe ashRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES)); @@ -206,17 +216,6 @@ public class CategoryArchitect apprenticeorbPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "apprenticeorb" + ".info.1"), 370)); entries.put(new ResourceLocation(keyBase + "apprenticeorb"), new EntryText(apprenticeorbPages, TextHelper.localize(keyBase + "apprenticeorb"), true)); - List daggerPages = new ArrayList<>(); - - AltarRecipe daggerOfSacrificeRecipe = RecipeHelper.getAltarRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.DAGGER_OF_SACRIFICE)); - if (daggerOfSacrificeRecipe != null) - { - daggerPages.add(new PageAltarRecipe(daggerOfSacrificeRecipe)); - } - - daggerPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "dagger" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "dagger"), new EntryText(daggerPages, TextHelper.localize(keyBase + "dagger"), true)); - List runeSacrificePages = new ArrayList<>(); IRecipe runeSacrificeRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 3)); @@ -359,7 +358,7 @@ public class CategoryArchitect List capacityPages = new ArrayList<>(); - IRecipe capacityRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 4)); + IRecipe capacityRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 6)); if (capacityRecipe != null) { capacityPages.add(BookUtils.getPageForRecipe(capacityRecipe)); @@ -370,7 +369,7 @@ public class CategoryArchitect List displacementPages = new ArrayList<>(); - IRecipe displacementRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 4)); + IRecipe displacementRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 5)); if (displacementRecipe != null) { displacementPages.add(BookUtils.getPageForRecipe(displacementRecipe)); @@ -486,6 +485,41 @@ public class CategoryArchitect downgradePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "downgrade" + ".info"), 370)); entries.put(new ResourceLocation(keyBase + "downgrade"), new EntryText(downgradePages, TextHelper.localize(keyBase + "downgrade"), true)); + List boundBladePages = new ArrayList<>(); + + PageAlchemyArray boundBladePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.BOUND_SWORD)); + if (boundBladePage != null) { + boundBladePages.add(boundBladePage); + } + + boundBladePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "boundBlade" + ".info.1"), 370)); + entries.put(new ResourceLocation(keyBase + "boundBlade"), new EntryText(boundBladePages, TextHelper.localize(keyBase + "boundBlade"), true)); + + List boundToolPages = new ArrayList<>(); + + PageAlchemyArray boundToolPage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.BOUND_PICKAXE)); + if (boundToolPage != null) { + boundToolPages.add(boundToolPage); + } + + boundToolPage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.BOUND_AXE)); + if (boundToolPage != null) { + boundToolPages.add(boundToolPage); + } + + boundToolPage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.BOUND_SHOVEL)); + if (boundToolPage != null) { + boundToolPages.add(boundToolPage); + } + + boundToolPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "boundTool" + ".info.1"), 370)); + entries.put(new ResourceLocation(keyBase + "boundTool"), new EntryText(boundToolPages, TextHelper.localize(keyBase + "boundTool"), true)); + + List weakShardPages = new ArrayList<>(); + + weakShardPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "weakShard" + ".info.1"), 370)); + entries.put(new ResourceLocation(keyBase + "weakShard"), new EntryText(weakShardPages, TextHelper.localize(keyBase + "weakShard"), true)); + List teleposerPages = new ArrayList<>(); AltarRecipe teleposerFocusRecipe = RecipeHelper.getAltarRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS)); @@ -503,45 +537,6 @@ public class CategoryArchitect teleposerPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "teleposer" + ".info.1"), 370)); entries.put(new ResourceLocation(keyBase + "teleposer"), new EntryText(teleposerPages, TextHelper.localize(keyBase + "teleposer"), true)); - List boundBladePages = new ArrayList<>(); - - PageAlchemyArray boundBladePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.BOUND_SWORD)); - if (boundBladePage != null) - { - boundBladePages.add(boundBladePage); - } - - boundBladePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "boundBlade" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "boundBlade"), new EntryText(boundBladePages, TextHelper.localize(keyBase + "boundBlade"), true)); - - List boundToolPages = new ArrayList<>(); - - PageAlchemyArray boundToolPage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.BOUND_PICKAXE)); - if (boundToolPage != null) - { - boundToolPages.add(boundToolPage); - } - - boundToolPage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.BOUND_AXE)); - if (boundToolPage != null) - { - boundToolPages.add(boundToolPage); - } - - boundToolPage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.BOUND_SHOVEL)); - if (boundToolPage != null) - { - boundToolPages.add(boundToolPage); - } - - boundToolPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "boundTool" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "boundTool"), new EntryText(boundToolPages, TextHelper.localize(keyBase + "boundTool"), true)); - - List weakShardPages = new ArrayList<>(); - - weakShardPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "weakShard" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "weakShard"), new EntryText(weakShardPages, TextHelper.localize(keyBase + "weakShard"), true)); - List masterOrbPages = new ArrayList<>(); AltarRecipe masterOrbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MASTER)); diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java index d94d2717..35a2adb3 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java @@ -131,6 +131,8 @@ public class CategoryRitual addRitualPagesToEntries("condor", entries); addRitualPagesToEntries("featheredEarth", entries); addRitualPagesToEntries("grounding", entries); + addRitualPagesToEntries("veilOfEvil", entries); + addRitualPagesToEntries("wardOfSacrosanctity", entries); for (Entry entry : entries.entrySet()) { diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java index dce7a1c2..2384c305 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java @@ -34,9 +34,15 @@ import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.util.helper.ItemHelper.LivingUpgrades; import mezz.jei.api.*; import mezz.jei.api.recipe.IRecipeCategoryRegistration; +import mezz.jei.api.recipe.IRecipeWrapper; +import mezz.jei.api.recipe.IVanillaRecipeFactory; +import mezz.jei.api.recipe.VanillaRecipeCategoryUid; import net.minecraft.item.ItemStack; import javax.annotation.Nonnull; +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; import java.util.Map; @JEIPlugin @@ -58,6 +64,8 @@ public class BloodMagicJEIPlugin implements IModPlugin { registry.addRecipes(BloodMagicAPI.INSTANCE.getRecipeRegistrar().getAlchemyRecipes(), Constants.Compat.JEI_CATEGORY_ALCHEMYTABLE); registry.addRecipes(AlchemyTableRecipeRegistry.getRecipeList(), Constants.Compat.JEI_CATEGORY_ALCHEMYTABLE); + registry.addRecipes(getAnvilRecipes(), VanillaRecipeCategoryUid.ANVIL); + registry.handleRecipes(RecipeBloodAltar.class, AltarRecipeJEI::new, Constants.Compat.JEI_CATEGORY_ALTAR); registry.handleRecipes(RecipeTartaricForge.class, TartaricForgeRecipeJEI::new, Constants.Compat.JEI_CATEGORY_SOULFORGE); registry.handleRecipes(RecipeAlchemyArray.class, AlchemyArrayCraftingRecipeJEI::new, Constants.Compat.JEI_CATEGORY_ALCHEMYARRAY); @@ -127,4 +135,98 @@ public class BloodMagicJEIPlugin implements IModPlugin { new ArmourDowngradeRecipeCategory() ); } + + public Collection getAnvilRecipes() { + IVanillaRecipeFactory vanillaRecipeFactory = jeiHelper.getVanillaRecipeFactory(); + + + /* Sentient Tool repair recipes */ + + List outputSwords = new LinkedList<>(); + List outputPickaxes = new LinkedList<>(); + List outputAxes = new LinkedList<>(); + List outputBows = new LinkedList<>(); + List outputShovels = new LinkedList<>(); + + List inputRightSentient = new LinkedList<>(); + + List> sentientOutputs = new LinkedList<>(); + + List sentientTools = new LinkedList<>(); + sentientTools.add(new ItemStack(RegistrarBloodMagicItems.SENTIENT_AXE)); + sentientTools.add(new ItemStack(RegistrarBloodMagicItems.SENTIENT_PICKAXE)); + sentientTools.add(new ItemStack(RegistrarBloodMagicItems.SENTIENT_BOW)); + sentientTools.add(new ItemStack(RegistrarBloodMagicItems.SENTIENT_SHOVEL)); + sentientTools.add(new ItemStack(RegistrarBloodMagicItems.SENTIENT_SWORD)); + + for (int i = 4; i > 0; i--) { + for (ItemStack j : sentientTools) { + int maxDmg = j.getMaxDamage(); + j.setItemDamage(maxDmg - (maxDmg / 4) * i); + } + outputAxes.add(sentientTools.get(0).copy()); + outputPickaxes.add(sentientTools.get(1).copy()); + outputBows.add(sentientTools.get(2).copy()); + outputShovels.add(sentientTools.get(3).copy()); + outputSwords.add(sentientTools.get(4).copy()); + + inputRightSentient.add(new ItemStack(RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL, i)); + } + sentientOutputs.add(outputAxes); + sentientOutputs.add(outputPickaxes); + sentientOutputs.add(outputBows); + sentientOutputs.add(outputShovels); + sentientOutputs.add(outputSwords); + + + Collection collection = new LinkedList<>(); + + for (int i = 0; i < 5; i++) { + ItemStack inputLeft = sentientTools.get(i); + inputLeft.setItemDamage(inputLeft.getMaxDamage()); + collection.add(vanillaRecipeFactory.createAnvilRecipe(inputLeft, inputRightSentient, sentientOutputs.get(i))); + } + + /* Living Armor repair recipes */ + + List outputHelmets = new LinkedList<>(); + List outputChestplates = new LinkedList<>(); + List outputLeggings = new LinkedList<>(); + List outputBoots = new LinkedList<>(); + + List inputRightLiving = new LinkedList<>(); + + List> livingOutputs = new LinkedList<>(); + + List livingTools = new LinkedList<>(); + livingTools.add(new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_HELMET)); + livingTools.add(new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST)); + livingTools.add(new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_LEGGINGS)); + livingTools.add(new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_BOOTS)); + + for (int i = 4; i > 0; i--) { + for (ItemStack j : livingTools) { + int maxDmg = j.getMaxDamage(); + j.setItemDamage(maxDmg - (maxDmg / 4) * i); + } + outputHelmets.add(livingTools.get(0).copy()); + outputChestplates.add(livingTools.get(1).copy()); + outputLeggings.add(livingTools.get(2).copy()); + outputBoots.add(livingTools.get(3).copy()); + + inputRightLiving.add(new ItemStack(RegistrarBloodMagicItems.COMPONENT, i, 8)); + } + livingOutputs.add(outputHelmets); + livingOutputs.add(outputChestplates); + livingOutputs.add(outputLeggings); + livingOutputs.add(outputBoots); + + for (int i = 0; i < 4; i++) { + ItemStack inputLeft = livingTools.get(i); + inputLeft.setItemDamage(inputLeft.getMaxDamage()); + collection.add(vanillaRecipeFactory.createAnvilRecipe(inputLeft, inputRightLiving, livingOutputs.get(i))); + } + + return collection; + } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java index bc8ade1c..abfe0957 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java @@ -13,6 +13,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import javax.annotation.Nonnull; @@ -25,7 +26,7 @@ public class DataProviderAlchemyArray implements IWailaDataProvider { @Nonnull @Override public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) { - return new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES).setStackDisplayName(TextHelper.getFormattedText(RegistrarBloodMagicBlocks.ALCHEMY_ARRAY.getLocalizedName())); + return new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES).setStackDisplayName(TextFormatting.WHITE + RegistrarBloodMagicBlocks.ALCHEMY_ARRAY.getLocalizedName()); } @Nonnull diff --git a/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java b/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java index b5d78913..e2dc02d1 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java @@ -1,86 +1,12 @@ package WayofTime.bloodmagic.compress; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Container; -import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.CraftingManager; -import net.minecraft.item.crafting.IRecipe; +import net.minecraft.util.Tuple; import net.minecraft.world.World; public class AdvancedCompressionHandler extends CompressionHandler { - private static InventoryCrafting[] inventoryCrafting = { - new InventoryCrafting(new Container() { - public boolean canInteractWith(EntityPlayer player) { - return false; - } - }, - 3, 3), - new InventoryCrafting(new Container() { - public boolean canInteractWith(EntityPlayer player) { - return false; - } - }, - 2, 2), - new InventoryCrafting(new Container() { - public boolean canInteractWith(EntityPlayer player) { - return false; - } - }, - 1, 1) - - }; - - private static ItemStack reversibleCheck; - - public static boolean isResultStackReversible(ItemStack stack, World world) { - if (stack.isEmpty()) { - return false; - } - - inventoryCrafting[2].setInventorySlotContents(0, stack); - ItemStack returnStack = getNNRecipeOutput(inventoryCrafting[2], world); - - return !returnStack.isEmpty() && CompressionRegistry.areItemStacksEqual(reversibleCheck, returnStack); - } - - public static ItemStack getRecipe(ItemStack stack, World world, int gridSize) { - StorageBlockCraftingManager craftingManagerSB = StorageBlockCraftingManager.getInstance(); - InventoryCrafting inventory = inventoryCrafting[3 - gridSize]; - for (int i = 0; i < inventory.getSizeInventory(); i++) { - inventory.setInventorySlotContents(i, stack); - } - ItemStack notEmptyRecipe = craftingManagerSB.findMatchingRecipe(inventory, world); - if (!notEmptyRecipe.isEmpty()) { - return notEmptyRecipe; - } - ItemStack result = getNNRecipeOutput(inventory, world); - - if (isResultStackReversible(result, world)) { - craftingManagerSB.addRecipe(CraftingManager.findMatchingRecipe(inventory, world)); - return result; - } - return ItemStack.EMPTY; - } - - public static ItemStack getNNRecipeOutput(InventoryCrafting inventory, World world) { - IRecipe checkForNull = CraftingManager.findMatchingRecipe(inventory, world); - if (checkForNull != null) { - return checkForNull.getRecipeOutput(); - } - return ItemStack.EMPTY; - } - - public static ItemStack get22Recipe(ItemStack stack, World world) { - return getRecipe(stack, world, 2); - } - - public static ItemStack get33Recipe(ItemStack stack, World world) { - return getRecipe(stack, world, 3); - } - public ItemStack compressInventory(ItemStack[] inv, World world) { for (ItemStack invStack : inv) { if (invStack.isEmpty()) { @@ -88,12 +14,26 @@ public class AdvancedCompressionHandler extends CompressionHandler { } for (int i = 3; i >= 2; i--) { - reversibleCheck = invStack; - ItemStack stack = getRecipe(invStack, world, i); + ItemStack invStackCopy = invStack.copy(); + invStackCopy.setCount(1); + Tuple stackTuple = CompressionRegistry.compressionMap.get(invStackCopy); + ItemStack stack; + if (stackTuple == null) { + StorageBlockCraftingManager.reversibleCheck = invStack; + stack = StorageBlockCraftingManager.getRecipe(invStack, world, i); + if (stack.isEmpty()) + continue; + CompressionRegistry.compressionMap.put(invStackCopy, new Tuple<>(stack, i * i)); + } else { + stack = stackTuple.getFirst(); + if (stackTuple.getSecond() != i * i) + return ItemStack.EMPTY; + } + if (!stack.isEmpty()) { int needed = (i == 2 ? 4 : 9); - int remaining = iterateThroughInventory(invStack, invStack.getMaxStackSize() - needed, inv, needed, true); // if more than needed gets consumed at any point, the simulate test was needed after all + int remaining = iterateThroughInventory(invStack, CompressionRegistry.getItemThreshold(invStack, needed), inv, needed, true); if (remaining <= 0) return stack; } diff --git a/src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java b/src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java index 94b4ddf6..59530a63 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java @@ -37,13 +37,13 @@ public class BaseCompressionHandler extends CompressionHandler { public int getRemainingNeeded(ItemStack[] inv) { int needed = this.required.getCount(); int kept = this.getLeftover(); - return iterateThroughInventory(this.required, kept, inv, needed, true); + return iterateThroughInventory(this.required, kept, inv, needed, true); } public int drainInventory(ItemStack[] inv) { int needed = this.required.getCount(); int kept = this.getLeftover(); - return iterateThroughInventory(this.required, kept, inv, needed, true); + return iterateThroughInventory(this.required, kept, inv, needed, true); } public int getLeftover() { diff --git a/src/main/java/WayofTime/bloodmagic/compress/CompressionHandler.java b/src/main/java/WayofTime/bloodmagic/compress/CompressionHandler.java index 2cd74d14..715a7b19 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/CompressionHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compress/CompressionHandler.java @@ -3,6 +3,9 @@ package WayofTime.bloodmagic.compress; import net.minecraft.item.ItemStack; import net.minecraft.world.World; +import java.util.HashSet; +import java.util.Set; + public abstract class CompressionHandler { /** * Called to look at the inventory and syphons the required stack. Returns @@ -14,7 +17,9 @@ public abstract class CompressionHandler { public abstract ItemStack compressInventory(ItemStack[] inv, World world); public int iterateThroughInventory(ItemStack required, int kept, ItemStack[] inv, int needed, boolean doDrain) { + int oldNeeded = needed; int i = -1; + Set consumeSet = new HashSet<>(); for (ItemStack invStack : inv) { i++; @@ -31,26 +36,32 @@ public abstract class CompressionHandler { used += stackSize - remainingFromStack; } - kept -= used; // 0 + kept -= used; if (kept <= 0 && needed > 0) { int remainingFromStack = Math.max(stackSize - used - needed, 0); - if (doDrain) { + needed -= (stackSize - used - remainingFromStack); + if (needed != 0 && needed < oldNeeded) { + consumeSet.add(i); + } + + if (doDrain && (!(needed < oldNeeded) || needed == 0)) { invStack.setCount(remainingFromStack + used); + for (Integer j : consumeSet) { + inv[j].setCount(0); + inv[j] = ItemStack.EMPTY; + } + consumeSet.clear(); if (invStack.isEmpty()) { inv[i] = ItemStack.EMPTY; } } - - needed -= (stackSize - used - remainingFromStack); } - if (needed <= 0) { return 0; } } } - return needed; diff --git a/src/main/java/WayofTime/bloodmagic/compress/CompressionRegistry.java b/src/main/java/WayofTime/bloodmagic/compress/CompressionRegistry.java index 8c10fa3a..fb1de055 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/CompressionRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/compress/CompressionRegistry.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic.compress; import WayofTime.bloodmagic.util.Utils; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Tuple; import net.minecraft.world.World; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; @@ -18,8 +19,9 @@ import java.util.Map; * form. */ public class CompressionRegistry { - public static List compressionRegistry = new ArrayList<>(); + private static List compressionRegistry = new ArrayList<>(); public static Map thresholdMap = new HashMap<>(); + static Map> compressionMap = new HashMap<>(); public static void registerHandler(CompressionHandler handler) { compressionRegistry.add(handler); @@ -77,10 +79,24 @@ public class CompressionRegistry { return Pair.of(ItemStack.EMPTY, false); } - public static int getItemThreshold(ItemStack stack) { - return stack.getItem().getItemStackLimit(stack); //this should work according to the guide, leaving behind a full stack of the source item (unless otherwise specified with a BaseCompressionHandler recipe) + + public static int getItemThreshold(ItemStack stack, int needed) { + Integer threshold = thresholdMap.get(stack); + if (threshold != null) + return threshold; + else + return stack.getMaxStackSize() - needed; } + public static int getItemThreshold(ItemStack stack) { + Integer threshold = thresholdMap.get(stack); + if (threshold != null) + return threshold; + else + return stack.getMaxStackSize(); + } + + public static boolean areItemStacksEqual(ItemStack stack, ItemStack compressedStack) { return stack.isItemEqual(compressedStack) && (stack.getTagCompound() == null ? !compressedStack.hasTagCompound() : stack.getTagCompound().equals(compressedStack.getTagCompound())); } diff --git a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java index 96d31140..71b6120e 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java +++ b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java @@ -6,17 +6,91 @@ import net.minecraft.inventory.Container; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.CraftingManager; import net.minecraft.item.crafting.IRecipe; import net.minecraft.world.World; -import java.util.LinkedList; -import java.util.List; +import java.util.HashSet; +import java.util.Set; public class StorageBlockCraftingManager { private static final StorageBlockCraftingManager instance = new StorageBlockCraftingManager(); - private List recipes = new LinkedList<>(); + private static InventoryCrafting[] inventoryCrafting = { + new InventoryCrafting(new Container() { + public boolean canInteractWith(EntityPlayer player) { + return false; + } + }, + 3, 3), + new InventoryCrafting(new Container() { + public boolean canInteractWith(EntityPlayer player) { + return false; + } + }, + 2, 2), + new InventoryCrafting(new Container() { + public boolean canInteractWith(EntityPlayer player) { + return false; + } + }, + 1, 1) - public void addRecipe(IRecipe recipe){ + }; + static ItemStack reversibleCheck; + private HashSet recipes = new HashSet<>(); // TODO: Clear when recipes are reloaded in 1.14 + private Set blacklist = new HashSet<>(); + + public static boolean isResultStackReversible(ItemStack stack, World world) { + if (stack.isEmpty()) { + return false; + } + + inventoryCrafting[2].setInventorySlotContents(0, stack); + ItemStack returnStack = getNNRecipeOutput(inventoryCrafting[2], world); + + return !returnStack.isEmpty() && CompressionRegistry.areItemStacksEqual(reversibleCheck, returnStack); + } + + public static ItemStack getRecipe(ItemStack stack, World world, int gridSize) { + StorageBlockCraftingManager craftingManagerSB = getInstance(); + if (craftingManagerSB.blacklist.contains(stack)) { + return ItemStack.EMPTY; + } + InventoryCrafting inventory = inventoryCrafting[3 - gridSize]; + for (int i = 0; i < inventory.getSizeInventory(); i++) { + inventory.setInventorySlotContents(i, stack); + } + ItemStack notEmptyRecipe = craftingManagerSB.findMatchingRecipe(inventory, world); + if (!notEmptyRecipe.isEmpty()) { + return notEmptyRecipe; + } + ItemStack result = getNNRecipeOutput(inventory, world); + + if (isResultStackReversible(result, world)) { + craftingManagerSB.addRecipe(CraftingManager.findMatchingRecipe(inventory, world)); + return result; + } + craftingManagerSB.blacklist.add(stack); + return ItemStack.EMPTY; + } + + public static ItemStack getNNRecipeOutput(InventoryCrafting inventory, World world) { + IRecipe checkForNull = CraftingManager.findMatchingRecipe(inventory, world); + if (checkForNull != null) { + return checkForNull.getRecipeOutput(); + } + return ItemStack.EMPTY; + } + + public static ItemStack get22Recipe(ItemStack stack, World world) { + return getRecipe(stack, world, 2); + } + + public static ItemStack get33Recipe(ItemStack stack, World world) { + return getRecipe(stack, world, 3); + } + + public void addRecipe(IRecipe recipe) { this.recipes.add(recipe); } @@ -32,7 +106,7 @@ public class StorageBlockCraftingManager { return this.findMatchingRecipe(craftingInventory, world, this.recipes); } - private ItemStack findMatchingRecipe(InventoryCrafting craftingInventory, World world, List list) { + private ItemStack findMatchingRecipe(InventoryCrafting craftingInventory, World world, HashSet list) { int i = 0; ItemStack itemstack = ItemStack.EMPTY; ItemStack itemstack1 = ItemStack.EMPTY; @@ -67,11 +141,10 @@ public class StorageBlockCraftingManager { return new ItemStack(itemstack.getItem(), 1, i1); } else { - for (j = 0; j < list.size(); ++j) { - IRecipe irecipe = list.get(j); + for (IRecipe iRecipe : list) { - if (irecipe.matches(craftingInventory, world)) { - return irecipe.getCraftingResult(craftingInventory); + if (iRecipe.matches(craftingInventory, world)) { + return iRecipe.getCraftingResult(craftingInventory); } } @@ -83,62 +156,5 @@ public class StorageBlockCraftingManager { return instance; } - private static boolean isResultStackReversible(ItemStack stack, int gridSize, World world, List list) { - if (stack.isEmpty()) { - return false; - } - InventoryCrafting inventory = new InventoryCrafting(new Container() { - public boolean canInteractWith(EntityPlayer player) { - return false; - } - }, 2, 2); - inventory.setInventorySlotContents(0, stack); - - ItemStack returnStack = StorageBlockCraftingManager.getInstance().findMatchingRecipe(inventory, world, list); - if (returnStack.isEmpty()) { - return false; - } - - ItemStack compressedStack = ItemStack.EMPTY; - switch (gridSize) { - case 2: - compressedStack = get22Recipe(returnStack, world, list); - break; - case 3: - compressedStack = get33Recipe(returnStack, world, list); - break; - } - - return !compressedStack.isEmpty() && CompressionRegistry.areItemStacksEqual(stack, compressedStack); - } - - private static ItemStack getRecipe(ItemStack stack, World world, int gridSize, List list) { - InventoryCrafting inventory = new InventoryCrafting(new Container() { - public boolean canInteractWith(EntityPlayer player) { - return false; - } - }, gridSize, gridSize); - for (int i = 0; i < inventory.getSizeInventory(); i++) { - inventory.setInventorySlotContents(i, stack); - } - - return StorageBlockCraftingManager.getInstance().findMatchingRecipe(inventory, world, list); - } - - private static boolean has22Recipe(ItemStack stack, World world, List list) { - return !get22Recipe(stack, world, list).isEmpty(); - } - - private static ItemStack get22Recipe(ItemStack stack, World world, List list) { - return getRecipe(stack, world, 2, list); - } - - private static boolean has33Recipe(ItemStack stack, World world, List list) { - return !get33Recipe(stack, world, list).isEmpty(); - } - - private static ItemStack get33Recipe(ItemStack stack, World world, List list) { - return getRecipe(stack, world, 3, list); - } } diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java index 83a0a0e1..fb6269d2 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java @@ -29,8 +29,7 @@ import net.minecraftforge.registries.RegistryBuilder; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) @GameRegistry.ObjectHolder(BloodMagic.MODID) -public class RegistrarBloodMagic -{ +public class RegistrarBloodMagic { private static final BloodOrb ORB_DEF = new BloodOrb("", 0, 0, 0); @GameRegistry.ObjectHolder("weak") @@ -67,8 +66,7 @@ public class RegistrarBloodMagic public static IForgeRegistry BLOOD_ORBS = null; @SubscribeEvent - public static void registerBloodOrbs(RegistryEvent.Register event) - { + public static void registerBloodOrbs(RegistryEvent.Register event) { ResourceLocation orb = RegistrarBloodMagicItems.BLOOD_ORB.getRegistryName(); event.getRegistry().registerAll( new BloodOrb("weak", 1, 5000, 2).withModel(new ModelResourceLocation(orb, "type=weak")).setRegistryName("weak"), @@ -85,8 +83,7 @@ public class RegistrarBloodMagic } @SubscribeEvent - public static void registerPotions(RegistryEvent.Register event) - { + public static void registerPotions(RegistryEvent.Register event) { event.getRegistry().registerAll( new PotionBloodMagic("Boost", false, 0xFFFFFF, 0, 0).setRegistryName("boost"), new PotionBloodMagic("Whirlwind", false, 0xFFFFFF, 0, 0).setRegistryName("whirlwind"), @@ -109,8 +106,7 @@ public class RegistrarBloodMagic } @SubscribeEvent - public static void registerEntities(RegistryEvent.Register event) - { + public static void registerEntities(RegistryEvent.Register event) { int entities = 0; event.getRegistry().registerAll( @@ -128,8 +124,7 @@ public class RegistrarBloodMagic } @SubscribeEvent - public static void onRegistryCreation(RegistryEvent.NewRegistry event) - { + public static void onRegistryCreation(RegistryEvent.NewRegistry event) { BLOOD_ORBS = new RegistryBuilder() .setName(new ResourceLocation(BloodMagic.MODID, "blood_orb")) .setIDRange(0, Short.MAX_VALUE) @@ -140,10 +135,8 @@ public class RegistrarBloodMagic @SideOnly(Side.CLIENT) @SubscribeEvent - public static void registerModels(ModelRegistryEvent event) - { - for (BloodOrb orb : BLOOD_ORBS) - { + public static void registerModels(ModelRegistryEvent event) { + for (BloodOrb orb : BLOOD_ORBS) { ModelResourceLocation modelLocation = orb.getModelLocation(); if (modelLocation == null) modelLocation = new ModelResourceLocation(orb.getRegistryName(), "inventory"); diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java index e45190fb..0938c425 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java @@ -44,8 +44,7 @@ import java.util.Set; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) @GameRegistry.ObjectHolder(BloodMagic.MODID) @SuppressWarnings("unchecked") -public class RegistrarBloodMagicItems -{ +public class RegistrarBloodMagicItems { public static final Item BLOOD_ORB = Items.AIR; public static final Item ACTIVATION_CRYSTAL = Items.AIR; @@ -129,8 +128,7 @@ public class RegistrarBloodMagicItems public static List items; @SubscribeEvent - public static void registerItems(RegistryEvent.Register event) - { + public static void registerItems(RegistryEvent.Register event) { items = Lists.newArrayList(); RegistrarBloodMagicBlocks.blocks.stream().filter(block -> block instanceof IBMBlock && ((IBMBlock) block).getItem() != null).forEach(block -> @@ -215,15 +213,14 @@ public class RegistrarBloodMagicItems new ItemPotionFlask().setRegistryName("potion_flask"), new ItemAlchemicVial().setRegistryName("alchemic_vial"), new ItemFlightScroll().setRegistryName("icarus_scroll") - )); + )); event.getRegistry().registerAll(items.toArray(new Item[0])); } @SideOnly(Side.CLIENT) @SubscribeEvent - public static void registerRenders(ModelRegistryEvent event) - { + public static void registerRenders(ModelRegistryEvent event) { items.stream().filter(i -> i instanceof IVariantProvider).forEach(i -> { Int2ObjectMap variants = new Int2ObjectOpenHashMap<>(); diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java index 05f40732..d967e0b8 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java @@ -37,16 +37,12 @@ import java.util.List; import java.util.Set; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) -public class RegistrarBloodMagicRecipes -{ +public class RegistrarBloodMagicRecipes { @SubscribeEvent - public static void registerRecipes(RegistryEvent.Register event) - { - for (int i = 0; i < ItemSoulGem.names.length; i++) - { - for (EnumDemonWillType willType : EnumDemonWillType.values()) - { + public static void registerRecipes(RegistryEvent.Register event) { + for (int i = 0; i < ItemSoulGem.names.length; i++) { + for (EnumDemonWillType willType : EnumDemonWillType.values()) { ItemStack baseGemStack = new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, i); ItemStack newGemStack = new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, i); @@ -65,8 +61,7 @@ public class RegistrarBloodMagicRecipes RegistrarBloodMagicItems.SOUL_TOOL_MATERIAL.setRepairItem(EnumDemonWillType.DEFAULT.getStack()); } - public static void registerAltarRecipes(BloodMagicRecipeRegistrar registrar) - { + public static void registerAltarRecipes(BloodMagicRecipeRegistrar registrar) { // ONE registrar.addBloodAltar(new OreIngredient("gemDiamond"), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK), AltarTier.ONE.ordinal(), 2000, 2, 1); registrar.addBloodAltar(new OreIngredient("stone"), ItemSlate.SlateType.BLANK.getStack(), AltarTier.ONE.ordinal(), 1000, 5, 5); @@ -105,8 +100,7 @@ public class RegistrarBloodMagicRecipes } } - public static void registerAlchemyTableRecipes(BloodMagicRecipeRegistrar registrar) - { + public static void registerAlchemyTableRecipes(BloodMagicRecipeRegistrar registrar) { registrar.addAlchemyTable(new ItemStack(Items.STRING, 4), 0, 100, 0, Blocks.WOOL, Items.FLINT); registrar.addAlchemyTable(new ItemStack(Items.FLINT, 2), 0, 20, 0, Blocks.GRAVEL, Items.FLINT); registrar.addAlchemyTable(new ItemStack(Items.LEATHER, 4), 100, 200, 1, Items.ROTTEN_FLESH, Items.ROTTEN_FLESH, Items.ROTTEN_FLESH, Items.ROTTEN_FLESH, Items.FLINT, Items.WATER_BUCKET); @@ -139,16 +133,13 @@ public class RegistrarBloodMagicRecipes Set addedOreRecipeList = Sets.newHashSet("oreIron", "oreGold", "oreCoal", "oreRedstone"); // We already added these above String[] oreList = OreDictionary.getOreNames().clone(); - for (String ore : oreList) - { - if (ore.startsWith("ore") && !addedOreRecipeList.contains(ore)) - { + for (String ore : oreList) { + if (ore.startsWith("ore") && !addedOreRecipeList.contains(ore)) { String dustName = ore.replaceFirst("ore", "dust"); List discoveredOres = OreDictionary.getOres(ore); List dustList = OreDictionary.getOres(dustName); - if (dustList != null && !dustList.isEmpty() && discoveredOres != null && !discoveredOres.isEmpty()) - { + if (dustList != null && !dustList.isEmpty() && discoveredOres != null && !discoveredOres.isEmpty()) { ItemStack dustStack = dustList.get(0).copy(); dustStack.setCount(2); registrar.addAlchemyTable(dustStack, 400, 200, 1, ore, ItemCuttingFluid.FluidType.BASIC.getStack()); @@ -158,8 +149,7 @@ public class RegistrarBloodMagicRecipes } } - public static void registerTartaricForgeRecipes(BloodMagicRecipeRegistrar registrar) - { + public static void registerTartaricForgeRecipes(BloodMagicRecipeRegistrar registrar) { registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM), 1, 1, "dustRedstone", "ingotGold", "blockGlass", "dyeBlue"); registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 1), 60, 20, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM), "gemDiamond", "blockRedstone", "blockLapis"); registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 2), 240, 50, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 1), "gemDiamond", "blockGold", ItemSlate.SlateType.IMBUED.getStack()); @@ -216,8 +206,7 @@ public class RegistrarBloodMagicRecipes registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicItems.RITUAL_DISMANTLER), 500, 100, new ItemStack(RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL, 1, 2), new ItemStack(RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL, 1, 2), new ItemStack(RegistrarBloodMagicItems.RITUAL_DIVINER), new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD)); } - public static void registerAlchemyArrayRecipes(BloodMagicRecipeRegistrar registrar) - { + public static void registerAlchemyArrayRecipes(BloodMagicRecipeRegistrar registrar) { registrar.addAlchemyArray(new ItemStack(Items.REDSTONE), ItemSlate.SlateType.BLANK.getStack(), new ItemStack(RegistrarBloodMagicItems.SIGIL_DIVINATION), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/DivinationSigil.png")); registrar.addAlchemyArray(ComponentTypes.REAGENT_WATER.getStack(), ItemSlate.SlateType.BLANK.getStack(), new ItemStack(RegistrarBloodMagicItems.SIGIL_WATER), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WaterSigil.png")); @@ -244,8 +233,7 @@ public class RegistrarBloodMagicRecipes } - public static void registerSacrificeCraftRecipes(BloodMagicRecipeRegistrar registrar) - { + public static void registerSacrificeCraftRecipes(BloodMagicRecipeRegistrar registrar) { registrar.addSacrificeCraft(new ItemStack(RegistrarBloodMagicBlocks.TELEPOSER), 10, Items.REDSTONE); } } diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java index 21d5b273..321f3d30 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java @@ -385,9 +385,9 @@ public class EntitySentientSpecter extends EntityDemonBase { @Override public boolean shouldAttackEntity(EntityLivingBase attacker, EntityLivingBase owner) { if (!(attacker instanceof EntityCreeper) && !(attacker instanceof EntityGhast)) { - return super.shouldAttackEntity(attacker, owner); - } - return false; + return super.shouldAttackEntity(attacker, owner); + } + return false; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java index 65c0c354..ca52fadd 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java @@ -47,7 +47,8 @@ public class ItemActivationCrystal extends ItemEnum.Variant -{ - public ItemAlchemicVial() - { +public class ItemAlchemicVial extends ItemEnum.Variant { + public ItemAlchemicVial() { super(AlchemicVialType.class, "alchemic_vial"); } @Override - public void gatherVariants(Int2ObjectMap variants) - { + public void gatherVariants(Int2ObjectMap variants) { for (AlchemicVialType type : types) variants.put(type.ordinal(), "type=normal"); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java index 9e31e607..71d20e33 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java @@ -82,7 +82,7 @@ public class ItemBloodOrb extends ItemBindableBase implements IBloodOrb { if (binding.getOwnerId().equals(player.getGameProfile().getId())) ownerNetwork.setOrbTier(orb.getTier()); - ownerNetwork.add(SoulTicket.item(stack, world, player,200), orb.getCapacity()); // Add LP to owner's network + ownerNetwork.add(SoulTicket.item(stack, world, player, 200), orb.getCapacity()); // Add LP to owner's network ownerNetwork.hurtPlayer(player, 200); // Hurt whoever is using it return super.onItemRightClick(world, player, hand); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java index a537d1ec..e8dcd3e7 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java @@ -7,13 +7,23 @@ import WayofTime.bloodmagic.core.data.SoulTicket; import WayofTime.bloodmagic.util.helper.NetworkHelper; import WayofTime.bloodmagic.util.helper.PlayerHelper; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import net.minecraft.advancements.CriteriaTriggers; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.init.Blocks; import net.minecraft.init.MobEffects; +import net.minecraft.init.SoundEvents; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTUtil; import net.minecraft.potion.PotionEffect; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -70,7 +80,32 @@ public class ItemLavaCrystal extends ItemBindableBase implements IVariantProvide return null; NBTTagCompound nbt = (NBTTagCompound) bindingTag; - return new Binding(NBTUtil.getUUIDFromTag(nbt.getCompoundTag("id")),nbt.getString("name")); + return new Binding(NBTUtil.getUUIDFromTag(nbt.getCompoundTag("id")), nbt.getString("name")); + } + + @Override + public EnumActionResult onItemUse(EntityPlayer player, World worldIn, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { + pos = pos.offset(facing); + ItemStack itemstack = player.getHeldItem(hand); + + Binding binding = getBinding(player.getHeldItem(hand)); + + if (binding == null) + return EnumActionResult.FAIL; + + if (!player.canPlayerEdit(pos, facing, itemstack)) + return EnumActionResult.FAIL; + + if (worldIn.isAirBlock(pos) && NetworkHelper.getSoulNetwork(binding).syphonAndDamage(player, SoulTicket.item(player.getHeldItem(hand), 100)).isSuccess()) { + worldIn.playSound(player, pos, SoundEvents.ITEM_FIRECHARGE_USE, SoundCategory.BLOCKS, 1.0F, itemRand.nextFloat() * 0.4F + 0.8F); + worldIn.setBlockState(pos, Blocks.FIRE.getDefaultState(), 11); + } else + return EnumActionResult.FAIL; + + if (player instanceof EntityPlayerMP) + CriteriaTriggers.PLACED_BLOCK.trigger((EntityPlayerMP) player, pos, itemstack); + + return EnumActionResult.SUCCESS; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java index f96afc24..6358762a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java @@ -2,6 +2,7 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.ritual.AreaDescriptor; import WayofTime.bloodmagic.ritual.EnumRitualReaderState; import WayofTime.bloodmagic.ritual.IMasterRitualStone; import WayofTime.bloodmagic.ritual.Ritual; @@ -21,7 +22,6 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.*; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; -import net.minecraft.util.text.TextComponentString; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; @@ -100,11 +100,21 @@ public class ItemRitualReader extends Item implements IVariantProvider { switch (state) { case INFORMATION: master.provideInformationOfRitualToPlayer(player); + break; case SET_AREA: + if (player.isSneaking() && player.getHeldItem(EnumHand.OFF_HAND).getItem() instanceof ItemBloodOrb) { + Ritual ritual = master.getCurrentRitual(); + for (String range : ritual.getListOfRanges()) { + AreaDescriptor aabb = ritual.getBlockRange(range); + master.setBlockRange(range, aabb); + } + break; + } + String range = this.getCurrentBlockRange(stack); - if (range == null || player.isSneaking()) { + if (range == null || range.isEmpty() || player.isSneaking()) { String newRange = master.getNextBlockRange(range); range = newRange; this.setCurrentBlockRange(stack, newRange); @@ -144,17 +154,21 @@ public class ItemRitualReader extends Item implements IVariantProvider { BlockPos pos1 = pos.subtract(masterPos); this.setBlockPos(stack, pos1); player.sendStatusMessage(new TextComponentTranslation("ritual.bloodmagic.blockRange.firstBlock"), true); - player.sendMessage(new TextComponentString(pos1.toString())); } else { tile = world.getTileEntity(masterPos); if (tile instanceof IMasterRitualStone) { IMasterRitualStone master = (IMasterRitualStone) tile; BlockPos pos2 = pos.subtract(masterPos); String range = this.getCurrentBlockRange(stack); + if (range == null || range.isEmpty()) { + String newRange = master.getNextBlockRange(range); + range = newRange; + this.setCurrentBlockRange(stack, newRange); + } Ritual ritual = master.getCurrentRitual(); - //TODO: Fix AreaDescriptor area handling to be inclusive, then remove the "-1" for range calculation below. - int maxHorizontalRange = ritual.getMaxHorizontalRadiusForRange(range, null, null) - 1; - int maxVerticalRange = ritual.getMaxVerticalRadiusForRange(range, null, null) - 1; + + int maxHorizontalRange = ritual.getMaxHorizontalRadiusForRange(range, null, null); + int maxVerticalRange = ritual.getMaxVerticalRadiusForRange(range, null, null); int maxVolume = ritual.getMaxVolumeForRange(range, null, null); switch (master.setBlockRangeByBounds(player, range, containedPos, pos2)) { diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java index 5410758f..62632247 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java @@ -53,7 +53,7 @@ public class ItemSacrificialDagger extends ItemEnum { REINFORCED, IMBUED, DEMONIC, - ETHEREAL,; + ETHEREAL, + ; @Nonnull @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java b/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java index 2d645ba2..1cce2154 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java @@ -93,7 +93,8 @@ public class ItemTelepositionFocus extends ItemEnum.Variant list) - { + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; @@ -55,35 +51,30 @@ public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { tooltip.add(TextHelper.localize("tooltip.bloodmagic.fluidFilter." + names[stack.getItemDamage()])); super.addInformation(stack, world, tooltip, flag); } @Override - public IFluidFilter getInputFluidFilter(ItemStack filterStack, TileEntity tile, IFluidHandler handler) - { + public IFluidFilter getInputFluidFilter(ItemStack filterStack, TileEntity tile, IFluidHandler handler) { IFluidFilter testFilter; - switch (filterStack.getMetadata()) - { - case 0: - testFilter = new RoutingFluidFilter(); - break; + switch (filterStack.getMetadata()) { + case 0: + testFilter = new RoutingFluidFilter(); + break; - default: - testFilter = new RoutingFluidFilter(); + default: + testFilter = new RoutingFluidFilter(); } List filteredList = new ArrayList<>(); ItemInventory inv = new ItemInventory(filterStack, 9, ""); - for (int i = 0; i < inv.getSizeInventory(); i++) - { + for (int i = 0; i < inv.getSizeInventory(); i++) { ItemStack stack = inv.getStackInSlot(i); - if (stack.isEmpty()) - { + if (stack.isEmpty()) { continue; } @@ -96,32 +87,27 @@ public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, } @Override - public IFluidFilter getOutputFluidFilter(ItemStack filterStack, TileEntity tile, IFluidHandler handler) - { + public IFluidFilter getOutputFluidFilter(ItemStack filterStack, TileEntity tile, IFluidHandler handler) { IFluidFilter testFilter; - switch (filterStack.getMetadata()) - { - case 0: - testFilter = new RoutingFluidFilter(); - break; + switch (filterStack.getMetadata()) { + case 0: + testFilter = new RoutingFluidFilter(); + break; - default: - testFilter = new RoutingFluidFilter(); + default: + testFilter = new RoutingFluidFilter(); } List filteredList = new ArrayList<>(); ItemInventory inv = new ItemInventory(filterStack, 9, ""); //TODO: Change to grab the filter from the Item later. - for (int i = 0; i < inv.getSizeInventory(); i++) - { + for (int i = 0; i < inv.getSizeInventory(); i++) { ItemStack stack = inv.getStackInSlot(i); - if (stack.isEmpty()) - { + if (stack.isEmpty()) { continue; } ItemStack ghostStack = GhostItemHelper.getStackFromGhost(stack); - if (ghostStack.isEmpty()) - { + if (ghostStack.isEmpty()) { ghostStack.setCount(Integer.MAX_VALUE); } @@ -133,14 +119,12 @@ public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, } @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) - { + public void gatherVariants(@Nonnull Int2ObjectMap variants) { variants.put(0, "type=exact"); } @Override - public ItemStack getContainedStackForItem(ItemStack filterStack, ItemStack keyStack) - { + public ItemStack getContainedStackForItem(ItemStack filterStack, ItemStack keyStack) { ItemStack copyStack = keyStack.copy(); GhostItemHelper.setItemGhostAmount(copyStack, 0); copyStack.setCount(1); diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java index e62a77be..70e55aec 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java @@ -22,12 +22,10 @@ import javax.annotation.Nonnull; import java.util.ArrayList; import java.util.List; -public class ItemRouterFilter extends Item implements IItemFilterProvider, IVariantProvider -{ - public static String[] names = { "exact", "ignoreNBT", "modItems", "oreDict" }; +public class ItemRouterFilter extends Item implements IItemFilterProvider, IVariantProvider { + public static String[] names = {"exact", "ignoreNBT", "modItems", "oreDict"}; - public ItemRouterFilter() - { + public ItemRouterFilter() { super(); setTranslationKey(BloodMagic.MODID + ".itemFilter."); @@ -36,15 +34,13 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari } @Override - public String getTranslationKey(ItemStack stack) - { + public String getTranslationKey(ItemStack stack) { return super.getTranslationKey(stack) + names[stack.getItemDamage()]; } @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) - { + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; @@ -54,44 +50,39 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { tooltip.add(TextHelper.localize("tooltip.bloodmagic.itemFilter." + names[stack.getItemDamage()])); super.addInformation(stack, world, tooltip, flag); } @Override - public IItemFilter getInputItemFilter(ItemStack filterStack, TileEntity tile, IItemHandler handler) - { + public IItemFilter getInputItemFilter(ItemStack filterStack, TileEntity tile, IItemHandler handler) { IItemFilter testFilter = new TestItemFilter(); - switch (filterStack.getMetadata()) - { - case 0: - testFilter = new TestItemFilter(); - break; - case 1: - testFilter = new IgnoreNBTItemFilter(); - break; - case 2: - testFilter = new ModIdItemFilter(); - break; - case 3: - testFilter = new OreDictItemFilter(); - break; + switch (filterStack.getMetadata()) { + case 0: + testFilter = new TestItemFilter(); + break; + case 1: + testFilter = new IgnoreNBTItemFilter(); + break; + case 2: + testFilter = new ModIdItemFilter(); + break; + case 3: + testFilter = new OreDictItemFilter(); + break; - default: - testFilter = new DefaultItemFilter(); + default: + testFilter = new DefaultItemFilter(); } List filteredList = new ArrayList<>(); ItemInventory inv = new ItemInventory(filterStack, 9, ""); - for (int i = 0; i < inv.getSizeInventory(); i++) - { + for (int i = 0; i < inv.getSizeInventory(); i++) { ItemStack stack = inv.getStackInSlot(i); - if (stack.isEmpty()) - { + if (stack.isEmpty()) { continue; } @@ -105,42 +96,37 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari } @Override - public IItemFilter getOutputItemFilter(ItemStack filterStack, TileEntity tile, IItemHandler handler) - { + public IItemFilter getOutputItemFilter(ItemStack filterStack, TileEntity tile, IItemHandler handler) { IItemFilter testFilter; - switch (filterStack.getMetadata()) - { - case 0: - testFilter = new TestItemFilter(); - break; - case 1: - testFilter = new IgnoreNBTItemFilter(); - break; - case 2: - testFilter = new ModIdItemFilter(); - break; - case 3: - testFilter = new OreDictItemFilter(); - break; + switch (filterStack.getMetadata()) { + case 0: + testFilter = new TestItemFilter(); + break; + case 1: + testFilter = new IgnoreNBTItemFilter(); + break; + case 2: + testFilter = new ModIdItemFilter(); + break; + case 3: + testFilter = new OreDictItemFilter(); + break; - default: - testFilter = new DefaultItemFilter(); + default: + testFilter = new DefaultItemFilter(); } List filteredList = new ArrayList<>(); ItemInventory inv = new ItemInventory(filterStack, 9, ""); //TODO: Change to grab the filter from the Item later. - for (int i = 0; i < inv.getSizeInventory(); i++) - { + for (int i = 0; i < inv.getSizeInventory(); i++) { ItemStack stack = inv.getStackInSlot(i); - if (stack.isEmpty()) - { + if (stack.isEmpty()) { continue; } ItemStack ghostStack = GhostItemHelper.getStackFromGhost(stack); - if (ghostStack.isEmpty()) - { + if (ghostStack.isEmpty()) { ghostStack.setCount(Integer.MAX_VALUE); } @@ -152,8 +138,7 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari } @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) - { + public void gatherVariants(@Nonnull Int2ObjectMap variants) { variants.put(0, "type=exact"); variants.put(1, "type=ignorenbt"); variants.put(2, "type=moditems"); @@ -161,8 +146,7 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari } @Override - public ItemStack getContainedStackForItem(ItemStack filterStack, ItemStack keyStack) - { + public ItemStack getContainedStackForItem(ItemStack filterStack, ItemStack keyStack) { ItemStack copyStack = keyStack.copy(); GhostItemHelper.setItemGhostAmount(copyStack, 0); copyStack.setCount(1); diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java index 650ff280..26b44789 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java @@ -6,7 +6,6 @@ import WayofTime.bloodmagic.util.helper.TextHelper; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.item.ItemStack; -import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -38,7 +37,7 @@ public class ItemSigilBase extends ItemSigil implements IVariantProvider { @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (TextHelper.canTranslate(tooltipBase + "desc")) - tooltip.addAll(Arrays.asList(WordUtils.wrap(new TextComponentTranslation(tooltipBase + "desc").getFormattedText(), 30, "/cut", false).split("/cut"))); + tooltip.addAll(Arrays.asList(WordUtils.wrap(TextHelper.localizeEffect(tooltipBase + "desc"), 30, "/cut", false).split("/cut"))); super.addInformation(stack, world, tooltip, flag); } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java index 8c161786..957187bc 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java @@ -15,23 +15,19 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; -public class ItemSigilBloodLight extends ItemSigilBase -{ - public ItemSigilBloodLight() - { +public class ItemSigilBloodLight extends ItemSigilBase { + public ItemSigilBloodLight() { super("blood_light", 10); } @Override - public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int itemSlot, boolean isSelected) - { + public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int itemSlot, boolean isSelected) { if (getCooldownRemainder(stack) > 0) reduceCooldown(stack); } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { ItemStack stack = player.getHeldItem(hand); if (stack.getItem() instanceof ISigil.Holding) stack = ((Holding) stack.getItem()).getHeldItem(stack, player); @@ -43,15 +39,12 @@ public class ItemSigilBloodLight extends ItemSigilBase if (getCooldownRemainder(stack) > 0) return super.onItemRightClick(world, player, hand); - if (mop != null && mop.typeOfHit == RayTraceResult.Type.BLOCK) - { + if (mop != null && mop.typeOfHit == RayTraceResult.Type.BLOCK) { BlockPos blockPos = mop.getBlockPos().offset(mop.sideHit); - if (world.isAirBlock(blockPos)) - { + if (world.isAirBlock(blockPos)) { world.setBlockState(blockPos, RegistrarBloodMagicBlocks.BLOOD_LIGHT.getDefaultState()); - if (!world.isRemote) - { + if (!world.isRemote) { SoulNetwork network = NetworkHelper.getSoulNetwork(getBinding(stack)); network.syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())); } @@ -59,10 +52,8 @@ public class ItemSigilBloodLight extends ItemSigilBase player.swingArm(hand); return super.onItemRightClick(world, player, hand); } - } else - { - if (!world.isRemote) - { + } else { + if (!world.isRemote) { SoulNetwork network = NetworkHelper.getSoulNetwork(getBinding(stack)); world.spawnEntity(new EntityBloodLight(world, player)); network.syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())); @@ -74,23 +65,19 @@ public class ItemSigilBloodLight extends ItemSigilBase } @Override - public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) - { + public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) { return oldStack.getItem() != newStack.getItem(); } - public int getCooldownRemainder(ItemStack stack) - { + public int getCooldownRemainder(ItemStack stack) { return NBTHelper.checkNBT(stack).getTagCompound().getInteger(Constants.NBT.TICKS_REMAINING); } - public void reduceCooldown(ItemStack stack) - { + public void reduceCooldown(ItemStack stack) { NBTHelper.checkNBT(stack).getTagCompound().setInteger(Constants.NBT.TICKS_REMAINING, getCooldownRemainder(stack) - 1); } - public void resetCooldown(ItemStack stack) - { + public void resetCooldown(ItemStack stack) { NBTHelper.checkNBT(stack).getTagCompound().setInteger(Constants.NBT.TICKS_REMAINING, 10); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java index b3fb15da..7238a07d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java @@ -131,10 +131,10 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl public void saveInventory(ItemStack itemStack, List inventory) { NBTTagCompound itemTag = itemStack.getTagCompound(); - if (itemTag == null) { - itemStack.setTagCompound(new NBTTagCompound()); - } + if (itemTag == null) + itemStack.setTagCompound(itemTag = new NBTTagCompound()); + NBTTagCompound inventoryTag = new NBTTagCompound(); NBTTagList itemList = new NBTTagList(); for (int i = 0; i < inventorySize; i++) { @@ -146,7 +146,8 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl } } - itemTag.setTag(Constants.NBT.ITEMS, itemList); + inventoryTag.setTag(Constants.NBT.ITEMS, itemList); + itemTag.setTag(Constants.NBT.ITEM_INVENTORY, inventoryTag); } @Override @@ -246,7 +247,8 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl return NonNullList.withSize(inventorySize, ItemStack.EMPTY); } - NBTTagList tagList = tagCompound.getTagList(Constants.NBT.ITEMS, 10); + NBTTagCompound inventoryTag = tagCompound.getCompoundTag(Constants.NBT.ITEM_INVENTORY); + NBTTagList tagList = inventoryTag.getTagList(Constants.NBT.ITEMS, 10); if (tagList.isEmpty()) { return NonNullList.withSize(inventorySize, ItemStack.EMPTY); diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java index 5a9ea8f0..7d25804c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java @@ -71,8 +71,8 @@ public class ItemSigilTeleposition extends ItemSigilBase { TeleportQueue.getInstance().addITeleport(new Teleports.TeleportToDim(blockPos, player, bindingOwnerID, world, tile.getWorld().provider.getDimension(), true)); } } - } } + } return super.onItemRightClick(world, player, hand); } diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java index 6e83eb7e..487f80a2 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java @@ -104,7 +104,8 @@ public class ItemMonsterSoul extends ItemEnum.Variant CORROSIVE, DESTRUCTIVE, VENGEFUL, - STEADFAST,; + STEADFAST, + ; @Nonnull @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java index 1b804351..4d72a199 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java @@ -44,12 +44,12 @@ import java.util.Locale; public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentientTool, IVariantProvider//, IMeshProvider { - public static int[] soulBracket = new int[] {16, 60, 200, 400, 1000, 2000, 4000}; - public static double[] defaultDamageAdded = new double[] {0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75}; - public static float[] velocityAdded = new float[] {0.25f, 0.5f, 0.75f, 1, 1.25f, 1.5f, 1.75f}; - public static double[] soulDrainPerSwing = new double[] {0.05, 0.1, 0.2, 0.4, 0.75, 1, 1.5}; //TODO - public static double[] soulDrop = new double[] {2, 4, 7, 10, 13, 16, 24}; - public static double[] staticDrop = new double[] {1, 1, 2, 3, 3, 3, 4}; + public static int[] soulBracket = new int[]{16, 60, 200, 400, 1000, 2000, 4000}; + public static double[] defaultDamageAdded = new double[]{0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75}; + public static float[] velocityAdded = new float[]{0.25f, 0.5f, 0.75f, 1, 1.25f, 1.5f, 1.75f}; + public static double[] soulDrainPerSwing = new double[]{0.05, 0.1, 0.2, 0.4, 0.75, 1, 1.5}; //TODO + public static double[] soulDrop = new double[]{2, 4, 7, 10, 13, 16, 24}; + public static double[] staticDrop = new double[]{1, 1, 2, 3, 3, 3, 4}; public static float soullessShotVelocity = 2.5F; public ItemSentientBow() { @@ -331,7 +331,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien player.addStat(StatList.getObjectUseStats(this)); return entityArrow; } - + @Override public void onPlayerStoppedUsing(ItemStack stack, World world, EntityLivingBase entityLiving, int timeLeft) { if (entityLiving instanceof EntityPlayer) { @@ -361,9 +361,9 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien ItemArrow itemarrow = ((ItemArrow) (itemstack.getItem() instanceof ItemArrow ? itemstack.getItem() : Items.ARROW)); EntityArrow entityArrow; double amount = (this.getDropOfActivatedBow(stack) * world.rand.nextDouble() + this.getStaticDropOfActivatedBow(stack)); - + float newArrowVelocity = arrowVelocity * getVelocityOfArrow(stack); - + if (getLevel(PlayerDemonWillHandler.getTotalDemonWill(type, player)) <= 0) { entityArrow = itemarrow.createArrow(world, itemstack, entityLiving); } else if (itemarrow == Items.ARROW) { @@ -382,8 +382,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien entityArrow.shoot(player, player.rotationPitch, player.rotationYaw, 0.0F, newArrowVelocity, 1.0F); - if (Float.compare(getVelocityOfArrow(stack), soullessShotVelocity) < Float.MIN_NORMAL) - { + if (Float.compare(getVelocityOfArrow(stack), soullessShotVelocity) < Float.MIN_NORMAL) { world.playSound(null, player.getPosition(), SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.NEUTRAL, 0.4F, 1.0F); } diff --git a/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java b/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java index 12073a87..b16fe78a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java +++ b/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java @@ -32,31 +32,26 @@ import WayofTime.bloodmagic.iface.IActivatable; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.util.helper.NBTHelper; -public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshProvider, IActivatable -{ +public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshProvider, IActivatable { public static Map> floatMap = new HashMap>(); public static Map heldEntityMap = new HashMap(); public static Map heldEntityOffsetMap = new HashMap(); //TODO: A lot of this stuff could be moved to a toggle-able variant - public ItemFlightScroll() - { + public ItemFlightScroll() { super(); setTranslationKey(BloodMagic.MODID + ".icarusScroll"); setCreativeTab(BloodMagic.TAB_BM); } @Override - public boolean getActivated(ItemStack stack) - { + public boolean getActivated(ItemStack stack) { return !stack.isEmpty() && NBTHelper.checkNBT(stack).getTagCompound().getBoolean(Constants.NBT.ACTIVATED); } @Override - public ItemStack setActivatedState(ItemStack stack, boolean activated) - { - if (!stack.isEmpty()) - { + public ItemStack setActivatedState(ItemStack stack, boolean activated) { + if (!stack.isEmpty()) { NBTHelper.checkNBT(stack).getTagCompound().setBoolean(Constants.NBT.ACTIVATED, activated); return stack; } @@ -65,27 +60,20 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { ItemStack stack = player.getHeldItem(hand); - if (!world.isRemote) - { - if (player.isSneaking()) - { - if (!getActivated(stack)) - { + if (!world.isRemote) { + if (player.isSneaking()) { + if (!getActivated(stack)) { double drainNeeded = getBreathCostPerSecond(stack); - if (this.drainBreath(stack, drainNeeded, false) >= drainNeeded) - { + if (this.drainBreath(stack, drainNeeded, false) >= drainNeeded) { setActivatedState(stack, true); } - } else - { + } else { setActivatedState(stack, false); } - } else - { + } else { //TODO: Add an effect where it "draws back" like a bow in order to cast Levitation on a mob. //Only Levitated mobs can be grabbed. } @@ -95,27 +83,21 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr } @Override - public boolean itemInteractionForEntity(ItemStack stack, EntityPlayer player, EntityLivingBase entity, EnumHand hand) - { - if (entity.world.isRemote) - { + public boolean itemInteractionForEntity(ItemStack stack, EntityPlayer player, EntityLivingBase entity, EnumHand hand) { + if (entity.world.isRemote) { return false; } //TODO: Do check to see if the entity is levitating - will only "ensnare" a mob that is levitating. - if (player.isSneaking()) - { + if (player.isSneaking()) { //TODO: Release entity completely? removeEntity(player, entity); - } else - { + } else { EntityLivingBase heldEntity = getHeldEntity(player); - if (heldEntity != null && heldEntity.equals(entity)) - { + if (heldEntity != null && heldEntity.equals(entity)) { heldEntityMap.remove(player); - } else - { + } else { holdEntity(player, entity); //Hold the entity so you can place it around yourself where needed. } } @@ -124,18 +106,13 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr } @Override - public void onUpdate(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) - { - if (!world.isRemote && entity instanceof EntityPlayerMP && getActivated(stack)) - { - if (entity.ticksExisted % 20 == 0) - { + public void onUpdate(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) { + if (!world.isRemote && entity instanceof EntityPlayerMP && getActivated(stack)) { + if (entity.ticksExisted % 20 == 0) { double drainNeeded = getBreathCostPerSecond(stack); - if (this.drainBreath(stack, drainNeeded, false) >= drainNeeded) - { + if (this.drainBreath(stack, drainNeeded, false) >= drainNeeded) { this.drainBreath(stack, drainNeeded, true); - } else - { + } else { this.setActivatedState(stack, false); } } @@ -143,40 +120,32 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr onEffectUpdate(stack, world, (EntityPlayer) entity, itemSlot, isSelected); } - if (!world.isRemote) - { - if (entity instanceof EntityPlayer) - { + if (!world.isRemote) { + if (entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) entity; updateHeldEntityPosition(player); - if (floatMap.containsKey(player)) - { + if (floatMap.containsKey(player)) { Map entityMap = floatMap.get(player); - if (entityMap == null) - { + if (entityMap == null) { return; } List removalList = new ArrayList(); - for (Entry entry : entityMap.entrySet()) - { + for (Entry entry : entityMap.entrySet()) { EntityLivingBase floatingEntity = entry.getKey(); - if (floatingEntity == null || floatingEntity.isDead || floatingEntity.dimension != player.dimension) - { + if (floatingEntity == null || floatingEntity.isDead || floatingEntity.dimension != player.dimension) { removalList.add(floatingEntity); } followOwner(player, floatingEntity, entry.getValue()); } - for (EntityLivingBase livingEntity : removalList) - { + for (EntityLivingBase livingEntity : removalList) { entityMap.remove(livingEntity); } - if (entityMap.isEmpty()) - { + if (entityMap.isEmpty()) { floatMap.remove(player); } @@ -185,16 +154,13 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr } } - public static boolean updateEntityOffset(EntityPlayer player, EntityLivingBase living, Vector3d updatedOffset) - { + public static boolean updateEntityOffset(EntityPlayer player, EntityLivingBase living, Vector3d updatedOffset) { //TODO: Check if this entity is contained in another player's map to prevent weird things. - if (floatMap.containsKey(player)) - { + if (floatMap.containsKey(player)) { Map entityMap = floatMap.get(player); entityMap.put(living, updatedOffset); return true; - } else - { + } else { Map entityMap = new HashMap(); entityMap.put(living, updatedOffset); floatMap.put(player, entityMap); @@ -203,28 +169,23 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr } @Nullable - public static EntityLivingBase getHeldEntity(EntityPlayer player) - { - if (heldEntityMap.containsKey(player)) - { + public static EntityLivingBase getHeldEntity(EntityPlayer player) { + if (heldEntityMap.containsKey(player)) { return heldEntityMap.get(player); } return null; } - public static double getHeldEntityOffset(EntityPlayer player) - { - if (heldEntityMap.containsKey(player)) - { + public static double getHeldEntityOffset(EntityPlayer player) { + if (heldEntityMap.containsKey(player)) { return heldEntityOffsetMap.get(player); } return 1; } - public static void holdEntity(EntityPlayer player, EntityLivingBase entityLiving) - { + public static void holdEntity(EntityPlayer player, EntityLivingBase entityLiving) { float distance = player.getDistance(entityLiving); Vec3d lookVec = player.getLookVec(); heldEntityMap.put(player, entityLiving); @@ -232,41 +193,33 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr updateEntityOffset(player, entityLiving, new Vector3d(lookVec.x * distance, lookVec.y * distance, lookVec.z * distance)); } - public static void updateHeldEntityPosition(EntityPlayer player) - { + public static void updateHeldEntityPosition(EntityPlayer player) { EntityLivingBase entityLiving = getHeldEntity(player); - if (entityLiving != null) - { + if (entityLiving != null) { double offset = getHeldEntityOffset(player); Vec3d lookVec = player.getLookVec(); updateEntityOffset(player, entityLiving, new Vector3d(lookVec.x * offset, lookVec.y * offset, lookVec.z * offset)); } } - public static void removeEntity(EntityPlayer player, EntityLivingBase living) - { - if (living == null) - { + public static void removeEntity(EntityPlayer player, EntityLivingBase living) { + if (living == null) { return; } - if (floatMap.containsKey(player)) - { + if (floatMap.containsKey(player)) { Map entityMap = floatMap.get(player); - if (entityMap.containsKey(living)) - { + if (entityMap.containsKey(living)) { entityMap.remove(living); } - if (entityMap.isEmpty()) - { + if (entityMap.isEmpty()) { floatMap.remove(player); } } } - public void followOwner(EntityPlayer owner, EntityLivingBase livingEntity, Vector3d offset) - { + public void followOwner(EntityPlayer owner, EntityLivingBase livingEntity, Vector3d offset) { double offsetX = offset.x; double offsetY = offset.y; double offsetZ = offset.z; @@ -287,40 +240,34 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr vec.normalize(); - if (speed <= 0.00001) - { + if (speed <= 0.00001) { return; } livingEntity.setVelocity(vec.x * speed, vec.y * speed, vec.z * speed); } - public void onEffectUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) - { + public void onEffectUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { player.addPotionEffect(new PotionEffect(RegistrarBloodMagic.FLIGHT, 2, 0)); } @Override - public int getMaxBreath(ItemStack stack) - { + public int getMaxBreath(ItemStack stack) { return 20; } - public double getBreathCostPerSecond(ItemStack stack) - { + public double getBreathCostPerSecond(ItemStack stack) { return 0.01; } @Override @SideOnly(Side.CLIENT) - public ItemMeshDefinition getMeshDefinition() - { + public ItemMeshDefinition getMeshDefinition() { return new CustomMeshDefinitionActivatable("icarus_scroll"); } @Override - public void gatherVariants(Consumer variants) - { + public void gatherVariants(Consumer variants) { variants.accept("active=false"); variants.accept("active=true"); } diff --git a/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemSoulBreathContainer.java b/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemSoulBreathContainer.java index 1dfb41cd..43c3b3ed 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemSoulBreathContainer.java +++ b/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemSoulBreathContainer.java @@ -6,33 +6,28 @@ import net.minecraft.nbt.NBTTagCompound; import WayofTime.bloodmagic.soul.ISoulBreathContainer; import WayofTime.bloodmagic.util.Constants; -public abstract class ItemSoulBreathContainer extends Item implements ISoulBreathContainer -{ +public abstract class ItemSoulBreathContainer extends Item implements ISoulBreathContainer { @Override - public double getBreath(ItemStack stack) - { + public double getBreath(ItemStack stack) { NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.BREATH); } @Override - public void setBreath(ItemStack stack, double amount) - { + public void setBreath(ItemStack stack, double amount) { NBTTagCompound tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.BREATH, amount); } @Override - public double drainBreath(ItemStack stack, double drainAmount, boolean doDrain) - { + public double drainBreath(ItemStack stack, double drainAmount, boolean doDrain) { double breath = getBreath(stack); double breathDrained = Math.min(drainAmount, breath); - if (doDrain) - { + if (doDrain) { setBreath(stack, breath - breathDrained); } @@ -40,15 +35,13 @@ public abstract class ItemSoulBreathContainer extends Item implements ISoulBreat } @Override - public double fillBreath(ItemStack stack, double fillAmount, boolean doFill) - { + public double fillBreath(ItemStack stack, double fillAmount, boolean doFill) { double current = this.getBreath(stack); double maxBreath = this.getMaxBreath(stack); double filled = Math.min(fillAmount, maxBreath - current); - if (doFill) - { + if (doFill) { this.setBreath(stack, filled + current); } @@ -56,17 +49,14 @@ public abstract class ItemSoulBreathContainer extends Item implements ISoulBreat } @Override - public boolean showDurabilityBar(ItemStack stack) - { + public boolean showDurabilityBar(ItemStack stack) { return true; } @Override - public double getDurabilityForDisplay(ItemStack stack) - { + public double getDurabilityForDisplay(ItemStack stack) { double maxWill = getMaxBreath(stack); - if (maxWill <= 0) - { + if (maxWill <= 0) { return 1; } return 1.0 - (getBreath(stack) / maxWill); diff --git a/src/main/java/WayofTime/bloodmagic/item/types/AlchemicVialType.java b/src/main/java/WayofTime/bloodmagic/item/types/AlchemicVialType.java index db637b99..1539372c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/types/AlchemicVialType.java +++ b/src/main/java/WayofTime/bloodmagic/item/types/AlchemicVialType.java @@ -6,44 +6,36 @@ import net.minecraft.item.ItemStack; import javax.annotation.Nonnull; import java.util.Locale; -public enum AlchemicVialType implements ISubItem -{ +public enum AlchemicVialType implements ISubItem { BASE(0x2e35ff); final int potionColour; - AlchemicVialType(int colour1) - { + AlchemicVialType(int colour1) { potionColour = colour1; } @Nonnull @Override - public String getInternalName() - { + public String getInternalName() { return name().toLowerCase(Locale.ROOT); } @Nonnull @Override - public ItemStack getStack(int count) - { + public ItemStack getStack(int count) { return new ItemStack(RegistrarBloodMagicItems.ALCHEMIC_VIAL, count, ordinal()); } - public int getColourForLayer(int layer) - { - if (layer == 0) - { + public int getColourForLayer(int layer) { + if (layer == 0) { return potionColour; } return -1; } - public static int getColourForLayer(int variant, int layer) - { - if (variant >= AlchemicVialType.values().length) - { + public static int getColourForLayer(int variant, int layer) { + if (variant >= AlchemicVialType.values().length) { return -1; } diff --git a/src/main/java/WayofTime/bloodmagic/item/types/ComponentTypes.java b/src/main/java/WayofTime/bloodmagic/item/types/ComponentTypes.java index 89474201..c49aa09b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/types/ComponentTypes.java +++ b/src/main/java/WayofTime/bloodmagic/item/types/ComponentTypes.java @@ -40,7 +40,8 @@ public enum ComponentTypes implements ISubItem { CATALYST_POWER_1, REAGENT_CLAW, REAGENT_BOUNCE, - REAGENT_FROST,; + REAGENT_FROST, + ; @Nonnull @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/types/ShardType.java b/src/main/java/WayofTime/bloodmagic/item/types/ShardType.java index f3ca9233..d3edd6e3 100644 --- a/src/main/java/WayofTime/bloodmagic/item/types/ShardType.java +++ b/src/main/java/WayofTime/bloodmagic/item/types/ShardType.java @@ -9,7 +9,8 @@ import java.util.Locale; public enum ShardType implements ISubItem { WEAK, - DEMONIC,; + DEMONIC, + ; @Nonnull @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java index 5f9ed0fa..61252106 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java @@ -8,7 +8,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; public class LivingArmourUpgradeStormTrooper extends LivingArmourUpgrade { - public static final int[] costs = new int[]{-10, -25, -40, 65, -90}; + public static final int[] costs = new int[]{-10, -25, -40, -65, -90}; public static final float[] inaccuracy = new float[]{0.04f, 0.08f, 0.12f, 0.16f, 0.2f}; public LivingArmourUpgradeStormTrooper(int level) { diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java index 66b48fdc..79368bdb 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java @@ -14,7 +14,7 @@ public class LivingArmourUpgradeFallProtect extends LivingArmourUpgrade { super(level); } - + public float getDamageMultiplier() { return 1 - protectionLevel[this.level]; } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java index 8b9288a6..3a0a2890 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java @@ -16,45 +16,37 @@ import org.apache.commons.codec.binary.StringUtils; import java.util.UUID; -public class LivingArmourUpgradeSpeed extends LivingArmourUpgrade -{ - public static final int[] costs = new int[] { 3, 7, 13, 26, 42, 60, 90, 130, 180, 250 }; - public static final double[] speedModifier = new double[] { 0.1, 0.2, 0.3, 0.4, 0.5, 0.7, 0.9, 1.1, 1.3, 1.5 }; - public static final int[] sprintSpeedTime = new int[] { 0, 0, 0, 0, 0, 20, 60, 60, 100, 200 }; - public static final int[] sprintSpeedLevel = new int[] { 0, 0, 0, 0, 0, 0, 0, 1, 1, 2 }; - public static final int[] healthModifier = new int[] { 0, 0, 0, 0, 0, 0, 0, 4, 10, 20 }; - public static final int[] sprintRegenTime = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 25 }; +public class LivingArmourUpgradeSpeed extends LivingArmourUpgrade { + public static final int[] costs = new int[]{3, 7, 13, 26, 42, 60, 90, 130, 180, 250}; + public static final double[] speedModifier = new double[]{0.1, 0.2, 0.3, 0.4, 0.5, 0.7, 0.9, 1.1, 1.3, 1.5}; + public static final int[] sprintSpeedTime = new int[]{0, 0, 0, 0, 0, 20, 60, 60, 100, 200}; + public static final int[] sprintSpeedLevel = new int[]{0, 0, 0, 0, 0, 0, 0, 1, 1, 2}; + public static final int[] healthModifier = new int[]{0, 0, 0, 0, 0, 0, 0, 4, 10, 20}; + public static final int[] sprintRegenTime = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 25}; - public LivingArmourUpgradeSpeed(int level) - { + public LivingArmourUpgradeSpeed(int level) { super(level); } - public double getSpeedModifier() - { + public double getSpeedModifier() { return speedModifier[this.level]; } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) - { - if (player.isSprinting()) - { - if (sprintSpeedTime[this.level] > 0) - { + public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + if (player.isSprinting()) { + if (sprintSpeedTime[this.level] > 0) { player.addPotionEffect(new PotionEffect(MobEffects.SPEED, sprintSpeedTime[this.level], sprintSpeedLevel[this.level], false, false)); } - if (sprintRegenTime[this.level] > 0 && !player.isPotionActive(MobEffects.REGENERATION)) - { + if (sprintRegenTime[this.level] > 0 && !player.isPotionActive(MobEffects.REGENERATION)) { player.addPotionEffect(new PotionEffect(MobEffects.REGENERATION, sprintRegenTime[this.level], 0, false, false)); } } } @Override - public Multimap getAttributeModifiers() - { + public Multimap getAttributeModifiers() { Multimap modifierMap = HashMultimap.create(); // modifierMap.put(SharedMonsterAttributes.movementSpeed.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(895132, 1), "Speed modifier" + 1, speedModifier[this.level], 1)); @@ -68,38 +60,32 @@ public class LivingArmourUpgradeSpeed extends LivingArmourUpgrade } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.movement"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 10; } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { // EMPTY } @Override - public String getTranslationKey() - { + public String getTranslationKey() { return tooltipBase + "speed"; } } diff --git a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java index 46b12fc1..f96323fc 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java +++ b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic.potion; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.event.SacrificeKnifeUsedEvent; +import com.google.common.collect.Lists; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.IProjectile; @@ -55,7 +56,7 @@ public class PotionEventHandlers { @SubscribeEvent public static void onEntityUpdate(LivingEvent.LivingUpdateEvent event) { EntityLivingBase eventEntityLiving = event.getEntityLiving(); - List flightList = flightListMap.get(eventEntityLiving.getEntityWorld()); + List flightList = flightListMap.getOrDefault(eventEntityLiving.getEntityWorld(), Lists.newArrayList()); if (eventEntityLiving instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) eventEntityLiving; @@ -76,35 +77,44 @@ public class PotionEventHandlers { } } } -// if (eventEntityLiving.isPotionActive(ModPotions.boost)) -// { -// int i = eventEntityLiving.getActivePotionEffect(ModPotions.boost).getAmplifier(); -// { -// float percentIncrease = (i + 1) * 0.05f; -// -// if (eventEntityLiving instanceof EntityPlayer) -// { -// EntityPlayer entityPlayer = (EntityPlayer) eventEntityLiving; -// -// if ((entityPlayer.onGround || entityPlayer.capabilities.isFlying) && entityPlayer.moveForward > 0F) -// entityPlayer.moveFlying(0F, 1F, entityPlayer.capabilities.isFlying ? (percentIncrease / 2.0f) : percentIncrease); -// } -// } -// } - List noGravityList = noGravityListMap.get(event.getEntityLiving().getEntityWorld()); - if ((!(eventEntityLiving instanceof EntityPlayer) || !((EntityPlayer) eventEntityLiving).isSpectator()) && eventEntityLiving.isPotionActive(RegistrarBloodMagic.SUSPENDED)) { - eventEntityLiving.setNoGravity(true); - noGravityList.add(eventEntityLiving); - } else { - eventEntityLiving.setNoGravity(false); - noGravityList.remove(eventEntityLiving); + + if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.BOOST)) { + int amplifier = event.getEntityLiving().getActivePotionEffect(RegistrarBloodMagic.BOOST).getAmplifier(); + float percentIncrease = (amplifier + 1) * 0.5F; + + boolean isPlayerAndFlying = eventEntityLiving instanceof EntityPlayer && ((EntityPlayer) eventEntityLiving).capabilities.isFlying; + if (percentIncrease != 0 && (eventEntityLiving.onGround || isPlayerAndFlying) && + (eventEntityLiving.moveForward != 0 || eventEntityLiving.moveStrafing != 0 || eventEntityLiving.motionY != 0)) { + + eventEntityLiving.travel(eventEntityLiving.moveStrafing * percentIncrease, + isPlayerAndFlying ? eventEntityLiving.moveVertical * percentIncrease : 0, // TODO: Vertical movement doesn't seem to be impacted even with excessive values + eventEntityLiving.moveForward * percentIncrease); + + if (isPlayerAndFlying && eventEntityLiving.motionY != 0) // TODO: remove when entity.travel() works with vertical movement or a better solution exists. + eventEntityLiving.motionY *= (1 + Math.min(percentIncrease, 0.75F)); // if this goes too high, it escalates + } } - if (eventEntityLiving.isPotionActive(RegistrarBloodMagic.GROUNDED)) - if (eventEntityLiving instanceof EntityPlayer && ((EntityPlayer) eventEntityLiving).capabilities.isFlying) - eventEntityLiving.motionY -= (0.05D * (double) (eventEntityLiving.getActivePotionEffect(RegistrarBloodMagic.GROUNDED).getAmplifier() + 1) - eventEntityLiving.motionY) * 0.2D; - else - eventEntityLiving.motionY -= (0.1D * (double) (eventEntityLiving.getActivePotionEffect(RegistrarBloodMagic.GROUNDED).getAmplifier() + 1) - eventEntityLiving.motionY) * 0.2D; + List noGravityList = noGravityListMap.getOrDefault(event.getEntityLiving().getEntityWorld(), Lists.newArrayList()); + if (noGravityList != null) { + if (eventEntityLiving.isPotionActive(RegistrarBloodMagic.SUSPENDED) && !eventEntityLiving.hasNoGravity()) { + eventEntityLiving.setNoGravity(true); + noGravityList.add(eventEntityLiving); + } else if (noGravityList.contains(eventEntityLiving)) { + eventEntityLiving.setNoGravity(false); + noGravityList.remove(eventEntityLiving); + } + } + + if (eventEntityLiving.isPotionActive(RegistrarBloodMagic.GROUNDED)) { + PotionEffect activeEffect = eventEntityLiving.getActivePotionEffect(RegistrarBloodMagic.GROUNDED); + if (activeEffect != null) { + if (eventEntityLiving instanceof EntityPlayer && ((EntityPlayer) eventEntityLiving).capabilities.isFlying) + eventEntityLiving.motionY -= (0.05D * (double) activeEffect.getAmplifier() + 1 - eventEntityLiving.motionY) * 0.2D; + else + eventEntityLiving.motionY -= (0.1D * (double) activeEffect.getAmplifier() + 1 - eventEntityLiving.motionY) * 0.2D; + } + } if (eventEntityLiving.isPotionActive(RegistrarBloodMagic.WHIRLWIND)) { int d0 = 3; diff --git a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java index f8dd774e..204d1db4 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java @@ -40,22 +40,18 @@ import net.minecraftforge.fml.common.ObfuscationReflectionHelper; import java.awt.Color; import java.util.Map; -public class ClientProxy extends CommonProxy -{ +public class ClientProxy extends CommonProxy { public static DemonWillHolder currentAura = new DemonWillHolder(); @Override - public void preInit() - { + public void preInit() { super.preInit(); OBJLoader.INSTANCE.addDomain(BloodMagic.MODID); - ClientRegistry.bindTileEntitySpecialRenderer(TileInversionPillar.class, new AnimationTESR() - { + ClientRegistry.bindTileEntitySpecialRenderer(TileInversionPillar.class, new AnimationTESR() { @Override - public void handleEvents(TileInversionPillar chest, float time, Iterable pastEvents) - { + public void handleEvents(TileInversionPillar chest, float time, Iterable pastEvents) { chest.handleEvents(time, pastEvents); } }); @@ -73,8 +69,7 @@ public class ClientProxy extends CommonProxy } @Override - public void registerRenderers() - { + public void registerRenderers() { RenderingRegistry.registerEntityRenderingHandler(EntitySoulSnare.class, new SoulSnareRenderFactory()); RenderingRegistry.registerEntityRenderingHandler(EntitySentientArrow.class, new SentientArrowRenderFactory()); RenderingRegistry.registerEntityRenderingHandler(EntityBloodLight.class, new BloodLightRenderFactory()); @@ -90,18 +85,15 @@ public class ClientProxy extends CommonProxy } @Override - public void init() - { + public void init() { super.init(); Minecraft.getMinecraft().getItemColors().registerItemColorHandler((stack, tintIndex) -> { - try - { + try { if (stack.hasTagCompound() && stack.getTagCompound().hasKey(Constants.NBT.COLOR)) if (tintIndex == 1) return Color.decode(stack.getTagCompound().getString(Constants.NBT.COLOR)).getRGB(); - } catch (NumberFormatException e) - { + } catch (NumberFormatException e) { return -1; } return -1; @@ -130,29 +122,24 @@ public class ClientProxy extends CommonProxy } @Override - public void postInit() - { + public void postInit() { Elements.registerElements(); } - private void addElytraLayer() - { + private void addElytraLayer() { RenderManager renderManager = Minecraft.getMinecraft().getRenderManager(); - try - { + try { Map skinMap = ObfuscationReflectionHelper.getPrivateValue(RenderManager.class, renderManager, "skinMap", "field_178636_l"); skinMap.get("default").addLayer(new LayerBloodElytra(skinMap.get("default"))); skinMap.get("slim").addLayer(new LayerBloodElytra(skinMap.get("slim"))); BMLog.DEBUG.info("Elytra layer added"); - } catch (Exception e) - { + } catch (Exception e) { BMLog.DEBUG.error("Failed to set custom Elytra Layer for Elytra Living Armour Upgrade: {}", e.getMessage()); } } @Override - public IAnimationStateMachine load(ResourceLocation location, ImmutableMap parameters) - { + public IAnimationStateMachine load(ResourceLocation location, ImmutableMap parameters) { return ModelLoaderRegistry.loadASM(location, parameters); } } diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index 688c588a..6a748789 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -70,14 +70,12 @@ import WayofTime.bloodmagic.util.Utils; import com.google.common.base.Stopwatch; -public class ModRecipes -{ +public class ModRecipes { static ItemStack mundaneLengtheningStack = ComponentTypes.CATALYST_LENGTH_1.getStack(); static ItemStack mundanePowerStack = ComponentTypes.CATALYST_POWER_1.getStack(); - public static void init() - { + public static void init() { initOreDict(); addFurnaceRecipes(); addAltarRecipes(); @@ -88,8 +86,7 @@ public class ModRecipes addCompressionHandlers(); } - public static void initOreDict() - { + public static void initOreDict() { OreDictionary.registerOre("dustIron", ComponentTypes.SAND_IRON.getStack()); OreDictionary.registerOre("dustGold", ComponentTypes.SAND_GOLD.getStack()); OreDictionary.registerOre("dustCoal", ComponentTypes.SAND_COAL.getStack()); @@ -97,19 +94,16 @@ public class ModRecipes OreDictionary.registerOre("dustSaltpeter", ComponentTypes.SALTPETER.getStack()); } - public static void addFurnaceRecipes() - { + public static void addFurnaceRecipes() { FurnaceRecipes.instance().addSmeltingRecipe(ComponentTypes.SAND_IRON.getStack(), new ItemStack(Items.IRON_INGOT), (float) 0.15); FurnaceRecipes.instance().addSmeltingRecipe(ComponentTypes.SAND_GOLD.getStack(), new ItemStack(Items.GOLD_INGOT), (float) 0.15); } - public static void addAltarRecipes() - { + public static void addAltarRecipes() { } - public static void addAlchemyArrayRecipes() - { + public static void addAlchemyArrayRecipes() { AlchemyArrayRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_BINDING.getStack(), new ItemStack(Items.DIAMOND_SWORD), new AlchemyArrayEffectBinding("boundSword", Utils.setUnbreakable(new ItemStack(RegistrarBloodMagicItems.BOUND_SWORD))), new BindingAlchemyCircleRenderer()); AlchemyArrayRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_BINDING.getStack(), new ItemStack(Items.DIAMOND_AXE), new AlchemyArrayEffectBinding("boundAxe", Utils.setUnbreakable(new ItemStack(RegistrarBloodMagicItems.BOUND_AXE)))); AlchemyArrayRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_BINDING.getStack(), new ItemStack(Items.DIAMOND_PICKAXE), new AlchemyArrayEffectBinding("boundPickaxe", Utils.setUnbreakable(new ItemStack(RegistrarBloodMagicItems.BOUND_PICKAXE)))); @@ -137,8 +131,7 @@ public class ModRecipes } - public static void addCompressionHandlers() - { + public static void addCompressionHandlers() { Stopwatch stopwatch = Stopwatch.createStarted(); StorageBlockCraftingManager.getInstance().addStorageBlockRecipes(); @@ -151,13 +144,11 @@ public class ModRecipes BMLog.DEBUG.info("Added compression recipes in {}", stopwatch); } - public static void addAlchemyTableRecipes() - { + public static void addAlchemyTableRecipes() { AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableDyeableRecipe(0, 100, 0, new ItemStack(RegistrarBloodMagicItems.SIGIL_HOLDING))); } - public static void addPotionRecipes() - { + public static void addPotionRecipes() { addPotionRecipe(1000, 1, new ItemStack(Items.GHAST_TEAR), new PotionEffect(MobEffects.REGENERATION, 450)); addPotionRecipe(1000, 1, new ItemStack(Items.GOLDEN_CARROT), new PotionEffect(MobEffects.NIGHT_VISION, 2 * 60 * 20)); addPotionRecipe(1000, 1, new ItemStack(Items.MAGMA_CREAM), new PotionEffect(MobEffects.FIRE_RESISTANCE, 2 * 60 * 20)); @@ -181,8 +172,7 @@ public class ModRecipes addPotionRecipe(1000, 1, new ItemStack(Items.BEETROOT), new PotionEffect(RegistrarBloodMagic.DEAFNESS, 450)); } - public static void addPotionRecipe(int lpDrained, int tier, ItemStack inputStack, PotionEffect baseEffect) - { + public static void addPotionRecipe(int lpDrained, int tier, ItemStack inputStack, PotionEffect baseEffect) { AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTablePotionRecipe(lpDrained, 100, tier, inputStack, baseEffect)); List lengtheningList = new ArrayList<>(); @@ -196,8 +186,7 @@ public class ModRecipes AlchemyTableRecipeRegistry.registerRecipe(BMPotionUtils.getPowerAugmentRecipe(lpDrained, 100, tier, powerList, baseEffect, 1)); } - public static void addLivingArmourDowngradeRecipes() - { + public static void addLivingArmourDowngradeRecipes() { String messageBase = "ritual.bloodmagic.downgradeRitual.dialogue."; ItemStack bowStack = new ItemStack(Items.BOW); @@ -211,18 +200,16 @@ public class ModRecipes ItemStack stringStack = new ItemStack(Items.STRING); Map> dialogueMap = new HashMap<>(); - dialogueMap.put(bowStack, Pair.of("bow", new int[] { 1, 100, 300, 500 })); - dialogueMap.put(bottleStack, Pair.of("quenched", new int[] { 1, 100, 300, 500 })); - dialogueMap.put(swordStack, Pair.of("dulledBlade", new int[] { 1, 100, 300, 500, 700 })); - dialogueMap.put(goldenAppleStack, Pair.of("slowHeal", new int[] { 1, 100, 300, 500, 700 })); + dialogueMap.put(bowStack, Pair.of("bow", new int[]{1, 100, 300, 500})); + dialogueMap.put(bottleStack, Pair.of("quenched", new int[]{1, 100, 300, 500})); + dialogueMap.put(swordStack, Pair.of("dulledBlade", new int[]{1, 100, 300, 500, 700})); + dialogueMap.put(goldenAppleStack, Pair.of("slowHeal", new int[]{1, 100, 300, 500, 700})); - for (Entry> entry : dialogueMap.entrySet()) - { + for (Entry> entry : dialogueMap.entrySet()) { ItemStack keyStack = entry.getKey(); String str = entry.getValue().getKey(); Map> textMap = new HashMap<>(); - for (int tick : entry.getValue().getValue()) - { + for (int tick : entry.getValue().getValue()) { List textList = new ArrayList<>(); textList.add(new TextComponentTranslation("\u00A74%s", new TextComponentTranslation(messageBase + str + "." + tick))); textMap.put(tick, textList); @@ -240,8 +227,7 @@ public class ModRecipes LivingArmourDowngradeRecipeRegistry.registerRecipe(new LivingArmourUpgradeQuenched(0), bottleStack, Items.DRAGON_BREATH); LivingArmourDowngradeRecipeRegistry.registerRecipe(new LivingArmourUpgradeCrippledArm(0), shieldStack, "gemDiamond"); - for (int i = 0; i < 10; i++) - { + for (int i = 0; i < 10; i++) { addRecipeForTieredDowngrade(new LivingArmourUpgradeMeleeDecrease(i), swordStack, i); addRecipeForTieredDowngrade(new LivingArmourUpgradeSlowHeal(i), goldenAppleStack, i); addRecipeForTieredDowngrade(new LivingArmourUpgradeBattleHungry(i), fleshStack, i); @@ -251,39 +237,37 @@ public class ModRecipes } } - public static void addRecipeForTieredDowngrade(LivingArmourUpgrade upgrade, ItemStack stack, int tier) - { - switch (tier) - { - case 0: - LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, "ingotIron", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 0)); - break; - case 1: - LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, "dustRedstone", "dustRedstone", "ingotIron", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 0)); - break; - case 2: - LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, "ingotGold", "gemLapis", "gemLapis", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1)); - break; - case 3: - LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, Blocks.VINE, "dyeRed", Items.GOLDEN_CARROT, new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1)); - break; - case 4: - LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, Items.GOLDEN_APPLE, "treeSapling", "treeSapling", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2)); - break; - case 5: - LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, Blocks.IRON_BLOCK, Blocks.REDSTONE_BLOCK, new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2)); - break; - case 6: - LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, Blocks.IRON_BLOCK, Blocks.GLOWSTONE, "ingotGold", "ingotGold", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3)); - break; - case 7: - LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, Blocks.GOLD_BLOCK, Blocks.LAPIS_BLOCK, "gemDiamond", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3)); - break; - case 8: - LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, Items.DRAGON_BREATH, "gemDiamond", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 4)); - break; - case 9: - LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, Items.NETHER_STAR, "gemDiamond", "gemDiamond", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 4)); + public static void addRecipeForTieredDowngrade(LivingArmourUpgrade upgrade, ItemStack stack, int tier) { + switch (tier) { + case 0: + LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, "ingotIron", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 0)); + break; + case 1: + LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, "dustRedstone", "dustRedstone", "ingotIron", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 0)); + break; + case 2: + LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, "ingotGold", "gemLapis", "gemLapis", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1)); + break; + case 3: + LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, Blocks.VINE, "dyeRed", Items.GOLDEN_CARROT, new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1)); + break; + case 4: + LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, Items.GOLDEN_APPLE, "treeSapling", "treeSapling", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2)); + break; + case 5: + LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, Blocks.IRON_BLOCK, Blocks.REDSTONE_BLOCK, new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2)); + break; + case 6: + LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, Blocks.IRON_BLOCK, Blocks.GLOWSTONE, "ingotGold", "ingotGold", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3)); + break; + case 7: + LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, Blocks.GOLD_BLOCK, Blocks.LAPIS_BLOCK, "gemDiamond", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3)); + break; + case 8: + LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, Items.DRAGON_BREATH, "gemDiamond", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 4)); + break; + case 9: + LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, Items.NETHER_STAR, "gemDiamond", "gemDiamond", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 4)); } } } diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java index 8b1822e9..57f5d24a 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java @@ -9,11 +9,9 @@ import WayofTime.bloodmagic.ritual.harvest.HarvestHandlerStem; import WayofTime.bloodmagic.ritual.harvest.HarvestHandlerTall; import net.minecraft.init.Blocks; -public class ModRituals -{ +public class ModRituals { // TODO Move elsewhere - public static void initHarvestHandlers() - { + public static void initHarvestHandlers() { HarvestRegistry.registerRangeAmplifier(Blocks.DIAMOND_BLOCK.getDefaultState(), 15); HarvestRegistry.registerRangeAmplifier(Blocks.GOLD_BLOCK.getDefaultState(), 10); HarvestRegistry.registerRangeAmplifier(Blocks.IRON_BLOCK.getDefaultState(), 6); @@ -23,8 +21,7 @@ public class ModRituals HarvestRegistry.registerHandler(new HarvestHandlerStem()); } - public static void initCuttingFluids() - { + public static void initCuttingFluids() { CrushingRegistry.registerCuttingFluid(new CrushingHandlerCuttingFluid(ItemCuttingFluid.FluidType.BASIC.getStack(), 250, 0.5)); CrushingRegistry.registerCuttingFluid(new CrushingHandlerCuttingFluid(ItemCuttingFluid.FluidType.EXPLOSIVE.getStack(), 25, 0.05)); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/AreaDescriptor.java b/src/main/java/WayofTime/bloodmagic/ritual/AreaDescriptor.java index b6bcdd7d..e51a062d 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/AreaDescriptor.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/AreaDescriptor.java @@ -35,12 +35,16 @@ public abstract class AreaDescriptor implements Iterator { } + public abstract AreaDescriptor copy(); + public abstract int getVolumeForOffsets(BlockPos offset1, BlockPos offset2); public abstract boolean isWithinRange(BlockPos offset1, BlockPos offset2, int verticalLimit, int horizontalLimit); public abstract int getVolume(); + public abstract int getHeight(); + public abstract boolean isWithinRange(int verticalLimit, int horizontalLimit); /** @@ -89,6 +93,14 @@ public abstract class AreaDescriptor implements Iterator { this(minimumOffset, size, size, size); } + public Rectangle(AreaDescriptor.Rectangle rectangle) { + this(rectangle.minimumOffset, rectangle.maximumOffset); + } + + public AreaDescriptor.Rectangle copy() { + return new AreaDescriptor.Rectangle(this); + } + @Override public List getContainedPositions(BlockPos pos) { if (!cache || !pos.equals(cachedPosition) || blockPosCache.isEmpty()) { @@ -115,6 +127,19 @@ public abstract class AreaDescriptor implements Iterator { return tempAABB.offset(pos.getX(), pos.getY(), pos.getZ()); } + @Override + public int getHeight() { + return this.maximumOffset.getY() - this.minimumOffset.getY(); + } + + public BlockPos getMinimumOffset() { + return minimumOffset; + } + + public BlockPos getMaximumOffset() { + return maximumOffset; + } + /** * Sets the offsets of the AreaDescriptor in a safe way that will make * minimumOffset the lowest corner @@ -264,12 +289,27 @@ public abstract class AreaDescriptor implements Iterator { setRadius(minimumOffset, radius); } + public HemiSphere(AreaDescriptor.HemiSphere hemiSphere) { + this(hemiSphere.minimumOffset, hemiSphere.radius); + } + + public AreaDescriptor.HemiSphere copy() { + return new AreaDescriptor.HemiSphere(this); + } + public void setRadius(BlockPos minimumOffset, int radius) { this.minimumOffset = new BlockPos(Math.min(minimumOffset.getX(), minimumOffset.getX()), Math.min(minimumOffset.getY(), minimumOffset.getY()), Math.min(minimumOffset.getZ(), minimumOffset.getZ())); this.radius = radius; blockPosCache = new ArrayList<>(); } + + @Override + public int getHeight() { + return this.radius * 2; + } + + @Override public List getContainedPositions(BlockPos pos) { if (!cache || !pos.equals(cachedPosition) || blockPosCache.isEmpty()) { @@ -403,6 +443,20 @@ public abstract class AreaDescriptor implements Iterator { this.blockPosCache = new ArrayList<>(); } + public Cross(AreaDescriptor.Cross cross) { + this(cross.centerPos, cross.size); + } + + public AreaDescriptor.Cross copy() { + return new AreaDescriptor.Cross(this); + } + + @Override + public int getHeight() { + return this.size * 2 + 1; + } + + @Override public List getContainedPositions(BlockPos pos) { if (!cache || !pos.equals(cachedPosition) || blockPosCache.isEmpty()) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java index 6ed5924b..1ba75a6f 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java @@ -33,6 +33,8 @@ public interface IMasterRitualStone { void setCooldown(int cooldown); + boolean isActive(); + void setActive(boolean active); EnumFacing getDirection(); @@ -69,5 +71,9 @@ public interface IMasterRitualStone { void addBlockRange(String range, AreaDescriptor defaultRange); + void setBlockRanges(Map blockRanges); + + void setBlockRange(String range, AreaDescriptor defaultRange); + Ritual getCurrentRitual(); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/crushing/ICrushingHandler.java b/src/main/java/WayofTime/bloodmagic/ritual/crushing/ICrushingHandler.java index fb99faf7..10d586cb 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/crushing/ICrushingHandler.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/crushing/ICrushingHandler.java @@ -9,6 +9,8 @@ import javax.annotation.Nonnull; public interface ICrushingHandler { @Nonnull ItemStack getRecipeOutput(ItemStack input, World world, BlockPos pos); + int getLpDrain(); + double getWillDrain(); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java index 64242e37..9e3592b9 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java @@ -160,7 +160,7 @@ public class RitualAltarBuilder extends Ritual { } /* - * + * * These methods are utilities for this ritual. They support both the old * forge inventory system, and the new one. */ diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java index 34321638..f0617d47 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java @@ -53,11 +53,11 @@ public class RitualCobblestone extends Ritual { alchemyArray.decrStackSize(0, 1); world.setBlockToAir(alchemyArray.getPos()); break; - /* - * case 4: block = Blocks.end_stone; - * alchemyArray.decrStackSize(0, 1); - * world.setBlockToAir(alchemyArray.getPos()); break; - */ + /* + * case 4: block = Blocks.end_stone; + * alchemyArray.decrStackSize(0, 1); + * world.setBlockToAir(alchemyArray.getPos()); break; + */ default: break; } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java index 271ddac4..4b6d7955 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java @@ -120,18 +120,18 @@ public class RitualCrushing extends Ritual { ItemStack copyStack = checkStack.copy(); for (ICrushingHandler handler : CrushingRegistry.getCrushingHandlerList()) { - int lpDrain = handler.getLpDrain(); - double willDrain = handler.getWillDrain(); + int lpDrain = handler.getLpDrain(); + double willDrain = handler.getWillDrain(); - if (corrosiveWill < willDrain || currentEssence < lpDrain + getRefreshCost()) { - continue; - } + if (corrosiveWill < willDrain || currentEssence < lpDrain + getRefreshCost()) { + continue; + } - ItemStack result = handler.getRecipeOutput(copyStack, world, pos); + ItemStack result = handler.getRecipeOutput(copyStack, world, pos); - if (result.isEmpty()) { - continue; - } + if (result.isEmpty()) { + continue; + } if (tile != null) { result = Utils.insertStackIntoTile(result, tile, EnumFacing.DOWN); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalSplit.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalSplit.java index d5f666be..70b683f9 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalSplit.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalSplit.java @@ -17,21 +17,17 @@ import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.tile.TileDemonCrystal; @RitualRegister("crystal_split") -public class RitualCrystalSplit extends Ritual -{ - public RitualCrystalSplit() - { +public class RitualCrystalSplit extends Ritual { + public RitualCrystalSplit() { super("ritualCrystalSplit", 0, 20000, "ritual." + BloodMagic.MODID + ".crystalSplitRitual"); } @Override - public void performRitual(IMasterRitualStone masterRitualStone) - { + public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - if (currentEssence < getRefreshCost()) - { + if (currentEssence < getRefreshCost()) { masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -41,16 +37,14 @@ public class RitualCrystalSplit extends Ritual BlockPos rawPos = pos.up(2); TileEntity tile = world.getTileEntity(rawPos); - if (!(tile instanceof TileDemonCrystal) || ((TileDemonCrystal) tile).getType() != EnumDemonWillType.DEFAULT) - { + if (!(tile instanceof TileDemonCrystal) || ((TileDemonCrystal) tile).getType() != EnumDemonWillType.DEFAULT) { return; } IBlockState rawState = world.getBlockState(rawPos); TileDemonCrystal rawTile = (TileDemonCrystal) tile; - if (rawTile.crystalCount >= 5) - { + if (rawTile.crystalCount >= 5) { BlockPos vengefulPos = pos.offset(rotateFacing(EnumFacing.NORTH, direction)).up(); BlockPos corrosivePos = pos.offset(rotateFacing(EnumFacing.EAST, direction)).up(); BlockPos steadfastPos = pos.offset(rotateFacing(EnumFacing.SOUTH, direction)).up(); @@ -62,50 +56,38 @@ public class RitualCrystalSplit extends Ritual int destructiveCrystals = 0; tile = world.getTileEntity(vengefulPos); - if (tile instanceof TileDemonCrystal && ((TileDemonCrystal) tile).getType() == EnumDemonWillType.VENGEFUL && ((TileDemonCrystal) tile).crystalCount < 7) - { + if (tile instanceof TileDemonCrystal && ((TileDemonCrystal) tile).getType() == EnumDemonWillType.VENGEFUL && ((TileDemonCrystal) tile).crystalCount < 7) { vengefulCrystals = ((TileDemonCrystal) tile).crystalCount; - } else if (!(tile instanceof TileDemonCrystal) && world.isAirBlock(vengefulPos)) - { + } else if (!(tile instanceof TileDemonCrystal) && world.isAirBlock(vengefulPos)) { // #donothing, no point setting the crystal to 0 again - } else - { + } else { return; } tile = world.getTileEntity(corrosivePos); - if (tile instanceof TileDemonCrystal && ((TileDemonCrystal) tile).getType() == EnumDemonWillType.CORROSIVE && ((TileDemonCrystal) tile).crystalCount < 7) - { + if (tile instanceof TileDemonCrystal && ((TileDemonCrystal) tile).getType() == EnumDemonWillType.CORROSIVE && ((TileDemonCrystal) tile).crystalCount < 7) { corrosiveCrystals = ((TileDemonCrystal) tile).crystalCount; - } else if (!(tile instanceof TileDemonCrystal) && world.isAirBlock(corrosivePos)) - { + } else if (!(tile instanceof TileDemonCrystal) && world.isAirBlock(corrosivePos)) { - } else - { + } else { return; } tile = world.getTileEntity(steadfastPos); - if (tile instanceof TileDemonCrystal && ((TileDemonCrystal) tile).getType() == EnumDemonWillType.STEADFAST && ((TileDemonCrystal) tile).crystalCount < 7) - { + if (tile instanceof TileDemonCrystal && ((TileDemonCrystal) tile).getType() == EnumDemonWillType.STEADFAST && ((TileDemonCrystal) tile).crystalCount < 7) { steadfastCrystals = ((TileDemonCrystal) tile).crystalCount; - } else if (!(tile instanceof TileDemonCrystal) && world.isAirBlock(steadfastPos)) - { + } else if (!(tile instanceof TileDemonCrystal) && world.isAirBlock(steadfastPos)) { - } else - { + } else { return; } tile = world.getTileEntity(destructivePos); - if (tile instanceof TileDemonCrystal && ((TileDemonCrystal) tile).getType() == EnumDemonWillType.DESTRUCTIVE && ((TileDemonCrystal) tile).crystalCount < 7) - { + if (tile instanceof TileDemonCrystal && ((TileDemonCrystal) tile).getType() == EnumDemonWillType.DESTRUCTIVE && ((TileDemonCrystal) tile).crystalCount < 7) { destructiveCrystals = ((TileDemonCrystal) tile).crystalCount; - } else if (!(tile instanceof TileDemonCrystal) && world.isAirBlock(destructivePos)) - { + } else if (!(tile instanceof TileDemonCrystal) && world.isAirBlock(destructivePos)) { - } else - { + } else { return; } @@ -120,29 +102,24 @@ public class RitualCrystalSplit extends Ritual } } - public EnumFacing rotateFacing(EnumFacing facing, EnumFacing rotation) - { - switch (rotation) - { - case EAST: - return facing.rotateY(); - case SOUTH: - return facing.rotateY().rotateY(); - case WEST: - return facing.rotateYCCW(); - case NORTH: - default: - return facing; + public EnumFacing rotateFacing(EnumFacing facing, EnumFacing rotation) { + switch (rotation) { + case EAST: + return facing.rotateY(); + case SOUTH: + return facing.rotateY().rotateY(); + case WEST: + return facing.rotateYCCW(); + case NORTH: + default: + return facing; } } - public void growCrystal(World world, BlockPos pos, EnumDemonWillType type, int currentCrystalCount) - { - if (currentCrystalCount <= 0) - { + public void growCrystal(World world, BlockPos pos, EnumDemonWillType type, int currentCrystalCount) { + if (currentCrystalCount <= 0) { world.setBlockState(pos, RegistrarBloodMagicBlocks.DEMON_CRYSTAL.getStateFromMeta(type.ordinal()), 3); - } else - { + } else { TileDemonCrystal tile = (TileDemonCrystal) world.getTileEntity(pos); tile.crystalCount++; tile.markDirty(); @@ -152,20 +129,17 @@ public class RitualCrystalSplit extends Ritual } @Override - public int getRefreshTime() - { + public int getRefreshTime() { return 20; } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 1000; } @Override - public void gatherComponents(Consumer components) - { + public void gatherComponents(Consumer components) { addRune(components, 0, 0, -1, EnumRuneType.FIRE); addRune(components, 1, 0, 0, EnumRuneType.EARTH); addRune(components, 0, 0, 1, EnumRuneType.WATER); @@ -177,14 +151,12 @@ public class RitualCrystalSplit extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualCrystalSplit(); } @Override - public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) - { - return new ITextComponent[] { new TextComponentTranslation(this.getTranslationKey() + ".info") }; + public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) { + return new ITextComponent[]{new TextComponentTranslation(this.getTranslationKey() + ".info")}; } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java index ad04ccfd..cece930d 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java @@ -17,16 +17,14 @@ import net.minecraftforge.items.IItemHandler; import java.util.function.Consumer; @RitualRegister("ellipsoid") -public class RitualEllipsoid extends Ritual -{ +public class RitualEllipsoid extends Ritual { public static final String SPHEROID_RANGE = "spheroidRange"; public static final String CHEST_RANGE = "chest"; private boolean cached = false; private BlockPos currentPos; //Offset - public RitualEllipsoid() - { + public RitualEllipsoid() { super("ritualEllipsoid", 0, 20000, "ritual." + BloodMagic.MODID + ".ellipseRitual"); addBlockRange(SPHEROID_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-10, -10, -10), new BlockPos(11, 11, 11))); addBlockRange(CHEST_RANGE, new AreaDescriptor.Rectangle(new BlockPos(0, 1, 0), 1)); @@ -36,8 +34,7 @@ public class RitualEllipsoid extends Ritual } @Override - public void performRitual(IMasterRitualStone masterRitualStone) - { + public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); @@ -45,8 +42,7 @@ public class RitualEllipsoid extends Ritual AreaDescriptor chestRange = masterRitualStone.getBlockRange(CHEST_RANGE); TileEntity tileInventory = world.getTileEntity(chestRange.getContainedPositions(masterPos).get(0)); - if (currentEssence < getRefreshCost()) - { + if (currentEssence < getRefreshCost()) { masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -60,20 +56,16 @@ public class RitualEllipsoid extends Ritual int minZ = (int) (masterPos.getZ() - sphereBB.minZ); int maxZ = (int) (sphereBB.maxZ - masterPos.getZ()) - 1; - if (tileInventory != null) - { - if (tileInventory.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN)) - { + if (tileInventory != null) { + if (tileInventory.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN)) { IItemHandler itemHandler = tileInventory.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN); - if (itemHandler.getSlots() <= 0) - { + if (itemHandler.getSlots() <= 0) { return; } int blockSlot = -1; - for (int invSlot = 0; invSlot < itemHandler.getSlots(); invSlot++) - { + for (int invSlot = 0; invSlot < itemHandler.getSlots(); invSlot++) { ItemStack stack = itemHandler.extractItem(invSlot, 1, true); if (stack.isEmpty() || !(stack.getItem() instanceof ItemBlock)) continue; @@ -82,8 +74,7 @@ public class RitualEllipsoid extends Ritual break; } - if (blockSlot == -1) - { + if (blockSlot == -1) { return; } @@ -95,8 +86,7 @@ public class RitualEllipsoid extends Ritual int i = -minY; int k = -minZ; - if (currentPos != null) - { + if (currentPos != null) { j = currentPos.getY(); i = Math.min(xR, Math.max(-minX, currentPos.getX())); k = Math.min(zR, Math.max(-minZ, currentPos.getZ())); @@ -104,25 +94,19 @@ public class RitualEllipsoid extends Ritual int checks = 0; int maxChecks = 100; - while (j <= maxY) - { - while (i <= maxX) - { - while (k <= maxZ) - { + while (j <= maxY) { + while (i <= maxX) { + while (k <= maxZ) { checks++; - if (checks >= maxChecks) - { + if (checks >= maxChecks) { this.currentPos = new BlockPos(i, j, k); return; } - if (checkIfEllipsoidShell(xR, yR, zR, i, j, k)) - { + if (checkIfEllipsoidShell(xR, yR, zR, i, j, k)) { BlockPos newPos = masterPos.add(i, j, k); // - if (!world.getBlockState(newPos).getBlock().isReplaceable(world, newPos)) - { + if (!world.getBlockState(newPos).getBlock().isReplaceable(world, newPos)) { k++; continue; } @@ -156,11 +140,9 @@ public class RitualEllipsoid extends Ritual } } - public boolean checkIfEllipsoidShell(int xR, int yR, int zR, int xOff, int yOff, int zOff) - { + public boolean checkIfEllipsoidShell(int xR, int yR, int zR, int xOff, int yOff, int zOff) { //Checking shell in the x-direction - if (!checkIfEllipsoid(xR, yR, zR, xOff, yOff, zOff)) - { + if (!checkIfEllipsoid(xR, yR, zR, xOff, yOff, zOff)) { return false; } @@ -186,21 +168,18 @@ public class RitualEllipsoid extends Ritual // return false; } - public boolean checkIfEllipsoid(float xR, float yR, float zR, float xOff, float yOff, float zOff) - { + public boolean checkIfEllipsoid(float xR, float yR, float zR, float xOff, float yOff, float zOff) { float possOffset = 0.5f; return xOff * xOff / ((xR + possOffset) * (xR + possOffset)) + yOff * yOff / ((yR + possOffset) * (yR + possOffset)) + zOff * zOff / ((zR + possOffset) * (zR + possOffset)) <= 1; } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 5; } @Override - public int getRefreshTime() - { + public int getRefreshTime() { return 1; } @@ -212,8 +191,7 @@ public class RitualEllipsoid extends Ritual // } @Override - public void gatherComponents(Consumer components) - { + public void gatherComponents(Consumer components) { addCornerRunes(components, 1, 0, EnumRuneType.DUSK); addRune(components, 4, 0, 0, EnumRuneType.FIRE); @@ -254,8 +232,7 @@ public class RitualEllipsoid extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualEllipsoid(); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEternalSoul.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEternalSoul.java index 01ff6e08..e2b668a1 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEternalSoul.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEternalSoul.java @@ -1,17 +1,21 @@ package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.altar.IBloodAltar; +import WayofTime.bloodmagic.altar.BloodAltar; import WayofTime.bloodmagic.block.BlockLifeEssence; +import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.ritual.*; +import WayofTime.bloodmagic.tile.TileAltar; import WayofTime.bloodmagic.util.helper.NetworkHelper; import WayofTime.bloodmagic.util.helper.PlayerHelper; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.potion.PotionEffect; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import java.util.List; import java.util.UUID; @@ -19,12 +23,15 @@ import java.util.function.Consumer; @RitualRegister("eternal_soul") public class RitualEternalSoul extends Ritual { + public static final String ALTAR_RANGE = "altar"; - - private IBloodAltar altar = null; + private BlockPos altarOffsetPos = new BlockPos(0, 0, 0); public RitualEternalSoul() { super("ritualEternalSoul", 2, 2000000, "ritual." + BloodMagic.MODID + ".eternalSoulRitual"); + addBlockRange(ALTAR_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-5, -10, -5), 11, 21, 11)); + + setMaximumVolumeAndDistanceOfRange(ALTAR_RANGE, 0, 10, 15); } @Override @@ -33,20 +40,29 @@ public class RitualEternalSoul extends Ritual { int currentEssence = NetworkHelper.getSoulNetwork(owner).getCurrentEssence(); World world = masterRitualStone.getWorldObj(); BlockPos pos = masterRitualStone.getBlockPos(); + BlockPos altarPos = pos.add(altarOffsetPos); - if (this.altar == null) { - for (int i = -5; i <= 5; i++) { - for (int j = -5; j <= 5; j++) { - for (int k = -10; k <= 10; k++) { - if (world.getTileEntity(new BlockPos(pos.getX() + i, pos.getY() + j, pos.getZ() + k)) instanceof IBloodAltar) { - this.altar = (IBloodAltar) world.getTileEntity(new BlockPos(pos.getX() + i, pos.getY() + j, pos.getZ() + k)); - } - } + TileEntity tile = world.getTileEntity(altarPos); + AreaDescriptor altarRange = masterRitualStone.getBlockRange(ALTAR_RANGE); + + if (!altarRange.isWithinArea(altarOffsetPos) || !(tile instanceof TileAltar)) { + for (BlockPos newPos : altarRange.getContainedPositions(pos)) { + TileEntity nextTile = world.getTileEntity(newPos); + if (nextTile instanceof TileAltar) { + tile = nextTile; + altarOffsetPos = newPos.subtract(pos); + + altarRange.resetCache(); + break; } } } - if (!(this.altar instanceof IFluidHandler)) + + if (!(tile instanceof TileAltar)) { return; + } + + BloodAltar altar = (BloodAltar) tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, null); int horizontalRange = 15; int verticalRange = 20; @@ -54,21 +70,20 @@ public class RitualEternalSoul extends Ritual { List list = world.getEntitiesWithinAABB(EntityPlayer.class, new AxisAlignedBB(pos.getX() - 0.5f, pos.getY() - 0.5f, pos.getZ() - 0.5f, pos.getX() + 0.5f, pos.getY() + 0.5f, pos.getZ() + 0.5f) - .expand(horizontalRange, verticalRange, horizontalRange)); + .expand(horizontalRange, verticalRange, horizontalRange).expand(0, -verticalRange, 0)); - EntityPlayer entityOwner = null; - for (EntityPlayer player : list) { - if (PlayerHelper.getUUIDFromPlayer(player) == owner) - entityOwner = player; - } + EntityPlayer entityOwner = PlayerHelper.getPlayerFromUUID(owner); - int fillAmount = Math.min(currentEssence / 2, ((IFluidHandler) this.altar).fill(new FluidStack(BlockLifeEssence.getLifeEssence(), 10000), false)); + int fillAmount = Math.min(currentEssence / 2, altar.fill(new FluidStack(BlockLifeEssence.getLifeEssence(), 10000), false)); - ((IFluidHandler) this.altar).fill(new FluidStack(BlockLifeEssence.getLifeEssence(), fillAmount), true); + altar.fill(new FluidStack(BlockLifeEssence.getLifeEssence(), fillAmount), true); - if (entityOwner != null && entityOwner.getHealth() > 2.0f && fillAmount != 0) + if (entityOwner != null && list.contains(entityOwner) && entityOwner.getHealth() > 2.0f && fillAmount != 0) entityOwner.setHealth(2.0f); + for (EntityPlayer player : list) + player.addPotionEffect(new PotionEffect(RegistrarBloodMagic.SOUL_FRAY, 100)); + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(fillAmount * 2)); } @@ -86,7 +101,7 @@ public class RitualEternalSoul extends Ritual { @Override public void gatherComponents(Consumer components) { - addCornerRunes(components, 0, 1, EnumRuneType.FIRE); + addCornerRunes(components, 1, 0, EnumRuneType.FIRE); for (int i = 0; i < 4; i++) { addCornerRunes(components, 2, i, EnumRuneType.AIR); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGrounding.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGrounding.java index 5a8795c0..2aa7a7d1 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGrounding.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGrounding.java @@ -64,7 +64,7 @@ public class RitualGrounding extends Ritual { double vengefulDrained = 0; /* Actual ritual stuff begins here */ - AreaDescriptor groundingRange = getBlockRange(GROUNDING_RANGE); + AreaDescriptor groundingRange = masterRitualStone.getBlockRange(GROUNDING_RANGE); List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, groundingRange.getAABB(pos)); for (EntityLivingBase entity : entities) { if (totalEffects >= maxEffects) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java index 0321bd79..d38f2085 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java @@ -14,11 +14,14 @@ import java.util.function.Consumer; @RitualRegister("jumping") public class RitualJumping extends Ritual { public static final String JUMP_RANGE = "jumpRange"; + public static final String JUMP_POWER = "jumpPower"; public RitualJumping() { super("ritualJump", 0, 5000, "ritual." + BloodMagic.MODID + ".jumpRitual"); addBlockRange(JUMP_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-1, 1, -1), 3, 1, 3)); setMaximumVolumeAndDistanceOfRange(JUMP_RANGE, 0, 5, 5); + addBlockRange(JUMP_POWER, new AreaDescriptor.Rectangle(new BlockPos(0, 0, 0), 0, 5, 0)); + setMaximumVolumeAndDistanceOfRange(JUMP_POWER, 0, 0, 100); } @Override @@ -41,7 +44,7 @@ public class RitualJumping extends Ritual { break; } - double motionY = 1.5; + double motionY = masterRitualStone.getBlockRange(JUMP_POWER).getHeight() * 0.3; entity.fallDistance = 0; if (entity.isSneaking()) { @@ -66,7 +69,7 @@ public class RitualJumping extends Ritual { @Override public int getRefreshCost() { - return 5; + return getBlockRange(JUMP_POWER).getHeight(); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java index d9c67d1a..2bddc06b 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.util.DamageSourceBloodMagic; -import WayofTime.bloodmagic.soul.DemonWillHolder; -import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; +import WayofTime.bloodmagic.ritual.*; +import WayofTime.bloodmagic.soul.DemonWillHolder; +import WayofTime.bloodmagic.soul.EnumDemonWillType; +import WayofTime.bloodmagic.util.DamageSourceBloodMagic; import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; @@ -85,7 +85,7 @@ public class RitualLava extends Ritual { for (BlockPos newPos : lavaRange.getContainedPositions(pos)) { IBlockState state = world.getBlockState(newPos); - if (world.isAirBlock(newPos) || Utils.isFlowingLiquid(world, newPos, state)) { + if (world.isAirBlock(newPos) || Utils.isFlowingLiquid(state)) { int lpCost = getLPCostForRawWill(rawWill); if (currentEssence < lpCost) { break; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualVeilOfEvil.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualVeilOfEvil.java new file mode 100644 index 00000000..df962827 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualVeilOfEvil.java @@ -0,0 +1,102 @@ +package WayofTime.bloodmagic.ritual.types; + +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; +import WayofTime.bloodmagic.ritual.*; +import WayofTime.bloodmagic.soul.DemonWillHolder; +import WayofTime.bloodmagic.soul.EnumDemonWillType; +import WayofTime.bloodmagic.util.handler.event.GenericHandler; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +@RitualRegister("veil_of_evil") +public class RitualVeilOfEvil extends Ritual { + public static final String VEIL_RANGE = "veilRange"; + + public RitualVeilOfEvil() { + super("ritualVeilOfEvil", 0, 40000, "ritual." + BloodMagic.MODID + ".veilOfEvilRitual"); + addBlockRange(VEIL_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-16, 0, -16), 33)); + setMaximumVolumeAndDistanceOfRange(VEIL_RANGE, 0, 256, 256); + } + + @Override + public void performRitual(IMasterRitualStone masterRitualStone) { + /* Default Ritual Stuff */ + World world = masterRitualStone.getWorldObj(); + int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); + BlockPos pos = masterRitualStone.getBlockPos(); + + if (currentEssence < getRefreshCost()) { + masterRitualStone.getOwnerNetwork().causeNausea(); + return; + } + + // int maxEffects = currentEssence / getRefreshCost(); + // int totalEffects = 0; + + /* Default will augment stuff */ + List willConfig = masterRitualStone.getActiveWillConfig(); + DemonWillHolder holder = WorldDemonWillHandler.getWillHolder(world, pos); + + double rawWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.DEFAULT, willConfig); + double corrosiveWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.CORROSIVE, willConfig); + double destructiveWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.DESTRUCTIVE, willConfig); + double steadfastWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.STEADFAST, willConfig); + double vengefulWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.VENGEFUL, willConfig); + + double rawDrained = 0; + double corrosiveDrained = 0; + double destructiveDrained = 0; + double steadfastDrained = 0; + double vengefulDrained = 0; + + /* Actual ritual stuff begins here */ + + if (GenericHandler.forceSpawnMap.containsKey(world)) { + Map forceSpawnMap = GenericHandler.forceSpawnMap.get(world); + if (forceSpawnMap != null) { + forceSpawnMap.put(masterRitualStone, masterRitualStone.getBlockRange(VEIL_RANGE)); + } else { + forceSpawnMap = new HashMap<>(); + forceSpawnMap.put(masterRitualStone, masterRitualStone.getBlockRange(VEIL_RANGE)); + GenericHandler.forceSpawnMap.put(world, forceSpawnMap); + } + } else { + HashMap forceSpawnMap = new HashMap<>(); + forceSpawnMap.put(masterRitualStone, masterRitualStone.getBlockRange(VEIL_RANGE)); + GenericHandler.forceSpawnMap.put(world, forceSpawnMap); + } + + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost())); + } + + @Override + public int getRefreshCost() { + return 0; + } + + @Override + public void gatherComponents(Consumer components) { + + addOffsetRunes(components, 1, 0, 2, EnumRuneType.DUSK); + addCornerRunes(components, 3, 0, EnumRuneType.FIRE); + + for (int i = 0; i <= 1; i++) { + addParallelRunes(components, (4 + i), i, EnumRuneType.DUSK); + addOffsetRunes(components, (4 + i), i, -1, EnumRuneType.BLANK); + addOffsetRunes(components, 4, 5, i, EnumRuneType.EARTH); + } + + addCornerRunes(components, 5, 1, EnumRuneType.BLANK); + } + + @Override + public Ritual getNewCopy() { + return new RitualVeilOfEvil(); + } +} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWardOfSacrosanctity.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWardOfSacrosanctity.java new file mode 100644 index 00000000..8e631f4c --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWardOfSacrosanctity.java @@ -0,0 +1,105 @@ +package WayofTime.bloodmagic.ritual.types; + +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; +import WayofTime.bloodmagic.ritual.*; +import WayofTime.bloodmagic.soul.DemonWillHolder; +import WayofTime.bloodmagic.soul.EnumDemonWillType; +import WayofTime.bloodmagic.util.handler.event.GenericHandler; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +@RitualRegister("ward_of_sacrosanctity") +public class RitualWardOfSacrosanctity extends Ritual { + public static final String SPAWN_WARD = "spawnWard"; + + public RitualWardOfSacrosanctity() { + super("ritualWardOfSacrosanctity", 0, 40000, "ritual." + BloodMagic.MODID + ".wardOfSacrosanctityRitual"); + addBlockRange(SPAWN_WARD, new AreaDescriptor.Rectangle(new BlockPos(-16, -10, -16), 33)); + + setMaximumVolumeAndDistanceOfRange(SPAWN_WARD, 0, 256, 256); + } + + @Override + public void performRitual(IMasterRitualStone masterRitualStone) { + /* Default Ritual Stuff */ + World world = masterRitualStone.getWorldObj(); + int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); + BlockPos pos = masterRitualStone.getBlockPos(); + + if (currentEssence < getRefreshCost()) { + masterRitualStone.getOwnerNetwork().causeNausea(); + return; + } + + // int maxEffects = currentEssence / getRefreshCost(); + // int totalEffects = 0; + + /* Default will augment stuff */ + List willConfig = masterRitualStone.getActiveWillConfig(); + DemonWillHolder holder = WorldDemonWillHandler.getWillHolder(world, pos); + + double rawWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.DEFAULT, willConfig); + double corrosiveWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.CORROSIVE, willConfig); + double destructiveWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.DESTRUCTIVE, willConfig); + double steadfastWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.STEADFAST, willConfig); + double vengefulWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.VENGEFUL, willConfig); + + double rawDrained = 0; + double corrosiveDrained = 0; + double destructiveDrained = 0; + double steadfastDrained = 0; + double vengefulDrained = 0; + + /* Actual ritual stuff begins here */ + + if (GenericHandler.preventSpawnMap.containsKey(world)) { + Map preventSpawnMap = GenericHandler.preventSpawnMap.get(world); + if (preventSpawnMap != null) { + preventSpawnMap.put(masterRitualStone, masterRitualStone.getBlockRange(SPAWN_WARD)); + } else { + preventSpawnMap = new HashMap<>(); + preventSpawnMap.put(masterRitualStone, masterRitualStone.getBlockRange(SPAWN_WARD)); + GenericHandler.preventSpawnMap.put(world, preventSpawnMap); + } + } else { + HashMap preventSpawnMap = new HashMap<>(); + preventSpawnMap.put(masterRitualStone, masterRitualStone.getBlockRange(SPAWN_WARD)); + GenericHandler.preventSpawnMap.put(world, preventSpawnMap); + } + + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost())); + } + + @Override + public int getRefreshTime() { + return 25; + } + + @Override + public int getRefreshCost() { + return 2; + } + + @Override + public void gatherComponents(Consumer components) { + for (int i = 2; i < 5; i++) { + if (i < 4) { + addParallelRunes(components, 1, 0, EnumRuneType.AIR); + } + addCornerRunes(components, i, 0, EnumRuneType.FIRE); + } + addParallelRunes(components, 5, 0, EnumRuneType.DUSK); + addOffsetRunes(components, 5, 6, 0, EnumRuneType.WATER); + } + + @Override + public Ritual getNewCopy() { + return new RitualWardOfSacrosanctity(); + } +} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java index 302af3cd..921963ff 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java @@ -71,7 +71,7 @@ public class RitualWellOfSuffering extends Ritual { if (tile instanceof TileAltar) { TileAltar tileAltar = (TileAltar) tile; - AreaDescriptor damageRange = getBlockRange(DAMAGE_RANGE); + AreaDescriptor damageRange = masterRitualStone.getBlockRange(DAMAGE_RANGE); AxisAlignedBB range = damageRange.getAABB(pos); List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, range); diff --git a/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java b/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java index 6ff9f8d9..9f4b47a7 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java +++ b/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java @@ -15,54 +15,42 @@ import net.minecraftforge.fluids.FluidUtil; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidTankProperties; -public class RoutingFluidFilter implements IFluidFilter -{ +public class RoutingFluidFilter implements IFluidFilter { protected List requestList; protected TileEntity accessedTile; protected IFluidHandler fluidHandler; @Override - public void initializeFilter(List filteredList, TileEntity tile, IFluidHandler fluidHandler, boolean isFilterOutput) - { + public void initializeFilter(List filteredList, TileEntity tile, IFluidHandler fluidHandler, boolean isFilterOutput) { this.accessedTile = tile; this.fluidHandler = fluidHandler; - if (isFilterOutput) - { + if (isFilterOutput) { //The requestList contains a list of how much can be extracted. requestList = new ArrayList<>(); - for (ItemStack filterStack : filteredList) - { + for (ItemStack filterStack : filteredList) { FluidStack fluidFilterStack = getFluidStackFromItemStack(filterStack); - if (fluidFilterStack != null) - { + if (fluidFilterStack != null) { requestList.add(fluidFilterStack); } } IFluidTankProperties[] properties = fluidHandler.getTankProperties(); - for (IFluidTankProperties property : properties) - { + for (IFluidTankProperties property : properties) { FluidStack containedStack = property.getContents(); - if (containedStack != null) - { - for (FluidStack fluidFilterStack : requestList) - { - if (doStacksMatch(fluidFilterStack, containedStack)) - { + if (containedStack != null) { + for (FluidStack fluidFilterStack : requestList) { + if (doStacksMatch(fluidFilterStack, containedStack)) { fluidFilterStack.amount = Math.max(fluidFilterStack.amount - containedStack.amount, 0); } } } } - } else - { + } else { requestList = new ArrayList<>(); - for (ItemStack filterStack : filteredList) - { + for (ItemStack filterStack : filteredList) { FluidStack fluidFilterStack = getFluidStackFromItemStack(filterStack); - if (fluidFilterStack != null) - { + if (fluidFilterStack != null) { fluidFilterStack.amount *= -1; requestList.add(fluidFilterStack); } @@ -70,15 +58,11 @@ public class RoutingFluidFilter implements IFluidFilter IFluidTankProperties[] properties = fluidHandler.getTankProperties(); - for (IFluidTankProperties property : properties) - { + for (IFluidTankProperties property : properties) { FluidStack containedStack = property.getContents(); - if (containedStack != null) - { - for (FluidStack fluidFilterStack : requestList) - { - if (doStacksMatch(fluidFilterStack, containedStack)) - { + if (containedStack != null) { + for (FluidStack fluidFilterStack : requestList) { + if (doStacksMatch(fluidFilterStack, containedStack)) { fluidFilterStack.amount += containedStack.amount; } } @@ -91,20 +75,16 @@ public class RoutingFluidFilter implements IFluidFilter * Gives the remainder~ */ @Override - public FluidStack transferStackThroughOutputFilter(FluidStack fluidStack) - { + public FluidStack transferStackThroughOutputFilter(FluidStack fluidStack) { int allowedAmount = 0; - for (FluidStack filterStack : requestList) - { - if (doStacksMatch(filterStack, fluidStack)) - { + for (FluidStack filterStack : requestList) { + if (doStacksMatch(filterStack, fluidStack)) { allowedAmount = Math.min(filterStack.amount, fluidStack.amount); break; } } - if (allowedAmount <= 0) - { + if (allowedAmount <= 0) { return fluidStack; } @@ -113,14 +93,11 @@ public class RoutingFluidFilter implements IFluidFilter copyStack.amount = fluidStack.amount - filledAmount; Iterator itr = requestList.iterator(); - while (itr.hasNext()) - { + while (itr.hasNext()) { FluidStack filterStack = itr.next(); - if (doStacksMatch(filterStack, copyStack)) - { + if (doStacksMatch(filterStack, copyStack)) { filterStack.amount -= filledAmount; - if (filterStack.amount <= 0) - { + if (filterStack.amount <= 0) { itr.remove(); } } @@ -134,13 +111,10 @@ public class RoutingFluidFilter implements IFluidFilter } @Override - public int transferThroughInputFilter(IFluidFilter outputFilter, int maxTransfer) - { - for (FluidStack filterFluidStack : requestList) - { + public int transferThroughInputFilter(IFluidFilter outputFilter, int maxTransfer) { + for (FluidStack filterFluidStack : requestList) { int allowedAmount = Math.min(filterFluidStack.amount, maxTransfer); - if (allowedAmount <= 0) - { + if (allowedAmount <= 0) { continue; } @@ -152,8 +126,7 @@ public class RoutingFluidFilter implements IFluidFilter FluidStack remainderStack = outputFilter.transferStackThroughOutputFilter(drainStack); int drained = remainderStack == null ? copyStack.amount : (copyStack.amount - remainderStack.amount); - if (drained > 0) - { + if (drained > 0) { drainStack.amount = drained; fluidHandler.drain(drainStack, true); @@ -161,14 +134,11 @@ public class RoutingFluidFilter implements IFluidFilter } Iterator itr = requestList.iterator(); - while (itr.hasNext()) - { + while (itr.hasNext()) { FluidStack filterStack = itr.next(); - if (doStacksMatch(filterStack, copyStack)) - { + if (doStacksMatch(filterStack, copyStack)) { filterStack.amount -= drained; - if (filterStack.amount <= 0) - { + if (filterStack.amount <= 0) { itr.remove(); } } @@ -186,12 +156,9 @@ public class RoutingFluidFilter implements IFluidFilter } @Override - public boolean doesStackMatchFilter(FluidStack testStack) - { - for (FluidStack filterStack : requestList) - { - if (doStacksMatch(filterStack, testStack)) - { + public boolean doesStackMatchFilter(FluidStack testStack) { + for (FluidStack filterStack : requestList) { + if (doStacksMatch(filterStack, testStack)) { return true; } } @@ -200,17 +167,14 @@ public class RoutingFluidFilter implements IFluidFilter } @Override - public boolean doStacksMatch(FluidStack filterStack, FluidStack testStack) - { + public boolean doStacksMatch(FluidStack filterStack, FluidStack testStack) { return testStack != null && filterStack.getFluid() == testStack.getFluid(); } @Nullable - public static FluidStack getFluidStackFromItemStack(ItemStack inputStack) - { + public static FluidStack getFluidStackFromItemStack(ItemStack inputStack) { boolean isEmpty = false; - if (inputStack.getCount() == 0) - { + if (inputStack.getCount() == 0) { isEmpty = true; inputStack.setCount(1); } diff --git a/src/main/java/WayofTime/bloodmagic/soul/ISoulBreathContainer.java b/src/main/java/WayofTime/bloodmagic/soul/ISoulBreathContainer.java index f8b9b137..da0f4d07 100644 --- a/src/main/java/WayofTime/bloodmagic/soul/ISoulBreathContainer.java +++ b/src/main/java/WayofTime/bloodmagic/soul/ISoulBreathContainer.java @@ -2,8 +2,7 @@ package WayofTime.bloodmagic.soul; import net.minecraft.item.ItemStack; -public interface ISoulBreathContainer -{ +public interface ISoulBreathContainer { double getBreath(ItemStack stack); void setBreath(ItemStack stack, double amount); diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java index 828f2891..4173ca2c 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java @@ -17,8 +17,7 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -public class TileAlchemyArray extends TileInventory implements ITickable, IAlchemyArray -{ +public class TileAlchemyArray extends TileInventory implements ITickable, IAlchemyArray { public boolean isActive = false; public int activeCounter = 0; public EnumFacing rotation = EnumFacing.HORIZONTALS[0]; @@ -28,22 +27,18 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche public AlchemyArrayEffect arrayEffect; private boolean doDropIngredients = true; - public TileAlchemyArray() - { + public TileAlchemyArray() { super(2, "alchemyArray"); } - public void onEntityCollidedWithBlock(IBlockState state, Entity entity) - { - if (arrayEffect != null) - { + public void onEntityCollidedWithBlock(IBlockState state, Entity entity) { + if (arrayEffect != null) { arrayEffect.onEntityCollidedWithBlock(this, getWorld(), pos, state, entity); } } @Override - public void deserialize(NBTTagCompound tagCompound) - { + public void deserialize(NBTTagCompound tagCompound) { super.deserialize(tagCompound); this.isActive = tagCompound.getBoolean("isActive"); this.activeCounter = tagCompound.getInteger("activeCounter"); @@ -51,23 +46,20 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche if (!tagCompound.hasKey("doDropIngredients")) //Check if the array is old { this.doDropIngredients = true; - } else - { + } else { this.doDropIngredients = tagCompound.getBoolean("doDropIngredients"); } this.rotation = EnumFacing.HORIZONTALS[tagCompound.getInteger(Constants.NBT.DIRECTION)]; NBTTagCompound arrayTag = tagCompound.getCompoundTag("arrayTag"); arrayEffect = AlchemyArrayRecipeRegistry.getAlchemyArrayEffect(key); - if (arrayEffect != null) - { + if (arrayEffect != null) { arrayEffect.readFromNBT(arrayTag); } } @Override - public NBTTagCompound serialize(NBTTagCompound tagCompound) - { + public NBTTagCompound serialize(NBTTagCompound tagCompound) { super.serialize(tagCompound); tagCompound.setBoolean("isActive", isActive); tagCompound.setInteger("activeCounter", activeCounter); @@ -76,8 +68,7 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche tagCompound.setInteger(Constants.NBT.DIRECTION, rotation.getHorizontalIndex()); NBTTagCompound arrayTag = new NBTTagCompound(); - if (arrayEffect != null) - { + if (arrayEffect != null) { arrayEffect.writeToNBT(arrayTag); } tagCompound.setTag("arrayTag", arrayTag); @@ -86,25 +77,20 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche } @Override - public int getInventoryStackLimit() - { + public int getInventoryStackLimit() { return 1; } //Use this to prevent the Array from dropping items - useful for arrays that need to "consume" ingredients well before the effect. - public void setItemDrop(boolean dropItems) - { + public void setItemDrop(boolean dropItems) { this.doDropIngredients = dropItems; } @Override - public void update() - { - if (isActive && attemptCraft()) - { + public void update() { + if (isActive && attemptCraft()) { activeCounter++; - } else - { + } else { isActive = false; doDropIngredients = true; activeCounter = 0; @@ -119,61 +105,48 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche * This occurs when the block is destroyed. */ @Override - public void dropItems() - { - if (arrayEffect == null || doDropIngredients) - { + public void dropItems() { + if (arrayEffect == null || doDropIngredients) { super.dropItems(); } } - public boolean attemptCraft() - { + public boolean attemptCraft() { AlchemyArrayEffect effect = AlchemyArrayRecipeRegistry.getAlchemyArrayEffect(this.getStackInSlot(0), this.getStackInSlot(1)); - if (effect != null) - { - if (arrayEffect == null) - { + if (effect != null) { + if (arrayEffect == null) { arrayEffect = effect; key = effect.getKey(); - } else - { + } else { String effectKey = effect.getKey(); - if (effectKey.equals(key)) - { + if (effectKey.equals(key)) { //Good! Moving on. - } else - { + } else { //Something has changed, therefore we have to move our stuffs. //TODO: Add an AlchemyArrayEffect.onBreak(); ? arrayEffect = effect; key = effect.getKey(); } } - } else - { + } else { RecipeAlchemyArray recipe = BloodMagicAPI.INSTANCE.getRecipeRegistrar().getAlchemyArray(getStackInSlot(0), getStackInSlot(1)); if (recipe == null) return false; AlchemyArrayEffect newEffect = new AlchemyArrayEffectCraftingNew(recipe); - if (arrayEffect == null) - { + if (arrayEffect == null) { arrayEffect = newEffect; key = newEffect.key; - } else if (!newEffect.key.equals(key)) - { + } else if (!newEffect.key.equals(key)) { arrayEffect = newEffect; key = newEffect.key; } } - if (arrayEffect != null) - { + if (arrayEffect != null) { isActive = true; - if (arrayEffect.update(this, this.activeCounter)) - { + if (arrayEffect.update(this, this.activeCounter)) { this.decrStackSize(0, 1); this.decrStackSize(1, 1); this.getWorld().setBlockToAir(getPos()); @@ -186,20 +159,17 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche } @Override - public EnumFacing getRotation() - { + public EnumFacing getRotation() { return rotation; } - public void setRotation(EnumFacing rotation) - { + public void setRotation(EnumFacing rotation) { this.rotation = rotation; } @Override @SideOnly(Side.CLIENT) - public AxisAlignedBB getRenderBoundingBox() - { + public AxisAlignedBB getRenderBoundingBox() { return Block.FULL_BLOCK_AABB.offset(getPos()); } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java index 57d7d8e1..ac701257 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java @@ -29,8 +29,7 @@ import org.apache.commons.lang3.ArrayUtils; import java.util.ArrayList; import java.util.List; -public class TileAlchemyTable extends TileInventory implements ISidedInventory, ITickable -{ +public class TileAlchemyTable extends TileInventory implements ISidedInventory, ITickable { public static final int orbSlot = 6; public static final int toolSlot = 7; public static final int outputSlot = 8; @@ -41,43 +40,36 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, public int ticksRequired = 1; public BlockPos connectedPos = BlockPos.ORIGIN; - public boolean[] blockedSlots = new boolean[] { false, false, false, false, false, false }; + public boolean[] blockedSlots = new boolean[]{false, false, false, false, false, false}; - public TileAlchemyTable() - { + public TileAlchemyTable() { super(9, "alchemyTable"); } - public void setInitialTableParameters(EnumFacing direction, boolean isSlave, BlockPos connectedPos) - { + public void setInitialTableParameters(EnumFacing direction, boolean isSlave, BlockPos connectedPos) { this.isSlave = isSlave; this.connectedPos = connectedPos; - if (!isSlave) - { + if (!isSlave) { this.direction = direction; } } - public boolean isInvisible() - { + public boolean isInvisible() { return isSlave(); } - public boolean isInputSlotAccessible(int slot) - { + public boolean isInputSlotAccessible(int slot) { return !(slot < 6 && slot >= 0) || !blockedSlots[slot]; } - public void toggleInputSlotAccessible(int slot) - { + public void toggleInputSlotAccessible(int slot) { if (slot < 6 && slot >= 0) blockedSlots[slot] = !blockedSlots[slot]; } @Override - public void deserialize(NBTTagCompound tag) - { + public void deserialize(NBTTagCompound tag) { super.deserialize(tag); isSlave = tag.getBoolean("isSlave"); @@ -93,8 +85,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, } @Override - public NBTTagCompound serialize(NBTTagCompound tag) - { + public NBTTagCompound serialize(NBTTagCompound tag) { super.serialize(tag); tag.setBoolean("isSlave", isSlave); @@ -116,19 +107,14 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, @SuppressWarnings("unchecked") @Override - public T getCapability(Capability capability, EnumFacing facing) - { - if (facing != null && capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) - { - if (this.isSlave()) - { + public T getCapability(Capability capability, EnumFacing facing) { + if (facing != null && capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { + if (this.isSlave()) { TileEntity tile = getWorld().getTileEntity(connectedPos); - if (tile instanceof TileAlchemyTable && !((TileAlchemyTable) tile).isSlave) - { + if (tile instanceof TileAlchemyTable && !((TileAlchemyTable) tile).isSlave) { return (T) tile.getCapability(capability, facing); } - } else - { + } else { return super.getCapability(capability, facing); } } @@ -137,89 +123,70 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, } @Override - public int[] getSlotsForFace(EnumFacing side) - { - switch (side) - { - case DOWN: - return new int[] { outputSlot }; - case UP: - return new int[] { orbSlot, toolSlot }; - default: - return new int[] { 0, 1, 2, 3, 4, 5 }; + public int[] getSlotsForFace(EnumFacing side) { + switch (side) { + case DOWN: + return new int[]{outputSlot}; + case UP: + return new int[]{orbSlot, toolSlot}; + default: + return new int[]{0, 1, 2, 3, 4, 5}; } } @Override - public boolean canInsertItem(int index, ItemStack stack, EnumFacing direction) - { - switch (direction) - { - case DOWN: - return index != outputSlot && index != orbSlot && index != toolSlot; - case UP: - if (index == orbSlot && !stack.isEmpty() && stack.getItem() instanceof IBloodOrb) - { - return true; - } else if (index == toolSlot) - { - return false; //TODO: - } else - { - return true; - } - default: - if (this.isSlave) - { - TileEntity tile = getWorld().getTileEntity(connectedPos); - if (tile instanceof TileAlchemyTable && !((TileAlchemyTable) tile).isSlave) - { - return ((TileAlchemyTable) tile).canInsertItem(index, stack, direction); + public boolean canInsertItem(int index, ItemStack stack, EnumFacing direction) { + switch (direction) { + case DOWN: + return index != outputSlot && index != orbSlot && index != toolSlot; + case UP: + if (index == orbSlot && !stack.isEmpty() && stack.getItem() instanceof IBloodOrb) { + return true; + } else if (index == toolSlot) { + return false; //TODO: + } else { + return true; } - } - return getAccessibleInputSlots(direction).contains(index); + default: + if (this.isSlave) { + TileEntity tile = getWorld().getTileEntity(connectedPos); + if (tile instanceof TileAlchemyTable && !((TileAlchemyTable) tile).isSlave) { + return ((TileAlchemyTable) tile).canInsertItem(index, stack, direction); + } + } + return getAccessibleInputSlots(direction).contains(index); } } @Override - public boolean canExtractItem(int index, ItemStack stack, EnumFacing direction) - { - switch (direction) - { - case DOWN: - return index == outputSlot; - case UP: - if (index == orbSlot && !stack.isEmpty() && stack.getItem() instanceof IBloodOrb) - { - return true; - } else if (index == toolSlot) - { - return true; //TODO: - } else - { - return true; - } - default: - if (this.isSlave) - { - TileEntity tile = getWorld().getTileEntity(connectedPos); - if (tile instanceof TileAlchemyTable && !((TileAlchemyTable) tile).isSlave) - { - return ((TileAlchemyTable) tile).canExtractItem(index, stack, direction); + public boolean canExtractItem(int index, ItemStack stack, EnumFacing direction) { + switch (direction) { + case DOWN: + return index == outputSlot; + case UP: + if (index == orbSlot && !stack.isEmpty() && stack.getItem() instanceof IBloodOrb) { + return true; + } else if (index == toolSlot) { + return true; //TODO: + } else { + return true; } - } - return getAccessibleInputSlots(direction).contains(index); + default: + if (this.isSlave) { + TileEntity tile = getWorld().getTileEntity(connectedPos); + if (tile instanceof TileAlchemyTable && !((TileAlchemyTable) tile).isSlave) { + return ((TileAlchemyTable) tile).canExtractItem(index, stack, direction); + } + } + return getAccessibleInputSlots(direction).contains(index); } } - public List getAccessibleInputSlots(EnumFacing direction) - { + public List getAccessibleInputSlots(EnumFacing direction) { List list = new ArrayList<>(); - for (int i = 0; i < 6; i++) - { - if (isInputSlotAccessible(i)) - { + for (int i = 0; i < 6; i++) { + if (isInputSlotAccessible(i)) { list.add(i); } } @@ -228,19 +195,15 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, } @Override - public void update() - { - if (isSlave()) - { + public void update() { + if (isSlave()) { return; } List inputList = new ArrayList<>(); - for (int i = 0; i < 6; i++) - { - if (!getStackInSlot(i).isEmpty()) - { + for (int i = 0; i < 6; i++) { + if (!getStackInSlot(i).isEmpty()) { inputList.add(getStackInSlot(i)); } } @@ -249,31 +212,24 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, // special recipes like dying AlchemyTableRecipe recipe = AlchemyTableRecipeRegistry.getMatchingRecipe(inputList, getWorld(), getPos()); - if (recipe != null && (burnTime > 0 || (!getWorld().isRemote && tier >= recipe.getTierRequired() && this.getContainedLp() >= recipe.getLpDrained()))) - { + if (recipe != null && (burnTime > 0 || (!getWorld().isRemote && tier >= recipe.getTierRequired() && this.getContainedLp() >= recipe.getLpDrained()))) { if (burnTime == 1) notifyUpdate(); - if (canCraft(recipe.getRecipeOutput(inputList))) - { + if (canCraft(recipe.getRecipeOutput(inputList))) { ticksRequired = recipe.getTicksRequired(); burnTime++; - if (burnTime == ticksRequired) - { - if (!getWorld().isRemote) - { + if (burnTime == ticksRequired) { + if (!getWorld().isRemote) { int requiredLp = recipe.getLpDrained(); - if (requiredLp > 0) - { - if (!getWorld().isRemote) - { + if (requiredLp > 0) { + if (!getWorld().isRemote) { consumeLp(requiredLp); } } - if (!getWorld().isRemote) - { + if (!getWorld().isRemote) { craftItem(inputList, recipe); } } @@ -282,34 +238,25 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, IBlockState state = getWorld().getBlockState(pos); getWorld().notifyBlockUpdate(getPos(), state, state, 3); - } else if (burnTime > ticksRequired + 10) - { + } else if (burnTime > ticksRequired + 10) { burnTime = 0; } - } else - { + } else { burnTime = 0; } - } else - { // Simple recipes + } else { // Simple recipes RecipeAlchemyTable recipeAlchemyTable = BloodMagicAPI.INSTANCE.getRecipeRegistrar().getAlchemyTable(inputList); - if (recipeAlchemyTable != null && (burnTime > 0 || (!getWorld().isRemote && tier >= recipeAlchemyTable.getMinimumTier() && getContainedLp() >= recipeAlchemyTable.getSyphon()))) - { + if (recipeAlchemyTable != null && (burnTime > 0 || (!getWorld().isRemote && tier >= recipeAlchemyTable.getMinimumTier() && getContainedLp() >= recipeAlchemyTable.getSyphon()))) { if (burnTime == 1) notifyUpdate(); - if (canCraft(recipeAlchemyTable.getOutput())) - { + if (canCraft(recipeAlchemyTable.getOutput())) { ticksRequired = recipeAlchemyTable.getTicks(); burnTime++; - if (burnTime >= ticksRequired) - { - if (!getWorld().isRemote) - { - if (recipeAlchemyTable.getSyphon() > 0) - { - if (consumeLp(recipeAlchemyTable.getSyphon()) < recipeAlchemyTable.getSyphon()) - { + if (burnTime >= ticksRequired) { + if (!getWorld().isRemote) { + if (recipeAlchemyTable.getSyphon() > 0) { + if (consumeLp(recipeAlchemyTable.getSyphon()) < recipeAlchemyTable.getSyphon()) { //There was not enough LP to craft or there was no orb burnTime = 0; notifyUpdate(); @@ -330,8 +277,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, else outputSlotStack.grow(event.getOutput().getCount()); - for (int i = 0; i < 6; i++) - { + for (int i = 0; i < 6; i++) { ItemStack currentStack = getStackInSlot(i); if (currentStack.getItem().hasContainerItem(currentStack)) setInventorySlotContents(i, currentStack.getItem().getContainerItem(currentStack)); @@ -346,20 +292,17 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, } } } - } else - { + } else { burnTime = 0; } } } - public double getProgressForGui() - { + public double getProgressForGui() { return ((double) burnTime) / ticksRequired; } - private boolean canCraft(ItemStack output) - { + private boolean canCraft(ItemStack output) { ItemStack currentOutputStack = getStackInSlot(outputSlot); if (output.isEmpty()) return false; @@ -371,13 +314,10 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, return result <= getInventoryStackLimit() && result <= currentOutputStack.getMaxStackSize(); } - public int getTierOfOrb() - { + public int getTierOfOrb() { ItemStack orbStack = getStackInSlot(orbSlot); - if (!orbStack.isEmpty()) - { - if (orbStack.getItem() instanceof IBloodOrb) - { + if (!orbStack.isEmpty()) { + if (orbStack.getItem() instanceof IBloodOrb) { BloodOrb orb = ((IBloodOrb) orbStack.getItem()).getOrb(orbStack); return orb == null ? 0 : orb.getTier(); } @@ -386,16 +326,12 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, return 0; } - public int getContainedLp() - { + public int getContainedLp() { ItemStack orbStack = getStackInSlot(orbSlot); - if (!orbStack.isEmpty()) - { - if (orbStack.getItem() instanceof IBloodOrb) - { + if (!orbStack.isEmpty()) { + if (orbStack.getItem() instanceof IBloodOrb) { Binding binding = ((IBindable) orbStack.getItem()).getBinding(orbStack); - if (binding == null) - { + if (binding == null) { return 0; } @@ -408,11 +344,9 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, return 0; } - public void craftItem(List inputList, AlchemyTableRecipe recipe) - { + public void craftItem(List inputList, AlchemyTableRecipe recipe) { ItemStack outputStack = recipe.getRecipeOutput(inputList); - if (this.canCraft(outputStack)) - { + if (this.canCraft(outputStack)) { ItemStack currentOutputStack = getStackInSlot(outputSlot); ItemStack[] inputs = new ItemStack[0]; @@ -423,11 +357,9 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, MinecraftForge.EVENT_BUS.post(event); outputStack = event.getOutput(); - if (currentOutputStack.isEmpty()) - { + if (currentOutputStack.isEmpty()) { setInventorySlotContents(outputSlot, outputStack); - } else if (ItemHandlerHelper.canItemStacksStack(outputStack, currentOutputStack)) - { + } else if (ItemHandlerHelper.canItemStacksStack(outputStack, currentOutputStack)) { currentOutputStack.grow(outputStack.getCount()); } @@ -435,16 +367,12 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, } } - public int consumeLp(int requested) - { + public int consumeLp(int requested) { ItemStack orbStack = getStackInSlot(orbSlot); - if (!orbStack.isEmpty()) - { - if (orbStack.getItem() instanceof IBloodOrb) - { - if (NetworkHelper.syphonFromContainer(orbStack, SoulTicket.item(orbStack, world, pos, requested))) - { + if (!orbStack.isEmpty()) { + if (orbStack.getItem() instanceof IBloodOrb) { + if (NetworkHelper.syphonFromContainer(orbStack, SoulTicket.item(orbStack, world, pos, requested))) { return requested; } } @@ -453,64 +381,52 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, return 0; } - public void consumeInventory(AlchemyTableRecipe recipe) - { + public void consumeInventory(AlchemyTableRecipe recipe) { ItemStack[] input = new ItemStack[6]; - for (int i = 0; i < 6; i++) - { + for (int i = 0; i < 6; i++) { input[i] = getStackInSlot(i); } ItemStack[] result = recipe.getRemainingItems(input); - for (int i = 0; i < 6; i++) - { + for (int i = 0; i < 6; i++) { setInventorySlotContents(i, result[i]); } } - public EnumFacing getDirection() - { + public EnumFacing getDirection() { return direction; } - public boolean isSlave() - { + public boolean isSlave() { return isSlave; } - public int getBurnTime() - { + public int getBurnTime() { return burnTime; } - public int getTicksRequired() - { + public int getTicksRequired() { return ticksRequired; } - public BlockPos getConnectedPos() - { + public BlockPos getConnectedPos() { return connectedPos; } - public boolean[] getBlockedSlots() - { + public boolean[] getBlockedSlots() { return blockedSlots; } - public static int getOrbSlot() - { + public static int getOrbSlot() { return orbSlot; } - public static int getToolSlot() - { + public static int getToolSlot() { return toolSlot; } - public static int getOutputSlot() - { + public static int getOutputSlot() { return outputSlot; } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java index 7685e0fc..52ff0be5 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java @@ -204,7 +204,7 @@ public class TileDemonCrucible extends TileInventory implements ITickable, IDemo @Override public boolean canInsertItem(int index, ItemStack stack, EnumFacing direction) { - return !stack.isEmpty() && (stack.getItem() instanceof IDemonWillGem || stack.getItem() instanceof IDiscreteDemonWill); + return !stack.isEmpty() && inventory.get(0).isEmpty() && (stack.getItem() instanceof IDemonWillGem || stack.getItem() instanceof IDiscreteDemonWill); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java index 827e31b0..9d2e5c4e 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java @@ -12,8 +12,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.MathHelper; -public class TileDemonCrystal extends TileTicking -{ +public class TileDemonCrystal extends TileTicking { public static final double sameWillConversionRate = 50; public static final double defaultWillConversionRate = 100; public static final double timeDelayForWrongWill = 0.6; @@ -25,45 +24,35 @@ public class TileDemonCrystal extends TileTicking public int crystalCount = 1; public EnumFacing placement = EnumFacing.UP; //Side that this crystal is placed on. - public TileDemonCrystal() - { + public TileDemonCrystal() { this.crystalCount = 1; } @Override - public void onUpdate() - { - if (getWorld().isRemote) - { + public void onUpdate() { + if (getWorld().isRemote) { return; } internalCounter++; - if (internalCounter % 20 == 0 && crystalCount < 7) - { + if (internalCounter % 20 == 0 && crystalCount < 7) { EnumDemonWillType type = getType(); double value = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, type); - if (type != EnumDemonWillType.DEFAULT) - { - if (value >= 0.5) - { + if (type != EnumDemonWillType.DEFAULT) { + if (value >= 0.5) { double nextProgress = getCrystalGrowthPerSecond(value); progressToNextCrystal += WorldDemonWillHandler.drainWill(getWorld(), getPos(), type, nextProgress * sameWillConversionRate, true) / sameWillConversionRate; - } else - { + } else { value = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, EnumDemonWillType.DEFAULT); - if (value > 0.5) - { + if (value > 0.5) { double nextProgress = getCrystalGrowthPerSecond(value) * timeDelayForWrongWill; progressToNextCrystal += WorldDemonWillHandler.drainWill(getWorld(), getPos(), EnumDemonWillType.DEFAULT, nextProgress * defaultWillConversionRate, true) / defaultWillConversionRate; } } - } else - { - if (value > 0.5) - { + } else { + if (value > 0.5) { double nextProgress = getCrystalGrowthPerSecond(value); progressToNextCrystal += WorldDemonWillHandler.drainWill(getWorld(), getPos(), type, nextProgress * sameWillConversionRate, true) / sameWillConversionRate; @@ -84,17 +73,14 @@ public class TileDemonCrystal extends TileTicking * Encourages the crystal to grow by a large percentage by telling it to * drain will from the aura. * - * @param willDrain - * The amount of drain that is needed for the crystal to grow - * successfully for the desired amount. Can be more than the base - * amount. + * @param willDrain The amount of drain that is needed for the crystal to grow + * successfully for the desired amount. Can be more than the base + * amount. * @param progressPercentage * @return percentage actually grown. */ - public double growCrystalWithWillAmount(double willDrain, double progressPercentage) - { - if (crystalCount >= 7) - { + public double growCrystalWithWillAmount(double willDrain, double progressPercentage) { + if (crystalCount >= 7) { return 0; } @@ -104,8 +90,7 @@ public class TileDemonCrystal extends TileTicking double value = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, type); double percentDrain = willDrain <= 0 ? 1 : Math.min(1, value / willDrain); - if (percentDrain <= 0) - { + if (percentDrain <= 0) { return 0; } @@ -118,15 +103,12 @@ public class TileDemonCrystal extends TileTicking return percentDrain * progressPercentage; } - public EnumDemonWillType getType() - { + public EnumDemonWillType getType() { return EnumDemonWillType.values()[this.getBlockMetadata()]; } - public void checkAndGrowCrystal() - { - if (progressToNextCrystal >= 1 && internalCounter % 100 == 0) - { + public void checkAndGrowCrystal() { + if (progressToNextCrystal >= 1 && internalCounter % 100 == 0) { progressToNextCrystal--; crystalCount++; markDirty(); @@ -134,20 +116,16 @@ public class TileDemonCrystal extends TileTicking } } - public double getMaxWillForCrystal() - { + public double getMaxWillForCrystal() { return 50; } - public boolean dropSingleCrystal() - { - if (!getWorld().isRemote && crystalCount > 1) - { + public boolean dropSingleCrystal() { + if (!getWorld().isRemote && crystalCount > 1) { IBlockState state = getWorld().getBlockState(pos); EnumDemonWillType type = state.getValue(BlockDemonCrystal.TYPE); ItemStack stack = BlockDemonCrystal.getItemStackDropped(type, 1); - if (!stack.isEmpty()) - { + if (!stack.isEmpty()) { crystalCount--; InventoryHelper.spawnItemStack(getWorld(), pos.getX(), pos.getY(), pos.getZ(), stack); notifyUpdate(); @@ -158,19 +136,16 @@ public class TileDemonCrystal extends TileTicking return false; } - public double getCrystalGrowthPerSecond(double will) - { + public double getCrystalGrowthPerSecond(double will) { return 1.0 / 200 * Math.sqrt(will / 200); } - public int getCrystalCountForRender() - { + public int getCrystalCountForRender() { return MathHelper.clamp(crystalCount - 1, 0, 6); } @Override - public void deserialize(NBTTagCompound tag) - { + public void deserialize(NBTTagCompound tag) { holder.readFromNBT(tag, "Will"); crystalCount = tag.getInteger("crystalCount"); placement = EnumFacing.byIndex(tag.getInteger("placement")); @@ -178,8 +153,7 @@ public class TileDemonCrystal extends TileTicking } @Override - public NBTTagCompound serialize(NBTTagCompound tag) - { + public NBTTagCompound serialize(NBTTagCompound tag) { holder.writeToNBT(tag, "Will"); tag.setInteger("crystalCount", crystalCount); tag.setInteger("placement", placement.getIndex()); @@ -187,23 +161,19 @@ public class TileDemonCrystal extends TileTicking return tag; } - public int getCrystalCount() - { + public int getCrystalCount() { return crystalCount; } - public void setCrystalCount(int crystalCount) - { + public void setCrystalCount(int crystalCount) { this.crystalCount = crystalCount; } - public EnumFacing getPlacement() - { + public EnumFacing getPlacement() { return placement; } - public void setPlacement(EnumFacing placement) - { + public void setPlacement(EnumFacing placement) { this.placement = placement; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java index 0fd56f0c..e462b767 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java @@ -11,8 +11,7 @@ import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.soul.IDemonWillConduit; import WayofTime.bloodmagic.tile.base.TileTicking; -public class TileDemonCrystallizer extends TileTicking implements IDemonWillConduit -{ +public class TileDemonCrystallizer extends TileTicking implements IDemonWillConduit { public static final int maxWill = 100; public static final double drainRate = 1; public static final double willToFormCrystal = 99; @@ -21,16 +20,13 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond public DemonWillHolder holder = new DemonWillHolder(); public double internalCounter = 0; - public TileDemonCrystallizer() - { + public TileDemonCrystallizer() { } @Override - public void onUpdate() - { - if (getWorld().isRemote) - { + public void onUpdate() { + if (getWorld().isRemote) { return; } @@ -39,15 +35,11 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond { EnumDemonWillType highestType = WorldDemonWillHandler.getHighestDemonWillType(getWorld(), pos); double amount = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, highestType); - if (amount >= willToFormCrystal) - { + if (amount >= willToFormCrystal) { internalCounter += getCrystalFormationRate(amount); - if (internalCounter >= totalFormationTime) - { - if (WorldDemonWillHandler.drainWill(getWorld(), getPos(), highestType, willToFormCrystal, false) >= willToFormCrystal) - { - if (formCrystal(highestType, offsetPos)) - { + if (internalCounter >= totalFormationTime) { + if (WorldDemonWillHandler.drainWill(getWorld(), getPos(), highestType, willToFormCrystal, false) >= willToFormCrystal) { + if (formCrystal(highestType, offsetPos)) { WorldDemonWillHandler.drainWill(getWorld(), getPos(), highestType, willToFormCrystal, true); internalCounter = 0; } @@ -57,12 +49,10 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond } } - public boolean formCrystal(EnumDemonWillType type, BlockPos position) - { + public boolean formCrystal(EnumDemonWillType type, BlockPos position) { getWorld().setBlockState(position, RegistrarBloodMagicBlocks.DEMON_CRYSTAL.getStateFromMeta(type.ordinal())); TileEntity tile = getWorld().getTileEntity(position); - if (tile instanceof TileDemonCrystal) - { + if (tile instanceof TileDemonCrystal) { ((TileDemonCrystal) tile).setPlacement(EnumFacing.UP); return true; } @@ -70,21 +60,18 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond return false; } - public double getCrystalFormationRate(double currentWill) - { + public double getCrystalFormationRate(double currentWill) { return 1; } @Override - public void deserialize(NBTTagCompound tag) - { + public void deserialize(NBTTagCompound tag) { holder.readFromNBT(tag, "Will"); internalCounter = tag.getDouble("internalCounter"); } @Override - public NBTTagCompound serialize(NBTTagCompound tag) - { + public NBTTagCompound serialize(NBTTagCompound tag) { holder.writeToNBT(tag, "Will"); tag.setDouble("internalCounter", internalCounter); return tag; @@ -93,26 +80,21 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond // IDemonWillConduit @Override - public int getWeight() - { + public int getWeight() { return 10; } @Override - public double fillDemonWill(EnumDemonWillType type, double amount, boolean doFill) - { - if (amount <= 0) - { + public double fillDemonWill(EnumDemonWillType type, double amount, boolean doFill) { + if (amount <= 0) { return 0; } - if (!canFill(type)) - { + if (!canFill(type)) { return 0; } - if (!doFill) - { + if (!doFill) { return Math.min(maxWill - holder.getWill(type), amount); } @@ -120,17 +102,14 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond } @Override - public double drainDemonWill(EnumDemonWillType type, double amount, boolean doDrain) - { + public double drainDemonWill(EnumDemonWillType type, double amount, boolean doDrain) { double drained = amount; double current = holder.getWill(type); - if (current < drained) - { + if (current < drained) { drained = current; } - if (doDrain) - { + if (doDrain) { return holder.drainWill(type, amount); } @@ -138,20 +117,17 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond } @Override - public boolean canFill(EnumDemonWillType type) - { + public boolean canFill(EnumDemonWillType type) { return true; } @Override - public boolean canDrain(EnumDemonWillType type) - { + public boolean canDrain(EnumDemonWillType type) { return true; } @Override - public double getCurrentWill(EnumDemonWillType type) - { + public double getCurrentWill(EnumDemonWillType type) { return holder.getWill(type); } } \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java index 46e6332d..88ae398b 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java @@ -32,6 +32,7 @@ import javax.annotation.Nullable; import java.util.*; public class TileMasterRitualStone extends TileTicking implements IMasterRitualStone { + protected final Map modableRangeMap = new HashMap<>(); private UUID owner; private SoulNetwork cachedNetwork; private boolean active; @@ -42,7 +43,6 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS private EnumFacing direction = EnumFacing.NORTH; private boolean inverted; private List currentActiveWillConfig = new ArrayList<>(); - protected final Map modableRangeMap = new HashMap<>(); @Override public void onUpdate() { @@ -425,13 +425,27 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS return null; } + @Override public void addBlockRange(String range, AreaDescriptor defaultRange) { - modableRangeMap.put(range, defaultRange); + modableRangeMap.putIfAbsent(range, defaultRange.copy()); } + @Override public void addBlockRanges(Map blockRanges) { for (Map.Entry entry : blockRanges.entrySet()) { - modableRangeMap.put(entry.getKey(), entry.getValue()); + modableRangeMap.putIfAbsent(entry.getKey(), entry.getValue().copy()); + } + } + + @Override + public void setBlockRange(String range, AreaDescriptor defaultRange) { + modableRangeMap.put(range, defaultRange.copy()); + } + + @Override + public void setBlockRanges(Map blockRanges) { + for (Map.Entry entry : blockRanges.entrySet()) { + modableRangeMap.put(entry.getKey(), entry.getValue().copy()); } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java b/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java index 11b80f2e..ea0558b6 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java @@ -42,7 +42,7 @@ public class TileMimic extends TileInventory implements ITickable { public NBTTagCompound tileTag = new NBTTagCompound(); public TileEntity mimicedTile = null; IBlockState stateOfReplacedBlock = Blocks.AIR.getDefaultState(); - + public int playerCheckRadius = 5; public int potionSpawnRadius = 5; public int potionSpawnInterval = 40; @@ -137,7 +137,7 @@ public class TileMimic extends TileInventory implements ITickable { Utils.insertItemToTile(this, player, 0); ItemStack stack = getStackInSlot(0); - if(stateOfReplacedBlock == Blocks.AIR.getDefaultState()) { + if (stateOfReplacedBlock == Blocks.AIR.getDefaultState()) { if (!stack.isEmpty() && stack.getItem() instanceof ItemBlock) { Block block = ((ItemBlock) stack.getItem()).getBlock(); stateOfReplacedBlock = block.getDefaultState(); @@ -273,7 +273,7 @@ public class TileMimic extends TileInventory implements ITickable { tag.setInteger("playerCheckRadius", playerCheckRadius); tag.setInteger("potionSpawnRadius", potionSpawnRadius); tag.setInteger("potionSpawnInterval", potionSpawnInterval); - tag.setString("stateOfReplacedBlock",stateOfReplacedBlock.toString()); + tag.setString("stateOfReplacedBlock", stateOfReplacedBlock.toString()); return tag; } @@ -296,11 +296,11 @@ public class TileMimic extends TileInventory implements ITickable { public IBlockState getReplacedState() { return stateOfReplacedBlock; } - + public void setReplacedState(IBlockState state) { stateOfReplacedBlock = state; } - + @Override public boolean isItemValidForSlot(int slot, ItemStack itemstack) { return slot == 0 && dropItemsOnBreak; @@ -312,7 +312,7 @@ public class TileMimic extends TileInventory implements ITickable { replaceMimicWithBlockActual(world, pos, mimic.getStackInSlot(0), mimic.tileTag, mimic.stateOfReplacedBlock); } - + public static boolean replaceMimicWithBlockActual(World world, BlockPos pos, ItemStack stack, NBTTagCompound tileTag, IBlockState replacementState) { if (!stack.isEmpty() && stack.getItem() instanceof ItemBlock) { Block block = ((ItemBlock) stack.getItem()).getBlock(); diff --git a/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java b/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java index c1d2007f..fc9552ad 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java @@ -29,7 +29,7 @@ public class TilePhantomBlock extends TileTicking { @Override public void onUpdate() { - if(!world.isRemote) { + if (!world.isRemote) { EntityPlayer player = world.getClosestPlayer(getPos().getX(), getPos().getY(), getPos().getZ(), 10.0D, ItemSigilPhantomBridge.IS_PHANTOM_ACTIVE); if (player != null && !player.isSneaking()) return; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java index d3c7caf3..00dd13d9 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java @@ -49,7 +49,7 @@ public class TileTeleposer extends TileInventory implements ITickable { @Override public void update() { - if (!getWorld().isRemote) { + if (!getWorld().isRemote && canInitiateTeleport()) { int currentInput = getWorld().getStrongPower(pos); if (previousInput == 0 && currentInput != 0) { @@ -120,7 +120,7 @@ public class TileTeleposer extends TileInventory implements ITickable { if (!focusWorldEntities.isEmpty()) { for (Entity entity : focusWorldEntities) { - TeleportQueue.getInstance().addITeleport(new Teleports.TeleportSameDim(new BlockPos(entity.posX - pos.getX() + focusPos.getX(), entity.posY - pos.getY() + focusPos.getY(), entity.posZ - pos.getZ() + focusPos.getZ()), entity, bindingOwnerID, true)); + TeleportQueue.getInstance().addITeleport(new Teleports.TeleportSameDim(new BlockPos(entity.posX - focusPos.getX() + pos.getX(), entity.posY - focusPos.getY() + pos.getY(), entity.posZ - focusPos.getZ() + pos.getZ()), entity, bindingOwnerID, true)); } } @@ -133,7 +133,7 @@ public class TileTeleposer extends TileInventory implements ITickable { if (!focusWorldEntities.isEmpty()) { for (Entity entity : focusWorldEntities) { - TeleportQueue.getInstance().addITeleport(new Teleports.TeleportToDim(new BlockPos(entity.posX - pos.getX() + focusPos.getX(), entity.posY - pos.getY() + focusPos.getY(), entity.posZ - pos.getZ() + focusPos.getZ()), entity, bindingOwnerID, focusWorld, getWorld().provider.getDimension(), true)); + TeleportQueue.getInstance().addITeleport(new Teleports.TeleportToDim(new BlockPos(entity.posX - focusPos.getX() + pos.getX(), entity.posY - focusPos.getY() + pos.getY(), entity.posZ - focusPos.getZ() + pos.getZ()), entity, bindingOwnerID, focusWorld, getWorld().provider.getDimension(), true)); } } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java index 51318fdc..afbb3410 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java @@ -16,8 +16,7 @@ import net.minecraft.world.World; import java.util.*; import java.util.Map.Entry; -public class TileMasterRoutingNode extends TileInventory implements IMasterRoutingNode, ITickable -{ +public class TileMasterRoutingNode extends TileInventory implements IMasterRoutingNode, ITickable { public static final int tickRate = 20; private int currentInput; // A list of connections @@ -26,16 +25,13 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti private List outputNodeList = new LinkedList<>(); private List inputNodeList = new LinkedList<>(); - public TileMasterRoutingNode() - { + public TileMasterRoutingNode() { super(0, "masterRoutingNode"); } @Override - public void update() - { - if (!getWorld().isRemote) - { + public void update() { + if (!getWorld().isRemote) { // currentInput = getWorld().isBlockIndirectlyGettingPowered(pos); currentInput = getWorld().getStrongPower(pos); @@ -50,31 +46,23 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti Map> outputMap = new TreeMap<>(); Map> outputFluidMap = new TreeMap<>(); - for (BlockPos outputPos : outputNodeList) - { + for (BlockPos outputPos : outputNodeList) { TileEntity outputTile = getWorld().getTileEntity(outputPos); - if (this.isConnected(new LinkedList<>(), outputPos)) - { - if (outputTile instanceof IOutputItemRoutingNode) - { + if (this.isConnected(new LinkedList<>(), outputPos)) { + if (outputTile instanceof IOutputItemRoutingNode) { IOutputItemRoutingNode outputNode = (IOutputItemRoutingNode) outputTile; - for (EnumFacing facing : EnumFacing.VALUES) - { - if (!outputNode.isInventoryConnectedToSide(facing) || !outputNode.isOutput(facing)) - { + for (EnumFacing facing : EnumFacing.VALUES) { + if (!outputNode.isInventoryConnectedToSide(facing) || !outputNode.isOutput(facing)) { continue; } IItemFilter filter = outputNode.getOutputFilterForSide(facing); - if (filter != null) - { + if (filter != null) { int priority = outputNode.getPriority(facing); - if (outputMap.containsKey(priority)) - { + if (outputMap.containsKey(priority)) { outputMap.get(priority).add(filter); - } else - { + } else { List filterList = new LinkedList<>(); filterList.add(filter); outputMap.put(priority, filterList); @@ -83,26 +71,20 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } } - if (outputTile instanceof IOutputFluidRoutingNode) - { + if (outputTile instanceof IOutputFluidRoutingNode) { IOutputFluidRoutingNode outputNode = (IOutputFluidRoutingNode) outputTile; - for (EnumFacing facing : EnumFacing.VALUES) - { - if (!outputNode.isTankConnectedToSide(facing) || !outputNode.isFluidOutput(facing)) - { + for (EnumFacing facing : EnumFacing.VALUES) { + if (!outputNode.isTankConnectedToSide(facing) || !outputNode.isFluidOutput(facing)) { continue; } IFluidFilter filter = outputNode.getOutputFluidFilterForSide(facing); - if (filter != null) - { + if (filter != null) { int priority = outputNode.getPriority(facing); - if (outputFluidMap.containsKey(priority)) - { + if (outputFluidMap.containsKey(priority)) { outputFluidMap.get(priority).add(filter); - } else - { + } else { List filterList = new LinkedList<>(); filterList.add(filter); outputFluidMap.put(priority, filterList); @@ -116,31 +98,23 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti Map> inputMap = new TreeMap<>(); Map> inputFluidMap = new TreeMap<>(); - for (BlockPos inputPos : inputNodeList) - { + for (BlockPos inputPos : inputNodeList) { TileEntity inputTile = getWorld().getTileEntity(inputPos); - if (this.isConnected(new LinkedList<>(), inputPos)) - { - if (inputTile instanceof IInputItemRoutingNode) - { + if (this.isConnected(new LinkedList<>(), inputPos)) { + if (inputTile instanceof IInputItemRoutingNode) { IInputItemRoutingNode inputNode = (IInputItemRoutingNode) inputTile; - for (EnumFacing facing : EnumFacing.VALUES) - { - if (!inputNode.isInventoryConnectedToSide(facing) || !inputNode.isInput(facing)) - { + for (EnumFacing facing : EnumFacing.VALUES) { + if (!inputNode.isInventoryConnectedToSide(facing) || !inputNode.isInput(facing)) { continue; } IItemFilter filter = inputNode.getInputFilterForSide(facing); - if (filter != null) - { + if (filter != null) { int priority = inputNode.getPriority(facing); - if (inputMap.containsKey(priority)) - { + if (inputMap.containsKey(priority)) { inputMap.get(priority).add(filter); - } else - { + } else { List filterList = new LinkedList<>(); filterList.add(filter); inputMap.put(priority, filterList); @@ -149,26 +123,20 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } } - if (inputTile instanceof IInputFluidRoutingNode) - { + if (inputTile instanceof IInputFluidRoutingNode) { IInputFluidRoutingNode inputNode = (IInputFluidRoutingNode) inputTile; - for (EnumFacing facing : EnumFacing.VALUES) - { - if (!inputNode.isTankConnectedToSide(facing) || !inputNode.isFluidInput(facing)) - { + for (EnumFacing facing : EnumFacing.VALUES) { + if (!inputNode.isTankConnectedToSide(facing) || !inputNode.isFluidInput(facing)) { continue; } IFluidFilter filter = inputNode.getInputFluidFilterForSide(facing); - if (filter != null) - { + if (filter != null) { int priority = inputNode.getPriority(facing); - if (inputFluidMap.containsKey(priority)) - { + if (inputFluidMap.containsKey(priority)) { inputFluidMap.get(priority).add(filter); - } else - { + } else { List filterList = new LinkedList<>(); filterList.add(filter); inputFluidMap.put(priority, filterList); @@ -182,19 +150,14 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti int maxTransfer = this.getMaxTransferForDemonWill(WorldDemonWillHandler.getCurrentWill(getWorld(), pos, EnumDemonWillType.DEFAULT)); int maxFluidTransfer = 1000; - for (Entry> outputEntry : outputMap.entrySet()) - { + for (Entry> outputEntry : outputMap.entrySet()) { List outputList = outputEntry.getValue(); - for (IItemFilter outputFilter : outputList) - { - for (Entry> inputEntry : inputMap.entrySet()) - { + for (IItemFilter outputFilter : outputList) { + for (Entry> inputEntry : inputMap.entrySet()) { List inputList = inputEntry.getValue(); - for (IItemFilter inputFilter : inputList) - { + for (IItemFilter inputFilter : inputList) { maxTransfer -= inputFilter.transferThroughInputFilter(outputFilter, maxTransfer); - if (maxTransfer <= 0) - { + if (maxTransfer <= 0) { return; } } @@ -202,19 +165,14 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } } - for (Entry> outputEntry : outputFluidMap.entrySet()) - { + for (Entry> outputEntry : outputFluidMap.entrySet()) { List outputList = outputEntry.getValue(); - for (IFluidFilter outputFilter : outputList) - { - for (Entry> inputEntry : inputFluidMap.entrySet()) - { + for (IFluidFilter outputFilter : outputList) { + for (Entry> inputEntry : inputFluidMap.entrySet()) { List inputList = inputEntry.getValue(); - for (IFluidFilter inputFilter : inputList) - { + for (IFluidFilter inputFilter : inputList) { maxFluidTransfer -= inputFilter.transferThroughInputFilter(outputFilter, maxFluidTransfer); - if (maxFluidTransfer <= 0) - { + if (maxFluidTransfer <= 0) { return; } } @@ -223,18 +181,15 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } } - public int getMaxTransferForDemonWill(double will) - { + public int getMaxTransferForDemonWill(double will) { return 64; } @Override - public NBTTagCompound serialize(NBTTagCompound tag) - { + public NBTTagCompound serialize(NBTTagCompound tag) { super.serialize(tag); NBTTagList tags = new NBTTagList(); - for (BlockPos pos : generalNodeList) - { + for (BlockPos pos : generalNodeList) { NBTTagCompound posTag = new NBTTagCompound(); posTag.setInteger(Constants.NBT.X_COORD, pos.getX()); posTag.setInteger(Constants.NBT.Y_COORD, pos.getY()); @@ -244,8 +199,7 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti tag.setTag(Constants.NBT.ROUTING_MASTER_GENERAL, tags); tags = new NBTTagList(); - for (BlockPos pos : inputNodeList) - { + for (BlockPos pos : inputNodeList) { NBTTagCompound posTag = new NBTTagCompound(); posTag.setInteger(Constants.NBT.X_COORD, pos.getX()); posTag.setInteger(Constants.NBT.Y_COORD, pos.getY()); @@ -255,8 +209,7 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti tag.setTag(Constants.NBT.ROUTING_MASTER_INPUT, tags); tags = new NBTTagList(); - for (BlockPos pos : outputNodeList) - { + for (BlockPos pos : outputNodeList) { NBTTagCompound posTag = new NBTTagCompound(); posTag.setInteger(Constants.NBT.X_COORD, pos.getX()); posTag.setInteger(Constants.NBT.Y_COORD, pos.getY()); @@ -268,29 +221,25 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } @Override - public void deserialize(NBTTagCompound tag) - { + public void deserialize(NBTTagCompound tag) { super.deserialize(tag); NBTTagList tags = tag.getTagList(Constants.NBT.ROUTING_MASTER_GENERAL, 10); - for (int i = 0; i < tags.tagCount(); i++) - { + for (int i = 0; i < tags.tagCount(); i++) { NBTTagCompound blockTag = tags.getCompoundTagAt(i); BlockPos newPos = new BlockPos(blockTag.getInteger(Constants.NBT.X_COORD), blockTag.getInteger(Constants.NBT.Y_COORD), blockTag.getInteger(Constants.NBT.Z_COORD)); generalNodeList.add(newPos); } tags = tag.getTagList(Constants.NBT.ROUTING_MASTER_INPUT, 10); - for (int i = 0; i < tags.tagCount(); i++) - { + for (int i = 0; i < tags.tagCount(); i++) { NBTTagCompound blockTag = tags.getCompoundTagAt(i); BlockPos newPos = new BlockPos(blockTag.getInteger(Constants.NBT.X_COORD), blockTag.getInteger(Constants.NBT.Y_COORD), blockTag.getInteger(Constants.NBT.Z_COORD)); inputNodeList.add(newPos); } tags = tag.getTagList(Constants.NBT.ROUTING_MASTER_OUTPUT, 10); - for (int i = 0; i < tags.tagCount(); i++) - { + for (int i = 0; i < tags.tagCount(); i++) { NBTTagCompound blockTag = tags.getCompoundTagAt(i); BlockPos newPos = new BlockPos(blockTag.getInteger(Constants.NBT.X_COORD), blockTag.getInteger(Constants.NBT.Y_COORD), blockTag.getInteger(Constants.NBT.Z_COORD)); outputNodeList.add(newPos); @@ -298,16 +247,14 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } @Override - public boolean isConnected(List path, BlockPos nodePos) - { + public boolean isConnected(List path, BlockPos nodePos) { //TODO: Figure out how to make it so the path is obtained // if (!connectionMap.containsKey(nodePos)) // { // return false; // } TileEntity tile = getWorld().getTileEntity(nodePos); - if (!(tile instanceof IRoutingNode)) - { + if (!(tile instanceof IRoutingNode)) { // connectionMap.remove(nodePos); return false; } @@ -316,22 +263,17 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti List connectionList = node.getConnected(); // List testPath = path.subList(0, path.size()); path.add(nodePos); - for (BlockPos testPos : connectionList) - { - if (path.contains(testPos)) - { + for (BlockPos testPos : connectionList) { + if (path.contains(testPos)) { continue; } - if (testPos.equals(this.getPos()) && node.isConnectionEnabled(testPos)) - { + if (testPos.equals(this.getPos()) && node.isConnectionEnabled(testPos)) { // path.clear(); // path.addAll(testPath); return true; - } else if (NodeHelper.isNodeConnectionEnabled(getWorld(), node, testPos)) - { - if (isConnected(path, testPos)) - { + } else if (NodeHelper.isNodeConnectionEnabled(getWorld(), node, testPos)) { + if (isConnected(path, testPos)) { // path.clear(); // path.addAll(testPath); return true; @@ -343,56 +285,44 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } @Override - public boolean isConnectionEnabled(BlockPos testPos) - { + public boolean isConnectionEnabled(BlockPos testPos) { return currentInput <= 0; } @Override - public void addNodeToList(IRoutingNode node) - { + public void addNodeToList(IRoutingNode node) { BlockPos newPos = node.getBlockPos(); - if (!generalNodeList.contains(newPos)) - { + if (!generalNodeList.contains(newPos)) { generalNodeList.add(newPos); } - if (node instanceof IInputItemRoutingNode && !inputNodeList.contains(newPos)) - { + if (node instanceof IInputItemRoutingNode && !inputNodeList.contains(newPos)) { inputNodeList.add(newPos); } - if (node instanceof IOutputItemRoutingNode && !outputNodeList.contains(newPos)) - { + if (node instanceof IOutputItemRoutingNode && !outputNodeList.contains(newPos)) { outputNodeList.add(newPos); } } @Override - public void addConnections(BlockPos pos, List connectionList) - { - for (BlockPos testPos : connectionList) - { + public void addConnections(BlockPos pos, List connectionList) { + for (BlockPos testPos : connectionList) { addConnection(pos, testPos); } } @Override - public void addConnection(BlockPos pos1, BlockPos pos2) - { - if (connectionMap.containsKey(pos1) && !connectionMap.get(pos1).contains(pos2)) - { + public void addConnection(BlockPos pos1, BlockPos pos2) { + if (connectionMap.containsKey(pos1) && !connectionMap.get(pos1).contains(pos2)) { connectionMap.get(pos1).add(pos2); - } else - { + } else { List list = new LinkedList<>(); list.add(pos2); connectionMap.put(pos1, list); } - if (connectionMap.containsKey(pos2) && !connectionMap.get(pos2).contains(pos1)) - { + if (connectionMap.containsKey(pos2) && !connectionMap.get(pos2).contains(pos1)) { connectionMap.get(pos2).add(pos1); - } else - { + } else { List list = new LinkedList<>(); list.add(pos1); connectionMap.put(pos2, list); @@ -400,84 +330,69 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } @Override - public void removeConnection(BlockPos pos1, BlockPos pos2) - { - if (connectionMap.containsKey(pos1)) - { + public void removeConnection(BlockPos pos1, BlockPos pos2) { + if (connectionMap.containsKey(pos1)) { List posList = connectionMap.get(pos1); posList.remove(pos2); - if (posList.isEmpty()) - { + if (posList.isEmpty()) { connectionMap.remove(pos1); } } - if (connectionMap.containsKey(pos2)) - { + if (connectionMap.containsKey(pos2)) { List posList = connectionMap.get(pos2); posList.remove(pos1); - if (posList.isEmpty()) - { + if (posList.isEmpty()) { connectionMap.remove(pos2); } } } @Override - public void connectMasterToRemainingNode(World world, List alreadyChecked, IMasterRoutingNode master) - { + public void connectMasterToRemainingNode(World world, List alreadyChecked, IMasterRoutingNode master) { return; } @Override - public BlockPos getBlockPos() - { + public BlockPos getBlockPos() { return this.getPos(); } @Override - public List getConnected() - { + public List getConnected() { return new LinkedList<>(); } @Override - public BlockPos getMasterPos() - { + public BlockPos getMasterPos() { return this.getPos(); } @Override - public boolean isMaster(IMasterRoutingNode master) - { + public boolean isMaster(IMasterRoutingNode master) { return false; } @Override - public void addConnection(BlockPos pos1) - { + public void addConnection(BlockPos pos1) { // Empty } @Override - public void removeConnection(BlockPos pos1) - { + public void removeConnection(BlockPos pos1) { generalNodeList.remove(pos1); inputNodeList.remove(pos1); outputNodeList.remove(pos1); } @Override - public void removeAllConnections() - { + public void removeAllConnections() { List list = generalNodeList.subList(0, generalNodeList.size()); Iterator itr = list.iterator(); - while (itr.hasNext()) - { + while (itr.hasNext()) { BlockPos testPos = itr.next(); TileEntity tile = getWorld().getTileEntity(testPos); - if (tile instanceof IRoutingNode) - { + if (tile instanceof IRoutingNode) { ((IRoutingNode) tile).removeConnection(pos); getWorld().notifyBlockUpdate(getPos(), getWorld().getBlockState(testPos), getWorld().getBlockState(testPos), 3); } diff --git a/src/main/java/WayofTime/bloodmagic/util/Constants.java b/src/main/java/WayofTime/bloodmagic/util/Constants.java index b368bf9c..7e5eb83f 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Constants.java +++ b/src/main/java/WayofTime/bloodmagic/util/Constants.java @@ -7,10 +7,8 @@ import net.minecraftforge.fml.common.registry.ForgeRegistries; import java.util.Locale; -public class Constants -{ - public static class NBT - { +public class Constants { + public static class NBT { public static final String OWNER_UUID = "ownerUUID"; public static final String OWNER_NAME = "ownerNAME"; public static final String USES = "uses"; @@ -133,13 +131,11 @@ public class Constants public static final String BREATH = "breath"; } - public static class Mod - { + public static class Mod { public static final String DOMAIN = BloodMagic.MODID.toLowerCase(Locale.ENGLISH) + ":"; } - public static final class Gui - { + public static final class Gui { public static final int TELEPOSER_GUI = 0; public static final int SOUL_FORGE_GUI = 1; public static final int ROUTING_NODE_GUI = 2; @@ -148,8 +144,7 @@ public class Constants public static final int SIGIL_HOLDING_GUI = 5; } - public static class Compat - { + public static class Compat { public static final String JEI_CATEGORY_ALTAR = BloodMagic.MODID + ":altar"; public static final String JEI_CATEGORY_BINDING = BloodMagic.MODID + ":binding"; public static final String JEI_CATEGORY_ALCHEMYARRAY = BloodMagic.MODID + ":alchemyArray"; @@ -166,8 +161,7 @@ public class Constants public static final Item THAUMCRAFT_GOGGLES = ForgeRegistries.ITEMS.getValue(new ResourceLocation("Thaumcraft", "goggles")); } - public static class Misc - { + public static class Misc { public static final int POTION_ARRAY_SIZE = 256; public static final float ALTERED_STEP_HEIGHT = 1.00314159f; public static final int NIGHT_VISION_CONSTANT_BEGIN = 30020; diff --git a/src/main/java/WayofTime/bloodmagic/util/ISigilFluidItem.java b/src/main/java/WayofTime/bloodmagic/util/ISigilFluidItem.java index 920b21de..f035728e 100644 --- a/src/main/java/WayofTime/bloodmagic/util/ISigilFluidItem.java +++ b/src/main/java/WayofTime/bloodmagic/util/ISigilFluidItem.java @@ -5,8 +5,10 @@ import net.minecraftforge.fluids.FluidStack; public interface ISigilFluidItem { FluidStack getFluid(ItemStack sigil); + int getCapacity(ItemStack sigil); int fill(ItemStack sigil, FluidStack resource, boolean doFill); + FluidStack drain(ItemStack sigil, int maxDrain, boolean doDrain); } \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/util/PluginUtil.java b/src/main/java/WayofTime/bloodmagic/util/PluginUtil.java index aeed6037..1297d964 100644 --- a/src/main/java/WayofTime/bloodmagic/util/PluginUtil.java +++ b/src/main/java/WayofTime/bloodmagic/util/PluginUtil.java @@ -45,7 +45,7 @@ public class PluginUtil { // Bring core plugin up to top discoveredAnnotations.sort((o1, o2) -> { if (o1.getLeft().getClass() == BloodMagicCorePlugin.class) - return -1; + return -1; return o1.getClass().getCanonicalName().compareToIgnoreCase(o2.getClass().getCanonicalName()); }); @@ -120,8 +120,7 @@ public class PluginUtil { public enum RegistrationStep { PLUGIN_REGISTER(p -> p.getLeft().register(BloodMagicAPI.INSTANCE)), - RECIPE_REGISTER(p -> p.getLeft().registerRecipes(BloodMagicAPI.INSTANCE.getRecipeRegistrar())) - ; + RECIPE_REGISTER(p -> p.getLeft().registerRecipes(BloodMagicAPI.INSTANCE.getRecipeRegistrar())); private final Consumer> consumer; diff --git a/src/main/java/WayofTime/bloodmagic/util/StateUtil.java b/src/main/java/WayofTime/bloodmagic/util/StateUtil.java index 03dce756..5c3d35b9 100644 --- a/src/main/java/WayofTime/bloodmagic/util/StateUtil.java +++ b/src/main/java/WayofTime/bloodmagic/util/StateUtil.java @@ -8,30 +8,31 @@ import net.minecraft.init.Blocks; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.common.registry.ForgeRegistries; -public class StateUtil -{ - public static IBlockState parseState(String blockInfo) - { - String[] split = blockInfo.split("\\["); - split[1] = split[1].substring(0, split[1].lastIndexOf("]")); // Make sure brackets are removed from state +public class StateUtil { + public static IBlockState parseState(String state) { + if (state.contains("[")) { + String[] split = state.split("\\["); + split[1] = split[1].substring(0, split[1].lastIndexOf("]")); // Make sure brackets are removed from state - Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(split[0])); // Find the block - if (block == Blocks.AIR) - return Blocks.AIR.getDefaultState(); // The block is air, so we're looking at invalid data + Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(split[0])); + if (block == Blocks.AIR) + return block.getDefaultState(); - BlockStateContainer blockState = block.getBlockState(); - IBlockState returnState = blockState.getBaseState(); + BlockStateContainer blockState = block.getBlockState(); + IBlockState returnState = blockState.getBaseState(); - // Force our values into the state - String[] stateValues = split[1].split(","); // Splits up each value - for (String value : stateValues) - { - String[] valueSplit = value.split("="); // Separates property and value - IProperty property = blockState.getProperty(valueSplit[0]); - if (property != null) - returnState = returnState.withProperty(property, (Comparable) property.parseValue(valueSplit[1]).get()); // Force the property into the state + // Force our values into the state + String[] stateValues = split[1].split(","); // Splits up each value + for (String value : stateValues) { + String[] valueSplit = value.split("="); + IProperty property = blockState.getProperty(valueSplit[0]); + if (property != null) + returnState = returnState.withProperty(property, (Comparable) property.parseValue(valueSplit[1]).get()); + } + + return returnState; + } else { + return ForgeRegistries.BLOCKS.getValue(new ResourceLocation(state)).getDefaultState(); } - - return returnState; } } \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index 90f1d312..26a42fa4 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -1,16 +1,15 @@ package WayofTime.bloodmagic.util; import WayofTime.bloodmagic.altar.ComponentType; -import WayofTime.bloodmagic.iface.IDemonWillViewer; -import WayofTime.bloodmagic.util.helper.NBTHelper; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.iface.IDemonWillViewer; import WayofTime.bloodmagic.network.BloodMagicPacketHandler; import WayofTime.bloodmagic.network.PlayerVelocityPacketProcessor; import WayofTime.bloodmagic.tile.TileInventory; +import WayofTime.bloodmagic.util.helper.NBTHelper; import com.google.common.collect.Iterables; import com.google.common.collect.Maps; import net.minecraft.block.Block; -import net.minecraft.block.BlockLiquid; import net.minecraft.block.BlockPortal; import net.minecraft.block.state.IBlockState; import net.minecraft.enchantment.EnchantmentHelper; @@ -42,7 +41,6 @@ import net.minecraftforge.common.ISpecialArmor; import net.minecraftforge.common.ISpecialArmor.ArmorProperties; import net.minecraftforge.fluids.IFluidBlock; import net.minecraftforge.fml.common.ObfuscationReflectionHelper; -import net.minecraftforge.fml.relauncher.ReflectionHelper; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemHandlerHelper; @@ -799,9 +797,9 @@ public class Utils { return (state instanceof IFluidBlock || state.getMaterial().isLiquid()); } - public static boolean isFlowingLiquid(World world, BlockPos pos, IBlockState state) { + public static boolean isFlowingLiquid(IBlockState state) { Block block = state.getBlock(); - return ((block instanceof IFluidBlock && Math.abs(((IFluidBlock) block).getFilledPercentage(world, pos)) == 1) || (block instanceof BlockLiquid && block.getMetaFromState(state) != 0)); + return isBlockLiquid(state) && !(state == block.getDefaultState()); } public static boolean spawnStackAtBlock(World world, BlockPos pos, @Nullable EnumFacing pushDirection, ItemStack stack) { diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java index 894760a0..0e55d754 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java @@ -30,9 +30,12 @@ import WayofTime.bloodmagic.orb.BloodOrb; import WayofTime.bloodmagic.orb.IBloodOrb; import WayofTime.bloodmagic.potion.BMPotionUtils; import WayofTime.bloodmagic.potion.PotionEventHandlers; +import WayofTime.bloodmagic.ritual.AreaDescriptor; import WayofTime.bloodmagic.ritual.IMasterRitualStone; import WayofTime.bloodmagic.ritual.RitualManager; import WayofTime.bloodmagic.ritual.portal.LocationsHandler; +import WayofTime.bloodmagic.ritual.types.RitualVeilOfEvil; +import WayofTime.bloodmagic.ritual.types.RitualWardOfSacrosanctity; import WayofTime.bloodmagic.soul.DemonWillHolder; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.util.Utils; @@ -74,12 +77,15 @@ import net.minecraftforge.event.entity.living.LivingDropsEvent; import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; import net.minecraftforge.event.entity.living.LivingFallEvent; import net.minecraftforge.event.entity.living.LivingHurtEvent; +import net.minecraftforge.event.entity.living.LivingSpawnEvent; import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.event.entity.player.PlayerPickupXpEvent; import net.minecraftforge.event.world.ExplosionEvent; import net.minecraftforge.event.world.WorldEvent; +import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.eventhandler.Event.Result; import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; @@ -94,6 +100,8 @@ public class GenericHandler { public static Map> filledHandMapMap = new HashMap<>(); private static Map> targetTaskMapMap = new HashMap<>(); private static Map> attackTaskMapMap = new HashMap<>(); + public static Map> preventSpawnMap = new HashMap<>(); + public static Map> forceSpawnMap = new HashMap<>(); public static Set featherRitualSet; @SubscribeEvent @@ -243,9 +251,11 @@ public class GenericHandler { targetTaskMap.remove(animal); attackTaskMap.remove(animal); } - } else if (targetTaskMap.containsKey(animal)) { - targetTaskMap.remove(animal); - attackTaskMap.remove(animal); + } else { + if (targetTaskMap != null) + targetTaskMap.remove(animal); + if (attackTaskMap != null) + attackTaskMap.remove(animal); } } } @@ -361,7 +371,7 @@ public class GenericHandler { BindableHelper.applyBinding(held, player); // Bind item to the player } - // If the binding exists, we'll check if the player's name has changed since they last used it and update that if so. + // If the binding exists, we'll check if the player's name has changed since they last used it and update that if so. } else if (binding.getOwnerId().equals(player.getGameProfile().getId()) && !binding.getOwnerName().equals(player.getGameProfile().getName())) { binding.setOwnerName(player.getGameProfile().getName()); BindableHelper.applyBinding(held, binding); @@ -420,9 +430,9 @@ public class GenericHandler { } @SubscribeEvent - public static void onRitualDeath(LivingDropsEvent event){ - if(!ConfigHandler.values.wellOfSufferingDrops){ - if(event.getSource().equals(RitualManager.RITUAL_DAMAGE)) { + public static void onRitualDeath(LivingDropsEvent event) { + if (!ConfigHandler.values.wellOfSufferingDrops) { + if (event.getSource().equals(RitualManager.RITUAL_DAMAGE)) { event.getDrops().clear(); } } @@ -434,10 +444,12 @@ public class GenericHandler { EntityPlayer player = event.getEntityPlayer(); ItemStack itemstack = EnchantmentHelper.getEnchantedItem(Enchantments.MENDING, player); - if (!itemstack.isEmpty() && itemstack.isItemDamaged()) { - int i = Math.min(xpToDurability(event.getOrb().xpValue), itemstack.getItemDamage()); - event.getOrb().xpValue -= durabilityToXp(i); - itemstack.setItemDamage(itemstack.getItemDamage() - i); + if (!Loader.isModLoaded("unmending")) { + if (!itemstack.isEmpty() && itemstack.isItemDamaged()) { + int i = Math.min(xpToDurability(event.getOrb().xpValue), itemstack.getItemDamage()); + event.getOrb().xpValue -= durabilityToXp(i); + itemstack.setItemDamage(itemstack.getItemDamage() - i); + } } if (!player.getEntityWorld().isRemote) { @@ -459,6 +471,77 @@ public class GenericHandler { return durability / 2; } + // VeilOfEvil, WardOfSacrosanctity + @SubscribeEvent + public static void onLivingSpawnEvent(LivingSpawnEvent.CheckSpawn event) { + World world = event.getWorld(); + + if (!(event.getEntityLiving() instanceof EntityMob)) { + return; + } + + /* WardOfSacrosanctity */ + + if (preventSpawnMap.containsKey(world)) { + Map pMap = preventSpawnMap.get(world); + + if (pMap != null) { + for (Map.Entry entry : pMap.entrySet()) { + IMasterRitualStone masterRitualStone = entry.getKey(); + AreaDescriptor blockRange = entry.getValue(); + + if (masterRitualStone != null && masterRitualStone.isActive() && masterRitualStone.getCurrentRitual() instanceof RitualWardOfSacrosanctity) { + if (blockRange.offset(masterRitualStone.getBlockPos()).isWithinArea(new BlockPos(event.getX(), event.getY(), event.getZ()))) { + switch (event.getResult()) { + case ALLOW: + event.setResult(Result.DEFAULT); + break; + case DEFAULT: + event.setResult(Result.DENY); + break; + default: + break; + } + break; + } + } else { + pMap.remove(masterRitualStone); + } + } + } + } + + /* VeilOfEvil */ + + if (forceSpawnMap.containsKey(world)) { + Map fMap = forceSpawnMap.get(world); + + if (fMap != null) { + for (Map.Entry entry : fMap.entrySet()) { + IMasterRitualStone masterRitualStone = entry.getKey(); + AreaDescriptor blockRange = entry.getValue(); + + if (masterRitualStone != null && masterRitualStone.isActive() && masterRitualStone.getCurrentRitual() instanceof RitualVeilOfEvil) { + if (blockRange.offset(masterRitualStone.getBlockPos()).isWithinArea(new BlockPos(event.getX(), event.getY(), event.getZ()))) { + switch (event.getResult()) { + case DEFAULT: + event.setResult(Result.ALLOW); + break; + case DENY: + event.setResult(Result.DEFAULT); + default: + break; + } + break; + } + } else { + fMap.remove(masterRitualStone); + } + } + } + } + } + @SubscribeEvent public static void onWorldLoad(WorldEvent.Load event) { World world = event.getWorld(); @@ -466,6 +549,8 @@ public class GenericHandler { filledHandMapMap.computeIfAbsent(world, k -> new HashMap<>()); attackTaskMapMap.computeIfAbsent(world, k -> new HashMap<>()); targetTaskMapMap.computeIfAbsent(world, k -> new HashMap<>()); + forceSpawnMap.computeIfAbsent(world, k -> new HashMap<>()); + preventSpawnMap.computeIfAbsent(world, k -> new HashMap<>()); PotionEventHandlers.flightListMap.computeIfAbsent(world, k -> new ArrayList<>()); PotionEventHandlers.noGravityListMap.computeIfAbsent(world, k -> new ArrayList<>()); LocationsHandler.verifyIsInitialized(); @@ -474,12 +559,14 @@ public class GenericHandler { @SubscribeEvent public static void onWorldUnload(WorldEvent.Unload event) { World world = event.getWorld(); - bounceMapMap.get(world).clear(); - filledHandMapMap.get(world).clear(); - attackTaskMapMap.get(world).clear(); - targetTaskMapMap.get(world).clear(); - PotionEventHandlers.flightListMap.get(world).clear(); - PotionEventHandlers.noGravityListMap.get(world).clear(); + bounceMapMap.remove(world); + filledHandMapMap.remove(world); + attackTaskMapMap.remove(world); + targetTaskMapMap.remove(world); + forceSpawnMap.remove(world); + preventSpawnMap.remove(world); + PotionEventHandlers.flightListMap.remove(world); + PotionEventHandlers.noGravityListMap.remove(world); } } diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java index 6a701a0f..c60a1c96 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java @@ -1,12 +1,11 @@ package WayofTime.bloodmagic.util.handler.event; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; import WayofTime.bloodmagic.item.soul.ItemSentientBow; import WayofTime.bloodmagic.livingArmour.LivingArmour; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.livingArmour.downgrade.LivingArmourUpgradeCrippledArm; import WayofTime.bloodmagic.livingArmour.downgrade.LivingArmourUpgradeQuenched; import WayofTime.bloodmagic.livingArmour.downgrade.LivingArmourUpgradeSlowHeal; @@ -16,6 +15,7 @@ import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerFallProtect; import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerGrimReaperSprint; import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerJump; import WayofTime.bloodmagic.livingArmour.upgrade.*; +import WayofTime.bloodmagic.util.Constants; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -45,31 +45,24 @@ import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) -public class LivingArmourHandler -{ +public class LivingArmourHandler { @SubscribeEvent - public static void onEntityHealed(LivingHealEvent event) - { - if (event.getEntityLiving() instanceof EntityPlayer) - { + public static void onEntityHealed(LivingHealEvent event) { + if (event.getEntityLiving() instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) event.getEntity(); - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { + if (armour != null) { double modifier = 1; LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.slowHeal", chestStack); - if (upgrade instanceof LivingArmourUpgradeSlowHeal) - { + if (upgrade instanceof LivingArmourUpgradeSlowHeal) { modifier *= ((LivingArmourUpgradeSlowHeal) upgrade).getHealingModifier(); } - if (modifier != 1) - { + if (modifier != 1) { event.setAmount((float) (event.getAmount() * modifier)); } } @@ -78,23 +71,18 @@ public class LivingArmourHandler } @SubscribeEvent - public static void onMiningSpeedCheck(PlayerEvent.BreakSpeed event) - { + public static void onMiningSpeedCheck(PlayerEvent.BreakSpeed event) { EntityPlayer player = event.getEntityPlayer(); - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { + if (armour != null) { double modifier = 1; - for (LivingArmourUpgrade upgrade : armour.upgradeMap.values()) - { + for (LivingArmourUpgrade upgrade : armour.upgradeMap.values()) { modifier *= upgrade.getMiningSpeedModifier(player); } - if (modifier != 1) - { + if (modifier != 1) { event.setNewSpeed((float) (event.getOriginalSpeed() * modifier)); } } @@ -103,31 +91,24 @@ public class LivingArmourHandler // Applies: Storm Trooper @SubscribeEvent - public static void onEntityJoinedWorld(EntityJoinWorldEvent event) - { + public static void onEntityJoinedWorld(EntityJoinWorldEvent event) { Entity owner = null; - if (event.getEntity() instanceof EntityArrow) - { + if (event.getEntity() instanceof EntityArrow) { owner = ((EntityArrow) event.getEntity()).shootingEntity; - } else if (event.getEntity() instanceof EntityThrowable) - { + } else if (event.getEntity() instanceof EntityThrowable) { owner = ((EntityThrowable) event.getEntity()).getThrower(); } - if (owner instanceof EntityPlayer) - { + if (owner instanceof EntityPlayer) { Entity projectile = event.getEntity(); EntityPlayer player = (EntityPlayer) owner; - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { + if (armour != null) { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.stormTrooper", chestStack); - if (upgrade instanceof LivingArmourUpgradeStormTrooper) - { + if (upgrade instanceof LivingArmourUpgradeStormTrooper) { float velocityModifier = (float) (((LivingArmourUpgradeStormTrooper) upgrade).getArrowJiggle(player) * Math.sqrt(projectile.motionX * projectile.motionX + projectile.motionY * projectile.motionY + projectile.motionZ * projectile.motionZ)); projectile.motionX += 2 * (event.getWorld().rand.nextDouble() - 0.5) * velocityModifier; @@ -140,37 +121,28 @@ public class LivingArmourHandler } @SubscribeEvent - public static void onPlayerClick(PlayerInteractEvent event) - { - if (event.isCancelable()) - { + public static void onPlayerClick(PlayerInteractEvent event) { + if (event.isCancelable()) { EntityPlayer player = event.getEntityPlayer(); - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { - if (event.getHand() == EnumHand.OFF_HAND) - { + if (armour != null) { + if (event.getHand() == EnumHand.OFF_HAND) { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.crippledArm", chestStack); - if (upgrade instanceof LivingArmourUpgradeCrippledArm) - { + if (upgrade instanceof LivingArmourUpgradeCrippledArm) { event.setCanceled(true); } } - if (event.getItemStack().getItemUseAction() == EnumAction.DRINK) - { + if (event.getItemStack().getItemUseAction() == EnumAction.DRINK) { ItemStack drinkStack = event.getItemStack(); - if (!(drinkStack.getItem() instanceof ItemSplashPotion)) - { + if (!(drinkStack.getItem() instanceof ItemSplashPotion)) { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.quenched", chestStack); - if (upgrade instanceof LivingArmourUpgradeQuenched) - { + if (upgrade instanceof LivingArmourUpgradeQuenched) { event.setCanceled(true); } } @@ -182,24 +154,19 @@ public class LivingArmourHandler // Applies: Grim Reaper @SubscribeEvent(priority = EventPriority.HIGHEST) - public static void onEntityDeath(LivingDeathEvent event) - { - if (event.getEntityLiving() instanceof EntityPlayer) - { + public static void onEntityDeath(LivingDeathEvent event) { + if (event.getEntityLiving() instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) event.getEntityLiving(); - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { + if (armour != null) { StatTrackerGrimReaperSprint.incrementCounter(armour); LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.grimReaper", chestStack); - if (upgrade instanceof LivingArmourUpgradeGrimReaperSprint && ((LivingArmourUpgradeGrimReaperSprint) upgrade).canSavePlayer(player)) - { + if (upgrade instanceof LivingArmourUpgradeGrimReaperSprint && ((LivingArmourUpgradeGrimReaperSprint) upgrade).canSavePlayer(player)) { ((LivingArmourUpgradeGrimReaperSprint) upgrade).applyEffectOnRebirth(player); event.setCanceled(true); event.setResult(Event.Result.DENY); @@ -213,26 +180,20 @@ public class LivingArmourHandler // Applies: Jump @SubscribeEvent - public static void onJumpEvent(LivingEvent.LivingJumpEvent event) - { - if (event.getEntityLiving() instanceof EntityPlayer) - { + public static void onJumpEvent(LivingEvent.LivingJumpEvent event) { + if (event.getEntityLiving() instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) event.getEntityLiving(); - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { + if (armour != null) { StatTrackerJump.incrementCounter(armour); - if (!player.isSneaking()) - { + if (!player.isSneaking()) { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgradeFromNBT(BloodMagic.MODID + ".upgrade.jump", chestStack); - if (upgrade instanceof LivingArmourUpgradeJump) - { + if (upgrade instanceof LivingArmourUpgradeJump) { player.motionY += ((LivingArmourUpgradeJump) upgrade).getJumpModifier(); } } @@ -243,34 +204,25 @@ public class LivingArmourHandler // Applies: Step Assist, Speed Boost @SubscribeEvent(priority = EventPriority.HIGHEST) - public static void onEntityUpdate(LivingEvent.LivingUpdateEvent event) - { - if (event.getEntityLiving() instanceof EntityPlayer) - { + public static void onEntityUpdate(LivingEvent.LivingUpdateEvent event) { + if (event.getEntityLiving() instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) event.getEntityLiving(); boolean hasAssist = false; - if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.BOOST)) - { + if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.BOOST)) { hasAssist = true; player.stepHeight = Constants.Misc.ALTERED_STEP_HEIGHT; - } else - { - if (LivingArmour.hasFullSet(player)) - { + } else { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmourFromStack(chestStack); - if (armour != null) - { + if (armour != null) { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.stepAssist", chestStack); - if (upgrade instanceof LivingArmourUpgradeStepAssist) - { - if (!player.isSneaking()) - { + if (upgrade instanceof LivingArmourUpgradeStepAssist) { + if (!player.isSneaking()) { player.stepHeight = ((LivingArmourUpgradeStepAssist) upgrade).getStepAssist(); hasAssist = true; - } else - { + } else { player.stepHeight = 0.6F; } } @@ -283,32 +235,20 @@ public class LivingArmourHandler float percentIncrease = 0; - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmourFromStack(chestStack); - if (armour != null) - { + if (armour != null) { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgradeFromNBT(BloodMagic.MODID + ".upgrade.movement", chestStack); - if (upgrade instanceof LivingArmourUpgradeSpeed) - { + if (upgrade instanceof LivingArmourUpgradeSpeed) { percentIncrease += ((LivingArmourUpgradeSpeed) upgrade).getSpeedModifier(); } } } - if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.BOOST)) - { - int i = event.getEntityLiving().getActivePotionEffect(RegistrarBloodMagic.BOOST).getAmplifier(); - { - percentIncrease += (i + 1) * 0.5f; - } - } - - if (percentIncrease > 0 && (player.onGround || player.capabilities.isFlying) && (Math.abs(player.moveForward) > 0 || Math.abs(player.moveStrafing) > 0)) - { - player.travel(player.moveStrafing * percentIncrease, 0, player.moveForward * percentIncrease); + if (percentIncrease != 0 && (player.onGround || player.capabilities.isFlying) && (Math.abs(player.moveForward) > 0 || Math.abs(player.moveStrafing) > 0)) { + player.travel(player.moveStrafing * percentIncrease, player.capabilities.isFlying ? player.moveVertical * percentIncrease : 0, player.moveForward * percentIncrease); } } } @@ -316,8 +256,7 @@ public class LivingArmourHandler // Applies: Arrow Shot // Tracks: Arrow Shot @SubscribeEvent - public static void onArrowFire(ArrowLooseEvent event) - { + public static void onArrowFire(ArrowLooseEvent event) { World world = event.getEntityPlayer().getEntityWorld(); ItemStack stack = event.getBow(); EntityPlayer player = event.getEntityPlayer(); @@ -326,17 +265,14 @@ public class LivingArmourHandler if (world.isRemote) return; - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { + if (armour != null) { StatTrackerArrowShot.incrementCounter(armour); LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.arrowShot", chestStack); - if (upgrade instanceof LivingArmourUpgradeArrowShot) - { + if (upgrade instanceof LivingArmourUpgradeArrowShot) { int charge = event.getCharge(); float velocity = (float) charge / 20.0F; velocity = (velocity * velocity + velocity * 2.0F) / 3.0F; @@ -350,8 +286,7 @@ public class LivingArmourHandler sentientShot = true; } int extraArrows = ((LivingArmourUpgradeArrowShot) upgrade).getExtraArrows(); - for (int n = 0; n < extraArrows; n++) - { + for (int n = 0; n < extraArrows; n++) { ItemStack arrowStack = new ItemStack(Items.ARROW); ItemArrow itemarrow = (ItemArrow) ((stack.getItem() instanceof ItemArrow ? arrowStack.getItem() : Items.ARROW)); EntityArrow entityarrow; @@ -392,21 +327,19 @@ public class LivingArmourHandler } } } - } + } + // Applies: Softfall @SubscribeEvent public static void onPlayerFall(LivingFallEvent event) { - if (event.getEntityLiving() instanceof EntityPlayer) - { + if (event.getEntityLiving() instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) event.getEntityLiving(); - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { + if (armour != null) { StatTrackerFallProtect.incrementCounter(armour, event.getDamageMultiplier() * (event.getDistance() - 3)); LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.fallProtect", chestStack); if (upgrade instanceof LivingArmourUpgradeFallProtect) { @@ -417,17 +350,14 @@ public class LivingArmourHandler } } } - + // Applies: Arrow Shot @SubscribeEvent - public static void onProjectileImpact(ProjectileImpactEvent.Arrow event) - { - if (event.getArrow().removeTag("arrow_shot")) - { + public static void onProjectileImpact(ProjectileImpactEvent.Arrow event) { + if (event.getArrow().removeTag("arrow_shot")) { Entity entity = event.getRayTraceResult().entityHit; - if (entity != null) - { + if (entity != null) { entity.hurtResistantTime = 0; } } diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/IncenseHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/IncenseHelper.java index 559690ee..5059d631 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/IncenseHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/IncenseHelper.java @@ -21,7 +21,7 @@ public class IncenseHelper { data.setDouble(Constants.NBT.CURRENT_INCENSE, amount); } - public static void setMaxIncense(EntityPlayer player, double amount){ + public static void setMaxIncense(EntityPlayer player, double amount) { NBTTagCompound data = player.getEntityData(); data.setDouble(Constants.NBT.MAX_INCENSE, amount); } @@ -38,6 +38,7 @@ public class IncenseHelper { stack = NBTHelper.checkNBT(stack); stack.getTagCompound().setBoolean(Constants.NBT.HAS_MAX_INCENSE, isMax); } + public static boolean getHasMaxIncense(ItemStack stack) { stack = NBTHelper.checkNBT(stack); return stack.getTagCompound().getBoolean(Constants.NBT.HAS_MAX_INCENSE); diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java index bd79a435..c87b8209 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java @@ -115,12 +115,11 @@ public class NetworkHelper { /** * Syphons a player from within a container. * - * @param stack - ItemStack in the Container. - * @param ticket - SoulTicket to syphon + * @param stack - ItemStack in the Container. + * @param ticket - SoulTicket to syphon * @return - If the syphon was successful. */ - public static boolean syphonFromContainer(ItemStack stack, SoulTicket ticket) - { + public static boolean syphonFromContainer(ItemStack stack, SoulTicket ticket) { if (!(stack.getItem() instanceof IBindable)) return false; @@ -131,7 +130,7 @@ public class NetworkHelper { SoulNetwork network = getSoulNetwork(binding); SoulNetworkEvent.Syphon.Item event = new SoulNetworkEvent.Syphon.Item(network, ticket, stack); - return !MinecraftForge.EVENT_BUS.post(event) && network.syphon(event.getTicket(),true) >= ticket.getAmount(); + return !MinecraftForge.EVENT_BUS.post(event) && network.syphon(event.getTicket(), true) >= ticket.getAmount(); } /** diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/PlayerSacrificeHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/PlayerSacrificeHelper.java index 1fc54b05..54ceea6a 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/PlayerSacrificeHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/PlayerSacrificeHelper.java @@ -35,7 +35,7 @@ public class PlayerSacrificeHelper { amount = amount + Math.min(increment, incenseAddition - amount); setPlayerIncense(player, amount); - if(amount == incenseAddition) { + if (amount == incenseAddition) { IncenseHelper.setMaxIncense(player, incenseAddition); } // System.out.println("Amount of incense: " + amount + ", Increment: " + @@ -66,11 +66,15 @@ public class PlayerSacrificeHelper { float sacrificedHealth = health - maxHealth / 10.0f; int lpAdded = (int) (sacrificedHealth * ConfigHandler.values.sacrificialDaggerConversion * getModifier(amount)); - SacrificeKnifeUsedEvent evt = new SacrificeKnifeUsedEvent(player, true, true, (int) sacrificedHealth, lpAdded); - if (MinecraftForge.EVENT_BUS.post(evt)) - return false; + IBloodAltar altar = getAltar(player.getEntityWorld(), player.getPosition()); + if (altar != null) { + SacrificeKnifeUsedEvent evt = new SacrificeKnifeUsedEvent(player, true, true, (int) sacrificedHealth, lpAdded); + if (MinecraftForge.EVENT_BUS.post(evt)) + return false; + + altar.sacrificialDaggerCall(evt.lpAdded, false); + altar.startCycle(); - if (findAndFillAltar(player.getEntityWorld(), player, evt.lpAdded, false)) { player.setHealth(maxHealth / 10.0f); setPlayerIncense(player, 0); player.addPotionEffect(new PotionEffect(RegistrarBloodMagic.SOUL_FRAY, soulFrayDuration)); diff --git a/src/main/resources/assets/bloodmagic/blockstates/altar.json b/src/main/resources/assets/bloodmagic/blockstates/altar.json index 24191a55..7fa4988e 100644 --- a/src/main/resources/assets/bloodmagic/blockstates/altar.json +++ b/src/main/resources/assets/bloodmagic/blockstates/altar.json @@ -8,6 +8,14 @@ }, "variants": { "normal": [{ + } + ], + "powered=true": [ + { + } + ], + "powered=false": [ + { }] } diff --git a/src/main/resources/assets/bloodmagic/lang/de_DE.lang b/src/main/resources/assets/bloodmagic/lang/de_DE.lang index 0cb12242..c6627a6c 100644 --- a/src/main/resources/assets/bloodmagic/lang/de_DE.lang +++ b/src/main/resources/assets/bloodmagic/lang/de_DE.lang @@ -1,20 +1,18 @@ -#Creative Tab -itemGroup.bloodmagic.creativeTab=Blood Magic +# Creative Tab itemGroup.bloodmagic.creativeTabTome=Blood Magic - Upgrades -#Items -item.bloodmagic.activationCrystal.weak.name=Schwacher Aktivierungskristall -item.bloodmagic.activationCrystal.awakened.name=Erweckter Aktivierungskristall -item.bloodmagic.activationCrystal.creative.name=Kreativer Aktivierungskristall +# Items -item.bloodmagic.sacrificialDagger.normal.name=Opferdolch -item.bloodmagic.sacrificialDagger.creative.name=Kreativer Opferdolch item.bloodmagic.pack.selfSacrifice.name=Blutweste item.bloodmagic.pack.sacrifice.name=Vampirische Weste item.bloodmagic.daggerOfSacrifice.name=Opfermesser item.bloodmagic.lavaCrystal.name=Lavakristall +item.bloodmagic.activation_crystal.awakened.name=Erweckter Aktivierungskristall +item.bloodmagic.activation_crystal.creative.name=Kreativer Aktivierungskristall +item.bloodmagic.activation_crystal.weak.name=Schwacher Aktivierungskristall + item.bloodmagic.bound.sword.name=Gebundene Klinge item.bloodmagic.bound.pickaxe.name=Gebundene Spitzhacke item.bloodmagic.bound.axe.name=Gebundene Axt @@ -63,19 +61,21 @@ item.bloodmagic.reagent.virtus.name=Virtus item.bloodmagic.reagent.reductus.name=Reductus item.bloodmagic.reagent.potentia.name=Potentia -item.bloodmagic.bloodShard.weak.name=Schwache Blutscherbe -item.bloodmagic.bloodShard.demon.name=Dämonische Blutscherbe +item.bloodmagic.blood_shard.demonic.name=Dämonische Blutscherbe +item.bloodmagic.blood_shard.weak.name=Schwache Blutscherbe +item.bloodmagic.sacrificial_dagger.creative.name=Kreativer Opferdolch +item.bloodmagic.sacrificial_dagger.normal.name=Opferdolch -item.bloodmagic.baseComponent.reagentWater.name=Wasserreagenz -item.bloodmagic.baseComponent.reagentLava.name=Lavareagenz -item.bloodmagic.baseComponent.reagentAir.name=Luftreagenz -item.bloodmagic.baseComponent.reagentFastMiner.name=Reagenz der Eile -item.bloodmagic.baseComponent.reagentVoid.name=Reagenz der Leere -item.bloodmagic.baseComponent.reagentGrowth.name=Wachstumsreagenz -item.bloodmagic.baseComponent.reagentAffinity.name=Reagenz der elementaren Verbundenheit -item.bloodmagic.baseComponent.reagentSight.name=Sichtreagenz -item.bloodmagic.baseComponent.reagentBinding.name=Bindendes Reagenz -item.bloodmagic.baseComponent.reagentSuppression.name=Verdrängendes Reagenz +item.bloodmagic.baseComponent.reagent_affinity.name=Reagenz der elementaren Verbundenheit +item.bloodmagic.baseComponent.reagent_air.name=Luftreagenz +item.bloodmagic.baseComponent.reagent_binding.name=Bindendes Reagenz +item.bloodmagic.baseComponent.reagent_fast_miner.name=Reagenz der Eile +item.bloodmagic.baseComponent.reagent_growth.name=Wachstumsreagenz +item.bloodmagic.baseComponent.reagent_lava.name=Lavareagenz +item.bloodmagic.baseComponent.reagent_sight.name=Sichtreagenz +item.bloodmagic.baseComponent.reagent_suppression.name=Verdrängendes Reagenz +item.bloodmagic.baseComponent.reagent_void.name=Reagenz der Leere +item.bloodmagic.baseComponent.reagent_water.name=Wasserreagenz item.bloodmagic.baseComponent.reagent_blood_light.name=Blutlampenreagenz item.bloodmagic.baseComponent.reagent_magnetism.name=Magnetismusreagenz item.bloodmagic.baseComponent.reagent_haste.name=Reagenz der Hast @@ -110,29 +110,23 @@ item.bloodmagic.demonCrystal.destructive.name=Kristall zerstörender dämonische item.bloodmagic.demonCrystal.vengeful.name=Kristall rachsüchtiger dämonischer Willenskraft item.bloodmagic.demonCrystal.steadfast.name=Kristall standhafter dämonischer Willenskraft -item.bloodmagic.monsterSoul.base.name=Dämonische Willenskraft +item.bloodmagic.monster_soul.raw.name=Dämonische Willenskraft item.bloodmagic.monster_soul.corrosive.name=Korrosive dämonische Willenskraft item.bloodmagic.monster_soul.destructive.name=Zerstörerische dämonische Willenskraft item.bloodmagic.monster_soul.vengeful.name=Rachsüchtige dämonische Willenskraft item.bloodmagic.monster_soul.steadfast.name=Standhafte dämonische Willenskraft item.bloodmagic.sigil.air.name=Luftsiegel -item.bloodmagic.sigil.bloodLight.name=Siegel der Blutlampe item.bloodmagic.sigil.compression.name=Siegel der Kompression item.bloodmagic.sigil.divination.name=Siegel der Weissagung item.bloodmagic.sigil.water.name=Wassersiegel item.bloodmagic.sigil.lava.name=Lavasiegel item.bloodmagic.sigil.void.name=Siegel der Leere -item.bloodmagic.sigil.greenGrove.name=Siegel des grünen Hains -item.bloodmagic.sigil.elementalAffinity.name=Siegel der elementaren Verbundenheit item.bloodmagic.sigil.haste.name=Siegel der Hast item.bloodmagic.sigil.suppression.name=Siegel der Verdrängung item.bloodmagic.sigil.magnetism.name=Siegel des Magnetismus -item.bloodmagic.sigil.fastMiner.name=Siegel des Eile item.bloodmagic.sigil.seer.name=Siegel des Sehers -item.bloodmagic.sigil.phantomBridge.name=Siegel der Phantombrücke item.bloodmagic.sigil.whirlwind.name=Siegel des Wirbelwindes -item.bloodmagic.sigil.enderSeverance.name=Siegel des Endertrennens item.bloodmagic.sigil.holding.name=Siegel der Aufbewahrung item.bloodmagic.sigil.holding.display=&r%s: &o&n%s item.bloodmagic.sigil.teleposition.name=Telepositionssiegel @@ -140,6 +134,12 @@ item.bloodmagic.sigil.transposition.name=Transpositionssiegel item.bloodmagic.sigil.claw.name=Siegel der Klaue item.bloodmagic.sigil.bounce.name=Siegel der Elastizität item.bloodmagic.sigil.frost.name=Siegel des Winteratems +item.bloodmagic.sigil.blood_light.name=Siegel der Blutlampe +item.bloodmagic.sigil.elemental_affinity.name=Siegel der elementaren Verbundenheit +item.bloodmagic.sigil.ender_severance.name=Siegel des Endertrennens +item.bloodmagic.sigil.fast_miner.name=Siegel des Eile +item.bloodmagic.sigil.green_grove.name=Siegel des grünen Hains +item.bloodmagic.sigil.phantom_bridge.name=Siegel der Phantombrücke item.bloodmagic.livingArmour.helmet.name=Lebender Helm item.bloodmagic.livingArmour.chest.name=Lebender Brustpanzer @@ -152,6 +152,7 @@ item.bloodmagic.sentientArmour.boots.name=Empfindsame Schuhe item.bloodmagic.altarMaker.name=Altarersteller +item.bloodmagic.ritualDismantler.name=Ritual Dismantler item.bloodmagic.ritualDivinernormal.name=Ritualrute item.bloodmagic.ritualDivinerdusk.name=Ritualrute [Abenddämmerung] item.bloodmagic.ritualDivinerdawn.name=Ritualrute [Morgendämmerung] @@ -162,7 +163,6 @@ item.bloodmagic.upgradeTome.name=These zur Verbesserung lebender Rüstung item.bloodmagic.downgradeTome.name=These zur Schwächung lebender Rüstung item.bloodmagic.upgradeTrainer.name=Trainingsband für Lebende Rüstung - item.bloodmagic.sentientSword.name=Empfindsames Schwert item.bloodmagic.soulGem.petty.name=Winziges Juwel des Tartaros item.bloodmagic.soulGem.lesser.name=Niederes Juwel des Tartaros @@ -196,24 +196,32 @@ item.bloodmagic.icarusScroll.name=Ikarusrolle # Blocks tile.bloodmagic.fluid.lifeEssence.name=Lebensessenz +tile.bloodmagic.bloodstone_brick.name=Blutsteinziegel +tile.bloodmagic.bloodstone_tile.name=Großer Blutsteinziegel + +tile.bloodmagic.crystal_brick.name=Kristallklumpenziegel +tile.bloodmagic.crystal_tile.name=Kristallklumpen + +tile.bloodmagic.phantom.name=Phantomblock + tile.bloodmagic.stone.ritual.master.name=Meisterritualstein tile.bloodmagic.stone.ritual.imperfect.name=Imperfekter Ritualstein tile.bloodmagic.stone.ritual.inverted.name=Umgekehrter Meisterritualstein tile.bloodmagic.altar.name=Blutaltar -tile.bloodmagic.alchemyArray.name=&r&fAlchemische Anordnung +tile.bloodmagic.alchemyArray.name=Alchemische Anordnung tile.bloodmagic.rune.blank.name=Leere Rune tile.bloodmagic.rune.speed.name=Geschwindigkeitsrune tile.bloodmagic.rune.efficiency.name=Effizienzrune tile.bloodmagic.rune.sacrifice.name=Rune der Opferung -tile.bloodmagic.rune.selfSacrifice.name=Rune der Selbstopferung tile.bloodmagic.rune.displacement.name=Rune der Verlagerung tile.bloodmagic.rune.capacity.name=Kapazitätsrune -tile.bloodmagic.rune.augCapacity.name=Rune der erweiterten Kapazität tile.bloodmagic.rune.orb.name=Rune der Blutkugel tile.bloodmagic.rune.acceleration.name=Beschleunigungsrune tile.bloodmagic.rune.charging.name=Aufladungsrune +tile.bloodmagic.rune.augmented_capacity.name=Rune der erweiterten Kapazität +tile.bloodmagic.rune.self_sacrifice.name=Rune der Selbstopferung tile.bloodmagic.ritualStone.blank.name=Ritualstein tile.bloodmagic.ritualStone.water.name=Wasserritualstein @@ -223,13 +231,8 @@ tile.bloodmagic.ritualStone.air.name=Luftritualstein tile.bloodmagic.ritualStone.dusk.name=Abenddämmerungsritualstein tile.bloodmagic.ritualStone.dawn.name=Morgendämmerungsritualstein -tile.bloodmagic.bloodstonebrick.large.name=Großer Blutsteinziegel -tile.bloodmagic.bloodstonebrick.brick.name=Blutsteinziegel -tile.bloodmagic.crystal.large.name=Kristallklumpen -tile.bloodmagic.crystal.brick.name=Kristallklumpenziegel tile.bloodmagic.bloodLight.name=Blutlampe tile.bloodmagic.spectralBlock.name=Spektralblock -tile.bloodmagic.phantomBlock.name=Phantomblock tile.bloodmagic.incenseAltar.name=Räucheraltar tile.bloodmagic.teleposer.name=Teleposer @@ -374,6 +377,9 @@ tile.bloodmagic.stairs3.steadfast.name=Standhafte Steintreppe # Fluids fluid.lifeEssence=Lebensessenz +# HUD +hud.bloodmagic.inactive=Inactive + # Tooltips tooltip.bloodmagic.extraInfo=&9-Halte Shift für mehr Info- @@ -387,10 +393,14 @@ tooltip.bloodmagic.tier=Ausbaustufe %d tooltip.bloodmagic.activated=Aktiviert tooltip.bloodmagic.deactivated=Deaktiviert +tooltip.bloodmagic.activation_crystal.awakened=Aktiviert mächtigere Rituale +tooltip.bloodmagic.activation_crystal.creative=Kreativmodus: Aktiviert jedes Ritual +tooltip.bloodmagic.activation_crystal.weak=Aktiviert niedrig-levelige Rituale + tooltip.bloodmagic.sigil.air.desc=&oIch fühl mich schon leichter... -tooltip.bloodmagic.sigil.bloodLight.desc=&oIch sehe ein Licht! tooltip.bloodmagic.sigil.compression.desc=&oDiamanthände tooltip.bloodmagic.sigil.divination.desc=&oSpähe in die Seele +tooltip.bloodmagic.sigil.divination.otherNetwork=Peering into the soul of %s tooltip.bloodmagic.sigil.divination.currentAltarTier=Ausbaustufe: %d tooltip.bloodmagic.sigil.divination.currentEssence=Gespeicherte Lebensessenz: %d LP tooltip.bloodmagic.sigil.divination.currentAltarCapacity=Maximale Kapazität: %d LP @@ -400,11 +410,9 @@ tooltip.bloodmagic.sigil.divination.currentBonus=Momentaner Bonus: +%d%% tooltip.bloodmagic.sigil.water.desc=&oHat jemand nach unendlichem Wasser gefragt? tooltip.bloodmagic.sigil.lava.desc=&oHEISS! NICHT ESSEN! tooltip.bloodmagic.sigil.void.desc=&oBesser als Swiffer®! -tooltip.bloodmagic.sigil.greenGrove.desc=&oUmweltverträglich tooltip.bloodmagic.sigil.magnetism.desc=&oIch habe eine anziehende Persönlichkeit tooltip.bloodmagic.sigil.suppression.desc=&oBesser als Telekinese tooltip.bloodmagic.sigil.haste.desc=&o42 Dosen Koffein später... -tooltip.bloodmagic.sigil.fastMiner.desc=&oHacke wie ein Weltmeister tooltip.bloodmagic.sigil.elementalAffinity.desc=&oAchtung! Fallende Feuerfische tooltip.bloodmagic.sigil.seer.desc=&oWenn allsehend nicht genug ist tooltip.bloodmagic.sigil.seer.currentAltarProgress=Fortschritt: %d LP/ %s LP @@ -416,14 +424,17 @@ tooltip.bloodmagic.sigil.seer.currentAltarCapacity=Maximale Kapazität: %d LP tooltip.bloodmagic.sigil.seer.currentCharge=Ladung: %d tooltip.bloodmagic.sigil.seer.currentTranquility=Momentane Gelassenheit: %d tooltip.bloodmagic.sigil.seer.currentBonus=Momentaner Bonus: +%d%% -tooltip.bloodmagic.sigil.phantomBridge.desc=&oLaufen auf dünner Luft... tooltip.bloodmagic.sigil.whirlwind.desc=&oBesser keinen Rock tragen -tooltip.bloodmagic.sigil.enderSeverance.desc=&oBringt Endermen in Notlage tooltip.bloodmagic.sigil.teleposition.desc=Das ist beinahe ein bewegender Moment. tooltip.bloodmagic.sigil.transposition.desc=Spüre die Stärke der Macht, mein junger Schüler. tooltip.bloodmagic.sigil.holding.press=Drücke &o%s&r&7 zum ändern tooltip.bloodmagic.sigil.holding.desc=Gesiegelte Siegel tooltip.bloodmagic.sigil.holding.sigilInSlot=Platz %d: %s +tooltip.bloodmagic.sigil.blood_light.desc=&oIch sehe ein Licht! +tooltip.bloodmagic.sigil.ender_severance.desc=&oBringt Endermen in Notlage +tooltip.bloodmagic.sigil.fast_miner.desc=&oHacke wie ein Weltmeister +tooltip.bloodmagic.sigil.green_grove.desc=&oUmweltverträglich +tooltip.bloodmagic.sigil.phantom_bridge.desc=&oLaufen auf dünner Luft... tooltip.bloodmagic.livingArmourPointsUpgrade.desc=Erhöht die maximalen Punkte der Lebenden Rüstung auf %d. @@ -441,9 +452,6 @@ tooltip.bloodmagic.pack.selfSacrifice.desc=Es scheuert richtig... tooltip.bloodmagic.pack.sacrifice.desc=Beschreibung tooltip.bloodmagic.pack.stored=Enthält: %d LP -tooltip.bloodmagic.activationCrystal.weak=Aktiviert niedrig-levelige Rituale -tooltip.bloodmagic.activationCrystal.awakened=Aktiviert mächtigere Rituale -tooltip.bloodmagic.activationCrystal.creative=Kreativmodus: Aktiviert jedes Ritual tooltip.bloodmagic.diviner.currentRitual=Ritual: tooltip.bloodmagic.diviner.blankRune=Leere Runen: %d @@ -470,6 +478,7 @@ tooltip.bloodmagic.arcaneAshes=Asche gebraucht für einen alchemischen Kreis tooltip.bloodmagic.telepositionFocus.coords=Koordinaten: (%d, %d, %d) tooltip.bloodmagic.telepositionFocus.dimension=Dimensions-ID: %d +tooltip.bloodmagic.telepositionFocus.bound=Bound: %s at %d, %d, %d tooltip.bloodmagic.telepositionFocus.weak=Benutzt, um Blöcke zu teleportieren tooltip.bloodmagic.telepositionFocus.enhanced=Benutzt, um Blöcke zu teleportieren tooltip.bloodmagic.telepositionFocus.reinforced=Benutzt, um Blöcke zu teleportieren @@ -518,7 +527,6 @@ tooltip.bloodmagic.livingArmour.upgrade.points=&6Upgrade points: %s / %s tooltip.bloodmagic.livingArmour.extraExtraInfo=&9-Halte Shift + M für Fortschrittsinfo- - tooltip.bloodmagic.will=Willensqualität: %1$,.2f tooltip.bloodmagic.sentientSword.desc=Benutzt Dämonenwille um volles Potential freizusetzen tooltip.bloodmagic.sentientAxe.desc=Benutzt Dämonenwille um volles Potential freizusetzen @@ -615,6 +623,12 @@ ritual.bloodmagic.altarBuilderRitual=Die Zusammensetzung des hohen Altares ritual.bloodmagic.portalRitual=Das Tor der Faltung ritual.bloodmagic.downgradeRitual=Sühne der belasteten Seele ritual.bloodmagic.crystalSplitRitual=Resonanz des facettierten Kristalls +ritual.bloodmagic.condorRitual=Reverence of the Condor +ritual.bloodmagic.eternalSoulRitual=Cry of the Eternal Soul +ritual.bloodmagic.groundingRitual=Ritual of Grounding +ritual.bloodmagic.featheredEarthRitual=Ritual of the Feathered Earth +ritual.bloodmagic.veilOfEvilRitual=Veil of Evil +ritual.bloodmagic.wardOfSacrosanctityRitual=Ward of Sacrosanctity ritual.bloodmagic.waterRitual.info=Generiert eine Wasserquelle auf dem Meisterritualstein. ritual.bloodmagic.lavaRitual.info=Generiert eine Lavaquelle auf dem Meisterritualstein. @@ -660,6 +674,14 @@ ritual.bloodmagic.animalGrowthRitual.steadfast.info=(Standhaft) Züchtet Erwachs ritual.bloodmagic.animalGrowthRitual.default.info=(Roh) Erhöht die Geschwindigkeit des Rituals basierend auf dem vorhandenen Willen in der Aura. ritual.bloodmagic.animalGrowthRitual.destructive.info=(Zerstörerisch) Lässt Erwachsene, die sich länger nicht mehr gedeckt haben, auf Monster zulaufen und explodieren. ritual.bloodmagic.animalGrowthRitual.corrosive.info=(Korrosiv) Nicht implementiert. +ritual.bloodmagic.groundingRitual.info=Forces entities on the ground and prevents jumping. +ritual.bloodmagic.groundingRitual.default.info=(Raw) Affects players. +ritual.bloodmagic.groundingRitual.corrosive.info=(Corrosive) Disables gravity (+Vengeful) Applies Levitation. +ritual.bloodmagic.groundingRitual.destructive.info=(Destructive) Applies Heavy Heart (increases fall damage) (+Vengeful) Stronger effect. +ritual.bloodmagic.groundingRitual.steadfast.info=(Steadfast) Affects Bosses. Doesn't affect bosses that are immune against motion change or immune against potions (except Wither and Ender Dragon). +ritual.bloodmagic.groundingRitual.vengeful.info=(Vengeful) Makes effects stronger. (+Corrosive) Applies Levitation. (+Destructive) Higher Heavy Heart amplifier. +ritual.bloodmagic.condorRitual.info=Provides flight in an area around the ritual. +ritual.bloodmagic.eternalSoulRitual.info=Capable of transferring Life Essence from a Network back into an Altar at a cost. ritual.bloodmagic.crystalSplitRitual.info=Spaltet eine ausgewachsene rohe Kristallgruppe in die Aspekte auf. ritual.bloodmagic.fullStomachRitual.info=Entfernt Essen aus der verbundenen Truhe, um die Sättigung des Spielers zu füllen. @@ -745,6 +767,8 @@ ritual.bloodmagic.downgradeRitual.dialogue.slowHeal.100=Anders als meine Brüder ritual.bloodmagic.downgradeRitual.dialogue.slowHeal.300=Auch wenn deine Wunden noch heilen mögen, werden sie es doch nur langsam, fall du mein "Angebot" akzeptieren solltest und die Wunden der Schlacht werden dir noch mehr schmerzen. ritual.bloodmagic.downgradeRitual.dialogue.slowHeal.500=Also überlege gut, bevor du einen Handel eingehst, den du bereuen wirst. Denn auch wenn dein Glas leer sein sollte, wird es nahezu unmöglich sein, es wieder zu füllen... +ritual.bloodmagic.featheredEarthRitual.info=Prevents falldamage in an area. + # Chat chat.bloodmagic.altarMaker.setTier=Setze Ausbaustufe auf: %d chat.bloodmagic.altarMaker.building=Baue Stufe %d-Altar @@ -786,6 +810,9 @@ chat.bloodmagic.mimic.detectRadius.down=Spieler-Erfassungsradius wurde verringer chat.bloodmagic.mimic.potionSpawnRadius.up=Trankerzeugungsradius wurde erhöht auf: %d Blöcke. chat.bloodmagic.mimic.potionSpawnRadius.down=Trankerzeugungsradis wurde verringert auf: %d Blöcke. +death.attack.ritual_damage=%1$s wurde für ein Ritual geopfert. +death.attack.ritual_damage.player=%2$s hat %1$s für ein Ritual geopfert. + # entity entity.bloodmagic.SentientSpecter.name=Empfindsamer Geist entity.bloodmagic.Mimic.name=Mimik @@ -794,9 +821,8 @@ entity.bloodmagic.Mimic.name=Mimik commands.bloodmagic.error.arg.invalid=Ungültige Argumente commands.bloodmagic.error.arg.missing=Nicht genug Argumente commands.bloodmagic.error.arg.player.missing=Du musst einen Spieler für diese Aktion bestimmen. -commands.bloodmagic.error.404=Befehl nicht gefunden! -commands.bloodmagic.error.unknown=Unbekannter Befehl! -commands.bloodmagic.error.perm=Du hast keine Berechtigung, diesen Befehl zu nutzen! +commands.bloodmagic.error.negative=Amount must be a positive Integer. +commands.bloodmagic.error.outofbounds=Given integer is too large (must be within list ID boundaries). commands.bloodmagic.success=Erfolgreich ausgeführt @@ -808,6 +834,7 @@ commands.bloodmagic.help.help=Zeigt hilfe für den Befehl "/bloodmagic" an. commands.bloodmagic.network.usage=/bloodmagic network [syphon|add|get|fill|cap] Spieler [amount] commands.bloodmagic.network.help=LP Netzwerk Befehle + commands.bloodmagic.network.syphon.help=Zieht den gegebenen Wert an LP vom LP-Netzwerk des gegebenen Spielers ab. commands.bloodmagic.network.syphon.success=Erfolgreich %d LP von %s abgezogen. commands.bloodmagic.network.add.help=Fügt den gegebenen Wert an LP dem LP-Netzwerk des gegebenen Spielers zu. Folgt normalen LP Regeln. @@ -822,32 +849,15 @@ commands.bloodmagic.network.cap.success=%ss LP-Netzwerk erfolgreich gefüllt. commands.bloodmagic.bind.usage=/bloodmagic bind [true|false] [Spieler] commands.bloodmagic.bind.help=Versucht, den gehaltenen Gegenstand zu binden bzw. die Bindung zu entfernen. -commands.bloodmagic.bind.success=Erfolgreich gebunden +commands.bloodmagic.bind.success=Gegenstand erfolgreich gebunden! commands.bloodmagic.bind.remove.success=Bindung erfolgreich entfernt +commands.bloodmagic.bind.error.ownerEqualsTarget=Es hat sich nichts geändert: Ziel und Besitzer sind identsich. +commands.bloodmagic.bind.error.notBound=Bindung kann nicht gelöscht werden: Nicht gebunden. +commands.bloodmagic.bind.error.notBindable=Kann nicht gebunden werden: Gegenstand nicht bindbar. commands.bloodmagic.orb.usage=/bloodmagic orb [set|get] Spieler [tier] commands.bloodmagic.orb.help=Setzt oder zeigt die Blutkugel-Ausbaustufe des Spielers. -commands.bloodmagic.bind.usage=/bind -commands.bloodmagic.bind.success=Gegenstand erfolgreich gebunden! -commands.bloodmagic.bind.failed.noPlayer=Kein Spieler angegeben -commands.bloodmagic.bind.failed.alreadyBound=Gegenstand ist schon gebunden; benutze /unbind um die Bindung zu entfernen -commands.bloodmagic.bind.failed.notBindable=Gegenstand kann nicht gebunden werden -commands.bloodmagic.unbind.usage=/unbind -commands.bloodmagic.unbind.success=Bindung erfolgreich entfernt. -commands.bloodmagic.unbind.failed.notBindable=Bindung kann nicht entfernt werden. -commands.bloodmagic.soulnetwork.usage=/soulnetwork [Menge] -commands.bloodmagic.soulnetwork.add.success=Erfolgreich %dLP zu %ss LP-Netzwerk hinzugefügt! -commands.bloodmagic.soulnetwork.subtract.success=Erfolgreich %dLP von %ss LP-Netzwerk entfernt! -commands.bloodmagic.soulnetwork.fill.success=Erfolgreich %ss LP-Netzwerk gefüllt! -commands.bloodmagic.soulnetwork.empty.success=Erfolgreich %ss LP-Netzwerk geleert! -commands.bloodmagic.soulnetwork.get.success=In %ss LP-Netzwerk sind %dLP! -commands.bloodmagic.soulnetwork.noPlayer=Kein Spieler angegeben -commands.bloodmagic.soulnetwork.noCommand=Kein Befehl angegeben -commands.bloodmagic.soulnetwork.notACommand=Das ist kein gültiger Befehl -commands.bloodmagic.soulnetwork.fillMax.success=%ss LP-Netzwerk erfolgreich zu deren Blutkugel-Maximum befüllt! -commands.bloodmagic.soulnetwork.create.success=%ss LP-Netzwerk erfolgreich erstellt! (Blutkugel-Ausbaustufe: %d) - # GUI tile.bloodmagic.inputNode.name=Eingangsknoten tile.bloodmagic.outputNode.name=Ausgangsknoten @@ -857,9 +867,6 @@ bloodmagic.keybind.open_holding=Öffne Siegel der Aufbewahrung bloodmagic.keybind.cycle_holding_pos=Siegelrotation (+) bloodmagic.keybind.cycle_holding_neg=Siegelrotation (-) -death.attack.ritual_damage=%1$s wurde für ein Ritual geopfert. -death.attack.ritual_damage.player=%2$s hat %1$s für ein Ritual geopfert. - # JustEnoughItems jei.bloodmagic.recipe.altar=Blutaltar jei.bloodmagic.recipe.binding=Alchemische Anordnung (Bindung) diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index 82c23c2e..0d4c026d 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -201,7 +201,7 @@ tile.bloodmagic.stone.ritual.imperfect.name=Imperfect Ritual Stone tile.bloodmagic.stone.ritual.inverted.name=Inverted Master Ritual Stone tile.bloodmagic.altar.name=Blood Altar -tile.bloodmagic.alchemyArray.name=&r&fAlchemy Array +tile.bloodmagic.alchemyArray.name=Alchemy Array tile.bloodmagic.rune.blank.name=Blank Rune tile.bloodmagic.rune.speed.name=Speed Rune @@ -623,6 +623,8 @@ ritual.bloodmagic.condorRitual=Reverence of the Condor ritual.bloodmagic.eternalSoulRitual=Cry of the Eternal Soul ritual.bloodmagic.groundingRitual=Ritual of Grounding ritual.bloodmagic.featheredEarthRitual=Ritual of the Feathered Earth +ritual.bloodmagic.veilOfEvilRitual=Veil of Evil +ritual.bloodmagic.wardOfSacrosanctityRitual=Ward of Sacrosanctity ritual.bloodmagic.waterRitual.info=Generates a source of water from the master ritual stone. ritual.bloodmagic.lavaRitual.info=Generates a source of lava from the master ritual stone. @@ -830,6 +832,7 @@ commands.bloodmagic.help.help=Displays the help information for the "/bloodmagic commands.bloodmagic.network.usage=/bloodmagic network [syphon|add|get|fill|cap] player [amount] commands.bloodmagic.network.help=LP network utilities + commands.bloodmagic.network.syphon.help=Removes the given amount of LP from the given player's LP network. commands.bloodmagic.network.syphon.success=Successfully syphoned %d LP from %s. commands.bloodmagic.network.syphon.usage=/bloodmagic network syphon [player] [amount] @@ -848,7 +851,8 @@ commands.bloodmagic.network.fill.success=Successfully filled %s's LP network. commands.bloodmagic.network.cap.help=Fills the given player's LP network to the max that their highest Blood Orb can store. commands.bloodmagic.network.cap.usage=/bloodmagic network cap [player] commands.bloodmagic.network.cap.success=Successfully capped off %s's LP network. - +commands.bloodmagic.network.tickethistory.help=Shows the soul ticket history containing information about LP consumers for the player +commands.bloodmagic.network.tickethistory.usage=/bloodmagic network tickethistory [player] commands.bloodmagic.bind.usage=/bloodmagic bind [true|false] [player] ("?" or "help" for help) commands.bloodmagic.bind.help=Attempts to (un)bind the currently held item. diff --git a/src/main/resources/assets/bloodmagic/lang/fr_FR.lang b/src/main/resources/assets/bloodmagic/lang/fr_FR.lang index f75e010a..3493e25d 100644 --- a/src/main/resources/assets/bloodmagic/lang/fr_FR.lang +++ b/src/main/resources/assets/bloodmagic/lang/fr_FR.lang @@ -181,7 +181,7 @@ tile.bloodmagic.stone.ritual.master.name=Pierre Rituelle Maîtresse tile.bloodmagic.stone.ritual.imperfect.name=Pierre Rituelle Imparfaite tile.bloodmagic.altar.name=Autel de Sang -tile.bloodmagic.alchemyArray.name=&r&fÉtalage d'Alchimie +tile.bloodmagic.alchemyArray.name=Étalage d'Alchimie tile.bloodmagic.rune.blank.name=Rune de Sang tile.bloodmagic.rune.speed.name=Rune de Vitesse diff --git a/src/main/resources/assets/bloodmagic/lang/ja_JP.lang b/src/main/resources/assets/bloodmagic/lang/ja_JP.lang index 58d7b932..5cffaa40 100644 --- a/src/main/resources/assets/bloodmagic/lang/ja_JP.lang +++ b/src/main/resources/assets/bloodmagic/lang/ja_JP.lang @@ -201,7 +201,7 @@ tile.bloodmagic.stone.ritual.imperfect.name=簡易儀式石 tile.bloodmagic.stone.ritual.inverted.name=反転マスター儀式石 tile.bloodmagic.altar.name=血の祭壇 -tile.bloodmagic.alchemyArray.name=&r&f錬金術魔法陣 +tile.bloodmagic.alchemyArray.name=錬金術魔法陣 tile.bloodmagic.rune.blank.name=空のルーン tile.bloodmagic.rune.speed.name=速度のルーン diff --git a/src/main/resources/assets/bloodmagic/lang/ru_RU.lang b/src/main/resources/assets/bloodmagic/lang/ru_RU.lang index 0a76a026..a91e66e9 100644 --- a/src/main/resources/assets/bloodmagic/lang/ru_RU.lang +++ b/src/main/resources/assets/bloodmagic/lang/ru_RU.lang @@ -200,7 +200,7 @@ tile.bloodmagic.stone.ritual.imperfect.name=Неполноценный риту tile.bloodmagic.stone.ritual.inverted.name=Инвертированный ритуальный камень tile.bloodmagic.altar.name=Кровавый алтарь -tile.bloodmagic.alchemyArray.name=&r&fАлхимическая матрица +tile.bloodmagic.alchemyArray.name=Алхимическая матрица tile.bloodmagic.rune.blank.name=Чистая руна tile.bloodmagic.rune.speed.name=Руна скорости diff --git a/src/main/resources/assets/bloodmagic/lang/zh_CN.lang b/src/main/resources/assets/bloodmagic/lang/zh_CN.lang index 6ccec15a..d27f9496 100644 --- a/src/main/resources/assets/bloodmagic/lang/zh_CN.lang +++ b/src/main/resources/assets/bloodmagic/lang/zh_CN.lang @@ -198,7 +198,7 @@ tile.bloodmagic.stone.ritual.imperfect.name=不完善的仪式石 tile.bloodmagic.stone.ritual.inverted.name=反转的主仪式石 tile.bloodmagic.altar.name=血之祭坛 -tile.bloodmagic.alchemyArray.name=&r&f炼金矩阵 +tile.bloodmagic.alchemyArray.name=炼金矩阵 tile.bloodmagic.rune.blank.name=空白符文 tile.bloodmagic.rune.speed.name=速度符文 diff --git a/src/main/resources/assets/bloodmagic/lang/zh_TW.lang b/src/main/resources/assets/bloodmagic/lang/zh_TW.lang index 3632a10a..bdabcb85 100644 --- a/src/main/resources/assets/bloodmagic/lang/zh_TW.lang +++ b/src/main/resources/assets/bloodmagic/lang/zh_TW.lang @@ -152,7 +152,7 @@ tile.bloodmagic.stone.ritual.master.name=魔導師儀式石 tile.bloodmagic.stone.ritual.imperfect.name=次級儀式石 tile.bloodmagic.altar.name=血祭壇 -tile.bloodmagic.alchemyArray.name=&r&f煉金矩陣 +tile.bloodmagic.alchemyArray.name=煉金矩陣 tile.bloodmagic.rune.blank.name=空白符文石 tile.bloodmagic.rune.speed.name=速度符文石 diff --git a/src/main/resources/assets/bloodmagic/shaders/beam-broken.frag b/src/main/resources/assets/bloodmagic/shaders/beam-broken.frag index 63693c95..e3b2e255 100644 --- a/src/main/resources/assets/bloodmagic/shaders/beam-broken.frag +++ b/src/main/resources/assets/bloodmagic/shaders/beam-broken.frag @@ -4,7 +4,7 @@ void main() { vec2 texcoord = vec2(gl_TexCoord[0]); vec4 color = texture2D(bgl_RenderedTexture, texcoord); - float r = sin(texcoord.x * 6 - 1.5 + sin(texcoord.y - time / 3.0)) * 1.1; //(sin((texcoord.x - texcoord.y) * 4 - time) + 1) / 2; + float r = sin(texcoord.x * 6.0 - 1.5 + sin(texcoord.y - float(time) / 3.0)) * 1.1; //(sin((texcoord.x - texcoord.y) * 4 - time) + 1) / 2; gl_FragColor = vec4(min(1 - r, color.r * gl_Color.r), min(1 - r, color.g * gl_Color.g), color.b * gl_Color.b, color.a * gl_Color.a); } diff --git a/src/main/resources/assets/bloodmagic/shaders/beam.frag b/src/main/resources/assets/bloodmagic/shaders/beam.frag index 62741dfc..2ccc5dcd 100644 --- a/src/main/resources/assets/bloodmagic/shaders/beam.frag +++ b/src/main/resources/assets/bloodmagic/shaders/beam.frag @@ -5,8 +5,8 @@ vec2 texcoord = vec2(gl_TexCoord[0]); vec4 color = texture2D(bgl_RenderedTexture, texcoord); - float gs = (color.r + color.g + color.b) / 3; - float r = sin(texcoord.x * 6 - 1.5 + sin(texcoord.y - time / 3.0)) * 1.1; //(sin((texcoord.x - texcoord.y) * 4 - time) + 1) / 2; + float gs = (color.r + color.g + color.b) / 3.0; + float r = sin(texcoord.x * 6.0 - 1.5 + sin(texcoord.y - float(time) / 3.0)) * 1.1; //(sin((texcoord.x - texcoord.y) * 4 - time) + 1) / 2; gl_FragColor = vec4(gs, gs, max(gs, r), gl_Color.a); } diff --git a/src/main/resources/assets/bloodmagicguide/lang/de_DE.lang b/src/main/resources/assets/bloodmagicguide/lang/de_DE.lang index 3715be0f..21cf0a86 100644 --- a/src/main/resources/assets/bloodmagicguide/lang/de_DE.lang +++ b/src/main/resources/assets/bloodmagicguide/lang/de_DE.lang @@ -51,6 +51,23 @@ guide.bloodmagic.entry.ritual.timberman=Kahlschlag des Holzfällers guide.bloodmagic.entry.ritual.meteor=Zeichen des fallenden Turms guide.bloodmagic.entry.ritual.downgrade=Sühne der belasteten Seele guide.bloodmagic.entry.ritual.crystalSplit=Resonanz des facettierten Kristalls +guide.bloodmagic.entry.ritual.portal=Das Tor der Faltung (Englisch) +guide.bloodmagic.entry.ritual.altarBuilder=Die Zusammensetzung des hohen Altars (Englisch) +guide.bloodmagic.entry.ritual.pump=Die Hymne des Siphonierens (Englisch) +guide.bloodmagic.entry.ritual.cobble=Der gefrorene Vulkan (Englisch) +guide.bloodmagic.entry.ritual.ellipsoid=Fokus des Ellipsoids (Englisch) +guide.bloodmagic.entry.ritual.crystalHarvest=Bruch des frakturierten Kristalls (Englisch) +guide.bloodmagic.entry.ritual.forsakenSoul=Versammlung der verlassenen Seelen (Englisch) +guide.bloodmagic.entry.ritual.animalGrowth=Ritual des Schäfers (Englisch) +guide.bloodmagic.entry.ritual.livingEvolution=Ritual der lebenden Evolution (Englisch) +guide.bloodmagic.entry.ritual.upgradeRemove=Ritual der reinigenden Seele (Englisch) +guide.bloodmagic.entry.ritual.fullStomach=Ritual des gesättigten Magens (Englisch) +guide.bloodmagic.entry.ritual.eternalSoul=Ritual der ewigen Seele (Englisch) +guide.bloodmagic.entry.ritual.condor=Anbetung des Condors (Englisch) +guide.bloodmagic.entry.ritual.featheredEarth=Ritual der gefederten Erde (Englisch) +guide.bloodmagic.entry.ritual.grounding=Ritual der Erdung (Englisch) +guide.bloodmagic.entry.ritual.veilOfEvil=Schleier des Bösen (Englisch) +guide.bloodmagic.entry.ritual.wardOfSacrosanctity=Schutz der Unantastbarkeit (Englisch) # Ritual Master Entry Text guide.bloodmagic.entry.ritual.intro.info=Guten Abend. Mein Name ist Magus Arcana. Ich habe über die Jahre viele Gestalten angenommen: ein Dieb und ein Wächter, ein Zauberer und ein Krieger, ein umherwandernder Nomade und sogar ein Politiker. Der Titel, den ich dieser Tage trage ist einer, der sich dem Verständnis der meisten Leute entzieht, bei dessen bloßer Erwähnung Bilder von Brutalität hervorkommen, welche in manchen Fällen wohl verdient, in vielen anderen jedoch schlicht fehlgeleitet sind. Natürlich rede ich davon, ein Blutmagier zu sein, doch meine Freunde nennen mich einfach Magus, während meine Feine mich als den Ritualmeister bezeichnen.\n\tMeine Schüler bedrängen mich nun schon seit Monaten, versuchen mich zu überzeugen, dass ich all meine Abenteuer niederschreibe, in die ich verwickelt war, um sie unter den aufstrebenden Magiern zu verteilen. Ich hatte mich geweigert, aber Tiberius hat es am besten in Worte gefasst: "Auch wenn du selbst nicht den Wert darin sehen kannst, ist es für spätere Generationen doch unbezahlbar, die Feinheiten eines Handwerks von jemanden zu hören, der dieses gemeistert hat. Es spielt keine Rolle wie genau es jemand anderes wiedergibt, wenn man nicht absolutes Vertrauen in die Quelle hat, könnte der Goldsand auch nichts weiter als Schwefel sein." Man konnte sehen, dass er sich zu der Zeit ein wenig mit Alchemie beschäftigt hat, aber da er seit langer Zeit mein erster Student war, tendiere ich dazu, seine Meinung zu respektieren.\n\tNun denn, angehender Blutmagier, der du das Arkane studierst, dass viele noch nicht vollständig begreifen, leihe mir deine Aufmerksamkeit für diese Worte, die es wert sind, befolgt zu werden: das Gebiet, dass du studierst hat viele Aspekte und ohne wohl überlegte Planung wirst du deine Werkzeuge als unzureichend empfinden. Deswegen solltest du sicher stellen, dass du dieses Buch oft zu rate ziehst - Ich habe einen Folianten mit vielen Verzauberungen versehen, sodass es, wann auch immer ich etwas in meiner Meister-Kopie schreiben sollte, sich die Worte für dich verändern werden.\n\tNun lehne dich zurück, entspanne dich und genieße die Lehren eines sehr alten Mannes. Du mögest mehr lernen, als du erhofft hast. @@ -136,7 +153,7 @@ guide.bloodmagic.entry.architect.augmentedCapacity=Rune der erweiterten Kapazit guide.bloodmagic.entry.architect.charging=Aufladungsrune guide.bloodmagic.entry.architect.acceleration=Beschleunigungsrune -//--// needs a better string. Literal translation loses its rhyme and just sounds silly. This one is simply "An Altar from the depths" +# //--// needs a better string. Literal translation loses its rhyme and just sounds silly. This one is simply "An Altar from the depths" guide.bloodmagic.entry.architect.tier3=Ein Altar aus den Tiefen (Stufe 3) # Architect Entry Texts @@ -177,6 +194,7 @@ guide.bloodmagic.entry.architect.peritia.info.1=Bestimmte Aktionen in der Welt b guide.bloodmagic.entry.architect.livingArmour.info.1=Jeder Person in Minecraft, besonders in den neueren Versionen der Welt, wird bewusst, dass eine gute Rüstung einen Unterschied zwischen Leben und Tod bedeutet. Normalerweise wählt man bei der Auswahl einer Rüstung einen statischen Satz von Vorteilen - bietet diese Rüstung mehr Schutz? Bekomme ich die Fähigkeit, zu fliegen, wenn ich das trage? Kann ich wirklich hoch springen oder mich schnell bewegen? Das sind alles gültige Optionen für eine Rüstung, aber man kann nie ein Set bekommen, das genau auf seine Bedürfnisse zugeschnitten ist. Zumindest das dachten die Leute. Ein Set Lebendiger Rüstung ist eine konstruierte Lebensform, die mit einer einfachen Eisenrüstung integriert ist. Wenn es getragen wird, geht es eine symbiotische Beziehung mit dem Benutzer ein - wenn man sich bewegt, bewegt es sich. Wenn man angreift, greift es an. Wenn man isst, spürt es das und kompensiert es. Und genau wie ein normaler menschlicher Körper beginnt es zu wachsen und zu stärken, je nachdem, was man tut, indem man es durch seine Handlungen trainiert.\n\tLass mich ein Beispiel nennen: Wenn du eine neue Rüstung ausrüstest und viel herumläufst, wirst du feststellen, dass du ein Upgrade auf der Brustplatte namens "Schnelle Füße" erhältst - dieses Upgrade bietet eine stufenweise Erhöhung deiner Geschwindigkeit, während die folgenden Stufen einen größeren Schub bringen. Du wirst auch feststellen, dass die "Upgrade-Punkte" jetzt "3/100" lauten - jedes Upgrade erfordert eine Anzahl von Upgrade-Punkten, und die Brustplatte hat eine maximale Anzahl von Punkten, die sie halten kann. Wenn ein Upgrade, das du erhalten kannst, nicht mit der Anzahl der kostenlosen Upgrade-Punkte erhältlich ist, die du hast, kann es nicht erworben werden. Behalte im Hinterkopf, dass die Lebende Rüstung nur trainiert wird, wenn du eine vollständige Rüstung anhast, und die Effekte der Rüstung nur wirksam werden, wenn eine vollständige Rüstung verwendet wird.\n\tDie maximale Anzahl von Aufrüstungspunkten kann auf verschiedene Weisen verändert werden. Eine von ihnen ist es, alchemistische Zubereitungen zu kreieren, die die Bindungen zwischen dem Benutzer und der Lebenden Rüstung stärken und die Anzahl der Punkte, die man auf einer bestimmten Ausrüstung haben kann, enorm erhöhen. Ein Beispiel ist der "Trank der Engelsmacht", der die maximale Punktzahl auf 200 erhöht. Informationen über diese Gebräue und wie man sie herstellt, können in "Der Alchemist" gefunden werden. guide.bloodmagic.entry.architect.upgradeTome.info.1=Manchmal ist man mit den Aufrüstungen, die man für die Lebende Rüstung erhalten hat, nicht zufrieden. Mit dem Ritual "Klang der reinigenden Seele" (weitere Informationen unter "Der Ritualmeister") können alle Aufrüstungen von der Rüstung entfernt und in Form von "Thesen der Lebenden Rüstung" erhalten werden. Klicke mit der rechten Maustaste darauf, während du einen kompletten Satz Lebende Rüstung trägst (und Platz für die Aufrüstung hast), um die Eigenschaft zu deiner Rüstung hinzuzufügen. Diese Thesen können auch in einem Amboss kombiniert werden - wenn man zwei der exakt gleichen Thesen (gleiches Upgrade, gleiche Stufe) in einem Amboss kombiniert, kann man eine einzelne These erhalten, die eine Stufe höher ist. Wenn du also Schnelle Füße II mit einem anderen Schnelle Füße II kombinierst, erhälst du Schnelle Füße III. Diese These kann dann in gleicher Weise auf die Rüstung aufgebracht werden. guide.bloodmagic.entry.architect.teleposer.info.1=Der Teleposer ist ein Gerät, das nicht nur Objekte, sondern auch Entitäten teleportiert. Um einen Teleposer einzurichten, benötigst du mindestens zwei Teleposer und einen Telepositionsfokus. Einer der Teleposer fungiert als das Ziel und der andere als der Anfang. Um das einzurichten, musst du zuerst den Fokus an dich binden, indem du mit der rechten Maustaste darauf klickst. Dann klickst du mit der rechten Maustaste auf den Ziel-Teleposer, um seine Position (und Dimension) zu speichern, und fügst dann den Fokus in den beginnenden Teleposer ein, indem du mit der rechten Maustaste auf den Teleposer ohne Fokus in deiner Hand klickst und den Fokus in das GUI platzierst.\n\tMit einem starken Redstonesignal kann ein Teleposer aktiviert werden, wodurch die Teleposer alle Entitäten und Blöcke tauschen, vorausgesetzt, dass ein Teleposer an der Zielposition existiert.\n\tDu kannst entweder einen Teleposer haben, der einen Fokus hat, beide Teleposer haben Fokusse, die miteinander verbunden sind, oder du kannst einen Teleposer haben, der mit einem anderen Teleposer verbunden ist, der nicht mit ersteren verbunden ist, also abhängig davon, wie du sie einrichtest, kannst du sehr komplizierte Systeme haben.\n\tBeachte, dass der Teleposer derzeit nur die Blöcke und Entitäten vertauscht, die sich direkt über dem Block befinden, und die Größe hängt vom Fokus ab - der T1-Fokus vertauscht nur den Block über dem Teleposer, der T2-Fokus vertauscht einen 3x3x3-Bereich über dem Teleposer usw. +guide.bloodmagic.entry.architect.boundBlade.info.1=The Bound Blade is an artifact from the past, a blade that is created by binding an entity to a sword in the same process that creates the Living Armour. It should be noted that this, as well as the Bound Tools, will change in later versions of the mod.\n\tThe sword has an active and inactive mode, which can be toggled by shift-right clicking. The sword does not deal any damage at all when inactive, but while active there will be a small LP drain over time. Likewise, when you damage a mob you will drain LP from your network. Sure, you have a lot of damage, but it may kill you!\n\tWhen a monster is killed, the monster has a chance to drop a Weak Blood Shard. These shards are used in order to upgrade your Blood Altar to a T4 altar. guide.bloodmagic.entry.architect.boundTool.info.1=Ähnlich wie bei der Gebundenen Klinge werden diese gebundenen Werkzeuge (Spitzhacke, Axt und Schaufel) irgendwann modifiziert, um besser in die Mod zu passen. Wie bei der Klinge haben die Werkzeuge einen aktiven und einen inaktiven Modus, zwischen denen man durch Klicken mit der rechten Maustaste umschalten kann.\n\tEtwas, das diese Werkzeuge haben, ist etwas, das man "Beast Mode" nennt. Wenn du die rechte Maustaste gedrückt hältst, kannst du das Werkzeug aufladen und einen mächtigen Spalt freisetzen, der sofort die Blöcke zerbricht, die von dem gegebenen Werkzeug gebrochen werden können - wenn es vollständig aufgeladen ist, ist das ein 11x11x11 Würfel über dir zu einem Preis von 10kLP. Sei vorsichtig mit diesem mächtigen Werkzeug, da es dein letztes sein kann! guide.bloodmagic.entry.architect.weakShard.info.1=Alles, was Leben hat, kann die ätherischen Verbindungen haben, die als das Seelen-Netzwerk bekannt sind. Wie aus euren Erfahrungen hervorgeht, können auch nicht-lebende Dinge ein Seelen-Netzwerk haben, wie Siegel und Rituale; aber diese Verbindungen sind die stärksten in den Geschöpfen und natürlich den Menschen. Wenn du ein Monster mit einer Gebundenen Klinge angreifst, wird ihr Seelen-Netzwerk vorübergehend hart und ein Stück davon wird nach dem Tod bleiben. Dieses Stück hat die Form eines Schwachen Blutsplitters, so benannt nach der Tatsache, dass sein rötlicher Farbton der Farbe der Schwachen Blutkugel entspricht. An diesem Punkt ist es nicht klar, ob es stärkere Formen von Blutsplittern gibt, aber man kann sagen, dass dies sehr hilfreich wäre, um die Macht des eigenen Seelen-Netzwerks zu erhöhen. guide.bloodmagic.entry.architect.masterOrb.info.1=Eine der Anwendungen für diese erhöhte Affinität zum Seelennetzwerk ist die Verwendung des Schwachen Blutsplitters in einer neuen Blutkugel: der Blutkugel des Meisters. Diese Kugel hat eine maximale Kapazität von 1 Million LP und ermöglicht so dem Besitzer den Zugriff auf mächtigere Gegenstände und Rituale. Vielleicht sind Meteore doch in Reichweite... @@ -224,8 +242,8 @@ guide.bloodmagic.entry.demon.petty.info.1=Ich ging auf eines meiner nun allnäch guide.bloodmagic.entry.demon.petty.info.2=Wie auch immer, es dauerte eine Weile, um Materialien zu finden, die am ehesten mit dem dämonischen Willen in Resonanz kamen, um ihn besser zu speichern. Lapis scheint der am leichtesten verfügbare Leiter dieser Energie zu sein, der als Weg für den zu kanalisierenden Willen dient. Nachdem ich etwas Redstone als Abschirmung gegen elektrische Felder in der Luft hinzugefügt hatte (zwei Energien zusammengenommen scheinen katastrophale Auswirkungen zu haben, zumindest sagte Magus das), Gold als Dämpfungsmittel und Glas als einfaches Gehäuse, gelang es mir, einen sehr einfaches "Juwel des Tartaros" zu schaffen. Das heißt "ein Juwel aus der Unterwelt, Tartaros." Nach weiteren Tests fand ich heraus, dass dieses Juwel bis zu einer Willensqualität von 64 halten könnte. Als ich danach versuchte, den dämonischen Willen aufzuheben, schien dieser direkt in den Edelstein zu gehen, wenn er nicht voll war - danach schien der Wille einfach... zu verschwinden. Praktisch für meinen Rucksack, aber sonst ein Rätsel. Ich erfuhr auch, dass, wenn ich den Edelstein in meiner Hand halte und mich konzentriere (Rechtsklick), ungefähr 10% der maximalen Kapazität des Edelsteins in andere Edelsteine fließen würde, die ich auf meiner Person hatte. Ich denke, diese letzte Eigenschaft ist sehr hilfreich, besonders wenn wir andere, mächtigere Juwele entdecken sollten. guide.bloodmagic.entry.demon.sword.info.1=Meine Fallen haben sich wieder verheddert.\n\tEs scheint keine Rolle zu spielen, wie sehr ich versuche, das Design zu verbessern, die rudimentäre Schlinge scheint nie perfekt zu funktionieren. Es verheddert sich nur die meiste Zeit, und wenn ich es endlich schaffe, einen Zombie damit zu treffen, ist es wahrscheinlicher, dass es nicht funktioniert als dass es tut, was es soll. Um mich davon abzuhalten, mir selbst die Haare auszureißen, ging ich wieder zur Schmiede und machte mich sofort an die Arbeit.\n\tNun, nicht sofort, schließlich musste ich zuerst noch die Asche entfernen. guide.bloodmagic.entry.demon.sword.info.2=Ich fusionierte die Fähigkeit des Winzigen Juwels des Tartaros, dämonischen Willen zu halten mit einem eisernen Schwert und schuf eine Klinge, die.... sehr stumpf war und kaum mehr Schaden anrichtete als meine Faust. Ich war eigentlich sehr enttäuscht über das Ergebnis, denn es dauerte eine lange Zeit, mit der Schmiede herumzuexperimentieren, sodass sie durch die Belastung, ein Winziges Tatarisches Juwel als Energiequelle zu nutzen, nicht überhitzte.\n\tDoch sobald ich mein Tartarisches Juwel aufhob, begann das Schwert mit einer neuen Energie zu leuchten. Es scheint, dass je höher die Menge des dämonischen Willens, die ich an meiner Person habe, desto mehr Schaden ich mit dem Schwert anzurichten scheine und desto mehr Dämonischer Wille kann von den Kreaturen absorbiert werden. Wann immer du kein Juwel hast, ist die Quantität des Willens sehr.... gering.\n\tNach einem kleinen Test kam ich zu einer anderen Erkenntnis: Je nachdem, was ich töte, bekomme ich unterschiedliche Mengen von Willen. Es scheint proportional zur Menge der maximalen Gesundheit, die das Monster hat - eine Spinne, da sie eine maximale Gesundheit von 8 Herzen hat, gibt 80%% des Willens eines Zombie, der 10 Herzen hat. Das liegt wahrscheinlich daran, dass diese Monster mehr Willen benötigen, um zu animieren. Ich sollte das für spätere Erkenntnisse beachten. -guide.bloodmagic.entry.demon.lesser.info.1=Ich habe mich heute mit Tiberius unterhalten und einige seiner Projekte besprochen. Ich muss sagen, wenn wir über seine Forschung sprechen, scheint es, dass er immer weiter und weiter und weiter geht! Wie auch immer, eine der jüngsten Erfindungen, über die er sprechen wollte, waren seine Siegel: Bis jetzt ist es ihm gelungen, ein Wassersiegel und ein Lavasiegel zu erschaffen, wobei er die Höllenfeuerschmiede benutzte, die ich schließlich für ihn konstruiert habe, um sie zu erschaffen. Ich war mir nicht ganz sicher, wie er sie tatsächlich hergestellt hat - ich wusste, dass er experimentierte, indem er einige Zutaten nahm und sie in der Schmiede mit dem Weinstein als Katalysator kombinierte, aber ich habe ihn noch nicht aktiv experimentieren sehen. Nun, ich habe endlich einen Einblick bekommen, wofür er diese verdammte Asche benutzt.\n\tMal sehen, ob ich genau nachahmen kann, was er gesagt hat. Ahem. "Durch die Verwendung des Dämonenwillens, der in diesen Edelsteinen enthalten ist, um die Inhaltsstoffe umzuwandeln, entsteht eine Reaktion zwischen Dingen, die normalerweise nichts tun, wenn sie kombiniert werden. Indem ich diese erzwungene Synergie nutze, bin ich in der Lage, mehrere arkane Symbole in Muster einzuschreiben, die die Energie zu lenken, die ich selbst hinzufüge, um die gewünschte Aufgabe zu erfüllen." Obgleich es niedergeschrieben nicht sehr anschaulich ist, stell dir sich vor, wie ich das sage, während ich eine Brille den Nasenrücken hochschiebe. Ich bin mir nicht sicher, ob er normalerweise so ist, aber ich schwöre, er wird komplett... wissenschaftlich, wenn er mir die Dinge erklärt. Nach der zugegebenermaßen auffälligen Demonstration kam er dann zum Kern der Diskussion. "Wenn ich versuche, diesen Prozess mit einigen fortschrittlicheren Materialien zu replizieren, scheint es, dass die Reagenzien... explodieren, wenn sie der Alchemischen Anordnung hinzugefügt werden. Sie scheinen sehr instabil zu sein. Ich denken, dass die Zutaten nicht richtig miteinander verschmolzen werden - vielleicht ist nicht genug Energie in der Schmiede, um sie richtig zu verschmelzen."\n\tNachdem ich ein paar Minuten darüber nachgedacht habe, machte ich an die Arbeit - wie ich in einem früheren Eintrag erwähnt habe, dachte ich, dass ein stärkeres Juwel erforderlich wäre, aber ich habe immer noch nicht genau herausgefunden, wie ich das auf elegante Weise machen könnte. Also beschloss ich, dass ein brachialer Ansatz dafür ausreichen würde! -guide.bloodmagic.entry.demon.lesser.info.2=Ich nahm einen Block Lapis, einen Block Redstone und einen Diamanten sowie einen leeres winziges Tartarisches Juwel, das ich herumliegen hatte - Teil eines vergangenen Experiments, das.... nicht gerade gut lief. Alles, was ich dazu sagen kann, ist, dass ich überrascht bin, dass Magus Löcher in einer festen Betonwand einfach verschwinden lassen kann. Dann kombinierte ich diese vier Gegenstände in der Höllenfeuerschmiede mit einem gefüllten winzigen Juwel, um als Energiequelle zu dienen - ein Minimum von 60 Wille scheint erforderlich zu sein. Nach ein wenig Mühe, eine optimale Anordnung zu finden, setzte ich sie dann zusammen und beobachtete, wie der leere Weinstein innerhalb der Schmiede zu wachsen begann.\n\tNur nebenbei, ich versuchte, einen Block Gold statt einen Diamanten zu nutzen, um das Juwel wachsen zu lassen, jedoch scheint es, dass eine weitere Kristallstruktur vorteilhafter ist.\n\tDieses neue, "Geringe Juwel des Tataros" scheint eine wesentlich höhere Kapazität zu besitzen, indem es fähig ist, bis zu 256 Rohen Willen halten zu können. Hoffentlich ist das genug, um Tiberius' Bedarf an großen Mengen an Willen für eine Weile zu stillen. Aber leider scheint es, dass ich dieses Juwel auffüllen muss. Eine weitere lange Nacht liegt vor mir! +guide.bloodmagic.entry.demon.lesser.info.1=Ich habe mich heute mit Tiberius unterhalten und einige seiner Projekte besprochen. Ich muss sagen, wenn wir über seine Forschung sprechen, scheint es, dass er immer weiter und weiter und weiter geht! Wie auch immer, eine der jüngsten Erfindungen, über die er sprechen wollte, waren seine Siegel: Bis jetzt ist es ihm gelungen, ein Wassersiegel und ein Lavasiegel zu erschaffen, wobei er die Höllenfeuerschmiede benutzte, die ich schließlich für ihn konstruiert habe, um sie zu erschaffen. Ich war mir nicht ganz sicher, wie er sie tatsächlich hergestellt hat - ich wusste, dass er experimentierte, indem er einige Zutaten nahm und sie in der Schmiede mit dem Tartarischen Juwel als Katalysator kombinierte, aber ich habe ihn noch nicht aktiv experimentieren sehen. Nun, ich habe endlich einen Einblick bekommen, wofür er diese verdammte Asche benutzt.\n\tMal sehen, ob ich genau nachahmen kann, was er gesagt hat. Ahem. "Durch die Verwendung des Dämonenwillens, der in diesen Edelsteinen enthalten ist, um die Inhaltsstoffe umzuwandeln, entsteht eine Reaktion zwischen Dingen, die normalerweise nichts tun, wenn sie kombiniert werden. Indem ich diese erzwungene Synergie nutze, bin ich in der Lage, mehrere arkane Symbole in Muster einzuschreiben, die die Energie zu lenken, die ich selbst hinzufüge, um die gewünschte Aufgabe zu erfüllen." Obgleich es niedergeschrieben nicht sehr anschaulich ist, stell dir sich vor, wie ich das sage, während ich eine Brille den Nasenrücken hochschiebe. Ich bin mir nicht sicher, ob er normalerweise so ist, aber ich schwöre, er wird komplett... wissenschaftlich, wenn er mir die Dinge erklärt. Nach der zugegebenermaßen auffälligen Demonstration kam er dann zum Kern der Diskussion. "Wenn ich versuche, diesen Prozess mit einigen fortschrittlicheren Materialien zu replizieren, scheint es, dass die Reagenzien... explodieren, wenn sie der Alchemischen Anordnung hinzugefügt werden. Sie scheinen sehr instabil zu sein. Ich denken, dass die Zutaten nicht richtig miteinander verschmolzen werden - vielleicht ist nicht genug Energie in der Schmiede, um sie richtig zu verschmelzen."\n\tNachdem ich ein paar Minuten darüber nachgedacht habe, machte ich an die Arbeit - wie ich in einem früheren Eintrag erwähnt habe, dachte ich, dass ein stärkeres Juwel erforderlich wäre, aber ich habe immer noch nicht genau herausgefunden, wie ich das auf elegante Weise machen könnte. Also beschloss ich, dass ein brachialer Ansatz dafür ausreichen würde! +guide.bloodmagic.entry.demon.lesser.info.2=Ich nahm einen Block Lapis, einen Block Redstone und einen Diamanten sowie einen leeres winziges Tartarisches Juwel, das ich herumliegen hatte - Teil eines vergangenen Experiments, das.... nicht gerade gut lief. Alles, was ich dazu sagen kann, ist, dass ich überrascht bin, dass Magus Löcher in einer festen Betonwand einfach verschwinden lassen kann. Dann kombinierte ich diese vier Gegenstände in der Höllenfeuerschmiede mit einem gefüllten winzigen Juwel, um als Energiequelle zu dienen - ein Minimum von 60 Wille scheint erforderlich zu sein. Nach ein wenig Mühe, eine optimale Anordnung zu finden, setzte ich sie dann zusammen und beobachtete, wie das leere Tartarische Juwel innerhalb der Schmiede zu wachsen begann.\n\tNur nebenbei, ich versuchte, einen Block Gold statt einen Diamanten zu nutzen, um das Juwel wachsen zu lassen, jedoch scheint es, dass eine weitere Kristallstruktur vorteilhafter ist.\n\tDieses neue, "Geringe Juwel des Tataros" scheint eine wesentlich höhere Kapazität zu besitzen, indem es fähig ist, bis zu 256 Rohen Willen halten zu können. Hoffentlich ist das genug, um Tiberius' Bedarf an großen Mengen an Willen für eine Weile zu stillen. Aber leider scheint es, dass ich dieses Juwel auffüllen muss. Eine weitere lange Nacht liegt vor mir! guide.bloodmagic.entry.demon.reactions.info=Ich bin heute in einem Krankenbett aufgewacht und habe Schmerzen. Ich öffnete die Augen und sah das dumpfe Magenta, das die Decke des "Mächtige Flüche"-Flügels des Krankenhauses in Veteres bildete, der unserem Dorf am nächsten gelgenen Stadt. Ich war nicht gerade beunruhigt über diese Information: es hat mich so verwirrt, dass ich irgendwie hier gelandet bin, während ich scheinbar nur mit Kratzern und blauen Flecken bedeckt war, plus einem einfachen Gips auf meinem linken Bein. Jemand muss einen "Ossa Fracta"-Fluch auf mich geworfen haben oder so, denn es könnte nur ein einfacher gebrochener Knochen sein! Als Magus mit einer der Schwestern mit einem ernsten Gesicht reinkam, wusste ich, dass es etwas drastischeres war. Anscheinend habe ich einen kleinen Rückschlag mit einem meiner Experimente mit dem neuen Geringen Tatarischen Juwel erlitten und eine kleine, aber kräftige Explosion ausgelöst. So viel konnte ich leicht verstehen, aber das war es nicht: Die Mischung aus Obsidian, Eisen und Diamant, die ich benutzte, beschichtete meinen linken Unterschenkel und bildete eine starre Schale, die nicht entfernt werden konnte. Der Gips, den ich auf meinem Bein hatte, war eigentlich kein Gips, sondern eine Art Runenmatrix, die die hellblaue Schale bedeckte. Ich fragte, was Magus dachte, obwohl ich mir ziemlich sicher war, was passiert war. "Ich glaube", sagte er und blickte auf die Krankenschwester, die ihm aufmerksam zuhörte, bevor sie mich ansah, "dass es einfach eine Art Rückstand ist, der auf Diamanten basiert, was der Hauptgrund dafür ist, dass wir ihn nicht entfernen können. Es ist auch mit etwas... jenseitiger Energie verwebt, was der Hauptgrund dafür ist, dass du hier bist, anstatt in einem Bett in der örtlichen Klinik - das Konglomerat ist seit dem Eldritch-Vorfall ziemlich streng in Bezug auf unbekannte Energie, die direkt mit Menschen in Verbindung ist, also mussten wir sicherstellen, dass es keine Probleme gab. "Ich sehe..." Normalerweise kümmert sich Magus nicht viel um Formalitäten wie z.B. sicherzustellen, dass das Konglomerat über unbekannte Energien informiert ist - ich experimentiere schon eine ganze Weile mit Dämonischen Willen, und es ist nicht so, dass das Konglomerat an unsere Tür klopft, um diese Magie registrieren zu lassen. Ich werde hier nicht viel ins Detail gehen, da ich nicht sehr versiert in der Politik bin, aber ich weiß, dass Magus nur sparsam daran teilnimmt. Das bedeutete, dass die Macht dieses Willens Magus sehr beunruhigte, vielleicht durch einige seiner vergangenen Erfahrungen...?\n\t "Ah gut, genug davon im Moment", sagte Magus und krempelte die Ärmel seiner Roben hoch. "Ich habe versucht, die Schale zu brechen, als ich sie zum ersten Mal sah, offensichtlich nachdem ich überprüft hatte, was sie war. Letztes Mal hatte es keine Wirkung, aber jetzt..." Es gab eine glühende Hitze auf meinem linken Bein, begleitet von einem blendenden roten Licht, als Magus seine Hände auf die blaue Schale schröpfte. Nach einem Moment, der sich wie eine Ewigkeit anfühlte, aber nur ein paar Sekunden gedauert haben muss, begann die Schale zu reißen und zu brechen und zerfiel. Ehrlich gesagt, es war irgendwie enttäuschend. versuchte ich aufzustehen, aber Magus schob mich mit einem kleinen Stoß zurück ins Bett. "Bella, du musst bleiben und dich ausruhen. Du kannst später mit deiner Forschung an den Juwelen fortfahren." Ich war zunächst verärgert, aber das ging schnell vorbei, da ich viel Zeit zum Nachdenken hatte. Der einzige Grund, warum Magus nicht in der Lage war, genau das Gleiche vorher zu tun, war wahrscheinlich, dass ich nach der Explosion immer noch mein Tartarisches Juwel bei mir hatte. Was auch immer mit meinem Bein geschah, musste direkt an den Dämonischen Willen gebunden sein, und sobald mein Juwel genommen wurde, konnte die Schale entfernt werden. Es brachte mich zum Nachdenken... guide.bloodmagic.entry.demon.sentientGem.info.1=Nach ein paar Tagen "dringend nötiger Bettruhe", die von Magus vorgeschrieben und durchgesetzt wurde, beschloss ich, ein wenig zu recherchieren, vor allem über die empfindsame Ausrüstung, die ich bisher gemacht habe. Es gibt einfach so viel, dass ich nicht über das empfindsame Schwert und den Dämonenwillen im Allgemeinen Bescheid weiß. Sicher, wir wissen etwas von der Theorie, aber wenn man bedenkt, dass Magus und ich diejenigen waren, die die Theorie entwickelt haben, ist es schwer zu sagen, was genau sie ist. Magus sagte mir, dass er immer, wenn er einen Lehrling nimmt, darauf besteht, dass sie neben der Forschung, die er betreibt, eine andere Form der Magie lernen müssen. Tiberius bot mir an, Botanik zu lernen, aber ich spottete über die Idee - ein paar Blumen werden mir nicht viel helfen, wenn ich gegen Dämonen kämpfen muss! guide.bloodmagic.entry.demon.sentientGem.info.2=Das Juwel der Empfindsamen Rüstung ist ein umschaltbarer Gegenstand, mit dem du deine empfindsame Rüstung an- und ablegen kannst. Wenn du mit der rechten Maustaste auf das Juwel klickst, während du mindestens 16 Dämonenwille in deinem Inventar hast, wird deine Rüstung durch einen Satz empfindsame Rüstung ersetzt, die alle Verzauberungen der ersetzten Rüstung kopiert - wenn du das Juwel wieder deaktivierst, erhältst du deine ursprüngliche Rüstung zurück. Das funktioniert auch, wenn du überhaupt keine Rüstung anhast. Die empfindsame Rüstung wirkt anfangs wie eine einfache eiserne Rüstung, die keine zusätzlichen Fähigkeiten außer Schutz bietet. Ähnlich wie andere empfindsame Werkzeuge bietet die Rüstung jedoch mehr Schutz, wenn du mehr Dämonenwille in deinem Besitz hast. Dies macht den Schutz wirklich mächtig, wenn man eine große Menge an Dämonenwille angesammelt hat. Der Nachteil dabei ist, dass jeder Treffer, den du nimmst, ein kleines Stück Dämonenwille aus deinen tatarischen Juwelen extrahiert, und wenn du zu niedrig wirst, wird deine Rüstung wieder in ihre ursprüngliche Form zurückkehren. Könnte unangenehm werden! @@ -234,7 +252,7 @@ guide.bloodmagic.entry.demon.aura.info=Wenn ein Wesen normal getötet wird, verd guide.bloodmagic.entry.demon.types.info=Bis jetzt ist die einzige Art von Dämonenwille, die wir besprochen haben, der rohe Wille. Wie der Name schon sagt, ist es die roheste und unverfälschteste Form des Willens, die es gibt, aber das bedeutet nicht, dass es rein ist. Tatsächlich nimmt Dämonischer Wille viele verschiedene Formen an: Roh ist der Typ, mit dem wir es normalerweise zu tun haben, aber es gibt auch korrosiv, zerstörerisch, rachsüchtig und standhaft. Der rohe Wille besteht aus einer Mischung aller vier dieser Typen und vielleicht mit anderen, noch unentdeckten Typen, aber wenn man sie einmal in diese verschiedenen Willenstypen aufgeteilt hat, scheint es unmöglich, sie zu rekombinieren.\n\tEs ist noch nicht klar, ob diese verschiedenen Typen von Willen aus verschiedenen Quellen stammen, aber wir kennen den Prozess der Erzeugung dieser verschiedenen Typen von Willen. Das Ritual "Resonanz des facettierten Kristalls" kann einen rohen Willenskristall in seine reinen Teile zerlegen, mehr dazu im entsprechenden Eintrag in "Der Ritualmeister". Ein Gerät, um rohe Willenskristalle zu erhalten, ist der Dämonenkristallisierer, dessen Eintrag weiter unten zu finden ist. Es mag mehr Arten von Willen geben, aber sie sind entweder nicht rein genug oder können einfach nicht in dieser Form erschaffen werden.\n\tKorrosiv repräsentiert den Wunsch, alle Dinge um sich herum zu zerstören, entweder mit Säure oder durch zermalmende Kraft. Wer diesen Willen beherrscht, kann lähmende Status-Effekte ausüben und ist immun gegen schreckliche Gifte.\n\tRachsüchtig kann als das Verlangen angsehen werden, ein Ziel ohne Ermüdung zu jagen. Normalerweise kann dies entweder als eine erhöhte Geschwindigkeit des Körpers gesehen werden, die Beute zu suchen, oder um sicherzustellen, dass ein Ziel nicht in der Lage ist, zu entkommen, während es ständig angegriffen wird.\n\tZerstörerisch, wie du wahrscheinlich ahnst, ist pure Kraft. Wenn dieser Wille richtig eingesetzt wird, können Angriffsstärke und allgemeine körperliche Fähigkeiten gewonnen werden. Es kann auch verwendet werden, um Dinge zu zerquetschen und zu zerschlagen, wenn es in anderen Anwendungen verwendet wird.\n\tStandhaft ist das Verlangen, sich von Schaden zu schützen. In den meisten Fällen sind die Herren dieses Willens das defensive Bollwerk der Gruppe, das in der Lage ist, mächtigen Angriffen standzuhalten und sie nicht einmal zu spüren. Wenn du am Leben bleiben musst, durch Rüstung oder durch Rituale, ist dies eine Wahl, die in Betracht gezogen werden sollte. guide.bloodmagic.entry.demon.crucible.info=Der Dämonenschmelztiegel ist ein Gerät, das in der Lage ist, den Dämonenwille in einem tartarischen Juwel und anderen Gegenständen zu verbrennen, um ihn in die Aura des Chunks, in dem er sich befindet, zu injizieren. Es gibt verschiedene Möglichkeiten, den Tiegel zu benutzen: Eine der einfachsten Möglichkeiten ist es, ein tartarisches Juwel in den Tiegel zu legen, indem man mit der rechten Maustaste darauf klickt und ein solches Juwel in der Hand hält. Der Tiegel entleert dann den Willen aus dem Juwel, bis entweder die Aura mit dieser Art von Willen gesättigt ist (standardmäßig maximal 100) oder bis das Juwel leer ist.\n\tEin anderer Modus ist, das enthaltene Juwel zu benutzen, um den Willen aus der Aura zu ziehen - dies geschieht, indem man ein starkes Redstonesignal an den Tiegel anlegt und dann wird das enthaltene Juwel versuchen, so viel Willen wie möglich zu entziehen.\n\tZu guter Letzt kann ein einzelnes Stück dämonischen Willens verbrannt werden, solange die Aura genügent Platz bietet. Ein Beispiel dafür ist ein Willenskristall, der einen Wert von 50 hat. guide.bloodmagic.entry.demon.crystallizer.info=Wie zuvor besprochen, ist die Dämonen-Aura die ätherische Manifestation des Dämonenwillens, und die Substanz, die man erhält, wenn man einen Mob tötet, ist dessen physische Manifestation. Der Dämonenkristallisierer fungiert als Ankerpunkt für den Dämonenwillen in der Aura, sodass sich dieser daran physisch manifestieren kann und verwandelt den ätherischen Willen wieder in eine physische Form als Kristalle.\n\tSicher wundert es dich, warum man den Willen nicht einfach aus einem tartarischen Juwel in einen Kristall formen kann. Denn indem wir den Willen in seine ätherische Form transformieren, reinigen wir ihn und erlauben dem Willen, seinen normalen Betrieb wieder aufzunehmen - denke daran, dass wir die Programmierung des Willens einfrieren, wenn wir ein Monster mit Dämonenwillen töten, so dass es nicht tun kann, wozu es ausgesandt wurde. Durch die Umwandlung in die ätherische Form in der Aura wird der Wille aktiver, und das ist der Wille, der vom Kristallisierer ergriffen wird. Schaut es einfach nicht komisch an.\n\tDamit der Dämonenkristallisierer funktioniert, muss er in einem Chunk mit einem hohen Anteil an Dämonen-Willen (80) eines bestimmten Typs stehen. Nach einer gewissen Zeit wird er den Willen der Aura verbrauchen, um eine Gruppe Dämonenkristalle mit einem einzigen Turm zu erschaffen. Es gibt zwei Möglichkeiten, wie der Kristallisierer wirken kann: Er kann einen Kristall aus einem bestimmten Willenstyp (korrosiv, zerstörerisch, rachsüchtig und unerschütterlich) bilden, wenn es genug Willen dieses bestimmten Typs gibt, oder er wird den rohen Willen aus der Aura nehmen, um einen Kristall zu erschaffen. In früheren Inkarnationen des Geräts war es möglich, rohen Willen aus der Aura in andersartige Kristalle zu verwandeln. Das ist jedoch nicht mehr der Fall: Ihr könnt immer noch neue Türme eines bestimmten, angestrebten Willens erschaffen, wenn es genug davon in der Aura gibt, aber ihr müsst andere Mittel suchen, um die vielen Aspekte vom rohen Willen zu trennen. Siehe den Eintrag "Resonanz des facettierten Kristalls" in "Der Ritualmeister" für weitere Details. -guide.bloodmagic.entry.demon.cluster.info=Der Dämonen-Kristallhaufen kann entweder von einem Dämonen-Kristallisator oder in der Höllenfeuer-Schmiede mit Dämonen-Will-Kristallen erschaffen werden. Handwerkliche Cluster können auf jeder festen Oberfläche, wie z.B. dem Boden, den Wänden und den Decken platziert werden. Es gibt maximal sieben Türme auf dem Kristall, wenn er ausgewachsen ist, und wenn er mit einer Spitzhacke gebrochen wird, wird er die Türme als Dämonen-Will-Kristalle fallen lassen. Wenn du jedoch mit der rechten Maustaste auf den Cluster klickst, wenn du einen Weinstein mit mehr als 1024 rohem Willen in ihm hast, kannst du einen einzelnen Turm aus dem Cluster abbrechen, ohne den Cluster selbst zu brechen; dies wird niemals den Hauptturm aus dem Cluster brechen.\n\tWenn der Cluster zu seinen eigenen Geräten zurückkehrt, wird er einen Willen des gleichen Typs aus der Aura absaugen, um sich langsam zu entwickeln. Es gibt zwei Rituale, die benutzt werden, um diese Kristalle zu züchten und zu ernten: die "Versammlung der Verlassenen Seelen" und der "Riss des gebrochenen Kristalls ". Um herauszufinden, wie man sie benutzt, finde diese in "Der Ritualmeister". +guide.bloodmagic.entry.demon.cluster.info=Der Dämonen-Kristallhaufen kann entweder von einem Dämonen-Kristallisator oder in der Höllenfeuer-Schmiede mit Dämonen-Will-Kristallen erschaffen werden. Handwerkliche Cluster können auf jeder festen Oberfläche, wie z.B. dem Boden, den Wänden und den Decken platziert werden. Es gibt maximal sieben Türme auf dem Kristall, wenn er ausgewachsen ist, und wenn er mit einer Spitzhacke gebrochen wird, wird er die Türme als Dämonen-Will-Kristalle fallen lassen. Wenn du jedoch mit der rechten Maustaste auf den Cluster klickst, wenn du ein Tartarisches Juwel mit mehr als 1024 rohem Willen in ihm hast, kannst du einen einzelnen Turm aus dem Cluster abbrechen, ohne den Cluster selbst zu brechen; dies wird niemals den Hauptturm aus dem Cluster brechen.\n\tWenn der Cluster zu seinen eigenen Geräten zurückkehrt, wird er einen Willen des gleichen Typs aus der Aura absaugen, um sich langsam zu entwickeln. Es gibt zwei Rituale, die benutzt werden, um diese Kristalle zu züchten und zu ernten: die "Versammlung der Verlassenen Seelen" und der "Riss des gebrochenen Kristalls ". Um herauszufinden, wie man sie benutzt, finde diese in "Der Ritualmeister". guide.bloodmagic.entry.demon.pylon.info=Wie ihr vielleicht wisst, bleibt die Dämonen-Aura in ihrem eigenen Chunk, wenn es keine äußeren Einflüsse gibt. Nun, das ist einer dieser Einflüsse. Der Dämonenpylon fungiert als Leuchtfeuer für den Willen in der Aura und zieht den Willen aus den benachbarten Chunks (die Chunks, die in den vier Himmelsrichtungen direkt daneben liegen, nicht diagonal) in seinen Chunk. Der Pylon wird versuchen, den Willen in seinem Chunk mit seinem Nachbarn auszugleichen, so dass der Chunk des Pylons für jeden Willenstyp so viel Willen hat wie sein höchster Nachbar. Dieser Prozess geschieht jedoch nur in eine Richtung: Wenn der benachbarte Teil weniger Wille hat als der Teil des Pylons, wird der Wille nicht auf die Nachbarn übertragen. guide.bloodmagic.entry.demon.gauge.info=Um zu sagen, wie viel Wille du in einem bestimmten Chunk hast, brauchst du einen Dämonischen Auramesser. Wenn sich dieser in deinem Inventar befindet, zeigt die Anzeige den Willen in dem Chunk an, welcher auf fünf Balken oben links auf dem Bildschirm abgebildet wird. Wie viel es genau ist, kann an der Verschiebung erkannt werden; rechts neben den Balken erscheinen Zahlen, die den Betrag auf die nächste ganze Zahl gerundet darstellen. diff --git a/src/main/resources/assets/bloodmagicguide/lang/en_US.lang b/src/main/resources/assets/bloodmagicguide/lang/en_US.lang index 4107efc8..eb1d180a 100644 --- a/src/main/resources/assets/bloodmagicguide/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagicguide/lang/en_US.lang @@ -66,15 +66,17 @@ guide.bloodmagic.entry.ritual.eternalSoul=Ritual of the Eternal Soul guide.bloodmagic.entry.ritual.condor=Reverence of the Condor guide.bloodmagic.entry.ritual.featheredEarth=Ritual of the Feathered Earth guide.bloodmagic.entry.ritual.grounding=Ritual of Grounding +guide.bloodmagic.entry.ritual.veilOfEvil=Veil of Evil +guide.bloodmagic.entry.ritual.wardOfSacrosanctity=Ward of Sacrosanctity # Ritual Master Entry Text guide.bloodmagic.entry.ritual.intro.info=Good evening. My name is Magus Arcana. I have had many guises over the years: a thief and a vigilante, a wizard and a warrior, a roaming nomad and even a politician. The title that I hold nowadays is one that many cannot comprehend, that at the very mention of it brings forth images of brutality that in some cases have been earned but in many others are misguided. I am of course talking about being a Blood Mage, though my friends simply call me Magus whereas my enemies refer to me as The Ritual Master.\n\tMy students have been pestering me for many months now, attempting to get me to document all of the myriad adventures that I have had in some form of book for me to distribute among any aspiring mages. I had been resistant, but it was Tiberius who put it best: "Although you may not see the value of it yourself, hearing the intricacies of any sort of craft from a man who has achieved mastership of the field will prove invaluable for future generations. It doesn't matter how accurately someone else retells it, if you don't have the utmost confidence in a source the gold sand could be nothing more than sulfur." You could tell he was delving into a bit of alchemy at that point, but since he was my first student for a long time I tend to value his opinion.\n\tSo, aspiring Blood Mage, training in the arcane that many yet do not fully understand, lend me your ears for these are words worth heeding: the field that you are studying has many aspects, and without careful consideration you may find your tools lacking. Therefore make sure to review this book often - I have put many enchantments on the tome that you carry with you so that whenever I write in my master copy the words will change for you.\n\tSo sit back, relax, and enjoy the teachings of a very old man. You may learn more than you've bargained for. guide.bloodmagic.entry.ritual.basics.info=Modern day rituals are a lot different from those that were conducted centuries past. There was a time when people would inscribe arcane constructs out of dust on the ground and dance around until they got what they wanted. I even remember one hermit witch who gathered energy from her garden. I laughed at it all until she sicced her pet owl on me. \n\tThe rituals that Blood Mages use require the precise alignment of marked stones to focus and transform the power that a mage pumps into it. One day, my apprentice Tiberius was rummaging through some of the old artifacts that I had procured over the years in the closet of his new room. There was a vial of liquid Etherium that I haven't touched in ages (I was meaning to get back to that, but I haven't had any time) as well as a crystal ball that always seemed to say "Tuesday" when you peered through the glass. When one of the boxes that was labeled "Runic Dust" was knocked over a small red gem tumbled out and knocked against Tiberius's foot. Immediately a bright ruby light emanated from it and reacted with the dust in the box that he was carrying.\n\tNaturally, an explosion occurred. The unfocused energy that Tiberius inadvertently released through the gem sparked the runic dust and stones around him, and without a means of containing the power it simply was pushed outwards. After a few days in the medical ward, Tiberius and I started to get to work.\n\tThrough a mixture of several sleepless nights and a hardy helping of caffeine (I've really got to thank Mister Player for the coffee supply, I salute your efforts for a more awake tomorrow!) we eventually perfected the key ingredients for all rituals.\n\tThrough our experimentation, we learned that we needed four different things: we needed a bunch of ritual stones placed around an area in a set pattern, a few different inks that are applied to the ritual stones to help further specify the pattern, a central ritual stone that acts as a central conduit of power, and a crystal that activates the ritual. I think it's best to talk about these one by one. guide.bloodmagic.entry.ritual.ritualStone.info.1=The Ritual Stone acts as a simple receptacle for magical energy, shaping it and further redirecting it in different ways depending on how the stone is configured. When you start off, there are five different stones that you have access to: Blank (the base stone that does not have any markings applied), Water, Fire, Air, and Earth. Every single ritual will have a number of these, and depending on how they are arranged around the Master Ritual Stone the overall effect will be different. guide.bloodmagic.entry.ritual.ritualStone.info.2=In order to inscribe the correct symbols onto the ritual stones you must have a set of inscription tools. I have since developed a method for people to more easily apply the correct inks to the ritual stones while placing them in the correct configuration, but if one were to wish to do this manually they can use these tools. When you activate a ritual stone with one of the inscription tools in your hand (right clicking on the stone) you will apply some ink to the stone, changing it to the same type as the tool. In early tiers, you only have access to the base four colours, however once you become more powerful you will have more tools at your disposal. -guide.bloodmagic.entry.ritual.masterRitualStone.info=As with most magics, without a guiding force the effect of the ritual will either become uncontrollable or simply will not work at all. Thus, in order to control the rituals a Master Ritual Stone is required (I usually abbreviate this to "MRS" in my notes, but saying it in public is a little awkward. "I need more mrs please!"). The MRS takes in power from the owner's Soul Network and pushes it through the ritual stones, thus performing the ritual. \n\tAttaching the Soul Network to a large stone that we don't hold in our hands proved to be a bit tricky. I managed to do this one time by meditating on top of the stone in the lotus position, focusing my power through the stone and trying to link the tendrils of my network into the inner workings of the ritual. Although I got it working for a few minutes, all I was really awarded was a pair of wet pants as water condensed onto the ritual stones. I've learned to not meditate on any of my experiments again. +guide.bloodmagic.entry.ritual.masterRitualStone.info=As with most magics, without a guiding force the effect of the ritual will either become uncontrollable or simply will not work at all. Thus, in order to control the rituals a Master Ritual Stone is required (I usually abbreviate this to "MRS" in my notes, but saying it in public is a little awkward. "I need more mrs please!"). The MRS takes in power from the owner's Soul Network and pushes it through the ritual stones, thus performing the ritual. \n\tAttaching the Soul Network to a large stone that we don't hold in our hands proved to be a bit tricky. I managed to do this one time by meditating on top of the stone in the lotus position, focusing my power through the stone and trying to link the tendrils of my network into the inner workings of the ritual. Although I got it working for a few minutes, all I was really awarded was a pair of wet pants as water condensed onto the ritual stones. I've learned to not meditate on any of my experiments again. guide.bloodmagic.entry.ritual.activationCrystal.info.1=Instead of waiting an hour at a time to meditate a ritual active, we took the red gem that fell out of the box originally and started to analyze it. Tiberius was certain that it had the ability to "establish links between the corporeal realm of our reality and the incorporeal essence that is the manifested Soul Network." Sometimes I wonder if it was a good idea to have him become my apprentice, but it is times like these that I see his knack for the more arcane aspects of magic. Oh, I should probably write what he meant in English: by using this crystal, we could link our soul networks to the Master Ritual Stone in order to supply it with energy. -guide.bloodmagic.entry.ritual.activationCrystal.info.2=Thus we had ourselves a Weak Activation Crystal and a means in which to recreate its structure. The main ingredient for the crystal is another crystal that can be linked to my Soul Network: a Lava Crystal. Then, by quickly inscribing some instructions onto the crystal's surface the Blood Altar can do the rest of the work to transmute it into an activation crystal. Naturally, this crystal has to be bound to the user's soul network in order to function. When the ritual's stones are laid correctly around the MRS, the user should touch the activation crystal to the MRS and push out enough energy to jump start the ritual in question. If you have enough LP inside of your Soul Network the ritual will activate. If you do not, or if the stones are not laid out correctly, the ritual will simply not activate and no LP cost is incurred. +guide.bloodmagic.entry.ritual.activationCrystal.info.2=Thus we had ourselves a Weak Activation Crystal and a means in which to recreate its structure. The main ingredient for the crystal is another crystal that can be linked to my Soul Network: a Lava Crystal. Then, by quickly inscribing some instructions onto the crystal's surface the Blood Altar can do the rest of the work to transmute it into an activation crystal. Naturally, this crystal has to be bound to the user's soul network in order to function. When the ritual's stones are laid correctly around the MRS, the user should touch the activation crystal to the MRS and push out enough energy to jump start the ritual in question. If you have enough LP inside of your Soul Network the ritual will activate. If you do not, or if the stones are not laid out correctly, the ritual will simply not activate and no LP cost is incurred. guide.bloodmagic.entry.ritual.diviner.info.1=After discerning the size and layout of many rituals I started to find it a little bothersome to continually consult my notes in order to build the rituals. That is why I worked to create a device that would allow anyone to simply place down the stones in the correct position through simple gestures and movements. I've placed this entry further up the list chronologically because it is best for people to learn of this item before starting with the actual construction of rituals. Otherwise they may find out that they don't have everything they need, or will summon a meteor from hell instead of a fresh bottle of spring water. guide.bloodmagic.entry.ritual.diviner.info.2=The Ritual Diviner is essentially an encyclopaedia for rituals. By cycling through the diviner (shift-left click and shift-right click) you can select a different ritual from its store of knowledge. Gazing into the diviner will also tell you some simple information about the ritual. If you have Ritual Stones on your person and you touch the diviner onto the MRS (right click) you can place a stone for the ritual you want to construct. Doing this enough times will net you a completed ritual! guide.bloodmagic.entry.ritual.fullSpring.info=A few years ago a travelling merchant stopped by the village near my house, peddling his wares to all who were willing to part with their coin. There was a drought at the time and the crops were dying, so the merchant brought forth a silver talisman with a blue gem set inside of it. "This, my friends," he said with great zeal, "will make sure that your rivers will not dry out! By using alchemy I can bring forth water from the very air!"\n\tUnfortunately for the village it seemed that the gem was a simple piece of sapphire, and before anyone realized that they were tricked he was already several miles away. I tend to not intervene in the affairs of the village because they tend not to like my magic, but in this case I made an exception. After I had a lovely chat with the "alchemist," I spent a few hours meditating near the irrigation channels. By condensing the water vapour in the air I managed to create enough water to keep the crops watered until the next downfall. This wasn't exactly an efficient method and I was drained for the next few days, using some of the water from the channel to rehydrate myself.\n\tRemembering this, I employed the same principles to create the Ritual of the Full Spring. By channeling a small amount of energy into the ritual, it condenses the moisture in the air around it to produce a source of water on top of the master ritual stone. The cost to activate the ritual is fairly insignificant, and the maintenance even more so. \n\tThe water's range can be expanded by using the ritual tinkerer and even placed in a different location, so one does not need to worry about where a ritual is placed if they are worrying about aesthetics. The miracles of magic! @@ -84,7 +86,7 @@ guide.bloodmagic.entry.ritual.magnetism.info=The Ritual of Magnetism is the brea guide.bloodmagic.entry.ritual.crusher.info=The Ritual of the Crusher's operation is rather simple. The ritual needs to have some form of inventory linked to it, which when unaltered simply sits on top of the MRS. While in operation, the ritual will look inside of its crushing range (by default the 3x3x3 area below the ritual) and break one block at a time at a rate of once every 2 seconds at the cost of 7 LP per successful operation. The broken blocks will then be transferred to the linked inventory - if there is no room for the items, they will instead be spewed on top of the chest.\n\tWhen fueled with Raw Will, the ritual will work at a faster rate based on the total amount of Will in the Aura. While sped up, it will consume 0.05 Raw Will per successful operation.\n\tDestructive Will causes blocks that are broken by the ritual to have Fortune applied to it. Currently the fortune level does not vary and is instead level 3 regardless of the Will amount. This will consume 0.2 Will per successful operation, regardless of whether it was useful.\n\tSteadfast Will will instead cause blocks to be broken with the Silk Touch effect. This costs 0.02 Will per operation, and will override the Destructive effect where possible.\n\tCorrosive Will makes it so that blocks that are broken by the ritual will be processed with some form of cutting fluid. This means that for instance if it is an iron block the result will be two pieces of iron sand. The current "cutting fluids" that the ritual uses are: Basic Cutting Fluid and Explosive Powder. The ritual consumes a different amount of Will based on what was used, and will only consume the Will if the effect applies. This overrides Silk Touch where applicable.\n\tVengeful Will causes it so that when a successful operation takes place the inventory has its contents compressed similar to the Sigil of Compression: if there is 65 redstone dust inside of the chest, one block of redstone will be crafted and 56 dust will remain. Will is only consumed when this is successful, and it costs 0.2 Will. guide.bloodmagic.entry.ritual.highJump.info=This ritual uses a huge burst of air to propel all those who walk on top of it into the sky. What is more, if the user lands in the ritual's area of effect they will not suffer any fall damage. Players who sneak inside this ritual also are not affected.\n\tThe ritual costs 5LP per entity per tick of successful operation, so it won't cost anything if it doesn't fling people in the air. guide.bloodmagic.entry.ritual.speed.info=As the name may suggest, the Ritual of Speed is used for transportation of various sorts. The ritual may be placed in the direction of any of the cardinal directions and any entities within its range will be launched in the direction that the ritual is pointing. When looking at a ritual, this direction is where the dusk ritual stone is. By default, the ritual has a radius of 2 blocks from the MRS, though this can be expanded or contracted when using a ritual tinkerer. This will apply a speed of 3 blocks/tick in the direction of the ritual and 1.2 blocks/tick vertically.\n\tIf the ritual is fueled with Raw Will, the speed of the ritual is increased substantially based on the Will that is in the Aura. For instance, the speed will be doubled if there is 100 Will inside of the Aura. For each successful operation, 0.1 Will is consumed.\n\tVengeful Will prevents the ritual from moving adult mobs, and Destructive Will prevents the ritual from moving child mobs. If either one of these are used, players are also prevented from using the ritual. If both of them are used, however, the effect is that only players may use the ritual and mobs cannot. These augmentations can be used effectively for sorting animal farms or even getting rid of those pesky child zombies in your sacrificial pen. The ritual will consume 0.05 Will for each type that is in effect on successful operation, so if a child enters the ritual space when you use Destructive Will it will not cost Will or LP. -guide.bloodmagic.entry.ritual.wellOfSuffering.info=For those of you who prefer to use mobs instead of your own health, the Well of Suffering damages all living non-player entities in a 10 block radius and places the health in a connected altar. The ritual will look for a blood altar within its range, checking 5 blocks horizontally and 10 blocks vertically unaltered. When it finds an altar, it will store its location internally - if there isn't an altar nearby, the ritual will not work. The ritual will deal 1 HP per entity and place 25 LP into the altar (100 for peaceful animals), which can be augmented with Sacrifice runes. +guide.bloodmagic.entry.ritual.wellOfSuffering.info=For those of you who prefer to use mobs instead of your own health, the Well of Suffering damages all living non-player entities in a 10 block radius and places the health in a connected altar. The ritual will look for a blood altar within its range, checking 5 blocks horizontally and 10 blocks vertically unaltered. When it finds an altar, it will store its location internally - if there isn't an altar nearby, the ritual will not work. The ritual will deal 1 HP per entity and place 25 LP into the altar (100 for peaceful animals), which can be augmented with Sacrifice runes. guide.bloodmagic.entry.ritual.featheredKnife.info=The Ritual of the Feathered Knife taps into the user's body, draining away their life force in order to fill a blood altar nearby. The ritual will look for a blood altar within its range, checking 5 blocks horizontally and 10 blocks vertically unaltered. When it finds an altar, it will store its location internally - if there isn't an altar nearby, the ritual will not work. When a player then enters within the ritual's damage range, which by default is a radius of 15 blocks horizontally and 20 blocks vertically, the ritual will damage the player for 1HP and then place that health into the connected altar directly (respecting blood runes). There are some safety mechanisms on the ritual, which cause it to not work on a player with less than 30%% of their max health. Unaugmented, the ritual does this once every second.\n\tThere are a few useful augmentations that you can use if you use Demon Will. If Raw Will is consumed by the ritual, the ritual will attempt to damage players within its range at a faster rate, operating twice per second. The ritual will consume 0.05 Raw Will per successful operation.\n\tIf you have more than 10 Steadfast Will in the Aura, the ritual will increase its safety threshold and instead will not work on players with less than 70%% health. This function currently does not consume Will.\n\tIf you have more than 10 Vengeful Will in the Aura, the ritual will remove some of its safety limitations, causing it to work on players until they only have 10%% of their maximum health left. If the ritual also has Steadfast Will augmented onto it the threshold will still be 70%% for the owner of the ritual only. This function currently does not consume Will.\n\tWhen Destructive Will is applied to the ritual, the ritual becomes a lot more efficient with its HP to LP conversion. The amount of LP that is added to the altar per health point increases based on the Will in the Aura, up to a maximum of +20%% for 100 Destructive Will. This effect stacks multiplicatively with runes, Living Armour Upgrades, and Incense. This consumes 0.05 Destructive Will per HP sacrificed.\n\tSpeaking of incense, if Corrosive Will is used in the ritual the ritual will respect the effects of incense on you. If you do not have the Soul Fray debuff on and you are empowered by an Incense Altar, the ritual will consume all of your HP up to the set threshold and pump all of the resultant LP into the altar. It will also remove the incense that you incurred and apply Soul Fray onto you. This effect stacks with the Destructive Will buff. guide.bloodmagic.entry.ritual.regen.info=Arguably one of the best rituals for any potential Blood Mage who wishes to use his own life force to fuel his magic, the Ritual of Regeneration casts a veil of energy around itself, healing entities that find themselves within its range. Every 2.5 seconds the ritual will cast Regeneration I on living entities in its 15 block radius, costing 100LP per player and 10LP per other living entities for the 2.5 seconds of regen. \n\tIf Corrosive Will is used to augment the ritual a second range will be available, a "vampiric range". Any non-player entities within this range will be randomly damaged in order to directly heal players within the regular healing range. This costs 0.04 Will to use and will transfer 1HP per operational tick. guide.bloodmagic.entry.ritual.harvest.info=This ritual will seek any harvestable plant block within its range (default is the 9x9x5 high area above the MRS) and try to harvest it, replanting any seeds if the plant can drop seeds. All of the drops from the plant will appear where the plant was harvested. The ritual will attempt to harvest plants once every 5 ticks and will cost 20LP per successful operation.\n\tPlants that can be harvested include, but are not limited to: pumpkins, wheat, carrots, potatos, nether wart, cactus, reeds. Keep in mind that the ritual makes no assumptions about the thing it is harvesting - it can only harvest mod-added crops if the mod in question registers a harvesting handler with the mod. @@ -112,7 +114,9 @@ guide.bloodmagic.entry.ritual.fullStomach.info=##REQ-LORE##\n\t The Ritual of th guide.bloodmagic.entry.ritual.eternalSoul.info=##REQ-LORE##\n\t The Cry of the Eternal Soul is capable of feeding LP from the Soul Network back into an altar. This falls under the usual restrictions of pumping (liquid) Life Essence into an altar. Every point of LP transferred into the altar costs 2 LP from the network.\n\t Activiation Cost: 2,000,000LP\n\t Cost per operation: 2*transferLP guide.bloodmagic.entry.ritual.condor.info=##REQ-LORE##\n\t The Reverence of the Condor allows flight for players in a local area around the ritual.\n\t Activation Cost: 1,000,000LP\n\t Cost per operation: 2LP guide.bloodmagic.entry.ritual.featheredEarth.info=##REQ-LORE##\n\t The Ritual of the Feathered Earth constantly reduces the fall height to 0, effectivly eliminating fall damage.\n\t Activation Cost: 5,000LP\n\tCost per second: 20LP -guide.bloodmagic.entry.ritual.grounding.info=##REQ-LORE##\n\ŧ The Ritual of Grounding manipulates the gravity in its area. By default, it drags mobs to the ground and prevents jumping.\n\t Supplying the ritual with Raw Will makes it affect players in addition to mobs.\n\t Corrosive Will simply disables gravity all together.\n\t Destructive Will vastly increases fall damage of affected entities.\n\t Steadfast Will allows the ritual to affect bosses.\n\t Vengeful Will alone amplifies the grounding effect, in combination with Corrosive Will, however, it transforms the ritual to provide levitation instead. Vengeful Will also increases the effect of Heavy Heart, increasing fall damage even more.\n\t Activiation Cost: 5,000LP\n\tCost per second: 20LP +guide.bloodmagic.entry.ritual.grounding.info=##REQ-LORE##\n\t The Ritual of Grounding manipulates the gravity in its area. By default, it drags mobs to the ground and prevents jumping.\n\t Supplying the ritual with Raw Will makes it affect players in addition to mobs.\n\t Corrosive Will simply disables gravity all together.\n\t Destructive Will vastly increases fall damage of affected entities.\n\t Steadfast Will allows the ritual to affect bosses.\n\t Vengeful Will alone amplifies the grounding effect, in combination with Corrosive Will, however, it transforms the ritual to provide levitation instead. Vengeful Will also increases the effect of Heavy Heart, increasing fall damage even more.\n\t Activiation Cost: 5,000LP\n\tCost per second: 20LP +guide.bloodmagic.entry.ritual.veilOfEvil.info=##REQ-LORE##\n\t The Veil of Evil casts a magical shroud over its area, allowing mobs to form where they usually would not. Spawns following vanilla rules will be forced to spawn. Spawns that are denied will follow vanilla spawning rules. +guide.bloodmagic.entry.ritual.wardOfSacrosanctity.info=##REQ-LORE##\n\t The Ward of Sacrosanctity provides a powerful ward, preventing mobs from forming even though they usually would. Spawns following vanilla rules will be prevented from spawning. Spawns that are forced or allowed will follow vanilla spawning rules. # Architect Entries guide.bloodmagic.entry.architect.intro=Foreword diff --git a/src/main/resources/assets/bloodmagicguide/lang/ru_RU.lang b/src/main/resources/assets/bloodmagicguide/lang/ru_RU.lang new file mode 100644 index 00000000..236db6e7 --- /dev/null +++ b/src/main/resources/assets/bloodmagicguide/lang/ru_RU.lang @@ -0,0 +1,239 @@ +# Book Information +guide.bloodmagic.title=Наука крови +guide.bloodmagic.display=Наука крови +guide.bloodmagic.author=Blood Magic +guide.bloodmagic.welcome=Blood Magic + +# Page Information +guide.bloodmagic.page.bloodAltar=Рецепт Кровавого Алтаря +guide.bloodmagic.page.soulForge=Рецепт Кузницы Адского Пламени +guide.bloodmagic.shapelessOrb=Бесформенный рецепт шара +guide.bloodmagic.shapedOrb=Форменный рецепт шара + + +# Categories +guide.bloodmagic.category.architect=Архитектор +guide.bloodmagic.category.ritual=Ритуал Мастер +guide.bloodmagic.category.demon=Демон Кин +guide.bloodmagic.category.spell=Боевой Маг +guide.bloodmagic.category.alchemy=Алхимик + +# Ritual Master Entries +guide.bloodmagic.entry.ritual.intro=Вступление + +# Ritual Master Entry Text +guide.bloodmagic.entry.ritual.intro.info=Добрый вечер. Меня зовут Магус Аркана. За эти годы у меня было много обликов: вор и дружинник, волшебник и воин, бродячий кочевник и даже политик. Название, которое я держу в настоящее время, - это то, что многие не могут понять, что при самом упоминании о нем возникают образы жестокости, которые в некоторых случаях были заслужены, но во многих других введены в заблуждение. Я, конечно, говорю о том, чтобы быть Кровавым Магом, хотя мои друзья просто называют меня Магом, тогда как мои враги называют меня Мастером Ритуала.\n\tМои ученики приставали ко мне уже много месяцев, пытаясь заставить меня задокументировать все бесчисленные приключения, которые у меня были, в какой-то форме книги, которую я мог бы распространять среди любых начинающих магов. Я был настойчив, но это был Тиберий, который выразил это лучше всего: «Хотя вы, возможно, и сами не сможете оценить его ценность, услышать тонкости любого рода ремесла от человека, который достиг мастерства в этой области, окажется неоценимым для будущих поколений. «Неважно, насколько точно кто-то другой пересказывает это, если у вас нет полной уверенности в источнике, золотой песок может быть не чем иным, как серой». Вы могли бы сказать, что в тот момент он углублялся в алхимию, но так как он долгое время был моим первым учеником, я склонен ценить его мнение.\n\tТак, начинающий кровавый маг, тренирующийся в тайне, который многие еще делают не до конца понимаю, подайте мне уши, потому что эти слова заслуживают внимания: область, которую вы изучаете, имеет много аспектов, и без тщательного рассмотрения вы можете обнаружить, что ваши инструменты не хватает. Поэтому не забывайте часто читать эту книгу - я вложил много чар в книгу, которую вы носите с собой, чтобы всякий раз, когда я пишу в своей основной копии, слова менялись для вас.\n\tТак что сядьте, расслабьтесь и наслаждайтесь учением очень старого человека. Вы можете узнать больше, чем вы рассчитывали. +guide.bloodmagic.entry.ritual.basics.info=Современные ритуалы дня сильно отличаются от тех, которые проводились в прошлом. Было время, когда люди писали на земле тайные конструкции из пыли и танцевали, пока не получили то, что хотели. Я даже помню одну ведьму-отшельницу, которая собирала энергию из ее сада. Я смеялась над всем этим, пока она не накурила на меня свою любимую сову. \n\tРитуалы, которые используют Маги Крови, требуют точного выравнивания отмеченных камней, чтобы сфокусировать и преобразовать силу, которую маг накачивает в него. Однажды мой ученик Тиберий копался в некоторых старых артефактах, которые я приобрел за эти годы в шкафу его новой комнаты. Был флакон с жидким Этериумом, которого я не трогал целую вечность (я хотел вернуться к этому, но у меня не было времени), а также хрустальный шар, который, казалось, всегда говорил «вторник», когда вы вгляделся в стекло. Когда одна из коробок с надписью «Руническая пыль» была опрокинута на маленькую красную жемчужину, она упала на ногу Тиберия. Сразу же от него исходил яркий рубиновый свет, который реагировал с пылью в коробке, которую он нес.\n\tЕстественно, произошел взрыв. Несфокусированная энергия, которую Тиберий непреднамеренно высвободил через драгоценный камень, зажгла руническую пыль и камни вокруг него, и без средств удержания силы ее просто вытолкнули наружу. После нескольких дней в медицинском отделении мы с Тиберием приступили к работе.\n\tБлагодаря сочетанию нескольких бессонных ночей и крепкой порции кофеина (я действительно должен поблагодарить Мистера Плейера за поставку кофе, я приветствую ваши усилия по более бодрствующему завтра!), В итоге мы усовершенствовали ключевые ингредиенты для всех ритуалов.\n\tВ результате наших экспериментов мы узнали, что нам нужны четыре разные вещи: нам нужна куча ритуальных камней, помещенных вокруг области по заданному шаблону, несколько разных чернил, которые наносятся на ритуальные камни, чтобы помочь в дальнейшем определить образец, центральный ритуал камень, который действует как центральный канал власти, и кристалл, который активирует ритуал. Я думаю, что лучше поговорить об этом один за другим. +guide.bloodmagic.entry.ritual.ritualStone.info.1=Ритуальный Камень действует как простая емкость для магической энергии, формирует ее и дополнительно перенаправляет по-разному в зависимости от конфигурации камня. Когда вы начинаете, есть пять различных камней, к которым у вас есть доступ: Пустой (базовый камень, на который не нанесена маркировка), Вода, Огонь, Воздух и Земля. Каждый ритуал будет иметь несколько из них, и в зависимости от того, как они расположены вокруг Мастерского ритуального камня, общий эффект будет разным. +guide.bloodmagic.entry.ritual.ritualStone.info.2=Чтобы вписать правильные символы в ритуальные камни, у вас должен быть набор инструментов для надписи. С тех пор я разработал метод, позволяющий людям легче наносить правильные чернила на ритуальные камни, помещая их в правильную конфигурацию, но если кто-то захочет сделать это вручную, они могут использовать эти инструменты. Когда вы активируете ритуальный камень с помощью одного из инструментов для надписи в руке (щелкнув правой кнопкой мыши по камню), вы нанесете немного чернил на камень, изменив его на тот же тип, что и инструмент. На ранних уровнях у вас есть доступ только к четырем базовым цветам, однако, как только вы станете более могущественным, в вашем распоряжении будет больше инструментов. +guide.bloodmagic.entry.ritual.masterRitualStone.info=Как и в случае большинства магии, без направляющей силы эффект ритуала либо станет неуправляемым, либо просто не будет работать вообще. Таким образом, для того, чтобы контролировать ритуалы, требуется Мастерский ритуальный камень (я обычно сокращаю это до «MRS» в своих заметках, но говорить это публично немного неловко. «Мне нужно больше миссис, пожалуйста!»). MRS получает власть от Сети Души владельца и проталкивает ее через ритуальные камни, таким образом выполняя ритуал. \n\tПрисоединение Сети Души к большому камню, который мы не держим в руках, оказалось немного сложным. Мне удалось сделать это один раз, медитируя на вершине камня в позе лотоса, сосредотачивая свою силу через камень и пытаясь связать усики моей сети с внутренней работой ритуала. Хотя я работал несколько минут, все, что я был действительно награжден, - это пара мокрых штанов, когда вода ринулась на ритуальные камни. Я научился не медитировать ни на одном из моих экспериментов снова. +guide.bloodmagic.entry.ritual.activationCrystal.info.1=Вместо того чтобы ждать час за тем, чтобы медитировать ритуальный актив, мы взяли красный драгоценный камень, который изначально выпал из коробки, и начали его анализировать. Тиберий был уверен, что у него была способность «установить связи между телесным царством нашей реальности и бестелесной сущностью, которая является проявленной Сетью Души». Иногда я задаюсь вопросом, было ли хорошей идеей, чтобы он стал моим учеником, но в такие времена я вижу его ловкость в более загадочных аспектах магии. О, я, наверное, должен написать, что он имел в виду на английском: используя этот кристалл, мы могли бы связать наши сети душ с Камнем Мастера Ритуала, чтобы снабдить его энергией. +guide.bloodmagic.entry.ritual.activationCrystal.info.2=Таким образом, мы получили слабый активационный кристалл и средство для воссоздания его структуры. Основным компонентом кристалла является еще один кристалл, который может быть связан с моей сетью душ: кристалл лавы. Затем, быстро вписав некоторые инструкции на поверхность кристалла, Алтарь Крови может выполнить оставшуюся часть работы по превращению его в активационный кристалл. Естественно, этот кристалл должен быть связан с душевной сетью пользователя, чтобы функционировать. Когда камни ритуала правильно уложены вокруг MRS, пользователь должен прикоснуться к кристаллу активации к MRS и вытолкнуть достаточно энергии, чтобы начать этот ритуал. Если у вас достаточно LP внутри вашей Soul Network, ритуал активируется. Если вы этого не сделаете, или если камни не выложены правильно, ритуал просто не будет активирован, и никаких затрат на LP не будет. +guide.bloodmagic.entry.ritual.diviner.info.1=Изучив размер и расположение многих ритуалов, я начал находить, что немного скучно постоянно просматривать свои записи, чтобы составить ритуалы. Вот почему я работал над созданием устройства, которое позволяло бы кому-либо просто поместить камни в правильное положение с помощью простых жестов и движений. Я разместил эту запись дальше в хронологическом порядке, потому что людям лучше всего изучить этот предмет, прежде чем начинать с фактического построения ритуалов. В противном случае они могут узнать, что у них нет всего, что им нужно, или вызовут метеор из ада вместо свежей бутылки родниковой воды. +guide.bloodmagic.entry.ritual.diviner.info.2=Ritual Diviner - это энциклопедия ритуалов. Перебирая прорицатель (щелчок левой кнопкой мыши и щелчок правой кнопкой мыши), вы можете выбрать другой ритуал из хранилища знаний. Взгляд на прорицателя также расскажет вам простую информацию о ритуале. Если у вас есть ритуальные камни на вашем лице, и вы касаетесь предсказателя на MRS (щелчок правой кнопкой мыши), вы можете поместить камень для ритуала, который вы хотите построить. Делая это достаточно раз, вы получите завершенный ритуал! +guide.bloodmagic.entry.ritual.fullSpring.info=Несколько лет назад торговец остановился возле деревни возле моего дома, продавая свои товары всем, кто хотел расстаться со своей монетой. В то время была засуха, и посевы умирали, поэтому торговец принес серебряный талисман с голубым камнем внутри. «Это, друзья мои, - сказал он с большим усердием, - позаботится о том, чтобы ваши реки не высохли! Используя алхимию, я могу вывести воду из самого воздуха!»\n\tК несчастью для деревни, казалось, что этот драгоценный камень был простым кусочком сапфира, и, прежде чем кто-то понял, что их обманули, он уже был в нескольких милях отсюда. Я склонен не вмешиваться в дела деревни, потому что им не нравится моя магия, но в этом случае я сделал исключение. После того, как я мило поболтал с «алхимиком», я провел несколько часов, размышляя возле ирригационных каналов. Конденсировав водяной пар в воздухе, мне удалось создать достаточно воды, чтобы поливать урожай до следующего падения. Это был не совсем эффективный метод, и в течение следующих нескольких дней меня истощали, используя часть воды из канала для регидратации.\n\tПомня об этом, я использовал те же принципы для создания Ритуала Полной Весны. Направляя небольшое количество энергии в ритуал, он конденсирует влагу в воздухе вокруг него, создавая источник воды поверх основного ритуального камня. Стоимость активации ритуала довольно незначительна, а обслуживание тем более. \n\tДиапазон воды может быть расширен с помощью ритуальной повозки и даже помещен в другое место, поэтому вам не нужно беспокоиться о том, где находится ритуал, если они беспокоятся об эстетике. Чудеса магии! +guide.bloodmagic.entry.ritual.lava.info=Лава, пожалуй, один из самых элементарных источников энергии. Я не очень часто использую его в своих собственных исследованиях, потому что с ним может быть немного сложно работать - это не то, что вы можете использовать простое железное ведро, чтобы взять его! \n\tОдин один из местных тинкеров пришел ко мне домой однажды и спросил, есть ли поблизости какие-нибудь источники, поскольку недавно они приобрели какое-то новое оборудование, необходимое для питания. Я сказал, что их было несколько, но большинство из них уже были в собственности, но я решил приехать к нему, чтобы осмотреть устройство. \n\t Это был плавильный завод высотой не менее 5 метров и такой же ширины, подключенный к нескольким танки, которые стояли пустыми и бесплодными. Хотя я не был полностью уверен в том, как он работает, я мог сказать, что для этого идеально подойдет сырое тепло лавы - электричество будет работать хорошо, если его правильно модифицировать, но я мог сказать, что это не от Immersive Industries. \n\tПосле небольшого разговора с тинкером деньги перешли к другому, и я попросил его отойти в сторону, пока я готовил свои ритуальные камни. Чтобы исполнить то, что я хотел, я взял четыре огненных камня и расположил их в кресте вокруг основного ритуального камня, а затем сильно толкнул своим кристаллом активации, воображая процесс в своей голове. Теоретически это должно быть просто: взять несколько камней из глубины земли и сжать их с некоторой энергией, заставляя их плавиться под сильным давлением и превращаться в расплавленный. Эту лаву можно было бы извлечь из ритуального камня, и этот процесс можно повторить. Хотя теоретически это было просто, на практике это было немного сложно. Для моей простой сети в то время стоимость активации была довольно высокой из-за первоначального требуемого давления, и я не был готов к стоку каждого источника лавы. (20000 LP, чтобы активировать, 500 LP за исходный блок) \n\tЯ вышел из здания с усмешкой на моем лице, однако: танки были полны лавы, этого достаточно, чтобы держать тинкера в бизнесе на пару недель, пока он может обеспечить более постоянный источник лавы. Я все же собрал свои ритуальные камни после того, как закончил. \n\t ---------- \n\tБез изменений в ритуале, ритуал будет пытаться поместить источник лавы в блок непосредственно над собой по цене 500 LP за каждый тик, если есть это место, вытесняющее жидкости, если они текут. Этот диапазон размещения по умолчанию может быть расширен до 9 блоков на максимальном расстоянии 3 от ритуала. \n\tПри расширении ритуала с помощью Raw Will стоимость LP будет уменьшаться пропорционально воле, которая является в ауре, поглощающей волю, пропорционально количеству сохраненного LP. Использование этой воли может также предоставить возможность помещать лаву непосредственно во внутренние резервуары блока со скоростью, сравнимой с обычными ритуальными операциями. \n\tCorrosive Will заставляет ритуал инвертировать непобедимость, обеспечиваемую иммунитетом к огню, в результате чего все сущности, обладающие иммунитетом стрелять в пределах заданной области, которая будет серьезно повреждена в зависимости от количества Воли в Ауре. Те, кто не невосприимчив к огню, не пострадают от этого эффекта. \n\tПри мстительном желании, примененном к ритуалу, выделяется летучий газ, из-за которого Огненный предохранитель воздействует на всех неигровых сущностей в пределах указанного диапазона. Когда таймер дебаффа становится равным 0, сущность взорвется, силой взорвав их в воздух с помощью взрывной силы. \n\tDestructive Will увеличивает максимальную дальность и объем, на которые может влиять ритуал. Чем больше у вас будет, тем больше лавовых блоков можно разместить за один ритуал. К счастью, ритуал не истощает никакой Разрушительной Воли, однако, если ваша Воля падает и максимальный диапазон ритуала ниже того, на котором вы его установили, ритуал не будет работать вообще до тех пор, пока не будет исправлен. \n\tНаконец, Steadfast Will предоставит всем игрокам в пределах его диапазона бафф огнестойкости, время применения и стоимость которого в Воли зависят от количества Воли в Ауре. Необходимо соблюдать осторожность, потому что если вы подвержены воздействию огнестойкости, вы можете быть повреждены эффектом ритуала. +guide.bloodmagic.entry.ritual.greenGrove.info=На прошлой неделе я начал учить Тиберия своей междисциплинарной магии. Каждый мой ученик должен был изучать другую форму магии, изучая магию крови. Неважно, какой из них они выберут, пока он не потребляет какую-то форму ограниченного ресурса - я использовал магию из клана Арс с Дальнего Востока, но так как мировой источник Этерия был поглощен в дефицит это вымерло давно. \n\tТиберий решил изучить Тауматургию, которая использует магию мира, чтобы выполнить свою магию. Это хороший противовес магии крови, которая использует магию жизни. Таким образом, эти магические средства используют разные средства для выполнения одних и тех же задач. Чтобы продемонстрировать, я решил выделить различия с Тибериусом, когда речь заходит о росте урожая. \n\t "Тауматургия использует катализатор роста, который питается от Аспекты Herba", - заявляю я, указывая на блок-схему Essentia, прикрепленную к классной комнате. стены. Конечно, Тиберий сидел за единственным столом там, но иногда парню нужно повеселиться. «Небольшая струйка ауры и этой эссенции стимулирует процесс фотосинтеза растения, побуждая его расти, давая ему больше солнечной энергии. Этот процесс требует, чтобы почва была хорошо удобрена, иначе урожай может просто засохнуть и умереть». \ Затем я беру четыре ритуальных камня земли и воды и помещаю их в круг вокруг основного ритуального камня. «И наоборот, Blood Magic использует другой процесс». Во время разговора я активирую ритуал и покрываю его простой грязью. «Используя свою жизненную силу или энергию животных, вы можете удобрять растения таким образом, чтобы они не нуждались в таком большом количестве удобрений. По сути, они насильственно кормят растения, чтобы они всегда имели высокую концентрацию питательных веществ». . "\n\tЯ бросаю несколько семян в грязь и слегка прикрываю их, откупоривая и опорожняя флакон с водой из моей мантии. «Этот процесс не нуждается в дополнительном солнечном свете, потому что он использует другой источник энергии. Хотя он работает намного лучше, когда есть немного света - растение точно не привыкло к такого рода условиям!» \n\tA несколько побегов уже высунули свои листья из грязи, пока я объяснял, по-видимому, махая в ответ. Я чувствовал легкую нагрузку на свое тело, когда каждый новый лист прорастал, каждый раз незначительный, но при накоплении он начинал складываться. Закончив урок, я очистил эксперимент от грязи и решил прогуляться до деревни: у меня был бушель пшеницы, который нужно было продать. \n\t ---------- \n\tРитуал Зеленой рощи, как следует из названия, ускоряет темпы роста находящихся поблизости растений. Используя кровь игрока в качестве богатого удобрения, он будет пытаться вырастить все, что он считает растением, например, пшеницу и морковь, периодически выращивая что-либо в пределах своего диапазона. С помощью операций по умолчанию ритуал будет смотреть на область 3х3 на два блока выше себя и пытаться увеличивать каждый блок с вероятностью успеха 30 %% каждую секунду. При манипулировании с Ritual Tinkerer, ритуал может обрабатывать максимум 81 урожай за один раз в радиусе 5 блоков от MRS. Как еще одно примечание \n\t, когда оно дополнено волей демонов, есть несколько эффектов, которые можно получить. Если используется Необработанная Воля, ритуал будет выполнять все операции с ускоренной скоростью, потребляя 0,05 Воли за каждый успешный рост и увеличивая свою скорость относительно количества Воли в Ауре. \n\tЕсли вливается в Мстительную Волю, ритуал будет поглощать 0.05 Воля за успешный рост и увеличит вероятность того, что данный рабочий тик будет успешным на заводе. По умолчанию без Воли это составляет 30 %%, но, например, если у вас есть 100 Мстительного Воля, показатель увеличится до 80 %%. \n\tDestructive Воля увеличивает максимальный эффективный диапазон ритуала, то есть чем больше у вас будет, тем больше культур / растений, с которыми может справиться один ритуал. К счастью, ритуал не истощает никакой разрушительной воли, однако, если ваша воля падает и максимальный диапазон ритуала ниже того, на котором вы его установили, ритуал не будет работать вообще до тех пор, пока не будет исправлен. \n\tSteadfast Предоставит возможность установить область вокруг ритуала, которая будет автоматически обрабатываться и увлажняться. Кроме того, любое семя, которое находится в этом диапазоне, будет посеяно в соседнем блоке, если это возможно. Это стоит небольшого количества Устойчивой Воли, и ее эффекты не масштабируются с Воли в Ауре. \n\t Когда Коррозийная Воля используется в ритуале, фундаментальная природа ритуала может измениться. При поставке и правильной настройке нового диапазона на всех мобов, попадающих в зону влияния ритуала, будет применяться эффект «Пиявка». Каждые несколько тиков растения возле мобов будут повреждены, а моб будет поврежден пропорционально. Оплодотворение с помощью мобов может оказаться полезным! Каждые 10 секунд применения дебаффа на моба будет поглощаться 0,2 ед. +guide.bloodmagic.entry.ritual.magnetism.info=Ритуал магнетизма хлеб с маслом, кто пользуется карьерами. Ритуал создает вращающееся магнитное поле, подтягивание богатые руды с земли под ним и размещением содержимого в своей области. Это не вытесняет какой-либо камень, так что никакие зияющие отверстия не будут появляться на земле - при условии, что земля не полностью состоит из ротовой полости. Ритуал действует один раз каждые 40 тиков и расходы 50LP через успешную операцию.\n\tРадиус по умолчанию, которым управляет этот ритуал, составляет 3 блока в каждом кардинальном направлении, давая площадь 7x7 блоков с центром в MRS. Поскольку у ритуала в настоящее время нет никаких дополнений к Воли, вы можете только увеличить радиус действия для ритуала, поместив ценный блок непосредственно под MRS. Если используется железный блок, радиус становится равным 7. Если используется золотой блок, радиус становится равным 15. Наконец, если используется алмазный блок, радиус увеличивается до 31, что означает, что любая руда ниже ритуала в области 63x63 будет медленно подтянулся к своему объему 3x3x3 выше MRS. +guide.bloodmagic.entry.ritual.crusher.info=Ритуал действия дробилки довольно прост. Ритуал должен иметь какую-то форму инвентаря, связанную с ним, которая в неизмененном виде просто располагается поверх MRS. Во время работы ритуал будет смотреть в пределах своего диапазона дробления (по умолчанию область 3x3x3 ниже ритуала) и разбивать по одному блоку за раз со скоростью один раз каждые 2 секунды за счет 7 LP за успешную операцию. Затем разбитые блоки будут перенесены в связанный инвентарь - если нет места для предметов, они вместо этого будут извергаться сверху сундука.\n\tПри заправке сырой волей ритуал будет работать быстрее, в зависимости от общего количества воли в ауре. При ускорении он будет потреблять 0,05 необработанной воли за каждую успешную операцию.\n\tРазрушительная воля приводит к тому, что блоки, разбитые ритуалом, применяют к нему Фортуну. В настоящее время уровень состояния не меняется и составляет 3 уровня независимо от количества Воли. Это будет потреблять 0,2 Воли за успешную операцию, независимо от того, была ли она полезной.\n\tВместо этого, Steadfast Will будет разрушать блоки с помощью эффекта Silk Touch. Это будет стоить 0,02 Воли за операцию, и будет перекрывать эффект Разрушения, где это возможно.\n\tКоррозийная воля делает так, чтобы блоки, разбитые ритуалом, обрабатывались какой-либо формой смазочно-охлаждающей жидкости. Это означает, что, например, если это железный блок, результатом будет два куска железного песка. Текущие «смазочно-охлаждающие жидкости», которые используются в ритуале: базовая смазочно-охлаждающая жидкость и взрывчатый порошок. Ритуал потребляет различное количество Воли в зависимости от того, что было использовано, и будет потреблять Волю только в том случае, если применяется эффект. Это отменяет Silk Touch, где это применимо.\n\tМстительная воля приводит к тому, что при успешной операции инвентарь сжимает содержимое, аналогично символу сжатия: если внутри сундука 65 пыль красного камня, то будет создан один блок красного камня и останется 56 пыли. Воля потребляется только тогда, когда это успешно, и стоит 0,2 воли. +guide.bloodmagic.entry.ritual.highJump.info=Этот ритуал использует огромный взрыв воздуха, чтобы поднять всех тех, кто идет по нему, в небо. Более того, если пользователь приземлится в зоне действия ритуала, он не получит никакого урона от падения. Игроки, которые крадутся внутри этого ритуала, также не затрагиваются.\n\tРитуал стоит 5LP за единицу за такт успешной операции, поэтому ничего не будет стоить, если он не бросит людей в воздух. +guide.bloodmagic.entry.ritual.speed.info=Как следует из названия, Ритуал Скорости используется для транспортировки различных видов. Ритуал может быть размещен в направлении любого из основных направлений, и любые объекты в пределах его диапазона будут запущены в направлении, указанном ритуалом. При взгляде на ритуал, это направление, где находится сумеречный ритуал. По умолчанию ритуал имеет радиус 2 блока от MRS, хотя его можно расширить или сократить при использовании ритуала. Это будет применять скорость 3 блока / тик в направлении ритуала и 1,2 блока / тик по вертикали.\n\tЕсли ритуал заправлен Сырой Волей, скорость ритуала существенно увеличивается на основе Воли, которая находится в Ауре. Например, скорость будет удвоена, если внутри Ауры будет 100 Воли. На каждую успешную операцию расходуется 0,1 Воли.\n\tМстительная воля не позволяет ритуалу перемещать взрослых мобов, а Деструктивная воля не дает ритуалу перемещать детских мобов. Если один из них используется, игрокам также запрещается использовать ритуал. Однако, если они оба используются, эффект состоит в том, что только игроки могут использовать ритуал, а мобы - нет. Эти дополнения могут эффективно использоваться для сортировки ферм животных или даже избавления от этих надоедливых детских зомби в вашей жертвенной ручке. Ритуал будет потреблять 0,05 Воли для каждого типа, который действует при успешной операции, поэтому, если ребенок входит в ритуальное пространство, когда вы используете Разрушительную волю, это не будет стоить Уилла или LP. +guide.bloodmagic.entry.ritual.wellOfSuffering.info=Для тех из вас, кто предпочитает использовать мобов вместо собственного здоровья, колодец страданий наносит урон всем живым существам, не являющимся игроками, в радиусе 10 блоков и помещает здоровье в подключенный алтарь. Ритуал будет искать алтарь крови в пределах его диапазона, проверяя 5 блоков по горизонтали и 10 блоков по вертикали без изменений. Когда он находит алтарь, он сохраняет свое местоположение внутри - если поблизости нет алтаря, ритуал не будет работать. Ритуал будет давать 1 HP за единицу и помещать 25 алмазов в алтарь (100 для мирных животных), который может быть увеличен рунами Жертвоприношения. +guide.bloodmagic.entry.ritual.featheredKnife.info=Ритуал Пернатого Ножа врезается в тело пользователя, истощая его жизненную силу, чтобы заполнить кровавый алтарь поблизости. Ритуал будет искать алтарь крови в пределах его диапазона, проверяя 5 блоков по горизонтали и 10 блоков по вертикали без изменений. Когда он находит алтарь, он сохраняет свое местоположение внутри - если поблизости нет алтаря, ритуал не будет работать. Когда игрок входит в диапазон урона ритуала, который по умолчанию равен радиусу 15 блоков по горизонтали и 20 блоков по вертикали, ритуал наносит игроку урон в течение 1HP, а затем помещает это здоровье непосредственно в подключенный алтарь (с учетом кровавых рун). В ритуале есть несколько механизмов безопасности, которые не позволяют игроку, чье здоровье составляет менее 30%. Не подвергаясь сомнению, ритуал делает это раз в секунду. \n\tЕсть несколько полезных дополнений, которые вы можете использовать, если будете использовать Волю Демона. Если сырая воля поглощается ритуалом, ритуал будет пытаться наносить урон игрокам в пределах своего диапазона с большей скоростью, работая два раза в секунду. Ритуал потребляет 0,05 необработанной воли за каждую успешную операцию. \n\tЕсли у вас в ауре более 10 стойких волей, ритуал повысит свой порог безопасности и вместо этого не будет работать с игроками, чье здоровье составляет менее 70%. В настоящее время эта функция не потребляет Воли. \n\tЕсли у вас в Ауре более 10 Мстительных желаний, ритуал снимает некоторые ограничения безопасности, заставляя его работать на игроков, пока у них не будет только 10 %% от их максимального здоровья. оставил. Если в ритуале также есть Steadfast Will, порог все равно будет 70 %% только для владельца ритуала. Эта функция в настоящее время не потребляет Воли. \n\t Когда Демонстрационная Воля применяется к ритуалу, ритуал становится намного более эффективным с его преобразованием HP в LP. Количество LP, которое добавляется к алтарю за единицу здоровья, увеличивается в зависимости от Воли в Ауре, максимум до + 20 %% за 100 Разрушительного Воля. Этот эффект складывается мультипликативно с рунами, Улучшениями Живой Брони и Благовониями. Это потребляет 0,05 Разрушительной Воли за принесенное в жертву HP. \n\t Говоря о благовониях, если в обряде используется Коррозивная Воля, ритуал будет уважать воздействие благовоний на вас. Если у вас нет дебаффа Soul Fray, и вы наделены силой Алтаря Благовоний, ритуал израсходует все ваши HP до установленного порога и накачает все получившиеся LP в алтарь. Это также удалит благовония, которые вы понесли, и нанесет на вас Soul Fray. Этот эффект накладывается на бафф «Разрушительная воля». +guide.bloodmagic.entry.ritual.regen.info=Возможно, один из лучших ритуалов для любого потенциального Кровавого Мага, который хочет использовать свою собственную жизненную силу для подпитки своей магии, Ритуал Регенерации создает вокруг себя завесу энергии, исцеляющие сущности, находящиеся в его пределах. Каждые 2,5 секунды ритуал разыгрывает Регенерацию I на живых существах в радиусе 15 блоков, стоимость 100 фунтов на игрока и 10 фунтов на других живых существ в течение 2,5 секунд регенерации. \n\tЕсли Corrosive Will используется для усиления ритуала, будет доступен второй диапазон, «вампирический диапазон». Любые неигровые существа в этом диапазоне будут случайным образом повреждены, чтобы непосредственно исцелить игроков в обычном диапазоне исцеления. Это стоит 0,04 воли для использования и будет переводить 1HP за операционный тик. +guide.bloodmagic.entry.ritual.harvest.info=Этот ритуал будет искать любой собираемый растительный блок в пределах его диапазона (по умолчанию область 9x9x5 выше MRS) и попытаться собрать его, пересаживая любые семена, если растение может пропустить семена. Все капли с растения появятся там, где было собрано растение. Ритуал будет пытаться собирать растения один раз в 5 тиков и будет стоить 20 фунтов стерлингов за успешную операцию.\n\tРастения, которые можно собирать, включают, но не ограничиваются ими: тыквы, пшеницу, морковь, картофель, бородавку, кактус, тростник. Имейте в виду, что ритуал не делает никаких предположений относительно того, что он собирает - он может собирать урожай только с добавленным модом, если данный мод регистрирует обработчик уборки с модом. +guide.bloodmagic.entry.ritual.interdiction.info=Основанный на архаическом алхимическом устройстве легенды, Ритуал Запрета пытается насильно оттолкнуть всех неигровых мобов от центра ритуала. По умолчанию все мобы, которые находятся в двух блоках MRS, отталкиваются от MRS, устанавливая их скорость. Следует отметить, что мобы в этом диапазоне не подвержены урону от падения, хотя эта защитная сетка стирается, как только их отталкивают. +guide.bloodmagic.entry.ritual.containment.info=В противоположность Запрету, Ритуал сдерживания пытается подтянуть мобов в пределах его зоны действия к пространству над MRS, подвешивая их в воздухе, где они не могут двигаться. Диапазон ритуала по умолчанию - горизонтальный радиус в 3 блока от нижней части мастер-камня до верхней части самых верхних рун, хотя этот диапазон, конечно, можно изменить.\n\tЭтот ритуал стоит 1LP за моба, потянувшего каждый тик. +guide.bloodmagic.entry.ritual.suppression.info=Купол подавления «подавляет» все жидкости в заданном радиусе, способные временно заменить жидкости в полушарии с радиусом 10 блоков воздухом. Если ритуал выключен, эта жидкость вернется в то же состояние, в котором она была раньше. Это стоит 2LP за операционный такт. +guide.bloodmagic.entry.ritual.expulsion.info=Если вы играете на сервере, вы можете столкнуться с ситуацией, когда у вас есть нежелательные посетители. Иногда силовые поля и гигантские кровавые роторы не являются достаточным сдерживающим фактором, и им все же удается проникнуть на вашу базу. Этот ритуал пытается облегчить это с помощью магии телепортации!\n\tЕсли игрок, не являющийся владельцем, входит в зону действия ритуала (по умолчанию радиус 12 блоков), ритуал случайным образом телепортирует игрока в радиусе 100 блоков. Однако, если на MRS есть сундук с привязанным предметом от игрока, этот игрок будет освобожден от телепортации, действуя эффективно как белый список.\n\tРитуал стоит 2000LP за успешную телепортацию. +guide.bloodmagic.entry.ritual.zephyr.info=Созданный по образцу древнего меча пословицы, Зов Зефира использует силу ветра, чтобы собрать предметы, которые находятся вокруг него, и поместить их в связанный сундук (по умолчанию прямо над MRS). Это делается мгновенно, что означает, что предметы телепортируются прямо в инвентарь - не нужно беспокоиться о странных эффектах всасывания!\n\tРадиус элемента по умолчанию составляет 5 блоков от MRS. +guide.bloodmagic.entry.ritual.laying.info=Как известно многим, возможность размещать блоки может быть важной в различных задачах автоматизации. Этот ритуал берет предметы / блоки из подключенного сундука (по умолчанию сверху MRS) и помещает блоки в ритуал, радиус которого равен 2 на том же уровне, что и MRS. Это может быть полезно, если вы пытаетесь выложить саженцы для фермы деревьев или если есть другие блоки, которые необходимо разместить. Ритуал берет 50LP за успешную операцию. +guide.bloodmagic.entry.ritual.timberman.info=Есть дерево? Этот ритуал покрыл тебя. Crash of the Timberman привязывает спектральную сущность, используя LP владельца, чтобы собрать листья и бревна всех деревьев в пределах своего диапазона и помещает результаты в подключенный сундук. Он попытается найти все «деревья» в горизонтальном радиусе 10 блоков и до 30 блоков выше MRS (по умолчанию) и использовать 10LP на срубленный блок. +guide.bloodmagic.entry.ritual.meteor.info=Для всех намерений и целей, это один из самых мощных ритуалов в настоящее время в игре. Активация стоит один миллион LP и может быть использована только один раз перед повторной активацией. Ритуал, когда совершаются конкретные жертвы, вытягивает метеор из космоса и заставляет его резко упасть к земле, вызывая большой взрыв, когда он попадает во что-то твердое. Поскольку эти метеоры не из Мира, они могут содержать богатую плотность руды, которую никогда не видели больше нигде.\n\tЖертвоприношения могут включать в себя: железный блок, золотой блок, алмаз. Это настраивается модпаком или пользователем. +guide.bloodmagic.entry.ritual.downgrade.info=Чтобы получить больше силы, иногда приходится жертвовать чем-то взамен. Покаяние Освобожденной Души делает именно это - жертвуя несколькими предметами невидимой сущности, вы можете снизить эффективность какого-либо аспекта вашей Живой Брони и увеличить количество очков улучшения в качестве компенсации. Когда вы создаете ритуал, вы должны разместить рамку предмета на самом верхнем Пустом ритуальном камне, обращенном к Камню Главного Ритуала, и какой-то инвентарь (см. Сундук) на вершине Камня ритуального заката. Чтобы получить Понижение уровня Живой Брони, вы должны поместить ключевой предмет в раму предмета и расходные материалы в сундук. Как только ритуал активирован, вы можете в любой момент прокрасться на Мастер ритуальный камень и получить понижение рейтинга.\n\tВ случае понижения «Закаленная живая броня» его ключевым предметом является бутылка с водой (помещается в рамку предмета), а рецептом является «Дыхание дракона» (помещается в сундук). Ключевой предмет никогда не расходуется, но рецепт есть.\n\tЧтобы просмотреть рецепт понижения, вы можете посмотреть их в JEI - проверьте использование Master Ritual Stone, и вы увидите рецепты для ритуала Покаяния. Также вы можете просто проверить рецепт для максимального снижения уровня в JEI, а затем проверить использование ключевого элемента - ключевой элемент всегда одинаков для конкретного рейтинга. +guide.bloodmagic.entry.ritual.crystalSplit.info=После того, как Воля Демона кристаллизовалась, невозможно разделить ее на множество аспектов - или я так думал до сих пор. «Резонанс ограненного кристалла» работает путем разделения множества аспектов внутри неведомого (или необработанного) кластера кристаллов с использованием различных аспектированных ритуальных камней. \n\tЧтобы использовать ритуал, неожиданный кластер кристаллов должен быть размещен в двух кварталах над Камнем Мастера Ритуала. Другими словами, вы можете поместить кристаллизатор поверх MRS и кластер кристаллов поверх него, и он должен хорошо работать. Затем вы должны убедиться, что нет никаких блоков непосредственно над четырьмя ритуальными камнями на основе элементов, а затем дождаться роста кластера кристаллов. \n\tПосле того, как кластер вырос в общей сложности пять или более духа, ритуал отделилась и создать эти шпили коррозионного каждый один дух, твердо, мстительная и разрушительная волю аспектированного ритуала на вершине камней. Unaspected, если кластер имеет право расти и дальше, и эти новые кластеры остаются нетронутыми, процесс будет повторяться шпилями и больше будет добавлен. \n\tМеханизм этого процесса довольно прост. Когда у кристалла Необработанной Воли есть по крайней мере пять шпилей, ритуал разрывает четыре из этих шпилей и преобразует Волю в ее более бестелесную форму. Затем эта Воля отбрасывает последний шпиль скопления, что заставляет различные аспекты Воли превращаться в более локализованные скопления конкретного аспекта. Затем эта Воля собирается в ритуальные камни, которые служат основой, из которой могут вырастать новые аспектированные кристаллические кластеры. +guide.bloodmagic.entry.ritual.portal.info=##REQ-LORE##\n\t Врата Сгиба - это ритуал, предназначенный для межпространственной телепортации без необходимости дополнительного взаимодействия. После активации все блоки, которые касаются его ритуальных камней, используются в качестве ключевого шаблона для связи порталов вместе. Если существуют другие Ворота Сгиба с тем же ключом, ритуалы будут связаны вместе и мгновенно пройдут через телепортацию к своему близнецу. Одновременно могут существовать только до 2 порталов с одинаковым ключом.\n\t Стоимость активации: 50,000LP\n\t Стоимость телепортации: 1,000LP (одинаковое измерение) / 10,000LP (разные размеры) +guide.bloodmagic.entry.ritual.altarBuilder.info=##REQ-LORE##\n\t Сборка Высокого Алтаря - это ритуал, позволяющий быстро построить новый алтарь-зиккурат из блоков в прилагаемом инвентаре (обычно это сундук сверху MRS).\n\tСтоимость активации: 450LP\n\tСтоимость за размещенный компонент: 75LP +guide.bloodmagic.entry.ritual.pump.info=##REQ-LORE##\n\t Гимн Сифонирования используется для откачивания жидкостей в мире вокруг или под ритуалом в подходящий контейнер (например, в Кровавый Бак) над MRS. Жидкости в мире заменены каменными, предотвращая текучие жидкости, которые могут вызвать проблемы с производительностью.\n\tСтоимость активации: 500LP\n\tСтоимость за операцию: 250LP +guide.bloodmagic.entry.ritual.cobble.info=##REQ-LORE##\n\t Устали от создания одного из этих примитивных зданий для генерации булыжника? Вы устали от наличия OSHA на вас или случайно погасили ваш источник лавы? Этот ритуал для вас. Генерируйте непреодолимые массы булыжника быстрым и эффективным способом с помощью крови, пригодной для будущего, вместо использования опасной и ограниченной лавы (если только вы не генерируете лаву из крови). \n\n\t Этот ритуал генерирует (по умолчанию) булыжник поверх самого себя, который затем может быть добыт для личного использования. \n\t Стоимость активации: 500LP\n\t Стоимость за блок: 25LP +guide.bloodmagic.entry.ritual.ellipsoid.info=##REQ-LORE##\n\t Фокус эллипсоида создает полую сферу (по умолчанию) из материалов в инвентаре, подключенном к MRS (обычно сундук поверх MRS).\n\t Стоимость активации: 20,000LP\n\t Стоимость за размещенный блок: 5LP +guide.bloodmagic.entry.ritual.crystalHarvest.info=##REQ-LORE##\n\t Трещина сломанного кристалла разрывает все, кроме одного шпиля всех кластеров Кристалла Воли Демона, и бросает их на землю. В сочетании с ритуалом «Зов Зефира» эти предметы не могут быть собраны и помещены в инвентарь для последующего использования.\n\t Стоимость активации: 40,000LP \n\t Стоимость за операцию: 50LP +guide.bloodmagic.entry.ritual.forsakenSoul.info=##REQ-LORE##\n\t Сбор Отрекшихся Душ ускоряет рост Кристаллов Демонов для кластеров кристаллов выше ритуала (по умолчанию). Он не генерирует волю сам по себе, но требует, чтобы под кластерами кристаллов были Кристаллизаторы Демонов. Чтобы сделать это, он использует механику, известную как «уникальность» мобов. Чем больше мобов погибнет, тем эффективнее будет рост кристаллов. Сама она не генерирует Ауру Демонической Воли, поэтому вам нужно снабдить ее либо путем подачи обратно кристаллов, либо путем помещения Тартарного Камня с волей в Тигель Демона. Это должно исключить необходимость выходить на ферму демонической воли, если только вы не предоставите мобов, чтобы накормить ее и / или исчерпать волю.\n\t Стоимость активации: 40,000LP\n\t Стоимость за тик урона и моб: 2LP +guide.bloodmagic.entry.ritual.animalGrowth.info=##REQ-LORE##\n\t Ритуал Шефарда значительно увеличивает скорость, с которой животные растут.\n\t Это также увеличивает скорость размножения, если поставляется с Vengeful Will или делает животных способными искать враждебных мобов и взрываться на них, если снабжено Destructive Will. В любом случае, если поставляется с Steadfast Will, он автоматически будет кормить животных едой из инвентаря выше MRS (по умолчанию).\n\t Стоимость активации: 10,000LP\n\t Стоимость за операцию и животное: 2LP +guide.bloodmagic.entry.ritual.livingEvolution.info=##REQ-LORE##\n\t Ритуал Живой Эволюции увеличивает максимальное количество очков улучшения для Живой Брони до 300. Чтобы использовать его, просто активируйте ритуал, а затем наступите на MRS с экипированным набором Живой Брони.\n\t Стоимость активации: 50,000LP +guide.bloodmagic.entry.ritual.upgradeRemove.info=##REQ-LORE##\n\t Ритуал Очищающей Души удаляет все улучшения и понижения из набора Живой Брони. Чтобы использовать его, просто активируйте ритуал, а затем наступите на MRS с экипированным набором Living Armor.\n\t Стоимость активации: 50,000LP +guide.bloodmagic.entry.ritual.fullStomach.info=##REQ-LORE##\n\t Ритуал насыщенного желудка кормит игроков в этой области едой из сундука над MRS. Пищу кормят эффективным способом, если пища не обеспечивает более максимального насыщения, и в этом случае ее все равно кормят.\n\t Стоимость активации: 100 000\n\tСтоимость за операцию: 20LP +guide.bloodmagic.entry.ritual.eternalSoul.info=##REQ-LORE##\n\t Крик Вечной Души способен кормить LP из Сети Души обратно в алтарь. Это подпадает под обычные ограничения накачки (жидкой) жизненной сущности в алтарь. Каждая точка LP, переданная в алтарь, стоит 2 LP от сети.\n\t Стоимость активации: 2,000,000LP\n\t Стоимость за операцию: 2 LP +guide.bloodmagic.entry.ritual.condor.info=##REQ-LORE##\n\t Уважение к Кондору позволяет игрокам совершать полеты в окрестностях ритуала.\n\t Стоимость активации: 1,000,000LP\n\t Стоимость за операцию: 2LP +guide.bloodmagic.entry.ritual.featheredEarth.info=##REQ-LORE##\n\t Ритуал Пернатой Земли постоянно уменьшает высоту падения до 0, эффективно устраняя урон от падения.\n\t Стоимость активации: 5,000LP\n\tСтоимость за секунду: 20LP +guide.bloodmagic.entry.ritual.grounding.info=##REQ-LORE##\n\ŧ Ритуал Заземления манипулирует гравитацией в своей области. По умолчанию он перетаскивает мобов на землю и предотвращает прыжки.\n\t Снабжение ритуала сырой волей влияет на игроков в дополнение к мобам.\n\t Разъедающая воля просто отключает гравитацию все вместе.\n\t Разрушительная воля значительно увеличивает урон от падений пораженных существ.\n\t Непоколебимая воля позволяет ритуалу воздействовать на боссов.\n\t Одна лишь Мстительная Воля усиливает эффект заземления в сочетании с Коррозийной волей, однако вместо этого она трансформирует ритуал, чтобы обеспечить левитацию. Vengeful Will также увеличивает эффект Heavy Heart, еще больше увеличивая урон от падения.\n\t Стоимость активации: 5,000LP\n\tСтоимость за секунду: 20LP + +# Architect Entries +guide.bloodmagic.entry.architect.intro=Предисловие +guide.bloodmagic.entry.architect.bloodaltar=Кровавый алтарь +guide.bloodmagic.entry.architect.ash=Тайный пепел +guide.bloodmagic.entry.architect.divination=Символ гадания +guide.bloodmagic.entry.architect.soulnetwork=Душа Сеть +guide.bloodmagic.entry.architect.weakorb=Слабая Кровавая Сфера +guide.bloodmagic.entry.architect.incense=Алтарь ладана +guide.bloodmagic.entry.architect.bloodrune=Обновление вашего Алтаря +guide.bloodmagic.entry.architect.inspectoris=Инспектор блок (блок считывание) +guide.bloodmagic.entry.architect.runeSpeed=Скоростная руна +guide.bloodmagic.entry.architect.water=Сигил воды +guide.bloodmagic.entry.architect.lava=Сигил лавы +guide.bloodmagic.entry.architect.lavaCrystal=Кристалл лавы +guide.bloodmagic.entry.architect.apprenticeorb=Ученик Кровавого Шара +guide.bloodmagic.entry.architect.dagger=Кинжал Жертвоприношения +guide.bloodmagic.entry.architect.runeSacrifice=Руна жертвоприношения +guide.bloodmagic.entry.architect.runeSelfSacrifice=Руна самопожертвования +guide.bloodmagic.entry.architect.holding=Сигил удержания +guide.bloodmagic.entry.architect.air=Сигил воздуха +guide.bloodmagic.entry.architect.void=Сигил пустоты +guide.bloodmagic.entry.architect.greenGrove=Сигил зеленой рощи +guide.bloodmagic.entry.architect.fastMiner=Sigil of the Fast Miner +guide.bloodmagic.entry.architect.seer=Сигил провидца +guide.bloodmagic.entry.architect.magicianOrb=Маги Кровавый Шар +guide.bloodmagic.entry.architect.capacity=Руна Емкости +guide.bloodmagic.entry.architect.displacement=Руна смещения +guide.bloodmagic.entry.architect.affinity=Sigil of Elemental Affinity +guide.bloodmagic.entry.architect.lamp=Сигил кровавого светильника +guide.bloodmagic.entry.architect.magnetism=Сигил магнетизм +guide.bloodmagic.entry.architect.peritia=Фолиант экспертизы +guide.bloodmagic.entry.architect.livingArmour=Живая броня +guide.bloodmagic.entry.architect.upgradeTome=Живая броня Обновление Томов +guide.bloodmagic.entry.architect.teleposer=Телепортер +guide.bloodmagic.entry.architect.boundBlade=Связанный клинок +guide.bloodmagic.entry.architect.boundTool=Связанные инструменты +guide.bloodmagic.entry.architect.weakShard=Слабый кровавый осколок +guide.bloodmagic.entry.architect.masterOrb=Мастер крови сфере +guide.bloodmagic.entry.architect.runeOrb=Руна сфера +guide.bloodmagic.entry.architect.suppression=Сигил Подавления +guide.bloodmagic.entry.architect.haste=Cигил ускорения +guide.bloodmagic.entry.architect.severance=Sigil of Ender Severance +guide.bloodmagic.entry.architect.teleposition=Сигил телепозиции +guide.bloodmagic.entry.architect.compression=Сигил сжатия +guide.bloodmagic.entry.architect.bridge=Сигил призрачного моста +guide.bloodmagic.entry.architect.mimic=Mimics подражает +guide.bloodmagic.entry.architect.downgrade=Понижение живой брони + +guide.bloodmagic.entry.architect.augmentedCapacity=Руна дополненной способности +guide.bloodmagic.entry.architect.charging=Зарядная руна +guide.bloodmagic.entry.architect.acceleration=Руна ускорения + +guide.bloodmagic.entry.architect.tier3=Уровень 3 под морем + +# Architect Entry Texts +guide.bloodmagic.entry.architect.intro.info=Здравствуйте все. Меня зовут Тиберий. По этой записи вы, вероятно, можете сказать, что книга не совсем завершена, и вы были бы правы. Из-за обновлений 1.7.10 -> 1.8.9 и 1.9.4 (и выше) в моде многое изменилось. Таким образом, книги должны были быть переписаны. Поскольку окончательный план для этих документов состоит в том, чтобы каждая книга имела форму исследовательского журнала / фактической книги, эти документы потребуют времени, чтобы конкретизировать. Поэтому я буду периодически обновлять эту книгу, чтобы заполнить необходимые пробелы. Это начнется как мусор без запаха, чтобы начать с (Да ... не самые аппетитные иллюстрации, чтобы пойти с документами, но безотносительно!), Но постепенно это превратится в историю о куче кровавых магов во время путешествия по открытие.\n\tНо хватит об этом, мне нужно войти в характер. * Кашель *\n\tМеня зовут Тиберий, и я Маг крови, и также известный как Архитектор. Эта книга содержит все мои исследования, касающиеся эфирного феномена, называемого «Сетью Души», а также физических свойств некоторых из самых центральных устройств, к которым должен привыкнуть любой Кровавый Маг. Я обнаружил, пересмотрел и создал новые пути в искусстве создания структуры мощного Кровавого Алтаря, в хитросплетениях жертвенной жизненной силы, чтобы увеличить силу мага, и в дальнейшем к силам, полученным благодаря тайным глифам и символам. тренировать себя к новым высотам.\n\tТак что входите, Маг, ибо новое царство ждет вас!\n\t... Да, Маг говорит, что я могу стать немного грандиозным, но что ты можешь сделать? +guide.bloodmagic.entry.architect.bloodaltar.info.1=Кровавый Алтарь - одно из самых центральных устройств в моде. У алтаря есть два основных способа использования: либо для создания определенных предметов, необходимых для прохождения мода, либо для наполнения своей Кровавой Сферы. Оба этих действия требуют от игрока наполнения бассейна Жизненной Сущностью, которую можно извлечь из двух разных источников: монстров и мирных существ, а также из собственного здоровья игрока. +guide.bloodmagic.entry.architect.bloodaltar.info.2=Чтобы добавить свою собственную Сущность Жизни в бассейн, вам нужно изготовить себе Жертвенный Кинжал и щелкнуть по нему правой кнопкой мыши рядом с алтарем. Это обретет душевное здоровье и добавит 200 фунтов к алтарю без улучшений. «LP» - это «Очки жизни», которые показывают, сколько жизненной силы используется в задании - нет, это не похоже на YuGi-Oh. Кровавый Алтарь имеет вместимость 10000 латов. Если вы затем щелкните правой кнопкой мыши на алтаре, вы можете поместить предмет в бассейн, и, если это действительный предмет, алтарь начнет процесс изготовления.\n\tАлтарь обрабатывает предмет, потребляя ЛП в тазу, если алтарь достаточно высокого уровня. Если будет достаточно LP, алтарь будет отводить немного LP из бассейна каждый тик и увеличивать ход крафта, испуская красные частицы. Если в бассейне больше нет LP, алтарь испустит серые частицы, и ремесло начнет терять прогресс, что совсем не хорошо! Наконец, если алтарь заполняет Сферу Крови, алтарь будет испускать пурпурные частицы, чтобы указать, что он сифонирует LP из бассейна.\n\tНа самом деле в Алтаре Крови находится три танка: основной танк, емкость которого по умолчанию составляет 10 кПа, как указано ранее, а также входной и выходной баки, каждый из которых имеет 10 %% от общей вместимости. основной танк. Каждые 20 тиков по умолчанию LP во входном баке будет передаваться в основной бак со скоростью 20 л / с, а LP в основном баке будет передаваться в выходной бак со скоростью 20 л / с. Как следует из названий, входной резервуар принимает LP, который закачивается в алтарь, выступая в качестве буфера для ограничения скорости передачи из внешних источников, и выходной резервуар можно извлечь из труб из алтаря. +guide.bloodmagic.entry.architect.ash.info=Хотя Arcane Ash не является частью общей темы этой книги, он необходим для того, чтобы пройти через мод и получить доступ к некоторым из более мощных устройств. Этот пепел создан с использованием Кузницы Адского Пламени и Воли Демона, поэтому, если вы новичок в этой концепции, обратитесь к «Кин Демона». По сути, это способ изготовления предметов из двух отдельных предметов: какого-то реагента, который действует как катализатор, и вторичного предмета. \n\tПепел имеет в общей сложности двадцать применений, прежде чем вам понадобится создать еще один. Когда вы щелкнете правой кнопкой мыши по земле (или стене, хотя она будет отображать только одно направление), вы начертите простой круг из пепла. Если снова щелкнуть по пеплу с предметом, он будет «помещен в пепел» - при условии, что этот предмет является действительным катализатором, круг изменит форму, чтобы показать, что он готов к следующему предмету. Если это не меняет форму, значит, вы сделали что-то не так.\n\tКак только он изменил форму, вы можете поместить его в дополнительный предмет. Если этот элемент совпадает с первым, круг начнет вращаться и выполнять различные действия в зависимости от рецепта, над которым он работает. Через некоторое время при правильном выполнении элемент выскочит.\n\tВсе рецепты для создания заклинания «Чародейский пепел» (я называю это «Создание алхимического массива») можно найти в JEI, проверив использование «Чародейского пепла» - первый показанный предмет - катализатор, а второй - вторичный предмет. +guide.bloodmagic.entry.architect.divination.info=Символ гадания - один из самых полезных инструментов в моде, способный рассказать вам о многих ценностях, которые сделают вашу жизнь проще. Этот символ изготовлен с использованием кусочка красного камня и чистого листа (созданного в Алтаре Крови) с использованием набора алхимии.\n\tКогда вы щелкнете правой кнопкой мыши на Алтаре Крови с символом, вы увидите текущий уровень, количество ЛП внутри основного бассейна, а также максимальную емкость Кровавого Алтаря. Нажатие спама на алтарь с символом перезапишет предыдущий текст с символа, означая, что в вашем чате не будет никакого спама.\n\tЕсли вы щелкнете правой кнопкой мыши в эфире с символом, он сообщит вам текущее количество LP, которое находится в вашей Душа Сеть. Хотя для начала это довольно обыденно, одна только эта функция очень вероятно, что вы захотите всегда держать этот символ на себе. +guide.bloodmagic.entry.architect.soulnetwork.info=Сеть Души (обычно сокращенно SN) - это термин, обозначающий связи между игроком и всеми предметами и структурами, с которыми он связал свою душу. Когда маг крови становится более могущественным, сила их души увеличивается и укрепляет эти связи. Эти связи являются эфирными нитями души, и только самые могущественные из Кровавых Волхвов способны увидеть их в их физической форме. На сегодняшний день ни один маг не достиг этой способности ...\n\tВ игре Сеть Души привязана непосредственно к игроку. Данные хранятся в мире, и у каждого игрока есть только одна сеть - LP, помещенный в сеть, не хранится ни в одном элементе, а вместо этого помещается и берется из одного пула. \n\tЧтобы связать вещи с вашей сетью, наиболее распространенный способ - просто щелкнуть правой кнопкой мыши элемент, который использует сеть для включения питания. После привязки предмет будет указывать, что он принадлежит вам, и он никогда не может быть освобожден (с использованием текущей технологии). Если этот предмет используется и ему приписана стоимость ЛП, он получит ЛП из сети владельца. Если в этой сети недостаточно LP, недостающий LP будет извлечен непосредственно из состояния здоровья пользователя (а не владельца). Будьте осторожны при использовании предметов, когда у вас мало LP - это может закончиться смертельным исходом. +guide.bloodmagic.entry.architect.weakorb.info.1=Что хорошего в этом маге без источника энергии? Blood Orb - это устройство, которое потребляет физический LP и передает его в Душа Сеть владельца. Хотя это и не сама батарея, она действует как канал, чтобы восполнить резервы энергии мага крови. +guide.bloodmagic.entry.architect.weakorb.info.2=Слабая Сфера Крови - это первая такая сфера, которую вы можете создать. Вливая алмаз внутри Алтаря Крови с 2 кПа, вы можете создать этот шар. Будучи связанным и помещенным в алтарь с небольшим количеством ЛП в нем, сфера будет откачивать из бассейна и передавать этот ЛП непосредственно в сеть. Каждая сфера имеет максимальную вместимость, которая может быть расширена только продвинутыми рунами на алтаре. Для Weak Blood Orb эта максимальная вместимость составляет 5 LP.\n\tКровавые шары также можно заполнить непосредственно от игрока, просто щелкнув по ним правой кнопкой мыши - это перенесет сердце здоровья в шар и даст вам 200LP. Это не может превышать максимальную емкость шара.\n\tКровавая сфера может быть заполнена только уровнем алтаря или выше; это означает, что если у вас есть шар T3, он должен быть заполнен в алтаре, который больше или равен T3. Простой алтарь Т1 не подойдет в этой ситуации. +guide.bloodmagic.entry.architect.incense.info.1=Быстро обнаружится, что скорость генерации LP может стать все более обременительной. Конечно, добавляя специальные руны к Кровавому Алтару, вы можете увеличить количество самоотверженных жертв, но это все равно может быть медленным процессом. Если бы только был способ еще больше увеличить, сколько LP вы можете получить от себя?\n\tВойдите в алтарь ладана. Алтарь ладана действует как центральная точка для спокойной области, успокаивая душу нежными волнами, которые исходят из бассейна. Откуда исходит этот запах, вы не совсем уверены, но что может пойти не так?\n\tЦель этого блока - создать зону спокойствия, чтобы увеличить количество LP, которое вы получаете из сердца здоровья. Когда вы находитесь рядом с блоком (около пяти блоков), огненные частицы будут излучаться, чтобы показать, что он работает - когда на вас воздействует это спокойствие, ваш Жертвенный Кинжал изменится, показывая, что у вас увеличен урожай на Алтаре Крови. Этот процесс занимает около 5 секунд, и вы узнаете, что закончили, когда частицы огня перестают появляться. В этот момент, если вы используете свой Жертвенный Кинжал на Кровавом Алтаре, вы пожертвуете 90 %% от вашего максимального здоровья сразу и накачаете LP в алтарь пропорционально количеству пожертвованного здоровья, умноженному на бонус, основанный на том, насколько спокойным окружающий Площадь: по умолчанию этот бонус + 20%.\n\tВ качестве дополнительного примечания, Символ Гадания может быть использован на Алтаре Ладана для определения количества Спокойствия, а также того, сколько бонуса дает текущий алтарь. +guide.bloodmagic.entry.architect.incense.info.2=Конечно, только дополнительные 20% - это хорошо, но это может быть расширено за счет расширения диапазона влияния Алтаря Благовоний. Если вы разместите ряд из трех блоков «Деревянная дорожка» в двух кварталах от алтаря ладана в каждом из основных направлений (убедитесь, что все блоки дорожек находятся на одном и том же уровне y, до пяти блоков вверх или вниз от алтаря ладана) Вы можете определить область. Любой блок, размещенный в этой области (блок, который находится на том же расстоянии по горизонтали от Алтаря благовоний, что и блоки пути по горизонтали, и на том же уровне или на два уровня выше по вертикали от блоков пути), может добавить к Спокойствию Алтарь ладана. После этой начальной строки можно добавить еще один ряд блоков пути, следуя тому же правилу: все новые строки должны находиться на одном уровне y друг с другом, а вся строка должна находиться в пределах 5 блоков вертикально от предыдущей строки пути. блоки. Это означает, что возможны такие макеты, как пирамиды, перевернутые пирамиды или более сложные конструкции лестниц. \n\tВсе блоки пути имеют максимальное расстояние, которое они могут иметь от Алтаря ладана, чтобы иметь эффект. Блоки «Деревянная тропа» могут работать в трех рядах от Алтаря ладана. Каменные дорожки работают до пяти, изношенные каменные дорожки - семь, а обсидиановые - до девяти кварталов от источника. Таким образом, в определенный момент вы должны использовать более качественные блоки пути, чтобы расширить зону спокойствия, однако вы можете использовать блоки более высокого уровня пути вместо блоков более низкого уровня пути, а не наоборот.\n\tВернуться к спокойствию. Только определенные блоки могут влиять на Спокойствие области, и есть различные типы блоков Спокойствия. Если вы поместите урожай, такой как картофель, в область, вы добавите немного Спокойствия (используя категорию «Зерновые культуры»). Однако, если вы добавите еще одну культуру, например, картофель или даже морковь, вы получите меньше спокойствия. Добавляя что-то из другой категории Tranquility, вы получаете полный эффект. Но добавление большего количества материала с использованием той же категории имеет убывающую отдачу. Поэтому, чтобы получить наибольшее спокойствие из определенной области, наиболее оптимально смешивать и сочетать, используя как можно больше разных типов спокойствия..\n\tНекоторые вещи, которые добавляют Спокойствие: Урожай, бревна, листья, лава, пустошь, сельхозугодья, вода, сущность жизни и другие разные вещи. +guide.bloodmagic.entry.architect.bloodrune.info.1=Проходя мод, вы постепенно узнаете, что скромный кровавый алтарь перед вами недостаточно силен, чтобы вы могли выполнить свои истинные амбиции. Размещая специальные блоки, известные как Кровавые Руны, вокруг алтаря, вы можете значительно увеличить силу алтаря, открывая более высокие уровни рецептов, а также увеличивая способности самого алтаря.\n\tЧтобы улучшить алтарь до его второго уровня, вам нужно разместить 8 алтуров крови вокруг алтаря и на один уровень ниже. Если вы не уверены в точной конфигурации, пункт «Inspectoris Scandalum» может подсказать вам точное размещение блоков, необходимых для следующего уровня.\n\tХотя пустые руны хороши для того, чтобы просто получить обновление алтаря и перейти на более высокий уровень, полезно использовать руны обновления для своего алтаря. Каждая из рун в кровавом алтаре может быть заменена на любую руну улучшения (единственное исключение - это то, что на Уровне 2 вы не можете использовать угловые руны в качестве рун обновления - T3 и далее вы можете использовать их). Есть руны, которые влияют на скорость изготовления, мощность алтаря, а также эффективность жертвоприношения у алтаря. Эти руны можно найти в соответствующих записях. +guide.bloodmagic.entry.architect.inspectoris.info.1=Буквально «Блок чтение» на латыни, цель этого предмета - дать вам больше информации о более сложных блоках в моде, когда блоки находятся в мире. В настоящее время единственной реализацией этого предмета является Кровавый Алтарь, и, просто щелкнув правой кнопкой мыши на Кровавом Алтаре в мире, он скажет вам, какие блоки требуются в мире для следующего уровня Алтаря.\n\tЕсли этот метод вам не подходит, вы можете щелкнуть правой кнопкой мыши на элементе в воздухе, чтобы переключиться между уровнями. Если вы затем щелкните правой кнопкой мыши на алтаре, на алтаре появятся призрачные блоки в мире, показывающие, где именно находятся руны крови и столбы, необходимые для достижения этого уровня. Если вы установите отображаемый уровень на 1, голограмма будет удалена. +guide.bloodmagic.entry.architect.runeSpeed.info.1=Скоростная руна оказывает давление на таз алтаря, форсируя процесс трансмутации, так что крафт намного быстрее. Каждая руна скорости увеличивает потребление алтаря на + 20 %% за руну, эффективно увеличивая скорость алтаря. Это также влияет на скорость, с которой шары крови заполняются алтарем с той же скоростью на руну. +guide.bloodmagic.entry.architect.water.info.1=Сигил воды, как следует из названия, способен собирать влагу из воздуха, создавая источник воды в точке соприкосновения с землей. Более того, щелкнув по машине, которая принимает жидкость, вы можете вставить в машину до 1000mB воды за ту же цену, как если бы вы положили ее на землю. Для всех намерений и целей он действует как бесконечное ведро воды - однако, он не будет работать, если вы поместите его внутрь машины. 50LP за использование. +guide.bloodmagic.entry.architect.lava.info.1=Инь, Ян, чтобы сигилы вода, это запечатанное нагревает камень в локальной области и собирает ее в одном месте, образуя источник стирки, где незапечатанный замыкающий контакт. Аналогичный процесс происходит, когда вы взаимодействуете на машине флюид прием, генерировать до 1000mB лавы внутри машины по той же цене. По какой-то причине ваша рука не сжигается, когда вы используете его, однако это не означает, что это мудрый выбор, чтобы принять ванну в нем! 1000LP для использования. +guide.bloodmagic.entry.architect.lavaCrystal.info.1=Кристалл лавы - это камень, в центре которого находится кусочек лавы, не теряющий тепла. При размещении в качестве источника топлива внутри печи, оно «сгорает» на количество, достаточное для приготовления одного предмета в стандартной печи по цене 50 LP из сети владельца. Если в сети недостаточно энергии (или нет владельца), кристалл просто не сгорит и вызовет тошноту у владельца из-за нагрузки.\n\tЭтот кристалл будет работать на любой машине, работающей на твердом топливе, которая принимает любое топливо. +guide.bloodmagic.entry.architect.apprenticeorb.info.1=При использовании различных устройств вы быстро поймете, что ваша максимальная емкость 5 LP в вашей Душа Сеть быстро иссякнет. Здесь вы начнете искать более мощный шар для вашей сети.\n\tКровавая сфера Ученика требует алтаря Уровня 2 и имеет максимальную вместимость 25 LP. Это также позволяет создавать более мощные предметы и руны. +guide.bloodmagic.entry.architect.dagger.info.1=Через некоторое время укрепления себя с помощью самопожертвования вы можете попытаться пожертвовать кровью мобов. Dagger of Sacrifice, когда он используется на не-боссе, не игроке рядом с Кровавым Алтарем, убьет существо одним ударом и накачает всю кровь в алтарь, превращая ее в сущность жизни в зависимости от качества толпа. Обычно, враждебные мобы будут давать гораздо больше LP, чем мирные мобы. +guide.bloodmagic.entry.architect.runeSacrifice.info.1=Руна жертвоприношения, как следует из названия, увеличивает урожайность всех видов деятельности, которые приносят в жертву здоровье мобов в обмен на LP. Каждая руна обеспечивает + 10% -ное увеличение урожая, в добавок. +guide.bloodmagic.entry.architect.runeSelfSacrifice.info.1=Как и в случае с Rune of Sacrifice, Rune of Self Sacrifice увеличивает доходность LP от игрока. Каждая руна обеспечивает + 10% -ное увеличение урожая, в добавок. +guide.bloodmagic.entry.architect.holding.info.1=Как вы начнете понимать, есть много полезных символов, некоторые из которых можно переключать, другие активно использовать. Из-за этого ваш инвентарь быстро забьется. Эта потребность заполняется Сигилой Холдинга.\n\tЭтот символ может содержать до пяти других символов (нет, он не может содержать других символов холдинга) во внутреннем инвентаре. Нажав клавишу «Удержание», по умолчанию «H», вы можете открыть графический интерфейс сигил, чтобы изменить расположение удерживаемых сигил. Если вы перемещаете и используете колесо прокрутки, пока оно установлено, вы будете перебирать содержащиеся в нем сигилы. Как только вы приземлитесь на тот символ, который хотите использовать, вы можете использовать этот символ, как если бы он был выбран! \n\tЕстественно, у вас может быть несколько Сигил Холдинга, каждый со своим инвентарем. Чтобы определить, какой из них с первого взгляда, вы можете покрасить символ, используя Таблицу Алхимии. Чтобы сделать это, поместите Сигилу Держания в Алхимическую Таблицу с красителем или Сигилу с тегом имени нужного цвета в формате 0xZZZZZZ для имени. +guide.bloodmagic.entry.architect.air.info.1=Воздух сигил использует элементарную форму деления, чтобы генерировать стабильный поток воздуха за пользователем по следам водяного пара в воздухе, продвигая их вперед. В сущности, с помощью этого незапечатанный, вы можете быть запущен вперед на значительное расстояние. Следует отметить, что запечатано только отменить расстояние падения пользователя при использовании, так что если вы хотите придерживаться посадок вы должны использовать его близко к земле! +guide.bloodmagic.entry.architect.void.info.1=Как следует из названия, пустота сигил будет создавать вакуум в точке контакта, который будет всасывать жидкий источник, который используется на, полностью уничтожить источник. Это, вероятно, лучше всего использовать в сочетании с чистой сигилой Water или сигилами. +guide.bloodmagic.entry.architect.greenGrove.info.1=Используя свою кровь в качестве простого катализатора роста сортов, сигил Зеленой Рощи увеличит скорость роста любых растений в соседнем районе, а активируется. Для того, чтобы активировать запечатанный, сдвиг-щелчок правой кнопкой для переключения между активируется и деактивируется (легко видеть по подсказке или светящимися символами на незакрытых). Имейте в виду, что каждые несколько секунд запечатанные будет перекачать немного LP от пользователя к топливу ускоренного роста.\n\tЕсли используются непосредственно на плоскости, сигил применит кость еды эффекта. Это может быть использовано для выращивания высокой травы или других культур, так же, как кости еда. +guide.bloodmagic.entry.architect.fastMiner.info.1=Как должен знать любой хороший маг крови, в крови много железа. Если вы достаточно опытны, вы можете манипулировать кровью, пока она еще находится внутри тела - однако следует отметить, что только самые продвинутые Маги Крови могут скручивать кровь тех, кто не желает.\n\tОдин из принципов, который использует этот принцип, заключается в ускорении функций собственного тела. Намагничивая железо в крови пользователя, Sigil of the Fast Miner резко увеличивает скорость майнинга, применяя Haste II во время активации. Этот магнетизм слишком слаб, чтобы воздействовать на вещи вне собственного тела, однако его достаточно для того, чтобы добывать обсидиан со значительной скоростью. +guide.bloodmagic.entry.architect.seer.info.1=Работая с Кровавым Алтарем, вы иногда можете заблудиться в скрытых тонкостях его действия, которые, по-видимому, Гадательный Символ не может угадать. Здесь в игру вступает Сигил Провидца. По сути, это повышение до Гадания, этот символ предоставляет дополнительную информацию о различных характеристиках алтаря. Они варьируются от скорости алтаря, текущего LP, а также текущего прогресса созданного предмета. Это также дает информацию о душевной сети игрока. +guide.bloodmagic.entry.architect.magicianOrb.info.1=Еще один уровень, еще одна Кровавая сфера. На этот раз, чтобы продвинуться дальше в моде, вам нужно будет создать себе Магию Кровавого Шара. В рецепте по умолчанию вы можете видеть, что для создания крафта требуется 25kLP, однако максимальная вместимость Алтаря Крови составляет 10kLP. Это означает, что для успешного создания корабля вам нужно будет добавить LP в Алтарь, пока он находится в процессе создания шара. Будьте готовы, так как это может быть трудной задачей, если у вас нет всего, что вам нужно! +guide.bloodmagic.entry.architect.capacity.info.1=Вы не совсем уверены, как это работает так, как работает, но Руна Способности увеличивает способность Кровавого Алтаря на 2kLP аддитивно. Возможно, существует какой-то резонансный эффект, который уменьшает объем LP, поэтому позволяет вам больше упаковывать в статический таз? Это дает вам представление о том, как улучшить его, хотя ...\n\tСледует повторить, что размер входного и выходного буферов составляет 10 %% от максимальной емкости основного резервуара, поэтому эти руны также увеличат буферные емкости. +guide.bloodmagic.entry.architect.displacement.info.1=По умолчанию передача LP между буфером и основными резервуарами ограничена 20LP / с. Для систем, которые хотят удалить и повторно добавить LP к алтарю, эта скорость является медленным сканированием. Вот где эта руна вступает в игру.\n\tРуна смещения увеличивает количество ЛП, передаваемых за операцию. Каждая руна умножает скорость передачи в 1,2 раза, умножаясь на стопку. Таким образом, одна руна будет 24LP на операцию, две руны будут 28.8LP на операцию и три руны 34.56LP. Если у вас есть 20 рун на алтаре, это прыгает до 767LP за операцию - это очистит полный алтарь всего за 13 секунд. +guide.bloodmagic.entry.architect.affinity.info.1=На первый взгляд, Символ Сродства Стихий просто дает иммунитет к огню, утоплению и урону с высоты при активации. Однако, его работа намного более тонкая. Этот символ создает тонкий барьер воздуха вокруг пользователя, используя пот (и, при необходимости, кровь) от пользователя, удерживая тело вдали от резких элементов. \n\tЭтот воздушный барьер действует как буфер между кожей и огнем или лавой, циркулируя при необходимости для предотвращения перегрева. Он также заполняет легкие, находясь под водой, чтобы выровнять давление тела и окружающей воды. Наконец, при падении с большой высоты воздух смещается ниже уровня ног человека, выступая в качестве подушки для смягчения падения. +guide.bloodmagic.entry.architect.lamp.info.1=В теле и крови человека довольно много «примесей». Собирая некоторые благородные газы и заключая их в источник тепла, вы можете создать шар света, который можно отбросить на большое расстояние, прилипая к поверхности, на которую он ударяет.\n\tСигил Кровавой Светильника имеет два назначения: вы можете либо щелкнуть по блоку напрямую и поместить источник света, либо выстрелить снарядом, который будет генерировать источник света в точке контакта. Эти источники света могут быть разбиты так же, как факелы за один удар. +guide.bloodmagic.entry.architect.magnetism.info.1=Этот символ намагничивает железо в потоке крови пользователя, притягивая к нему мелкие предметы, обеспечивая быстрый и безболезненный захват. По сути, это действует как магнит предмета, но вместо того, чтобы фактически «пылесосить» предметы по отношению к игроку, он заставляет игрока подбирать предмет с расстояния, поэтому предметы не должны летать вокруг места. К счастью, магнетизм настроен так, что он не притягивает к себе живые объекты, поэтому вы не найдете лианы, внезапно желающие обнять вас на Mach 3. + +guide.bloodmagic.entry.architect.peritia.info.1=В мире определенные действия производят впечатление на человека: убийство монстров, добыча элементов, плавка слитков или пищи может дать опыт, накопленный за определенный период времени. Через некоторые тайные механизмы некоторые структуры и устройства фактически истощают этот опыт у вас, чтобы подпитывать свои собственные процессы. Поэтому может быть полезно хранить этот опыт в некоторой среде.\n\tХотя некоторые контейнеры хранят опыт как физическую субстанцию, «Фолиант Перитии» позволяет человеку транскрибировать свои переживания в книгу - написав в томе, страницы наполнены вашими мыслями и прошлыми действиями, сохраняя их для дальнейшего использования. Если затем вы захотите получить этот опыт обратно, вы можете поднести руку к странице и откачать их обратно; это удалит запись со страницы и передаст эти действия обратно в вашу память. \n\tСейчас для фактического использования; щелкнув правой кнопкой мыши на томе в своей руке, вы можете сохранить уровень опыта в книге (или до уровня, если у вас есть частичный уровень). Если щелкнуть правой кнопкой мыши на томе, вы перейдете на следующий уровень, если в книге достаточно опыта. Общий опыт, а также сохраненный эквивалентный уровень отображаются во всплывающей подсказке в томе. +guide.bloodmagic.entry.architect.livingArmour.info.1=Любой человек в Minecraft, особенно с новыми воплощениями мира, будет знать, что хороший набор доспехов означает разницу между жизнью и смертью. Обычно, когда вы выбираете набор брони, вы выбираете статический набор преимуществ - обеспечивает ли эта броня большую защиту? Получу ли я рейс, когда ношу это? Могу ли я прыгнуть очень высоко или двигаться очень быстро? Все это допустимые параметры для набора брони, но вы никогда не сможете получить набор, который точно соответствует вашим потребностям. По крайней мере, так они думали.\n\tНабор Living Armor - это спроектированная форма жизни, которая интегрирована с простым набором железной брони. При ношении он вступает в симбиотические отношения с пользователем - когда вы двигаетесь, он движется. Когда вы атакуете, он атакует. Когда вы едите, он это чувствует и компенсирует. И так же, как нормальное человеческое тело, оно начнет расти и укрепляться в зависимости от того, что вы делаете, будучи обученным вашими действиями. \n\tДавайте приведем пример. Если вы наденете новый комплект брони и будете много бегать, вы заметите, что вы получите апгрейд на нагрудную плиту под названием «Быстрые ноги» - это апгрейд обеспечивает постепенное увеличение вашей скорости на уровне 1, в то время как последующие уровни обеспечить больший импульс. Вы также заметите, что «Точки обновления» теперь читаются как «3/100» - каждое обновление требует применения определенного количества точек обновления, а на сундуке есть максимальное количество очков, которое она может удержать. Если обновление, которое вы можете получить, невозможно получить с количеством имеющихся у вас бесплатных точек обновления, его невозможно получить. \n\tИмейте в виду, что Живую Броню можно тренировать только тогда, когда у вас есть полный комплект брони, а эффекты брони будут действовать только тогда, когда используется полная броня.\n\tМаксимальное количество точек обновления можно изменить несколькими различными способами. Одним из них является создание алхимических смесей, которые укрепят связи между пользователем и Живой Броней, значительно увеличивая количество очков, которое вы можете получить на данном наборе снаряжения. Одним из таких примеров является «Черновик Ангела», который увеличивает максимальное количество очков до 200. Информацию об этих варевах, а также о том, как их создавать, можно найти в «Алхимике». +guide.bloodmagic.entry.architect.upgradeTome.info.1=Иногда вы можете быть недовольны улучшениями, которые вы получили в своей Живой Броне. Используя ритуал «Звук Очищающей Души» (дополнительную информацию можно найти в «Ритуальном Мастере»), вы можете удалить все улучшения с доспехов и получить их в виде «Апгрейдовых фолиантов». Если вы щелкнете по ним правой кнопкой мыши, надевая полный комплект Living Armor (и когда у вас есть место для улучшения), вы можете добавить обновление к своей броне. \n\tЭти тома также могут быть объединены в наковальне - если вы комбинируете два одинаковых тома обновления (одно и то же улучшение, тот же уровень) вместе в наковальне, вы можете получить один том на один уровень выше. Таким образом, если вы объедините Quick Feet II с другими Quick Feet II, вы получите Quick Feet III. Это может быть применено к броне таким же образом. +guide.bloodmagic.entry.architect.teleposer.info.1=Teleposer - это устройство, которое телепортирует не только объекты, но и блоки. Чтобы настроить Teleposer, вам нужно как минимум два Teleposers и один Teleposition focus. Один из Teleposers действует как Назначение, а другой действует как Начало.\n\tЧтобы настроить это, вам нужно сначала привязать фокус к себе, щелкнув по нему правой кнопкой мыши. Затем вы щелкаете правой кнопкой мыши по фокусу на Teleposer назначения, чтобы сохранить его местоположение (и размер), а затем вставляете фокус в Beginning Teleposer, щелкая правой кнопкой мыши Teleposer без фокуса в руке и помещая фокус внутри GUI.\n\tВключение начинающего телепортера (тот, который в фокусе) с сильным сигналом красного камня приведет к тому, что телепродавцы поменяются объектами и блоками (включая любой контент в тайлах, таких как инвентарь сундуков) между телепозиционерами, предполагая, что в телепостере есть Место назначения. \n\tУ вас может быть один Teleposer с фокусом, у обоих Teleposrs есть фокусы, которые связаны друг с другом, или вы можете иметь один Teleposer, связанный с другим Teleposer, который не связан с ним, поэтому в зависимости от того, как вы их настроили, вы можете может иметь очень сложные системы.\n\tИмейте в виду, что в настоящее время Teleposer будет менять местами только те блоки и объекты, которые находятся прямо над блоком, а размер зависит от фокуса - фокус T1 меняет местами только блок поверх Teleposer, фокус T2 меняет область 3x3x3 выше Телепортер и др. +guide.bloodmagic.entry.architect.boundBlade.info.1=Связанный Клинок - это артефакт из прошлого, клинок, созданный путем привязки существа к мечу в том же процессе, что и Живая Броня. Следует отметить, что это, как и Bound Tools, изменится в более поздних версиях мода.\n\tМеч имеет активный и неактивный режим, который можно переключать, щелкая правой кнопкой мыши. Меч не наносит никакого урона вообще, когда неактивен, но когда он активен, со временем произойдет небольшой расход ЛП. Точно так же, когда вы наносите урон мобу, вы вытягиваете LP из своей сети. Конечно, у вас много урона, но это может вас убить!\n\tКогда монстр убит, у него есть шанс сбросить осколок слабой крови. Эти осколки используются для улучшения вашего Алтаря Крови до алтаря Т4. +guide.bloodmagic.entry.architect.boundTool.info.1=Подобно Bound Blade, эти Bound Tools (кирка, топор и лопата) в конечном итоге будут модифицированы для лучшего соответствия моду. Как и Blade, инструменты имеют активный и неактивный режим, который можно переключать, щелкая их правой кнопкой мыши. \n\tТо, что есть в этих инструментах, называется «Режим зверя». Если вы удерживаете правой кнопкой мыши, вы можете зарядить инструмент и высвободить мощное расщепление, которое мгновенно сломает блоки, которые могут быть разбиты данным инструментом - при полной зарядке это куб размером 11x11x11 над вами по цене 10kLP. Будьте осторожны с этим мощным инструментом, так как он может быть вашим последним! +guide.bloodmagic.entry.architect.weakShard.info.1=Все, что имеет жизнь, может иметь эфирные связи, известные как Сеть Души. Как видно из вашего опыта, к неживым вещам также может быть присоединена Сеть Души, такая как сигилы и ритуалы; однако эти связи наиболее сильны у существ и, естественно, у людей. \n\tКогда вы атакуете монстра с помощью Bound Blade, их сеть душ временно затвердевает, и часть ее останется после смерти. Эта часть принимает форму осколка слабой крови, названного так в силу того, что ее красноватый оттенок соответствует цвету шара слабой крови. На данный момент неясно, существуют ли более сильные формы кровяных осколков, но вы можете сказать, что это было бы очень полезно для увеличения мощности вашей собственной Сети Души. +guide.bloodmagic.entry.architect.masterOrb.info.1=Одно из применений этого увеличенного сродства к Сети Души - использование Слабого Кровавого Осколка в новом кровавом шаре: Мастер Кровавого Шара. Этот шар имеет максимальную вместимость 1 миллион LP, и, таким образом, владелец шара может получить доступ к более мощным предметам и ритуалам. Возможно, метеоры не за пределами вашей досягаемости ... +guide.bloodmagic.entry.architect.runeOrb.info.1=Изначально эту руну можно считать несколько бесполезной. Укрепляя связи между сферой крови в алтаре и Сетью Души, Руна Сферы увеличивает максимальную вместимость шара крови, заполненного Кровавым Алтарем, на + 2 %% за каждую руну. Для чего-то вроде Слабой Сферы Крови это всего лишь емкость + 100LP, однако для Master Blood Orb это замечательная емкость + 20kLP на руну. Если у вас есть высокоуровневый шар крови и несколько дополнительных рун, которые вы можете сэкономить на своем алтаре, это может быть чем-то, что может обогатить вашу сеть. +guide.bloodmagic.entry.architect.suppression.info.1=Символ подавления использует технологию, которая используется в Teleposer для временного смещения жидкостей, которые находятся рядом с ним, когда активны. Это делается путем перемещения жидкостей в сфере вокруг пользователя к скрытому карманному размеру, заменяя жидкость воздухом. К сожалению, из-за того, что вы перезаряжаете поле, используемое Teleposer, телепозиция временна - если пользователь уходит из области, в которой была удалена жидкость, или деактивирует сигил, жидкости будут возвращаться туда, где они были раньше, как будто ничего произошло, если предположить, что там нет новых блоков. Это позволяет совершить необычную транспортировку пешком, гуляя под водой вместо того, чтобы плыть через нее или даже расставаться с красными морями Пустоты. +guide.bloodmagic.entry.architect.haste.info.1=Сахар и кофеин - интересные химические вещества, которые человеческий организм может перерабатывать. Один действует как резервуар энергии, которая быстро сгорает, тогда как другой увеличивает ваше бодрствование и позволяет вам получить доступ к энергии другими способами. Подражая этим химическим процессам, чтобы высвободить больше химической энергии, Sigil of Haste позволяет пользователю увеличить свои способности к движению. \n\tПри активации пользователь может работать намного быстрее и может прыгать значительно выше. Более того, сигил также предлагает «Step Assist», который позволяет пользователю подняться на один блок высокими гребнями без необходимости прыгать. Это как автоматический прыжок, но менее отстойный. +guide.bloodmagic.entry.architect.severance.info.1=Телепортация - одна из тех странных способностей, которые люди не могут полностью объяснить. В большинстве случаев телепортация может быть описана как временная деформация в пространстве-времени, связывающая два места в пространстве так, что рассматриваемый объект может просто «перешагнуть» на другую сторону. Sigil of Ender Severance пытается остановить эту деформацию, необходимую для телепортации, предотвращая телепортацию существ, когда они находятся рядом с пользователем. Это не остановит некоторые из более крупных средств телепортации, таких как порталы, но предотвратит использование Эндерманом своих способностей для деформации вокруг пользователя. +guide.bloodmagic.entry.architect.teleposition.info.1=Символ Телепозиции имеет в своем составе Teleposer и фокус. Если вы щелкните правой кнопкой мыши на Teleposer с этим символом, вы можете привязать координаты и размер к символу. Теперь, когда вы щелкнете правой кнопкой мыши по символу, он будет телепортировать вас прямо в Teleposer (если он там есть). К сожалению, не похоже, что вы можете совершить обратную поездку ... +guide.bloodmagic.entry.architect.compression.info.1=Шахтер быстро обнаружит, что во время длительной экспедиции их инвентарь будет заполнен краснокаменной пылью, ляписом и несколькими другими материалами. У большинства из них есть рецепты, которые сжимают их до блоков хранения, таких как блоки из красного камня и блоки с бриллиантами, однако для их объединения обычно требуется стол для крафта. \n\tЭтот символ создает миниатюрное поле сжатия в инвентаре пользователя при активации, сжимая предметы до минимального количества слотов, необходимых для инвентаря. Это означает, что если у вас 63 красных камня, это ничего не даст. Однако, если у вас есть 64 пыли, он сожмет 9 из них в блок из красного камня. Хотя это технически не идеальная ситуация, если у вас есть ровно куча красной пыли, это гарантирует, что вы не останетесь в пыли из-за полных карманов. Если присутствуют другие моды, это будет работать и для других рецептов крафта. +guide.bloodmagic.entry.architect.bridge.info.1=Когда активировано и когда пользователь находится на твердой поверхности, Сигилла Фантомного Моста затвердевает в воздухе под пользователем, так что они могут идти по нему, создавая, по существу, Фантомный Мост. Когда вы перемещаетесь в воздухе, мост будет формироваться непосредственно под вами, позволяя вам поймать себя в воздухе, если вы упадете. Хотя некоторая калибровка необходима для того, чтобы сделать ее более эффективной для вертикального перемещения, а также горизонтального перемещения при быстром движении (из-за запаздывания, мешающего созданию моста), это эффективный способ эффективно летать в разные районы. +guide.bloodmagic.entry.architect.mimic.info.1=Мимики - это тайные конструкции, которые предназначены для имитации того, на что они настроены. Когда мимика вступает в контакт с какой-либо формой блока, его молекулы изменяют свою ориентацию, чтобы принять форму, внешний вид и ощущение блока. Однако не все свойства копируются: например, нормальный мимический блок при контакте со светящимся камнем не будет излучать никакой формы света. \n\tПри обычном использовании, есть два способа использовать блок мнемосхемы. Первый - поместить блок мнемоники вниз, а затем щелкнуть правой кнопкой мыши на мнемосхеме с блоком, который вы хотите скопировать. Это поместит блок в мнемосхему и придаст ей форму -default-. Таким образом, если щелкнуть по лестнице мимику, она всегда будет ориентироваться одинаково.\n\tВторой способ заключается в том, чтобы держать блок мимики в руке и нажимать клавишу Shift, щелкнув блок, который вы хотите заменить. Это заменит блок на мнемосхему, и мимик будет иметь ту же ориентацию, что и замененный блок. Это можно увидеть по лестницам и сундукам, а также по другим зависимым от ориентации блокам, таким как бревна.\n\tЕсть несколько разных вариантов нормальной мимики. Непрозрачный мимик - это имитатор по умолчанию, способный принимать форму и общие свойства блоков - однако свет не может проходить через них, поэтому следует соблюдать осторожность со стеклом. В Ethereal Opaque Mimic можно пройти без каких-либо проблем, поскольку у него нет хитбокса, который идеально подходит для скрытых дверных проемов. Блоки Clear Mimic работают так же, как и их непрозрачные варианты, однако они пропускают свет через них, даже если он кажется полностью сплошным. Наконец, блок Lighted Mimic непрозрачен и сплошен, но независимо от того, что находится внутри него, он будет излучать сильный свет. Нет больше темных областей на вашей базе без факела спам!\n\tЕсть один особый вариант подражания, к которому вы должны относиться с осторожностью: чувствующий подражатель. Если игрок подходит слишком близко к одному из них в мире, он встанет оттуда, где находится, и нападет на вас с высокой степенью свирепости. Их можно найти в самых разных местах, но особенно они любят подземелья. Однако если имитировать сундук, будьте осторожны: они кусаются.\n\t*** Только для творческого использования ***\n\tЕсть несколько интересных функций, которые вы можете добавить к любому блоку мнемосхемы, когда находитесь в творческом режиме. Если вы щелкнете правой кнопкой мыши на мимике с зельем или фляжкой с зельем, вы можете установить мимику так, чтобы вокруг нее появлялись зелья, если рядом находится игрок. Если это обычная мимика, и вы нажимаете на восточную или западную сторону, вы можете увеличивать или уменьшать радиус, в котором будет появляться зелье. Если вы нажмете на северную или южную сторону, вы можете увеличить или уменьшить радиус, который имитирует проверим игроков вокруг него до появления зелий. Наконец, нажатие на верхнюю или нижнюю часть блока увеличит или уменьшит интервал порождения зелья, который представляет собой число тактов между опущенными зельями. \n\tЕсли мимика является разумной мимикой, вы можете нажать на мимику в любом месте, чтобы увеличить или уменьшить радиус обнаружения для игроков - если игрок находится в этой области, и они могут видеть блок, мимика будет появляться и прыгать на игрока. \n\tДругое дело, что если блок размещен на мнемосхеме, когда россыпь находится в креативе, то блок, который имитируется, НЕ будет выпадать при уничтожении мимики. \n\t Наконец, если мимик помещен в любой инвентарь или сундук, разумный мимик положит сундук на землю с его содержимым после поражения - вместо этого обычный мимик будет просто извергать содержимое повсюду, когда разбит. +guide.bloodmagic.entry.architect.downgrade.info=Пожалуйста, ознакомьтесь с разделом «Покаяние отмершей души» в «Ритуальном мастере», где подробно объясняются, что это такое, а также как их получить. + +guide.bloodmagic.entry.architect.augmentedCapacity.info=Руна дополненной способности функционирует аналогично Руне вместимости в том смысле, что она увеличивает емкость Кровавого Алтаря. Тем не менее, несколько рун на одном алтаре начнут резонировать друг с другом, экспоненциально увеличивая вместимость. Одна руна сама по себе увеличивает емкость алтаря на + 10%, однако она мультипликативно работает с другими рунами увеличенной вместимости: если есть две руны, это увеличение на + 21%, три руны +33,1. %% увеличение и т. д.\n\tК сожалению, этот мультипликативный эффект не складывается с Руной Емкости, то есть вы все равно получите бонус + 2kLP за руну. +guide.bloodmagic.entry.architect.charging.info=Зарядочная руна - одна из тех красавиц, которая полностью изменит действие Кровавого Алтаря на что-то, что может быть сочтено более полезным для создания одной остановки. Медленно сифонируя LP с Кровавого Алтаря, Руна Зарядки начинает хранить «Заряд», внутреннее значение Кровавого Алтаря, которое можно увидеть с помощью Sigil of Sight. Если у Кровавого Алтаря достаточно Заряда, когда он получает что-то для изготовления, он немедленно использует требуемую Зарядку и мгновенно создает предмет. Если заряда недостаточно, весь заряд используется для увеличения прогресса предмета в соотношении заряд: LP 1: 1. \n\tМаксимальное количество Заряда, которое может быть сохранено в Алтаре Крови, является функцией количества Заряжающих Рун, которое оно умножило на текущую емкость алтаря (емкость алтаря вступает в силу, только если она превышает 20k) , Скорость, которую он заряжает, также напрямую связана со скоростью алтаря, умноженной на количество заряженных рун, и он будет конвертировать LP в заряд каждые 20 тиков (одна секунда). Так что, если бы вы разработали Алтарь Крови с этой руной, нужно будет тщательно рассмотреть все его синергетические отношения. +guide.bloodmagic.entry.architect.acceleration.info=В отличие от большинства рун, Руна ускорения лучше всего работает только в сочетании с другими рунами, и ее эффекты только увеличиваются до ограниченного количества. Эта руна увеличивает количество тактов обработки, которые могут произойти за определенный период времени, особенно когда речь идет о Руне Смещения и Руне Зарядки. Для каждой добавленной руны количество тактов перед следующим тактом обработки уменьшается на единицу. Например, по умолчанию Руна смещения вытесняет жидкости со скоростью одной операции на 20 тиков - при 10 Рунах ускорения это происходит со скоростью одной операции на 10 тиков.\n\tОчевидно, что максимальное количество рун ускорения, которые в настоящее время имеют значение, составляет 19 - если у вас их столько, Руна смещения и Руна зарядки будут активировать свои эффекты каждый тик. Noice! + +guide.bloodmagic.entry.architect.tier3.info=Хорошо известно, что алтарь Уровня 3 требует, чтобы вы закрыли четыре колонны блоками светящихся камней из Пустоты. Что не так хорошо понято, так это то, что вы можете вместо этого использовать Морские Фонари. Поэтому, если вы оказались очень далеко от перехода в Пустоту, но у вас есть доступ к океанским храмам, вы можете использовать другие способы для продвижения в Магии Крови. + +# Demon Kin Entries +# TODO + +# Demon Kin Entry Texts +guide.bloodmagic.entry.demon.intro.info=Меня зовут Белла Хайборн, и я известна как Король Демонов. Несколько месяцев назад на мою деревню напала волна демонов, убив всех остальных людей и уничтожив все здания. Я мало что помню о нападении,кроме криков боли, когда каждый человек, которого я знал, покидал этот мир ради более счастливого. К счастью, демоны не услышали меня, когда я забилась под корзины с фруктами в подвале церкви Интактилис, отчаянно пытаясь не дать своим крикам присоединиться к хору других голосов. \nБыл один ужасный момент, когда я случайно опрокинула алтарь с благовониями в церкви, и демон ворвался в святилище, невозмутимый тем, что мы считали священным местом. Это было огромное четвероногое чудовище с кривыми клыками, свисающими из выступающей пасти, слюна капала на зазубренные мечи вместо когтей. Он оглядел комнату и, клянусь, на секунду встретился со мной взглядом, но потом просто ушел, словно ничего не видел и не слышал. Потом все было как в тумане. \nПрошел целый день, прежде чем кто-то пришел посмотреть, что случилось. Торговый караван увидел вдалеке дым и решил пройти длинным путем мимо демонов. Многие из торговцев даже не хотели смотреть на меня, опасаясь, что это дурное предзнаменование, потому что только мне удалось остаться невредимым. Но два брата решили сжалиться надо мной и попытаться убедить остальных членов каравана взять меня с собой. Мне пришлось продать жезл жрицы и запереться, но мне удалось купить безопасный проход в деревню достаточно далеко от пути демонов разрушения. +guide.bloodmagic.entry.demon.snare.info.1=Однажды маг сказал мне, что у каждого живого существа есть душа: люди, куры, овцы и даже ползучие растения обладают жизненной силой, которая дает телу волю к жизни. Кажется, что маг в свое время провел много экспериментов и даже слышал о могущественном маге, который мог взять эти души и перелить их в пустые сосуды, такие как зомби. Но это заставило меня задуматься: если у зомби и скелетов не было души, как же у них была воля к жизни? Что заставило их попытаться выследить любое живое существо и убить его? \n\tВсе это возвращалось к Уиллу, каждый раз. Все "живое" должно иметь волю, чтобы выжить, но это не значит, что оно должно быть их собственным. Когда я рассказал об этом магу, он немного поразмыслил, а потом достал доску и мел (откуда, кто знает) и начал набрасывать какие-то заметки о других видах магии. - В Тавматургии, - сказал он, рисуя фигуру соломенного человека, - големы-это живые существа, которым поручено выполнять многие мирские операции. Они живут, дышат и даже могут умереть, если окажутся в немилости у своих хозяев. В нынешней итерации Тауматургии, и да, на протяжении веков существовало несколько версий этого искусства, маг наполнял своей волей их неодушевленное творение и оживлял их.\n\t- Вот так, Белла, действуют големы: силой воли."\n\tТак что, если голем может жить за счет другого существа, вкладывающего свою волю в пустую оболочку, возможно, какое-то другое существо вкладывает свою волю в тела мертвых, создавая зомби и скелеты. Тут я вздрогнул, вспомнив, что произошло в моей старой деревне. Только демон способен на такую жестокость. Но чтобы проверить эту гипотезу, мне нужно было больше доказательств. +guide.bloodmagic.entry.demon.snare.info.2=По указанию мага и Тиберия, когда он мог протянуть руку помощи, я сделал себе рудиментарную ловушку из железа, веревки и куска красного камня. Тиберий, глубоко изучавший Тавматургию как магию выбора между дисциплинами, сказал, что силок должен быть способен нарушить волю существа, управляющего одушевленным объектом. -Я возился с этим, когда играл с големами, - сказал он с улыбкой. Мы все знали, как хорошо все обернулось. - Редстоун, казалось, нарушил связь между моими големами и моей волей к движению. Теоретически, если что-то управляет зомби или скелетами, вы должны быть в состоянии отрезать волю."\n\tОн сказал, что все, что мне нужно сделать, это бросить его - если это сработает, какая-то белая пыль должна струиться от существа в течение некоторого времени. "Поэтому вы должны убить его после того, как это произойдет, чтобы что-то действительно произошло. Но ловушка может работать только в 25% случаев, поэтому будьте немного либеральны с ними!"\n\tСотворив шестнадцать из них, я вышел ночью с мечом. На самом деле это было довольно сложно: мне пришлось выследить нескольких зомби, ныряя и уворачиваясь от их неуклюжих ударов, бросая в них несколько силков. Как только белые частицы отделились от них, я быстро убил их и подобрал то, что осталось от их тел. Небольшое количество голубой вязкой жидкости, казалось, лежало в песчаной пыли, Маня меня. Я поднял его, и мне показалось, что из жидкости исходит какое-то потустороннее "присутствие". Быстро убрав образцы, я решил взглянуть на них более глубоко, когда вернусь домой. \n\tКазалось, что размер и форма каждой "демонической воли" варьировались, как будто качество воли зависело от источника. Используя совершенно произвольную единицу измерения, воля, которую я получил от силков, кажется, колеблется от нуля до пяти "волевых качеств". Я не уверен, для чего я могу использовать это вещество, но тем не менее это очень интригующе. Я не могу сказать, отпечаток ли это воли какого-то демона, или просто случайный кристалл, найденный в их телах. Необходимы дополнительные исследования. +guide.bloodmagic.entry.demon.forge.info.1=Я провел несколько недель, исследуя использование и свойства демонической воли. В последние несколько дней был некоторый успех, однако он был нечастым. Тиберий спросил меня на днях, может ли он взять образец демонической воли для нескольких других своих экспериментов: он упомянул, что это может быть то, что ему нужно, чтобы построить новый кровавый алтарь, чтобы заменить побитый бассейн, который мы использовали в подвале Мага, так как попытка воспроизвести эту старую вещь с помощью только камня, казалось, никогда не создавала правильную... вместилище нашей магии крови. Другими словами, он думает, что это может помочь.\n\tОднако это не было полной потерей! Я просмотрел несколько учебников по алхимии, в которых обсуждался "эквивалентный обмен" и множество различных способов манипулирования материей. Я также поговорил с двумя алхимиками, которые проходили мимо, и они дали мне несколько советов о том, как деконструировать материю и энергию, чтобы изучить ее более внимательно. (Кстати, я должна сказать, что мне нравилась темно - фиолетовая броня, которую носил один алхимик-просто глядя на нее, я чувствовала, что меня тянет какой-то плотный предмет. Не говоря уже о Тиберии! Используя эти простые массивы с маленькими образцами, которые у меня были, я смог увидеть, что есть способы фактически подключиться к источнику энергии внутри демонической воли. Мне просто нужна была правильная конфигурация. +guide.bloodmagic.entry.demon.forge.info.2=Только сегодня мне удалось получить структуру, которая, как я полагал, объединит элементы, используя эту сырую волю. Названная "кузницей адского огня", структура использует простой массив алхимии, вырезанный в стекле на его вершине, чтобы сплавить до четырех предметов вместе, впрыскивая его с демонической волей. Часть демонической воли помещается с правой стороны, а четыре ингредиента помещаются по кругу. Похоже, что в этой кузнице есть много разных "рецептов", но на них есть некоторые эффекты стробирования. \n\tДля начала, существует минимальное количество демонической воли, которое должно быть в образце, чтобы элементы объединялись - если в структуре недостаточно воли, ничего не происходит. Далее, кажется, что, хотя требуется минимальное количество воли, большинство рецептов не истощают весь образец своей воли. Некоторые рецепты требуют огромного количества демонической воли для того, чтобы начать процесс, но только немного используется в крафте, если таковые вообще есть. Некоторые рецепты кажутся очень легкими для создания в больших количествах, но другие... не столько. +guide.bloodmagic.entry.demon.petty.info.1=Я отправился в одно из своих ежедневных ночных приключений, чтобы собрать немного демонической воли, когда я начал осознавать одну из главных проблем с методом сбора: моя сумка продолжала наполняться от всех образцов! По какой-то причине, возможно, потому, что конечный источник демонической воли различен для каждого образца, воля не будет сжиматься в более управляемую форму. По крайней мере, физическое проявление воли. \n\tТаким образом, я начал работать с горном адского огня, который был расположен в моем углу дома, отодвигая некоторые из наименее неприятных экспериментов Тиберия и получая сырье для моего собственного исследования. На днях я собираюсь сделать Тиберия его собственной кузницей, так как я устал пытаться избавиться от всей пыли, которая покрывает мое рабочее место от его "тайных экспериментов". Мне все равно, что вы "пытаетесь преодолеть разрыв между эфирными нитями сети души и физической конструкцией сланцев", уберите свой проклятый пепел из моих вещей! +guide.bloodmagic.entry.demon.petty.info.2=Как бы то ни было, потребовалось время, чтобы найти материалы, которые, скорее всего, резонировали бы с демонической волей, чтобы лучше хранить их. Ляпис, по-видимому, самый доступный проводник этой энергии, действующий как путь для направления воли. Добавив немного редстона в качестве защиты от электрических полей в воздухе (сложение двух энергий вместе, кажется, вызывает катастрофические последствия, по крайней мере, так сказал Магус), золото в качестве демпфирующего агента и стекло в качестве простого корпуса, мне удалось создать очень простой "винный камень". Это означает " Драгоценный камень из подземного мира, Тартар."\n\tПосле дальнейших тестов я узнал, что этот камень может выдержать качество воли 64. (Когда я представил эти результаты Магусу, он заметил, что это похоже на хорошее круглое число.) Когда я попытался впоследствии забрать демоническую волю, она, казалось,шла прямо в камень, если не была полной - после этого они просто казались... исчезнуть. Удобно для моего рюкзака, но в остальном загадка. Я также узнал, что если я держу камень в руке и фокусируюсь (щелкнув правой кнопкой мыши), около 10% максимальной емкости камня будет перетекать в другие камни, которые у меня были на моем лице. Я думаю, что эта последняя функция очень полезна, особенно если мы найдем другие, более мощные татарские камни. +guide.bloodmagic.entry.demon.sword.info.1=Мои силки снова запутались.\n\tКажется, не имеет значения, насколько я стараюсь улучшить их дизайн, рудиментарная ловушка никогда не работает идеально. Он просто запутывается большую часть времени, и когда мне наконец удается ударить им зомби, это скорее не сработает, чем сработает. Чтобы не рвать на себе волосы, я снова пошел в кузницу и сразу принялся за работу.\n\tНу, не сразу, так как сначала я должен был снова очистить пепел сверху. +guide.bloodmagic.entry.demon.sword.info.2=Я вливал железный меч в демонические силы воли мелкого татарского самоцвета,и мне удалось создать клинок... был очень тупым и едва ли причинил больше вреда, чем мой кулак. На самом деле я был очень разочарован результатом, потому что потребовалось много времени, чтобы возиться с горном, чтобы оно не перегрелось от напряжения при использовании мелкого татарского камня в качестве источника энергии.\n\tОднако, как только я поднял свой татарский камень, меч начал светиться новой энергией. Кажется, чем больше демонической воли у меня на душе, тем больше вреда я причиняю мечом, а также тем больше демонической воли падает. Если у вас нет камня, то будет очень... мизерный.после небольшого испытания я пришел к другому пониманию: в зависимости от того, кого я убиваю, я получаю разное количество воли. Кажется, пропорционально количеству максимального здоровья, которое имеет монстр-паук, так как у него максимальное здоровье 8 сердец дает 80% воли зомби, у которого 10 сердец. Это, вероятно, потому, что эти монстры требуют больше воли, чтобы оживить. Я должен иметь это в виду на потом. +guide.bloodmagic.entry.demon.lesser.info.1=Сегодня я беседовал с Тиберием, обсуждал некоторые проекты, над которыми он работает. Должен сказать, когда мы начинаем говорить о его исследованиях, кажется, что он все продолжает и продолжает! Как бы то ни было, одним из недавних изобретений, о которых он хотел поговорить, были его сигилы: до сих пор ему удавалось создавать водный и лавовый сигилы, используя адскую кузницу, которую я, наконец, построил для него, как средство для их создания. Я не был до конца уверен, как он их делал - я знал, что он экспериментировал, собирая некоторые ингредиенты и комбинируя их внутри кузницы, используя татарский камень в качестве катализатора, но я еще не видел, чтобы он активно экспериментировал. Ну, я наконец-то понял, для чего он использует этот чертов пепел.\n\tПосмотрим, смогу ли я повторить то, что он сказал. Гм. - Используя волю демона, заключенную в этих камнях, чтобы преобразовать ингредиенты, происходит реакция между вещами, которые обычно ничего не делают, когда объединяются. Используя эту вынужденную синергию, я могу вписать несколько тайных символов в узоры, которые направят энергию, которую я добавляю себе для выполнения желаемой задачи."Хотя это не очень хорошо видно в письменной форме, представьте, что я говорю это, сдвинув очки на переносицу. Я не уверен, что он обычно такой, но я клянусь, он получает все... наукой, когда он мне все объясняет.\n\tВо всяком случае, он показал мне, как он создал водный знак, продемонстрировав его мне. После, по общему признанию, яркой демонстрации, он перешел к сути дискуссии. "Когда я пытаюсь воспроизвести этот процесс с некоторыми более продвинутыми материалами, кажется, что реагенты имеют тенденцию... взрывается при добавлении в массив алхимии. Они кажутся очень нестабильными. Я думаю, что ингредиенты не сплавляются должным образом - возможно, в кузнице недостаточно энергии, чтобы сплавить их должным образом."\n\tПодумав об этом несколько минут, я приступил к работе - как я уже упоминал в предыдущей записи, я решил, что потребуется более мощный татарский камень, но я все еще не понял, как я могу сделать это элегантным способом. Итак, я решил, что для этого будет достаточно подхода грубой силы! +guide.bloodmagic.entry.demon.lesser.info.2=Я взял блок Ляписа, блок красного камня и бриллиант, а также пустой мелкий татарский камень, который лежал вокруг - часть прошлого эксперимента... все прошло не очень хорошо. Все, что я могу сказать об этом, это то, что я удивлен, что маг может сделать отверстия в твердой бетонной стене просто исчезнуть. Затем я объединил эти четыре предмета в кузнице адского огня с заполненным мелким татарским камнем, чтобы действовать как источник энергии-кажется, требуется минимум 60 воли. После некоторого усилия, пытаясь найти оптимальное расположение, я собрал их вместе и наблюдал, как пустой камень начал расти внутри кузницы.\n\tПросто в качестве примечания, я попытался использовать блок золота вместо алмаза, чтобы вырастить драгоценный камень, но, похоже, что наличие другой кристаллической структуры было более полезным.\n\tЭтот новый, "меньший татарский камень", похоже, имеет гораздо большую емкость, способную вместить в общей сложности 256 сырых Воль. Надеюсь, этого достаточно, чтобы удовлетворить потребность Тиберия в большом количестве воли на некоторое время. Но, увы, похоже, мне придется пополнить этот драгоценный камень. Еще одна долгая ночь впереди! +guide.bloodmagic.entry.demon.reactions.info=Сегодня я проснулась на больничной койке, испытывая сильную боль. Я открыл глаза и увидел тускло-пурпурный потолок крыла больницы "интенсивное проклятие" в Ветересе, ближайшем к нашей деревне крупном городе. Меня эта информация не особенно беспокоила: она настолько озадачила меня, что я каким-то образом оказался здесь, покрытый только царапинами и синяками, плюс простой гипс на левой ноге. Кто-то, должно быть, наложил на меня проклятие "Ossa Fracta" или что-то в этом роде, так как это могла быть просто сломанная кость! \n\tКогда Магус вошел с одной из медсестер с серьезным лицом, я знал, что это было что-то более радикальное. Очевидно, один из моих экспериментов с новым камнем малого камня отскочил и вызвал небольшой, но мощный взрыв. Это я мог понять достаточно легко, но это было не так: смесь обсидиана, железа и Алмаза, которую я использовал, покрывала мою нижнюю левую ногу, образуя жесткую оболочку, которую нельзя было удалить. Гипс, который был у меня на ноге, на самом деле не был гипсом, а какой-то формой рунической матрицы, покрывающей светло-голубую оболочку. \n\tЯ спокойно спросил, что думает Магус, хотя был совершенно уверен в том, что произошло. -Я думаю,-сказал он, искоса взглянув на медсестру, которая внимательно слушала, прежде чем снова посмотреть на меня,-что это просто какой-то осадок на основе алмазов, и это главная причина, по которой мы не можем его удалить. Он также пронизан немного... потусторонняя энергия, которая является основной причиной того, что вы здесь вместо кровати в местной клинике - конгломерат довольно строг в отношении неизвестной энергии, непосредственно контактирующей с людьми, начиная с инцидента Eldritch, поэтому мы должны были убедиться, что не было никаких проблем."\n\t- Понимаю...- Обычно маг не утруждает себя такими формальностями, как получение информации от конгломерата о неизвестных энергиях - я довольно долго экспериментировал с демонической волей, и это не похоже на то, что конгломерат постучал в нашу дверь, чтобы зарегистрировать эту магию. Я не буду вдаваться в подробности, так как я не очень хорошо разбираюсь в политике, но я знаю, что маг участвует в ней очень редко. Это означало, что сила этой воли сильно беспокоила Магуса, возможно, из-за некоторых его прошлых сделок...?\n\t- Ну ладно, пока хватит об этом, - сказал маг, закатывая рукава мантии. -Я пытался разбить скорлупу, когда впервые увидел ее, очевидно, проверив, что это такое. В прошлый раз это не подействовало, но теперь подействовало..."\n\tНа моей левой ноге был обжигающий жар, сопровождаемый ослепительным красным светом, когда Магнус сложил ладони на голубой раковине. Казалось, прошла целая вечность, но, должно быть, прошло всего несколько секунд, прежде чем оболочка начала трескаться и рассыпаться на части. Честно говоря, это было немного разочаровывающе. \n\tЯ попытался встать, но Халдей толкнул меня обратно в кровать. - Белла, тебе нужно остаться и отдохнуть. Вы можете поработать с вашими исследованиями о драгоценных камнях позже."Сначала я был раздражен, но вскоре это прошло, так как у меня было много времени, чтобы подумать. Единственная причина, по которой Магус не смог сделать то же самое раньше, вероятно, потому, что у меня все еще был мой татарский камень после взрыва. Поэтому, что бы ни случилось с моей ногой, я должна была быть напрямую связана с демоном Уиллом, и как только мой камень был взят, раковину можно было снять. Это заставило меня задуматься... +guide.bloodmagic.entry.demon.sentientGem.info.1=После нескольких дней "хорошо необходимого постельного режима", предписанного и навязанного магом, я решил провести небольшое исследование в первую очередь на разумном оборудовании, которое я сделал до сих пор. Есть только так много, что я не знаю о разумном мече, а также демон будет в целом. Конечно, мы знаем кое-что из теории, но, учитывая, что маг и я были теми, кто разработал теорию в первую очередь, трудно сказать, насколько она точна.\n\tДля этого мне нужно было проявить творческий подход. Маг сказал мне, что всякий раз, когда он берет ученика, он настаивает, что они должны изучать другую форму магии наряду с исследованиями, которые он проводит. Тиберий предложил мне изучать ботанику, но я посмеялась над этой идеей - букет цветов не очень-то поможет мне в борьбе с демонами! +guide.bloodmagic.entry.demon.sentientGem.info.2=Sentient Armour Gem-это переключаемый предмет, который используется для оснащения и оснащения вашей чувствительной брони. Когда вы щелкнете Правой Кнопкой Мыши с драгоценным камнем, в то время как у вас есть минимум 16 демонов в инвентаре, ваша броня будет заменена набором разумных доспехов, который копирует все заклинания из брони, которую вы заменили - когда вы активируете драгоценный камень снова, ваша оригинальная броня возвращается к вам. Это также работает, когда у вас вообще нет брони.\n\tРазумная броня первоначально действует как простой набор железных доспехов, не давая никаких дополнительных способностей, кроме защиты. Однако, как и другие разумные инструменты, броня обеспечивает большую защиту, когда у вас больше демонической воли. Это делает защиту, предоставляемую действительно мощным, когда у вас есть большое количество демона будет накоплено. Недостатком этого является то, что каждый удар будут сифон маленький кусочек демон из винной камней, и если вы получаете слишком низок броню вернется к своей первоначальной форме. Может быть плохо! +guide.bloodmagic.entry.demon.routing.info=Транспортировка предметов в магии крови происходит от соединения нитей демонической воли между узлами маршрутизации, которые действуют как каналы для передачи предметов из одного инвентаря в другой. Для начала давайте объясним, как работает каждый отдельный элемент.\n\tКаждая система маршрутизации нуждается в Главном узле маршрутизации, который действует как мозг системы. Входной узел маршрутизации вводит элементы в систему, а выходной узел маршрутизации выводит элементы из системы, а обычный узел маршрутизации не имеет специальной функции.\n\tЧтобы сформировать сеть, необходимо щелкнуть узел с маршрутизатором узла, а затем щелкнуть другой узел, который требуется подключить. Это связывает два узла вместе. Пока узел может отслеживать некоторую форму маршрута к другому узлу (и если он подключен к главному узлу маршрутизации), они могут "разговаривать" друг с другом.\n\tКак правило, элементы извлекаются из инвентаря рядом с входным узлом и помещаются в инвентарь рядом с выходным узлом. Чтобы установить, что куда идет, следует использовать фильтр. Нажав на одну из кнопок в интерфейсе узла, вы можете выбрать, что входит в инвентарь в заданном направлении (N указывает на север и т. д.). Если поместить фильтр элементов в самый левый слот узла, можно указать количества и типы элементов, с которыми узел может взаимодействовать на основе фильтра. При установке фильтра на входном фильтре можно извлекать только эти типы номенклатур из запасов (сохраняя, по крайней мере, заданную сумму, если указано количество). Если фильтр установлен на фильтре вывода, можно только переместить эти типы номенклатур в запас, не более указанного количества.\n\tСуществует четыре типа фильтров: \n\tТочный-элемент должен быть точно сопоставлен, включая NBT и метаданные\n\tMod Item-предмет соответствует, если он из одного из отфильтрованных модов.\n\tИгнорировать NBT - фильтр элементов не учитывает NBT\n\tРудный словарь - допускается любой элемент, соответствующий одной из ссылок Рудного словаря фильтров.\n\tЕсть два числа, которые вы сможете увидеть при вставке фильтра в узел маршрутизации: количество и приоритет. При нажатии на один из элементов в фильтре появится название выбранного элемента, а прямо под ним-количество элементов. Установив этот номер, вы можете указать фильтру, сколько из этого типа номенклатуры он будет хранить на складе в подключенном инвентаре (либо заполняя эту сумму, если это выходной узел, либо убедившись, что он сохраняет эту сумму, оставленную в инвентаре, если это входной узел). Если вы уменьшите количество фильтра до 0, вы можете установить так, чтобы фильтр разрешал "все", как в любом количестве, для этого конкретного фильтра. Входные узлы будут вытягивать как можно больше из инвентаря, а выходные узлы будут толкать как можно больше.\n\tВторое число-это приоритет узла, изменяемый кнопками со стрелками рядом с ним. Это число отличается для каждой стороны узла. Сначала будет использоваться узел с меньшим номером в сети. +guide.bloodmagic.entry.demon.aura.info=Когда сущность убита нормально, она со временем испаряется и возвращается к Творцу. Когда он попадает в ловушку, он втягивается в этот план из эфирного и как бы застревает. У нас есть, для всех намерений и целей, нарушена его программирования, и он заморозил все действия. Когда мы сжигаем его, он возвращается в эфирное состояние и может возобновить нормальные операции. Если это впрыскивается в воздух, то мы можем использовать его в различных направлениях. Некоторые из них мирские по своей природе, в то время как другие довольно могущественны.\n\tДемон будет при инъекции в воздух остается внутри куска, который он был введен без миграции. Каждый кусок имеет свою собственную сохраненную волю, причем каждый тип воли хранится отдельно (подробнее об этом в другом разделе). Это будет доступно и управляться другими блоками и элементами. +guide.bloodmagic.entry.demon.types.info=До сих пор единственный тип демонической Воли, который мы обсуждали, - это необработанная воля. Как следует из названия, это самая грубая и неподдельная форма воли, но это не значит, что она чиста. На самом деле, воля демона принимает много различных форм: сырой-это тип, с которым мы имеем дело обычно, но есть также разъедающий, разрушительный, мстительный и стойкий. Необработанная воля состоит из смеси всех четырех этих типов и, возможно, смешана с другими, еще не открытыми типами, но после разделения на эти различные типы воли кажется невозможным их рекомбинировать.\n\tПока неясно, происходят ли эти разные типы воли из разных источников, однако мы знаем процесс генерации этих разных типов воли. Ритуальный " резонанс граненого кристалла "может расколоть необработанный Кристалл воли на его чистые части, подробнее об этом в соответствующей записи в"ритуальном Мастере". Устройство, способное получать необработанные кристаллы воли, - это кристаллизатор демона, вход в который находится ниже.\n\tКаждый из этих четырех типов воли представляет различные аспекты желания. Могут быть и другие типы воли, однако они либо недостаточно чисты, либо просто не могут быть созданы в этой форме.\n\tКоррозия представляет собой желание разрушить все вокруг себя, либо кислотой, либо сокрушительной силой. Тот, кто может овладеть этой волей, может обладать ослабляющими статусными эффектами и невосприимчив к ужасным ядам.мстительность можно рассматривать как желание без устали искать цель. Обычно это можно рассматривать либо как увеличение скорости тела, чтобы искать свою добычу, либо чтобы убедиться, что цель не в состоянии уйти, как вы постоянно атакуете их.\n\tРазрушение, как вы, вероятно, можете сказать, это чистая сила. Сила атаки и общая физическая доблесть могут быть получены, если эта воля должным образом обуздана. Его можно также использовать для того чтобы задавить и поломать вещи при использовании в других применениях.\n\tСтойкость рассматривается как желание предотвратить вред себе. В большинстве случаев хозяева этой воли являются оборонительным оплотом партии, способным противостоять мощным атакам и даже не чувствовать их. Если вам нужно остаться в живых, с помощью доспехов или ритуалов, это один из вариантов, который следует рассмотреть. +guide.bloodmagic.entry.demon.crucible.info=Тигель демона-это устройство, которое способно сжечь волю демона внутри камня и других предметов, чтобы ввести его в ауру куска, в котором он находится. Есть несколько различных способов использования тигля: один из самых простых способов-поместить камень внутри тигля, щелкнув по нему правой кнопкой мыши с камнем в руке. В этом случае тигель будет сливать волю из драгоценного камня до тех пор, пока аура не будет насыщена этим типом воли (максимум 100 по умолчанию) или пока драгоценный камень не опустеет.\n\tДругой способ - использовать содержащийся в камне винный камень, чтобы слить волю из ауры-это делается путем подачи сильного сигнала красного камня в тигель, а затем содержащийся камень попытается слить как можно больше воли.\n\tНаконец, отдельный кусочек воли может быть сожжен в тигле, если в ауре такого типа достаточно места. Одним из примеров этого является Кристалл воли демона, который имеет значение 50. +guide.bloodmagic.entry.demon.crystallizer.info=Как уже говорилось ранее, аура демона-это эфирное проявление воли демона, а вещество, получаемое при убийстве толпы, - ее физическое проявление. Кристаллизатор демона действует как Якорная точка для демонической воли в ауре, чтобы зацепиться, Преобразуя эфирную волю обратно в физическую форму снова в форме кристалла.\n\tВам может быть интересно, почему вы просто не берете волю из татарского камня напрямую и не формируете из нее Кристалл. Это происходит потому, что, трансформируя волю в ее эфирную форму, мы очищаем ее и позволяем воле попытаться возобновить свои обычные действия - имейте в виду, что когда мы убиваем монстра с демонической волей, прикрепленной к ним, мы замораживаем Программирование воли, чтобы она не могла делать то, для чего она была послана. Преобразуя его в эфирную форму в ауре, воля становится более активной, и это та воля, которая схвачена кристаллизатором. Только не смотри на это смешно.\n\tДля того, чтобы кристаллизатор демона работал, он должен быть в куске с большим количеством демонической воли (80) определенного типа, и через определенное количество времени он будет потреблять волю из ауры, чтобы создать кластер кристаллов демона с одним шпилем. Есть два способа работы кристаллизатора: он может сформировать Кристалл из определенного типа воли (агрессивной, разрушительной, мстительной и стойкой), если будет достаточно воли этого конкретного типа, или он возьмет сырую волю из ауры, чтобы создать Кристалл. \n\tВ предыдущих воплощениях устройства было возможно трансформировать сырую волю из ауры в кристаллы с разными направлениями. Однако это уже не так: вы все еще можете создавать новые шпили определенной устремленной воли, если ее достаточно в ауре, однако вам нужно будет искать другие средства, чтобы отделить многие аспекты от сырой воли. Более подробно смотрите запись "резонанс граненого Кристалла" в ритуальном Мастере. +guide.bloodmagic.entry.demon.cluster.info=Кластер кристаллов демона может быть создан либо Кристаллизатором демона, либо путем создания его в кузнице адского огня с кристаллами демона воли. Обработанные кластеры могут быть размещены на любой твердой поверхности, такой как пол, стены и потолки. На кристалле есть максимум семь шпилей, когда он полностью вырос, и когда он сломан киркой, он уронит шпили, как демон кристаллы. Однако, если вы щелкните правой кнопкой мыши кластер, когда у вас есть Виннокаменный камень с более чем 1024 необработанной волей внутри него, вы можете сломать один шпиль из кластера, не нарушая сам кластер; это никогда не сломает главный шпиль кластера.\n\tПредоставленный самому себе, кластер будет сифонировать некую волю того же типа из ауры, чтобы расти медленно. Этот процесс немного медленный, но есть небольшой чистый выигрыш.\n\tЕсть два ритуала, которые используются для выращивания и сбора этих кристаллов:" сбор покинутых душ "и"трещина разбитого Кристалла". Чтобы узнать, как их использовать, обратитесь к мастеру ритуала. +guide.bloodmagic.entry.demon.pylon.info=Как вы, возможно, знаете, аура демона остается в своем собственном куске, если нет никаких внешних влияний. Ну, это одно из таких влияний. Пилон демона действует как маяк для Воли в ауре, вытягивая волю из соседних кусков (тех кусков, которые находятся непосредственно рядом с ним в четырех кардинальных направлениях, а не по диагонали) в свой кусок. Пилон попытается уравнять волю в своем куске со своим соседом так, чтобы у куска пилона было столько же воли, сколько у его высшего соседа для каждого типа. Однако этот процесс происходит только в одном направлении: если в соседнем куске меньше воли, чем в куске пилона, Воля не будет передавать другое направление. +guide.bloodmagic.entry.demon.gauge.info=Чтобы сказать, сколько у вас будет в данном куске, вам нужно, чтобы демон измерил. Когда в вашем инвентаре, датчик будет отображать волю в куске, который у вас есть в пяти барах в левом верхнем углу экрана. Вы можете сказать, сколько точно, сдвинув; числа появятся справа от баров, чтобы дать сумму, округленную до ближайшего целого числа. + + + +# Alchemy Entries +guide.bloodmagic.entry.alchemy.intro=Вступление +guide.bloodmagic.entry.alchemy.ash=Тайный пепел +guide.bloodmagic.entry.alchemy.speed=Движение Массив +guide.bloodmagic.entry.alchemy.updraft=Массив обновлений +guide.bloodmagic.entry.alchemy.bounce=Прыгающий массив +guide.bloodmagic.entry.alchemy.turret=Револьверный скелет массива +guide.bloodmagic.entry.alchemy.buff=Ослабляющие массивы +guide.bloodmagic.entry.alchemy.fastMiner=Массив Fast Miner +guide.bloodmagic.entry.alchemy.furnace=Сжигание печи массив +guide.bloodmagic.entry.alchemy.teleport=Массив телепортация +guide.bloodmagic.entry.alchemy.standardTurret=Массив турель +guide.bloodmagic.entry.alchemy.laputa=Осколок Лапута + + +# Alchemy Entry Texts +guide.bloodmagic.entry.alchemy.intro.info=Меня зовут Влад Хайборн, и я маг крови. Я изучал сложную работу алхимии и процесс "эквивалентного обмена", который управляет всеми аспектами магии. В принципе, вы не можете создать что-то из ничего, хотя многие пытались при поиске определенного камня. Это, очевидно, не закончилось хорошо, потому что люди требуют поддельного варианта даже сегодня. Конечно, просто сказать, что я алхимик, недостаточно, потому что одна из главных вещей, которую я делаю, это изучаю магию крови с ритуальным мастером и архитектором, оба из которых достигли этих титулов по своим собственным заслугам. Маг и Тиберий были заняты записью своих собственных работ на протяжении многих лет, хотя я не думаю, что у мага все записано в книге - я еще не нашел никаких фактических доказательств.моя книга посвящена всем алхимическим вещам в магии крови. От использования тайного пепла до сложной работы таблицы алхимии, вы найдете все, что вам нужно знать о некоторых из более сложных элементов в мире. Не все, что вам нужно знать, есть в этой книге - для полного понимания магии крови вам нужно будет прочитать другие записи во всем этом томе.\n\tBut а пока, надеюсь, вам понравятся мои записи. Ты не найдешь никакой лжи между этими покрывалами. +guide.bloodmagic.entry.alchemy.ash.info=Arcane Ash необходим для того, чтобы создавать алхимические массивы, мощные круги, которые способны обеспечить различные эффекты. Этот пепел изготовлен с использованием Hellfire Forge и Demon Will, поэтому, если вы новичок в этой концепции, обратитесь к "Королю демонов"." \n\tПепел имеет в общей сложности двадцать применений, прежде чем вам нужно создать другой. Когда вы щелкните правой кнопкой мыши по земле (или стене, хотя она будет отображать только одно направление), вы напишете простой круг из пепла. Если вы снова нажмете на золу с элементом, он будет" помещен внутри золы " - предполагая, что этот элемент действителен, круг изменит форму, чтобы представить, что он готов к следующему элементу. Если он не меняет форму, значит, вы сделали что-то не так.\n\tПосле того, как он изменил форму, вы можете поместить во вторичный элемент. Если этот элемент совпадает с первым элементом, круг начнет вращаться и выполнять различные действия в зависимости от рецепта, над которым он работает. \n\tКаждый не-крафтовый эффект, который можно выполнить с помощью этих массивов, можно найти в этой книге, и даже если рецепт изменится через 3rd party, он будет отображаться обновленным здесь. Показанные элементы-это порядок, в котором они должны быть размещены. +guide.bloodmagic.entry.alchemy.speed.info=Массив движения создает небольшой вихрь воздуха в его центре и использует небольшое количество энергии для его нагрева. После этого, как только животное или любой другой тип существа войдет в зону его действия, они будут запущены вперед в том направлении, в котором он был помещен силой воздуха. Более того, если упасть с большой высоты, массив устранит урон от падения, который был бы нанесен. Просто будьте готовы к некоторым мягким движением опосля. \n\tНаправление движения-в направлении стрелки на массиве.\n\tСледует также отметить, что вы получите гораздо большее расстояние, если упадете или прыгнете на массив, чем если бы вы просто вошли в его область. Это связано с турбулентностью ваших движений, вызывающей гораздо большую реакцию. +guide.bloodmagic.entry.alchemy.updraft.info=Используя те же принципы, что и массив Movement, этот массив запускает объект, который ступает поверх него вертикально в воздухе. Естественно, любой пользователь должен быть осторожен, потому что путь вниз может быть немного трудным! +guide.bloodmagic.entry.alchemy.bounce.info=Используя источник тепла вблизи своего центра, который толкается вниз, массив пытается смягчить землю под ним. После этого он преобразует углерод и водород в резиновый материал внутри Земли. Эта комбинация причиняет любую сущность ударить поверхность для того чтобы отскочить в воздухе и исключать повреждение падения которое в противном случае было бы терпеть. Этот отскок может быть остановлен простым перемещением, и он все равно смягчит ваше падение. +guide.bloodmagic.entry.alchemy.turret.info=Используя волю демона, который все еще контролирует толпу, вы можете захватить разум скелета, чтобы заставить его выполнять ваши приказы. Если скелет окажется внутри области этого массива, он будет действовать как часовой и атаковать враждебных монстров поблизости. К сожалению, этот массив все еще очень экспериментален, поэтому он может работать не очень хорошо или последовательно. +guide.bloodmagic.entry.alchemy.buff.info=Благодаря тщательному изучению вы понимаете, что алхимические массивы имеют широкий спектр приложений. До сих пор вам удавалось создавать мощные предметы с помощью крафтовых массивов, а также нескольких массивов, которые обеспечивают функциональные преимущества, такие как быстрое движение и слабые формы телепортации. Однако одно из применений, которое вам еще предстоит использовать, - это предоставление мощных буферов через активный массив.\n\t"Бафф-массивы" - это общий термин для алхимических массивов, которые предоставляют некоторый бафф игрокам в пределах своей области действия. Эти зоны влияния имеют тенденцию иметь очень большой радиус, которым нельзя манипулировать (в отличие от ритуалов). Однако, поскольку алхимические массивы не имеют понятия о сети душ, они должны питать свои эффекты другими средствами: в основном через прямые кровавые подношения.Проще говоря, это означает, что всякий раз, когда массив будет применять бафф, он повредит (возьмет HP) у игрока, на которого он брошен. \n\tИз-за прямого характера этих жертв преобразование HP - > buff намного более благоприятно для игроков в ранней игре по сравнению с аналогичными баффами в моде. Например, если бафф из сигила стоит 100 ЛП за 10 секунд активации, более мощный бафф может быть применен массивом за 30 секунд за 1 ЛП (что составляет 100 ЛП в алтаре T1 без рун). Это можно рассматривать как намного более эффективное на ранних уровнях, в то время как на более поздних уровнях это не так эффективно. Однако, из-за стационарной природы массивов, они, как правило, обеспечивают более сильный эффект, чем их сигил-счетчики, поэтому люди могут захотеть использовать его в конце игры. +guide.bloodmagic.entry.alchemy.fastMiner.info=Когда поставлена задача вырезать большую площадь земли, иногда лучше всего просто сделать это вручную. Для таких случаев, этот массив для вас. Массив применяет Haste III buff к игрокам в радиусе 10 блоков, что стоит пользователю 1 HP за 30 секунд. Потому что это общая спешка бафф, он также увеличит скорость атаки в то время как в своей области эффекта, хотя вам придется быть осторожным, так как другие игроки тоже выиграют от этого! +guide.bloodmagic.entry.alchemy.furnace.info=Одна из многих проблем, с которыми вы можете столкнуться в начале своего приключения, - это неспособность поддерживать огонь в печи. Горящая печь может означать разницу между полным желудком и сильным оружием или голодом в пещере. \n\tГорящий массив печи, как следует из названия, обеспечит столь необходимый источник тепла для любой близлежащей печи. Размещая массив непосредственно рядом с ванильной печью (он может быть рядом с несколькими), он обеспечит топливо для печи, если операция может быть завершена - ничего не произойдет, если она находится рядом с пустой или полной печью, в основном для вашей защиты. \n\tОднако это не бесплатно: когда человек находится рядом (в радиусе 10 кварталов), он заберет половину сердца здоровья, чтобы приготовить до двух вещей в печи. Это будет полезно либо быстро перекусить, либо расплавить полный штабель руды, но, к сожалению, вы не нашли способа добавить какие-либо меры безопасности в массив... +guide.bloodmagic.entry.alchemy.teleport.info=Массив телепортации действует как способ мгновенно перемещаться из одного места в другое с несколькими конкретными ограничениями. Когда игрок или другой объект входит в массив, массив будет искать до 20 блоков в направлении, в котором он сталкивается с другим массивом алхимии (который не должен быть активным). Если массиву удастся успешно найти пункт назначения, он телепортирует объект в найденный массив мгновенно, даже через стены. \n\tИзучение этого массива показало, что к нему добавляются дополнительные ограничения: из-за природы изгиба ткани пространства-времени массив телепортации не будет телепортировать то, что телепортировалось в течение 2 секунд. Это должно дать время всем компонентам перестроиться желательным образом. +guide.bloodmagic.entry.alchemy.standardTurret.info=Невозможно переоценить силу метания острых предметов в далеких монстров. Башенная решетка способна ощутить близкого враждебного монстра и, используя сложные алхимические механизмы, способна отступить и выстрелить стрелой, чтобы поразить свою цель. \ n \ t массив ищет инвентарь непосредственно под ним. Если он найдет нормальную или наклоненную стрелку, он будет сифон из своего контейнера и стрелять в толпу, которая находится в радиусе 32 блока. \n\t(Из-за какой-то глупой физики Minecraft, в которой стрелки отскакивают от объектов, которые слишком близки к тому, где они появляются, башня также будет стрелять только по толпе, которая больше, чем в 3 кварталах. Имейте это в виду!) +guide.bloodmagic.entry.alchemy.laputa.info=Существует история о потерянном королевстве, которое обладало такой развитой магией, что могло летать сквозь облака. Хотя это королевство с тех пор рассыпалось в пыль, несколько рисунков этого замка в небе сумели предоставить изысканные детали механизмов, которые позволили ему стать легендой, что это так. \n\tОсколок Лапуты превращает сущность жизни, которая находится внутри Земли, в более птичью форму, заставляя окружающую область левитировать в воздухе. Хотя основной принцип прост, вариации жизненной сущности Земли вызывают некоторую непоследовательность в том, сколько Земли перемещается. Массив будет перемещать землю в сферическом радиусе между 4 и 8 блоками над собой случайное смещение между одним и 5 блоками плюс дважды радиус эффекта. \n\tСледует отметить, что как только начнется эффект, все элементы, используемые для активации массива, будут потеряны.