Уже обще нету идей как убрать эту заддержку... только костыли делаю к этой заддержке и всё...как бы MaxClients - константа
и смысла разбивать 1 цикл на несколько смысла нет: это только увеличит нагрузку и время выполнения
кстати плагин не правильно почему то работает он на awp_lego_2 выдает скаут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 символов, то плагин не будет удалять АВП
Какому такому тегу?а должен выдавать только по тегу scout
scout_ я не знаю как оно правильно называетсяКакому такому тегу?
Спасибо буду знать теперьЭто называется "префикс карты".
GetClientCount · clients · SourceMod Scripting API Reference, думаю, намек ясен.Как сделать цикл на тех игроков, которые щас на сервере, а не с 1 до MaxClients и после отсеивать их через if().
думаю, намек ясен.
static cell_t sm_GetClientCount(IPluginContext *pCtx, const cell_t *params)
{
if (params[1])
{
return playerhelpers->GetNumPlayers();
}
int maxplayers = playerhelpers->GetMaxClients();
int count = 0;
for (int i = 1; i <= maxplayers; ++i)
{
IGamePlayer *pPlayer = playerhelpers->GetGamePlayer(i);
if ((pPlayer->IsConnected()) && !(pPlayer->IsInGame()))
{
count++;
}
}
return (playerhelpers->GetNumPlayers() + count);
}
Думаешь сильно на этом сэкономить?
Сомневаюсь, что овчинка выделки стоит
После авторизации игрока записываешь его в динамический массив, после выхода - удаляешь его из массива, а цикл делаешь по массиву
#include <sourcemod>
ArrayList hArray;
public void OnPluginStart()
{
hArray = new ArrayList(ByteCountToCells(64));
HookEvent("round_start", RStart)
}
public void RStart(Event event, const char[] name, bool dontBroadcast)
{
for(int i = 0; i <= hArray.Length; i++)
PrintToChat(i, "Hello");
}
public void OnClientPostAdminCheck(int client)
{
hArray.Push(client);
}
public void OnClientDisconnect(int client)
{
hArray.Erase(client);
}
Ага, интересно что будет с игроком с 20 Auch идом, и всего 10 игроков на сервере, его цикл даже не заденет.
Кто может сделать в этом плагине когда нажимаешь на провод на красный то в чате пишет вы выбрали красный провод то слово должно быт красным если синий выбрали значить в переводе должен синий цвет и т.д
Прошу прошения) про раздел ваше не знал,по этому и написал сюда.Посмотреть вложение 45032Вы лучше всё же напишите здесь ТЗ. Кто сможет - оценит и сам Вам напишет.
Ну и для этого вообще раздел есть:
Если ксго - попробуй его.Прошу прошения) про раздел ваше не знал,по этому и написал сюда.
Суть плагина в том,что его нужно переделать,ну или пофиксить нормально,чтоб он работал на 100 процентов,а не как эти все,которые есть тут на сайте,или же который есть в на самой майарене.
Они все работают не стабильно,то есть ограничения работает не так как надо,может ограничить через 5 раундов,когда игроков всего 5-4,хотя авп и выкидывают,а покупать серавно можно.
Ну вот как то так)
У парня стоит weapon_restrict,он его сам переделывал,у него работает он стабильно,без каких либо косяков.
Ну он его не хочет продавать)
Вот мне нужно подобный ему,ну тут надо смотреть самому заходить на сервер,и смотреть работу этого плагина,там все будет понятно сразу,кто в этом шарит)
Нужно переделать его так же,как у этого паренька на серваке)
То-есть сменить флаг нужно,так как стоит там по стандарту(а) если я не ошибаюсь,сделать чтоб в чате показывало,когда ограничилось оружия,на сколько оно ограничилось,ну и чтоб работал он нормально,а не как эти все)ну тут надо самому смотреть на серваке где он стоит,который я хочу,либо подобный ему)
Спасибо за внимания,сильно не ругайте) если что то не так написал)
Всем добра