26.12.2012, 12:12
Как узнать ID чела по ID авто.
Возможно ли? Без цикла.
Возможно ли? Без цикла.
new Seat_in_Vehicle[MAX_VEHICLES][128] = {{INVALID_PLAYER_ID, ...}, ...};
GetVehicleSeat(vehicleid, seatid) {
if(vehicleid < 1 || vehicleid > MAX_VEHICLES) {
return INVALID_PLAYER_ID;
}
return Seat_in_Vehicle[vehicleid-1][seatid];
}
public OnPlayerStateChange(playerid, newstate, oldstate) {
if(newstate == PLAYER_STATE_PASSENGER || newstate == PLAYER_STATE_DRIVER) {
VehicleDriverPlayerid[GetPlayerVehicleID(playerid) - 1] = GetPlayerVehicleSeat(playerid);
}
return 1;
}
Зачем повторять то, что уже сказали только менее информативно?
iNoob, тебе нужно примерно что то типа такого: pawn Код:
|
public OnPlayerStateChange(playerid, newstate, oldstate) {
if(newstate == PLAYER_STATE_PASSENGER || newstate == PLAYER_STATE_DRIVER) {
Seat_in_Vehicle[GetPlayerVehicleID(playerid)-1] [GetPlayerVehicleSeat(playerid)]=playerid;
}
else if(oldstate == PLAYER_STATE_PASSENGER || oldstate == PLAYER_STATE_DRIVER) {
Seat_in_Vehicle[GetPlayerVehicleID(playerid)-1][GetPlayerVehicleSeat(playerid)] = INVALID_PLAYER_ID;
}
return 1;
}
И да:
pawn Код:
|
new SiVehicle[MAX_VEHICLES][128] = {{INVALID_PLAYER_ID, ...}, ...}, OldPVSeat[MAX_PLAYERS];
GetInVehicleSeat(vehicleid, seatid) {
if(vehicleid < 1 || vehicleid > MAX_VEHICLES) {
return INVALID_PLAYER_ID;
}
return SiVehicle[vehicleid-1][seatid];
}
public OnPlayerStateChange(playerid, newstate, oldstate) {
if(newstate == PLAYER_STATE_PASSENGER || newstate == PLAYER_STATE_DRIVER) {
OldPVSeat[playerid] = GetPlayerVehicleSeat(playerid);
SiVehicle[GetPlayerVehicleID(playerid)-1] [GetPlayerVehicleSeat(playerid)]=playerid;
}
else if(oldstate == PLAYER_STATE_PASSENGER || oldstate == PLAYER_STATE_DRIVER) {
SiVehicle[GetPlayerVehicleID(playerid)-1][OldPVSeat[playerid]] = INVALID_PLAYER_ID;
}
return 1;
}
public OnPlayerStateChange(playerid, newstate, oldstate)
{
if(newstate == PLAYER_STATE_PASSENGER || newstate == PLAYER_STATE_DRIVER)
{
Seat_in_Vehicle[GetPlayerVehicleID(playerid)-1] [GetPlayerVehicleSeat(playerid)] = playerid;
SetPVarInt(playerid, "InVehicle", GetPlayerVehicleID(playerid)), SetPVarInt(playerid, "VehSeat", GetPlayerVehicleSeat(playerid));
}
else if(oldstate == PLAYER_STATE_PASSENGER || oldstate == PLAYER_STATE_DRIVER)
{
Seat_in_Vehicle[GetPVarInt(playerid, "InVehicle")-1][GetPVarInt(playerid, "VehSeat")] = INVALID_PLAYER_ID;
DeletePVar(playerid, "InVehicle"), DeletePVar(playerid, "VehSeat");
}
return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
if(GetPVarInt(playerid, "InVehicle")) Seat_in_Vehicle[GetPVarInt(playerid, "InVehicle")-1][GetPVarInt(playerid, "VehSeat")] = INVALID_PLAYER_ID;
}
Вот так нужно:
pawn Код:
![]() |
Пвары медленнее переменных, и предназначены для серверов остро обделенных оперативной памятью. Так что не комильфо.
|
Пвары медленнее переменных, и предназначены для серверов остро обделенных оперативной памятью. Так что не комильфо.
|
Можно на обычную переменную заменить, это не проблема. Вообщем не суть, кому надо - тот заменит. Я просто показал, что иногда при выходе из игры (краш, к примеру) OnPlayerStateChange не обнулит переменные в данном случае и GetPlayerVehicleSeat уже не получить, если игрок и машины вышел.
Кстати, на счет пваров, я иногда захожу в англоязычные разделы, там все пользуются ими, даже в OnPlayerUpdate. И речь не о "скриптирах". |
Да вообще по сути не ссы их юзать, главное не удалять их без надобности, почистятся сами при дисконекте. Они работают почти с одинаковой скоростью за исключением первого вызова (когда выделяется память).
В итоге AMX меньше, компиляция быстрее + возможность получать значения из других скриптов (FS). p.s. Насколько помню GVar плагин работает значительно быстрее... так что есть смысл юзать именно его (хотя точно сказать сейчас не могу, нужно проверять). |
Я и не боюсь их юзать. Если у меня к примеру есть участок кода, который будет задействован редко и при этом нужно что-то запоминать, зачем мне объявлять переменную для всех игроков, если она будет попусту пылиться? Я всегда пользовался и буду пользоваться Пварами, что бы не говорили о них. Крайне удобно для античитов. Не все же читеры, если мне нужно ставить флаг о подозрении в читерстве, для дальнейшей проверки, зачем объявлять для всех подряд, если пваром можно сделать это в нужное время и для нужного игрока
![]() |
У меня сложилось впечатление, что у вас ну просто совершенно никакие-никакущие прикладные знания об однопоточном программировании, в частности об устройстве амх машины и об основах программирования на павн. Поймите уже, что работа с пварами, гварами, и любым подобным - это вызов нативных функций, причем если углублятся в устройство сампа, то целого каскада функций, это в ЛЮБОМ случае медленнее прямой работы с переменными, и актуально только если вы совершенно бедный нищеброд, и можете держать сервер лишь на вдске с 32мб оперативной памяти, ибо ничего нормального позволить себе не гугу, собственно именно для таких случаев эти функции и созданы. И честно говоря, меня блевать тянет, когда я вижу повсеместное совершенно неуместное использование оных, а следовательно создание лишней работы для процессора.
|
У меня сложилось впечатление, что у вас ну просто совершенно никакие-никакущие прикладные знания об однопоточном программировании, в частности об устройстве амх машины и об основах программирования на павн. Поймите уже, что работа с пварами, гварами, и любым подобным - это вызов нативных функций, причем если углублятся в устройство сампа, то целого каскада функций, это в ЛЮБОМ случае медленнее прямой работы с переменными, и актуально только если вы совершенно бедный нищеброд, и можете держать сервер лишь на вдске с 32мб оперативной памяти, ибо ничего нормального позволить себе не гугу, собственно именно для таких случаев эти функции и созданы. И честно говоря, меня блевать тянет, когда я вижу повсеместное совершенно неуместное использование оных, а следовательно создание лишней работы для процессора.
|
new VehID[500];
VehID[playerid] = GetPlayerVehicleID(playerid);
//////////////////
new time;
print("TEST #1");
time = GetTickCount();
for (new i = 0; i < 100000; i++) {
SetGVarInt("DNIWE", i);
}
printf("SetGVarInt: %d", GetTickCount() - time);
time = GetTickCount();
for (new i = 0; i < 100000; i++) {
GetGVarInt("DNIWE");
}
printf("GetGVarInt: %d", GetTickCount() - time);
//////////////////
time = GetTickCount(); new DNIWE = 0;
for (new i = 0; i < 100000; i++) {
DNIWE = i;
}
printf("DNIWE: %d", GetTickCount() - time);
time = GetTickCount();
for (new i = 0; i < 100000; i++) {
DNIWE;
}
printf("DNIWE: %d", GetTickCount() - time);
//////////////////
for (new i = 0; i < 100000; i++) {
format(names[i], sizeof(names[]), "name_%d", i);
}
print("TEST #2");
time = GetTickCount();
for (new i = 0; i < 100000; i++) {
SetGVarInt(names[i], i);
}
printf("SetGVarInt: %d", GetTickCount() - time);
time = GetTickCount();
for (new i = 0; i < 100000; i++) {
GetGVarInt(names[i]);
}
printf("GetGVarInt: %d", GetTickCount() - time);
TEST #1 SetGVarInt: 54 GetGVarInt: 53 DNIWE: 11 DNIWE: 13 TEST #2 SetGVarInt: 311 GetGVarInt: 102