Добрый вечер. Подскажите, пожалуйста, как получить значение Cvar'a ?
Мне нужно в плагине узнать сколько длится разминка и прибавить к ней 2 секунды. (mp_warmuptime).
Handle c_Time;
public OnPluginStart()
{
c_Time = FindConVar("mp_warmuptime");
}
твоя функция
{
GetConVarInt(c_Time); // Что бы получить текущее значение
SetConVarInt(c_Time); // Что бы установить новое значение
}
Могу ли я FindConVar делать не на старте плагина, а например, OnMapStart ?PHP:Handle c_Time; public OnPluginStart() { c_Time = FindConVar("mp_warmuptime"); } твоя функция { GetConVarInt(c_Time); // Что бы получить текущее значение SetConVarInt(c_Time); // Что бы установить новое значение }
Хоть где угодно. Можно даже так сразу:Могу ли я FindConVar делать не на старте плагина, а например, OnMapStart ?
GetConVarInt(FindConVar("mp_warmuptime"));
#pragma semicolon 1
#pragma newdecls required
public void OnPlayerRunCmdPost(int iClient, int buttons, int impulse, const float vel[3], const float angles[3], int weapon, int subtype, int cmdnum, int tickcount, int seed, const int mouse[2])
{
if(buttons & IN_SCORE && GetClientTeam(iClient) != 1)
{
PrintToChatAll("s");
}
}
Я даже на сервер зайти не успеваю, как тут-же крашится, пробовал на втором, где sm 1.10 build 6453, то всё норм.Я бы тоже крашился, если бы за секунду от каждого игрока выводил 64 или 128 сообщений.
Вы б описание функции прочитали, а не ляпали несусветную дичь...Попробуй в консоль выводить игроку/серверу, а не в чат. Там в PrintToChatAll идёт массив от 1 до кол-ва игроков, а ты ещё и в OnPlayerRunCmdPost ляпнул, который вызывается в секунду столько же раз, сколько тик на сервере (а может и больше). То есть, грубо говоря, на сервере макс. число игроков 32 и тик сервера 128, то за секунду 4096 раз будет пытаться выводить сообщение!!! Про кол-во операций я и вовсе промолчу (форматирование текста, сам цикл 0-24, суммирование переменной i++).
Сообщения автоматически склеены:
Возможно у тебя на втором сервере просто меньше слотов/тик, либо оба...
Сама функция OnPlayerRunCmdPost и OnPlayerRunCmd крашит сервер вне зависимости на нажатую игроком кнопку, я только как конекчусь, в консоли пишет что я зашёл, в игре вижу выбор команды, ничего не нажимаю и сервер крашит, иногда успеваю зайти за тиму, но ничего не меняется, как крашило, так и крашит. PrintToChatAll я вписал для дебага, она не пишется в чат когда я захожу.Попробуй в консоль выводить игроку/серверу, а не в чат. Там в PrintToChatAll идёт массив от 1 до кол-ва игроков, а ты ещё и в OnPlayerRunCmdPost ляпнул, который вызывается в секунду столько же раз, сколько тик на сервере (а может и больше). То есть, грубо говоря, на сервере макс. число игроков 32 и тик сервера 128, то за секунду 4096 раз будет пытаться выводить сообщение!!! Про кол-во операций я и вовсе промолчу (форматирование текста, сам цикл 0-24, суммирование переменной i++).
Сообщения автоматически склеены:
Возможно у тебя на втором сервере просто меньше слотов/тик, либо оба...
Прочитал:Вы б описание функции прочитали, а не ляпали несусветную дичь...
stock void PrintToChatAll(const char[] format, any ...)
{
char buffer[254];
for (int i = 1; i <= MaxClients; i++)
{
if (IsClientInGame(i))
{
SetGlobalTransTarget(i);
VFormat(buffer, sizeof(buffer), format, 2);
PrintToChat(i, "%s", buffer);
}
}
}
#include <sdktools>
#include <cstrike>
bool g_bCanWhistle[MAXPLAYERS+1];
char g_szPrefix[] = " \x04\x01\x04[WHISTLE]\x01";
char WHISTLE_FULL_SOUND_PATH[] = "sound/zwolof/s_whistle.mp3";
char WHISTLE_RELATIVE_SOUND_PATH[] = "*zwolof/s_whistle.mp3";
float fTime = 10.0;
public Plugin myinfo =
{
name = "Simple Whistle",
author = "zwolof",
description = "Simple Whistle Plugin",
version = "1.0",
url = "https://steamcommunity.com/id/zwolof"
};
public void OnPluginStart()
{
for(int i = 1; i <= MaxClients; i++)
if(IsValidClient(i))
g_bCanWhistle[i] = true;
}
public OnMapStart()
{
AddFileToDownloadsTable(WHISTLE_FULL_SOUND_PATH);
FakePrecacheSound(WHISTLE_RELATIVE_SOUND_PATH);
}
public Action OnPlayerRunCmd(client, &buttons)
{
if(!IsPlayerAlive(client))
return Plugin_Continue;
if(!IsValidClient(client))
return Plugin_Continue;
if(GetClientTeam(client) == CS_TEAM_T)
{
if(buttons & IN_USE && g_bCanWhistle[client])
{
char szName[256];
GetClientName(client, szName, sizeof(szName));
PrintToChatAll("%s %s has \x04whistled\x01!", g_szPrefix, szName);
float fVec[3];
GetClientAbsOrigin(client, fVec);
fVec[2] += 10;
EmitAmbientSound(WHISTLE_RELATIVE_SOUND_PATH, fVec, client, SNDLEVEL_RAIDSIREN, _, 0.3);
g_bCanWhistle[client] = false;
CreateTimer(fTime, RemoveCooldown, client);
}
}
return Plugin_Continue;
}
public Action RemoveCooldown(Handle tmr, int client)
{
g_bCanWhistle[client] = true;
PrintToChat(client, "%s You can now \x04whistle\x01 again!", g_szPrefix);
}
stock FakePrecacheSound(const char[] szPath)
{
AddToStringTable(FindStringTable("soundprecache"), szPath);
}
stock bool IsValidClient(int client)
{
if (0 < client && client <= MaxClients && IsClientInGame(client))
return true;
return false;
}
Может кто переделать плагин.
Нужно убрать привязку по кнопке Е, и сделать через команду !whistle
C-подобный:#include <sdktools> #include <cstrike> bool g_bCanWhistle[MAXPLAYERS+1]; char g_szPrefix[] = " \x04\x01\x04[WHISTLE]\x01"; char WHISTLE_FULL_SOUND_PATH[] = "sound/zwolof/s_whistle.mp3"; char WHISTLE_RELATIVE_SOUND_PATH[] = "*zwolof/s_whistle.mp3"; float fTime = 10.0; public Plugin myinfo = { name = "Simple Whistle", author = "zwolof", description = "Simple Whistle Plugin", version = "1.0", url = "https://steamcommunity.com/id/zwolof" }; public void OnPluginStart() { for(int i = 1; i <= MaxClients; i++) if(IsValidClient(i)) g_bCanWhistle[i] = true; } public OnMapStart() { AddFileToDownloadsTable(WHISTLE_FULL_SOUND_PATH); FakePrecacheSound(WHISTLE_RELATIVE_SOUND_PATH); } public Action OnPlayerRunCmd(client, &buttons) { if(!IsPlayerAlive(client)) return Plugin_Continue; if(!IsValidClient(client)) return Plugin_Continue; if(GetClientTeam(client) == CS_TEAM_T) { if(buttons & IN_USE && g_bCanWhistle[client]) { char szName[256]; GetClientName(client, szName, sizeof(szName)); PrintToChatAll("%s %s has \x04whistled\x01!", g_szPrefix, szName); float fVec[3]; GetClientAbsOrigin(client, fVec); fVec[2] += 10; EmitAmbientSound(WHISTLE_RELATIVE_SOUND_PATH, fVec, client, SNDLEVEL_RAIDSIREN, _, 0.3); g_bCanWhistle[client] = false; CreateTimer(fTime, RemoveCooldown, client); } } return Plugin_Continue; } public Action RemoveCooldown(Handle tmr, int client) { g_bCanWhistle[client] = true; PrintToChat(client, "%s You can now \x04whistle\x01 again!", g_szPrefix); } stock FakePrecacheSound(const char[] szPath) { AddToStringTable(FindStringTable("soundprecache"), szPath); } stock bool IsValidClient(int client) { if (0 < client && client <= MaxClients && IsClientInGame(client)) return true; return false; }
#include <sdktools>
#define prefix " \x04\x01\x04[WHISTLE]\x01"
#define WHISTLE_FULL_SOUND_PATH "sound/zwolof/s_whistle.mp3"
#define WHISTLE_RELATIVE_SOUND_PATH "*zwolof/s_whistle.mp3"
bool g_bCanWhistle[MAXPLAYERS+1] = {true, ...};
public void OnPluginStart() {
RegConsoleCmd("sm_whistle", whistle, "Whistle");
}
public void OnMapStart() {
AddFileToDownloadsTable(WHISTLE_FULL_SOUND_PATH);
AddToStringTable(FindStringTable("soundprecache"), WHISTLE_RELATIVE_SOUND_PATH);
}
public void OnClientDisconnect(int client) {
g_bCanWhistle[client] = true;
}
public Action whistle(int client, int args) {
if(!IsValidClient(client)) return Plugin_Handled;
if(g_bCanWhistle[client] && GetClientTeam(client) == 3) {
g_bCanWhistle[client] = false;
PrintToChatAll("%s %N has \x04whistled\x01!", prefix, client);
float fVec[3];
GetClientAbsOrigin(client, fVec);
fVec[2] += 10;
EmitAmbientSound(WHISTLE_RELATIVE_SOUND_PATH, fVec, client, SNDLEVEL_RAIDSIREN, _, 0.3);
CreateTimer(10.0, RemoveCooldown, GetClientOfUserId(client));
}
return Plugin_Handled;
}
public Action RemoveCooldown(Handle tmr, any client) {
if(!IsClientInGame(client)) return Plugin_Stop;
g_bCanWhistle[client] = true;
PrintToChat(client, "%s You can now \x04whistle\x01 again!", prefix);
return Plugin_Handled;
}
stock bool IsValidClient(int client) {
if (0 < client && client <= MaxClients && IsClientInGame(client) && IsPlayerAlive(client))
return true;
return false;
}
Ребята привет. Как можно получить координаты оружие, которое бросил?
#include <sdktools>
#include <sdkhooks>
bool bEntTouch[2048] = {false, ...};
public void OnClientPutInServer(int client) {
SDKHook(client, SDKHook_WeaponDropPost, WeaponDropPost);
}
public Action WeaponDropPost(int client, int weapon) {
if(weapon < 1 || !IsValidEdict(weapon)) return;
SDKHook(weapon, SDKHook_StartTouch, StartTouch);
}
public Action StartTouch(int entity, int entity2) {
if(!bEntTouch[entity] && entity2 == 0) {
bEntTouch[entity] = true;
CreateTimer(0.7, GetPos, entity, TIMER_FLAG_NO_MAPCHANGE);
}
}
public Action GetPos(Handle timer, any entity) {
float fEntPos[3]; GetEntPropVector(entity, Prop_Send, "m_vecOrigin", fEntPos);
bEntTouch[entity] = false;
// fEntPos то, что тебе нужно.
}
Хотел бы попросить немного подправить плагин, а именно сделать так, чтобы деньги не выдавались на пистолетке. Но при этом у меня стоит первый раунд как на фейсите(+пистолетка). То есть чтобы деньги начислялись после 2 рануда. Заранее спасибо
Попробовал скомпилить и оказалось, что это палгин компилируется на ядре 3.0, а у меня вип ядро версии 2.1.3. Возможно под эту версию сделаю?C++:#include <sdktools> #include <sdkhooks> bool bEntTouch[2048] = {false, ...}; public void OnClientPutInServer(int client) { SDKHook(client, SDKHook_WeaponDropPost, WeaponDropPost); } public Action WeaponDropPost(int client, int weapon) { if(weapon < 1 || !IsValidEdict(weapon)) return; SDKHook(weapon, SDKHook_StartTouch, StartTouch); } public Action StartTouch(int entity, int entity2) { if(!bEntTouch[entity] && entity2 == 0) { bEntTouch[entity] = true; CreateTimer(0.7, GetPos, entity, TIMER_FLAG_NO_MAPCHANGE); } } public Action GetPos(Handle timer, any entity) { float fEntPos[3]; GetEntPropVector(entity, Prop_Send, "m_vecOrigin", fEntPos); bEntTouch[entity] = false; // fEntPos то, что тебе нужно. }
Сообщения автоматически склеены:
Попробовал скомпилить и оказалось, что это палгин компилируется на ядре 3.0, а у меня вип ядро версии 2.1.3. Возможно под эту версию сделаю?
какие ошибки выводит компилятор ?