vip для мода hns

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
372
Реакции
47
Помог
6 раз(а)
Всем привет. Решил написать плагин vip для хнс мода. Вот код:
Код:
#include <amxmodx>
#include <cstrike>
#include <hamsandwich>
#include <reapi>

#define PLUGIN "HNS VIP SYSTEM"
#define VERSION "0.1"
#define AUTHOR "DEVV"

#define ACCESS_FLAG        ADMIN_LEVEL_H


new g_lastGrenadeRound[33];
new g_lastRespawnRound[33];
new g_lastWeaponRound[33];
new g_lastMoneyRound[33];
new g_currentRound = 0;

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR)
    register_clcmd("say /vm", "vipmenu")
    register_clcmd("say /vipmenu", "vipmenu")

    register_event("HLTV", "Event_RoundStart", "f_RoundStart")

    for (new i = 0; i <= 32; i++) {
        g_lastGrenadeRound[i] = -2;
        g_lastRespawnRound[i] = -2;
        g_lastWeaponRound[i] = -2;
        g_lastMoneyRound[i] = -2;
    }
}

public vipmenu(id)
{
    if(!(get_user_flags(id) & ACCESS_FLAG)) {
        client_print_color(id, print_team_default, "^4* ^3Это меню доступно только для игроков VIP!")
        return
    }
    
    new szMenu[255]
    formatex(szMenu, sizeof(szMenu), "\rVIP MENU")
    new menu = menu_create(szMenu, "vip_menu")

    if(cs_get_user_team(id) == 1) {
      formatex(szMenu, charsmax(szMenu), "Получить гранату \rHE \w[\r1 раз за 2 раунда\w]", id)
      menu_additem(menu, szMenu, "1", 0)
    }

    else if(cs_get_user_team(id) == 2) {
      formatex(szMenu, charsmax(szMenu), "Получить дымовую \rгранату \w[\r1 раз 2 за раунда\w]", id)
      menu_additem(menu, szMenu, "1", 0)
    }

    formatex(szMenu, charsmax(szMenu), "Получить возрождение \w[\r1 раз за 2 раунда\w]", id)
    menu_additem(menu, szMenu, "2", 0)

    if(cs_get_user_team(id) == 1) {
      formatex(szMenu, charsmax(szMenu), "Получить \rDEAGE \w[\r1 раз за 2 раунда\w]", id)
      menu_additem(menu, szMenu, "3", 0)
    }

    else if(cs_get_user_team(id) == 2) {
      formatex(szMenu, charsmax(szMenu), "Получить \rUSP \w[\r1 раз за 2 раунда\w]", id)
      menu_additem(menu, szMenu, "3", 0)
    }

    formatex(szMenu, charsmax(szMenu), "Получить \r6000$ \w[\r1 раз за 2 раунда\w]", id)
    menu_additem(menu, szMenu, "4", 0) 

    menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
    menu_display(id, menu, 0)

    menu_display(id, menu)
}

public f_RoundStart() {
    g_currentRound++;
}

public vip_menu(id, menu, item)
{
    if(item == MENU_EXIT) {
        return PLUGIN_HANDLED
    }

    switch(item)
    {
        case 0: {
            new currentRound = g_currentRound

            if (currentRound - g_lastGrenadeRound[id] < 2) {
            client_print_color(id, print_team_default, "^4* Вы можете получить ^3гранату ^4только^3 1 ^4раз за^3 2 ^4раунда!");
            return;
        }

        if(cs_get_user_team(id) == 1) {
            rg_give_item(id, "weapon_hegrenade");
            client_print_color(id, print_team_default, "^4* Вы получили ^3Взрывную гранату!");
            g_lastGrenadeRound[id] = currentRound;
        } else if(cs_get_user_team(id) == 2) {
            rg_give_item(id, "weapon_smokegrenade");
            client_print_color(id, print_team_default, "^4* Вы получили ^3Вдымовую гранату!");
            g_lastGrenadeRound[id] = currentRound;
            } 
        }
        case 1: {
            new currentRound = g_currentRound

            if (currentRound - g_lastRespawnRound[id] < 2) {
                client_print_color(id, print_team_default, "^4* Вы можете ^3возродиться ^4только^3 1 ^4раз за^3 2 ^4раунда!");
                return;
            }

            if(!is_user_alive(id)) {
                ExecuteHam(Ham_CS_RoundRespawn, id)
                client_print_color(id, print_team_default, "^4* Вы использовали ^3возрождения!")
                g_lastRespawnRound[id] = currentRound;
            } else{
                client_print_color(id, print_team_default, "^4* Вы живы! ^3Доступно мёртвым!")
            }
        }
        case 2: {
            new currentRound = g_currentRound

            if (currentRound - g_lastWeaponRound[id] < 2) {
                client_print_color(id, print_team_default, "^4* Вы можете ^3получить ствол ^4только^3 1 ^4раз за^3 2 ^4раунда!");
                return;
            }


            if(cs_get_user_team(id) == 1) {
                rg_drop_item(id, "weapon_deagle")
                new weapon = rg_give_item(id, "weapon_deagle")
                cs_set_weapon_ammo(weapon, 2)
                cs_set_user_bpammo(id, CSW_DEAGLE, 0)
                client_print_color(id, print_team_default, "^4* Вы получили ^3DEAGLE^4 с^3 2 ^4патронами!")
                g_lastWeaponRound[id] = currentRound;
            } else if(cs_get_user_team(id) == 2) {
                new weapon = rg_give_item(id, "weapon_usp")
                cs_set_weapon_ammo(weapon, 2)
                cs_set_user_bpammo(id, CSW_USP, 0)
                client_print_color(id, print_team_default, "^4* Вы получили ^3USP^4 с^3 2 ^4патронами!")
                g_lastWeaponRound[id] = currentRound;
            }
        }
        case 3: {
            new currentRound = g_currentRound

            if (currentRound - g_lastMoneyRound[id] < 2) {
                client_print_color(id, print_team_default, "^4* Вы можете ^3получить ствол ^4только^3 1 ^4раз за^3 2 ^4раунда!");
                return;
            }

            new currentMoney = cs_get_user_money(id)
            new newMoney = currentMoney + 6000
            cs_set_user_money(id, newMoney)
            client_print_color(id, print_team_default, "^4* Вы получили^3 6000$!");
            g_lastMoneyRound[id] = currentRound;
            return;
        }   
    }

    return;
}
Плагин компилировался с 1000 предупреждениями. Есть одна проблема, почему-то я не могу пользоваться ни одной функцией из меню. Пишет типа не раунд. Можете помочь?
 
Сообщения
3,582
Реакции
1,570
Помог
137 раз(а)
Потому что у тебя выставлено на -2
 
Сообщения
3,582
Реакции
1,570
Помог
137 раз(а)
DEVV, понятно, а при старте карты зачем -2 задавать?
 
Сообщения
372
Реакции
47
Помог
6 раз(а)
Nordic Warrior, из-за того что я в amxx вообще не разбираюсь, я какую-то часть кода взял у других плагинов, а другую чатгпт написал) но вроде

public f_RoundStart() {
g_currentRound++;
}

есть же
 
Сообщения
458
Реакции
263
Помог
9 раз(а)
DEVV,
Попробуй такое. Если есть какие-то недочеты и ошибки - помогу исправить, необходимые предметы добавляй самостоятельно

Код:
#include <amxmodx>
#include <reapi>

enum ItemsDataStruct {
  Item_Grenade
}

new const GrenadesDataTeam[TeamName][] = {
  "",
  "weapon_hegrenade", //TEAM_TERRORIST
  "weapon_smokegrenade", //TEAM_CT
  ""
}

const RESTRICT_ROUNDS = 2
const VIP_ACCESS_FLAG = ADMIN_LEVEL_H

new g_playerItemsData[MAX_PLAYERS + 1][ItemsDataStruct]

public plugin_init() {
  register_plugin("Vip", "1.0.0", "ufame")

  register_clcmd("say /vm", "ClientCommand_VipMenu")
  register_clcmd("say /vipmenu", "ClientCommand_VipMenu")
}

public ClientCommand_VipMenu(const player_id) {
  if (!(get_user_flags(player_id) & VIP_ACCESS_FLAG)) {
    client_print_color(player_id, print_team_default, "^4* ^3Это меню доступно только для игроков VIP!")

    return PLUGIN_HANDLED
  }

  if (!is_valid_team(player_id)) {
    client_print_color(player_id, print_team_default, "^4* ^3Недоступно для спектаторов.")

    return PLUGIN_HANDLED
  }

  new menu_id = menu_create("Vip Menu", "VipMenu_Handle")

  menu_additem(
    menu_id,
    fmt(
      "Get \r%s \wgrenade \d[%d]",
      get_member(player_id, m_iTeam) == TEAM_TERRORIST ? "HE" : "Smoke",
      get_rounds_restrict(player_id, Item_Grenade)
    )
  )

  menu_setprop(menu_id, MPROP_EXIT, MEXIT_ALL)

  menu_display(player_id, menu_id)

  return PLUGIN_HANDLED
}

public VipMenu_Handle(const player_id, const menu_id, const item_id) {
  if (item_id == MENU_EXIT) {
    menu_destroy(menu_id)

    return
  }

  if (!is_valid_team(player_id)) {
    client_print_color(player_id, print_team_default, "^4* ^3Недоступно для спектаторов.")

    return
  }

  new restrictRounds = get_rounds_restrict(player_id, ItemsDataStruct: item_id)

  if (restrictRounds > 0) {
    client_print_color(player_id, print_team_default, "^4* ^3Нельзя взять еще ^4%d ^1раунд(ов).", restrictRounds)

    menu_destroy(menu_id)
    return
  }

  switch (item_id) {
    case 0: {
      rg_give_item(player_id, GrenadesDataTeam[get_member(player_id, m_iTeam)])
    }
  }

  g_playerItemsData[player_id][ItemsDataStruct: item_id] = RESTRICT_ROUNDS + rg_get_current_round()

  menu_destroy(menu_id)
}

stock rg_get_current_round() {
  return get_member_game(m_iTotalRoundsPlayed) + 1
}

stock get_rounds_restrict(const player_id, const ItemsDataStruct: item_id) {
  return rg_get_current_round() - g_playerItemsData[player_id][item_id]
}

stock bool: is_valid_team(const player_id) {
  return bool: (TEAM_UNASSIGNED < get_member(player_id, m_iTeam) < TEAM_SPECTATOR)
}
 
Последнее редактирование:
  • Нравится
Реакции: DEVV
Сообщения
372
Реакции
47
Помог
6 раз(а)
ufame,
1693583334084.png
каждый раз увеличивается раунд. т.е пишет: * нельзя взять еще 3 раунда в след раунде: * нельзя взять еще 4 раунда
 
Сообщения
458
Реакции
263
Помог
9 раз(а)
DEVV, там в стоке рестрикта надо местами поменять текущий раунд и плеерИтемДата
 
Сообщения
372
Реакции
47
Помог
6 раз(а)
ufame, Спасибо большое. Всё заработало. Следуя примеру доделал плагин
 
Статус
В этой теме нельзя размещать новые ответы.

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

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