Всем привет
Написал небольшой мод, хотел бы спросить у вас, неплоха ли оптимизация и читабелен ли код?
Pastebin - Клик
P.S. Спасибо DeimoS )
Вид для печати
Всем привет
Написал небольшой мод, хотел бы спросить у вас, неплоха ли оптимизация и читабелен ли код?
Pastebin - Клик
P.S. Спасибо DeimoS )
Не в том месте пытаешься искать, что оптимизировать. Оптимизируй алгоритмы, ищи слабые места в моде с помощью профайлера
Код не соответствует мировым стандартам, читаемость кода оставляет желать лучшего.
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, то приближенного к той теме.
Касаемо просьбы автора.
Первое, что бросилось в глаза - ошибки с вещественными аргументами (указание целых чисел там, где должно быть вещественное число)
Это создаёт лишние вызовы функции floatЦитата:
PHP код:
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;
}
Пока всё
Вызывать регистрацию в 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;
}