From 46742a73d1a24a7eb18c41dd8dace58c02633c54 Mon Sep 17 00:00:00 2001 From: Nick Date: Mon, 2 Nov 2015 09:51:11 -0800 Subject: [PATCH] Ritual work + Begin move of NetworkHelper (static) to SoulNetwork (instance) --- .../api/event/SoulNetworkEvent.java | 4 +- .../api/network/SoulNetwork.java | 55 +++++++++++++++ .../api/ritual/IMasterRitualStone.java | 2 +- .../api/util/helper/NetworkHelper.java | 13 ++++ .../item/ItemActivationCrystal.java | 67 +++++++++++++++++++ .../alchemicalWizardry/registry/ModItems.java | 8 +++ .../tile/TileMasterRitualStone.java | 39 ++++++++++- 7 files changed, 183 insertions(+), 5 deletions(-) create mode 100644 src/main/java/WayofTime/alchemicalWizardry/item/ItemActivationCrystal.java diff --git a/src/main/java/WayofTime/alchemicalWizardry/api/event/SoulNetworkEvent.java b/src/main/java/WayofTime/alchemicalWizardry/api/event/SoulNetworkEvent.java index fb6af3c5..f65b4f15 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/api/event/SoulNetworkEvent.java +++ b/src/main/java/WayofTime/alchemicalWizardry/api/event/SoulNetworkEvent.java @@ -30,9 +30,11 @@ public class SoulNetworkEvent extends Event { public static class PlayerDrainNetworkEvent extends SoulNetworkEvent { public final EntityPlayer player; + public boolean shouldDamage; //If true, will damage regardless of if the network had enough inside it public PlayerDrainNetworkEvent(EntityPlayer player, String ownerNetwork, int drainAmount) { super(ownerNetwork, drainAmount); + this.shouldDamage = false; this.player = player; } } @@ -41,7 +43,6 @@ public class SoulNetworkEvent extends Event { public static class ItemDrainNetworkEvent extends PlayerDrainNetworkEvent { public final ItemStack itemStack; - public boolean shouldDamage; //If true, will damage regardless of if the network had enough inside it public float damageAmount; //Amount of damage that would incur if the network could not drain properly /** @@ -55,7 +56,6 @@ public class SoulNetworkEvent extends Event { public ItemDrainNetworkEvent(EntityPlayer player, String ownerNetwork, ItemStack itemStack, int drainAmount) { super(player, ownerNetwork, drainAmount); this.itemStack = itemStack; - this.shouldDamage = false; this.damageAmount = (float)(drainAmount) / 100.0f; } } diff --git a/src/main/java/WayofTime/alchemicalWizardry/api/network/SoulNetwork.java b/src/main/java/WayofTime/alchemicalWizardry/api/network/SoulNetwork.java index 2641e18c..6bc82e95 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/api/network/SoulNetwork.java +++ b/src/main/java/WayofTime/alchemicalWizardry/api/network/SoulNetwork.java @@ -1,10 +1,17 @@ package WayofTime.alchemicalWizardry.api.network; +import WayofTime.alchemicalWizardry.api.AlchemicalWizardryAPI; import WayofTime.alchemicalWizardry.api.NBTHolder; +import WayofTime.alchemicalWizardry.api.event.SoulNetworkEvent; +import WayofTime.alchemicalWizardry.api.util.helper.PlayerHelper; import lombok.Getter; import lombok.Setter; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; import net.minecraft.world.WorldSavedData; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.eventhandler.Event; @Getter @Setter @@ -12,12 +19,14 @@ public class SoulNetwork extends WorldSavedData { private int currentEssence; private int maxOrb; + private final EntityPlayer player; public SoulNetwork(String name) { super(name); currentEssence = 0; maxOrb = 0; + player = PlayerHelper.getPlayerFromUsername(name); } @Override @@ -31,4 +40,50 @@ public class SoulNetwork extends WorldSavedData { nbttagcompound.setInteger(NBTHolder.NBT_CURRENTESSENCE, currentEssence); nbttagcompound.setInteger(NBTHolder.NBT_MAXORB, maxOrb); } + + public int syphon(int syphon) { + if (getCurrentEssence() >= syphon) { + setCurrentEssence(getCurrentEssence() - syphon); + markDirty(); + return syphon; + } + + return 0; + } + + public boolean syphonAndDamage(int syphon) { + SoulNetworkEvent.PlayerDrainNetworkEvent event = new SoulNetworkEvent.PlayerDrainNetworkEvent(getPlayer(), mapName, syphon); + + if (MinecraftForge.EVENT_BUS.post(event)) + return false; + + int drain = syphon(event.syphon); + + if (drain == 0 || event.shouldDamage) + hurtPlayer(event.syphon); + + return event.getResult() != Event.Result.DENY; + } + + public void hurtPlayer(int syphon) { + if (syphon < 100 && syphon > 0) { + if (!player.capabilities.isCreativeMode) { + player.setHealth((player.getHealth() - 1)); + + if (player.getHealth() <= 0.0005f) + player.onDeath(AlchemicalWizardryAPI.getDamageSource()); + } + } else if (syphon >= 100) { + if (!player.capabilities.isCreativeMode) { + for (int i = 0; i < ((syphon + 99) / 100); i++) { + player.setHealth((player.getHealth() - 1)); + + if (player.getHealth() <= 0.0005f) { + player.onDeath(AlchemicalWizardryAPI.getDamageSource()); + break; + } + } + } + } + } } diff --git a/src/main/java/WayofTime/alchemicalWizardry/api/ritual/IMasterRitualStone.java b/src/main/java/WayofTime/alchemicalWizardry/api/ritual/IMasterRitualStone.java index 4c5ebb13..429012e1 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/api/ritual/IMasterRitualStone.java +++ b/src/main/java/WayofTime/alchemicalWizardry/api/ritual/IMasterRitualStone.java @@ -8,7 +8,7 @@ import net.minecraft.world.World; public interface IMasterRitualStone extends IImperfectRitualStone { - void performRitual(World world, BlockPos pos, String ritualID); + void performRitual(World world, BlockPos pos, Ritual ritual); void setCooldown(int cooldown); diff --git a/src/main/java/WayofTime/alchemicalWizardry/api/util/helper/NetworkHelper.java b/src/main/java/WayofTime/alchemicalWizardry/api/util/helper/NetworkHelper.java index 4d8f38a8..9b9c2683 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/api/util/helper/NetworkHelper.java +++ b/src/main/java/WayofTime/alchemicalWizardry/api/util/helper/NetworkHelper.java @@ -15,6 +15,19 @@ import net.minecraftforge.fml.common.eventhandler.Event; public class NetworkHelper { + // Get + + public static SoulNetwork getSoulNetwork(String ownerName, World world) { + SoulNetwork network = (SoulNetwork) world.getMapStorage().loadData(SoulNetwork.class, ownerName); + + if (network == null) { + network = new SoulNetwork(ownerName); + world.getMapStorage().setData(ownerName, network); + } + + return network; + } + // Syphon /** diff --git a/src/main/java/WayofTime/alchemicalWizardry/item/ItemActivationCrystal.java b/src/main/java/WayofTime/alchemicalWizardry/item/ItemActivationCrystal.java new file mode 100644 index 00000000..c4c9b458 --- /dev/null +++ b/src/main/java/WayofTime/alchemicalWizardry/item/ItemActivationCrystal.java @@ -0,0 +1,67 @@ +package WayofTime.alchemicalWizardry.item; + +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.util.helper.TextHelper; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import java.util.List; + +public class ItemActivationCrystal extends ItemBindable { + + public static String[] names = { "weak", "awakened", "creative" }; + + public ItemActivationCrystal() { + super(); + + setUnlocalizedName(AlchemicalWizardry.MODID + ".activationCrystal."); + setHasSubtypes(true); + setEnergyUsed(100); + } + + @Override + public String getUnlocalizedName(ItemStack stack) { + return super.getUnlocalizedName(stack) + names[stack.getItemDamage()]; + } + + @Override + @SideOnly(Side.CLIENT) + @SuppressWarnings("unchecked") + public void getSubItems(Item id, CreativeTabs creativeTab, List list) { + for (int i = 0; i < names.length; i++) + list.add(new ItemStack(id, 1, i)); + } + + @Override + @SideOnly(Side.CLIENT) + @SuppressWarnings("unchecked") + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) { + tooltip.add(TextHelper.localize("tooltip.AlchemicalWizardry.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) { + return stack.getItemDamage() > 1 ? Integer.MAX_VALUE : stack.getItemDamage() + 1; + } +} diff --git a/src/main/java/WayofTime/alchemicalWizardry/registry/ModItems.java b/src/main/java/WayofTime/alchemicalWizardry/registry/ModItems.java index 9514eb5a..2b5f6db7 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/registry/ModItems.java +++ b/src/main/java/WayofTime/alchemicalWizardry/registry/ModItems.java @@ -5,6 +5,7 @@ import WayofTime.alchemicalWizardry.ConfigHandler; import WayofTime.alchemicalWizardry.api.AlchemicalWizardryAPI; import WayofTime.alchemicalWizardry.api.orb.BloodOrb; import WayofTime.alchemicalWizardry.api.registry.OrbRegistry; +import WayofTime.alchemicalWizardry.item.ItemActivationCrystal; import WayofTime.alchemicalWizardry.item.ItemBloodOrb; import WayofTime.alchemicalWizardry.item.ItemBucketEssence; import WayofTime.alchemicalWizardry.item.sigil.ItemSigilDivination; @@ -24,6 +25,8 @@ public class ModItems { public static Item bucketEssence; + public static Item activationCrystal; + public static Item sigilDivination; public static void init() { @@ -44,6 +47,8 @@ public class ModItems { bucketEssence = registerItem(new ItemBucketEssence()); + activationCrystal = registerItem(new ItemActivationCrystal()); + sigilDivination = registerItem(new ItemSigilDivination()); } @@ -60,6 +65,9 @@ public class ModItems { renderHelper.itemRender(bucketEssence); + renderHelper.itemRender(activationCrystal, 0); + renderHelper.itemRender(activationCrystal, 1); + renderHelper.itemRender(sigilDivination); } diff --git a/src/main/java/WayofTime/alchemicalWizardry/tile/TileMasterRitualStone.java b/src/main/java/WayofTime/alchemicalWizardry/tile/TileMasterRitualStone.java index 32e49efa..a77c3b45 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/tile/TileMasterRitualStone.java +++ b/src/main/java/WayofTime/alchemicalWizardry/tile/TileMasterRitualStone.java @@ -1,21 +1,33 @@ package WayofTime.alchemicalWizardry.tile; import WayofTime.alchemicalWizardry.api.NBTHolder; +import WayofTime.alchemicalWizardry.api.event.RitualEvent; +import WayofTime.alchemicalWizardry.api.network.SoulNetwork; import WayofTime.alchemicalWizardry.api.registry.RitualRegistry; import WayofTime.alchemicalWizardry.api.ritual.IMasterRitualStone; import WayofTime.alchemicalWizardry.api.ritual.LocalRitualStorage; import WayofTime.alchemicalWizardry.api.ritual.Ritual; +import WayofTime.alchemicalWizardry.api.util.helper.NetworkHelper; +import WayofTime.alchemicalWizardry.item.ItemActivationCrystal; +import WayofTime.alchemicalWizardry.util.ChatUtil; +import com.google.common.base.Strings; import lombok.Getter; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.server.gui.IUpdatePlayerListBox; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.BlockPos; import net.minecraft.util.EnumFacing; import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.eventhandler.Event; @Getter public class TileMasterRitualStone extends TileEntity implements IMasterRitualStone, IUpdatePlayerListBox { + public static final int REFRESH_TIME = 0; + private String owner; private boolean active; private int activeTime; @@ -47,9 +59,32 @@ public class TileMasterRitualStone extends TileEntity implements IMasterRitualSt } - @Override - public void performRitual(World world, BlockPos pos, String ritualID) { + public void activateRitual(ItemStack activationCrystal, EntityPlayer activator) { + activationCrystal = NBTHolder.checkNBT(activationCrystal); + String crystalOwner = activationCrystal.getTagCompound().getString(NBTHolder.NBT_OWNER); + Ritual ritual = null; + if (!Strings.isNullOrEmpty(crystalOwner)) { + if (activationCrystal.getItem() instanceof ItemActivationCrystal) { + int crystalLevel = ((ItemActivationCrystal) activationCrystal.getItem()).getCrystalLevel(activationCrystal); + + 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.AlchemicalWizardry.ritual.prevent"); + return; + } + } + } + } + + @Override + public void performRitual(World world, BlockPos pos, Ritual ritual) { + if (ritual != null && RitualRegistry.ritualEnabled(ritual)) { + SoulNetwork network = NetworkHelper.getSoulNetwork(getOwner(), getWorld()); + network.syphonAndDamage(ritual.getRefreshCost()); + ritual.performEffect(this); + } } @Override