Как узнать ID чела по ID авто?
#1

Как узнать ID чела по ID авто.
Возможно ли? Без цикла.
Reply
#2

Когда игрок сел в машинку сохранять в массив игроков ид машинки, в которой он сидит. И когда игрок выходит очищать ид машинки.
Reply
#3

Записывайте данные в отдельный массив, потом из него выводите.
Reply
#4

Quote:
Originally Posted by eakwarp
Посмотреть сообщение
Записывайте данные в отдельный массив, потом из него выводите.
Зачем повторять то, что уже сказали только менее информативно?

iNoob, тебе нужно примерно что то типа такого:
pawn Код:
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;
}
Можно довести до ума (не проверял, накидал на скорую руку).
Reply
#5

Quote:
Originally Posted by AirKite
Посмотреть сообщение
Зачем повторять то, что уже сказали только менее информативно?

iNoob, тебе нужно примерно что то типа такого:
pawn Код:
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;
}
Можно довести до ума (не проверял, накидал на скорую руку).
Между нашими сообщениями разница менее минуты. Так что, меня просто опередили.
Reply
#6

И да:
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;
}
Тогда уж.
Reply
#7

Quote:
Originally Posted by eakwarp
Посмотреть сообщение
И да:
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;
}
Тогда уж.
Торопился чисто показать, про удаление вообще забыл Кстати в ON_FOOT, GetPlayerVehicleSeat(playerid) разве вернёт вообще корректное значение? Скорее всего нужно ещё массив создавать для игроков с последним GetPlayerVehicleSeat

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;
}
Reply
#8

Вот так нужно:

pawn Код:
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;
}
Reply
#9

Пвары медленнее переменных, и предназначены для серверов остро обделенных оперативной памятью. Так что не комильфо.
Reply
#10

Quote:
Originally Posted by stabker
Посмотреть сообщение
Вот так нужно:
pawn Код:
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;
}
Quote:
Originally Posted by eakwarp
Посмотреть сообщение
Пвары медленнее переменных, и предназначены для серверов остро обделенных оперативной памятью. Так что не комильфо.
Это всё не так уж и страшно... Время в основном занимает выделение памяти. Так что в его примере DeletePVar это действительно УГ, т.к. каждый раз SetPVarInt(playerid, "InVehicle", GetPlayerVehicleID(playerid)) будет выделять память, что не есть хорошо... а так сойдёт.

И вообще правильней было бы называть LastVehID, LastSeatID и т.д. И ещё, разве при дисконекте не вызывается OnPlayerStateChange ?
Reply
#11

Quote:
Originally Posted by eakwarp
Посмотреть сообщение
Пвары медленнее переменных, и предназначены для серверов остро обделенных оперативной памятью. Так что не комильфо.
Можно на обычную переменную заменить, это не проблема. Вообщем не суть, кому надо - тот заменит. Я просто показал, что иногда при выходе из игры (краш, к примеру) OnPlayerStateChange не обнулит переменные в данном случае и GetPlayerVehicleSeat уже не получить, если игрок с машины вышел.

Кстати, на счет пваров, я иногда захожу в англоязычные разделы, там все пользуются ими, даже в OnPlayerUpdate. И речь не о "скриптирах".
Reply
#12

Quote:
Originally Posted by stabker
Посмотреть сообщение
Можно на обычную переменную заменить, это не проблема. Вообщем не суть, кому надо - тот заменит. Я просто показал, что иногда при выходе из игры (краш, к примеру) OnPlayerStateChange не обнулит переменные в данном случае и GetPlayerVehicleSeat уже не получить, если игрок и машины вышел.

Кстати, на счет пваров, я иногда захожу в англоязычные разделы, там все пользуются ими, даже в OnPlayerUpdate. И речь не о "скриптирах".
Да вообще по сути не ссы их юзать, главное не удалять их без надобности, почистятся сами при дисконекте. Они работают почти с одинаковой скоростью за исключением первого вызова (когда выделяется память).

В итоге AMX меньше, компиляция быстрее + возможность получать значения из других скриптов (FS).

p.s. Насколько помню GVar плагин работает значительно быстрее... так что есть смысл юзать именно его (хотя точно сказать сейчас не могу, нужно проверять).
Reply
#13

Quote:
Originally Posted by AirKite
Посмотреть сообщение
Да вообще по сути не ссы их юзать, главное не удалять их без надобности, почистятся сами при дисконекте. Они работают почти с одинаковой скоростью за исключением первого вызова (когда выделяется память).

В итоге AMX меньше, компиляция быстрее + возможность получать значения из других скриптов (FS).

p.s. Насколько помню GVar плагин работает значительно быстрее... так что есть смысл юзать именно его (хотя точно сказать сейчас не могу, нужно проверять).
Я и не боюсь их юзать. Если у меня к примеру есть участок кода, который будет задействован редко и при этом нужно что-то запоминать, зачем мне объявлять переменную для всех игроков, если она будет попусту пылиться? Я всегда пользовался и буду пользоваться Пварами, что бы не говорили о них. Крайне удобно для античитов. Не все же читеры, если мне нужно ставить флаг о подозрении в читерстве, для дальнейшей проверки, зачем объявлять для всех подряд, если пваром можно сделать это в нужное время и для нужного игрока
Reply
#14

О спасибо за код.. примерно такой сделал, но этот получше.
Reply
#15

Quote:
Originally Posted by stabker
Посмотреть сообщение
Я и не боюсь их юзать. Если у меня к примеру есть участок кода, который будет задействован редко и при этом нужно что-то запоминать, зачем мне объявлять переменную для всех игроков, если она будет попусту пылиться? Я всегда пользовался и буду пользоваться Пварами, что бы не говорили о них. Крайне удобно для античитов. Не все же читеры, если мне нужно ставить флаг о подозрении в читерстве, для дальнейшей проверки, зачем объявлять для всех подряд, если пваром можно сделать это в нужное время и для нужного игрока
У меня сложилось впечатление, что у вас ну просто совершенно никакие-никакущие прикладные знания об однопоточном программировании, в частности об устройстве амх машины и об основах программирования на павн. Поймите уже, что работа с пварами, гварами, и любым подобным - это вызов нативных функций, причем если углублятся в устройство сампа, то целого каскада функций, это в ЛЮБОМ случае медленнее прямой работы с переменными, и актуально только если вы совершенно бедный нищеброд, и можете держать сервер лишь на вдске с 32мб оперативной памяти, ибо ничего нормального позволить себе не гугу, собственно именно для таких случаев эти функции и созданы. И честно говоря, меня блевать тянет, когда я вижу повсеместное совершенно неуместное использование оных, а следовательно создание лишней работы для процессора.
Reply
#16

Quote:
Originally Posted by eakwarp
Посмотреть сообщение
У меня сложилось впечатление, что у вас ну просто совершенно никакие-никакущие прикладные знания об однопоточном программировании, в частности об устройстве амх машины и об основах программирования на павн. Поймите уже, что работа с пварами, гварами, и любым подобным - это вызов нативных функций, причем если углублятся в устройство сампа, то целого каскада функций, это в ЛЮБОМ случае медленнее прямой работы с переменными, и актуально только если вы совершенно бедный нищеброд, и можете держать сервер лишь на вдске с 32мб оперативной памяти, ибо ничего нормального позволить себе не гугу, собственно именно для таких случаев эти функции и созданы. И честно говоря, меня блевать тянет, когда я вижу повсеместное совершенно неуместное использование оных, а следовательно создание лишней работы для процессора.
Вы правы, спасибо. Пойду переводить PVar'ы на char переменные
Reply
#17

Quote:
Originally Posted by eakwarp
Посмотреть сообщение
У меня сложилось впечатление, что у вас ну просто совершенно никакие-никакущие прикладные знания об однопоточном программировании, в частности об устройстве амх машины и об основах программирования на павн. Поймите уже, что работа с пварами, гварами, и любым подобным - это вызов нативных функций, причем если углублятся в устройство сампа, то целого каскада функций, это в ЛЮБОМ случае медленнее прямой работы с переменными, и актуально только если вы совершенно бедный нищеброд, и можете держать сервер лишь на вдске с 32мб оперативной памяти, ибо ничего нормального позволить себе не гугу, собственно именно для таких случаев эти функции и созданы. И честно говоря, меня блевать тянет, когда я вижу повсеместное совершенно неуместное использование оных, а следовательно создание лишней работы для процессора.
Запили тест и расскажи тогда о том почему иногда вызов нативных функций будет быстрее. Например:
pawn Код:
new VehID[500];
VehID[playerid] = GetPlayerVehicleID(playerid);
дальнейший вызов GetPlayerVehicleID(playerid) будет быстрее чем VehID[playerid]

А вообще лучше конечно юзать GVar Plugin, он позволяет делать всё тоже самое что и PVar только работает в 3 раза быстрее. https://sampforum.blast.hk/showthread.php?tid=151076

pawn Код:
//////////////////
    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
Обычные чтение\запись GVar-ов занимает 54/100000 = 0,000054ms против 13/100000 = 0,000013ms
Что касается выделении памяти (при первом Set и до Delete) 311/100000 = 0,000311ms.
Даже имея 1000 Gvar-ов на одного игрока в OnPlayerConnect, просчёт займёт треть миллисекунды (0,3ms), что для SAMP сервера более чем незначительно, сам по себе OnPlayerConnect даёт большую задержку. Так что даже такое обильное использование GVar-а, даёт не более чем -0.1% к общей производительности.
(Тесты делал на очень сильно загруженном CPU... в реале эти показатели должны быть в 2-5 раз меньше).
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)