Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Доброго времени суток. В SA:MP по умолчанию можно отследить только кнопки W и S, при этом только если игрок находится в автомобиле. В этой теме я покажу простое решение, которое позволит взаимодействовать с кнопками WASD, если игрок находится НЕ в автомобиле и с A и D, если игрок находится в автомобиле.
Естественно, для всего этого Вам понадобится плагин Pawn.RakNet
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Для начала создадим макросы для кнопок
C++:
#define KEY_ONFOOT_W 300
#define KEY_ONFOOT_A 301
#define KEY_ONFOOT_S 302
#define KEY_ONFOOT_D 303
#define KEY_IN_CAR_A 304
#define KEY_IN_CAR_D 305
C++:
new OLD_KEY[MAX_PLAYERS];
C++:
public OnIncomingPacket(playerid, packetid, BitStream:bs)
{
if(packetid == 207)
{
new onFootData[PR_OnFootSync];
BS_IgnoreBits(bs, 8);
BS_ReadOnFootSync(bs, onFootData);
if(onFootData[PR_udKey] == 65408) OnPlayerKeyStateChange(playerid, KEY_ONFOOT_W, 0), OLD_KEY[playerid] = KEY_ONFOOT_W;
if(onFootData[PR_udKey] == 128) OnPlayerKeyStateChange(playerid, KEY_ONFOOT_S, 0), OLD_KEY[playerid] = KEY_ONFOOT_S;
if(onFootData[PR_lrKey] == 65408) OnPlayerKeyStateChange(playerid, KEY_ONFOOT_A, 0), OLD_KEY[playerid] = KEY_ONFOOT_A;
if(onFootData[PR_lrKey] == 128) OnPlayerKeyStateChange(playerid, KEY_ONFOOT_D, 0), OLD_KEY[playerid] = KEY_ONFOOT_D;
if(onFootData[PR_udKey] == 0 && OLD_KEY[playerid] == KEY_ONFOOT_W) OnPlayerKeyStateChange(playerid, 0, KEY_ONFOOT_W), OLD_KEY[playerid] = 0;
if(onFootData[PR_udKey] == 0 && OLD_KEY[playerid] == KEY_ONFOOT_S) OnPlayerKeyStateChange(playerid, 0, KEY_ONFOOT_S), OLD_KEY[playerid] = 0;
if(onFootData[PR_lrKey] == 0 && OLD_KEY[playerid] == KEY_ONFOOT_A) OnPlayerKeyStateChange(playerid, 0, KEY_ONFOOT_A), OLD_KEY[playerid] = 0;
if(onFootData[PR_lrKey] == 0 && OLD_KEY[playerid] == KEY_ONFOOT_D) OnPlayerKeyStateChange(playerid, 0, KEY_ONFOOT_D), OLD_KEY[playerid] = 0;
}
if(packetid == 200)
{
new inCarData[PR_InCarSync];
BS_IgnoreBits(bs, 8);
BS_ReadInCarSync(bs, inCarData);
if(inCarData[PR_lrKey] == 65408) OnPlayerKeyStateChange(playerid, KEY_IN_CAR_A, 0), OLD_KEY[playerid] = KEY_IN_CAR_A;
if(inCarData[PR_lrKey] == 128) OnPlayerKeyStateChange(playerid, KEY_IN_CAR_D, 0), OLD_KEY[playerid] = KEY_IN_CAR_D;
if(inCarData[PR_lrKey] == 0 && OLD_KEY[playerid] == KEY_IN_CAR_A) OnPlayerKeyStateChange(playerid, 0, KEY_IN_CAR_A), OLD_KEY[playerid] = 0;
if(inCarData[PR_lrKey] == 0 && OLD_KEY[playerid] == KEY_IN_CAR_D) OnPlayerKeyStateChange(playerid, 0, KEY_IN_CAR_D), OLD_KEY[playerid] = 0;
}
return 1;
}
C++:
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if(newkeys & KEY_ONFOOT_W)
{
print("Нажата кнопка W");
// Ваш код
}
if(newkeys & KEY_ONFOOT_A)
{
print("Нажата кнопка A");
// Ваш код
}
return 1;
}
C++:
#define KEY_ONFOOT_W 40
#define KEY_ONFOOT_A 41
#define KEY_ONFOOT_S 42
#define KEY_ONFOOT_D 43
#define KEY_IN_CAR_A 44
#define KEY_IN_CAR_D 45
C++:
new OLD_KEY[MAX_PLAYERS char];
C++:
public OnIncomingPacket(playerid, packetid, BitStream:bs)
{
if(packetid == 207)
{
new onFootData[PR_OnFootSync];
BS_IgnoreBits(bs, 8);
BS_ReadOnFootSync(bs, onFootData);
if(onFootData[PR_udKey] == 65408) OnPlayerKeyStateChange(playerid, KEY_ONFOOT_W, 0), OLD_KEY{playerid} = KEY_ONFOOT_W;
if(onFootData[PR_udKey] == 128) OnPlayerKeyStateChange(playerid, KEY_ONFOOT_S, 0), OLD_KEY{playerid} = KEY_ONFOOT_S;
if(onFootData[PR_lrKey] == 65408) OnPlayerKeyStateChange(playerid, KEY_ONFOOT_A, 0), OLD_KEY{playerid} = KEY_ONFOOT_A;
if(onFootData[PR_lrKey] == 128) OnPlayerKeyStateChange(playerid, KEY_ONFOOT_D, 0), OLD_KEY{playerid} = KEY_ONFOOT_D;
if(onFootData[PR_udKey] == 0 && OLD_KEY{playerid} == KEY_ONFOOT_W) OnPlayerKeyStateChange(playerid, 0, KEY_ONFOOT_W), OLD_KEY{playerid} = 0;
if(onFootData[PR_udKey] == 0 && OLD_KEY{playerid} == KEY_ONFOOT_S) OnPlayerKeyStateChange(playerid, 0, KEY_ONFOOT_S), OLD_KEY{playerid} = 0;
if(onFootData[PR_lrKey] == 0 && OLD_KEY{playerid} == KEY_ONFOOT_A) OnPlayerKeyStateChange(playerid, 0, KEY_ONFOOT_A), OLD_KEY{playerid} = 0;
if(onFootData[PR_lrKey] == 0 && OLD_KEY{playerid} == KEY_ONFOOT_D) OnPlayerKeyStateChange(playerid, 0, KEY_ONFOOT_D), OLD_KEY{playerid} = 0;
}
if(packetid == 200)
{
new inCarData[PR_InCarSync];
BS_IgnoreBits(bs, 8);
BS_ReadInCarSync(bs, inCarData);
if(inCarData[PR_lrKey] == 65408) OnPlayerKeyStateChange(playerid, KEY_IN_CAR_A, 0), OLD_KEY{playerid} = KEY_IN_CAR_A;
if(inCarData[PR_lrKey] == 128) OnPlayerKeyStateChange(playerid, KEY_IN_CAR_D, 0), OLD_KEY{playerid} = KEY_IN_CAR_D;
if(inCarData[PR_lrKey] == 0 && OLD_KEY{playerid} == KEY_IN_CAR_A) OnPlayerKeyStateChange(playerid, 0, KEY_IN_CAR_A), OLD_KEY{playerid} = 0;
if(inCarData[PR_lrKey] == 0 && OLD_KEY{playerid} == KEY_IN_CAR_D) OnPlayerKeyStateChange(playerid, 0, KEY_IN_CAR_D), OLD_KEY{playerid} = 0;
}
return 1;
}
Последнее редактирование: