From 8bad2ce2dedd5f6f963243ab5d3e703faa0cc239 Mon Sep 17 00:00:00 2001 From: Sollace Date: Thu, 20 Sep 2018 22:49:10 +0200 Subject: [PATCH] Added gems --- .../com/minelittlepony/unicopia/UItems.java | 21 +- .../com/minelittlepony/unicopia/Unicopia.java | 51 +++-- .../unicopia/item/ICastable.java | 19 ++ .../unicopia/item/ItemCurse.java | 52 +++++ .../unicopia/item/ItemSpell.java | 179 ++++++++++++++++++ .../unicopia/player/PlayerCapabilities.java | 10 +- .../unicopia/spell/IDispenceable.java | 2 +- .../unicopia/spell/IUseAction.java | 4 +- ...ActionResult.java => SpellCastResult.java} | 2 +- .../unicopia/spell/SpellRegistry.java | 120 ++++++++++-- .../unicopia/forgebullshit/FBS.java | 8 +- .../resources/assets/unicopia/lang/en_US.lang | 25 ++- .../unicopia/models/item/corrupted_gem.json | 19 ++ .../assets/unicopia/models/item/gem.json | 19 ++ .../unicopia/textures/items/corrupted_gem.png | Bin 0 -> 543 bytes .../textures/items/corrupted_gem_overlay.png | Bin 0 -> 543 bytes .../assets/unicopia/textures/items/gem.png | Bin 0 -> 603 bytes .../unicopia/textures/items/gem_overlay.png | Bin 0 -> 603 bytes 18 files changed, 475 insertions(+), 56 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/item/ICastable.java create mode 100644 src/main/java/com/minelittlepony/unicopia/item/ItemCurse.java create mode 100644 src/main/java/com/minelittlepony/unicopia/item/ItemSpell.java rename src/main/java/com/minelittlepony/unicopia/spell/{ActionResult.java => SpellCastResult.java} (92%) create mode 100644 src/main/resources/assets/unicopia/models/item/corrupted_gem.json create mode 100644 src/main/resources/assets/unicopia/models/item/gem.json create mode 100644 src/main/resources/assets/unicopia/textures/items/corrupted_gem.png create mode 100644 src/main/resources/assets/unicopia/textures/items/corrupted_gem_overlay.png create mode 100644 src/main/resources/assets/unicopia/textures/items/gem.png create mode 100644 src/main/resources/assets/unicopia/textures/items/gem_overlay.png diff --git a/src/main/java/com/minelittlepony/unicopia/UItems.java b/src/main/java/com/minelittlepony/unicopia/UItems.java index 188cfd9b..f287556b 100644 --- a/src/main/java/com/minelittlepony/unicopia/UItems.java +++ b/src/main/java/com/minelittlepony/unicopia/UItems.java @@ -2,13 +2,18 @@ package com.minelittlepony.unicopia; import com.minelittlepony.unicopia.item.ItemApple; import com.minelittlepony.unicopia.item.ItemCloud; +import com.minelittlepony.unicopia.item.ItemCurse; import com.minelittlepony.unicopia.item.ItemOfHolding; +import com.minelittlepony.unicopia.item.ItemSpell; import com.minelittlepony.unicopia.item.UItemBlock; import com.minelittlepony.unicopia.item.UItemMultiTexture; import com.minelittlepony.unicopia.item.UItemSlab; +import com.minelittlepony.unicopia.spell.SpellRegistry; import come.minelittlepony.unicopia.forgebullshit.RegistryLockSpinner; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.client.renderer.color.ItemColors; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.init.Enchantments; import net.minecraft.init.Items; @@ -65,6 +70,8 @@ public class UItems { .setTranslationKey("cloud_slab") .setRegistryName(Unicopia.MODID, "cloud_slab"); + public static final ItemSpell spell = new ItemSpell(Unicopia.MODID, "gem"); + public static final ItemSpell curse = new ItemCurse(Unicopia.MODID, "corrupted_gem"); public static final ItemOfHolding bag_of_holding = new ItemOfHolding(Unicopia.MODID, "bag_of_holding"); @@ -77,7 +84,7 @@ public class UItems { registry.registerAll(cloud_spawner, dew_drop, cloud_matter, cloud_block, cloud_stairs, cloud_slab, mist_door, anvil, - bag_of_holding); + bag_of_holding, spell, curse); if (UClient.isClientSide()) { registerAllVariants(apple, apple.getVariants()); @@ -90,6 +97,8 @@ public class UItems { registerAllVariants(mist_door, "mist_door"); registerAllVariants(anvil, "anvil"); registerAllVariants(bag_of_holding, "bag_of_holding"); + registerAllVariants(spell, "gem"); + registerAllVariants(curse, "corrupted_gem"); } registerFuels(); @@ -123,4 +132,14 @@ public class UItems { cloud, cloud, cloud ), new ItemStack(cloud_block, 1, 2)).setRegistryName(Unicopia.MODID, "id_dont_care_just_use_it")); } + + static void registerColors(ItemColors registry) { + registry.registerItemColorHandler((stack, tint) -> { + if (Predicates.MAGI.test(Minecraft.getMinecraft().player)) { + return SpellRegistry.instance().getSpellTintFromStack(stack); + } + + return 0xffffff; + }, spell, curse); + } } diff --git a/src/main/java/com/minelittlepony/unicopia/Unicopia.java b/src/main/java/com/minelittlepony/unicopia/Unicopia.java index bdb8468c..fb60d2b0 100644 --- a/src/main/java/com/minelittlepony/unicopia/Unicopia.java +++ b/src/main/java/com/minelittlepony/unicopia/Unicopia.java @@ -2,18 +2,19 @@ package com.minelittlepony.unicopia; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; -import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; import net.minecraft.item.EnumAction; import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; +import net.minecraftforge.client.event.ColorHandlerEvent; import net.minecraftforge.client.event.FOVUpdateEvent; -import net.minecraftforge.event.AttachCapabilitiesEvent; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.event.entity.item.ItemTossEvent; import net.minecraftforge.event.entity.player.PlayerDropsEvent; -import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerFlyableFallEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import net.minecraftforge.event.world.BlockEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.common.Mod.EventHandler; @@ -65,15 +66,12 @@ public class Unicopia { @EventHandler public void init(FMLInitializationEvent event) { - channel = JumpingCastle.listen(MODID, () -> { + channel = JumpingCastle.subscribeTo(MODID, () -> { channel.send(new MsgRequestCapabilities(Minecraft.getMinecraft().player), Target.SERVER); }) - // client ------> server - .consume(MsgRequestCapabilities.class) - // client <------ server - .consume(MsgPlayerCapabilities.class) - // client ------> server - .consume(MsgPlayerAbility.class); + .listenFor(MsgRequestCapabilities.class) + .listenFor(MsgPlayerCapabilities.class) + .listenFor(MsgPlayerAbility.class); MAGIC_PARTICLE = Particles.instance().registerParticle(new EntityMagicFX.Factory()); RAIN_PARTICLE = Particles.instance().registerParticle(new EntityRaindropFX.Factory()); @@ -90,6 +88,11 @@ public class Unicopia { UItems.registerItems(event.getRegistry()); } + @SubscribeEvent + public static void registerItemColoursStatic(ColorHandlerEvent.Item event) { + UItems.registerColors(event.getItemColors()); + } + @SubscribeEvent public static void registerBlocksStatic(RegistryEvent.Register event) { UBlocks.registerBlocks(event.getRegistry()); @@ -113,6 +116,24 @@ public class Unicopia { } } + @SubscribeEvent + public static void onBlockHarvested(BlockEvent.HarvestDropsEvent event) { + if (event.getState().getBlock() == Blocks.STONE) { + int fortuneFactor = 1 + event.getFortuneLevel() * 15; + System.out.println(event.getFortuneLevel()); + + if (event.getWorld().rand.nextInt(500 / fortuneFactor) == 0) { + for (int i = 0; i < 1 + event.getFortuneLevel(); i++) { + if (event.getWorld().rand.nextInt(10) > 3) { + event.getDrops().add(new ItemStack(UItems.curse, 1)); + } else { + event.getDrops().add(new ItemStack(UItems.spell, 1)); + } + } + } + } + } + @SubscribeEvent public static void onPlayerTick(TickEvent.PlayerTickEvent event) { if (event.phase == Phase.END) { @@ -169,14 +190,4 @@ public class Unicopia { event.setNewfov(fov); } - - @SubscribeEvent - public static void attachCapabilities(AttachCapabilitiesEvent event) { - FBS.attach(event); - } - - @SubscribeEvent - public static void clonePlayer(PlayerEvent.Clone event) { - FBS.clone(event); - } } diff --git a/src/main/java/com/minelittlepony/unicopia/item/ICastable.java b/src/main/java/com/minelittlepony/unicopia/item/ICastable.java new file mode 100644 index 00000000..d3ef7f52 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/item/ICastable.java @@ -0,0 +1,19 @@ +package com.minelittlepony.unicopia.item; + +import com.minelittlepony.unicopia.spell.IDispenceable; +import com.minelittlepony.unicopia.spell.IMagicEffect; +import com.minelittlepony.unicopia.spell.SpellCastResult; + +import net.minecraft.dispenser.IBlockSource; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +public interface ICastable extends IMagicalItem { + + SpellCastResult onDispenseSpell(IBlockSource source, ItemStack stack, IDispenceable effect); + + SpellCastResult onCastSpell(EntityPlayer player, World world, BlockPos pos, ItemStack stack, IMagicEffect effect, EnumFacing side, float hitX, float hitY, float hitZ); +} diff --git a/src/main/java/com/minelittlepony/unicopia/item/ItemCurse.java b/src/main/java/com/minelittlepony/unicopia/item/ItemCurse.java new file mode 100644 index 00000000..7e4befba --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/item/ItemCurse.java @@ -0,0 +1,52 @@ +package com.minelittlepony.unicopia.item; + +import com.minelittlepony.unicopia.spell.IDispenceable; +import com.minelittlepony.unicopia.spell.IMagicEffect; +import com.minelittlepony.unicopia.spell.SpellCastResult; +import com.minelittlepony.util.MagicalDamageSource; + +import net.minecraft.dispenser.IBlockSource; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +public class ItemCurse extends ItemSpell { + + public ItemCurse(String domain, String name) { + super(domain, name); + } + + @Override + public SpellCastResult onDispenseSpell(IBlockSource source, ItemStack stack, IDispenceable effect) { + + BlockPos pos = source.getBlockPos(); + World world = source.getWorld(); + + SpellCastResult result = super.onDispenseSpell(source, stack, effect); + + if (result != SpellCastResult.NONE) { + if (world.rand.nextInt(200) == 0) { + float strength = world.rand.nextFloat() * 100; + + world.createExplosion(null, pos.getX(), pos.getY(), pos.getZ(), strength, true); + + return SpellCastResult.NONE; + } + } + + return result; + } + + @Override + public SpellCastResult onCastSpell(EntityPlayer player, World world, BlockPos pos, ItemStack stack, IMagicEffect effect, EnumFacing side, float hitX, float hitY, float hitZ) { + SpellCastResult result = super.onCastSpell(player, world, pos, stack, effect, side, hitX, hitY, hitZ); + + if (result != SpellCastResult.NONE) { + player.attackEntityFrom(MagicalDamageSource.causePlayerDamage("corruption", player), 1); + } + + return result; + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/item/ItemSpell.java b/src/main/java/com/minelittlepony/unicopia/item/ItemSpell.java new file mode 100644 index 00000000..26cde6d6 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/item/ItemSpell.java @@ -0,0 +1,179 @@ +package com.minelittlepony.unicopia.item; + +import com.minelittlepony.unicopia.Predicates; +import com.minelittlepony.unicopia.spell.IMagicEffect; +import com.minelittlepony.unicopia.spell.IUseAction; +import com.minelittlepony.unicopia.spell.SpellCastResult; +import com.minelittlepony.unicopia.spell.IDispenceable; +import com.minelittlepony.unicopia.spell.SpellRegistry; +import com.minelittlepony.util.vector.VecHelper; + +import net.minecraft.block.BlockDispenser; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.dispenser.BehaviorDefaultDispenseItem; +import net.minecraft.dispenser.IBehaviorDispenseItem; +import net.minecraft.dispenser.IBlockSource; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ActionResult; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.NonNullList; +import net.minecraft.world.World; + +public class ItemSpell extends Item implements ICastable { + private static final IBehaviorDispenseItem dispenserBehavior = new BehaviorDefaultDispenseItem() { + @Override + protected ItemStack dispenseStack(IBlockSource source, ItemStack stack) { + + IDispenceable effect = SpellRegistry.instance().getDispenseActionFrom(stack); + + if (effect == null) { + return super.dispenseStack(source, stack); + } + + SpellCastResult dispenceResult = ((ICastable)stack.getItem()).onDispenseSpell(source, stack, effect); + + if (dispenceResult == SpellCastResult.DEFAULT) { + return super.dispenseStack(source, stack); + } + + if (dispenceResult == SpellCastResult.PLACE) { + + // castContainedSpell(source.getWorld(), pos.getX(), pos.getY(), pos.getZ(), stack, effect); + + stack.shrink(1); + } + + return stack; + } + }; + + public ItemSpell(String domain, String name) { + super(); + + setHasSubtypes(true); + setMaxDamage(0); + setTranslationKey(name); + setRegistryName(domain, name); + setMaxStackSize(16); + + setCreativeTab(CreativeTabs.BREWING); + + BlockDispenser.DISPENSE_BEHAVIOR_REGISTRY.putObject(this, dispenserBehavior); + } + + @Override + public boolean hasEffect(ItemStack stack) { + return SpellRegistry.stackHasEnchantment(stack); + } + + @Override + public SpellCastResult onDispenseSpell(IBlockSource source, ItemStack stack, IDispenceable effect) { + EnumFacing facing = source.getBlockState().getValue(BlockDispenser.FACING); + BlockPos pos = source.getBlockPos().offset(facing); + + return effect.onDispenced(pos, facing, source); + } + + @Override + public SpellCastResult onCastSpell(EntityPlayer player, World world, BlockPos pos, ItemStack stack, IMagicEffect effect, EnumFacing side, float hitX, float hitY, float hitZ) { + if (effect instanceof IUseAction) { + return ((IUseAction)effect).onUse(stack, player, world, pos, side, hitX, hitY, hitZ); + } + + return SpellCastResult.PLACE; + } + + @Override + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { + + if (hand != EnumHand.MAIN_HAND || !Predicates.MAGI.test(player)) { + return EnumActionResult.PASS; + } + + ItemStack stack = player.getHeldItem(hand); + + if (!SpellRegistry.stackHasEnchantment(stack)) { + return EnumActionResult.FAIL; + } + + IMagicEffect effect = SpellRegistry.instance().getSpellFromItemStack(stack); + + if (effect == null) { + return EnumActionResult.FAIL; + } + + SpellCastResult result = ((ICastable)stack.getItem()).onCastSpell(player, world, pos, stack, effect, side, hitX, hitY, hitZ); + + if (!world.isRemote) { + pos = pos.offset(side); + + if (result == SpellCastResult.PLACE) { + // castContainedSpell(world, pos.getX(), pos.getY(), pos.getZ(), stack, effect).setOwner(player); + } + } + + if (result != SpellCastResult.NONE) { + if (!player.capabilities.isCreativeMode) { + stack.shrink(1); + } + + return EnumActionResult.SUCCESS; + } + + return EnumActionResult.FAIL; + } + + @Override + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + + Entity target = VecHelper.getLookedAtEntity(player, 5); + + ItemStack stack = player.getHeldItem(hand); + + if (target == null) { + return new ActionResult(EnumActionResult.PASS, stack); + } + + if (!SpellRegistry.stackHasEnchantment(stack)) { + return new ActionResult(EnumActionResult.FAIL, stack); + } + + return new ActionResult(EnumActionResult.PASS, stack); + } + + @Override + public void getSubItems(CreativeTabs tab, NonNullList subItems) { + super.getSubItems(tab, subItems); + + if (isInCreativeTab(tab)) { + for (String name : SpellRegistry.instance().getAllNames()) { + subItems.add(SpellRegistry.instance().enchantStack(new ItemStack(this, 1), name)); + } + } + } + + @Override + public String getTranslationKey(ItemStack stack) { + String result = super.getTranslationKey(stack); + + if (SpellRegistry.stackHasEnchantment(stack)) { + result += "." + stack.getTagCompound().getString("spell"); + } + + return result; + } + +/* protected static EntitySpell castContainedSpell(World world, int x, int y, int z, ItemStack stack, IMagicEffect effect) { + EntitySpell spell = new EntitySpell(world); + spell.setEffect(effect); + spell.setLocationAndAngles(x + 0.5, y + 0.5, z + 0.5, 0, 0); + world.spawnEntity(spell); + return spell; + } */ +} diff --git a/src/main/java/com/minelittlepony/unicopia/player/PlayerCapabilities.java b/src/main/java/com/minelittlepony/unicopia/player/PlayerCapabilities.java index 62bec947..de3211f5 100644 --- a/src/main/java/com/minelittlepony/unicopia/player/PlayerCapabilities.java +++ b/src/main/java/com/minelittlepony/unicopia/player/PlayerCapabilities.java @@ -210,15 +210,7 @@ class PlayerCapabilities implements IPlayer, ICaster { setPlayerSpecies(Race.fromName(compound.getString("playerSpecies"), Race.HUMAN)); powers.readFromNBT(compound.getCompoundTag("powers")); gravity.readFromNBT(compound.getCompoundTag("gravity")); - - effect = null; - - if (compound.hasKey("effect_id") && compound.hasKey("effect")) { - SpellRegistry.instance().getSpellFromName(compound.getString("effect_id")).ifPresent(f -> { - effect = f; - effect.readFromNBT(compound.getCompoundTag("effect")); - }); - } + effect = SpellRegistry.instance().createEffectFroNBT(compound); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/spell/IDispenceable.java b/src/main/java/com/minelittlepony/unicopia/spell/IDispenceable.java index 8e335686..9e235f77 100644 --- a/src/main/java/com/minelittlepony/unicopia/spell/IDispenceable.java +++ b/src/main/java/com/minelittlepony/unicopia/spell/IDispenceable.java @@ -18,5 +18,5 @@ public interface IDispenceable { * @param source The dispenser currently dispensing * @return an ActionResult for the type of action to perform. */ - public ActionResult onDispenced(BlockPos pos, EnumFacing facing, IBlockSource source); + public SpellCastResult onDispenced(BlockPos pos, EnumFacing facing, IBlockSource source); } diff --git a/src/main/java/com/minelittlepony/unicopia/spell/IUseAction.java b/src/main/java/com/minelittlepony/unicopia/spell/IUseAction.java index 8611eed4..e9f82cb3 100644 --- a/src/main/java/com/minelittlepony/unicopia/spell/IUseAction.java +++ b/src/main/java/com/minelittlepony/unicopia/spell/IUseAction.java @@ -27,7 +27,7 @@ public interface IUseAction { * * @return ActionResult for the type of action to perform */ - public ActionResult onUse(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ); + public SpellCastResult onUse(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ); /** * Triggered when the player right clicks @@ -39,5 +39,5 @@ public interface IUseAction { * * @return ActionResult for the type of action to perform */ - public ActionResult onUse(ItemStack stack, EntityPlayer player, World world, Entity hitEntity); + public SpellCastResult onUse(ItemStack stack, EntityPlayer player, World world, Entity hitEntity); } diff --git a/src/main/java/com/minelittlepony/unicopia/spell/ActionResult.java b/src/main/java/com/minelittlepony/unicopia/spell/SpellCastResult.java similarity index 92% rename from src/main/java/com/minelittlepony/unicopia/spell/ActionResult.java rename to src/main/java/com/minelittlepony/unicopia/spell/SpellCastResult.java index bc932269..c08974ce 100644 --- a/src/main/java/com/minelittlepony/unicopia/spell/ActionResult.java +++ b/src/main/java/com/minelittlepony/unicopia/spell/SpellCastResult.java @@ -3,7 +3,7 @@ package com.minelittlepony.unicopia.spell; /** * A type of action to perform after a spell has completed its handling. */ -public enum ActionResult { +public enum SpellCastResult { /** * No action. */ diff --git a/src/main/java/com/minelittlepony/unicopia/spell/SpellRegistry.java b/src/main/java/com/minelittlepony/unicopia/spell/SpellRegistry.java index b03b8e55..4c84f6f8 100644 --- a/src/main/java/com/minelittlepony/unicopia/spell/SpellRegistry.java +++ b/src/main/java/com/minelittlepony/unicopia/spell/SpellRegistry.java @@ -2,9 +2,12 @@ package com.minelittlepony.unicopia.spell; import java.util.HashMap; import java.util.Map; -import java.util.Optional; +import java.util.Set; import java.util.concurrent.Callable; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + public class SpellRegistry { private static final SpellRegistry instance = new SpellRegistry(); @@ -13,25 +16,116 @@ public class SpellRegistry { return instance; } - private final Map> factories = new HashMap<>(); - - private SpellRegistry() { - registerSpell("shield", SpellShield::new); + public static boolean stackHasEnchantment(ItemStack stack) { + return stack.hasTagCompound() && stack.getTagCompound().hasKey("spell"); } - public Optional getSpellFromName(String name) { - try { - if (factories.containsKey(name)) { - return Optional.ofNullable(factories.get(name).call()); + private final Map entries = new HashMap<>(); + + private SpellRegistry() { + registerSpell("shield", 0xffff00, SpellShield::new); + } + + public IMagicEffect getSpellFromName(String name) { + if (entries.containsKey(name)) { + return entries.get(name).create(); + } + + return null; + } + + public IMagicEffect createEffectFroNBT(NBTTagCompound compound) { + if (compound.hasKey("effect_id") && compound.hasKey("effect")) { + IMagicEffect effect = getSpellFromName(compound.getString("effect_id")); + + if (effect != null) { + effect.readFromNBT(compound.getCompoundTag("effect")); } + + return effect; + } + + return null; + } + + public IDispenceable getDispenseActionFrom(ItemStack stack) { + String key = getKeyFromStack(stack); + + if (entries.containsKey(key)) { + Entry entry = entries.get(key); + if (entry.canDispense) { + return entry.create(); + } + } + + return null; + } + + public IMagicEffect getSpellFromItemStack(ItemStack stack) { + return getSpellFromName(getKeyFromStack(stack)); + } + + public void registerSpell(String key, int tint, Callable factory) { + try { + entries.put(key, new Entry(factory, tint)); } catch (Exception e) { e.printStackTrace(); } - - return Optional.empty(); } - public void registerSpell(String key, Callable factory) { - factories.put(key, factory); + public ItemStack enchantStack(ItemStack stack, String name) { + stack.setTagCompound(new NBTTagCompound()); + stack.getTagCompound().setString("spell", name); + + return stack; + } + + private String getKeyFromStack(ItemStack stack) { + if (stack.isEmpty() || !stack.hasTagCompound() || !stack.getTagCompound().hasKey("spell")) { + return ""; + } + + return stack.getTagCompound().getString("spell"); + } + + public int getSpellTintFromStack(ItemStack stack) { + return getSpellTint(getKeyFromStack(stack)); + } + + public int getSpellTint(String key) { + if (entries.containsKey(key)) { + return entries.get(key).color; + } + + return 0xffffff; + } + + public Set getAllNames() { + return entries.keySet(); + } + + class Entry { + Callable factory; + + int color; + + boolean canDispense; + + Entry(Callable factory, int color) throws Exception { + this.factory = factory; + this.color = color; + this.canDispense = factory.call() instanceof IDispenceable; + } + + @SuppressWarnings("unchecked") + T create() { + try { + return (T) factory.call(); + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } } } diff --git a/src/main/java/come/minelittlepony/unicopia/forgebullshit/FBS.java b/src/main/java/come/minelittlepony/unicopia/forgebullshit/FBS.java index 27f90468..d088b864 100644 --- a/src/main/java/come/minelittlepony/unicopia/forgebullshit/FBS.java +++ b/src/main/java/come/minelittlepony/unicopia/forgebullshit/FBS.java @@ -1,5 +1,7 @@ package come.minelittlepony.unicopia.forgebullshit; +import com.minelittlepony.unicopia.Unicopia; + import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; @@ -8,15 +10,18 @@ import net.minecraft.util.ResourceLocation; import net.minecraftforge.common.capabilities.CapabilityManager; import net.minecraftforge.event.AttachCapabilitiesEvent; import net.minecraftforge.event.entity.player.PlayerEvent; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +@EventBusSubscriber(modid = Unicopia.MODID) public class FBS { - @SuppressWarnings({ "unchecked", "rawtypes" }) public static void init() { CapabilityManager.INSTANCE.register(ICapabilitiesProxyContainer.class, new Storage(), DefaultEntityCapabilitiesProxyContainer::new); } + @SubscribeEvent public static void attach(AttachCapabilitiesEvent event) { if (event.getObject() instanceof EntityPlayer || event.getObject() instanceof EntityItem) { @@ -24,6 +29,7 @@ public class FBS { } } + @SubscribeEvent public static void clone(PlayerEvent.Clone event) { final ICapabilitiesProxyContainer original = of(event.getOriginal()); diff --git a/src/main/resources/assets/unicopia/lang/en_US.lang b/src/main/resources/assets/unicopia/lang/en_US.lang index 689b0236..3a22d325 100644 --- a/src/main/resources/assets/unicopia/lang/en_US.lang +++ b/src/main/resources/assets/unicopia/lang/en_US.lang @@ -17,14 +17,23 @@ item.mist_door.name=Cloud Door item.dew_drop.name=Dew Drop item.cloud_anvil.name=Anvilhead Anvil -item.spell.name=Gem -item.spell.shield.name=Gem of Repulsion -item.spell.fire.name=Gem of Flame -item.spell.inferno.name=Gem of Inferno -item.spell.ice.name=Gem of Freezing -item.spell.portal.name=Gem of Teleportation -item.spell.attract.name=Gem of Retention -item.spell.minion.name=Gem of Obedience +item.gem.name=Gem +item.corrupted_gem.name=Fractured Gem +item.gem.shield.name=Gem of Repulsion +item.corrupted_gem.shield.name=Corrupt Gem of Repulsion +item.gem.fire.name=Gem of Flame +item.corrupted_gem.fire.name=Corrupt Gem of Burning +item.gem.inferno.name=Gem of Inferno +item.corrupted_gem.inferno.name=Corrupt Gem of Inferno +item.gem.ice.name=Gem of Freezing +item.corrupted_gem.ice.name=Corrupt Gem of Freezing +item.gem.portal.name=Gem of Transportation +item.corrupted_gem.portal.name=Corrupt Gem of Transportation +item.gem.attract.name=Gem of Retention +item.corrupted_gem.attract.name=Gem of Entrapment +item.gem.minion.name=Gem of Obedience +item.corrupted_gem.minion.name=Corrupt Gem of Obedience + item.spellbook.name=Spellbook item.bag_of_holding.name=Bag of Holding diff --git a/src/main/resources/assets/unicopia/models/item/corrupted_gem.json b/src/main/resources/assets/unicopia/models/item/corrupted_gem.json new file mode 100644 index 00000000..ca291e38 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/corrupted_gem.json @@ -0,0 +1,19 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:items/corrupted_gem", + "layer1": "unicopia:items/corrupted_gem_overlay" + }, + "display": { + "thirdperson": { + "rotation": [ -90, 0, 0 ], + "translation": [ 0, 1, -3 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "firstperson": { + "rotation": [ 0, -135, 25 ], + "translation": [ 0, 4, 2 ], + "scale": [ 1.7, 1.7, 1.7 ] + } + } +} diff --git a/src/main/resources/assets/unicopia/models/item/gem.json b/src/main/resources/assets/unicopia/models/item/gem.json new file mode 100644 index 00000000..570263ea --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/gem.json @@ -0,0 +1,19 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:items/gem", + "layer1": "unicopia:items/gem_overlay" + }, + "display": { + "thirdperson": { + "rotation": [ -90, 0, 0 ], + "translation": [ 0, 1, -3 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "firstperson": { + "rotation": [ 0, -135, 25 ], + "translation": [ 0, 4, 2 ], + "scale": [ 1.7, 1.7, 1.7 ] + } + } +} diff --git a/src/main/resources/assets/unicopia/textures/items/corrupted_gem.png b/src/main/resources/assets/unicopia/textures/items/corrupted_gem.png new file mode 100644 index 0000000000000000000000000000000000000000..93ba59837cb7bf4b80eaa9211c59b3a97cd12519 GIT binary patch literal 543 zcmV+)0^t3LP)u3)Qsf@w7#R^6rNDlkfsKKg z0Spq8iwk^%-9kX@y!^aW22{Yv!0_!Fh-6^6tP3)Wfi%FHTu@X3qz?eGPfBWWGSEmK zAUm_XqyQ++SOH{1A-vFQ_caOwTA$&`8!)FtoI^ zRB%kmPfAq?t}HG|%`H~&%uCKMD#$NNEJ;n#Q*g}5Q3wJlFIEUjElw>e0}3)g>;?mV z_oBo~1^2|<+(ZQ4006%RKq@9> z>GS{q0MtoDK~yNuh0!reLje#3(6{-5U?~#*1#$>GYx`g$cz}r52|^$qAqsZZ7GiH9 zSlW053mfqh(n$Q3Bx@BD%}2MI9cE_+HqzhInu9aY%U&)vh`B>A+cC}|c5TN%{&wIr zdGV~XOfKVNL+dtljq+$!P)5reHr=RVwkjCqIXF>~uh|gsjwh8X2TdJjD6x-JG?na| zV8?^cCWkU+(RVL=xK_rTUt2`9a!>71VWPe2Ft8Ovg~F{)TsCzWo2u0&Kc4j+ap;2R h=G0v*-^G9L{sMSKJbb!u+2Q~I002ovPDHLkV1i&--LC)u literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/items/corrupted_gem_overlay.png b/src/main/resources/assets/unicopia/textures/items/corrupted_gem_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..93ba59837cb7bf4b80eaa9211c59b3a97cd12519 GIT binary patch literal 543 zcmV+)0^t3LP)u3)Qsf@w7#R^6rNDlkfsKKg z0Spq8iwk^%-9kX@y!^aW22{Yv!0_!Fh-6^6tP3)Wfi%FHTu@X3qz?eGPfBWWGSEmK zAUm_XqyQ++SOH{1A-vFQ_caOwTA$&`8!)FtoI^ zRB%kmPfAq?t}HG|%`H~&%uCKMD#$NNEJ;n#Q*g}5Q3wJlFIEUjElw>e0}3)g>;?mV z_oBo~1^2|<+(ZQ4006%RKq@9> z>GS{q0MtoDK~yNuh0!reLje#3(6{-5U?~#*1#$>GYx`g$cz}r52|^$qAqsZZ7GiH9 zSlW053mfqh(n$Q3Bx@BD%}2MI9cE_+HqzhInu9aY%U&)vh`B>A+cC}|c5TN%{&wIr zdGV~XOfKVNL+dtljq+$!P)5reHr=RVwkjCqIXF>~uh|gsjwh8X2TdJjD6x-JG?na| zV8?^cCWkU+(RVL=xK_rTUt2`9a!>71VWPe2Ft8Ovg~F{)TsCzWo2u0&Kc4j+ap;2R h=G0v*-^G9L{sMSKJbb!u+2Q~I002ovPDHLkV1i&--LC)u literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/items/gem.png b/src/main/resources/assets/unicopia/textures/items/gem.png new file mode 100644 index 0000000000000000000000000000000000000000..b1186e31f3f9a8bcc86f6cfdb36eb70aa23a4b0c GIT binary patch literal 603 zcmV-h0;K(kP)KLZ*U+s!PAz6~$9cIRu+`&V51dreiQV3o|u(k*iECqkn z<24T+h}Wp!9kkA&s=bYqC>v)JdA#L_0|3aCGsDqc3Q#w-<~IRf9|(Z=>!{xy@HdCb zSP#4b4~2FL#0gM7dE-H>f%bG^JcwtYy-1TDh!^10>$L~yHD+VW+1$%ZbtP}YFqBcz zOtl9Iw5y)t{lu0?8dnXg^v|Z^UV7CpxS#0x-jPt6>WhdzH@5b3g z?$T$90K~<1-|eYKyZZULbqn9W20$v}d3Hbm001CkNK#Dz0D2_=0Dyx40Qvs_0D$QL z0Cg|`0P0`>06Lfe02gnPU&TfM007HLL_t(|+JwkS(@FPkTB%g$vq~Ho9 zqTvFD8w4b-Kt)f((!YyeQjmOljOaHC=djRE^LrZFgzUcq}002ovPDHLkV1jTD2^atX literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/items/gem_overlay.png b/src/main/resources/assets/unicopia/textures/items/gem_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..b1186e31f3f9a8bcc86f6cfdb36eb70aa23a4b0c GIT binary patch literal 603 zcmV-h0;K(kP)KLZ*U+s!PAz6~$9cIRu+`&V51dreiQV3o|u(k*iECqkn z<24T+h}Wp!9kkA&s=bYqC>v)JdA#L_0|3aCGsDqc3Q#w-<~IRf9|(Z=>!{xy@HdCb zSP#4b4~2FL#0gM7dE-H>f%bG^JcwtYy-1TDh!^10>$L~yHD+VW+1$%ZbtP}YFqBcz zOtl9Iw5y)t{lu0?8dnXg^v|Z^UV7CpxS#0x-jPt6>WhdzH@5b3g z?$T$90K~<1-|eYKyZZULbqn9W20$v}d3Hbm001CkNK#Dz0D2_=0Dyx40Qvs_0D$QL z0Cg|`0P0`>06Lfe02gnPU&TfM007HLL_t(|+JwkS(@FPkTB%g$vq~Ho9 zqTvFD8w4b-Kt)f((!YyeQjmOljOaHC=djRE^LrZFgzUcq}002ovPDHLkV1jTD2^atX literal 0 HcmV?d00001