Skip to content
MPGHThe Dark Arts
/
RegisterLog in
Forum
Community
What's NewLatest posts across the boardTrendingHottest threads right nowSubscribedThreads you follow
Discussion
GeneralIntroductionsEntertainmentDebate FortFlaming & Rage
Board
News & AnnouncementsMPGH TimesSuggestions & HelpGiveaways
More Sections
Art & Graphic DesignProgrammingHackingCryptocurrency
Hacks & Cheats
Games
ValorantCS2 / CS:GOCall of Duty / WarzoneFortniteApex LegendsEscape From Tarkov
+14 moreLeague of LegendsGTA VMinecraftRustROTMGBattlefieldTroveBattleOnCombat ArmsCrossFireBlackshotRuneScapeDayZDead by Daylight
Resources
Game Hacking TutorialsReverse EngineeringGeneral Game HackingAnti-CheatConsole Game Hacking
Tools
Game Hacking ToolsTrainers & CheatsHack/Release NewsNew
Submit a release →Share your cheat, tool, or config with the community.
AINEW
AI Tools
General & DiscussionPrompt EngineeringLLM JailbreaksHotAI Agents & AutomationLocal / Open Models
AI × Gaming
AI Aimbots & VisionML Anti-CheatGame Bots & Automation
Create
AI Coding / Vibe CodingAI Art & MediaAI Voice & TTS
The AI frontier →Where game hacking meets modern machine learning. Jump in.
Marketplace
Buy & Sell
SellingBuyingTradingUser Services
Trust & Safety
Middleman LoungeMarketplace TalkVouch Copy Profiles
Money
Cryptocurrency TalkCurrency ExchangeWork & Job Offers
Start selling →List accounts, services, and goods. Use the middleman to trade safe.
MPGH The Dark Arts

A community for offensive security research, reverse engineering, and AI.

Community

ForumMarketplaceSearch

Account

RegisterLog in

Legal

Privacy PolicyForum RulesHelp & FAQ
© 2026 MPGH · All rights reserved.Built by the community, for the community. For educational purposes onlyContent is shared for security research and education — we don't condone illegal use. You're responsible for complying with applicable laws. Use at your own risk.
Home › Forum › MultiPlayer Game Hacks & Cheats › BattleOn Games Hacks, Cheats & Trainers › Adventure Quest Worlds (AQW) Hacks / Cheats / Trainers › Adventure Quest Worlds (AQW) Tutorials, Source Code & Coding › Semi-Beginners Guide to Writing an AQW Client [2022]

PostSemi-Beginners Guide to Writing an AQW Client [2022]

Posts 1–5 of 5 · Page 1 of 1
IfOnlyYouKnew
IfOnlyYouKnew
Semi-Beginners Guide to Writing an AQW Client [2022]
Hello. If you are not aware I've been on MPGH a little over a year. In this time I've fixed Grimoire/Cetera/Revenant to at least a minimal working extent. This guide does not teach you how those Clients are written as the methods they use are less versatile than the ones in this tutorial.

Step One:

First off its easiest to start with an AQW loader file
found at: [DONTURL]https://content.aq.com/game/gamefiles/Loader2.swf[/URL]
I had to link it this way as MPGH does not permit direct download links
and Browsers without flash support will auto-parse the link as a download-link.

Step Two:

Once you have this file you will need to decompile it.
I recommend SWF Decompiler by SoThink
found at: https://www.sothink.com/product/flashdecompiler/
The program will not output the code unless paid for, but I'll be pasting the code for it here.
You will not need the decompiler but to go through Game code after this, meaning you won't need to buy it,
I have a purchased copy but didn't for awhile.
Find the SWF Loader2 you downloaded in the left hand panel and click it.
On the right hand side check the box next to the swffilename.swf which should in turn check all the boxes the swf has.
Then above that choose Export FLA/FLEX and export as FLA.

Step Three: This is probably the most difficult step and I cannot recommend how to get it safely or legally.
You need Adobe Animate 2021, Yes 2021. This will compile the SWF file needed to make the Client and is your main IDE. Some "Portable" copies won't allow access to the internet and won't work, so make sure you get a good copy.

Step Four: Find the folder in which you extracted the SWF file to, open the Loader_Spider_fla folder.
You should see a file named MainTimeline.as
Open this file with your choice of Text Editor I use Notepad++ you can also use Animate 2021 if you have it.
Inside will look like the below snippet, the difference only lies in a few lines. If you don't have the paid copy of Sothink then it may just be empty in which case paste the below code replacing anything inside.
Code:
package Loader_Spider_fla
{
    import flash.display.*;
    import flash.events.*;
    import flash.net.*;
    import flash.system.*;

    dynamic public class MainTimeline extends MovieClip
    {
        public var mcLoading:MovieClip;
        public var sFile:Object;
        public var sTitle:Object;
        public var sBG:String;
        public var sURL:String = "https://game.aq.com/game/";
        public var isWeb:Boolean;
        public var doSignup:Boolean;
        public var isEU:Boolean;
        public var loginURL:String;
        public var versionURL:String;
        public var loader:URLLoader;
        public var loaderVars:Object;
        public var titleDomain:ApplicationDomain;

        public function MainTimeline()
        {
            addFrameScript(0, this.frame1);
            return;
        }// end function

        public function onDataComplete(event:Event) : void
        {
            trace("onDataComplete:" + event.target.data);
            var _loc_2:* = JSON.parse(event.target.data);
            this.sFile = _loc_2.sFile + "?ver=" + Math.random();
            this.sTitle = _loc_2.sTitle;
            this.sBG = _loc_2.sBG;
            this.isEU = _loc_2.isEU == "true";
            trace("FlugelHorn = " + this.isEU);
            this.loaderVars = _loc_2;
            this.loadTitle();
            return;
        }// end function

        public function loadTitle() : void
        {
            var _loc_1:* = new Loader();
            _loc_1.contentLoaderInfo.addEventListener(Even*****MPLETE, this.onTitleComplete);
            _loc_1.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, this.onTitleError);
            _loc_1.load(new URLRequest(this.sURL + "gamefiles/title/" + this.sBG), new LoaderContext(false, this.titleDomain));
            return;
        }// end function

        public function onTitleComplete(event:Event) : void
        {
            trace("Title Loaded");
            this.loadGame();
            return;
        }// end function

        public function onTitleError(event:IOErrorEvent) : void
        {
            Loader(event.target.loader).removeEventListener(IOErrorEvent.IO_ERROR, this.onTitleError);
            trace("Title Loading Error: " + event);
            this.loadGame();
            return;
        }// end function

        public function loadGame() : void
        {
            var _loc_1:* = new Loader();
            _loc_1.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, this.onProgress);
            _loc_1.contentLoaderInfo.addEventListener(Even*****MPLETE, this.onComplete);
            _loc_1.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, this.onError);
            _loc_1.load(new URLRequest(this.sURL + "gamefiles/" + this.sFile));
            this.mcLoading.strLoad.text = "Loading 0%";
            return;
        }// end function

        public function onProgress(event:ProgressEvent) : void
        {
            var _loc_2:* = event.currentTarget.bytesLoaded / event.currentTarget.bytesTotal * 100;
            this.mcLoading.strLoad.text = "Loading " + _loc_2 + "%";
            return;
        }// end function

        public function onComplete(event:Event) : void
        {
            var _loc_2:* = stage;
            _loc_2.removeChildAt(0);
            var _loc_3:* = _loc_2.addChild(MovieClip(Loader(event.target.loader).content));
            _loc_3.params.sTitle = this.sTitle;
            _loc_3.params.vars = this.loaderVars;
            _loc_3.params.isWeb = this.isWeb;
            _loc_3.params.sURL = this.sURL;
            _loc_3.params.sBG = this.sBG;
            _loc_3.params.isEU = this.isEU;
            _loc_3.params.doSignup = this.doSignup;
            _loc_3.params.loginURL = this.loginURL;
            _loc_3.params.test = false;
            trace("Game ISWEB? " + _loc_3.params.isWeb);
            trace("Game.isEU = " + _loc_3.params.isEU);
            _loc_3.titleDomain = this.titleDomain;
            return;
        }// end function

        public function onError(event:IOErrorEvent) : void
        {
            trace("Preloader IOError: " + event);
            Loader(event.target.loader).removeEventListener(IOErrorEvent.IO_ERROR, this.onError);
            return;
        }// end function

        function frame1()
        {
            Security.allowDomain("*");
			Security.loadPolicyFile("https://game.aq.com/crossdomain.xml");
			Security.allowInsecureDomain("*");
			Security.loadPolicyFile("https://aq.com/crossdomain.xml");
			Security.allowInsecureDomain("*");
			Security.loadPolicyFile("https://content.aq.com/crossdomain.xml");
			Security.allowInsecureDomain("*");
			Security.loadPolicyFile("https://aq.battleon.com/crossdomain.xml");
			Security.allowInsecureDomain("*");
			stop();
            this.sURL = "https://game.aq.com/game/";
            this.isWeb = false;
            this.doSignup = false;
            this.isEU = false;
            this.loginURL = this.sURL + "api/login/now";
            try
            {
                this.isWeb = root.loaderInfo.parameters.isweb == "true";
                this.doSignup = root.loaderInfo.parameters.dosignup == "true";
                trace("isWeb? " + this.isWeb + " doSignup=" + this.doSignup);
            }
            catch (e:Error)
            {
                trace("standalone");
                isWeb = false;
                doSignup = false;
            }
            this.versionURL = this.sURL + "api/data/gameversion?ver=" + Math.random();
            trace("versionURL: " + this.versionURL);
            this.loader = new URLLoader();
            this.loader.addEventListener(Even*****MPLETE, this.onDataComplete);
            this.loader.load(new URLRequest(this.versionURL));
            this.titleDomain = new ApplicationDomain();
            return;
        }// end function

    }
}
Save the file.

Step Five: Open the Loader.fla file located in the Base folder of your extracted SWF with Animate.
Once open press the play button in the top right, if you did everything right...the loader should open and load you to the title screen.
Close it.

Step Six: In the animate project create an Object by choosing the shape button in the toolbar on the left.
Ensure that at the bottom of the toolbar now that you have selected the shape you have enabled the Object Drawing so it comes out as one piece.

Select your object on screen, right-click, choose Convert to Symbol and name something or just leave it as Symbol1.

Now with the Symbol you just made selected head to the righthand properties panel under Object. Change the top setting to say Movie Clip instead of Graphic. Underneath that name your Movie Clip - such as cheatMenu

Step Seven: Open the MainTimeline.as and find where the variable are being declared for the class. For example: public var isEU:Boolean;
you need to add your Menu as an object here. So add this line or similar if you named your object cheatMenu just do the same.
Code:
 public var cheatMenu:Object;
Head further into the code until you find: "onComplete(event:Event)"
Inside of the method below "var _loc_3:* = _loc_2.addChild(MovieClip(Loader(event.target.load er).content));"
add:
Code:
_loc_3.addChild(cheatMenu);
Save the file.

Step Eight: In Animate press the play button in the upper right.
If all's done right, when the game loads this time your Symbol/Menu should stay on screen.
This means you're ready to start making a cheat menu.

Step nine: Adding other object and scripts are similar but you can't add more to the _loc_3 so create your new Symbols inside of your menu file. and name them to call them. You will not need to add them as objects like the first one but instead call cheatMenu.NameOfSymbol when trying to access them.

Step ten: Download a copy of the game from the same link as the loader just replace "Loader2.swf" with "Game3070.swf"
Use Sothink decompiler to read the game code. The two most useful scriptfiles for starters are Game.as and World.as. Best of luck as I am done typing. Hope this helps someone sorry I am not the best at explaining if you have any questions comment below.
#1 · 4y ago
RV
rvteodoro8
I tried to review everything but I got an error in step 5 when I press the play button.


EDIT: I got it working in a private server! Thanks! Im willing to learn more how to make a bot here
image_2022-08-05_231857882.png
#2 · edited 3y ago · 3y ago
SK
SkyNezzz
to create a private server? can you help me with that mate
#3 · 3y ago
SU
SunnyGuy
Thank you. That's what I was looking for. I'm just starting my acquaintance with AQW so I'm looking for information.
#4 · 3y ago
CO
CoffeeMorena
One smol issue
Everytime I press the debug/play button in Animate, it says this error:

Code:
Attempting to launch and connect to Player using URL E:\Loader2\~Loader2.swf
[SWF] E:\Loader2\~Loader2.swf - 19916 bytes after decompression
*** Security Sandbox Violation ***
Connection to https://game.aq.com/crossdomain.xml halted - not permitted from file:///E|/Loader2/%7ELoader2.swf
-- Untrusted local SWFs may not contact the Internet.
*** Security Sandbox Violation ***
Connection to https://aq.com/crossdomain.xml halted - not permitted from file:///E|/Loader2/%7ELoader2.swf
-- Untrusted local SWFs may not contact the Internet.
*** Security Sandbox Violation ***
Connection to https://content.aq.com/crossdomain.xml halted - not permitted from file:///E|/Loader2/%7ELoader2.swf
-- Untrusted local SWFs may not contact the Internet.
*** Security Sandbox Violation ***
Connection to https://aq.battleon.com/crossdomain.xml halted - not permitted from file:///E|/Loader2/%7ELoader2.swf
-- Untrusted local SWFs may not contact the Internet.
isWeb? false doSignup=false
versionURL: https://game.aq.com/game/api/data/gameversion?ver=0.703343412373215
*** Security Sandbox Violation ***
Connection to https://game.aq.com/game/api/data/gameversion?ver=0.703343412373215 halted - not permitted from file:///E|/Loader2/%7ELoader2.swf
-- Untrusted local SWFs may not contact the Internet.
SecurityError: Error #2028: Local-with-filesystem SWF file file:///E|/Loader2/%7ELoader2.swf cannot access Internet URL https://game.aq.com/game/api/data/gameversion?ver=0.703343412373215.
	at flash.net::URLStream/load()
	at flash.net::URLLoader/load()
	at Loader_Spider_fla::MainTimeline/frame1()[E:\Loader2\Loader_Spider_fla\MainTimeline.as:148]
Cannot display source code at this location.
the Loader2.swf somehow keeps getting blocked for being untrusted. When I open the .swf file in its folder, it opens up and has the cheatMenu I added but only stays in the loading screen. Is that fine?

Last edit: Got it working, just had to Clear Publish Cache and Test Movie.
#5 · edited 3y ago · 3y ago
Posts 1–5 of 5 · Page 1 of 1

Post a Reply

Similar Threads

  • {Complete} Beginners Guide To HackingBy MagixAries in MapleStory Tutorial & Guides
    31Last post 10y ago
  • PHP Beginners Guide #1By yearupie in PHP Programming
    3Last post 16y ago
  • A Texture Guide For Beginners.By handford in Combat Arms EU Mods & Rez Modding Help
    9Last post 15y ago
  • PEPSI's gun guide beginners-proBy pepsi233 in Combat Arms Discussions
    2Last post 16y ago
  • The Ultimate Guide(For Beginners): ReversingBy rwkeith in Assembly
    2Last post 17y ago

Tags for this Thread

None