Skocz do zawartości
szogun

[Rozwiązane] Crashe serwera SourceHook_FHCls_IServerGameDLLGameFramefalse

Rekomendowane odpowiedzi

Mam mały problem od jakiegoś czasu serwer ponownie znów mi zaczał crashować w losowych momentach.

Jedynie w momencie crasha logi jakie wyłapuje to przez https://crash.limetech.org/bcm7bpkz6cky
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami!

przeglądając cały ten log znalazłem w nim że serwer crashuje przez tą funkcję

sourcemod.2.csgo.so!__SourceHook_FHCls_IServerGameDLLGameFramefalse::Func [sourcemod.cpp:54 + 0xc] 

idąc dalej tym tropem trafiłem na githuba, który wskazuje konkretną linijkę https://github.com/alliedmodders/sourcemod/blob/cb886d45247f9832f19097c2042254ceeee689a7/core/sourcemod.cpp#L54
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami!

SH_DECL_HOOK1_void(IServerGameDLL, GameFrame, SH_NOATTRIB, false, bool);

 

sm plugins list - https://pastebin.com/qmGZwsft
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami!

exts - https://pastebin.com/ndKaY08Y
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami!

sm - https://pastebin.com/G8zbxtaV
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami!

mm - https://pastebin.com/dCUZSAiC
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami!

 

Crashe występują nie zależnie od wersji sm czy mm która była już aktualizowana

 

Edytowane przez szogun

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Podpinam się do pytania. Na moim serwerze również występują crashe przez tą funkcję.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Tutaj: 

 

Występuje identyczny crash, sprawdźcie czy rozwiązanie zawarte w temacie pomogło ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Obecnie mam ustatwione

mp_t_default_melee weapon_knife

mp_t_default_secondary weapons_glock

 

Niestety to usuwa ekwipunek co runde

mp_equipment_reset_rounds

Edytowane przez szogun

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Co z komendami podanymi powyżej? Testowałeś czy dane wartości działają?

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Testowałem pierwsze dwie dają albo zabierają podstawową broń, ostatnia trzecia komenda co runde usuwa ekwipunek więc ona odpada

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie pytałem co one robią, pytałem czy właściwie ustawienie wartości tych komend kompletnie rozwiązuje problem i nie powoduje więcej crashy. Nieważne czy są skutki uboczne, bo może to co znalazł Brum Brum być uniwersalnym rozwiązaniem dla crashy tego typu. Jeśli tak, jesteśmy o krok bliżej rozwiązania problemu bez skutków ubocznych (można napisać plugin by przenosił ekwipunek na następną rundę). Dlatego proszę przetestuj Ty lub @Yamakashi skoro ma ten sam problem

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeżeli mam serwer ffa to poprawym ustawieniem będzie no chyba że ja się mylę

mp_t_default_melee									weapon_knife
mp_t_default_secondary								weapon_glock

oraz

mp_ct_default_melee									weapon_knife
mp_ct_default_secondary								weapon_hkp2000

Ostatniej komendy nie mam ja przetestować z racji, właśnie na ekwipunek gdyż zaraz ludzie się denerwują a bynajmniej na 24h bym musiał ją zostawić bo do crasha dochodzi w losowych momentach

Edytowane przez szogun

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

@Vasto_Lordedał byś radę zrobić w/w plugin na przenoszenie ekwipunku co rundę abym mógł tą ostatnią komendę przetestować

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

W moim przypadku również mam serwer Jailbreak tak jak @Brum Brum i podane komendy pomogły.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Niestety ale jb od ffa się rożni, stawiam że tylko jedna komenda okazał wam się pomocna , ponieważ dajecie knife przez inny plugin który w ekwipuku gracza potrafi się dublować

czyli usuwając ekwipunek co rundę powinno się okazać skuteczne co już na ffa się nie sprawdzi bo usuwa graczom bronie,kevlar itp  mp_equipment_reset_rounds

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Czyli błąd powoduje się strikte przez bug gdy daje się nóż graczowi i przez przypadek gra rejestruje że gracz na raz ma 2 noże?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Tak stawiam bo jak napisałem wyżej wyłączenie pluginu typu !ws rozwiązało problem, googlując znalazłem kilka problemów które wskazywały na plugin knife oraz aby dodać właśnie ową komendę na resetowanie ekwipunku gracza

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
7 minut temu, szogun napisał:

Tak stawiam bo jak napisałem wyżej wyłączenie pluginu typu !ws rozwiązało problem, googlując znalazłem kilka problemów które wskazywały na plugin knife oraz aby dodać właśnie ową komendę na resetowanie ekwipunku gracza

Spróbuj może usuwać nóż graczom pod koniec rundy/przed startem rundy

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Tylko teraz nasuwają mi się dwa pytania skoro mamy w csgo rożne noże to użycie weapons_knife da tylko standardowy nuż czy się mylę

GivePlayerItem(client, "weapon_knife");

W przypadku uwania samego noża bym musiał zrobić aby plugin wykrył jaki ma dany gracz na koniec rundy a na początku go przywrócić, więc to już chyba po za moje granice

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
17 minut temu, szogun napisał:

Tylko teraz nasuwają mi się dwa pytania skoro mamy w csgo rożne noże to użycie weapons_knife da tylko standardowy nuż czy się mylę


GivePlayerItem(client, "weapon_knife");

W przypadku uwania samego noża bym musiał zrobić aby plugin wykrył jaki ma dany gracz na koniec rundy a na początku go przywrócić, więc to już chyba po za moje granice

Plugin na noże sam zmieni nóż na inny. Samo GivePlayerItem(client,"weapon_knife"); starczy, tylko po co jak możesz ustawić komendę csową która po spawnie gracza daje mu nóż?

Nie testowałem, ale powinno działać.

#include <cstrike>
#include <sdktools>

#pragma semicolon 1
#pragma newdecls required


public void OnPluginStart()
{
	HookEvent("round_end", Event_RoundEnd);
}

public Action Event_RoundEnd(Event event, const char[] name, bool dontBroadcast)
{
	for (int i = 1; i < MaxClients; i++)
	{
		if (IsValidClient(i) && IsPlayerAlive(i))
		{
			int weapon = GetPlayerWeaponSlot(i, CS_SLOT_KNIFE);
			if (weapon != -1)RemoveEdict(weapon);
		}
	}
}

public bool IsValidClient(int client)
{
	if (!(1 <= client <= MaxClients) || !IsClientInGame(client) || !IsClientConnected(client) || IsFakeClient(client) || IsClientSourceTV(client))
		return false;
	
	return true;
}

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Po intensywnym szukaniu rozwiązania w internecie natrafiłem na taki kawałek kodu

public void OnEntityCreated(int entity, const char[] classname) 
{ 
    if (StrEqual(classname, "game_player_equip")) 
    { 
        SDKHook(entity, SDKHook_Spawn, OnGamePlayerEquipSpawn); 
    } 
} 

public Action OnGamePlayerEquipSpawn(int entity) 
{ 
    /** Flags: 1 - use only, 4 - strip same weapon type **/ 
     
    SetEntProp(entity, Prop_Data, "m_spawnflags", 5); 
} 

Spod tego linku: https://forums.alliedmods.net/showthread.php?t=279263&amp;page=7
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami!

 

Skompilujesz, wgrasz i zobaczysz czy naprawia błąd? Jeśli nie to postaram się zrobić ten plugin na przeniesienie ekwipunku 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Przygotowałem już plugin pod przenoszenie ekwipunku gracza na nową rundę dziś przetestowałem i wszystko działa dobrze. Kod niżej
 

Spoiler

#include <sdktools>
#include <cstrike>

#pragma semicolon 1
#pragma newdecls required

char PrimaryWeapon[MAXPLAYERS + 1][32];
char SecondaryWeapon[MAXPLAYERS + 1][32];

bool HaveWeapons[MAXPLAYERS + 1];

public Plugin myinfo = 
{
	name = "ADEPT -> Save Weapon to next round", 
	description = "Autorski plugin studioADEPT.net", 
	author = "Brum Brum", 
	version = "1.0", 
	url = "http://www.StudioADEPT.net/forum"
};

public void OnPluginStart()
{
	HookEvent("round_end", Event_RoundEnd);
	HookEvent("player_spawn", Event_PlayerSpawn);
	HookEvent("player_death", Event_PlayerDeath);
}

public void OnMapStart()
{
	ServerCommand("mp_ct_default_secondary .");
	ServerCommand("mp_t_default_secondary .");
	ServerCommand("mp_equipment_reset_rounds 1");
}

public Action Event_RoundEnd(Event event, const char[] name, bool dontBroadcast)
{
	for (int i = 1; i < MaxClients; i++)
	{
		if (IsValidClient(i) && IsPlayerAlive(i))
		{
			char primary[32], secondary[32];
			int weapon = GetPlayerWeaponSlot(i, CS_SLOT_PRIMARY);
			if (weapon != -1)
			{
				GetEntityClassname(weapon, primary, sizeof(primary));
				PrimaryWeapon[i] = primary;
			}
			int sweapon = GetPlayerWeaponSlot(i, CS_SLOT_SECONDARY);
			if (sweapon != -1)
			{
				GetEntityClassname(sweapon, secondary, sizeof(secondary));
				SecondaryWeapon[i] = secondary;
			}
			HaveWeapons[i] = true;
		}
	}
}

public Action Event_PlayerSpawn(Event event, const char[] name, bool dontBroadcast)
{
	int client = GetClientOfUserId(event.GetInt("userid"));
	
	if (HaveWeapons[client])
	{
		GivePlayerItem(client, PrimaryWeapon[client]);
		GivePlayerItem(client, SecondaryWeapon[client]);
	}
	else
	{
		if (GetClientTeam(client) == CS_TEAM_CT) {
			GivePlayerItem(client, "weapon_usp_silencer");
		}
		else if (GetClientTeam(client) == CS_TEAM_T)
		{
			GivePlayerItem(client, "weapon_glock");
		}
	}
	HaveWeapons[client] = false;
}

public Action Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast)
{
	int client = GetClientOfUserId(event.GetInt("userid"));
	
	HaveWeapons[client] = false;
}

public bool IsValidClient(int client)
{
	if (!(1 <= client <= MaxClients) || !IsClientInGame(client) || !IsClientConnected(client) || IsFakeClient(client) || IsClientSourceTV(client))
		return false;
	
	return true;
} 

 

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Obecnie testuje jeszcze inna metodę dodanie parametru nowatchdog polecony przez hosting

Edytowane przez szogun

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Dnia 26.02.2019 o 10:04, Brum Brum napisał:

Przygotowałem już plugin pod przenoszenie ekwipunku gracza na nową rundę dziś przetestowałem i wszystko działa dobrze. Kod niżej
 

 
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami! Odkryj ukrytą treść


#include <sdktools>
#include <cstrike>

#pragma semicolon 1
#pragma newdecls required

char PrimaryWeapon[MAXPLAYERS + 1][32];
char SecondaryWeapon[MAXPLAYERS + 1][32];

bool HaveWeapons[MAXPLAYERS + 1];

public Plugin myinfo = 
{
	name = "ADEPT -> Save Weapon to next round", 
	description = "Autorski plugin studioADEPT.net", 
	author = "Brum Brum", 
	version = "1.0", 
	url = "http://www.StudioADEPT.net/forum"
};

public void OnPluginStart()
{
	HookEvent("round_end", Event_RoundEnd);
	HookEvent("player_spawn", Event_PlayerSpawn);
	HookEvent("player_death", Event_PlayerDeath);
}

public void OnMapStart()
{
	ServerCommand("mp_ct_default_secondary .");
	ServerCommand("mp_t_default_secondary .");
	ServerCommand("mp_equipment_reset_rounds 1");
}

public Action Event_RoundEnd(Event event, const char[] name, bool dontBroadcast)
{
	for (int i = 1; i < MaxClients; i++)
	{
		if (IsValidClient(i) && IsPlayerAlive(i))
		{
			char primary[32], secondary[32];
			int weapon = GetPlayerWeaponSlot(i, CS_SLOT_PRIMARY);
			if (weapon != -1)
			{
				GetEntityClassname(weapon, primary, sizeof(primary));
				PrimaryWeapon[i] = primary;
			}
			int sweapon = GetPlayerWeaponSlot(i, CS_SLOT_SECONDARY);
			if (sweapon != -1)
			{
				GetEntityClassname(sweapon, secondary, sizeof(secondary));
				SecondaryWeapon[i] = secondary;
			}
			HaveWeapons[i] = true;
		}
	}
}

public Action Event_PlayerSpawn(Event event, const char[] name, bool dontBroadcast)
{
	int client = GetClientOfUserId(event.GetInt("userid"));
	
	if (HaveWeapons[client])
	{
		GivePlayerItem(client, PrimaryWeapon[client]);
		GivePlayerItem(client, SecondaryWeapon[client]);
	}
	else
	{
		if (GetClientTeam(client) == CS_TEAM_CT) {
			GivePlayerItem(client, "weapon_usp_silencer");
		}
		else if (GetClientTeam(client) == CS_TEAM_T)
		{
			GivePlayerItem(client, "weapon_glock");
		}
	}
	HaveWeapons[client] = false;
}

public Action Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast)
{
	int client = GetClientOfUserId(event.GetInt("userid"));
	
	HaveWeapons[client] = false;
}

public bool IsValidClient(int client)
{
	if (!(1 <= client <= MaxClients) || !IsClientInGame(client) || !IsClientConnected(client) || IsFakeClient(client) || IsClientSourceTV(client))
		return false;
	
	return true;
} 

 

 

Wrzuciłem twój plugin i od razu zauważyłem dwa błędy jednej osobie nie dało pitstoletu stawiam że ma inną broń niż upsa domyślnie innemu dodało mp7 zamiast

 

Jak ktoś ma jeszcze jakieś ciekawe pomysły to może podesłać, jak na razie parametr nowatchdog sie nie sprawdził

Edytowane przez szogun

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

@p4strike Musisz jego poprawioną wersję wrzucić, lecz porada @Vasto_Lorde jak na razie okazuje się skuteczna.

Zainteresuj się również parametrem nowatchdog tak jak pisałem że nie działa jednak się myliłem (crash spowodowany był zawieszaniem się serwera przez plugin który korzysta z mysql ) od czasu zastosowania poprawki @Vasto_Lorde z parametrem nowatchdog  sprawdza się najlepiej, jak serwer czasami potrafił 4 razy dziennie paść tak teraz działa już dłuższy czas , przeanalizuj  swoje logi przy crashu jak ci się pojawi w nim *** WARNING: Watchdog timer exceeded, aborting! znaczy że trzeba dodać parametr do polecenia startowego, śmiem twierdzić że plugin weapons & knife jednak nie wpływa na powodowane crashe

Spoiler

#include <sdktools>
#include <cstrike>

#pragma semicolon 1
#pragma newdecls required

char PrimaryWeapon[MAXPLAYERS + 1][32];
char SecondaryWeapon[MAXPLAYERS + 1][32];

bool HaveWeapons[MAXPLAYERS + 1];

public Plugin myinfo = 
{
    name = "ADEPT -> Save Weapon to next round", 
    description = "Autorski plugin studioADEPT.net", 
    author = "Brum Brum", 
    version = "1.0", 
    url = "http://www.StudioADEPT.net/forum"
};

public void OnPluginStart()
{
    HookEvent("round_end", Event_RoundEnd);
    HookEvent("player_spawn", Event_PlayerSpawn);
    HookEvent("player_death", Event_PlayerDeath);
}

public void OnMapStart()
{
	ServerCommand("mp_ct_default_secondary weapon_hkp2000");
	ServerCommand("mp_t_default_secondary weapon_glock");
	ServerCommand("mp_equipment_reset_rounds 1");
}

public Action Event_RoundEnd(Event event, const char[] name, bool dontBroadcast)
{
    if (IsWarmup())return;
    
    for (int i = 1; i < MaxClients; i++)
    {
        if (IsValidClient(i) && IsPlayerAlive(i))
        {
            char primary[32], secondary[32];
            int weapon = GetPlayerWeaponSlot(i, CS_SLOT_PRIMARY);
            if (weapon != -1)
            {
                GetEntityClassname(weapon, primary, sizeof(primary));
                PrimaryWeapon[i] = primary;
            }
            int sweapon = GetPlayerWeaponSlot(i, CS_SLOT_SECONDARY);
            if (sweapon != -1)
            {
                GetEntityClassname(sweapon, secondary, sizeof(secondary));
                SecondaryWeapon[i] = secondary;
            }
            HaveWeapons[i] = true;
        }
    }
}

public Action Event_PlayerSpawn(Event event, const char[] name, bool dontBroadcast)
{
    if (IsWarmup())return;
    
    int client = GetClientOfUserId(event.GetInt("userid"));
    
    if (HaveWeapons[client])
    {
        GivePlayerItem(client, PrimaryWeapon[client]);
        GivePlayerItem(client, SecondaryWeapon[client]);
    }
    else
    {
        if (GetClientTeam(client) == CS_TEAM_CT) 
        {
            GivePlayerItem(client, "weapon_usp_silencer");
        }
        else if (GetClientTeam(client) == CS_TEAM_T)
        {
            GivePlayerItem(client, "weapon_glock");
        }
    }
    HaveWeapons[client] = false;
}

public Action Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    
    HaveWeapons[client] = false;
}

public void OnClientDisconnect(int client)
{
    HaveWeapons[client] = false;
}

public bool IsValidClient(int client)
{
    if (!(1 <= client <= MaxClients) || !IsClientInGame(client) || !IsClientConnected(client) || IsFakeClient(client) || IsClientSourceTV(client))
        return false;
    
    return true;
}

bool IsWarmup()
{
    int warmup = GameRules_GetProp("m_bWarmupPeriod", 4, 0);
    if (warmup == 1)return true;
    else return false;
}

 

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

W debug.log po ostatnim crash mam takie coś:

 

Program terminated with signal SIGABRT, Aborted.
#0  0xf77c3c89 in ?? ()
[Current thread is 1 (LWP 25577)]
#0  0xf77c3c89 in ?? ()
Backtrace stopped: Cannot access memory at address 0xffeb4fe0
No symbol table info available.
eax            0x0	0
ecx            0xffeb4ff0	-1355792
edx            0x0	0
ebx            0x2	2
esp            0xffeb4fe0	0xffeb4fe0
ebp            0xffeb4ff0	0xffeb4ff0
esi            0x8	8
edi            0x0	0
eip            0xf77c3c89	0xf77c3c89
eflags         0x200206	[ PF IF ID ]
cs             0x23	35
ss             0x2b	43
ds             0x2b	43
es             0x2b	43
fs             0x3	3
gs             0x63	99
No shared libraries loaded at this time.
End of Source crash report

Tak tylko jak wyłączyłem ws i knife to już pare godzin serwer nie wywaliło zostawię jeszcze do jutra i zobaczę.  A co do *** WARNING: Watchdog timer exceeded, aborting!  to nie natknąłem się jeszcze na taki błąd.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Zależy od hostingu ale nie które rejestrują x linijek z konsoli z przed crasha poszukaj tam

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.

×
×
  • Dodaj nową pozycję...