Всем привет
Написал небольшой мод, хотел бы спросить у вас, неплоха ли оптимизация и читабелен ли код?
Pastebin - Клик
P.S. Спасибо DeimoS )
Всем привет
Написал небольшой мод, хотел бы спросить у вас, неплоха ли оптимизация и читабелен ли код?
Pastebin - Клик
P.S. Спасибо DeimoS )
Последний раз редактировалось Sarah; 13.02.2018 в 18:04.
Не в том месте пытаешься искать, что оптимизировать. Оптимизируй алгоритмы, ищи слабые места в моде с помощью профайлера
Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman
Код не соответствует мировым стандартам, читаемость кода оставляет желать лучшего.
1. Имена переменных должны быть записаны в смешанном регистре, начиная с нижнего.
Не правильно:
Правильно:PHP код:
new mysql_id;
2. Имена, представляющие типы, должны быть обязательно написаны в смешанном регистре, начиная с верхнего и значения перечислений должны быть записаны в верхнем регистре с нижним подчёркиванием в качестве разделителя.PHP код:
new mysqlHandle;
Не правильно:
Правильно:PHP код:
enum player_info {
ID,
Name[MAX_PLAYER_NAME],
Pass[24],
Language, // 1 - Russian, 2 - English
Sex,
Skin,
};
new pInfo[MAX_PLAYERS][player_info];
Есть еще и другие пункты, но для начала этого будет достаточно.PHP код:
enum E_PLAYER_INFO
{
E_PLAYER_ID,
E_PLAYER_NAME[MAX_PLAYER_NAME],
E_PLAYER_PASS[24],
E_PLAYER_LANGUAGE,
E_PLAYER_SEX,
E_PLAYER_SKIN,
}
new PlayerInfo[MAX_PLAYERS][E_PLAYER_INFO];
Ну это слишком громко сказано :) Нет одного общего стандарта. Стандарты есть лишь у конкретных языков. И от языка к языку они варьируются, исходя из особенностей языков.
Так же, например, есть такая штука, как "Венгерская нотация". А первый твой пункт описан вот тут и там же есть примеры того, как в разных языках используются разные вариации игр с регистром.
Вот в этой теме отобраны адекватные среди наиболее распространённых вариантов оформления кода. И если уж чего-то придерживаться в SA-MP, то приближенного к той теме.
Связаться со мной в VK можно через личные сообщения этой группы
Заказы не принимаю
Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
Великих идей полно, на них нет спроса.
Воплощение идеи в законченную игру требует долгой работы,
таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
Предложить идею просто, воплотить – вот в чём проблема
Steve Pavlina
Snegovik1337 (13.02.2018)
Касаемо просьбы автора.
Первое, что бросилось в глаза - ошибки с вещественными аргументами (указание целых чисел там, где должно быть вещественное число)
Это создаёт лишние вызовы функции floatPHP код:
SetPlayerPos(playerid, 0, 0, 5);
А вот такие конструкции
можно реализовать такPHP код:
if(!strlen(inputtext) || strlen(inputtext) > 24) return Show_Register(playerid);
strmid(pInfo[playerid][Pass], inputtext, 0, 64, 255);
Или же так:PHP код:
if(!(0 <= strlen(inputtext) <= 24)) return Show_Register(playerid);
strmid(pInfo[playerid][Pass], inputtext, 0, 64, 255);
Тем самым не заставляя сервер обращаться к одной и той же нативке для получения одной и той же информации.PHP код:
new len = strlen(inputtext);
if(!len || len > 24) return Show_Register(playerid);
strmid(pInfo[playerid][Pass], inputtext, 0, 64, 255);
Вот эту конструкцию
Вполне можно заменить на такую строку:PHP код:
switch(listitem) {
case 0: pInfo[playerid][Language] = 1;
case 1: pInfo[playerid][Language] = 2;
}
PHP код:
pInfo[playerid][Language] = listitem+1;
Ну и вот, например, тут
ты объявляешь массив "new query[44+24];" до проверок, которые никак не связаны с этим массивом. То бишь, если игрок, например, не ввёл ничего в диалоговое окно и условие " if(!strlen(inputtext)" сработало, прервав дальнейшую обработку кода, этот массив всё равно будет инициализирован, на что потратится время. Достаточно переместить его за проверку и такого уже не будет (а в твоём случае его вообще стоит перенести в конкретное условие, в котором используется массив)PHP код:
case D_LOGIN: {
if(!response) return Kick(playerid);
new query[44+24];
if(!strlen(inputtext) || strlen(inputtext) > 24) return Show_Login(playerid);
if(!strcmp(pInfo[playerid][Pass], inputtext)) {
mysql_format(mysql_id, query, sizeof(query), "SELECT * FROM `accounts` WHERE `Pass`='%s'", inputtext);
mysql_function_query(mysql_id, query, true, "@_LoadAccount", "i", playerid);
} else {
SetPVarInt(playerid, "WrongPass", GetPVarInt(playerid, "WrongPass")+1);
SCM(playerid, -1, "You have entered the wrong password many times, so they were kicked.");
Show_Login(playerid);
if(GetPVarInt(playerid, "WrongPass") >= 3) return Kick(playerid);
}
return true;
}
PHP код:
case D_LOGIN: {
if(!response) return Kick(playerid);
if(!strlen(inputtext) || strlen(inputtext) > 24) return Show_Login(playerid);
if(!strcmp(pInfo[playerid][Pass], inputtext)) {
new query[44+24];
mysql_format(mysql_id, query, sizeof(query), "SELECT * FROM `accounts` WHERE `Pass`='%s'", inputtext);
mysql_function_query(mysql_id, query, true, "@_LoadAccount", "i", playerid);
} else {
SetPVarInt(playerid, "WrongPass", GetPVarInt(playerid, "WrongPass")+1);
SCM(playerid, -1, "You have entered the wrong password many times, so they were kicked.");
Show_Login(playerid);
if(GetPVarInt(playerid, "WrongPass") >= 3) return Kick(playerid);
}
return true;
}
Пока всё
Связаться со мной в VK можно через личные сообщения этой группы
Заказы не принимаю
Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
Великих идей полно, на них нет спроса.
Воплощение идеи в законченную игру требует долгой работы,
таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
Предложить идею просто, воплотить – вот в чём проблема
Steve Pavlina
Связаться со мной в VK можно через личные сообщения этой группы
Заказы не принимаю
Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
Великих идей полно, на них нет спроса.
Воплощение идеи в законченную игру требует долгой работы,
таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
Предложить идею просто, воплотить – вот в чём проблема
Steve Pavlina
Sarah (13.02.2018)
Вызывать регистрацию в OnPlayerConnect, не самый лучший вариант, версия 0.3DL даст о себе знать
- - - Добавлено - - -
Это
НаPHP код:
case D_REG_SEX: {
if(!response) return Kick(playerid);
new rand;
switch(listitem) {
case 0: {
pInfo[playerid][Sex] = 1;
rand = random(sizeof(Random_Skin_Male));
pInfo[playerid][Skin] = Random_Skin_Male[rand];
}
case 1: {
pInfo[playerid][Sex] = 2;
rand = random(sizeof(Random_Skin_Female));
pInfo[playerid][Skin] = Random_Skin_Female[rand];
}
}
CreateNewAccount(playerid);
return true;
}
PHP код:
case D_REG_SEX: {
if(!response) return Kick(playerid);
pInfo[playerid][Sex] = listitem + 1;
pInfo[playerid][Skin] = (listitem == 0)?
(Random_Skin_Male[random(sizeof(Random_Skin_Male))]):(Random_Skin_Female[random(sizeof(Random_Skin_Female))]);
CreateNewAccount(playerid);
return true;
}
Sarah (13.02.2018)
Эту тему просматривают: 3 (пользователей: 0 , гостей: 3)