Перейти к содержимому


Фотография

Убить, остановить партикл

particle частицы

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 6

#1 Game Over - L4D2 - CS:GO

Game Over - L4D2 - CS:GO

    Постоянный пользователь

  • Пользователь
  • PipPipPipPipPip
  • 574 сообщений

Отправлено 04 Март 2019 - 11:33

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



#2 BHaType

BHaType

    Пользователь

  • Пользователь
  • PipPipPip
  • 358 сообщений

Отправлено 04 Март 2019 - 12:11

Что за модель?

Кастомная?



#3 AlexMy

AlexMy

    Постоянный пользователь

  • Пользователь
  • PipPipPipPipPip
  • 1 032 сообщений

Отправлено 04 Март 2019 - 12:26

в l4d_lastboss хороший пример удаление партиклов:

public void PrecacheParticle(char [] particlename)
{
	int particle = CreateEntityByName("info_particle_system");
	if (IsValidEdict(particle))
	{
		DispatchKeyValue(particle, "effect_name", particlename);
		DispatchKeyValue(particle, "targetname", "particle");
		DispatchSpawn(particle);
		ActivateEntity(particle);
		AcceptEntityInput(particle, "start");
		CreateTimer(0.01, DeleteParticles, particle, TIMER_FLAG_NO_MAPCHANGE);
	}  
}
public Action DeleteParticles(Handle timer, any particle)
{
	char classname[64];
	if (IsValidEntity(particle) && GetEdictClassname(particle, classname, sizeof(classname)))
	{
		if (StrEqual(classname, "info_particle_system", false))
            RemoveEdict(particle);
	}
}

  • Game Over - L4D2 - CS:GO это нравится

#4 Game Over - L4D2 - CS:GO

Game Over - L4D2 - CS:GO

    Постоянный пользователь

  • Пользователь
  • PipPipPipPipPip
  • 574 сообщений

Отправлено 04 Март 2019 - 13:41

Что за модель?

Кастомная?

models/props_vehicles/helicopter_rescue.mdl

Из кастомной я бы вырезал эту функцию) 

 

Спасибо, там проблема в том, что партикл закреплён в таком виде 

Скрытый текст

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


Сообщение отредактировал Game Over - L4D2 - CS:GO: 04 Март 2019 - 13:48


#5 Game Over - L4D2 - CS:GO

Game Over - L4D2 - CS:GO

    Постоянный пользователь

  • Пользователь
  • PipPipPipPipPip
  • 574 сообщений

Отправлено 04 Март 2019 - 15:24

Удалил частицы которые крепились к вертолёту (Удалены какие-то корявые анимации, багов замечено не было).
Ссылка на исходник вертолёта (alliedmods) https://forums.allie...82&d=1532170933
Отрыть и заменить модель. 

helicopter_rescue.mdl
на 
fix_helicopter_rescue.mdl

значение 3.0 делает вертолёт больше,чтобы он не выглядел как игрушка,от 3 лица можно оставить по умолчанию чтобы не закрывал обзор. 


///////////////////////////////////  L4D2  //////////////////////////////////


l4d_helicopter_size = CreateConVar("l4d_helicopter_size", "3.0", "helicopter's size [1.0, 2.0, 3.0]");

void CreateHelicopter(int client, int infoIndex)
{
	if(DummyEnt[client]>0)
	{
		RemoveHelicopter(client);
	}

	float modelScale=l4d_helicopter_size.FloatValue;
	if(modelScale<1.0)modelScale=1.0;
	else if(modelScale>2.0)modelScale=2.0;
	else if(modelScale<3.0)modelScale=3.0;

....................................................

int CreateModel(int client)
{
	float modelScale=l4d_helicopter_size.FloatValue;
	if(modelScale<1.0)modelScale=1.0;
	else if(modelScale>2.0)modelScale=2.0;
	else if(modelScale<3.0)modelScale=3.0;
	modelScale*=3.0; 

....................................................

Работает в L4D, но требует загрузки файлов и некоторого редактирования.Убрать вид от 3 лица и сделать от первого, передвинув персонажи к кабине пилота. Стекло с обратной стороны модели прозрачное и всё прекрасно видно и тгд.
В первой части modelScale не работает и данную функцию необходимо удалить. Требует редактирования многих других вещей для L4D.

Скачать модель https://yadi.sk/d/bTIpQCzsMhsebQ
 


Сообщение отредактировал Game Over - L4D2 - CS:GO: 04 Март 2019 - 15:59

  • BHaType это нравится

#6 dragokas

dragokas

    Постоянный пользователь

  • Пользователь
  • PipPipPipPipPip
  • 792 сообщений

Отправлено 07 Март 2019 - 17:42

AlexMy, я бы его хорошим не назвал. Вместо передачи индекса в таймер через reference, идёт проверка имени класса.

Да и как это поможет ТС, у него нет требуемых индексов, т.к. партикли создаёт не он, а модель.

Можно сделать намного проще, написав сразу после создания партикля:

	SetVariantString("OnUser1 !self:Kill::0.01:1");
	AcceptEntityInput(ent, "AddOutput");
	AcceptEntityInput(ent, "FireUser1"); 

Это не требует проверок валидности.

 

GameOver, попробуй сделать так:

#pragma semicolon 1
#pragma newdecls required

#include <sourcemod>
#include <sdktools>
#include <sdkhooks>

public void OnEntityCreated(int entity, const char[] classname)
{
	if (StrEqual(classname, "info_particle_system", false)) {
		PrintToChatAll("%i - %s - created", entity, classname);
		SDKHook(entity, SDKHook_SpawnPost, OnSpawnPost_Particle);
	}
}

public Action OnSpawnPost_Particle(int ref)
{
	int entity = EntRefToEntIndex(ref);
	if (entity != INVALID_ENT_REFERENCE) {
		int iData;
		//iData = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity");
		//iData = GetEntPropEnt(entity, Prop_Data, "m_pParent");
		//iData = GetEntProp(entity, Prop_Data, "m_iParentAttachment");
		iData = GetEntPropEnt(entity, Prop_Data, "m_hParent");
		PrintToChatAll("parent: %i", iData);

                SDKUnhook(entity, SDKHook_SpawnPost, OnSpawnPost_Particle);		
		AcceptEntityInput(entity, "KillHierarchy"); 

		PrintToChatAll("%i - killed", entity);
	}
}

Заведи глобальный счётчик. Перед спауном модели делай counter++, создавай таймер и в его колбеке counter--, в OnEntityCreated соответственно проверяй кол-во ссылок > 0, а в round_start обнуляй.

 

Перед удалением партикля, идентифицируешь его по признаку родителя (все указанные выше действительны), положив предварительно в глобальную переменную. По признаку имени (effect_name) я не понял как получить. m_iName мне вернуло пустую строку. Может, сам найдешь нужный проп.

 

EDIT. Чуть подправил. Сначала анхук, потом килл. Хотя говорят, что в таких случаях снимать хук вообще не нужно.


Сообщение отредактировал dragokas: 07 Март 2019 - 17:49

  • Game Over - L4D2 - CS:GO это нравится

#7 Game Over - L4D2 - CS:GO

Game Over - L4D2 - CS:GO

    Постоянный пользователь

  • Пользователь
  • PipPipPipPipPip
  • 574 сообщений

Отправлено 07 Март 2019 - 20:02

AlexMy, я бы его хорошим не назвал. Вместо передачи индекса в таймер через reference, идёт проверка имени класса.

Да и как это поможет ТС, у него нет требуемых индексов, т.к. партикли создаёт не он, а модель.

Можно сделать намного проще, написав сразу после создания партикля:

	SetVariantString("OnUser1 !self:Kill::0.01:1");
	AcceptEntityInput(ent, "AddOutput");
	AcceptEntityInput(ent, "FireUser1"); 

Это не требует проверок валидности.

 

GameOver, попробуй сделать так:

#pragma semicolon 1
#pragma newdecls required

#include <sourcemod>
#include <sdktools>
#include <sdkhooks>

public void OnEntityCreated(int entity, const char[] classname)
{
	if (StrEqual(classname, "info_particle_system", false)) {
		PrintToChatAll("%i - %s - created", entity, classname);
		SDKHook(entity, SDKHook_SpawnPost, OnSpawnPost_Particle);
	}
}

public Action OnSpawnPost_Particle(int ref)
{
	int entity = EntRefToEntIndex(ref);
	if (entity != INVALID_ENT_REFERENCE) {
		int iData;
		//iData = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity");
		//iData = GetEntPropEnt(entity, Prop_Data, "m_pParent");
		//iData = GetEntProp(entity, Prop_Data, "m_iParentAttachment");
		iData = GetEntPropEnt(entity, Prop_Data, "m_hParent");
		PrintToChatAll("parent: %i", iData);

                SDKUnhook(entity, SDKHook_SpawnPost, OnSpawnPost_Particle);		
		AcceptEntityInput(entity, "KillHierarchy"); 

		PrintToChatAll("%i - killed", entity);
	}
}

Заведи глобальный счётчик. Перед спауном модели делай counter++, создавай таймер и в его колбеке counter--, в OnEntityCreated соответственно проверяй кол-во ссылок > 0, а в round_start обнуляй.

 

Перед удалением партикля, идентифицируешь его по признаку родителя (все указанные выше действительны), положив предварительно в глобальную переменную. По признаку имени (effect_name) я не понял как получить. m_iName мне вернуло пустую строку. Может, сам найдешь нужный проп.

 

EDIT. Чуть подправил. Сначала анхук, потом килл. Хотя говорят, что в таких случаях снимать хук вообще не нужно.

Спасибо!





Темы с аналогичным тегами particle, частицы

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных