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