7pElllHuK
Участник
- Сообщения
- 1,659
- Реакции
- 648
Спасибо большое, проверю@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![]()
Online SQL Compiler | JDoodle
Execute and debug SQL queries effortlessly with JDoodle's advanced online SQL compiler. Enhance your SQL programming skills in our intuitive, user-friendly environment.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