Announcement

Collapse
No announcement yet.

(39) Rama's Extra Blueprint Nodes for You as a Plugin, No C++ Required!

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    Walid Chekkouri Rama frostic Traggey Falconeyi BrUnO XaVIeR LordNelson7 Jaytheway apfelbaum EricLiu2018 Fire_O
    This plugin is causing errors such as LODs set to hard-coded value...in 4.22.
    How can this be fixed? See code below:
    Code:
    UATHelper: Packaging (Windows (64-bit)): E:\Unreal Games\Projects\UPlatformGame\Plugins\VictoryPlugin\Source\VictoryBPLibrary\VictoryBPLibrary.Build.cs: warning: Referenced directory 'D:\Programs\Epic Games\UE_4.21\Engine\Source\VictoryBPLibrary\Public' does not exist.
    PackagingResults: Warning: Referenced directory 'D:\Programs\Epic Games\UE_4.21\Engine\Source\VictoryBPLibrary\Public' does not exist.
    UATHelper: Packaging (Windows (64-bit)): LogGameplayTags: Display: UGameplayTagsManager::DoneAddingNativeTags. DelegateIsBound: 0
    UATHelper: Packaging (Windows (64-bit)): LogClass: Warning: FLevelStreamInstanceInfo::Location is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogClass: Warning: FLevelStreamInstanceInfo::Rotation is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogClass: Warning: BoolProperty FLevelStreamInstanceInfo::bShouldBeLoaded is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogClass: Warning: BoolProperty FLevelStreamInstanceInfo::bShouldBeVisible is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogClass: Warning: BoolProperty FLevelStreamInstanceInfo::bShouldBlockOnLoad is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogClass: Warning: FLevelStreamInstanceInfo::LODIndex is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogClass: Warning: BoolProperty FVictoryInput::bShift is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogClass: Warning: BoolProperty FVictoryInput::bCtrl is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogClass: Warning: BoolProperty FVictoryInput::bAlt is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogClass: Warning: BoolProperty FVictoryInput::bCmd is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogAutomationTest: Warning: FLevelStreamInstanceInfo::Location is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogAutomationTest: Warning: FLevelStreamInstanceInfo::Rotation is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogAutomationTest: Warning: BoolProperty FLevelStreamInstanceInfo::bShouldBeLoaded is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogAutomationTest: Warning: BoolProperty FLevelStreamInstanceInfo::bShouldBeVisible is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogAutomationTest: Warning: BoolProperty FLevelStreamInstanceInfo::bShouldBlockOnLoad is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogAutomationTest: Warning: FLevelStreamInstanceInfo::LODIndex is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogAutomationTest: Warning: BoolProperty FVictoryInput::bShift is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogAutomationTest: Warning: BoolProperty FVictoryInput::bCtrl is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogAutomationTest: Warning: BoolProperty FVictoryInput::bAlt is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogAutomationTest: Warning: BoolProperty FVictoryInput::bCmd is not initialized properly
    PackagingResults: Warning: FLevelStreamInstanceInfo::Location is not initialized properly
    PackagingResults: Warning: FLevelStreamInstanceInfo::Rotation is not initialized properly
    PackagingResults: Warning: BoolProperty FLevelStreamInstanceInfo::bShouldBeLoaded is not initialized properly
    PackagingResults: Warning: BoolProperty FLevelStreamInstanceInfo::bShouldBeVisible is not initialized properly
    PackagingResults: Warning: BoolProperty FLevelStreamInstanceInfo::bShouldBlockOnLoad is not initialized properly
    PackagingResults: Warning: FLevelStreamInstanceInfo::LODIndex is not initialized properly
    PackagingResults: Warning: BoolProperty FVictoryInput::bShift is not initialized properly
    PackagingResults: Warning: BoolProperty FVictoryInput::bCtrl is not initialized properly
    PackagingResults: Warning: BoolProperty FVictoryInput::bAlt is not initialized properly
    PackagingResults: Warning: BoolProperty FVictoryInput::bCmd is not initialized properly
    PackagingResults: Warning: FLevelStreamInstanceInfo::Location is not initialized properly
    PackagingResults: Warning: FLevelStreamInstanceInfo::Rotation is not initialized properly
    PackagingResults: Warning: BoolProperty FLevelStreamInstanceInfo::bShouldBeLoaded is not initialized properly
    PackagingResults: Warning: BoolProperty FLevelStreamInstanceInfo::bShouldBeVisible is not initialized properly
    PackagingResults: Warning: BoolProperty FLevelStreamInstanceInfo::bShouldBlockOnLoad is not initialized properly
    PackagingResults: Warning: FLevelStreamInstanceInfo::LODIndex is not initialized properly
    PackagingResults: Warning: BoolProperty FVictoryInput::bShift is not initialized properly
    PackagingResults: Warning: BoolProperty FVictoryInput::bCtrl is not initialized properly
    PackagingResults: Warning: BoolProperty FVictoryInput::bAlt is not initialized properly
    PackagingResults: Warning: BoolProperty FVictoryInput::bCmd is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogInit: Display: LogClass: Warning: FLevelStreamInstanceInfo::Location is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogInit: Display: LogClass: Warning: FLevelStreamInstanceInfo::Rotation is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogInit: Display: LogClass: Warning: BoolProperty FLevelStreamInstanceInfo::bShouldBeLoaded is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogInit: Display: LogClass: Warning: BoolProperty FLevelStreamInstanceInfo::bShouldBeVisible is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogInit: Display: LogClass: Warning: BoolProperty FLevelStreamInstanceInfo::bShouldBlockOnLoad is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogInit: Display: LogClass: Warning: FLevelStreamInstanceInfo::LODIndex is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogInit: Display: LogClass: Warning: BoolProperty FVictoryInput::bShift is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogInit: Display: LogClass: Warning: BoolProperty FVictoryInput::bCtrl is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogInit: Display: LogClass: Warning: BoolProperty FVictoryInput::bAlt is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogInit: Display: LogClass: Warning: BoolProperty FVictoryInput::bCmd is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogInit: Display: LogAutomationTest: Warning: FLevelStreamInstanceInfo::Location is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogInit: Display: LogAutomationTest: Warning: FLevelStreamInstanceInfo::Rotation is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogInit: Display: LogAutomationTest: Warning: BoolProperty FLevelStreamInstanceInfo::bShouldBeLoaded is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogInit: Display: LogAutomationTest: Warning: BoolProperty FLevelStreamInstanceInfo::bShouldBeVisible is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogInit: Display: LogAutomationTest: Warning: BoolProperty FLevelStreamInstanceInfo::bShouldBlockOnLoad is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogInit: Display: LogAutomationTest: Warning: FLevelStreamInstanceInfo::LODIndex is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogInit: Display: LogAutomationTest: Warning: BoolProperty FVictoryInput::bShift is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogInit: Display: LogAutomationTest: Warning: BoolProperty FVictoryInput::bCtrl is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogInit: Display: LogAutomationTest: Warning: BoolProperty FVictoryInput::bAlt is not initialized properly
    UATHelper: Packaging (Windows (64-bit)): LogInit: Display: LogAutomationTest: Warning: BoolProperty FVictoryInput::bCmd is not initialized properly
    How can this be fixed? Thanks.

    Comment


      Originally posted by Po Iow View Post

      How can this be fixed? Thanks.
      I don't see any ERROR these are warnings.
      most warnings can be ignored. unless it is effecting your game i would just ignore them.
      I also see these warnings but they have not caused an issue for me yet.

      hope this helps.
      Matt Walton: Programmer and owner for WireLiteSoft Games.

      Comment


        Hi guys and Rama ,

        Wow, I'm still discovering this "pack of useful nodes with their C++ inside" and it's incredible! Only tested a few things, but for example the GPU ones it's a thing I was dreaming with Thank you fi this!

        I have a question too. I have seen I can import a texture from the computer with the Victory nodes, but is it possible to also export a texture from the project to the computer? (Using nodes, of course). I have been trying with this, but UE editor crashes when executing:

        Click image for larger version

Name:	capt1.PNG
Views:	220
Size:	58.5 KB
ID:	1727706

        Thank you again!!
        Last edited by Miguel1900; 03-01-2020, 02:09 PM.
        RTX RayTracing easy global settings tweaker

        Advanced HDRi background tool + 64 HDR images

        Comment


          Miguel1900

          I don't know about the crashing, but I know that to get the Victory Save Pixels node to work, the file path has to include the desired file name as well as the extension. So instead of "C:\Users\Desktop" it should be something like "C:\Users\Desktop\ImageName.png". Also, if you want to make sure the directory you're pointing to is right, I like to use one of Rama's Paths nodes, like "Victory Paths Saved Dir" and then just append it with the file name and extension.


          Click image for larger version  Name:	VicSavePix.png Views:	0 Size:	58.3 KB ID:	1728468

          Comment


            Originally posted by CrowdTheFactory View Post
            Miguel1900

            I don't know about the crashing, but I know that to get the Victory Save Pixels node to work, the file path has to include the desired file name as well as the extension. So instead of "C:\Users\Desktop" it should be something like "C:\Users\Desktop\ImageName.png". Also, if you want to make sure the directory you're pointing to is right, I like to use one of Rama's Paths nodes, like "Victory Paths Saved Dir" and then just append it with the file name and extension.


            Click image for larger version Name:	VicSavePix.png Views:	0 Size:	58.3 KB ID:	1728468
            Thank you CrowdTheFactory !

            I have discovered that it's working but only with very small images. When it's a "common" image of 1024 or more, it crashes, you too?

            What I am trying to do is to generate a Render Target, generate a Texture from it (already done) and export it (or both) to the computer. Maybe for this case is most useful to follow a different workflow?

            Thank you very much
            RTX RayTracing easy global settings tweaker

            Advanced HDRi background tool + 64 HDR images

            Comment


              Originally posted by Jaytheway View Post
              frostic The issue was that SoundWave never got RawPCMData baked into it, which is apparently what it needs in packaged builds. Here's fixed GetSoundWaveFromWaveFile function:

              Code:
              class USoundWave* UMyBPFunctionLibrary::GetSoundWaveFromWaveFile(const FString& filePath, bool& Success)
              {
              if (filePath == "") { Success = false; return nullptr; }
              
              USoundWave* sw = NewObject<USoundWave>(USoundWave::StaticClass());
              if (!sw) { Success = false; return nullptr; }
              
              TArray < uint8 > rawFile;
              
              FFileHelper::LoadFileToArray(rawFile, filePath.GetCharArray().GetData());
              FWaveModInfo WaveInfo;
              
              if (WaveInfo.ReadWaveInfo(rawFile.GetData(), rawFile.Num()))
              {
              
              // - catching not supported bit depth
              if (*WaveInfo.pBitsPerSample != 16) { Success = false; return nullptr; }
              
              sw->InvalidateCompressedData();
              
              sw->RawData.Lock(LOCK_READ_WRITE);
              void* LockedData = sw->RawData.Realloc(rawFile.Num());
              FMemory::Memcpy(LockedData, rawFile.GetData(), rawFile.Num());
              sw->RawData.Unlock();
              
              int32 DurationDiv = *WaveInfo.pChannels * *WaveInfo.pBitsPerSample * *WaveInfo.pSamplesPerSec;
              if (DurationDiv)
              {
              sw->Duration = *WaveInfo.pWaveDataSize * 8.0f / DurationDiv;
              }
              else
              {
              sw->Duration = 0.0f;
              }
              sw->SetSampleRate(*WaveInfo.pSamplesPerSec);
              sw->NumChannels = *WaveInfo.pChannels;
              sw->RawPCMDataSize = WaveInfo.SampleDataSize;
              sw->SoundGroup = ESoundGroup::SOUNDGROUP_Default;
              
              }
              else {
              Success = false;
              return nullptr;
              }
              
              // - Baking PCM Data from file into SoundWave memory
              const int32 NumSamples = sw->RawPCMDataSize / sizeof(Audio::DefaultUSoundWaveSampleType);
              
              sw->RawPCMData = (uint8*)FMemory::Malloc(sw->RawPCMDataSize);
              FMemory::Memcpy(sw->RawPCMData, WaveInfo.SampleDataStart, NumSamples * sizeof(Audio::DefaultUSoundWaveSampleType));
              
              if (!sw) { Success = false; return nullptr; }
              
              Success = true;
              return sw;
              }
              Header:
              Code:
              UFUNCTION(BlueprintCallable, Category = "JP - Nodes", meta = (DisplayName = "Get Sound Wave from Wave file", Keywords = "Get Sound Wave from Wave file"))
              static class USoundWave* GetSoundWaveFromWaveFile(const FString& filePath, bool& Success);
              "Success" bool returns false if:
              - file path is invalid
              - failed to create SoundWave
              - input wave file has unsupported bit depth (other than 16)
              here is a change i had to make today as DefaultUSoundwave


              else {
              Success = false;
              return nullptr;
              }

              // - Baking PCM Data from file into SoundWave memory
              const int32 NumSamples = sw->RawPCMDataSize / sizeof(Audio::FResamplerResults);

              sw->RawPCMData = (uint8*)FMemory::Malloc(sw->RawPCMDataSize);
              FMemory::Memcpy(sw->RawPCMData, WaveInfo.SampleDataStart, NumSamples * sizeof(Audio::FResamplerResults));

              if (!sw) { Success = false; return nullptr; }

              Success = true;
              return sw;
              }


              It seems that DefaultUSoundWaveSampleType is no longer in 4.24.3 and returns a null reference and crashes. the above change fixes this issue.
              Matt Walton: Programmer and owner for WireLiteSoft Games.

              Comment


                When comparing Read Render Target Pixel with Get Pixel From T2D, is there a significant performance cost difference between the two?

                Read Render Target comes with a warning that the operation is extremely inefficient and slow.

                Comment


                  Hello,
                  am kind of confuse on the packaging part for mobile devices for UE4.24 ?

                  Comment


                    Originally posted by Rama View Post

                    ~~~

                    Rama Research

                    Thanks for sharing the additional info, helps me lock onto the issue faster

                    Texture2D and Texture2DDynamic both derive from UTexture, but that is their common base class, so you can't cast a Texture2DDynamic to Texture2D.

                    Because if you can do that, you can convert Texture2DDynamic -> Texture2D via a UTexture initialization.

                    I've looked through the 4.15 Engine source code and Texture2DDynamic is used in only a few places, and there doesn't seem to be a conversion to UTexture2D.

                    The only use of Texture2DDynamic currently appears to be Download image -> Set Brush From Texture 2D dynamic.

                    Or it can be used with a Texture Parameter in a material shader.


                    I've figured out how to get the platform data from Texture2DDynamic

                    You have to use UTexture base class which returns a pointer to a pointer:

                    Code:
                    /**
                    * Textures that use the derived data cache must override this function and
                    * provide a pointer to the linked list of platform data.
                    */
                    virtual FTexturePlatformData** GetRunningPlatformData() { return NULL; }
                    For anyone trying this at home make sure to dereference the ptr ptr carefully before trying to even think about access the ptr itself!
                    Code:
                    FTexturePlatformData** PtrPtr = T2D->GetRunningPlatformData();
                    if(!PtrPtr) return false;
                    FTexturePlatformData* PlatformDataPtr = *PtrPtr; //Check before dereferencing! ♥ Rama
                    
                    //Now check the ptr itself too
                    if(!PlatformDataPtr)
                    {
                    return false;
                    }
                    
                    //use the platform data
                    However the issue is that the platform data for a Texture2DDynamic does not appear to be valid because I guess Texture2DDynamic does not use derived data cache.

                    So that means we need to use the FTextureSource itself, I think, to get the byte data.

                    But I do not see how to get the byte data from FTextureSource where I will know what the color ordering is to convert to FLinearColor and I am out of time to research this.

                    ~~~

                    Community Assistance Requested

                    Anyone want to continue this and finish it?

                    We need a second version of GetPixel data that accepts FTexture2DDyanamic



                    Rama
                    Is there any plans on getting the Download Image Working with your plugin?
                    i was told that i can modified that { Download Image } blueprint node with c++ to have it take 2DTexture instead of waiting for the second GetPixel to accepts FTexture2DDyanamic but am not good with C++ .

                    this we'll probably be a piece of cake for you to share so that we can enjoy the plugin in the meantime.

                    Here's a image of someone showing me that he got it working But not willing to share :
                    Click image for larger version

Name:	Capture.PNG
Views:	53
Size:	152.1 KB
ID:	1737608

                    Thank you.
                    Last edited by RigTag; 03-26-2020, 09:15 PM.

                    Comment


                      EDIT: Ok, I'm dumb. Extract the library into the project folder, not the UE4 source folder. Problem solved.

                      ORIGINAL:

                      First of all, thank you Rama for this extremely useful plugin, it's been very helpful and I've used it since about 4.12 or so.

                      Recently, I have run into an issue with compiling VictoryBP into a project using UE 4.24.3 and wonder if anyone might have any suggestions.

                      First of all, I get two errors:

                      Code:
                      1>  #error "VictoryISM.generated.h already included, missing '#pragma once' in VictoryISM.h"
                      
                      1>  In file included from C:/UE4_SOURCE/UnrealEngine/Engine/Plugins/Developer/VictoryBPLibrary/Source/VictoryBPLibrary/Public/VictoryISM.cpp:7:
                      1>C:\UE4_SOURCE\UnrealEngine\Engine\Plugins\Developer\VictoryBPLibrary\Source\VictoryBPLibrary\Public\VictoryISM.h(13,7): error : redefinition of 'AVictoryISM'
                      Noting it seems to be complaining that the file VictoryISM.h is doing a circular include for VictoryISM.generated.h, I try adding include guards as so (editing AVictoryISM.h):

                      Code:
                      #ifndef GUARD
                      #define GUARD
                      #include "VictoryISM.generated.h"
                      #endif
                      Building the project again generates a new error:

                      Code:
                      1>C:/UE4_SOURCE/UnrealEngine/Engine/Plugins/Developer/VictoryBPLibrary/Source/VictoryBPLibrary/Public/VictoryISM.h(1): error : No #include found for the .generated.h file - the .generated.h file should always be the last #include in a header
                      So it seems UE4 has some rules that make include guards difficult? But I am not very knowledgeable about C++ so if there is something I am missing, please let me know!

                      Maybe important information: It compiles fine when I target Development Client - x64 --- this problem is appearing when I target Development Server - Linux.
                      Last edited by dave_sullivan; 03-29-2020, 10:52 AM.

                      Comment


                        Originally posted by Infinity9115 View Post
                        Hey everyone!
                        I have a problem with two Rama's nodes and AI Perception,
                        I use the nodes "get generic team ID" on a pawn, it return 255 (that's normal i think) but if i "set generic team ID" to 0, it is always 255? Set generic team ID isn't working?
                        I have the interface to do that but no idea why it isn't working! Only use: Event tick > set generic team ID (0). But get generic team ID is still 255...

                        Thank's for your help it will be very appreciated!!
                        I have the same problem. Is anyone able to help please?

                        Comment


                          Originally posted by Jaytheway View Post
                          frostic The issue was that SoundWave never got RawPCMData baked into it, which is apparently what it needs in packaged builds. Here's fixed GetSoundWaveFromWaveFile function:

                          Code:
                          class USoundWave* UMyBPFunctionLibrary::GetSoundWaveFromWaveFile(const FString& filePath, bool& Success)
                          {
                          if (filePath == "") { Success = false; return nullptr; }
                          
                          USoundWave* sw = NewObject<USoundWave>(USoundWave::StaticClass());
                          if (!sw) { Success = false; return nullptr; }
                          
                          TArray < uint8 > rawFile;
                          
                          FFileHelper::LoadFileToArray(rawFile, filePath.GetCharArray().GetData());
                          FWaveModInfo WaveInfo;
                          
                          if (WaveInfo.ReadWaveInfo(rawFile.GetData(), rawFile.Num()))
                          {
                          
                          // - catching not supported bit depth
                          if (*WaveInfo.pBitsPerSample != 16) { Success = false; return nullptr; }
                          
                          sw->InvalidateCompressedData();
                          
                          sw->RawData.Lock(LOCK_READ_WRITE);
                          void* LockedData = sw->RawData.Realloc(rawFile.Num());
                          FMemory::Memcpy(LockedData, rawFile.GetData(), rawFile.Num());
                          sw->RawData.Unlock();
                          
                          int32 DurationDiv = *WaveInfo.pChannels * *WaveInfo.pBitsPerSample * *WaveInfo.pSamplesPerSec;
                          if (DurationDiv)
                          {
                          sw->Duration = *WaveInfo.pWaveDataSize * 8.0f / DurationDiv;
                          }
                          else
                          {
                          sw->Duration = 0.0f;
                          }
                          sw->SetSampleRate(*WaveInfo.pSamplesPerSec);
                          sw->NumChannels = *WaveInfo.pChannels;
                          sw->RawPCMDataSize = WaveInfo.SampleDataSize;
                          sw->SoundGroup = ESoundGroup::SOUNDGROUP_Default;
                          
                          }
                          else {
                          Success = false;
                          return nullptr;
                          }
                          
                          // - Baking PCM Data from file into SoundWave memory
                          const int32 NumSamples = sw->RawPCMDataSize / sizeof(Audio::DefaultUSoundWaveSampleType);
                          
                          sw->RawPCMData = (uint8*)FMemory::Malloc(sw->RawPCMDataSize);
                          FMemory::Memcpy(sw->RawPCMData, WaveInfo.SampleDataStart, NumSamples * sizeof(Audio::DefaultUSoundWaveSampleType));
                          
                          if (!sw) { Success = false; return nullptr; }
                          
                          Success = true;
                          return sw;
                          }
                          Header:
                          Code:
                          UFUNCTION(BlueprintCallable, Category = "JP - Nodes", meta = (DisplayName = "Get Sound Wave from Wave file", Keywords = "Get Sound Wave from Wave file"))
                          static class USoundWave* GetSoundWaveFromWaveFile(const FString& filePath, bool& Success);
                          "Success" bool returns false if:
                          - file path is invalid
                          - failed to create SoundWave
                          - input wave file has unsupported bit depth (other than 16)

                          @frostic: How did you got the wav actual playing?I am using 4.24 and loading in the wav file is successful but if i then say "Play sound 2d" it is not playing the sound at all.
                          Did you do something specific to get it working?

                          Comment

                          Working...
                          X