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

Тема в разделе "Программирование / Скриптинг", создана пользователем SourceGod, 28 июл 2015.

  1. SourceGod

    SourceGod

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

    Webman Developer

    Сообщения:
    702
    Симпатии:
    182
    Оффтоп
     
  3. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.729
    Симпатии:
    461
    Оффтоп


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

    На счет убивания - просто, загляни в эти две темы и сам всё поймешь:
    http://hlmod.ru/forum/programmirovanie-skripting/29469-vopros-po-validnosti-i-optimizatsii-koda.html - спавн оружия на определенной координате
    http://hlmod.ru/forum/programmirovanie-skripting/30205-env_entity_dissolver-dlya-propov.html - только вместо растворения - спавн оружия (который я кину выше)
     
  4. SourceGod

    SourceGod

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

    Reiko1231 AlexTheRegent

    Сообщения:
    238
    Симпатии:
    569
    На самом деле всё куда проще.
    Шаг 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 (есть на форуме).
     
    Leckter Hannibal, AlmazON и Primo нравится это.