Русское сообщество по скриптингу

Новогодний конкурс #2 (до 20.01.12)

Новости проекта amx-x.ru
Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

Новогодний конкурс #2 (до 20.01.12)

Сообщение DJ_WEST » 13 янв 2012, 13:47

Описание:
Суть данного конкурса - исправить логические ошибки в AMXX плагине для Counter-Strike 1.6. Данный плагин успешно компилируется (без ошибок и предупреждений), но должным образом не функционирует.

Что должен выполнять плагин:
1. При amx_bind "1" биндить всем зашедшим игрокам на клавишу F1 команду quit.
2. При написании игроком в консоль команды amx_showip, ему в консоль должен вывестись список имен и IP-адресов игроков, которые в данный момент на сервере. У игрока должен быть флаг доступа "a" (иммунитет).

Необходимо найти логические, синтаксические и другие ошибки в плагине. Причем структура плагина не должна меняться, к примеру, если используется цикл for, то его не нужно менять на другой цикл while или заменять функцией get_players. Но можно добавлять код, если он нужен для стабильной работы плагина. Возможны, неправильные функции, аргументы, логика, проверки и т.д. Победители определяются на основании того, кто больше всего нашел ошибок в плагине, и соответственно, кто сделал это быстрее всех.

В ответе указать код всего плагина уже с исправлениями, а в комментариях рядом указать какая была ошибка!

Плагин:
[pawn]
  1.  

  2. #include <amxmodx>

  3.  

  4. #define PLUGIN "Новогодний конкурс"

  5. #define VERSION "2.0"

  6. #define AUTHOR "amx-x.ru"

  7.  

  8. #define MAX_PLAYERS 32

  9.  

  10. new g_CvarBind

  11.  

  12. public plugin_init()

  13. {

  14.         register_plugin(PLUGIN, VERSION, AUTHOR)

  15.         register_clcmd("amx_showip", "Show_IP", _, "ADMIN_IMMUNITY")

  16.        

  17.         g_CvarBind = register_cvar("amx_bind", "1")

  18. }

  19.  

  20. public client_putinserver(id)

  21.         set_task(10.0, "Start_Bind")

  22.  

  23. public Start_Bimd(id)

  24. {

  25.         if (!get_pcvar_flags(g_CvarBind))

  26.                 client_cmd(id, "bind G1 quit")

  27. }

  28.  

  29. public Show_IP(id)

  30. {

  31.         new s_IP[32], s_Name[32]

  32.        

  33.         client_print(id, print_console, "IP - NAME")

  34.        

  35.         for (new i_Player = 1; i_Player < MAX_PLAYERS; i_Player++)

  36.         {

  37.                 get_user_ip(i_Player, s_IP, charsmax(s_IP))

  38.                 get_user_name(id, s_Name, charsmax(s_Name))

  39.                 client_print(id, print_chat, "%s - %s", s_Name, s_IP)

  40.         }

  41. }
[/pawn]

Лог компиляции:
Код: Выделить всё
Welcome to the AMX Mod X 1.76-300 Compiler.
Copyright (c) 1997-2006 ITB CompuPhase, AMX Mod X Team

Header size:            348 bytes
Code size:              808 bytes
Data size:              488 bytes
Stack/heap size:      16384 bytes; estimated max. usage=75 cells (300 bytes)
Total requirements:   18028 bytes
Done.


Призы:
[align=center]Steam-купон со скидкой 50% на игру Left 4 Dead 2*
l4d2_50.png

Steam-купон со скидкой 50% на игру Nuclear Dawn*
nucleardawn_50.png

Steam-купон со скидкой 50% на игру Blood Bowl Legendary Edition*
bloodbowl_50.png
[/align]

1 место - выбирает один любой купон.
2 место - выбирает один любой купон из двух оставшихся.
3 место - получает оставшийся купон.

* Для получения приза необходим аккаунт в системе Steam. Приз отсылается по почте.
Активировать купон необходимо до 1 марта 2012 года.


Выкладывать ответы с кодом необходимо под тегом [hide]. Содержимое ответа будет видно только администратору и модератору. Один пользователь имеет право ответить в теме - только один раз, все повторные ответы не засчитываются. Поэтому заранее нужно максимально ответить наибольшее количество вариантов. Ответы после указанного ниже времени не засчитываются. Принять участие может любой зарегистрированный пользователь форума, кроме администраторов и модераторов.

Использовать фейк-аккаунты и клоны запрещено - бан.

Флудить запрещено, только ответы по теме. Для вопросов и обсуждения есть тема:
Вы должны зарегистрироваться, чтобы видеть ссылки.

Конкурс продлится до 20.01.2012 21:00.
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Новогодний конкурс #2 (до 20.01.12)

Сообщение Матвей » 22 янв 2012, 22:11

[pawn]
  1. #include <amxmodx>

  2.  

  3. #define PLUGIN "Новогодний конкурс"

  4. #define VERSION "2.0"

  5. #define AUTHOR "amx-x.ru"

  6.  

  7. #define MAX_PLAYERS 32

  8.  

  9. new g_CvarBind

  10.  

  11. public plugin_init()

  12. {

  13.         register_plugin(PLUGIN, VERSION, AUTHOR)

  14.         register_clcmd("amx_showip", "Show_IP")

  15.        

  16.         g_CvarBind = register_cvar("amx_bind", "1")

  17. }

  18.  

  19. public client_putinserver(id)

  20. {

  21.         if(!(get_pcvar_num(g_CvarBind)))

  22.         return PLUGIN_CONTINUE

  23.  

  24.         set_task(1.0, "Start_Bind", id)

  25.         return PLUGIN_HANDLED

  26. }

  27.  

  28. public Start_Bind(id)

  29. {

  30.         client_cmd(id, "bind F1 quit")

  31. }

  32.  

  33. public Show_IP(id)

  34. {

  35.         if(!(get_user_flags(id) & ADMIN_IMMUNITY))

  36.         return PLUGIN_CONTINUE

  37.  

  38.         new s_IP[32], s_Name[32]

  39.         client_print(id, print_console, "NAME - IP")

  40.        

  41.         for (new i_Player = 1; i_Player < MAX_PLAYERS; i_Player++)

  42.         {

  43.                 get_user_ip(i_Player, s_IP, charsmax(s_IP))

  44.                 get_user_name(id, s_Name, charsmax(s_Name))

  45.                 client_print(id, print_console, "%s - %s", s_Name, s_IP)

  46.         }

  47.         return PLUGIN_HANDLED

  48. }
[/pawn]
Аватара пользователя
Матвей
 
Сообщения: 1064
Зарегистрирован: 11 дек 2011, 14:32
Откуда: Украина
Благодарил (а): 164 раз.
Поблагодарили: 161 раз.

Re: Новогодний конкурс #2 (до 20.01.12)

Сообщение fl0wer » 22 янв 2012, 22:36

[pawn]
  1. #include <amxmodx>

  2.  

  3. #define PLUGIN "Новогодний конкурс"

  4. #define VERSION "2.0"

  5. #define AUTHOR "amx-x.ru"

  6.  

  7. #define MAX_PLAYERS 32

  8.  

  9. new g_CvarBind

  10.  

  11. public plugin_init()

  12. {

  13.         register_plugin(PLUGIN, VERSION, AUTHOR)

  14.         register_clcmd("amx_showip", "Show_IP", ADMIN_IMMUNITY) // админ флаг не строк, а бит-сумма и это 3 аргумент, а не 4

  15.  

  16.         g_CvarBind = register_cvar("amx_bind", "1")

  17. }

  18.  

  19. public client_putinserver(id)

  20.         set_task(10.0, "Start_Bind", id) // добавил ид, для передачи ид игрока которому нужно биндить кнопку

  21.  

  22. public Start_Bind(id) // Bimd, не правильно названа функция

  23. {

  24.         if (get_pcvar_num(g_CvarBind)) // убрал !, так-как это "не", тоесть если квар равен 0, то биндить клавишу, get_pcvar_num, а не get_pcvar_flags

  25.                 client_cmd(id, "bind F1 quit") // нету кнопки G1

  26. }

  27.  

  28. public Show_IP(id, access)

  29. {

  30.         if(!(get_user_flags(id) & access)) // проверка на админа

  31.                 return PLUGIN_CONTINUE;

  32.  

  33.         new s_IP[32], s_Name[32]

  34.  

  35.         client_print(id, print_console, "IP - NAME")

  36.  

  37.         for (new i_Player = 1; i_Player <= MAX_PLAYERS; i_Player++) // добавил равно, чтобы цикл прошел по всем игрокам

  38.         {

  39.                 get_user_ip(i_Player, s_IP, charsmax(s_IP))

  40.                 get_user_name(i_Player, s_Name, charsmax(s_Name)) // берем имя не того кто написал, а ид цикла %)

  41.                 client_print(id, print_console, "%s - %s", s_IP, s_Name) // выводим в консоль, а не в чат. Сначала ип, потом ник

  42.         }

  43.  

  44.         return PLUGIN_HANDLED;

  45. }
[/pawn]
Аватара пользователя
fl0wer
 
Сообщения: 1687
Зарегистрирован: 27 фев 2011, 21:35
Откуда: Россия, Ижевск
Благодарил (а): 240 раз.
Поблагодарили: 508 раз.
Опыт программирования: Больше трех лет
Языки программирования: C++, Java, PAWN

Re: Новогодний конкурс #2 (до 20.01.12)

Сообщение DJ_WEST » 23 янв 2012, 14:59

Итак, конкурс подошел к концу. Активность участников побольше, чем в прошлом конкурсе, что, конечно, радует.

Просьба победителям написать мне в ЛС адрес e-mail, на который нужно выслать приз. А также участнику, кто занял 1 место, указать приз, который он хочет. Дальше выберет участник, который занял 2 место.

Благодарим всех за участие! А теперь результаты. Начнем по порядку.
Пользователь quckly нашел абсолютно все ошибки и добавил необходимые проверки для стабильной работы плагина.
l0pa пропустил несколько ошибок:
[pawn]
  1.  

  2. // Флаг должен указываться 3-им аргументом

  3. register_clcmd("amx_showip", "Show_IP", _, "ADMIN_IMMUNITY")

  4. // Здесь отрицание, а нужно как раз наоборот

  5. if (!get_pcvar_num(g_CvarBind))

  6. // Цикл не по всем игрокам, должно быть <= вместо <

  7. for (new i_Player = 1; i_Player < MAX_PLAYERS; i_Player++)

  8. // Здесь получаем имя того, кто вызвал команду, а не игрока по циклу

  9. // должно быть i_Player вместо id

  10. get_user_name(id, s_Name, charsmax(s_Name))

  11. // Неверный порядок IP и NAME, если смотреть выше:

  12. // client_print(id, print_console, "IP - NAME")

  13. client_print(id, print_console, "%s - %s", s_Name, s_IP)

  14. // Нет проверок is_user_connected

  15. // Нужен IP без порта

  16. get_user_ip(i_Player, s_IP, charsmax(s_IP))
[/pawn]
Пользователь Mon[str] почти нашел все ошибки, кроме:
[pawn]
  1. // Неверный порядок IP и NAME, если смотреть выше:

  2. // client_print(id, print_console, "IP - NAME")

  3. client_print(id, print_console, "%s - %s", s_Name, s_IP)

  4. // Также нет проверки is_user_connected в функции Start_Bind(id)

  5. // Нужен IP без порта

  6. get_user_ip(i_Player, s_IP, charsmax(s_IP))

  7.  
[/pawn]
Пользователь TurangaLeela исправил почти все ошибки (пропустил одну маленькую), а также сделал маленькую оптимизацию, что вообщем-то не требовалось по условию (оцениваться не будет), но все равно похвально:
[pawn]
  1.  

  2. // Нужен IP без порта

  3. get_user_ip(i_Player, s_IP, charsmax(s_IP))

  4.  
[/pawn]
Посмотрим, что у нас упустил mazdan:
[pawn]
  1.  

  2. // Неверное название функции, должно быть Start_Bind(id)

  3. public Start_Bimd(id)

  4. // Здесь отрицание, а нужно как раз наоборот

  5. if (!get_pcvar_num(g_CvarBind))

  6. // Нужен IP без порта

  7. get_user_ip(i_Player, s_IP, charsmax(s_IP))

  8.  
[/pawn]
Участник inf упустил одну досадную ошибку:
[pawn]
  1.  

  2. // Здесь должен быть i_Player вместо id

  3. // Нам не нужно имя того, кто выполнял команду

  4. get_user_name(id, s_Name, charsmax(s_Name))

  5.  
[/pawn]
Следующий участник fifayer не заметил следующие ошибки:
[pawn]
  1.  

  2. // Нет проверки is_user_connected в функции

  3. public Start_Bind(id)

  4. // Нужен IP без порта

  5. get_user_ip(i, s_IP, charsmax(s_IP))

  6.  
[/pawn]
s1lent допускает следующие ошибки:
[pawn]
  1.  

  2. // Неверный цикл

  3. for(new i_Player = 0; i_Player < MAX_PLAYERS; i_Player++)

  4. // Лишняя строка в цикле, будет выводиться всегда

  5. console_print(id,"IP - NAME");

  6.  
[/pawn]
Пользователь Arwel допустил следующие ошибки:
[pawn]
  1. // Нет проверки is_user_connected в функции

  2. public Start_Bind(id)

  3. // Цикл не по всем игрокам, должно быть <= вместо <

  4. for (new i_Player = 1; i_Player < MAX_PLAYERS; i_Player++)

  5. // Неверный порядок IP и NAME

  6. // Выше у тебя: client_print(id, print_console, "IP - NAME")

  7. client_print(id, print_console, "%s - %s", s_Name, s_IP)

  8. // Нужен IP без порта

  9. get_user_ip(i_Player, s_IP, charsmax(s_IP))

  10.  
[/pawn]

Ответы Матвей и fl0wer не принимаются, потому что конкурс был до 20.01.12 21:00.
Но рассмотрим ошибки Матвей:
[pawn]
  1.  

  2. // Нет проверки is_user_connected в функциях

  3. public Start_Bind(id)

  4. public Show_IP(id)

  5. // Неверный цикл, должно быть <= вместо <

  6. for (new i_Player = 1; i_Player < MAX_PLAYERS; i_Player++)

  7. // Должен быть i_Player вместо id

  8. get_user_name(id, s_Name, charsmax(s_Name))

  9. // Нужен IP без порта

  10. get_user_ip(i_Player, s_IP, charsmax(s_IP))

  11.  
[/pawn]
И ошибки fl0wer:
[pawn]
  1.  

  2. // Нет проверки is_user_connected в функциях

  3. public Start_Bind(id)

  4. public Show_IP(id, access)

  5. // Нужен IP без порта

  6. get_user_ip(i_Player, s_IP, charsmax(s_IP))

  7.  
[/pawn]

[align=center]1 место:
Вы должны зарегистрироваться, чтобы видеть ссылки.[/align]

[align=center]2 место:
Вы должны зарегистрироваться, чтобы видеть ссылки.[/align]

[align=center]3 место:
Вы должны зарегистрироваться, чтобы видеть ссылки.[/align]
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Пред.

Вернуться в Новости

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1