Как установить стартовое значение хп?

RusJJ

Доброе утро девачьки
Сообщения
2,582
Реакции
1,076
Ты умняша, а он няша

1586513094244.png
Оффтоп
 

Ammy

Участник
Сообщения
81
Реакции
16
Так, а если на карте по дефолту стоит не 100 хп а допустим 2017 то плагин должен изменять хп на заданное им количество?
public void OnPluginStart()
{
HookEvent("player_spawn", Event_Spawn);
}

public Action Event_Spawn(Event event, const char[] name, bool dontBroadcast)
{
int client = GetClientOfUserId(event.GetInt("userid"));
if(client && GetClientTeam(client) == 2) SetEntProp(client, Prop_Send, "m_iHealth", 10000);
}
 

RusJJ

Доброе утро девачьки
Сообщения
2,582
Реакции
1,076
Так, а если на карте по дефолту стоит не 100 хп а допустим 2017 то плагин должен изменять хп на заданное им количество?
Если когда на Спаун заходишь и выдаёт определенное количество ХП, то не получится. Надо будет либо с помощью таймера, либо каких-нибудь отловов. Проще не париться с этим, либо выдать неуязвимость маньяку.
 

Ammy

Участник
Сообщения
81
Реакции
16
Если когда на Спаун заходишь и выдаёт определенное количество ХП, то не получится. Надо будет либо с помощью таймера, либо каких-нибудь отловов. Проще не париться с этим, либо выдать неуязвимость маньяку.
Ок, тогда попробую с неуязвимостью.
Сообщения автоматически склеены:

Если когда на Спаун заходишь и выдаёт определенное количество ХП, то не получится. Надо будет либо с помощью таймера, либо каких-нибудь отловов. Проще не париться с этим, либо выдать неуязвимость маньяку.
А можно сделать чтобы маньяк от ударов не стопился?
Дабы от грены он стопился а от ножа нет, хотелось бы чтобы у игроков был шанс убежать застопив маньяка ножом.
 
Последнее редактирование:

Svyatoy

Участник
Сообщения
335
Реакции
137
А можно сделать чтобы маньяк от ударов стопился?

Попробуй так, должно сработать.
P.S. На компилируемость не проверял, но всё должно быть ок

Sourcepawn:
#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;
    }
}
 

Ammy

Участник
Сообщения
81
Реакции
16
Возникла проблема, кт игроки тоже становятся бессмертными при спавне, как можно решить?
Проблема возникает раз в пару часов.
#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 Event_RoundEnd(Event event, const char[] name, bool dontBroadcast)
{
for(int i = 1; i <= MaxClients; ++i)
{
if(i > 0 && i <= MaxClients && IsClientInGame(i) && GetClientTeam(i) == 2)
SDKUnhook(i, SDKHook_TraceAttack, Hook_TraceAttack);
}
}

public Action Hook_TraceAttack(iClient, &iAttacker, &iInflictor, &Float:damage, &damagetype, int &ammotype, int hitbox, int hitgroup)
{
return Plugin_Handled;
}
 

bigboi300

Не удаляю копирайты
Сообщения
153
Реакции
28
Оффтоп
 

Reiko1231

AlexTheRegent
Сообщения
508
Реакции
1,336
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);
    }
}
 

Svyatoy

Участник
Сообщения
335
Реакции
137
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);
    }
}
Подтверждаю, вариант со сменой команды до конца раунда не предусмотрел...
Да и о таком варианте установки бессмертия не знал...
А при таком бессмертии игрока замедляет при потенциальном уроне, например от ножа?

Приятно иметь дело со знающими людьми, умеющими обосновывать утверждение!
 
  • Мне нравится
Реакции: Ammy

Ammy

Участник
Сообщения
81
Реакции
16
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);
    }
}
Дабы не накосячить, исходный код должен выглядеть так?
#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);
}
}
 

Svyatoy

Участник
Сообщения
335
Реакции
137
Дабы не накосячить, исходный код должен выглядеть так?
#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);
}
}
Нет, прямо как кинул в том сообщении @Reiko1231

Всё полностью замени на это и попробуй, как оно будет работать

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);
}
}
 

Svyatoy

Участник
Сообщения
335
Реакции
137
Попробуй-ка так. Раскидал по строкам для удобства чтения.
У меня скомпилировалось нормально

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);
    }
}
 

Ammy

Участник
Сообщения
81
Реакции
16
Попробуй-ка так. Раскидал по строкам для удобства чтения.
У меня скомпилировалось нормально

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);
    }
}
Сработало, отвечу завтра, работает или нет
 

Reiko1231

AlexTheRegent
Сообщения
508
Реакции
1,336
А при таком бессмертии игрока замедляет при потенциальном уроне, например от ножа?
Нет, игрок полностью перестаёт воспринимать урон. Тут скорее может даже другая проблема возникнуть (не столь важная для данного типа сервера) - патроны будут пролетать насквозь игрока, в отличие от гранат. Но я это не проверял, просто по моим ощущениям патроны пролетали насквозь.
А для случаев с замедлением игроков от урона в момент получения игроком урона (событие player_hurt, возможно можно и сразу в SDKHook_OnTakeDamage и подобным) можно (если я не ошибся с именем пропа) устанавливать значение SetEntProp(client, Prop_Data, "m_flVelocityModifier", value, true);, где value - вещественное число. При 1.0 игрок не теряет скорости, 0.5 - игрок потеряет половины скорости, 0.0 - полностью остановит игрока, -1.0 (минус один) - ускорит на 100% игрока и так далее.
 

🟡differend🟢

Что хочу - то и делаю
Сообщения
975
Реакции
661
Нет, игрок полностью перестаёт воспринимать урон. Тут скорее может даже другая проблема возникнуть (не столь важная для данного типа сервера) - патроны будут пролетать насквозь игрока, в отличие от гранат. Но я это не проверял, просто по моим ощущениям патроны пролетали насквозь.
А для случаев с замедлением игроков от урона в момент получения игроком урона (событие player_hurt, возможно можно и сразу в SDKHook_OnTakeDamage и подобным) можно (если я не ошибся с именем пропа) устанавливать значение SetEntProp(client, Prop_Data, "m_flVelocityModifier", value, true);, где value - вещественное число. При 1.0 игрок не теряет скорости, 0.5 - игрок потеряет половины скорости, 0.0 - полностью остановит игрока, -1.0 (минус один) - ускорит на 100% игрока и так далее.
У него режим hide and seek и у него нет оружий по типу ak47 | awp и т.д. а только knife.
 

Ammy

Участник
Сообщения
81
Реакции
16
Плагин вроде стабильно работает, случаев с бессмертием кт и тд не возникало.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,606
Реакции
5,096
а не проще ли при спавне у спецов вообще всё оружие забирать, даже нож?
 
Сверху Снизу