|
发表于 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[3], Float:dest[3];
- entity_get_vector(id, EV_VEC_origin, origin);
-
- // 设置射线检测的目标点,在玩家脚下稍下的位置
- dest[0] = origin[0]; // X坐标不变
- dest[1] = origin[1]; // Y坐标不变
- dest[2] = origin[2] - 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[2] <= 0.7; // 若玩家脚下表面接近水平,则认为是在滑坡
- }
- // 如果玩家不存活,直接返回不是在滑坡
- return 0;
- }
复制代码
代码来源:https://forums.alliedmods.net/sh ... 545&postcount=6 |
|