Перейти к содержанию

Оповещение о подключении игрока для L4D2


ryancoolround
Перейти к решению Решено Shadow,

Рекомендуемые сообщения

  • Администратор

20200504203306_1.jpg

Начнем с того, что таких плагинов для Left 4 Dead 2 в сети лежит 1000 и 1 штука. Но этот скрипт я писал сам, для обучения. И поэтому можно разобрать здесь его. Ну а вы меня отругаете, или все переделаете на свой лад. 🖖 Итак, сам код (Кстати, на версии Sourcemod 1.10.6460 он компилируется без проблем):

#pragma semicolon 1
#include <sourcemod>
#include <sdktools>
#include <geoip>

#pragma tabsize 0

new Handle:h_connectmsg = INVALID_HANDLE;

public Plugin:myinfo = 
{
	name = "Анонс о подключении",
	author = "L4D2Noob.ru Dr.Lex",
	description = "Сообщает в чате о присоединении игрока",
	version = "1.6",
	url = "https://l4d2noob.ru/"
};

public OnPluginStart()
{	
	h_connectmsg = CreateConVar("sm_connectmsg", "1", "Показывает сообщение о подключении в чате, когда игрок присоединяется.", FCVAR_NOTIFY | FCVAR_DONTRECORD);
}

public OnClientPutInServer(client)
{
 if (!IsFakeClient(client))
 {
	 new Connect = GetConVarInt(h_connectmsg);
	 if(Connect == 1)
	 {
		 new String:name[99], String:authid[99], String:IP[99], String:Country[99];
		
		 GetClientName(client, name, sizeof(name));
		
		 GetClientAuthId(client, AuthId_Steam2, authid, sizeof(authid));
		
		 GetClientIP(client, IP, sizeof(IP), true);
		
     if(!GeoipCountry(IP, Country, sizeof Country))
     {
         Country = "Неизвестный Регион";
     }
     if (CheckCommandAccess(client, "sm_admin", ADMFLAG_GENERIC, true))
    	 return;
    
         PrintToChatAll ("\x04[L4D2Noob]: \x05 Игрок \x04%s \x05 вошел на сервер", name);
         PrintToChatAll ("\x04[L4D2Noob] \x05 SteamID: \x04[%s]",authid);
         PrintToChatAll ("\x04[L4D2Noob] \x05 Локация: \x04%s", Country);
        
     } else {
  
    CloseHandle(h_connectmsg);
    }
 }
}

Давайте разберемся с проблемами, которые возникли у меня при создании. Но опять таки, благодаря @dr.lex их удалось решить.

PrintToChatAll ("\x04[L4D2Noob]: \x05 Игрок \x04%s \x05 вошел на сервер", name);
PrintToChatAll ("\x04[L4D2Noob] \x05 SteamID: \x04[%s]",authid);
PrintToChatAll ("\x04[L4D2Noob] \x05 Локация: \x04%s", Country);

Почему то не хотели отображаться цветные сообщения в игре. Оказалось, что виноват символ "»". Что очень странно, ведь в предыдущем моем творении, он исправно работал.

Но как только я убрал этот символ, цвета в чате стали отображаться. Кстати, благодаря этому я понял почему @dr.lex ругал меня за #include <colors> в той теме. Оказывается что это подключение отвечает за отображение дополнительных, подключаемых цветов, которые выводятся как {green} или {lightgreen}, и что если ты используешь стандартные цвета типа \x04, то это подключение не нужно.

Кстати, надо запомнить, что CPrintToChatAll = {green}, а PrintToChatAll = \x04.

Дальше я столкнулся со следующей бедой, это отображение спавна ботов в этом оповещении. То есть плагин считал каждого появившегося бота, как подключившегося игрока. Из за этого в чате игры возникал бесконечный спам. Что бы этого не было, и плагин говорил только о настоящих игроках, нам следующие строки:

new Connect = GetConVarInt(h_connectmsg);
	 if(Connect == 1)
	 {
		 new String:name[99], String:authid[99], String:IP[99], String:Country[99];
		
		 GetClientName(client, name, sizeof(name));
		
		 GetClientAuthId(client, AuthId_Steam2, authid, sizeof(authid));
		
		 GetClientIP(client, IP, sizeof(IP), true);
		
     if(!GeoipCountry(IP, Country, sizeof Country))
     {
         Country = "Неизвестный Регион";
     }
     if (CheckCommandAccess(client, "sm_admin", ADMFLAG_GENERIC, true))
    	 return;
    
         PrintToChatAll ("\x04[L4D2Noob]: \x05 Игрок \x04%s \x05 вошел на сервер", name);
         PrintToChatAll ("\x04[L4D2Noob] \x05 SteamID: \x04[%s]",authid);
         PrintToChatAll ("\x04[L4D2Noob] \x05 Локация: \x04%s", Country);
        
     } else {
  
    CloseHandle(h_connectmsg);
    }

Надо просто было поместить в следующий оператор (Не знаю правильно ли я это назвал, но проект не просто так называется l4d2NOOB😞

if (!IsFakeClient(client))
 {
  Поместить сюда
 }

По итогу все. Как может показаться, что это мелочь, но на эту мелочь у меня ушло часа 2,5.

Мир изменился, он стал другим!

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...
  • Ответов 60
  • Создана
  • Последний ответ

Топ авторов темы

  • 1 месяц спустя...
  • 1 месяц спустя...
  • Администратор
07.07.2020 в 01:34, BLOODY BLADE сказал:

Я попробовал, не хочет воспроизводится звук. Не в какую... Что я уже не делал со своими знаниями. Сам код довел уже до такого состояния:

#pragma semicolon 1
#pragma newdecls required
#include <sourcemod>
#include <sdktools>
#include <geoip>

#define Join "ambient\tones\elev1.wav"

ConVar h_connectmsg, h_connectsound;

public Plugin myinfo = 
{
	name = "Анонс о подключении",
	author = "L4D2Noob.ru, Dr.Lex; Модификация - Blode Blade",
	description = "Сообщает в чате о присоединении игрока",
	version = "1.8",
	url = "https://l4d2noob.ru/"
};

public void OnPluginStart()
{
	h_connectmsg = CreateConVar("sm_connectmsg", "1", "Показывать сообщение в чате, при подключении игрока?", FCVAR_NOTIFY);
	h_connectsound = CreateConVar("sm_connectsound", "1", "Воспроизводить звук, при подключении игрока?", FCVAR_NOTIFY);
}

public void OnMapStart()
{
	PrecacheSound(Join, true);
}

public void OnClientPutInServer(int client)
{
    if (!IsFakeClient(client) && h_connectmsg.IntValue == 1)
    {
        char name[99], authid[99], IP[99], Country[99];
        GetClientName(client, name, sizeof(name));
        GetClientAuthId(client, AuthId_Steam2, authid, sizeof(authid));
        GetClientIP(client, IP, sizeof(IP), true);

        if(!GeoipCountry(IP, Country, sizeof Country))
            Country = "Неизвестный Регион";

        if (CheckCommandAccess(client, "sm_admin", ADMFLAG_GENERIC, true))
            return;

        if (h_connectsound.IntValue == 1)
            EmitSoundToClient(client, Join);

        PrintToChatAll ("\x03********************************************************");
        PrintToChatAll ("\x03* \x04[L4D2Noob]\x01: \x05Игрок \x04%s \x05вошел на сервер     \x03*", name);
        PrintToChatAll ("\x03* \x04[L4D2Noob]\x01: \x05SteamID\x01: \x04[%s]                \x03*", authid);
        PrintToChatAll ("\x03* \x04[L4D2Noob]\x01: \x05Локация\x01: \x04%s                  \x03*", Country);
        PrintToChatAll ("\x03********************************************************");
    }
}

Звук не хочет играть и все тут.

Мир изменился, он стал другим!

Ссылка на комментарий
Поделиться на другие сайты

10 часов назад, Ryancoolround сказал:

Я попробовал, не хочет воспроизводится звук. Не в какую... Что я уже не делал со своими знаниями. Сам код довел уже до такого состояния:


#pragma semicolon 1
#pragma newdecls required
#include <sourcemod>
#include <sdktools>
#include <geoip>

#define Join "ambient\tones\elev1.wav"

ConVar h_connectmsg, h_connectsound;

public Plugin myinfo = 
{
	name = "Анонс о подключении",
	author = "L4D2Noob.ru, Dr.Lex; Модификация - Blode Blade",
	description = "Сообщает в чате о присоединении игрока",
	version = "1.8",
	url = "https://l4d2noob.ru/"
};

public void OnPluginStart()
{
	h_connectmsg = CreateConVar("sm_connectmsg", "1", "Показывать сообщение в чате, при подключении игрока?", FCVAR_NOTIFY);
	h_connectsound = CreateConVar("sm_connectsound", "1", "Воспроизводить звук, при подключении игрока?", FCVAR_NOTIFY);
}

public void OnMapStart()
{
	PrecacheSound(Join, true);
}

public void OnClientPutInServer(int client)
{
    if (!IsFakeClient(client) && h_connectmsg.IntValue == 1)
    {
        char name[99], authid[99], IP[99], Country[99];
        GetClientName(client, name, sizeof(name));
        GetClientAuthId(client, AuthId_Steam2, authid, sizeof(authid));
        GetClientIP(client, IP, sizeof(IP), true);

        if(!GeoipCountry(IP, Country, sizeof Country))
            Country = "Неизвестный Регион";

        if (CheckCommandAccess(client, "sm_admin", ADMFLAG_GENERIC, true))
            return;

        if (h_connectsound.IntValue == 1)
            EmitSoundToClient(client, Join);

        PrintToChatAll ("\x03********************************************************");
        PrintToChatAll ("\x03* \x04[L4D2Noob]\x01: \x05Игрок \x04%s \x05вошел на сервер     \x03*", name);
        PrintToChatAll ("\x03* \x04[L4D2Noob]\x01: \x05SteamID\x01: \x04[%s]                \x03*", authid);
        PrintToChatAll ("\x03* \x04[L4D2Noob]\x01: \x05Локация\x01: \x04%s                  \x03*", Country);
        PrintToChatAll ("\x03********************************************************");
    }
}

Звук не хочет играть и все тут.

Т.к. эта версия имеет поддержку использования кастомных звуков, то звук должен находиться на сервере. В случае, со звуком из архива, путь до звука: left4dead2\sound\ambient\tones . Данный звук стандартный для l4d2, потому, уже присутствует у игроков по данному же пути.

Ссылка на комментарий
Поделиться на другие сайты

10 часов назад, Ryancoolround сказал:

Я попробовал, не хочет воспроизводится звук. Не в какую... Что я уже не делал со своими знаниями. Сам код довел уже до такого состояния:


#pragma semicolon 1
#pragma newdecls required
#include <sourcemod>
#include <sdktools>
#include <geoip>

#define Join "ambient\tones\elev1.wav"

ConVar h_connectmsg, h_connectsound;

public Plugin myinfo = 
{
	name = "Анонс о подключении",
	author = "L4D2Noob.ru, Dr.Lex; Модификация - Blode Blade",
	description = "Сообщает в чате о присоединении игрока",
	version = "1.8",
	url = "https://l4d2noob.ru/"
};

public void OnPluginStart()
{
	h_connectmsg = CreateConVar("sm_connectmsg", "1", "Показывать сообщение в чате, при подключении игрока?", FCVAR_NOTIFY);
	h_connectsound = CreateConVar("sm_connectsound", "1", "Воспроизводить звук, при подключении игрока?", FCVAR_NOTIFY);
}

public void OnMapStart()
{
	PrecacheSound(Join, true);
}

public void OnClientPutInServer(int client)
{
    if (!IsFakeClient(client) && h_connectmsg.IntValue == 1)
    {
        char name[99], authid[99], IP[99], Country[99];
        GetClientName(client, name, sizeof(name));
        GetClientAuthId(client, AuthId_Steam2, authid, sizeof(authid));
        GetClientIP(client, IP, sizeof(IP), true);

        if(!GeoipCountry(IP, Country, sizeof Country))
            Country = "Неизвестный Регион";

        if (CheckCommandAccess(client, "sm_admin", ADMFLAG_GENERIC, true))
            return;

        if (h_connectsound.IntValue == 1)
            EmitSoundToClient(client, Join);

        PrintToChatAll ("\x03********************************************************");
        PrintToChatAll ("\x03* \x04[L4D2Noob]\x01: \x05Игрок \x04%s \x05вошел на сервер     \x03*", name);
        PrintToChatAll ("\x03* \x04[L4D2Noob]\x01: \x05SteamID\x01: \x04[%s]                \x03*", authid);
        PrintToChatAll ("\x03* \x04[L4D2Noob]\x01: \x05Локация\x01: \x04%s                  \x03*", Country);
        PrintToChatAll ("\x03********************************************************");
    }
}

Звук не хочет играть и все тут.

Замени EmitSoundToClient(client, Join); на ClientCommand(client, "play Join");

Прекеш звука в таком случае, не используется. Будет работать со стандартными звуками(без наличия самого звука на сервере), что уже имеются у клиентов по умолчанию.

Ссылка на комментарий
Поделиться на другие сайты

  • Администратор
10 часов назад, Ryancoolround сказал:

#define Join "ambient\tones\elev1.wav"

Все проще оказалось. Во всем виноват символ "\". Поменял на "/", все заработало. Спасибо!

Мир изменился, он стал другим!

Ссылка на комментарий
Поделиться на другие сайты

  • Администратор
  • В скомпилированном файле тег [L4D2Noob] заменен на [СЕРВЕР]. Можно скачать, и сразу использовать. Лишней рекламы не будет.
  • Файл .smx компилировался на версии SM 1.10.0.6492
  • Файл .sp идеально компилируется на версии SM 1.10.0.6492
  • Если ищете где отредактировать тег [СЕРВЕР], то это 50, 51 и 52 строки


Стандартный звук для L4D2 можно на сервер не загружать, так как:

28 минут назад, BLOODY BLADE сказал:

Данный звук стандартный для l4d2, потому, уже присутствует у игроков по данному же пути.

Другие звуки, в других модах придется загружать на сервер, и при этом не забывать обновлять контент хостинг. (Да пишу по нубски, я нуб, на таких как я рассчитан этот сайт).

Соответственно, если вы загружаете другой звук, то в скрипте, в 7 строке, надо указать, что звук изменен:

#define Join "ambient/tones/elev1.wav"

 

Connect_Announce.smx Connect_Announce.sp

Мир изменился, он стал другим!

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...
  • Администратор

Изменения 2.0:

  • Блок объявления сделал компактнее
  • Добавил проверку на ADMFLAG_ROOT (Проверка сообщит, если на сервер зашел Гл. Админ)
Скрытый текст

20200917152953_1.jpg

 

Connect_Announce.smx Connect_Announce.sp

Мир изменился, он стал другим!

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...
17.09.2020 в 16:57, BLOODY BLADE сказал:

Упростил. OnClientPostAdminCheck здесь не нужен, чтобы узнать админ права.

Connect_Announce.sp 2 kB · 9 скачиваний

Работает спасибо! То что надо

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...
  • Администратор
Только что, Shadow сказал:

В left 4dead 2 не определяет админа 

Определяет. Я делал его именно в L4D2 тестируя. Просто у тебя наверно что то не так.

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

Кстати не работает моя версия или версия @BLOODY BLADE? Попробуй обе.

Мир изменился, он стал другим!

Ссылка на комментарий
Поделиться на другие сайты

  • Решение
3 минуты назад, Ryancoolround сказал:

Определяет. Я делал его именно в L4D2 тестируя. Просто у тебя наверно что то не так.

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

Кстати не работает моя версия или версия @BLOODY BLADE? Попробуй обе.

Надо было сразу обе проверить -_-
Твоя версия отлично работает, а от  @BLOODY BLADE не определяет админа.

Ссылка на комментарий
Поделиться на другие сайты

  • Администратор
1 минуту назад, Shadow сказал:

Надо было сразу обе проверить -_-
Твоя версия отлично работает, а от  @BLOODY BLADE не определяет админа.

Ну и славно что все так быстро решилось, удалю напоминание у себя на телефоне тогда. А @BLOODY BLADE, он очень редко заходит, но заходит, когда придет обязательно поправит свой плагин, я уверен.

Мир изменился, он стал другим!

Ссылка на комментарий
Поделиться на другие сайты

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Лучшие авторы

    На этой неделе никто репутацию не получал

  • Последние достижения

    • Blacky получил значок
      Подмастерье
    • GAMADA повысил звание
      Lvl 1
    • Darya повысил звание
      Lvl 14
    • Mad.Eagle повысил звание
      Lvl 5
    • Mad.Eagle повысил звание
      Lvl 4
×
×
  • Создать...