forked from TAIGA/TAIGA
98 lines
3.9 KiB
Java
98 lines
3.9 KiB
Java
package com.sosnitzka.taiga.traits;
|
|
|
|
import com.sosnitzka.taiga.util.Utils;
|
|
import net.minecraft.entity.Entity;
|
|
import net.minecraft.init.Blocks;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
import net.minecraft.util.math.BlockPos;
|
|
import net.minecraft.util.math.MathHelper;
|
|
import net.minecraft.util.text.TextFormatting;
|
|
import net.minecraft.world.World;
|
|
import net.minecraftforge.common.MinecraftForge;
|
|
import net.minecraftforge.common.util.FakePlayer;
|
|
import net.minecraftforge.event.entity.player.ItemTooltipEvent;
|
|
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
|
|
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
|
import slimeknights.tconstruct.library.traits.AbstractTrait;
|
|
import slimeknights.tconstruct.library.utils.TagUtil;
|
|
import slimeknights.tconstruct.library.utils.TinkerUtil;
|
|
import slimeknights.tconstruct.library.utils.ToolHelper;
|
|
|
|
|
|
public class TraitWhirl extends AbstractTrait {
|
|
|
|
protected static int TICK_PER_STAT = 36;
|
|
|
|
public TraitWhirl() {
|
|
super(TraitWhirl.class.getSimpleName().toLowerCase().substring(5), TextFormatting.DARK_BLUE);
|
|
MinecraftForge.EVENT_BUS.register(this);
|
|
}
|
|
|
|
@Override
|
|
public void onUpdate(ItemStack tool, World world, Entity entity, int itemSlot, boolean isSelected) {
|
|
|
|
if (entity instanceof FakePlayer || entity.world.isRemote) {
|
|
return;
|
|
}
|
|
if (entity.ticksExisted % TICK_PER_STAT > 0) {
|
|
return;
|
|
}
|
|
|
|
NBTTagCompound tag = TagUtil.getExtraTag(tool);
|
|
Utils.GeneralNBTData data = Utils.GeneralNBTData.read(tag);
|
|
data.radius += random.nextFloat() * 0.5f;
|
|
if (data.radius >= 1) {
|
|
TagUtil.setEnchantEffect(tool, true);
|
|
}
|
|
data.write(tag);
|
|
TagUtil.setExtraTag(tool, tag);
|
|
}
|
|
|
|
@SubscribeEvent
|
|
public void onRightClickItem(PlayerInteractEvent.RightClickItem event) {
|
|
World w = event.getWorld();
|
|
ItemStack tool = event.getEntityPlayer().getHeldItemMainhand();
|
|
if (!w.isRemote && TinkerUtil.hasTrait(TagUtil.getTagSafe(tool), identifier)) {
|
|
NBTTagCompound tag = TagUtil.getExtraTag(tool);
|
|
Utils.GeneralNBTData data = Utils.GeneralNBTData.read(tag);
|
|
if ((int) data.radius >= 1) {
|
|
int r = Math.min((int) data.radius, 8);
|
|
for (int x = -r; x <= r; x++) {
|
|
for (int y = -r; y <= r; y++) {
|
|
for (int z = -r; z <= r; z++) {
|
|
if (MathHelper.sqrt(x * x + y * y + z * z) > r) {
|
|
continue;
|
|
}
|
|
BlockPos nPos = new BlockPos(event.getPos().getX() + x, event.getPos().getY() + y, event.getPos().getZ() + z);
|
|
if (!(event.getWorld().getBlockState(nPos).equals(Blocks.WATER.getDefaultState()) || event.getWorld().getBlockState(nPos).equals(Blocks.FLOWING_WATER.getDefaultState())))
|
|
continue;
|
|
event.getWorld().destroyBlock(nPos, false);
|
|
}
|
|
}
|
|
}
|
|
data.radius -= r;
|
|
data.write(tag);
|
|
TagUtil.setExtraTag(tool, tag);
|
|
TagUtil.setEnchantEffect(tool, false);
|
|
ToolHelper.damageTool(tool, 2 * r, event.getEntityPlayer());
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
|
|
@SubscribeEvent
|
|
public void onItemTooltip(ItemTooltipEvent e) {
|
|
ItemStack tool = e.getItemStack();
|
|
if (TinkerUtil.hasTrait(TagUtil.getTagSafe(tool), identifier)) {
|
|
NBTTagCompound tag = TagUtil.getExtraTag(tool);
|
|
Utils.GeneralNBTData data = Utils.GeneralNBTData.read(tag);
|
|
if (data.radius > 0) {
|
|
e.getToolTip().add(TextFormatting.BLUE + "Actual Radius: " + TextFormatting.WHITE + Math.round(data.radius * 100) / 100);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|