Задать вопрос
  • Почему нет изображения от USceneCaptureComponent2D после спавна actor'a?

    @trjflash Автор вопроса
    Короче, проблема была в получении положения камеры локального персонажа
    Было так

    UGameplayStatics::GetPlayerCameraManager(GetWorld(), 0)

    переписал получение камеры через интерфейс
    ACharacter* LocalCharacter = UGameplayStatics::GetPlayerCharacter(GetWorld(), 0);
    if (!IsValid(LocalCharacter) || !LocalCharacter->Implements<UCharacterInterface>()) return;
    const APlayerCameraManager* PlayerCameraManager = ICharacterInterface::Execute_GetCurrentCameraManager(LocalCharacter);
    Ответ написан
    Комментировать
  • Почему сохраняется состояние поля класса?

    @trjflash Автор вопроса
    В общем, вполне логично что состояние сохраняется так как меняется именно оно. Переписал хранение полей предмета в структуру и в инвентарь теперь добавляется эта самая структура
    USTRUCT(BlueprintType)
    struct FItemInfo {
    	GENERATED_USTRUCT_BODY()
    
    	//Item class
    	UPROPERTY(EditAnywhere, BlueprintReadWrite)
    	TSubclassOf <class AISBaseItem > ItemClass;
    	//Item name
    	UPROPERTY(EditAnywhere, BlueprintReadWrite)
    		FString ItemName;
    	//Item icon
    	UPROPERTY(EditAnywhere, BlueprintReadWrite)
    		UTexture2D* ItemIcon;
    	//Item type
    	UPROPERTY(EditAnywhere, BlueprintReadWrite)
    		EItemType ItemType;
    	//Item weight
    	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (EditConditionHides, ClampMin = "0.0"))
    		float ItemWeight;
    	//Item durability
    	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (EditConditionHides, ClampMin = "0"))
    		int32 CurrentDurability;
    	//Item max durability
    	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (EditConditionHides, ClampMin = "0"))
    		int32 MaxDurability;
    	//Item quantity
    	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (EditCondition = "bIsStackable", EditConditionHides, ClampMin = "0", ClampMax = "9999"))
    		int32 CurrentStackCount;
    	// Max in stack
    	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (EditCondition = "bIsStackable", EditConditionHides, ClampMin = "0", ClampMax = "9999"))
    		int32 MaxStackCount;
    	// Max in stack
    	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (EditCondition = "bIsStackable"))
    		bool bIsFullStack;
    	//is item stackable
    	UPROPERTY(EditAnywhere, BlueprintReadWrite)
    		bool bIsStackable;
    
    	//is item equipable
    	UPROPERTY(EditAnywhere, BlueprintReadWrite)
    		bool bIsEquipable;
    	//is item usable
    	UPROPERTY(EditAnywhere, BlueprintReadWrite)
    		bool bIsUsable;
    	//is quest item
    	UPROPERTY(EditAnywhere, BlueprintReadWrite)
    		bool bIsQuestItem;
    
    	//Storage
    	UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
    		class UISStorageComponent* StorageOwner;
    
    	bool operator==(const FItemInfo& Other) const
    	{
    		return ItemName == Other.ItemName &&
    			ItemIcon == Other.ItemIcon &&
    			ItemType == Other.ItemType &&
    			ItemWeight == Other.ItemWeight &&
    			CurrentDurability == Other.CurrentDurability &&
    			MaxDurability == Other.MaxDurability &&
    			MaxStackCount == Other.MaxStackCount &&
    			bIsFullStack == Other.bIsFullStack &&
    			bIsStackable == Other.bIsStackable &&
    			bIsEquipable == Other.bIsEquipable &&
    			bIsUsable == Other.bIsUsable &&
    			bIsQuestItem == Other.bIsQuestItem;
    	}
    	bool operator!=(const FItemInfo& Other) const
    	{
    		return !(*this == Other);
    	};
    };


    bool UISStorageComponent::AddItem(AISBaseItem* ItemToAdd, bool ForceAddNew) {
    
    	if (!CanItemBeAdded(ItemToAdd)) return false;
    	int32 TotalItems, TotalInAllStacs, ItemIndex, AddedItemIndex;
    	float TotalWeight;
    	
    	if (!SearchItemInInventory(ItemToAdd->ItemInfo, ItemIndex)) {
    		AddedItemIndex = CurrentItems.Add(ItemToAdd->ItemInfo);
    		RecountItems(TotalItems, TotalInAllStacs);
    		if (bUseWeightSystem)
    			RecountWeight(TotalWeight);
    		ItemToAdd->Destroy();
    		CurrentItems[AddedItemIndex].StorageOwner = this;
    		return true;
    	}
    	else if (!ForceAddNew) {
    		AddItemToStack(ItemToAdd);
    	}
    	else {
    		AddedItemIndex = CurrentItems.Add(ItemToAdd->ItemInfo);
    		RecountItems(TotalItems, TotalInAllStacs);
    		if (bUseWeightSystem)
    			RecountWeight(TotalWeight);
    		ItemToAdd->Destroy();
    		CurrentItems[AddedItemIndex].StorageOwner = this;
    		return true;
    	}
    
    	return false;
    }
    
    
    bool UISStorageComponent::AddItemToStack(AISBaseItem* Item)
    {
    	if (!CheckItem(Item)) return false;
    	float TotalWeight;
    	int32 TotalItems, TotalInAllStacs;
    
    	if (!Item->ItemInfo.bIsStackable) {
    		UE_LOG(ISStorageComponentLog, Display, TEXT("The item is unstackable"));
    		return false;
    	}
    
    	for (int32 i = 0; i < CurrentItems.Num(); i++) {
    		if (CurrentItems[i].ItemClass == Item->ItemInfo.ItemClass && CurrentItems[i].bIsFullStack != true) {
    			int32 AvailableStackCount = CurrentItems[i].MaxStackCount - CurrentItems[i].CurrentStackCount;
    
    			if (Item->ItemInfo.CurrentStackCount <= AvailableStackCount) {
    				CurrentItems[i].CurrentStackCount += Item->ItemInfo.CurrentStackCount;
    				if (bUseWeightSystem)
    					RecountWeight(TotalWeight);
    
    				RecountItems(TotalItems, TotalInAllStacs);
    
    				if (CurrentItems[i].CurrentStackCount == CurrentItems[i].MaxStackCount)
    					CurrentItems[i].bIsFullStack = true;
    				Item->Destroy();
    				return true;
    			}
    			else {
    				int32 ToCurrentStack = CurrentItems[i].MaxStackCount - CurrentItems[i].CurrentStackCount;
    				int32 ExtraQuantity = Item->ItemInfo.CurrentStackCount - ToCurrentStack;
    
    				CurrentItems[i].CurrentStackCount = CurrentItems[i].MaxStackCount;
    				if (bUseWeightSystem)
    					RecountWeight(TotalWeight);
    
    				RecountItems(TotalItems, TotalInAllStacs);
    				CurrentItems[i].bIsFullStack = true;
    
    				Item->ItemInfo.CurrentStackCount = ExtraQuantity;
    				AddItem(Item, true);
    				return true;
    			}
    		}
    	}
    
    	return false;
    }
    Ответ написан
    Комментировать
  • Как получить extention при входящем звонке pjsip?

    @trjflash Автор вопроса
    Вроде разобрался
    Если кому то нужно вот конфиг который у меня взлетел

    [PROVIDER]
    type = registration
    transport = transport-udp-nat
    outbound_auth = PROVIDER
    server_uri = sip:PROVIDER-SIP-SERVER
    client_uri = sip:SIP-LOGIN@PROVIDER-SIP-SERVER
    retry_interval = 10
    contact_user=SIP-LOGIN
    
    [PROVIDER]
    type = auth
    auth_type = userpass
    password = SIP-PASSWORD
    username = SIP-LOGIN
    
    [PROVIDER]
    type = aor
    contact = sip:PROVIDER-SIP-SERVER:5060
    
    [PROVIDER]
    type = endpoint
    transport = transport-udp-nat
    ; Контекст должен быть прописан в Dialplan
    context = CONTEXT
    dtmf_mode = rfc4733
    disallow = all
    allow = alaw,ulaw
    direct_media = no
    from_user = SIP-LOGIN
    from_domain = PROVIDER-SIP-SERVER
    outbound_auth=PROVIDER
    aors = PROVIDER
     
    [PROVIDER]
    type = identify
    endpoint = PROVIDER
    match = PROVIDER-SIP-SERVER
    Ответ написан
    Комментировать
  • Как вытащить номер на который позвонили?

    @trjflash Автор вопроса
    Нашел CUT(CUT(PJSIP_HEADER(read,To),"<",1),+,2)
    Ответ написан
    Комментировать
  • Почему обнуляется указатель?

    @trjflash Автор вопроса
    Видимо я где то пропустил кусок мануала, что бы сравнить блупринтовый элемент с его плюсовым родителем, при передачами между функциями нужно использовать TSubclassOf, потом кастить его к нужному классу и после этого сравнивать. Для меня работает следующим образом

    GetAmmoFromInventory(CurrentAmmo.AmmoType, Qt);
    
    void ANCGRangeWeapon::GetAmmoFromInventory(TSubclassOf<ANCGAmmo> ItemType, int32& AmmoCount) {
    	ANCGBaseCharacter* CharOwner = Cast<ANCGBaseCharacter>(this->GetOwner());
    	CharOwner->StorageComponent->GetAmmoByType(ItemType, AmmoCount);
    }
    
    void UNCGStorageComponent::GetAmmoByType_Implementation(TSubclassOf<ANCGAmmo> ItemToSearch, int32& Quantity)
    {
    	
    	if (ItemToSearch == nullptr) {
    		Quantity = 0;
    		return;
    	}
    	
    	const auto Item = Cast<ANCGBaseItem>(ItemToSearch->GetDefaultObject());
    
    	for (ANCGBaseItem* CurrentItem : StorageItems)
    	{
    		if (CurrentItem->GetClass() == Item->GetClass()) {
    			Quantity = CurrentItem->Count;
    		}
    	}
    	
    }
    Ответ написан
    Комментировать
  • ПОчему не отображается объект после спавна?

    @trjflash Автор вопроса
    В данный момент работает так

    FActorSpawnParameters SpawnParams;
    			SpawnParams.Template = Item;
    			ANCGBaseItem* SpawnedItem = GetWorld()->SpawnActor<ANCGBaseItem>(Item->GetClass(), SpawnParams);
    	SpawnedItem->Count = DropQt;
    	SpawnedItem->DroppedToWorld(NewLocation);
    	UE_LOG(StorageComponentLog, Display, TEXT("Total items %d"), StorageSize);
    	return true;
    Ответ написан
    Комментировать
  • Почему не появляется диалог авторизации?

    @trjflash Автор вопроса
    Проблема решилась переустановкой платформы
    Ответ написан
    Комментировать
  • Почему BlueprintImplementableEvent падает в ошибку?

    @trjflash Автор вопроса
    В целом нашел решение

    .h
    UFUNCTION(BlueprintCallable, BlueprintNativeEvent)
    		bool Interract(ANCGBaseCharacter* Character);


    .cpp
    bool ABaseItem::Interract_Implementation(ANCGBaseCharacter* Character)
    {
    	return false;
    }


    Компилятор ругается но сборка проходит и в редакторе все как нужно.
    Ответ написан
    Комментировать
  • Как работает TakeDamage в UE5.1?

    @trjflash Автор вопроса
    Сделал через ApplayDamage

    UGameplayStatics::ApplyDamage(this, FinalDamage, GetController(), nullptr, nullptr);


    Если есть какие то еще варианты буду признателен
    Ответ написан
    Комментировать
  • Как использовать авторизацию по API KEY в Swagger из GET запроса nestjs?

    @trjflash Автор вопроса
    Решил при помощи CanActivate предварительное решение выглядит так
    @Injectable()
    export class ApiKeyAuth implements CanActivate {
      canActivate(
        context: ExecutionContext,
      ): boolean | Promise<boolean> | Observable<boolean> {
        const request = context.switchToHttp().getRequest();
        const token = request.originalUrl.split('/')[2];
        if (token == process.env.API_KEY) {
          (request.headers['api-key'] as any) = token;
          return true;
        } else return false;
      }
    }


    Если кто то найдет вопрос и предложит как лучше буду рад
    Ответ написан
    Комментировать
  • Centos 7 и подключение модуля zip - как правильно подключить?

    Там по мимо установки он вроде должен быть в самом php.ini раскоментирован

    extention=zip.so
    Ответ написан
  • Почему регистрация проходит с внешним ip?

    @trjflash Автор вопроса
    Вопрос решен указание IP вместо DNS имени в качестве сервера на аппаратах
    Ответ написан
    Комментировать
  • Сайт на Yii2 advanced не работает после переноса с хостинга?

    @trjflash Автор вопроса
    Проблема была в отключенных коротких тегах PHP
    Ответ написан
    Комментировать
  • ПРоброс порта микротик 2 провайдера?

    @trjflash Автор вопроса
    Разобрался. Не хватало правила src-nat
    add action=src-nat chain=srcnat dst-address=192.168.0.93 dst-port=5000 protocol=tcp src-address=192.168.0.0/24 to-addresses=192.168.0.253


    А и да, микрот должен быть шлюзом для хоста на который идет проброс, а не как у меня паралельно рабочей схеме
    Ответ написан
    Комментировать
  • Доменная учетка без прав админа?

    @trjflash Автор вопроса
    Дело было в UAC ползунок был опущен вниз. Нужно поднять хотябы на предпоследнюю метку
    Ответ написан
    Комментировать
  • Насколько шумный SVC PTS-6KL-LCD?

    @trjflash Автор вопроса
    Шумит не сильнее обычной УПС мощнее 1Квт )))
    Ответ написан
    Комментировать
  • Как использовать .on с функциями?

    @trjflash Автор вопроса
    Ответ в коментариях
    Ответ написан
    Комментировать
  • Exchange -> Imap?

    @trjflash Автор вопроса
    Проблема была банальной, нужно было настроить подписку на ИМАП папки
    https://support.microsoft.com/ru-ru/office/выбор-п...
    Ответ написан
    Комментировать
  • Как вычесть у одного пользователя число и добавить его другому?

    Последний раз подобное делал вложенным запросом. То есть текущая сумма вытаскивалась селектом грубо говоря так
    <?php
     $mysqli->query("UPDATE users SET amount = (SELECT amount FROM users WHERE id = '$client') - '$summa'";
     $mysqli->query("UPDATE users SET amount = '',  amount = (SELECT amount FROM users WHERE id = '$shop') + '$summa'";
    ?>


    Возможно это не совсем правильно но у меня на тот момент по другому не завелось, да и искал я не долго
    Ответ написан