Jump to content
  • Chmurka
  • Boróweczka
  • Jabłuszko
  • Limonka
  • Czekoladka
  • Węgielek
szogun

[Rozwiązane] Crashe serwera SourceHook_FHCls_IServerGameDLLGameFramefalse

Recommended Posts

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

 

Edited by szogun

Share this post


Link to post
Share on other sites

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

Edited by szogun

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Edited by szogun

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
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;
}

 

  • Lubię to! 2

Share this post


Link to post
Share on other sites

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 

Share this post


Link to post
Share on other sites

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;
} 

 

 

  • Lubię to! 3
  • Wow! 1

Share this post


Link to post
Share on other sites

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

Edited by szogun

Share this post


Link to post
Share on other sites
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ł

Edited by szogun

Share this post


Link to post
Share on other sites

@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;
}

 

 

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

Nasza historia

Na początku byliśmy małą grupą internetowych znajomych, którzy stwierdzili, że potrzebne jest solidne forum, na którym znajdą się ludzie z dużą wiedzą programistyczną ukierunkowaną na CS:GO. Pomysł powstał na początku 2018 roku, a parę miesięcy później, 19 kwietnia, powstała ta strona internetowa. Jako alternatywna odpowiedź na inne tego typu miejsca, poważnie podeszliśmy do tematu, najpierw tłumacząc angielską dokumentację SourceMod'a na język polski, a potem pisząc rozległe poradniki i wypełniając forum najpotrzebniejszymi rzeczami dla właścicieli serwerów i programistów. Cała nasza Ekipa jest dumna z pracy jaką w to włożyliśmy i cieszymy się że zbierają się wokół nas zarówno ludzie znający tematy sourcepawn'a i konfiguracji, jak i również nowe twarze w tym "biznesie", którym z chęcią niesiemy wiedzę oraz pomoc w rozwiązywaniu problemów.

Największe modyfikacje serwerowe

×
×
  • Create New...