package com.thebrokenrail.sorcerycraft.item; import com.thebrokenrail.sorcerycraft.SorceryCraft; import com.thebrokenrail.sorcerycraft.entity.SpellEntity; import com.thebrokenrail.sorcerycraft.packet.LearnedNewSpellS2CPacket; import com.thebrokenrail.sorcerycraft.spell.*; 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.server.network.ServerPlayerEntity; import net.minecraft.sound.SoundEvents; import net.minecraft.text.LiteralText; import net.minecraft.text.Text; import net.minecraft.text.TranslatableText; import net.minecraft.util.*; 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); Map spells = SpellTag.getSpells(itemStack); if (spells.size() > 0) { playerEntity.playSound(SoundEvents.BLOCK_ENCHANTMENT_TABLE_USE, 1.0f, 1.0f); 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); } else { return new TypedActionResult<>(ActionResult.FAIL, 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.getSpells(); 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.new_spell", player.getDisplayName(), text)); } } } if (changed) { LearnedNewSpellS2CPacket.send((ServerPlayerEntity) player); spellPlayer.setSpells(playerSpells); } } } }