// Fill out your copyright notice in the Description page of Project Settings. #include "Item.h" #include "Components/WidgetComponent.h" #include "ShooterCharacter.h" #include "Components/SphereComponent.h" #include "Components/BoxComponent.h" // Sets default values AItem::AItem(): ItemName(FString("Default")), ItemCount(0), ItemRarity(EItemRarity::EIR_Common), ItemState(EItemState::EIS_Pickup) { // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it. PrimaryActorTick.bCanEverTick = true; ItemMesh = CreateDefaultSubobject(TEXT("ItemMesh")); SetRootComponent(ItemMesh); CollisionBox = CreateDefaultSubobject(TEXT("CollisionBox")); CollisionBox->SetupAttachment(ItemMesh); CollisionBox->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Ignore); CollisionBox->SetCollisionResponseToChannel( ECollisionChannel::ECC_Visibility, ECollisionResponse::ECR_Block); PickupWidget = CreateDefaultSubobject(TEXT("PickupWidget")); PickupWidget->SetupAttachment(GetRootComponent()); AreaSphere = CreateDefaultSubobject(TEXT("AreaSphere")); AreaSphere->SetupAttachment(GetRootComponent()); } // Called when the game starts or when spawned void AItem::BeginPlay() { Super::BeginPlay(); // Hide Pickup Widget if (PickupWidget) { PickupWidget->SetVisibility(false); } // Sets ActiveStars array based on Item Rarity SetActiveStars(); // Setup overlap for AreaSphere AreaSphere->OnComponentBeginOverlap.AddDynamic(this, &AItem::OnSphereOverlap); AreaSphere->OnComponentEndOverlap.AddDynamic(this, &AItem::OnSphereEndOverlap); } void AItem::OnSphereOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) { if (OtherActor) { AShooterCharacter* ShooterCharacter = Cast(OtherActor); if (ShooterCharacter) { ShooterCharacter->IncrementOverlappedItemCount(1); } } } void AItem::OnSphereEndOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex) { if (OtherActor) { AShooterCharacter* ShooterCharacter = Cast(OtherActor); if (ShooterCharacter) { ShooterCharacter->IncrementOverlappedItemCount(-1); } } } void AItem::SetActiveStars() { // The 0 element isn't used for (int32 i = 0; i <= 5; i++) { ActiveStars.Add(false); } switch (ItemRarity) { case EItemRarity::EIR_Damaged: ActiveStars[1] = true; break; case EItemRarity::EIR_Common: ActiveStars[1] = true; ActiveStars[2] = true; break; case EItemRarity::EIR_Uncommon: ActiveStars[1] = true; ActiveStars[2] = true; ActiveStars[3] = true; break; case EItemRarity::EIR_Rare: ActiveStars[1] = true; ActiveStars[2] = true; ActiveStars[3] = true; ActiveStars[4] = true; break; case EItemRarity::EIR_Legendary: ActiveStars[1] = true; ActiveStars[2] = true; ActiveStars[3] = true; ActiveStars[4] = true; ActiveStars[5] = true; break; } } void AItem::SetItemProperties(EItemState State) { switch (State) { case EItemState::EIS_Pickup: // Set mesh properties ItemMesh->SetSimulatePhysics(false); ItemMesh->SetEnableGravity(false); ItemMesh->SetVisibility(true); ItemMesh->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Ignore); ItemMesh->SetCollisionEnabled(ECollisionEnabled::NoCollision); // Set AreaSphere properties AreaSphere->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Overlap); AreaSphere->SetCollisionEnabled(ECollisionEnabled::QueryOnly); // Set CollisionBox properties CollisionBox->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Ignore); CollisionBox->SetCollisionResponseToChannel( ECollisionChannel::ECC_Visibility, ECollisionResponse::ECR_Block); CollisionBox->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics); break; case EItemState::EIS_Equipped: PickupWidget->SetVisibility(false); // Set mesh properties ItemMesh->SetSimulatePhysics(false); ItemMesh->SetEnableGravity(false); ItemMesh->SetVisibility(true); ItemMesh->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Ignore); ItemMesh->SetCollisionEnabled(ECollisionEnabled::NoCollision); // Set AreaSphere properties AreaSphere->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Ignore); AreaSphere->SetCollisionEnabled(ECollisionEnabled::NoCollision); // Set CollisionBox properties CollisionBox->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Ignore); CollisionBox->SetCollisionEnabled(ECollisionEnabled::NoCollision); break; case EItemState::EIS_Falling: // Set mesh properties ItemMesh->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics); ItemMesh->SetSimulatePhysics(true); ItemMesh->SetEnableGravity(true); ItemMesh->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Ignore); ItemMesh->SetCollisionResponseToChannel( ECollisionChannel::ECC_WorldStatic, ECollisionResponse::ECR_Block); // Set AreaSphere properties AreaSphere->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Ignore); AreaSphere->SetCollisionEnabled(ECollisionEnabled::NoCollision); // Set CollisionBox properties CollisionBox->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Ignore); CollisionBox->SetCollisionEnabled(ECollisionEnabled::NoCollision); break; } } void AItem::SetItemState(EItemState State) { ItemState = State; SetItemProperties(State); } // Called every frame void AItem::Tick(float DeltaTime) { Super::Tick(DeltaTime); }