package me.km.events; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import me.km.KajetansMod; import me.km.utils.ReflectionUtils; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.entity.projectile.EntityThrowable; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.EntityJoinWorldEvent; import net.minecraftforge.event.entity.living.LivingHurtEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; public class CustomEventCaller { private static final ArrayList ARROWS = new ArrayList<>(); private static final HashMap MOVE_DATA = new HashMap<>(); private static int idCounter = 0; private static final LinkedList REMOVE_QUEUE = new LinkedList<>(); public static int registerMoveData(PlayerMoveData data) { idCounter++; MOVE_DATA.put(idCounter, data); return idCounter; } public static void removeMoveData(int id) { REMOVE_QUEUE.add(id); } @SubscribeEvent public void onPlayerMove(TickEvent.ServerTickEvent e) { if(e.phase == TickEvent.Phase.END) { MOVE_DATA.values().removeIf(data -> { if(data.tickLiving()) { return true; } if(data.tick()) { return false; } return KajetansMod.server.getPlayerList().getPlayers().stream().anyMatch(p -> data.check(p)); }); if(!REMOVE_QUEUE.isEmpty()) { REMOVE_QUEUE.forEach(i -> MOVE_DATA.remove(i)); REMOVE_QUEUE.clear(); } } } @SubscribeEvent public void onArrowLaunch(EntityJoinWorldEvent e) { Entity ent = e.getEntity(); if(ent instanceof EntityArrow) { EntityArrow arrow = (EntityArrow) ent; if(arrow.shootingEntity instanceof EntityPlayer) { ARROWS.add(arrow); MinecraftForge.EVENT_BUS.post(new ArrowLaunchEvent((EntityPlayer) arrow.shootingEntity, arrow, e.getWorld())); } } else if(ent instanceof EntityThrowable) { EntityThrowable thrown = (EntityThrowable) ent; if(thrown.getThrower() instanceof EntityPlayer) { MinecraftForge.EVENT_BUS.post(new ThrowableLaunchEvent((EntityPlayer) thrown.getThrower(), thrown, e.getWorld())); } } } @SubscribeEvent public void tickServer(TickEvent.ServerTickEvent e) { if(e.phase == TickEvent.Phase.END) { ARROWS.removeIf(arrow -> { if(ReflectionUtils.getArrowTimeInGround(arrow) >= 1) { MinecraftForge.EVENT_BUS.post(new ArrowHitGroundEvent(arrow)); return true; } return false; }); } } @SubscribeEvent public void onPlayerHurt(LivingHurtEvent e) { if(e.getEntityLiving() instanceof EntityPlayerMP && !(e instanceof PlayerHurtEvent)) { PlayerHurtEvent hurt = new PlayerHurtEvent((EntityPlayerMP) e.getEntityLiving(), e.getSource(), e.getAmount()); MinecraftForge.EVENT_BUS.post(hurt); e.setAmount(hurt.getAmount()); e.setCanceled(hurt.isCanceled()); } } }