diff --git a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java index 582f71bf..3ba99dc9 100644 --- a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java @@ -207,6 +207,7 @@ public class ConfigHandler { } public static void checkRituals() { + RitualHelper.checkRituals(config, "WayofTime.bloodmagic.ritual", "Rituals"); RitualHelper.checkImperfectRituals(config, "WayofTime.bloodmagic.ritual.imperfect", "Rituals.imperfect"); config.save(); } diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/IMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/api/ritual/IMasterRitualStone.java index 0bec0503..f00d5bcc 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/IMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/api/ritual/IMasterRitualStone.java @@ -10,11 +10,11 @@ public interface IMasterRitualStone { String getOwner(); - boolean activateRitual(ItemStack activationCrystal, EntityPlayer activator); + boolean activateRitual(ItemStack activationCrystal, EntityPlayer activator, Ritual ritual); - void performRitual(World world, BlockPos pos, Ritual ritual); + void performRitual(World world, BlockPos pos); - void stopRitual(); + void stopRitual(Ritual.BreakType breakType); int getCooldown(); diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/Ritual.java b/src/main/java/WayofTime/bloodmagic/api/ritual/Ritual.java index f42eb348..4980a66a 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/Ritual.java +++ b/src/main/java/WayofTime/bloodmagic/api/ritual/Ritual.java @@ -23,11 +23,11 @@ public abstract class Ritual { this(name, crystalLevel, activationCost, null); } - public abstract boolean startRitual(IMasterRitualStone masterRitualStone, EntityPlayer player); + public abstract boolean activateRitual(IMasterRitualStone masterRitualStone, EntityPlayer player); - public abstract void performEffect(IMasterRitualStone masterRitualStone); + public abstract void performRitual(IMasterRitualStone masterRitualStone); - public abstract void onRitualBroken(IMasterRitualStone masterRitualStone, Ritual.BreakType breakType); + public abstract void stopRitual(IMasterRitualStone masterRitualStone, Ritual.BreakType breakType); public abstract int getRefreshCost(); diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/RitualHelper.java b/src/main/java/WayofTime/bloodmagic/api/util/helper/RitualHelper.java index cb2dfa02..a162e884 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/RitualHelper.java +++ b/src/main/java/WayofTime/bloodmagic/api/util/helper/RitualHelper.java @@ -3,12 +3,21 @@ package WayofTime.bloodmagic.api.util.helper; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.registry.ImperfectRitualRegistry; import WayofTime.bloodmagic.api.registry.RitualRegistry; +import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.Ritual; +import WayofTime.bloodmagic.api.ritual.RitualComponent; import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.block.BlockRitualStone; +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.util.BlockPos; +import net.minecraft.util.EnumFacing; +import net.minecraft.world.World; import net.minecraftforge.common.config.Configuration; import java.io.File; import java.net.URL; +import java.util.ArrayList; import java.util.Map; public class RitualHelper { @@ -31,6 +40,25 @@ public class RitualHelper { return RitualRegistry.getIds().get(previousIndex); } + public static boolean checkValidRitual(World world, BlockPos pos, String ritualId, EnumFacing direction) { + ArrayList components = RitualRegistry.getRitualForId(ritualId).getComponents(); + + if (components == null) + return false; + + for (RitualComponent component : components) { + IBlockState worldState = world.getBlockState(pos.add(component.getOffset())); + if (worldState.getBlock() instanceof BlockRitualStone) { + EnumRuneType worldType = EnumRuneType.values()[worldState.getBlock().getMetaFromState(worldState)]; + + if (component.getRuneType() != worldType) + return false; + } + } + + return true; + } + public static void checkImperfectRituals(Configuration config, String packageName, String category) { checkRituals(config, packageName, category, ImperfectRitual.class, ImperfectRitualRegistry.enabledRituals); } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java index e0ebb3ac..cff89543 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java @@ -4,15 +4,24 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.BlockStack; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.registry.ImperfectRitualRegistry; +import WayofTime.bloodmagic.api.registry.RitualRegistry; +import WayofTime.bloodmagic.api.ritual.Ritual; +import WayofTime.bloodmagic.api.ritual.RitualComponent; +import WayofTime.bloodmagic.api.util.helper.RitualHelper; import WayofTime.bloodmagic.block.base.BlockStringContainer; +import WayofTime.bloodmagic.registry.ModBlocks; +import WayofTime.bloodmagic.registry.ModItems; import WayofTime.bloodmagic.tile.TileImperfectRitualStone; import WayofTime.bloodmagic.tile.TileMasterRitualStone; import net.minecraft.block.material.Material; +import net.minecraft.block.state.BlockState; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.BlockPos; +import net.minecraft.util.ChatComponentText; import net.minecraft.util.EnumFacing; +import net.minecraft.world.Explosion; import net.minecraft.world.World; public class BlockRitualController extends BlockStringContainer { @@ -34,7 +43,25 @@ public class BlockRitualController extends BlockStringContainer { public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumFacing side, float hitX, float hitY, float hitZ) { TileEntity tile = world.getTileEntity(pos); - if (getMetaFromState(state) == 1 && tile instanceof TileImperfectRitualStone) { + if (player.getHeldItem() == null && tile instanceof TileMasterRitualStone) { + Ritual send = ((TileMasterRitualStone) tile).getCurrentRitual(); + if (send != null) + player.addChatComponentMessage(new ChatComponentText(send.getName())); + else { + Ritual place = RitualRegistry.getRitualForId("ritualTest"); + for (RitualComponent ritualComponent : place.getComponents()) { + IBlockState toPlace = ModBlocks.ritualStone.getStateFromMeta(ritualComponent.getRuneType().ordinal()); + world.setBlockState(pos.add(ritualComponent.getOffset()), toPlace); + } + } + } + + if (getMetaFromState(state) == 0 && tile instanceof TileMasterRitualStone) { + if (player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.activationCrystal) { + if (RitualHelper.checkValidRitual(world, pos, "ritualTest", null)) + ((TileMasterRitualStone) tile).activateRitual(player.getHeldItem(), player, RitualRegistry.getRitualForId("ritualTest")); + } + } else if (getMetaFromState(state) == 1 && tile instanceof TileImperfectRitualStone) { IBlockState determinerState = world.getBlockState(pos.up()); BlockStack determiner = new BlockStack(determinerState.getBlock(), determinerState.getBlock().getMetaFromState(determinerState)); @@ -45,6 +72,23 @@ public class BlockRitualController extends BlockStringContainer { return false; } + @Override + public void onBlockHarvested(World world, BlockPos pos, IBlockState state, EntityPlayer player) { + TileEntity tile = world.getTileEntity(pos); + + if (getMetaFromState(state) == 0 && tile instanceof TileMasterRitualStone) + ((TileMasterRitualStone) tile).stopRitual(Ritual.BreakType.BREAK_MRS); + } + + @Override + public void onBlockDestroyedByExplosion(World world, BlockPos pos, Explosion explosion) { + TileEntity tile = world.getTileEntity(pos); + IBlockState state = world.getBlockState(pos); + + if (getMetaFromState(state) == 0 && tile instanceof TileMasterRitualStone) + ((TileMasterRitualStone) tile).stopRitual(Ritual.BreakType.EXPLOSION); + } + @Override public TileEntity createNewTileEntity(World world, int meta) { return meta == 0 ? new TileMasterRitualStone() : new TileImperfectRitualStone(); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java index c05724fc..d737067b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java @@ -43,22 +43,6 @@ public class ItemActivationCrystal extends ItemBindable { tooltip.add(TextHelper.localize("tooltip.BloodMagic.activationCrystal." + names[stack.getItemDamage()])); super.addInformation(stack, player, tooltip, advanced); - -// if (stack.getItemDamage() == 1) { -// if (Keyboard.isKeyDown(Keyboard.KEY_RSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) { -// ItemStack[] recipe = AlchemyRecipeRegistry.getRecipeForItemStack(stack); -// -// if (recipe != null) { -// tooltip.add(TextHelper.getFormattedText(StatCollector.translateToLocal("tooltip.alchemy.recipe"))); -// -// for (ItemStack item : recipe) -// if (item != null) -// tooltip.add(item.getDisplayName()); -// } -// } else { -// tooltip.add(TextHelper.getFormattedText(StatCollector.translateToLocal("tooltip.alchemy.pressShift"))); -// } -// } } public int getCrystalLevel(ItemStack stack) { diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java index 2356d864..12bae262 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java @@ -1,7 +1,10 @@ package WayofTime.bloodmagic.registry; import WayofTime.bloodmagic.api.registry.ImperfectRitualRegistry; +import WayofTime.bloodmagic.api.registry.RitualRegistry; +import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.ritual.RitualTest; import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitualNight; import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitualRain; import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitualResistance; @@ -9,13 +12,16 @@ import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitualZombie; public class ModRituals { + public static Ritual testRitual; + public static ImperfectRitual imperfectNight; public static ImperfectRitual imperfectRain; public static ImperfectRitual imperfectResistance; public static ImperfectRitual imperfectZombie; public static void initRituals() { - + testRitual = new RitualTest(); + RitualRegistry.registerRitual(testRitual, testRitual.getName()); } public static void initImperfectRituals() { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualTest.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualTest.java new file mode 100644 index 00000000..1f641d4f --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualTest.java @@ -0,0 +1,55 @@ +package WayofTime.bloodmagic.ritual; + +import WayofTime.bloodmagic.api.ritual.*; +import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.BlockPos; +import net.minecraft.util.ChatComponentText; + +import java.util.ArrayList; + +public class RitualTest extends Ritual { + + public RitualTest() { + super("ritualTest", 0, 1000); + } + + @Override + public boolean activateRitual(IMasterRitualStone masterRitualStone, EntityPlayer player) { + player.addChatComponentMessage(new ChatComponentText("ritual started")); + return true; + } + + @Override + public void performRitual(IMasterRitualStone masterRitualStone) { + EntityPlayer player = PlayerHelper.getPlayerFromUsername(masterRitualStone.getOwner()); + + if (player != null) + player.addChatComponentMessage(new ChatComponentText("effect performed")); + } + + @Override + public void stopRitual(IMasterRitualStone masterRitualStone, BreakType breakType) { + EntityPlayer player = PlayerHelper.getPlayerFromUsername(masterRitualStone.getOwner()); + + if (player != null) + player.addChatComponentMessage(new ChatComponentText("ritual stopped - " + breakType.name())); + } + + @Override + public int getRefreshCost() { + return 0; + } + + @Override + public ArrayList getComponents() { + ArrayList components = new ArrayList(); + + components.add(new RitualComponent(new BlockPos(1, 0, 1), EnumRuneType.AIR)); + components.add(new RitualComponent(new BlockPos(-1, 0, 1), EnumRuneType.EARTH)); + components.add(new RitualComponent(new BlockPos(1, 0, -1), EnumRuneType.WATER)); + components.add(new RitualComponent(new BlockPos(-1, 0, -1), EnumRuneType.FIRE)); + + return components; + } +} diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java index 941420a7..bb9dc06e 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java @@ -8,12 +8,14 @@ import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.api.util.helper.NetworkHelper; +import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import WayofTime.bloodmagic.api.util.helper.RitualHelper; import WayofTime.bloodmagic.item.ItemActivationCrystal; import WayofTime.bloodmagic.util.ChatUtil; import com.google.common.base.Strings; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -29,49 +31,83 @@ import net.minecraftforge.fml.common.eventhandler.Event; @NoArgsConstructor public class TileMasterRitualStone extends TileEntity implements IMasterRitualStone, ITickable { - public static final int REFRESH_TIME = 0; + public static final int REFRESH_TIME = 20; private String owner; private boolean active; private int activeTime; private int cooldown; private Ritual currentRitual; + @Setter private EnumFacing direction; - public void readClientNBT(NBTTagCompound tag) { + @Override + public void update() { + if (getCurrentRitual() != null && isActive()) { + if (activeTime % REFRESH_TIME == 0) + performRitual(getWorld(), getPos()); + + activeTime++; + } + } + + @Override + public void readFromNBT(NBTTagCompound tag) { + owner = tag.getString(Constants.NBT.OWNER_NAME); currentRitual = RitualRegistry.getRitualForId(tag.getString(Constants.NBT.CURRENT_RITUAL)); active = tag.getBoolean(Constants.NBT.IS_RUNNING); activeTime = tag.getInteger(Constants.NBT.RUNTIME); } - public void writeClientNBT(NBTTagCompound tag) { - tag.setString(Constants.NBT.CURRENT_RITUAL, RitualRegistry.getIdForRitual(currentRitual)); - tag.setBoolean(Constants.NBT.IS_RUNNING, active); - tag.setInteger(Constants.NBT.RUNTIME, activeTime); + @Override + public void writeToNBT(NBTTagCompound tag) { + String ritualId = RitualRegistry.getIdForRitual(getCurrentRitual()); + tag.setString(Constants.NBT.OWNER_NAME, Strings.isNullOrEmpty(getOwner()) ? "" : getOwner()); + tag.setString(Constants.NBT.CURRENT_RITUAL, Strings.isNullOrEmpty(ritualId) ? "" : ritualId); + tag.setBoolean(Constants.NBT.IS_RUNNING, isActive()); + tag.setInteger(Constants.NBT.RUNTIME, getActiveTime()); } @Override - public void update() { + public boolean activateRitual(ItemStack activationCrystal, EntityPlayer activator, Ritual ritual) { - } + if (PlayerHelper.isFakePlayer(activator)) + return false; - @Override - public boolean activateRitual(ItemStack activationCrystal, EntityPlayer activator) { activationCrystal = NBTHelper.checkNBT(activationCrystal); String crystalOwner = activationCrystal.getTagCompound().getString(Constants.NBT.OWNER_NAME); - Ritual ritual = RitualRegistry.getRitualForId(""); if (!Strings.isNullOrEmpty(crystalOwner) && ritual != null) { if (activationCrystal.getItem() instanceof ItemActivationCrystal) { int crystalLevel = ((ItemActivationCrystal) activationCrystal.getItem()).getCrystalLevel(activationCrystal); if (RitualHelper.canCrystalActivate(ritual, crystalLevel)) { + SoulNetwork network = NetworkHelper.getSoulNetwork(activator.getDisplayNameString(), getWorld()); + + if (network.getCurrentEssence() < ritual.getActivationCost()) { + ChatUtil.sendNoSpamUnloc(activator, "chat.BloodMagic.ritual.weak"); + return false; + } + + if (currentRitual != null) + currentRitual.stopRitual(this, Ritual.BreakType.ACTIVATE); + RitualEvent.RitualActivatedEvent event = new RitualEvent.RitualActivatedEvent(this, crystalOwner, ritual, activator, activationCrystal, crystalLevel); if (MinecraftForge.EVENT_BUS.post(event) || event.getResult() == Event.Result.DENY) { ChatUtil.sendNoSpamUnloc(activator, "chat.BloodMagic.ritual.prevent"); return false; } + + if (ritual.activateRitual(this, activator)) { + network.syphon(ritual.getActivationCost()); + + this.active = true; + this.owner = activator.getDisplayNameString(); + this.currentRitual = ritual; + + return true; + } } } } @@ -80,17 +116,32 @@ public class TileMasterRitualStone extends TileEntity implements IMasterRitualSt } @Override - public void performRitual(World world, BlockPos pos, Ritual ritual) { - if (ritual != null && RitualRegistry.ritualEnabled(ritual)) { + public void performRitual(World world, BlockPos pos) { + if (getCurrentRitual() != null && RitualRegistry.ritualEnabled(getCurrentRitual()) && RitualHelper.checkValidRitual(getWorld(), getPos(), RitualRegistry.getIdForRitual(currentRitual), null)) { + RitualEvent.RitualRunEvent event = new RitualEvent.RitualRunEvent(this, getOwner(), getCurrentRitual()); + + if (MinecraftForge.EVENT_BUS.post(event) || event.getResult() == Event.Result.DENY) + return; + SoulNetwork network = NetworkHelper.getSoulNetwork(getOwner(), getWorld()); - network.syphonAndDamage(ritual.getRefreshCost()); - ritual.performEffect(this); + network.syphonAndDamage(getCurrentRitual().getRefreshCost()); + getCurrentRitual().performRitual(this); } } @Override - public void stopRitual() { + public void stopRitual(Ritual.BreakType breakType) { + if (getCurrentRitual() != null) { + RitualEvent.RitualStopEvent event = new RitualEvent.RitualStopEvent(this, getOwner(), getCurrentRitual(), breakType); + if (MinecraftForge.EVENT_BUS.post(event) || event.getResult() == Event.Result.DENY) + return; + + getCurrentRitual().stopRitual(this, breakType); + this.currentRitual = null; + this.active = false; + this.activeTime = 0; + } } @Override