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

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

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

PHP код:
CMD:g(playeridparams[])
{
    if(
PlayerInfo[playerid][pAdmin] < 2) return 1;
    if(
sscanf(params"d"params[0])) return SendClientMessage(playeridCOLOR_LIGHTRED"Введите: /g(oto) [id]");
    new 
Float:plocx,Float:plocy,Float:plocz;
    if(!
IsPlayerConnected(params[0]) || params[0] == INVALID_PLAYER_ID) return SendClientMessage(playeridCOLOR_LIGHTRED"Игрок не найден!");
    if(
GetPlayerState(params[0]) != && GetPlayerState(params[0]) != && GetPlayerState(params[0]) != 3) return SendClientMessage(playeridCOLOR_GRAD1"Игрок не вступил в игру!");
    
GetPlayerPos(params[0], plocxplocyplocz);
    if(
GetPlayerState(playerid) == 2) { SetVehiclePos(GetPlayerVehicleID(playerid), plocxplocy+4plocz); }
    else { 
SetPPos(playerid,plocx,plocy+2plocz,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 warningStrings without a length are deprecatedplease add a destination size
Reply
#5

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

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

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

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

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

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

Вот так должна выглядеть твоя команда (минимальное количество вызовов функций):
PHP код:
CMD:g(playeridparams[])
{
    if (
PlayerInfo[playerid][pAdmin] < 2) {
        return 
1;
    }
    
    new 
targetid;
    if (
sscanf(params"u"targetid)) {
        return 
SendClientMessage(playeridCOLOR_LIGHTRED"Введите: /g(oto) [id/name]");
    }
    if (
targetid == INVALID_PLAYER_ID) {
        return 
SendClientMessage(playeridCOLOR_LIGHTRED"Игрок не найден!");
    }
    new 
target_state GetPlayerState(targetid);
    if (
target_state != PLAYER_STATE_ONFOOT &&
        
target_state != PLAYER_STATE_DRIVER &&
        
target_state != PLAYER_STATE_PASSENGER) {
        return 
SendClientMessage(playeridCOLOR_GRAD1"Игрок не вступил в игру!");
    }
    new 
Float:target_xFloat:target_yFloat:target_z;
    
GetPlayerPos(targetidtarget_xtarget_ytarget_z);
    new 
target_interior GetPlayerInterior(targetid);
    new 
target_vw GetPlayerVirtualWorld(targetid);
    new 
vehicleid GetPlayerVehicleID(playerid);
    if (
vehicleid != 0) {
        
SetVehiclePos(vehicleidtarget_xtarget_y 4target_z);
        
SetVehicleVirtualWorld(vehicleidtarget_vw);
        
LinkVehicleToInterior(vehicleidtarget_interior);
    } else {
        
SetPPos(playeridtarget_xtarget_y 2target_z0target_interiortarget_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 warningStrings without a length are deprecatedplease 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)