Skip to content
Open
Show file tree
Hide file tree
Changes from 8 commits
Commits
Show all changes
33 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
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
@@ -0,0 +1,105 @@
package net.forixaim.ex_cap.modules.assets;

import yesman.epicfight.gameasset.ColliderPreset;
import yesman.epicfight.registry.entries.EpicFightSounds;
import yesman.epicfight.world.capabilities.item.*;

public class Builders
{
public static final WeaponCapability.Builder AXE = WeaponCapability.builder()
.category(CapabilityItem.WeaponCategories.AXE)
.hitSound(EpicFightSounds.BLADE_HIT.get())
.collider(ColliderPreset.TOOLS)
.setTierValues(0, 10d, 0.7, 0.3);

public static final WeaponCapability.Builder 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 WeaponCapability.Builder 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 WeaponCapability.Builder 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 WeaponCapability.Builder SHOVEL = WeaponCapability.builder()
.category(CapabilityItem.WeaponCategories.SHOVEL)
.collider(ColliderPreset.TOOLS)
.setTierValues(0, 0d, 0.8, 0.4);

public static final WeaponCapability.Builder SPEAR = WeaponCapability.builder()
.category(CapabilityItem.WeaponCategories.SPEAR)
.swingSound(EpicFightSounds.WHOOSH_ROD.get())
.collider(ColliderPreset.SPEAR)
.canBePlacedOffhand(false)
.reach(1.0F)
.setTierValues(0, 0d, 0.0, 0.0);

public static final WeaponCapability.Builder GREATSWORD = WeaponCapability.builder()
.category(CapabilityItem.WeaponCategories.GREATSWORD)
.collider(ColliderPreset.GREATSWORD)
.swingSound(EpicFightSounds.WHOOSH_BIG.get())
.canBePlacedOffhand(false)
.reach(1.0F)
.setTierValues(0, 0d, 0.0, 0.0);

public static final WeaponCapability.Builder UCHIGATANA = WeaponCapability.builder()
.category(CapabilityItem.WeaponCategories.UCHIGATANA)
.hitSound(EpicFightSounds.BLADE_HIT.get())
.collider(ColliderPreset.UCHIGATANA)
.canBePlacedOffhand(false)
.setTierValues(0, 0d, 0.0, 0.0);

public static final WeaponCapability.Builder TACHI = WeaponCapability.builder()
.category(CapabilityItem.WeaponCategories.TACHI)
.collider(ColliderPreset.TACHI)
.canBePlacedOffhand(false)
.setTierValues(0, 0d, 0.0, 0.0);

public static final WeaponCapability.Builder DAGGER = WeaponCapability.builder()
.category(CapabilityItem.WeaponCategories.DAGGER)
.swingSound(EpicFightSounds.WHOOSH_SMALL.get())
.collider(ColliderPreset.DAGGER)
.setTierValues(0, 0d, 0.0, 0.0);

public static final WeaponCapability.Builder LONGSWORD = WeaponCapability.builder()
.category(CapabilityItem.WeaponCategories.LONGSWORD)
.collider(ColliderPreset.LONGSWORD)
.canBePlacedOffhand(false)
.setTierValues(0, 0d, 0.0, 0.0);

public static final WeaponCapability.Builder FIST = WeaponCapability.builder()
.category(CapabilityItem.WeaponCategories.FIST)
.constructor(GloveCapability::new)
.setTierValues(0, 0d, 0.0, 0.0);

public static final WeaponCapability.Builder BOW =
WeaponCapability.builder()
.zoomInType(CapabilityItem.ZoomInType.USE_TICK)
.constructor(BowCapability::new);

public static final WeaponCapability.Builder CROSSBOW =
WeaponCapability.builder()
.zoomInType(CapabilityItem.ZoomInType.AIMING)
.constructor(CrossbowCapability::new);

public static final WeaponCapability.Builder TRIDENT =
WeaponCapability.builder()
.zoomInType(CapabilityItem.ZoomInType.USE_TICK)
.constructor(TridentCapability::new)
.collider(ColliderPreset.SPEAR)
.category(CapabilityItem.WeaponCategories.TRIDENT);

public static final WeaponCapability.Builder SHIELD = WeaponCapability.builder()
.constructor(ShieldCapability::new)
.category(CapabilityItem.WeaponCategories.SHIELD);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
package net.forixaim.ex_cap.modules.assets;

import net.forixaim.ex_cap.modules.core.data.ExCapData;
import yesman.epicfight.world.capabilities.item.CapabilityItem;

public class ExCapDataSets
{
public static final ExCapData 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())
.build();

public static final ExCapData AXE = ExCapData.builder()
.addConditional(MainConditionals.DEFAULT_1H_WIELD_STYLE.id())
.addMoveset(CapabilityItem.Styles.ONE_HAND, Movesets.axeOneHandMS.id())
.build();

public static final ExCapData PICKAXE = ExCapData.builder()
.addConditional(MainConditionals.DEFAULT_1H_WIELD_STYLE.id())
.addMoveset(CapabilityItem.Styles.ONE_HAND, Movesets.axeOneHandMS.id())
.build();

public static final ExCapData SHOVEL = ExCapData.builder()
.addConditional(MainConditionals.DEFAULT_1H_WIELD_STYLE.id())
.addMoveset(CapabilityItem.Styles.ONE_HAND, Movesets.axeOneHandMS.id())
.build();

public static final ExCapData 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())
.build();

public static final ExCapData 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())
.build();

public static final ExCapData GREATSWORD = ExCapData.builder()
.addConditional(MainConditionals.DEFAULT_2H_WIELD_STYLE.id())
.addMoveset(CapabilityItem.Styles.TWO_HAND, Movesets.greatsword2HMS.id())
.build();

public static final ExCapData 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())
.build();

public static final ExCapData 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())
.build();

public static final ExCapData 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())
.build();

public static final ExCapData HOE = ExCapData.builder()
.addConditional(MainConditionals.DEFAULT_1H_WIELD_STYLE.id())
.addMoveset(CapabilityItem.Styles.ONE_HAND, Movesets.sword1HMS.id())
.build();

public static final ExCapData BOW = ExCapData.builder()
.addConditional(MainConditionals.DEFAULT_1H_WIELD_STYLE.id())
.addMoveset(CapabilityItem.Styles.ONE_HAND, Movesets.bow.id())
.build();

public static final ExCapData CROSSBOW = ExCapData.builder()
.addConditional(MainConditionals.DEFAULT_1H_WIELD_STYLE.id())
.addMoveset(CapabilityItem.Styles.TWO_HAND, Movesets.crossBow.id())
.build();

public static final ExCapData FIST = ExCapData.builder()
.addConditional(MainConditionals.DEFAULT_1H_WIELD_STYLE.id())
.addMoveset(CapabilityItem.Styles.ONE_HAND, Movesets.glove.id())
.build();

public static final ExCapData SHIELD = ExCapData.builder()
.addConditional(MainConditionals.DEFAULT_1H_WIELD_STYLE.id())
.addMoveset(CapabilityItem.Styles.ONE_HAND, Movesets.shield.id())
.build();

public static final ExCapData TRIDENT = ExCapData.builder()
.addConditional(MainConditionals.DEFAULT_1H_WIELD_STYLE.id())
.addMoveset(CapabilityItem.Styles.ONE_HAND, Movesets.tridentMS.id())
.build();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
package net.forixaim.ex_cap.modules.assets;

import net.forixaim.ex_cap.modules.core.data.ConditionalEntry;
import net.forixaim.ex_cap.modules.core.provider.ProviderConditional;
import net.forixaim.ex_cap.modules.core.provider.ProviderConditionalType;
import net.minecraft.world.InteractionHand;
import yesman.epicfight.EpicFight;
import yesman.epicfight.registry.entries.EpicFightSkillDataKeys;
import yesman.epicfight.registry.entries.EpicFightSkills;
import yesman.epicfight.skill.SkillSlots;
import yesman.epicfight.world.capabilities.item.CapabilityItem;

public class MainConditionals
{
public static final ConditionalEntry DEFAULT_1H_WIELD_STYLE =
new ConditionalEntry(
EpicFight.identifier("default_1h_wield_style"),
ProviderConditional.builder()
.setType(ProviderConditionalType.DEFAULT)
.setWieldStyle(CapabilityItem.Styles.ONE_HAND)
.isVisibleOffHand(true)
);

public static final ConditionalEntry DEFAULT_2H_WIELD_STYLE =
new ConditionalEntry(
EpicFight.identifier("default_2h_wield_style"),
ProviderConditional.builder()
.setType(ProviderConditionalType.DEFAULT)
.isVisibleOffHand(false)
.setWieldStyle(CapabilityItem.Styles.TWO_HAND)
);

public static final ConditionalEntry DEFAULT_RANGED =
new ConditionalEntry(
EpicFight.identifier("default_ranged"),
ProviderConditional.builder()
.setType(ProviderConditionalType.DEFAULT)
.isVisibleOffHand(false)
.setWieldStyle(CapabilityItem.Styles.RANGED)
);

public static final ConditionalEntry SHIELD_OFFHAND =
new ConditionalEntry(
EpicFight.identifier("shield_offhand"),
ProviderConditional.builder()
.setType(ProviderConditionalType.WEAPON_CATEGORY)
.setHand(InteractionHand.OFF_HAND)
.setCategory(CapabilityItem.WeaponCategories.SHIELD)
.setWieldStyle(CapabilityItem.Styles.ONE_HAND)
.isVisibleOffHand(true)
);

public static final ConditionalEntry LIECHTENAUER_CONDITION =
new ConditionalEntry(
EpicFight.identifier("liechtenauer_condition"),
ProviderConditional.builder()
.setType(ProviderConditionalType.SKILL_ACTIVATION)
.setSlot(SkillSlots.WEAPON_INNATE)
.setSkillToCheck(EpicFightSkills.LIECHTENAUER.value())
.isVisibleOffHand(false)
.setWieldStyle(CapabilityItem.Styles.OCHS)
);

public static final ConditionalEntry UCHIGATANA_SHEATHED =
new ConditionalEntry(
EpicFight.identifier("uchigatana_sheathed"),
ProviderConditional.builder()
.setType(ProviderConditionalType.DATA_KEY)
.isVisibleOffHand(false)
.setSlot(SkillSlots.WEAPON_PASSIVE)
.setSkillToCheck(EpicFightSkills.BATTOJUTSU_PASSIVE.value())
.setWieldStyle(CapabilityItem.Styles.SHEATH)
.setKey(EpicFightSkillDataKeys.SHEATH)
);

public static final ConditionalEntry DUAL_DAGGERS =
new ConditionalEntry(
EpicFight.identifier("dual_daggers"),
ProviderConditional.builder()
.setType(ProviderConditionalType.WEAPON_CATEGORY)
.setCategory(CapabilityItem.WeaponCategories.DAGGER)
.isVisibleOffHand(true)
.setHand(InteractionHand.OFF_HAND)
.setWieldStyle(CapabilityItem.Styles.TWO_HAND)
);

public static final ConditionalEntry DUAL_SWORDS =
new ConditionalEntry(
EpicFight.identifier("dual_swords"),
ProviderConditional.builder()
.setType(ProviderConditionalType.WEAPON_CATEGORY)
.setCategory(CapabilityItem.WeaponCategories.SWORD)
.isVisibleOffHand(true)
.setHand(InteractionHand.OFF_HAND)
.setWieldStyle(CapabilityItem.Styles.TWO_HAND)
);
}
Loading