// Console commands of build mode, crafting and the inventory (DESIGN_UE.md section 9.3, M7): Descent.Build.*, Descent.Craft, Descent.Inventory.Give, Descent.Hotbar.Assign. #include "Debug/DescentCommandUtil.h" #include "Systems/DescentBuild.h" #include "Systems/DescentCraft.h" #include "TheDescent.h" #include "Engine/World.h" #include "HAL/IConsoleManager.h" namespace { void CmdBuildGive(const TArray& Args, UWorld* World) { UDescentBuildSubsystem* S = UDescentBuildSubsystem::Get(World); if (!S || Args.Num() < 1 || !Descent::Build::FindKit(FName(*Args[0]))) { Descent::Cmd::Fail(World, TEXT("Descent.Build.Give"), TEXT("usage: Descent.Build.Give [n] (fabricator refinery locker rack arm1 arm2 light table chair shelf couch bunk)")); return; } S->AddKit(FName(*Args[0]), Args.Num() > 1 ? FCString::Atoi(*Args[1]) : 1); } void CmdBuildGhost(const TArray& Args, UWorld* World) { UDescentBuildSubsystem* S = UDescentBuildSubsystem::Get(World); FString Why = TEXT("usage: Descent.Build.Ghost "); if (!S || Args.Num() < 1 || !S->BeginGhost(FName(*Args[0]), &Why)) { Descent::Cmd::Fail(World, TEXT("Descent.Build.Ghost"), *Why); } } void CmdBuildAim(const TArray& Args, UWorld* World) { UDescentBuildSubsystem* S = UDescentBuildSubsystem::Get(World); TArray N; if (!S || !Descent::Cmd::ParseNumbers(Args, 0, 3, N)) { Descent::Cmd::Fail(World, TEXT("Descent.Build.Aim"), TEXT("usage: Descent.Build.Aim x y z [nx ny nz] (carrier-local metres; the normal defaults to up)")); return; } TArray Nn; const bool bNormal = Args.Num() >= 6 && Descent::Cmd::ParseNumbers(Args, 3, 3, Nn); S->SetDebugAim(FVector(N[0], N[1], N[2]), bNormal ? FVector(Nn[0], Nn[1], Nn[2]) : FVector::UpVector); } void CmdBuildRotate(const TArray& Args, UWorld* World) { if (UDescentBuildSubsystem* S = UDescentBuildSubsystem::Get(World)) { S->RotateGhost(Args.Num() > 0 ? FCString::Atoi(*Args[0]) : 1); } } void CmdBuildPlace(const TArray&, UWorld* World) { UDescentBuildSubsystem* S = UDescentBuildSubsystem::Get(World); FString Why = TEXT("no build subsystem"); if (!S || !S->ConfirmGhost(&Why)) { Descent::Cmd::Fail(World, TEXT("Descent.Build.Place"), *Why); } } void CmdBuildCancel(const TArray&, UWorld* World) { if (UDescentBuildSubsystem* S = UDescentBuildSubsystem::Get(World)) { S->CancelGhost(); } } void CmdBuildPickup(const TArray& Args, UWorld* World) { UDescentBuildSubsystem* S = UDescentBuildSubsystem::Get(World); ADescentPlaceable* P = nullptr; if (S && Args.Num() > 0) { P = Args[0].IsNumeric() ? S->FindPlaced(FCString::Atoi(*Args[0])) : S->FindFirst(FName(*Args[0])); } FString Why = TEXT("usage: Descent.Build.Pickup (no such placed object)"); if (!S || !P || !S->PickUp(P, &Why)) { Descent::Cmd::Fail(World, TEXT("Descent.Build.Pickup"), *Why); } } void CmdBuildSpawn(const TArray& Args, UWorld* World) { UDescentBuildSubsystem* S = UDescentBuildSubsystem::Get(World); TArray N; if (!S || Args.Num() < 5 || !Descent::Cmd::ParseNumbers(Args, 1, 4, N) || !S->Spawn(FName(*Args[0]), FVector(N[0], N[1], N[2]), N[3])) { Descent::Cmd::Fail(World, TEXT("Descent.Build.Spawn"), TEXT("usage: Descent.Build.Spawn x y z yaw (carrier-local metres, no validity check)")); } } void CmdCraft(const TArray& Args, UWorld* World) { UDescentCraftSubsystem* S = UDescentCraftSubsystem::Get(World); FString Why = TEXT("usage: Descent.Craft "); if (!S || Args.Num() < 1 || !S->Craft(FName(*Args[0].ToLower()), &Why)) { Descent::Cmd::Fail(World, TEXT("Descent.Craft"), *Why); } } void CmdInventoryGive(const TArray& Args, UWorld* World) { UDescentCraftSubsystem* S = UDescentCraftSubsystem::Get(World); if (!S || Args.Num() < 1 || !S->AddItem(FName(*Args[0].ToLower()), Args.Num() > 1 ? FCString::Atoi(*Args[1]) : 1)) { Descent::Cmd::Fail(World, TEXT("Descent.Inventory.Give"), TEXT("usage: Descent.Inventory.Give [n]")); } } void CmdHotbarAssign(const TArray& Args, UWorld* World) { UDescentCraftSubsystem* S = UDescentCraftSubsystem::Get(World); if (!S || Args.Num() < 2 || !S->AssignHotbar(FCString::Atoi(*Args[0]), FName(*Args[1].ToLower()))) { Descent::Cmd::Fail(World, TEXT("Descent.Hotbar.Assign"), TEXT("usage: Descent.Hotbar.Assign (the item must be in the inventory)")); } } FAutoConsoleCommandWithWorldAndArgs GBuildCmdGive(TEXT("Descent.Build.Give"), TEXT("Descent.Build.Give [n] - put kits into storage"), FConsoleCommandWithWorldAndArgsDelegate::CreateStatic(&CmdBuildGive)); FAutoConsoleCommandWithWorldAndArgs GBuildCmdGhost(TEXT("Descent.Build.Ghost"), TEXT("Descent.Build.Ghost - start placing a kit (B, then pick it)"), FConsoleCommandWithWorldAndArgsDelegate::CreateStatic(&CmdBuildGhost)); FAutoConsoleCommandWithWorldAndArgs GBuildCmdAim(TEXT("Descent.Build.Aim"), TEXT("Descent.Build.Aim x y z [nx ny nz] - pin the ghost at a carrier-local point"), FConsoleCommandWithWorldAndArgsDelegate::CreateStatic(&CmdBuildAim)); FAutoConsoleCommandWithWorldAndArgs GBuildCmdRotate(TEXT("Descent.Build.Rotate"), TEXT("Descent.Build.Rotate [steps] - turn the ghost by 15 degree steps (Q / E)"), FConsoleCommandWithWorldAndArgsDelegate::CreateStatic(&CmdBuildRotate)); FAutoConsoleCommandWithWorldAndArgs GBuildCmdPlace(TEXT("Descent.Build.Place"), TEXT("Descent.Build.Place - confirm the ghost (LMB)"), FConsoleCommandWithWorldAndArgsDelegate::CreateStatic(&CmdBuildPlace)); FAutoConsoleCommandWithWorldAndArgs GBuildCmdCancel(TEXT("Descent.Build.Cancel"), TEXT("Descent.Build.Cancel - leave build mode (RMB)"), FConsoleCommandWithWorldAndArgsDelegate::CreateStatic(&CmdBuildCancel)); FAutoConsoleCommandWithWorldAndArgs GBuildCmdPickup(TEXT("Descent.Build.Pickup"), TEXT("Descent.Build.Pickup - pick a placed object up (hold E)"), FConsoleCommandWithWorldAndArgsDelegate::CreateStatic(&CmdBuildPickup)); FAutoConsoleCommandWithWorldAndArgs GBuildCmdSpawn(TEXT("Descent.Build.Spawn"), TEXT("Descent.Build.Spawn x y z yaw - place without a kit or a check"), FConsoleCommandWithWorldAndArgsDelegate::CreateStatic(&CmdBuildSpawn)); FAutoConsoleCommandWithWorldAndArgs GCmdCraft(TEXT("Descent.Craft"), TEXT("Descent.Craft - build a fabricator recipe"), FConsoleCommandWithWorldAndArgsDelegate::CreateStatic(&CmdCraft)); FAutoConsoleCommandWithWorldAndArgs GCmdInventoryGive(TEXT("Descent.Inventory.Give"), TEXT("Descent.Inventory.Give [n]"), FConsoleCommandWithWorldAndArgsDelegate::CreateStatic(&CmdInventoryGive)); FAutoConsoleCommandWithWorldAndArgs GCmdHotbarAssign(TEXT("Descent.Hotbar.Assign"), TEXT("Descent.Hotbar.Assign "), FConsoleCommandWithWorldAndArgsDelegate::CreateStatic(&CmdHotbarAssign)); }