tolstomorda
Участник
- Сообщения
- 6
- Реакции
- 0
Друзья, добрый день!
К сожалению, не нашёл подходящего плагина со следующим функционалом: террористы, находящиеся на своём респауне имеют некоторое время, чтобы его покинуть. О чем им будут приходить уведомления в чат. По истечению времени они не смогут наносить урон, пока не покинут обозначенную зону.
Не найдя подходящего решения, для общего понимания я просмотрел уроки от Riko (за что ему большое спасибо), а также воспользовался уже двумя существующими темами (тема 1 и тема 2 ) и существующим плагином (Map Zone).
В результате появился мой плагин-франкенштейн, являющийся дополнением к Map Zone.
К сожалению, плагин не реагирует, когда террорист находится внутри зоны, реагирует только тогда, когда он эту зону покидает.
Прошу вашей помощи в оптимизации кода, до которой мне как до луны. Укажите на ошибки, куда копать, где почитать. Как снизить нагрузку на сервер.
Я уверен, что в плагине много всего лишнего и некорректного. Понимаю, что плагин всего на 100 строк, но и этого с моим уровнем знаний слишком много.
Спасибо всем, кто поможет.
К сожалению, не нашёл подходящего плагина со следующим функционалом: террористы, находящиеся на своём респауне имеют некоторое время, чтобы его покинуть. О чем им будут приходить уведомления в чат. По истечению времени они не смогут наносить урон, пока не покинут обозначенную зону.
Не найдя подходящего решения, для общего понимания я просмотрел уроки от Riko (за что ему большое спасибо), а также воспользовался уже двумя существующими темами (тема 1 и тема 2 ) и существующим плагином (Map Zone).
В результате появился мой плагин-франкенштейн, являющийся дополнением к Map Zone.
К сожалению, плагин не реагирует, когда террорист находится внутри зоны, реагирует только тогда, когда он эту зону покидает.
Прошу вашей помощи в оптимизации кода, до которой мне как до луны. Укажите на ошибки, куда копать, где почитать. Как снизить нагрузку на сервер.
Я уверен, что в плагине много всего лишнего и некорректного. Понимаю, что плагин всего на 100 строк, но и этого с моим уровнем знаний слишком много.
Спасибо всем, кто поможет.
PHP:
#include <sdktools>
#include <sdkhooks>
#include <sourcemod>
#include <cstrike>
#include <colors>
#define VALUE 0
public Plugin:myinfo =
{
name = "Respanw zone",
author = "tolstomorda",
description = "Запрет урона в myzone",
version = "1.0",
url = "https://csgo.su/dd2only"
}
public OnPluginStart()
{
HookEventEx("round_start", OnRoundStart, EventHookMode_PostNoCopy);
}
public OnRoundStart(Handle:event, const String:name[], bool:dontBroadcast)
{
// Активируем нашу зону в начале раунда
ServerCommand("sm_actzone myzone");
}
public Action:OnEnteredProtectedZone(zone, client, const String:prefix[])
{
// Не забывайте что наказание в Map Zone должно быть "нестандартным"
static Handle:ShowZones = INVALID_HANDLE;
if (!ShowZones) ShowZones = FindConVar("sm_zones_show_messages");
if (GetClientTeam(client) == CS_TEAM_T)
{
if (1 <= client <= MaxClients)
{
decl String:m_iName[MAX_NAME_LENGTH*2];
GetEntPropString(zone, Prop_Data, "m_iName", m_iName, sizeof(m_iName));
// Когда игрок заходит в нашу зону
if (StrEqual(m_iName[8], "myzone", false))
{
// Запретим стрельбу, если игрок находится внутри зоны больше положенного времени
CreateTimer(1.0, Timer_ActivateMyZone, client, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
}
}
}
}
public Action:Timer_ActivateMyZone(Handle:timer, client)
{
// Т.к. таймер повторяется каждую секунду, создадим счетчик
static TimesRepeated = 0;
switch (++TimesRepeated)
{
case 10, 20, 30: // Каждые 10 секунд...
{
// ... через сколько секунд перестанет наноситься урон
PrintToChat(client, "%s Террористы не будут наносить урон, находясь на респауне, через %i сек!", 40 - TimesRepeated);
}
case 40: // После 40 секунд отключим нанесение урона
{
// Обнулим счетчик таймера
TimesRepeated = 0;
SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage);
PrintToChat(client, "%s Вы не можете наносить урон противникам, пока находитесь в этой зоне!")
// Остановим повторяющийся таймер
return Plugin_Stop;
}
}
return Plugin_Continue;
}
public Action:OnLeftProtectedZone(zone, client, const String:prefix[])
{
static Handle:ShowZones = INVALID_HANDLE;
if (!ShowZones) ShowZones = FindConVar("sm_zones_show_messages");
if (1 <= client <= MaxClients)
{
decl String:m_iName[MAX_NAME_LENGTH*2];
GetEntPropString(zone, Prop_Data, "m_iName", m_iName, sizeof(m_iName));
if (StrEqual(m_iName[8], "myzone", false))
{
// Разрешим нанесение урона
SDKUnhook(client, SDKHook_OnTakeDamage, OnTakeDamage);
if (GetConVarBool(ShowZones) && IsPlayerAlive(client))
{
PrintToChat(client, "%s Вы снова можете наносить урон противникам!", prefix);
}
}
}
}
public Action:OnTakeDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
{
if (attacker)
{
damage *= VALUE;
return Plugin_Changed;
}
return Plugin_Continue;
}