Skip to content
Open
Show file tree
Hide file tree
Changes from 35 commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
538672c
Implementing ExCap into Base Epic Fight - Part 1: introducing the bui…
Forixaim Mar 5, 2026
340f46e
Implementing ExCap into Base Epic Fight - Part 1: introducing the bui…
Forixaim Mar 6, 2026
d097e5a
Finished most of ExCap's integration now its just bug ironing
Forixaim Mar 7, 2026
7d8381d
Fixed Crossbow and Trident aim animations, bows are next
Forixaim Mar 7, 2026
29e8831
Fixed Bow Animations
Forixaim Mar 8, 2026
98c0a4e
Added some array safety by abs the combo size
Forixaim Mar 8, 2026
9ded988
Made Movesets deserializable paving way for datapacks
Forixaim Mar 8, 2026
cb0f8c4
Made conditionals deserializable
Forixaim Mar 8, 2026
535ab43
Reverted some changes to keep compatibility with addons. Added MountA…
Forixaim Mar 8, 2026
86ddd45
added more fallbacks and stuff
Forixaim Mar 8, 2026
f8d044a
More deserializability
Forixaim Mar 9, 2026
0b420fe
Merge branch '1.21.1' of https://github.com/Epic-Fight/epicfight into…
Forixaim Mar 9, 2026
cb8a7c5
fixed spear case
Forixaim Mar 9, 2026
44e2a4e
compacted the lambda to test, finally fixed the trident issue.
Forixaim Mar 9, 2026
7be6eff
finding methods to mark @Deprecated
Forixaim Mar 10, 2026
d6a9c42
finding methods to mark @Deprecated + guard specific cool modifiers
Forixaim Mar 10, 2026
53ff4aa
Merge branch '1.21.1' of https://github.com/Epic-Fight/epicfight into…
Forixaim Mar 10, 2026
b8939e1
moving to actually allow ExCap methods to be used.
Forixaim Mar 10, 2026
d2bea4d
More documentation
Forixaim Mar 11, 2026
cf4669f
Improved datapack registration, also upped the priority of all Epic F…
Forixaim Mar 11, 2026
78b768f
fixed issue with forgetting to copy CapabilityItem's fields.
Forixaim Mar 11, 2026
6743cd2
set .canbePlacedOffhand() to true
Forixaim Mar 11, 2026
119dd12
fixed issue regarding guard breaking bc container is null in WeaponCa…
Forixaim Mar 11, 2026
ddb57f9
The special ExCap custom guard holds are finally usable.
Forixaim Mar 11, 2026
6c2617e
The special ExCap custom guard holds are finally usable pt2, fixed a …
Forixaim Mar 11, 2026
2101a42
revert guard specials due to instability.
Forixaim Mar 11, 2026
d36b846
revert guard specials due to instability.
Forixaim Mar 11, 2026
c0afbce
made sure that the data managers sync
Forixaim Mar 11, 2026
2ad531b
Added one additional incrementation to make sure that parrying motion…
Forixaim Mar 11, 2026
163e6f9
fixed the incrementation logic
Forixaim Mar 11, 2026
cf98c5c
fixed the double increment by making incrementation server sided
Forixaim Mar 11, 2026
23d5281
added guard safety checks
Forixaim Mar 11, 2026
61d33f7
fixed parrying with WeaponCapability's custom guard
Forixaim Mar 12, 2026
2838c76
fixed parrying with WeaponCapability's custom guard
Forixaim Mar 12, 2026
20df0e5
improved some parts of RevelationSkill
Forixaim Mar 12, 2026
015077a
Reverted guard and deferred it instead of having this in PR #2489
Forixaim Mar 15, 2026
4e92a23
Reverted guard and deferred it instead of having this in PR #2489
Forixaim Mar 15, 2026
9dfc102
reverted an experimental change i did with trident.
Forixaim Mar 15, 2026
9304d21
rolled back GuardSkill
Forixaim Mar 16, 2026
fbbc6f7
Added ExCap custom overrides, undid a bunch of guards for later uses.
Forixaim Mar 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions common/src/main/java/yesman/epicfight/EpicFight.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,24 @@
import yesman.epicfight.platform.ModPlatform;
import yesman.epicfight.platform.ModPlatformProvider;

/// 21.16.x
/// Introduced ExCap, with fallbacks to legacy methods
/// ExCap changes:
/// Introduces the ExCapData which houses all providers and movesets, essentially a little data packet.
/// Removed weapon default registration and now Epic Fight hooks into their own event to handle registering weapons
/// Builders are now static and are copied to form a new weapon, Innate skills are improved to use a BiFunction to avoid hardcoding innates.
/// RangedWeaponCapability now extends WeaponCapability and have full access to ExCap's things.
/// Added a new hook that registers ExCapData into a weapon which will then be applied.
/// Enhanced the tier system to allow bases and scaling multipliers.
///
/// Programmer's Note:
/// This was the greatest undertaking I could've done under the hood wth Epic Fight, if you thought Holdable Skills were cool,
/// ExCap was one of my first projects and was the first one of how I made Battle Arts. Completing this for ExCap would mean that ExCap would no longer be available on 1.21.1
///
/// Cheers to you, and everyone here.
///
/// Common functionalities shared between the platform entrypoints.
/// @author Forixaim, Ellet
public final class EpicFight {
private EpicFight() {
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,8 @@
import yesman.epicfight.api.event.types.animation.*;
import yesman.epicfight.api.event.types.entity.*;
import yesman.epicfight.api.event.types.player.*;
import yesman.epicfight.api.event.types.registry.EntityPatchRegistryEvent;
import yesman.epicfight.api.event.types.registry.RegisterMobSkillBookLootTableEvent;
import yesman.epicfight.api.event.types.registry.SkillBuilderModificationEvent;
import yesman.epicfight.api.event.types.registry.WeaponCapabilityPresetRegistryEvent;
import yesman.epicfight.api.event.types.registry.*;
import yesman.epicfight.api.ex_cap.modules.core.events.*;
import yesman.epicfight.api.utils.side.LogicalSide;
import yesman.epicfight.world.capabilities.entitypatch.LivingEntityPatch;

Expand Down Expand Up @@ -70,6 +68,11 @@ public static final class Registry {
public static final EventHook<SkillBuilderModificationEvent> MODIFY_SKILL_BUILDER = EventHook.createEventHook();
public static final EventHook<RegisterMobSkillBookLootTableEvent> SKILLBOOK_LOOT_TABLE = EventHook.createEventHook();
public static final EventHook<WeaponCapabilityPresetRegistryEvent> WEAPON_CAPABILITY_PRESET = EventHook.createEventHook();
public static final EventHook<ExCapabilityBuilderPopulationEvent> EX_CAP_DATA_POPULATION = EventHook.createEventHook();
public static final EventHook<ExCapBuilderCreationEvent> EX_CAP_BUILDER_CREATION = EventHook.createEventHook();
public static final EventHook<ExCapDataRegistrationEvent> EX_CAP_DATA_CREATION = EventHook.createEventHook();
public static final EventHook<ExCapMovesetRegistryEvent> EX_CAP_MOVESET_REGISTRY = EventHook.createEventHook();
public static final EventHook<ConditionalRegistryEvent> EX_CAP_CONDITIONAL_REGISTRATION = EventHook.createEventHook();

private Registry() {}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,16 @@ public static void onLooseArrow(Player player) {
});
}

public static void onLooseTrident(Player player) {
EpicFightCapabilities.getUnparameterizedEntityPatch(player, PlayerPatch.class).ifPresent(playerpatch -> {
if (playerpatch.isLogicalClient()) {
playerpatch.getAnimator().playShootingAnimation();
} else {
EpicFightNetworkManager.sendToAllPlayerTrackingThisEntity(new SPAnimatorControl(AbstractAnimatorControl.Action.SHOT, Animations.EMPTY_ANIMATION, player.getId(), 0.0F, false), player);
}
});
}

/// Called when a player starts tracking an entity in the world
///
/// @see ServerEntity#addPairing
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
package yesman.epicfight.api.ex_cap.modules.assets;

import yesman.epicfight.api.ex_cap.modules.core.data.BuilderEntry;
import net.minecraft.sounds.SoundEvents;
import yesman.epicfight.EpicFight;
import yesman.epicfight.gameasset.ColliderPreset;
import yesman.epicfight.registry.entries.EpicFightSounds;
import yesman.epicfight.world.capabilities.item.*;

public class Builders
{

public static final BuilderEntry AXE = new BuilderEntry(EpicFight.identifier("axe"), WeaponCapability.builder()
.hitSound(EpicFightSounds.BLADE_HIT.get())
.collider(ColliderPreset.TOOLS)
.setTierValues(0, 10d, 0.7, 0.3));

public static final BuilderEntry SWORD = new BuilderEntry(EpicFight.identifier("sword"), WeaponCapability.builder()
.category(CapabilityItem.WeaponCategories.SWORD)
.hitSound(EpicFightSounds.BLADE_HIT.get())
.collider(ColliderPreset.SWORD)
.setTierValues(0, 0, 0.0, 0.0));

public static final BuilderEntry HOE = new BuilderEntry(EpicFight.identifier("hoe"), WeaponCapability.builder()
.category(CapabilityItem.WeaponCategories.HOE)
.hitSound(EpicFightSounds.BLADE_HIT.get())
.collider(ColliderPreset.TOOLS)
.setTierValues(0, 0d, -0.4, 0.1));

public static final BuilderEntry PICKAXE = new BuilderEntry(EpicFight.identifier("pickaxe"), WeaponCapability.builder()
.category(CapabilityItem.WeaponCategories.PICKAXE)
.hitSound(EpicFightSounds.BLADE_HIT.get())
.collider(ColliderPreset.TOOLS)
.setTierValues(0, 6d, 0.4, 0.1));

public static final BuilderEntry SHOVEL = new BuilderEntry(EpicFight.identifier("shovel"), WeaponCapability.builder()
.category(CapabilityItem.WeaponCategories.SHOVEL)
.collider(ColliderPreset.TOOLS)
.setTierValues(0, 0d, 0.8, 0.4));

public static final BuilderEntry SPEAR = new BuilderEntry(EpicFight.identifier("spear"), WeaponCapability.builder()
.category(CapabilityItem.WeaponCategories.SPEAR)
.swingSound(EpicFightSounds.WHOOSH_ROD.get())
.hitSound(EpicFightSounds.BLADE_HIT.get())
.collider(ColliderPreset.SPEAR)
.canBePlacedOffhand(false)
.reach(1.0F)
.setTierValues(0, 0d, 0.0, 0.0));

public static final BuilderEntry GREATSWORD = new BuilderEntry(EpicFight.identifier("greatsword"), WeaponCapability.builder()
.category(CapabilityItem.WeaponCategories.GREATSWORD)
.collider(ColliderPreset.GREATSWORD)
.swingSound(EpicFightSounds.WHOOSH_BIG.get())
.hitSound(EpicFightSounds.BLADE_HIT.get())
.canBePlacedOffhand(false)
.reach(1.0F)
.setTierValues(0, 0d, 0.0, 0.0));

public static final BuilderEntry UCHIGATANA = new BuilderEntry(EpicFight.identifier("uchigatana"), WeaponCapability.builder()
.category(CapabilityItem.WeaponCategories.UCHIGATANA)
.hitSound(EpicFightSounds.BLADE_HIT.get())
.collider(ColliderPreset.UCHIGATANA)
.canBePlacedOffhand(true)
.setTierValues(0, 0d, 0.0, 0.0));

public static final BuilderEntry TACHI = new BuilderEntry(EpicFight.identifier("tachi"), WeaponCapability.builder()
.category(CapabilityItem.WeaponCategories.TACHI)
.hitSound(EpicFightSounds.BLADE_HIT.get())
.collider(ColliderPreset.TACHI)
.canBePlacedOffhand(true)
.setTierValues(0, 0d, 0.0, 0.0));

public static final BuilderEntry DAGGER = new BuilderEntry(EpicFight.identifier("dagger"), WeaponCapability.builder()
.category(CapabilityItem.WeaponCategories.DAGGER)
.hitSound(EpicFightSounds.BLADE_HIT.get())
.swingSound(EpicFightSounds.WHOOSH_SMALL.get())
.collider(ColliderPreset.DAGGER)
.setTierValues(0, 0d, 0.0, 0.0));

public static final BuilderEntry LONGSWORD = new BuilderEntry(EpicFight.identifier("longsword"), WeaponCapability.builder()
.category(CapabilityItem.WeaponCategories.LONGSWORD)
.collider(ColliderPreset.LONGSWORD)
.hitSound(EpicFightSounds.BLADE_HIT.get())
.canBePlacedOffhand(true)
.setTierValues(0, 0d, 0.0, 0.0));

public static final BuilderEntry FIST = new BuilderEntry(EpicFight.identifier("fist"), WeaponCapability.builder()
.category(CapabilityItem.WeaponCategories.FIST)
.offHandAlone(true)
.setTierValues(0, 0d, 0.0, 0.0));

public static final BuilderEntry BOW = new BuilderEntry(EpicFight.identifier("bow"), WeaponCapability.builder()
.zoomInType(CapabilityItem.ZoomInType.USE_TICK));

public static final BuilderEntry CROSSBOW = new BuilderEntry(EpicFight.identifier("crossbow"), WeaponCapability.builder()
.zoomInType(CapabilityItem.ZoomInType.AIMING));

public static final BuilderEntry TRIDENT = new BuilderEntry(EpicFight.identifier("trident"), WeaponCapability.builder()
.zoomInType(CapabilityItem.ZoomInType.USE_TICK)
.hitSound(SoundEvents.TRIDENT_HIT)
.collider(ColliderPreset.SPEAR)
.category(CapabilityItem.WeaponCategories.TRIDENT));

public static final BuilderEntry SHIELD = new BuilderEntry(EpicFight.identifier("shield"), WeaponCapability.builder()
.category(CapabilityItem.WeaponCategories.SHIELD));
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
package yesman.epicfight.api.ex_cap.modules.assets;

import yesman.epicfight.api.ex_cap.modules.core.data.ExCapData;
import yesman.epicfight.api.ex_cap.modules.core.data.ExCapDataEntry;
import yesman.epicfight.EpicFight;
import yesman.epicfight.world.capabilities.item.CapabilityItem;

public class ExCapDataSets
{
public static final ExCapDataEntry SWORD = new ExCapDataEntry(EpicFight.identifier("sword"), ExCapData.builder()
.addConditional(MainConditionals.DEFAULT_1H_WIELD_STYLE.id(), MainConditionals.DUAL_SWORDS.id())
.addMoveset(CapabilityItem.Styles.ONE_HAND, Movesets.sword1HMS.id())
.addMoveset(CapabilityItem.Styles.TWO_HAND, Movesets.sword2HMS.id())
);

public static final ExCapDataEntry AXE = new ExCapDataEntry(EpicFight.identifier("axe"), ExCapData.builder()
.addConditional(MainConditionals.DEFAULT_1H_WIELD_STYLE.id())
.addMoveset(CapabilityItem.Styles.ONE_HAND, Movesets.axeOneHandMS.id())
);

public static final ExCapDataEntry PICKAXE = new ExCapDataEntry(EpicFight.identifier("pickaxe"), ExCapData.builder()
.addConditional(MainConditionals.DEFAULT_1H_WIELD_STYLE.id())
.addMoveset(CapabilityItem.Styles.ONE_HAND, Movesets.axeOneHandMS.id())
);

public static final ExCapDataEntry SHOVEL = new ExCapDataEntry(EpicFight.identifier("shovel"), ExCapData.builder()
.addConditional(MainConditionals.DEFAULT_1H_WIELD_STYLE.id())
.addMoveset(CapabilityItem.Styles.ONE_HAND, Movesets.axeOneHandMS.id())
);

public static final ExCapDataEntry DAGGER = new ExCapDataEntry(EpicFight.identifier("dagger"), ExCapData.builder()
.addConditional(MainConditionals.DEFAULT_1H_WIELD_STYLE.id(), MainConditionals.DUAL_DAGGERS.id())
.addMoveset(CapabilityItem.Styles.ONE_HAND, Movesets.dagger1HMS.id())
.addMoveset(CapabilityItem.Styles.TWO_HAND, Movesets.dagger2HMS.id())
.addMoveset(CapabilityItem.Styles.MOUNT, Movesets.mountedSwordMS.id())
);

public static final ExCapDataEntry SPEAR = new ExCapDataEntry(EpicFight.identifier("spear"), ExCapData.builder()
.addConditional(MainConditionals.DEFAULT_2H_WIELD_STYLE.id(), MainConditionals.SHIELD_OFFHAND.id())
.addMoveset(CapabilityItem.Styles.ONE_HAND, Movesets.spear1HMS.id())
.addMoveset(CapabilityItem.Styles.TWO_HAND, Movesets.spear2HMS.id())
.addMoveset(CapabilityItem.Styles.MOUNT, Movesets.mountedSpearMS.id())
);

public static final ExCapDataEntry GREATSWORD = new ExCapDataEntry(EpicFight.identifier("greatsword"), ExCapData.builder()
.addConditional(MainConditionals.DEFAULT_2H_WIELD_STYLE.id())
.addMoveset(CapabilityItem.Styles.TWO_HAND, Movesets.greatsword2HMS.id())
);

public static final ExCapDataEntry LONGSWORD = new ExCapDataEntry(EpicFight.identifier("longsword"), ExCapData.builder()
.addConditional(MainConditionals.DEFAULT_2H_WIELD_STYLE.id(), MainConditionals.SHIELD_OFFHAND.id(), MainConditionals.LIECHTENAUER_CONDITION.id())
.addMoveset(CapabilityItem.Styles.ONE_HAND, Movesets.longsword1HMS.id())
.addMoveset(CapabilityItem.Styles.TWO_HAND, Movesets.longsword2HMS.id())
.addMoveset(CapabilityItem.Styles.OCHS, Movesets.liechtenauerMS.id())
);

public static final ExCapDataEntry TACHI = new ExCapDataEntry(EpicFight.identifier("tachi"), ExCapData.builder()
.addConditional(MainConditionals.DEFAULT_2H_WIELD_STYLE.id())
.addMoveset(CapabilityItem.Styles.TWO_HAND, Movesets.tachi2HMS.id())
.addMoveset(CapabilityItem.Styles.MOUNT, Movesets.mountedSwordMS.id())
);

public static final ExCapDataEntry UCHIGATANA = new ExCapDataEntry(EpicFight.identifier("uchigatana"), ExCapData.builder()
.addConditional(MainConditionals.DEFAULT_2H_WIELD_STYLE.id(), MainConditionals.UCHIGATANA_SHEATHED.id())
.addMoveset(CapabilityItem.Styles.TWO_HAND, Movesets.uchigatanaBase.id())
.addMoveset(CapabilityItem.Styles.SHEATH, Movesets.uchigatanaSheathed.id())
.addMoveset(CapabilityItem.Styles.MOUNT, Movesets.mountedSwordMS.id())
);

public static final ExCapDataEntry HOE = new ExCapDataEntry(EpicFight.identifier("hoe"), ExCapData.builder()
.addConditional(MainConditionals.DEFAULT_1H_WIELD_STYLE.id())
.addMoveset(CapabilityItem.Styles.ONE_HAND, Movesets.sword1HMS.id())
);

public static final ExCapDataEntry BOW = new ExCapDataEntry(EpicFight.identifier("bow"), ExCapData.builder()
.addConditional(MainConditionals.DEFAULT_1H_WIELD_STYLE.id())
.addMoveset(CapabilityItem.Styles.ONE_HAND, Movesets.bow.id())
);

public static final ExCapDataEntry CROSSBOW = new ExCapDataEntry(EpicFight.identifier("crossbow"), ExCapData.builder()
.addConditional(MainConditionals.DEFAULT_2H_WIELD_STYLE.id())
.addMoveset(CapabilityItem.Styles.TWO_HAND, Movesets.crossBow.id())
);

public static final ExCapDataEntry FIST = new ExCapDataEntry(EpicFight.identifier("fist"), ExCapData.builder()
.addConditional(MainConditionals.DEFAULT_1H_WIELD_STYLE.id())
.addMoveset(CapabilityItem.Styles.ONE_HAND, Movesets.glove.id())
);

public static final ExCapDataEntry SHIELD = new ExCapDataEntry(EpicFight.identifier("shield"), ExCapData.builder()
.addConditional(MainConditionals.DEFAULT_1H_WIELD_STYLE.id())
.addMoveset(CapabilityItem.Styles.ONE_HAND, Movesets.shield.id())
);

public static final ExCapDataEntry TRIDENT = new ExCapDataEntry(EpicFight.identifier("trident"), ExCapData.builder()
.addConditional(MainConditionals.DEFAULT_1H_WIELD_STYLE.id())
.addMoveset(CapabilityItem.Styles.ONE_HAND, Movesets.tridentMS.id())
);
}
Loading