getting vmware poe bot ready menu

User Tag List

Page 2 of 2 FirstFirst 12
Results 16 to 30 of 30
  1. #16
    w00t3d's Avatar Member
    Reputation
    2
    Join Date
    Jul 2012
    Posts
    21
    Thanks G/R
    3/1
    Trade Feedback
    1 (100%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by trpmaz View Post
    Does it work on Window7?
    Yes it does, it also works on windows 10 with old PoE client, before the last patch

    getting vmware poe bot ready
  2. Thanks trpmaz (1 members gave Thanks to w00t3d for this useful post)
  3. #17
    trpmaz's Avatar Member
    Reputation
    2
    Join Date
    May 2021
    Posts
    4
    Thanks G/R
    3/1
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by w00t3d View Post
    Yes it does, it also works on windows 10 with old PoE client, before the last patch
    Nice! Thanks for the reply. But where can I get an old client and how I can disable auto-updates?

  4. #18
    NoobToken's Avatar Member CoreCoins Purchaser
    Reputation
    8
    Join Date
    Nov 2010
    Posts
    52
    Thanks G/R
    11/9
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    I'm also very interested in making the game work on vmware again. Did you guys try the steam version?

  5. #19
    paychilo's Avatar Member
    Reputation
    1
    Join Date
    May 2021
    Posts
    2
    Thanks G/R
    2/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by NoobToken View Post
    I'm also very interested in making the game work on vmware again. Did you guys try the steam version?
    yep, same shit
    game checking something on login or character screen. then u got inf loop. if we can disable it, check or loop we can ez play. I found it when my cpu was under load and i spam enter after logo screen.

  6. #20
    trpmaz's Avatar Member
    Reputation
    2
    Join Date
    May 2021
    Posts
    4
    Thanks G/R
    3/1
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by paychilo View Post
    yep, same shit
    game checking something on login or character screen. then u got inf loop. if we can disable it, check or loop we can ez play. I found it when my cpu was under load and i spam enter after logo screen.
    Actually, I was able to get to the login screen, but then I got stuck with the infinity location loading screen. Did not check it on Windows 7 virtual machine yet tho.

  7. #21
    GameAssist's Avatar Banned CoreCoins Purchaser Authenticator enabled
    Reputation
    98
    Join Date
    Apr 2010
    Posts
    349
    Thanks G/R
    55/83
    Trade Feedback
    0 (0%)
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by pilliwinx View Post
    GGG killed VMware Win10 Poe after recent patch, not your fault.
    Am I correct in what happened after patch 3.14.2?
    Do you have any information on whether this is a temporary error and if it will be fixed, or if this is a deliberate disabling of support for virtual machines as a form of fighting bots, etc.

  8. #22
    NoobToken's Avatar Member CoreCoins Purchaser
    Reputation
    8
    Join Date
    Nov 2010
    Posts
    52
    Thanks G/R
    11/9
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by wlastas View Post
    Am I correct in what happened after patch 3.14.2?
    Do you have any information on whether this is a temporary error and if it will be fixed, or if this is a deliberate disabling of support for virtual machines as a form of fighting bots, etc.
    GGG pushed shader cache memory utilization update in the patch that broke vmware, so my guess is that it's an unintended side-effect.

  9. #23
    GameAssist's Avatar Banned CoreCoins Purchaser Authenticator enabled
    Reputation
    98
    Join Date
    Apr 2010
    Posts
    349
    Thanks G/R
    55/83
    Trade Feedback
    0 (0%)
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by NoobToken View Post
    GGG pushed shader cache memory utilization update in the patch that broke vmware, so my guess is that it's an unintended side-effect.
    is this?
    3.14.1d Patch Notes:

    The Path of Exile client now utilises your system's video memory more efficiently, which means that assets will stay loaded for longer. For systems with sufficient video memory, this will result in significantly fewer assets being visibly loaded during gameplay.

  10. #24
    NoobToken's Avatar Member CoreCoins Purchaser
    Reputation
    8
    Join Date
    Nov 2010
    Posts
    52
    Thanks G/R
    11/9
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by wlastas View Post
    is this?
    3.14.1d Patch Notes:

    The Path of Exile client now utilises your system's video memory more efficiently, which means that assets will stay loaded for longer. For systems with sufficient video memory, this will result in significantly fewer assets being visibly loaded during gameplay.
    As far as I know, yes

  11. #25
    pushedx's Avatar Contributor
    Reputation
    257
    Join Date
    Nov 2009
    Posts
    137
    Thanks G/R
    8/135
    Trade Feedback
    0 (0%)
    Mentioned
    12 Post(s)
    Tagged
    0 Thread(s)
    I installed VMWare player to take a look into this issue today

    I'm pretty confident this is just a new bug in their texture streaming code and not an intentional anti-VM change

    What seems to be happening is various texture loading is now failing on VMWare, and the client is now waiting for those textures to be fully loaded first. That never happens and the end result is an infinite loading screen

    It's hard to say the exact issue, but it could be:
    - faulty multithreaded code that is breaking on low performance VMs
    - an issue with the texture loading code in the VM environment now
    - some sort of texture streaming cache corruption issue

    I can clear the number of pending resources to be loaded in a debugger, and the client sort of works again, but of course the textures are the super low resolution ones. Obviously, that's not an issue for anything but pixel bots, but the bigger issue is how can you make the client not wait on interface texture loading again. The system being used is also used for things like knowing when the instance info pointer is valid, so if you just clear the value too soon, the client crashes because that pointer is not valid yet. There may be even more other instability issues trying to work around the issue simply by clearing the value I did.

    Image: Imgur: The magic of the Internet

    On the title screen, it seems the language flags at the top left are the reason why some people see the lockups when starting up the game (there's a few others, but those are the obvious culprits)

    At first, I thought it was only interface textures that had an issue, but I've also noticed partially invisible mobs as well. Dying and returning seemed to "reload" some of the broken textures (not all though) so that's why I think there could also be some sort of texture cache corruption happening. I've also noticed that on the title screen where sometimes the language flags load if you delete production_config.txt and let the client recreate it.

    I came up with a very dirty hack to try and work around the issue, but it's not worth the time trying to develop, support, or maintain. However, I'll share it for anyone that wants to waste the time on it. This is a x64 .net 4.8 program and you need to use nuget to add the "System.Runtime.CompilerServices.Unsafe" package.

    The idea was pretty simple, keep track of the value and force clear it after it's remained unchanged for 30s. However, there's an issue with this in town, since the client can keep loading new textures as people zone in and out. You could add in logic to track the total time spent and then force clear, or work in game offset specific logic to check game pointers to figure out if that. However, due to poor VM performance varying between systems, 30s might not be enough, so that's something else that might have to change. If you clear the value too soon, you can crash the client. These issues are why it's not worth trying to support this type of project, but I'll at least put out this info to anyone who has the resources to do something with it.

    SketchyTextureLoadingLockupFix.cs
    Code:
    using Microsoft.Win32.SafeHandles;
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Threading;
    
    namespace SketchyTextureLoadingLockupFix
    {
        public static class Utility
        {
            [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
            public static extern bool ReadProcessMemory(SafeProcessHandle hProcess, UIntPtr lpBaseAddress, [Out] byte[] lpBuffer, ulong dwSize, out ulong lpNumberOfBytesRead);
    
            [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
            public static extern bool WriteProcessMemory(SafeProcessHandle hProcess, UIntPtr lpBaseAddress, byte[] lpBuffer, ulong nSize, out ulong lpNumberOfBytesWritten);
    
            public static unsafe UIntPtr ToUIntPtr(this IntPtr ptr)
            {
                return new UIntPtr(ptr.ToPointer());
            }
    
            public static ulong ToUInt64(this IntPtr ptr)
            {
                return ptr.ToUIntPtr().ToUInt64();
            }
    
            public static byte[] FromStruct<T>(this T value) where T : struct
            {
                var typeSize = System.Runtime.CompilerServices.Unsafe.SizeOf<T>();
    
                var bytes = new byte[typeSize];
                if (bytes.Length > 0)
                {
                    System.Runtime.CompilerServices.Unsafe.CopyBlockUnaligned(ref bytes[0],
                        ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref value), (uint)bytes.Length);
                }
    
                return bytes;
            }
    
            public static T ToStruct<T>(this byte[] bytes) where T : struct
            {
                return ToStructArray<T>(bytes)[0];
            }
    
            public static T[] ToStructArray<T>(this byte[] bytes) where T : struct
            {
                var typeSize = System.Runtime.CompilerServices.Unsafe.SizeOf<T>();
    
                if (bytes.Length % typeSize != 0)
                    throw new ArgumentException("Length of bytes is not a multiple of structure size");
    
                var values = new T[bytes.Length / typeSize];
    
                if (bytes.Length > 0)
                {
                    System.Runtime.CompilerServices.Unsafe.CopyBlockUnaligned(
                        ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref values[0]), ref bytes[0],
                        (uint)bytes.Length);
                }
    
                return values;
            }
    
            public static ulong BaseAddress(this Process process)
            {
                return process.MainModule.BaseAddress.ToUInt64();
            }
    
            public static T Read<T>(this Process process, ulong address) where T : struct
            {
                return process.ReadArray<T>(address, 1)[0];
            }
    
            public static T[] ReadArray<T>(this Process process, ulong address, ulong count) where T : struct
            {
                var buffer = process.ReadBytes(address, count * (ulong)Marshal.SizeOf<T>());
                return buffer.ToStructArray<T>();
            }
    
            public static byte[] ReadBytes(this Process process, ulong address, ulong count)
            {
                var buffer = new byte[count];
                process.ReadBytes(address, count, buffer);
                return buffer;
            }
    
            public static void ReadBytes(this Process process, ulong address, ulong count, byte[] buffer)
            {
                if (!ReadProcessMemory(process.SafeHandle, (UIntPtr)address, buffer, count, out var readCount))
                {
                    throw new Exception($"'ReadProcessMemory' failed with error {Marshal.GetLastWin32Error()}.");
                }
    
                if (readCount != count)
                {
                    throw new Exception($"'ReadProcessMemory' read {readCount} / {count} bytes.");
                }
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                var procName = "PathOfExile_x64";
                //var procName = "[3.14.2.2]PathOfExile_x64";
    
                var procs = Process.GetProcessesByName(procName);
                if (procs.Length != 1)
                {
                    Console.WriteLine(
                        $"{procs.Length} processes were found with name '{procName}'");
                    return;
                }
    
                var clearBytes = new byte[8];
    
                using (var process = procs[0])
                {
                    var baseAddress = process.BaseAddress();
    
                    // This is an address in the .data section, so it's going to change every patch
                    var targetAddress = baseAddress + (0x7FF7321D1E40 - 0x7FF72FC10000);
    
                    Stopwatch lastChange = Stopwatch.StartNew();
    
                    ulong lastValue = 0;
                    while (!Console.KeyAvailable)
                    {
                        var curValue = process.Read<ulong>(targetAddress);
                        if (curValue != lastValue)
                        {
                            lastValue = curValue;
                            lastChange.Restart();
                            Console.WriteLine($"=> {curValue} pending files");
                        }
    
                        if (curValue != 0)
                        {
                            if (lastChange.Elapsed.TotalSeconds > 30)
                            {
                                Console.WriteLine($"{lastChange.Elapsed} has elapsed with no file load changes. Now force clearing the value...");
    
                                if (!Utility.WriteProcessMemory(process.SafeHandle, (UIntPtr)targetAddress, clearBytes, (ulong)clearBytes.Length, out var wrote))
                                {
                                    throw new Exception($"WriteProcessMemory' failed with error [{Marshal.GetLastWin32Error()}]");
                                }
                            }
                        }
    
                        Thread.Sleep(1000);
                    }
                }
            }
        }
    }
    One function that makes use of the address to clear starts like this, so you can make a byte sig to make some parts in the function possibly.
    The asm listing (3.14.2.2) is relative to the .code section of the client , not the image base, so if your image base was 0x7000, then your code section is at 0x7000 + 0x1000, and the start of this function would be 0x7000 + 0x1000 + 0xF07070

    Code:
    $+F07070  | 48:8BC4               | mov rax,rsp                                       |
    $+F07073  | 56                    | push rsi                                          |
    $+F07074  | 57                    | push rdi                                          |
    $+F07075  | 41:56                 | push r14                                          |
    $+F07077  | 48:83EC 60            | sub rsp,0x60                                      |
    $+F0707B  | 48:C740 A8 FEFFFFFF   | mov qword ptr [rax-0x58],0xFFFFFFFFFFFFFFFE       |
    $+F07083  | 48:8958 08            | mov qword ptr [rax+0x8],rbx                       |
    $+F07087  | 48:8968 10            | mov qword ptr [rax+0x10],rbp                      |
    $+F0708B  | 0FB6DA                | movzx ebx,dl                                      |
    $+F0708E  | 48:8BF9               | mov rdi,rcx                                       |
    $+F07091  | 4C:8D35 98125A01      | lea r14,qword ptr [0x7FF7320B9330]                |
    $+F07098  | 4C:8970 20            | mov qword ptr [rax+0x20],r14                      |
    $+F0709C  | 49:8BCE               | mov rcx,r14                                       |
    $+F0709F  | FF15 A371B400         | call qword ptr [<&RtlAcquireSRWLockExclusive>]    |
    $+F070A5  | 90                    | nop                                               |
    $+F070A6  | 48:8B05 939D6B01      | mov rax,qword ptr [0x7FF7321D1E40]                | // This is the address you want to clear
    $+F070AD  | 48:85C0               | test rax,rax                                      |
    $+F070B0  | 75 10                 | jne 0x7FF730B180C2                                |
    $+F070B2  | 0FB605 3DEF4701       | movzx eax,byte ptr [0x7FF731F96FF6]               |
    $+F070B9  | 84C0                  | test al,al                                        |
    $+F070BB  | 75 05                 | jne 0x7FF730B180C2                                |
    $+F070BD  | 40:32ED               | xor bpl,bpl                                       |
    $+F070C0  | EB 03                 | jmp 0x7FF730B180C5                                |
    $+F070C2  | 40:B5 01              | mov bpl,0x1                                       |
    $+F070C5  | 84DB                  | test bl,bl                                        |
    $+F070C7  | 74 10                 | je 0x7FF730B180D9                                 |
    $+F070C9  | 0FB605 14AE4101       | movzx eax,byte ptr [0x7FF731F32EE4]               | 
    $+F070D0  | 84C0                  | test al,al                                        |
    $+F070D2  | 74 05                 | je 0x7FF730B180D9                                 |
    $+F070D4  | 40:B6 01              | mov sil,0x1                                       |
    $+F070D7  | EB 03                 | jmp 0x7FF730B180DC                                |
    $+F070D9  | 40:32F6               | xor sil,sil                                       |
    $+F070DC  | 48:8B05 55125A01      | mov rax,qword ptr [0x7FF7320B9338]                |
    $+F070E3  | 48:3B05 56125A01      | cmp rax,qword ptr [0x7FF7320B9340]                |
    $+F070EA  | 0F84 B3000000         | je 0x7FF730B181A3                                 |
    $+F070F0  | 48:C7C3 FFFFFFFF      | mov rbx,0xFFFFFFFFFFFFFFFF                        |
    $+F070F7  | 66:0F1F8400 00000000  | nop word ptr [rax+rax],ax                         |
    $+F07100  | 0F1000                | movups xmm0,xmmword ptr [rax]                     |
    $+F07103  | 0F114424 28           | movups xmmword ptr [rsp+0x28],xmm0                |
    $+F07108  | F2:0F1048 10          | movsd xmm1,qword ptr [rax+0x10]                   |
    $+F0710D  | F2:0F114C24 38        | movsd qword ptr [rsp+0x38],xmm1                   |
    $+F07113  | 837C24 38 04          | cmp dword ptr [rsp+0x38],0x4                      |
    $+F07118  | 74 52                 | je 0x7FF730B1816C                                 |
    Anyways, this issue is not really worth looking into any more, so good luck to anyone that messes with it!

  12. Thanks Aoooooooo, GameAssist, NoobToken, Sychotix, aseyoo (5 members gave Thanks to pushedx for this useful post)
  13. #26
    GameAssist's Avatar Banned CoreCoins Purchaser Authenticator enabled
    Reputation
    98
    Join Date
    Apr 2010
    Posts
    349
    Thanks G/R
    55/83
    Trade Feedback
    0 (0%)
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by pushedx View Post
    ...
    SketchyTextureLoadingLockupFix.cs.
    ...
    More than a month debugging my new pathfinding algorithms on physical machines - I liked everything - tried to see how it would work on a virtual machine and there is such an ambush ^^
    Thank you so much for sharing your solution - I don’t understand anything about disassembling and ASM, but I’ll try to figure it out and comprehend everything that you have written here.

    Are the Cheat Engine features enough or should I use something more serious?
    What program did you get the above asm listing

  14. #27
    pushedx's Avatar Contributor
    Reputation
    257
    Join Date
    Nov 2009
    Posts
    137
    Thanks G/R
    8/135
    Trade Feedback
    0 (0%)
    Mentioned
    12 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by wlastas View Post
    Are the Cheat Engine features enough or should I use something more serious?
    What program did you get the above asm listing
    That is from x64dbg, which is a free, open-source x64/x32 debugger for Windows. It supersedes ollydbg 1.10/2.0, which was the main free debugger many years ago. If you plan to do anything long term with reverse engineering, then it's 100% worth learning x64dbg, especially if you already known how to use CE.

    CE also has a debugger that I've not really used much, but I think x64dbg is better for a task like this regardless, because you're trying to work through a more complex, multithreaded aspect of a large game, which is not easy. I don't know enough about the CE debugging experience to know how to achieve the same. For debugging, I feel x64dbg is usually the best there is for user mode applications, as for kernel based stuff you typically use windbg. WinDbg is also very powerful, but not nearly as intuitive or easy to use as x64dbg is. Lastly, it's also really useful to understand how to make your own custom debugging tools to work around various deficiencies in existing tools as well. Running PoE in x64dbg comes with massive overhead, so the game is barely playable, but still usable enough to get stuff done.

    Of course, the tools can only get you so far. For this issue, I had an idea the game has some multithreaded loading issue, where the main thread is infinitely looping (in a controlled manner though since the loading screen is playing) and there are worker threads that are stalling. I figured out where some of the code had issues by checking the current executing address of the main thread in x64dbg and started looking for places where it was looping until I found one. Then, I checked the global variables to see if other threads were accessing those and sure enough I narrowed down the issue.

    Since all this texture streaming is new stuff, I don't actually know how the client works in regards to this. My previous knowledge of the game didn't help at all. Rather, just knowing how to use x64dbg to find the needle in the haystack when it came to exploring the idea I had of what the issue was what lead me to a partial solution, but it'd take a lot more time digging and reversing the system to understand what is going on.

  15. Thanks GameAssist (1 members gave Thanks to pushedx for this useful post)
  16. #28
    GameAssist's Avatar Banned CoreCoins Purchaser Authenticator enabled
    Reputation
    98
    Join Date
    Apr 2010
    Posts
    349
    Thanks G/R
    55/83
    Trade Feedback
    0 (0%)
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by pushedx View Post
    That is from x64dbg, which is a free, open-source x64/x32 debugger for Windows. It supersedes ollydbg 1.10/2.0, which was the main free debugger many years ago. If you plan to do anything long term with reverse engineering, then it's 100% worth learning x64dbg, especially if you already known how to use CE.

    CE also has a debugger that I've not really used much, but I think x64dbg is better for a task like this regardless, because you're trying to work through a more complex, multithreaded aspect of a large game, which is not easy. I don't know enough about the CE debugging experience to know how to achieve the same. For debugging, I feel x64dbg is usually the best there is for user mode applications, as for kernel based stuff you typically use windbg. WinDbg is also very powerful, but not nearly as intuitive or easy to use as x64dbg is. Lastly, it's also really useful to understand how to make your own custom debugging tools to work around various deficiencies in existing tools as well. Running PoE in x64dbg comes with massive overhead, so the game is barely playable, but still usable enough to get stuff done.

    Of course, the tools can only get you so far. For this issue, I had an idea the game has some multithreaded loading issue, where the main thread is infinitely looping (in a controlled manner though since the loading screen is playing) and there are worker threads that are stalling. I figured out where some of the code had issues by checking the current executing address of the main thread in x64dbg and started looking for places where it was looping until I found one. Then, I checked the global variables to see if other threads were accessing those and sure enough I narrowed down the issue.

    Since all this texture streaming is new stuff, I don't actually know how the client works in regards to this. My previous knowledge of the game didn't help at all. Rather, just knowing how to use x64dbg to find the needle in the haystack when it came to exploring the idea I had of what the issue was what lead me to a partial solution, but it'd take a lot more time digging and reversing the system to understand what is going on.
    Thanks for the detailed clarifications.
    Just for the start, I will find the function at the address you specified and try to understand how you found it using x64dbg ^^
    I feel they will fix this bug faster than I can understand anything :-)

  17. #29
    zerger3's Avatar Member
    Reputation
    8
    Join Date
    Jul 2011
    Posts
    55
    Thanks G/R
    4/6
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    well it works on windows 7 BUT for me poe is super laggy when i connect to vpn on my VM. normal ping is 20-35ms to google.com and if i login poe and stand around in town my ping to go goole goes to 1000ms and more
    also ingame ping is unusable
    i have no idea why that happens, cpu and ram are below 70%

  18. #30
    aseyoo's Avatar Member
    Reputation
    1
    Join Date
    Jan 2021
    Posts
    3
    Thanks G/R
    2/0
    Trade Feedback
    1 (100%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    in case someone need it, the new targetAddress is
    var targetAddress = baseAddress + (0x7FF64DC41E50 - 0x7FF64B680000);
    Last edited by aseyoo; 06-11-2021 at 12:15 PM. Reason: was wrong about meaning of second value, thought it's the same as baseAddress and not needed in equation

Page 2 of 2 FirstFirst 12

Similar Threads

  1. Anybody get VMware to work for Poe?
    By jobapwns in forum Path of Exile
    Replies: 4
    Last Post: 02-14-2013, 04:33 PM
  2. Gear to Get Your Rogue Karazhan Ready
    By mach1920 in forum WoW Instances & Raiding
    Replies: 12
    Last Post: 08-04-2008, 05:40 PM
  3. Getting a little botting security
    By NUBCAKE in forum World of Warcraft Bots and Programs
    Replies: 14
    Last Post: 12-20-2007, 06:43 PM
  4. were to get good wow bots?
    By Zim in forum World of Warcraft General
    Replies: 1
    Last Post: 12-05-2006, 04:13 PM
  5. Tool to get all Fish/bots working for EU version users! [self-made]
    By -MadMax- in forum World of Warcraft Bots and Programs
    Replies: 6
    Last Post: 09-08-2006, 09:02 AM
All times are GMT -5. The time now is 12:50 PM. Powered by vBulletin® Version 4.2.3
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. User Alert System provided by Advanced User Tagging (Pro) - vBulletin Mods & Addons Copyright © 2024 DragonByte Technologies Ltd.
Digital Point modules: Sphinx-based search