Оценка работы (обсуждения и критика)

Сообщения
263
Реакции
335
Помог
4 раз(а)
Ситуация в следующем. Надоело мне просить кого-то и вечно ждать готового решения, вот и понял что пора мне чутка проникнуться в тему скриптинга. Свои знания оцениваю на уровне табуретки) Но по тихой просматриваю чужие коды и работы, пытаюсь понять логику действий и т.п.
Спустя время понял, что бы понять лучше, нужно чё-то писать, а т.к. опыта совсем нет, то писать нужно минимально простое для начала. Вот и написал всеми знакомый плагин ResetScore, коих в инете уже вагон и тележка. Прошу высказываться максимально придирчиво, что бы вот прям во все ворота вылюбить этот плагин. Ибо только так пойму чё да как. И желательно с практическими и развёрнутыми примерами (ибо теорию я никогда не понимал, а если с практикой вместе, то да, что-то понимаю :crazy: )

PHP:
#include <amxmodx>
#include <reapi>

#define PREFIX_INFO "^1[^4SCORE^1]" // Префикс сообщений

#define CHECK_DIFF // Проверка на счёт (Если убийств > чем смертей, то счёт не сбросится)
#define TEXT_INFO // Сообщение о успешном сбросе счёта
#define SOUND_INFO // Звуковое оповещение о успешном сбросе счёта

new g_Round_counter[33]

public plugin_init()
{
register_plugin("RS", "0.1", "dev-cs.ru")

register_event("HLTV", "RoundStart", "a", "1=0", "2=0")
register_event("TextMsg", "Event_NewGame", "a", "2=#Game_will_restart_in", "2=#Game_Commencing")

register_clcmd("say /rs", "resetscore")
register_clcmd("say_team /rs", "resetscore")
}

public Event_NewGame()
{
arrayset(g_Round_counter, 0, 33)
}

public RoundStart()
{
arrayset(g_Round_counter, 0, 33)
}

public client_connect(iPlayerId)
{
g_Round_counter[iPlayerId]=0
}

public resetscore(iPlayerId)
{
if(is_user_connected(iPlayerId))

if(g_Round_counter[iPlayerId]!=0)
{
client_print_color(iPlayerId, print_chat, "%s Доступно только 1 раз в раунд!", PREFIX_INFO)
return PLUGIN_HANDLED
}

new deaths; deaths = get_user_deaths(iPlayerId)
new frags; frags = get_user_frags(iPlayerId)

#if defined CHECK_DIFF
if(is_user_alive(iPlayerId) && frags<=deaths)
#else
if(is_user_alive(iPlayerId))
#endif
{
set_entvar(iPlayerId, var_frags, 0.0)
set_member(iPlayerId, m_iDeaths, 0)

message_begin(MSG_ALL, 85)
write_byte(iPlayerId)
write_short(0)
write_short(0)
write_short(0)
write_short(0)
message_end()

#if defined TEXT_INFO
client_print_color(iPlayerId, print_chat, "%s Ваш счёт успешно сброшен", PREFIX_INFO)
#endif

#if defined SOUND_INFO
client_cmd(iPlayerId, "spk fvox/blip.wav")
#endif
g_Round_counter[iPlayerId]++
}
#if defined CHECK_DIFF
else if(is_user_alive(iPlayerId) && frags>deaths)
{
client_print_color(iPlayerId, print_chat, "%s Доступно только когда смертей больше чем фрагов.", PREFIX_INFO)
}
#endif
return PLUGIN_HANDLED
}
 

Вложения

  • 2.2 KB Просмотры: 19
Сообщения
2,751
Реакции
3,016
Помог
61 раз(а)
1) полегче с авторством :crazy:
2) венгерской нотацией не стоит пренебрегать в Pawn. Лишаешься удобства.
3) получаешь ты фраги и смерти с помощью стандартных средств amxx, выставляешь с помощью натив reapi. :dntknw:

Естественно, в данном случае, как и Phantom ,ты использовал реапи, не сэкономив на спичках. То есть, тебе пришлось в ручную менять "свойства" игрока и сообщать клиентскому HUD, о том, что они были изменены.
Не легче ли использовать готовые решения, например от cstrike нативы.
5) почитай про стили кода и выбери тебе "удобный". Было дело, я получал от скриптеров за "сочетание" рамках одного плагина.

К примеру, пробелы, открывающие фигурные скобки и прочее. Как ни как не опытного скриптера выдает и этика написания.
 
Сообщения
263
Реакции
335
Помог
4 раз(а)
wopox1337,
1. Ну в голову ничего не пришло другого в тот момент))
2. Учтём
3. Брал кусок кода от Subb98 тут. Как сам думаю, смысла нет никакого использовать здесь ReAPI, но когда начал ковырять, в шапке уже был инклуд reapi, вот и продолжил на нём :-)
4. Ты пропустил пункт №4
5. Понято :thank_you:
6 Июл 2017
wopox1337,
SonG, да, близко. Но ты просто поставил флаг. А если это будет админ и права он получит раньше чем будет вызов client_putinserver?
Что бы добавить флаг к имеющимся тебе нужно получить имеющиеся флаги игрока и установить + флаг t.
Получить тебе поможет: get_user_flags · amxmodx · AMX Mod X Scripting API Reference

Как юзать - примеров много в каждой випменюшке.
Опять мимо?)

Код:
#include <amxmodx>

#define NEW_FLAG (ADMIN_LEVEL_H|ADMIN_LEVEL_G)

new DefFlag

public plugin_init()
{
register_plugin("Steam Bonus Flag", "0.2", "SonG")
}

public plugin_cfg()
{
if (get_cvar_pointer("amx_default_access"))
{
new flag[32]
get_pcvar_string(get_cvar_pointer("amx_default_access"), flag, charsmax(flag))
DefFlag = read_flags(flag)
}
}

public client_putinserver(id)
{
if(is_user_steam(id) && (get_user_flags(id) & NEW_FLAG) != NEW_FLAG)
{
if (DefFlag)
{
remove_user_flags(id, DefFlag)
set_user_flags(id, NEW_FLAG)
}
}
}

stock bool:is_user_steam(id)
{
static dp_pointer
if(dp_pointer || (dp_pointer = get_cvar_pointer("dp_r_id_provider")))
{
server_cmd("dp_clientinfo %d", id)
server_exec()
return (get_pcvar_num(dp_pointer) == 2) ? true : false
}
return false
}
 

d3m37r4

111111
Сообщения
1,454
Реакции
1,194
Помог
10 раз(а)
А звуковое сообщение: client_cmd(iPlayerId, "spk fvox/blip.wav")
, через rg_send_audio не получится воспроизвести, если уж инклуд reapi задействован?
 
Сообщения
2,751
Реакции
3,016
Помог
61 раз(а)
SonG, да,так лучше. Но меня все же смущает способ установки прав. Нужны тесты
 
Сообщения
263
Реакции
335
Помог
4 раз(а)
wopox1337, По поводу /rs, дошли ли до меня твои слова?)
PHP:
#include <amxmodx>
#include <cstrike>
#include <fun>

#define PREFIX_INFO "^1[^4SCORE^1]" // Префикс сообщений

#define CHECK_DIFF // Проверка на счёт (Если убийств > чем смертей, то счёт не сбросится)
#define TEXT_INFO // Сообщение о успешном сбросе счёта
#define SOUND_INFO // Звуковое оповещение о успешном сбросе счёта

new Round_counter[33]

public plugin_init()
{
register_plugin("RS", "0.2", "SonG")

register_event("HLTV", "RoundStart", "a", "1=0", "2=0")
register_event("TextMsg", "Event_NewGame", "a", "2=#Game_will_restart_in", "2=#Game_Commencing")

register_clcmd("say /rs", "resetscore")
register_clcmd("say_team /rs", "resetscore")
}

public Event_NewGame()
{
arrayset(Round_counter, 0, 33)
}

public RoundStart()
{
arrayset(Round_counter, 0, 33)
}

public client_connect(id)
{
Round_counter[id]=0
}

public resetscore(id)
{
if(is_user_connected(id))

if(Round_counter[id]!=0)
{
client_print_color(id, print_chat, "%s Доступно только 1 раз в раунд!", PREFIX_INFO)

#if defined SOUND_INFO
client_cmd(id, "spk fvox/fuzz.wav")
#endif

return PLUGIN_HANDLED
}

new deaths; deaths = get_user_deaths(id)
new frags; frags = get_user_frags(id)

#if defined CHECK_DIFF
if(is_user_alive(id) && frags<=deaths)
#else
if(is_user_alive(id))
#endif
{
set_user_frags(id,0)
cs_set_user_deaths(id,0)

#if defined TEXT_INFO
client_print_color(id, print_chat, "%s Ваш счёт успешно сброшен", PREFIX_INFO)
#endif

#if defined SOUND_INFO
client_cmd(id, "spk fvox/blip.wav")
#endif

Round_counter[id]++
}
#if defined CHECK_DIFF
else if(is_user_alive(id) && frags>deaths)
{
client_print_color(id, print_chat, "%s Доступно только когда смертей больше чем фрагов.", PREFIX_INFO)
#if defined SOUND_INFO
client_cmd(id, "spk fvox/fuzz.wav")
#endif
}
#endif

return PLUGIN_HANDLED
}
 
Сообщения
333
Реакции
290
Помог
9 раз(а)
Код:
if(is_user_connected(id))

Шансы, что не присоединившийся игрок напишет в чат "rs" - невелики.. Если хочется и это исключить- тогда прерывай функцию для "non_connected"- нечего дальше проверять, т.к. эта проверка действует только на блок:
Код:
if(Round_counter[id]!=0)
{
client_print_color(id, print_chat, "%s Доступно только 1 раз в раунд!", PREFIX_INFO)

#if defined SOUND_INFO
client_cmd(id, "spk fvox/fuzz.wav")
#endif

return PLUGIN_HANDLED
}
Код:
if(is_user_alive(id))

Что за дискриминация "мертвых"? Удобнее сбросить счет, когда тебя убили
Код:
#if defined CHECK_DIFF

Скомпоновать бы в одном месте, по возможности. Все таки, в одной функции
Код:
client_print_color(id, print_chat

print_chat - Destination types for client_print()
Для client_print_color (хотя, и так будет работать :))
Код:
enum 
{
print_team_default = 0,
print_team_grey = -1,
print_team_red = -2,
print_team_blue = -3
};
Код:
#if defined SOUND_INFO
client_cmd(id, "spk fvox/fuzz.wav")
#endif

Если используется несколько раз в одной функции, я бы "за скобки" вынес (для экономии бумаги)
 
Сообщения
263
Реакции
335
Помог
4 раз(а)
Если хочется и это исключить- тогда прерывай функцию для "non_connected"- нечего дальше проверять, т.к. эта проверка действует только на блок:
В if(is_user_connected(id)) я вообще запутался) В чате ТГ Subb98, voed и wopox1337 сток всего понаписали, что голова пошла кругом и я пошел кофе пить)

Что за дискриминация "мертвых"? Удобнее сбросить счет, когда тебя убили
Ну этот плагин делал не для массы, а для тестов. Запихнул проверку просто для получения опыта работы с ней.

Скомпоновать бы в одном
Попробую в след. раз сделать, спс.

я бы "за скобки" вынес
Прошу прощения, но в силу не грамотности, не очень понял за какие именно скобки) Если не сложно, можно пример?
 
Сообщения
258
Реакции
262
Помог
5 раз(а)
Вот некоторые рекомендации:

Код:
/*
рекомендация: используйте директиву semicolon со значением 1 (#pragma semicolon 1)
это приучит вас ставить в конце выражения символ завершения строки, ';' (точку с зяпятой)
такая практика является частью синтаксиса во многих других ЯП, но не является обязательной в Pawn
*/
#pragma semicolon 1

/*
#define PREFIX_INFO "^1[^4SCORE^1]" // Префикс сообщений

для объявления строк используйте связку операторов new const, например:

new const PREFIX_INFO[] = "^1[^4SCORE^1]"; // Префикс сообщений

это позволит избежать дублирования строк в .DATA (спасибо PRoSToTeM@ за информацию)
prooflink: http://amx-x.ru/viewtopic.php?p=184379#p184379
*/
new const PREFIX_INFO[] = "^1[^4SCORE^1]"; // Префикс сообщений

/*
я думаю, такие проверки излишни:

во-первых, не стоит запрещать игроку сбрасывать счёт, если он этого хочет
во-вторых, вы всё равно не сможете определить таким способом, случайно игрок нажал

забинденую клавишу или намеренно выполнил эту команду; тогда уж делайте меню подтверждения (но лучше не надо)
*/
#define CHECK_DIFF // Проверка на счёт (если убийств > чем смертей, то счёт не сбросится)

/*
существуют константы, которые определяют макс. кол-во игроков на сервере. эти константы объявлены
как в cssdk_const.inc (инклуд Reapi), так и в amxconst.inc (инклуд AMX Mod X); так как вы не делаете
возможность компилирования без Reapi, то логично было бы избавиться от "магического числа" 33 и использовать
константу MAX_CLIENTS:

new g_Round_counter[MAX_CLIENTS + 1];
*/
new g_Round_counter[MAX_CLIENTS + 1];

/*
обработчики функций желательно называть таким образом, чтобы было абсолютно очевидно, при каком
событии они вызываются; например,

если это register_event("HLTV", то "EventHLTV",
если это register_event("TextMsg", который в данном случае отлавливает рестарт, то "EventRestartRound"

предвижу вопрос: почему же тогда первый "EventHLTV", а не "EventRoundStart"?
отвечаю: потому, что этот event вызывается в момент начала freezetime и не является началом раунда

начало раунда регистрируется так: register_logevent("EventRoundStart", 2, "1=Round_Start");
*/
register_event("HLTV", "EventHLTV", "a", "1=0", "2=0");
register_event("TextMsg", "EventRestartRound", "a", "2=#Game_will_restart_in", "2=#Game_Commencing");

/*
снова "магические числа"; вместо них используйте операторы sizeof / charsmax:
arrayset(g_Round_counter, 0, sizeof g_Round_counter);
*/
arrayset(g_Round_counter, 0, sizeof g_Round_counter);


Дальше мне уже откровенно лень. Стилистику кода я не критикую, в этом нет смысла: она у вас ещё не раз и не два поменяется, пока вы будете практиковаться. А так, для первого раза, вполне неплохо.
 
Последнее редактирование:

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу