Reklama

Статус
Закрыто для дальнейших ответов.
Сообщения
10
Реакции
0
Ошибка
[Reklama] Error! Wrong message ID #0 (Total: 2)
AMX Mod X
AMX Mod X 1.9.0.5294 (http://www.amxmodx.org)
Билд сервера
Protocol version 48
Exe version 1.1.2.7/Stdio (cstrike)
ReHLDS version: 3.14.0.857-dev
Build date: 19:52:21 Mar 27 2025 (4002)
Build from: https://github.com/rehlds/ReHLDS/commit/89958d3
ReGameDLL
ReGameDLL version: 5.28.0.756-dev
Build date: 19:19:31 Mar 27 2025
Build from: https://github.com/rehlds/ReGameDLL_CS/commit/96b2ef2
Metamod версия
Metamod-r v1.3.0.149
Metamod плагины
[ 1] SafeNameAndChat       RUN   -    SafeNameAndChat.so          v1.2 Beta 3      ini  ANY   ANY
[ 2] Reunion RUN - reunion_mm_i386.so v0.2.0.25 ini Start Never
[ 3] VoiceTranscoder RUN - VoiceTranscoder.so v2017RC5 ini ANY ANY
[ 4] Rechecker RUN - rechecker_mm_i386.so v2.5 ini Chlvl ANY
[ 5] ReSemiclip RUN - resemiclip_mm_i386.so v2.4.3 ini Chlvl ANY
[ 6] HitBox Fix RUN - hitbox_fix_mm_i386.so v2.0.3 ini Start ANY
[ 7] AMX Mod X RUN - amxmodx_mm_i386.so v1.9.0.5294 ini Start ANY
[ 8] Ultimate Unprecacher RUN - unprecacher.so vBeta 2.5.3 ini Chlvl Chlvl
[ 9] FakeMeta RUN - fakemeta_amxx_i386.so v1.9.0.5294 pl7 ANY ANY
[10] CStrike RUN - cstrike_amxx_i386.so v1.9.0.5294 pl7 ANY ANY
[11] CSX RUN - csx_amxx_i386.so v1.9.0.5294 pl7 ANY ANY
[12] ReAPI RUN - reapi_amxx_i386.so v5.26.0.338-dev pl7 ANY Never
[13] MySQL RUN - mysql_amxx_i386.so v1.9.0.5294 pl7 ANY ANY
[14] Engine RUN - engine_amxx_i386.so v1.9.0.5294 pl7 ANY ANY
[15] ReAimDetector RUN - reaimdetector_amxx_i386.so v0.2.2 pl7 ANY Never
[16] SQLite RUN - sqlite_amxx_i386.so v1.9.0.5294 pl7 ANY ANY
[17] Ham Sandwich RUN - hamsandwich_amxx_i386.so v1.9.0.5294 pl7 ANY ANY
[18] GeoIP RUN - geoip_amxx_i386.so v1.9.0.5294 pl7 ANY ANY
[19] hackdetector RUN - hackdetector_amxx_i386.so v0.15.328.lite pl7 ANY ANY
Список плагинов
[  1] Admin Base              1.9.0.5294  AMXX Dev Team     admin.amxx       running
[ 2] Admin Commands 1.9.0.5294 AMXX Dev Team admincmd.amxx running
[ 3] Admin Help 1.9.0.5294 AMXX Dev Team adminhelp.amxx running
[ 4] Slots Reservation 1.9.0.5294 AMXX Dev Team adminslots.amxx running
[ 5] Multi-Lingual System 1.9.0.5294 AMXX Dev Team multilingual.am running
[ 6] Commands Menu 1.9.0.5294 AMXX Dev Team cmdmenu.amxx running
[ 7] Players Menu 1.9.0.5294 AMXX Dev Team plmenu.amxx running
[ 8] Teleport Menu 1.9.0.5294 AMXX Dev Team telemenu.amxx running
[ 9] Maps Menu 1.9.0.5294 AMXX Dev Team mapsmenu.amxx running
[ 10] Plugin Menu 1.9.0.5294 AMXX Dev Team pluginmenu.amxx running
[ 11] Admin Chat 1.9.0.5294 AMXX Dev Team adminchat.amxx running
[ 12] Anti Flood 1.9.0.5294 AMXX Dev Team antiflood.amxx running
[ 13] Admin Votes 1.9.0.5294 AMXX Dev Team adminvote.amxx running
[ 14] Pause Plugins 1.9.0.5294 AMXX Dev Team pausecfg.amxx running
[ 15] Stats Configuration 1.9.0.5294 AMXX Dev Team statscfg.amxx running
[ 16] CS Misc. Stats 1.9.0.5294 AMXX Dev Team miscstats.amxx running
[ 17] [RE] Talisman 1.5 BiZaJe talisman.amxx running
[ 18] [RE] Talisman Health 1.5 BiZaJe talisman_health running
[ 19] [RE] Talisman HUD 1.5 BiZaJe talisman_hud.am running
[ 20] Advanced Experience Sy 0.5.9 [REA serfreeman1337/s aes_main.amxx running
[ 21] AES: StatsX 0.5+1 serfreeman1337 aes_statsx_cstr running
[ 22] AES: CStrike Addon 0.5.9 [REA serfreeman1337/s aes_exp_cstrike running
[ 23] AES: Informer 0.5.9 [REA serfreeman1337/s aes_informer.am debug
[ 24] AES: Admin Tools 0.5.9 [REA serfreeman1337/s aes_exp_editor. running
[ 25] AES: Bonus System 0.5.9 Vega serfreeman1337/s aes_bonus_syste running
[ 26] AES: Bonus CSTRIKE 0.5.9.1 [R serfreeman1337/s aes_bonus_cstri running
[ 27] ExItem: Respawn 1.1 mx?! exitem_respawn. running
[ 28] Custom Player Models A 0.2.7 F@nt0M & BlackSi custom_player_m running
[ 29] Custom Player Models C 0.2.3 BlackSignature custom_player_m running
[ 30] Custom Player Models T 0.2.1 BlackSignature custom_player_m running
[ 31] Team Select 1.6.0 F@nt0M teamselect.amxx running
[ 32] C4 Timer 0.1 Lightman bombtimer.amxx running
[ 33] ReAimDetector API 0.2.2 ReHLDS Team reaimdetector.a running
[ 34] [ReAPI] Parachute 1.1 ReHLDS Team reapi_parachute running
[ 35] Frags Counter 1.0 CHEL74 frags_counter.a running
[ 36] Chat Manager 1.1.2-16 Mistrick chatmanager.amx running
[ 37] Chat Manager: Addon 0.0.4-70 Mistrick chatmanager_add running
[ 38] Lite Auto Restart 1.0 CHEL74 lite_auto_resta running
[ 39] [ReAPI] Ghost after de 0.0.2 steelzzz ghost.amxx running
[ 40] Ping Control 1.5 mx?! ping_control.am running
[ 41] Top Round Damage 1.0.5 ReAP Dager* *.* -G- top_round_damag running
[ 42] Quick Defuse Bomb 0.0.2 Albertio quick_defuse_bo running
[ 43] C4 CD Voice 1.1 TTuCTOH c4cdvoice.amxx running
[ 44] Safe Userinfo 1.0.4 the_hunter safe_userinfo.a running
[ 45] CSStatsX SQL 0.7.4+2 serfreeman1337 csstatsx_sql.am running
[ 46] HPP_BLOCK 1.2 Karaulov hpp_blocker.amx running
[ 47] Demo Recorder 1.2 mx?! DemoRecorder.am running
[ 48] Steam Bonus 1.0 Will_be steam_bonus.amx running
[ 49] Advanced Vampire 1.1 mx?! advanced_vampir running
[ 50] Block Change Name 1.0 DJ_WEST block_change_na running
[ 51] Coins Collector 1.0.2f Baton4ik48 + mx? coins_collector running
[ 52] Reklama 01.06.2025 mx?! reklama.amxx running
[ 53] Simple Damager 2.1.0 fl0wer simple_damager. running
[ 54] GameName Changer 1.0 mx?! re_gamename.amx running
[ 55] resetscore(ReAPI) 1.0 Phantom resetscore.amxx running
[ 56] AFK Control 1.1 mx?! afk_control.amx running
[ 57] VIP System 2.1.1 Emma Jule vip.amxx running
[ 58] BLOCK FAKE STEAMID 1.6 Karaulov block_fake_stea running
[ 59] Menu System 0.1.2f serfreeman1337 menuSystem.amxx running
[ 60] Yet Another Voteban 1.8 AndrewZ/voed yet_another_vot running
[ 61] Trial Access 1.0.2 mx?! trial_access.am running
[ 62] [GeoIP] Connect Info 1.0.0 Nordic Warrior geoip_connect_i running
[ 63] [Customizable] AmxModM 0.0.5 Albertio amxmodmenu.amxx running
[ 64] Killer ScreenFade 0.0.5 Vaqtincha reapi_killer_sc running
[ 65] FreshBans 1.4.8b kanagava fresh_bans.amxx running
[ 66] Admin Loader 3.5 neygomon admin_loader.am running
[ 67] [GM] AntiAdv 0.0.2 [GM] NWC gm_antiadv.amxx running
[ 68] Spectator Bot 1.2.2(bata b0t. SpectatorBot.am running
[ 69] Unreal Cheater Cry 1.7 Karaulov unreal_cheater_ running
[ 70] recoil_manager 1.0.0 fl0wer recoil_manager. running
[ 71] Top Awards 1.2.0 szawesome top_awards.amxx running
[ 72] Team Score 1.1.0 so1l & Radius team_score.amxx running
[ 73] Molotov Grenade 1.0.3-fix medusa molotov_grenade running
[ 74] HackDetector 0.15.lite Lev @ AGHL.RU De hackdetector.am running
[ 75] [190] Block Reconnect 20.06.06 ShaTalKiN Block_Reconnect running
[ 76] Restrict Weapons 20.06.06 SKAJIbnEJIb & AM restmenu_rbs.am running
[ 77] ChatAdditions: Core v1.9.4 Sergey Shorokhov ChatAdditions_C debug
[ 78] ChatAdditions: GameCMS v1.9.3 Sergey Shorokhov CA_Storage_Game debug
[ 79] CA: Mute v1.9.4 Sergey Shorokhov CA_Mute.amxx debug
[ 80] CA Addon: Request UnGA v1.9.4 steelzzz CA_Addon_Reques debug
[ 81] CA: Gag v1.9.4 Sergey Shorokhov CA_Gag.amxx debug
[ 82] Map Manager: Core 3.2.0-0cb1 Mistrick map_manager_cor running
[ 83] Map Manager: Scheduler 0.2.1-0cb1 Mistrick map_manager_sch running
[ 84] Map Manager: Rtv 0.1.5-0cb1 Mistrick map_manager_rtv running
[ 85] Map Manager: Nominatio 0.3.5-0cb1 Mistrick map_manager_nom running
[ 86] Map Manager: BlockList 0.0.4-0cb1 Mistrick map_manager_blo running
[ 87] Map Manager: Online so 0.0.4-0cb1 Mistrick map_manager_onl running
[ 88] Map Manager: Effects 0.1.3-0cb1 Mistrick map_manager_eff running
[ 89] Map Manager: Informer 0.0.5-0cb1 Mistrick map_manager_inf running
[ 90] Map Manager: Sounds 0.0.3-0cb1 Mistrick map_manager_sou running
[ 91] Map Manager: Priority 0.0.2-0cb1 Mistrick map_manager_pri running
[ 92] Map Manager: Online ch 1.0.2-0cb1 Sergey Shorokhov map_manager_onl running
Исходный код плагина
C-подобный:
/*
	Plugin: 'Reklama'

	Plugin author: http://t.me/blacksignature / https://dev-cs.ru/members/1111/

	Plugin thread: https://dev-cs.ru/resources/435/

	Description:
		This plugin allows you to:
			* Advertise - display predefined chat messages to all with a specified frequency.
			* Autorespond - reply to certain player chat messages with predefined chat messages.

		Supported features:
			* ML keys and wildcard patterns (see 'Setup' section in plugin thread)
			* Colored messages
			* Mode-based (by cvar value) message output
			* Random start position
			* Random delay between message output
			* Multiple messages at once (multi-output)
			* Sounds
			* 'On-the-fly' Config reloading
			* Players can disable messages for themselves

	Credits:
		* wopox1337 -> https://dev-cs.ru/members/4/
		* fantom -> https://dev-cs.ru/members/16/
		* Thx to all who helps me with ideas and bugreports

	Requirements:
		* Amx Mod X 1.9 - build 5241, or higher

	How to use:
		1) Install this plugin
		2) Tweak 'reklama.ini' config
		3) Run plugin
		4) Visit 'configs/plugins' to tweak config
		5) Change map to reload config
		6) Enjoy!

		NOTE: It's recomended to place this plugin in 'plugins.ini' above your chat manager

	Change history:
		29.03.2018:
			* Initial public release
		06.04.2018:
			Added:
				* Cvar 'reklama_freq'
			Removed:
				* Command 'reklama_mode'
				* Initialization delay
			Fixed:
				* Minor bugfixes
		29.11.2018:
			Added:
				* Cvar 'reklama_for_all'
				* Cvar 'reklama_mode'
				* Ability to disable messages ('say /reklama')
				* Option 'CHAT_PREFIX'
			Changed:
				* Config structure -> added argument 'mode'
		29.11.2018 v2:
			Added:
				* Autoresponder
		30.11.2018:
			Added:
				* Option 'CMD_BLOCK_AUTORESPOND'
				* Option 'RANDOM_FREQ'
				* Option 'USE_SOUND'
			Changed:
				* client_cmd() -> SendAudio()
				* Sound 'ambience/warn1' replaced with 'buttons/button2'
			Removed;
				* Option 'USE_PRECACHE'
		30.11.2018 v2:
			Fixed:
				* Critical bugfix. Thx zhorzh78 [ https://dev-cs.ru/members/326/ ]
		09.07.2019:
			Added:
				* Wildcard patterns support
				* ML-keys support for config messages
			Changed:
				* Divider '|' for autoresponder pattern, with you can set multiple patterns for one message
				* Config format -> added argument 'compare'
				* Changed config description
				* Config description moved to separate file
				* Dictionary was updated (only key 'REKLAMA_KEY_1')
			Removed:
				* Old AMXX versions support. From now plugin requires AMXX 190+
		16.03.2020:
			Fixed:
				* Autoresponder compatibility with various chat managers based on 'say' hooking
		20.05.2020:
			Fixed:
				* Error prevention, if last row refers to next non-existent row (multi-row messages)
				* Handling situation, when all rows are 'autorespond only'
		30.05.2025:
			* Added:
				* Ability to set autoconfig filename (value for AUTO_CFG)
				* Ability to define hud messages (type 4 and 5; read reklama_syntax_EN.txt)
					* Added cvar reklama_hud_settings
			* Changed:
				* client_authorized() -> client_putinserver()
				* Remove unnesesary stocks and publics
				* Minor logic improvements
			* Fixed:
				* Wrong applied cvar values from autocfg due to setting task in plugin_cfg()
		31.05.2025:
			* Added:
				* Separate cvar reklama_for_all_hud for hud messages
			* Changed:
				* Cvar reklama_for_all renamed to reklama_for_all_chat so now we got two separate cvars for two types of messages
		01.06.2025:
			* Fix reklama_hud_settings cvar description
*/

new const PLUGIN_DATE[] = "01.06.2025"

/* ---------------------- SETTINGS START ---------------------- */

// Create cvar config in 'amxmodx/configs/plugins', and execute it?
// Value is the name of the config without .cfg extention.
// Leave it as "" to use default naming (will be "plugin-%plugin_name%.cfg")
#define AUTO_CFG ""

// Hide messages that triggers autoresponder?
// NOTE: It's recomended to place plugin in 'plugins.ini' above your chat manager
#define BLOCK_TRIGGER_MSG

// Allow players to disable messages?
#define CMD_NAME "say /reklama"

// Whether to disable the autoresponder when player personally disable messages
#define CMD_BLOCK_AUTORESPOND

// Prune vault records oldier than this value (in days)
#define OBSOLETE_DAYS 30

// Initialization delay
#define INIT_DELAY 3.5

// Chat prefix
new const CHAT_PREFIX[] = "" // without prefix
//new const CHAT_PREFIX[] = "^4* "
//new const CHAT_PREFIX[] = "^1[^3Инфо^1] "
//new const CHAT_PREFIX[] = "^1[^4Reklama^1] "

// Use prefix for adverts?
//#define SHOW_PREFIX_WITH_ADS

// Random start position. Useful when you have large config.
// NOTE: Don't forget to set type '2' or '3' for those messages, with you do not want to start
//#define RANDOM_START

// Config file name (in 'amxmodx/configs')
new const ADS_FILE_NAME[] = "reklama.ini"

// Lang file name (in 'amxmodx/data/lang')
new const LANG_NAME[] = "reklama.txt"

// Vault name (in 'amxmodx/data/vault')
stock const VAULT_NAME[] = "reklama"

/* --- SOUND SETTINGS --- */

// Sound support ability
#define USE_SOUND

// Sounds
stock const g_szSounds[][] = {
/* 0 */ "buttons/blip1.wav",
/* 1 */ "buttons/blip2.wav",
/* 2 */ "events/tutor_msg.wav",
/* 3 */ "buttons/button2.wav",
/* 4 */ "buttons/bell1.wav",
/* 5 */ "buttons/button3.wav",
/* 6 */ "buttons/button7.wav",
/* 7 */ "buttons/button9.wav",
/* 8 */ "plats/elevbell1.wav",
/* 9 */ "plats/train_use1.wav",
/* 10 */ "x/x_shoot1.wav"
}

/* ---------------------- SETTINGS END ---------------------- */

#include <amxmodx>
#include <amxmisc>
#include <time>

#if defined CMD_NAME
	#include <nvault>
#endif

#define chx charsmax
#define chx_len(%0) charsmax(%0) - iLen

#define CheckPatternBit(%0) (g_eMsgData[MSG_PATTERN_BITSUM] & (1<<%0))
#define SetPatternBit(%0) (g_eMsgData[MSG_PATTERN_BITSUM] |= (1<<%0))

#define MODE_AUTO false
#define MODE_MANUAL true

#define MSG_LEN 191
#define TEMPLATE_LEN 191

new const PLUGIN_PREFIX[] = "[Reklama]"

new const SOUND__BLIP1[] = "sound/buttons/blip1.wav"

const TASKID_TIMER = 1337

enum _:CVAR_ENUM {
	Float:CVAR__FREQ_MIN,
	Float:CVAR__FREQ_MAX,
	CVAR__FOR_ALL_CHAT,
	CVAR__FOR_ALL_HUD,
	CVAR__MODE,
	CVAR__SOUND_FOR_ALL,
	CVAR__HUD_SETTINGS[32]
}

enum _:MSG_STRUCT {
	MSG_BODY[MSG_LEN],
	MSG_COLOR_ID,
	bool:IS_MULTI_MSG,
	MSG_SOUND_ID,
	bool:NOT_FOR_START,
	MSG_TYPE,
	MSG_MODE,
	bool:AUTORESPOND_ONLY,
	bool:MSG_IS_LANG_KEY,
	MSG_PATTERN_BITSUM
}

enum _:AR_STRUCT {
	AR_MODE,
	POINTER,
	TEMPLATE[TEMPLATE_LEN]
}

enum {
	AR_MODE__EX_INSENS,
	AR_MODE__EX_SENS,
	AR_MODE__MATCH_INSENS,
	AR_MODE__MATCH_SENS
}

enum _:PATTERNS_ENUM {
	PATTERN__HOSTNAME,
	PATTERN__MAXPLAYERS,
	PATTERN__NUMPLAYERS,
	PATTERN__SERVER_IP,
	PATTERN__MAPNAME,
	PATTERN__SV_CONTACT,
	PATTERN__TIMELEFT,
	PATTERN__PLAYER_NAME,
	PATTERN__PLAYER_STEAMID,
	PATTERN__PLAYER_IP
}

enum {
	TYPE__CHAT_DEFAULT,
	TYPE__CHAT_WITH_NEXT,
	TYPE__CHAT_WITH_NEXT_NOT_FOR_START,
	TYPE__CHAT_NOT_FOR_START,
	TYPE__HUD,
	TYPE__HUD_NOT_FOR_START
}

enum { // values for channel arg, from cvar 'reklama_hud_settings'
	CHANNEL__DHUD = -1,
	CHANNEL__AUTOSELECT = 0
}

new const PATTERNS[PATTERNS_ENUM][] = {
	"#hostname#",
	"#maxplayers#",
	"#numplayers#",
	"#server_ip#",
	"#mapname#",
	"#contact#",
	"#timeleft#",
	"#name#",
	"#steamid#",
	"#ip#"
}

new g_eCvar[CVAR_ENUM]
new Array:g_aMsgArray
new Array:g_aAuReArray
new g_eMsgData[MSG_STRUCT]
new g_AuReData[AR_STRUCT]
new g_iTotalMsgCount
new g_iAuReCount
new	g_iCurPos
new g_iFirstSkipPos
new g_szFilePath[PLATFORM_MAX_PATH]
new g_szBuffer[MAX_AUTHID_LENGTH] // don't decrease it's size!
new g_szMsg[MSG_LEN]
new g_iAutoMsgCount

stock g_bDisabled[MAX_PLAYERS + 1]
stock g_hVault = INVALID_HANDLE
stock g_iMsgIdSendAudio

public plugin_precache() {
	register_plugin("Reklama", PLUGIN_DATE, "mx?!")

	register_clcmd("say", "hook_Say")
	register_clcmd("say_team", "hook_Say")

#if defined CMD_NAME
	register_clcmd(CMD_NAME, "clcmd_ToggleState")
#endif

#if defined USE_SOUND
	for(new i; i < sizeof(g_szSounds); i++) {
		precache_sound(g_szSounds[i])
	}
#endif
}

public plugin_init() {
	register_dictionary(LANG_NAME)

	/* --- */

	func_RegCvars()

	/* --- */

#if defined USE_SOUND
	g_iMsgIdSendAudio = get_user_msgid("SendAudio")
#endif
}

public plugin_cfg() {
	g_aAuReArray = ArrayCreate(AR_STRUCT, 1)
	g_aMsgArray = ArrayCreate(MSG_STRUCT)

	/* --- */

	set_task(INIT_DELAY, "task_Init")

	/* --- */

#if defined CMD_NAME
	g_hVault = nvault_open(VAULT_NAME)

	#if defined OBSOLETE_DAYS
	if(g_hVault != INVALID_HANDLE) {
		nvault_prune(g_hVault, 0, get_systime() - (OBSOLETE_DAYS * SECONDS_IN_DAY))
	}
	#endif
#endif
}

public task_Init() {
	func_LoadMessages(MODE_AUTO)
	
	/* --- */

	// Status: Total message count, current position
	register_srvcmd("reklama_status", "srvcmd_CmdShowStatus")
	// Print specified message (example: reklama_show 5)
	register_srvcmd("reklama_show", "srvcmd_CmdShowCustomMessage")
	// Reload messages config
	register_srvcmd("reklama_reload", "srvcmd_CmdReloadFile")
}

public hook_Say(pPlayer) {
#if defined CMD_BLOCK_AUTORESPOND
	if(!g_iAuReCount || g_bDisabled[pPlayer]) {
#else
	if(!g_iAuReCount) {
#endif
		return PLUGIN_CONTINUE
	}

	new szMessage[MSG_LEN]

	read_args(szMessage, chx(szMessage))
	remove_quotes(szMessage)
	trim(szMessage)

	for(new i; i < g_iAuReCount; i++) {
		ArrayGetArray(g_aAuReArray, i, g_AuReData)

		switch(g_AuReData[AR_MODE]) {
			case AR_MODE__EX_INSENS: {
				if(containi(szMessage, g_AuReData[TEMPLATE]) == -1) {
					continue
				}
			}
			case AR_MODE__EX_SENS: {
				if(contain(szMessage, g_AuReData[TEMPLATE]) == -1) {
					continue
				}
			}
			case AR_MODE__MATCH_INSENS: {
				new iPos = containi(szMessage, g_AuReData[TEMPLATE])

				if(iPos == -1) {
					continue
				}

				if(iPos && szMessage[iPos - 1] != ' ') {
					continue
				}

				iPos = strlen(g_AuReData[TEMPLATE]) + iPos // calculate end pos of pattern

				if(szMessage[iPos] && szMessage[iPos] != ' ') {
					continue
				}
			}
			case AR_MODE__MATCH_SENS: {
				new iPos = contain(szMessage, g_AuReData[TEMPLATE])

				if(iPos == -1) {
					continue
				}

				if(iPos && szMessage[iPos - 1] != ' ') {
					continue
				}

				iPos = strlen(g_AuReData[TEMPLATE]) + iPos // calculate end pos of pattern

				if(szMessage[iPos] && szMessage[iPos] != ' ') {
					continue
				}
			}
		}

		ArrayGetArray(g_aMsgArray, g_AuReData[POINTER], g_eMsgData)

		if(g_eMsgData[MSG_MODE] && g_eCvar[CVAR__MODE] != g_eMsgData[MSG_MODE]) {
			return PLUGIN_CONTINUE
		}

		func_ShowToSingle(pPlayer)

		while(g_eMsgData[IS_MULTI_MSG] && ++g_AuReData[POINTER] < g_iTotalMsgCount) {
			ArrayGetArray(g_aMsgArray, g_AuReData[POINTER], g_eMsgData)
			func_ShowToSingle(pPlayer)
		}

	#if defined BLOCK_TRIGGER_MSG
		return PLUGIN_HANDLED
	#else
		return PLUGIN_CONTINUE
	#endif
	}

	return PLUGIN_CONTINUE
}

func_ShowToSingle(pPlayer) {
	if(g_eMsgData[MSG_IS_LANG_KEY]) {
		func_ReplaceML(pPlayer)
		func_ReplacePatterns(pPlayer)
	}
	else {
		copy(g_szMsg, chx(g_szMsg), g_eMsgData[MSG_BODY])

		if(g_eMsgData[MSG_PATTERN_BITSUM]) {
			func_ReplacePatterns(pPlayer)
		}
	}
	
	switch(g_eMsgData[MSG_TYPE]) {
		case TYPE__HUD, TYPE__HUD_NOT_FOR_START: {
			new iColor[3], Float:fPos[2], Float:fDuration, iChannel
			GetHudSettings(iColor, fPos, fDuration, iChannel)
			
			if(iChannel) {
				set_hudmessage(iColor[0], iColor[1], iColor[2], fPos[0], fPos[1], 0, 0.0, fDuration, 0.1, 0.1, iChannel)
				show_hudmessage(pPlayer, g_szMsg)
			}
			else {
				set_dhudmessage(iColor[0], iColor[1], iColor[2], fPos[0], fPos[1], 0, 0.0, fDuration, 0.1, 0.1)
				show_dhudmessage(pPlayer, g_szMsg)
			}
		}
		default: {
		#if defined SHOW_PREFIX_WITH_ADS
			client_print_color(pPlayer, g_eMsgData[MSG_COLOR_ID], "%s^1%s", CHAT_PREFIX, g_szMsg)
		#else
			client_print_color(pPlayer, g_eMsgData[MSG_COLOR_ID], "^1%s", g_szMsg)
		#endif
		}
	}

#if defined USE_SOUND
	if(g_eMsgData[MSG_SOUND_ID] != -1) {
		SendAudio(pPlayer, g_szSounds[ g_eMsgData[MSG_SOUND_ID] ])
	}
#endif
}

GetHudSettings(iColor[3], Float:fPos[2], &Float:fDuration, &iChannel) {
	new szColor[3][6], szPos[2][6], szDuration[6], szChannel[6]

	parse( g_eCvar[CVAR__HUD_SETTINGS],
		szColor[0], chx(szColor[]),
		szColor[1], chx(szColor[]),
		szColor[2], chx(szColor[]),
		szPos[0], chx(szPos[]),
		szPos[1], chx(szPos[]),
		szDuration, chx(szDuration),
		szChannel, chx(szChannel)
	);

	for(new i; i < 3; i++) {
		iColor[i] = str_to_num(szColor[i])
	}

	fPos[0] = str_to_float(szPos[0])
	fPos[1] = str_to_float(szPos[1])

	fDuration = str_to_float(szDuration)
	iChannel = str_to_num(szChannel)

	switch(iChannel) {
		case CHANNEL__DHUD: {
			iChannel = 0
		}
		case CHANNEL__AUTOSELECT: {
			iChannel = -1
		}
	}
}

#if defined CMD_NAME
	public clcmd_ToggleState(pPlayer) {
		g_bDisabled[pPlayer] = !g_bDisabled[pPlayer]
	#if defined USE_SOUND
		SendAudio(pPlayer, SOUND__BLIP1)
	#endif

		client_print_color( pPlayer, print_team_red, "%s^1%L %s%L", CHAT_PREFIX, pPlayer, "REKLAMA_STATE",
			g_bDisabled[pPlayer] ? "^3" : "^4", pPlayer, g_bDisabled[pPlayer] ? "REKLAMA_OFF" : "REKLAMA_ON" );

		if(g_hVault == INVALID_HANDLE) {
			return PLUGIN_HANDLED
		}

		get_user_authid(pPlayer, g_szBuffer, chx(g_szBuffer))

		if(g_bDisabled[pPlayer]) {
			nvault_set(g_hVault, g_szBuffer, "1")
		}
		else {
			nvault_remove(g_hVault, g_szBuffer)
		}

		return PLUGIN_HANDLED
	}
#endif

func_LoadMessages(bool:bMode) {
	if(bMode == MODE_AUTO) {
		new iLen = get_localinfo("amxx_configsdir", g_szFilePath, chx(g_szFilePath))
		formatex(g_szFilePath[iLen], chx_len(g_szFilePath), "/%s", ADS_FILE_NAME)
	}

	new hFile = fopen(g_szFilePath, "r")

	if(!hFile) {
		set_fail_state("Can't %s '%s' !", file_exists(g_szFilePath) ? "read" : "find", ADS_FILE_NAME)
		return
	}

	new szString[MSG_LEN * 2], szMode[3], szType[3], szSound[3],
		szColor[2], szAuRe[2], szAuReMode[2], szTemplate[TEMPLATE_LEN];

	while(!feof(hFile))	{
		fgets(hFile, szString, chx(szString))

		if(!isdigit(szString[0])) {
			continue
		}

		g_AuReData[TEMPLATE][0] = EOS

		parse( szString, szMode, chx(szMode), szType, chx(szType), szSound, chx(szSound), szColor, chx(szColor),
			szAuRe, chx(szAuRe), szAuReMode, chx(szAuReMode), g_AuReData[TEMPLATE], TEMPLATE_LEN - 1, g_eMsgData[MSG_BODY], MSG_LEN - 1 );

		if(g_AuReData[TEMPLATE][0]) {
			g_AuReData[AR_MODE] = str_to_num(szAuReMode)
			g_AuReData[POINTER] = g_iTotalMsgCount

			if(contain(g_AuReData[TEMPLATE], "|") != -1) {
				copy(szTemplate, chx(szTemplate), g_AuReData[TEMPLATE])

				while(strtok2(szTemplate, g_AuReData[TEMPLATE], TEMPLATE_LEN - 1, szTemplate, chx(szTemplate), .token = '|', .trim = 0) != -1) {
					ArrayPushArray(g_aAuReArray, g_AuReData)
					g_iAuReCount++
				}

				// Push remaining part (after last iteration) too
				ArrayPushArray(g_aAuReArray, g_AuReData)
				g_iAuReCount++
			}
			else {
				ArrayPushArray(g_aAuReArray, g_AuReData)
				g_iAuReCount++
			}
		}

		if(equal(g_eMsgData[MSG_BODY], "REKLAMA_KEY", 11)) {
			g_eMsgData[MSG_IS_LANG_KEY] = true
			g_eMsgData[MSG_PATTERN_BITSUM] = -1 // (1<<0) .. (1<<31)
		}
		else {
			g_eMsgData[MSG_IS_LANG_KEY] = false

			replace_string(g_eMsgData[MSG_BODY], MSG_LEN - 1, "!n", "^1")
			replace_string(g_eMsgData[MSG_BODY], MSG_LEN - 1, "!t", "^3")
			replace_string(g_eMsgData[MSG_BODY], MSG_LEN - 1, "!g", "^4")

			g_eMsgData[MSG_PATTERN_BITSUM] = 0
			func_FindPatterns()
		}

		g_eMsgData[MSG_MODE] = str_to_num(szMode)
		g_eMsgData[MSG_TYPE] = str_to_num(szType)

	#if defined RANDOM_START
		switch(g_eMsgData[MSG_TYPE]) {
			case 0: {
				g_eMsgData[IS_MULTI_MSG] = false
				g_eMsgData[NOT_FOR_START] = false
			}
			case 1: {
				g_eMsgData[IS_MULTI_MSG] = true
				g_eMsgData[NOT_FOR_START] = false
			}
			case 2: {
				g_eMsgData[IS_MULTI_MSG] = true
				g_eMsgData[NOT_FOR_START] = true
			}
			case 3: {
				g_eMsgData[IS_MULTI_MSG] = false
				g_eMsgData[NOT_FOR_START] = true
			}
			case 4: {
				g_eMsgData[IS_MULTI_MSG] = false
				g_eMsgData[NOT_FOR_START] = false
			}
			case 5: {
				g_eMsgData[IS_MULTI_MSG] = false
				g_eMsgData[NOT_FOR_START] = true
			}
		}
	#else
		g_eMsgData[IS_MULTI_MSG] = (g_eMsgData[MSG_TYPE] == 1 || g_eMsgData[MSG_TYPE] == 2) ? true : false
	#endif

		g_eMsgData[MSG_SOUND_ID] = str_to_num(szSound) - 1

		switch(szColor[0]) {
			case 'W': g_eMsgData[MSG_COLOR_ID] = print_team_grey
			case 'R': g_eMsgData[MSG_COLOR_ID] = print_team_red
			case 'B': g_eMsgData[MSG_COLOR_ID] = print_team_blue
			default: g_eMsgData[MSG_COLOR_ID] = print_team_default
		}

		g_eMsgData[AUTORESPOND_ONLY] = (szAuRe[0] == '0') ? false : true

		if(!g_eMsgData[AUTORESPOND_ONLY]) {
			g_iAutoMsgCount++
		}

		ArrayPushArray(g_aMsgArray, g_eMsgData)
		g_iTotalMsgCount++
	}

	fclose(hFile)

	if(g_iAutoMsgCount) {
	#if defined RANDOM_START
		new iTryCount

		while(g_iTotalMsgCount) {
			if(++iTryCount == g_iTotalMsgCount) { // wrong cfg, or just bad luck?
				g_iCurPos = 0
				break
			}

			g_iCurPos = random_num(0, g_iTotalMsgCount - 1)
			ArrayGetArray(g_aMsgArray, g_iCurPos, g_eMsgData)

			if(g_eMsgData[NOT_FOR_START]) {
				continue
			}

			break
		}
	#endif
		SetTask()
	}

	if(bMode == MODE_AUTO) {
		server_print("%s %i messages to show", PLUGIN_PREFIX, g_iTotalMsgCount)
	}
}

public func_PrintMessage(iTaskID) {
	if(g_iCurPos == g_iTotalMsgCount) {
		g_iCurPos = 0
	}

	ArrayGetArray(g_aMsgArray, g_iCurPos++, g_eMsgData)

	if(g_eMsgData[AUTORESPOND_ONLY] && iTaskID) {
		func_PrintMessage(iTaskID)
		return
	}

	// Protection against infinite recursion
	if(g_eCvar[CVAR__MODE] && g_eMsgData[MSG_MODE] && g_eMsgData[MSG_MODE] != g_eCvar[CVAR__MODE] && iTaskID) {
		if(!g_iFirstSkipPos) {
			g_iFirstSkipPos = g_iCurPos
		}
		else if(g_iFirstSkipPos == g_iCurPos) {
			g_iFirstSkipPos = 0
			SetTask()
			return
		}

		func_PrintMessage(iTaskID)
		return
	}

	g_iFirstSkipPos = 0

	new pPlayers[MAX_PLAYERS], iPlCount, pPlayer

	get_players_ex(pPlayers, iPlCount, GetPlayers_ExcludeBots|GetPlayers_ExcludeHLTV)

	if(!g_eMsgData[MSG_IS_LANG_KEY] && !g_eMsgData[MSG_PATTERN_BITSUM]) {
		copy(g_szMsg, chx(g_szMsg), g_eMsgData[MSG_BODY])
	}
	
	new iColor[3], Float:fPos[2], Float:fDuration, iChannel
	
	switch(g_eMsgData[MSG_TYPE]) {
		case TYPE__HUD, TYPE__HUD_NOT_FOR_START: {
			GetHudSettings(iColor, fPos, fDuration, iChannel)
		}
	}

	for(new i; i < iPlCount; i++) {
		pPlayer = pPlayers[i]

	#if defined CMD_NAME
		if(g_bDisabled[pPlayer]) {
			continue
		}
	#endif

	if(g_eMsgData[MSG_IS_LANG_KEY]) {
		func_ReplaceML(pPlayer)
		func_ReplacePatterns(pPlayer)
	}
	else if(g_eMsgData[MSG_PATTERN_BITSUM]) {
		copy(g_szMsg, chx(g_szMsg), g_eMsgData[MSG_BODY])
		func_ReplacePatterns(pPlayer)
	}

	switch(g_eMsgData[MSG_TYPE]) {
		case TYPE__HUD, TYPE__HUD_NOT_FOR_START: {
			if(!g_eCvar[CVAR__FOR_ALL_HUD] && is_user_alive(pPlayer)) {
				continue
			}
		
			if(iChannel) {
				set_hudmessage(iColor[0], iColor[1], iColor[2], fPos[0], fPos[1], 0, 0.0, fDuration, 0.1, 0.1, iChannel)
				show_hudmessage(pPlayer, g_szMsg)
			}
			else {
				set_dhudmessage(iColor[0], iColor[1], iColor[2], fPos[0], fPos[1], 0, 0.0, fDuration, 0.1, 0.1)
				show_dhudmessage(pPlayer, g_szMsg)
			}
		}
		default: {
			if(!g_eCvar[CVAR__FOR_ALL_CHAT] && is_user_alive(pPlayer)) {
				continue
			}
		
		#if defined SHOW_PREFIX_WITH_ADS
			client_print_color(pPlayer, g_eMsgData[MSG_COLOR_ID], "%s^1%s", CHAT_PREFIX, g_szMsg)
		#else
			client_print_color(pPlayer, g_eMsgData[MSG_COLOR_ID], "^1%s", g_szMsg)
		#endif
		}
	}

	#if defined USE_SOUND
		if(g_eMsgData[MSG_SOUND_ID] != -1) {
			if(!g_eCvar[CVAR__SOUND_FOR_ALL] && is_user_alive(pPlayer)) {
				continue
			}

			SendAudio(pPlayer, g_szSounds[ g_eMsgData[MSG_SOUND_ID] ])
		}
	#endif
	}

	if(g_eMsgData[IS_MULTI_MSG] && g_iCurPos < g_iTotalMsgCount) {
		func_PrintMessage(iTaskID)
		return
	}

	SetTask()
}

SetTask() {
	if(g_iAutoMsgCount) {
		set_task(random_float(g_eCvar[CVAR__FREQ_MIN], g_eCvar[CVAR__FREQ_MAX]), "func_PrintMessage", TASKID_TIMER)
	}
}

public srvcmd_CmdShowStatus() {
	server_print("%s Total messages: %i | Last printed: #%i", PLUGIN_PREFIX, g_iTotalMsgCount, g_iCurPos)
	return PLUGIN_HANDLED
}

public srvcmd_CmdShowCustomMessage() {
	new iMsgID = read_argv_int(1)

	if(!(g_iTotalMsgCount + 1 > iMsgID > 0)) { /* if(1 > iMsgID || iMsgID > g_iTotalMsgCount) */
		server_print("%s Error! Wrong message ID #%i (Total: %i)", PLUGIN_PREFIX, iMsgID, g_iTotalMsgCount)
	}
	else {
		remove_task(TASKID_TIMER)
		g_iCurPos = iMsgID - 1
		func_PrintMessage(0)
		server_print("%s Message #%i (Total: %i) printed!", PLUGIN_PREFIX, iMsgID, g_iTotalMsgCount)
	}

	return PLUGIN_HANDLED
}

public srvcmd_CmdReloadFile() {
	remove_task(TASKID_TIMER)
	ArrayClear(g_aMsgArray)
	ArrayClear(g_aAuReArray)
	g_iAuReCount = 0
	new iOldTotalMsgCount = g_iTotalMsgCount
	g_iTotalMsgCount = 0
	g_iAutoMsgCount = 0
	g_iCurPos = 0
	g_iFirstSkipPos = 0
	func_LoadMessages(MODE_MANUAL)
	server_print("%s Message count before/after reading: %i/%i", PLUGIN_PREFIX, iOldTotalMsgCount, g_iTotalMsgCount)

	return PLUGIN_HANDLED
}

func_ReplacePatterns(pPlayer) {
	if(CheckPatternBit(PATTERN__HOSTNAME)) {
		get_user_name(0, g_szBuffer, chx(g_szBuffer))
		replace_stringex(g_szMsg, chx(g_szMsg), PATTERNS[PATTERN__HOSTNAME], g_szBuffer)
	}

	if(CheckPatternBit(PATTERN__MAXPLAYERS)) {
		replace_stringex(g_szMsg, chx(g_szMsg), PATTERNS[PATTERN__MAXPLAYERS], fmt("%i", MaxClients))
	}

	if(CheckPatternBit(PATTERN__NUMPLAYERS)) {
		replace_stringex(g_szMsg, chx(g_szMsg), PATTERNS[PATTERN__NUMPLAYERS], fmt("%i", get_playersnum()))
	}

	if(CheckPatternBit(PATTERN__SERVER_IP)) {
		get_user_ip(0, g_szBuffer, chx(g_szBuffer), .without_port = 0)
		replace_stringex(g_szMsg, chx(g_szMsg), PATTERNS[PATTERN__SERVER_IP], g_szBuffer)
	}

	if(CheckPatternBit(PATTERN__MAPNAME)) {
		get_mapname(g_szBuffer, chx(g_szBuffer))
		replace_stringex(g_szMsg, chx(g_szMsg), PATTERNS[PATTERN__MAPNAME], g_szBuffer)
	}

	if(CheckPatternBit(PATTERN__SV_CONTACT)) {
		get_cvar_string("sv_contact", g_szBuffer, chx(g_szBuffer))
		replace_stringex(g_szMsg, chx(g_szMsg), PATTERNS[PATTERN__SV_CONTACT], g_szBuffer)
	}

	if(CheckPatternBit(PATTERN__TIMELEFT)) {
		new iTimeleft = get_timeleft()

		replace_stringex( g_szMsg, chx(g_szMsg), PATTERNS[PATTERN__TIMELEFT],
			fmt("%02d:%02d", iTimeleft / SECONDS_IN_MINUTE, iTimeleft % SECONDS_IN_MINUTE) );
	}

	if(CheckPatternBit(PATTERN__PLAYER_NAME)) {
		get_user_name(pPlayer, g_szBuffer, chx(g_szBuffer))
		replace_stringex(g_szMsg, chx(g_szMsg), PATTERNS[PATTERN__PLAYER_NAME], g_szBuffer)
	}

	if(CheckPatternBit(PATTERN__PLAYER_STEAMID)) {
		get_user_authid(pPlayer, g_szBuffer, chx(g_szBuffer))
		replace_stringex(g_szMsg, chx(g_szMsg), PATTERNS[PATTERN__PLAYER_STEAMID], g_szBuffer)
	}

	if(CheckPatternBit(PATTERN__PLAYER_IP)) {
		get_user_ip(pPlayer, g_szBuffer, chx(g_szBuffer), .without_port = 1)
		replace_stringex(g_szMsg, chx(g_szMsg), PATTERNS[PATTERN__PLAYER_IP], g_szBuffer)
	}
}

func_FindPatterns() {
	for(new i; i < PATTERNS_ENUM; i++) {
		if(contain(g_eMsgData[MSG_BODY], PATTERNS[i]) != -1) {
			SetPatternBit(i)
		}
	}
}

func_ReplaceML(pPlayer) {
	formatex(g_szMsg, chx(g_szMsg), "%L", pPlayer, g_eMsgData[MSG_BODY])
}

public plugin_end() {
	if(g_aMsgArray) {
		ArrayDestroy(g_aMsgArray)
	}

	if(g_aAuReArray) {
		ArrayDestroy(g_aAuReArray)
	}

#if defined CMD_NAME
	if(g_hVault != INVALID_HANDLE) {
		nvault_close(g_hVault)
	}
#endif
}

#if defined CMD_NAME
	public client_putinserver(pPlayer) {
		if(g_hVault == INVALID_HANDLE) {
			g_bDisabled[pPlayer] = false
			return
		}

		get_user_authid(pPlayer, g_szBuffer, chx(g_szBuffer))
		g_bDisabled[pPlayer] = bool:nvault_get(g_hVault, g_szBuffer)

	#if defined OBSOLETE_DAYS
		if(g_bDisabled[pPlayer]) {
			nvault_touch(g_hVault, g_szBuffer)
		}
	#endif
	}
#endif

func_RegCvars() {
	bind_pcvar_float( create_cvar( "reklama_freq_min", "60",
		.description = "Minimal interval between automatic messages" ),
		g_eCvar[CVAR__FREQ_MIN]	);

	bind_pcvar_float( create_cvar( "reklama_freq_max", "60",
		.description = "Maximal interval between automatic messages" ),
		g_eCvar[CVAR__FREQ_MAX] );

	bind_pcvar_num( create_cvar( "reklama_for_all_chat", "1",
		.description = "If 0, alive players will not see the automatic CHAT messages" ),
		g_eCvar[CVAR__FOR_ALL_CHAT] );

	bind_pcvar_num( create_cvar( "reklama_for_all_hud", "1",
		.description = "If 0, alive players will not see the automatic HUD messages" ),
		g_eCvar[CVAR__FOR_ALL_HUD] );

	bind_pcvar_num( create_cvar( "reklama_mode", "0",
		.description = "Display mode:^n\
		0 - Display all messages^n\
		1 - Only those that have 'mode 0' or those that correspond to the current value of this cvar" ),
		g_eCvar[CVAR__MODE] );

	bind_pcvar_num( create_cvar( "reklama_sound_for_all", "1",
		.description = "Sound mode:^n\
		0 - Play only for dead players (autorespond sounds will be played anyway)^n\
		1 - Play sounds for all players" ),
		g_eCvar[CVAR__SOUND_FOR_ALL] );
		
	bind_pcvar_string( create_cvar( "reklama_hud_settings", "0 255 0 -1.0 0.7 3.5 0",
		.description = "HUD settings ( https://dev-cs.ru/hud/index.html ):^n\
		R G B X Y DURATION CHANNEL(1-4, 0 to autoselect, -1 to use DHUD)" ),
		g_eCvar[CVAR__HUD_SETTINGS], chx(g_eCvar[CVAR__HUD_SETTINGS] ) );

#if defined AUTO_CFG
	AutoExecConfig(.name = AUTO_CFG)
#endif
}

SendAudio(pPlayer, const szSample[]) {
	message_begin(MSG_ONE_UNRELIABLE, g_iMsgIdSendAudio, .player = pPlayer)
	write_byte(pPlayer)
	write_string(szSample)
	write_short(PITCH_NORM)
	message_end()
}
Установил плагин прописал текст а текст не выводиться на сервере
 
GNU nano 7.2 reklama.ini
; Конфиг сообщений плагина 'Reklama'
; Message config for Plugin 'Reklama'

; Однострочное чат-сообщение без звука и с цветом команды получателя для '!t'
; Single line chat message without sound and with the color of the recipient comma>
;0 0 0 D 0 0 "" "!g* !nПосетите наш форум: !tDev-CS.ru"

; Трёхстрочное чат-сообщение со звуком 'tutor_msg' и красным (первая строка), сини>
; Three-line chat message with sound 'tutor_msg' and red (first line), blue (secon>
;0 1 3 R 0 0 "" "!g* !nНа сервере !tчитер? !nБегите на !gwww.адрес.ru !nзвать адми>
;0 2 0 B 0 0 "" "!g* !nТак же админа можно позвать в группе !tTelegram: !gадрес"
0 3 0 W 0 0 "" "!g* !nСамостоятельно наказать читера можно командой !t/voteban"

; Трёхстрочное чат-сообщение, выводящееся только автоответчиком, в ответ на слово >
; A three-line chat message displayed only as automatic response to the words "при>
;0 2 2 B 1 2 "привет|ку|хай" "!g* !tПриветствуем вас на нашем сервере!"
;0 2 0 B 1 0 "" "!g* !tПожалуйста, прочтите правила игры: !gsay /rules"
;0 3 0 R 1 0 "" "!g* !tЗа игру с читами у нас банят НАВСЕГДА!"

; Однострочное чат-сообшение, демонстрирующее вывод через ML-ключ (см. 'data/lang/>
; A one-line chat message showing output via an ML-key (see 'data/lang/reklama.txt>
;0 0 0 D 0 0 "" "REKLAMA_KEY_1"

; Однострочное чат-сообшение, демонстрирующее работу подстановочного шаблона:
; A one-line chat message demonstrating the operation of a wildcard pattern:
;0 0 0 D 0 2 "тест" "!g* !nИмя сервера: !g#hostname#!n, ваш ник: !g#name#"

; HUD-сообщение, демонстрирующее вывод через ML-ключ (см. 'data/lang/reklama.txt')
;0 4 0 D 0 0 "" "REKLAMA_KEY_2"
0 4 0 D 0 0 "" "Меню Сервера N"
 
Так раскомментируйте строки, и текст будет отображаться
GNU nano 7.2 reklama.ini
; Конфиг сообщений плагина 'Reklama'
; Message config for Plugin 'Reklama'

; Однострочное чат-сообщение без звука и с цветом команды получателя для '!t'
; Single line chat message without sound and with the color of the recipient comma>
;0 0 0 D 0 0 "" "!g* !nПосетите наш форум: !tDev-CS.ru"

; Трёхстрочное чат-сообщение со звуком 'tutor_msg' и красным (первая строка), сини>
; Three-line chat message with sound 'tutor_msg' and red (first line), blue (secon>
;0 1 3 R 0 0 "" "!g* !nНа сервере !tчитер? !nБегите на !gwww.адрес.ru !nзвать адми>
;0 2 0 B 0 0 "" "!g* !nТак же админа можно позвать в группе !tTelegram: !gадрес"
0 3 0 W 0 0 "" "!g* !nСамостоятельно наказать читера можно командой !t/voteban"

; Трёхстрочное чат-сообщение, выводящееся только автоответчиком, в ответ на слово >
; A three-line chat message displayed only as automatic response to the words "при>
;0 2 2 B 1 2 "привет|ку|хай" "!g* !tПриветствуем вас на нашем сервере!"
;0 2 0 B 1 0 "" "!g* !tПожалуйста, прочтите правила игры: !gsay /rules"
;0 3 0 R 1 0 "" "!g* !tЗа игру с читами у нас банят НАВСЕГДА!"

; Однострочное чат-сообшение, демонстрирующее вывод через ML-ключ (см. 'data/lang/>
; A one-line chat message showing output via an ML-key (see 'data/lang/reklama.txt>
;0 0 0 D 0 0 "" "REKLAMA_KEY_1"

; Однострочное чат-сообшение, демонстрирующее работу подстановочного шаблона:
; A one-line chat message demonstrating the operation of a wildcard pattern:
;0 0 0 D 0 2 "тест" "!g* !nИмя сервера: !g#hostname#!n, ваш ник: !g#name#"

; HUD-сообщение, демонстрирующее вывод через ML-ключ (см. 'data/lang/reklama.txt')
;0 4 0 D 0 0 "" "REKLAMA_KEY_2"
0 4 0 D 0 0 "" "Меню Сервера N"
 
Так раскомментируйте строки, и текст будет отображаться
Да ну я раскоментировал сообщения и сообщения загружены
Сообщение автоматически объединено:

Я вот что заметил то что сообщения в чате отображаеться а в dhud нет
 
Последнее редактирование:
Статус
Закрыто для дальнейших ответов.

Кто просматривает тему

Назад
Верх