Nico Yazawa
Бывший MrChester =(
- Сообщения
- 326
- Реакции
- 303
Ну что же, я думаю эта идея будет интересна в CS:GO.
Сегодня мы будем стремиться к игре SCP:Containment Breach. Всю необходимую информацию можно глянуть тут: Клик (качать не надо))
- Знания языка SourcePawn (уроков от R1KO хватит)
- Программа в которой мы будем этим заниматься (в моем случае NotePad++)
- Руки и голову на плечах
Итак, вот мы уже создали файл
Если Вы пишите в NotePad++ рекомендую изменить Синтаксис (сверху в баре) на C#
Дальше подключаем необходимые инклуды и остальные "штучки":
Дальше давайте сделаем информацию о игроках, создав Enum и двумерный массив: (потом покажу как им пользоваться)
Добавим авторства:
На этом начальная подготовка окончена, переходим к более важному.
Хукаем событие Round_Start:
В enum player вписываем следующее:
Не забудем обнулить при заходе нового игрока:
И создаем enum SCP_ROLES:
Давайте проверим, есть ли в начале раунда игроки. Создадим функцию подсчитывающее кол-во игроков:
И впишем ее в начало раунда:
Теперь создадим функцию, выбирающая рандомного игрока:
Ну и выдадим роль SCP-173 игроку, в случае если на сервере больше 3 человек и не забудем очистить все роли в конце раунда:
Теперь надо хукнуть конец раунда и очистить роли:
В начале раунда мы должны выдать всем тем, кто не получил роль, роль D-Класса:
Отлично! Мы сделали разделение между D-Классом и SCP-173
Дальше нам надо поставить разные спавны клиентам, мы будем использовать данную карту: Клик
Создадим точки спавна для каждой роли:
Ну и сделаем телепорт игрока на позицию при спавне:
Теперь мы можем распределять спавны по ролям
Первый урок на сегодня окончивается, в следующем будем делать функционал SCP и добавлять результат игры
Выслушаю любую критику)
Свои пожелания можете писать ниже
Также приложу код, который должен был получиться
Сегодня мы будем стремиться к игре SCP:Containment Breach. Всю необходимую информацию можно глянуть тут: Клик (качать не надо))
Начало
Чтобы начать писать плагин нам будут необходимы:
- Знания языка SourcePawn (уроков от R1KO хватит)
- Программа в которой мы будем этим заниматься (в моем случае NotePad++)
- Руки и голову на плечах
Итак, вот мы уже создали файл
SCP-SB.sp
и готовы в нем писать.Если Вы пишите в NotePad++ рекомендую изменить Синтаксис (сверху в баре) на C#
Дальше подключаем необходимые инклуды и остальные "штучки":
C-подобный:
#include <sourcemod> // Необходимые инклуды
#include <cstrike>
#include <sdktools>
#pragma tabsize 0 // Чтобы предовратить лишние Warnings (баг с табуляцией в NotePad++)
Дальше давайте сделаем информацию о игроках, создав Enum и двумерный массив: (потом покажу как им пользоваться)
C-подобный:
enum player // Создаем Enum, который после дополним
{
}
any player_info[MAXPLAYERS + 1][player]; // Создаем двумерный массив
C-подобный:
public Plugin myinfo = // Авторство
{
name = "SCP:Containment Breach", // Название
author = "Nico Yazawa", // Автор
version = "1.0" // Версия
};
Создаем D-Класс и SCP-173
В начале каждого раунда мы будем распределять все важные роли (то есть все роли кроме D-Класса), пока что у нас их будет две: D-Класс и SCP-173
Хукаем событие Round_Start:
C-подобный:
public void OnPluginStart() // Когда плагин стартует
{
HookEvent("round_start", Event_RoundStart); // Хукаем событие
}
public void Event_RoundStart(Event hEvent, const char[] sEvName, bool bDontBroadcast) // Каллбек события
{
}
C-подобный:
any:Role, // Роль игрока
C-подобный:
public void OnClientPutInServer(int client) // Когда игрок полностью входит на сервер
{
player_info[client][Role] = NONE; // Обнуляем роль
}
C-подобный:
enum SCP_ROLES
{
NONE = 0, // Нету роли
ROLE_D, // Роль D-Класса
ROLE_SCP173, // Роль SCP-173
}
C-подобный:
public int GetClientsOnServer()
{
int count; // Кол-во клиентов
bool realPlayers = false; // Имеются ли не боты
for(int i = 1; i <= MaxClients; i++) // Цикл по всем возможным клиентам
{
if(IsClientInGame(i)) // Клиент на сервере?
{
count++; // Прибавляем кол-во людей на сервере на 1
if(!IsFakeClient(i)) // Это не бот?
{
realPlayers = true; // Не боты есть на сервере
}
}
}
if(realPlayers) // Есть ли не боты на сервере?
{
return count; // Возвращаем кол-во клиентов на сервере
}
else // Срабатывает если нет настоящих игроков на сервере
{
return 0; // Возвращаем 0, то есть никого нет
}
}
C-подобный:
public void Event_RoundStart(Event hEvent, const char[] sEvName, bool bDontBroadcast) // Каллбек события
{
int clients = GetClientsOnServer(); // Создаем переменную с кол-вом игроков на сервере
if(clients) // Если игроки есть на сервере?
{
}
}
C-подобный:
int GetRandomClient(bool HaveRole = true) // Функция за выбор рандомного игрока (HaveRole - выбирать ли тех игроков у которых уже есть роль?)
{
int count; // Кол-во клиентов, которое будет подходить условиям
for(int i = 1; i <= MaxClients; i++) // Цикл по всем возможным клиентам
{
if(IsClientInGame(i)) // Клиент в игре?
{
if(HaveRole && !player_info[i][Role] && !IsFakeClient(i)) // Надо ли выбирать игрока у которого уже есть роль? Игрок с ролью? Это настоящий игрок?
{
count++; // Прибавляем возможное кол-во клиентов на 1
}
else if(!HaveRole && !IsFakeClient(i)) // В ином случае
{
count++; // Прибавляем возможное кол-во клиентов на 1
}
}
}
int random = GetRandomInt(1, count); // Создаем переменную которая выберет нужного игрока
for(int i = 1; i <= MaxClients; i++) // Еще один цикл по всем возможным клиентам
{
if(IsClientInGame(i)) // Клиент в игре?
{
if(HaveRole && !player_info[i][Role] && !IsFakeClient(i)) // Надо ли выбирать игрока у которого уже есть роль? Игрок с ролью? Это настоящий игрок?
{
random--; // Убавляем значение переменной на 1
}
else if(!HaveRole && !IsFakeClient(i)) // В ином случае
{
random--; // Убавляем значение переменной на 1
}
if(random == 0) // Если перебор игроков окончен
{
return i; // Возвращаем нашего рандомного игрока
}
}
}
return 0;
}
C-подобный:
public void Event_RoundStart(Event hEvent, const char[] sEvName, bool bDontBroadcast) // Каллбек события
{
int clients = GetClientsOnServer(); // Создаем переменную с кол-вом игроков на сервере
if(clients) // Если игроки есть на сервере?
{
if(clients >= 3)
{
player_info[GetRandomClient()][Role] = ROLE_SCP173;
}
}
}
C-подобный:
public void OnPluginStart() // Когда плагин стартует
{
HookEvent("round_end", Event_RoundEnd); // Хукаем событие конца раунда
HookEvent("round_start", Event_RoundStart); // Хукаем событие начала раунда
}
C-подобный:
public void Event_RoundEnd(Event hEvent, const char[] sEvName, bool bDontBroadcast) // Каллбек события
{
for(int i = 1; i <= MaxClients; i++) // Цикл по всем возможным клиентам
{
if(IsClientInGame(i)) // Клиент в игре?
{
player_info[i][Role] = NONE; // Обнуляем роль
}
}
}
C-подобный:
public void Event_RoundStart(Event hEvent, const char[] sEvName, bool bDontBroadcast) // Каллбек события
{
int clients = GetClientsOnServer(); // Создаем переменную с кол-вом игроков на сервере
if(clients) // Если игроки есть на сервере?
{
if(clients >= 3)
{
player_info[GetRandomClient()][Role] = ROLE_SCP173;
}
}
for(int i = 1; i <= MaxClients; i++) // Цикл по всем возможным клиентам
{
if(IsClientInGame(i)) // Клиент в игре?
{
if(!player_info[i][Role]) // Клиент имеет роль?
{
player_info[i][Role] = ROLE_D; // Даем роль класса D
}
}
}
}
Дальше нам надо поставить разные спавны клиентам, мы будем использовать данную карту: Клик
Создадим точки спавна для каждой роли:
C-подобный:
float Spawns_D[][] =
{
{3211.904296, -448.181030, 0.031250},
{3210.809570, -320.227081, 0.031250},
{3200.620361, -192.031250, 0.031250},
{3206.063232, -64.046592, 0.031250},
{3215.756103, 63.997200, 0.031250},
{3197.142578, 191.882644, 0.031250},
{3214.819091, 319.860290, 0.031250},
{3196.372314, 831.968750, 0.031250},
{3194.241210, 959.968750, 0.031250},
{3195.770751, 1087.968750, 0.031250}
};
float Spawns_SCP173
{
{1318.366943, 132.984420, 0.031250}
};
C-подобный:
public void OnPluginStart() // Когда плагин стартует
{
HookEvent("round_end", Event_RoundEnd); // Хукаем событие конца раунда
HookEvent("round_start", Event_RoundStart); // Хукаем событие начала раунда
HookEvent("player_spawn", Event_PlayerSpawn); // Хукаем событие начала раунда
}
public void Event_PlayerSpawn(Event hEvent, const char[] sEvName, bool bDontBroadcast) // Каллбек события
{
int client = GetClientOfUserId(hEvent.GetInt("userid")); // Получаем клиент игрока, который зареспавнился
if(!player_info[client][Role]) // Если у игрока нету роли
{
player_info[client][Role] = ROLE_D; // Выдаем роль D-Класса
}
int random; // Создаем переменную для случайного спавна
switch(player_info[client][Role]) // Рассматриваем варианты ролей клиента
{
case ROLE_D: // Если роль Д-Класса
{
random = GetRandomInt(0, sizeof(Spawns_D) - 1); // Выбираем рандомный спавн
TeleportEntity(client, Spawns_D[random], NULL_VECTOR, NULL_VECTOR); // Телепортируем клиента на спавн
}
case ROLE_SCP173: // Если роль SCP-173
{
random = GetRandomInt(0, sizeof(Spawns_SCP173) - 1); // Выбираем рандомный спавн
TeleportEntity(client, Spawns_SCP173[random], NULL_VECTOR, NULL_VECTOR); // Телепортируем клиента на спавн
}
}
}
Первый урок на сегодня окончивается, в следующем будем делать функционал SCP и добавлять результат игры
Выслушаю любую критику)
Свои пожелания можете писать ниже
Также приложу код, который должен был получиться
Вложения
Последнее редактирование: