Ensure kicking player has FL_FAKECLIENT bit set and his name length greater than zero.

Replaced "_mm_load_ss" with "_mm_set1_ps" in A_sqrtf. Should fix minor problems.

When simulate sound play for bots, verify that issuer origin is not zero.

Enable by default smart bot kick management for autovacation.
This commit is contained in:
jeefo 2016-10-29 21:01:41 +03:00
commit 684637df03
3 changed files with 23 additions and 14 deletions

View file

@ -30,7 +30,6 @@
#endif #endif
#ifdef ENABLE_SSE_INTRINSICS #ifdef ENABLE_SSE_INTRINSICS
#include <xmmintrin.h>
#include <emmintrin.h> #include <emmintrin.h>
#endif #endif
@ -150,22 +149,23 @@ namespace Math
const float MATH_R2D = 180.0f / MATH_PI; const float MATH_R2D = 180.0f / MATH_PI;
#ifdef ENABLE_SSE_INTRINSICS #ifdef ENABLE_SSE_INTRINSICS
// //
// Function: mm_abs // Function: sse_abs
// //
// mm version if abs // mm version if abs
// //
static inline __m128 mm_abs (__m128 val) static inline __m128 sse_abs (__m128 val)
{ {
return _mm_andnot_ps (_mm_castsi128_ps (_mm_set1_epi32 (0x80000000)), val); return _mm_andnot_ps (_mm_castsi128_ps (_mm_set1_epi32 (0x80000000)), val);
}; };
// //
// Function: mm_sine // Function: sse_sine
// //
// mm version if sine // mm version if sine
// //
static inline __m128 mm_sine (__m128 inp) static inline __m128 sse_sine (__m128 inp)
{ {
__m128 pi2 = _mm_set1_ps (MATH_PI * 2); __m128 pi2 = _mm_set1_ps (MATH_PI * 2);
__m128 val = _mm_cmpnlt_ps (inp, _mm_set1_ps (MATH_PI)); __m128 val = _mm_cmpnlt_ps (inp, _mm_set1_ps (MATH_PI));
@ -175,12 +175,12 @@ namespace Math
val = _mm_cmpngt_ps (inp, _mm_set1_ps (-MATH_PI)); val = _mm_cmpngt_ps (inp, _mm_set1_ps (-MATH_PI));
val = _mm_and_ps (val, pi2); val = _mm_and_ps (val, pi2);
inp = _mm_add_ps (inp, val); inp = _mm_add_ps (inp, val);
val = _mm_mul_ps (mm_abs (inp), _mm_set1_ps (-4.0f / (MATH_PI * MATH_PI))); val = _mm_mul_ps (sse_abs (inp), _mm_set1_ps (-4.0f / (MATH_PI * MATH_PI)));
val = _mm_add_ps (val, _mm_set1_ps (4.0f / MATH_PI)); val = _mm_add_ps (val, _mm_set1_ps (4.0f / MATH_PI));
__m128 res = _mm_mul_ps (val, inp); __m128 res = _mm_mul_ps (val, inp);
val = _mm_mul_ps (mm_abs (res), res); val = _mm_mul_ps (sse_abs (res), res);
val = _mm_sub_ps (val, res); val = _mm_sub_ps (val, res);
val = _mm_mul_ps (val, _mm_set1_ps (0.225f)); val = _mm_mul_ps (val, _mm_set1_ps (0.225f));
res = _mm_add_ps (val, res); res = _mm_add_ps (val, res);
@ -196,7 +196,7 @@ namespace Math
static inline float A_sqrtf (float value) static inline float A_sqrtf (float value)
{ {
#ifdef ENABLE_SSE_INTRINSICS #ifdef ENABLE_SSE_INTRINSICS
return _mm_cvtss_f32 (_mm_sqrt_ss (_mm_load_ss (&value))); return _mm_cvtss_f32 (_mm_sqrt_ss (_mm_set1_ps (value)));
#else #else
return sqrtf (value); return sqrtf (value);
#endif #endif
@ -210,7 +210,7 @@ namespace Math
static inline float A_sinf (float value) static inline float A_sinf (float value)
{ {
#ifdef ENABLE_SSE_INTRINSICS #ifdef ENABLE_SSE_INTRINSICS
return _mm_cvtss_f32 (mm_sine (_mm_set1_ps (value))); return _mm_cvtss_f32 (sse_sine (_mm_set1_ps (value)));
#else #else
return sinf (value); return sinf (value);
#endif #endif
@ -224,7 +224,7 @@ namespace Math
static inline float A_cosf (float value) static inline float A_cosf (float value)
{ {
#ifdef ENABLE_SSE_INTRINSICS #ifdef ENABLE_SSE_INTRINSICS
return _mm_cvtss_f32 (mm_sine (_mm_set1_ps (value + MATH_PI / 2.0f))); return _mm_cvtss_f32 (sse_sine (_mm_set1_ps (value + MATH_PI / 2.0f)));
#else #else
return cosf (value); return cosf (value);
#endif #endif
@ -238,7 +238,7 @@ namespace Math
static inline void A_sincosf (float rad, float *sine, float *cosine) static inline void A_sincosf (float rad, float *sine, float *cosine)
{ {
#ifdef ENABLE_SSE_INTRINSICS #ifdef ENABLE_SSE_INTRINSICS
__m128 m_sincos = mm_sine (_mm_set_ps (0.0f, 0.0f, rad + MATH_PI / 2.f, rad)); __m128 m_sincos = sse_sine (_mm_set_ps (0.0f, 0.0f, rad + MATH_PI / 2.f, rad));
__m128 m_cos = _mm_shuffle_ps (m_sincos, m_sincos, _MM_SHUFFLE (0, 0, 0, 1)); __m128 m_cos = _mm_shuffle_ps (m_sincos, m_sincos, _MM_SHUFFLE (0, 0, 0, 1));
*sine = _mm_cvtss_f32 (m_sincos); *sine = _mm_cvtss_f32 (m_sincos);

View file

@ -10,7 +10,7 @@
#include <core.h> #include <core.h>
ConVar yb_autovacate ("yb_autovacate", "1"); ConVar yb_autovacate ("yb_autovacate", "1");
ConVar yb_autovacate_smart_kick ("yb_autovacate_smart_kick", "0"); ConVar yb_autovacate_smart_kick ("yb_autovacate_smart_kick", "1");
ConVar yb_quota ("yb_quota", "0", VT_NORMAL); ConVar yb_quota ("yb_quota", "0", VT_NORMAL);
ConVar yb_quota_mode ("yb_quota_mode", "normal"); ConVar yb_quota_mode ("yb_quota_mode", "normal");
@ -1331,11 +1331,16 @@ void Bot::Kick (bool keepQuota)
{ {
// this function kick off one bot from the server. // this function kick off one bot from the server.
auto username = STRING (pev->netname);
if (!(pev->flags & FL_FAKECLIENT) || IsNullString (username))
return;
// clear fakeclient bit immediately // clear fakeclient bit immediately
pev->flags &= ~FL_FAKECLIENT; pev->flags &= ~FL_FAKECLIENT;
engine.IssueCmd ("kick \"%s\"", STRING (pev->netname)); engine.IssueCmd ("kick \"%s\"", username);
engine.CenterPrintf ("Bot '%s' kicked", STRING (pev->netname)); engine.CenterPrintf ("Bot '%s' kicked", username);
// keep quota number up to date // keep quota number up to date
if (!keepQuota) if (!keepQuota)

View file

@ -722,6 +722,10 @@ void SoundAttachToClients (edict_t *ent, const char *sample, float volume)
return; return;
const Vector &origin = engine.GetAbsOrigin (ent); const Vector &origin = engine.GetAbsOrigin (ent);
if (origin.IsZero ())
return;
int index = engine.IndexOfEntity (ent) - 1; int index = engine.IndexOfEntity (ent) - 1;
if (index < 0 || index >= engine.MaxClients ()) if (index < 0 || index >= engine.MaxClients ())