// Copyright 2016 Mookie. All Rights Reserved. #include "EBWeaponDataFactory.h" #include "EBWeaponData.h" #include "EBWeaponConfiguration.h" #include "AssetToolsModule.h" #include "EasyBallisticsEditor.h" #define LOCTEXT_NAMESPACE "EBWeaponDataFactory" UEBWeaponDataFactory::UEBWeaponDataFactory() { bCreateNew = true; bEditAfterNew = true; SupportedClass = UEBWeaponData::StaticClass(); } UObject* UEBWeaponDataFactory::FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn) { UEBWeaponData* WeaponData = NewObject(InParent, Class, Name, Flags); if (WeaponData) { // Set up default configuration based on name FString AssetName = Name.ToString(); if (AssetName.Contains(TEXT("M4")) || AssetName.Contains(TEXT("AR15")) || AssetName.Contains(TEXT("Rifle"))) { // Configure for M4/AR-15 type weapon WeaponData->WeaponName = FText::FromString(TEXT("M4 Carbine")); WeaponData->WeaponDescription = FText::FromString(TEXT("5.56mm assault rifle with selective fire capabilities")); WeaponData->WeaponType = EWeaponType::Rifle; WeaponData->WeaponTier = 3; WeaponData->Damage = 35.0f; WeaponData->FireRate = 750.0f; WeaponData->MuzzleVelocity = 91440.0f; // ~3000 fps WeaponData->Accuracy = 0.92f; WeaponData->RecoilStrength = 1.2f; WeaponData->EffectiveRange = 400.0f; WeaponData->MagazineSize = 30; WeaponData->MaxReserveAmmo = 180; WeaponData->ReloadTime = 2.5f; WeaponData->TacticalReloadTime = 2.0f; WeaponData->AvailableFireModes.Add(EFireMode::FM_Semiauto); WeaponData->AvailableFireModes.Add(EFireMode::FM_Auto); WeaponData->DefaultFireMode = EFireMode::FM_Auto; WeaponData->WeaponWeight = 3.4f; WeaponData->ADSTime = 0.35f; WeaponData->EquipTime = 0.8f; } else if (AssetName.Contains(TEXT("AK")) || AssetName.Contains(TEXT("74"))) { // Configure for AK type weapon WeaponData->WeaponName = FText::FromString(TEXT("AK-74")); WeaponData->WeaponDescription = FText::FromString(TEXT("5.45mm assault rifle with proven reliability")); WeaponData->WeaponType = EWeaponType::Rifle; WeaponData->WeaponTier = 3; WeaponData->Damage = 32.0f; WeaponData->FireRate = 650.0f; WeaponData->MuzzleVelocity = 88500.0f; // ~2900 fps WeaponData->Accuracy = 0.88f; WeaponData->RecoilStrength = 1.4f; WeaponData->EffectiveRange = 350.0f; WeaponData->MagazineSize = 30; WeaponData->MaxReserveAmmo = 180; WeaponData->ReloadTime = 2.8f; WeaponData->TacticalReloadTime = 2.2f; WeaponData->AvailableFireModes.Add(EFireMode::FM_Semiauto); WeaponData->AvailableFireModes.Add(EFireMode::FM_Auto); WeaponData->DefaultFireMode = EFireMode::FM_Auto; WeaponData->WeaponWeight = 3.6f; WeaponData->ADSTime = 0.4f; WeaponData->EquipTime = 0.9f; } else if (AssetName.Contains(TEXT("Pistol")) || AssetName.Contains(TEXT("Glock")) || AssetName.Contains(TEXT("1911"))) { // Configure for pistol WeaponData->WeaponName = FText::FromString(TEXT("M1911")); WeaponData->WeaponDescription = FText::FromString(TEXT(".45 ACP semi-automatic pistol")); WeaponData->WeaponType = EWeaponType::Pistol; WeaponData->WeaponTier = 2; WeaponData->Damage = 55.0f; WeaponData->FireRate = 350.0f; WeaponData->MuzzleVelocity = 76200.0f; // ~2500 fps WeaponData->Accuracy = 0.85f; WeaponData->RecoilStrength = 2.0f; WeaponData->EffectiveRange = 80.0f; WeaponData->MagazineSize = 7; WeaponData->MaxReserveAmmo = 35; WeaponData->ReloadTime = 1.8f; WeaponData->TacticalReloadTime = 1.5f; WeaponData->AvailableFireModes.Add(EFireMode::FM_Semiauto); WeaponData->DefaultFireMode = EFireMode::FM_Semiauto; WeaponData->WeaponWeight = 1.1f; WeaponData->ADSTime = 0.2f; WeaponData->EquipTime = 0.4f; } else if (AssetName.Contains(TEXT("Sniper")) || AssetName.Contains(TEXT("Bolt"))) { // Configure for bolt-action sniper rifle WeaponData->WeaponName = FText::FromString(TEXT("M24 SWS")); WeaponData->WeaponDescription = FText::FromString(TEXT("7.62mm bolt-action sniper rifle")); WeaponData->WeaponType = EWeaponType::Sniper; WeaponData->WeaponTier = 4; WeaponData->Damage = 120.0f; WeaponData->FireRate = 60.0f; WeaponData->MuzzleVelocity = 108000.0f; // ~3540 fps WeaponData->Accuracy = 0.98f; WeaponData->RecoilStrength = 3.5f; WeaponData->EffectiveRange = 800.0f; WeaponData->MagazineSize = 5; WeaponData->MaxReserveAmmo = 30; WeaponData->ReloadTime = 3.5f; WeaponData->TacticalReloadTime = 3.0f; WeaponData->AvailableFireModes.Add(EFireMode::FM_Manual); WeaponData->DefaultFireMode = EFireMode::FM_Manual; WeaponData->WeaponWeight = 5.5f; WeaponData->ADSTime = 0.6f; WeaponData->EquipTime = 1.2f; } else if (AssetName.Contains(TEXT("Shotgun"))) { // Configure for shotgun WeaponData->WeaponName = FText::FromString(TEXT("M870")); WeaponData->WeaponDescription = FText::FromString(TEXT("12-gauge pump-action shotgun")); WeaponData->WeaponType = EWeaponType::Shotgun; WeaponData->WeaponTier = 2; WeaponData->Damage = 80.0f; WeaponData->FireRate = 120.0f; WeaponData->MuzzleVelocity = 38100.0f; // ~1250 fps WeaponData->Accuracy = 0.6f; WeaponData->RecoilStrength = 4.0f; WeaponData->EffectiveRange = 50.0f; WeaponData->MagazineSize = 8; WeaponData->MaxReserveAmmo = 40; WeaponData->ReloadTime = 4.0f; WeaponData->TacticalReloadTime = 3.5f; WeaponData->AvailableFireModes.Add(EFireMode::FM_Manual); WeaponData->DefaultFireMode = EFireMode::FM_Manual; WeaponData->WeaponWeight = 3.2f; WeaponData->ADSTime = 0.45f; WeaponData->EquipTime = 0.9f; } else if (AssetName.Contains(TEXT("LMG")) || AssetName.Contains(TEXT("Machine"))) { // Configure for light machine gun WeaponData->WeaponName = FText::FromString(TEXT("M249 SAW")); WeaponData->WeaponDescription = FText::FromString(TEXT("5.56mm light machine gun")); WeaponData->WeaponType = EWeaponType::LMG; WeaponData->WeaponTier = 4; WeaponData->Damage = 28.0f; WeaponData->FireRate = 850.0f; WeaponData->MuzzleVelocity = 91440.0f; // ~3000 fps WeaponData->Accuracy = 0.78f; WeaponData->RecoilStrength = 2.5f; WeaponData->EffectiveRange = 600.0f; WeaponData->MagazineSize = 200; WeaponData->MaxReserveAmmo = 400; WeaponData->ReloadTime = 6.0f; WeaponData->TacticalReloadTime = 5.0f; WeaponData->AvailableFireModes.Add(EFireMode::FM_Auto); WeaponData->DefaultFireMode = EFireMode::FM_Auto; WeaponData->WeaponWeight = 7.5f; WeaponData->ADSTime = 0.8f; WeaponData->EquipTime = 1.5f; } else if (AssetName.Contains(TEXT("SMG")) || AssetName.Contains(TEXT("Sub"))) { // Configure for submachine gun WeaponData->WeaponName = FText::FromString(TEXT("MP5")); WeaponData->WeaponDescription = FText::FromString(TEXT("9mm submachine gun")); WeaponData->WeaponType = EWeaponType::SMG; WeaponData->WeaponTier = 2; WeaponData->Damage = 25.0f; WeaponData->FireRate = 800.0f; WeaponData->MuzzleVelocity = 76200.0f; // ~2500 fps WeaponData->Accuracy = 0.82f; WeaponData->RecoilStrength = 0.8f; WeaponData->EffectiveRange = 150.0f; WeaponData->MagazineSize = 30; WeaponData->MaxReserveAmmo = 120; WeaponData->ReloadTime = 2.2f; WeaponData->TacticalReloadTime = 1.8f; WeaponData->AvailableFireModes.Add(EFireMode::FM_Semiauto); WeaponData->AvailableFireModes.Add(EFireMode::FM_Auto); WeaponData->DefaultFireMode = EFireMode::FM_Auto; WeaponData->WeaponWeight = 2.5f; WeaponData->ADSTime = 0.25f; WeaponData->EquipTime = 0.6f; } else { // Default generic weapon WeaponData->WeaponName = FText::FromString(TEXT("Generic Weapon")); WeaponData->WeaponDescription = FText::FromString(TEXT("A basic weapon configuration")); WeaponData->WeaponType = EWeaponType::Rifle; WeaponData->WeaponTier = 1; WeaponData->Damage = 30.0f; WeaponData->FireRate = 600.0f; WeaponData->MuzzleVelocity = 91440.0f; WeaponData->Accuracy = 0.85f; WeaponData->RecoilStrength = 1.0f; WeaponData->EffectiveRange = 300.0f; WeaponData->MagazineSize = 30; WeaponData->MaxReserveAmmo = 120; WeaponData->ReloadTime = 2.5f; WeaponData->TacticalReloadTime = 2.0f; WeaponData->AvailableFireModes.Add(EFireMode::FM_Semiauto); WeaponData->AvailableFireModes.Add(EFireMode::FM_Auto); WeaponData->DefaultFireMode = EFireMode::FM_Auto; WeaponData->WeaponWeight = 3.5f; WeaponData->ADSTime = 0.3f; WeaponData->EquipTime = 0.75f; } // Set common default values WeaponData->MuzzleSocketName = TEXT("MuzzleSocket"); WeaponData->ScopeSocketName = TEXT("ScopeSocket"); WeaponData->GripSocketName = TEXT("GripSocket"); WeaponData->LaserSocketName = TEXT("LaserSocket"); WeaponData->BurstCount = 3; WeaponData->SprintToFireTime = 0.25f; WeaponData->bUseGPUSimulation = true; WeaponData->bEnableEffectLOD = true; WeaponData->MaxHeatLevel = 100.0f; WeaponData->HeatDecayRate = 10.0f; WeaponData->HeatPerShot = 5.0f; } return WeaponData; } UClass* FEBWeaponDataFactory::GetSupportedClass() const { return UEBWeaponData::StaticClass(); } uint32 FEBWeaponDataFactory::GetCategories() { return FEasyBallisticsEditorModule::GetBallisticsAssetCategory(); } FText FEBWeaponDataFactory::GetAssetDescription(const FAssetData& AssetData) const { return LOCTEXT("EBWeaponDataDescription", "Defines comprehensive weapon properties including visuals, ballistics, audio, VFX, animations, and behavior for game-ready weapons."); } #undef LOCTEXT_NAMESPACE