A step by step guide...
1. If you use a Mouse for the build macros within this script then the mouse has to be connected to the T2. If you then want a XIM to handle mouse translation the T2 has to be connected to the XIM.
Also, all inputs that the script relies on needs to be connected to the T2 and not directly to the XIM - so for example the script needs to know when you've entered Inventory, Game Menu, Console Menu, Emotes - because the way to cancel out of this is the SAME button as BUILD - hence the script recognises this and rather than the internal tracking entering build mode when you cancel out of a menu it recognises you've actually just cancelled out of a menu. The same applies with LB/RB as of course the script monitors this for tracking etc.
On the assumption a KB is used for most of the menu inputs above and a mouse is used to execute the building macros then this is connection method:
- Mouse and KB into T2
- Controller into Port 1 of XIM APEX
- T2 into Port 2 of XIM APEX
- XIm APEX into Console
- In Gtuner set Output Protocol to USB Multi Interface HID and Check Disable Joystick
2. Setup your keybindings in the Input Translator under Keyboard and Mouse Mapping. An example is shown below.
Note: For extra mouse buttons it is easier to map them to a KB key in your mouse software. So for example I use a G502 and thus map the side buttons to B, N, J in the Logitech software. As these are Kb keys they are then mapped to the associated controller entry under Keyboard Mapping in the Input Translator.
3. Setup the appropriate key mappings in the Script
- Code: Select all
#define Wall (KEY_B)
#define Floor (KEY_N)
#define Stair (KEY_J)
#define RB (KEY_E)
#define LB (KEY_Q)
#define Build (KEY_N)
#define Fire (MBUTTON_1)
Also define your reset button
- Code: Select all
#define Reset BUTTON_13 //manual reset of tracking (right arrow)
For me this is right arrow (unused by the game) which is mapped to KEY_L in Input Translator and this is actually my mouse wheel button.
4. Combos - you need to make sure mouse_set and key_set are being correctly applied. These of course refer to the end output (remember any side mouse buttons mapped to a key are actually key_set and not mouse_set). So using the keys defined above you can see they are all KB keys except fire which is of course MBUTTON1.
Therefore a combo would look like this
- Code: Select all
combo BuildWall {
wait(InitailEnd_Wait);
key_set(Build, 1);
wait(SameButton_Wait);
key_set(Build, 0);
wait(BeforeFireButton_Wait1);
wait(BeforeFireButton_Wait2);
mouse_set(Fire, 1);
wait(SameButton_Wait);
mouse_set(Fire, 0);
wait(InitailEnd_Wait);
bldslottrack = 1;
mode = 1;
}
For me personally as a NAV user (i.e. limited buttons relative to a KB) I use mouse wheel scroll up / down for RB/LB and thus the combo's need to change to reflect the fact it's a mouse output not a key output. If this is the case you don't need a LB define, just an RB one like this:
- Code: Select all
#define RB (MOUSE_WHEEL)
With Wheel Backward mapped to BUTTON_4 and Wheel Forward mapped to BUTTON_7 in mouse mapping in the Input Translator.
Then combos would look like this:
- Code: Select all
combo BuildStair {
wait(InitailEnd_Wait);
key_set(Build, 1);
wait(SameButton_Wait);
key_set(Build, 0);
wait(GenericBetweenButton_Wait);
mouse_set(RB, -1);
wait(SameButton_Wait);
mouse_set(RB, 0);
wait(GenericBetweenButton_Wait);
mouse_set(RB, -1);
wait(SameButton_Wait);
mouse_set(RB, 0);
wait(BeforeFireButton_Wait1);
wait(BeforeFireButton_Wait2);
mouse_set(Fire, 1);
wait(SameButton_Wait);
mouse_set(Fire, 0);
wait(InitailEnd_Wait);
bldslottrack = 3;
mode = 1;
}
combo QLB1 {
wait(InitailEnd_Wait);
mouse_set(RB, 1);
wait(SameButton_Wait);
mouse_set(RB, 0);
wait(BeforeFireButton_Wait1);
wait(BeforeFireButton_Wait2);
mouse_set(Fire, 1);
wait(SameButton_Wait);
mouse_set(Fire, 0);
wait(InitailEnd_Wait);
}
Note the use of mouse_set over key_set and also the fact that mouse wheel forward is +1, mouse wheel backward is -1.
5. Network latencty - I connect to EU servers with a circa 20ms ping. The timings in the combo reflect this i.e. wait times between button presses. If you have a much higher latency these timings might be too short and could result in the combo's not working correctly. If this is the case then increase the wait times in the define at the start of the script.
- Code: Select all
#define InitailEnd_Wait 20
#define SameButton_Wait 40
#define GenericBetweenButton_Wait 50
#define BeforeFireButton_Wait1 50
#define BeforeFireButton_Wait2 100
6. Download light_k header file from Online Resources and save it in the same directory as the script.
7. Setup your keybinds in XIM in the normal way.
8. Make sure game settings are set to
- Combat Pro controller layout
- Turbo building ON
- Reset Building Choice ON
That should be everything I think! The display on T2 reflects the Building mode (red for building, green for combat) and the numbers reflect the building piece currently selected (1-4, 0 for combat mode). Thus in game you can see if the tracking is correct. If incorrect at any time just move to back to combat mode and press your RESET button.
So this would be an example script if using a KB with keys for RB/LB
- Code: Select all
#pragma METAINFO("<Mark>", 1, 0, "FORTNITE")
#include <keyboard.gph>
#include <display.gph>
#include "light_k.gph"
#include <mouse.gph>
#define Reset BUTTON_13 //manual reset of tracking (right arrow)
#define Wall (KEY_F)
#define Floor (KEY_V)
#define Stair (KEY_C)
#define InitailEnd_Wait 20
#define SameButton_Wait 40
#define GenericBetweenButton_Wait 50
#define BeforeFireButton_Wait1 50
#define BeforeFireButton_Wait2 100
#define RB (KEY_E)
#define LB (KEY_Q)
#define Build (KEY_N)
#define Fire (MBUTTON_1)
//mode and tracker
int mode;
int bldvalue;
int NavState;
//building hotkeys and tracker
int bldslottrack=1;
bool event_active_b;
bool event_active_n;
bool event_active_f;
main {
mouse_passthru();
key_passthru();
//------------------------------------------------------------------------------
//MODE TRACKING
if (mode == 0) {
set_light('G');
}
if (mode == 1) {
set_light('R');
}
if (mode > 1) {
mode = 0;}
if ((event_release(BUTTON_15)) && (mode == 0)){
mode = 1; //building mode
}
else if (event_release(BUTTON_15) && (mode == 1)) {
mode = 0; //combat mode
bldslottrack = 1; //building always resets to slot 1, weapons to last occupied slot
}
//------------------------------------------------------------------------------
//BUILDING AND WEAPON SLOT TRACKING
//Building to axe - has to return to slot 1
if ((event_release(BUTTON_14)) && (mode == 1)) {
mode = 0;
bldslottrack = 1;
}
if ((event_release(BUTTON_4)) && (mode == 1)) {
bldslottrack = bldslottrack + 1;
if (bldslottrack > 4) {
bldslottrack = 1;
}
}
if ((event_release(BUTTON_7)) && (mode == 1)) {
bldslottrack = bldslottrack - 1;
if (bldslottrack < 1) {
bldslottrack = 4;
}
}
//------------------------------------------------------------------------------
//TRACKER RESETS
//manual tracker reset to weapon mode slot1
if (event_active(Reset)) {
mode = 0;
bldslottrack = 1;
}
//Since B is cancel as well as enter building mode, need to reset tracker if using to cancel out of xbox menu, inventory, game menu, emotes
if (event_release (BUTTON_1) || event_release (BUTTON_3) || event_release (BUTTON_10) || event_release (BUTTON_11)) {
NavState = 1;}
// Pressing B to cancel resets
if (event_release (BUTTON_15) && NavState) {
mode = mode + 1;
NavState = 0;}
//------------------------------------------------------------------------------
// LOAD-OUTS
if(key_status(Wall)) {
bldvalue = 1 - bldslottrack;
if(!event_active_b) {
event_active_b = TRUE;
if (mode == 0){ //weapons or pickaxe to wall
combo_run (BuildWall);
} else if ((mode == 1) && (bldvalue == 0)) { //already have wall selected
combo_run (RT);}
else { //moving from building slots 2,3,4 to wall
if (bldvalue == -1) {
combo_run (QLB1);
bldslottrack = 1;}
if (bldvalue == -2) {
combo_run (QLB2);
bldslottrack = 1;}
if (bldvalue == -3) {
combo_run (QRB1);
bldslottrack = 1;}
}
}
} else event_active_b = FALSE;
if(key_status(Floor)) {
bldvalue = 2 - bldslottrack;
if(!event_active_f) {
event_active_f = TRUE;
if (mode == 0){
combo_run (BuildFloor);
} else if ((mode == 1) && (bldvalue == 0)) {
combo_run (RT);}
else {
if (bldvalue == 1) {
combo_run (QRB1);
bldslottrack = 2;}
if (bldvalue == -1) {
combo_run (QLB1);
bldslottrack = 2;}
if (bldvalue == -2) {
combo_run (QLB2);
bldslottrack = 2;}
}
}
} else event_active_f = FALSE;
if(key_status(Stair)) {
bldvalue = 3 - bldslottrack;
if(!event_active_n) {
event_active_n = TRUE;
if (mode == 0){
combo_run (BuildStair);
} else if ((mode == 1) && (bldvalue == 0)) {
combo_run (RT);}
else {
if (bldvalue == 2) {
combo_run (QLB2);
bldslottrack = 3;}
if (bldvalue == 1) {
combo_run (QRB1);
bldslottrack = 3;}
if (bldvalue == -1) {
combo_run (QLB1);
bldslottrack = 3;}
}
}
} else event_active_n = FALSE;
//------------------------------------------------------------------------------
//LED
if (mode == 1){
switch(bldslottrack) {
case 0: display_overlay(_0_, 2000); break;
case 1: display_overlay(_1_, 2000); break;
case 2: display_overlay(_2_, 2000); break;
case 3: display_overlay(_3_, 2000); break;
case 4: display_overlay(_4_, 2000); break;
}
}
if (mode == 0) {
display_overlay(_0_, 2000); }
} // main
combo BuildWall {
wait(InitailEnd_Wait);
key_set(Build, 1);
wait(SameButton_Wait);
key_set(Build, 0);
wait(BeforeFireButton_Wait1);
wait(BeforeFireButton_Wait2);
mouse_set(Fire, 1);
wait(SameButton_Wait);
mouse_set(Fire, 0);
wait(InitailEnd_Wait);
bldslottrack = 1;
mode = 1;
}
combo BuildFloor {
wait(InitailEnd_Wait);
key_set(Build, 1);
wait(SameButton_Wait);
key_set(Build, 0);
wait(GenericBetweenButton_Wait);
key_set(RB, 1);
wait(SameButton_Wait);
key_set(RB, 0);
wait(BeforeFireButton_Wait1);
wait(BeforeFireButton_Wait2);
mouse_set(Fire, 1);
wait(SameButton_Wait);
mouse_set(Fire, 0);
wait(InitailEnd_Wait);
bldslottrack = 2;
mode = 1;
}
combo BuildStair {
wait(InitailEnd_Wait);
key_set(Build, 1);
wait(SameButton_Wait);
key_set(Build, 0);
wait(GenericBetweenButton_Wait);
key_set(RB, 1);
wait(SameButton_Wait);
key_set(RB, 0);
wait(GenericBetweenButton_Wait);
key_set(RB, 1);
wait(SameButton_Wait);
key_set(RB, 0);
wait(BeforeFireButton_Wait1);
wait(BeforeFireButton_Wait2);
mouse_set(Fire, 1);
wait(SameButton_Wait);
mouse_set(Fire, 0);
wait(InitailEnd_Wait);
bldslottrack = 3;
mode = 1;
}
combo QLB1 {
wait(InitailEnd_Wait);
key_set(LB, 1);
wait(SameButton_Wait);
key_set(LB, 0);
wait(BeforeFireButton_Wait1);
wait(BeforeFireButton_Wait2);
mouse_set(Fire, 1);
wait(SameButton_Wait);
mouse_set(Fire, 0);
wait(InitailEnd_Wait);
}
combo QLB2 {
wait(InitailEnd_Wait);
key_set(LB, 1);
wait(SameButton_Wait);
key_set(LB, 0);
wait(GenericBetweenButton_Wait);
key_set(LB, 1);
wait(SameButton_Wait);
key_set(LB, 0);
wait(BeforeFireButton_Wait1);
wait(BeforeFireButton_Wait2);
mouse_set(Fire, 1);
wait(SameButton_Wait);
mouse_set(Fire, 0);
wait(InitailEnd_Wait);
}
combo QRB1 {
wait(InitailEnd_Wait);
key_set(RB, 1);
wait(SameButton_Wait);
key_set(RB, 0);
wait(BeforeFireButton_Wait1);
wait(BeforeFireButton_Wait2);
mouse_set(Fire, 1);
wait(SameButton_Wait);
mouse_set(Fire, 0);
wait(InitailEnd_Wait);
}
combo RT {
wait(InitailEnd_Wait);
mouse_set(Fire, 1);
wait(SameButton_Wait);
mouse_set(Fire, 0);
wait(InitailEnd_Wait);
}
This would be an example script if using mouse wheel scroll for RB/LB
- Code: Select all
#pragma METAINFO("<Mark>", 1, 0, "FORTNITE BUILDING ONLY - MOUSE PT")
#include <keyboard.gph>
#include <display.gph>
#include "light_k.gph"
#include <mouse.gph>
#define Reset BUTTON_13 //manual reset of tracking (right arrow)
#define Wall (KEY_B)
#define Floor (KEY_N)
#define Stair (KEY_J)
#define InitailEnd_Wait 20
#define SameButton_Wait 40
#define GenericBetweenButton_Wait 50
#define BeforeFireButton_Wait1 50
#define BeforeFireButton_Wait2 100
#define RB (MOUSE_WHEEL)
#define Build (KEY_END)
#define Fire (MBUTTON_1)
//mode and tracker
int mode;
int bldvalue;
int NavState;
//building hotkeys and tracker
int bldslottrack=1;
bool event_active_b;
bool event_active_n;
bool event_active_f;
main {
mouse_passthru();
key_passthru();
//------------------------------------------------------------------------------
//MODE TRACKING
if (mode == 0) {
set_light('G');
}
if (mode == 1) {
set_light('R');
}
if (mode > 1) {
mode = 0;}
if ((event_release(BUTTON_15)) && (mode == 0)){
mode = 1; //building mode
}
else if (event_release(BUTTON_15) && (mode == 1)) {
mode = 0; //combat mode
bldslottrack = 1; //building always resets to slot 1, weapons to last occupied slot
}
//------------------------------------------------------------------------------
//BUILDING AND WEAPON SLOT TRACKING
//Building to axe - has to return to slot 1
if ((event_release(BUTTON_14)) && (mode == 1)) {
mode = 0;
bldslottrack = 1;
}
if ((event_release(BUTTON_4)) && (mode == 1)) {
bldslottrack = bldslottrack + 1;
if (bldslottrack > 4) {
bldslottrack = 1;
}
}
if ((event_release(BUTTON_7)) && (mode == 1)) {
bldslottrack = bldslottrack - 1;
if (bldslottrack < 1) {
bldslottrack = 4;
}
}
//------------------------------------------------------------------------------
//TRACKER RESETS
//manual tracker reset to weapon mode slot1
if (event_active(Reset)) {
mode = 0;
bldslottrack = 1;
}
//Since B is cancel as well as enter building mode, need to reset tracker if using to cancel out of xbox menu, inventory, game menu, emotes
if (event_release (BUTTON_1) || event_release (BUTTON_3) || event_release (BUTTON_10) || event_release (BUTTON_11)) {
NavState = 1;}
// Pressing B to cancel resets
if (event_release (BUTTON_15) && NavState) {
mode = mode + 1;
NavState = 0;}
//------------------------------------------------------------------------------
// LOAD-OUTS
if(key_status(Wall)) {
bldvalue = 1 - bldslottrack;
if(!event_active_b) {
event_active_b = TRUE;
if (mode == 0){ //weapons or pickaxe to wall
combo_run (BuildWall);
} else if ((mode == 1) && (bldvalue == 0)) { //already have wall selected
combo_run (RT);}
else { //moving from building slots 2,3,4 to wall
if (bldvalue == -1) {
combo_run (QLB1);
bldslottrack = 1;}
if (bldvalue == -2) {
combo_run (QLB2);
bldslottrack = 1;}
if (bldvalue == -3) {
combo_run (QRB1);
bldslottrack = 1;}
}
}
} else event_active_b = FALSE;
if(key_status(Floor)) {
bldvalue = 2 - bldslottrack;
if(!event_active_f) {
event_active_f = TRUE;
if (mode == 0){
combo_run (BuildFloor);
} else if ((mode == 1) && (bldvalue == 0)) {
combo_run (RT);}
else {
if (bldvalue == 1) {
combo_run (QRB1);
bldslottrack = 2;}
if (bldvalue == -1) {
combo_run (QLB1);
bldslottrack = 2;}
if (bldvalue == -2) {
combo_run (QLB2);
bldslottrack = 2;}
}
}
} else event_active_f = FALSE;
if(key_status(Stair)) {
bldvalue = 3 - bldslottrack;
if(!event_active_n) {
event_active_n = TRUE;
if (mode == 0){
combo_run (BuildStair);
} else if ((mode == 1) && (bldvalue == 0)) {
combo_run (RT);}
else {
if (bldvalue == 2) {
combo_run (QLB2);
bldslottrack = 3;}
if (bldvalue == 1) {
combo_run (QRB1);
bldslottrack = 3;}
if (bldvalue == -1) {
combo_run (QLB1);
bldslottrack = 3;}
}
}
} else event_active_n = FALSE;
//------------------------------------------------------------------------------
//LED
if (mode == 1){
switch(bldslottrack) {
case 0: display_overlay(_0_, 2000); break;
case 1: display_overlay(_1_, 2000); break;
case 2: display_overlay(_2_, 2000); break;
case 3: display_overlay(_3_, 2000); break;
case 4: display_overlay(_4_, 2000); break;
}
}
if (mode == 0) {
display_overlay(_0_, 2000); }
} // main
combo BuildWall {
wait(InitailEnd_Wait);
key_set(Build, 1);
wait(SameButton_Wait);
key_set(Build, 0);
wait(BeforeFireButton_Wait1);
wait(BeforeFireButton_Wait2);
mouse_set(Fire, 1);
wait(SameButton_Wait);
mouse_set(Fire, 0);
wait(InitailEnd_Wait);
bldslottrack = 1;
mode = 1;
}
combo BuildFloor {
wait(InitailEnd_Wait);
key_set(Build, 1);
wait(SameButton_Wait);
key_set(Build, 0);
wait(GenericBetweenButton_Wait);
mouse_set(RB, -1);
wait(SameButton_Wait);
mouse_set(RB, 0);
wait(BeforeFireButton_Wait1);
wait(BeforeFireButton_Wait2);
mouse_set(Fire, 1);
wait(SameButton_Wait);
mouse_set(Fire, 0);
wait(InitailEnd_Wait);
bldslottrack = 2;
mode = 1;
}
combo BuildStair {
wait(InitailEnd_Wait);
key_set(Build, 1);
wait(SameButton_Wait);
key_set(Build, 0);
wait(GenericBetweenButton_Wait);
mouse_set(RB, -1);
wait(SameButton_Wait);
mouse_set(RB, 0);
wait(GenericBetweenButton_Wait);
mouse_set(RB, -1);
wait(SameButton_Wait);
mouse_set(RB, 0);
wait(BeforeFireButton_Wait1);
wait(BeforeFireButton_Wait2);
mouse_set(Fire, 1);
wait(SameButton_Wait);
mouse_set(Fire, 0);
wait(InitailEnd_Wait);
bldslottrack = 3;
mode = 1;
}
combo QLB1 {
wait(InitailEnd_Wait);
mouse_set(RB, 1);
wait(SameButton_Wait);
mouse_set(RB, 0);
wait(BeforeFireButton_Wait1);
wait(BeforeFireButton_Wait2);
mouse_set(Fire, 1);
wait(SameButton_Wait);
mouse_set(Fire, 0);
wait(InitailEnd_Wait);
}
combo QLB2 {
wait(InitailEnd_Wait);
mouse_set(RB, 1);
wait(SameButton_Wait);
mouse_set(RB, 0);
wait(GenericBetweenButton_Wait);
mouse_set(RB, 1);
wait(SameButton_Wait);
mouse_set(RB, 0);
wait(BeforeFireButton_Wait1);
wait(BeforeFireButton_Wait2);
mouse_set(Fire, 1);
wait(SameButton_Wait);
mouse_set(Fire, 0);
wait(InitailEnd_Wait);
}
combo QRB1 {
wait(InitailEnd_Wait);
mouse_set(RB, -1);
wait(SameButton_Wait);
mouse_set(RB, 0);
wait(BeforeFireButton_Wait1);
wait(BeforeFireButton_Wait2);
mouse_set(Fire, 1);
wait(SameButton_Wait);
mouse_set(Fire, 0);
wait(InitailEnd_Wait);
}
combo RT {
wait(InitailEnd_Wait);
mouse_set(Fire, 1);
wait(SameButton_Wait);
mouse_set(Fire, 0);
wait(InitailEnd_Wait);
}