├── FortAlpha.sln
├── FortAlpha
├── FortAlpha.vcxproj
├── FortAlpha.vcxproj.filters
├── Responses
│ ├── profile0.json
│ ├── storefront.json
│ └── worldinfo.json
├── dllmain.cpp
├── frontend.h
├── functions.h
├── hooks.h
├── minhook
│ ├── LICENSE.txt
│ ├── MinHook.h
│ └── libMinHook.x86.lib
├── offsets.h
├── ue4.h
└── util.h
└── README.md
/FortAlpha.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 17
4 | VisualStudioVersion = 17.0.31423.177
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FortAlpha", "FortAlpha\FortAlpha.vcxproj", "{4B26D372-2F32-4E8D-A040-BF0056BFE0E6}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|x64 = Debug|x64
11 | Debug|x86 = Debug|x86
12 | Release|x64 = Release|x64
13 | Release|x86 = Release|x86
14 | EndGlobalSection
15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
16 | {4B26D372-2F32-4E8D-A040-BF0056BFE0E6}.Debug|x64.ActiveCfg = Debug|x64
17 | {4B26D372-2F32-4E8D-A040-BF0056BFE0E6}.Debug|x64.Build.0 = Debug|x64
18 | {4B26D372-2F32-4E8D-A040-BF0056BFE0E6}.Debug|x86.ActiveCfg = Debug|Win32
19 | {4B26D372-2F32-4E8D-A040-BF0056BFE0E6}.Debug|x86.Build.0 = Debug|Win32
20 | {4B26D372-2F32-4E8D-A040-BF0056BFE0E6}.Release|x64.ActiveCfg = Release|x64
21 | {4B26D372-2F32-4E8D-A040-BF0056BFE0E6}.Release|x64.Build.0 = Release|x64
22 | {4B26D372-2F32-4E8D-A040-BF0056BFE0E6}.Release|x86.ActiveCfg = Release|Win32
23 | {4B26D372-2F32-4E8D-A040-BF0056BFE0E6}.Release|x86.Build.0 = Release|Win32
24 | EndGlobalSection
25 | GlobalSection(SolutionProperties) = preSolution
26 | HideSolutionNode = FALSE
27 | EndGlobalSection
28 | GlobalSection(ExtensibilityGlobals) = postSolution
29 | SolutionGuid = {2A729EE7-DA61-4C13-BF87-03267159DFC7}
30 | EndGlobalSection
31 | EndGlobal
32 |
--------------------------------------------------------------------------------
/FortAlpha/FortAlpha.vcxproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | Win32
7 |
8 |
9 | Release
10 | Win32
11 |
12 |
13 | Debug
14 | x64
15 |
16 |
17 | Release
18 | x64
19 |
20 |
21 |
22 | 16.0
23 | Win32Proj
24 | {4b26d372-2f32-4e8d-a040-bf0056bfe0e6}
25 | FortAlpha
26 | 10.0
27 |
28 |
29 |
30 | DynamicLibrary
31 | true
32 | v142
33 | Unicode
34 |
35 |
36 | DynamicLibrary
37 | false
38 | v142
39 | true
40 | Unicode
41 |
42 |
43 | DynamicLibrary
44 | true
45 | v142
46 | Unicode
47 |
48 |
49 | DynamicLibrary
50 | false
51 | v142
52 | true
53 | Unicode
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 | true
75 |
76 |
77 | false
78 |
79 |
80 | true
81 |
82 |
83 | false
84 |
85 |
86 |
87 | Level3
88 | true
89 | WIN32;_DEBUG;FORTALPHA_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)
90 | true
91 | Use
92 | pch.h
93 |
94 |
95 | Windows
96 | true
97 | false
98 |
99 |
100 |
101 |
102 | Level3
103 | true
104 | true
105 | true
106 | WIN32;NDEBUG;FORTALPHA_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)
107 | true
108 | NotUsing
109 | pch.h
110 |
111 |
112 | true
113 |
114 |
115 | Windows
116 | true
117 | true
118 | true
119 | false
120 |
121 |
122 | /FORCE %(AdditionalOptions)
123 |
124 |
125 |
126 |
127 | Level3
128 | true
129 | _DEBUG;FORTALPHA_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)
130 | true
131 | Use
132 | pch.h
133 |
134 |
135 | Windows
136 | true
137 | false
138 |
139 |
140 |
141 |
142 | Level3
143 | true
144 | true
145 | true
146 | NDEBUG;FORTALPHA_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)
147 | true
148 | NotUsing
149 | pch.h
150 |
151 |
152 | Windows
153 | true
154 | true
155 | true
156 | false
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
--------------------------------------------------------------------------------
/FortAlpha/FortAlpha.vcxproj.filters:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx
7 |
8 |
9 | {93995380-89BD-4b04-88EB-625FBE52EBFB}
10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd
11 |
12 |
13 |
14 |
15 | Source Files
16 |
17 |
18 |
19 |
20 | Header Files
21 |
22 |
23 | Header Files
24 |
25 |
26 | Header Files
27 |
28 |
29 | Header Files
30 |
31 |
32 | Header Files
33 |
34 |
35 | Header Files
36 |
37 |
38 |
--------------------------------------------------------------------------------
/FortAlpha/Responses/profile0.json:
--------------------------------------------------------------------------------
1 | {
2 | "profileRevision": 480,
3 | "profileId": "profile0",
4 | "profileChangesBaseRevision": 480,
5 | "profileChanges": [
6 | {
7 | "changeType": "fullProfileUpdate",
8 | "profile": {
9 | "_id": "faefefcfdaad4eae8aed65c3139376f8",
10 | "created": "2017-08-29T20:38:59.824Z",
11 | "updated": "2017-12-25T02:08:43.518Z",
12 | "rvn": 480,
13 | "wipeNumber": 9,
14 | "accountId": "b810c129520946d6801a58bb9d5859fc",
15 | "profileId": "profile0",
16 | "version": "s1",
17 | "notifications": 10,
18 | "level": 50,
19 | "stats": {
20 | "level": 50,
21 | "templateId": "profile_v2",
22 | "attributes": {
23 | "node_costs": {
24 | "t1_main_nodepage_layer1": {
25 | "Token:homebasepoints": 5
26 | }
27 | },
28 | "level": 30,
29 | "xp": 36000,
30 | "level_info": 20,
31 | "totalBalance": 500,
32 | "homebase": {
33 | "townName": "Name",
34 | "flagPattern": 5,
35 | "flagColor": 0,
36 | "level": 30
37 | },
38 | "commandRevision": 263
39 | }
40 | }
41 | }
42 | }
43 | ],
44 | "profileCommandRevision": 263,
45 | "serverTime": "2017-12-25T11:48:28.089Z",
46 | "responseVersion": 1
47 | }
--------------------------------------------------------------------------------
/FortAlpha/Responses/storefront.json:
--------------------------------------------------------------------------------
1 | {
2 | "refreshIntervalHrs": 24,
3 | "dailyPurchaseHrs": 24,
4 | "expiration": "9999-12-31T23:59:59.999Z",
5 | "storefronts": [
6 | {
7 | "name": "CardPackStorePromo",
8 | "catalogEntries": [
9 | {
10 | "offerId": "C060A6539A1743CA94C35D132EA91F4D",
11 | "devName": "Bonus.WeaponsPack.02",
12 | "offerType": "StaticPrice",
13 | "prices": [
14 | {
15 | "currencyType": "MtxCurrency",
16 | "currencySubType": "",
17 | "regularPrice": 200,
18 | "finalPrice": 200,
19 | "saleExpiration": "9999-12-31T23:59:59.999Z",
20 | "basePrice": 200
21 | }
22 | ],
23 | "categories": [],
24 | "dailyLimit": 3,
25 | "weeklyLimit": -1,
26 | "monthlyLimit": -1,
27 | "appStoreId": [
28 | "",
29 | "",
30 | "",
31 | "",
32 | "",
33 | "",
34 | "",
35 | "",
36 | ""
37 | ],
38 | "requirements": [],
39 | "metaInfo": [
40 | {
41 | "key": "RequiredTag",
42 | "value": "Account.Buff.BonusStoreOffer"
43 | }
44 | ],
45 | "metaAssetInfo": {
46 | "structName": "FortCatalogMeta",
47 | "payload": {
48 | "chaseItems": [
49 | "FortHeroType'/Game/Heroes/Class_Commando.Class_Commando'",
50 | "FortWorkerType'/Game/Items/Workers/Managers/ManagerDoctor_T01.ManagerDoctor_T01'",
51 | "FortSchematicItemDefinition'/Game/Loot/Schematics/Ranged/Assault_Auto_T04.Assault_Auto_T04'"
52 | ],
53 | "packDefinition": "FortCardPackItemDefinition'/Game/Loot/CardPacks/CardPack_Bronze_Weapons.CardPack_Bronze_Weapons'"
54 | }
55 | },
56 | "catalogGroup": "",
57 | "catalogGroupPriority": 0,
58 | "sortPriority": 0,
59 | "title": "Upgrade Llama",
60 | "shortDescription": "",
61 | "description": "Upgrade Llama",
62 | "displayAssetPath": "",
63 | "itemGrants": [
64 | {
65 | "templateId": "CardPack:CardPack_Bronze_Weapons",
66 | "quantity": 1
67 | }
68 | ]
69 | },
70 | {
71 | "offerId": "C060A6539A1743CA94C35D132EA91F4D",
72 | "devName": "Bonus.WeaponsPack.02",
73 | "offerType": "StaticPrice",
74 | "prices": [
75 | {
76 | "currencyType": "MtxCurrency",
77 | "currencySubType": "",
78 | "regularPrice": 0,
79 | "finalPrice": 0,
80 | "saleExpiration": "9999-12-31T23:59:59.999Z",
81 | "basePrice": 0
82 | }
83 | ],
84 | "categories": [],
85 | "dailyLimit": 3,
86 | "weeklyLimit": -1,
87 | "monthlyLimit": -1,
88 | "appStoreId": [
89 | "",
90 | "",
91 | "",
92 | "",
93 | "",
94 | "",
95 | "",
96 | "",
97 | ""
98 | ],
99 | "requirements": [],
100 | "metaInfo": [
101 | {
102 | "key": "RequiredTag",
103 | "value": "Account.Buff.BonusStoreOffer"
104 | }
105 | ],
106 | "metaAssetInfo": {
107 | "structName": "FortCatalogMeta",
108 | "payload": {
109 | "chaseItems": [
110 | "FortSchematicItemDefinition'/Game/Loot/Schematics/Ranged/Assault_Auto_T10.Assault_Auto_T10'",
111 | "FortSchematicItemDefinition'/Game/Loot/Schematics/Ranged/Assault_Hydra_T09.Assault_Hydra_T09'",
112 | "FortSchematicItemDefinition'/Game/Loot/Schematics/Ranged/Assault_Raygun_Auto_T08.Assault_Raygun_Auto_T08'"
113 | ],
114 | "packDefinition": "FortCardPackItemDefinition'/Game/Loot/CardPacks/CardPack_Jackpot.CardPack_Jackpot'"
115 | }
116 | },
117 | "catalogGroup": "",
118 | "catalogGroupPriority": 0,
119 | "sortPriority": 0,
120 | "title": "Free Llama",
121 | "shortDescription": "",
122 | "description": "Free",
123 | "displayAssetPath": "",
124 | "itemGrants": [
125 | {
126 | "templateId": "CardPack:CardPack_Jackpot",
127 | "quantity": 1
128 | }
129 | ]
130 | }
131 | ]
132 | },
133 | {
134 | "name": "CurrencyStorefront",
135 | "catalogEntries": [
136 | {
137 | "offerId": "A094F1D14BAE8DA77114DAAE76AFCA83",
138 | "devName": "Medium Currency Pack",
139 | "offerType": "StaticPrice",
140 | "prices": [
141 | {
142 | "currencyType": "RealMoney",
143 | "currencySubType": "",
144 | "regularPrice": 1999,
145 | "finalPrice": 1999,
146 | "saleExpiration": "9999-12-31T23:59:59.999Z",
147 | "basePrice": 1999
148 | }
149 | ],
150 | "categories": [],
151 | "dailyLimit": -1,
152 | "weeklyLimit": -1,
153 | "monthlyLimit": -1,
154 | "appStoreId": [
155 | "",
156 | "559f2ba95f874ec987d0ebfd2cc9c70a",
157 | "ios_vbucks_medium",
158 | "10200",
159 | "google_vbucks_medium",
160 | "",
161 | "MTX03K0000000000",
162 | "cee19aa0-5238-4656-9e52-c8bd0765eb53",
163 | "c-virtualcurrency0-MTX2800"
164 | ],
165 | "requirements": [],
166 | "metaInfo": [
167 | {
168 | "key": "MtxQuantity",
169 | "value": "2800"
170 | },
171 | {
172 | "key": "MtxBonus",
173 | "value": "300"
174 | }
175 | ],
176 | "catalogGroup": "",
177 | "catalogGroupPriority": 0,
178 | "sortPriority": 2,
179 | "title": "Medium Currency Pack",
180 | "shortDescription": "",
181 | "description": "This in-game currency can be used to purchase new customization items for your Hero, glider, or pickaxe.",
182 | "displayAssetPath": "/Game/Catalog/DisplayAssets/DA_MtxPack2800.DA_MtxPack2800",
183 | "itemGrants": []
184 | },
185 | {
186 | "offerId": "E2BD4F70498AF13ADAA071B04F885292",
187 | "devName": "Small Currency Pack",
188 | "offerType": "StaticPrice",
189 | "prices": [
190 | {
191 | "currencyType": "RealMoney",
192 | "currencySubType": "",
193 | "regularPrice": 799,
194 | "finalPrice": 799,
195 | "saleExpiration": "9999-12-31T23:59:59.999Z",
196 | "basePrice": 799
197 | }
198 | ],
199 | "categories": [],
200 | "dailyLimit": -1,
201 | "weeklyLimit": -1,
202 | "monthlyLimit": -1,
203 | "appStoreId": [
204 | "",
205 | "ede05b3c97e9475a8d9be91da65750f0",
206 | "ios_vbucks_small",
207 | "10100",
208 | "google_vbucks_small",
209 | "",
210 | "MTX01K0000000000",
211 | "6caed040-72dc-499a-9337-a165f1ec0a26",
212 | "c-virtualcurrency0-MTX1000"
213 | ],
214 | "requirements": [],
215 | "metaInfo": [
216 | {
217 | "key": "MtxQuantity",
218 | "value": "1000"
219 | },
220 | {
221 | "key": "MtxBonus",
222 | "value": "0"
223 | }
224 | ],
225 | "catalogGroup": "",
226 | "catalogGroupPriority": 0,
227 | "sortPriority": 3,
228 | "title": "Small Currency Pack",
229 | "shortDescription": "",
230 | "description": "This in-game currency can be used to purchase new customization items for your Hero, glider, or pickaxe.",
231 | "displayAssetPath": "/Game/Catalog/DisplayAssets/DA_MtxPack1000.DA_MtxPack1000",
232 | "itemGrants": []
233 | },
234 | {
235 | "offerId": "425FDD804D9D61AC2530CE8F31398BCD",
236 | "devName": "Large Currency Pack",
237 | "offerType": "StaticPrice",
238 | "prices": [
239 | {
240 | "currencyType": "RealMoney",
241 | "currencySubType": "",
242 | "regularPrice": 4999,
243 | "finalPrice": 4999,
244 | "saleExpiration": "9999-12-31T23:59:59.999Z",
245 | "basePrice": 4999
246 | }
247 | ],
248 | "categories": [],
249 | "dailyLimit": -1,
250 | "weeklyLimit": -1,
251 | "monthlyLimit": -1,
252 | "appStoreId": [
253 | "",
254 | "3b4c5df9efa5415b941cf74262865e4e",
255 | "ios_vbucks_large",
256 | "10300",
257 | "google_vbucks_large",
258 | "",
259 | "MTX08K0000000000",
260 | "d299e00d-811e-4b57-85c1-ec06cbc40074",
261 | "c-virtualcurrency0-MTX7500"
262 | ],
263 | "requirements": [],
264 | "metaInfo": [
265 | {
266 | "key": "MtxQuantity",
267 | "value": "7500"
268 | },
269 | {
270 | "key": "MtxBonus",
271 | "value": "1500"
272 | }
273 | ],
274 | "catalogGroup": "",
275 | "catalogGroupPriority": 0,
276 | "sortPriority": 1,
277 | "title": "Large Currency Pack",
278 | "shortDescription": "",
279 | "description": "This in-game currency can be used to purchase new customization items for your Hero, glider, or pickaxe.",
280 | "displayAssetPath": "/Game/Catalog/DisplayAssets/DA_MtxPack7500.DA_MtxPack7500",
281 | "itemGrants": []
282 | },
283 | {
284 | "offerId": "50DC69A74BC4B8D10AF8D5B17A4BF8D4",
285 | "devName": "Jumbo Currency Pack",
286 | "offerType": "StaticPrice",
287 | "prices": [
288 | {
289 | "currencyType": "RealMoney",
290 | "currencySubType": "",
291 | "regularPrice": 7999,
292 | "finalPrice": 7999,
293 | "saleExpiration": "9999-12-31T23:59:59.999Z",
294 | "basePrice": 7999
295 | }
296 | ],
297 | "categories": [],
298 | "dailyLimit": -1,
299 | "weeklyLimit": -1,
300 | "monthlyLimit": -1,
301 | "appStoreId": [
302 | "",
303 | "4daadb392f1c4ee2b5a3af443e614d2a",
304 | "ios_vbucks_jumbo",
305 | "10400",
306 | "google_vbucks_jumbo",
307 | "",
308 | "MTX14K0000000000",
309 | "d15248c0-acf6-48b7-9632-c9638cba4b37",
310 | "c-virtualcurrency0-MTX13500"
311 | ],
312 | "requirements": [],
313 | "metaInfo": [
314 | {
315 | "key": "MtxQuantity",
316 | "value": "13500"
317 | },
318 | {
319 | "key": "MtxBonus",
320 | "value": "3500"
321 | }
322 | ],
323 | "catalogGroup": "",
324 | "catalogGroupPriority": 0,
325 | "sortPriority": 4,
326 | "title": "Jumbo Currency Pack",
327 | "shortDescription": "",
328 | "description": "This in-game currency can be used to purchase new customization items for your Hero, glider, or pickaxe.",
329 | "displayAssetPath": "/Game/Catalog/DisplayAssets/DA_MtxPack13500.DA_MtxPack13500",
330 | "itemGrants": []
331 | }
332 | ]
333 | }
334 | ]
335 | }
--------------------------------------------------------------------------------
/FortAlpha/dllmain.cpp:
--------------------------------------------------------------------------------
1 | #include "hooks.h"
2 |
3 | DWORD WINAPI Main(PVOID pParam)
4 | {
5 | Util::InitConsole();
6 | printf("Wait...\n");
7 | Offsets::Init();
8 | Hooks::Init();
9 | Frontend::UnlockConsole();
10 | printf("Ok now login\n");
11 |
12 | return NULL;
13 | }
14 |
15 | BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, PVOID pReserved)
16 | {
17 | switch (dwReason)
18 | {
19 | case DLL_PROCESS_ATTACH:
20 | CreateThread(0, 0, Main, hModule, 0, 0);
21 | break;
22 | }
23 |
24 | return TRUE;
25 | }
26 |
27 |
--------------------------------------------------------------------------------
/FortAlpha/frontend.h:
--------------------------------------------------------------------------------
1 | #include "functions.h"
2 |
3 | namespace Frontend
4 | {
5 | void UnlockConsole()
6 | {
7 | auto NewConsole = SpawnObject(FindObject(L"Class /Script/Engine.Console"), Offsets::GameViewportClient);
8 | *(UObject**)(DWORD(Offsets::GameViewportClient) + Offsets::ViewportConsoleOffset) = NewConsole;
9 | }
10 |
11 | void SetupHeroMenu()
12 | {
13 | auto FortHero = FindObject(L"FortHero /Engine/Transient.FortHero_0");
14 |
15 | *(int*)(DWORD(FortHero) + Offsets::HeroLevelOffset) = 25;
16 | *(int*)(DWORD(FortHero) + Offsets::HeroXPOffset) = 300;
17 | *(FString*)(DWORD(FortHero) + Offsets::HeroNameOffset) = L"Rescue Trooper Ramirez";
18 | *(int*)(DWORD(FortHero) + Offsets::HeroGenderOffset) = 2;
19 |
20 | SetPersonalHeroChoice(FortHero);
21 | }
22 |
23 | void SetRatings()
24 | {
25 | auto HomeBaseRatingWidget = FindObject(L"HomeBaseRatingWidget_C /Engine/Transient.FortEngine_0.FortGameInstance_0.HomeBase_C_0.WidgetTree_1.TopBar.WidgetTree_475.HomeBaseRatingWidget");
26 | auto MtxCurrencyWidget = FindObject(L"MtxCurrency_Widget_C /Engine/Transient.FortEngine_0.FortGameInstance_0.HomeBase_C_0.WidgetTree_1.TopBar.WidgetTree_475.TopBar_MtxCurrency_Widget");
27 |
28 | Offsets::CurrentSelfValueOffset = FindOffset(L"IntProperty /Game/UI/HomeBase/HomeBaseRatingWidget.HomeBaseRatingWidget_C.CurrentSelfValue");
29 | Offsets::CurrentTeamValueOffset = FindOffset(L"IntProperty /Game/UI/HomeBase/HomeBaseRatingWidget.HomeBaseRatingWidget_C.CurrentTeamValue");
30 | Offsets::CurrentTotalValueOffset = FindOffset(L"IntProperty /Game/UI/HomeBase/HomeBaseRatingWidget.HomeBaseRatingWidget_C.CurrentTotalValue");
31 |
32 | *(int*)(DWORD(HomeBaseRatingWidget) + Offsets::CurrentSelfValueOffset) = 7921;
33 | *(int*)(DWORD(HomeBaseRatingWidget) + Offsets::CurrentTeamValueOffset) = 5684;
34 | *(int*)(DWORD(HomeBaseRatingWidget) + Offsets::CurrentTotalValueOffset) = 13605;
35 |
36 | UpdateRatingWidget(HomeBaseRatingWidget);
37 | UpdateMtxWidget(MtxCurrencyWidget, 500);
38 |
39 | *(bool*)(DWORD(Offsets::PlayerController) + Offsets::bTutorialCompletedOffset) = true;
40 | }
41 |
42 | // I tried to load all the account items with JonLHack but I got the memory error 💀. Try it if you want or put all the items you want in a llama
43 | void GiveAccountItems()
44 | {
45 | for (int i = 0; i < GObjects->ObjObjects.NumElements; i++)
46 | {
47 | auto Object = GObjects->ObjObjects.Objects[i].Object;
48 | auto ClassName = GetName(Object->Class);
49 | if (ClassName == L"Class /Script/FortniteGame.FortHeroType" ||
50 | ClassName == L"Class /Script/FortniteGame.FortWorkerType" ||
51 | ClassName == L"Class /Script/FortniteGame.FortPersistentResourceItemDefinition" ||
52 | ClassName == L"Class /Script/FortniteGame.FortSchematicItemDefinition")
53 | {
54 | if (!(GetName(Object).find(L"Default") != std::string::npos))
55 | GivePlayerLocalAccountItem(Object);
56 | }
57 | }
58 | }
59 |
60 | void DestroyBuildingTooltips()
61 | {
62 | struct Params
63 | {
64 | UObject* Object;
65 | };
66 | #
67 | Params params;
68 |
69 | for (int i = 0; i < GObjects->ObjObjects.NumElements; i++)
70 | {
71 | auto Object = GObjects->ObjObjects.Objects[i].Object;
72 |
73 | if (Object)
74 | {
75 | if (GetName(Object).find(L"HB_") != std::string::npos && GetName(Object).find(L"WidgetComponent") != std::string::npos)
76 | {
77 | params.Object = Object;
78 | ProcessEvent(Object, Object, Offsets::DestroyComponentFunc, ¶ms);
79 | }
80 | }
81 | }
82 | }
83 |
84 | void OpenLlama()
85 | {
86 | ProcessEvent(Offsets::StorePinataMaster, Offsets::StorePinataMaster, Offsets::StartPackOpenFunc, nullptr);
87 | }
88 | }
--------------------------------------------------------------------------------
/FortAlpha/functions.h:
--------------------------------------------------------------------------------
1 | #include "offsets.h"
2 |
3 | static UObject* SpawnObject(UObject* Class, UObject* Outer)
4 | {
5 | struct Params
6 | {
7 | UObject* ObjectClass;
8 | UObject* Outer;
9 | UObject* ReturnValue;
10 | };
11 |
12 | Params params;
13 | params.ObjectClass = Class;
14 | params.Outer = Outer;
15 |
16 | ProcessEvent(Offsets::GameplayStatics, Offsets::GameplayStatics, Offsets::SpawnObjectFunc, ¶ms);
17 |
18 | return params.ReturnValue;
19 | }
20 |
21 | static void GivePlayerLocalAccountItem(UObject* ItemDefinition, int Count = 1)
22 | {
23 | struct Params
24 | {
25 | UObject* ItemDefinition;
26 | int Count;
27 | };
28 |
29 | Params params;
30 | params.Count = Count;
31 | params.ItemDefinition = ItemDefinition;
32 |
33 | ProcessEvent(Offsets::PlayerController, Offsets::PlayerController, Offsets::GivePlayerLocalAccountItemFunc, ¶ms);
34 | }
35 |
36 | static void SetPersonalHeroChoice(UObject* Hero)
37 | {
38 | struct Params
39 | {
40 | UObject* Hero;
41 | };
42 |
43 | Params params;
44 | params.Hero = Hero;
45 |
46 | ProcessEvent(Offsets::FrontendContext, Offsets::FrontendContext, Offsets::SetPersonalHeroChoiceFunc, ¶ms);
47 | }
48 |
49 | static void ControlCloudsUpdate()
50 | {
51 | auto OnboardingCloudCover = FindObject(L"S_HB_OnboardingCloudCover_C /Game/Maps/FortniteEntry.FortniteEntry.PersistentLevel.S_HB_OnboardingCloudCover_C_0");
52 |
53 | ProcessEvent(OnboardingCloudCover, OnboardingCloudCover, Offsets::ControlCloudsUpdateFunc, nullptr);
54 | }
55 |
56 | static void SetActorHiddenInGame(UObject* Actor, bool bNewHidden)
57 | {
58 | struct Params
59 | {
60 | bool bNewHidden;
61 | };
62 |
63 | Params params;
64 | params.bNewHidden = bNewHidden;
65 |
66 | ProcessEvent(Actor, Actor, Offsets::SetActorHiddenInGameFunc, ¶ms);
67 | }
68 |
69 | void UpdateRatingWidget(UObject* HomeBaseRatingWidget)
70 | {
71 | auto UpdateFunc = FindObject(L"Function /Game/UI/HomeBase/HomeBaseRatingWidget.HomeBaseRatingWidget_C.Update");
72 | ProcessEvent(HomeBaseRatingWidget, HomeBaseRatingWidget, UpdateFunc, nullptr);
73 | }
74 |
75 | void UpdateMtxWidget(UObject* MtxWidget, int Value)
76 | {
77 | auto SetMtxValueFunc = FindObject(L"Function /Game/UI/Global_Elements/MtxCurrency_Widget.MtxCurrency_Widget_C.Set_MtxValue_from_Int");
78 |
79 | struct Params
80 | {
81 | int Value;
82 | };
83 |
84 | Params params;
85 | params.Value = Value;
86 |
87 | ProcessEvent(MtxWidget, MtxWidget, SetMtxValueFunc, ¶ms);
88 | }
89 |
90 | void SetShowHUD(bool bNewShowHUD)
91 | {
92 | struct Params
93 | {
94 | bool bNewShowHUD;
95 | };
96 |
97 | Params params;
98 | params.bNewShowHUD = bNewShowHUD;
99 |
100 | ProcessEvent(Offsets::PlayerController, Offsets::PlayerController, Offsets::SetShowHUDFunc, ¶ms);
101 | }
102 |
103 | void OpenLlama()
104 | {
105 | auto StorePinataMaster = FindObject(L"StorePinataMaster_BP_C /Game/Maps/FrontEnd/Maps/FrontEndStore.FrontEndStore.PersistentLevel.StorePinataMaster_BP_C_0");
106 | ProcessEvent(StorePinataMaster, StorePinataMaster, Offsets::StartPackOpenFunc, nullptr);
107 | }
108 |
109 | TArray JonLHack(FString Path, UObject* Class)
110 | {
111 | static auto FortKismetLibrary = SpawnObject(FindObject(L"Class /Script/FortniteGame.FortKismetLibrary"), FindObject(L"Package /Script/FortniteGame"));
112 | static auto JonLHackFunc = FindObject(L"Function /Script/FortniteGame.FortKismetLibrary.JonLHack_GetAllObjectsOfClassFromPath");
113 |
114 | struct Params
115 | {
116 | FString Path;
117 | UObject* Class;
118 | TArray ReturnValue;
119 | };
120 |
121 | Params params;
122 | params.Path = Path;
123 | params.Class = Class;
124 |
125 | ProcessEvent(FortKismetLibrary, FortKismetLibrary, JonLHackFunc, ¶ms);
126 |
127 | return params.ReturnValue;
128 | }
--------------------------------------------------------------------------------
/FortAlpha/hooks.h:
--------------------------------------------------------------------------------
1 | #include "frontend.h"
2 |
3 | void* __fastcall ProcessEventHook(UObject* _Object, UObject* Object, UObject* Function, void* Params)
4 | {
5 | if (Object && Function)
6 | {
7 | std::wstring ObjectName = GetObjectFirstName(_Object);
8 | std::wstring FunctionName = GetObjectFirstName(Function);
9 |
10 | if (FunctionName.find(L"ShowStoreChanged") != std::string::npos)
11 | return NULL;
12 | if (FunctionName.find(L"PlayZoneChanged") != std::string::npos)
13 | return NULL;
14 | if (FunctionName.find(L"ShowHeroListChanged") != std::string::npos)
15 | return NULL;
16 | if (FunctionName.find(L"ShowVaultChanged") != std::string::npos)
17 | {
18 | Frontend::DestroyBuildingTooltips();
19 | return NULL;
20 | }
21 | if (FunctionName.find(L"ShowDailyRewardsChanged") != std::string::npos)
22 | return NULL;
23 | if (FunctionName.find(L"Party Bar Feature Changed") != std::string::npos)
24 | {
25 | Frontend::GiveAccountItems();
26 | Frontend::SetupHeroMenu();
27 | Frontend::SetRatings();
28 | return NULL;
29 | }
30 | if (FunctionName.find(L"ShowHomeBaseChanged") != std::string::npos)
31 | return NULL;
32 | if (FunctionName.find(L"HomeBaseOverviewFeature") != std::string::npos)
33 | return NULL;
34 |
35 | if (ObjectName.find(L"S_HB_OnboardingCloudCover_C") != std::string::npos && FunctionName.find(L"UserConstructionScript") != std::string::npos)
36 | {
37 | ControlCloudsUpdate();
38 | SetActorHiddenInGame(_Object, true);
39 | }
40 |
41 | // Scuffed as hell but it looks clean
42 | if (ObjectName.find(L"HB_") != std::string::npos && FunctionName.find(L"ReceiveBeginPlay") != std::string::npos)
43 | return NULL;
44 |
45 | if (ObjectName.find(L"HomeBaseRatingWidget") != std::string::npos && FunctionName.find(L"Update") != std::string::npos)
46 | return NULL;
47 |
48 | if (FunctionName.find(L"BuyOnePack") != std::string::npos)
49 | {
50 | OpenLlama();
51 | SetShowHUD(false);
52 | return NULL;
53 | }
54 |
55 | if (FunctionName.find(L"TL-ChangeLighting__FinishedFunc") != std::string::npos)
56 | SetShowHUD(true);
57 | }
58 |
59 | return ProcessEvent(_Object, Object, Function, Params);
60 | }
61 |
62 | namespace Hooks
63 | {
64 | void Init()
65 | {
66 | MH_Initialize();
67 |
68 | MH_CreateHook(reinterpret_cast(Offsets::ProcessEventAddress), ProcessEventHook, reinterpret_cast(&ProcessEvent));
69 | MH_EnableHook(reinterpret_cast(Offsets::ProcessEventAddress));
70 | }
71 | }
--------------------------------------------------------------------------------
/FortAlpha/minhook/LICENSE.txt:
--------------------------------------------------------------------------------
1 | MinHook - The Minimalistic API Hooking Library for x64/x86
2 | Copyright (C) 2009-2017 Tsuda Kageyu.
3 | All rights reserved.
4 |
5 | Redistribution and use in source and binary forms, with or without
6 | modification, are permitted provided that the following conditions
7 | are met:
8 |
9 | 1. Redistributions of source code must retain the above copyright
10 | notice, this list of conditions and the following disclaimer.
11 | 2. Redistributions in binary form must reproduce the above copyright
12 | notice, this list of conditions and the following disclaimer in the
13 | documentation and/or other materials provided with the distribution.
14 |
15 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17 | TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
18 | PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
19 | OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22 | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23 | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24 | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 |
27 | ================================================================================
28 | Portions of this software are Copyright (c) 2008-2009, Vyacheslav Patkov.
29 | ================================================================================
30 | Hacker Disassembler Engine 32 C
31 | Copyright (c) 2008-2009, Vyacheslav Patkov.
32 | All rights reserved.
33 |
34 | Redistribution and use in source and binary forms, with or without
35 | modification, are permitted provided that the following conditions
36 | are met:
37 |
38 | 1. Redistributions of source code must retain the above copyright
39 | notice, this list of conditions and the following disclaimer.
40 | 2. Redistributions in binary form must reproduce the above copyright
41 | notice, this list of conditions and the following disclaimer in the
42 | documentation and/or other materials provided with the distribution.
43 |
44 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
45 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
46 | TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
47 | PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
48 | CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
49 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
50 | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
51 | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
52 | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
53 | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
54 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
55 |
56 | -------------------------------------------------------------------------------
57 | Hacker Disassembler Engine 64 C
58 | Copyright (c) 2008-2009, Vyacheslav Patkov.
59 | All rights reserved.
60 |
61 | Redistribution and use in source and binary forms, with or without
62 | modification, are permitted provided that the following conditions
63 | are met:
64 |
65 | 1. Redistributions of source code must retain the above copyright
66 | notice, this list of conditions and the following disclaimer.
67 | 2. Redistributions in binary form must reproduce the above copyright
68 | notice, this list of conditions and the following disclaimer in the
69 | documentation and/or other materials provided with the distribution.
70 |
71 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
72 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
73 | TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
74 | PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
75 | CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
76 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
77 | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
78 | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
79 | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
80 | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
81 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
82 |
--------------------------------------------------------------------------------
/FortAlpha/minhook/MinHook.h:
--------------------------------------------------------------------------------
1 | /*
2 | * MinHook - The Minimalistic API Hooking Library for x64/x86
3 | * Copyright (C) 2009-2017 Tsuda Kageyu.
4 | * All rights reserved.
5 | *
6 | * Redistribution and use in source and binary forms, with or without
7 | * modification, are permitted provided that the following conditions
8 | * are met:
9 | *
10 | * 1. Redistributions of source code must retain the above copyright
11 | * notice, this list of conditions and the following disclaimer.
12 | * 2. Redistributions in binary form must reproduce the above copyright
13 | * notice, this list of conditions and the following disclaimer in the
14 | * documentation and/or other materials provided with the distribution.
15 | *
16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
19 | * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
20 | * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21 | * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23 | * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24 | * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25 | * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 | */
28 |
29 | #pragma once
30 |
31 | #if !(defined _M_IX86) && !(defined _M_X64) && !(defined __i386__) && !(defined __x86_64__)
32 | #error MinHook supports only x86 and x64 systems.
33 | #endif
34 |
35 | #include
36 |
37 | // MinHook Error Codes.
38 | typedef enum MH_STATUS
39 | {
40 | // Unknown error. Should not be returned.
41 | MH_UNKNOWN = -1,
42 |
43 | // Successful.
44 | MH_OK = 0,
45 |
46 | // MinHook is already initialized.
47 | MH_ERROR_ALREADY_INITIALIZED,
48 |
49 | // MinHook is not initialized yet, or already uninitialized.
50 | MH_ERROR_NOT_INITIALIZED,
51 |
52 | // The hook for the specified target function is already created.
53 | MH_ERROR_ALREADY_CREATED,
54 |
55 | // The hook for the specified target function is not created yet.
56 | MH_ERROR_NOT_CREATED,
57 |
58 | // The hook for the specified target function is already enabled.
59 | MH_ERROR_ENABLED,
60 |
61 | // The hook for the specified target function is not enabled yet, or already
62 | // disabled.
63 | MH_ERROR_DISABLED,
64 |
65 | // The specified pointer is invalid. It points the address of non-allocated
66 | // and/or non-executable region.
67 | MH_ERROR_NOT_EXECUTABLE,
68 |
69 | // The specified target function cannot be hooked.
70 | MH_ERROR_UNSUPPORTED_FUNCTION,
71 |
72 | // Failed to allocate memory.
73 | MH_ERROR_MEMORY_ALLOC,
74 |
75 | // Failed to change the memory protection.
76 | MH_ERROR_MEMORY_PROTECT,
77 |
78 | // The specified module is not loaded.
79 | MH_ERROR_MODULE_NOT_FOUND,
80 |
81 | // The specified function is not found.
82 | MH_ERROR_FUNCTION_NOT_FOUND
83 | }
84 | MH_STATUS;
85 |
86 | // Can be passed as a parameter to MH_EnableHook, MH_DisableHook,
87 | // MH_QueueEnableHook or MH_QueueDisableHook.
88 | #define MH_ALL_HOOKS NULL
89 |
90 | #ifdef __cplusplus
91 | extern "C" {
92 | #endif
93 |
94 | // Initialize the MinHook library. You must call this function EXACTLY ONCE
95 | // at the beginning of your program.
96 | MH_STATUS WINAPI MH_Initialize(VOID);
97 |
98 | // Uninitialize the MinHook library. You must call this function EXACTLY
99 | // ONCE at the end of your program.
100 | MH_STATUS WINAPI MH_Uninitialize(VOID);
101 |
102 | // Creates a Hook for the specified target function, in disabled state.
103 | // Parameters:
104 | // pTarget [in] A pointer to the target function, which will be
105 | // overridden by the detour function.
106 | // pDetour [in] A pointer to the detour function, which will override
107 | // the target function.
108 | // ppOriginal [out] A pointer to the trampoline function, which will be
109 | // used to call the original target function.
110 | // This parameter can be NULL.
111 | MH_STATUS WINAPI MH_CreateHook(LPVOID pTarget, LPVOID pDetour, LPVOID *ppOriginal);
112 |
113 | // Creates a Hook for the specified API function, in disabled state.
114 | // Parameters:
115 | // pszModule [in] A pointer to the loaded module name which contains the
116 | // target function.
117 | // pszTarget [in] A pointer to the target function name, which will be
118 | // overridden by the detour function.
119 | // pDetour [in] A pointer to the detour function, which will override
120 | // the target function.
121 | // ppOriginal [out] A pointer to the trampoline function, which will be
122 | // used to call the original target function.
123 | // This parameter can be NULL.
124 | MH_STATUS WINAPI MH_CreateHookApi(
125 | LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal);
126 |
127 | // Creates a Hook for the specified API function, in disabled state.
128 | // Parameters:
129 | // pszModule [in] A pointer to the loaded module name which contains the
130 | // target function.
131 | // pszTarget [in] A pointer to the target function name, which will be
132 | // overridden by the detour function.
133 | // pDetour [in] A pointer to the detour function, which will override
134 | // the target function.
135 | // ppOriginal [out] A pointer to the trampoline function, which will be
136 | // used to call the original target function.
137 | // This parameter can be NULL.
138 | // ppTarget [out] A pointer to the target function, which will be used
139 | // with other functions.
140 | // This parameter can be NULL.
141 | MH_STATUS WINAPI MH_CreateHookApiEx(
142 | LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal, LPVOID *ppTarget);
143 |
144 | // Removes an already created hook.
145 | // Parameters:
146 | // pTarget [in] A pointer to the target function.
147 | MH_STATUS WINAPI MH_RemoveHook(LPVOID pTarget);
148 |
149 | // Enables an already created hook.
150 | // Parameters:
151 | // pTarget [in] A pointer to the target function.
152 | // If this parameter is MH_ALL_HOOKS, all created hooks are
153 | // enabled in one go.
154 | MH_STATUS WINAPI MH_EnableHook(LPVOID pTarget);
155 |
156 | // Disables an already created hook.
157 | // Parameters:
158 | // pTarget [in] A pointer to the target function.
159 | // If this parameter is MH_ALL_HOOKS, all created hooks are
160 | // disabled in one go.
161 | MH_STATUS WINAPI MH_DisableHook(LPVOID pTarget);
162 |
163 | // Queues to enable an already created hook.
164 | // Parameters:
165 | // pTarget [in] A pointer to the target function.
166 | // If this parameter is MH_ALL_HOOKS, all created hooks are
167 | // queued to be enabled.
168 | MH_STATUS WINAPI MH_QueueEnableHook(LPVOID pTarget);
169 |
170 | // Queues to disable an already created hook.
171 | // Parameters:
172 | // pTarget [in] A pointer to the target function.
173 | // If this parameter is MH_ALL_HOOKS, all created hooks are
174 | // queued to be disabled.
175 | MH_STATUS WINAPI MH_QueueDisableHook(LPVOID pTarget);
176 |
177 | // Applies all queued changes in one go.
178 | MH_STATUS WINAPI MH_ApplyQueued(VOID);
179 |
180 | // Translates the MH_STATUS to its name as a string.
181 | const char * WINAPI MH_StatusToString(MH_STATUS status);
182 |
183 | #ifdef __cplusplus
184 | }
185 | #endif
186 |
187 |
--------------------------------------------------------------------------------
/FortAlpha/minhook/libMinHook.x86.lib:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/notsamicc/FortAlpha/70b50b5fbf5e838541ef67494bfb77f57e4d9129/FortAlpha/minhook/libMinHook.x86.lib
--------------------------------------------------------------------------------
/FortAlpha/offsets.h:
--------------------------------------------------------------------------------
1 | #include "ue4.h"
2 |
3 | namespace Offsets
4 | {
5 | DWORD ViewportConsoleOffset;
6 | DWORD CurrentTotalValueOffset;
7 | DWORD CurrentSelfValueOffset;
8 | DWORD CurrentTeamValueOffset;
9 | DWORD OwningGameInstanceOffset;
10 | DWORD LocalPlayersOffset;
11 | DWORD PlayerControllerOffset;
12 | DWORD HeroLevelOffset;
13 | DWORD HeroXPOffset;
14 | DWORD HeroNameOffset;
15 | DWORD HeroGenderOffset;
16 | DWORD bTutorialCompletedOffset;
17 | DWORD ProcessEventAddress;
18 |
19 | UObject* GameplayStatics;
20 | UObject* PlayerController;
21 | UObject* FrontendContext;
22 | UObject* GameViewportClient;
23 | UObject* StorePinataMaster;
24 |
25 | UObject* SpawnObjectFunc;
26 | UObject* GivePlayerLocalAccountItemFunc;
27 | UObject* SetPersonalHeroChoiceFunc;
28 | UObject* ControlCloudsUpdateFunc;
29 | UObject* SetActorHiddenInGameFunc;
30 | UObject* DestroyComponentFunc;
31 | UObject* StartPackOpenFunc;
32 | UObject* SetShowHUDFunc;
33 |
34 | void Init()
35 | {
36 | GObjects = (FUObjectArray*)(Util::BaseAddress() + 0x2DC3AAC);
37 | ProcessEventAddress = Util::BaseAddress() + 0x9A9E70;
38 | ProcessEvent = (fProcessEvent)(ProcessEventAddress);
39 | GetObjectName_Internal = (fGetObjectName_Internal)(Util::BaseAddress() + 0x132C400);
40 | Free_Internal = (fFree_Internal)(Util::BaseAddress() + 0x89CAD0);
41 |
42 | HeroLevelOffset = FindOffset(L"IntProperty /Script/FortniteGame.FortAccountItem.Level");
43 | HeroXPOffset = FindOffset(L"IntProperty /Script/FortniteGame.FortAccountItem.XP");
44 | HeroNameOffset = FindOffset(L"StrProperty /Script/FortniteGame.FortHero.Hero_Name");
45 | HeroGenderOffset = FindOffset(L"IntProperty /Script/FortniteGame.FortWorker.Gender");
46 | ViewportConsoleOffset = FindOffset(L"ObjectProperty /Script/Engine.GameViewportClient.ViewportConsole");
47 | bTutorialCompletedOffset = FindOffset(L"BoolProperty /Script/FortniteGame.FortPlayerController.bTutorialCompleted");
48 |
49 | GameplayStatics = FindObject(L"GameplayStatics /Script/Engine.Default__GameplayStatics");
50 | PlayerController = FindObject(L"FortPlayerControllerFrontEnd /Game/Maps/FortniteEntry.FortniteEntry.PersistentLevel.FortPlayerControllerFrontEnd_0");
51 | FrontendContext = FindObject(L"FortFrontEndContext /Engine/Transient.FortEngine_0.FortLocalPlayer_0.FortFrontEndContext_0");
52 | GameViewportClient = FindObject(L"FortGameViewportClient /Engine/Transient.FortEngine_0.FortGameViewportClient_0");
53 |
54 | SpawnObjectFunc = FindObject(L"Function /Script/Engine.GameplayStatics.SpawnObject");
55 | GivePlayerLocalAccountItemFunc = FindObject(L"Function /Script/FortniteGame.FortPlayerController.ClientGivePlayerLocalAccountItem");
56 | FrontendContext = FindObject(L"FortFrontEndContext /Engine/Transient.FortEngine_0.FortLocalPlayer_0.FortFrontEndContext_0");
57 | SetPersonalHeroChoiceFunc = FindObject(L"Function /Script/FortniteUI.FortFrontEndContext.SetPersonalHeroChoice");
58 | ControlCloudsUpdateFunc = FindObject(L"Function /Game/Environments/Homebase/Blueprints/Onboarding/S_HB_OnboardingCloudCover.S_HB_OnboardingCloudCover_C.Control_Clouds_Phase02__UpdateFunc");
59 | SetActorHiddenInGameFunc = FindObject(L"Function /Script/Engine.Actor.SetActorHiddenInGame");
60 | DestroyComponentFunc = FindObject(L"Function /Script/Engine.ActorComponent.K2_DestroyComponent");
61 | StartPackOpenFunc = FindObject(L"Function /Game/FrontEnd/Store/Pinata/Blueprints/StorePinataMaster_BP.StorePinataMaster_BP_C.StartPackOpen");
62 | SetShowHUDFunc = FindObject(L"Function /Script/FortniteGame.FortPlayerController.SetShowHUD");
63 | }
64 | }
--------------------------------------------------------------------------------
/FortAlpha/ue4.h:
--------------------------------------------------------------------------------
1 | #include "util.h"
2 |
3 | template
4 | struct TArray
5 | {
6 | friend struct FString;
7 |
8 | public:
9 | inline TArray()
10 | {
11 | Data = nullptr;
12 | Count = Max = 0;
13 | };
14 |
15 | inline int Num() const
16 | {
17 | return Count;
18 | };
19 |
20 | inline T& operator[](int i)
21 | {
22 | return Data[i];
23 | };
24 |
25 | inline const T& operator[](int i) const
26 | {
27 | return Data[i];
28 | };
29 |
30 | inline bool IsValidIndex(int i) const
31 | {
32 | return i < Num();
33 | }
34 |
35 | void Add(T InputData)
36 | {
37 | Data = (T*)realloc(Data, sizeof(T) * (Count + 1));
38 | Data[Count++] = InputData;
39 | Max = Count;
40 | };
41 |
42 | T* Data;
43 | int32_t Count;
44 | int32_t Max;
45 | };
46 |
47 | struct FString : private TArray
48 | {
49 | FString()
50 | {
51 | Data = nullptr;
52 |
53 | Max = Count = 0;
54 | }
55 |
56 | FString(const wchar_t* Value)
57 | {
58 | Max = Count = *Value ? std::wcslen(Value) + 1 : 0;
59 |
60 | if (Count)
61 | {
62 | Data = const_cast(Value);
63 | }
64 | };
65 |
66 | inline bool IsValid()
67 | {
68 | return Data != nullptr;
69 | }
70 |
71 | inline wchar_t* c_str()
72 | {
73 | return Data;
74 | }
75 |
76 | std::string ToString() const
77 | {
78 | size_t length = std::wcslen(Data);
79 | std::string str(length, '\0');
80 | std::use_facet>(std::locale()).narrow(Data, Data + length, '?', &str[0]);
81 |
82 | return str;
83 | }
84 | };
85 |
86 | struct FName
87 | {
88 | public:
89 | int32_t ComparisonIndex;
90 | int32_t Number;
91 | };
92 |
93 | struct UObject
94 | {
95 | void** VTable;
96 | int32_t ObjectFlags;
97 | int32_t InternalIndex;
98 | UObject* Class;
99 | FName Name;
100 | UObject* Outer;
101 | };
102 |
103 | class FUObjectItem
104 | {
105 | public:
106 | UObject* Object;
107 | int32_t ClusterIndex;
108 | int32_t SerialNumber;
109 | };
110 |
111 | class TUObjectArray
112 | {
113 | public:
114 | FUObjectItem* Objects;
115 | int32_t MaxElements;
116 | int32_t NumElements;
117 | };
118 |
119 | class FUObjectArray
120 | {
121 | public:
122 | TUObjectArray ObjObjects;
123 | };
124 |
125 | FUObjectArray* GObjects;
126 |
127 | typedef void* (__fastcall* fProcessEvent)(UObject* _Object, UObject* Object, UObject* Function, void* Params);
128 | fProcessEvent ProcessEvent;
129 |
130 | typedef FString(__cdecl* fGetObjectName_Internal)(UObject* Object);
131 | static fGetObjectName_Internal GetObjectName_Internal;
132 |
133 | typedef void(__cdecl* fFree_Internal)(void* Buffer);
134 | static fFree_Internal Free_Internal;
135 |
136 | static std::wstring GetObjectName(UObject* Object)
137 | {
138 | std::wstring sName(L"");
139 |
140 | for (auto i = 0; Object; Object = Object->Outer, ++i)
141 | {
142 | FString objName = GetObjectName_Internal(Object);
143 |
144 | if (objName.IsValid())
145 | {
146 | sName = objName.c_str() + std::wstring(i > 0 ? L"." : L"") + sName;
147 |
148 | Free_Internal(objName.c_str());
149 | }
150 | }
151 |
152 | return sName;
153 | }
154 |
155 | static std::wstring GetObjectFirstName(UObject* Object)
156 | {
157 | std::wstring sName(L"");
158 |
159 | FString objName = GetObjectName_Internal(Object);
160 |
161 | if (objName.IsValid())
162 | {
163 | sName = objName.c_str();
164 |
165 | Free_Internal(objName.c_str());
166 | }
167 |
168 | return sName;
169 | }
170 |
171 | std::wstring GetName(UObject* obj)
172 | {
173 | std::wstring name;
174 |
175 | if (obj->Class != nullptr)
176 | {
177 | name = GetObjectFirstName((UObject*)obj->Class);
178 | name += L" ";
179 | name += GetObjectName(obj);
180 | }
181 |
182 | return name;
183 | }
184 |
185 | static UObject* FindObject(std::wstring name)
186 | {
187 | for (int i = 0; i < GObjects->ObjObjects.NumElements; i++)
188 | {
189 | auto Object = GObjects->ObjObjects.Objects[i].Object;
190 |
191 | if (Object)
192 | {
193 | if (GetName(Object) == name)
194 | {
195 | return Object;
196 | }
197 | }
198 | }
199 |
200 | std::wcout << "Failed to find " << name << std::endl;
201 | return nullptr;
202 | }
203 |
204 | static DWORD FindOffset(std::wstring Offset)
205 | {
206 | auto Object = FindObject(Offset);
207 |
208 | if (Object)
209 | {
210 | return *(DWORD*)(DWORD(Object) + 0x3C);
211 | }
212 |
213 | return 0;
214 | }
--------------------------------------------------------------------------------
/FortAlpha/util.h:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 | #include
5 | #include
6 | #include
7 | #pragma comment(lib, "libMinHook.x86.lib")
8 |
9 | class Util
10 | {
11 | public:
12 | static uintptr_t BaseAddress()
13 | {
14 | return (uintptr_t)GetModuleHandle(0);
15 | }
16 |
17 | static void InitConsole()
18 | {
19 | AllocConsole();
20 | FILE* File;
21 | freopen_s(&File, "CONOUT$", "w", stdout);
22 | }
23 | };
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # How to use
2 |
3 | 1. Compile as x86 because alpha is 32 bit
4 | 2. Setup the responses
5 | 3. Inject while in the login screen
6 | 4. Wait for the console to tell you to login
7 |
8 | # Responses
9 |
10 | To use Fiddler with OT 6.5 add "-httpproxy=127.0.0.1:8888" to your launch args (Thanks to Makks for telling me this). Setup the autoresponders like this:
11 |
12 | 
13 |
14 | Note: The worldinfo response is a mess
15 |
--------------------------------------------------------------------------------