From 965e25614e0577f8f0f1db7eb6efba86e4c7dcf2 Mon Sep 17 00:00:00 2001 From: ArekkuusuJerii Date: Sun, 16 May 2021 22:04:09 -0500 Subject: [PATCH] Fix knockback spam --- build.gradle | 6 -- .../api/capability/Capabilities.java | 6 ++ .../capability/KnockbackTimerCapability.java | 86 +++++++++++++++++++ .../enderskills/common/CommonConfig.java | 10 ++- .../enderskills/common/EnderSkills.java | 1 + .../enderskills/common/proxy/Events.java | 34 ++++++++ 6 files changed, 135 insertions(+), 8 deletions(-) create mode 100644 src/main/java/arekkuusu/enderskills/api/capability/KnockbackTimerCapability.java diff --git a/build.gradle b/build.gradle index 0f6bc66..ba31aaa 100644 --- a/build.gradle +++ b/build.gradle @@ -79,9 +79,3 @@ reobf { artifacts { archives shadowJar } - -sourceSets { - main { - output.resourcesDir = output.classesDir - } -} diff --git a/src/main/java/arekkuusu/enderskills/api/capability/Capabilities.java b/src/main/java/arekkuusu/enderskills/api/capability/Capabilities.java index f44fa14..35ecdef 100644 --- a/src/main/java/arekkuusu/enderskills/api/capability/Capabilities.java +++ b/src/main/java/arekkuusu/enderskills/api/capability/Capabilities.java @@ -18,6 +18,8 @@ public final class Capabilities { public static final Capability ADVANCEMENT = null; @CapabilityInject(PowerBoostCapability.class) public static final Capability POWER_BOOST = null; + @CapabilityInject(KnockbackTimerCapability.class) + public static final Capability KNOCKBACK_TIMER = null; public static Optional get(@Nullable Entity entity) { return entity != null ? Optional.ofNullable(entity.getCapability(SKILLED_ENTITY, null)) : Optional.empty(); @@ -38,4 +40,8 @@ public static Optional advancement(@Nullable Entity entit public static Optional powerBoost(@Nullable Entity entity) { return entity != null ? Optional.ofNullable(entity.getCapability(POWER_BOOST, null)) : Optional.empty(); } + + public static Optional knockback(@Nullable Entity entity) { + return entity != null ? Optional.ofNullable(entity.getCapability(KNOCKBACK_TIMER, null)) : Optional.empty(); + } } diff --git a/src/main/java/arekkuusu/enderskills/api/capability/KnockbackTimerCapability.java b/src/main/java/arekkuusu/enderskills/api/capability/KnockbackTimerCapability.java new file mode 100644 index 0000000..4b81aba --- /dev/null +++ b/src/main/java/arekkuusu/enderskills/api/capability/KnockbackTimerCapability.java @@ -0,0 +1,86 @@ +package arekkuusu.enderskills.api.capability; + +import arekkuusu.enderskills.common.lib.LibMod; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.CapabilityManager; +import net.minecraftforge.common.capabilities.ICapabilitySerializable; +import net.minecraftforge.event.AttachCapabilitiesEvent; +import net.minecraftforge.event.entity.player.PlayerEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +@SuppressWarnings("ConstantConditions") +public class KnockbackTimerCapability implements ICapabilitySerializable, Capability.IStorage { + + public double lastKnockback; + + public static void init() { + CapabilityManager.INSTANCE.register(KnockbackTimerCapability.class, new KnockbackTimerCapability(), KnockbackTimerCapability::new); + MinecraftForge.EVENT_BUS.register(new Handler()); + } + + @Override + public boolean hasCapability(@Nonnull Capability capability, @Nullable EnumFacing facing) { + return getCapability(capability, facing) != null; + } + + @Override + @Nullable + public T getCapability(@Nonnull Capability capability, @Nullable EnumFacing facing) { + return capability == Capabilities.KNOCKBACK_TIMER ? Capabilities.KNOCKBACK_TIMER.cast(this) : null; + } + + @Override + public NBTTagCompound serializeNBT() { + return (NBTTagCompound) Capabilities.KNOCKBACK_TIMER.getStorage().writeNBT(Capabilities.KNOCKBACK_TIMER, this, null); + } + + @Override + public void deserializeNBT(NBTTagCompound nbt) { + Capabilities.KNOCKBACK_TIMER.getStorage().readNBT(Capabilities.KNOCKBACK_TIMER, this, null, nbt); + } + + //** NBT **// + public static final String KNOCKBACK_NBT = "lastKnockback"; + + @Override + @Nullable + public NBTBase writeNBT(Capability capability, KnockbackTimerCapability instance, EnumFacing side) { + NBTTagCompound tag = new NBTTagCompound(); + //Write Endurance + tag.setDouble(KNOCKBACK_NBT, instance.lastKnockback); + return tag; + } + + @Override + public void readNBT(Capability capability, KnockbackTimerCapability instance, EnumFacing side, NBTBase nbt) { + NBTTagCompound tag = (NBTTagCompound) nbt; + //Read endurance + instance.lastKnockback = tag.getDouble(KNOCKBACK_NBT); + } + + public static class Handler { + private static final ResourceLocation KEY = new ResourceLocation(LibMod.MOD_ID, "KNOCKBACK"); + + @SubscribeEvent + public void attachCapabilities(AttachCapabilitiesEvent event) { + if (event.getObject() instanceof EntityLivingBase) + event.addCapability(KEY, Capabilities.KNOCKBACK_TIMER.getDefaultInstance()); + } + + @SubscribeEvent + public void clonePlayer(PlayerEvent.Clone event) { + event.getEntityPlayer().getCapability(Capabilities.KNOCKBACK_TIMER, null) + .deserializeNBT(event.getOriginal().getCapability(Capabilities.KNOCKBACK_TIMER, null).serializeNBT()); + } + } +} diff --git a/src/main/java/arekkuusu/enderskills/common/CommonConfig.java b/src/main/java/arekkuusu/enderskills/common/CommonConfig.java index bd81444..86121e4 100644 --- a/src/main/java/arekkuusu/enderskills/common/CommonConfig.java +++ b/src/main/java/arekkuusu/enderskills/common/CommonConfig.java @@ -35,6 +35,7 @@ public static Values getSyncValues() { @Deprecated public static void initSyncConfig() { CommonConfig.getSyncValues().skill.destroyBlocks = CommonConfig.getValues().skill.destroyBlocks; + CommonConfig.getSyncValues().skill.preventAbilityDoTKnockback = CommonConfig.getValues().skill.preventAbilityDoTKnockback; CommonConfig.getSyncValues().skill.defaultHumanTeam = CommonConfig.getValues().skill.defaultHumanTeam; CommonConfig.getSyncValues().skill.defaultAnimalTeam = CommonConfig.getValues().skill.defaultAnimalTeam; EnderSkillsAPI.defaultHumanTeam = CommonConfig.getSyncValues().skill.defaultHumanTeam; @@ -81,6 +82,7 @@ public static void writeSyncConfig(NBTTagCompound compound) { NBTHelper.setArray(compound, "advancement.levels.function", CommonConfig.getValues().advancement.levels.function); compound.setInteger("advancement.levels.defaultLevel", CommonConfig.getValues().advancement.levels.defaultLevel); compound.setBoolean("destroyBlocks", CommonConfig.getValues().skill.destroyBlocks); + compound.setBoolean("preventAbilityDoTKnockback", CommonConfig.getValues().skill.preventAbilityDoTKnockback); compound.setBoolean("defaultHumanTeam", CommonConfig.getValues().skill.defaultHumanTeam); compound.setBoolean("defaultAnimalTeam", CommonConfig.getValues().skill.defaultAnimalTeam); compound.setDouble("globalCooldown", CommonConfig.getValues().skill.globalCooldown); @@ -97,7 +99,7 @@ public static void writeSyncConfig(NBTTagCompound compound) { @Deprecated @SideOnly(Side.CLIENT) public static void readSyncConfig(NBTTagCompound compound) { - CommonConfig.getSyncValues().advancement.oneTreePerClass = compound.getBoolean("advancement.xp.oneTreePerClass"); + CommonConfig.getSyncValues().advancement.oneTreePerClass = compound.getBoolean("advancement.oneTreePerClass"); CommonConfig.getSyncValues().advancement.xp.globalCostMultiplier = compound.getDouble("advancement.xp.globalCostMultiplier"); CommonConfig.getSyncValues().advancement.xp.costIncrement = compound.getDouble("advancement.xp.costIncrement"); CommonConfig.getSyncValues().advancement.xp.retryXPReturn = compound.getDouble("advancement.xp.retryXPReturn"); @@ -107,6 +109,7 @@ public static void readSyncConfig(NBTTagCompound compound) { CommonConfig.getSyncValues().advancement.levels.function = NBTHelper.getArray(compound, "advancement.levels.function"); CommonConfig.getSyncValues().advancement.levels.defaultLevel = compound.getInteger("advancement.levels.defaultLevel"); CommonConfig.getSyncValues().skill.destroyBlocks = compound.getBoolean("destroyBlocks"); + CommonConfig.getSyncValues().skill.preventAbilityDoTKnockback = compound.getBoolean("preventAbilityDoTKnockback"); CommonConfig.getSyncValues().skill.defaultHumanTeam = compound.getBoolean("defaultHumanTeam"); CommonConfig.getSyncValues().skill.defaultAnimalTeam = compound.getBoolean("defaultAnimalTeam"); CommonConfig.getSyncValues().skill.globalCooldown = compound.getDouble("globalCooldown"); @@ -135,9 +138,12 @@ public static class SkillGlobalConfig { public final Extra extra = new Extra(); - @Config.Comment("Disallows abilities to break blocks") + @Config.Comment("Disallows abilities from breaking blocks") public boolean destroyBlocks = false; + @Config.Comment("Disallows DoT abilities from knockback") + public boolean preventAbilityDoTKnockback = true; + @Config.Comment("Disallows abilities to target humans") public boolean defaultHumanTeam = true; diff --git a/src/main/java/arekkuusu/enderskills/common/EnderSkills.java b/src/main/java/arekkuusu/enderskills/common/EnderSkills.java index bbf10c2..c26b71d 100644 --- a/src/main/java/arekkuusu/enderskills/common/EnderSkills.java +++ b/src/main/java/arekkuusu/enderskills/common/EnderSkills.java @@ -57,6 +57,7 @@ public void preInit(FMLPreInitializationEvent event) { EnduranceCapability.init(); AdvancementCapability.init(); PowerBoostCapability.init(); + KnockbackTimerCapability.init(); PacketHandler.init(); if(WorldGuardHelper.isEventHelperLoaded()) { MinecraftForge.EVENT_BUS.register(new WorldGuardHelper()); diff --git a/src/main/java/arekkuusu/enderskills/common/proxy/Events.java b/src/main/java/arekkuusu/enderskills/common/proxy/Events.java index 27cf75f..d67fdcd 100644 --- a/src/main/java/arekkuusu/enderskills/common/proxy/Events.java +++ b/src/main/java/arekkuusu/enderskills/common/proxy/Events.java @@ -5,16 +5,21 @@ import arekkuusu.enderskills.api.capability.data.SkillInfo; import arekkuusu.enderskills.api.event.SkillActionableEvent; import arekkuusu.enderskills.api.registry.Skill; +import arekkuusu.enderskills.common.CommonConfig; import arekkuusu.enderskills.common.lib.LibMod; import arekkuusu.enderskills.common.network.PacketHelper; +import arekkuusu.enderskills.common.skill.ability.BaseAbility; import com.google.common.collect.Lists; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.DamageSource; import net.minecraftforge.event.entity.EntityJoinWorldEvent; import net.minecraftforge.event.entity.EntityTravelToDimensionEvent; import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.event.entity.living.LivingEvent; +import net.minecraftforge.event.entity.living.LivingKnockBackEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @@ -174,10 +179,39 @@ public static void onEntityTickCooldown(LivingEvent.LivingUpdateEvent event) { } } + @SubscribeEvent(priority = EventPriority.LOWEST) + public static void onKnockbackTick(LivingEvent.LivingUpdateEvent event) { + if (!event.getEntityLiving().getEntityWorld().isRemote) { + EntityLivingBase entity = event.getEntityLiving(); + Capabilities.knockback(entity).ifPresent(c -> { + if(c.lastKnockback < 20) { + c.lastKnockback++; + } + }); + } + } + @SubscribeEvent(priority = EventPriority.HIGHEST) public static void onSkillActionable(SkillActionableEvent event) { if(event.getEntityLiving() instanceof EntityPlayer && ((EntityPlayer) event.getEntityLiving()).isSpectator()) { event.setCanceled(true); } } + + @SubscribeEvent(priority = EventPriority.HIGHEST) + public static void onKnockback(LivingKnockBackEvent event) { + if (!event.getEntityLiving().getEntityWorld().isRemote) { + Capabilities.knockback(event.getEntityLiving()).ifPresent(c -> { + DamageSource source = event.getEntityLiving().getLastDamageSource(); + boolean isDamageAnDoTAbility = source != null + && CommonConfig.getSyncValues().skill.preventAbilityDoTKnockback + && source.damageType.equals(BaseAbility.DAMAGE_DOT_TYPE); + if (isDamageAnDoTAbility) { + event.setCanceled(true); + } else { + c.lastKnockback = 0; + } + }); + } + } }