1. Уважаемые гости и пользователи форума.
    Администрация настоятельно рекомендует не регистрировать несколько аккаунтов для одного пользователя. При выявлении наличия мультиаккаунтов будут заблокированы все учетные записи данного пользователя.
    Аккаунты, зарегистрированные на временную почту будут также заблокированы.

XTool 2019 (Plugins) 2019-08-13

List of plugins for xtool

  1. Старожил Модератор

    Регистрация:
    11 июн 2012
    Сообщения:
    488
    Симпатии:
    207
    Пол:
    Мужской
    Пользователь Mickey1s разместил новый ресурс:

    XTool 2019 (Plugins) - List of plugins for xtool

    Узнать больше об этом ресурсе...
     
    YURSHAT нравится это.
  2. Пользователь

    Регистрация:
    4 сен 2011
    Сообщения:
    283
    Симпатии:
    50
    xtool сам подтянет плагин unity если нужно где-то прописать? резор не упоминул об этом(
     
  3. Пользователь

    Регистрация:
    1 дек 2015
    Сообщения:
    339
    Симпатии:
    87
    Пол:
    Мужской
    Сам подтяивает, если dll-ка лежит рядом
     
  4. Пользователь

    Регистрация:
    4 сен 2011
    Сообщения:
    283
    Симпатии:
    50
    кстати плагин на новинках не работает. Изменили название. На старых релизах до 18 года все ок работает.
     
  5. Пользователь

    Регистрация:
    1 дек 2015
    Сообщения:
    339
    Симпатии:
    87
    Пол:
    Мужской
    Не работает? Я изучал xtool 2019 через программу procmon, он загружает библиотеку
     
  6. Старожил

    Регистрация:
    31 мар 2015
    Сообщения:
    337
    Симпатии:
    173
    Пол:
    Мужской
    М-да...
    Скоро эти плагины, утилиты, библиотеки будут занимать место на диске больше чем упаковываемые (распаковываемые) ими файлы, при минимальном КПД и постоянными походами в аптеку для устранения головной боли от мысли правильного их применения ...
     
  7. Пользователь

    Регистрация:
    4 сен 2011
    Сообщения:
    283
    Симпатии:
    50
    плагин сам работает, просто сам плагин не может прочитать lz4 в последний новинках игр из-за того что заголовки файлов изменились и он не может там найти lz4
     
  8. Пользователь

    Регистрация:
    13 май 2013
    Сообщения:
    48
    Симпатии:
    121
    Uh not really, you can only use 1 plugin at a time, you are not required to use all plugins therefore your statement which says that the plugins/tools/utilities and etc will end up using more disk space than what you are trying to save is false. The reason I chose to do it this way is because if I were to put all of this code in the main project, I'll have issues maintaining the project because there will be code everywhere I had this problem maintaining old xtool, plus I can't do separate projects that contain repeated code from other projects that do basically the same thing, there will be a lot of issues so I decided to adopt the plugin apporoach because 95% of the code is already written in the main program, 5% accounts to plugins which I had planned to release sources for people to also be able to make contributions towards the project themselves. For example, I have uploaded the source that was required just to add Unity support, as you can see. It's very small and simple, anyone can just pick up the source and make changes if they need to. Because I won't be always around to make updates.

    Edit: This approach of plugin is also faster in terms of performance than putting everything in main program because if you were only seeking unity streams, other code that would exist is never executed.

    Also, I mentioned "Place dll near xtool.exe (only during encoding)"
    The plugin only serves to help the main program locate streams it cannot find after that, during decoding, it serves no purpose so there isn't a need to also include the plugins in repacks, the main exe and liblz4.dll will be enough.

    Код (Text):
    1.  
    2. library xtool.unity;
    3. {$IF CompilerVersion < 23.0}
    4. {$Message Fatal 'Compiler outdated'}
    5. {$IFEND}
    6. {$R *.res}
    7.  
    8. uses
    9.   System.SysUtils,
    10.   System.Classes,
    11.   System.StrUtils,
    12.   System.IOUtils,
    13.   MemoryModule in '..\base\MemoryModule.pas',
    14.   PluginUtils in '..\base\PluginUtils.pas',
    15.   LZ4DLL in '..\imports\LZ4DLL.pas';
    16.  
    17. const
    18.   STATUS_NONE = 0;
    19.   STATUS_PREDICTED = 1;
    20.   STATUS_PROCESSED = 2;
    21.   STATUS_VERIFIED = 3;
    22.  
    23. type
    24.   PEncodeSI = ^TEncodeSI;
    25.  
    26.   TEncodeSI = record
    27.     ActualPosition, StorePosition: Cardinal;
    28.     OriginalSize, UnpackedSize: Cardinal;
    29.     InfoPosition, InfoSize: Cardinal;
    30.     Checksum: Cardinal;
    31.     ID, Codec: Byte;
    32.     Option: Byte;
    33.     Status: Byte;
    34.     Reserved: Cardinal;
    35.   end;
    36.  
    37.   PDecodeSI = ^TDecodeSI;
    38.  
    39.   TDecodeSI = record
    40.     Position: Cardinal;
    41.     Size: Cardinal;
    42.     ID, Codec: Byte;
    43.     Option: Byte;
    44.   end;
    45.  
    46.   PFutureSI = ^TFutureSI;
    47.  
    48.   TFutureSI = record
    49.     Position: Int64;
    50.     OriginalSize, UnpackedSize: Cardinal;
    51.     ID, Codec: Byte;
    52.     Option: Byte;
    53.     Status: Byte;
    54.   end;
    55.  
    56. var
    57.   XInfo: TArray<TArray<String>>;
    58.  
    59. function GetID(Method: String): Integer;
    60. var
    61.   I, J: Integer;
    62. begin
    63.   Result := 0;
    64.   for I := Low(XInfo) to High(XInfo) do
    65.     for J := Low(XInfo[I]) to High(XInfo[I]) do
    66.       if XInfo[I][J] = Method then
    67.       begin
    68.         Result := I;
    69.         break
    70.       end;
    71. end;
    72.  
    73. function GetCodec(Method: String): Integer;
    74. var
    75.   I, J: Integer;
    76. begin
    77.   Result := 0;
    78.   for I := Low(XInfo) to High(XInfo) do
    79.     for J := Low(XInfo[I]) to High(XInfo[I]) do
    80.       if XInfo[I][J] = Method then
    81.       begin
    82.         Result := J;
    83.         break
    84.       end;
    85. end;
    86.  
    87. type
    88.   TPluginCtx = record
    89.  
    90.   end;
    91.  
    92.   PPluginCtx = ^TPluginCtx;
    93.  
    94. const
    95.   CodecNames: TArray<String> = ['unity'];
    96.   UNITY_CODEC = 0;
    97.  
    98. var
    99.   CodecInit: TArray<Boolean>;
    100.  
    101. function XTool_Init(Methods: String; AInfo: TArray < TArray < String >> )
    102.   : PPluginCtx;
    103. var
    104.   I: Integer;
    105.   B: Boolean;
    106. begin
    107.   XInfo := AInfo;
    108.   SetLength(CodecInit, Length(CodecNames));
    109.   for I := Low(CodecNames) to High(CodecNames) do
    110.   begin
    111.     B := AnsiIndexText(CodecNames[I], DecodeStr(Methods, ',')) >= 0;
    112.     case I of
    113.       UNITY_CODEC:
    114.         CodecInit[I] := B and LZ4DLL.DLLLoaded;
    115.     end;
    116.   end;
    117. end;
    118.  
    119. procedure XTool_Free(ctx: PPluginCtx);
    120. begin
    121.  
    122. end;
    123.  
    124. function XTool_Codecs: TArray<String>;
    125. begin
    126.   Result := CodecNames;
    127. end;
    128.  
    129. procedure XTool_Scan1(ctx: PPluginCtx; MemInput: TMemoryStream; MemPos: Int64;
    130.   AvailSize, TotalSize: Cardinal; Output, Temp: TMemoryStream;
    131.   Info1, Info2: TInfoStore);
    132. var
    133.   Ptr: PByte;
    134.   Pos: Cardinal;
    135.   I: Integer;
    136.   P1, P2: Integer;
    137.   Flags: Integer;
    138.   Count: Integer;
    139.   X, Y: Integer;
    140.   S: String;
    141.   OutPos: Int64;
    142.   StreamInfo1: TEncodeSI;
    143.   StreamInfo2: TFutureSI;
    144. begin
    145.   if BoolArray(CodecInit, False) then
    146.     exit;
    147.   Ptr := MemInput.Memory;
    148.   Pos := 0;
    149.   while Pos < AvailSize do
    150.   begin
    151.     if CodecInit[UNITY_CODEC] and (PInteger(Ptr + Pos)^ = $74696E55) then
    152.     begin
    153.       P1 := GetStr((Ptr + Pos), 10, S) + 1; // ident (UnityFS)
    154.       if S = 'UnityFS' then
    155.       begin
    156.         Inc(P1, Integer.Size); // file version (6)
    157.         Inc(P1, GetStr((Ptr + Pos + P1), 10, S) + 1); // 5.x.x
    158.         Inc(P1, GetStr((Ptr + Pos + P1), 10, S) + 1); // engine version
    159.         Inc(P1, Int64.Size); // file size
    160.         X := EndianSwap(PInteger(Ptr + Pos + P1)^);
    161.         Inc(P1, Integer.Size); // compressed structure size
    162.         Y := EndianSwap(PInteger(Ptr + Pos + P1)^);
    163.         Inc(P1, Integer.Size); // decompressed structure size
    164.         Flags := EndianSwap(PInteger(Ptr + Pos + P1)^);
    165.         Inc(P1, Integer.Size); // flags
    166.         if Temp.Size < Y then
    167.           Temp.Size := Y;
    168.         // decompress the structure to get info
    169.         if (Flags and $3F) = 3 then
    170.           if LZ4_decompress_safe((Ptr + Pos + P1), Temp.Memory, X, Y) = Y then
    171.           begin
    172.             if Y > X then
    173.             begin
    174.               OutPos := Output.Position;
    175.               Output.WriteBuffer(Temp.Memory^, Y);
    176.               StreamInfo1.ActualPosition := Pos + P1;
    177.               StreamInfo1.StorePosition := OutPos;
    178.               StreamInfo1.OriginalSize := X;
    179.               StreamInfo1.UnpackedSize := Y;
    180.               StreamInfo1.InfoPosition := 0;
    181.               StreamInfo1.InfoSize := 0;
    182.               StreamInfo1.Checksum := crc32(0, (Ptr + Pos + P1), X);
    183.               StreamInfo1.ID := GetID('lz4hc');
    184.               StreamInfo1.Codec := GetCodec('lz4hc');
    185.               StreamInfo1.Option := 10;
    186.               StreamInfo1.Status := STATUS_PREDICTED;
    187.               Info1.Add(StreamInfo1);
    188.             end; // optional
    189.             Inc(P1, X);
    190.             P2 := 16;
    191.             Count := EndianSwap(PInteger(PByte(Temp.Memory) + P2)^);
    192.             Inc(P2, Integer.Size); // stream count
    193.             for I := 0 to Count - 1 do
    194.             begin
    195.               Y := EndianSwap(PInteger(PByte(Temp.Memory) + P2)^);
    196.               Inc(P2, Integer.Size); // decompressed stream size
    197.               X := EndianSwap(PInteger(PByte(Temp.Memory) + P2)^);
    198.               Inc(P2, Integer.Size); // compressed stream size
    199.               Inc(P2, SmallInt.Size); // flag
    200.               if Y > X then
    201.               begin
    202.                 StreamInfo2.Position := MemPos + Pos + P1;
    203.                 StreamInfo2.OriginalSize := X;
    204.                 StreamInfo2.UnpackedSize := Y;
    205.                 StreamInfo2.ID := GetID('lz4hc');
    206.                 StreamInfo2.Codec := GetCodec('lz4hc');
    207.                 StreamInfo2.Option := 10;
    208.                 StreamInfo2.Status := STATUS_PREDICTED;
    209.                 Info2.Add(StreamInfo2);
    210.                 // lz4hc, level 10 (predicted)
    211.               end;
    212.               Inc(P1, X); // seek to next stream
    213.             end;
    214.             Inc(Pos, P1);
    215.             continue;
    216.           end;
    217.       end;
    218.     end;
    219.     Inc(Pos);
    220.   end;
    221. end;
    222.  
    223. procedure XTool_Scan2(ctx: PPluginCtx; MemInput: TMemoryStream; MemPos: Int64;
    224.   AvailSize, TotalSize: Cardinal; Output, Temp: TMemoryStream;
    225.   Info1, Info2: TInfoStore);
    226. begin
    227.  
    228. end;
    229.  
    230. procedure XTool_Process(ctx: PPluginCtx; MemInput1, MemInput2: TMemoryStream;
    231.   Temp: TMemoryStream; var StreamInfo: TEncodeSI);
    232. begin
    233.  
    234. end;
    235.  
    236. procedure XTool_Restore(ctx: PPluginCtx; Output: TStream;
    237.   MemInput: TMemoryStream; Temp: TMemoryStream; var StreamInfo: TDecodeSI);
    238. begin
    239.  
    240. end;
    241.  
    242. exports XTool_Init, XTool_Free, XTool_Codecs, XTool_Scan1, XTool_Scan2,
    243.   XTool_Process, XTool_Restore;
    244.  
    245. begin
    246.  
    247. end.
    248.  
    249.  
     
    Последнее редактирование: 17 авг 2019
    dixen18 и SBalykov нравится это.
  9. Старожил

    Регистрация:
    31 мар 2015
    Сообщения:
    337
    Симпатии:
    173
    Пол:
    Мужской
    Razor12911
    Thanks, of course, for the code. But I had a completely different when I wrote my somewhat exaggerated message.
    Simply, in the pursuit of data compression, recently so many plugins have been released lately that it becomes difficult to understand when and which one can be used and how they differ from each other. That is, in my opinion, it is much more important to develop existing plugins, rather than produce new ones.
    This is my personal opinion and is not related either to you personally or to anyone else ...
     
    Razor12911 нравится это.
  10. Пользователь

    Регистрация:
    13 май 2013
    Сообщения:
    48
    Симпатии:
    121
    SBalykov

    I guess you are right but even I wouldn't be doing this either if lz4 was such a problematic algorithm to make a precompressor for. :)
     
    SBalykov нравится это.
  11. Пользователь

    Регистрация:
    12 фев 2013
    Сообщения:
    10
    Симпатии:
    7
    Пол:
    Мужской
    Thank you very much for Your work. Good luck in all your endeavors
     
    Razor12911 нравится это.
  12. Старожил Модератор

    Регистрация:
    11 июн 2012
    Сообщения:
    488
    Симпатии:
    207
    Пол:
    Мужской
    Haemimont Engine
    Support for haemimont game engine files using lz4 algorithm.


    Games
    Victor Vran, Tropico 5 and many others

    Usage
    Place dll near xtool.exe (only during encoding)

    Available codecs
    hpk
     

    Вложения:

    xatab нравится это.
  13. Старожил Модератор

    Регистрация:
    11 июн 2012
    Сообщения:
    488
    Симпатии:
    207
    Пол:
    Мужской
    Frostbite Engine
    Support for frostbite 3 game engine files using zlib, lz4, zstd and kraken algorithm.


    Games
    Battlefield, Need For Speed, FIFA, Mirror's Edge Catalyst and etc

    Usage
    Place dll near xtool.exe (if fb3.fifa19 codec is used, dll is required when decoding as well)

    Available codecs
    fb3, fb3.fifa19
     

    Вложения:

    sanekbest1, dixen18 и xatab нравится это.

Поделиться этой страницей