SetEntityRenderMode and SetEntityRenderColor

TheRunningMan

Участник
Сообщения
147
Реакции
10
Здравствуйте!
В общем, мне как-то нафоруме аллиед написали плагин невидимости людей, там использовались эти функции SetEntityRenderMode and SetEntityRenderColor, так вот проблема в том что если человек стал невидимым то любое поврждение делает его видимым снова, скажите это можно исправить или надо использовать другие функции?

По поводу других функций, я нашел в одном плагине который тоже делает невидимым чела

PHP:
SDKHook(client, SDKHook_SetTransmit, Hook_SetTransmit);

public Action:Hook_SetTransmit(client, entity)
{
	if( client == entity )
		return Plugin_Continue;
	return Plugin_Handled;
}

так вот используя ее невидно вообще ничего кроме метки на радаре, но есть две проблемы если наблюдать за этим человеком, то кажется что он лагает и где то за картой ходит и вторая, т.к. у меня сервер зомби мод (Zombie Reloaded), есть несколько карт, например, ze_FFVII_Mako_Reactor_v3_1, на которой тоже инвиз не срабатывает при каких то условиях, пока не понял...

Можете объяснить в чем проблема по первому вопросу и что делает вторая функция SDKHook ?
 

Игорь Охремчук

Админ uaplayer.com
Сообщения
240
Реакции
340
Здравствуйте!
В общем, мне как-то нафоруме аллиед написали плагин невидимости людей, там использовались эти функции SetEntityRenderMode and SetEntityRenderColor, так вот проблема в том что если человек стал невидимым то любое поврждение делает его видимым снова, скажите это можно исправить или надо использовать другие функции?

По поводу других функций, я нашел в одном плагине который тоже делает невидимым чела

PHP:
SDKHook(client, SDKHook_SetTransmit, Hook_SetTransmit);

public Action:Hook_SetTransmit(client, entity)
{
	if( client == entity )
		return Plugin_Continue;
	return Plugin_Handled;
}

так вот используя ее невидно вообще ничего кроме метки на радаре, но есть две проблемы если наблюдать за этим человеком, то кажется что он лагает и где то за картой ходит и вторая, т.к. у меня сервер зомби мод (Zombie Reloaded), есть несколько карт, например, ze_FFVII_Mako_Reactor_v3_1, на которой тоже инвиз не срабатывает при каких то условиях, пока не понял...

Можете объяснить в чем проблема по первому вопросу и что делает вторая функция SDKHook ?

SDKHook_SetTransmit - это такой хук, который как бы перехватывает передаваемость объекта. Можно даже сказать "его видимость". Если для определённых входящих индексов возвращать Plugin_Handled, то это значит, что сервер не будет отправлять информацию о клиенте другому объекту. В случае, если оба входящих параметра совпадают, то объект должен получать информацию о своём местоположении, иначе как-то прям неправильно будет, и в таком случае возвращается Plugin_Continue, вернее Plugin_Continue возвращается если вы хотите, чтобы объект видел клиента. То-есть формально данная функция не делает объект невидимым, а просто не передаёт информацию о нём другим клиентам.

Ну а с первым случаем, то возможно где-то при хуке евента player_hurt какой-нибудь плагин изменяет альфу клиента, или вы может намутили чтото не то. Выложите образец своего "кода".
 

TheRunningMan

Участник
Сообщения
147
Реакции
10
м.. образец в первом случае?

Добавлено через 1 час 24 минуты
Короче вот, это когда пользователь ввел команду
PHP:
public Action:admcmd_inv(client, args)
{
	if(client == 0)
	{
		ReplyToCommand(client, "[SM] Can't use this command from server input!");
		
		return Plugin_Handled;
	}

	if(GetClientTeam(client) < 2)
	{
		//ReplyToCommand(client, "[SM] Spectators can't use this command!");
		PrintToChat(client,"\x01\x04[SM]\x01Вы не можете использовать невидимость!");
		return Plugin_Handled;
	}

	if(!IsPlayerAlive(client))
	{
		//ReplyToCommand(client, "[SM] Dead players can't use this command!");
		PrintToChat(client,"\x01\x04[SM]\x01Только живые могут использовать невидимость!");
		return Plugin_Handled;
	}

	// zombie
	if(ZR_IsClientZombie(client))
	{
		//ReplyToCommand(client, "[SM] Zombie's can't use this command!");
		PrintCenterText(client,"Зомби не могут использовать невидимость!");
		return Plugin_Handled;
	}
	
	if(inv_time == 0.0)
	{
		PrintToChat(client,"Уже нет!");
		return Plugin_Handled;
	}
	
	if(used[client] == true)
	{
		//ReplyToCommand(client, "[SM] You already used this!");
		PrintCenterText(client,"Больше нет!");
		return Plugin_Handled;
	}

	// If some reason timer still exist, kill it before continue
	if(players_timer[client] != INVALID_HANDLE)
	{
		KillTimer(players_timer[client]);
		players_timer[client] = INVALID_HANDLE;
	}
	if(Seconds[client] != INVALID_HANDLE)
	{
		KillTimer(Seconds[client]);
		Seconds[client] = INVALID_HANDLE;
	}
	
	used[client] = true;
	
	damageplayer[client] = false;

	players_timer[client] = CreateTimer(inv_time, make_visible, client);

	// make invisible
	SetEntityRenderMode(client, RenderMode:RENDER_NONE);
	disapear[client] = true;
	new activeweapon = GetEntPropEnt(client, Prop_Send, "m_hActiveWeapon");

	if(IsValidEntity(activeweapon))
	{
		SetEntityRenderMode(activeweapon, RenderMode:RENDER_TRANSCOLOR);
		SetEntityRenderColor(activeweapon, 255, 255, 255, 0);
	}
	
	PrintCenterText (client, "Маскировка включена!");
	
	count[client] = 9;
	Seconds[client] = CreateTimer(1.0, PrintMsg, client, TIMER_REPEAT)
	
	return Plugin_Handled;
}

дамаг я сделал чтобы исключить некоторые повреждение дабы инвиз не отключался, тогда еще не знал о второй функции...
 
Последнее редактирование:

Игорь Охремчук

Админ uaplayer.com
Сообщения
240
Реакции
340
PHP:
SetEntityRenderMode(client, RenderMode:RENDER_NONE);
Попробуй с клиетом проделать тоже самое, что и с активным оружием
PHP:
SetEntityRenderMode(client, RenderMode:RENDER_TRANSCOLOR); 
SetEntityRenderColor(client, 255, 255, 255, 0);
А в коллбеке таймера make_visible просто установи альфу 255
PHP:
SetEntityRenderColor(client, 255, 255, 255, 255);
 

TheRunningMan

Участник
Сообщения
147
Реакции
10
Сделал

PHP:
public Action:admcmd_inv(client, args)
{
	if(client == 0)
	{
		ReplyToCommand(client, "[SM] Can't use this command from server input!");
		
		return Plugin_Handled;
	}

	if(GetClientTeam(client) < 2)
	{
		//ReplyToCommand(client, "[SM] Spectators can't use this command!");
		PrintToChat(client,"\x01\x04[SM]\x01Вы не можете использовать невидимость!");
		return Plugin_Handled;
	}

	if(!IsPlayerAlive(client))
	{
		//ReplyToCommand(client, "[SM] Dead players can't use this command!");
		PrintToChat(client,"\x01\x04[SM]\x01Только живые могут использовать невидимость!");
		return Plugin_Handled;
	}

	// zombie
	if(ZR_IsClientZombie(client))
	{
		//ReplyToCommand(client, "[SM] Zombie's can't use this command!");
		PrintCenterText(client,"Зомби не могут использовать невидимость!");
		return Plugin_Handled;
	}
	
	if(inv_time == 0.0)
	{
		PrintToChat(client,"Уже нет!");
		return Plugin_Handled;
	}
	
	if(used[client] == true)
	{
		//ReplyToCommand(client, "[SM] You already used this!");
		PrintCenterText(client,"Больше нет!");
		return Plugin_Handled;
	}

	// If some reason timer still exist, kill it before continue
	if(players_timer[client] != INVALID_HANDLE)
	{
		KillTimer(players_timer[client]);
		players_timer[client] = INVALID_HANDLE;
	}
	if(Seconds[client] != INVALID_HANDLE)
	{
		KillTimer(Seconds[client]);
		Seconds[client] = INVALID_HANDLE;
	}
	
	used[client] = true;
	
	//damageplayer[client] = false;

	players_timer[client] = CreateTimer(inv_time, make_visible, client);

	// make invisible
	//SetEntityRenderMode(client, RenderMode:RENDER_NONE);
	SetEntityRenderMode(client, RenderMode:RENDER_TRANSCOLOR);
	SetEntityRenderColor(client, 255, 255, 255, 0);
	disapear[client] = true;
	new activeweapon = GetEntPropEnt(client, Prop_Send, "m_hActiveWeapon");

	if(IsValidEntity(activeweapon))
	{
		SetEntityRenderMode(activeweapon, RenderMode:RENDER_TRANSCOLOR);
		SetEntityRenderColor(activeweapon, 255, 255, 255, 0);
	}
	
	PrintCenterText (client, "Маскировка включена!");
	
	count[client] = 9;
	Seconds[client] = CreateTimer(1.0, PrintMsg, client, TIMER_REPEAT)
	
	return Plugin_Handled;
}

Но просто при падении сразу виден становишься...

Так то я не помню плагинов которые используют player_hurt ....
может они и есть но есть такой же плагин на другом сервер и там все норм...
 

Игорь Охремчук

Админ uaplayer.com
Сообщения
240
Реакции
340

TheRunningMan

Участник
Сообщения
147
Реакции
10
Дак вот проблема(((
А что эта часть кода делает?
PHP:
public OnClientPutInServer(client)
{
	SDKHook(client, SDKHook_PostThinkPost, OnPostThinkPost);
	SDKHook(client, SDKHook_WeaponSwitchPost, WeaponSwitchPost);
	//SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage);
}

public OnPostThinkPost(client)
{
	disapear[client] ? SetEntProp(client, Prop_Send, "m_iAddonBits", 0):0;
}

public WeaponSwitchPost(client, weapon)
{
	if(disapear[client])
	{
		SetEntityRenderMode(weapon, RenderMode:RENDER_TRANSCOLOR);
		SetEntityRenderColor(weapon, 255, 255, 255, 0);
	}
	else
	{
		SetEntityRenderMode(weapon, RenderMode:RENDER_NORMAL);
	}
}
 

Игорь Охремчук

Админ uaplayer.com
Сообщения
240
Реакции
340
Дак вот проблема(((
А что эта часть кода делает?
PHP:
public OnClientPutInServer(client)
{
	SDKHook(client, SDKHook_PostThinkPost, OnPostThinkPost);
	SDKHook(client, SDKHook_WeaponSwitchPost, WeaponSwitchPost);
	//SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage);
}

public OnPostThinkPost(client)
{
	disapear[client] ? SetEntProp(client, Prop_Send, "m_iAddonBits", 0):0;
}

public WeaponSwitchPost(client, weapon)
{
	if(disapear[client])
	{
		SetEntityRenderMode(weapon, RenderMode:RENDER_TRANSCOLOR);
		SetEntityRenderColor(weapon, 255, 255, 255, 0);
	}
	else
	{
		SetEntityRenderMode(weapon, RenderMode:RENDER_NORMAL);
	}
}

Тут подробно описано о нет_пропе m_iAddonBits. Этот нет_проп отвечает за создание ентитей и прикриплении их на модельке клиента. С4 на спине, гранаты на поясе, пистолет на бедре и т.д.. При заходе клиента на сервер клиент хукается через SDK Hooks двумя хуками.
WeaponSwitchPost, если disapear[client] = true, то делает прозрачным текущее оружие в руках игрока.
Ну а на счёт m_iAddonBits
PHP:
m_iAddonBits gets reset on every PostThink so the PostThinkPost hook in SDK Hooks is needed.
Если disapear[client] = true, то убирает эти прикреплённые оружия к модельке игрока.
 

TheRunningMan

Участник
Сообщения
147
Реакции
10
Блин..тогда не понятно в чем проблема...........................
получается все правильно написано...
может можно как-то сделать, может есть какое-нибудь решение)))
 

Игорь Охремчук

Админ uaplayer.com
Сообщения
240
Реакции
340
PHP:
SetEntityRenderMode(client, RenderMode:RENDER_TRANSCOLOR); 
SetEntityRenderColor(client, 255, 255, 255, 0);

Этот метод ещё ниразу не подводил. И ещё раз повторюсь, если при получении повреждений игрок становится видимым, то в каком-то из плагинов на сервере в колбеке хука евента "player_hurt" изменяется его альфа или РендерМод. Ну или поищи хуки через SDK Hooks такие как SDKHook_OnTakeDamage или SDKHook_OnTakeDamagePost. Больше вариантов нет.
 

TheRunningMan

Участник
Сообщения
147
Реакции
10
Нашел в чем проблема....
проблема в зомби моде...
его убрал, в плагине отключил инклуд и все норм....
но чорт побери мне же надо сделать его на зомби мод)))
 

Игорь Охремчук

Админ uaplayer.com
Сообщения
240
Реакции
340
Нашел в чем проблема....
проблема в зомби моде...
его убрал, в плагине отключил инклуд и все норм....
но чорт побери мне же надо сделать его на зомби мод)))

А в чём проблема? У зомби мода нет исходников?)

Я тебе даже немного помогу)

В файлике addons\sourcemod\scripting\zr\tools_functions.inc есть функция
PHP:
stock ToolsSetClientAlpha(client, alpha)
Удали тело, оставь пустую функцию.
PHP:
stock ToolsSetClientAlpha(client, alpha)
{
    // Turn rendermode on, on the client.
    //SetEntityRenderMode(client, RENDER_TRANSALPHA);
    
    // Set alpha value on the client.
    //SetEntityRenderColor(client, _, _, _, alpha);
    
    // Forward event to modules.
    //WeaponAlphaOnClientAlphaChanged(client, alpha);
}

И откомпиль зомби мод заново. Вроде изменяет альфу только эта функция.

Хотя нет, ещё есть функция, которая изменяет альфу оружия, что тоже может сделать игрока в некотором смысле видимым
PHP:
WeaponAlphaApplyWeaponAlpha(entity, alpha)
которая находится в addons\sourcemod\scripting\zr\weapons\weaponalpha.inc
 

TheRunningMan

Участник
Сообщения
147
Реакции
10
А в чём проблема? У зомби мода нет исходников?)

Так там же жесть коды тем более несколько исходников связаны между собой, как компилировать то, а если баги, то вообще...

Добавлено через 12 минут
вот че пишет

// zr/volfeatures/volclassedit.inc(38) : error 006: must be assigned to an array

// css\cstrike\addons\sourcemod\scripting\zombiereloaded.sp(328) war
ning 203: symbol is never used: "WeaponAlphaOnClientAlphaChanged"

ну вторая ошибка еще ладно, а из-за первой не хочет компилировать, с масивом там чето...
 
Последнее редактирование:

Игорь Охремчук

Админ uaplayer.com
Сообщения
240
Реакции
340
Ошибка глупая, если честно. Автор пытается в массив целых чисел загнать строку.
 

Вложения

  • zombiereloaded.zip
    160.2 КБ · Просмотры: 12

TheRunningMan

Участник
Сообщения
147
Реакции
10
Ошибка глупая, если честно. Автор пытается в массив целых чисел загнать строку.

так вообще не пашет зомби мод...точнее он пашет но заразить нельзя никого и через админку тоже....бида....
а нет сори это я тупанул)))


Воо теперь хорошо))
По-моему я уже спрашивал здесь, как сделать чтобы не было видно фонаря, огня от стрельбы, метки на радаре для врагов, ну хотя бы ник сделать чтоб не было видно)
 

Игорь Охремчук

Админ uaplayer.com
Сообщения
240
Реакции
340
Для имён стандартный серверный квар
PHP:
"mp_playerid" = "1" ( def. "0" ) min. 0.000000 max. 2.000000
 game replicated
 - Controls what information player see in the status bar: 0 all names; 1 team names; 2 no names
Вобщем, если выставить mp_playerid "2" в server.cfg, то при наведении прицела на игроков имена не будут отображатся вообще.
А над остальным уже надо подумать)
 

TheRunningMan

Участник
Сообщения
147
Реакции
10
Для имён стандартный серверный квар
PHP:
"mp_playerid" = "1" ( def. "0" ) min. 0.000000 max. 2.000000
 game replicated
 - Controls what information player see in the status bar: 0 all names; 1 team names; 2 no names
Вобщем, если выставить mp_playerid "2" в server.cfg, то при наведении прицела на игроков имена не будут отображатся вообще.
А над остальным уже надо подумать)

но мне так то имя нужно чтоб показывались, но вот именно чела в инвизе нет, ладно надо поэкспериментировать....
 

Игорь Охремчук

Админ uaplayer.com
Сообщения
240
Реакции
340
но мне так то имя нужно чтоб показывались, но вот именно чела в инвизе нет, ладно надо поэкспериментировать....

В таком случае легче всего это организовать через SetTransmit, просто возвращай Plugin_Continue если ентити это индекс клиента, клиент в игре и клиент спектатор к примеру.
 

TheRunningMan

Участник
Сообщения
147
Реакции
10
В таком случае легче всего это организовать через SetTransmit, просто возвращай Plugin_Continue если ентити это индекс клиента, клиент в игре и клиент спектатор к примеру.

т.е. использовать
SDKHook(client, SDKHook_SetTransmit, Hook_SetTransmit)

но я же говорю что на некоторых картах не срабатывает....
а если использовать одновременно две функции?
 

Игорь Охремчук

Админ uaplayer.com
Сообщения
240
Реакции
340
т.е. использовать
SDKHook(client, SDKHook_SetTransmit, Hook_SetTransmit)

но я же говорю что на некоторых картах не срабатывает....
а если использовать одновременно две функции?

Так две и используй. Сделай его не полностью прозрачным, чтоб его видели свои и отправляй Plugin_Handled только для зомби. А в таймере ещё добавь
PHP:
SDKUnhook(client, SDKHook_SetTransmit, Hook_SetTransmit);
 
Сверху Снизу