NaturesAura/src/main/java/de/ellpeck/naturesaura/items/RangeVisualizer.java

96 lines
4 KiB
Java
Raw Normal View History

2019-01-27 13:57:34 +01:00
package de.ellpeck.naturesaura.items;
2019-03-20 20:51:24 +01:00
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ListMultimap;
import de.ellpeck.naturesaura.NaturesAura;
import de.ellpeck.naturesaura.api.render.IVisualizable;
2019-01-27 13:57:34 +01:00
import net.minecraft.block.Block;
2019-10-20 22:30:49 +02:00
import net.minecraft.block.BlockState;
import net.minecraft.entity.Entity;
2019-10-20 22:30:49 +02:00
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
2019-11-04 19:08:49 +01:00
import net.minecraft.item.ItemUseContext;
import net.minecraft.util.ActionResult;
2019-10-20 22:30:49 +02:00
import net.minecraft.util.ActionResultType;
import net.minecraft.util.Direction;
import net.minecraft.util.Hand;
2019-01-27 13:57:34 +01:00
import net.minecraft.util.math.BlockPos;
2019-10-20 22:30:49 +02:00
import net.minecraft.util.text.TranslationTextComponent;
2019-01-27 13:57:34 +01:00
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
2019-10-20 22:30:49 +02:00
import net.minecraftforge.eventbus.api.SubscribeEvent;
2019-01-27 13:57:34 +01:00
2019-11-04 19:08:49 +01:00
public class RangeVisualizer extends ItemImpl {
2019-01-27 13:57:34 +01:00
2019-03-20 20:51:24 +01:00
public static final ListMultimap<Integer, BlockPos> VISUALIZED_BLOCKS = ArrayListMultimap.create();
public static final ListMultimap<Integer, Entity> VISUALIZED_ENTITIES = ArrayListMultimap.create();
public static final ListMultimap<Integer, BlockPos> VISUALIZED_RAILS = ArrayListMultimap.create();
2019-01-27 13:57:34 +01:00
2019-11-04 19:08:49 +01:00
public RangeVisualizer() {
super("range_visualizer", new Properties().maxStackSize(1).group(NaturesAura.CREATIVE_TAB));
MinecraftForge.EVENT_BUS.register(this);
2019-01-27 13:57:34 +01:00
}
@Override
2019-10-20 22:30:49 +02:00
public ActionResult<ItemStack> onItemRightClick(World worldIn, PlayerEntity playerIn, Hand handIn) {
ItemStack stack = playerIn.getHeldItem(handIn);
if (playerIn.isSneaking()) {
clear();
2019-10-20 22:30:49 +02:00
playerIn.sendStatusMessage(new TranslationTextComponent("info." + NaturesAura.MOD_ID + ".range_visualizer.end_all"), true);
return new ActionResult<>(ActionResultType.SUCCESS, stack);
}
2019-10-20 22:30:49 +02:00
return new ActionResult<>(ActionResultType.PASS, stack);
}
2019-01-27 13:57:34 +01:00
@Override
2019-11-04 19:08:49 +01:00
public ActionResultType onItemUse(ItemUseContext context) {
World world = context.getWorld();
BlockPos pos = context.getPos();
BlockState state = world.getBlockState(pos);
2019-01-27 13:57:34 +01:00
Block block = state.getBlock();
if (block instanceof IVisualizable) {
2019-11-04 19:08:49 +01:00
if (world.isRemote)
visualize(context.getPlayer(), VISUALIZED_BLOCKS, world.getDimension().getType().getId(), pos);
2019-10-20 22:30:49 +02:00
return ActionResultType.SUCCESS;
2019-01-27 13:57:34 +01:00
}
2019-10-20 22:30:49 +02:00
return ActionResultType.PASS;
2019-01-27 13:57:34 +01:00
}
2019-03-20 20:51:24 +01:00
public static void clear() {
if (!VISUALIZED_BLOCKS.isEmpty())
VISUALIZED_BLOCKS.clear();
if (!VISUALIZED_ENTITIES.isEmpty())
VISUALIZED_ENTITIES.clear();
if (!VISUALIZED_RAILS.isEmpty())
VISUALIZED_RAILS.clear();
}
2019-10-20 22:30:49 +02:00
public static <T> void visualize(PlayerEntity player, ListMultimap<Integer, T> map, int dim, T value) {
if (map.containsEntry(dim, value)) {
map.remove(dim, value);
2019-10-20 22:30:49 +02:00
player.sendStatusMessage(new TranslationTextComponent("info." + NaturesAura.MOD_ID + ".range_visualizer.end"), true);
} else {
map.put(dim, value);
2019-10-20 22:30:49 +02:00
player.sendStatusMessage(new TranslationTextComponent("info." + NaturesAura.MOD_ID + ".range_visualizer.start"), true);
}
}
@SubscribeEvent
public void onInteract(PlayerInteractEvent.EntityInteractSpecific event) {
ItemStack stack = event.getItemStack();
if (stack.isEmpty() || stack.getItem() != this)
return;
Entity entity = event.getTarget();
if (entity instanceof IVisualizable) {
if (entity.world.isRemote) {
2019-11-04 19:08:49 +01:00
int dim = entity.world.getDimension().getType().getId();
visualize(event.getPlayer(), VISUALIZED_ENTITIES, dim, entity);
}
2019-11-04 19:08:49 +01:00
event.getPlayer().swingArm(event.getHand());
2019-10-20 22:30:49 +02:00
event.setCancellationResult(ActionResultType.SUCCESS);
event.setCanceled(true);
}
}
2019-01-27 13:57:34 +01:00
}