Вращение выброшенного предмета

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

  1. iamdss

    iamdss

    Сообщения:
    117
    Симпатии:
    0
    Делаю выбрасывание оружия по определённому условию. Код примерно следующий:

    Код:
    decl Float:clienteyeangle[3], Float:anglevector[3], Float:clienteyeposition[3], Float:resultposition[3], entity;
    GetClientEyeAngles(client, clienteyeangle);
    GetClientEyePosition(client, clienteyeposition);
    GetAngleVectors(clienteyeangle, anglevector, NULL_VECTOR, NULL_VECTOR);
    NormalizeVector(anglevector, anglevector);
    ScaleVector(anglevector, 10.0);
    AddVectors(clienteyeposition, anglevector, resultposition);
    NormalizeVector(anglevector, anglevector);
    ScaleVector(anglevector, 1500.0);
    
    
    entity = CreateEntityByName("prop_physics_override");
    DispatchKeyValue(entity, "model", "models/weapons/w_pistol.mdl");
    DispatchKeyValue(entity, "solid", "6");
    DispatchSpawn(entity);
    TeleportEntity(entity, resultposition, clienteyeangle, anglevector);
    
    Предмет выбрасывается, что и понятно, в одном положении (модель пистолета тут для примера, в итоге бросать будем что-то другое). А хотелось бы, чтобы модель вела себя естественно, то есть, вращалась, как минимум, в одной плоскости, а также была подвержена тяготению.

    Чтобы у нас сегодня не было пошаговых стратегий, озвучу вопрос. Возможно ли и как реализовать указанное выше желаемое? Буду рад и подсказкам, и примерам кода. Спасибо.
     
  2. Саша Шеин

    Саша Шеин

    Сообщения:
    1.259
    Симпатии:
    191
    iamdss, R1KO вроде делал что-то подобное для CSS.

    Добавлено через 53 минуты
    Можно ведь сразу так:
    entity = CreateEntityByName("weapon_*");
     
    Последнее редактирование: 11 июл 2015
  3. iamdss

    iamdss

    Сообщения:
    117
    Симпатии:
    0
    А где это посмотреть?

    Спасибо. Я не знал.
     
  4. Саша Шеин

    Саша Шеин

    Сообщения:
    1.259
    Симпатии:
    191
    Вот так. Плагин был на Hlmod'e ..
     
  5. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.998
    Симпатии:
    2.992
    Саша Шеин, я кажется его удалил т.к. он создавал лаги.


    iamdss, лови:

    PHP:
    new iEntity CreateEntityByName("weapon_awp");
    DispatchSpawn(iEntity);
    /*
        Для гранат, бомбы и дефезуеров след. строка не нужна
    */
    DispatchKeyValue(iEntity"angles""-90 0 0");

    ActivateEntity(iEntity);
    TeleportEntity(iEntityКоординатыNULL_VECTORNULL_VECTOR);
    Вот само вращение
    PHP:
    public OnGameFrame()
    {
        static 
    iSize;
        
    iSize GetArraySize(g_hArrayWRWeapons);
        if (
    iSize)
        {
            for(new 
    i=0iSizei++) CreateRotation(GetArrayCell(g_hArrayWRWeaponsi));
        }
    }

    stock CreateRotation(iWeapon)
    {
        if(
    IsValidEntity(iWeapon))
        {
            
    decl Float:fRotate[3];
            
    GetEntPropVector(iWeaponProp_Send"m_angRotation"fRotate);
            
    fRotate[1] += float(g_iWRRotSpeed);

            
    TeleportEntity(iWeaponNULL_VECTORfRotateNULL_VECTOR);
        }
    }
    Тоесть я вращал оружие каждый фрейм. Можно создать вращение так:
    PHP:
    new iEntity CreateEntityByName("prop_physics_override");
    ...

    new 
    iRotating CreateEntityByName("func_rotating");
                    
    DispatchKeyValueVector(iRotating"origin"fPos);
                    
    DispatchKeyValue(iRotating"targetname"sTargetName);
                    
    DispatchKeyValue(iRotating"maxspeed""180");
                    
    DispatchKeyValue(iRotating"friction""0");
                    
    DispatchKeyValue(iRotating"dmg""0");
                    
    DispatchKeyValue(iRotating"solid""0");
                    
    DispatchKeyValue(iRotating"spawnflags""64");
                    
    DispatchSpawn(iRotating);

                    
    SetVariantString("!activator");
                    
    AcceptEntityInput(iEntity"SetParent"iRotatingiRotating);
                    
    AcceptEntityInput(iRotating"Start");
                    
                    
    SetVariantString(sBuffer);
                    
    AcceptEntityInput(iRotating"AddOutput");
                    
    AcceptEntityInput(iRotating"FireUser1");
                    
                    
    SetEntPropEnt(iEntityProp_Send"m_hEffectEntity"iRotating);
     
    iamdss нравится это.
  6. Reiko1231

    Reiko1231 AlexTheRegent

    Сообщения:
    237
    Симпатии:
    569
    Все решения плохие, даже моё, т.к. человеку нужен код для выбрасывания оружия. У R1KO вращение будет до тех пор, пока вручную не остановят, а это лишние хуки и отслеживание, коснулось ли земли. Мой путь чуть проще - у всех Projectile (и только у них) есть поле "m_vecAngVelocity", задающее вращение объекта, как раз угол скорости. Благодаря этому полю любой объект будет вращаться согласно Velocity. Но он требует потом отслеживания касания или преобразования объекта в оружие.
    Код:
    public OnPluginStart() 
    {
    	RegConsoleCmd("sm_mydrop", Command_MyDrop);
    }
    
    public Action:Command_MyDrop(iClient, iArgc)
    {
    	decl Float:vOrigin[3], Float:vAngles[3];
    	GetClientEyePosition(iClient, vOrigin);
    	GetClientEyeAngles(iClient, vAngles);
    	TR_TraceRayFilter(vOrigin, vAngles, MASK_SOLID, RayType_Infinite, TRDontHitSelf, client);
    	if ( TR_DidHit() ) {
    		new iEntity = CreateEntityByName("flashbang_projectile");
    		DispatchSpawn(iEntity);
    		SetEntityModel(iEntity, "models/items/healthkit.mdl");
    		
    		decl Float:vVelocity[3];
    		GetAngleVectors(vAngles, vVelocity, NULL_VECTOR, NULL_VECTOR);
    		ScaleVector(vVelocity, 1000.0);
    		
    		// Отодвинуть объект, чтобы не появлялся прямо над игроком.
    		vOrigin[0] = vOrigin[0] + (vVelocity[0] * 0.1);
    		vOrigin[1] = vOrigin[1] + (vVelocity[1] * 0.1); 
    				
    		TeleportEntity(iEntity, vOrigin, vAngles, vVelocity);
    		SetEntPropVector(iEntity, Prop_Data, "m_vecAngVelocity", Float:{0.0, 0.0, 1000.0});
    		SetEntPropFloat(iEntity, Prop_Send, "m_flElasticity", 1.0);
    	}
    	return Plugin_Handled;
    }
    
    m_flElasticity - эластичность скачков, что-то типа массы объекта. Чем меньше, тем больше будет скакать. Остается лишь подобрать значения угла вращения (Float:{1000.0, 0.0, 0.0}) и эластичность, чтобы получить то, что нужно.
     
    iamdss, R1KO и AlmazON нравится это.
  7. iamdss

    iamdss

    Сообщения:
    117
    Симпатии:
    0
    Спасибо всем. Попробую метод Reiko1231.

    Касание я и так буду отслеживать, так как надо будет реализовать урон по противнику (выкидывать будем лом/шокопалку, скорее всего). А вот как преобразовать объект в оружие, этого я не знаю, не подскажите? Хотелось бы потом иметь возможность поднять ломик, если промахнулся.
     
  8. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.998
    Симпатии:
    2.992
    удалить объект и дать оружие.
     
  9. iamdss

    iamdss

    Сообщения:
    117
    Симпатии:
    0
    Это-то как раз не сложно, а как определить столкновение игрока с созданным мной объектом?
     
  10. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.998
    Симпатии:
    2.992
    iamdss, SDK Hooks SDKHook_StartTouch
    SDKHook_StartTouchPost
    SDKHook_Touch
     
    iamdss нравится это.
  11. iamdss

    iamdss

    Сообщения:
    117
    Симпатии:
    0
    Я вернулся к данной теме и у меня есть вопросы.

    Я не знаю, какие есть проджектайлы в hl2dm, где посмотреть список? В валвовской вики нет такого в разделел hl2dm. Что это вообще такое - проджектайлы? Я использую prop_physics_multiplayer, чем указанный вами flashbang_projectile от него отличается? Простите за нубские вопросы.

    Ещё один вопрос. Я вижу в дампах у prop_physics_multiplayer поля m_vecAngVelocity и m_flElasticity, но код

    Код:
    SetEntPropVector(entity, Prop_Data, "m_vecAngVelocity", Float:{0.0, 0.0, 1000.0});
    SetEntPropFloat(entity, Prop_Send, "m_flElasticity", 1.0);
    TeleportEntity(entity, resultposition, clienteyeangle, anglevector);
    не вращает мой prop_physics_multiplayer. Почему?