diff --git a/Config/Tags/ZeusServerTags.ini b/Config/Tags/ZeusServerTags.ini index fb4e5c0..9c31443 100644 --- a/Config/Tags/ZeusServerTags.ini +++ b/Config/Tags/ZeusServerTags.ini @@ -1,6 +1,18 @@ ; Gerado por ZeusTool tags sync -- tags do ZeusServer p/ o cliente UE. ; NAO editar a mao: regenere com `ZeusTool tags sync `. [/Script/GameplayTags.GameplayTagsList] +GameplayTagList=(Tag="GameplayCue",DevComment="") +GameplayTagList=(Tag="GameplayCue.Zeus",DevComment="") +GameplayTagList=(Tag="GameplayCue.Zeus.Melee",DevComment="") +GameplayTagList=(Tag="GameplayCue.Zeus.Melee.Kick",DevComment="") +GameplayTagList=(Tag="GameplayCue.Zeus.Combat",DevComment="Categoria root de cues compartilhados por TODO melee (reutilizaveis)") +GameplayTagList=(Tag="GameplayCue.Zeus.Combat.Hit",DevComment="Familia de cues do impacto de hit") +GameplayTagList=(Tag="GameplayCue.Zeus.Combat.Hit.Impact",DevComment="Broadcast AOI - SFX impact + VFX sparks na location (todos ouvem)") +GameplayTagList=(Tag="GameplayCue.Zeus.Combat.Hit.React",DevComment="Broadcast AOI - AnimMontage de hit react no target (todos veem)") +GameplayTagList=(Tag="GameplayCue.Zeus.Combat.Hit.Self",DevComment="Unicast - feedback privado do alvo (camera shake, hit flash, rumble)") +GameplayTagList=(Tag="GameplayCue.Zeus.Melee.Kick.Target",DevComment="") +GameplayTagList=(Tag="GameplayCue.Zeus.Movement",DevComment="") +GameplayTagList=(Tag="GameplayCue.Zeus.Movement.Dash",DevComment="") GameplayTagList=(Tag="Zeus",DevComment="") GameplayTagList=(Tag="Zeus.Ability",DevComment="") GameplayTagList=(Tag="Zeus.Ability.Casting",DevComment="") @@ -24,6 +36,7 @@ GameplayTagList=(Tag="Zeus.Attribute.Dex",DevComment="") GameplayTagList=(Tag="Zeus.Attribute.Flee",DevComment="") GameplayTagList=(Tag="Zeus.Attribute.Hit",DevComment="") GameplayTagList=(Tag="Zeus.Attribute.Hp",DevComment="") +GameplayTagList=(Tag="Zeus.Attribute.HpRegenRate",DevComment="") GameplayTagList=(Tag="Zeus.Attribute.Int",DevComment="") GameplayTagList=(Tag="Zeus.Attribute.JobExp",DevComment="") GameplayTagList=(Tag="Zeus.Attribute.JobLevel",DevComment="") @@ -36,7 +49,9 @@ GameplayTagList=(Tag="Zeus.Attribute.MaxSp",DevComment="") GameplayTagList=(Tag="Zeus.Attribute.Mdef",DevComment="") GameplayTagList=(Tag="Zeus.Attribute.SkillPoint",DevComment="") GameplayTagList=(Tag="Zeus.Attribute.Sp",DevComment="") +GameplayTagList=(Tag="Zeus.Attribute.SpRegenRate",DevComment="") GameplayTagList=(Tag="Zeus.Attribute.Stamina",DevComment="") +GameplayTagList=(Tag="Zeus.Attribute.StaminaRegenRate",DevComment="") GameplayTagList=(Tag="Zeus.Attribute.StatusPoint",DevComment="") GameplayTagList=(Tag="Zeus.Attribute.Str",DevComment="") GameplayTagList=(Tag="Zeus.Attribute.Vit",DevComment="") @@ -52,11 +67,6 @@ GameplayTagList=(Tag="Zeus.Combo.Slot3",DevComment="") GameplayTagList=(Tag="Zeus.Combo.Window",DevComment="") GameplayTagList=(Tag="Zeus.Cooldown",DevComment="") GameplayTagList=(Tag="Zeus.Cooldown.FireballRain",DevComment="") -GameplayTagList=(Tag="Zeus.Cue",DevComment="") -GameplayTagList=(Tag="Zeus.Cue.Melee",DevComment="") -GameplayTagList=(Tag="Zeus.Cue.Melee.Kick",DevComment="") -GameplayTagList=(Tag="Zeus.Cue.Movement",DevComment="") -GameplayTagList=(Tag="Zeus.Cue.Movement.Dash",DevComment="") GameplayTagList=(Tag="Zeus.Damage",DevComment="") GameplayTagList=(Tag="Zeus.Damage.Earth",DevComment="") GameplayTagList=(Tag="Zeus.Damage.Fire",DevComment="") @@ -78,6 +88,13 @@ GameplayTagList=(Tag="Zeus.Effect.Cost",DevComment="") GameplayTagList=(Tag="Zeus.Effect.Cost.Sp_10",DevComment="") GameplayTagList=(Tag="Zeus.Effect.Cost.Sp_50",DevComment="") GameplayTagList=(Tag="Zeus.Effect.Cost.Stamina_5",DevComment="") +GameplayTagList=(Tag="Zeus.Effect.Damage",DevComment="") +GameplayTagList=(Tag="Zeus.Effect.Damage.Kick",DevComment="") +GameplayTagList=(Tag="Zeus.State",DevComment="") +GameplayTagList=(Tag="Zeus.State.NoHpRegen",DevComment="") +GameplayTagList=(Tag="Zeus.State.NoRegen",DevComment="") +GameplayTagList=(Tag="Zeus.State.NoSpRegen",DevComment="") +GameplayTagList=(Tag="Zeus.State.NoStaminaRegen",DevComment="") GameplayTagList=(Tag="Zeus.Status",DevComment="") GameplayTagList=(Tag="Zeus.Status.Buff",DevComment="") GameplayTagList=(Tag="Zeus.Status.CC",DevComment="") diff --git a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Back_Med_01.uasset b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Back_Med_01.uasset index 74eb352..d38109e 100644 Binary files a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Back_Med_01.uasset and b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Back_Med_01.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Hvy_01.uasset b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Hvy_01.uasset index 396e9f3..7fc61ce 100644 Binary files a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Hvy_01.uasset and b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Hvy_01.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_01.uasset b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_01.uasset index a6846ff..521bed7 100644 Binary files a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_01.uasset and b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_01.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_02.uasset b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_02.uasset index d0bef37..3012d59 100644 Binary files a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_02.uasset and b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_02.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_03.uasset b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_03.uasset index dca4bc6..78ef916 100644 Binary files a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_03.uasset and b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_03.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_04.uasset b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_04.uasset index d134adb..65b49ba 100644 Binary files a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_04.uasset and b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_04.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Med_01.uasset b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Med_01.uasset index 70302cf..d54a010 100644 Binary files a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Med_01.uasset and b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Med_01.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Med_02.uasset b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Med_02.uasset index fe6d7d6..b6a58b7 100644 Binary files a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Med_02.uasset and b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Med_02.uasset differ diff --git a/Content/ZMMO/Data/Abilities/DT_Abilities.uasset b/Content/ZMMO/Data/Abilities/DT_Abilities.uasset index 5695c36..10c9475 100644 Binary files a/Content/ZMMO/Data/Abilities/DT_Abilities.uasset and b/Content/ZMMO/Data/Abilities/DT_Abilities.uasset differ diff --git a/Content/ZMMO/GAS/Cues/Camera/CS_HitReact.uasset b/Content/ZMMO/GAS/Cues/Camera/CS_HitReact.uasset new file mode 100644 index 0000000..d0b025b Binary files /dev/null and b/Content/ZMMO/GAS/Cues/Camera/CS_HitReact.uasset differ diff --git a/Content/ZMMO/GAS/Cues/GC_Combat_Hit_Impact.uasset b/Content/ZMMO/GAS/Cues/GC_Combat_Hit_Impact.uasset new file mode 100644 index 0000000..cb0445c Binary files /dev/null and b/Content/ZMMO/GAS/Cues/GC_Combat_Hit_Impact.uasset differ diff --git a/Content/ZMMO/GAS/Cues/GC_Combat_Hit_React.uasset b/Content/ZMMO/GAS/Cues/GC_Combat_Hit_React.uasset new file mode 100644 index 0000000..d10d738 Binary files /dev/null and b/Content/ZMMO/GAS/Cues/GC_Combat_Hit_React.uasset differ diff --git a/Content/ZMMO/GAS/Cues/GC_Combat_Hit_Self.uasset b/Content/ZMMO/GAS/Cues/GC_Combat_Hit_Self.uasset new file mode 100644 index 0000000..733d6ac Binary files /dev/null and b/Content/ZMMO/GAS/Cues/GC_Combat_Hit_Self.uasset differ diff --git a/Content/ZMMO/GAS/Cues/GC_Dash.uasset b/Content/ZMMO/GAS/Cues/GC_Dash.uasset index c72c7db..b0a71a9 100644 Binary files a/Content/ZMMO/GAS/Cues/GC_Dash.uasset and b/Content/ZMMO/GAS/Cues/GC_Dash.uasset differ diff --git a/Content/ZMMO/GAS/Cues/GC_Kick.uasset b/Content/ZMMO/GAS/Cues/GC_Kick.uasset index cc400d5..bcb0b1c 100644 Binary files a/Content/ZMMO/GAS/Cues/GC_Kick.uasset and b/Content/ZMMO/GAS/Cues/GC_Kick.uasset differ diff --git a/Content/ZMMO/GAS/Cues/HitReact/AM_HitReact_Heavy.uasset b/Content/ZMMO/GAS/Cues/HitReact/AM_HitReact_Heavy.uasset new file mode 100644 index 0000000..4afdfe7 Binary files /dev/null and b/Content/ZMMO/GAS/Cues/HitReact/AM_HitReact_Heavy.uasset differ diff --git a/Content/ZMMO/GAS/Cues/HitReact/AM_HitReact_Light.uasset b/Content/ZMMO/GAS/Cues/HitReact/AM_HitReact_Light.uasset new file mode 100644 index 0000000..60a662c Binary files /dev/null and b/Content/ZMMO/GAS/Cues/HitReact/AM_HitReact_Light.uasset differ diff --git a/Content/ZMMO/GAS/Cues/HitReact/AM_HitReact_Medium.uasset b/Content/ZMMO/GAS/Cues/HitReact/AM_HitReact_Medium.uasset new file mode 100644 index 0000000..1241f27 Binary files /dev/null and b/Content/ZMMO/GAS/Cues/HitReact/AM_HitReact_Medium.uasset differ diff --git a/Content/ZMMO/GAS/Cues/HitReact/Animations/AS_HitReact.uasset b/Content/ZMMO/GAS/Cues/HitReact/Animations/AS_HitReact.uasset new file mode 100644 index 0000000..406473d Binary files /dev/null and b/Content/ZMMO/GAS/Cues/HitReact/Animations/AS_HitReact.uasset differ diff --git a/Content/ZMMO/Sounds/Combat/SW_Punch_Cartoon.uasset b/Content/ZMMO/Sounds/Combat/SW_Punch_Cartoon.uasset new file mode 100644 index 0000000..3362365 Binary files /dev/null and b/Content/ZMMO/Sounds/Combat/SW_Punch_Cartoon.uasset differ diff --git a/Source/ZMMO/Game/Combat/ZeusAnimNotifyState_BodyHitWindow.cpp b/Source/ZMMO/Game/Combat/ZeusAnimNotifyState_BodyHitWindow.cpp new file mode 100644 index 0000000..f2cbaf7 --- /dev/null +++ b/Source/ZMMO/Game/Combat/ZeusAnimNotifyState_BodyHitWindow.cpp @@ -0,0 +1,46 @@ +// Copyright Zeus Server Engine. All rights reserved. + +#include "ZeusAnimNotifyState_BodyHitWindow.h" + +#include "Components/SkeletalMeshComponent.h" +#include "GameFramework/Actor.h" +#include "Game/Entity/ZeusCharacter.h" + +void UZeusAnimNotifyState_BodyHitWindow::NotifyBegin(USkeletalMeshComponent* MeshComp, + UAnimSequenceBase* /*Animation*/, float /*TotalDuration*/, + const FAnimNotifyEventReference& /*EventReference*/) +{ + if (!MeshComp) { return; } + if (AZeusCharacter* Char = Cast(MeshComp->GetOwner())) + { + Char->SetHitColliderEnabled(Source, /*bEnabled*/ true); + } +} + +void UZeusAnimNotifyState_BodyHitWindow::NotifyEnd(USkeletalMeshComponent* MeshComp, + UAnimSequenceBase* /*Animation*/, const FAnimNotifyEventReference& /*EventReference*/) +{ + if (!MeshComp) { return; } + if (AZeusCharacter* Char = Cast(MeshComp->GetOwner())) + { + Char->SetHitColliderEnabled(Source, /*bEnabled*/ false); + } +} + +#if WITH_EDITOR +FString UZeusAnimNotifyState_BodyHitWindow::GetNotifyName_Implementation() const +{ + const TCHAR* SourceLabel; + switch (Source) + { + case EZeusHitSource::FootR: SourceLabel = TEXT("FootR"); break; + case EZeusHitSource::FootL: SourceLabel = TEXT("FootL"); break; + case EZeusHitSource::HandR: SourceLabel = TEXT("HandR"); break; + case EZeusHitSource::HandL: SourceLabel = TEXT("HandL"); break; + case EZeusHitSource::WeaponR: SourceLabel = TEXT("WeaponR"); break; + case EZeusHitSource::WeaponL: SourceLabel = TEXT("WeaponL"); break; + default: SourceLabel = TEXT("?"); break; + } + return FString::Printf(TEXT("Zeus Body Hit (%s)"), SourceLabel); +} +#endif diff --git a/Source/ZMMO/Game/Combat/ZeusAnimNotifyState_BodyHitWindow.h b/Source/ZMMO/Game/Combat/ZeusAnimNotifyState_BodyHitWindow.h new file mode 100644 index 0000000..53e8fad --- /dev/null +++ b/Source/ZMMO/Game/Combat/ZeusAnimNotifyState_BodyHitWindow.h @@ -0,0 +1,74 @@ +// Copyright Zeus Server Engine. All rights reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "Animation/AnimNotifies/AnimNotifyState.h" +#include "Game/Entity/ZeusCharacter.h" // EZeusHitSource +#include "ZeusAnimNotifyState_BodyHitWindow.generated.h" + +class USkeletalMeshComponent; +class UAnimSequenceBase; + +/** + * AnimNotifyState que liga o HitCollider de uma parte do corpo durante a sua + * janela no montage. NotifyBegin liga + NotifyEnd desliga -- define o HIT + * WINDOW do golpe melee/arma branca. + * + * Generaliza para qualquer parte do corpo via EZeusHitSource: + * - FootR / FootL -> chute (capsule attachado em foot_*_Socket) + * - HandR / HandL -> soco (capsule em HandGrip_*) + * - WeaponR / WeaponL -> arma branca (capsule em weapon_*) + * + * === Como usar === + * + * No editor de um AnimMontage (ex: AM_Kick_Montage): + * 1. Encontrar o frame onde o membro comeca o movimento de impacto. + * 2. Right-click na track de notifies -> Add Notify State -> Zeus Body Hit Window. + * 3. Definir Source = FootR (ou HandR pra soco, WeaponR pra arma, etc). + * 4. Arrastar o range pra cobrir o arco completo do golpe (ex: frame 8 a 18 + * em 30fps = ~330ms de janela). + * + * Pq AnimNotifyState e nao AnimNotify pontual: + * - AnimNotify dispara em UM frame -> nao da' pra detectar entradas no + * capsule durante a janela. + * - AnimNotifyState tem NotifyBegin/NotifyTick/NotifyEnd. Pra "ligar + * collider de frame X ate Y", e' o pattern correto. + * + * === Replicacao === + * + * Roda LOCAL em cada cliente. Cliente do ATIVADOR liga capsule local + reporta + * overlap via opcode MELEE_HIT_REPORT pro server. Server valida e aplica dano + + * dispatcha cue Kick.Target pra todos no AOI do alvo. + * + * Proxies de outros clientes tocam o montage via GameplayCue replicado (visual) + * mas o capsule deles roda no PROXY que e' Pawn local de outra coisa -- nao + * importa, o reportador autoritativo eh quem ativou a ability. + */ +UCLASS(meta = (DisplayName = "Zeus Body Hit Window")) +class ZMMO_API UZeusAnimNotifyState_BodyHitWindow : public UAnimNotifyState +{ + GENERATED_BODY() + +public: + /// Qual parte do corpo (capsule) tem o hit ligado durante a janela. + /// Default = FootR (chute direito e' o golpe mais comum em montages + /// melee unarmed). Trocar pra HandR pra soco, WeaponR pra arma, etc. + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Zeus|Combat") + EZeusHitSource Source = EZeusHitSource::FootR; + + // === AnimNotifyState overrides === + + virtual void NotifyBegin(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, + float TotalDuration, const FAnimNotifyEventReference& EventReference) override; + + virtual void NotifyEnd(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, + const FAnimNotifyEventReference& EventReference) override; + +#if WITH_EDITOR + /// Mostra "Zeus Body Hit (FootR/HandL/WeaponR/...)" no editor de montage em + /// vez do nome generico da classe -- ajuda a identificar qual parte sem + /// abrir details. + virtual FString GetNotifyName_Implementation() const override; +#endif +};