diff --git a/src/main/java/anvil/infinity/Infinity.java b/src/main/java/anvil/infinity/Infinity.java index dfe458c..a8376b4 100644 --- a/src/main/java/anvil/infinity/Infinity.java +++ b/src/main/java/anvil/infinity/Infinity.java @@ -1,5 +1,8 @@ package anvil.infinity; +import anvil.infinity.capabilities.Factory; +import anvil.infinity.capabilities.ICapabilityPlayerData; +import anvil.infinity.capabilities.Storage; import anvil.infinity.compat.CompatHandler; import anvil.infinity.config.ConfigHandler; import anvil.infinity.networking.LookAbilityPackageHandler; @@ -8,6 +11,7 @@ import anvil.infinity.networking.PackageKillAbility; import anvil.infinity.networking.PackageReq; import net.minecraft.block.Block; import net.minecraft.item.Item; +import net.minecraftforge.common.capabilities.CapabilityManager; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; @@ -52,7 +56,7 @@ public class Infinity { int netID = 0; NETWORK_WRAPPER.registerMessage(LookAbilityReturnPackageHandler.class, PackageKillAbility.class, netID++, Side.SERVER); NETWORK_WRAPPER.registerMessage(LookAbilityPackageHandler.class, PackageReq.class, netID++, Side.CLIENT); - + CapabilityManager.INSTANCE.register(ICapabilityPlayerData.class, new Storage(), new Factory()); } diff --git a/src/main/java/anvil/infinity/abilities/AbilityChangeSnap.java b/src/main/java/anvil/infinity/abilities/AbilityChangeSnap.java index 2627b71..7692cf1 100644 --- a/src/main/java/anvil/infinity/abilities/AbilityChangeSnap.java +++ b/src/main/java/anvil/infinity/abilities/AbilityChangeSnap.java @@ -1,7 +1,7 @@ package anvil.infinity.abilities; -import anvil.infinity.data.EntityData; -import anvil.infinity.data.GauntletUserInformation; +import anvil.infinity.capabilities.GauntletUserInformation; +import anvil.infinity.capabilities.ICapabilityPlayerData; import anvil.infinity.items.Items; import lucraft.mods.lucraftcore.superpowers.abilities.AbilityAction; import net.minecraft.client.Minecraft; @@ -22,10 +22,10 @@ public class AbilityChangeSnap extends AbilityAction { @Override public boolean action() { - EntityData data = GauntletUserInformation.getDataByEntity(entity); - data.selectedSnapResult = data.selectedSnapResult.next(); + ICapabilityPlayerData data = GauntletUserInformation.getDataByEntity(entity); + data.setSnapResult(data.getSnapResult().next()); if (entity instanceof EntityPlayer) { - ((EntityPlayer) entity).sendStatusMessage(new TextComponentString("Selected ability is: " + data.selectedSnapResult),true); + ((EntityPlayer) entity).sendStatusMessage(new TextComponentString("Selected ability is: " + data.getSnapResult()),true); } return true; } diff --git a/src/main/java/anvil/infinity/abilities/AbilitySnap.java b/src/main/java/anvil/infinity/abilities/AbilitySnap.java index 9bffca4..29350a2 100644 --- a/src/main/java/anvil/infinity/abilities/AbilitySnap.java +++ b/src/main/java/anvil/infinity/abilities/AbilitySnap.java @@ -1,35 +1,16 @@ package anvil.infinity.abilities; -import anvil.infinity.compat.CompatHandler; -import anvil.infinity.data.GauntletUserInformation; -import anvil.infinity.helpers.GauntelHelper; -import anvil.infinity.registry.Effects; import anvil.infinity.snap.SnapHelper; -import anvil.infinity.snap.SnapResult; import lucraft.mods.lucraftcore.infinity.ModuleInfinity; import lucraft.mods.lucraftcore.superpowers.abilities.AbilityAction; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.passive.EntityRabbit; import net.minecraft.item.ItemStack; -import net.minecraft.potion.PotionEffect; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.management.PlayerList; -import net.minecraft.util.EnumHand; -import net.minecraft.util.text.TextComponentString; -import net.minecraft.util.text.TextComponentTranslation; -import net.minecraft.util.text.TextFormatting; -import net.minecraft.world.World; -import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import java.util.List; -import java.util.Random; - public class AbilitySnap extends AbilityAction { diff --git a/src/main/java/anvil/infinity/capabilities/CapabilityEventListener.java b/src/main/java/anvil/infinity/capabilities/CapabilityEventListener.java new file mode 100644 index 0000000..a733764 --- /dev/null +++ b/src/main/java/anvil/infinity/capabilities/CapabilityEventListener.java @@ -0,0 +1,22 @@ +package anvil.infinity.capabilities; + +import anvil.infinity.Infinity; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.event.AttachCapabilitiesEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; + +@Mod.EventBusSubscriber(modid = Infinity.MOD_ID) +public class CapabilityEventListener { + + @SubscribeEvent + public static void onAttachCapabilities(AttachCapabilitiesEvent e) { + Entity entity = e.getObject(); + if (entity instanceof EntityPlayer) { + e.addCapability(new ResourceLocation(Infinity.MOD_ID, "playerCapability"), new CapabilityPlayerDataProvider(new CapabilityPlayerData())); + } + } + +} diff --git a/src/main/java/anvil/infinity/capabilities/CapabilityPlayerData.java b/src/main/java/anvil/infinity/capabilities/CapabilityPlayerData.java new file mode 100644 index 0000000..c401bee --- /dev/null +++ b/src/main/java/anvil/infinity/capabilities/CapabilityPlayerData.java @@ -0,0 +1,95 @@ +package anvil.infinity.capabilities; + +import anvil.infinity.snap.SnapResult; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.CapabilityInject; + +public class CapabilityPlayerData implements ICapabilityPlayerData { + + @CapabilityInject(ICapabilityPlayerData.class) + public static final Capability capability = null; + + public int xPos; + public int yPos; + public int zPos; + public int dim; + + public SnapResult selectedSnapResult; + + public CapabilityPlayerData() { + selectedSnapResult = SnapResult.KILLHALF; + } + + @Override + public int getXPos() { + return xPos; + } + + @Override + public int getYPos() { + return yPos; + } + + @Override + public int getZPos() { + return zPos; + } + + @Override + public int getDim() { + return dim; + } + + @Override + public void setXPos(int xPos) { + this.xPos = xPos; + } + + @Override + public void setYPos(int yPos) { + this.yPos = yPos; + } + + @Override + public void setZPos(int zPos) { + this.zPos = zPos; + } + + @Override + public void setDim(int dim) { + this.dim = dim; + } + + @Override + public SnapResult getSnapResult() { + return selectedSnapResult; + } + + @Override + public void setSnapResult(SnapResult snapResult) { + selectedSnapResult = snapResult; + } + + + @Override + public void readNBT(NBTTagCompound tag) { + setXPos(tag.getInteger("xPos")); + setYPos(tag.getInteger("YPos")); + setZPos(tag.getInteger("zPos")); + setDim(tag.getInteger("dim")); + setSnapResult(SnapResult.fromString(tag.getString("snapResult"))); + } + + @Override + public NBTTagCompound writeNBT() { + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setInteger("xPos", getXPos()); + nbt.setInteger("yPos", getYPos()); + nbt.setInteger("zPos", getZPos()); + nbt.setInteger("dim", getDim()); + nbt.setString("snapResult", getSnapResult().toString()); + return nbt; + } + +} diff --git a/src/main/java/anvil/infinity/capabilities/CapabilityPlayerDataProvider.java b/src/main/java/anvil/infinity/capabilities/CapabilityPlayerDataProvider.java new file mode 100644 index 0000000..c577b0f --- /dev/null +++ b/src/main/java/anvil/infinity/capabilities/CapabilityPlayerDataProvider.java @@ -0,0 +1,39 @@ +package anvil.infinity.capabilities; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumFacing; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ICapabilitySerializable; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +public class CapabilityPlayerDataProvider implements ICapabilitySerializable { + + ICapabilityPlayerData instance; + + public CapabilityPlayerDataProvider(ICapabilityPlayerData instance) { + this.instance = instance; + } + + @Override + public boolean hasCapability(@Nonnull Capability capability, @Nullable EnumFacing facing) { + return capability == CapabilityPlayerData.capability; + } + + @Nullable + @Override + public T getCapability(@Nonnull Capability capability, @Nullable EnumFacing facing) { + return capability == CapabilityPlayerData.capability ? CapabilityPlayerData.capability.cast(instance) : null; + } + + @Override + public NBTTagCompound serializeNBT() { + return (NBTTagCompound) CapabilityPlayerData.capability.getStorage().writeNBT(CapabilityPlayerData.capability, instance, null); + } + + @Override + public void deserializeNBT(NBTTagCompound nbt) { + CapabilityPlayerData.capability.getStorage().readNBT(CapabilityPlayerData.capability, instance, null, nbt); + } +} diff --git a/src/main/java/anvil/infinity/capabilities/Factory.java b/src/main/java/anvil/infinity/capabilities/Factory.java new file mode 100644 index 0000000..482b1c0 --- /dev/null +++ b/src/main/java/anvil/infinity/capabilities/Factory.java @@ -0,0 +1,11 @@ +package anvil.infinity.capabilities; + +import java.util.concurrent.Callable; + +public class Factory implements Callable { + + @Override + public ICapabilityPlayerData call() throws Exception { + return new CapabilityPlayerData(); + } +} diff --git a/src/main/java/anvil/infinity/capabilities/GauntletUserInformation.java b/src/main/java/anvil/infinity/capabilities/GauntletUserInformation.java new file mode 100644 index 0000000..917fa7c --- /dev/null +++ b/src/main/java/anvil/infinity/capabilities/GauntletUserInformation.java @@ -0,0 +1,18 @@ +package anvil.infinity.capabilities; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; + +import java.util.ArrayList; +import java.util.List; + +public class GauntletUserInformation { + + public static ICapabilityPlayerData getDataByEntity(EntityLivingBase entity) { + if (entity instanceof EntityPlayer && entity.hasCapability(CapabilityPlayerData.capability, null)) { + return entity.getCapability(CapabilityPlayerData.capability, null); + } + return new CapabilityPlayerData(); + } + +} diff --git a/src/main/java/anvil/infinity/capabilities/ICapabilityPlayerData.java b/src/main/java/anvil/infinity/capabilities/ICapabilityPlayerData.java new file mode 100644 index 0000000..177048e --- /dev/null +++ b/src/main/java/anvil/infinity/capabilities/ICapabilityPlayerData.java @@ -0,0 +1,24 @@ +package anvil.infinity.capabilities; + +import anvil.infinity.snap.SnapResult; +import net.minecraft.nbt.NBTTagCompound; + +public interface ICapabilityPlayerData { + + int getXPos(); + int getYPos(); + int getZPos(); + int getDim(); + + void setXPos(int xPos); + void setYPos(int yPos); + void setZPos(int zPos); + void setDim(int dim); + + SnapResult getSnapResult(); + void setSnapResult(SnapResult snapResult); + + void readNBT(NBTTagCompound nbt); + NBTTagCompound writeNBT(); + +} diff --git a/src/main/java/anvil/infinity/capabilities/Storage.java b/src/main/java/anvil/infinity/capabilities/Storage.java new file mode 100644 index 0000000..67960a4 --- /dev/null +++ b/src/main/java/anvil/infinity/capabilities/Storage.java @@ -0,0 +1,27 @@ +package anvil.infinity.capabilities; + +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumFacing; +import net.minecraftforge.common.capabilities.Capability; + +import javax.annotation.Nullable; +import java.util.List; + +public class Storage implements Capability.IStorage { + + @Nullable + @Override + public NBTBase writeNBT(Capability capability, ICapabilityPlayerData instance, EnumFacing side) { + return instance.writeNBT(); + } + + @Override + public void readNBT(Capability capability, ICapabilityPlayerData instance, EnumFacing side, NBTBase nbt) { + + if (nbt instanceof NBTTagCompound) { + instance.readNBT((NBTTagCompound) nbt); + } + + } +} diff --git a/src/main/java/anvil/infinity/data/EntityData.java b/src/main/java/anvil/infinity/data/EntityData.java deleted file mode 100644 index 9a75e06..0000000 --- a/src/main/java/anvil/infinity/data/EntityData.java +++ /dev/null @@ -1,21 +0,0 @@ -package anvil.infinity.data; - -import anvil.infinity.snap.SnapResult; -import net.minecraft.entity.EntityLivingBase; - -public class EntityData { - - public EntityLivingBase entity; - public int xPos; - public int yPos; - public int zPos; - public int dim; - - public SnapResult selectedSnapResult; - - public EntityData(EntityLivingBase entity) { - this.entity = entity; - selectedSnapResult = SnapResult.KILLHALF; - } - -} diff --git a/src/main/java/anvil/infinity/data/GauntletUserInformation.java b/src/main/java/anvil/infinity/data/GauntletUserInformation.java deleted file mode 100644 index 84a46a7..0000000 --- a/src/main/java/anvil/infinity/data/GauntletUserInformation.java +++ /dev/null @@ -1,23 +0,0 @@ -package anvil.infinity.data; - -import net.minecraft.entity.EntityLivingBase; - -import java.util.ArrayList; -import java.util.List; - -public class GauntletUserInformation { - - public static List gauntletUsers = new ArrayList<>(); - - public static EntityData getDataByEntity(EntityLivingBase entity) { - for (int i = 0; i < gauntletUsers.size(); i++) { - if (gauntletUsers.get(i).entity.equals(entity)) { - return gauntletUsers.get(i); - } - } - EntityData data = new EntityData(entity); - gauntletUsers.add(data); - return data; - } - -} diff --git a/src/main/java/anvil/infinity/snap/SnapHelper.java b/src/main/java/anvil/infinity/snap/SnapHelper.java index 42caadd..e7a977b 100644 --- a/src/main/java/anvil/infinity/snap/SnapHelper.java +++ b/src/main/java/anvil/infinity/snap/SnapHelper.java @@ -1,11 +1,10 @@ package anvil.infinity.snap; +import anvil.infinity.capabilities.ICapabilityPlayerData; import anvil.infinity.config.ConfigHandler; -import anvil.infinity.data.EntityData; -import anvil.infinity.data.GauntletUserInformation; +import anvil.infinity.capabilities.GauntletUserInformation; import anvil.infinity.helpers.GauntelHelper; import anvil.infinity.registry.Effects; -import lucraft.mods.lucraftcore.infinity.ModuleInfinity; import lucraft.mods.lucraftcore.superpowers.abilities.supplier.IAbilityProvider; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; @@ -22,7 +21,6 @@ import net.minecraft.util.text.TextComponentString; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.GameType; -import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraftforge.fml.common.FMLCommonHandler; @@ -35,10 +33,10 @@ public class SnapHelper { static MinecraftServer server = FMLCommonHandler.instance().getMinecraftServerInstance(); public static boolean snap(EntityLivingBase entity) { - EntityData data = GauntletUserInformation.getDataByEntity(entity); + ICapabilityPlayerData data = GauntletUserInformation.getDataByEntity(entity); if (GauntelHelper.hasFullGauntlet(entity)) { WorldServer[] worlds = server.worlds; - if (data.selectedSnapResult == SnapResult.KILLHALF) { + if (data.getSnapResult() == SnapResult.KILLHALF) { List entities = new ArrayList(); for (int i = 0; i < worlds.length; i++) { entities.addAll(worlds[i].loadedEntityList); @@ -63,7 +61,7 @@ public class SnapHelper { kill = !kill; } return true; - } else if (data.selectedSnapResult == SnapResult.DESTROYSTONES) { + } else if (data.getSnapResult() == SnapResult.DESTROYSTONES) { entity.setHealth(1); Item mainHand = entity.getHeldItemMainhand().getItem(); Item offHand = entity.getHeldItemOffhand().getItem(); @@ -76,7 +74,7 @@ public class SnapHelper { entity.attackEntityFrom(DamageSource.MAGIC, (entity.getHealth() / 10) - 0.01f); - } else if (data.selectedSnapResult == SnapResult.CREATIVE) { + } else if (data.getSnapResult() == SnapResult.CREATIVE) { if (ConfigHandler.snapCreative) { if (entity instanceof EntityPlayer) { @@ -88,9 +86,23 @@ public class SnapHelper { return true; } } - } else if (data.selectedSnapResult == SnapResult.BRINGBACK) { + } else if (data.getSnapResult() == SnapResult.BRINGBACK) { - } else if (data.selectedSnapResult == SnapResult.RECREATE) { + } else if (data.getSnapResult() == SnapResult.RECREATE) { + + } else if (data.getSnapResult() == SnapResult.KILLEVIL) { + List entities = new ArrayList(); + for (int i = 0; i < worlds.length; i++) { + entities.addAll(worlds[i].loadedEntityList); + } + + Random random = new Random(); + for (int i = 0; i < entities.size(); i++) { + if (entities.get(i) != entity && entities.get(i) instanceof EntityLivingBase) { + EntityLivingBase e = ((EntityLivingBase) entities.get(i)); + e.addPotionEffect(new PotionEffect(Effects.snapEffect, random.nextInt((1200 - 10) + 1) - 10)); + } + } } }