Добро пожаловать в наше сообщество TopForo.ru

Станьте частью чего-то великого, присоединяйтесь сегодня!

  • Автоматическая публикация тем

    Автоматическая публикация тем

    Новые темы в данном разделе создаются автоматически при загрузке файла в Менеджер ресурсов.

    Ручное создание тем недоступно.

    Безопасность вложений

    Все загружаемые файлы проходят обязательную проверку на наличие вредоносного кода с использованием VirusTotal — надежного инструмента для обеспечения безопасности.

Инструкция Делаем плагины для cs1.6

  • Автор темы
Последнее редактирование:
Уроки по созданию плагинов для cs1.6.

ВАЖНО!!!
Уроки для тех, кто имеет базовые знания в области программирования. Pawn похож по синтаксису на Си.
Чтобы проще въехать, прочитайте, пожалуйста, следующие статьи:
1)
Скрытое содержимое могут видеть только пользователи групп(ы): Группа «Пользователь»
(переменные)
2)
Скрытое содержимое могут видеть только пользователи групп(ы): Группа «Пользователь»
(типы данных)
3)
Скрытое содержимое могут видеть только пользователи групп(ы): Группа «Пользователь»
(константы)
4)
Скрытое содержимое могут видеть только пользователи групп(ы): Группа «Пользователь»
(арифметические операции)
5)
Скрытое содержимое могут видеть только пользователи групп(ы): Группа «Пользователь»
(почти одна тема, условия)
6)
Скрытое содержимое могут видеть только пользователи групп(ы): Группа «Пользователь»
(циклы)
7)
Скрытое содержимое могут видеть только пользователи групп(ы): Группа «Пользователь»
(массивы)
8)
Скрытое содержимое могут видеть только пользователи групп(ы): Группа «Пользователь»
(функции)
9)
Скрытое содержимое могут видеть только пользователи групп(ы): Группа «Пользователь»
(функции 2)
10)
Скрытое содержимое могут видеть только пользователи групп(ы): Группа «Пользователь»
(функции 3)

Для базы (первых пары десятков уроков) будет достаточно 1,2, 3,4 и 5. Для нормального понимания нужно посмотреть все (особенно функции).

Учить вас никто не заставляет, важно понимать как это все строится.
 
Урок 1.
Тема: Основа плагиностроения.
У плагинов есть небольшая основа, без которой плагин работать не будет.
Базовая структура плагина делится на 3 части:
1) Инклюды (библиотеки)
2) Переменные
3) Инициализация плагина.
В amxxstudio генерируется стандартный шаблон плагина, в котором содержится базовый инклюд <amxmodx> и функция инициализации плагина plugin_init.

Давайте разбираться, что для чего нужно.
1) Инклюды:
Это библиотеки функций, с помощью которых мы и будем взаимодействовать с игрой. Они содержат функции, которые можно будет использовать в случае подключения её к нашему плагину (например установление здоровья игроку).
Имеет синтаксис: #include <имя_из_папки_include.inc>

2) Область объявления. Несмотря на то, что переменные, массивы и т.д, по факту, вы можете объявлять в любом месте программы, но т.к у нас код последовательный, то если вы объявите переменные где-то в конце, то функции, находящиеся выше этой переменной в коде не смогут её использовать, поэтому принято объявлять переменные сразу после инклюдов.

3) Инициализация плагина:
В любом плагине есть функция plugin_init, она вызывается (срабатывает), каждый раз, когда происходит загрузка плагина (т.е логично предположить, что это происходит 1 раз, при загрузке карты). В нем происходит регистрация событий, инициализация переменных (установка им первоначальных значений), хотя это так-же можно сделать и в других местах, но логичнее и правильнее делать здесь., т.е все базовые приготовления.

Давайте теперь посмотрим на шаблон, который дает нам amxxstudio.

//Наш инклюд
#include <amxmodx>

//Далее идут #define, о них позже. Вкратце это идентификатор и его значения, для дальнейшего удобства.
//Например если использовать PLUGIN где-то в плагине, то вместо этого будет слово Основы.
//аналог: string PLUGIN = "Основы"
#define PLUGIN "Основы"
#define VERSION "1.0"
#define AUTHOR "Андрей"

//Инициализация плагина
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR) //самая важная строчка которая регистрирует плагин в системе. Есть в любом плагине. Здесь как раз видно принцип работы #define. Они подставляются в функции и в конечном итоге это строчка эквивалента: register_plugin("Основы", "1.0", "Андрей")

// Add your code here... //Тут нам предлагают писать уже наш код, но об этом в следующих уроках.
}


Урок 2.
Тема: Вывод сообщений в чат. Команды.

Начнем с самого безобидного - вывода Hello world в чат.
Создадим новый плагин в amxxstudio
И немножко его подправим:
#include <amxmodx>

#define PLUGIN "Вывод сообщений в чат. Команды" //изменим имя плагина
#define VERSION "1.0"
#define AUTHOR "Андрей"

public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)

register_clcmd("say /hello', "hello_world")
}

public hello_world(id)
{
client_print(0, print_chat, "Hello world")
}

Здесь мы не добавили новых инклюдов, заменили имя плагина и добавили свою функцию и зарегистрировали команду.

Регистрация команд осуществляется с помощью register_clcmd("команда", "вызываемая функция")
(про функции читайте по ссылкам в первом сообщении).
1) Здесь стоит учитывать то, какую команду вы хотите создать (консольную или в чат), для того, чтобы зарегистрировать консольную достаточно просто написать команду, например:
- register_clcmd("hello', "hello_world")
для команд чата вы можете подставить say или say_team если вы хотите, чтобы команда вызывалась только тогда, когда её пишут в чат команды.
2) Вызываемая функция пишется без аргументов, только имя.

Далее мы с вами создали функцию hello_world(id).
Все функции могут принимать id в качестве аргумента.
id - это уникальный идентификатор игрока на сервере. По нему мы можем выдать, например здоровье определенному игроку. Когда игрок напишет команду /hello функция получит id именно этого игрока.

Далее в самом теле функции мы выводим сообщение в чат с помощью client_print.
Он имеет синтаксис: client_print(id, куда_выводим, "сообщение", аргументы);
Здесь можно заметить, что мы написали вместо id - 0, что это значит? Подобного рода функции при принятии 0 вместо Id исполняются для всех игроков сервера. Т.е в этом случае, кто бы не написал команду ВСЕ игроки на сервере увидят сообщение Hello world.
print_chat Означает, что мы выводим сообщение в чат. Есть так-же:
print_console, print_center

Функции client_print не поддерживает цветные сообщения. Чтобы вывести цветное сообщение нужно воспользоваться, например, инклюдов ColorChat.
Подключим инклюд #include <ColorChat> ниже amxmodx

и заменим строчку
client_print(0, print_chat, "Hello world")
на
ColorChat(0, GREEN, "Привет, world!")
В итоге сообщение будем зеленого цвета. За это отвечает GREEN (вы можете использовать только GREEN, YELLOW, WHITE). В остальном синтаксис такой-же.

Усложним немножко задачу. Предположим, мы хотим вывести в чат сообщение и при этом указать имя, кто написал?

Для этого нужно немножко доработать нашу функции hello_world.

public hello_world(id)
{
new name[33];
get_user_name(id, name, 32)

client_print(0, print_chat, "Hello world [Написал %s]", name);
}

new name[33] - инициализация массива размерностью 33 символа (отмечу, что нумерация в массивах с 0).
get_user_name получает имя игрока по Id и записывает его массив.
get_user_name(<id>, <массив>, <размер_массива>) //32 вместо 33 т.к резервируем 1 символ

Далее осталось подставить подготовленный nickname в сообщение. Выше я писал, что client_print после сообщения принимает список аргументов.
Для того, чтобы имя появилось в сообщении нужно добавить %s. В самой игре вместо %s будет подставлено значение массива name. Почему %s? в Pawn для подстановки разных типов значений существуют свои идентификаторы.
%d - число;
%s - строка;
%f - число с плавающей точкой;
Урок: 3
Тема:Массивы.
Colorchat не сильно то украшает наше сообщение.Да и кроме цвета оно нечего не выполняет.
Приведу жизненный пример.У вас свой сервер кс1.6 у вас много админов,админских менюшек и некоторые админы балуются и вам пишут жалобы,а вы в ответ а я е*у кто это!?И вот у вас возникает идея сделать админское меню,команду с отловом ника админа чтобы писали жалобы конкретно.Например админ берёт скорость и в чат всех оповещает Админ SwimUp>>> взял скорость.И вот для отлова таких действий,и не только ника а можно отволить скока админ,игрок сделал убийств,смертей,пинг,команду,ник и много чего другова.Для этого есть массивы.
Давайте начнём для массивов ненадо никаких дополнительных инклюдов всё находится(как я знаю) в инклюде amxmod.
Давайте начнём!
Регестрируем авторство,версию,название плагина.И для наглядности подключаем инклюд ColorChat чтобы всё это сообщение "Админ SwimUp>>> взял скорость" выводилось цветными буквами.
Дальше регестрируем команду вызова.
Создаём функцию в теле её пишем:
new name[32]
get_user_name(id,name,31)
Давайте разбираться!
new- указывает что создаём что-то новое в данном случае имя для массива.
name- имя массива(может быть любое)
[32]- как правило в кс ник игрока может быть не больше 32 букв вот мы и указываем 32 буквы.
get_user_name- основа массива она и указывает что мы хотим узнать ник,а не пинг,команду и другое.
id- индес или айди игрока всегда ставим id поскольку мы хотим узнать имя игрока,а не сервера или чего-то другова.
name- имя массива регестрировали ранее(new name[32])
31- опять же длина имени.
Вроде всё но вы скажите а каким х*ё* всё будет работать,и правильно думаете а где выводиться будет?Для этого мы подключили ColorChat можно было и client_print воспользоваться.
Дальше создаём саму функцию сообщение
ColorChat(id, RED, "Я %s ГЕРОЙ", name)
Внимание!Имя массива записывается без скобок,и после скобок сообщение ставится запятая.
%s- вместо этого игре появится ваш ник.(если напишет кто-то другой будет ник его)
name- имя нашего массива разумеется.
Вроде бы всё должен получится такой код:
/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <Colorchat>

#define PLUGIN "Массивы"
#define VERSION "1.0"
#define AUTHOR "Андрей"

public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)

register_clcmd("say /chatname", "chat_name")
}
public chat_name(id)
{
new name[32]
get_user_name(id, name, 31)

ColorChat(id, RED, "Я %s ГЕРОЙ", name)
}

Проверьте.Скомпилировался или нет.У меня скомпилировался.
Welcome to the AMX Mod X 1.8.1-300 Compiler.
Copyright (c) 1997-2006 ITB CompuPhase, AMX Mod X Team

Header size: 372 bytes
Code size: 2016 bytes
Data size: 424 bytes
Stack/heap size: 16384 bytes; max. usage is unknown, due to recursion
Total requirements: 19196 bytes
Done.
Ну а если ошибки:
Error: Undefined symbol "name" on line 19- когда создавали массив допущенна ошибка(new name[32])
Больше вроде ошибок нету.
С client_print тоже самое client_print(id, print_chat, "Ух %s всё!", name)
 
Урок 4
Тема:Hud сообщение.
Сообщение в чат стали не так уж популярны,а особенно не так заметны.На их замену или просто как добавление пришло Hud сообщение.Вы спросите а что это?А я отвечу вы много раз встречались с ним просто вероятно не знали точное название.
Hud сообщение-это сообщение на экране,может быть расположено где угодно,и может быть любым цветом.
Я научу вас слегка другим способ нежели обычному set_hudmessage.
Set_hudmessage как это сказать палёвый,ведь если на экране есть другие надписи,а это не только те которые появились,но и те которые были например сообщение в углу экрана "Меню сервера на F3" это тоже hud сообщение дак вот если таких 1-2 то сообщение будет появляться на 1-2 секунды независимо сколько вы установили.
Дак вот я вас научу ShowSyncHudMsg.
Давайте приступим.
Регистрируем авторство,версию,название.
Тут нам инклюды лишние кроме amxmodx ненужны.
Создаём глобальную переменную.Не пугайтесь это как с массивом после #define пишем new hud.
В результате должно получиться так:
#include <amxmodx>

#define PLUGIN "ShowSyncHudMsg"
#define VERSION "1.0"
#define AUTHOR "Андрей"
new hud
Дальше в plugin_init регестрируем ещё один код hud = CreateHudSyncObj() Без него нечего не заработает.
Регистрируем 2 команды вызова.Я вам сразу покажу как сделать с массивами и без.
Создаём 2 функции.
В 1 регистрируем массив get_user_name.
Во 2 просто создаём сообщение:
set_hudmessage(0, 255, 0, 0.31, 0.33, 0, 6.0, 12.0)
ShowSyncHudMsg(0, hud, "Hud сообщение")
Давайте разбераться!
set_hudmessage- означает что создаём(Устанавливаем)hud сообщение.
Изучим всё что входит в функцию:
0-сколько будет красного (максимум 255)
255- сколько будет зеленого (максимум 255)
0- сколько будет синего (максимум 255)
0.31-координаты x
0.33- координаты y
0- эфекты:
0 - Без эффектов
1 - Мерцание
2 - Печатает буквы по очереди
6.0- всегда ставим так(Т.К это не суть важно)
12.0- сколько времени будет сообщение на экране.
Так вот ваша 1 шпаргалка Т.К в amxstudio есть функция генерации такого сообщения НО оно там создаётся по старой схеме тоесть через show_hudmessage(id, "You green hudmessage")
дак вот мы будем использовать его для настройки цвета и координатов.
Идём дальше.
ShowSyncHudMsg- создаём сообщение.
0- выдаст всем игрокам просто стоит не id
hud- эту переменную мы регистрировали в самом начале(new hud)
"Hud сообщение"- наше сообщение.
Я обещал показать как будет с массивами поэтому просто ставим после скобок ""сообщение запятую и пишем массив вот так:
set_hudmessage(0, 255, 0, 0.31, 0.33, 0, 6.0, 12.0)
ShowSyncHudMsg(0, hud, "Hud сообщение %s", name)
Всё очень просто.
В результате должен получиться такой код:
/* Plugin generated by AMXX-Studio */

#include <amxmodx>

#define PLUGIN "ShowSyncHudMsg"
#define VERSION "1.0"
#define AUTHOR "Андрей"
new hud

public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
hud = CreateHudSyncObj()
register_clcmd("say /hudmas", "hud_message_mas")
register_clcmd("say /hud", "hud_message")
}
public hud_message_mas(id)
{
new name[32]
get_user_name(id,name,31)

set_hudmessage(0, 255, 0, 0.31, 0.33, 0, 6.0, 12.0)
ShowSyncHudMsg(0, hud, "Hud сообщение %s", name)
}
public hud_message(id)
{
set_hudmessage(0, 255, 0, 0.31, 0.33, 0, 6.0, 12.0)
ShowSyncHudMsg(0, hud, "Hud сообщение")
}
Компилируем.У меня отлично скомпилировался.​

Урок 5
Тема:Другие массивы.
В этом уроке мы поговорим о других массивах и уже в следующем уроке будем учиться делать меню.
Регистрируем авторство,версию,название
Убираем лишний инклюд(amxmisc)
Подключаем инклюд Colorchat
Подключаем инклюд cstrike (нужен для работы массива получения денег)
Регистрируем 2 команды.
В тело 1 функции вставляем:
new MyMoney[32]
MyMoney[id] = cs_get_user_money(id)
ColorСhat(id, GREEN, "твои деньги %d$", MyMoney[id])
В тело 2 функции ставим:
new team[32]
get_user_team(id,team,31)
ColorChat(id, GREEN, "Ты в команде %s", team)
Давайте разбираться!
new- аналогично.
MyMoney[32]- аналогично
Вот теперь функция получения.
Сначала пишется массив(название которое регистрировали)
потом ставится =
пишется название функции cs_get_user_money
(id)- опять же указывает на то что получаем у игрока.
Ну и в самом коде сообщение записывается с [id]
В функции получения команды игрока всё аналогично функции получения имени.
В результате получится такой код:
/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <cstrike>
#include <colorchat>

#define PLUGIN "new массивы"
#define VERSION "1.0"
#define AUTHOR "Андрей"

public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)

register_clcmd("say /money", "my_money")
register_clcmd("say /team", "my_team")
}
public my_money(id)
{
new MyMoney[32]
MyMoney[id] = cs_get_user_money(id)
ColorChat(id, GREEN, "твои деньги %d$", MyMoney[id])
}
public my_team(id)
{
new team[32]
get_user_team(id,team,31)
ColorChat(id, GREEN, "Ты в команде %s", team)
}
Компилируем.У меня всё ок!

Урок 6
Тема:Fun инклюд и cstrike инклюд.+++проверка на админа.+++amxmisc инклюд.
Ну что-ж надоел вам я думаю этот чат,давайте перейдём к манипуляции игроками(издевательством,поощрением и другим)в этом нам поможет fun инклюд.
Подключаем fun инклюд(#include <fun>)
Регистрируем авторство,версию,название.
Регистрируем команду.
Ну что-ж с помощью этого инклюда можно раздавать жизни,броню,хп,оружие,патроны,сокорсть,гравитацию,невидимость,noclip и ещё много всего.
Давайте с помощью команды дадим игроку ну предположим 150хп,200брони M4A1 и AWP.(можно свои значение и оружия)
В тело функции пишем:
set_user_health(id, 150)
set_user_armor(id, 200)
give_item(id, "weapon_m4a1")
give_item(id, "weapon_ak47")
cs_set_user_bpammo(id, CSW_M4A1, 90)
cs_set_user_bpammo(id, CSW_AK47, 90)
Давайте разбераться!
set_user_health:
set- устанавливаем
user- игроку а не васе пупкину
health- жизни
id- индекс игрока чтоб дать именно ему.
150- количество.
с set_user_armor- тоже самое
armor- броню
200- количество
give- даём
item- что-то
id- опять же индекс игрока.
weapon_m4a1- раздаваемое оружие(в нашем случаем m4a1)
give_item(id, "weapon_ak47")- аналогично.
cs_set_user_bpammo(id, CSW_M4A1, 90):
cs- из инклюда cstrike
set_user_bpammo:
set- аналогично.
user- аналогично.
bpammo- обратите внимание не ammo,а bpammo
id- аналогично.
CSW_M4A1 - к чему даём патроны.
90- количество
cs_set_user_bpammo(id, CSW_AK47, 90)- аналогично.
Вот так вот просто.
Ну теперь усложним задачу.
Регистрируем ещё одну команду.
Сделаем чтоб использовать мог только админ(с любым флагом)
после скобки {
ставим проверку:
if(is_user_admin(id)){
}
if- точно незнаю может обозначает что перед кодом ставим или дополнение я хз.
(is_user_admin)- проверка на админа(из amxmisc)
(id)- айди игрока
{- открыли функцию
}- закрыли функцию
И вместо 150 хп и 200 брони дадим 255хп и брони+ещё и awp
give_item(id, "weapon_awp")
cs_set_user_bpammo(id, CSW_AWP, 30)
Жизни просто поменяйте.
Вообщим должен получится такой код:
/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <fun>

#define PLUGIN "fun инклюд и cstrike инклюд.+++проверка на админа.+++amxmisc инклюд."
#define VERSION "1.0"
#define AUTHOR "Андрей"

public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)

register_clcmd("say /superpuper", "super_puper")
register_clcmd("say /superadmin", "super_admin")
}
public super_puper(id)
{
set_user_health(id, 150)
set_user_armor(id, 200)
give_item(id, "weapon_m4a1")
give_item(id, "weapon_ak47")
cs_set_user_bpammo(id, CSW_M4A1, 90)
cs_set_user_bpammo(id, CSW_AK47, 90)
}
public super_admin(id)
{
if(is_user_admin(id)){
}
set_user_health(id, 255)
set_user_armor(id, 255)
give_item(id, "weapon_m4a1")
give_item(id, "weapon_ak47")
give_item(id, "weapon_awp")
cs_set_user_bpammo(id, CSW_M4A1, 90)
cs_set_user_bpammo(id, CSW_AK47, 90)
cs_set_user_bpammo(id, CSW_AWP, 30)
}
Компилируем.У меня всё норм.
 
Урок 7
Тема:Fun инклюд и cstrike инклюд.+++проверка на админа.+++amxmisc инклюд. Часть 2
Сегодня мы будем раздавать игрокам гравитацию и скорость.
Давайте начинать.
Регистрируем авторство,версию,название плагина.
Подключаем только FUN!
Регистрируем 2 команды:
1.Будет давать скорость.
2.Будет давать гравитацию.
В тело скорости пишем:
set_user_maxspeed(id, 500)
set_user_maxspeed- указываем что хотим изменить скорость игроку.
id- айди игрока.
500- количество
В тело гравитации пишем:
set_user_gravity(id, 0.5)
set_user_gravity- указывает что хотим поменять граву у игрока.
id- аналогично.
0.5- вот тут труднее.Вы заметили что начали не с целого и большого числа.Начальная гравитацию у игрока(обычная)1.0.
В итоге получится такой код.
/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <fun>

#define PLUGIN "Fun (скорость и грава)"
#define VERSION "1.0"
#define AUTHOR "Андрей"

public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)

register_clcmd("say /speed", "give_speed")
register_clcmd("say /grava", "give_grava")
}
public give_speed(id)
{
set_user_maxspeed(id, 500.0)
}
public give_grava(id)
{
set_user_gravity(id, 0.5)
}
Компилируем.Вы увидели что появился 1 warning.Это из-а того что мы в скорости установили целое число а не дробное.Исправляем к 500 ставим .0 тоесть получится 500.0.Всё.

Урок 8
Тема:Создаём меню.
Меню гораздо удобнее.ненужно прописывать много команд.
Не буду много говорить давайте приступим.
new menuska = menu_create("Моё 1 меню!!!Ура.", "menu_handler")
new- создаём индитификатор меню что-то в этом роде.
menuska- имя индитификатора.
menu_create- создаём само меню
("Моё 1 меню!!!Ура."-название меню(шапки)
("menu_handler")-название функции где будут функции меню.Кратко:чтоб при нажатии Умереть он умирал,а при нажатии взять оружие ему давалось оружие.
Создаём пункты:
menu_additem(menuska, "Умереть", "1")
menu_additem(menuska, "Взять m4a1(для админов", "2")
menu_additem(menuska, "Сказать всем привет.", "3")
menu_additem- создаёт пункт меню.
menuska- название индитификатора(регистрировали ранее)
"Умереть- имя пункта.
"1"- его числовой индитификатор.Дальше всё поймёте.
menu_setprop(menuska, MPROP_EXITNAME, "Выход")
menu_setprop- спомощью этой функции можно убрать английские название кнопок:Выход,далее,назад и другое.
MPROP_EXITNAME- что хотим убрать.В нашем случае кнопку Выход точнее не убрать а перевести.
Есть такие:
MPROP_BACKNAME- заменяет кнопку назад
MPROP_NEXTNAME- заменяет кнопку далее(ну или как вы там её обзовёте)
"Выход"- на что заменяем.
menu_display(id ,menuska,0)
menu_display- покажем игроку меню
id- ник игрока
menuska- индитификатор
0- точно не знаю,ставим всегда 0)))
Усё.Создаём функции для пунктов.Для этого ниже создаём функции с именем которое указывали в создании меню(menu_handler)
В тело пишем:
if (item == MENU_EXIT)
{
menu_destroy(menu)
return PLUGIN_HANDLED
}

new s_Data[6], s_Name[64], i_Access, i_Callback
menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name,
charsmax(s_Name), i_Callback)
new i_Key = str_to_num(s_Data)

switch(i_Key)
{
case 1:
{
Да.Получился такой код расшифровывать я его не буду просто при создании функции копируем и вставляем его.
case 1: 1 функции(это умереть)
пишем console_cmd(id, "kill")
console_cmd- консольная команда
id- ник игрока(чтоб его убить)
"kill"- наша команда(в ковычках)
далее закрываем }
пишем:
{
case 2:
{
тут пишем код выдачи оружия но перед ставим проверку на админа.
#include <cstrike> незабываем
#include <fun>
#include <amxmisc>
}
case 3:
{
подключаем colorchat
регистрируем массив
ColorChat(id, RED, "%s Всем ку", name)
}
}
Усё.
Должен получится такой код:
Смотри во 2 части ниже Т.К не влезло!


Урок 9
Тема:Создаём меню.Часть 2
Продолжение...
Должен получится такой код:
#include <amxmodx>
#include <cstrike>
#include <fun>
#include <amxmisc>
#include <colorchat>

#define PLUGIN "Создаём меню"
#define VERSION "1.0"
#define AUTHOR "Андрей"

public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)

register_clcmd("say /menu", "menu")
}
public menu(id){
new menuska = menu_create("Моё 1 меню!!!Ура.", "menu_handler")

menu_additem(menuska, "Умереть", "1")
menu_additem(menuska, "Взять m4a1(для админов)", "2")
menu_additem(menuska, "Сказать всем привет.", "3")
menu_setprop(menuska, MPROP_EXITNAME, "Выход")
menu_display(id, menuska,0)
}
public menu_handler(id, menu, item)
{
if (item == MENU_EXIT)
{
menu_destroy(menu)
return PLUGIN_HANDLED
}

new s_Data[6], s_Name[64], i_Access, i_Callback
menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback)
new i_Key = str_to_num(s_Data)

switch(i_Key)
{
case 1:
{
console_cmd(id, "kill")
}
case 2:
{
if(is_user_admin(id)){
give_item(id, "weapon_m4a1")
cs_set_user_bpammo(id, CSW_M4A1, 90)
}
}
case 3:
{
new name[32]
get_user_name(id, name, 31)

ColorChat(id, RED, "%s Всем ку", name)
}
}
return PLUGIN_HANDLED
}
Компилируем.Если у вас будут ошибки.особенно с проверкой на админа.ТО поставьте ещё 1 }
Т.К код добльшой и нужно закрыть 2 раза.
Welcome to the AMX Mod X 1.8.1-300 Compiler.
Copyright (c) 1997-2006 ITB CompuPhase, AMX Mod X Team

Header size: 696 bytes
Code size: 3152 bytes
Data size: 860 bytes
Stack/heap size: 16384 bytes; max. usage is unknown, due to recursion
Total requirements: 21092 bytes
Done.
 
Урок 10
Тема:Каректировка меню.
В этом уроке мы научимся с вами переносить строки и изменить цвет текста.
Регистрируем авторство,версию,название.
Регистрируем команду вызова меню.
в теле создаём меню.
Давайте изменим цвет текста например на красный.
перед текстом ставим \r
Цвета:
\w - белый цвет
\r - красный цвет
\y - желтый цвет
\d - серый цвет (неактивный)
В итоге получится это:
menu_additem(1111, "\rКрасный цвет", "1")
вместо 1111 ваш название меню.
Отступим строчку(перенесём)
после текста ставим ^nи текст
^n - новая строка( перенос строки )
^t - отступ ( пробел )
\R - выравнивает текст по правому краю.
В итоге получится это:
/* Plugin generated by AMXX-Studio */

#include <amxmodx>

#define PLUGIN "Коректировка текста"
#define VERSION "1.0"
#define AUTHOR "Роман"

public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)

register_clcmd("say /menu", "open_menu")
}
public open_menu(id)
{
new menu = menu_create("Учимся!", "menu_handler")

menu_additem(menu, "\rКрасный цвет", "1") //будет красным цветом
menu_additem(menu, "Перенос^nперенос", "2") //будет в 2 строчки

menu_display(id, menu, 0)
menu_setprop(menu, MPROP_EXITNAME, "Выход")
}
Компилируем.
Welcome to the AMX Mod X 1.8.1-300 Compiler.
Copyright (c) 1997-2006 ITB CompuPhase, AMX Mod X Team

Header size: 696 bytes
Code size: 3152 bytes
Data size: 860 bytes
Stack/heap size: 16384 bytes; max. usage is unknown, due to recursion
Total requirements: 21092 bytes
Done.

Урок 11
Тема:set_task и отлов начала раунда.
Начнём сразу.
Регистрируем авторство,версию,название.
В plugin_init пишем:
register_logevent( "round_start", 2, "1=Round_Start" )
register_logevent-отлавливаем какое-то событие
"round_start- название функции которая вызывется.
2- небудем разбеарть всегда пишем 2
1=Round_Start- событие
создаём функцию
public round_start(id)
{
set_task(1.0, "start_mod", id)
set_task-наша команда
1.0- время(в секундах) только десятичной дробью!
start_mod- функция которая выполнится
id- чтоб функцию нашёл
}
public start_mod(id)
{
ColorChat(id, RED, "New round")
}
Дальше всё понятно.



Урок 12
Тема:Ограничение использование функций.Часть 1
Думаю всех заебали админы которые нихуя не понимают?
Вы их толдычите брать за раунд 1 раз хп и скорость,а они как тупые обезьяны берут по +100500 раз.
И вот в этой статье вы решите эту проблему!
Регистрируем авторство,версию,название.
В plugin_init
Давайте создадим некое админ меню с функциями.
Регистрируем команду вызова.
Создаём наше меню.
Лично я советую раздавать хп,броню,оружие не сразу в самом меню,а создавая отдельные функции.
Ну к примеру давайте сделаем в нашем меню такие функции:
Взять хп[1 раз за раунд]
Взять m4a1[1 раз за раунд]
Взять 255брони[2 раза за раунд]
В меню пишем:
case 1:
{
givehp(id)
}
case 2:
{
givem4a1(id)
}
givearmor(id)
}
Это мы с вами сделали чтоб при нажатии определённой функции выполнялся не сам наш код проверок,ограничений,а функция в которой всё будет.
Создаём функцию givehp(id)
Но перед этим ниже
#define PLUGIN "Ограничение."
#define VERSION "1.0"
#define AUTHOR "SwimUp"
//пишем
new hp[33], m4a1[33], armor[33]
Мы создали переменные.
Каждый раз когда будем использовать функцию он будет записывать в массив 1.
И перед использованием каждой функции мы поставим проверку.
Массивы(переменные) можно обозвать как угодно.
Для добавления хп,выдачи оружие нам надо подключить инклюды:cstrike и fun.
Ну а для наглядности Colorchat.
В тело функции пишем:
public givehp(id)
{
if(hp[id] <= 0) //Проверка вот тут баг или нет но как-бы всё идёт на 1 меньше.если 0 то это 1 раз за раунд,1 это 2 раза за раунд.
{
hp[id]++ //Записываем 1 в массив.
set_user_health(id, 150) //Выдаём жизни
}else{ //Часть кода если уже исчерпан лимит.
ColorChat(id, GREEN, "Ты исчерпал лимит") //Сообщение,можно что угодно.
}
}
public givem4a1(id)
{
if(m4a1[id] <= 0)
{
m4a1[id]++
give_item(id, "weapon_m4a1") //Раздаём оружие.
cs_set_user_bpammo(id, CSW_M4A1, 90) //Даём патроны.
}else{
ColorChat(id, GREEN, "Ты исчерпал лимит")
}
}
public givearmor(id)
{
if(armor[id] <= 1)
{
armor[id]++
set_user_armor(id, 255)
}else{
ColorChat(id, GREEN, "Ты исчерпал лимит")
}
}
Ах да отлавливаем начало раунда:
register_event("HLTV", "startround", "a", "1=0", "2=0")
Создаём функцию:
public startround()
{
for(new id = 1;id <= get_maxplayers(); id++) //Пробегаемся по всем игрокам
{
m4a1[id] = 0 //Обнуляем чтобы можно было использовать в следующем раунде.
hp[id] = 0
armor[id] = 0
}
}
Также обнуляем при реконекте(можно не обнулять)
public client_authorized(id)
{
m4a1[id] = 0
hp[id] = 0
armor[id] = 0
}
Что-то вроде этого должно получиться.
Смотри во 2 части))))))))))))

Урок 13
Тема:Ограничение использование функций.Часть 2
/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <cstrike>
#include <fun>
#include <colorchat>

#define PLUGIN "Ограничение."
#define VERSION "1.0"
#define AUTHOR "SwimUp"
new hp[33], m4a1[33], armor[33]

public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)

register_event("HLTV", "startround", "a", "1=0", "2=0")

register_clcmd("say /adminmenu", "admin_menu")
}
public startround()
{
for(new id = 1;id <= get_maxplayers(); id++)
{
m4a1[id] = 0
hp[id] = 0
armor[id] = 0
}
}
public client_authorized(id)
{
m4a1[id] = 0
hp[id] = 0
armor[id] = 0
}
public admin_menu(id)
{
if(get_user_flags(id) & ADMIN_BAN)
{
new admin_menu = menu_create("Админ-меню", "menu_handler")

menu_additem(admin_menu, "Взять hp[1 раз за раунд].", "1")
menu_additem(admin_menu, "Взять m4a1[2 раз за раунд].", "2")
menu_additem(admin_menu, "Взять 255 брони.[1 раз за раунд].", "3")
menu_setprop(admin_menu, MPROP_EXITNAME, "Выйти")
menu_display(id,admin_menu,0)
}
}
public menu_handler(id, menu, item)
{
if (item == MENU_EXIT)
{
menu_destroy(menu)
return PLUGIN_HANDLED
}

new s_Data[6], s_Name[64], i_Access, i_Callback
menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback)
new i_Key = str_to_num(s_Data)

switch(i_Key)
{
case 1:
{
givehp(id)
}
case 2:
{
givem4a1(id)
}
case 3:
{
givearmor(id)
}
}
return PLUGIN_HANDLED
}
public givehp(id)
{
if(hp[id] <= 0)
{
hp[id]++
set_user_health(id, 150)
}else{
ColorChat(id, GREEN, "Ты исчерпал лимит")
}
}
public givem4a1(id)
{
if(m4a1[id] <= 0)
{
m4a1[id]++
give_item(id, "weapon_m4a1")
cs_set_user_bpammo(id, CSW_M4A1, 90)
}else{
ColorChat(id, GREEN, "Ты исчерпал лимит")
}
}
public givearmor(id)
{
if(armor[id] <= 1)
{
armor[id]++
set_user_armor(id, 255)
}else{
ColorChat(id, GREEN, "Ты исчерпал лимит")
}
}
Компилируем!
Welcome to the AMX Mod X 1.8.1-300 Compiler.
Copyright (c) 1997-2006 ITB CompuPhase, AMX Mod X Team

Header size: 752 bytes
Code size: 3508 bytes
Data size: 1564 bytes
Stack/heap size: 16384 bytes; max. usage is unknown, due to recursion
Total requirements: 22208 bytes
Done.
Всё ок да?
Если ругается смотрите возможно вы не создали массивы или неправильно поставили проверку,или недозакрывали скобки,или перезакрывали 😀
Если что-то забыл напишите мне в личку!
 
Урок 14
Тема:Рандом!
Думаю вы давно хотели сделать рандомную выдачу чего-то.
Дак вот в этом уроке вы научитесь это делать!
Всё очень просто.
Регистрируем авторство,версию,название.
Регистрируем новый массив:
new const szWpnNames[][] = { "weapon_ak47", "weapon_m4a1" }
new const -регистрация
szWpnNames - имя
[][]- не трогаем
{ "weapon_ak47", "weapon_m4a1" } - то-что выдастся нам.в данном случае или m4a1 или ak47 можно сделать ещё больше.
Регистрируем команду.
register_clcmd("say /weapon", "give_random_weapon")
Создаём функцию.
В тело пишем.
give_item(id, szWpnNames[random(sizeof(szWpnNames))]) //give item даём что-то дальше я думаю всё понятно.
client_print(id, print_chat, "Тепе попалось %s",szWpnNames) // для наглядности выводим в чат.
Результат:
/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <fun>

#define PLUGIN "random"
#define VERSION "1.0"
#define AUTHOR "SwimUp"
new const szWpnNames[][] = { "weapon_ak47", "weapon_m4a1" };

public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)

register_clcmd("say /weapon", "give_random_weapon")
}
public give_random_weapon(id){
give_item(id, szWpnNames[random(sizeof(szWpnNames))])
client_print(id, print_chat, "Тепе попалось %s",szWpnNames)
}
Вот так.


Урок 15
Тема:Создание магазина
Надоели админ меню,вип и другие.
Захотели сделать магаз?
Тогда этот урок для вас.
Регистрируем авторство,версию,название.
Разумеется что-бы сделать нормальных магазин нам нужно больше инклюдов.
Подключаем 2 инклюда(вы можете больше)
#include <cstrike> //Нужен для проверки денег,и для раздачи оружия(вобщим функции)
#include <fun> //Скорость,гравитация и другое.
Начало сделали.
Регистрируем команду(ы) вызова.
Я сделаю 2,для того что-бы можно было забиндить и мы с вами поставим авто-бинд при конекте.
Сделали? Идём дальше.
Нам нужно сделать бинд.(кому ненадо пропускаем)
Есть такая замечательная функция как client_authorized
Создаём функцию.
public client_authorized(id) теперь немножко расскажу.
Это функция вызывается САМА,тоесть ненадо делать команды или что-то ещё.
Данная функция вызывается между функциями client_connect и client_putinserver.
Думаю тут понятно.
public client_authorized(id)
{
client_cmd(id, "bind p shop")
}
client_cmd - Как-бы прописывает за клиента команду.Тоесть при заходе игрока на его стороне(как-будто он прописал сам,выполнится команда bind p shop)
Где:
bind - привязываем что-то
p - к какой кнопке(можно цифры)
shop - команда которая вызовется(Команда должна быть консольной,не say /shop)
С биндом разобрались.
Создаём меню!
Лично я сделал такие пункты:
M4A1
AK47
Скорость
Гравитация
В результате должно выглядеть как-то так:
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <fun>

#define PLUGIN "Создание магазина"
#define VERSION "1.0"
#define AUTHOR "SwimUp"

public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)

register_clcmd("say /shop", "shop")
register_clcmd("shop", "shop")
}
public client_putinserver(id)
{
client_cmd(id,"bind p shop")
}
public shop(id)
{
new magaz = menu_create("Магазин", "shop_handler")

menu_additem(magaz, "\rM4A1\d[1000$]", "1")
menu_additem(magaz, "\rAK47\d[2020$]", "2")
menu_additem(magaz, "\rСкорость\d[6500$]", "3")
menu_additem(magaz, "\rГравитация\d[100$]", "4")

menu_setprop(magaz,MPROP_EXITNAME, "Выход")

menu_display(id,magaz,0)
}
Вы заметили что shop_handler,а не menu_handler разницы нет делайте хоть axuet_magaz.
В тело наших функций пишем.
public shop_handler(id, menu, item)
{
if (item == MENU_EXIT)
{
menu_destroy(menu)
return PLUGIN_HANDLED
}

new money = cs_get_user_money(id)
new s_Data[6], s_Name[64], i_Access, i_Callback
menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback)
new i_Key = str_to_num(s_Data)

switch(i_Key)
{
case 1:
{
Дальше смотрим во 2 части.


Урок 16
Тема:Создание магазина,часть 2.
Теперь нам нужно сделать проверка+отнимание денег.
Вот для этого нам и потребовался инклюд cstrike.
Вы заметили new money = cs_get_user_money(id)
с new money я знакомил(точнее что это такое(не лично money,другие массивы))
cs_get_user_money(id) //Получаем деньги игрока,записываем в new money(точнее в money)
В пункте делаем проверку:
if(money >= 1000) // money массив,>= 1000 проверка,если у него 1000 и больше покупаем,если нет выводим в чат(}else{,client_print(id,print_chat,"Недостаточно денег"))
{
cs_set_user_money(id, money - 1000) //записали в money,и забрали.
give_item(id,"weapon_m4a1")
}else{
client_print(id,print_chat,"Недостаточно денег")
}
Будет там:
{
case 1:
{
if(money >= 1000)
{
cs_set_user_money(id, money - 1000)
give_item(id,"weapon_m4a1")
}else{
client_print(id,print_chat,"Недостаточно денег")
}
case 2:
{
if(money >= 2020)
{
cs_set_user_money(id, money - 2020)
give_item(id,"weapon_ak47")
}else{
client_print(id,print_chat,"Недостаточно денег")
}
}
case 3:
{
if(money >= 6500)
{
cs_set_user_money(id, money - 6500)
set_user_maxspeed(id,500.0) //Незабываем что-бы сохранить скорость нам нужно создать переменную.(читаем ниже)
}else{
client_print(id,print_chat,"Недостаточно денег")
}
}
case 4:
{
if(money >= 100)
{
cs_set_user_money(id, money - 100)
set_user_gravity(id,0.5)
}else{
client_print(id,print_chat,"Недостаточно денег")
}
}
Как сохранить скорость читаем ниже-->
 
Урок 17
Тема:Создание магазина,часть 2.
Выдаем скорость но при смене оружия она теряется,это происходит иза-того что с каждым оружием разная скорость,с пулемет вы бежите тише еже-ли с ножом.
Создаём булевую переменную.
new bool:speed[33]
В самое начало после define.
Теперь при раздаче скорости выставляем true
speed[id] = true
:::::::::::::::::::::::::::::::::::::
cs_set_user_money(id, money - 6500)
set_user_maxspeed(id,500.0)
speed[id] = true
}else{
client_print(id,print_chat,"Недостаточно денег")
Теперь ловим событе смены оружия:
register_event( "CurWeapon", "savespeed", "be", "1=1" )
В тело функции пишем:
if(speed[id]) //Проверка
{
set_user_maxspeed(id,500.0) //Снова даём
}
Результат:
public savespeed(id)
{
if(speed[id])
{
set_user_maxspeed(id,500.0)
}
}
Вроде-бы всё.
Весь код:
/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <fun>

#define PLUGIN "Создание магазина"
#define VERSION "1.0"
#define AUTHOR "SwimUp"
new bool:speed[33]

public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)

register_clcmd("say /shop", "shop")
register_clcmd("shop", "shop")

register_event( "CurWeapon", "savespeed", "be", "1=1" )
}
public savespeed(id)
{
if(speed[id])
{
set_user_maxspeed(id,500.0)
}
}
public client_authorized(id)
{
client_cmd(id, "bind p shop")
}
public shop(id)
{
new magaz = menu_create("Магазин", "shop_handler")

menu_additem(magaz, "\rM4A1\d[1000$]", "1")
menu_additem(magaz, "\rAK47\d[2020$]", "2")
menu_additem(magaz, "\rСкорость\d[6500$]", "3")
menu_additem(magaz, "\rГравитация\d[100$]", "4")

menu_setprop(magaz,MPROP_EXITNAME, "Выход")

menu_display(id,magaz,0)
}
public shop_handler(id, menu, item)
{
if (item == MENU_EXIT)
{
menu_destroy(menu)
return PLUGIN_HANDLED
}

new money = cs_get_user_money(id)
new s_Data[6], s_Name[64], i_Access, i_Callback
menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback)
new i_Key = str_to_num(s_Data)

switch(i_Key)
{
case 1:
{
if(money >= 1000)
{
cs_set_user_money(id, money - 1000)
give_item(id,"weapon_m4a1")
}else{
client_print(id,print_chat,"Недостаточно денег")
}
}
case 2:
{
if(money >= 2020)
{
cs_set_user_money(id, money - 2020)
give_item(id,"weapon_ak47")
}else{
client_print(id,print_chat,"Недостаточно денег")
}
}
case 3:
{
if(money >= 6500)
{
cs_set_user_money(id, money - 6500)
set_user_maxspeed(id,500.0)
speed[id] = true
}else{
client_print(id,print_chat,"Недостаточно денег")
}
}
case 4:
{
if(money >= 100)
{
cs_set_user_money(id, money - 100)
set_user_gravity(id,0.5)
}else{
client_print(id,print_chat,"Недостаточно денег")
}
}
}
return PLUGIN_HANDLED
}

Нашёл ошибку?Напиши мне!

Урок 18
Тема:Проверка на команду.
Думаю вы хотели ограничить действие или что-то ещё определённой команде.
Давайте например при появлении террориста будем убивать его(почти заблочим спавн)
Лучше всего ловить спавн игрока(еже-ли ловить начало рануда,делать цикл)
Лучше всего ловить через hamsandwich.
Регистрируем авторство,версию,название.
Подключаем инклюд #include <hamsandwich>
В plugin_init регистрируем событие:
RegisterHam(Ham_Spawn, "player", "player_kill", 1)
RegisterHam - Регистрируем событие.
Ham_Spawn - что за событие(в нашем случае спавн игрока,есть ещё много чего.)
player - игрока
player_kill - функция которая вызовется
В тело функции пишем:
if(get_user_team(id) == 1)
{
client_cmd(id,"kill")
}
if - проверка
get_user_team(id) - что проверяем(принадлежность к команде)
1 - Что за команда.Команды:
1- террористы
2 - кт
3 - спектары
client_cmd(id,"kill") - Уже знакомил.
Веся функция:
public player_kill(id){
if(get_user_team(id) == 1)
{
client_cmd(id,"kill")
}
}
Теперь встает вопрос,я хочу сделать магазин для зеков отдельно,и для ментов,но как?
Регистрировать 2 разные команды,бред!
Делается это всё очень просто!
if (get_user_team(id) == 1)
{
new change_zek = menu_create("\yМ\rагазин\yЧ\rик для зеков за \yмонетки^n\rBy SwimUp^n\rv 1.1", "zek_handler") //Регистрируем новое меню,но перед этим ставим проверку на теров.(выдерга из моего магазина монеток,для jail)
menu_additem(change_zek, "\yСупер скорость\r[5монеток]", "1")
menu_additem(change_zek, "\yGlock18\r[ВСЕ ПАТРОНЫ][10монеток]", "2")
menu_additem(change_zek, "\yM4A1\r[ВСЕ ПАТРОНЫ][15монеток]", "3")
menu_additem(change_zek, "\yAWP\r[ВСЕ ПАТРОНЫ][17монеток]", "4")
menu_additem(change_zek, "\yAK47\r[Все патроны][15монеток]", "5")
menu_additem(change_zek, "\yM249\r[ВСЕ ПАТРОНЫ][18монеток]]", "6")
menu_additem(change_zek, "\yПолная невидимость[25монеток]", "7")
menu_additem(change_zek, "\yВозрождение[3монетки]", "8")
menu_additem(change_zek, "\yRed bull[6монеток]", "9")
menu_additem(change_zek, "\y2000hp[13монеток]", "10")
menu_setprop(change_zek, MPROP_EXITNAME, "Выход")
menu_display(id, change_zek,0)
} //Меню доходит до конца,ставим проверку на ментов.Если это мент,то он проигнорит 1 меню(не пройдет проверку),но зато 2 меню откроет.
if (get_user_team(id) == 2)
{
new change_ment = menu_create("\yМ\rагазин\yЧ\rик для ментов за \yмонетки^n\wBy SwimUp", "ment_handler") //Меню ментов
menu_additem(change_ment, "\yПолная невидимость\r[30монеток]", "1")
menu_additem(change_ment, "\yСупер скорость\r[15монеток]", "2")
menu_setprop(change_ment, MPROP_EXITNAME, "Выход")
menu_display(id,change_ment,0)
}
}
Функций у нас две:
zek_handler
ment_handler
создаём функции аналогично.
public zer_handler(id) - для зеков
public ment_handler(id) - для ментов

Нашёл ошибку?Напиши мне!

Урок 19
Тема:MOTD.
Чат,да вообще что это,правильно это место куда почти не кто не смотрит.
Поэтому есть веселая вещь motd окна.
(И не пиз*и*е что с ними не встречались,когда заходите на сервере 1 окошко,при написании /adminka,/vip)
Давайте начнём.
Зарегистрируем команду.
В тело функции добовляем это:
show_motd(id,"help.txt","Описание..")
show_motd - показываем мотд
id - игроку
help.txt - откуда будет братся текст(вот тут придётся подёргатся,работает так-же html(благодаря этому окна /adminka,/vip так красиво выглядят))
Описание... - описание
Что-то вроде этого долэго получится:

#include <amxmodx>
#include <amxmisc>

#define PLUGIN "MOTD"
#define VERSION "1.0"
#define AUTHOR "Андрей"

public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)

register_clcmd("say /help","help_motd")
}
public help_motd(id){
show_motd(id,"help.txt","Помощь..")
}

Урок 20
Тема:Проверка на флаг.
if(get_user_flags(id) & ADMIN_LEVEL_A)
Вместо ADMIN_LEVEL_A ставите ваш любой флаг
Например я хочу что-бы только админы с флагос amx_rcon могли открывать меню то;
if(get_user_flags(id) & ADMIN_RCON)
; a - иммунитет (против игрока не могут быть использованы команды: kick/ban/slay/slap и т.д)
; b - резервация (игрок сможет пользоваться резервным слотом)
; c - amx_kick - доступ к команде amx_kick
; d - amx_ban and amx_unban commands - доступ к команде amx_ban и amx_unban
; e - amx_slay and amx_slap commands - доступ к команде amx_slay и amx_slap
; f - amx_map command - доступ к команде amx_map
; g - amx_cvar command - доступ к команде amx_cvar (не все переменные могут быть доступны)
; h - amx_cfg command - доступ к команде amx_cfg
; i - amx_chat and other chat commands - доступ к команде amx_csay и другим чат командам
; j - amx_vote and other vote commands - доступ к команде amx_vote и другим командам голосования
; k - access to sv_password cvar - доступ к переменной sv_password (через команду amx_cvar)
; l - access to amx_rcon command and rcon_password cvar - доступ к переменной amx_rcon и rcon_password (через amx_cvar)
; m - произвольный уровень A (если вы используете нестандартные амх плагины)
; n - произвольный уровень B
; o - произвольный уровень C
; p - произвольный уровень D
; q - произвольный уровень E
; r - произвольный уровень F
; s - произвольный уровень G
; t - произвольный уровень H
; u - доступ к графическому меню управления (amxmodmenu)
; z - пользователь (не админ)

Нашёл ошибку?Напиши мне!
 
Внимание! Эта тема - нечто большее, чем 8 месяцев назад Старый.
Скорее всего, дальнейшее обсуждение не требуется, и в этом случае мы рекомендуем начать новую тему. Однако, если вы чувствуете, что требуется ваш ответ, вы все равно можете это сделать.
Назад
Назад
Сверху Снизу