sscanf проблема CMD
#1

Всех приветствую.

Уважаемые форумчане, обнаружил проблему в моде с которой не могу разобраться. Вроде-бы всё правельно, но почему-то команда отказывается работать.
Пишет "Игрок не найден" хотя данный игрок в сети и авторизован.

PHP код:
CMD:g(playerid, params[])
{
    if(
PlayerInfo[playerid][pAdmin] < 2) return 1;
    if(
sscanf(params, "d", params[0])) return SendClientMessage(playerid, COLOR_LIGHTRED, "Введите: /g(oto) [id]");
    new 
Float:plocx,Float:plocy,Float:plocz;
    if(!
IsPlayerConnected(params[0]) || params[0] == INVALID_PLAYER_ID) return SendClientMessage(playerid, COLOR_LIGHTRED, "Игрок не найден!");
    if(
GetPlayerState(params[0]) != 1 && GetPlayerState(params[0]) != 2 && GetPlayerState(params[0]) != 3) return SendClientMessage(playerid, COLOR_GRAD1, "Игрок не вступил в игру!");
    
GetPlayerPos(params[0], plocx, plocy, plocz);
    if(
GetPlayerState(playerid) == 2) { SetVehiclePos(GetPlayerVehicleID(playerid), plocx, plocy+4, plocz); }
    else { 
SetPPos(playerid,plocx,plocy+2, plocz,0,GetPlayerInterior(params[0]),GetPlayerVirtualWorld(params[0])); }
    if(
GetPlayerVirtualWorld(params[0]) == PlayerInfo[params[0]][pPhousekey]+50) { playerid=PlayerInfo[params[0]][pPhousekey]; }
    
SendMes(playerid, -1, "Вы были телепортированы к игроку %s.",NamePlayer[params[0]]);
    return 
1;
} 
Reply
#2

дебагать пробовал?
Reply
#3

Ну не поленись, создай ты переменную.
И да, специально для игроков у sscanf параметр - "u".
Reply
#4

Quote:
Originally Posted by eakwarp
Посмотреть сообщение
Ну не поленись, создай ты переменную.
И да, специально для игроков у sscanf параметр - "u".
Переменную? Около 500 команд, и под каждую писать переменную и изменять params[], бред.. раньше всё работало.

И еще, каким образом можно найти ошибку, в какой команде, в логе ошибку даёт иной раз:
PHP код:
sscanf warning: Strings without a length are deprecated, please add a destination size. 
Reply
#5

Quote:
Originally Posted by Surprice
Посмотреть сообщение
Переменную? Около 500 команд, и под каждую писать переменную и изменять params[], бред.. раньше всё работало.

И еще, каким образом можно найти ошибку, в какой команде, в логе ошибку даёт иной раз:
PHP код:
sscanf warning: Strings without a length are deprecated, please add a destination size. 
Ну вы и, кхм, говнокодер. Читабельность кода идет нахер, просто потому что вам в лом написать пару удобоваримых переменных, ЭТОЖЕТАКОЙНЕПОСИЛЬНЫЙТРУДКАКЖИТЬТО.
Потом сами запутаетесь и будете здесь же вопрошать, почему у вас нихрена не работает.

Ошибка - ищите где вы в sscanf указали "s" без указания размера.
Reply
#6

Quote:
Originally Posted by Surprice
Посмотреть сообщение
Переменную? Около 500 команд, и под каждую писать переменную и изменять params[], бред.. раньше всё работало.

И еще, каким образом можно найти ошибку, в какой команде, в логе ошибку даёт иной раз:
PHP код:
sscanf warning: Strings without a length are deprecated, please add a destination size. 
Создай лог команд, и увидишь где ошибку выбивает
Reply
#7

Quote:
Originally Posted by Surprice
Посмотреть сообщение
Переменную? Около 500 команд, и под каждую писать переменную и изменять params[], бред.. раньше всё работало.
Это не бред, бред - это твой код. В sscanf для игроков существуют специальные спецификаторы: u и r, там встроена проверка на подключение. Если ты гонишься за оптимизацией, то пойми, что фанатичная оптимизация вида: "надо сэкономить лишний байт" не нужна, читабельность важнее. Да и памяти сейчас навалом и она слишком дешёвая. И твой код гораздо более не оптимизирован чем мог бы быть, ибо у тебя одни и те же функции вызываются несколько раз, а вот это на производительности скажется гораздо сильнее.

Вот так должна выглядеть твоя команда (минимальное количество вызовов функций):
PHP код:
CMD:g(playerid, params[])
{
    if (
PlayerInfo[playerid][pAdmin] < 2) {
        return 
1;
    }
    
    new 
targetid;
    if (
sscanf(params, "u", targetid)) {
        return 
SendClientMessage(playerid, COLOR_LIGHTRED, "Введите: /g(oto) [id/name]");
    }
    if (
targetid == INVALID_PLAYER_ID) {
        return 
SendClientMessage(playerid, COLOR_LIGHTRED, "Игрок не найден!");
    }
    new 
target_state = GetPlayerState(targetid);
    if (
target_state != PLAYER_STATE_ONFOOT &&
        
target_state != PLAYER_STATE_DRIVER &&
        
target_state != PLAYER_STATE_PASSENGER) {
        return 
SendClientMessage(playerid, COLOR_GRAD1, "Игрок не вступил в игру!");
    }
    new 
Float:target_x, Float:target_y, Float:target_z;
    
GetPlayerPos(targetid, target_x, target_y, target_z);
    new 
target_interior = GetPlayerInterior(targetid);
    new 
target_vw = GetPlayerVirtualWorld(targetid);
    new 
vehicleid = GetPlayerVehicleID(playerid);
    if (
vehicleid != 0) {
        
SetVehiclePos(vehicleid, target_x, target_y + 4, target_z);
        
SetVehicleVirtualWorld(vehicleid, target_vw);
        
LinkVehicleToInterior(vehicleid, target_interior);
    } else {
        
SetPPos(playerid, target_x, target_y + 2, target_z, 0, target_interior, target_vw);
    }
    
SendMes(playerid, -1, "Вы были телепортированы к игроку %s.", NamePlayer[targetid]);
    return 
1;
} 
Тут я исправил ещё пару багов:
Ты не меняешь интерьер и мир для телепортируемого транспорта.
И это, может не баг, но похоже на бред:
PHP код:
if(GetPlayerVirtualWorld(params[0]) == PlayerInfo[params[0]][pPhousekey]+50) { playerid=PlayerInfo[params[0]][pPhousekey]; } 
Quote:
Originally Posted by Surprice
Посмотреть сообщение
И еще, каким образом можно найти ошибку, в какой команде, в логе ошибку даёт иной раз:
PHP код:
sscanf warning: Strings without a length are deprecated, please add a destination size. 
Вот такой регулярочкой можно пройтись:
Код:
sscanf\(.*?,\s*?\".*s(?!\[\d+\]).*\"\s*?,.*?\)
Reply
#8

Объясните дураку, зачем для одной строки, открывать { } ?
Reply
#9

Quote:
Originally Posted by AlexanderM
Посмотреть сообщение
Объясните дураку, зачем для одной строки, открывать { } ?
Чтобы было удобнее читать код. Код нужно писать так, чтобы его горизонтально не скроллить. Да и глаз цепляется за скобочки. Одна строка - одна операция, довольно логично. Так же в таком коде сложнее ошибиться в будущем, вдруг появится нужда добавить туда более, чем одну строку.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)