bool ASGameMode::IsSpawnpointPreferred(APlayerStart* SpawnPoint, AController* Controller) { if (SpawnPoint) { /* Iterate all pawns to check for collision overlaps with the spawn point */ const FVector SpawnLocation = SpawnPoint->GetActorLocation(); for (FConstPawnIterator It = GetWorld()->GetPawnIterator(); It; It++) { ACharacter* OtherPawn = Cast<ACharacter>(*It); if (OtherPawn) { const float CombinedHeight = (SpawnPoint->GetCapsuleComponent()->GetScaledCapsuleHalfHeight() + OtherPawn->GetCapsuleComponent()->GetScaledCapsuleHalfHeight()) * 2.0f; const float CombinedWidth = SpawnPoint->GetCapsuleComponent()->GetScaledCapsuleRadius() + OtherPawn->GetCapsuleComponent()->GetScaledCapsuleRadius(); const FVector OtherLocation = OtherPawn->GetActorLocation(); // Check if player overlaps the playerstart if (FMath::Abs(SpawnLocation.Z - OtherLocation.Z) < CombinedHeight && (SpawnLocation - OtherLocation).Size2D() < CombinedWidth) { return false; } } } /* Check if spawnpoint is exclusive to players */ ASPlayerStart* MyPlayerStart = Cast<ASPlayerStart>(SpawnPoint); if (MyPlayerStart) { return MyPlayerStart->GetIsPlayerOnly() && !Controller->PlayerState->bIsABot; } } return false; }
EBTNodeResult::Type UPBTask_Chase::ExecuteTask(UBehaviorTreeComponent* OwnerComp, uint8* NodeMemory) { ACharacter * PlayerCharacter = UGameplayStatics::GetPlayerCharacter(GetWorld(), 0); AAIController * Controller = Cast<AAIController>(OwnerComp->GetOwner()); Controller->MoveToLocation(PlayerCharacter->GetActorLocation(), 0.2f, true, true, false); return EBTNodeResult::Succeeded; }
void AShooterPlayerController::OnDeathMessage(class AShooterPlayerState* KillerPlayerState, class AShooterPlayerState* KilledPlayerState, const UDamageType* KillerDamageType) { AShooterHUD* ShooterHUD = GetShooterHUD(); if (ShooterHUD) { ShooterHUD->ShowDeathMessage(KillerPlayerState, KilledPlayerState, KillerDamageType); } ULocalPlayer* LocalPlayer = Cast<ULocalPlayer>(Player); if (LocalPlayer && LocalPlayer->GetUniqueNetId().IsValid() && KilledPlayerState->UniqueId.IsValid()) { // if this controller is the player who died, update the hero stat. if (*LocalPlayer->GetUniqueNetId() == *KilledPlayerState->UniqueId) { const auto Events = Online::GetEventsInterface(); const auto Identity = Online::GetIdentityInterface(); if (Events.IsValid() && Identity.IsValid()) { int32 UserIndex = LocalPlayer->ControllerId; TSharedPtr<FUniqueNetId> UniqueID = Identity->GetUniquePlayerId(UserIndex); if (UniqueID.IsValid()) { ACharacter* Pawn = GetCharacter(); check(Pawn); FVector Location = Pawn->GetActorLocation(); FOnlineEventParms Params; Params.Add( TEXT( "SectionId" ), FVariantData( (int32)1 ) ); Params.Add( TEXT( "GameplayModeId" ), FVariantData( (int32)1 ) ); Params.Add( TEXT( "DifficultyLevelId" ), FVariantData( (int32)0 ) ); Params.Add( TEXT( "PlayerRoleId" ), FVariantData( (int32)0 ) ); Params.Add( TEXT( "PlayerWeaponId" ), FVariantData( (int32)0 ) ); Params.Add( TEXT( "EnemyRoleId" ), FVariantData( (int32)0 ) ); Params.Add( TEXT( "EnemyWeaponId" ), FVariantData( (int32)0 ) ); Params.Add( TEXT( "LocationX" ), FVariantData( Location.X ) ); Params.Add( TEXT( "LocationY" ), FVariantData( Location.Y ) ); Params.Add( TEXT( "LocationZ" ), FVariantData( Location.Z ) ); Events->TriggerEvent(*UniqueID, TEXT("PlayerDeath"), Params); } } } } }
void UCheatManager::ChangeSize( float F ) { APawn* Pawn = GetOuterAPlayerController()->GetPawn(); // Note: only works on characters ACharacter *Character = Cast<ACharacter>(Pawn); if (Character) { ACharacter* DefaultCharacter = Character->GetClass()->GetDefaultObject<ACharacter>(); Character->GetCapsuleComponent()->SetCapsuleSize(DefaultCharacter->GetCapsuleComponent()->GetUnscaledCapsuleRadius() * F, DefaultCharacter->GetCapsuleComponent()->GetUnscaledCapsuleHalfHeight() * F); if (Character->GetMesh()) { Character->GetMesh()->SetRelativeScale3D(FVector(F)); } Character->TeleportTo(Character->GetActorLocation(), Character->GetActorRotation()); } }
void AShooterPlayerController::OnKill() { UpdateAchievementProgress(ACH_FRAG_SOMEONE, 100.0f); const auto Events = Online::GetEventsInterface(); const auto Identity = Online::GetIdentityInterface(); if (Events.IsValid() && Identity.IsValid()) { ULocalPlayer* LocalPlayer = Cast<ULocalPlayer>(Player); if (LocalPlayer) { int32 UserIndex = LocalPlayer->ControllerId; TSharedPtr<FUniqueNetId> UniqueID = Identity->GetUniquePlayerId(UserIndex); if (UniqueID.IsValid()) { ACharacter* Pawn = GetCharacter(); // If player is dead, use location stored during pawn cleanup. FVector Location = LastDeathLocation; if (Pawn) { Pawn->GetActorLocation(); } FOnlineEventParms Params; Params.Add( TEXT( "SectionId" ), FVariantData( (int32)1 ) ); Params.Add( TEXT( "GameplayModeId" ), FVariantData( (int32)1 ) ); Params.Add( TEXT( "DifficultyLevelId" ), FVariantData( (int32)0 ) ); Params.Add( TEXT( "PlayerRoleId" ), FVariantData( (int32)0 ) ); Params.Add( TEXT( "PlayerWeaponId" ), FVariantData( (int32)0 ) ); Params.Add( TEXT( "EnemyRoleId" ), FVariantData( (int32)0 ) ); Params.Add( TEXT( "KillTypeId" ), FVariantData( (int32)0 ) ); Params.Add( TEXT( "LocationX" ), FVariantData( Location.X ) ); Params.Add( TEXT( "LocationY" ), FVariantData( Location.Y ) ); Params.Add( TEXT( "LocationZ" ), FVariantData( Location.Z ) ); Params.Add( TEXT( "EnemyWeaponId" ), FVariantData( (int32)0 ) ); Events->TriggerEvent(*UniqueID, TEXT("KillOponent"), Params); } } } }
bool ALabyrinthGameMode::IsSpawnpointPreferred(APlayerStart* SpawnPoint, AController* Player) const { ACharacter* MyPawn = Cast<ACharacter>((*DefaultPawnClass)->GetDefaultObject<ACharacter>()); // TO-DO: Add AI Controller //ALAIController* AIController = Cast<ALAIController>(Player); /*if (AIController != nullptr) { MyPawn = Cast<ACharacter>(BotPawnClass->GetDefaultObject<ACharacter>()); }*/ if (MyPawn) { const FVector SpawnLocation = SpawnPoint->GetActorLocation(); for (FConstPawnIterator It = GetWorld()->GetPawnIterator(); It; It++) { ACharacter* OtherPawn = Cast<ACharacter>(*It); if (OtherPawn && OtherPawn != MyPawn) { const float CombinedHeight = (MyPawn->GetCapsuleComponent()->GetScaledCapsuleHalfHeight() + OtherPawn->GetCapsuleComponent()->GetScaledCapsuleHalfHeight()) * 2.0f; const float CombinedRadius = (MyPawn->GetCapsuleComponent()->GetScaledCapsuleRadius() + OtherPawn->GetCapsuleComponent()->GetScaledCapsuleRadius()); const FVector OtherLocation = OtherPawn->GetActorLocation(); // Check if the player start overlaps this pawn if (FMath::Abs(SpawnLocation.Z - OtherLocation.Z) < CombinedHeight && (SpawnLocation - OtherLocation).Size2D() < CombinedRadius) { return false; } } } } else { return false; } return true; }
void UHUDBlueprintLibrary::FindScreenLocationForWorldLocation(UObject* WorldContextObject, const FVector& InLocation, const float EdgePercent, FVector2D& OutScreenPosition, float& OutRotationAngleDegrees, bool &bIsOnScreen) { bIsOnScreen = false; OutRotationAngleDegrees = 0.f; FVector2D *ScreenPosition = new FVector2D(); UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject); if (!World->IsValidLowLevel()) return; if (GEngine->GameViewport == NULL) return; if (GEngine->GameViewport->Viewport == NULL) return; const FVector2D ViewportSize = FVector2D(GEngine->GameViewport->Viewport->GetSizeXY()); const FVector2D ViewportCenter = FVector2D(ViewportSize.X/2, ViewportSize.Y/2); APlayerController* PlayerController = (WorldContextObject ? UGameplayStatics::GetPlayerController(WorldContextObject, 0) : NULL); ACharacter *PlayerCharacter = static_cast<ACharacter *> (PlayerController->GetPawn()); if (!PlayerCharacter) return; FVector Forward = PlayerCharacter->GetActorForwardVector(); FVector Offset = (InLocation - PlayerCharacter->GetActorLocation()).GetSafeNormal(); float DotProduct = FVector::DotProduct(Forward, Offset); bool bLocationIsBehindCamera = (DotProduct < 0); if (bLocationIsBehindCamera) { // For behind the camera situation, we cheat a little to put the // marker at the bottom of the screen so that it moves smoothly // as you turn around. Could stand some refinement, but results // are decent enough for most purposes. FVector DiffVector = InLocation - PlayerCharacter->GetActorLocation(); FVector Inverted = DiffVector * -1.f; FVector NewInLocation = PlayerCharacter->GetActorLocation() * Inverted; NewInLocation.Z -= 5000; PlayerController->ProjectWorldLocationToScreen(NewInLocation, *ScreenPosition); ScreenPosition->Y = (EdgePercent * ViewportCenter.X) * 2.f; ScreenPosition->X = -ViewportCenter.X - ScreenPosition->X; } PlayerController->ProjectWorldLocationToScreen(InLocation, *ScreenPosition); // Check to see if it's on screen. If it is, ProjectWorldLocationToScreen is all we need, return it. if (ScreenPosition->X >= 0.f && ScreenPosition->X <= ViewportSize.X && ScreenPosition->Y >= 0.f && ScreenPosition->Y <= ViewportSize.Y) { OutScreenPosition = *ScreenPosition; bIsOnScreen = true; return; } *ScreenPosition -= ViewportCenter; float AngleRadians = FMath::Atan2(ScreenPosition->Y, ScreenPosition->X); AngleRadians -= FMath::DegreesToRadians(90.f); OutRotationAngleDegrees = FMath::RadiansToDegrees(AngleRadians) + 180.f; float Cos = cosf(AngleRadians); float Sin = -sinf(AngleRadians); ScreenPosition = new FVector2D(ViewportCenter.X + (Sin * 150.f), ViewportCenter.Y + Cos * 150.f); float m = Cos / Sin; FVector2D ScreenBounds = ViewportCenter * EdgePercent; if (Cos > 0) { ScreenPosition = new FVector2D(ScreenBounds.Y/m, ScreenBounds.Y); } else { ScreenPosition = new FVector2D(-ScreenBounds.Y/m, -ScreenBounds.Y); } if (ScreenPosition->X > ScreenBounds.X) { ScreenPosition = new FVector2D(ScreenBounds.X, ScreenBounds.X*m); } else if (ScreenPosition->X < -ScreenBounds.X) { ScreenPosition = new FVector2D(-ScreenBounds.X, -ScreenBounds.X*m); } *ScreenPosition += ViewportCenter; OutScreenPosition = *ScreenPosition; }
void ABaseController::SearchForTarget() { if (GetPawn() == NULL || StopSearching) { return; } bool canSeePlayer = false; FHitResult hit(ForceInit); FCollisionQueryParams traceParams = FCollisionQueryParams(FName(TEXT("RV_Trace")), true, Self); traceParams.bTraceComplex = true; traceParams.bTraceAsyncScene = true; FVector EnemyLocation = Self->GetActorLocation(); for (FConstPawnIterator i = World->GetPawnIterator(); i; ++i) { ACharacter* poesibleTarget = Cast<ACharacter>(*i); if (poesibleTarget != Cast<ACharacter>(Self) && poesibleTarget != NULL) { FVector possibleTargetLocation = poesibleTarget->GetActorLocation(); bool bHit = World->LineTraceSingleByChannel(hit, Self->EyeLocation, possibleTargetLocation, ECC_Visibility, traceParams); bool bPersistent = true; float LifeTime = 5.f; // @fixme, draw line with thickneES = 2.f? if (bHit && hit.bBlockingHit) { // Red up to the blocking hit, green thereafter //DrawDebugLine(World, Self->EyeLocation, hit.ImpactPoint, FColor::Red, bPersistent, LifeTime); //DrawDebugLine(World, hit.ImpactPoint, possibleTargetLocation, FColor::Green, bPersistent, LifeTime); //DrawDebugPoint(World, hit.ImpactPoint, 16.f, FColor::Red, bPersistent, LifeTime); } else { // no hit means all red //DrawDebugLine(World, Self->EyeLocation, possibleTargetLocation, FLinearColor::Red, bPersistent, LifeTime); } if (hit.GetActor() && hit.GetActor()->GetName() == poesibleTarget->GetName() && hit.bBlockingHit) { if (Self->EState != EnemyState::ES_Searching) TargetsLastKnownPosition = hit.GetActor()->GetActorLocation(); BBComp->SetValue<UBlackboardKeyType_Vector>(TargetsLastKnownPositionID, TargetsLastKnownPosition); float distanceFromPoESibleTarget = FVector::Dist(EnemyLocation, possibleTargetLocation); if (distanceFromPoESibleTarget <= Self->SightRange && distanceFromPoESibleTarget > Self->AttackRange && Self->AttackCompleted) { SetTarget(poesibleTarget, distanceFromPoESibleTarget); ResetFocusActor(); SetState(EnemyState::ES_Chasing, "Chasing"); BBComp->SetValue<UBlackboardKeyType_Bool>(MovedToLastKnownPositionID, false); } else if (distanceFromPoESibleTarget <= Self->AttackRange && Self->AttackCompleted) { Self->AttackStarted = true; Self->AttackCompleted = false; SetTarget(poesibleTarget, distanceFromPoESibleTarget); SetFocusActor(Cast<AActor>(Target)); AttackLocation = poesibleTarget->GetActorLocation(); SetState(EnemyState::ES_Attacking, "Attacking"); BBComp->SetValue<UBlackboardKeyType_Bool>(MovedToLastKnownPositionID, false); } else if (Self->AttackCompleted) { ResetFocusActor(); SetState(EnemyState::ES_Searching, "Searching"); SearchForTargetAtLastKnownPosition(); } } else if (hit.GetActor() && hit.GetActor()->GetName() != poesibleTarget->GetName() && hit.bBlockingHit) { if (Self->EState != EnemyState::ES_Searching) SearchForTargetAtLastKnownPosition(); Self->AttackStarted = false; Self->AttackCompleted = true; ResetFocusActor(); SetState(EnemyState::ES_Searching, "Searching"); } } } }