127 lines
5.0 KiB
Java
127 lines
5.0 KiB
Java
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<ItemStack> use(World world, PlayerEntity playerEntity, Hand hand) {
|
|
ItemStack itemStack = playerEntity.getStackInHand(hand);
|
|
|
|
Map<String, Integer> 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<String, Integer> spells = SpellTag.getSpells(stack);
|
|
return spells.size() > 0;
|
|
}
|
|
|
|
@Override
|
|
public void appendTooltip(ItemStack itemStack, World world, List<Text> tooltip, TooltipContext tooltipContext) {
|
|
Map<String, Integer> spells = SpellTag.getSpells(itemStack);
|
|
for (Map.Entry<String, Integer> entry : spells.entrySet()) {
|
|
tooltip.add(SpellTag.getTranslatedSpell(entry.getKey(), entry.getValue()));
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void appendStacks(ItemGroup group, DefaultedList<ItemStack> stacks) {
|
|
if (isIn(group)) {
|
|
stacks.add(new ItemStack(this));
|
|
Spell[] spells = SpellRegistry.getSpells();
|
|
for (Spell value : spells) {
|
|
ItemStack item = new ItemStack(this);
|
|
Map<String, Integer> 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<String, Integer> playerSpells = spellPlayer.getSpells();
|
|
Map<String, Integer> itemSpells = SpellTag.getSpells(player.inventory.getInvStack(slot));
|
|
|
|
boolean changed = false;
|
|
|
|
for (Map.Entry<String, Integer> 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);
|
|
}
|
|
}
|
|
}
|
|
}
|