Merhaba,
Bu eklentiyi neden istiyorum ?
Surf & Bhop & Kz sunucularında yüksek ping ile zamanlayıcının geç başlaması açığı kullanılıyor. Bu açık, ani ping artışlarından kaynaklanıyor. Ani ping artışı olduğu zaman, zamanlayıcı geç başlıyor ve kolay yoldan rekor kırıyorlar. Bunun için araştırma yaptım ancak istediğim gibi bir eklenti bulamadım.
İsteğe Gelirsek;
Belli bir ping'in üstüne çıkan oyuncu pingi çıkmadan önceki konumu baz alınıp oraya ışınlanmasını (teleport) istiyorum. Örneğin bir futbol sahası düşünün, orta sahayı geçince zamanlayıcı başlıyor. Oyuncu orta sahadan kaleye doğru koşmaya başladı ve ani pingi çıkmasıyla zamanlayıcı geç başladı istemeden bug yaptı, eklenti bu ping loss choke artışını anlayıp tekrardan eski konumu olan orta sahaya ışınlanmasını istiyorum. (Eklenti oyuncunun eski konumunu 3-5 saniyede bir kontrol ederse daha iyi bir sonuç alabiliriz.)
Destekleriniz için şimdiden teşekkürler,
İyi Forumlar,
Konu
PHP Kod:
#pragma semicolon 1
#define DEBUG
#define PLUGIN_AUTHOR ""
#define PLUGIN_VERSION "0.00"
#include < sourcemod >
#include < sdktools >
#include < smlib >
#include < surftimer >
#pragma newdecls required
ConVar ping_time, ping_difference;
float g_vec[ MAXPLAYERS + 1 ][ 3 ], g_angle[ MAXPLAYERS + 1 ][ 3 ];
Handle ping_timer[ MAXPLAYERS + 1 ];
int client_ping[ MAXPLAYERS + 1 ];
public Plugin myinfo =
{
name = "",
author = PLUGIN_AUTHOR,
description = "",
version = PLUGIN_VERSION,
url = ""
};
public void OnPluginStart( )
{
HookEvent( "player_spawn", EventPlayerSpawn );
ping_time = CreateConVar( "ping_time", "5", "Kaç saniyede 1 pingin kontrol edilceğini ayarlar" );
ping_difference = CreateConVar( "ping_difference", "10", "Maksimum ping farkini ayarlar" );
}
public void OnClientDisconnect( int client )
{
if( ping_timer[ client ] != null ) delete ping_timer[ client ];
}
public Action EventPlayerSpawn( Event event, const char[ ] name, bool dontbroadcast )
{
int client = GetClientOfUserId( event.GetInt( "userid" ) );
if( ping_timer[ client ] != null ) delete ping_timer[ client ];
if( IsClientInGame( client ) )
{
GetClientAbsOrigin( client, g_vec[ client ] );
GetClientEyeAngles( client, g_angle[ client ] );
client_ping[ client ] = Client_GetFakePing( client );
ping_timer[ client ] = CreateTimer( GetConVarFloat( ping_time ), CheckPing, GetClientUserId( client ), TIMER_REPEAT );
}
}
public Action CheckPing( Handle timer, int userid )
{
int client = GetClientOfUserId( userid );
if( !IsValidClient( client ) ) return Plugin_Stop;
if( IsClientInGame( client ) && IsPlayerAlive( client ) )
{
if( Math_Abs( Client_GetFakePing( client ) - client_ping[ client ] ) >= GetConVarInt( ping_difference ) )
{
surftimer_SafeTeleport( client, g_vec[ client ], g_angle[ client ], NULL_VECTOR );
client_ping[ client ] = Client_GetFakePing( client );
}
else
{
GetClientAbsOrigin( client, g_vec[ client ] );
GetClientEyeAngles( client, g_angle[ client ] );
client_ping[ client ] = Client_GetFakePing( client );
}
}
return Plugin_Continue;
}
stock bool IsValidClient( int client )
{
if( 1 <= client <= MaxClients )
{
return true;
}
else
{
return false;
}
}
Son Düzenleme: 05-08-2020, 22:21, Düzenleyen: Anıl Can.
)


