Advertisement
Guest User

Untitled

a guest
May 24th, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.45 KB | None | 0 0
  1. //EquipmentManagerObject.cpp
  2. // Fill out your copyright notice in the Description page of Project Settings.
  3.  
  4. #include "MMO.h"
  5. #include "Characters/MMOCharacter.h"
  6. #include "EquipmentManagerObject.h"
  7.  
  8. /*
  9. Slots:
  10. 0 - Head
  11. 1 - Chest
  12. 2 - Gloves
  13. 3- Pants
  14. 4-Right Hand
  15. 5-Left Hand
  16. */
  17. bool UEquipmentManagerObject::EquipItem(AInventorySlot * Slot, int index)
  18. {
  19.     if (CharacterRef->GetWorld()->GetNetMode() != NM_DedicatedServer) {
  20.  
  21.         GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(TEXT("Equiped")));
  22.         if (EquipSlots.Num() == 0) {
  23.             if (CharacterRef != nullptr) {
  24.                 EquipSlots = CharacterRef->MainUMGInstance->EquipmentWidgetRef->EquipmentSlots;
  25.             }
  26.             else {
  27.                 return false;
  28.             }
  29.         }
  30.  
  31.         if (Slot->ItemObject->IsChildOf(AEquipableItem::StaticClass())) {
  32.  
  33.  
  34.             switch (Slot->ItemObject->GetDefaultObject<AEquipableItem>()->WereableTypeEnum)
  35.             {
  36.  
  37.             case EIWereableTypeEnum::IQT_Gloves:
  38.                 EquipItemToSlot(Slot, 2, index);
  39.                 UpdateSkeletalMesh(2);
  40.                 break;
  41.             case EIWereableTypeEnum::IQT_Helmet:
  42.                 EquipItemToSlot(Slot, 0, index);
  43.                 UpdateSkeletalMesh(0);
  44.                 break;
  45.             case EIWereableTypeEnum::IQT_Vest:
  46.  
  47.                 EquipItemToSlot(Slot, 1, index);
  48.                 UpdateSkeletalMesh(1);
  49.                 break;
  50.             case EIWereableTypeEnum::IQT_Pants:
  51.                 EquipItemToSlot(Slot, 3, index);
  52.                 UpdateSkeletalMesh(3);
  53.                 break;
  54.             case EIWereableTypeEnum::IQT_OneHandedWeapon:
  55.                 break;
  56.             case EIWereableTypeEnum::IQT_TwoHandedWeapon:
  57.                 break;
  58.  
  59.             }
  60.         }
  61.     }
  62.     return true;
  63.  
  64. }
  65.  
  66. bool UEquipmentManagerObject::SwapInventoryEquipmentItems(AInventorySlot* InvSlot, UEquipmentSlotWidget* EquipSlot, int InvIndex) {
  67.  
  68.     TSubclassOf<AEquipableItem>  TempItem;
  69.     TempItem = EquipSlot->Item;
  70.     EquipSlot->Item = *InvSlot->ItemObject;
  71.     InvSlot->ItemObject = TempItem;
  72.     CharacterRef->UpdateSlotAtIndex(InvIndex);
  73.     EquipSlot->UpdateInvSlotUMG();
  74.     return true;
  75.  
  76. }
  77.  
  78.  
  79.  
  80. bool UEquipmentManagerObject::EquipMesh_Client_Validate(int object,int slot) {
  81.     return true;
  82. }
  83.  
  84. void UEquipmentManagerObject::EquipMesh_Client_Implementation(int object, int slot) {
  85.  
  86.     if (object != -1) {
  87.         SkeletalMeshArray[slot]->SetSkeletalMesh(ObjectArray[object]->GetDefaultObject<AEquipableItem>()->WereableMeshid.LoadSynchronous(), true);
  88.     }
  89.     else {
  90.         SkeletalMeshArray[slot]->SetSkeletalMesh(nullptr, true);
  91.     }
  92.  
  93.     SkeletalMeshArray[slot]->SetMasterPoseComponent(MasterBoneComponent);
  94.  
  95. }
  96.  
  97. bool UEquipmentManagerObject::EquipMesh_Server_Validate(int object, int slot) {
  98.     return true;
  99. }
  100.  
  101. void UEquipmentManagerObject::EquipMesh_Server_Implementation(int object, int slot) {
  102.  
  103.     EquipMesh_Client(object, slot);
  104. }
  105.  
  106.  
  107.  
  108. bool UEquipmentManagerObject::UpdateSkeletalMesh(int Slot)
  109. {
  110.  
  111.     if (SkeletalMeshArray[Slot] != nullptr) {
  112.         if (EquipSlots[Slot]->Item != nullptr) {
  113.  
  114.             if (EquipSlots[Slot]->Item->GetDefaultObject<AEquipableItem>()->WereableMeshid.LoadSynchronous() != nullptr) {
  115.                 //SkeletalMeshArray[Slot]->SetSkeletalMesh(EquipSlots[Slot]->Item->GetDefaultObject<AEquipableItem>()->WereableMeshid.LoadSynchronous(), true);
  116.                 EquipMesh_Server(EquipSlots[Slot]->Item->GetDefaultObject<AEquipableItem>()->Objectint, Slot);
  117.                 //SkeletalMeshArray[Slot]->SetMasterPoseComponent(MasterBoneComponent);
  118.  
  119.                 ManqeuinSkeletalMeshArray[Slot]->SetSkeletalMesh(EquipSlots[Slot]->Item->GetDefaultObject<AEquipableItem>()->WereableMeshid.LoadSynchronous(), true);
  120.                 ManqeuinSkeletalMeshArray[Slot]->SetMasterPoseComponent(ManqeuinMasterBoneComponent);
  121.             }
  122.             else {
  123.                 GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(TEXT("NullItem")));
  124.             }
  125.         }
  126.         else {
  127.             EquipMesh_Server(-1, Slot);
  128.             //SkeletalMeshArray[Slot]->SetSkeletalMesh(nullptr, true);
  129.             //SkeletalMeshArray[Slot]->SetMasterPoseComponent(MasterBoneComponent);
  130.  
  131.             ManqeuinSkeletalMeshArray[Slot]->SetSkeletalMesh(nullptr, true);
  132.             ManqeuinSkeletalMeshArray[Slot]->SetMasterPoseComponent(ManqeuinMasterBoneComponent);
  133.         }
  134.         return true;
  135.     }
  136.     else {
  137.         return false;
  138.     }
  139.  
  140.  
  141. }
  142.  
  143. void UEquipmentManagerObject::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
  144. {
  145.     Super::GetLifetimeReplicatedProps(OutLifetimeProps);
  146.  
  147.     DOREPLIFETIME(UEquipmentManagerObject, SkeletalMeshArray);
  148. }
  149.  
  150. void UEquipmentManagerObject::SpawnManequin()
  151. {
  152.  
  153.     //create manequin at x:-1670  y=520 z=-2252900
  154.  
  155.  
  156.  
  157.     ManequinRef = CharacterRef->GetWorld()->SpawnActor<AEquipmentMannequin>(ManequinClass, FVector(-1670.0f, 520.0f, -2252900.0f), FRotator::ZeroRotator);
  158.     ManqeuinMasterBoneComponent = ManequinRef->FindComponentByClass<USkeletalMeshComponent>();
  159.  
  160.     for (int i = 0; i < 4; i++) {
  161.  
  162.         //SkeletalMeshArray[i]= CharacterRef->CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("Skeletal Mesh"));
  163.         FString StrName = TEXT("Skeletal Mesh ") + FString::FromInt(i);
  164.         FName Name = FName(*StrName);
  165.         ManqeuinSkeletalMeshArray.Add(ConstructObject<USkeletalMeshComponent>(USkeletalMeshComponent::StaticClass(), ManequinRef, Name));
  166.         ManqeuinSkeletalMeshArray[i]->SetupAttachment(ManqeuinMasterBoneComponent);
  167.         ManqeuinSkeletalMeshArray[i]->RegisterComponent();
  168.         ManqeuinSkeletalMeshArray[i]->AttachTo(ManqeuinMasterBoneComponent, Name, EAttachLocation::KeepWorldPosition);
  169.  
  170.     }
  171.  
  172.  
  173. }
  174.  
  175. bool UEquipmentManagerObject::AddFromInventory(AInventorySlot* InvSlot, UEquipmentSlotWidget* EquipSlot, int InvIndex) {
  176.  
  177.     EquipSlot->Item = *InvSlot->ItemObject;
  178.     //Cast<AInventory>(CharacterRef->Inventory->GetChildActor())->RemoveItemAtIndex(InvIndex, InvSlot->Ammount);
  179.     InvSlot->Ammount = 0;
  180.     InvSlot->ItemObject = nullptr;
  181.     CharacterRef->UpdateSlotAtIndex(InvIndex);
  182.     EquipSlot->UpdateInvSlotUMG();
  183.     return true;
  184.  
  185. }
  186.  
  187. bool UEquipmentManagerObject::EquipItemToSlot(AInventorySlot* SlotObject, int Slot, int InvIndex)
  188. {
  189.     if (CharacterRef->GetWorld()->GetNetMode() != NM_DedicatedServer) {
  190.         bool replacinganitem = IsValid(EquipSlots[Slot]->Item);
  191.  
  192.         if (replacinganitem) {
  193.             return SwapInventoryEquipmentItems(SlotObject, EquipSlots[Slot], InvIndex);
  194.         }
  195.         else {
  196.             return AddFromInventory(SlotObject, EquipSlots[Slot], InvIndex);
  197.         }
  198.     }
  199.     return false;
  200.  
  201. }
  202.  
  203.  
  204. // Sets default values
  205.  
  206. UEquipmentManagerObject::UEquipmentManagerObject()
  207. {
  208.     static ConstructorHelpers::FClassFinder<AEquipableItem>
  209.         itemBP(TEXT("Blueprint'/Game/Blueprints/Inventory/Items/ChestArmor.ChestArmor_C'"));
  210.     ObjectArray.Push(itemBP.Class);
  211.  
  212.     // Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
  213.     static ConstructorHelpers::FClassFinder<AEquipmentMannequin>
  214.         ManqeuinFinder(TEXT("Blueprint'/Game/Blueprints/Inventory/EquipmentManequin.EquipmentManequin_C'"));
  215.     if (ManqeuinFinder.Succeeded()) {
  216.         ManequinClass = ManqeuinFinder.Class;
  217.     }
  218.  
  219.  
  220. }
  221.  
  222.  
  223.  
  224.  
  225.  
  226.  
  227. void UEquipmentManagerObject::ShowEquipment()
  228. {
  229.     CharacterRef->ShowWidgetWindow();
  230.     CharacterRef->MainUMGInstance->EquipmentWidgetRef->SetVisibility(ESlateVisibility::Visible);
  231.     CharacterRef->SetMouseActive(true);
  232.     IsVisible = true;
  233.     CharacterRef->MainUMGInstance->EquipmentWidgetRef->SetIsEnabled(true);
  234.  
  235. }
  236.  
  237. void UEquipmentManagerObject::RotateManequin(float rotation)
  238. {
  239.     FRotator ActorRotation = ManequinRef->GetActorRotation();
  240.  
  241.     ActorRotation.Yaw += rotation;
  242.  
  243.     ManequinRef->SetActorRotation(ActorRotation);
  244. }
  245.  
  246. void UEquipmentManagerObject::HideEquipment()
  247. {
  248.     CharacterRef->HideWidgetWindow();
  249.     CharacterRef->MainUMGInstance->EquipmentWidgetRef->SetVisibility(ESlateVisibility::Hidden);
  250.     IsVisible = false;
  251.     CharacterRef->MainUMGInstance->EquipmentWidgetRef->SetIsEnabled(false);
  252.     FRotator ActorRotation = ManequinRef->GetActorRotation();
  253.  
  254.     ActorRotation.Yaw = 0;
  255.  
  256.     ManequinRef->SetActorRotation(ActorRotation);
  257. }
  258.  
  259.  
  260. void UEquipmentManagerObject::Init(AMMOCharacter * aCharacterRef, USkeletalMeshComponent* aMasterBoneComponent)
  261. {
  262.     MasterBoneComponent = aMasterBoneComponent;
  263.     CharacterRef = aCharacterRef;
  264.  
  265.     //EquipSlots = CharacterRef->MainUMGInstance->EquipmentWidgetRef->EquipmentSlots;
  266.  
  267.     for (int i = 0; i < 4; i++) {
  268.  
  269.         //SkeletalMeshArray[i]= CharacterRef->CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("Skeletal Mesh"));
  270.         FString StrName = TEXT("Skeletal Mesh ") + FString::FromInt(i);
  271.         FName Name = FName(*StrName);
  272.         SkeletalMeshArray.Add(ConstructObject<USkeletalMeshComponent>(USkeletalMeshComponent::StaticClass(), CharacterRef, Name));
  273.         SkeletalMeshArray[i]->SetupAttachment(MasterBoneComponent);
  274.         SkeletalMeshArray[i]->RegisterComponent();
  275.         SkeletalMeshArray[i]->AttachTo(MasterBoneComponent, Name, EAttachLocation::KeepWorldPosition);
  276.  
  277.     }
  278.     SpawnManequin();
  279. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement