// Copyright 2016 Mookie. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "Engine/DataAsset.h" #include "Engine/SkeletalMesh.h" #include "Engine/StaticMesh.h" #include "Animation/AnimSequence.h" #include "Animation/AnimBlueprint.h" #include "Sound/SoundCue.h" #include "NiagaraSystem.h" #include "NiagaraComponent.h" #include "NiagaraFunctionLibrary.h" #include "NiagaraDataInterface.h" #include "EBBulletProperties.h" #include "EBBarrel.h" #include "EBWeaponData.generated.h" /** * Weapon Type Classification */ UENUM(BlueprintType) enum class EWeaponType : uint8 { Rifle UMETA(DisplayName = "Rifle"), Pistol UMETA(DisplayName = "Pistol"), Shotgun UMETA(DisplayName = "Shotgun"), SMG UMETA(DisplayName = "SMG"), LMG UMETA(DisplayName = "LMG"), Sniper UMETA(DisplayName = "Sniper"), Launcher UMETA(DisplayName = "Launcher"), Melee UMETA(DisplayName = "Melee"), Special UMETA(DisplayName = "Special") }; /** * Weapon Audio Configuration */ USTRUCT(BlueprintType) struct FWeaponAudio { GENERATED_USTRUCT_BODY() UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio") USoundCue* FireSound; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio") USoundCue* EmptyFireSound; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio") USoundCue* ReloadSound; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio") USoundCue* EquipSound; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio") USoundCue* UnequipSound; FWeaponAudio() { FireSound = nullptr; EmptyFireSound = nullptr; ReloadSound = nullptr; EquipSound = nullptr; UnequipSound = nullptr; } }; /** * Niagara Effect Parameters for Dynamic Control */ USTRUCT(BlueprintType) struct FNiagaraEffectParams { GENERATED_USTRUCT_BODY() /** Effect intensity multiplier */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Parameters", meta = (ClampMin = "0.0", ClampMax = "5.0")) float Intensity = 1.0f; /** Effect scale multiplier */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Parameters", meta = (ClampMin = "0.1", ClampMax = "10.0")) float Scale = 1.0f; /** Effect color tint */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Parameters") FLinearColor ColorTint = FLinearColor::White; /** Custom float parameters */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Parameters") TMap FloatParameters; /** Custom vector parameters */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Parameters") TMap VectorParameters; /** Custom boolean parameters */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Parameters") TMap BoolParameters; }; /** * Advanced Niagara Weapon Visual Effects Configuration */ USTRUCT(BlueprintType) struct FWeaponVFX { GENERATED_USTRUCT_BODY() // === MUZZLE EFFECTS === /** Primary muzzle flash effect */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VFX|Muzzle") UNiagaraSystem* MuzzleFlash; /** Muzzle flash parameters */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VFX|Muzzle") FNiagaraEffectParams MuzzleFlashParams; /** Muzzle smoke effect */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VFX|Muzzle") UNiagaraSystem* MuzzleSmoke; /** Muzzle smoke parameters */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VFX|Muzzle") FNiagaraEffectParams MuzzleSmokeParams; /** Suppressed muzzle effect (when suppressor attached) */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VFX|Muzzle") UNiagaraSystem* SuppressedMuzzleFlash; // === SHELL EJECTION === /** Ejected shell/casing effect */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VFX|Shells") UNiagaraSystem* EjectedShell; /** Shell ejection parameters */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VFX|Shells") FNiagaraEffectParams EjectedShellParams; /** Shell ejection velocity */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VFX|Shells") FVector ShellEjectionVelocity = FVector(200.0f, 100.0f, 50.0f); /** Shell physics material for bouncing sounds */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VFX|Shells") UPhysicalMaterial* ShellPhysicsMaterial; // === PROJECTILE EFFECTS === /** Bullet tracer effect */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VFX|Projectile") UNiagaraSystem* TracerEffect; /** Tracer parameters */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VFX|Projectile") FNiagaraEffectParams TracerParams; /** Bullet trail/wake effect */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VFX|Projectile") UNiagaraSystem* BulletTrail; /** Supersonic crack effect */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VFX|Projectile") UNiagaraSystem* SonicCrack; // === IMPACT EFFECTS === /** Default hit impact effect */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VFX|Impact") UNiagaraSystem* HitImpact; /** Impact parameters */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VFX|Impact") FNiagaraEffectParams HitImpactParams; /** Material-specific impact effects */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VFX|Impact") TMap MaterialImpactEffects; /** Penetration effect (when bullet goes through) */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VFX|Impact") UNiagaraSystem* PenetrationEffect; /** Ricochet effect */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VFX|Impact") UNiagaraSystem* RicochetEffect; // === ADVANCED SETTINGS === /** Enable dynamic weather effects (rain interaction, etc.) */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VFX|Advanced") bool bEnableWeatherEffects = true; /** Enable heat distortion from barrel */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VFX|Advanced") bool bEnableHeatDistortion = true; /** Heat buildup effect from sustained fire */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VFX|Advanced") UNiagaraSystem* BarrelHeatEffect; /** Weapon attachment glow/energy effects */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VFX|Advanced") UNiagaraSystem* AttachmentGlowEffect; /** LOD settings for performance */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VFX|Advanced") float EffectLODDistance = 1000.0f; FWeaponVFX() { // Initialize all effects to null MuzzleFlash = nullptr; MuzzleSmoke = nullptr; SuppressedMuzzleFlash = nullptr; EjectedShell = nullptr; TracerEffect = nullptr; BulletTrail = nullptr; SonicCrack = nullptr; HitImpact = nullptr; PenetrationEffect = nullptr; RicochetEffect = nullptr; BarrelHeatEffect = nullptr; AttachmentGlowEffect = nullptr; ShellPhysicsMaterial = nullptr; ShellEjectionVelocity = FVector(200.0f, 100.0f, 50.0f); bEnableWeatherEffects = true; bEnableHeatDistortion = true; EffectLODDistance = 1000.0f; } }; /** * Weapon Animation Configuration */ USTRUCT(BlueprintType) struct FWeaponAnimations { GENERATED_USTRUCT_BODY() /** First person weapon animations */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Animations|FP") UAnimSequence* FP_Fire; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Animations|FP") UAnimSequence* FP_Reload; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Animations|FP") UAnimSequence* FP_Equip; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Animations|FP") UAnimSequence* FP_Idle; /** Third person character animations */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Animations|TP") UAnimSequence* TP_Fire; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Animations|TP") UAnimSequence* TP_Reload; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Animations|TP") UAnimSequence* TP_Equip; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Animations|TP") UAnimSequence* TP_Idle; /** Animation blueprint for complex animations */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Animations") TSubclassOf WeaponAnimBP; FWeaponAnimations() { FP_Fire = nullptr; FP_Reload = nullptr; FP_Equip = nullptr; FP_Idle = nullptr; TP_Fire = nullptr; TP_Reload = nullptr; TP_Equip = nullptr; TP_Idle = nullptr; WeaponAnimBP = nullptr; } }; /** * Weapon Data Asset - Industry Standard Approach * * This is how AAA games handle weapons: * - Single persistent weapon actor * - All weapon variations as data assets * - Hot-swap meshes, stats, behavior * - No actor spawning/despawning * - Inventory is just array of data references */ UCLASS(BlueprintType, Blueprintable) class EASYBALLISTICS_API UEBWeaponData : public UPrimaryDataAsset { GENERATED_BODY() public: UEBWeaponData(); // ======================================== // WEAPON IDENTITY // ======================================== /** Weapon display name */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Identity") FText WeaponName; /** Weapon description */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Identity") FText WeaponDescription; /** Weapon type classification */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Identity") EWeaponType WeaponType; /** Weapon icon for UI */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Identity") UTexture2D* WeaponIcon; /** Weapon rarity/tier */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Identity") int32 WeaponTier = 1; // ======================================== // VISUAL COMPONENTS // ======================================== /** First person weapon mesh */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Visuals") USkeletalMesh* FirstPersonMesh; /** Third person weapon mesh */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Visuals") USkeletalMesh* ThirdPersonMesh; /** Static mesh fallback */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Visuals") UStaticMesh* StaticMesh; /** Material overrides for weapon customization */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Visuals") TArray MaterialOverrides; // ======================================== // BALLISTICS & PERFORMANCE // ======================================== /** Bullet properties for this weapon */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Ballistics") UEBBulletPropertiesAsset* BulletProperties; /** Damage per shot */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Ballistics", meta = (ClampMin = "1", ClampMax = "1000")) float Damage = 30.0f; /** Fire rate (rounds per minute) */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Ballistics", meta = (ClampMin = "1", ClampMax = "1200")) float FireRate = 600.0f; /** Muzzle velocity in cm/s */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Ballistics", meta = (ClampMin = "10000", ClampMax = "200000")) float MuzzleVelocity = 91440.0f; /** Weapon accuracy (0-1, 1 = perfect) */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Ballistics", meta = (ClampMin = "0.0", ClampMax = "1.0")) float Accuracy = 0.95f; /** Recoil strength */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Ballistics", meta = (ClampMin = "0.0", ClampMax = "10.0")) float RecoilStrength = 1.0f; /** Range in meters */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Ballistics", meta = (ClampMin = "10", ClampMax = "2000")) float EffectiveRange = 300.0f; // ======================================== // MAGAZINE & AMMO // ======================================== /** Magazine capacity */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Magazine", meta = (ClampMin = "1", ClampMax = "200")) int32 MagazineSize = 30; /** Reserve ammo capacity */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Magazine", meta = (ClampMin = "0", ClampMax = "1000")) int32 MaxReserveAmmo = 120; /** Reload time in seconds */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Magazine", meta = (ClampMin = "0.5", ClampMax = "10.0")) float ReloadTime = 2.5f; /** Time for tactical reload (magazine not empty) */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Magazine", meta = (ClampMin = "0.5", ClampMax = "10.0")) float TacticalReloadTime = 2.0f; // ======================================== // FIRE MODES // ======================================== /** Available fire modes */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Fire Modes") TArray AvailableFireModes; /** Default fire mode */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Fire Modes") EFireMode DefaultFireMode = EFireMode::FM_Auto; /** Burst count for burst fire */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Fire Modes", meta = (ClampMin = "2", ClampMax = "10")) int32 BurstCount = 3; // ======================================== // ATTACHMENTS & CUSTOMIZATION // ======================================== /** Socket names for attachments */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Attachments") FName MuzzleSocketName = TEXT("MuzzleSocket"); UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Attachments") FName ScopeSocketName = TEXT("ScopeSocket"); UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Attachments") FName GripSocketName = TEXT("GripSocket"); UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Attachments") FName LaserSocketName = TEXT("LaserSocket"); /** Supported attachment types */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Attachments") TArray SupportedAttachments; // ======================================== // AUDIO & VFX // ======================================== /** Audio configuration */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Audio & VFX") FWeaponAudio AudioConfig; /** Niagara visual effects configuration */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Audio & VFX") FWeaponVFX VFXConfig; // ======================================== // NIAGARA ADVANCED FEATURES // ======================================== /** Global Niagara parameters for this weapon */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Niagara Advanced") FNiagaraEffectParams GlobalEffectParams; /** Enable GPU simulation for high particle counts */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Niagara Advanced") bool bUseGPUSimulation = true; /** Enable distance-based LOD for effects */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Niagara Advanced") bool bEnableEffectLOD = true; /** Custom data interface for weapon stats */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Niagara Advanced") TSubclassOf WeaponDataInterface; /** Heat tracking for barrel effects */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Niagara Advanced") float MaxHeatLevel = 100.0f; /** Heat decay rate per second */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Niagara Advanced") float HeatDecayRate = 10.0f; /** Heat gain per shot */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Niagara Advanced") float HeatPerShot = 5.0f; /** Animation configuration */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Audio & VFX") FWeaponAnimations AnimationConfig; // ======================================== // ADVANCED SETTINGS // ======================================== /** Weapon weight (affects movement speed) */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Advanced", meta = (ClampMin = "0.5", ClampMax = "20.0")) float WeaponWeight = 3.5f; /** ADS (Aim Down Sights) time */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Advanced", meta = (ClampMin = "0.1", ClampMax = "2.0")) float ADSTime = 0.3f; /** Sprint-to-fire time */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Advanced", meta = (ClampMin = "0.1", ClampMax = "1.0")) float SprintToFireTime = 0.25f; /** Draw/Equip time */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Advanced", meta = (ClampMin = "0.2", ClampMax = "3.0")) float EquipTime = 0.75f; /** Whether weapon can be dual-wielded */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Advanced") bool bCanDualWield = false; /** Whether weapon has safety */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Advanced") bool bHasSafety = true; /** Whether weapon supports suppressors */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Advanced") bool bSuppressorCompatible = true; // ======================================== // DEBUG SETTINGS // ======================================== /** Enable debug logging for weapon firing */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Debug") bool bEnableFireDebug = false; /** Size of debug arrows for ballistic visualization */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Debug", meta = (ClampMin = "10.0", ClampMax = "500.0")) float DebugArrowSize = 100.0f; /** Show impact information in debug display */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Debug") bool bDebugImpactInfo = false; /** Enable trajectory debug visualization */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Debug") bool bDebugTrajectory = false; /** Enable physics debug visualization (drag, gravity, wind) */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Debug") bool bDebugPhysics = false; /** Enable performance debug information */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Debug") bool bDebugPerformance = false; /** Enable ballistics debug visualization */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Debug") bool bDebugBallistics = false; /** Enable spalling debug visualization */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Debug") bool bDebugSpalling = false; // ======================================== // UTILITY FUNCTIONS // ======================================== /** Get fire rate in shots per second */ UFUNCTION(BlueprintPure, Category = "Weapon Data") float GetFireRatePerSecond() const { return FireRate / 60.0f; } /** Get time between shots */ UFUNCTION(BlueprintPure, Category = "Weapon Data") float GetTimeBetweenShots() const { return 60.0f / FireRate; } /** Get DPS (Damage Per Second) */ UFUNCTION(BlueprintPure, Category = "Weapon Data") float GetDPS() const { return Damage * GetFireRatePerSecond(); } /** Check if fire mode is supported */ UFUNCTION(BlueprintPure, Category = "Weapon Data") bool IsFireModeSupported(EFireMode FireMode) const { return AvailableFireModes.Contains(FireMode); } /** Get weapon type as string */ UFUNCTION(BlueprintPure, Category = "Weapon Data") FString GetWeaponTypeString() const; /** Get current heat level (0-1) */ UFUNCTION(BlueprintPure, Category = "Weapon Data") float GetHeatLevel() const { return CurrentHeat / MaxHeatLevel; } /** Add heat from firing */ UFUNCTION(BlueprintCallable, Category = "Weapon Data") void AddHeat(float Amount = -1.0f); /** Update heat decay */ UFUNCTION(BlueprintCallable, Category = "Weapon Data") void UpdateHeat(float DeltaTime); /** Is weapon overheated */ UFUNCTION(BlueprintPure, Category = "Weapon Data") bool IsOverheated() const { return CurrentHeat >= MaxHeatLevel; } // ======================================== // DEBUG UTILITY FUNCTIONS // ======================================== /** Enable/disable specific bullet debug category */ UFUNCTION(BlueprintCallable, Category = "Debug") void SetBulletDebugCategory(const FString& CategoryName, bool bEnabled); /** Enable/disable all bullet debug categories */ UFUNCTION(BlueprintCallable, Category = "Debug") void SetAllBulletDebugCategories(bool bEnabled); /** Get current debug configuration as string */ UFUNCTION(BlueprintPure, Category = "Debug") FString GetBulletDebugInfo() const; /** Apply debug settings to connected barrel component */ UFUNCTION(BlueprintCallable, Category = "Debug") void ApplyDebugSettingsToBarrel(class UEBBarrel* Barrel) const; private: /** Current heat level for effects */ float CurrentHeat = 0.0f; /** Get primary data asset ID */ virtual FPrimaryAssetId GetPrimaryAssetId() const override { return FPrimaryAssetId("WeaponData", GetFName()); } };