2326522268 发表于 2024-5-21 22:23:44

[cs1.6] 如何判断玩家是否在滑坡

我要做KZ 的插件, 玩家存点的时候 不知道 是不是在滑坡判断在不在滑坡 怎么去写呢

k1nader 发表于 2024-5-27 20:30:50

IsUserSurfing(id)
{
    // 首先检查玩家是否还活着,只有活着的玩家才能进行滑坡
    if( is_user_alive(id) )
    {
      // 获取玩家的状态标志,检查玩家是否站在地上
      new flags = entity_get_int(id, EV_INT_flags);
      if( flags & FL_ONGROUND )
      {
            // 如果玩家正处于地面,则肯定不是在滑坡,直接返回0
            return 0;
      }

      // 准备进行射线检测,先获取玩家当前位置
      new Float:origin, Float:dest;
      entity_get_vector(id, EV_VEC_origin, origin);
      
      // 设置射线检测的目标点,在玩家脚下稍下的位置
      dest = origin; // X坐标不变
      dest = origin; // Y坐标不变
      dest = origin - 1.0; // Z坐标减小,模拟脚部位置

      // 创建一个追踪实体,准备执行射线追踪
      new ptr = create_tr2();
      // 执行实体包围盒追踪,从玩家当前位置到预设的目标点
      engfunc(EngFunc_TraceHull, origin, dest, 0, flags & FL_DUCKING ? HULL_HEAD : HULL_HUMAN, id, ptr);
      
      // 获取追踪结果中射线穿过的比例
      new Float:flFraction;
      get_tr2(ptr, TR_flFraction, flFraction);
      
      // 如果射线没有遇到障碍物直接穿透(即到达地面或更远),则不视为滑坡
      if( flFraction >= 1.0 )
      {
            free_tr2(ptr); // 释放追踪实体所占资源
            return 0;
      }
      
      // 获取碰撞点的法线向量,用于进一步分析
      get_tr2(ptr, TR_vecPlaneNormal, dest);
      free_tr2(ptr); // 释放追踪实体

      // 这里直接检查碰撞面法线的Z分量是否小于等于0.7来决定是否滑坡
      return dest <= 0.7; // 若玩家脚下表面接近水平,则认为是在滑坡

    }
    // 如果玩家不存活,直接返回不是在滑坡
    return 0;
}

代码来源:https://forums.alliedmods.net/showpost.php?p=2045545&postcount=6

w854625286 发表于 2024-7-4 11:04:55

很好很强大

wangjialin 发表于 2024-8-22 22:09:25

k1nader 发表于 2024-5-27 20:30
代码来源:https://forums.alliedmods.net/showpost.php?p=2045545&postcount=6

卧槽 你是2哥还是k哥本人?
页: [1]
查看完整版本: [cs1.6] 如何判断玩家是否在滑坡