搜索
查看: 254|回复: 1

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

[复制链接]
发表于 2024-5-21 22:23:44 | 显示全部楼层 |阅读模式 来自 香港
我要做KZ 的插件  , 玩家存点的时候 不知道 是不是在滑坡  判断在不在滑坡 怎么去写呢
发表于 2024-5-27 20:30:50 | 显示全部楼层 来自 四川成都
  1. IsUserSurfing(id)
  2. {
  3.     // 首先检查玩家是否还活着,只有活着的玩家才能进行滑坡
  4.     if( is_user_alive(id) )
  5.     {
  6.         // 获取玩家的状态标志,检查玩家是否站在地上
  7.         new flags = entity_get_int(id, EV_INT_flags);
  8.         if( flags & FL_ONGROUND )
  9.         {
  10.             // 如果玩家正处于地面,则肯定不是在滑坡,直接返回0
  11.             return 0;
  12.         }

  13.         // 准备进行射线检测,先获取玩家当前位置
  14.         new Float:origin[3], Float:dest[3];
  15.         entity_get_vector(id, EV_VEC_origin, origin);
  16.         
  17.         // 设置射线检测的目标点,在玩家脚下稍下的位置
  18.         dest[0] = origin[0]; // X坐标不变
  19.         dest[1] = origin[1]; // Y坐标不变
  20.         dest[2] = origin[2] - 1.0; // Z坐标减小,模拟脚部位置

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

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

  42.     }
  43.     // 如果玩家不存活,直接返回不是在滑坡
  44.     return 0;
  45. }
复制代码


代码来源:https://forums.alliedmods.net/sh ... 545&postcount=6
回复

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 注个册吧

快速回复 返回顶部 返回列表