Вопрос по коду в 2016/2017 a.k.a 2к17
#1

Была одна тема на форуме, парень просил какую-то команду.
Ему вот скинули такой код:
PHP Code:
else if(strcmp(cmd"/givegun"true) == 0)
{
                
tmp strtok(cmdtextidx);
                if(
PlayerInfo[playerid][pAdmin] > 0
                {
                if(!
strlen(tmp)) return SendClientMessage(playeridCOLOR_WHITE"???????????: /givegun [id] [id ??????] [???????]");}
                new 
playa;
                new 
gun;
                new 
ammo;
                
playa ReturnUser(tmp);
                
tmp strtok(cmdtextidx);
                
gun strval(tmp);
                if(
gun <1||gun 46) return SendClientMessage(playeridCOLOR_GRAD1"????? ?????? ?? ?????? ???? ?????? 1 ? ?????? 46");
                if(!
strlen(tmp)) return SendClientMessage(playeridCOLOR_WHITE"???????????: /givegun [id] [id ??????] [???????]");
                
tmp strtok(cmdtextidx);
                
ammo strval(tmp);
                if(
ammo <1||ammo 5000) return SendClientMessage(playeridCOLOR_GRAD1"?????? ?????? 1 ??? ?????? 5000 ????????!");
                if(
PlayerInfo[playerid][pAdmin] >= 6)
                {
                        if(
IsPlayerConnected(playa))
                        {
                                new 
iname[MAX_PLAYER_NAME], dname[MAX_PLAYER_NAME];
                                
GetPlayerName(playeridinamesizeof(iname));
                                
GetPlayerName(playadnamesizeof(dname));
                                
GiveWeapon(playagunammo);
                                
SendClientMessage(playeridCOLOR_GRAD1"?????? ??????");
                                static const 
Frmt[] = "[A] %s[%d] выдал оружие (ID: %d, патронов: %d) игроку %s[%d];
                                new String_Frmt[sizeof(Frmt) + MAX_PLAYER_NAME + 3 + 2 + 4 + MAX_PLAYER_NAME + 3 - 12];
                                format(String_Frmt, sizeof(String_Frmt), Frmt, iname, playerid, gun, ammo, dname, playa);
                                SendAdminMessage(-1, String_Frmt);
                        }
                }
                }
                else return SendClientMessage(playerid, COLOR_GRAD1, "
?? ?? ???????????? ???????????? ??? ???????!");

На что я сделал замечани:
Quote:

Кажется люди в 2к16 (скоро 2к17) не слышали про sscanf

И дал ему такой код:
PHP Code:
CMD:gun(playerid,params[]){
        if(
p_info[playerid][p_admin] < 1) return true;
        if(
sscanf(params,"udd",params[0],params[1],params[2])) return SendClientMessage(playerid,-1"[Справка]: Используйте /gun [ID игрока] [ID оружия] [количество патронов]");
   
GivePlayerWeapon(params[0],params[1],params[2]);
        new 
mes[88];
        
format(messizeof(mes),"[A] %s[%d] выдал оружие %s",Name(playerid),playerid,params[0]);
        
Message_ToAdmins(0xA7CB44AAmes);
        return 
true;

PHP Code:
stock Message_ToAdmins(color, const fmat[], va_args<>)
{
    foreach(new 
Player)
        if (
p_info[i][p_admin] >= 1)
            
SendClientMessage(icolorva_return(fmatva_start<2>));

И ссылка на Pawn.CMD
На что мне сделали указание мол в 2к17 уже пишут примерно такой код:
PHP Code:
if(!strcmp(cmdtext"/ip"true))
{
     if(
PI[playerid][Admin] < 1)//заменяйте на свою переменную админки
         
return true;
     
extract params -> new plid; else
        return 
SendClientMessage(playerid, -1, !"- Подсказка: /ip [ID]");
     if(!
IsPlayerConnected(plid))
        return 
SendClientMessage(playerid, -1, !"Такого игрока нет");
                    
     new   
        
ip[16], name[MAX_PLAYER_NAME];
     
GetPlayerIp(plidipsizeof ip);
                
     
GetPlayerName(plidnamesizeof name);
     static const
         
fmt_str[] = "Ник: [%s]  IP: [%s]";
     new
         
string[sizeof fmt_str + (-2+MAX_PLAYER_NAME) + (-2+16)];
     
format(stringsizeof(string), fmt_strnameip);
     
SendClientMessage(playerid, -1string);
     return 
true;

Вопросы:
На сколько ли это актуально?
Есть-ли какая-то разница между ними? (скорость, память и т.п)
Стоит ли придержоваться второго варианта?
Reply
#2

Реальное отличие второго варианта лишь в проверке на подключенность указанного в команде игрока. В остальном различия только косметические, никакого профита в производительности от такого нет. Разве что пакование строк, но это мизер и вряд ли стоит даже время на это тратить в таких масштабах.

UPD: А, ну и cmd процессор в последнем варианте не используется. При большом количестве команд это наоборот медленнее.
Reply
#3

Quote:
Originally Posted by Johhnyllll
View Post
Была одна тема на форуме, парень просил какую-то команду...
На что я сделал замечаниЕ:
И дал ему такой код:
PHP Code:
CMD:gun(playerid,params[]){
        if(
p_info[playerid][p_admin] < 1) return true;
        if(
sscanf(params,"udd",params[0],params[1],params[2])) return SendClientMessage(playerid,-1"[Справка]: Используйте /gun [ID игрока] [ID оружия] [количество патронов]");
   
GivePlayerWeapon(params[0],params[1],params[2]);
        new 
mes[88];
        
format(messizeof(mes),"[A] %s[%d] выдал оружие %s",Name(playerid),playerid,params[0]);
        
Message_ToAdmins(0xA7CB44AAmes);
        return 
true;

PHP Code:
stock Message_ToAdmins(color, const fmat[], va_args<>)
{
    foreach(new 
Player)
        if (
p_info[i][p_admin] >= 1)
            
SendClientMessage(icolorva_return(fmatva_start<2>));

И ссылка на Pawn.CMD
На что мне сделали указание мол в 2к17 уже пишут примерно такой код:
PHP Code:
if(!strcmp(cmdtext"/ip"true))
{
     if(
PI[playerid][Admin] < 1)//заменяйте на свою переменную админки
         
return true;
     
extract params -> new plid; else
        return 
SendClientMessage(playerid, -1, !"- Подсказка: /ip [ID]");
     if(!
IsPlayerConnected(plid))
        return 
SendClientMessage(playerid, -1, !"Такого игрока нет");
                    
     new   
        
ip[16], name[MAX_PLAYER_NAME];
     
GetPlayerIp(plidipsizeof ip);
                
     
GetPlayerName(plidnamesizeof name);
     static const
         
fmt_str[] = "Ник: [%s]  IP: [%s]";
     new
         
string[sizeof fmt_str + (-2+MAX_PLAYER_NAME) + (-2+16)];
     
format(stringsizeof(string), fmt_strnameip);
     
SendClientMessage(playerid, -1string);
     return 
true;

Вопросы:
На сколько ли это актуально?
Есть-ли какая-то разница между ними? (скорость, память и т.п)
Стоит ли придержоваться второго варианта?
В одном коде (твоём):
* компактность
* ЕРЕСЬ, СЖЕЧЬ
PHP Code:
sscanf(params,"udd",[b]params[0][/b],[b]params[1][/b],[b]params[2][/b]) 
* занимаешься сраной обфускацией попытками экономить на памяти - ты же человеку помогать собрался, а не трахать ему мозг?
> Я знаю тех, кто всерьёз застрял в 90х годах, когда памяти не было и быдлят по поводу того, что человек для этого sscanf-a выделил специальные переменные, имеющие осмысленное название.

В 3-м варианте:
* все пункты твоего варианта, только наоборот, но...
* ПРИЗЫВАЮТ ПРОЛЕТАРИЕВ ВСЕХ СТРАН ЭКОНОМИТЬ НА ЯЧЕЙКАХ В КРАЙНЕ-ОБОСТРЕННОЙ ФОРМЕ.
* Вопрос: ты пишешь, что предлагают Pawn.CMD, НО...
я может отстал от жизни, но если его использовать, то о
PHP Code:
if(!strcmp(cmdtext"/ip"true)) 
не может быть и речи, WTF?!

> в 2к16 писать 2к17
> ПРАВИЛЬНО ПИСАТЬ M3.016 и M3.017!

p.s. комментарий выше тоже к делу
Reply
#4

Это что такое?
PHP Code:
extract params -> new plid
Разве в павн так можно?)
Reply
#5

Quote:
Originally Posted by Diman777
View Post
Это что такое?
PHP Code:
extract params -> new plid
Разве в павн так можно?)
Это sscanf, вот тут есть подробное описание как с extract params работать: http://pawn-wiki.ru/index.php?/topic...ams-v-sscanf2/ (не реклама!)
Reply
#6

Так это макрос оказывается (я про саму запись exstract params), в принципе так и думал.
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)