【SM & AMX】 TraceHull的运用

TraceHull和TraceLine是差不多的, 但TraceHull是类似于刀具的Trace.

TraceHull的原理是: 向前面丢出一个设定大小的立体图形. 如果碰撞到了你设定Filter的东西, 那么就返回. 因此它只会有一个Victim. 如果你想要AOE或者让所有人受伤, 那么就得多Trace几次了.

下面就贴出ZP的参考代码吧.

Copyright (C) 2015-2019 Nikita Ushakov (Ireland, Dublin)

    // 初始化向量
    static float vPosition[3]; static float vEndPosition[3]; static float vNormal[3];

     // 获取武器位置
     ZP_GetPlayerGunPosition(client, 0.0, 0.0, 10.0, vPosition);
     ZP_GetPlayerGunPosition(client, 80.0, flRightShift, 10.0, vEndPosition);

    // 进行一个直线 Trace
    Handle hTrace = TR_TraceRayFilterEx(vPosition, vEndPosition, (MASK_SHOT|CONTENTS_GRATE), RayType_EndPoint, SelfFilter, client);

    // 初始化 受害者 变量
    int victim;
                    
    // 检测碰撞
    if (!TR_DidHit(hTrace)) // 没有TraceRay到人, 那就TraceHull再来一次
    {
        // 初始化TraceHull立体形状大小
        static const float vMins[3] = { -16.0, -16.0, -18.0  }; 
        static const float vMaxs[3] = {  16.0,  16.0,  18.0  }; 
                        
        // 进行TraceHull
        delete hTrace;
        hTrace = TR_TraceHullFilterEx(vPosition, vEndPosition, vMins, vMaxs, MASK_SHOT_HULL, TraceEntityFilterLastHit, client);
                        
        // 检测碰撞
        if (TR_DidHit(hTrace)) // 碰到东西了
        {
            // 获取碰撞实体索引
            victim = TR_GetEntityIndex(hTrace);

            // 打到world了?
            if (victim < 1 || victim > 64)
            {
                UTIL_FindHullIntersection(hTrace, vPosition, vMins, vMaxs, SelfFilter, client);
            }
        }
    }
                    
    // 检测碰撞 . TraceRay到人了
    if (TR_DidHit(hTrace))
    {
        // 获取 受害者 索引
        victim = TR_GetEntityIndex(hTrace);
                        
        // 获取末尾位置
        TR_GetEndPosition(vEndPosition, hTrace);

        // 打到玩家了?
        if (victim > 1 && victim <= 64)
        {
            // 创建伤害
            UTIL_CreateDamage(_, vEndPosition, client, 24.0, 10.0, DMG_NEVERGIB);
        }
    }
                    
    // Close trace 
    delete hTrace;
}
点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注