Skip to content

Commit

Permalink
Fix knockback spam
Browse files Browse the repository at this point in the history
  • Loading branch information
BunnyCinnamon committed May 17, 2021
1 parent 8c08b19 commit 965e256
Show file tree
Hide file tree
Showing 6 changed files with 135 additions and 8 deletions.
6 changes: 0 additions & 6 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -79,9 +79,3 @@ reobf {
artifacts {
archives shadowJar
}

sourceSets {
main {
output.resourcesDir = output.classesDir
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ public final class Capabilities {
public static final Capability<AdvancementCapability> ADVANCEMENT = null;
@CapabilityInject(PowerBoostCapability.class)
public static final Capability<PowerBoostCapability> POWER_BOOST = null;
@CapabilityInject(KnockbackTimerCapability.class)
public static final Capability<KnockbackTimerCapability> KNOCKBACK_TIMER = null;

public static Optional<SkilledEntityCapability> get(@Nullable Entity entity) {
return entity != null ? Optional.ofNullable(entity.getCapability(SKILLED_ENTITY, null)) : Optional.empty();
Expand All @@ -38,4 +40,8 @@ public static Optional<AdvancementCapability> advancement(@Nullable Entity entit
public static Optional<PowerBoostCapability> powerBoost(@Nullable Entity entity) {
return entity != null ? Optional.ofNullable(entity.getCapability(POWER_BOOST, null)) : Optional.empty();
}

public static Optional<KnockbackTimerCapability> knockback(@Nullable Entity entity) {
return entity != null ? Optional.ofNullable(entity.getCapability(KNOCKBACK_TIMER, null)) : Optional.empty();
}
}
Original file line number Diff line number Diff line change
@@ -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<NBTTagCompound>, Capability.IStorage<KnockbackTimerCapability> {

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> T getCapability(@Nonnull Capability<T> 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<KnockbackTimerCapability> capability, KnockbackTimerCapability instance, EnumFacing side) {
NBTTagCompound tag = new NBTTagCompound();
//Write Endurance
tag.setDouble(KNOCKBACK_NBT, instance.lastKnockback);
return tag;
}

@Override
public void readNBT(Capability<KnockbackTimerCapability> 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<Entity> 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());
}
}
}
10 changes: 8 additions & 2 deletions src/main/java/arekkuusu/enderskills/common/CommonConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand All @@ -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");
Expand All @@ -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");
Expand Down Expand Up @@ -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;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand Down
34 changes: 34 additions & 0 deletions src/main/java/arekkuusu/enderskills/common/proxy/Events.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
});
}
}
}

0 comments on commit 965e256

Please sign in to comment.