Ent не меняет цвета

Nekro

Терра инкогнита
Сообщения
1,889
Реакции
683
Сфера света никак не хочет менять цвет с красного, в какие то миллисекунды вроде бывает меняет оттенок и иногда даже виден зелёный цвет, но в целом красный или около того, а должен быть рандомный цвет (строка 123). Может кто подскажет?
(в коде есть лишние проверки, но без них не работает как надо)
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <vip_core>
#include <sdktools_functions>
#include <sdktools_entinput>
#include <sdktools_variant_t>

public Plugin myinfo =
{
    name = "[ViP Core] Skin Color",
    author = "Nek.'a 2x2 | ggwp.site ",
    version = "1.0",
    url = "https://ggwp.site/"
};

static const char g_sFeature[] = "skin_color";

bool
    bEnable;

Handle
    hTimer[MAXPLAYERS+1],
    hTimerKill[MAXPLAYERS+1];

int
    clr[MAXPLAYERS+1][4],
    iEnt[MAXPLAYERS+1];

float
    fTime;

public void OnPluginStart()
{
    ConVar cvar;
    cvar = CreateConVar("sm_skincolor_enable", "1", "Включить/выключить плагин", _, true, _, true, 1.0);
    cvar.AddChangeHook(CVarChanged_Enable);
    bEnable = cvar.BoolValue;

    cvar = CreateConVar("sm_skincolor_time", "0.3", "Время (в секундах) обновления цветовой гаммы", _, true, 0.01, true, 70.0);
    cvar.AddChangeHook(CVarChanged_Time);
    fTime = cvar.FloatValue;

    HookEvent("player_spawn", Event_PlayerSpawn);

    AutoExecConfig(true, "skin_color", "vip");

    if(VIP_IsVIPLoaded()) VIP_OnVIPLoaded();
}

public void CVarChanged_Enable(ConVar cvar, const char[] oldValue, const char[] newValue)
{
    bEnable    = cvar.BoolValue;
}

public void CVarChanged_Time(ConVar cvar, const char[] oldVal, const char[] newValue)
{
    fTime = cvar.FloatValue;
}

public void OnPluginEnd()
{
    if(CanTestFeatures() && GetFeatureStatus(FeatureType_Native, "VIP_UnregisterFeature") == FeatureStatus_Available)
        VIP_UnregisterFeature(g_sFeature);
}

public void OnClientDisconnect(int client)
{
    if(hTimer[client]) delete hTimer[client];
}

public void VIP_OnVIPLoaded()
{
    VIP_RegisterFeature(g_sFeature, BOOL);
}

public void OnMapStart()
{
    PrecacheModel("sprites/redglow1.vmt");
}

public void Event_PlayerSpawn(Event event, const char[] name, bool dontBroadcast)
{
    if(!bEnable)
        return;

    static int client;

    if(!(client = GetClientOfUserId(GetEventInt(event, "userid"))) || !IsClientInGame(client)
    || !VIP_IsClientVIP(client) || !VIP_IsClientFeatureUse(client, g_sFeature))
        return;

    if(VIP_IsClientFeatureUse(client, g_sFeature))
    {
        if(hTimer[client]) delete hTimer[client];
        hTimer[client] = CreateTimer(fTime, Color_Timer, GetClientUserId(client), TIMER_REPEAT);
        if(VIP_IsClientFeatureUse(client, g_sFeature)) PrintToChat(client, "ViP Функция активна !");
        if(!VIP_IsClientFeatureUse(client, g_sFeature)) PrintToChat(client, "ViP Функция отключена !");
        PrintToChatAll("1111111111");
    }

}

public Action Color_Timer(Handle timer, any client)
{
    if(!(client = GetClientOfUserId(client)) || !IsPlayerAlive(client) || !hTimer[client] || !VIP_IsClientFeatureUse(client, g_sFeature))
        return;

    if(VIP_IsClientFeatureUse(client, g_sFeature))
    {
        clr[client][0] = GetRandomInt(1, 255);
        clr[client][1] = GetRandomInt(1, 255);
        clr[client][2] = GetRandomInt(1, 255);

        SetEntityRenderMode(client, RENDER_TRANSCOLOR);
        SetEntityRenderColor(client, clr[client][0], clr[client][1], clr[client][2]);
 
        iEnt[client] = CreateEntityByName("env_glow");
        if(iEnt[client] == -1)
            return;
 
        char sColor[32];
        FormatEx(sColor, sizeof(sColor), "%i %i %i", GetRandomInt(1, 255), GetRandomInt(1, 255), GetRandomInt(1, 255));
        DispatchKeyValue(iEnt[client], "model", "sprites/redglow1.vmt");
        DispatchKeyValue(iEnt[client], "rendermode", "3");
        DispatchKeyValue(iEnt[client], "scale", "1.0");
        DispatchKeyValue(iEnt[client], "renderamt", "255");
        DispatchKeyValue(iEnt[client], "rendercolor", sColor);
        DispatchSpawn(iEnt[client]);
 
        float fVec[3];
        GetClientAbsOrigin(client, fVec);
        //PrintToChatAll("Игрок [%N], с вектором [%.2f][%.2f][%.2f]", client, fVec[0], fVec[1], fVec[2]);
        TeleportEntity(iEnt[client], fVec, NULL_VECTOR, NULL_VECTOR);
        hTimerKill[client] = CreateTimer(fTime - 0.1, Timer_KillEnt, GetClientUserId(client));
        //PrintToChatAll("Игрок [%N], Цвет сущности [%s]", client, sColor);
        //PrintToChatAll("Создана сущность с индексом [%d] | Игрока [%N]", iEnt[client], client);
    }
    else
        hTimerKill[client] = CreateTimer(fTime - 0.1, Timer_KillEnt, GetClientUserId(client));
}

public Action Timer_KillEnt(Handle timer, any userid)
{
    Kill_Entity(GetClientOfUserId(userid));
}

stock void Kill_Entity(int client, const bool bTimer = false)
{
    if(iEnt[client] && IsValidEntity(iEnt[client]))
    {
        AcceptEntityInput(iEnt[client], "Kill");
        //PrintToChatAll("Сущность с индексом [%d] | Игрока [%N] уничтожена !", iEnt[client], client);
    }

    hTimerKill[client] = INVALID_HANDLE;
    if(bTimer) hTimerKill[client] = null;
    if(hTimerKill[client]) delete hTimerKill[client];

}

И на 156 строке пришлось добавить hTimerKill[client] = INVALID_HANDLE (разве с hTimerKill[client] = null не одно и тоже?), иначе сыпало
C-подобный:
L 05/04/2021 - 19:22:20: [SM] Plugin "vip/skins_color.smx" encountered error 23: Native detected error
L 05/04/2021 - 19:22:20: [SM] Invalid timer handle 1089019b (error 3) during timer end, displayed function is timer callback, not the stack trace
L 05/04/2021 - 19:22:20: [SM] Unable to call function "Timer_KillEnt" due to above error(s).

Решение: смена спрайта на sprites/glow.vmt

 

Вложения

  • skins_color.sp
    4.8 КБ · Просмотры: 1
Последнее редактирование:

Reg1oxeN

Участник
Сообщения
304
Реакции
212
1620157042039.png
ты только посмотри на этот sprites/redglow1.vmt
 

tonline_kms65_1

Участник
Сообщения
446
Реакции
175
ты только посмотри на этот sprites/redglow1.vmt
Согласен.
1 - Каким образом, интересно, можно покрасить спрайт красного цвета в красный, или зеленый(синий) цвет?
Для начала нужен спрайт белого цвета, потом уже можно и покрасить его.
А после, нужно без таймера попробовать как отрабатывается изменение цвета, и когда всё будет работать уверенно - тогда можно мутить с таймером.
2 - не пойму, зачем нужно убивать и снова создавать спрайт? Что-бы не спамил в консоль - просто меняй цвет в таймере, при помощи отправки клиентам, через SetEntPropEnt(ent, Prop_Send.....
Или уже, на крайний случай, отключай и включай его когда нужно.

Вообще, мягко говоря, очень странный код.
C-подобный:
CreateConVar("sm_skincolor_time", "0.3", "Время (в секундах) обновления цветовой гаммы", _, true, 0.01, true, 70.0);
Как таймер будет отрабатывать с такой скоростью 0.01 изменение цвета? А самое главное - как ты эти изменения визуально заметить успеешь?
Поставь тогда, например от 0.5 хотя бы.

Как по мне, нужно полностью его переписать, потому что этот код - это издевательство над понятием программирование.
Без обид.
 
Последнее редактирование:

Nekro

Терра инкогнита
Сообщения
1,889
Реакции
683
Согласен.
1 - Каким образом, интересно, можно покрасить спрайт красного цвета в красный, или зеленый(синий) цвет?
Для начала нужен спрайт белого цвета, потом уже можно и покрасить его.
А после нужно без таймера, попробовать как отрабатывается изменение цвета, и когда всё будет работать уверенно - тогда можно мутить с таймером.
2 - не пойму, зачем нужно убивать и снова создавать спрайт? Что-бы не спамил в консоль - просто меняй цвет при помощи отправки клиентам через SetEntPropEnt(ent, Prop_Send..... Или уже, на крайний случай, отключай и включай его когда нужно.
Трейсеры на сколько я помню из красного спрайта, но они красятся без проблем Модуль плагина - [Shop] Tracers
Убивать для того, что бы создать новый на месте положения игрока. В принципе можно его и телепортировать на новые координаты, но не знаю как более лучше..
 

ironman

Участник
Сообщения
367
Реакции
235
у этой штуки почему то не красится текстура, лень было допокаться до причины еще давненько. можешь глянуть как я поступил на своем плагине
[ZR] Grenade Damage Charge.
я просто поставил нужные мне цвета через другие текстуры.
Сообщения автоматически склеены:

вот те самые текстуры как пример
sprites/yellowglow1.vmt
sprites/blueglow1.vmt


Трейсеры на сколько я помню из красного спрайта, но они красятся без проблем Модуль плагина - [Shop] Tracers
тут используется вообще другое. beam points это насколько я помню энтити env_beam, у которого можно конечно менять цвета.
 
Последнее редактирование:

tonline_kms65_1

Участник
Сообщения
446
Реакции
175
Трейсеры на сколько я помню из красного спрайта, но они красятся без проблем Модуль плагина - [Shop] Tracers
Убивать для того, что бы создать новый на месте положения игрока. В принципе можно его и телепортировать на новые координаты, но не знаю как более лучше..
Я не знаю что делает этот плагин, у меня простой вопрос - зачем создавать новый спрайт?
Если для того, что бы изменить цвет спрайта - то это точно неверное решение.

Если нужно, прицепить спрайт к игроку - самый надежный и наименее затратный вариант - создать выключенный спрайт, приаттачить его к игроку, что бы не грузить движек постоянными расчетами, и потом, по мере необходимости, менять в нем цвета, включать его, выключать, менять размер и т.д. и т.п. Если грок подохнет - ENT спрайта так же подохнет, т.к. она является дочерней и приаттачена к родителю(игроку).

Не в тему - сейчас посмотрел код трассеров Модуль плагина - [Shop] Tracers - пара моих замечаний по этому плагину:
Я понимаю так, что движения кусочка текстуры трассера здесь нет и быть не может.
Сам трассер должен делаться след. образом, нужно получить дистанцию до твердого препятствия, эту дистанцию разделить на рендомное кол-во кусочков текстуры и какие то из этих кусочков (так же рендомом) отображать, причем отображать их с задержкой. Все это нужно делать в цикле!, потому что таймер не позволит получить скорость пули. Я у себя, в плагине, делал в цикле, использовал задержку цикла в виде пустого цикла, получалась иллюзия движения текстуры, т.е. сначала отображался ближний кусок текстуры, потом более дальний, потом еще дальше и в конце тот который самый последний. Тогда создаётся реальная иллюзия пролетающей, трассирующей пули.
Я не знаю как сделаны трассеры в csgo или HL, но думаю по такому же принципу.
 
Последнее редактирование:

Nekro

Терра инкогнита
Сообщения
1,889
Реакции
683
Я не знаю что делает этот плагин, у меня простой вопрос - зачем создавать новый спрайт?
Если для того, что бы изменить цвет спрайта - то это точно неверное решение.

Если нужно, прицепить спрайт к игроку - самый надежный и наименее затратный вариант - создать выключенный спрайт, приаттачить его к игроку, что бы не грузить движек постоянными расчетами, и потом, по мере необходимости, менять в нем цвета, включать его, выключать, менять размер и т.д. и т.п. Если грок подохнет - ENT спрайта так же подохнет, т.к. она является дочерней и приаттачена к родителю(игроку).
Как можно выключить созданную сущность?
Сообщения автоматически склеены:

Посмотреть вложение 77262
ты только посмотри на этот sprites/redglow1.vmt
Действительно, смена спрайта исправляет ситуацию
 
Последнее редактирование:

Grey83

Ленивая и невнимательная жопа
Сообщения
4,848
Реакции
2,853
Вообще можно спавнить спрайт при первом возрождении игрока, а убивать его только при выходе игрока с сервера (как выше уже заметили).
Я так в серверном воллхаке делал. Правда я там спавнил env_sprite, а не env_glow.
 

Nekro

Терра инкогнита
Сообщения
1,889
Реакции
683
Вообще можно спавнить спрайт при первом возрождении игрока, а убивать его только при выходе игрока с сервера (как выше уже заметили).
Я так в серверном воллхаке делал. Правда я там спавнил env_sprite, а не env_glow.
Ну по таймеру можно телепортировать спрайт на новые позиции игрока, но будет ли меняться цвет? И как можно его отключить на время смерти игрока?
Сообщения автоматически склеены:

Вообще можно спавнить спрайт при первом возрождении игрока, а убивать его только при выходе игрока с сервера (как выше уже заметили).
Я так в серверном воллхаке делал. Правда я там спавнил env_sprite, а не env_glow.
Подскажи пожалуйста
И на 156 строке пришлось добавить hTimerKill[client] = INVALID_HANDLE (разве с hTimerKill[client] = null не одно и тоже?), иначе сыпало
 
Последнее редактирование:

Grey83

Ленивая и невнимательная жопа
Сообщения
4,848
Реакции
2,853
@Nekro, одно и то же.
Но ты там много фигни написал
 
Сверху