这些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 | - | - | - | - |