这些GPC脚本都使用GPC指令符,如BUTTON 4就代表PS的R1,Xbox的RB,文章最后将附带具体GPC指令符表。
方法总比问题多,这些示例只是实现某些目的,并不是最佳的解决方案。
微力扳机
当按下BUTTON_5激活脚本,它将默认运行完全按下,一键触发。
main {
if (get_val(BUTTON_5)) set_val(BUTTON_5,100);
}
自动奔跑
在左摇杆完全向前移动是按下冲刺按钮。
main {
if (get_actual(STICK_2_Y) ==  -100.0) set_val(BUTTON_9,100);
}
或者较轻微的运动(比如行走)
main {
if (get_actual(STICK_2_Y) <=  -90.0) set_val(BUTTON_9,100);
}
二连跳
再按下BUTTON_16时从释放状态变成激活状态,运行cDoubleJump模组一次,
main {
if (event_active(BUTTON_16)) combo_run(cDoubleJump);
}
combo cDoubleJump {
  set_val(BUTTON_16,100);     // 按下 BUTTON_16
wait(200);                   // 按下200毫秒
  set_val(BUTTON_16,0);     // 松开 BUTTON_16
wait(200);                 // 松开200毫秒
  set_val(BUTTON_16,100); // 按下 BUTTON_16
wait(200);               // 按下200毫秒
}
当你松开BUTTON_16将停止模组运行,如果在短时间内按下按钮,脚本允许你进行单次跳跃。
main {
if (event_active(BUTTON_16)) combo_run(cDoubleJump);
if (event_release(BUTTON_16)) combo_stop(cDoubleJump);
}
combo cDoubleJump {
  set_val(BUTTON_16,100);     // 按下 BUTTON_16
wait(200);                   // 按下200毫秒
  set_val(BUTTON_16,0);     // 松开 BUTTON_16
wait(200);                 // 松开200毫秒
}
循环组合N次
当按下BUTTON_16时循环cLoop组合5次。
#define	LOOP	5 // 循环5此
uint8	iLoop;
main {
if (event_active(BUTTON_16)) iLoop = LOOP; // 启动循环
if (iLoop) { // iLoop 不能为 0
if (!cLoop) { // 组合目前没有运行
  iLoop--; // iLoop - 1
  printf("starting combo cLoop, loops left: %d",iLoop); // 将内容写入至输出板
  combo_run(cLoop);
    }
  }
}
combo cLoop {
  set_val(BUTTON_16,100);   // 按下 BUTTON_16
wait(100);              // 按下100毫秒
  set_val(BUTTON_16,0); // 松开 BUTTON_16
wait(50);              // 松开50毫秒
}
辅助瞄准增强
按住BUTTON_8到200毫秒或更长的时间。
main {
if (check_active(BUTTON_8,200)) combo_run(cAimAssistAbuse);
}
 
combo cAimAssistAbuse {
set_val(BUTTON_8,0);   // 松开BUTTON_8
  wait(30);              // 松开30毫秒
set_val(BUTTON_8,100); // 按住BUTTON_8
  wait(40);              // 按住40毫秒
}
兔子跳
按住BUTTON_16到200毫秒或更长的时间,再松开按钮时停止运行。
main {
if (check_active(BUTTON_16,200)) combo_run(cBunnyHop);
if (event_release(BUTTON_16)) combo_stop(cBunnyHop);
}
 
combo cBunnyHop {
set_val(BUTTON_16,0);  // 松开BUTTON_16
  wait(200);             // 松开200毫秒
set_val(BUTTON_16,100);// 按下BUTTON_16
  wait(200);             // 按下200毫秒
}
双击
简单的双击检测运行。
main {
  // 必须在200毫秒内按BUTTON_17两次
if (event_active(BUTTON_17) && time_release(BUTTON_17) < 200) {
combo_run(cCmb);
  }
}
 
combo cCmb {
set_val(BUTTON_14,100); // 按下按钮
  wait(400);              // 按下400毫秒
set_val(BUTTON_14,0);   // 松开按钮
  wait(400);              // 松开400毫秒
}
通过在200毫秒内按BUTTON_17两次以打开/关闭状态。
printf会将bEnabled的内容和数值写入GTuner IV的输出面板,只要bEnabled为TRUE时,它就会按下BUTTON_17。
bool bEnabled=FALSE;
 
main {
  // 必须在200毫秒内按BUTTON_17两次
if (event_active(BUTTON_17) && time_release(BUTTON_17) < 200) {
bEnabled = !bEnabled;                               // 转换当前状态,从1到0或0到1
printf("Double Tap, bEnabled is now: %d",bEnabled); // 将数值写入输出面板
}
if (bEnabled) combo_run(cRepeat);
}
 
combo cRepeat {
set_val(BUTTON_17,100); // 按下按钮
  wait(200);              // 按住200毫秒
set_val(BUTTON_17,0);   // 松开按钮
  wait(200);              // 松开200毫秒
}
在双击按钮时将bEnabled设置为TRUE并运行组合,按一次将设置为FALSE,不再重新启动组合。
bool bEnabled=FALSE;
 
main {
if (event_active(BUTTON_17)) {
bEnabled = FALSE;
if (time_release(BUTTON_17) <= 200) {
  bEnabled = TRUE;
  printf("Double Tap");
   }
  }
 
if (bEnabled) combo_run(cRepeat);
}
 
combo cRepeat {
set_val(BUTTON_17,100); // 按下按钮
  wait(200);              // 按住200毫秒
set_val(BUTTON_17,0);   // 松开按钮
  wait(200);              // 松开200毫秒
}
在双击按钮时将bEnabled设置为TRUE并运行组合,在第二次按下按钮时按住按钮进行重复组合,松开按钮会将bEnabled设置为FALSE,不再重复组合。
bool bEnabled=FALSE;
 
main {
if (event_active(BUTTON_17) && time_release(BUTTON_17) <= 200) { // 开始
  bEnabled = TRUE;
  printf("Double Tap");
  }
if (event_release(BUTTON_17)) bEnabled = FALSE; // 停止重复组合
 
if (bEnabled) combo_run(cRepeat);
}
 
combo cRepeat {
set_val(BUTTON_17,100); // 按下按钮
  wait(200);              // 按住200毫秒
set_val(BUTTON_17,0);   // 松开按钮
  wait(200);              // 松开200毫秒
}
脚本开/关
按[Touch-Click|View] + [CROSS|A]可快速启动/停用脚本,无需手动停用内存插槽。
bool bScript=FALSE;
 
main {
// Playstation: Touch-Click + CROSS
// XBox: View + A
if (get_actual(BUTTON_2) && event_active(BUTTON_16)) bScript = !bScript;
 
if (bScript) {
    // 在此处添加你的代码达到启用脚本时运行
 
  }
}
反后坐力
Anti Recoil会自动向下移动你的瞄准操作杆,以达到射击时武器的反后坐力。有不同的代码来处理游戏手柄或鼠标的反后坐力。
切换反后坐力
在按住BUTTON_8时同时按下BUTTON_11可以打开/关闭Anti Recoil。这是一个简单的垂直后坐力补偿。
bool bAntiRecoil=FALSE; // 切换flag
 
fix32 RECOIL_V = 30.0; // 垂直补偿,将其调整为一个数值,使你在武器射击时能保持稳定。
// 如果射击时,你的准星被补偿拉到地面,你可能调整太高。如果准星被补偿拉到上方,则表示调整太低。
 
main {
// 切换
if (get_actual(BUTTON_8) && event_active(BUTTON_11)) bAntiRecoil = !bAntiRecoil;
 
// 仅在射击时使用
if (bAntiRecoil && get_val(BUTTON_5)) {
set_val(STICK_1_Y,(RECOIL_V * (100.0 - abs(get_val(STICK_1_Y)))) / 100.0 + get_val(STICK_1_Y));
  }  
}
这是一个更加复杂的反后坐力样本。这个对游戏手柄或鼠标都是用。由大佬 Antithesis🤠编写。
bool bAntiRecoil=FALSE; // 使用 flag
 
// 使用Gtuner IV的设备监视器,你可以此值调整为右摇杆的静止值。
// 移动操作杆并松开,多尝试几次,输入你操作杆的最大静止值。
#define StickNoise 4.32 
 
fix32 RECOIL_V = 30.0; // 垂直补偿,将其调整为一个数值,使你在武器射击时能保持稳定。
// 如果射击时,你的准星被补偿拉到地面,你可能调整太高。如果准星被补偿拉到上方,则表示调整太低。
 
fix32 RECOIL_H = 0.0;  // 水平
// 如果在射击时,准星总是往左侧移动,则表示数值设置太低。
// 如果在射击时,准星总是往右侧移动,则表示数值设置太高。
 
main {
// 切换
if (get_actual(BUTTON_8) && event_active(BUTTON_11)) bAntiRecoil = !bAntiRecoil;
 
// 仅在bAntirecoil为TRUE且触发时运行
if (bAntiRecoil && get_val(BUTTON_5)) {
// 移除操作杆不必要的动作,因为操作杆在松开后不可能完全归0,且有些手柄可能存在轻微飘逸。
if(abs(get_actual(STICK_1_X)) < StickNoise) { set_val(STICK_1_X, 0.0); }
if(abs(get_actual(STICK_1_Y)) < StickNoise) { set_val(STICK_1_Y, 0.0); }
 
AntiRecoil(STICK_1_Y,RECOIL_V); // Y 轴 - 垂直后坐力补偿
AntiRecoil(STICK_1_X,RECOIL_H); // X 轴 - 水平后坐力补偿
  }  
}
 
// 这些是反后坐力的函数。
void AntiRecoil (uint8 axis, fix32 recoil)
{
fix32 RY = get_actual(STICK_1_Y); // 读取实际的STICK Y数值
fix32 RX = get_actual(STICK_1_X); // 读取实际的STICK X数值
 
// 仅当x&y的实际移动数值低于要应用的反后坐力数值时才启用反后坐力。
if (get_val(BUTTON_5) && (sqrt(RX*RX + RY*RY)) <= abs(recoil))
{
 if(abs(RY) <= abs(recoil)) // 仅在y轴移动低于反后坐力数值时启用。
   {
      set_val(axis,(recoil * (100.0 - abs(get_val(axis)))) / 100.0 + get_val(axis));
   }
}
}
腰射闪瞄
当按下瞄准按钮时,Auto Scope会有一小段延迟后按下瞄准镜按钮。
切换范围
再按下BUTTON_8时同时按下BUTTON_12以开启/关闭自动范围使用。
// 切换 - auto scope
bool bScope=FALSE;
 
main {
// 切换
if (get_actual(BUTTON_8) && event_active(BUTTON_12)) bScope = !bScope;
 
// 仅在启用自动范围并按下BUTTON_8时运行Auto Scope
if (bScope && event_active(BUTTON_8)) combo_run(cScope);
}
 
combo cScope {
  wait(20);              // 等待20毫秒开启瞄准
set_val(BUTTON_6,100); // 按下范围按钮
  wait(50);              // 按下50毫秒
}
快速射击
当你按住射击按钮时,Rapid Fire会按下并松开射击按钮。
简单射速
当你按住射击按钮是,脚本将快速按下并松开射击按钮。
// 简单射速
main {
// 仅在按下BUTTON_5时运行简单射速
if (is_active(BUTTON_5)) combo_run(cRapidFire);
// 松开按钮后停止运行
if (event_release(BUTTON_5)) combo_stop(cRapidFire);
}
 
combo cRapidFire {
set_val(BUTTON_5,100); // 按下BUTTON_5
  wait(40);              // 按下40毫秒
set_val(BUTTON_5,0);   // 松开BUTTON_5
  wait(40);              // 松开40毫秒
}
切换射速
在按住BUTTON_8时同时按下BUTTON_10以开启/关闭Rapid Fire
 
// 切换- 快速射击
bool bRapid=FALSE;
 
main {
// 切换
if (get_actual(BUTTON_8) && event_active(BUTTON_10)) bRapid = !bRapid;
 
// 仅在按下BUTTON_5时运行快速射击
if (bRapid) {
  if (is_active(BUTTON_5)) combo_run(cRapidFire);
  if (event_release(BUTTON_5)) combo_stop(cRapidFire);
 }
}
 
combo cRapidFire {
set_val(BUTTON_5,100); // 按下BUTTON_5
  wait(40);              // 按下40毫秒
set_val(BUTTON_5,0);   // 松开BUTTON_5
  wait(40);              // 松开40毫秒
}
按数值快速射击
仅当BUTTON_5按下小于80.0时运行快速射击组合,仅适用于模拟输入。如BUTTON_5、BUTTON_8、操作杆、陀螺仪….其它按钮。数字是4、6、7、9…..,只会返回值0.0或100.0。
// 达到这个数值将停止射击
fix32 RapidLimit=80.0;
 
main {  
// 仅当BUTTON_5处于活动状态且小于RapidLimit是才运行快速射击
if (is_active(BUTTON_5) && get_actual(BUTTON_5) < RapidLimit) combo_run(cRapidFire);
// 停止在该值以上或松开按钮
else if (event_release(BUTTON_5) || get_actual(BUTTON_5) >= RapidLimit) combo_stop(cRapidFire);
}
 
combo cRapidFire {
set_val(BUTTON_5,100); // 按下BUTTON_5
  wait(40);              // 按下40毫秒
set_val(BUTTON_5,0);   // 松开BUTTON_5
  wait(40);              // 松开40毫秒
}
灵敏度
按下L3/LS,修改右摇杆灵敏度。
#define SENSITIVITY  2.0
 
main {
if (get_val(BUTTON_9)) {
  set_val(STICK_1_X, clamp(get_val(STICK_1_X) * SENSITIVITY, -100.0, 100.0));
  set_val(STICK_1_Y, clamp(get_val(STICK_1_Y) * SENSITIVITY, -100.0, 100.0));
  }
}
GPC指令符
| 序 | GPC符 | PlayStation5 | XboxSeriesX/S | PlayStation4 | XboxOne | Switch | PlayStation3 | Xbox360 | Wii/WiiU | 
|---|
| 1 | BUTTON_1 | PS | Xbox | PS | Xbox | Home | PS | Guide | Home | 
| 2 | BUTTON_2 | TouchClick | View | TouchClick | View | Minus | Select | Back | Minus | 
| 3 | BUTTON_3 | Options | Menu | Options | Menu | Plus | Start | Start | Plus | 
| 4 | BUTTON_4 | R1 | RB | R1 | RB | R | R1 | RB | R | 
| 5 | BUTTON_5 | R2 | RT | R2 | RT | ZR | R2 | RT | ZR | 
| 6 | BUTTON_6 | R3 | RS | R3 | RS | RS | R3 | RS | RS/Two | 
| 7 | BUTTON_7 | L1 | LB | L1 | LB | L | L1 | LB | L/C | 
| 8 | BUTTON_8 | L2 | LT | L2 | LT | ZL | L2 | LT | ZL/Z | 
| 9 | BUTTON_9 | L3 | LS | L3 | LS | LS | L3 | LS | SL/One | 
| 10 | BUTTON_10 | DPadUp | DPadUp | DPadUp | DPadUp | DPadUp | DPadUp | DPadUp | DPadUp | 
| 11 | BUTTON_11 | DPadDown | DPadDown | DPadDown | DPadDown | DPadDown | DPadDown | DPadDown | DPadDown | 
| 12 | BUTTON_12 | DPadLeft | DPadLeft | DPadLeft | DPadLeft | DPadLeft | DPadLeft | DPadLeft | DPadLeft | 
| 13 | BUTTON_13 | DPadRight | DPadRight | DPadRight | DPadRight | DPadRight | DPadRight | DPadRight | DPadRight | 
| 14 | BUTTON_14 | Triangle | Y | Triangle | Y | X | Triangle | Y | X | 
| 15 | BUTTON_15 | Circle | B | Circle | B | A | Circle | B | A | 
| 16 | BUTTON_16 | Cross | A | Cross | A | B | Cross | A | B | 
| 17 | BUTTON_17 | Square | X | Square | X | Y | Square | X | Y | 
| 18 | BUTTON_18 | Create | Share | Share | - | Capture | - | - | - | 
| 19 | BUTTON_19 | TouchP1 | - | TouchP1 | - | SL | - | - | InfraredP1 | 
| 20 | BUTTON_20 | TouchP2 | - | TouchP2 | - | SR | - | - | InfraredP2 | 
| 21 | BUTTON_21 | Mute | Sync | - | Sync | - | - | - | - | 
| 22 | STICK_1_X | RightStickX | RightStickX | RightStickX | RightStickX | RightStickX | RightStickX | RightStickX | RightStickX | 
| 23 | STICK_1_Y | RightStickY | RightStickY | RightStickY | RightStickY | RightStickY | RightStickY | RightStickY | RightStickY | 
| 24 | STICK_2_X | LeftStickX | LeftStickX | LeftStickX | LeftStickX | LeftStickX | LeftStickX | LeftStickX | LeftStickX | 
| 25 | STICK_2_Y | LeftStickY | LeftStickY | LeftStickY | LeftStickY | LeftStickY | LeftStickY | LeftStickY | LeftStickY | 
| 26 | POINT_1_X | TouchP1X | - | TouchP1X | - | - | - | - | TouchP1X | 
| 27 | POINT_1_Y | TouchP1Y | - | TouchP1Y | - | - | - | - | TouchP1Y | 
| 28 | POINT_2_X | TouchP2X | - | TouchP2X | - | - | - | - | TouchP2X | 
| 29 | POINT_2_Y | TouchP2Y | - | TouchP2Y | - | - | - | - | TouchP2Y | 
| 30 | ACCEL_1_X | AccelX | - | AccelX | - | AccelX | AccelX | - | AccelX | 
| 31 | ACCEL_1_Y | AccelY | - | AccelY | - | AccelY | AccelY | - | AccelY | 
| 32 | ACCEL_1_Z | AccelZ | - | AccelZ | - | AccelZ | AccelZ | - | AccelZ | 
| 33 | ACCEL_2_X | - | - | - | - | JoyAccX | - | - | NunchukAccX | 
| 34 | ACCEL_2_Y | - | - | - | - | JoyAccY | - | - | NunchukAccY | 
| 35 | ACCEL_2_Z | - | - | - | - | JoyAccZ | - | - | NunchukAccZ | 
| 36 | GYRO_1_X | GyroX | - | GyroX | - | GyroX | - | - | MPlusGyroX | 
| 37 | GYRO_1_Y | GyroY | - | GyroY | - | GyroX | - | - | MPlusGyroY | 
| 38 | GYRO_1_Z | GyroZ | - | GyroZ | - | GyroZ | - | - | MPlusGyroZ | 
| 39 | PADDLE_1 | - | P1 | - | P1 | - | - | - | - | 
| 40 | PADDLE_2 | - | P2 | - | P2 | - | - | - | - | 
| 41 | PADDLE_3 | - | P3 | - | P3 | - | - | - | - | 
| 42 | PADDLE_4 | - | P4 | - | P4 | - | - | - | - |