Advertisement
Guest User

Untitled

a guest
Jun 16th, 2015
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.65 KB | None | 0 0
  1. // Copyright Damir Halilovic 2014 - 2015
  2.  
  3. #include "ProjectWa.h"
  4. #include "DamageTypePhysical.h"
  5. #include "WaSharedCharacter.h"
  6. #include "EnemyPawnBase.h"
  7. #include "WaCharacterBase.h"
  8. #include "EnemyCharacterBase.h"
  9. #include "WeaponBase.h"
  10.  
  11.  
  12. // Sets default values
  13. AWeaponBase::AWeaponBase(const FObjectInitializer& OI)
  14.     : Super(OI)
  15. {
  16.     PrimaryActorTick.bCanEverTick = true;
  17.  
  18.     DamageType = UDamageTypePhysical::StaticClass();
  19.     DamageMultiplier = 1.0f;
  20.  
  21.  
  22.     Mesh = CreateDefaultSubobject<USkeletalMeshComponent>("Mesh");
  23.     if (Mesh != nullptr)
  24.     {
  25.         RootComponent = Mesh;
  26.     }
  27.  
  28.     WeaponDamageArea = CreateDefaultSubobject<UBoxComponent>("DamageArea");
  29.     if (WeaponDamageArea != nullptr)
  30.     {
  31.         WeaponDamageArea->SetBoxExtent(FVector(20.f, 20.f, 20.f), false);
  32.         WeaponDamageArea->AttachTo(RootComponent);
  33.  
  34.        
  35.     }
  36.  
  37. }
  38.  
  39. // Called when the game starts
  40. void AWeaponBase::BeginPlay()
  41. {
  42.     Super::BeginPlay();
  43.     WeaponDamageArea->OnComponentBeginOverlap.AddDynamic(this, &AWeaponBase::OnDamageAreaBeginOverlap);
  44.     WeaponDamageArea->OnComponentEndOverlap.AddDynamic(this, &AWeaponBase::OnDamageAreaEndOverlap);
  45.    
  46. }
  47.  
  48. void AWeaponBase::InitializeWeapon(UCombatComponent* OwnerCombatComponent)
  49. {
  50.     CombatComponent = OwnerCombatComponent;
  51.     SetWeaponVisibility(CombatComponent->bWieldingRanged == IsRanged());
  52. }
  53.  
  54. void AWeaponBase::EndPlay(const EEndPlayReason::Type EndPlayReason)
  55. {
  56.     Super::EndPlay(EndPlayReason);
  57.     WeaponDamageArea->OnComponentBeginOverlap.RemoveDynamic(this, &AWeaponBase::OnDamageAreaBeginOverlap);
  58. }
  59.  
  60. // Called every frame
  61. void AWeaponBase::Tick(float DeltaTime)
  62. {
  63.     Super::Tick(DeltaTime);
  64.  
  65. }
  66.  
  67. APawn* AWeaponBase::GetOwnerPawn()
  68. {
  69.     return CombatComponent == nullptr ? nullptr : Cast<APawn>(CombatComponent->GetOwner());
  70. }
  71.  
  72. void AWeaponBase::OnDamageAreaBeginOverlap(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
  73. {
  74.     if (!bDoingDamage)
  75.     {
  76.         OverlappingActors.Add(OtherActor);
  77.     }
  78.     else
  79.     {
  80.         APawn* OwnerPawn = GetOwnerPawn();
  81.         if (OwnerPawn == nullptr)
  82.         {
  83.             UE_LOG(WaGeneral, Error, TEXT("The owner pawn of a weapon is null."));
  84.             return;
  85.         }
  86.  
  87.         ProcessDamage(OtherActor, OwnerPawn);
  88.     }  
  89. }
  90.  
  91. void AWeaponBase::OnDamageAreaEndOverlap(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex)
  92. {
  93.     OverlappingActors.RemoveSingleSwap(OtherActor);
  94. }
  95.  
  96. void AWeaponBase::ProcessDamageOnOverlapping()
  97. {
  98.     if (OverlappingActors.Num() > 0)
  99.     {
  100.         APawn* OwnerPawn = GetOwnerPawn();
  101.         if (OwnerPawn == nullptr)
  102.         {
  103.             UE_LOG(WaGeneral, Error, TEXT("The owner pawn of a weapon is null."));
  104.             return;
  105.         }
  106.         for (auto* Actor : OverlappingActors)
  107.         {
  108.             ProcessDamage(Actor, OwnerPawn);
  109.         }
  110.         OverlappingActors.Empty();
  111.     }
  112. }
  113.  
  114. bool AWeaponBase::ProcessDamage(AActor* OtherActor, APawn* OwnerPawn, const bool bIsProjectile)
  115. {
  116.     if (OtherActor != nullptr && (bDoingDamage || bIsProjectile) && OtherActor != OwnerPawn && IsHostile(OtherActor) && !DamagedActors.Contains(OtherActor))
  117.     {
  118.         float Damage = CombatComponent->GetWeaponDamage(DamageType, DamageMultiplier);
  119.         float Force = WeaponForce;
  120.  
  121.         if (DamageMultiplierCurve != nullptr)
  122.         {
  123.             Damage *= DamageMultiplierCurve->GetFloatValue(CombatComponent->ConsequentAttacks - 1);
  124.         }
  125.  
  126.         if (ForceMultiplierCurve != nullptr)
  127.         {
  128.             Force *= ForceMultiplierCurve->GetFloatValue(CombatComponent->ConsequentAttacks - 1);
  129.         }
  130.  
  131.         FDamageEvent Event(DamageType);
  132.  
  133.         if (OtherActor->IsA(AWaSharedCharacter::StaticClass()))
  134.         {
  135.             AWaSharedCharacter* WaCharacter = Cast<AWaSharedCharacter>(OtherActor);
  136.             WaCharacter->TakeDamageWithStatusEffects(Damage, DamageType, OwnerPawn->GetController(), OwnerPawn, Force, GetOnHitTargetStatusEffects());
  137.         }
  138.         else if (OtherActor->IsA(AEnemyPawnBase::StaticClass()))
  139.         {
  140.             AEnemyPawnBase* EnemyPawn = Cast<AEnemyPawnBase>(OtherActor);
  141.             EnemyPawn->TakeDamageWithStatusEffects(Damage, DamageType, OwnerPawn->GetController(), OwnerPawn, Force, GetOnHitTargetStatusEffects());
  142.         }
  143.         else if (OtherActor->IsA(AEnemyCharacterBase::StaticClass()))
  144.         {
  145.             AEnemyCharacterBase* EnemyCharacter = Cast<AEnemyCharacterBase>(OtherActor);
  146.             EnemyCharacter->TakeDamageWithStatusEffects(Damage, DamageType, OwnerPawn->GetController(), OwnerPawn, Force, GetOnHitTargetStatusEffects());
  147.         }
  148.         else
  149.         {
  150.             UE_LOG(WaGeneral, Warning, TEXT("Hit something that shouldn't be possible to hit: %s"), *OtherActor->GetName());
  151.         }
  152.  
  153.         CombatComponent->ApplyStatusEffects(GetOnHitSelfStatusEffects());
  154.  
  155.         DamagedActors.Add(OtherActor);
  156.  
  157.         return true;
  158.     }
  159.     else if (DamagedActors.Contains(OtherActor))
  160.     {
  161.         UE_LOG(WaGeneral, Log, TEXT("The damaged actors for this swing already contains %s"), *OtherActor->GetName());
  162.         return false;
  163.     }
  164.  
  165.  
  166.     return false;
  167. }
  168.  
  169. TArray<UStatusEffect*> AWeaponBase::GetOnHitTargetStatusEffects()
  170. {
  171.     TArray<UStatusEffect*> StatusEffects;
  172.    
  173.     for (FWeaponEnhancement Enhancement : Enhancements)
  174.     {
  175.         float Chance = FMath::FRand();
  176.         if (Chance <= Enhancement.ChanceToApply)
  177.         {
  178.             if (Enhancement.ApplicationTarget == EEnhancementTarget::ET_TARGET)
  179.             {
  180.                 StatusEffects.Add(Enhancement.Effect);
  181.             }
  182.         }
  183.     }
  184.  
  185.     return StatusEffects;
  186. }
  187.  
  188. TArray<UStatusEffect*> AWeaponBase::GetOnHitSelfStatusEffects()
  189. {
  190.     TArray<UStatusEffect*> StatusEffects;
  191.  
  192.     for (FWeaponEnhancement Enhancement : Enhancements)
  193.     {
  194.         float Chance = FMath::FRand();
  195.         if (Chance <= Enhancement.ChanceToApply)
  196.         {
  197.             if (Enhancement.ApplicationTarget == EEnhancementTarget::ET_SELF)
  198.             {
  199.                 StatusEffects.Add(Enhancement.Effect);
  200.             }
  201.         }
  202.     }
  203.  
  204.     return StatusEffects;
  205. }
  206.  
  207. void AWeaponBase::ClearDamagedActors()
  208. {
  209.     DamagedActors.Empty();
  210. }
  211.  
  212. float AWeaponBase::GetSwingStaminaCost(int32 SubsequentSwing)
  213. {
  214.     if (StaminaCostMultiplierCurve == nullptr)
  215.     {
  216.         return StaminaCost;
  217.     }
  218.     else
  219.     {
  220.         return StaminaCost * StaminaCostMultiplierCurve->GetFloatValue(SubsequentSwing);
  221.     }
  222. }
  223.  
  224.  
  225.  
  226. void AWeaponBase::SetWeaponVisibility(bool bVisible)
  227. {
  228.     bIsVisible = bVisible; 
  229.     RootComponent->SetVisibility(bIsVisible, true);
  230.     SetActorHiddenInGame(!bIsVisible);
  231.     SetActorEnableCollision(bIsVisible);
  232.     SetActorTickEnabled(bIsVisible);
  233.     //bHiddenEd = !bIsVisible;
  234.  
  235.  
  236. #if WITH_EDITOR
  237.     SetIsTemporarilyHiddenInEditor(!bIsVisible);
  238. #endif
  239.  
  240.     FString VisibilityString = bVisible ? "True" : "False";
  241.     UE_LOG(WaGeneral, Log, TEXT("Setting the visibility of %s to %s"), *GetName(), *VisibilityString);
  242. }
  243.  
  244. bool AWeaponBase::GetWeaponVisibility()
  245. {
  246.     return bIsVisible;
  247. }
  248.  
  249. bool AWeaponBase::IsRanged()
  250. {
  251.     return this->IsA(ARangedWeaponBase::StaticClass());
  252. }
  253.  
  254. bool AWeaponBase::IsHostile(AActor* OtherActor) const
  255. {
  256.     return CombatComponent->IsHostile(OtherActor);
  257. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement