|
|
- stock setWeaponHoming( Weapon, Velocity, Float: DetectableRange )
- {
- new Target, Float: Range[33];
- for( new i = 1; i <= 32; i++ )// 存储有效范围内可被探测到的气功波与玩家的距离[] Save the range between the client and the beam if the client is in the detectable range
- {
- if( is_user_connected( i ) )
- {
- if( is_user_alive( i ) && i != pev( Weapon, pev_owner ) )
- {
- if( entity_range( Weapon, i ) <= DetectableRange )
- {
- Range = entity_range( Weapon, i );
- Target = i;
- }
- }
- }
- }
- for( new n = 1; n <= 32; n++ )// 取出离气功波最近的玩家[] Get the index of the client who is nearest the beam
- {
- if( Range[n] < Range[Target] && Range[n] != 0.0 )
- {
- Target = n;
- }
- }
- new CORE[3];
- CORE[0] = Weapon;
- CORE[1] = Target;
- CORE[2] = Velocity;
- set_task( 0.1, "WeaponTrackThink", Weapon, CORE, 3, "b" )// 每过0.1秒刷新一次气功波对目标的向量[] Refresh the vector of the beam to the client every 0.1s
- }
- public WeaponTrackThink( CORE[] )
- {
- new Weapon = CORE[0];
- new Target = CORE[1];
- new Velocity = CORE[2];
- if( Target != 0 && is_user_alive( Target ) )
- {
- /* 获取气功波和目标的坐标[] Get the origins of the beam and the target */
- new Float: vec[3], Float: WeaponOrg[3], Float: TargetOrg[3];
- pev( Weapon, pev_origin, WeaponOrg );
- pev( Target, pev_origin, TargetOrg );
- /* 通过坐标计算向量[] Calculate velocity by origins */
- vec[0] = TargetOrg[0] - WeaponOrg[0];
- vec[1] = TargetOrg[1] - WeaponOrg[1];
- vec[2] = TargetOrg[2] - WeaponOrg[2];
- xs_vec_normalize( vec, vec );
- /* 修正实体角度[] Update the angles of the entity */
- new Float: ang[3];
- vector_to_angle( vec, ang );
- set_pev( Weapon, pev_angles, ang );
- /* 设置实体速度[] Give velocity to the beam */
- xs_vec_mul_scalar(vec, float( Velocity ), vec);
- set_pev( Weapon, pev_velocity, vec );
- }
- }
复制代码 |
|