←  Problemy

AMXX.pl: Support AMX Mod X i SourceMod

»

Respawn crashuje serwer?

Locked

  • +
  • -
naven's Photo naven 02.06.2009

Witam, jest to część pluginu http://forums.allied...ad.php?p=549903

Więc tak, wkurzyłem się trochę i postanowiłem sam sklecić surf moda, pozbierałem kody z pluginów i połączyłem w całość, wszystkie funkcje działają ok, oprócz respawn(link do oryginału powyżej)
Początkowo nie dawałem respawnu, bo tak jak podejrzewałem to właśnie ta część crashuje serwer, po dodaniu zdarzają się crashe

Jest tego jakieś 200 linii(plus te newy, registery itd, nie załączam ich bo długo by szukać tego znowu)
Oczywiście spełnia swoją funkcję- automatyczny respawn+ say /respawn jednak crashuje serwer.

//////////////////////////////////////////
//	RZECZY ZWIĄZANE Z RESPAWNEM	//
//////////////////////////////////////////

//dodane 27.05 w szkole
public hook_DeathMsg()
{
	//log_amx("AT: hook_DeathMsg");
	
	new victim;
	victim = read_data(2);
	
	// Clipon/off
	//if(g_isClipping[victim])
	{
		remove_task(victim + 2986);
//		g_isClipping[victim] = false;
	}
	
	// Auto respawn
	if(get_pcvar_num(sv_autoresp) && get_pdata_int(victim, 114, 5) != 3)
		set_task(1.8, "task_caughtDeathSpawn", victim + 483);
	
	return FMRES_HANDLED;
}
public hook_UpdateClientData(id, sendweapons, cd_handle)
{
	//log_amx("AT: hook_UpdateClientData");
	
	// oryginał 	if(!is_user_alive(id) || !g_isClipping[id])
	if(!is_user_alive(id))
		return FMRES_IGNORED;
	
	set_cd(cd_handle, CD_ID, 0);
	
	return FMRES_HANDLED;
}
//koniec

public respawnPlayer(id)
{
	//log_amx("AT: respawnPlayer");
	
	new Float:gametime = get_gametime();
	if(nextSpawnTime[id] < gametime)
	{
		//cancelTimer(id);
		dllfunc(DLLFunc_Spawn, id);
		nextSpawnTime[id] = gametime + 3.0;
		return FMRES_IGNORED;
	}
	
	client_print(id, print_chat, "You must wait %i more seconds to respawn.", floatround(nextSpawnTime[id] - gametime, floatround_ceil));
	return FMRES_IGNORED;
}
public task_caughtDeathSpawn(id)
{
	//log_amx("AT: task_caughtDeathSpawn");
	
	id -= 483;
	if(is_user_connected(id))
		dllfunc(DLLFunc_Spawn, id);
}
public hook_TakeDamage(this, idinflictor, idattacker, Float:damage, damagebits)
{
	//log_amx("AT: hook_TakeDamage");
	
	new toggledamage;
	toggledamage = get_pcvar_num(sv_toggledamage);
	if(toggledamage == 1)
	{
		// Remove only fall damage
		if(idattacker == 0)
			return HAM_SUPERCEDE;
		else
			if(checkAutoRespawn(this, damage))
				return HAM_SUPERCEDE;
	}
	else if(toggledamage == 2)
	{
		// Remove only player damage
		if(is_user_connected(idattacker))
			return HAM_SUPERCEDE;
		else
			if(checkAutoRespawn(this, damage))
				return HAM_SUPERCEDE;
	}
	else if(toggledamage == 3)
	{
		// Remove both fall and player damage
		if(idattacker == 0 || is_user_connected(idattacker))
			return HAM_SUPERCEDE;
		else
			if(checkAutoRespawn(this, damage))
				return HAM_SUPERCEDE;
	}
	else
		if(checkAutoRespawn(this, damage))
				return HAM_SUPERCEDE;
	
	return PLUGIN_CONTINUE;
}

stock checkAutoRespawn(this, Float:damage)
{
	//log_amx("AT: checkAutoRespawn");
	
	if(get_pcvar_num(sv_autoresp))
	{
		health[this] -= damage;
		if(health[this] < 1.0)
		{
			set_pev(this, pev_health, 0.0);
			set_pev(this, pev_deadflag, DEAD_RESPAWNABLE);
			
			dllfunc(DLLFunc_Spawn, this);
			//cancelTimer(this);
			return 1;
		}
	}
	return 0;
}
public hook_KeyValue(entId, kvd_id)
{
	//log_amx("AT: hook_KeyValue");
	
	if(!pev_valid(entId))
		return FMRES_HANDLED;
	
	new className[64];
	pev(entId, pev_classname, className, 63);
	
	//if(get_pcvar_num(sv_removet))
	{
		if(containi(className, "info_player_deathmatch") != -1)
			engfunc(EngFunc_RemoveEntity, entId);
	}
	
	//if(!get_pcvar_num(sv_togglebuy))
	{
		if(containi(className, "func_buyzone") != -1)
			engfunc(EngFunc_RemoveEntity, entId);
	}
	
	if(containi(className, "func_bomb_target") != -1)
		engfunc(EngFunc_RemoveEntity, entId);
	
	return FMRES_HANDLED;
}
public task_checkConnectDead(id)
{
	//log_amx("AT: task_checkConnectDead");
	
	id -= 654;
	if(is_user_connected(id))
	{
		new team = get_pdata_int(id, 114, 5);
		if(!is_user_alive(id) && firstSpawn[id] && (team == 1 || team == 2))
		{
			// Spawn them
			set_task(1.8, "task_caughtDeathSpawn", id + 483);
		}
		else if(!is_user_alive(id) && firstSpawn[id] && (team != 1 && team != 2))
		{
			// Check again
			set_task(1.8, "task_checkConnectDead", id + 654);
		}
	}
	else if(is_user_connecting(id))
		set_task(1.8, "task_checkConnectDead", id + 654);
	
	return FMRES_HANDLED;
}

Pozdrawiam
Quote

  • +
  • -
Miczu's Photo Miczu 02.06.2009

*nie czytal wszytkiego*

Po co tyle kodu ci na respawn?
Masz jakies szczegolne wymagania co do respa???
Quote

  • +
  • -
naven's Photo naven 02.06.2009

No chodzi mi o to, żeby był automat po śmierci i po wpisaniu /respawn
I niektóre respawny spawnują bez broni czy bez napisów z hp czy coś... ten spawnuje najlepiej dlatego właśnie go chce.
Co prawda mam dalej w kodzie dawanie broni bo nie na każdej mapie są, ale z tymi napisami to tragedia trochę.
Quote

  • +
  • -
Miczu's Photo Miczu 02.06.2009

naven, jakie bronie sa ci potrzebne na surf moda? :F

Co do respawna to uzyj:

http://amxx.pl/viewtopic.php?t=3265

Tylko podepnij pod event smierci i komende to bedzie ok :>
Quote

  • +
  • -
naven's Photo naven 02.06.2009

Miczu, surf to nie mod tylko typ mapy;p
surf_1337maze- nie masz żadnej broni, a ja bez noża grać nie umiem

event śmieci to deathmsg?
Quote

  • +
  • -
Miczu's Photo Miczu 02.06.2009

Więc tak, wkurzyłem się trochę i postanowiłem sam sklecić surf moda


Jestes konsekwentny ^^

http://amxx.pl/viewtopic.php?t=2177
po co robie toturiale ktorych nikt nie czyta a pytaja o to co wnich jest?
Quote

  • +
  • -
naven's Photo naven 03.06.2009

Ah, tylko dlaczego jest DeathMsg
Wiadomość po śmierci?
Quote

  • +
  • -
Miczu's Photo Miczu 03.06.2009

Bo w momencie smierci kogos wyswietla w prawym gornym rogu ikonke o typie smierci i to jest przechwytywane. Ale w tym jest tyle informacji i natychmiast po smierci gracza, ze jest to bardziej niz wystarczajace dla nas.
Quote

  • +
  • -
naven's Photo naven 03.06.2009

Niby czaje, ale ciągle mi nie działa to:
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <cstrike>

public plugin_init() {
    register_event("DeathMsg", "DeathMsg", "a")
}

public DeathMsg()
{
    /*ten kod mi się nie przyda? Nie potrzebuje wiedzieć kto umarl, czemu umarł, ważne że umarł?
    new kid = read_data(1)    //zabujca
   
    new vid = read_data(2)    // ofiara
   
    new hs = read_data(3)    // HeadShot (1 == true)
   
    new weapon[64]       
    read_data(4,weapon,63)    //krotka nazwa broni (bez weapon_ / CSW_ )*/
    set_task(1.0, "respawn_player")

}

public respawn_player(id)
{     
    if (!is_user_connected(id) || is_user_alive(id) || cs_get_user_team(id) == CS_TEAM_SPECTATOR)         return; 

    set_pev(id, pev_deadflag, DEAD_RESPAWNABLE)
    dllfunc(DLLFunc_Think, id)
    if (is_user_bot(id) && pev(id, pev_deadflag) == DEAD_RESPAWNABLE)
     {
         dllfunc(DLLFunc_Spawn, id)
     }
}


a tutaj?
if (!is_user_connected(id) || is_user_alive(id) || cs_get_user_team(id) == CS_TEAM_SPECTATOR)         return;


Pisaliście, że ! oznacza negację, tak więc, jeśli gracz nie jest połączony, jeśli nie jest żywy to return(anuluj funkcję?)
Quote

  • +
  • -
Miczu's Photo Miczu 03.06.2009

naven:
Uno: funkcja respawn_player(id) potrzebuje parametru id ktorego nie przekazujesz przy tasku i id=0 co wszystko psuje
Duo: ! oznacza negacje, ale wypadalo by czytac poprawinie skadnie warunku:
if (!is_user_connected(id) || is_user_alive(id) || cs_get_user_team(id) == CS_TEAM_SPECTATOR)

mozna rozbic na:
if(!is_user_connected(id)) return
if(is_user_alive(id)) return
if(cs_get_user_team(id) == CS_TEAM_SPECTATOR) return

Mowiac w sposob zrozumialy ! neguje tylko wartosc logiczna przy ktorej sie znajduje...
Quote

  • +
  • -
naven's Photo naven 03.06.2009

1. All I can say: wymiatasz + pomógł znów;d(skopiowałem trochę kodu z innego pluga i funguje)

2. aa xD, myslałem że odnosi się do całości... tak jak if
Quote
Locked