SHOW:
|
|
- or go back to the newest paste.
1 | // Copyright 1998-2014 Epic Games, Inc. All Rights Reserved. | |
2 | ||
3 | #include "InvSystem.h" | |
4 | #include "InvSystemCharacter.h" | |
5 | #include "InvSystemProjectile.h" | |
6 | ||
7 | ////////////////////////////////////////////////////////////////////////// | |
8 | // AInvSystemCharacter | |
9 | ||
10 | AInvSystemCharacter::AInvSystemCharacter(const class FPostConstructInitializeProperties& PCIP) | |
11 | : Super(PCIP) | |
12 | { | |
13 | // Set size for collision capsule | |
14 | CapsuleComponent->InitCapsuleSize(42.f, 96.0f); | |
15 | ||
16 | // set our turn rates for input | |
17 | BaseTurnRate = 45.f; | |
18 | BaseLookUpRate = 45.f; | |
19 | ||
20 | // Create a CameraComponent | |
21 | FirstPersonCameraComponent = PCIP.CreateDefaultSubobject<UCameraComponent>(this, TEXT("FirstPersonCamera")); | |
22 | FirstPersonCameraComponent->AttachParent = CapsuleComponent; | |
23 | FirstPersonCameraComponent->RelativeLocation = FVector(0, 0, 64.f); // Position the camera | |
24 | ||
25 | // Default offset from the character location for projectiles to spawn | |
26 | GunOffset = FVector(100.0f, 30.0f, 10.0f); | |
27 | ||
28 | // Create a mesh component that will be used when being viewed from a '1st person' view (when controlling this pawn) | |
29 | Mesh1P = PCIP.CreateDefaultSubobject<USkeletalMeshComponent>(this, TEXT("CharacterMesh1P")); | |
30 | Mesh1P->SetOnlyOwnerSee(true); // only the owning player will see this mesh | |
31 | Mesh1P->AttachParent = FirstPersonCameraComponent; | |
32 | Mesh1P->RelativeLocation = FVector(0.f, 0.f, -150.f); | |
33 | Mesh1P->bCastDynamicShadow = false; | |
34 | Mesh1P->CastShadow = false; | |
35 | ||
36 | // Note: The ProjectileClass and the skeletal mesh/anim blueprints for Mesh1P are set in the | |
37 | // derived blueprint asset named MyCharacter (to avoid direct content references in C++) | |
38 | ||
39 | MaxUseDistance = 800; | |
40 | bHasNewFocus = true; | |
41 | } | |
42 | ||
43 | /* | |
44 | Performs raytrace to find closest looked-at UsableActor. | |
45 | */ | |
46 | AUsableActor* AInvSystemCharacter::GetUsableInView() | |
47 | { | |
48 | FVector camLoc; | |
49 | FRotator camRot; | |
50 | ||
51 | if (Controller == NULL) | |
52 | return NULL; | |
53 | ||
54 | Controller->GetPlayerViewPoint(camLoc, camRot); | |
55 | const FVector start_trace = camLoc; | |
56 | const FVector direction = camRot.Vector(); | |
57 | const FVector end_trace = start_trace + (direction * MaxUseDistance); | |
58 | ||
59 | FCollisionQueryParams TraceParams(FName(TEXT("")), true, this); | |
60 | TraceParams.bTraceAsyncScene = true; | |
61 | TraceParams.bReturnPhysicalMaterial = false; | |
62 | TraceParams.bTraceComplex = true; | |
63 | ||
64 | FHitResult Hit(ForceInit); | |
65 | GetWorld()->LineTraceSingle(Hit, start_trace, end_trace, COLLISION_PROJECTILE, TraceParams); | |
66 | ||
67 | return Cast<AUsableActor>(Hit.GetActor()); | |
68 | } | |
69 | ||
70 | /* | |
71 | Update actor currently being looked at by player. | |
72 | */ | |
73 | void AInvSystemCharacter::Tick(float DeltaSeconds) | |
74 | { | |
75 | Super::Tick(DeltaSeconds); | |
76 | ||
77 | if (Controller && Controller->IsLocalController()) | |
78 | { | |
79 | AUsableActor* usable = GetUsableInView(); | |
80 | ||
81 | // End Focus | |
82 | if (FocusedUsableActor != usable) | |
83 | { | |
84 | if (FocusedUsableActor) | |
85 | { | |
86 | FocusedUsableActor->EndFocusItem(); | |
87 | } | |
88 | ||
89 | bHasNewFocus = true; | |
90 | } | |
91 | ||
92 | // Assign new Focus | |
93 | FocusedUsableActor = usable; | |
94 | ||
95 | // Start Focus. | |
96 | if (usable) | |
97 | { | |
98 | if (bHasNewFocus) | |
99 | { | |
100 | usable->StartFocusItem(); | |
101 | bHasNewFocus = false; | |
102 | } | |
103 | } | |
104 | } | |
105 | } | |
106 | ||
107 | /* | |
108 | Runs on Server. Perform "OnUsed" on currently viewed UsableActor if implemented. | |
109 | */ | |
110 | void AInvSystemCharacter::Use_Implementation() | |
111 | { | |
112 | if (FocusedUsableActor) | |
113 | { | |
114 | FocusedUsableActor->OnUsed(this); | |
115 | } | |
116 | } | |
117 | ||
118 | bool AInvSystemCharacter::Use_Validate() | |
119 | { | |
120 | // No special server-side validation performed. | |
121 | return true; | |
122 | } | |
123 | ||
124 | ////////////////////////////////////////////////////////////////////////// | |
125 | // Input | |
126 | ||
127 | void AInvSystemCharacter::SetupPlayerInputComponent(class UInputComponent* InputComponent) | |
128 | { | |
129 | // set up gameplay key bindings | |
130 | check(InputComponent); | |
131 | ||
132 | InputComponent->BindAction("Jump", IE_Pressed, this, &ACharacter::Jump); | |
133 | ||
134 | InputComponent->BindAction("Fire", IE_Pressed, this, &AInvSystemCharacter::OnFire); | |
135 | InputComponent->BindTouch(EInputEvent::IE_Pressed, this, &AInvSystemCharacter::TouchStarted); | |
136 | ||
137 | InputComponent->BindAxis("MoveForward", this, &AInvSystemCharacter::MoveForward); | |
138 | InputComponent->BindAxis("MoveRight", this, &AInvSystemCharacter::MoveRight); | |
139 | ||
140 | // We have 2 versions of the rotation bindings to handle different kinds of devices differently | |
141 | // "turn" handles devices that provide an absolute delta, such as a mouse. | |
142 | // "turnrate" is for devices that we choose to treat as a rate of change, such as an analog joystick | |
143 | InputComponent->BindAxis("Turn", this, &APawn::AddControllerYawInput); | |
144 | InputComponent->BindAxis("TurnRate", this, &AInvSystemCharacter::TurnAtRate); | |
145 | InputComponent->BindAxis("LookUp", this, &APawn::AddControllerPitchInput); | |
146 | InputComponent->BindAxis("LookUpRate", this, &AInvSystemCharacter::LookUpAtRate); | |
147 | InputComponent->BindAction("Use", IE_Pressed, this, &AInvSystemCharacter::Use); | |
148 | } | |
149 | ||
150 | void AInvSystemCharacter::OnFire() | |
151 | { | |
152 | // try and fire a projectile | |
153 | if (ProjectileClass != NULL) | |
154 | { | |
155 | const FRotator SpawnRotation = GetControlRotation(); | |
156 | // MuzzleOffset is in camera space, so transform it to world space before offsetting from the character location to find the final muzzle position | |
157 | const FVector SpawnLocation = GetActorLocation() + SpawnRotation.RotateVector(GunOffset); | |
158 | ||
159 | UWorld* const World = GetWorld(); | |
160 | if (World != NULL) | |
161 | { | |
162 | // spawn the projectile at the muzzle | |
163 | World->SpawnActor<AInvSystemProjectile>(ProjectileClass, SpawnLocation, SpawnRotation); | |
164 | } | |
165 | } | |
166 | ||
167 | // try and play the sound if specified | |
168 | if (FireSound != NULL) | |
169 | { | |
170 | UGameplayStatics::PlaySoundAtLocation(this, FireSound, GetActorLocation()); | |
171 | } | |
172 | ||
173 | // try and play a firing animation if specified | |
174 | if(FireAnimation != NULL) | |
175 | { | |
176 | // Get the animation object for the arms mesh | |
177 | UAnimInstance* AnimInstance = Mesh1P->GetAnimInstance(); | |
178 | if(AnimInstance != NULL) | |
179 | { | |
180 | AnimInstance->Montage_Play(FireAnimation, 1.f); | |
181 | } | |
182 | } | |
183 | ||
184 | } | |
185 | ||
186 | void AInvSystemCharacter::TouchStarted(const ETouchIndex::Type FingerIndex, const FVector Location) | |
187 | { | |
188 | // only fire for first finger down | |
189 | if (FingerIndex == 0) | |
190 | { | |
191 | OnFire(); | |
192 | } | |
193 | } | |
194 | ||
195 | void AInvSystemCharacter::MoveForward(float Value) | |
196 | { | |
197 | if (Value != 0.0f) | |
198 | { | |
199 | // add movement in that direction | |
200 | AddMovementInput(GetActorForwardVector(), Value); | |
201 | } | |
202 | } | |
203 | ||
204 | void AInvSystemCharacter::MoveRight(float Value) | |
205 | { | |
206 | if (Value != 0.0f) | |
207 | { | |
208 | // add movement in that direction | |
209 | AddMovementInput(GetActorRightVector(), Value); | |
210 | } | |
211 | } | |
212 | ||
213 | void AInvSystemCharacter::TurnAtRate(float Rate) | |
214 | { | |
215 | // calculate delta for this frame from the rate information | |
216 | AddControllerYawInput(Rate * BaseTurnRate * GetWorld()->GetDeltaSeconds()); | |
217 | } | |
218 | ||
219 | void AInvSystemCharacter::LookUpAtRate(float Rate) | |
220 | { | |
221 | // calculate delta for this frame from the rate information | |
222 | AddControllerPitchInput(Rate * BaseLookUpRate * GetWorld()->GetDeltaSeconds()); | |
223 | } |