7pElllHuK
Участник
- Сообщения
- 1,654
- Реакции
- 639
Спасибо большое, проверю@7pElllHuK,замени наC-подобный:if (hTimer) CloseHandle(hTimer);C-подобный:if (hTimer) { CloseHandle(hTimer); hTimer = null; }
Спасибо большое, проверю@7pElllHuK,замени наC-подобный:if (hTimer) CloseHandle(hTimer);C-подобный:if (hTimer) { CloseHandle(hTimer); hTimer = null; }
Почитай Как остановить (удалить) глобальный таймерВсем привет, подскажите пожалуйста как исправить ошибку:L 06/25/2024 - 00:57:24: [SM] Exception reported: Handle c695055a is invalid (error 1)
L 06/25/2024 - 00:57:24: [SM] Blaming: C4 10 sec 1.1.0.smx
L 06/25/2024 - 00:57:24: [SM] Call stack trace:
L 06/25/2024 - 00:57:24: [SM] [0] CloseHandle
L 06/25/2024 - 00:57:24: [SM] [1] Line 76, D:\ONEdRIVE\Desktop\Компиляторы\1.11 scripting\C4 10 sec 1.1.0.sp::Event_End
L 06/25/2024 - 00:57:24: [SM] [3] CS_TerminateRound
L 06/25/2024 - 00:57:24: [SM] [4] Line 81, C:\Users\Admin\Desktop\kac_new\delayroundend.sp::CS_OnTerminateRoundПлагин:#pragma semicolon 1 #pragma newdecls required #include <sdktools_sound> #include <sdktools_stringtables> static const char g_szSound[][] = { "sound/kosmicheskiy/c4_explode/3.mp3", "sound/kosmicheskiy/c4_explode/4.mp3" }; Handle hTimer; float fTimer; int iPos; public Plugin myinfo = { name = "C4 10 seconds", version = "1.1.0 (rewritten by Grey83)", description = "Воспроизведение музыки за 10 секунд до взрыва бомбы", author = "Ало, Ва-Вадик?", url = "https://vk.com/kopojlebckuu_7pelllhuk" } public void OnPluginStart() { ConVar cvar = FindConVar("mp_c4timer"); if(!cvar) SetFailState("Can't find convar 'mp_c4timer'!"); cvar.AddChangeHook(CVarChange); CVarChange(cvar, "", ""); HookEvent("bomb_planted", Event_BombPlanted, EventHookMode_Pre); HookEvent("round_start", Event_End, EventHookMode_PostNoCopy); HookEvent("round_end", Event_End, EventHookMode_PostNoCopy); } public void CVarChange(ConVar cvar, const char[] oldValue, const char[] newValue) { fTimer = cvar.FloatValue - 10; } public void OnMapStart() { hTimer = null; for(int i; i < sizeof(g_szSound); i++) { AddFileToDownloadsTable(g_szSound[i]); PrecacheSound(g_szSound[i][6]); } } public void Event_BombPlanted(Event event, const char[] name, bool dontBroadcast) { if(fTimer >= 0.0) hTimer = CreateTimer(fTimer, Timer_Countdown, _, TIMER_FLAG_NO_MAPCHANGE); } public Action Timer_Countdown(Handle timer) { hTimer = null; int i; while((i = GetRandomInt(0, sizeof(g_szSound)-1)) == iPos) {} iPos = i; EmitSoundToAll(g_szSound[i][6]); return Plugin_Stop; } public void Event_End(Event event, const char[] name, bool dontBroadcast) { if (hTimer) CloseHandle(hTimer); }
#pragma semicolon 1
#pragma newdecls required
#include <sdktools_sound>
#include <sdktools_stringtables>
static const char g_szSound[][] =
{
"sound/kosmicheskiy/c4_explode/3.mp3",
"sound/kosmicheskiy/c4_explode/4.mp3"
};
Handle
hTimer;
float
fTimer;
int
iPos;
public Plugin myinfo =
{
name = "C4 10 seconds",
version = "1.1.0 (rewritten by Grey83)",
description = "Воспроизведение музыки за 10 секунд до взрыва бомбы",
author = "Ало, Ва-Вадик?",
url = "https://vk.com/kopojlebckuu_7pelllhuk"
}
public void OnPluginStart()
{
ConVar cvar = FindConVar("mp_c4timer");
if (!cvar)SetFailState("Can't find convar 'mp_c4timer'!");
cvar.AddChangeHook(CVarChange);
CVarChange(cvar, "", "");
HookEvent("bomb_planted", Event_BombPlanted, EventHookMode_Pre);
HookEvent("round_start", Event_End, EventHookMode_PostNoCopy);
HookEvent("round_end", Event_End, EventHookMode_PostNoCopy);
}
public void CVarChange(ConVar cvar, const char[] oldValue, const char[] newValue)
{
fTimer = cvar.FloatValue - 10;
}
public void OnMapStart()
{
hTimer = null;
for (int i; i < sizeof(g_szSound); i++)
{
AddFileToDownloadsTable(g_szSound[i]);
PrecacheSound(g_szSound[i][6]);
}
}
public void Event_BombPlanted(Event event, const char[] name, bool dontBroadcast)
{
delete hTimer; // предотвращает двойной запуск (на всякий случай)
if (fTimer >= 0.0)hTimer = CreateTimer(fTimer, Timer_Countdown, _, TIMER_FLAG_NO_MAPCHANGE);
}
public Action Timer_Countdown(Handle timer)
{
int i;
while ((i = GetRandomInt(0, sizeof(g_szSound) - 1)) == iPos) { }
iPos = i;
EmitSoundToAll(g_szSound[i][6]);
hTimer = null;
return Plugin_Stop;
}
public void OnMapEnd() // требуется, поскольку принудительная смена карты не вызывает событие "round_end"
{
delete hTimer;
}
public void Event_End(Event event, const char[] name, bool dontBroadcast)
{
delete hTimer; // останавливаем таймер на случай, если он ещё не сработал, таким образом этот старый таймер не будет перенесён на новый раунд и не сработает случайно в процессе загрузки уровня
fTimer == 0.0;
}
@7pElllHuK,замени наC-подобный:if (hTimer) CloseHandle(hTimer);C-подобный:if (hTimer) { CloseHandle(hTimer); hTimer = null; }
Спасибо большое, помогли оба вариантаПочитай Как остановить (удалить) глобальный таймер
Часто ошибка возникает?
Попробуй так:
C-подобный:#pragma semicolon 1 #pragma newdecls required #include <sdktools_sound> #include <sdktools_stringtables> static const char g_szSound[][] = { "sound/kosmicheskiy/c4_explode/3.mp3", "sound/kosmicheskiy/c4_explode/4.mp3" }; Handle hTimer; float fTimer; int iPos; public Plugin myinfo = { name = "C4 10 seconds", version = "1.1.0 (rewritten by Grey83)", description = "Воспроизведение музыки за 10 секунд до взрыва бомбы", author = "Ало, Ва-Вадик?", url = "https://vk.com/kopojlebckuu_7pelllhuk" } public void OnPluginStart() { ConVar cvar = FindConVar("mp_c4timer"); if (!cvar)SetFailState("Can't find convar 'mp_c4timer'!"); cvar.AddChangeHook(CVarChange); CVarChange(cvar, "", ""); HookEvent("bomb_planted", Event_BombPlanted, EventHookMode_Pre); HookEvent("round_start", Event_End, EventHookMode_PostNoCopy); HookEvent("round_end", Event_End, EventHookMode_PostNoCopy); } public void CVarChange(ConVar cvar, const char[] oldValue, const char[] newValue) { fTimer = cvar.FloatValue - 10; } public void OnMapStart() { hTimer = null; for (int i; i < sizeof(g_szSound); i++) { AddFileToDownloadsTable(g_szSound[i]); PrecacheSound(g_szSound[i][6]); } } public void Event_BombPlanted(Event event, const char[] name, bool dontBroadcast) { delete hTimer; // предотвращает двойной запуск (на всякий случай) if (fTimer >= 0.0)hTimer = CreateTimer(fTimer, Timer_Countdown, _, TIMER_FLAG_NO_MAPCHANGE); } public Action Timer_Countdown(Handle timer) { int i; while ((i = GetRandomInt(0, sizeof(g_szSound) - 1)) == iPos) { } iPos = i; EmitSoundToAll(g_szSound[i][6]); hTimer = null; return Plugin_Stop; } public void OnMapEnd() // требуется, поскольку принудительная смена карты не вызывает событие "round_end" { delete hTimer; } public void Event_End(Event event, const char[] name, bool dontBroadcast) { delete hTimer; // останавливаем таймер на случай, если он ещё не сработал, таким образом этот старый таймер не будет перенесён на новый раунд и не сработает случайно в процессе загрузки уровня fTimer == 0.0; }
#include <ripext>
#include <vkcore>
#pragma semicolon 1
#pragma newdecls required
HTTPClient g_hHTTPClient;
char g_sToken[1024] = {""}; //ID группы
int g_iID = ; //ID
GlobalForward OnMessagesSend;
public Plugin myinfo =
{
name = "VK Core",
description = "Простая библиотека для отправки сообщений в личные сообщения, беседы, группы с помощью VK API",
version = "1.0.2",
author = "fr4nch",
url = "https://hlmod.net/members/fr4nch.85922/"
};
public APLRes AskPluginLoad2(Handle hMyself, bool bLate, char[] sError, int iErr_max)
{
RegPluginLibrary("vkcore");
CreateNative("VK_MessagesSend", Native_MessagesSend);
OnMessagesSend = new GlobalForward("VK_OnMessagesSend", ET_Ignore, Param_String);
return APLRes_Success;
}
public void OnPluginStart()
{
VK_MessagesSend(g_iID, "Тестовое сообщение");
}
public int Native_MessagesSend(Handle hPlugin, int iArgs)
{
int iPID = GetNativeCell(1);
int iLen;
GetNativeStringLength(2, iLen);
iLen += 384;
char[] sMessage = new char[iLen];
GetNativeString(2, sMessage, iLen);
ReplaceString(sMessage, iLen, " ", "%20", true);
ReplaceString(sMessage, iLen, "NWLN", "%0A", true);
ReplaceString(sMessage, iLen, "\n", "%0A", true);
ReplaceString(sMessage, iLen, "#", "%23", true);
Forward_OnClientReportSend(sMessage);
Format(sMessage, iLen, "https://api.vk.com/method/messages.send?v=5.101&random_id=%i&access_token=%s&peer_id=%d&message=%s", GetRandomInt(1, 2147483646), g_sToken, iPID, sMessage);
RIP_SendMessage(sMessage);
}
stock void Forward_OnClientReportSend(char[] sMessage)
{
Call_StartForward(OnMessagesSend);
Call_PushString(sMessage);
Call_Finish();
}
void RIP_SendMessage(const char[] sURL)
{
g_hHTTPClient = new HTTPClient(sURL);
g_hHTTPClient.Get(sURL, OnRequestCompleteRIP);
}
void OnRequestCompleteRIP(HTTPResponse hResponse, any iData)
{
if (hResponse.Status != HTTPStatus_OK) LogMessage("[VK API] Response: %d", hResponse.Status);
}
И не будет: нативы и форварды я добавил только через год в v1.1.2Пользуюсь версией sm_revival 1.0.9,ну с ней не работает выдача.
Нет вариантов?Спасибо большое, помогли оба варианта
Сообщения автоматически склеены:
Добрый вечер, подскажите пожалуйста, как можно отправить сообщение в ВК без использования расширения Rest in Pawn?
Взял код от VK Core, но не удобно что нужно ставить на сервер Rest in Pawn
C-подобный:#include <ripext> #include <vkcore> #pragma semicolon 1 #pragma newdecls required HTTPClient g_hHTTPClient; char g_sToken[1024] = {""}; //ID группы int g_iID = ; //ID GlobalForward OnMessagesSend; public Plugin myinfo = { name = "VK Core", description = "Простая библиотека для отправки сообщений в личные сообщения, беседы, группы с помощью VK API", version = "1.0.2", author = "fr4nch", url = "https://hlmod.net/members/fr4nch.85922/" }; public APLRes AskPluginLoad2(Handle hMyself, bool bLate, char[] sError, int iErr_max) { RegPluginLibrary("vkcore"); CreateNative("VK_MessagesSend", Native_MessagesSend); OnMessagesSend = new GlobalForward("VK_OnMessagesSend", ET_Ignore, Param_String); return APLRes_Success; } public void OnPluginStart() { VK_MessagesSend(g_iID, "Тестовое сообщение"); } public int Native_MessagesSend(Handle hPlugin, int iArgs) { int iPID = GetNativeCell(1); int iLen; GetNativeStringLength(2, iLen); iLen += 384; char[] sMessage = new char[iLen]; GetNativeString(2, sMessage, iLen); ReplaceString(sMessage, iLen, " ", "%20", true); ReplaceString(sMessage, iLen, "NWLN", "%0A", true); ReplaceString(sMessage, iLen, "\n", "%0A", true); ReplaceString(sMessage, iLen, "#", "%23", true); Forward_OnClientReportSend(sMessage); Format(sMessage, iLen, "https://api.vk.com/method/messages.send?v=5.101&random_id=%i&access_token=%s&peer_id=%d&message=%s", GetRandomInt(1, 2147483646), g_sToken, iPID, sMessage); RIP_SendMessage(sMessage); } stock void Forward_OnClientReportSend(char[] sMessage) { Call_StartForward(OnMessagesSend); Call_PushString(sMessage); Call_Finish(); } void RIP_SendMessage(const char[] sURL) { g_hHTTPClient = new HTTPClient(sURL); g_hHTTPClient.Get(sURL, OnRequestCompleteRIP); } void OnRequestCompleteRIP(HTTPResponse hResponse, any iData) { if (hResponse.Status != HTTPStatus_OK) LogMessage("[VK API] Response: %d", hResponse.Status); }
ЕстьНет вариантов?
СпасибоЕсть
![]()
Не поддерживается - Block VK
Последняя версия (исправлена отправка уведомлений) -> КЛИК Плагин может отправлять сообщения о блокировках как в беседу, так и пользователям (пользователь должен написать перед этим боту в ЛС). Структура block_vk.ini: "Block_VK" {...hlmod.net
Тут отправка сообщений через сокет
public bool OnKeyUse(int iClient, const char[] sKeyType, ArrayList hParamsArr, char[] sError, int iErrLen)
{
decl char sParam[KEYS_MAX_LENGTH], szAuth[32], szName[MAX_NAME_LENGTH];
hParamsArr.GetString(1, sParam, sizeof(sParam));
GetClientAuthId(iClient, AuthId_Steam2, szAuth, sizeof(szAuth));
GetClientName(iClient, szName, sizeof(szName));
if (g_hUsers.FindString(szAuth) == -1)
{
char szQuery[256];
int iExpires = StringToInt(sParam);
FormatEx(szQuery, sizeof(szQuery), "INSERT INTO `test` (`steam`, `name`, `time`) VALUES ('%s', '%s', '%d');", szAuth, szName, GetTime(), iExpires != 0 ? iExpires + GetTime() : iExpires);
DataPack hPack = new DataPack();
hPack.WriteCell(GetClientUserId(iClient));
hPack.WriteCell(iExpires);
g_hDatabase.Query(DB_InsertCallback, szQuery, hPack);
return true;
}
return false;
}
Необходимо найти в таблице info информацию по name, строку найти эту, из этой строки получить данные `cfg` и записать их, изменив запрос из кода выше на запись, добавляя параметр cfg из таблицы info.@sviridov_artem, Так и в чём вопрос та? Это таблица, если в этом вопрос INSERT INTO `test`
Необходимо
Спасибо конечно, я пробовал сам сделать, искал/читал, не выходит, к сожалению, поэтому и попросил помощи здесь.SQL (SourceMod Scripting) - AlliedModders Wiki
wiki.alliedmods.net[SourcePawn] Урок 13 - Работа с базами данных (MySQL, SQLite)
[SourcePawn] Урок 13 - Работа с базами данных (MySQL, SQLite)hlmod.net![]()
JDoodle - Online Compiler, Editor for Java, C/C++, etc
JDoodle is an Online Compiler, Editor, IDE for Java, C, C++, PHP, Perl, Python, Ruby and many more. You can run your programs on the fly online, and you can save and share them with others. Quick and Easy way to compile and run programs online.www.jdoodle.com![]()
Памятка/шпаргалка по SQL
Доброго времени суток, друзья! Изучение настоящей шпаргалки не сделает вас мастером SQL, но позволит получить общее представление об этом языке программирования и возможностях, которые он...habr.com
Проверить валидность sql запроса можно обычным способом через mysql web, а я не пойму как подключиться к другой таблице, и взять с нее то, что мне нужно, и далее передать эту информацию в запрос на запись. Если не трудно, подскажи, пожалуйста, примером.@sviridov_artem, по третьей ссылке онлайн-инструмент, которым можно проверить валидность своей sql-команды.
Точно так же как и к этой, предварительно отключившись от предыдущей.как подключиться к другой таблице, и взять с нее то, что мне нужно
Запись куда? Если в другую таблицу, то выше уже написал.и далее передать эту информацию в запрос на запись
Ты бы показал как сам это пытался сделать и тебе бы подсказали где ошибся.Если не трудно, подскажи, пожалуйста, примером.
С телефона сижу, форматирование может испортитьсяНеобходимо найти в таблице info информацию по name, строку найти эту, из этой строки получить данные `cfg` и записать их, изменив запрос из кода выше на запись, добавляя параметр cfg из таблицы info.
public void OnClientPostAdminCheck(int iClient)
{
if(IsFakeClient(iClient) == false)
{
char szQuery[256], szAuth[32];
GetClientAuthId(iClient, AuthId_Engine, szAuth, sizeof(szAuth), true);
FormatEx(szQuery, sizeof(szQuery), "SELECT `id`, `points` FROM `table_players` WHERE `auth` = '%s';", szAuth); // Формируем запрос
g_hDatabase.Query(SQL_Callback_SelectClient, szQuery, GetClientUserId(iClient));
}
}
public void SQL_Callback_SelectClient(Database hDatabase, DBResultSet results, const char[] sError, any iUserID) // Обратный вызов
{
if(sError[0]) // Если произошла ошибка
{
LogError("SQL_Callback_SelectClient: %s", sError); // Выводим в лог
return; // Прекращаем выполнение ф-и
}
int iClient = GetClientOfUserId(iUserID);
if(iClient)
{
// Игрок всё еще на сервере
}
}
спасибо, суть примерно понял)С телефона сижу, форматирование может испортиться
Вот буквально то, что тебе нужно, совсем немного изменить название таблицы и выбираемые поля, ну и убрать лишнее
Код из урока рико:public void OnClientPostAdminCheck(int iClient) { if(IsFakeClient(iClient) == false) { char szQuery[256], szAuth[32]; GetClientAuthId(iClient, AuthId_Engine, szAuth, sizeof(szAuth), true); FormatEx(szQuery, sizeof(szQuery), "SELECT `id`, `points` FROM `table_players` WHERE `auth` = '%s';", szAuth); // Формируем запрос g_hDatabase.Query(SQL_Callback_SelectClient, szQuery, GetClientUserId(iClient)); } } public void SQL_Callback_SelectClient(Database hDatabase, DBResultSet results, const char[] sError, any iUserID) // Обратный вызов { if(sError[0]) // Если произошла ошибка { LogError("SQL_Callback_SelectClient: %s", sError); // Выводим в лог return; // Прекращаем выполнение ф-и } int iClient = GetClientOfUserId(iUserID); if(iClient) { // Игрок всё еще на сервере } }
Попробуй через INNER JOIN, может прокатитПодскажите, пожалуйста. Плагин подключен к базе данных и вот такая запись происходит
запрос:public bool OnKeyUse(int iClient, const char[] sKeyType, ArrayList hParamsArr, char[] sError, int iErrLen) { decl char sParam[KEYS_MAX_LENGTH], szAuth[32], szName[MAX_NAME_LENGTH]; hParamsArr.GetString(1, sParam, sizeof(sParam)); GetClientAuthId(iClient, AuthId_Steam2, szAuth, sizeof(szAuth)); GetClientName(iClient, szName, sizeof(szName)); if (g_hUsers.FindString(szAuth) == -1) { char szQuery[256]; int iExpires = StringToInt(sParam); FormatEx(szQuery, sizeof(szQuery), "INSERT INTO `test` (`steam`, `name`, `time`) VALUES ('%s', '%s', '%d');", szAuth, szName, GetTime(), iExpires != 0 ? iExpires + GetTime() : iExpires); DataPack hPack = new DataPack(); hPack.WriteCell(GetClientUserId(iClient)); hPack.WriteCell(iExpires); g_hDatabase.Query(DB_InsertCallback, szQuery, hPack); return true; } return false; }
необходимо подключиться к этой же базе, но к другой таблице `info` , которая имеет данные: id, cfg и прочее, возьмем на примере cfg и передать их в запись, найти cfg, выборку сделать по `name`, так как оно уникальное
FormatEx(szQuery, sizeof(szQuery), "INSERT INTO `test` (`steam`, `name`, `time`, `cfg` ) VALUES