[Shop] Zone Credits (Не выводиться цветное сообщения в чат)

MrSonick4

Участник
Сообщения
15
Реакции
1
Операционная система
Windows
Список мета-модулей
Listing 5 plugins:
[01] SourceMod (1.11.0.6911) by AlliedModders LLC
[02] CS Tools (1.11.0.6911) by AlliedModders LLC
[03] SDK Tools (1.11.0.6911) by AlliedModders LLC
[04] SDK Hooks (1.11.0.6911) by AlliedModders LLC
[05] SteamWorks Extension (1.2.3) by Kyle Sanderson
Список плагинов SM
[SM] Listing 93 plugins:
01 "[CSS/CS:GO] AbNeR BHOP" (3.1fix) by AbNeR_CSS
02 "Admin File Reader" (1.11.0.6911) by AlliedModders LLC
03 "Admin Help" (1.11.0.6911) by AlliedModders LLC
04 "Admin Menu" (1.11.0.6911) by AlliedModders LLC
05 "AntiAfk" (2.1) by Drumanid
06 "Anti-Flood" (1.11.0.6911) by AlliedModders LLC
07 "Basic Ban Commands" (1.11.0.6911) by AlliedModders LLC
08 "Basic Chat" (1.11.0.6911) by AlliedModders LLC
09 "Basic Comm Control" (1.11.0.6911) by AlliedModders LLC
10 "Basic Commands" (1.11.0.6911) by AlliedModders LLC
11 "Basic Info Triggers" (1.11.0.6911) by AlliedModders LLC
12 "Basic Votes" (1.11.0.6911) by AlliedModders LLC
13 "Client Preferences" (1.11.0.6911) by AlliedModders LLC
14 "Deathrun" (2.0.dev11) by selax
15 "CX: CS:S, CS:GO Exclusive Deathrun Manager" (5.2) by cyxx
16 "[ANY] Directory Downloader" (1.4.1) by inklesspen
17 "Fun Commands" (1.11.0.6911) by AlliedModders LLC
18 "Fun Votes" (1.11.0.6911) by AlliedModders LLC
19 "Hook Grab Rope" (1.1.4) by Sheepdude, SumGuy14
20 "Influx - Block +left/+right" (build-2) by Mehis
21 "Influx - Config" (build-2) by Mehis
22 "Influx - Core" (build-2) by Mehis
23 "Influx - Disable Radio" (build-2) by Mehis
24 "Influx - Fix Timelimit" (build-2) by Mehis
25 "Influx - FPS Check" (build-2) by Mehis
26 "Influx - HUD Draw" (build-2) by Mehis
27 "Influx - HUD | Draw CSS" (build-2) by Mehis
28 <Failed> "Influx - HUD | Chat Records" (build-2) by Mehis
29 <Failed> "Influx - HUD | Record Sounds" (build-2) by Mehis
30 "Influx - Jumps" (build-2) by Mehis
31 "Influx - Map Rankings" (build-2) by Mehis
32 "Influx - Mode - Scroll" (build-2) by Mehis
33 "Influx - No Collision" (build-2) by Mehis
34 "Influx - Prespeed" (build-2) by Mehis
35 "Influx - Chat Records" (build-2) by Mehis
36 "Influx - Records Menu" (build-2) by Mehis
37 "Influx - Record Sounds" (build-2) by Mehis
38 "Influx - Silent Chat Commands" (build-2) by Mehis
39 "Influx - Spectator All Talk (CSS)" (build-2) by Mehis
40 "Influx - Spectator List" (build-2) by Mehis
41 "Influx - Style - Normal" (build-2) by Mehis
42 <Failed> "Influx - True Velocity" (build-2) by Mehis
43 "Influx - Zones" (build-2) by Mehis
44 "Influx - Zones | Autobhop" (build-2) by Mehis
45 "Influx - Zones | Beams" (build-2) by Mehis
46 "Influx - Zones | Block" (build-2) by Mehis
47 "Influx - Zones | Checkpoint" (build-2) by Mehis
48 "Influx - Zones | Freestyle" (build-2) by Mehis
49 "Influx - Zones | Stage" (build-2) by Mehis
50 "Influx - Zones | Teleport" (build-2) by Mehis
51 "Influx - Zones | Timer" (build-2) by Mehis
52 "Influx - Zones | Validator" (build-2) by Mehis
53 "Nextmap" (1.11.0.6911) by AlliedModders LLC
54 "Player Commands" (1.11.0.6911) by AlliedModders LLC
55 "Reserved Slots" (1.11.0.6911) by AlliedModders LLC
56 "RockTheVote" (1.4) by ferret
57 "[Shop] Core" (3.0E6) by Shop Core Team
58 "[Shop] Name/Prefix/Text Color" (2.2.3) by R1KO
59 "[Shop] FlipGame" (2.1.2) by FLASHER
60 "[Shop] Gravity" (1.4) by R1KO
61 "[Shop] Medkit" (2.1.2) by FrozDark (HLModders LLC)
62 "[Shop] Neon" (1.3.0) by White Wolf (HLModders LLC)
63 "[Shop] Pets" (1.0) by Pheonix (╦Щ╬З┘атЧП╨д╨╡╨╜╨╕╨║╤БтЧП┘а╬З╦Щ) & Zephyrus
64 "[Shop] Respawn" (1.1) by R1KO
65 "Show Credits" (1.0) by Someone
66 "[Shop] Skins" (2.3.0) by FrozDark Feat R1KO, Tonki_Ton)
67 "[Shop] Smoke-nades" by MaGa
68 "[Shop] Top10 Function" (2.0.1) by FrozDark
69 "[Shop] Color Tracers" (2.0.4) by FrozDark & R1KO
70 "[Shop] Trails" (2.2.3) by FrozDark (HLModders LLC)
71 "[Shop] Zone Credits" (1.4.0) by Tonki_Ton
72 "[Shop] Slots" (1.3.3) by AlexTheRegent
73 "Sound Commands" (1.11.0.6911) by AlliedModders LLC
74 "[CS:S / CS:GO] Throwing Knives Core" (1.6) by R1KO
75 "[VIP] Anti Flash" (1.2) by R1KO, babka68
76 "[VIP] Armor" (1.1) by R1KO (skype: vova.andrienko1)
77 "[VIP] Credits Multiplier" (1.1.0) by R1KO, vadrozh
78 "[VIP] Damage Change" (1.2) by R1KO
79 <Failed> "[VIP] Gravity" (1.0.0) by R1KO (skype: vova.andrienko1)
80 "[VIP] GrenadeTrails" (1.0.2) by R1KO
81 "[VIP] Hook Grab Rope" (1.0.2) by SAPSAN
82 "[VIP] HP" (1.1) by R1KO (skype: vova.andrienko1)
83 "[VIP] Regen Armor" (1.1) by R1KO
84 "[VIP] Regen HP" (1.1) by R1KO
85 "[VIP] Respawn (CS:S/CS:GO)" (1.3) by R1KO
86 "[VIP] Spawn Effects" (1.2) by Mr.ToNik
87 "[VIP] Speed" (1.2.0) by R1KO, vadrozh
88 "[VIP] Throwing Knives" (1.4) by R1KO
89 "[VIP] Tracers" (1.1) by R1KO
90 "[VIP] Core" (3.0.3 R) by R1KO
91 "[VIP] Dissolve Body" (1.2.2) by KOROVKA, R1KO
92 "[VIP] Paint" (1.6) by asdf
93 "[VIP] SoundEffects" (1.0) by Dirmer (discord: Drimer#6995)
Список расширений SM
[SM] Displaying 12 extensions:
[01] Automatic Updater (1.11.0.6911): Updates SourceMod gamedata files
[02] Webternet (1.11.0.6911): Extension for interacting with URLs
[03] CS Tools (1.11.0.6911): CS extended functionality
[04] BinTools (1.11.0.6911): Low-level C/C++ Calling API
[05] SDK Tools (1.11.0.6911): Source SDK Tools
[06] SDK Hooks (1.11.0.6911): Source SDK Hooks
[07] Top Menus (1.11.0.6911): Creates sorted nested menus
[08] Client Preferences (1.11.0.6911): Saves client preference settings
[09] SQLite (1.11.0.6911): SQLite Driver
[10] Regex (1.11.0.6911): Provides regex natives for plugins
[11] SteamWorks Extension (1.2.3): Exposes SteamWorks functions to Developers
[12] MySQL-DBI (1.11.0.6911): MySQL driver implementation for DBI
Я понимаю что движок КСС устарел, но как то другим плагинам удаётся выводить разные цвета в чат
Почему же тогда этот плагин не может вывести, хотя вроде в конфигах все норм в phrases тоже, но в чат все равно пишется таким цветом:
shop_zone_credits.phrases:
"Phrases"
{
    "MapFinish_Credits"
    {
        "#format"    "{1:i}"
        "ru"        "{GREEN}[Shop] {OLIVE} Вы прошли карту и получили {RED}{1} {OLIVE}кредитов"
        "en"        "{GREEN}[Shop] {OLIVE} You are finish map and get {RED}{1} {OLIVE}credits"
    }
    "MapFinish_Gold"
    {
        "#format"    "{1:i}"
        "ru"        "{GREEN}[Shop] {OLIVE} Вы прошли карту и получили {RED}{1} {OLIVE}золота"
        "en"        "{GREEN}[Shop] {OLIVE} You are finish map and get {RED}{1} {OLIVE}gold"
    }
    "MapFinish_Credits_All"
    {
        "#format"    "{1:N},{2:i}"
        "ru"        "{GREEN}[Shop] {OLIVE}Игрок {BLUE}{1} {OLIVE}прошел карту и получил {RED}{2} {OLIVE}кредитов"
        "en"        "{GREEN}[Shop] {OLIVE} Player {BLUE}{1} {OLIVE}are the first who finish map and get {RED}{2} {OLIVE}credits"
    }
    "MapFinish_Gold_All"
    {
        "#format"    "{1:N},{2:i}"
        "ru"        "{GREEN}[Shop] {OLIVE} Игрок {BLUE}{1} {OLIVE}прошел карту и получили {RED}{2} {OLIVE}золота"
        "en"        "{GREEN}[Shop] {OLIVE} Player {BLUE}{1} {OLIVE}finish map and get {RED}{2} {OLIVE}gold"
    }
    
    "MapFinish_WR_Credits"
    {
        "#format"    "{1:i}"
        "ru"        "{GREEN}[Shop] {OLIVE} Вы побили рекорд карты и получили {RED}{1} {OLIVE}кредитов"
        "en"        "{GREEN}[Shop] {OLIVE} You broke map record and get {RED}{1} {OLIVE}credits"
    }
    "MapFinish_WR_Gold"
    {
        "#format"    "{1:i}"
        "ru"        "{GREEN}[Shop] {OLIVE} Вы побили рекорд карты и получили {RED}{1} {OLIVE}золота"
        "en"        "{GREEN}[Shop] {OLIVE} You broke map record and get {RED}{1} {OLIVE}gold"
    }
    "MapFinish_WR_Credits_All"
    {
        "#format"    "{1:N},{2:i}"
        "ru"        "{GREEN}[Shop] {OLIVE} Игрок {BLUE}{1} {OLIVE}побил рекорд карты и получил {RED}{2} {OLIVE}кредитов"
        "en"        "{GREEN}[Shop] {OLIVE} Player {BLUE}{1} {OLIVE}broke map record and get {RED}{2} {OLIVE}credits"
    }
    "MapFinish_WR_Gold_All"
    {
        "#format"    "{1:N},{2:i}"
        "ru"        "{GREEN}[Shop] {OLIVE} Игрок {BLUE}{1} {OLIVE}прошел карту и получил {RED}{2} {OLIVE}золота"
        "en"        "{GREEN}[Shop] {OLIVE} Player {BLUE}{1} {OLIVE}broke map record and get {RED}{2} {OLIVE}gold"
    }
    
    "MapFinish_Bonus_Credits"
    {
        "#format"    "{1:i}"
        "ru"        "{GREEN}[Shop] {OLIVE} Вы прошли бонус и получили {RED}{1} {OLIVE}кредитов"
        "en"        "{GREEN}[Shop] {OLIVE} You are finish bonus and get {RED}{1} {OLIVE}credits"
    }
    "MapFinish_Bonus_Gold"
    {
        "#format"    "{1:i}"
        "ru"        "{GREEN}[Shop] {OLIVE} Вы прошли бонус и получили {RED}{1} {OLIVE}золота"
        "en"        "{GREEN}[Shop] {OLIVE} You are finish bonus and get {RED}{1} {OLIVE}gold"
    }
    "MapFinish_Bonus_Credits_All"
    {
        "#format"    "{1:N},{2:i}"
        "ru"        "{GREEN}[Shop] {OLIVE} Игрок {BLUE}{1} {OLIVE}прошел бонус и получил {RED}{2} {OLIVE}кредитов"
        "en"        "{GREEN}[Shop] {OLIVE} Player {BLUE}{1} {OLIVE}are finish bonus and get {RED}{2} {OLIVE}credits"
    }
    "MapFinish_Bonus_Gold_All"
    {
        "#format"    "{1:N},{2:i}"
        "ru"        "{GREEN}[Shop] {OLIVE} Игрок {BLUE}{1} {OLIVE}прошел бонус и получил {RED}{2} {OLIVE}золота"
        "en"        "{GREEN}[Shop] {OLIVE} Player {BLUE}{1} {OLIVE}are finish bonus and get {RED}{2} {OLIVE}gold"
    }
    
    "MapFinish_Bonus_WR_Credits"
    {
        "#format"    "{1:i}"
        "ru"        "{GREEN}[Shop] {OLIVE} Вы побили бонусный рекорд и получили {RED}{1} {OLIVE}кредитов"
        "en"        "{GREEN}[Shop] {OLIVE} You broke bonus record and get {RED}{1} {OLIVE}credits"
    }
    "MapFinish_Bonus_WR_Gold"
    {
        "#format"    "{1:i}"
        "ru"        "{GREEN}[Shop] {OLIVE} Вы побили бонусный рекорд и получили {RED}{1} {OLIVE}золота"
        "en"        "{GREEN}[Shop] {OLIVE} You broke bonus record and get {RED}{1} {OLIVE}gold"
    }
    "MapFinish_Bonus_WR_Credits_All"
    {
        "#format"    "{1:N},{2:i}"
        "ru"        "{GREEN}[Shop] {OLIVE} Игрок {BLUE}{1} {OLIVE}бонусный рекорд и получил {RED}{2} {OLIVE}кредитов"
        "en"        "{GREEN}[Shop] {OLIVE} Player {BLUE}{1} {OLIVE}broke bonus record and get {RED}{2} {OLIVE}credits"
    }
    "MapFinish_Bonus_WR_Gold_All"
    {
        "#format"    "{1:N},{2:i}"
        "ru"        "{GREEN}[Shop] {OLIVE} Игрок {BLUE}{1} {OLIVE}бонусный рекорд и получил {RED}{2} {OLIVE}золота"
        "en"        "{GREEN}[Shop] {OLIVE} Player {BLUE}{1} {OLIVE}broke bonus record and get {RED}{2} {OLIVE}gold"
    }
    
    "MapFinish_Once"
    {
        "#format"    "{1:N},{2:i}"
        "ru"        "{GREEN}[Shop] {OLIVE} Игрок {BLUE}{1} {OLIVE}первым прошел карту и получили {RED}{2} {OLIVE}кредитов"
        "en"        "{GREEN}[Shop] {OLIVE} Player {BLUE}{1} {OLIVE}are the first who finish map and get {RED}{2} {OLIVE}credits"
    }
}
123121.png
 

Ice_Sochi

Участник
Сообщения
709
Реакции
413

sniper45301

<Выживаю и играю>
Сообщения
464
Реакции
133

MrSonick4

Участник
Сообщения
15
Реакции
1
надо в коде менять на другой. morecolors например и компилить с ним, чтоб цвета работали на ксс
Замени csgo_colors на morecolors, CGOPrintToChatAll > PrintToChatAll, и скомпилируй
Сам инклюд morecolors у тебя уже наверняка есть
Вот что говорит compilex.exe:
Compiled.exe log:
//SourceMod Batch Compiler
// by the SourceMod Dev Team


//// shop_zone_credits.sp
//
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\timers.inc(48) : error 418: deprecated syntax; see https://wiki.alliedmods.net/SourcePawn_Transitional_Syntax#Typedefs
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\timers.inc(49) : error 055: start of function body without function header
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\timers.inc(58) : error 001: expected token: "-identifier-", but found "public"
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\timers.inc(58) : error 122: expected type expression
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\timers.inc(58) : error 001: expected token: ";", but found ")"
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\logging.inc(137) : error 418: deprecated syntax; see https://wiki.alliedmods.net/SourcePawn_Transitional_Syntax#Typedefs
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\logging.inc(137) : error 010: invalid function or declaration
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\functions.inc(360) : error 418: deprecated syntax; see https://wiki.alliedmods.net/SourcePawn_Transitional_Syntax#Typedefs
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\functions.inc(360) : error 010: invalid function or declaration
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\core.inc(45) : error 001: expected token: "public", but found "-identifier-"
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\core.inc(122) : error 001: expected token: "public", but found "const"
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\core.inc(123) : error 001: expected token: "public", but found "const"
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\core.inc(133) : error 001: expected token: "public", but found "const"
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\core.inc(134) : error 001: expected token: "public", but found "const"
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\sourcemod.inc(43) : error 001: expected token: "public", but found "const"
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\sourcemod.inc(44) : error 001: expected token: "public", but found "const"
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\sourcemod.inc(45) : error 001: expected token: "public", but found "const"
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\sourcemod.inc(46) : error 001: expected token: "public", but found "const"
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\sourcemod.inc(47) : error 001: expected token: "public", but found "const"
//
// 19 Errors.
//
// Compilation Time: 0,72 sec
// ----------------------------------------
А так же:

spedit.exe (log):
shop_zone_credits.sp
C:\Users\User\Desktop\spedit1.2.0.3\sourcepawn\configs\sm_1_8_5914_smlib_0_11\include\menus.inc(7) : fatal error 183: cannot read from file: "smlib/math"
готово

Хелп плиз
Сообщения автоматически склеены:

Я закинул morecolors в include и прописал вот тут
 

Вложения

  • 123123123.png
    123123123.png
    1.6 КБ · Просмотры: 6

Ice_Sochi

Участник
Сообщения
709
Реакции
413
Вот что говорит compilex.exe:
Compiled.exe log:
//SourceMod Batch Compiler
// by the SourceMod Dev Team


//// shop_zone_credits.sp
//
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\timers.inc(48) : error 418: deprecated syntax; see https://wiki.alliedmods.net/SourcePawn_Transitional_Syntax#Typedefs
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\timers.inc(49) : error 055: start of function body without function header
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\timers.inc(58) : error 001: expected token: "-identifier-", but found "public"
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\timers.inc(58) : error 122: expected type expression
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\timers.inc(58) : error 001: expected token: ";", but found ")"
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\logging.inc(137) : error 418: deprecated syntax; see https://wiki.alliedmods.net/SourcePawn_Transitional_Syntax#Typedefs
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\logging.inc(137) : error 010: invalid function or declaration
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\functions.inc(360) : error 418: deprecated syntax; see https://wiki.alliedmods.net/SourcePawn_Transitional_Syntax#Typedefs
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\functions.inc(360) : error 010: invalid function or declaration
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\core.inc(45) : error 001: expected token: "public", but found "-identifier-"
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\core.inc(122) : error 001: expected token: "public", but found "const"
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\core.inc(123) : error 001: expected token: "public", but found "const"
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\core.inc(133) : error 001: expected token: "public", but found "const"
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\core.inc(134) : error 001: expected token: "public", but found "const"
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\sourcemod.inc(43) : error 001: expected token: "public", but found "const"
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\sourcemod.inc(44) : error 001: expected token: "public", but found "const"
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\sourcemod.inc(45) : error 001: expected token: "public", but found "const"
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\sourcemod.inc(46) : error 001: expected token: "public", but found "const"
// C:\Users\User\Desktop\server\steamapps\common\Counter-Strike Source Dedicated Server\cstrike\addons\sourcemod\scripting\include\sourcemod.inc(47) : error 001: expected token: "public", but found "const"
//
// 19 Errors.
//
// Compilation Time: 0,72 sec
// ----------------------------------------
А так же:

spedit.exe (log):
shop_zone_credits.sp
C:\Users\User\Desktop\spedit1.2.0.3\sourcepawn\configs\sm_1_8_5914_smlib_0_11\include\menus.inc(7) : fatal error 183: cannot read from file: "smlib/math"
готово

Хелп плиз
Сообщения автоматически склеены:

Я закинул morecolors в include и прописал вот тут
У тебя все инклюды, подключенные в коде плагина, имеются в папке include с компилятором?
Скинь исходник или код (так даже проще) под спойлер
 

MrSonick4

Участник
Сообщения
15
Реакции
1
У тебя все инклюды, подключенные в коде плагина, имеются в папке include с компилятором?
Скинь исходник или код (так даже проще) под спойлер
Да все вроде инклюиды есть но вот тебе все мои инклюды:
Источники плагинов
Модуль плагина - [Shop] Zone Credits (Сам плагин)
[INC] More Colors (Цвета)
 

MrSonick4

Участник
Сообщения
15
Реакции
1
@Nekro, @Ice_Sochi,
error.txt:
shop_zone_credits.sp
C:\Users\User\Desktop\spedit1.2.0.3\sourcepawn\configs\sm_one_six\include\sourcemod.inc(140) : error 025: function heading differs from prototype
C:\Users\User\Desktop\spedit1.2.0.3\sourcepawn\configs\sm_one_six\include\morecolors.inc(9) : warning 207: unknown #pragma
C:\Users\User\Desktop\spedit1.2.0.3\sourcepawn\configs\sm_one_six\include\morecolors.inc(9) : error 038: extra characters on line
C:\Users\User\Desktop\spedit1.2.0.3\sourcepawn\configs\sm_one_six\include\regex.inc(97) : error 010: invalid function or declaration
C:\Users\User\Desktop\spedit1.2.0.3\sourcepawn\configs\sm_one_six\include\regex.inc(106) : error 042: invalid combination of class specifiers
C:\Users\User\Desktop\spedit1.2.0.3\sourcepawn\configs\sm_one_six\include\regex.inc(106) : error 001: expected token: ")", but found "-identifier-"
C:\Users\User\Desktop\spedit1.2.0.3\sourcepawn\configs\sm_one_six\include\regex.inc(106) : error 010: invalid function or declaration
C:\Users\User\Desktop\spedit1.2.0.3\sourcepawn\configs\sm_one_six\include\regex.inc(106) : fatal error 127: too many error messages on one line
готово
Что у меня в sp файле:
[Shop] Zone Credits.sp:
#include <sourcemod>
#include <morecolors>
#include <shop>

#undef REQUIRE_PLUGIN
#include <shavit>

#pragma semicolon 1
#pragma newdecls required

public Plugin myinfo =
{
    name = "[Shop] Zone Credits",
    author = "Tonki_Ton",
    version = "1.4.0",
    url = "https://hlmod.ru"
};

enum
{
    BONUS,
    BONUSWR,
    WR,
    ONCE,
    CREDITS
};

ArrayList hWhoFinish;

char g_sCurrentMap[34];

int g_iCurrentPosition,
    g_iEventMode,
    g_iAmount[CREDITS],
    g_iPositionCredits[MAXPLAYERS+1];
    
bool g_bType,
     g_bAllChat,
     g_bSupportedMap;

public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
{
    MarkNativeAsOptional("Shop_GiveClientGold");
    return APLRes_Success;
}

public void OnPluginStart()
{
    HookEvent("round_start", OnRoundStart, EventHookMode_PostNoCopy);

    hWhoFinish = new ArrayList(ByteCountToCells(32));

    RegAdminCmd("sm_zc_reload", reload, ADMFLAG_ROOT);

    LoadTranslations("shop_zone_credits.phrases");
}

public Action reload(int client, int args)
{
    PrintToConsole(client, "Конфиг перезагружен!");
    OnMapStart();

    return Plugin_Handled;
}

public void OnMapStart()
{
    GetCurrentMap(g_sCurrentMap, sizeof(g_sCurrentMap));
    LoadCfg();

    hWhoFinish.Clear();
}

public Action OnRoundStart(Event event, const char[] name, bool dontBroadcast)
{
    g_iCurrentPosition = 0;
}

//influx
public void Influx_OnTimerFinishPost( int client, int runid, int mode, int style, float time, float prev_pb, float prev_best, int flags)
{
    FinishMapEvent(client, (runid == 1) ? false:true, !(flags & (1 << 1)) ? false:true);
}

//shavit
public void Shavit_OnFinish(int client, int style, float time, int jumps, int strafes, float sync, int track)
{
    float WrTime;
    Shavit_GetWRTime(style, WrTime, track);

    FinishMapEvent(client, (track == 0) ? false:true, !(WrTime == 0.0 || time < WrTime) ? false:true);
}

//ZipCore Dr.Api fork
public void OnTimerRecord(int client, int track, int style, float time, float lasttime, int currentrank, int newrank)
{
    FinishMapEvent(client, (track == 0) ? false:true, (newrank != 1) ? false:true);
}

//ckSurf
public Action ckSurf_OnMapFinished(int client, float fRunTime, char sRunTime[54], int rank)
{
    FinishMapEvent(client, false, (rank != 1) ? false:true);
}

public Action ckSurf_OnBonusFinished(int client, float fRunTime, char sRunTime[54], int rank)
{
    FinishMapEvent(client, true, (rank != 1) ? false:true);
}

//blacky
public int OnTimerFinished_Post(int client, float Time, int Type, int Style, bool NewTime, int OldPosition, int NewPosition)
{
    FinishMapEvent(client, (Type == 1) ? false:true, (NewPosition != 1) ? false:true);
}

void FinishMapEvent(int client, bool bonus, bool wr)
{
    if (!g_bSupportedMap) return;

    if (!g_iEventMode && !bonus && g_iAmount[ONCE] > 0)
    {
        if (!g_bType) Shop_GiveClientCredits(client, g_iAmount[ONCE]);
        else Shop_GiveClientGold(client, g_iAmount[ONCE]);
        
        CPrintToChatAll("%t", g_bType ? "mapfinish_once_credits":"mapfinish_once_gold", client, g_iAmount[ONCE]);

        g_bSupportedMap = false;
    }
    else
    {
        if (g_iEventMode == 2)
           {
            char id[32];

            GetClientAuthId(client, AuthId_Steam2, id, sizeof(id), false);

            if (hWhoFinish.FindString(id) == -1) hWhoFinish.PushString(id);
            else if (hWhoFinish.FindString(id) != -1) return;
        }

        if (!bonus && !wr)
        {
            if (++g_iCurrentPosition > MAXPLAYERS) g_iCurrentPosition = MAXPLAYERS;
            if (g_iPositionCredits[g_iCurrentPosition] < 1) return;

            if (!g_bType) Shop_GiveClientCredits(client, g_iPositionCredits[g_iCurrentPosition]);
            else Shop_GiveClientGold(client, g_iPositionCredits[g_iCurrentPosition]);

            if (!g_bAllChat) CPrintToChat(client, "%t", !g_bType ? "MapFinish_Credits":"MapFinish_Gold", g_iPositionCredits[g_iCurrentPosition]);
            else CPrintToChatAll("%t", !g_bType ? "MapFinish_Credits_All":"MapFinish_Gold_All", client, g_iPositionCredits[g_iCurrentPosition]);
        }
        else if (!bonus && wr && g_iAmount[WR] > 0)
        {
            if (!g_bType) Shop_GiveClientCredits(client, g_iAmount[WR]);
            else Shop_GiveClientGold(client, g_iAmount[WR]);

            if (!g_bAllChat) CPrintToChat(client, "%t",  !g_bType ? "MapFinish_WR_Credits":"MapFinish_WR_Gold", g_iAmount[WR]);
            else CPrintToChatAll("%t", !g_bType ? "MapFinish_WR_Credits_All":"MapFinish_WR_Gold_All", client, g_iAmount[WR]);
        }

        if (bonus && !wr && g_iAmount[BONUS] > 0)
        {
            if (!g_bType) Shop_GiveClientCredits(client, g_iAmount[BONUS]);
            else Shop_GiveClientGold(client, g_iAmount[BONUS]);

            if (!g_bAllChat) CPrintToChat(client, "%t",  !g_bType ? "MapFinish_Bonus_Credits":"MapFinish_Bonus_Gold", g_iAmount[BONUS]);
            else CPrintToChatAll("%t", !g_bType ? "MapFinish_Bonus_Credits_All":"MapFinish_Bonus_Gold_All", client, g_iAmount[BONUS]);
        }
        else if (bonus && wr && g_iAmount[BONUSWR] > 0)
        {
            if (!g_bType) Shop_GiveClientCredits(client, g_iAmount[BONUSWR]);
            else Shop_GiveClientGold(client, g_iAmount[BONUSWR]);

            if (!g_bAllChat) CPrintToChat(client, "%t",  !g_bType ? "MapFinish_Bonus_WR_Credits":"MapFinish_Bonus_WR_Gold", g_iAmount[BONUSWR]);
            else CPrintToChatAll("%t", !g_bType ? "MapFinish_Bonus_WR_Credits_All":"MapFinish_Bonus_WR_Gold_All", client, g_iAmount[BONUSWR]);
        }
    }
}

void LoadCfg()
{
    char Buffer[128];

    KeyValues KvZc = new KeyValues("Credits");

    BuildPath(Path_SM, Buffer, sizeof(Buffer), "configs/shop/zone_credits.txt");
    if(!KvZc.ImportFromFile(Buffer))
    {
        SetFailState("Конфиг zone credits отсутсвует!");
    }
    else
    {
        KvZc.Rewind();

        g_iEventMode = KvZc.GetNum("zc_mode", 1);
        g_bAllChat = view_as<bool>(KvZc.GetNum("announce_to_all", 0));

        if (KvZc.JumpToKey(g_sCurrentMap, false))
        {
            g_bType = view_as<bool>(KvZc.GetNum("currency_type", 0));

            if (!g_iEventMode) g_iAmount[ONCE] = KvZc.GetNum("once_credits", 0);
            else
            {
                g_iAmount[BONUS] = KvZc.GetNum("bonus", 0);
                g_iAmount[BONUSWR] = KvZc.GetNum("bonus_wr", 0);
                g_iAmount[WR] = KvZc.GetNum("wr", 0);

                char sPos[10];
                for (int i = 1; i <= MAXPLAYERS; i++)
                {
                    IntToString(i, sPos, sizeof(sPos));
                    g_iPositionCredits[i] = KvZc.GetNum(sPos, -1);
                    if (g_iPositionCredits[i] == -1)
                    {
                        g_iPositionCredits[i] = KvZc.GetNum("0");
                    }
                }
            }
            g_bSupportedMap = true;
        }
        else g_bSupportedMap = false;
    }
    delete KvZc;
}
 

Вложения

  • shop_zone_credits.sp
    6.3 КБ · Просмотры: 6

Nekro

Терра инкогнита
Сообщения
4,025
Реакции
2,260
@Nekro, @Ice_Sochi,
error.txt:
shop_zone_credits.sp
C:\Users\User\Desktop\spedit1.2.0.3\sourcepawn\configs\sm_one_six\include\sourcemod.inc(140) : error 025: function heading differs from prototype
C:\Users\User\Desktop\spedit1.2.0.3\sourcepawn\configs\sm_one_six\include\morecolors.inc(9) : warning 207: unknown #pragma
C:\Users\User\Desktop\spedit1.2.0.3\sourcepawn\configs\sm_one_six\include\morecolors.inc(9) : error 038: extra characters on line
C:\Users\User\Desktop\spedit1.2.0.3\sourcepawn\configs\sm_one_six\include\regex.inc(97) : error 010: invalid function or declaration
C:\Users\User\Desktop\spedit1.2.0.3\sourcepawn\configs\sm_one_six\include\regex.inc(106) : error 042: invalid combination of class specifiers
C:\Users\User\Desktop\spedit1.2.0.3\sourcepawn\configs\sm_one_six\include\regex.inc(106) : error 001: expected token: ")", but found "-identifier-"
C:\Users\User\Desktop\spedit1.2.0.3\sourcepawn\configs\sm_one_six\include\regex.inc(106) : error 010: invalid function or declaration
C:\Users\User\Desktop\spedit1.2.0.3\sourcepawn\configs\sm_one_six\include\regex.inc(106) : fatal error 127: too many error messages on one line
готово
Что у меня в sp файле:
[Shop] Zone Credits.sp:
#include <sourcemod>
#include <morecolors>
#include <shop>

#undef REQUIRE_PLUGIN
#include <shavit>

#pragma semicolon 1
#pragma newdecls required

public Plugin myinfo =
{
    name = "[Shop] Zone Credits",
    author = "Tonki_Ton",
    version = "1.4.0",
    url = "https://hlmod.ru"
};

enum
{
    BONUS,
    BONUSWR,
    WR,
    ONCE,
    CREDITS
};

ArrayList hWhoFinish;

char g_sCurrentMap[34];

int g_iCurrentPosition,
    g_iEventMode,
    g_iAmount[CREDITS],
    g_iPositionCredits[MAXPLAYERS+1];
   
bool g_bType,
     g_bAllChat,
     g_bSupportedMap;

public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
{
    MarkNativeAsOptional("Shop_GiveClientGold");
    return APLRes_Success;
}

public void OnPluginStart()
{
    HookEvent("round_start", OnRoundStart, EventHookMode_PostNoCopy);

    hWhoFinish = new ArrayList(ByteCountToCells(32));

    RegAdminCmd("sm_zc_reload", reload, ADMFLAG_ROOT);

    LoadTranslations("shop_zone_credits.phrases");
}

public Action reload(int client, int args)
{
    PrintToConsole(client, "Конфиг перезагружен!");
    OnMapStart();

    return Plugin_Handled;
}

public void OnMapStart()
{
    GetCurrentMap(g_sCurrentMap, sizeof(g_sCurrentMap));
    LoadCfg();

    hWhoFinish.Clear();
}

public Action OnRoundStart(Event event, const char[] name, bool dontBroadcast)
{
    g_iCurrentPosition = 0;
}

//influx
public void Influx_OnTimerFinishPost( int client, int runid, int mode, int style, float time, float prev_pb, float prev_best, int flags)
{
    FinishMapEvent(client, (runid == 1) ? false:true, !(flags & (1 << 1)) ? false:true);
}

//shavit
public void Shavit_OnFinish(int client, int style, float time, int jumps, int strafes, float sync, int track)
{
    float WrTime;
    Shavit_GetWRTime(style, WrTime, track);

    FinishMapEvent(client, (track == 0) ? false:true, !(WrTime == 0.0 || time < WrTime) ? false:true);
}

//ZipCore Dr.Api fork
public void OnTimerRecord(int client, int track, int style, float time, float lasttime, int currentrank, int newrank)
{
    FinishMapEvent(client, (track == 0) ? false:true, (newrank != 1) ? false:true);
}

//ckSurf
public Action ckSurf_OnMapFinished(int client, float fRunTime, char sRunTime[54], int rank)
{
    FinishMapEvent(client, false, (rank != 1) ? false:true);
}

public Action ckSurf_OnBonusFinished(int client, float fRunTime, char sRunTime[54], int rank)
{
    FinishMapEvent(client, true, (rank != 1) ? false:true);
}

//blacky
public int OnTimerFinished_Post(int client, float Time, int Type, int Style, bool NewTime, int OldPosition, int NewPosition)
{
    FinishMapEvent(client, (Type == 1) ? false:true, (NewPosition != 1) ? false:true);
}

void FinishMapEvent(int client, bool bonus, bool wr)
{
    if (!g_bSupportedMap) return;

    if (!g_iEventMode && !bonus && g_iAmount[ONCE] > 0)
    {
        if (!g_bType) Shop_GiveClientCredits(client, g_iAmount[ONCE]);
        else Shop_GiveClientGold(client, g_iAmount[ONCE]);
       
        CPrintToChatAll("%t", g_bType ? "mapfinish_once_credits":"mapfinish_once_gold", client, g_iAmount[ONCE]);

        g_bSupportedMap = false;
    }
    else
    {
        if (g_iEventMode == 2)
           {
            char id[32];

            GetClientAuthId(client, AuthId_Steam2, id, sizeof(id), false);

            if (hWhoFinish.FindString(id) == -1) hWhoFinish.PushString(id);
            else if (hWhoFinish.FindString(id) != -1) return;
        }

        if (!bonus && !wr)
        {
            if (++g_iCurrentPosition > MAXPLAYERS) g_iCurrentPosition = MAXPLAYERS;
            if (g_iPositionCredits[g_iCurrentPosition] < 1) return;

            if (!g_bType) Shop_GiveClientCredits(client, g_iPositionCredits[g_iCurrentPosition]);
            else Shop_GiveClientGold(client, g_iPositionCredits[g_iCurrentPosition]);

            if (!g_bAllChat) CPrintToChat(client, "%t", !g_bType ? "MapFinish_Credits":"MapFinish_Gold", g_iPositionCredits[g_iCurrentPosition]);
            else CPrintToChatAll("%t", !g_bType ? "MapFinish_Credits_All":"MapFinish_Gold_All", client, g_iPositionCredits[g_iCurrentPosition]);
        }
        else if (!bonus && wr && g_iAmount[WR] > 0)
        {
            if (!g_bType) Shop_GiveClientCredits(client, g_iAmount[WR]);
            else Shop_GiveClientGold(client, g_iAmount[WR]);

            if (!g_bAllChat) CPrintToChat(client, "%t",  !g_bType ? "MapFinish_WR_Credits":"MapFinish_WR_Gold", g_iAmount[WR]);
            else CPrintToChatAll("%t", !g_bType ? "MapFinish_WR_Credits_All":"MapFinish_WR_Gold_All", client, g_iAmount[WR]);
        }

        if (bonus && !wr && g_iAmount[BONUS] > 0)
        {
            if (!g_bType) Shop_GiveClientCredits(client, g_iAmount[BONUS]);
            else Shop_GiveClientGold(client, g_iAmount[BONUS]);

            if (!g_bAllChat) CPrintToChat(client, "%t",  !g_bType ? "MapFinish_Bonus_Credits":"MapFinish_Bonus_Gold", g_iAmount[BONUS]);
            else CPrintToChatAll("%t", !g_bType ? "MapFinish_Bonus_Credits_All":"MapFinish_Bonus_Gold_All", client, g_iAmount[BONUS]);
        }
        else if (bonus && wr && g_iAmount[BONUSWR] > 0)
        {
            if (!g_bType) Shop_GiveClientCredits(client, g_iAmount[BONUSWR]);
            else Shop_GiveClientGold(client, g_iAmount[BONUSWR]);

            if (!g_bAllChat) CPrintToChat(client, "%t",  !g_bType ? "MapFinish_Bonus_WR_Credits":"MapFinish_Bonus_WR_Gold", g_iAmount[BONUSWR]);
            else CPrintToChatAll("%t", !g_bType ? "MapFinish_Bonus_WR_Credits_All":"MapFinish_Bonus_WR_Gold_All", client, g_iAmount[BONUSWR]);
        }
    }
}

void LoadCfg()
{
    char Buffer[128];

    KeyValues KvZc = new KeyValues("Credits");

    BuildPath(Path_SM, Buffer, sizeof(Buffer), "configs/shop/zone_credits.txt");
    if(!KvZc.ImportFromFile(Buffer))
    {
        SetFailState("Конфиг zone credits отсутсвует!");
    }
    else
    {
        KvZc.Rewind();

        g_iEventMode = KvZc.GetNum("zc_mode", 1);
        g_bAllChat = view_as<bool>(KvZc.GetNum("announce_to_all", 0));

        if (KvZc.JumpToKey(g_sCurrentMap, false))
        {
            g_bType = view_as<bool>(KvZc.GetNum("currency_type", 0));

            if (!g_iEventMode) g_iAmount[ONCE] = KvZc.GetNum("once_credits", 0);
            else
            {
                g_iAmount[BONUS] = KvZc.GetNum("bonus", 0);
                g_iAmount[BONUSWR] = KvZc.GetNum("bonus_wr", 0);
                g_iAmount[WR] = KvZc.GetNum("wr", 0);

                char sPos[10];
                for (int i = 1; i <= MAXPLAYERS; i++)
                {
                    IntToString(i, sPos, sizeof(sPos));
                    g_iPositionCredits[i] = KvZc.GetNum(sPos, -1);
                    if (g_iPositionCredits[i] == -1)
                    {
                        g_iPositionCredits[i] = KvZc.GetNum("0");
                    }
                }
            }
            g_bSupportedMap = true;
        }
        else g_bSupportedMap = false;
    }
    delete KvZc;
}
Используйте другой соурсмод
 

panikajo

Участник
Сообщения
866
Реакции
231
Если надо есть такой


C++:
/**
 * Расширенные возможности чата для SourceMod 1.10+
 *
 * https://github.com/deathscore13/ChatModern
 */

#if defined _chat_modern_included
 #endinput
#endif
#define _chat_modern_included

// После изменения констант необходимо пересобрать chatmodern.smx
#define CHAT_MODERN_NEW_SIZE 512 * 3        /**< Новый размер чата (в игре поддерживаются символы меньше 4 байт) */
#define CHAT_MODERN_NEW_SIZE_COLOR 128      /**< Дополнительный размер для тегов */

#define CHAT_MODERN_SIZE 192                /**< Безопасный размер чата */
#define CHAT_MODERN_SIZE_COLOR 9            /**< Максимальный размер цвета */

#define CHAT_MODERN_TAGS_CSENSITIVE false   /**< Чувствительность тегов к регистру */

/**
 * Проверяет поддерживает игра HEX или нет
 *
 * @param %1        EngineVersion
 *
 * @return          true если поддерживает, false если нет
 */
#define CHAT_MODERN_HEX_SUPPORT(%1) (%1 == Engine_CSS || %1 == Engine_TF2 || %1 == Engine_HL2DM || %1 == Engine_DODS)

#define CHAT_MODERN_HEX_SUPPORT_CASE Engine_CSS, Engine_TF2, Engine_HL2DM, Engine_DODS  /**< Перечисление игр, поддерживаемых HEX */

/**
 * Проверяет поддерживает игра protobuf или нет
 *
 * @param %1        EngineVersion
 *
 * @return          true если поддерживает, false если нет
 */
#define CHAT_MODERN_PROTOBUF_SUPPORT(%1) (%1 == Engine_CSGO || %1 == Engine_Blade)

#define CHAT_MODERN_PROTOBUF_SUPPORT_CASE Engine_CSS, Engine_TF2, Engine_HL2DM, Engine_DODS  /**< Перечисление игр, поддерживаемых protobuf */

#define CHAT_MODERN_HUD_PRINTTALK 3     /**< TextMsg */

// Цвета Engine_SourceSDK2006
stock char ChatModern_sTagsEP1[][] = {
    /* 00 */    "{default}",
    /* 01 */    "{gold}",
    /* 02 */    "{lightgreen}",
    /* 03 */    "{green}"
};
stock int ChatModern_iCodesEP1[] = {
    /* 00 */    1,
    /* 01 */    1,
    /* 02 */    3,
    /* 03 */    4
};

stock char ChatModern_sTagsTeamEP1[][] = {
    /* 00 */    "{team}",
    /* 01 */    "{team1}",
    /* 02 */    "{team2}",
    /* 03 */    "{team3}",
    /* 04 */    "{grey}",
    /* 05 */    "{red}",
    /* 06 */    "{blue}",
};
stock int ChatModern_iTeamEP1[] = {
    /* 00 */    0,  // текущая команда
    /* 01 */    1,
    /* 02 */    2,
    /* 03 */    3,
    /* 04 */    1,
    /* 05 */    2,
    /* 06 */    3,
};

// Цвета для игр поддерживаемых HEX
stock char ChatModern_sTagsHEX[][] = {
    /* 00 */    "{default}",
    /* 01 */    "{green}",
    /* 02 */    "{lime}",
    /* 03 */    "{lightgreen}",
    /* 04 */    "{darkred}",
    /* 05 */    "{purple}",
    /* 06 */    "{red}",
    /* 07 */    "{grey}",
    /* 08 */    "{yellow}",
    /* 09 */    "{blue}",
    /* 10 */    "{darkblue}",
    /* 11 */    "{bluegrey}",
    /* 12 */    "{pink}",
    /* 13 */    "{lightred}",
    /* 14 */    "{gold}"
};
stock char ChatModern_sCodesHEX[][] = {
    /* 00 */    {1},
    /* 01 */    {4},
    /* 02 */    {5},
    /* 03 */    "\x07BFFE90",   // чтобы не использовать {3} и не разбивать текст в ChatModern.CPrintToChat
    /* 04 */    "\x07FF0000",
    /* 05 */    "\x07B880EF",
    /* 06 */    "\x07FF4040",
    /* 07 */    "\x07C9C9C9",
    /* 08 */    "\x07ECE479",
    /* 09 */    "\x075C96D6",
    /* 10 */    "\x074C6AFF",
    /* 11 */    "\x07B0C2D8",
    /* 12 */    "\x07D22CE3",
    /* 13 */    "\x07EA4B4B",
    /* 14 */    "\x07E0AD40"
};

stock int ChatModern_iCodesHEX1[] = {
    /* 00 */    1,
    /* 01 */    3,
    /* 02 */    4,
    /* 03 */    5,
    /* 04 */    7,
    /* 05 */    8
};

#define CHAT_MODERN_HEX_PERSONAL_START '{'      /**< Начало персонального HEX тега */
#define CHAT_MODERN_HEX_PERSONAL_HEADER '#'     /**< Заголовок персонального HEX тега */
#define CHAT_MODERN_HEX_PERSONAL_END '}'        /**< Конец персонального HEX тега */

// Цвета для остальных игр
stock char ChatModern_sTags[][] = {
    /* 00 */    "{default}",
    /* 01 */    "{darkred}",
    /* 02 */    "{purple}",
    /* 03 */    "{green}",
    /* 04 */    "{lightgreen}",
    /* 05 */    "{lime}",
    /* 06 */    "{red}",
    /* 07 */    "{grey}",
    /* 08 */    "{yellow}",
    /* 09 */    "{blue}",
    /* 10 */    "{darkblue}",
    /* 11 */    "{bluegrey}",
    /* 12 */    "{pink}",
    /* 13 */    "{lightred}",
    /* 14 */    "{gold}"
};
stock int ChatModern_iCodes[] = {
    /* 00 */    1,
    /* 01 */    2,
    /* 02 */    3,
    /* 03 */    4,
    /* 04 */    5,
    /* 05 */    6,
    /* 06 */    7,
    /* 07 */    8,
    /* 08 */    9,
    /* 09 */    11,
    /* 10 */    12,
    /* 11 */    13,
    /* 12 */    14,
    /* 13 */    15,
    /* 14 */    16
};

// Для HEX и остальных
stock char ChatModern_sTagsTeam[][] = {
    /* 00 */    "{team}",
    /* 01 */    "{team1}",
    /* 02 */    "{team2}",
    /* 03 */    "{team3}"
};
stock int ChatModern_iTeam[] = {
    /* 00 */    0,  // текущая команда
    /* 01 */    1,
    /* 02 */    2,
    /* 03 */    3
};

// Для всех
stock const char ChatModern_sTagOld[] = "{old}";    /**< Тег для применения предыдущего цвета */


methodmap ChatModern < Handle
{
    /**
     * Создание объекта ChatModern
     * Не требует закрытия через CloseHandle()
     *
     * @param engine        EngineVersion
     *
     * @return              Объект ChatModern
     */
    public ChatModern(EngineVersion engine)
    {
        // неожиданно, правда?
        return view_as<ChatModern>(engine);
    }

    /**
     * Вывод текста в чат, не переполняющий буфер
     *
     * @param client        Индекс клиента
     * @param format        Строка для форматирования
     * @param ...           Аргументы для форматирования
     */
    public native void TextMsg(int client, const char[] format, any ...);

    /**
     * Замена тегов с цветами и вывод текста в чат, не переполняющий буфер
     *
     * @param client        Индекс клиента
     * @param format        Строка для форматирования
     * @param ...           Аргументы для форматирования
     */
    public native void CTextMsg(int client, const char[] format, any ...);

    /**
     * Вывод текста в чат через SayText2, не переполняющий буфер
     *
     * @param client        Индекс клиента
     * @param entity        Энтити отправителя
     * @param format        Строка для форматирования
     * @param ...           Аргументы для форматирования
     */
    public native void SayText2(int client, int entity, const char[] format, any ...);

    /**
     * Замена тегов с командами и вывод текста в чат через SayText2, не переполняющий буфер
     *
     * @param client        Индекс клиента
     * @param format        Строка для форматирования
     * @param ...           Аргументы для форматирования
     */
    public native void CSayText2(int client, const char[] format, any ...);

    /**
     * Замена тегов с цветами и командами, и вывод текста в чат через TextMsg и SayText2, не переполняющий буфер
     *
     * @param client        Индекс клиента
     * @param format        Строка для форматирования
     * @param ...           Аргументы для форматирования
     */
    public native void CPrintToChat(int client, const char[] format, any ...);

#if !defined SPCOMP_MOD || defined PUBVAR_MAXCLIENTS
    /**
     * Вывод текста в чат для всех игроков, не переполняющий буфер
     *
     * @param format        Строка для форматирования
     * @param ...           Аргументы для форматирования
     */
    public void TextMsgAll(const char[] format, any ...)
    {
        int i;
        char buffer[CHAT_MODERN_NEW_SIZE];
        while (++i <= MaxClients)
        {
            if (IsClientInGame(i) && !IsFakeClient(i))
            {
                SetGlobalTransTarget(i);
                VFormat(buffer, sizeof(buffer), format, 3);
                this.TextMsg(i, "%s", buffer);
            }
        }
    }

    /**
     * Замена тегов с цветами и вывод текста в чат для всех игроков, не переполняющий буфер
     *
     * @param format        Строка для форматирования
     * @param ...           Аргументы для форматирования
     */
    public void CTextMsgAll(const char[] format, any ...)
    {
        int i;
        char buffer[CHAT_MODERN_NEW_SIZE + CHAT_MODERN_NEW_SIZE_COLOR];
        while (++i <= MaxClients)
        {
            if (IsClientInGame(i) && !IsFakeClient(i))
            {
                SetGlobalTransTarget(i);
                VFormat(buffer, sizeof(buffer), format, 3);
                this.CTextMsg(i, "%s", buffer);
            }
        }
    }
    
    /**
     * Вывод текста в чат через SayText2 для всех игроков, не переполняющий буфер
     *
     * @param entity        Энтити отправителя
     * @param format        Строка для форматирования
     * @param ...           Аргументы для форматирования
     */
    public void SayText2All(int entity, const char[] format, any ...)
    {
        int i;
        char buffer[CHAT_MODERN_NEW_SIZE];
        while (++i <= MaxClients)
        {
            if (IsClientInGame(i) && !IsFakeClient(i))
            {
                SetGlobalTransTarget(i);
                VFormat(buffer, sizeof(buffer), format, 3);
                this.SayText2(i, entity, "%s", buffer);
            }
        }
    }

    /**
     * Замена тегов с командами и вывод текста в чат через SayText2 для всех игроков, не переполняющий буфер
     *
     * @param format        Строка для форматирования
     * @param ...           Аргументы для форматирования
     */
    public void CSayText2All(const char[] format, any ...)
    {
        int i;
        char buffer[CHAT_MODERN_NEW_SIZE + CHAT_MODERN_NEW_SIZE_COLOR];
        while (++i <= MaxClients)
        {
            if (IsClientInGame(i) && !IsFakeClient(i))
            {
                SetGlobalTransTarget(i);
                VFormat(buffer, sizeof(buffer), format, 3);
                this.CSayText2(i, "%s", buffer);
            }
        }
    }

    /**
     * Замена тегов с цветами и командами, и вывод текста в чат через TextMsg/SayText2 для всех игроков, не переполняющий буфер
     *
     * @param format        Строка для форматирования
     * @param ...           Аргументы для форматирования
     */
    public void CPrintToChatAll(const char[] format, any ...)
    {
        int i;
        char buffer[CHAT_MODERN_NEW_SIZE + CHAT_MODERN_NEW_SIZE_COLOR];
        while (++i <= MaxClients)
        {
            if (IsClientInGame(i) && !IsFakeClient(i))
            {
                SetGlobalTransTarget(i);
                VFormat(buffer, sizeof(buffer), format, 3);
                this.CPrintToChat(i, "%s", buffer);
            }
        }
    }
#endif

    /**
     * Заменяет теги цветов в буфере в соответствии с кодами
     *
     * @param buffer        Буфер
     * @param maxlen        Размер буфера
     * @param tags          Массив с тегами
     * @param maxtags       Размер массива с тегами
     * @param codes         Массив с кодами
     */
    public static void Replace(char[] buffer, int maxlen, const char[][] tags, int maxtags, const int[] codes)
    {
        int i = -1;
        while (++i < maxtags)
            ReplaceString(buffer, maxlen, tags[i], view_as<char>(codes[i]), CHAT_MODERN_TAGS_CSENSITIVE);
    }

    /**
     * Заменяет теги цветов в буфере в соответствии с HEX кодами
     *
     * @param buffer        Буфер
     * @param maxlen        Размер буфера
     * @param tags          Массив с тегами
     * @param maxtags       Размер массива с тегами
     * @param codes         Массив с кодами
     */
    public static void ReplaceHEX(char[] buffer, int maxlen, const char[][] tags, int maxtags, const char[][] codes)
    {
        int i = -1;
        while (++i < maxtags)
            ReplaceString(buffer, maxlen, tags[i], codes[i], CHAT_MODERN_TAGS_CSENSITIVE);
    }

    /**
     * Поиск персонального HEX тега в буфере
     *
     * @param buffer        Буфер
     * @param code          Применяемый код (7/8)
     * @param end           Искать с конца
     *
     * @return              Позиция тега или -1 если не найдено
     */
    public static int FindPersonalHEX(char[] buffer, int maxlen, int &code = 0, bool end = false)
    {
        if (end)
        {
            int i = strlen(buffer);
            while (0 <= --i)
            {
                if (0 <= i - 8 &&
                    buffer[i] == CHAT_MODERN_HEX_PERSONAL_END && buffer[i - 7] == CHAT_MODERN_HEX_PERSONAL_HEADER &&
                    buffer[i - 8] == CHAT_MODERN_HEX_PERSONAL_START)
                {
                    code = 7;
                    return i - 8;
                }
                else if (0 <= i - 10 &&
                    buffer[i] == CHAT_MODERN_HEX_PERSONAL_END && buffer[i - 9] == CHAT_MODERN_HEX_PERSONAL_HEADER &&
                    buffer[i - 10] == CHAT_MODERN_HEX_PERSONAL_START)
                {
                    code = 8;
                    return i - 10;
                }
            }
        }
        else
        {
            int i = -1;
            while (buffer[++i])
            {
                if (i + 8 < maxlen &&
                    buffer[i] == CHAT_MODERN_HEX_PERSONAL_START && buffer[i + 1] == CHAT_MODERN_HEX_PERSONAL_HEADER &&
                    buffer[i + 8] == CHAT_MODERN_HEX_PERSONAL_END)
                {
                    code = 7;
                    return i;
                }
                else if (i + 10 < maxlen &&
                    buffer[i] == CHAT_MODERN_HEX_PERSONAL_START && buffer[i + 1] == CHAT_MODERN_HEX_PERSONAL_HEADER &&
                    buffer[i + 10] == CHAT_MODERN_HEX_PERSONAL_END)
                {
                    code = 8;
                    return i;
                }
            }
        }
        return -1;
    }

    /**
     * Заменяет персональные HEX теги в буфере
     *
     * @param buffer        Буфер
     */
    public static void ReplacePersonalHEX(char[] buffer, int maxlen)
    {
        int pos, code;
        while ((pos = ChatModern.FindPersonalHEX(buffer, maxlen, code)) != -1)
        {
            if (code == 7)
            {
                buffer[pos] = 7;
                buffer[pos + 1] = buffer[pos + 2];
                buffer[pos + 2] = buffer[pos + 3];
                buffer[pos + 3] = buffer[pos + 4];
                buffer[pos + 4] = buffer[pos + 5];
                buffer[pos + 5] = buffer[pos + 6];
                buffer[pos + 6] = buffer[pos + 7];

                pos += 6;
                while (buffer[++pos])
                    buffer[pos] = buffer[pos + 2];
                buffer[pos + 1] = '\0';
            }
            else
            {
                buffer[pos] = 8;
                buffer[pos + 1] = buffer[pos + 2];
                buffer[pos + 2] = buffer[pos + 3];
                buffer[pos + 3] = buffer[pos + 4];
                buffer[pos + 4] = buffer[pos + 5];
                buffer[pos + 5] = buffer[pos + 6];
                buffer[pos + 6] = buffer[pos + 7];
                buffer[pos + 7] = buffer[pos + 8];
                buffer[pos + 8] = buffer[pos + 9];

                pos += 8;
                while (buffer[++pos])
                    buffer[pos] = buffer[pos + 2];
                buffer[pos + 1] = '\0';
            }
        }
    }

    /**
     * Заменяет теги цветов команд до следующего тега
     * Например до {team1} в "{team}бла бла {team}бла {team1}бла {team}бла"
     *
     * @param buffer        Буфер
     * @param maxlen        Размер буфера
     * @param tags          Массив с тегами
     * @param maxtags       Размер массива с тегами
     * @param index         Индекс текущего тега из массива с тегами
     *
     * @return              Позиция цвета другой команды
     */
    public static int ReplaceTeam(char[] buffer, int maxlen, const char[][] tags, int maxtags, int &index = 0)
    {
        int i = -1, pos = maxlen, res;
        while (++i < maxtags)
        {
            if ((res = StrContains(buffer, tags[i], CHAT_MODERN_TAGS_CSENSITIVE)) != -1 && res < pos)
            {
                pos = res;
                index = i;
            }
        }

        if (pos == maxlen)
        {
            index = -1;
        }
        else
        {
            i = -1;
            pos = maxlen;
            while (++i < maxtags)
                if (i != index && (res = StrContains(buffer, tags[i], CHAT_MODERN_TAGS_CSENSITIVE)) != -1 && res < pos)
                    pos = res;
            
            if (pos == maxlen)
            {
                ReplaceString(buffer, maxlen, tags[index], view_as<char>({3}), CHAT_MODERN_TAGS_CSENSITIVE);
            }
            else
            {
                i = buffer[pos];
                buffer[pos] = '\0';
                res = pos;
                pos -= (strlen(tags[index]) - 1) * ReplaceString(buffer, pos, tags[index], view_as<char>({3}), CHAT_MODERN_TAGS_CSENSITIVE);
                buffer[res] = i;
                strcopy(buffer[pos], maxlen - pos, buffer[res]);
            }
        }
        return pos == maxlen ? -1 : pos;
    }

    /**
     * Замена тега tagOld и кода codeOld на предыдущий тег цвета или команды
     *
     * @param buffer        Буфер
     * @param maxlen        Размер буфера
     */
    public void ReplaceOld(char[] buffer, int maxlen)
    {
        char cpy[CHAT_MODERN_NEW_SIZE + CHAT_MODERN_NEW_SIZE_COLOR];
        int endpos, res, pos, pos2, index, type, i, chr;
        if (view_as<EngineVersion>(this) == Engine_SourceSDK2006)
        {
            while ((endpos = StrContains(buffer, ChatModern_sTagOld)) != -1)
            {
                buffer[endpos] = '\0';
                
                pos = i = -1;
                while (++i < sizeof(ChatModern_sTagsEP1))
                    if (pos < (res = FindEndSubStr(buffer, ChatModern_sTagsEP1[i], CHAT_MODERN_TAGS_CSENSITIVE)))
                        pos = res;
                
                i = -1
                while (++i < sizeof(ChatModern_sTagsTeamEP1))
                    if (pos < (res = FindEndSubStr(buffer, ChatModern_sTagsTeamEP1[i], CHAT_MODERN_TAGS_CSENSITIVE)))
                        pos = res;

                index = type = 0;
                if (pos != -1)
                {
                    chr = buffer[pos];
                    buffer[pos] = '\0';

                    pos2 = i = -1;
                    while (++i < sizeof(ChatModern_sTagsEP1))
                    {
                        if (pos2 < (res = FindEndSubStr(buffer, ChatModern_sTagsEP1[i], CHAT_MODERN_TAGS_CSENSITIVE)))
                        {
                            pos2 = res;
                            index = i;
                        }
                    }

                    i = -1;
                    while (++i < sizeof(ChatModern_sTagsTeamEP1))
                    {
                        if (pos2 < (res = FindEndSubStr(buffer, ChatModern_sTagsTeamEP1[i], CHAT_MODERN_TAGS_CSENSITIVE)))
                        {
                            pos2 = res;
                            index = i;
                            type = 1;
                        }
                    }

                    buffer[pos] = chr;
                }

                if (type)
                {
                    pos = endpos + strlen(ChatModern_sTagsTeamEP1[index]);
                    if (0 < (res = maxlen - pos))
                    {
                        strcopy(cpy, sizeof(cpy), buffer[endpos + sizeof(ChatModern_sTagOld) - 1]);
                        strcopy(buffer[pos], res, cpy);
                    }

                    res = maxlen - 1;
                    while (ChatModern_sTagsTeamEP1[index][++i] && endpos < res)
                        buffer[endpos++] = ChatModern_sTagsTeamEP1[index][i];
                }
                else
                {
                    pos = endpos + strlen(ChatModern_sTagsEP1[index]);
                    if (0 < (res = maxlen - pos))
                    {
                        strcopy(cpy, sizeof(cpy), buffer[endpos + sizeof(ChatModern_sTagOld) - 1]);
                        strcopy(buffer[pos], res, cpy);
                    }

                    res = maxlen - 1;
                    while (ChatModern_sTagsEP1[index][++i] && endpos < res)
                        buffer[endpos++] = ChatModern_sTagsEP1[index][i];
                }
            }
        }
        else if (CHAT_MODERN_HEX_SUPPORT(view_as<EngineVersion>(this)))
        {
            while ((endpos = StrContains(buffer, ChatModern_sTagOld)) != -1)
            {
                buffer[endpos] = '\0';
                
                pos = i = -1;
                while (++i < sizeof(ChatModern_sTagsHEX))
                    if (pos < (res = FindEndSubStr(buffer, ChatModern_sTagsHEX[i], CHAT_MODERN_TAGS_CSENSITIVE)))
                        pos = res;
                
                i = -1
                while (++i < sizeof(ChatModern_sTagsTeam))
                    if (pos < (res = FindEndSubStr(buffer, ChatModern_sTagsTeam[i], CHAT_MODERN_TAGS_CSENSITIVE)))
                        pos = res;
                
                if (pos < (res = ChatModern.FindPersonalHEX(buffer, maxlen, _, true)))
                    pos = res;

                index = type = 0;
                if (pos != -1)
                {
                    chr = buffer[pos];
                    buffer[pos] = '\0';

                    pos2 = i = -1;
                    while (++i < sizeof(ChatModern_sTagsHEX))
                    {
                        if (pos2 < (res = FindEndSubStr(buffer, ChatModern_sTagsHEX[i], CHAT_MODERN_TAGS_CSENSITIVE)))
                        {
                            pos2 = res;
                            index = i;
                        }
                    }

                    i = -1;
                    while (++i < sizeof(ChatModern_sTagsTeam))
                    {
                        if (pos2 < (res = FindEndSubStr(buffer, ChatModern_sTagsTeam[i], CHAT_MODERN_TAGS_CSENSITIVE)))
                        {
                            pos2 = res;
                            index = i;
                            type = 1;
                        }
                    }

                    if (pos2 < (res = ChatModern.FindPersonalHEX(buffer, maxlen, type, true)))
                        pos2 = res;

                    buffer[pos] = chr;
                }


                i = -1;
                if (type == 1)
                {
                    pos = endpos + strlen(ChatModern_sTagsTeam[index]);
                    if (0 < (res = maxlen - pos))
                    {
                        strcopy(cpy, sizeof(cpy), buffer[endpos + sizeof(ChatModern_sTagOld) - 1]);
                        strcopy(buffer[pos], res, cpy);
                    }

                    res = maxlen - 1;
                    while (ChatModern_sTagsTeam[index][++i] && endpos < res)
                        buffer[endpos++] = ChatModern_sTagsTeam[index][i];
                }
                else if (type)
                {
                    pos = endpos + (type == 7 ? 9 : 11);
                    if (0 < (res = maxlen - pos))
                    {
                        strcopy(cpy, sizeof(cpy), buffer[endpos + sizeof(ChatModern_sTagOld) - 1]);
                        strcopy(buffer[pos], res, cpy);
                    }

                    res = maxlen - 1;
                    pos2--;
                    while (buffer[++pos2] && endpos < res && endpos < pos)
                        buffer[endpos++] = buffer[pos2];
                }
                else
                {
                    pos = endpos + strlen(ChatModern_sTagsHEX[index]);
                    if (0 < (res = maxlen - pos))
                    {
                        strcopy(cpy, sizeof(cpy), buffer[endpos + sizeof(ChatModern_sTagOld) - 1]);
                        strcopy(buffer[pos], res, cpy);
                    }

                    res = maxlen - 1;
                    while (ChatModern_sTagsHEX[index][++i] && endpos < res)
                        buffer[endpos++] = ChatModern_sTagsHEX[index][i];
                }
            }
        }
        else
        {
            while ((endpos = StrContains(buffer, ChatModern_sTagOld)) != -1)
            {
                buffer[endpos] = '\0';
                
                pos = i = -1;
                while (++i < sizeof(ChatModern_sTags))
                    if (pos < (res = FindEndSubStr(buffer, ChatModern_sTags[i], CHAT_MODERN_TAGS_CSENSITIVE)))
                        pos = res;
                
                i = -1
                while (++i < sizeof(ChatModern_sTagsTeam))
                    if (pos < (res = FindEndSubStr(buffer, ChatModern_sTagsTeam[i], CHAT_MODERN_TAGS_CSENSITIVE)))
                        pos = res;

                index = type = 0;
                if (pos != -1)
                {
                    chr = buffer[pos];
                    buffer[pos] = '\0';

                    pos2 = i = -1;
                    while (++i < sizeof(ChatModern_sTags))
                    {
                        if (pos2 < (res = FindEndSubStr(buffer, ChatModern_sTags[i], CHAT_MODERN_TAGS_CSENSITIVE)))
                        {
                            pos2 = res;
                            index = i;
                        }
                    }

                    i = -1;
                    while (++i < sizeof(ChatModern_sTagsTeam))
                    {
                        if (pos2 < (res = FindEndSubStr(buffer, ChatModern_sTagsTeam[i], CHAT_MODERN_TAGS_CSENSITIVE)))
                        {
                            pos2 = res;
                            index = i;
                            type = 1;
                        }
                    }

                    buffer[pos] = chr;
                }


                i = -1;
                if (type)
                {
                    pos = endpos + strlen(ChatModern_sTagsTeam[index]);
                    if (0 < (res = maxlen - pos))
                    {
                        strcopy(cpy, sizeof(cpy), buffer[endpos + sizeof(ChatModern_sTagOld) - 1]);
                        strcopy(buffer[pos], res, cpy);
                    }

                    res = maxlen - 1;
                    while (ChatModern_sTagsTeam[index][++i] && endpos < res)
                        buffer[endpos++] = ChatModern_sTagsTeam[index][i];
                }
                else
                {
                    pos = endpos + strlen(ChatModern_sTags[index]);
                    if (0 < (res = maxlen - pos))
                    {
                        strcopy(cpy, sizeof(cpy), buffer[endpos + sizeof(ChatModern_sTagOld) - 1]);
                        strcopy(buffer[pos], res, cpy);
                    }

                    res = maxlen - 1;
                    while (ChatModern_sTags[index][++i] && endpos < res)
                        buffer[endpos++] = ChatModern_sTags[index][i];
                }
            }
        }
    }
}


public SharedPlugin __pl_chatmodern =
{
    name = "chatmodern",
    file = "chatmodern.smx",
#if defined REQUIRE_PLUGIN
    required = 1,
#else
    required = 0,
#endif
};
 

DeathScore13

пирожок. пирожочек.
Сообщения
734
Реакции
403
Если надо есть такой


C++:
/**
 * Расширенные возможности чата для SourceMod 1.10+
 *
 * https://github.com/deathscore13/ChatModern
 */

#if defined _chat_modern_included
 #endinput
#endif
#define _chat_modern_included

// После изменения констант необходимо пересобрать chatmodern.smx
#define CHAT_MODERN_NEW_SIZE 512 * 3        /**< Новый размер чата (в игре поддерживаются символы меньше 4 байт) */
#define CHAT_MODERN_NEW_SIZE_COLOR 128      /**< Дополнительный размер для тегов */

#define CHAT_MODERN_SIZE 192                /**< Безопасный размер чата */
#define CHAT_MODERN_SIZE_COLOR 9            /**< Максимальный размер цвета */

#define CHAT_MODERN_TAGS_CSENSITIVE false   /**< Чувствительность тегов к регистру */

/**
 * Проверяет поддерживает игра HEX или нет
 *
 * @param %1        EngineVersion
 *
 * @return          true если поддерживает, false если нет
 */
#define CHAT_MODERN_HEX_SUPPORT(%1) (%1 == Engine_CSS || %1 == Engine_TF2 || %1 == Engine_HL2DM || %1 == Engine_DODS)

#define CHAT_MODERN_HEX_SUPPORT_CASE Engine_CSS, Engine_TF2, Engine_HL2DM, Engine_DODS  /**< Перечисление игр, поддерживаемых HEX */

/**
 * Проверяет поддерживает игра protobuf или нет
 *
 * @param %1        EngineVersion
 *
 * @return          true если поддерживает, false если нет
 */
#define CHAT_MODERN_PROTOBUF_SUPPORT(%1) (%1 == Engine_CSGO || %1 == Engine_Blade)

#define CHAT_MODERN_PROTOBUF_SUPPORT_CASE Engine_CSS, Engine_TF2, Engine_HL2DM, Engine_DODS  /**< Перечисление игр, поддерживаемых protobuf */

#define CHAT_MODERN_HUD_PRINTTALK 3     /**< TextMsg */

// Цвета Engine_SourceSDK2006
stock char ChatModern_sTagsEP1[][] = {
    /* 00 */    "{default}",
    /* 01 */    "{gold}",
    /* 02 */    "{lightgreen}",
    /* 03 */    "{green}"
};
stock int ChatModern_iCodesEP1[] = {
    /* 00 */    1,
    /* 01 */    1,
    /* 02 */    3,
    /* 03 */    4
};

stock char ChatModern_sTagsTeamEP1[][] = {
    /* 00 */    "{team}",
    /* 01 */    "{team1}",
    /* 02 */    "{team2}",
    /* 03 */    "{team3}",
    /* 04 */    "{grey}",
    /* 05 */    "{red}",
    /* 06 */    "{blue}",
};
stock int ChatModern_iTeamEP1[] = {
    /* 00 */    0,  // текущая команда
    /* 01 */    1,
    /* 02 */    2,
    /* 03 */    3,
    /* 04 */    1,
    /* 05 */    2,
    /* 06 */    3,
};

// Цвета для игр поддерживаемых HEX
stock char ChatModern_sTagsHEX[][] = {
    /* 00 */    "{default}",
    /* 01 */    "{green}",
    /* 02 */    "{lime}",
    /* 03 */    "{lightgreen}",
    /* 04 */    "{darkred}",
    /* 05 */    "{purple}",
    /* 06 */    "{red}",
    /* 07 */    "{grey}",
    /* 08 */    "{yellow}",
    /* 09 */    "{blue}",
    /* 10 */    "{darkblue}",
    /* 11 */    "{bluegrey}",
    /* 12 */    "{pink}",
    /* 13 */    "{lightred}",
    /* 14 */    "{gold}"
};
stock char ChatModern_sCodesHEX[][] = {
    /* 00 */    {1},
    /* 01 */    {4},
    /* 02 */    {5},
    /* 03 */    "\x07BFFE90",   // чтобы не использовать {3} и не разбивать текст в ChatModern.CPrintToChat
    /* 04 */    "\x07FF0000",
    /* 05 */    "\x07B880EF",
    /* 06 */    "\x07FF4040",
    /* 07 */    "\x07C9C9C9",
    /* 08 */    "\x07ECE479",
    /* 09 */    "\x075C96D6",
    /* 10 */    "\x074C6AFF",
    /* 11 */    "\x07B0C2D8",
    /* 12 */    "\x07D22CE3",
    /* 13 */    "\x07EA4B4B",
    /* 14 */    "\x07E0AD40"
};

stock int ChatModern_iCodesHEX1[] = {
    /* 00 */    1,
    /* 01 */    3,
    /* 02 */    4,
    /* 03 */    5,
    /* 04 */    7,
    /* 05 */    8
};

#define CHAT_MODERN_HEX_PERSONAL_START '{'      /**< Начало персонального HEX тега */
#define CHAT_MODERN_HEX_PERSONAL_HEADER '#'     /**< Заголовок персонального HEX тега */
#define CHAT_MODERN_HEX_PERSONAL_END '}'        /**< Конец персонального HEX тега */

// Цвета для остальных игр
stock char ChatModern_sTags[][] = {
    /* 00 */    "{default}",
    /* 01 */    "{darkred}",
    /* 02 */    "{purple}",
    /* 03 */    "{green}",
    /* 04 */    "{lightgreen}",
    /* 05 */    "{lime}",
    /* 06 */    "{red}",
    /* 07 */    "{grey}",
    /* 08 */    "{yellow}",
    /* 09 */    "{blue}",
    /* 10 */    "{darkblue}",
    /* 11 */    "{bluegrey}",
    /* 12 */    "{pink}",
    /* 13 */    "{lightred}",
    /* 14 */    "{gold}"
};
stock int ChatModern_iCodes[] = {
    /* 00 */    1,
    /* 01 */    2,
    /* 02 */    3,
    /* 03 */    4,
    /* 04 */    5,
    /* 05 */    6,
    /* 06 */    7,
    /* 07 */    8,
    /* 08 */    9,
    /* 09 */    11,
    /* 10 */    12,
    /* 11 */    13,
    /* 12 */    14,
    /* 13 */    15,
    /* 14 */    16
};

// Для HEX и остальных
stock char ChatModern_sTagsTeam[][] = {
    /* 00 */    "{team}",
    /* 01 */    "{team1}",
    /* 02 */    "{team2}",
    /* 03 */    "{team3}"
};
stock int ChatModern_iTeam[] = {
    /* 00 */    0,  // текущая команда
    /* 01 */    1,
    /* 02 */    2,
    /* 03 */    3
};

// Для всех
stock const char ChatModern_sTagOld[] = "{old}";    /**< Тег для применения предыдущего цвета */


methodmap ChatModern < Handle
{
    /**
     * Создание объекта ChatModern
     * Не требует закрытия через CloseHandle()
     *
     * @param engine        EngineVersion
     *
     * @return              Объект ChatModern
     */
    public ChatModern(EngineVersion engine)
    {
        // неожиданно, правда?
        return view_as<ChatModern>(engine);
    }

    /**
     * Вывод текста в чат, не переполняющий буфер
     *
     * @param client        Индекс клиента
     * @param format        Строка для форматирования
     * @param ...           Аргументы для форматирования
     */
    public native void TextMsg(int client, const char[] format, any ...);

    /**
     * Замена тегов с цветами и вывод текста в чат, не переполняющий буфер
     *
     * @param client        Индекс клиента
     * @param format        Строка для форматирования
     * @param ...           Аргументы для форматирования
     */
    public native void CTextMsg(int client, const char[] format, any ...);

    /**
     * Вывод текста в чат через SayText2, не переполняющий буфер
     *
     * @param client        Индекс клиента
     * @param entity        Энтити отправителя
     * @param format        Строка для форматирования
     * @param ...           Аргументы для форматирования
     */
    public native void SayText2(int client, int entity, const char[] format, any ...);

    /**
     * Замена тегов с командами и вывод текста в чат через SayText2, не переполняющий буфер
     *
     * @param client        Индекс клиента
     * @param format        Строка для форматирования
     * @param ...           Аргументы для форматирования
     */
    public native void CSayText2(int client, const char[] format, any ...);

    /**
     * Замена тегов с цветами и командами, и вывод текста в чат через TextMsg и SayText2, не переполняющий буфер
     *
     * @param client        Индекс клиента
     * @param format        Строка для форматирования
     * @param ...           Аргументы для форматирования
     */
    public native void CPrintToChat(int client, const char[] format, any ...);

#if !defined SPCOMP_MOD || defined PUBVAR_MAXCLIENTS
    /**
     * Вывод текста в чат для всех игроков, не переполняющий буфер
     *
     * @param format        Строка для форматирования
     * @param ...           Аргументы для форматирования
     */
    public void TextMsgAll(const char[] format, any ...)
    {
        int i;
        char buffer[CHAT_MODERN_NEW_SIZE];
        while (++i <= MaxClients)
        {
            if (IsClientInGame(i) && !IsFakeClient(i))
            {
                SetGlobalTransTarget(i);
                VFormat(buffer, sizeof(buffer), format, 3);
                this.TextMsg(i, "%s", buffer);
            }
        }
    }

    /**
     * Замена тегов с цветами и вывод текста в чат для всех игроков, не переполняющий буфер
     *
     * @param format        Строка для форматирования
     * @param ...           Аргументы для форматирования
     */
    public void CTextMsgAll(const char[] format, any ...)
    {
        int i;
        char buffer[CHAT_MODERN_NEW_SIZE + CHAT_MODERN_NEW_SIZE_COLOR];
        while (++i <= MaxClients)
        {
            if (IsClientInGame(i) && !IsFakeClient(i))
            {
                SetGlobalTransTarget(i);
                VFormat(buffer, sizeof(buffer), format, 3);
                this.CTextMsg(i, "%s", buffer);
            }
        }
    }
   
    /**
     * Вывод текста в чат через SayText2 для всех игроков, не переполняющий буфер
     *
     * @param entity        Энтити отправителя
     * @param format        Строка для форматирования
     * @param ...           Аргументы для форматирования
     */
    public void SayText2All(int entity, const char[] format, any ...)
    {
        int i;
        char buffer[CHAT_MODERN_NEW_SIZE];
        while (++i <= MaxClients)
        {
            if (IsClientInGame(i) && !IsFakeClient(i))
            {
                SetGlobalTransTarget(i);
                VFormat(buffer, sizeof(buffer), format, 3);
                this.SayText2(i, entity, "%s", buffer);
            }
        }
    }

    /**
     * Замена тегов с командами и вывод текста в чат через SayText2 для всех игроков, не переполняющий буфер
     *
     * @param format        Строка для форматирования
     * @param ...           Аргументы для форматирования
     */
    public void CSayText2All(const char[] format, any ...)
    {
        int i;
        char buffer[CHAT_MODERN_NEW_SIZE + CHAT_MODERN_NEW_SIZE_COLOR];
        while (++i <= MaxClients)
        {
            if (IsClientInGame(i) && !IsFakeClient(i))
            {
                SetGlobalTransTarget(i);
                VFormat(buffer, sizeof(buffer), format, 3);
                this.CSayText2(i, "%s", buffer);
            }
        }
    }

    /**
     * Замена тегов с цветами и командами, и вывод текста в чат через TextMsg/SayText2 для всех игроков, не переполняющий буфер
     *
     * @param format        Строка для форматирования
     * @param ...           Аргументы для форматирования
     */
    public void CPrintToChatAll(const char[] format, any ...)
    {
        int i;
        char buffer[CHAT_MODERN_NEW_SIZE + CHAT_MODERN_NEW_SIZE_COLOR];
        while (++i <= MaxClients)
        {
            if (IsClientInGame(i) && !IsFakeClient(i))
            {
                SetGlobalTransTarget(i);
                VFormat(buffer, sizeof(buffer), format, 3);
                this.CPrintToChat(i, "%s", buffer);
            }
        }
    }
#endif

    /**
     * Заменяет теги цветов в буфере в соответствии с кодами
     *
     * @param buffer        Буфер
     * @param maxlen        Размер буфера
     * @param tags          Массив с тегами
     * @param maxtags       Размер массива с тегами
     * @param codes         Массив с кодами
     */
    public static void Replace(char[] buffer, int maxlen, const char[][] tags, int maxtags, const int[] codes)
    {
        int i = -1;
        while (++i < maxtags)
            ReplaceString(buffer, maxlen, tags[i], view_as<char>(codes[i]), CHAT_MODERN_TAGS_CSENSITIVE);
    }

    /**
     * Заменяет теги цветов в буфере в соответствии с HEX кодами
     *
     * @param buffer        Буфер
     * @param maxlen        Размер буфера
     * @param tags          Массив с тегами
     * @param maxtags       Размер массива с тегами
     * @param codes         Массив с кодами
     */
    public static void ReplaceHEX(char[] buffer, int maxlen, const char[][] tags, int maxtags, const char[][] codes)
    {
        int i = -1;
        while (++i < maxtags)
            ReplaceString(buffer, maxlen, tags[i], codes[i], CHAT_MODERN_TAGS_CSENSITIVE);
    }

    /**
     * Поиск персонального HEX тега в буфере
     *
     * @param buffer        Буфер
     * @param code          Применяемый код (7/8)
     * @param end           Искать с конца
     *
     * @return              Позиция тега или -1 если не найдено
     */
    public static int FindPersonalHEX(char[] buffer, int maxlen, int &code = 0, bool end = false)
    {
        if (end)
        {
            int i = strlen(buffer);
            while (0 <= --i)
            {
                if (0 <= i - 8 &&
                    buffer[i] == CHAT_MODERN_HEX_PERSONAL_END && buffer[i - 7] == CHAT_MODERN_HEX_PERSONAL_HEADER &&
                    buffer[i - 8] == CHAT_MODERN_HEX_PERSONAL_START)
                {
                    code = 7;
                    return i - 8;
                }
                else if (0 <= i - 10 &&
                    buffer[i] == CHAT_MODERN_HEX_PERSONAL_END && buffer[i - 9] == CHAT_MODERN_HEX_PERSONAL_HEADER &&
                    buffer[i - 10] == CHAT_MODERN_HEX_PERSONAL_START)
                {
                    code = 8;
                    return i - 10;
                }
            }
        }
        else
        {
            int i = -1;
            while (buffer[++i])
            {
                if (i + 8 < maxlen &&
                    buffer[i] == CHAT_MODERN_HEX_PERSONAL_START && buffer[i + 1] == CHAT_MODERN_HEX_PERSONAL_HEADER &&
                    buffer[i + 8] == CHAT_MODERN_HEX_PERSONAL_END)
                {
                    code = 7;
                    return i;
                }
                else if (i + 10 < maxlen &&
                    buffer[i] == CHAT_MODERN_HEX_PERSONAL_START && buffer[i + 1] == CHAT_MODERN_HEX_PERSONAL_HEADER &&
                    buffer[i + 10] == CHAT_MODERN_HEX_PERSONAL_END)
                {
                    code = 8;
                    return i;
                }
            }
        }
        return -1;
    }

    /**
     * Заменяет персональные HEX теги в буфере
     *
     * @param buffer        Буфер
     */
    public static void ReplacePersonalHEX(char[] buffer, int maxlen)
    {
        int pos, code;
        while ((pos = ChatModern.FindPersonalHEX(buffer, maxlen, code)) != -1)
        {
            if (code == 7)
            {
                buffer[pos] = 7;
                buffer[pos + 1] = buffer[pos + 2];
                buffer[pos + 2] = buffer[pos + 3];
                buffer[pos + 3] = buffer[pos + 4];
                buffer[pos + 4] = buffer[pos + 5];
                buffer[pos + 5] = buffer[pos + 6];
                buffer[pos + 6] = buffer[pos + 7];

                pos += 6;
                while (buffer[++pos])
                    buffer[pos] = buffer[pos + 2];
                buffer[pos + 1] = '\0';
            }
            else
            {
                buffer[pos] = 8;
                buffer[pos + 1] = buffer[pos + 2];
                buffer[pos + 2] = buffer[pos + 3];
                buffer[pos + 3] = buffer[pos + 4];
                buffer[pos + 4] = buffer[pos + 5];
                buffer[pos + 5] = buffer[pos + 6];
                buffer[pos + 6] = buffer[pos + 7];
                buffer[pos + 7] = buffer[pos + 8];
                buffer[pos + 8] = buffer[pos + 9];

                pos += 8;
                while (buffer[++pos])
                    buffer[pos] = buffer[pos + 2];
                buffer[pos + 1] = '\0';
            }
        }
    }

    /**
     * Заменяет теги цветов команд до следующего тега
     * Например до {team1} в "{team}бла бла {team}бла {team1}бла {team}бла"
     *
     * @param buffer        Буфер
     * @param maxlen        Размер буфера
     * @param tags          Массив с тегами
     * @param maxtags       Размер массива с тегами
     * @param index         Индекс текущего тега из массива с тегами
     *
     * @return              Позиция цвета другой команды
     */
    public static int ReplaceTeam(char[] buffer, int maxlen, const char[][] tags, int maxtags, int &index = 0)
    {
        int i = -1, pos = maxlen, res;
        while (++i < maxtags)
        {
            if ((res = StrContains(buffer, tags[i], CHAT_MODERN_TAGS_CSENSITIVE)) != -1 && res < pos)
            {
                pos = res;
                index = i;
            }
        }

        if (pos == maxlen)
        {
            index = -1;
        }
        else
        {
            i = -1;
            pos = maxlen;
            while (++i < maxtags)
                if (i != index && (res = StrContains(buffer, tags[i], CHAT_MODERN_TAGS_CSENSITIVE)) != -1 && res < pos)
                    pos = res;
           
            if (pos == maxlen)
            {
                ReplaceString(buffer, maxlen, tags[index], view_as<char>({3}), CHAT_MODERN_TAGS_CSENSITIVE);
            }
            else
            {
                i = buffer[pos];
                buffer[pos] = '\0';
                res = pos;
                pos -= (strlen(tags[index]) - 1) * ReplaceString(buffer, pos, tags[index], view_as<char>({3}), CHAT_MODERN_TAGS_CSENSITIVE);
                buffer[res] = i;
                strcopy(buffer[pos], maxlen - pos, buffer[res]);
            }
        }
        return pos == maxlen ? -1 : pos;
    }

    /**
     * Замена тега tagOld и кода codeOld на предыдущий тег цвета или команды
     *
     * @param buffer        Буфер
     * @param maxlen        Размер буфера
     */
    public void ReplaceOld(char[] buffer, int maxlen)
    {
        char cpy[CHAT_MODERN_NEW_SIZE + CHAT_MODERN_NEW_SIZE_COLOR];
        int endpos, res, pos, pos2, index, type, i, chr;
        if (view_as<EngineVersion>(this) == Engine_SourceSDK2006)
        {
            while ((endpos = StrContains(buffer, ChatModern_sTagOld)) != -1)
            {
                buffer[endpos] = '\0';
               
                pos = i = -1;
                while (++i < sizeof(ChatModern_sTagsEP1))
                    if (pos < (res = FindEndSubStr(buffer, ChatModern_sTagsEP1[i], CHAT_MODERN_TAGS_CSENSITIVE)))
                        pos = res;
               
                i = -1
                while (++i < sizeof(ChatModern_sTagsTeamEP1))
                    if (pos < (res = FindEndSubStr(buffer, ChatModern_sTagsTeamEP1[i], CHAT_MODERN_TAGS_CSENSITIVE)))
                        pos = res;

                index = type = 0;
                if (pos != -1)
                {
                    chr = buffer[pos];
                    buffer[pos] = '\0';

                    pos2 = i = -1;
                    while (++i < sizeof(ChatModern_sTagsEP1))
                    {
                        if (pos2 < (res = FindEndSubStr(buffer, ChatModern_sTagsEP1[i], CHAT_MODERN_TAGS_CSENSITIVE)))
                        {
                            pos2 = res;
                            index = i;
                        }
                    }

                    i = -1;
                    while (++i < sizeof(ChatModern_sTagsTeamEP1))
                    {
                        if (pos2 < (res = FindEndSubStr(buffer, ChatModern_sTagsTeamEP1[i], CHAT_MODERN_TAGS_CSENSITIVE)))
                        {
                            pos2 = res;
                            index = i;
                            type = 1;
                        }
                    }

                    buffer[pos] = chr;
                }

                if (type)
                {
                    pos = endpos + strlen(ChatModern_sTagsTeamEP1[index]);
                    if (0 < (res = maxlen - pos))
                    {
                        strcopy(cpy, sizeof(cpy), buffer[endpos + sizeof(ChatModern_sTagOld) - 1]);
                        strcopy(buffer[pos], res, cpy);
                    }

                    res = maxlen - 1;
                    while (ChatModern_sTagsTeamEP1[index][++i] && endpos < res)
                        buffer[endpos++] = ChatModern_sTagsTeamEP1[index][i];
                }
                else
                {
                    pos = endpos + strlen(ChatModern_sTagsEP1[index]);
                    if (0 < (res = maxlen - pos))
                    {
                        strcopy(cpy, sizeof(cpy), buffer[endpos + sizeof(ChatModern_sTagOld) - 1]);
                        strcopy(buffer[pos], res, cpy);
                    }

                    res = maxlen - 1;
                    while (ChatModern_sTagsEP1[index][++i] && endpos < res)
                        buffer[endpos++] = ChatModern_sTagsEP1[index][i];
                }
            }
        }
        else if (CHAT_MODERN_HEX_SUPPORT(view_as<EngineVersion>(this)))
        {
            while ((endpos = StrContains(buffer, ChatModern_sTagOld)) != -1)
            {
                buffer[endpos] = '\0';
               
                pos = i = -1;
                while (++i < sizeof(ChatModern_sTagsHEX))
                    if (pos < (res = FindEndSubStr(buffer, ChatModern_sTagsHEX[i], CHAT_MODERN_TAGS_CSENSITIVE)))
                        pos = res;
               
                i = -1
                while (++i < sizeof(ChatModern_sTagsTeam))
                    if (pos < (res = FindEndSubStr(buffer, ChatModern_sTagsTeam[i], CHAT_MODERN_TAGS_CSENSITIVE)))
                        pos = res;
               
                if (pos < (res = ChatModern.FindPersonalHEX(buffer, maxlen, _, true)))
                    pos = res;

                index = type = 0;
                if (pos != -1)
                {
                    chr = buffer[pos];
                    buffer[pos] = '\0';

                    pos2 = i = -1;
                    while (++i < sizeof(ChatModern_sTagsHEX))
                    {
                        if (pos2 < (res = FindEndSubStr(buffer, ChatModern_sTagsHEX[i], CHAT_MODERN_TAGS_CSENSITIVE)))
                        {
                            pos2 = res;
                            index = i;
                        }
                    }

                    i = -1;
                    while (++i < sizeof(ChatModern_sTagsTeam))
                    {
                        if (pos2 < (res = FindEndSubStr(buffer, ChatModern_sTagsTeam[i], CHAT_MODERN_TAGS_CSENSITIVE)))
                        {
                            pos2 = res;
                            index = i;
                            type = 1;
                        }
                    }

                    if (pos2 < (res = ChatModern.FindPersonalHEX(buffer, maxlen, type, true)))
                        pos2 = res;

                    buffer[pos] = chr;
                }


                i = -1;
                if (type == 1)
                {
                    pos = endpos + strlen(ChatModern_sTagsTeam[index]);
                    if (0 < (res = maxlen - pos))
                    {
                        strcopy(cpy, sizeof(cpy), buffer[endpos + sizeof(ChatModern_sTagOld) - 1]);
                        strcopy(buffer[pos], res, cpy);
                    }

                    res = maxlen - 1;
                    while (ChatModern_sTagsTeam[index][++i] && endpos < res)
                        buffer[endpos++] = ChatModern_sTagsTeam[index][i];
                }
                else if (type)
                {
                    pos = endpos + (type == 7 ? 9 : 11);
                    if (0 < (res = maxlen - pos))
                    {
                        strcopy(cpy, sizeof(cpy), buffer[endpos + sizeof(ChatModern_sTagOld) - 1]);
                        strcopy(buffer[pos], res, cpy);
                    }

                    res = maxlen - 1;
                    pos2--;
                    while (buffer[++pos2] && endpos < res && endpos < pos)
                        buffer[endpos++] = buffer[pos2];
                }
                else
                {
                    pos = endpos + strlen(ChatModern_sTagsHEX[index]);
                    if (0 < (res = maxlen - pos))
                    {
                        strcopy(cpy, sizeof(cpy), buffer[endpos + sizeof(ChatModern_sTagOld) - 1]);
                        strcopy(buffer[pos], res, cpy);
                    }

                    res = maxlen - 1;
                    while (ChatModern_sTagsHEX[index][++i] && endpos < res)
                        buffer[endpos++] = ChatModern_sTagsHEX[index][i];
                }
            }
        }
        else
        {
            while ((endpos = StrContains(buffer, ChatModern_sTagOld)) != -1)
            {
                buffer[endpos] = '\0';
               
                pos = i = -1;
                while (++i < sizeof(ChatModern_sTags))
                    if (pos < (res = FindEndSubStr(buffer, ChatModern_sTags[i], CHAT_MODERN_TAGS_CSENSITIVE)))
                        pos = res;
               
                i = -1
                while (++i < sizeof(ChatModern_sTagsTeam))
                    if (pos < (res = FindEndSubStr(buffer, ChatModern_sTagsTeam[i], CHAT_MODERN_TAGS_CSENSITIVE)))
                        pos = res;

                index = type = 0;
                if (pos != -1)
                {
                    chr = buffer[pos];
                    buffer[pos] = '\0';

                    pos2 = i = -1;
                    while (++i < sizeof(ChatModern_sTags))
                    {
                        if (pos2 < (res = FindEndSubStr(buffer, ChatModern_sTags[i], CHAT_MODERN_TAGS_CSENSITIVE)))
                        {
                            pos2 = res;
                            index = i;
                        }
                    }

                    i = -1;
                    while (++i < sizeof(ChatModern_sTagsTeam))
                    {
                        if (pos2 < (res = FindEndSubStr(buffer, ChatModern_sTagsTeam[i], CHAT_MODERN_TAGS_CSENSITIVE)))
                        {
                            pos2 = res;
                            index = i;
                            type = 1;
                        }
                    }

                    buffer[pos] = chr;
                }


                i = -1;
                if (type)
                {
                    pos = endpos + strlen(ChatModern_sTagsTeam[index]);
                    if (0 < (res = maxlen - pos))
                    {
                        strcopy(cpy, sizeof(cpy), buffer[endpos + sizeof(ChatModern_sTagOld) - 1]);
                        strcopy(buffer[pos], res, cpy);
                    }

                    res = maxlen - 1;
                    while (ChatModern_sTagsTeam[index][++i] && endpos < res)
                        buffer[endpos++] = ChatModern_sTagsTeam[index][i];
                }
                else
                {
                    pos = endpos + strlen(ChatModern_sTags[index]);
                    if (0 < (res = maxlen - pos))
                    {
                        strcopy(cpy, sizeof(cpy), buffer[endpos + sizeof(ChatModern_sTagOld) - 1]);
                        strcopy(buffer[pos], res, cpy);
                    }

                    res = maxlen - 1;
                    while (ChatModern_sTags[index][++i] && endpos < res)
                        buffer[endpos++] = ChatModern_sTags[index][i];
                }
            }
        }
    }
}


public SharedPlugin __pl_chatmodern =
{
    name = "chatmodern",
    file = "chatmodern.smx",
#if defined REQUIRE_PLUGIN
    required = 1,
#else
    required = 0,
#endif
};
ты забыл уточнить, что для работы нужно ядро
Сообщения автоматически склеены:

а вообще, надо читать README, т.к. здесь используются не процедурки
 
Сверху Снизу