1. gudaus Команда форума

    Регистрация:
    27.02.15
    Сообщения:
    1.508
    Симпатии:
    1.102
    Пол:
    Мужской
    Плагин SteamBonus писал вчера вечером чисто для своего сервера. Потом решил выложить сюда, мало ли кому понадобится.
    За основу был взят SteamBonus 1.2 by Stimul.
    Выдаёт бонусы в виде брони, денег, гранат, дигла в зависимости от скилла игрока. Сообщает о бонусе игроку, получившему его, в чат. Скилл считается как фраги/смерти. Чем выше скилл, тем меньше бонус и меньше шанс его получить. Если смертей 0, то выдаются деньги в сумме фраги*200. Если фрагов 0 и смертей 0, то ничего не происходит).
    Код простой, под себя подредактировать сможет каждый, не забаненный в гугле.
    С плагинами типа вип конфликтовать по идее не должен.

    Особенности:
    1. Выдача бонуса игрокам STEAM каждый раунд. Ну или почти каждый, он скилла зависит.
    2. Бонус выдаётся случайно из определённого набора бонусов.
    3. Бонус выдаётся в зависимости от скилла игрока. Чем выше скилл, тем меньше бонус и меньше шанс его получить.
    4. Игроку, получившему бонус, выдаётся сообщение в чат.
    5. Минимальная нагрузка на сервер.
    6. Встроенный колорчат.
    1) Качаем исходник.

    2) Строка 89
    PHP:
    1. if(round_number>=3)
    3 - это раунд, с которого будет выдаваться бонус.

    3) Смотрим на функцию public fw_CS_RoundRespawn_Post(id)
    В ней есть блоки типа
    PHP:
    1. else  if (soot == 1)
    2. {
    3. switch(random(5))
    4. {
    5. case 0:
    6. {
    7. cs_set_user_money(id, cs_get_user_money(id) + 1500);
    8. ChatColor(id, "^3%s ^4 1500$", PREFIX);
    9. }
    10. case 1:
    11. {
    12. give_item(id, "weapon_hegrenade");
    13. give_item(id, "weapon_flashbang");
    14. give_item(id, "weapon_flashbang");
    15. ChatColor(id, "^3%s ^4HE + 2FLASH", PREFIX);
    16. }
    17. case 2:
    18. {
    19. cs_set_user_armor(id, 100, CsArmorType:2);
    20. ChatColor(id, "^3%s ^4Броня и Шлем", PREFIX);
    21. }
    22. case 3:
    23. {
    24. get_player_deagle(id);
    25. }
    26. default: return;
    27. }
    28. }
    29.  

    switch(random(5)) загадывает случайное число в диапазоне от 0 до 4.
    case 0: - что произойдёт если выпадет 0, case 1: - если выпадет 1, case 2: - если выпадет 2, case 3: - если выпадет 3. А для 4 своего case нету, поэтому, если выпадет 4, игрок не получит ничего. Именно так реализована вероятность получения бонуса за скилл. Конкретно в этом участке кода вероятность получения 4 из 5. Хотите вероятность 100% - замените switch(random(5)) на switch(random(4)). default: return; нужен, если (random(N) больше, чем число case. То есть если загадывется 5 чисел (switch(random(5))) , а выпадает 4 числа(case 0..case 3), то нужен. Если загадывается 5 чисел и выпадает 5, то можете убрать.
    if (soot == 1) говорит о том, что будет рассматривать игроков, у которых соотношение фрагов к смертям [1;2).
    soot = округлённое в меньшую сторону соотношение фраги/смерти. К примеру, 19/10=1, 10/10=1.
    Всего в коде 4 подобных участка. Каждый участок определяет скилл, после чего - вероятность бонуса и сам бонус.

    cs_set_user_money(id, cs_get_user_money(id) + get_user_frags(id)*200); - если у игрока 0 смертей, то даём ему денег = фраги*200

    Установка и настройка:
    • скачиваем исходник плагина.
    • меняем настройки по своему усмотрению. Как и что менять - описано выше.
    • компилируем.
    • ставим на сервер и привлекаем игроков STEAM.
    de_westwood_big0000.JPG de_westwood_big0001.JPG de_westwood_big0001.JPG
     

    Вложения:

    Последнее редактирование: 07.06.15
    primm, Cloud, Safety1st и 2 другим нравится это.
  2. neygomon Его Темнейшество :j Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    7.543
    Симпатии:
    4.142
    Пол:
    Мужской
    Gudaus,
    PHP:
    1. RegisterHam(Ham_CS_RoundRespawn, "player", "fw_CS_RoundRespawn_Post", true);
    Сразу мимо. Некорректно работает.
    Надо Ham_Spawn
    PHP:
    1. iNum = 0;
    Не надо обнулять.
     
  3. gudaus Команда форума

    Регистрация:
    27.02.15
    Сообщения:
    1.508
    Симпатии:
    1.102
    Пол:
    Мужской
  4. neygomon Его Темнейшество :j Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    7.543
    Симпатии:
    4.142
    Пол:
    Мужской
    Gudaus,
    1. 2 года не обнуляю и нет проблем. при запросе оружия переменная все равно перезаписывается... лишние такты процессора тратишь.
    2. как бы это для спавна игроков функция. ExecuteHam... но не для того, чтобы отлавливать момент спавна.

    ps Делай как хочешь, я сказал что тут не ок. а дальше сам думай.
     
  5. gudaus Команда форума

    Регистрация:
    27.02.15
    Сообщения:
    1.508
    Симпатии:
    1.102
    Пол:
    Мужской
    В любом примере обнуляют, вообще в любом. На оленях, к примеру https://forums.alliedmods.net/showthread.php?t=182970
    Мне кажется это не просто так. Где-то на оленях было ясное и хорошее объяснение причин, лучше, чем вышеприведённое на amx-x, но я потерял ту страницу.

    Можно и Ham_Spawn. Это оба события спавна. Ham_Spawn срабатывает при коннекте и требует проверку на is_user_alive, Ham_CS_RoundRespawn не срабатывает при первом спавне и не требует проверки. Больше отличий не вижу. Ну, для своего сервера) Если нет разминки и нет рестартов, то стоит Ham_Spawn использовать, чтобы не посчитался неверно стартовый раунд для начисления бонусов.
     
    Последнее редактирование: 24.04.15
  6. neygomon Его Темнейшество :j Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    7.543
    Симпатии:
    4.142
    Пол:
    Мужской
    Gudaus, на аленях реальные олени и сидят.
    там нормальных только аркшайн да коннор, и еще xpaw
     
  7. gudaus Команда форума

    Регистрация:
    27.02.15
    Сообщения:
    1.508
    Симпатии:
    1.102
    Пол:
    Мужской
    neygomon, ну дык... ёлы-палы, они же нон-стим не признают, вот и привет) Оттуда в своё время ушло много несогласных. Вырвиглазного кода там полно, это да.
    Насчёт Ham_Spawn соглашусь, мне-то пофигу что заюзать, а вот другим - нет.
     
  8. neygomon Его Темнейшество :j Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    7.543
    Симпатии:
    4.142
    Пол:
    Мужской
    Gudaus, с RoundRespawn можно говна хапнуть(если хукать его) на гг и ксдм серверах. и на зм
     
    gudaus нравится это.
  9. gudaus Команда форума

    Регистрация:
    27.02.15
    Сообщения:
    1.508
    Симпатии:
    1.102
    Пол:
    Мужской
    Блин, я не могу редачить 1 пост(
    Короче, заменил Ham_CS_RoundRespawn на Ham_Spawn, поправил ещё 1 мелочь.
     

    Вложения:

    • steam_bonus.sma
      Размер файла:
      9,6 КБ
      Просмотров:
      8
    LeninChan^^ нравится это.
  10. neygomon Его Темнейшество :j Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    7.543
    Симпатии:
    4.142
    Пол:
    Мужской
    Gudaus, обновил в первом посте.
    Есть 4 затыка =)
    1. get_bit(g_bIsConnected, id) не нужен с is_user_alive(id)
    2. get_user_deaths(id) и get_user_frags(id) сохрани переменные и потом работай с ними, не дрочи ты снова нативы
    3. switch(random(8)), а самый большой кейс 3... то есть если выпадет 4-8, то просто получим ошибку.
    4. можно словить краш, дада. маловероятно, но можно.
    PHP:
    1. if(id)
    2. {
    3.     players[0] = id;
    4.     pnum = 1;
    5. }
    --->
    PHP:
    1. if(id)
    2. {
    3.     if(!is_user_connected(id)) return 1;
    4.     players[0] = id;
    5.     pnum = 1;
    6. }
     
  11. gudaus Команда форума

    Регистрация:
    27.02.15
    Сообщения:
    1.508
    Симпатии:
    1.102
    Пол:
    Мужской
    3. switch(random(8)), а самый большой кейс 3... то есть если выпадет 4-8, то просто получим ошибку.
    Так и задумано) Ошибку на самом деле не получим, просто ничего не произойдёт.
     
  12. neygomon Его Темнейшество :j Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    7.543
    Симпатии:
    4.142
    Пол:
    Мужской
    Gudaus, может и не получим, но не надо говнокодить... иначе больше не буду одобрять такие плагины :)
    там надо то добавить
    PHP:
    1. default: return;
    --- добавлено 24.04.15 ---
    и вообще, если надо лишить бонуса, введи бит или булевую и там уже ограничивай выдачу.
    зачем так извращаться? О_О
     
  13. gudaus Команда форума

    Регистрация:
    27.02.15
    Сообщения:
    1.508
    Симпатии:
    1.102
    Пол:
    Мужской
    Так?
    Меня никто кодить не учил, кроме гугла, не серчай.
     

    Вложения:

    • steam_bonus.sma
      Размер файла:
      9,7 КБ
      Просмотров:
      2
  14. gudaus Команда форума

    Регистрация:
    27.02.15
    Сообщения:
    1.508
    Симпатии:
    1.102
    Пол:
    Мужской
    ой, вернее так)
     

    Вложения:

    • steam_bonus.sma
      Размер файла:
      9,6 КБ
      Просмотров:
      3
  15. neygomon Его Темнейшество :j Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    7.543
    Симпатии:
    4.142
    Пол:
    Мужской
    Gudaus,
    new deaths = get_user_deaths(id);
    new frags = get_user_frags(id);

    переменные регай после проверки на стим и алив
     
  16. gudaus Команда форума

    Регистрация:
    27.02.15
    Сообщения:
    1.508
    Симпатии:
    1.102
    Пол:
    Мужской
    Блин...точно, у меня же они считаются для всех подряд.
     

    Вложения:

    • steam_bonus.sma
      Размер файла:
      9,9 КБ
      Просмотров:
      3
  17. neygomon Его Темнейшество :j Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    7.543
    Симпатии:
    4.142
    Пол:
    Мужской
    Условие:
    PHP:
    1. else  if (soot>=1 && soot<2)
    замени на
    PHP:
    1. else  if (soot == 1)
    Потому что другого варианта не будет, когда условие выполнится :D

    эт не критично, но прост так красивше)
    PHP:
    1. else  if (soot>=2 && soot<=3)
    -->
    PHP:
    1. else  if (2 => soot <= 3)
     
  18. gudaus Команда форума

    Регистрация:
    27.02.15
    Сообщения:
    1.508
    Симпатии:
    1.102
    Пол:
    Мужской
    компилятор 1.8.2 не сожрал. Можно
    И я так понял, что
    =
    Раз при целочисленном делении отбрасывается дробная часть?
     

    Вложения:

    • steam_bonus.sma
      Размер файла:
      9,9 КБ
      Просмотров:
      8
  19. neygomon Его Темнейшество :j Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    7.543
    Симпатии:
    4.142
    Пол:
    Мужской
    если у тебя переменная нигде не принимает отрицательных значений то:
    if (soot<1) или if (soot==0) или if (!soot) это все одно и то же)
     
    gudaus нравится это.
  20. gudaus Команда форума

    Регистрация:
    27.02.15
    Сообщения:
    1.508
    Симпатии:
    1.102
    Пол:
    Мужской
    Ясно-понятно)
    При самоубийстве фраг отнимается, теоретически может быть -1/1 = -1 отрицательной величиной. soot<1.