Если когда на Спаун заходишь и выдаёт определенное количество ХП, то не получится. Надо будет либо с помощью таймера, либо каких-нибудь отловов. Проще не париться с этим, либо выдать неуязвимость маньяку.Так, а если на карте по дефолту стоит не 100 хп а допустим 2017 то плагин должен изменять хп на заданное им количество?
Ок, тогда попробую с неуязвимостью.Если когда на Спаун заходишь и выдаёт определенное количество ХП, то не получится. Надо будет либо с помощью таймера, либо каких-нибудь отловов. Проще не париться с этим, либо выдать неуязвимость маньяку.
А можно сделать чтобы маньяк от ударов не стопился?Если когда на Спаун заходишь и выдаёт определенное количество ХП, то не получится. Надо будет либо с помощью таймера, либо каких-нибудь отловов. Проще не париться с этим, либо выдать неуязвимость маньяку.
А можно сделать чтобы маньяк от ударов стопился?
#include <sourcemod>
#include <sdkhooks>
public void OnPluginStart()
{
HookEvent("player_spawn", Event_Spawn);
HookEvent("round_end", Event_RoundEnd);
}
public void Event_Spawn(Event event, const char[] name, bool dontBroadcast)
{
int iClient = GetClientOfUserId(event.GetInt("userid"));
if(0 < iClient <= MaxClients && IsClientInGame(iClient) && GetClientTeam(iClient) == 2)
SDKHook(iClient, SDKHook_OnTakeDamage, Hook_OnTakeDamage);
}
public void Event_RoundEnd(Event event, const char[] name, bool dontBroadcast)
{
for(int i = 1; i <= MaxClients; ++i)
{
if(IsClientInGame(i) && GetClientTeam(i) == 2)
SDKUnhook(i, SDKHook_OnTakeDamage, Hook_OnTakeDamage);
}
}
public Action Hook_OnTakeDamage(iClient, &iAttacker, &inflictor, &Float:damage, &damagetype, &iWeapon, Float:damageForce[3], Float:damagePosition[3])
{
if(0 < iClient <= MaxClients && IsClientInGame(iClient) && 0 < iAttacker <= MaxClients && IsClientInGame(iAttacker))
{
damage = 0.0;
return Plugin_Changed;
}
}
SetEntProp(entity, Prop_Data, "m_takedamage", value, 1);, где value = 0 означает бессмертие, 2 = обычное получение урона. Данный параметр достаточно устанавливать каждый раз в начале раунда, т.к. он сбрасывается при смерти\начале раунда.public void OnPluginStart() HookEvent("player_spawn", Event_PlayerSpawn);
public void Event_PlayerSpawn(Event event, const char[] name, bool dontBroadcast) {
int client = GetClientOfUserId(event.GetInt("userid"));
if ( GetClientTeam(client) == 2 ) {
SetEntProp(client, Prop_Data, "m_takedamage", 0, 1);
}
}
Подтверждаю, вариант со сменой команды до конца раунда не предусмотрел...1) Для бессмертия игрока рекомендую использоватьSetEntProp(entity, Prop_Data, "m_takedamage", value, 1);, где value = 0 означает бессмертие, 2 = обычное получение урона. Данный параметр достаточно устанавливать каждый раз в начале раунда, т.к. он сбрасывается при смерти\начале раунда.
2) Чем "оптимальнее" код, тем больше потребуется писать кода. Идея с вкл\выкл хук для нужного игрока во-первых крайне спорная по производительности, во-вторых, игрок может выйти в спектраторы (сохранив свою неуязвимость на последующие раунды) либо администратор может сменить себе команду, так же сохранив свою неуязвимость. И это только один вариант как абузить текущую реализацию, не факт, что нет других. А вот в варианте с "хукнуть всех и проверять при каждом получении урона на соответствие требований" уже автоматически защищает от всех абузов при условии правильного составления требований.
Итого код плагина примерно такой:
C-подобный:public void OnPluginStart() HookEvent("player_spawn", Event_PlayerSpawn); public void Event_PlayerSpawn(Event event, const char[] name, bool dontBroadcast) { int client = GetClientOfUserId(event.GetInt("userid")); if ( GetClientTeam(client) == 2 ) { SetEntProp(client, Prop_Data, "m_takedamage", 0, 1); } }
Дабы не накосячить, исходный код должен выглядеть так?1) Для бессмертия игрока рекомендую использоватьSetEntProp(entity, Prop_Data, "m_takedamage", value, 1);, где value = 0 означает бессмертие, 2 = обычное получение урона. Данный параметр достаточно устанавливать каждый раз в начале раунда, т.к. он сбрасывается при смерти\начале раунда.
2) Чем "оптимальнее" код, тем больше потребуется писать кода. Идея с вкл\выкл хук для нужного игрока во-первых крайне спорная по производительности, во-вторых, игрок может выйти в спектраторы (сохранив свою неуязвимость на последующие раунды) либо администратор может сменить себе команду, так же сохранив свою неуязвимость. И это только один вариант как абузить текущую реализацию, не факт, что нет других. А вот в варианте с "хукнуть всех и проверять при каждом получении урона на соответствие требований" уже автоматически защищает от всех абузов при условии правильного составления требований.
Итого код плагина примерно такой:
C-подобный:public void OnPluginStart() HookEvent("player_spawn", Event_PlayerSpawn); public void Event_PlayerSpawn(Event event, const char[] name, bool dontBroadcast) { int client = GetClientOfUserId(event.GetInt("userid")); if ( GetClientTeam(client) == 2 ) { SetEntProp(client, Prop_Data, "m_takedamage", 0, 1); } }
Нет, прямо как кинул в том сообщении @Reiko1231Дабы не накосячить, исходный код должен выглядеть так?
#include <sourcemod>
#include <sdkhooks>
public void OnPluginStart()
{
HookEvent("player_spawn", Event_Spawn);
HookEvent("round_end", Event_RoundEnd);
}
public void Event_Spawn(Event event, const char[] name, bool dontBroadcast)
{
int iClient = GetClientOfUserId(event.GetInt("userid"));
if(0 < iClient <= MaxClients && IsClientInGame(iClient) && GetClientTeam(iClient) == 2)
SDKHook(iClient, SDKHook_TraceAttack, Hook_TraceAttack);
}
public void OnPluginStart() HookEvent("player_spawn", Event_PlayerSpawn);
public void Event_PlayerSpawn(Event event, const char[] name, bool dontBroadcast) {
int client = GetClientOfUserId(event.GetInt("userid"));
if ( GetClientTeam(client) == 2 ) {
SetEntProp(client, Prop_Data, "m_takedamage", 0, 1);
}
}
public void OnPluginStart() HookEvent("player_spawn", Event_PlayerSpawn);
public void Event_PlayerSpawn(Event event, const char[] name, bool dontBroadcast) {
int client = GetClientOfUserId(event.GetInt("userid"));
if ( GetClientTeam(client) == 2 ) {
SetEntProp(client, Prop_Data, "m_takedamage", 0, 1);
}
}
Ошибочка...Нет, прямо как кинул в том сообщении @Reiko1231
Всё полностью замени на это и попробуй, как оно будет работать
Попробуй-ка так. Раскидал по строкам для удобства чтения.Ошибочка...
Посмотреть вложение 55633
public void OnPluginStart()
{
HookEvent("player_spawn", Event_PlayerSpawn);
}
public void Event_PlayerSpawn(Event event, const char[] name, bool dontBroadcast)
{
int iClient = GetClientOfUserId(event.GetInt("userid"));
if(GetClientTeam(iClient) == 2)
{
SetEntProp(iClient, Prop_Data, "m_takedamage", 0, 1);
}
}
Сработало, отвечу завтра, работает или нетПопробуй-ка так. Раскидал по строкам для удобства чтения.
У меня скомпилировалось нормально
Sourcepawn:public void OnPluginStart() { HookEvent("player_spawn", Event_PlayerSpawn); } public void Event_PlayerSpawn(Event event, const char[] name, bool dontBroadcast) { int iClient = GetClientOfUserId(event.GetInt("userid")); if(GetClientTeam(iClient) == 2) { SetEntProp(iClient, Prop_Data, "m_takedamage", 0, 1); } }
Нет, игрок полностью перестаёт воспринимать урон. Тут скорее может даже другая проблема возникнуть (не столь важная для данного типа сервера) - патроны будут пролетать насквозь игрока, в отличие от гранат. Но я это не проверял, просто по моим ощущениям патроны пролетали насквозь.А при таком бессмертии игрока замедляет при потенциальном уроне, например от ножа?
SetEntProp(client, Prop_Data, "m_flVelocityModifier", value, true);, где value - вещественное число. При 1.0 игрок не теряет скорости, 0.5 - игрок потеряет половины скорости, 0.0 - полностью остановит игрока, -1.0 (минус один) - ускорит на 100% игрока и так далее.У него режим hide and seek и у него нет оружий по типу ak47 | awp и т.д. а только knife.Нет, игрок полностью перестаёт воспринимать урон. Тут скорее может даже другая проблема возникнуть (не столь важная для данного типа сервера) - патроны будут пролетать насквозь игрока, в отличие от гранат. Но я это не проверял, просто по моим ощущениям патроны пролетали насквозь.
А для случаев с замедлением игроков от урона в момент получения игроком урона (событие player_hurt, возможно можно и сразу в SDKHook_OnTakeDamage и подобным) можно (если я не ошибся с именем пропа) устанавливать значениеSetEntProp(client, Prop_Data, "m_flVelocityModifier", value, true);, где value - вещественное число. При 1.0 игрок не теряет скорости, 0.5 - игрок потеряет половины скорости, 0.0 - полностью остановит игрока, -1.0 (минус один) - ускорит на 100% игрока и так далее.
Ну и отлично, а что насчёт замедления? При ударе ножом замедляет?Плагин вроде стабильно работает, случаев с бессмертием кт и тд не возникало.