Block fade kill

Сообщения
73
Рейтинг
34
В одном из обновлений кс го добавили фейд при смерти игрока и только при серверном значении mp_forcecamera 1, хотелось бы увидеть предложение по удалению фейда без костылей приведенных ниже
C++:
#pragma semicolon 1
#pragma newdecls required

#include <sourcemod>
#include <dhooks>
#include <sdktools>

#define IsValidClient(%0) (1 <= %0 <= MaxClients && IsClientInGame(%0) && !IsFakeClient(%0))
#define HIDE_RADAR_CSGO 1<<12

Handle hIsValidTarget;
Handle mp_forcecamera;
Handle mp_teamcashawards;
Handle mp_playercashawards;

bool Warmup_time;
bool g_bCheckNullPtr = false;

ConVar g_Cvar_HideTime = null;

public Plugin myinfo = {
    name         = "Admin all spec",
    author         = "Dr!fter",
    description = "Allows admin to spec all players",
    version     = "1.0.4",
    url         = "http://www.sourcemod.net"
};

public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) {
    MarkNativeAsOptional("DHookIsNullParam");
    return APLRes_Success;
}

public void OnPluginStart() {
    mp_forcecamera = FindConVar("mp_forcecamera");
    mp_teamcashawards = FindConVar("mp_teamcashawards");
    mp_playercashawards = FindConVar("mp_playercashawards");
   
    Handle temp = LoadGameConfigFile("allow-spec.games");
    if(!temp)
        SetFailState("Failed to load allow-spec.games.txt");
    int offset = GameConfGetOffset(temp, "IsValidObserverTarget");
    hIsValidTarget = DHookCreate(offset, HookType_Entity, ReturnType_Bool, ThisPointer_CBaseEntity, IsValidTarget);
    DHookAddParam(hIsValidTarget, HookParamType_CBaseEntity);
    CloseHandle(temp);
   
    g_bCheckNullPtr = (GetFeatureStatus(FeatureType_Native, "DHookIsNullParam") == FeatureStatus_Available);
    HookEvent("player_death",Event_PlayerDeath, EventHookMode_Pre);
    HookEvent("player_spawn", Event_PlayerSpawn, EventHookMode_PostNoCopy);
    HookEvent("player_team", Event_PlayerTeam, EventHookMode_Pre);
    g_Cvar_HideTime = CreateConVar("sm_allspec_hide_time", "4.2", "Hide time", 0, true, 0.0);  
    AutoExecConfig(true, "admin-allspec");
}

public void OnClientPostAdminCheck(int client) {
    if(IsValidClient(client))
        if(IsPlayerReservationAdmin(client))
            DHookEntity(hIsValidTarget, true, client);
}

public MRESReturn IsValidTarget(int thisPointer, Handle hReturn, Handle hParams) {
    if (g_bCheckNullPtr && DHookIsNullParam(hParams, 1))
        return MRES_Ignored;
   
    int target = DHookGetParam(hParams, 1);
    if(target <= 0 || target > MaxClients || !IsClientInGame(thisPointer) || !IsClientInGame(target) || !IsPlayerAlive(target) || IsPlayerAlive(thisPointer) || GetClientTeam(thisPointer) <= 1 || GetClientTeam(target) <= 1)
        return MRES_Ignored;

    DHookSetReturn(hReturn, true);
    return MRES_Override;
}

public void Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast) {
    int client = GetClientOfUserId(GetEventInt(event, "userid"));
    if(IsValidClient(client)) {
        SendConVarValue(client, mp_forcecamera, "0"); // Видно для всех
        if (!IsPlayerReservationAdmin(client) && !Warmup_time) {
            SendConVarValue(client, mp_teamcashawards, "0"); // Удаляем бабки
            SendConVarValue(client, mp_playercashawards, "0"); // Удаляем бабки
            SetEntProp(client, Prop_Send, "m_iHideHUD", GetEntProp(client, Prop_Send, "m_iHideHUD") | HIDE_RADAR_CSGO);    // Удаляем Радар
            CreateTimer(g_Cvar_HideTime.FloatValue, Timer_FadeOff, client, TIMER_FLAG_NO_MAPCHANGE);
        }
    }
}
public Action Timer_FadeOff(Handle timer, any client) {
    if(IsValidClient(client)) {
        SendConVarValue(client, mp_forcecamera, "1"); // Ставим Стандарт
        SendConVarValue(client, mp_teamcashawards, "1"); // Показываем бабки
        SendConVarValue(client, mp_playercashawards, "1"); // Показываем бабки
        SetEntProp(client, Prop_Send, "m_iHideHUD", GetEntProp(client, Prop_Send, "m_iHideHUD") & ~HIDE_RADAR_CSGO); // Показываем Радар
    }
    return Plugin_Stop;
}
public void Event_PlayerSpawn(Event event, const char[] name, bool dontBroadcast) {
    Warmup_time = view_as<bool>(GameRules_GetProp("m_bWarmupPeriod"));
    int client = GetClientOfUserId(GetEventInt(event, "userid"));
    if(IsValidClient(client) && !Warmup_time) {
        SendConVarValue(client, mp_forcecamera, "0"); // Видно для всех (Фикс черного экрана)
        CreateTimer(0.1, ChangeCameraTimer, client, TIMER_FLAG_NO_MAPCHANGE);      
    }
}
public Action ChangeCameraTimer(Handle timer, any client) {
    if(IsValidClient(client)) {
        SendConVarValue(client, mp_teamcashawards, "1"); // Показываем бабки
        SendConVarValue(client, mp_playercashawards, "1"); // Показываем бабки
        SetEntProp(client, Prop_Send, "m_iHideHUD", GetEntProp(client, Prop_Send, "m_iHideHUD") & ~HIDE_RADAR_CSGO); // Показываем Радар
    }
}
public void Event_PlayerTeam(Event event, const char[] name, bool dontBroadcast) {
    int client = GetClientOfUserId(GetEventInt(event, "userid"));
    if (IsValidClient(client) && !Warmup_time) {
        if (!IsPlayerReservationAdmin(client))
            SendConVarValue(client, mp_forcecamera, "1"); // Ставим Стандарт (Если не админ)
        SendConVarValue(client, mp_teamcashawards, "1"); // Показываем бабки
        SendConVarValue(client, mp_playercashawards, "1"); // Показываем бабки
        SetEntProp(client, Prop_Send, "m_iHideHUD", GetEntProp(client, Prop_Send, "m_iHideHUD") & ~HIDE_RADAR_CSGO); // Показываем Радар
    }
}
stock bool IsPlayerReservationAdmin(int client) {
    if (CheckCommandAccess(client, "admin_allspec_flag", ADMFLAG_BAN, false))
        return true;
    return false;
}

Сразу говорю фейд не стандартный его не закрыть обычным ивентом фейда и тд
Скрывать игроков с радара юзая m_bPlayerSpotted тож зашквар
 
Последнее редактирование:
Сообщения
73
Рейтинг
34
SAZONISCHE, наверняка этот файл отсылается точно так же мессага клиенту (или эвентом), есть возможность блока у вас?
Все 100% происходит на стороне клиента (если менять на живую SendConVarValue(client, mp_forcecamera, "0"); то фейд будет применяться и отменяться)
Нерабочие варианты:
1вый
C++:
Handle mp_radar_showall = FindConVar("mp_radar_showall");

SendConVarValue(client, mp_radar_showall, (GetClientTeam(client) == 2) ? "2" : "3");
2ой
C++:
    "csgo"
    {
        "Offsets"
        {
            "ShouldFadeOnDeath"
            {
                "windows"        "373"
                "linux"            "374"
            }
        }
    }
3ий
изменение m_iTeamNum тож не катит)
 
Последнее редактирование:
Сообщения
296
Рейтинг
307
Ну пошли свой фейд в смерти, который перекроет клиентский.
 
Сообщения
73
Рейтинг
34
fl0wer, но не работает, фейд то не сложно сделать, надо было тогда датампс и нетпропы снять
14 Дек 2018
wopox1337, Евент можно блочить, может реал и в евент что добавили, по сей день не понятно на чьей стороне все происходит
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу