Grey83
не пишу плагины с весны 2022
- Сообщения
- 8,805
- Реакции
- 5,254
@Vyacheslav, попробуй так
1.5.1
/*
* Заменены все экземпляры GetClientAuthString() на GetClientAuthId.
* Убрано warning 234: symbol "FCVAR_PLUGIN" is marked as deprecated: No logic using this flag ever existed in a released game. It only ever appeared in the first hl2sdk.
* Добавлена пропущенная фраза чата "Bomb"
* Переделано объявление и изменение ConVars
* Код переписан на новый синтаксис.
* В файл перевода добавлен ru перевод.
* Конфигурационный файл переведен на ru
* Добавлен новый конвар sm_announce_timer - Через какое время отобразить сообщение от плагина (объявлений)
* Переименованы название переменных в конфигурационном файле и их объявленные типы
* Возможно что то забыл описать, но сделал.
* Добавлена поддержка morecolors, можете разукрасить на свой вкус фразы announce и bomb
*/
Приложите архивом звуки, и c4soundslist.cfg и advancedc4timer.cfgПриветствую всех.
Кто подскажет.
Звуки воспроизводятся только с 20 или 10 секунд. Таймер стоит 35 секунд.
В консоле ошибок нет.
При компиляции тоже не было.
Звуки воспроизвудятся черезПриветствую, а как-то громкость голосового отсчёта регулируется в данном плагине? Уж больно громко отсчёт ведётся...
stock void EmitSoundToClient(int client,
const char[] sample,
int entity = SOUND_FROM_PLAYER,
int channel = SNDCHAN_AUTO,
int level = SNDLEVEL_NORMAL,
int flags = SND_NOFLAGS,
float volume = SNDVOL_NORMAL,
int pitch = SNDPITCH_NORMAL,
int speakerentity = -1,
const float origin[3] = NULL_VECTOR,
const float dir[3] = NULL_VECTOR,
bool updatePos = true,
float soundtime = 0.0)
L 05/19/2024 - 15:41:38: [SM] Exception reported: Convar "sm_chat" was not created. A console command with the same might already exist.
L 05/19/2024 - 15:41:38: [SM] Blaming: advancedc4timer.smx
L 05/19/2024 - 15:41:38: [SM] Call stack trace:
L 05/19/2024 - 15:41:38: [SM] [0] CreateConVar
L 05/19/2024 - 15:41:38: [SM] [1] Line 179, C:\Users\grodi\Desktop\Advanced c4 timer 1.5.1\addons\sourcemod\scripting\advancedc4timer.sp::OnPluginStart
L 05/19/2024 - 15:41:38: [SM] Unable to load plugin "advancedc4timer.smx": Error detected in plugin startup (see error logs)
C-подобный:1.5.1 /* * Заменены все экземпляры GetClientAuthString() на GetClientAuthId. * Убрано warning 234: symbol "FCVAR_PLUGIN" is marked as deprecated: No logic using this flag ever existed in a released game. It only ever appeared in the first hl2sdk. * Добавлена пропущенная фраза чата "Bomb" * Переделано объявление и изменение ConVars * Код переписан на новый синтаксис. * В файл перевода добавлен ru перевод. * Конфигурационный файл переведен на ru * Добавлен новый конвар sm_announce_timer - Через какое время отобразить сообщение от плагина (объявлений) * Переименованы название переменных в конфигурационном файле и их объявленные типы * Возможно что то забыл описать, но сделал. * Добавлена поддержка morecolors, можете разукрасить на свой вкус фразы announce и bomb */
Посмотреть вложение 116928
Посмотреть вложение 116931
Сообщения автоматически склеены:
Приложите архивом звуки, и c4soundslist.cfg и advancedc4timer.cfg
Сообщения автоматически склеены:
Звуки воспроизвудятся черезC-подобный:stock void EmitSoundToClient(int client, const char[] sample, int entity = SOUND_FROM_PLAYER, int channel = SNDCHAN_AUTO, int level = SNDLEVEL_NORMAL, int flags = SND_NOFLAGS, float volume = SNDVOL_NORMAL, int pitch = SNDPITCH_NORMAL, int speakerentity = -1, const float origin[3] = NULL_VECTOR, const float dir[3] = NULL_VECTOR, bool updatePos = true, float soundtime = 0.0)
ну ещё бы:Convar "sm_chat" was not created. A console command with the same might already exist.
RegAdminCmd("sm_chat", Command_SmChat, ADMFLAG_CHAT, "sm_chat <message> - sends message to admins");
Обновление:C-подобный:1.5.1 /* * Заменены все экземпляры GetClientAuthString() на GetClientAuthId. * Убрано warning 234: symbol "FCVAR_PLUGIN" is marked as deprecated: No logic using this flag ever existed in a released game. It only ever appeared in the first hl2sdk. * Добавлена пропущенная фраза чата "Bomb" * Переделано объявление и изменение ConVars * Код переписан на новый синтаксис. * В файл перевода добавлен ru перевод. * Конфигурационный файл переведен на ru * Добавлен новый конвар sm_announce_timer - Через какое время отобразить сообщение от плагина (объявлений) * Переименованы название переменных в конфигурационном файле и их объявленные типы * Возможно что то забыл описать, но сделал. * Добавлена поддержка morecolors, можете разукрасить на свой вкус фразы announce и bomb */
Посмотреть вложение 116928
Посмотреть вложение 116931
Сообщения автоматически склеены:
Приложите архивом звуки, и c4soundslist.cfg и advancedc4timer.cfg
Сообщения автоматически склеены:
Звуки воспроизвудятся черезC-подобный:stock void EmitSoundToClient(int client, const char[] sample, int entity = SOUND_FROM_PLAYER, int channel = SNDCHAN_AUTO, int level = SNDLEVEL_NORMAL, int flags = SND_NOFLAGS, float volume = SNDVOL_NORMAL, int pitch = SNDPITCH_NORMAL, int speakerentity = -1, const float origin[3] = NULL_VECTOR, const float dir[3] = NULL_VECTOR, bool updatePos = true, float soundtime = 0.0)
Exception reported: Convar "sm_chat" was not created. A console command with the same might already exist.
Перезалил, обновление v1.6.2 :Обновление:
1. Оптимизирован код
2. Убраны не используемые переменные, такие как g_sSteam
3. Переименован файл конфигурации, теперь он cfg/sourcemod/advanced_c4timer.cfg
4. Переименованы все переменные кфг во избежании ошибок
5. Код уменьшен примерно на третью часть, с 583 до 381 строкиC-подобный:Exception reported: Convar "sm_chat" was not created. A console command with the same might already exist.
6. Изменен файл перевода для более корректного отображения
7. Изменены названия и описания Куков
Возможно есть смысл добавить еще один HUD..
глянул код: там же простора для оптимизации ещё поле непаханое =)Перезалил
Правил только менюшки, куки, саму логику не смотрел. Только что в галаз бросилось.глянул код: там же простора для оптимизации ещё поле непаханое =)
Те же проверки валидности игрока: сделана отдельная функция для этого, а используются в большей части плагина проверки по отдельности из неё.
Могу скинуть озвучку женским голосов, но без стонов, пубертат давно закончилсяМожет кто скинет , где озвучка женская и когда остоеться 10 секунд он кажду сек стонет.
тебе смешно , а мне нужно игроки просят на сервер добавить , а так обычная озвучка женская естьМогу скинуть озвучку женским голосов, но без стонов, пубертат давно закончился![]()
Может кто скинет , где озвучка женская и когда остоеться 10 секунд он кажду сек стонет.
Можешь сделать так, что бы когда раунд завершился - установленная бомба удалялась ?Обновление:
1. Оптимизирован код
2. Убраны не используемые переменные, такие как g_sSteam
3. Переименован файл конфигурации, теперь он cfg/sourcemod/advanced_c4timer.cfg
4. Переименованы все переменные кфг во избежании ошибок
5. Код уменьшен примерно на третью часть, с 583 до 381 строкиC-подобный:Exception reported: Convar "sm_chat" was not created. A console command with the same might already exist.
6. Изменен файл перевода для более корректного отображения
7. Изменены названия и описания Куков
Возможно есть смысл добавить еще один HUD..
#include <sourcemod>
#include <sdktools>
#include <clientprefs>
#pragma newdecls required
#pragma semicolon 1
#define PLUGIN_VERSION "2.1.0"
// Фразы (вшиты в код)
#define MSG_PLANTED " \x04[C4]\x01 Бомба заложена! До взрыва: {time} сек."
#define MSG_DEFUSED " \x04[C4]\x01 Бомба обезврежена!"
#define MSG_EXPLODED " \x04[C4]\x01 Бомба взорвана!"
#define HINT_TIMER "Таймер C4: {time}"
#define MSG_INFO " \x04[C4]\x01 Чтобы отключить звуки таймера для себя, напишите \x03!c4"
// Настройки
int g_iPluginEnabled = 1;
int g_iSoundStartAt = 30;
ConVar g_hCvarTimer = null;
Handle g_hCountdownTimer = null;
Handle g_cPrefClient = null;
int g_iCounter;
char g_sSoundPath[66][PLATFORM_MAX_PATH];
bool g_bClientEnabled[MAXPLAYERS + 1];
public Plugin myinfo =
{
name = "Advanced c4 Timer (Announcer Logic + Comments)",
author = "AI Adaptation",
version = PLUGIN_VERSION
};
public void OnPluginStart()
{
g_hCvarTimer = FindConVar("mp_c4timer");
g_cPrefClient = RegClientCookie("c4timer_client_pref", "C4 Timer Client Toggle", CookieAccess_Private);
RegConsoleCmd("sm_c4", Command_ToggleC4);
RegConsoleCmd("sm_с4", Command_ToggleC4);
HookEvent("bomb_planted", Event_BombPlanted);
HookEvent("bomb_exploded", Event_BombStop);
HookEvent("bomb_defused", Event_BombStop);
HookEvent("round_start", Event_BombStop);
LoadSingleConfig();
}
public void OnMapStart()
{
LoadSingleConfig();
}
void LoadSingleConfig()
{
char sPath[PLATFORM_MAX_PATH];
BuildPath(Path_SM, sPath, sizeof(sPath), "../../cfg/sourcemod/c4timer.cfg");
if (!FileExists(sPath)) {
File hFile = OpenFile(sPath, "w");
if (hFile != null) {
hFile.WriteLine("\"c4timer\"");
hFile.WriteLine("{");
hFile.WriteLine(" \"settings\"");
hFile.WriteLine(" {");
hFile.WriteLine(" // 1 - Включить плагин, 0 - Выключить");
hFile.WriteLine(" \"enable\" \"1\"");
hFile.WriteLine("");
hFile.WriteLine(" // С какой секунды начинать звуковой отсчет");
hFile.WriteLine(" \"sound_start_at\" \"30\"");
hFile.WriteLine(" }");
hFile.WriteLine("");
hFile.WriteLine(" \"sounds\"");
hFile.WriteLine(" {");
hFile.WriteLine(" \"1\" \"ural-stable/bomb/1.mp3\"");
hFile.WriteLine(" \"2\" \"ural-stable/bomb/2.mp3\"");
hFile.WriteLine(" \"3\" \"ural-stable/bomb/3.mp3\"");
hFile.WriteLine(" \"4\" \"ural-stable/bomb/4.mp3\"");
hFile.WriteLine(" \"5\" \"ural-stable/bomb/5.mp3\"");
hFile.WriteLine(" \"6\" \"ural-stable/bomb/6.mp3\"");
hFile.WriteLine(" \"7\" \"ural-stable/bomb/7.mp3\"");
hFile.WriteLine(" \"8\" \"ural-stable/bomb/8.mp3\"");
hFile.WriteLine(" \"9\" \"ural-stable/bomb/9.mp3\"");
hFile.WriteLine(" \"10\" \"ural-stable/bomb/10.mp3\"");
hFile.WriteLine(" \"20\" \"ural-stable/bomb/20.mp3\"");
hFile.WriteLine(" \"30\" \"ural-stable/bomb/30.mp3\"");
hFile.WriteLine(" }");
hFile.WriteLine("}");
delete hFile;
}
}
KeyValues kv = new KeyValues("c4timer");
if (kv.ImportFromFile(sPath)) {
if (kv.JumpToKey("settings")) {
g_iPluginEnabled = kv.GetNum("enable", 1);
g_iSoundStartAt = kv.GetNum("sound_start_at", 30);
kv.Rewind();
}
if (kv.JumpToKey("sounds")) {
for (int i = 1; i <= 64; i++) {
char sKey[10];
IntToString(i, sKey, sizeof(sKey));
kv.GetString(sKey, g_sSoundPath[i], PLATFORM_MAX_PATH);
if (g_sSoundPath[i][0] != '\0') {
char sBuffer[PLATFORM_MAX_PATH];
Format(sBuffer, sizeof(sBuffer), "sound/%s", g_sSoundPath[i]);
if (FileExists(sBuffer)) AddFileToDownloadsTable(sBuffer);
PrecacheSound(g_sSoundPath[i], true);
}
}
}
}
delete kv;
}
public void OnClientCookiesCached(int client)
{
char sValue[4];
GetClientCookie(client, g_cPrefClient, sValue, sizeof(sValue));
if (sValue[0] == '\0') g_bClientEnabled[client] = true;
else g_bClientEnabled[client] = (StringToInt(sValue) != 0);
}
public Action Command_ToggleC4(int client, int args)
{
if (client <= 0) return Plugin_Handled;
g_bClientEnabled[client] = !g_bClientEnabled[client];
char sValue[4];
IntToString(view_as<int>(g_bClientEnabled[client]), sValue, sizeof(sValue));
SetClientCookie(client, g_cPrefClient, sValue);
PrintToChat(client, " \x04[C4]\x01 Таймер: %s", g_bClientEnabled[client] ? "\x04ВКЛ" : "\x02ВЫКЛ");
return Plugin_Handled;
}
public void Event_BombPlanted(Event event, const char[] name, bool dontBroadcast)
{
if (g_iPluginEnabled == 0) return;
g_iCounter = (g_hCvarTimer != null) ? g_hCvarTimer.IntValue : 35;
char sTime[10];
IntToString(g_iCounter, sTime, sizeof(sTime));
for (int i = 1; i <= MaxClients; i++) {
if (IsClientInGame(i) && g_bClientEnabled[i]) {
char sMsg[192];
strcopy(sMsg, sizeof(sMsg), MSG_PLANTED);
ReplaceString(sMsg, sizeof(sMsg), "{time}", sTime);
PrintToChat(i, sMsg);
PrintToChat(i, MSG_INFO);
}
}
if (g_hCountdownTimer != null) delete g_hCountdownTimer;
g_hCountdownTimer = CreateTimer(1.0, Timer_Countdown, _, TIMER_REPEAT);
}
public void Event_BombStop(Event event, const char[] name, bool dontBroadcast)
{
if (g_hCountdownTimer != null) {
delete g_hCountdownTimer;
g_hCountdownTimer = null;
}
if (g_iPluginEnabled == 0) return;
char sMsg[192];
bool bIsDefused = StrEqual(name, "bomb_defused");
if (bIsDefused) strcopy(sMsg, sizeof(sMsg), MSG_DEFUSED);
else if (StrEqual(name, "bomb_exploded")) strcopy(sMsg, sizeof(sMsg), MSG_EXPLODED);
else return;
for (int i = 1; i <= MaxClients; i++) {
if (IsClientInGame(i) && g_bClientEnabled[i]) {
PrintToChat(i, sMsg);
if (bIsDefused) PrintToChat(i, MSG_INFO);
}
}
}
public Action Timer_Countdown(Handle timer)
{
if (g_iCounter <= 0) {
g_hCountdownTimer = null;
return Plugin_Stop;
}
char sTime[10], sHint[128];
IntToString(g_iCounter, sTime, sizeof(sTime));
strcopy(sHint, sizeof(sHint), HINT_TIMER);
ReplaceString(sHint, sizeof(sHint), "{time}", sTime);
for (int i = 1; i <= MaxClients; i++) {
if (IsClientInGame(i) && g_bClientEnabled[i]) {
PrintHintText(i, sHint);
if (g_iCounter <= g_iSoundStartAt && g_iCounter < 66 && g_sSoundPath[g_iCounter][0] != '\0') {
EmitSoundToClient(i, g_sSoundPath[g_iCounter]);
}
}
}
g_iCounter--;
return Plugin_Continue;
}
Люди с конфигами некоторые не могут справится, а вы им усложнили задачу в 10 разПереписанный плагин под SM v1.12 от google ai + теперь все в одном конфиге и никакого мусора в папке translations
c4timer.sp:#include <sourcemod> #include <sdktools> #include <clientprefs> #pragma newdecls required #pragma semicolon 1 #define PLUGIN_VERSION "2.1.0" // Фразы (вшиты в код) #define MSG_PLANTED " \x04[C4]\x01 Бомба заложена! До взрыва: {time} сек." #define MSG_DEFUSED " \x04[C4]\x01 Бомба обезврежена!" #define MSG_EXPLODED " \x04[C4]\x01 Бомба взорвана!" #define HINT_TIMER "Таймер C4: {time}" #define MSG_INFO " \x04[C4]\x01 Чтобы отключить звуки таймера для себя, напишите \x03!c4" // Настройки int g_iPluginEnabled = 1; int g_iSoundStartAt = 30; ConVar g_hCvarTimer = null; Handle g_hCountdownTimer = null; Handle g_cPrefClient = null; int g_iCounter; char g_sSoundPath[66][PLATFORM_MAX_PATH]; bool g_bClientEnabled[MAXPLAYERS + 1]; public Plugin myinfo = { name = "Advanced c4 Timer (Announcer Logic + Comments)", author = "AI Adaptation", version = PLUGIN_VERSION }; public void OnPluginStart() { g_hCvarTimer = FindConVar("mp_c4timer"); g_cPrefClient = RegClientCookie("c4timer_client_pref", "C4 Timer Client Toggle", CookieAccess_Private); RegConsoleCmd("sm_c4", Command_ToggleC4); RegConsoleCmd("sm_с4", Command_ToggleC4); HookEvent("bomb_planted", Event_BombPlanted); HookEvent("bomb_exploded", Event_BombStop); HookEvent("bomb_defused", Event_BombStop); HookEvent("round_start", Event_BombStop); LoadSingleConfig(); } public void OnMapStart() { LoadSingleConfig(); } void LoadSingleConfig() { char sPath[PLATFORM_MAX_PATH]; BuildPath(Path_SM, sPath, sizeof(sPath), "../../cfg/sourcemod/c4timer.cfg"); if (!FileExists(sPath)) { File hFile = OpenFile(sPath, "w"); if (hFile != null) { hFile.WriteLine("\"c4timer\""); hFile.WriteLine("{"); hFile.WriteLine(" \"settings\""); hFile.WriteLine(" {"); hFile.WriteLine(" // 1 - Включить плагин, 0 - Выключить"); hFile.WriteLine(" \"enable\" \"1\""); hFile.WriteLine(""); hFile.WriteLine(" // С какой секунды начинать звуковой отсчет"); hFile.WriteLine(" \"sound_start_at\" \"30\""); hFile.WriteLine(" }"); hFile.WriteLine(""); hFile.WriteLine(" \"sounds\""); hFile.WriteLine(" {"); hFile.WriteLine(" \"1\" \"ural-stable/bomb/1.mp3\""); hFile.WriteLine(" \"2\" \"ural-stable/bomb/2.mp3\""); hFile.WriteLine(" \"3\" \"ural-stable/bomb/3.mp3\""); hFile.WriteLine(" \"4\" \"ural-stable/bomb/4.mp3\""); hFile.WriteLine(" \"5\" \"ural-stable/bomb/5.mp3\""); hFile.WriteLine(" \"6\" \"ural-stable/bomb/6.mp3\""); hFile.WriteLine(" \"7\" \"ural-stable/bomb/7.mp3\""); hFile.WriteLine(" \"8\" \"ural-stable/bomb/8.mp3\""); hFile.WriteLine(" \"9\" \"ural-stable/bomb/9.mp3\""); hFile.WriteLine(" \"10\" \"ural-stable/bomb/10.mp3\""); hFile.WriteLine(" \"20\" \"ural-stable/bomb/20.mp3\""); hFile.WriteLine(" \"30\" \"ural-stable/bomb/30.mp3\""); hFile.WriteLine(" }"); hFile.WriteLine("}"); delete hFile; } } KeyValues kv = new KeyValues("c4timer"); if (kv.ImportFromFile(sPath)) { if (kv.JumpToKey("settings")) { g_iPluginEnabled = kv.GetNum("enable", 1); g_iSoundStartAt = kv.GetNum("sound_start_at", 30); kv.Rewind(); } if (kv.JumpToKey("sounds")) { for (int i = 1; i <= 64; i++) { char sKey[10]; IntToString(i, sKey, sizeof(sKey)); kv.GetString(sKey, g_sSoundPath[i], PLATFORM_MAX_PATH); if (g_sSoundPath[i][0] != '\0') { char sBuffer[PLATFORM_MAX_PATH]; Format(sBuffer, sizeof(sBuffer), "sound/%s", g_sSoundPath[i]); if (FileExists(sBuffer)) AddFileToDownloadsTable(sBuffer); PrecacheSound(g_sSoundPath[i], true); } } } } delete kv; } public void OnClientCookiesCached(int client) { char sValue[4]; GetClientCookie(client, g_cPrefClient, sValue, sizeof(sValue)); if (sValue[0] == '\0') g_bClientEnabled[client] = true; else g_bClientEnabled[client] = (StringToInt(sValue) != 0); } public Action Command_ToggleC4(int client, int args) { if (client <= 0) return Plugin_Handled; g_bClientEnabled[client] = !g_bClientEnabled[client]; char sValue[4]; IntToString(view_as<int>(g_bClientEnabled[client]), sValue, sizeof(sValue)); SetClientCookie(client, g_cPrefClient, sValue); PrintToChat(client, " \x04[C4]\x01 Таймер: %s", g_bClientEnabled[client] ? "\x04ВКЛ" : "\x02ВЫКЛ"); return Plugin_Handled; } public void Event_BombPlanted(Event event, const char[] name, bool dontBroadcast) { if (g_iPluginEnabled == 0) return; g_iCounter = (g_hCvarTimer != null) ? g_hCvarTimer.IntValue : 35; char sTime[10]; IntToString(g_iCounter, sTime, sizeof(sTime)); for (int i = 1; i <= MaxClients; i++) { if (IsClientInGame(i) && g_bClientEnabled[i]) { char sMsg[192]; strcopy(sMsg, sizeof(sMsg), MSG_PLANTED); ReplaceString(sMsg, sizeof(sMsg), "{time}", sTime); PrintToChat(i, sMsg); PrintToChat(i, MSG_INFO); } } if (g_hCountdownTimer != null) delete g_hCountdownTimer; g_hCountdownTimer = CreateTimer(1.0, Timer_Countdown, _, TIMER_REPEAT); } public void Event_BombStop(Event event, const char[] name, bool dontBroadcast) { if (g_hCountdownTimer != null) { delete g_hCountdownTimer; g_hCountdownTimer = null; } if (g_iPluginEnabled == 0) return; char sMsg[192]; bool bIsDefused = StrEqual(name, "bomb_defused"); if (bIsDefused) strcopy(sMsg, sizeof(sMsg), MSG_DEFUSED); else if (StrEqual(name, "bomb_exploded")) strcopy(sMsg, sizeof(sMsg), MSG_EXPLODED); else return; for (int i = 1; i <= MaxClients; i++) { if (IsClientInGame(i) && g_bClientEnabled[i]) { PrintToChat(i, sMsg); if (bIsDefused) PrintToChat(i, MSG_INFO); } } } public Action Timer_Countdown(Handle timer) { if (g_iCounter <= 0) { g_hCountdownTimer = null; return Plugin_Stop; } char sTime[10], sHint[128]; IntToString(g_iCounter, sTime, sizeof(sTime)); strcopy(sHint, sizeof(sHint), HINT_TIMER); ReplaceString(sHint, sizeof(sHint), "{time}", sTime); for (int i = 1; i <= MaxClients; i++) { if (IsClientInGame(i) && g_bClientEnabled[i]) { PrintHintText(i, sHint); if (g_iCounter <= g_iSoundStartAt && g_iCounter < 66 && g_sSoundPath[g_iCounter][0] != '\0') { EmitSoundToClient(i, g_sSoundPath[g_iCounter]); } } } g_iCounter--; return Plugin_Continue; }
в чем усложнил? все в одном файле, а не разбросано куда попалоЛюди с конфигами некоторые не могут справится, а вы им усложнили задачу в 10 раз![]()
А тем, что такой плагин теперь могут настроить люди, которые хоть как-то базово разбираются в скриптинге. Как верно подметил @babka68, "некоторые люди с конфигами не могут справиться", а тут целый исходник, с которым многие не понимают, что делать...в чем усложнил? все в одном файле, а не разбросано куда попало