RusJJ
Доброе утро девачьки
- Сообщения
- 2,582
- Реакции
- 1,075
@Paranoiiik, можно в OnClientPutInServer узнавать это же время, а потом при выходе отнимать его. Но если не ошибаюсь, при смене карты будет опять вызываться.
#pragma semicolon 1
#include <cstrike>
ConVar mp_startmoney;
bool bFirstRound;
int m_iAccount,
iFirstMoney,
iDefMoney;
public Plugin:myinfo =
{
name = "First round startmoney",
author = "Grey83",
description = "Changes the initial amount of money for the first round.",
version = "1.0.1",
url = "https://steamcommunity.com/groups/grey83ds"
};
public void OnPluginStart()
{
EngineVersion ver = GetEngineVersion();
if(ver != Engine_CSS && ver != Engine_CSGO) SetFailState("Plugin for CS:S and CS:GO only!");
m_iAccount = FindSendPropInfo("CCSPlayer", "m_iAccount");
(mp_startmoney = CreateConVar("sm_startmoney_first", "800", "Сколько денег будет выдавать в первом раунде", _, true, 800.0, true, 16000.0)).AddChangeHook(CVarChange_First);
iFirstMoney = mp_startmoney.IntValue;
(mp_startmoney = CreateConVar("sm_startmoney_def", "16000", "Сколько денег будет выдавать в начале каждого из всех остальных раундов", _, true, 800.0, true, 16000.0)).AddChangeHook(CVarChange_Def);
iDefMoney = mp_startmoney.IntValue;
AutoExecConfig(true, "StartMoney");
if((mp_startmoney = FindConVar("mp_startmoney")) == null) SetFailState("Can't find ConVar 'mp_startmoney'!");
}
public void CVarChange_First(ConVar convar, const char[] oldValue, const char[] newValue)
{
convar.IntValue = iFirstMoney;
if(bFirstRound) mp_startmoney.IntValue = iFirstMoney;
}
public void CVarChange_Def(ConVar convar, const char[] oldValue, const char[] newValue)
{
convar.IntValue = iDefMoney;
if(!bFirstRound) mp_startmoney.IntValue = iDefMoney;
}
public void OnMapStart()
{
bFirstRound = true;
mp_startmoney.IntValue = iFirstMoney;
}
public Action CS_OnTerminateRound(float& delay, CSRoundEndReason& reason)
{
static bool start;
start = (reason == CSRoundEnd_GameStart);
if(bFirstRound != start)
{
bFirstRound = start;
mp_startmoney.IntValue = bFirstRound ? iFirstMoney : iDefMoney;
if(m_iAccount > 0) for(int i = 1, diff = iDefMoney - iFirstMoney; i <= MaxClients; i++)
if(IsClientInGame(i)) SetEntData(i, m_iAccount, GetEntData(i, m_iAccount) + diff);
}
return Plugin_Continue;
}
когда то давно писал такой плагин. конечно не проверял, но судя по автору темы плагин рабочий.Здравствуйте, кто подскажет, как сделать так, чтобы в 1 раунде и после мены сторон было 800 долларов, а в остальных раундах по 16к?
исходник:#pragma semicolon 1 #include <cstrike> ConVar mp_startmoney; bool bFirstRound; int m_iAccount, iFirstMoney, iDefMoney; public Plugin:myinfo = { name = "First round startmoney", author = "Grey83", description = "Changes the initial amount of money for the first round.", version = "1.0.1", url = "https://steamcommunity.com/groups/grey83ds" }; public void OnPluginStart() { EngineVersion ver = GetEngineVersion(); if(ver != Engine_CSS && ver != Engine_CSGO) SetFailState("Plugin for CS:S and CS:GO only!"); m_iAccount = FindSendPropInfo("CCSPlayer", "m_iAccount"); (mp_startmoney = CreateConVar("sm_startmoney_first", "800", "Сколько денег будет выдавать в первом раунде", _, true, 800.0, true, 16000.0)).AddChangeHook(CVarChange_First); iFirstMoney = mp_startmoney.IntValue; (mp_startmoney = CreateConVar("sm_startmoney_def", "16000", "Сколько денег будет выдавать в начале каждого из всех остальных раундов", _, true, 800.0, true, 16000.0)).AddChangeHook(CVarChange_Def); iDefMoney = mp_startmoney.IntValue; AutoExecConfig(true, "StartMoney"); if((mp_startmoney = FindConVar("mp_startmoney")) == null) SetFailState("Can't find ConVar 'mp_startmoney'!"); } public void CVarChange_First(ConVar convar, const char[] oldValue, const char[] newValue) { convar.IntValue = iFirstMoney; if(bFirstRound) mp_startmoney.IntValue = iFirstMoney; } public void CVarChange_Def(ConVar convar, const char[] oldValue, const char[] newValue) { convar.IntValue = iDefMoney; if(!bFirstRound) mp_startmoney.IntValue = iDefMoney; } public void OnMapStart() { bFirstRound = true; mp_startmoney.IntValue = iFirstMoney; } public Action CS_OnTerminateRound(float& delay, CSRoundEndReason& reason) { static bool start; start = (reason == CSRoundEnd_GameStart); if(bFirstRound != start) { bFirstRound = start; mp_startmoney.IntValue = bFirstRound ? iFirstMoney : iDefMoney; if(m_iAccount > 0) for(int i = 1, diff = iDefMoney - iFirstMoney; i <= MaxClients; i++) if(IsClientInGame(i)) SetEntData(i, m_iAccount, GetEntData(i, m_iAccount) + diff); } return Plugin_Continue; }
Есть же плагин оптечек, его возьми и чекай варианты убийстваВсем привет,можете накидать пример кода по ниже перечисленному?
У меня есть плагин,который при определенных событиях выдает определенное кол-во ХП,как можно в него добавить ConVar,отвечающий еще за выпадание аптечки,после смерти игрока и она могла давать Хп в зависимости от типа убийства к примеру хеадшот,но не превышало максимального Хп,установленного в ConVar
Пример уже имеющегося кода кода кинут не могу=)
я их уже кучу перекачал и запутал уже сам себя)),оставлю это до завтра)Есть же плагин оптечек, его возьми и чекай варианты убийства
#pragma semicolon 1
#pragma newdecls required
char
sNick[MAX_NAME_LENGTH],
sAdminsFlag[16];
public void OnPluginStart()
{
ConVar cvar;
cvar = CreateConVar("test_admins_flag", "b", "Игрок - Админ");
cvar.AddChangeHook(CVarChanged_AdminsFlag);
cvar.GetString(sAdminsFlag, sizeof(sAdminsFlag));
HookEvent("player_connect", Event_BlockBroadcast, EventHookMode_Pre);
}
public void CVarChanged_AdminsFlag(ConVar cvar, const char[] oldVal, const char[] newVal)
{
cvar.GetString(sAdminsFlag, sizeof(sAdminsFlag));
}
public void Event_BlockBroadcast(Event event, const char[] name, bool dontBroadcast)
{
if(!dontBroadcast)
event.BroadcastDisabled = true;
int client = GetClientOfUserId(GetEventInt(event, "userid"));
if(client && IsClientInGame(client) && !IsFakeClient(client))
{
if(GetUserFlagBits(client) & ReadFlagString(sAdminsFlag)) PrintToChatAll("Админ %s заходит на сервер", sNick);
else PrintToChatAll("%s заходит на сервер", sNick);
}
}
Нет смысла хукать player_connect используй функциюЕсли убрать в начале условия client на 31-й строке, пишет Client index 0 is invalid.C++:#pragma semicolon 1 #pragma newdecls required char sNick[MAX_NAME_LENGTH], sAdminsFlag[16]; public void OnPluginStart() { ConVar cvar; cvar = CreateConVar("test_admins_flag", "b", "Игрок - Админ"); cvar.AddChangeHook(CVarChanged_AdminsFlag); cvar.GetString(sAdminsFlag, sizeof(sAdminsFlag)); HookEvent("player_connect", Event_BlockBroadcast, EventHookMode_Pre); } public void CVarChanged_AdminsFlag(ConVar cvar, const char[] oldVal, const char[] newVal) { cvar.GetString(sAdminsFlag, sizeof(sAdminsFlag)); } public void Event_BlockBroadcast(Event event, const char[] name, bool dontBroadcast) { if(!dontBroadcast) event.BroadcastDisabled = true; int client = GetClientOfUserId(GetEventInt(event, "userid")); if(client && IsClientInGame(client) && !IsFakeClient(client)) { if(GetUserFlagBits(client) & ReadFlagString(sAdminsFlag)) PrintToChatAll("Админ %s заходит на сервер", sNick); else PrintToChatAll("%s заходит на сервер", sNick); } }
Если оставить, код в условии не выполняется.
По моему скромному предположению - на стадии player_connect нельзя пытаться определить, есть ли у игрока админские флаги.
Так ли это? Подскажите, пожалуйста, если можно определять, то как (примером в виде куска кода)? Понимаю, что, скорее всего, просто не правильно выстраиваю условие (хотя выглядит задача крайне простой (на первый мой взгляд)).
OnClientPutInServer
GetUserFlagBits(int client)
Просто мне нужна была именно эта стадия, чтобы печатать сообщение именно при этом событии.используй функциюOnClientPutInServer
Ля, вроде такая логичная штука, а я до этого не додумался. Понял, спасибо!Наличие админ-флагов можно определять только послеOnClientPostAdminCheck()
. До этого момента, сервер не знает SteamID достоверно.
L 12/20/2020 - 17:18:12: SourceMod error session started
L 12/20/2020 - 17:18:12: Info (map "de_dust2") (file "/servers/css/1035/cstrike/addons/sourcemod/logs/errors_20201220.log")
L 12/20/2020 - 17:18:12: [SM] Exception reported: Invalid index 0 (count: 0)
L 12/20/2020 - 17:18:12: [SM] Blaming: cssdm/dm_give_ent.smx
L 12/20/2020 - 17:18:12: [SM] Call stack trace:
L 12/20/2020 - 17:18:12: [SM] [0] GetArrayString
L 12/20/2020 - 17:18:12: [SM] [1] Line 462, addons\sourcemod\scripting\cssdm\dm_give_ent.sp::OnGiveWeapon
L 12/20/2020 - 17:18:12: [SM] [2] Line 277, addons\sourcemod\scripting\cssdm\dm_give_ent.sp::OnClientSpawnedPost
OnGiveWeapon(client);
public Action:OnClientSpawnedPost(Handle:timer, any:client)
{
if (!IsClientInGame(client))return;
if (!IsPlayerAlive(client))return;
if (!IsFakeClient(client))
{
g_tMenu[client] = 0;
menu_DM_Spawn(client);
}
else
{
g_iPrimary[client] = -1;
g_iSecondary[client] = -1;
OnGiveWeapon(client);
}
OnGiveItems(client);
}
GetArrayString(array_Primary, g_iPrimary[client] > -1 ? g_iPrimary[client] : GetRandomInt(0, GetArraySize(array_Primary) - 1), sWeapon, sizeof(sWeapon));
OnGiveWeapon(client)
{
new String:sWeapon[64];
WeaponHandler(client, 0);
GetArrayString(array_Primary, g_iPrimary[client] > -1 ? g_iPrimary[client] : GetRandomInt(0, GetArraySize(array_Primary) - 1), sWeapon, sizeof(sWeapon));
GiveClientItem(client, sWeapon);
WeaponHandler(client, 1);
GetArrayString(array_Secondary, g_iSecondary[client] > -1 ? g_iSecondary[client] : GetRandomInt(0, GetArraySize(array_Secondary) - 1), sWeapon, sizeof(sWeapon));
GiveClientItem(client, sWeapon);
}
(count: 0) Это означает, что массив пуст. Сначала проверьте размер массива. GetArraySize(Handle array) > 0.Всем привет,помогите исправить ошибки в модуле
Errors:L 12/20/2020 - 17:18:12: SourceMod error session started L 12/20/2020 - 17:18:12: Info (map "de_dust2") (file "/servers/css/1035/cstrike/addons/sourcemod/logs/errors_20201220.log") L 12/20/2020 - 17:18:12: [SM] Exception reported: Invalid index 0 (count: 0) L 12/20/2020 - 17:18:12: [SM] Blaming: cssdm/dm_give_ent.smx L 12/20/2020 - 17:18:12: [SM] Call stack trace: L 12/20/2020 - 17:18:12: [SM] [0] GetArrayString L 12/20/2020 - 17:18:12: [SM] [1] Line 462, addons\sourcemod\scripting\cssdm\dm_give_ent.sp::OnGiveWeapon L 12/20/2020 - 17:18:12: [SM] [2] Line 277, addons\sourcemod\scripting\cssdm\dm_give_ent.sp::OnClientSpawnedPost
277C-подобный:OnGiveWeapon(client);
277:public Action:OnClientSpawnedPost(Handle:timer, any:client) { if (!IsClientInGame(client))return; if (!IsPlayerAlive(client))return; if (!IsFakeClient(client)) { g_tMenu[client] = 0; menu_DM_Spawn(client); } else { g_iPrimary[client] = -1; g_iSecondary[client] = -1; OnGiveWeapon(client); } OnGiveItems(client); }
462 строкаC-подобный:GetArrayString(array_Primary, g_iPrimary[client] > -1 ? g_iPrimary[client] : GetRandomInt(0, GetArraySize(array_Primary) - 1), sWeapon, sizeof(sWeapon));
C-подобный:OnGiveWeapon(client) { new String:sWeapon[64]; WeaponHandler(client, 0); GetArrayString(array_Primary, g_iPrimary[client] > -1 ? g_iPrimary[client] : GetRandomInt(0, GetArraySize(array_Primary) - 1), sWeapon, sizeof(sWeapon)); GiveClientItem(client, sWeapon); WeaponHandler(client, 1); GetArrayString(array_Secondary, g_iSecondary[client] > -1 ? g_iSecondary[client] : GetRandomInt(0, GetArraySize(array_Secondary) - 1), sWeapon, sizeof(sWeapon)); GiveClientItem(client, sWeapon); }
(count: 0)