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.