рандомное перемещение предметов

SourceGod

Участник
Сообщения
47
Реакции
0
Видел на одном сервере, летают в небе птицы самолёты, при сбивании её вылетает аптечка и тому подобное, а из самолёта вылетает оружие, подскажите как действовать ?
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
Оффтоп


На счет создания и перемещения - не знаю. Принцип действия как у парашута плох, потому что дает определенную нагрузку.

На счет убивания - просто, загляни в эти две темы и сам всё поймешь:
вопрос по валидности и оптимизации кода - спавн оружия на определенной координате
env_entity_dissolver для пропов - только вместо растворения - спавн оружия (который я кину выше)
 
Последнее редактирование модератором:

SourceGod

Участник
Сообщения
47
Реакции
0
Danyas, принцип понял. Где взять модель самолёта?
 

Reiko1231

AlexTheRegent
Сообщения
508
Реакции
1,336
На самом деле всё куда проще.
Шаг 1. Создаем сущность, которая адекватно работает с MOVETYPE_FLY (не подвержена гравитации, а значит нет нужды в дальнейшем контроле сущности, но всё еще подвержена столкновениям (если это не нужно, то тогда MOVETYPE_NOCLIP)), к примеру hegrenade_projectile.
Шаг 2. Определяем границы полета самолета\птицы. Это может быть центр случайного игрока +- 1000.0 юнитов, либо же границы мира, в общем, что нужно, то и выбирается.
Шаг 3. Задается случайным образом импульс (velocity) для созданного объекта и он начинает двигаться в заданном направлении (чтобы не летел вверх-вниз, зануляем 3 (z) координату (для sp это [2])).
Шаг 4. Хукаем OnTakeDamage для сущности. Если нужно, задаем через поле здоровье предмета.
Шаг 5. Пишем обработчик хука, который будет включать в себя выпадение предмета при разрушении.
Вот код, который включает в себя шаги 1-4, и начало 5.

C-подобный:
public OnPluginStart() 
{
	RegConsoleCmd("sm_test", Command_Test);
}

public OnMapStart() 
{
	// не забыть про прехеш модели!
	PrecacheModel("models/weapons/w_missile_launch.mdl");
}

public Action:Command_Test(iClient, iArgc)
{
	// получаем положение клиента и его угол обзора
	float vOrigin[3], vAngles[3], vVelocity[3];
	GetClientAbsOrigin(iClient, vOrigin);
	GetClientEyeAngles(iClient, vAngles);
	
	// высчитываем импульс относительно угла игрока
	GetAngleVectors(vAngles, vVelocity, NULL_VECTOR, NULL_VECTOR);
	NormalizeVector(vVelocity, vVelocity);
	ScaleVector(vVelocity, 100.0);
	
	int iEntity = CreateEntityByName("hegrenade_projectile");
	DispatchSpawn(iEntity);
	
	// задаем необходиные параметры
	vAngles[0] = 0.0; // чтобы объект не был повернут относительно оси Z при создании
	vOrigin[2] += 100.0; // над головой игрока
	vVelocity[2] = 0.0;	// движение только в осях x, y
	SetEntityMoveType(iEntity, MOVETYPE_FLY);
	SetEntityModel(iEntity, "models/weapons/w_missile_launch.mdl");
	// здоровье сущности, если необходимо
	SetEntProp(iEntity, Prop_Data, "m_iHealth", 100);
	// телепортируем в реальный мир
	TeleportEntity(iEntity, vOrigin, vAngles, vVelocity);
	
	// необходимо, чтобы работал хук OnTakeDamage
	SetEntProp(iEntity, Prop_Data, "m_takedamage", 2);
	SDKHook(iEntity, SDKHook_OnTakeDamage, OnTakeDamage);
	
	// уничтожим автоматически сущность через 15.0 секунд
	SetVariantString("OnUser1 !self:kill::15.0:1");
	AcceptEntityInput(iEntity, "AddOutput");
	AcceptEntityInput(iEntity, "FireUser1");
	
	return Plugin_Handled;
}

public Action:OnTakeDamage(iEntity, &iAttacker, &iInfliction, &Float:fDamage, &iDamageType)
{
	// в сущность попали
	if ( GetEntProp(iEntity, Prop_Data, "m_iHealth") < RoundToCeil(fDamage) ) {
		// сущность уничтожили. во избежании взрыва лучше сделать damage = 0.0 и return Plugin_Changed, а затем вручную 
		// удалить сущность с помощью AcceptEntityInput(iEntity, "kill")
	}
	return Plugin_Continue;
}

А модель самолета либо сделать самому, либо взять с того сервера, либо заказать у человека, которые делает модели, например, ePacker2 (есть на форуме).
 

valik1992

Участник
Сообщения
39
Реакции
1
На самом деле всё куда проще.
Шаг 1. Создаем сущность, которая адекватно работает с MOVETYPE_FLY (не подвержена гравитации, а значит нет нужды в дальнейшем контроле сущности, но всё еще подвержена столкновениям (если это не нужно, то тогда MOVETYPE_NOCLIP)), к примеру hegrenade_projectile.
Шаг 2. Определяем границы полета самолета\птицы. Это может быть центр случайного игрока +- 1000.0 юнитов, либо же границы мира, в общем, что нужно, то и выбирается.
Шаг 3. Задается случайным образом импульс (velocity) для созданного объекта и он начинает двигаться в заданном направлении (чтобы не летел вверх-вниз, зануляем 3 (z) координату (для sp это [2])).
Шаг 4. Хукаем OnTakeDamage для сущности. Если нужно, задаем через поле здоровье предмета.
Шаг 5. Пишем обработчик хука, который будет включать в себя выпадение предмета при разрушении.
Вот код, который включает в себя шаги 1-4, и начало 5.

C-подобный:
public OnPluginStart()
{
    RegConsoleCmd("sm_test", Command_Test);
}

public OnMapStart()
{
    // не забыть про прехеш модели!
    PrecacheModel("models/weapons/w_missile_launch.mdl");
}

public Action:Command_Test(iClient, iArgc)
{
    // получаем положение клиента и его угол обзора
    float vOrigin[3], vAngles[3], vVelocity[3];
    GetClientAbsOrigin(iClient, vOrigin);
    GetClientEyeAngles(iClient, vAngles);
   
    // высчитываем импульс относительно угла игрока
    GetAngleVectors(vAngles, vVelocity, NULL_VECTOR, NULL_VECTOR);
    NormalizeVector(vVelocity, vVelocity);
    ScaleVector(vVelocity, 100.0);
   
    int iEntity = CreateEntityByName("hegrenade_projectile");
    DispatchSpawn(iEntity);
   
    // задаем необходиные параметры
    vAngles[0] = 0.0; // чтобы объект не был повернут относительно оси Z при создании
    vOrigin[2] += 100.0; // над головой игрока
    vVelocity[2] = 0.0;    // движение только в осях x, y
    SetEntityMoveType(iEntity, MOVETYPE_FLY);
    SetEntityModel(iEntity, "models/weapons/w_missile_launch.mdl");
    // здоровье сущности, если необходимо
    SetEntProp(iEntity, Prop_Data, "m_iHealth", 100);
    // телепортируем в реальный мир
    TeleportEntity(iEntity, vOrigin, vAngles, vVelocity);
   
    // необходимо, чтобы работал хук OnTakeDamage
    SetEntProp(iEntity, Prop_Data, "m_takedamage", 2);
    SDKHook(iEntity, SDKHook_OnTakeDamage, OnTakeDamage);
   
    // уничтожим автоматически сущность через 15.0 секунд
    SetVariantString("OnUser1 !self:kill::15.0:1");
    AcceptEntityInput(iEntity, "AddOutput");
    AcceptEntityInput(iEntity, "FireUser1");
   
    return Plugin_Handled;
}

public Action:OnTakeDamage(iEntity, &iAttacker, &iInfliction, &Float:fDamage, &iDamageType)
{
    // в сущность попали
    if ( GetEntProp(iEntity, Prop_Data, "m_iHealth") < RoundToCeil(fDamage) ) {
        // сущность уничтожили. во избежании взрыва лучше сделать damage = 0.0 и return Plugin_Changed, а затем вручную
        // удалить сущность с помощью AcceptEntityInput(iEntity, "kill")
    }
    return Plugin_Continue;
}

А модель самолета либо сделать самому, либо взять с того сервера, либо заказать у человека, которые делает модели, например, ePacker2 (есть на форуме).
Не Компилится
 

White Wolf

🍉
Сообщения
2,382
Реакции
2,187
  • Команда форума
  • #7
Ванг здесь нет, пишите подробнее.
 
Сверху Снизу