package com.thebrokenrail.sorcerycraft.item; import com.thebrokenrail.sorcerycraft.SorceryCraft; import com.thebrokenrail.sorcerycraft.entity.SpellEntity; import com.thebrokenrail.sorcerycraft.spell.Spell; import com.thebrokenrail.sorcerycraft.spell.SpellPlayerEntity; import com.thebrokenrail.sorcerycraft.spell.SpellRegistry; import com.thebrokenrail.sorcerycraft.spell.SpellTag; import net.minecraft.client.item.TooltipContext; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; import net.minecraft.text.LiteralText; import net.minecraft.text.Text; import net.minecraft.text.TranslatableText; import net.minecraft.util.ActionResult; import net.minecraft.util.DefaultedList; import net.minecraft.util.Formatting; import net.minecraft.util.Hand; import net.minecraft.util.Identifier; import net.minecraft.util.Rarity; import net.minecraft.util.TypedActionResult; import net.minecraft.world.World; import java.util.HashMap; import java.util.List; import java.util.Map; public class SpellItem extends Item { public SpellItem() { super(new Item.Settings().group(SorceryCraft.ITEM_GROUP).rarity(Rarity.UNCOMMON).maxCount(16)); } @Override public TypedActionResult use(World world, PlayerEntity playerEntity, Hand hand) { ItemStack itemStack = playerEntity.getStackInHand(hand); SorceryCraft.playSpellSound(playerEntity); if (!world.isClient()) { SpellEntity entity = new SpellEntity(world, playerEntity); entity.setItem(itemStack); entity.setProperties(playerEntity, playerEntity.pitch, playerEntity.yaw, 0.0f, 1.5f, 1.0f); world.spawnEntity(entity); } if (!playerEntity.isCreative()) { itemStack.decrement(1); } return new TypedActionResult<>(ActionResult.SUCCESS, itemStack); } @Override public boolean hasEnchantmentGlint(ItemStack stack) { Map spells = SpellTag.getSpells(stack); return spells.size() > 0; } @Override public void appendTooltip(ItemStack itemStack, World world, List tooltip, TooltipContext tooltipContext) { Map spells = SpellTag.getSpells(itemStack); for (Map.Entry entry : spells.entrySet()) { tooltip.add(SpellTag.getTranslatedSpell(entry.getKey(), entry.getValue())); } } @Override public void appendStacks(ItemGroup group, DefaultedList stacks) { if (isIn(group)) { stacks.add(new ItemStack(this)); Spell[] spells = SpellRegistry.getSpells(); for (Spell value : spells) { ItemStack item = new ItemStack(this); Map spell = new HashMap<>(); spell.put(value.getID(), value.getLevel()); SpellTag.setSpells(item, spell); stacks.add(item); } } } @Override public boolean isEnchantable(ItemStack stack) { return false; } @Override public void inventoryTick(ItemStack stack, World world, Entity entity, int slot, boolean selected) { super.inventoryTick(stack, world, entity, slot, selected); if (!world.isClient() && entity instanceof PlayerEntity) { PlayerEntity player = (PlayerEntity) entity; SpellPlayerEntity spellPlayer = (SpellPlayerEntity) player; Map playerSpells = spellPlayer.getSorceryCraftSpells(); Map itemSpells = SpellTag.getSpells(player.inventory.getInvStack(slot)); boolean changed = false; for (Map.Entry entry : itemSpells.entrySet()) { Spell spell = SpellRegistry.getSpell(entry.getKey(), entry.getValue()); if (spell != null) { if (spell.getLevel() >= spell.getMaxLevel()) { spell = SpellRegistry.getSpell(entry.getKey(), spell.getMaxLevel() - 1); } assert spell != null; if (!playerSpells.containsKey(spell.getID()) || playerSpells.get(spell.getID()) < spell.getLevel()) { changed = true; playerSpells.put(spell.getID(), spell.getLevel()); assert world.getServer() != null; Text text = new LiteralText("[").append(SpellTag.getTranslatedSpell(spell.getID(), spell.getLevel()).getString()).append("]").formatted(Formatting.GREEN); world.getServer().getPlayerManager().sendToAll(new TranslatableText("chat." + SorceryCraft.NAMESPACE + ".new_spell", player.getDisplayName(), text)); } } } if (changed) { SorceryCraft.playSpellSound(player); spellPlayer.setSorceryCraftSpells(playerSpells); } } } }