После добавления данной строки - сервер крашит (при подключении GOTV бота)for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i)) OnClientPutInServer(i);
Ребят, как эту строчку можно написать на старом синтаксе(sm 1.6)?
PHP:for(new i = 1; i != view_as<int>(LR_StatsType)-1; i++)
for(int i = 1; i != view_as<int>(LR_StatsType)-1; i++)
error 017: undefined symbol "view_as"PHP:for(int i = 1; i != view_as<int>(LR_StatsType)-1; i++)
Ребят, как эту строчку можно написать на старом синтаксе(sm 1.6)?
PHP:for(int i = 1; i != view_as<int>(LR_StatsType)-1; i++)
for (new i = 1; i != (_:LR_StatsType)-1; i++)
Мне нужно проверять если натив != NULLНичего. Ошибку будет возвращать.
Можно проверить существование натива.
Как проверять наличие загруженного плагина по его названию файла?
if (FindPluginByFile("vip/VIP_Core.smx") != null)
{
// плагин загружен
}
Никак.Если плагин (его и проверяем на наявность), который создаёт натив (но не регистрирует библиотеку RegPluginLibrary()), как проверять наявность этого плагина через OnLibraryAdded / OnLibraryRemoved?
Я Вам постом выше ссылку дал на что?Или есть другие способы проверить статус натива когда выгружается/загружается плагин?
if (GetFeatureStatus(FeatureType_Native, "VIP_IsClientVIP") == FeatureStatus_Available)
{
// натив доступен ==> плагин загружен
}
Уже решил проблему, добавив в каждый модуль свою библиотеку...C++:if (FindPluginByFile("vip/VIP_Core.smx") != null) { // плагин загружен }
Никак.
Я Вам постом выше ссылку дал на что?
C++:if (GetFeatureStatus(FeatureType_Native, "VIP_IsClientVIP") == FeatureStatus_Available) { // натив доступен ==> плагин загружен }
public void OnAllPluginsLoaded()
{
if(LibraryExists("FRS_Vip") || LibraryExists("FRS_VipFPS"))
g_NativeVip = !GetFeatureStatus(FeatureType_Native, "FRS_VIP_GetId");
if(LibraryExists("FRS_cust"))
g_NativeCust= !GetFeatureStatus(FeatureType_Native, "FRS_Cust_GetId");
if(LibraryExists("FRS_lr") || LibraryExists("FRS_lrKento") || LibraryExists("FRS_lrFPS") || LibraryExists("FRS_lrRankme"))
g_NativeLR = !GetFeatureStatus(FeatureType_Native, "FRS_LR_GetId");
if(LibraryExists("FRS_prime"))
g_NativeLR = !GetFeatureStatus(FeatureType_Native, "FRS_Prime_GetId");
if(LibraryExists("FRS_shop"))
g_NativeLR = !GetFeatureStatus(FeatureType_Native, "FRS_Shop_GetId");
}
public void OnLibraryAdded(const char[] name)
{
if(StrEqual(name, "FRS_Vip") || StrEqual(name, "FRS_VipFPS"))
g_NativeVip = true;
else if(StrEqual(name, "FRS_lr") || StrEqual(name, "FRS_lrKento") || StrEqual(name, "FRS_lrFPS") || StrEqual(name, "FRS_lrRankme"))
g_NativeLR = true;
else if(LibraryExists("FRS_prime"))
g_NativePrime = true;
else if(StrEqual(name, "FRS_cust"))
g_NativeCust = true;
else if(StrEqual(name, "FRS_shop"))
g_NativeShop = true;
}
public void OnLibraryRemoved(const char[] name)
{
if(StrEqual(name, "FRS_Vip") || StrEqual(name, "FRS_VipFPS"))
g_NativeVip = false;
else if(StrEqual(name, "FRS_lr") || StrEqual(name, "FRS_lrKento") || StrEqual(name, "FRS_lrFPS") || StrEqual(name, "FRS_lrRankme"))
g_NativeLR = false;
else if(LibraryExists("FRS_prime"))
g_NativePrime = false;
else if(StrEqual(name, "FRS_cust"))
g_NativeCust= false;
else if(StrEqual(name, "FRS_shop"))
g_NativeShop= false;
}
#pragma semicolon 1
#pragma newdecls required
#include <sdktools_functions>
#include <sdktools_entinput>
int iReplaces;
char sReplace[32];
public void OnPluginStart()
{
ConVar cvar;
(cvar = CreateConVar("sm_awp_replace", "weapon_ssg08", "The item that will replace the AWP. Leave blank if you want to disable the plugin", FCVAR_NOTIFY|FCVAR_PRINTABLEONLY)).AddChangeHook(CVarChanged);
CVarChanged(cvar, NULL_STRING, NULL_STRING);
AutoExecConfig(true, "awp_replace");
}
public void CVarChanged(ConVar cvar, const char[] oldValue, const char[] newValue)
{
cvar.GetString(sReplace, sizeof(sReplace));
TrimString(sReplace);
int num = FindCharInString(sReplace, ' ');
if(num > 8) sReplace[num] = 0;
else if(num != -1) sReplace[0] = 0;
}
public void OnMapStart()
{
char map[8];
GetCurrentMap(map, sizeof(map));
bool hooked;
if(hooked == !StrContains(map, "awp_", false)) return;
if((hooked = !hooked))
HookEvent("round_freeze_end", Event_FreezeEnd, EventHookMode_PostNoCopy);
else UnhookEvent("round_freeze_end", Event_FreezeEnd, EventHookMode_PostNoCopy);
}
public void Event_FreezeEnd(Event event, const char[] name, bool dontBroadcast)
{
if(!sReplace[0]) return;
iReplaces = 0;
int ent = MaxClients + 1, wpn;
float pos[3], ang[3];
while((ent = FindEntityByClassname(ent, "weapon_awp")) > MaxClients + 1)
{
if(IsHaveOwner(ent)) continue;
GetEntPropVector(ent, Prop_Send, "m_vecOrigin", pos);
GetEntPropVector(ent, Prop_Data, "m_angRotation", ang);
AcceptEntityInput(ent, "Kill");
if((wpn = CreateEntityByName(sReplace)) == -1) continue;
if(!DispatchSpawn(wpn)) continue;
TeleportEntity(wpn, pos, ang, NULL_VECTOR);
iReplaces++;
}
PrintToServer("\n%i entities 'weapon_awp' changed by '%s'\n", iReplaces, sReplace);
}
stock bool IsHaveOwner(int ent)
{
static int owner;
owner = GetEntPropEnt(ent, Prop_Data, "m_hOwnerEntity");
if(owner > MaxClients || owner < 1 || !IsClientInGame(owner)) return false;
RemovePlayerItem(owner, ent);
AcceptEntityInput(ent, "Kill");
if(GivePlayerItem(owner, sReplace) > MaxClients) iReplaces++;
return true;
}
Мне для указания таймеру время нужно, типо там деления основного времени происходит, и бывают числа с большим хвостом (0,0000000)Loco, тебе для вывода куда-то в виде текста?
Сообщения автоматически склеены:
Запрашивал StrAnn1k, но, пока я писал плагин, тему потёрли. Так что выложу здесь.
В начале раунда по завершению фризтайма заменяет все weapon_awp на твою энтити, которую ты пропишешь в квар sm_awp_replace (плагин автоматически создаёт файл конфига с именем awp_replace) на картах, имя которых начинается на awp_C-подобный:#pragma semicolon 1 #pragma newdecls required #include <sdktools_functions> #include <sdktools_entinput> int iReplaces; char sReplace[32]; public void OnPluginStart() { ConVar cvar; (cvar = CreateConVar("sm_awp_replace", "weapon_ssg08", "The item that will replace the AWP. Leave blank if you want to disable the plugin", FCVAR_NOTIFY|FCVAR_PRINTABLEONLY)).AddChangeHook(CVarChanged); CVarChanged(cvar, NULL_STRING, NULL_STRING); AutoExecConfig(true, "awp_replace"); } public void CVarChanged(ConVar cvar, const char[] oldValue, const char[] newValue) { cvar.GetString(sReplace, sizeof(sReplace)); TrimString(sReplace); int num = FindCharInString(sReplace, ' '); if(num > 8) sReplace[num] = 0; else if(num != -1) sReplace[0] = 0; } public void OnMapStart() { char map[8]; GetCurrentMap(map, sizeof(map)); bool hooked; if(hooked == !StrContains(map, "awp_", false)) return; if((hooked = !hooked)) HookEvent("round_freeze_end", Event_FreezeEnd, EventHookMode_PostNoCopy); else UnhookEvent("round_freeze_end", Event_FreezeEnd, EventHookMode_PostNoCopy); } public void Event_FreezeEnd(Event event, const char[] name, bool dontBroadcast) { if(!sReplace[0]) return; iReplaces = 0; int ent = MaxClients + 1, wpn; float pos[3], ang[3]; while((ent = FindEntityByClassname(ent, "weapon_awp")) > MaxClients + 1) { if(IsHaveOwner(ent)) continue; GetEntPropVector(ent, Prop_Send, "m_vecOrigin", pos); GetEntPropVector(ent, Prop_Data, "m_angRotation", ang); AcceptEntityInput(ent, "Kill"); if((wpn = CreateEntityByName(sReplace)) == -1) continue; if(!DispatchSpawn(wpn)) continue; TeleportEntity(wpn, pos, ang, NULL_VECTOR); iReplaces++; } PrintToServer("\n%i entities 'weapon_awp' changed by '%s'\n", iReplaces, sReplace); } stock bool IsHaveOwner(int ent) { static int owner; owner = GetEntPropEnt(ent, Prop_Data, "m_hOwnerEntity"); if(owner > MaxClients || owner < 1 || !IsClientInGame(owner)) return false; RemovePlayerItem(owner, ent); AcceptEntityInput(ent, "Kill"); if(GivePlayerItem(owner, sReplace) > MaxClients) iReplaces++; return true; }
По завершении замен плагин в консоль сервера сообщит о количестве удачных замен.
Если в кваре прописан несуществующий класс, то АВП просто удалятся, если имя класса для замены короче 8 символов, то плагин не будет удалять АВП