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

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

  1. SourceGod

    SourceGod

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

    Webman old-dev

    Сообщения:
    780
    Симпатии:
    280
    Оффтоп
     
    Святослав124 нравится это.
  3. Danyas

    Danyas Модератор

    Сообщения:
    1.921
    Симпатии:
    746
    Оффтоп


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

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

    SourceGod

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

    Reiko1231 AlexTheRegent

    Сообщения:
    314
    Симпатии:
    721
    На самом деле всё куда проще.
    Шаг 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 (есть на форуме).
     
    666FoX666, Meowmurmur, Kailo и 4 другим нравится это.
  6. valik1992

    valik1992

    Сообщения:
    7
    Симпатии:
    0
    Не Компилится
     
  7. White Wolf

    White Wolf Супермодератор

    Сообщения:
    1.447
    Симпатии:
    707
    Ванг здесь нет, пишите подробнее.
     
  8. valik1992

    valik1992

    Сообщения:
    7
    Симпатии:
    0
    можно плагин с исходником скомпилированый)