PDA

Просмотр полной версии : [Вопрос] Проблемы с ПТС (продолжение)



SteveStage
18.12.2019, 18:42
Команда показа ПТС:

cmd:pts(playerid, params[])
{
if(login_check{playerid} == false)
return true;
if(!IsPlayerInAnyVehicle(playerid))
return SCM(playerid, COLOR_RED, !"[SERVER] Вы должны находиться в транспорте, чтобы показать ПТС транспорта!");
new vehicleid = GetPlayerVehicleID(playerid);
if(vehicleid == INVALID_VEHICLE_ID) return false;
if(veh[vehicleid][v_ownerid] != playerid)
return SCM(playerid, COLOR_RED, !"[SERVER] Это не ваш транспорт!");
if(spawn_veh{vehicleid} == true)
return SCM(playerid, COLOR_RED, !"[SERVER] У созданных администраторами транспортных средств нету ПТС!");
new
targetid;
if(sscanf(params, "u", targetid))
return SCM(playerid, COLOR_RED, !"[SERVER] Образец показа ПТС транспорта: /pts [id]");
if(!IsPlayerConnected(targetid))
return SCM(playerid, COLOR_RED, !"[SERVER] Игрок с введенным вами ID не в сети!");
if(login_check{targetid} == false)
return SCM(playerid, COLOR_RED, !"[SERVER] Игрок с введенным вами ID не авторизован!");
static
fmt_str[] = "*%s показал%s ПТС автомобиля %s";
new
string[sizeof(fmt_str)-6+MAX_PLAYER_NAME*2+1+1];
format(string, sizeof(string), fmt_str, GetName(playerid), (player[playerid][p_sex] == 1) ? ("") : ("а"), GetName(targetid));
ProxDetector(playerid, 5.0, COLOR_ACTION, string);
ShowPTS(targetid, vehicleid);
return true;
}

Сток показа ПТС:

stock ShowPTS(playerid, vehid)
{
static
fmt_str[] =
"\
{00C0FF}Владелец:\t\t\t\t{F81414}%s\
\n{00C0FF}ID транспорта:\t\t\t\t{F81414}%d\
\n{00C0FF}Модель:\t\t\t\t\t{F81414}%s\
\n{00C0FF}Класс:\t\t\t\t\t{F81414}%s\
";
new
string[sizeof(fmt_str)-8+MAX_PLAYER_NAME+11+25+1+1];
format(string, sizeof(string), fmt_str, GetName(veh[vehid][v_ownerid]), veh[vehid][v_tableid], ModelName[veh[vehid][v_model]-400],
car_class[veh[vehid][v_class]-1]);
SPD(playerid, DLG_ID_NONE, DSM, !"{00C0FF}ПТС", string, !"{00C0FF}Понятно", !"");
}

При вводе команды в консоль выводятся варнинги (крашдетекта)

[15:49:13] [connection] incoming connection: 127.0.0.1:61665 id: 0
[15:49:13] [join] Steve_Stage has joined the server (0:127.0.0.1)
[15:49:23] [debug] Run time error 4: "Array index out of bounds"
[15:49:23] [debug] Attempted to read/write array element at negative index -1
[15:49:23] [debug] AMX backtrace:
[15:49:23] [debug] #0 00027228 in ShowPTS (playerid=0, vehid=1) at C:\Users\HP\Desktop\Документы\2) Pawn\Мои моды\Junction RP\gamemodes\JunctionMode.pwn:3193
[15:49:23] [debug] #1 0003522c in public pc_cmd_pts (playerid=0, params[]=@0005b278 "0") at C:\Users\HP\Desktop\Документы\2) Pawn\Мои моды\Junction RP\gamemodes\JunctionMode.pwn:4256
[15:49:24] [part] Steve_Stage has left the server (0:1)

Что делать?

execution
18.12.2019, 19:29
У тебя дана ошибка:

[15:49:23] [debug] Run time error 4: "Array index out of bounds"
[15:49:23] [debug] Attempted to read/write array element at negative index -1

Дан номер строки, где она возникает:

15:49:23] [debug] #0 00027228 in ShowPTS (playerid=0, vehid=1) at C:\Users\HP\Desktop\Документы\2) Pawn\Мои моды\Junction RP\gamemodes\JunctionMode.pwn:3193
[15:49:23] [debug] #1 0003522c in public pc_cmd_pts (playerid=0, params[]=@0005b278 "0") at C:\Users\HP\Desktop\Документы\2) Pawn\Мои моды\Junction RP\gamemodes\JunctionMode.pwn:4256

Что ж делать?))

p.s ты хоть раз пытался самим что-то исправить?)

SteveStage
18.12.2019, 19:43
У тебя дана ошибка:

[15:49:23] [debug] Run time error 4: "Array index out of bounds"
[15:49:23] [debug] Attempted to read/write array element at negative index -1

Дан номер строки, где она возникает:

15:49:23] [debug] #0 00027228 in ShowPTS (playerid=0, vehid=1) at C:\Users\HP\Desktop\Документы\2) Pawn\Мои моды\Junction RP\gamemodes\JunctionMode.pwn:3193
[15:49:23] [debug] #1 0003522c in public pc_cmd_pts (playerid=0, params[]=@0005b278 "0") at C:\Users\HP\Desktop\Документы\2) Pawn\Мои моды\Junction RP\gamemodes\JunctionMode.pwn:4256

Что ж делать?))

На строке 4256 return true; в команде cmd:pts, а ранее объявление стока ShowPTS, но вот только толку от этого мало.


p.s ты хоть раз пытался самим что-то исправить?)

Да, но толку от этого ноль, разве что иногда я хуже только делаю.

Проблема в этой строке

format(string, sizeof(string), fmt_str, GetName(veh[vehid][v_ownerid]), veh[vehid][v_tableid], ModelName[veh[vehid][v_model]-400],
car_class[veh[vehid][v_class]-1]);

Но где?

Kovshevoy
18.12.2019, 22:00
Проблема в этой строке

format(string, sizeof(string), fmt_str, GetName(veh[vehid][v_ownerid]), veh[vehid][v_tableid], ModelName[veh[vehid][v_model]-400],
car_class[veh[vehid][v_class]-1]);

Но где?
Хм


[15:49:23] [debug] Attempted to read/write array element at negative index -1

Хмммм

car_class[veh[vehid][v_class]-1] - вот где кроется твоя проблема. Класс скорей всего равен нулю, а ты ещё и -1 делаешь.

- - - Добавлено - - -

В любом случае, первое, когда у тебя вылазит крашдетект - логируй.

В ShowPTC

printf("format:\n%s", string);

А лучше переименуй функцию в ShowVeh(icle)Pass(port), ибо если не можешь в английский - используй переводчик. Калечно смотреть на мультиязыковые названия функций.

Если брать глобально, то ПТС на инглише звучит как certificate of title for a vehicle. Но возможно, сойдет и ShowVehPass (если че это было никому не нужное мнение и мини-доё*ка)

SteveStage
18.12.2019, 22:37
Хм

Хмммм

car_class[veh[vehid][v_class]-1] - вот где кроется твоя проблема. Класс скорей всего равен нулю, а ты ещё и -1 делаешь.

- - - Добавлено - - -

В любом случае, первое, когда у тебя вылазит крашдетект - логируй.

В ShowPTC

printf("format:\n%s", string);

А лучше переименуй функцию в ShowVeh(icle)Pass(port), ибо если не можешь в английский - используй переводчик. Калечно смотреть на мультиязыковые названия функций.

Если брать глобально, то ПТС на инглише звучит как certificate of title for a vehicle. Но возможно, сойдет и ShowVehPass (если че это было никому не нужное мнение и мини-доё*ка)

Проблема решилась) И заключалась она в этой строке при загрузке авто:

if(veh_id != INVALID_VEHICLE_ID) return true;

Суть в том, что если авто валидное, то загрузка заканчивается, не записывая данные в массив veh. А понял я это, когда в самом конце поставил printf, и после загрузки авто в консоль ничего не вывело (из того, что я писал).
Решение - такая строка:

if(veh_id == INVALID_VEHICLE_ID) return false;

Проблема осталась еще со времени, когда все авто грузились циклом, независимо от онлайна владельца, а вместо return true там стоял continue (цикл for)

Проблема неочевидная даже потому, что крашдетект указывает на форматирование строки, а проблема находится еще при его загрузке, и понятно почему - компилятор не предназначен для отслеживания логических ошибок, ибо это невозможно (вдруг кому-то намеренно надо сделать тут return, а ему выведется ошибка).

Насчет названия - vehicle passport не звучит, это уже придирки, ибо с чего бы мне не оставить аббревиатуру транслитом? (пример - Щ.И.Т. и S.H.I.E.L.D. - название организации Ника Фьюри из Мстителей переведено транслитом и ничего, никто не жалуется)

Проблема решена

Kovshevoy
18.12.2019, 23:22
Насчет названия - vehicle passport не звучит, это уже придирки, ибо с чего бы мне не оставить аббревиатуру транслитом? (пример - Щ.И.Т. и S.H.I.E.L.D. - название организации Ника Фьюри из Мстителей переведено транслитом и ничего, никто не жалуется)


Чего, бл*ть?
http://prntscr.com/qcpzrc

SteveStage
18.12.2019, 23:29
Чего, бл*ть?
http://prntscr.com/qcpzrc

Ну во-первых давай общаться без матов
Во-вторых я про это (рядом с мышкой на скрине): https://ibb.co/PtmzxJx

Я про то, что аббревиатура S.H.I.E.L.D. расшифровывается, а Щ.И.Т. нет

Опять тема ушла в оффтоп. Если кто-то еще найдет замечания/недочеты в коде - отписывайте сюда=)