Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

DEADP00L - zdjęcie

DEADP00L

Rejestracja: 20.10.2012
Aktualnie: Nieaktywny
Poza forum Ostatnio: 21.04.2024 00:31
*****

Moje tematy

Funkcja rzucania granatem dymnym

18.02.2024 23:32

Orientuje się ktoś z was czy jest może funkcja rzucania granatem dymnym lub coś co aktywuje takiego granata? 

Chodzi o to, że mam wyrzutnie granatów lecz tam jest stworzony stock który tworzy wybuch, jakieś efekty dodatkowe. Natomiast ja szukam czegoś co pozwoli mi z tego granatnika wystrzelić smoke i ten smoke wybuchnie tak jakbym faktycznie nim rzucił

[ROZWIĄZANE] Visual Damage (sprites)

15.12.2023 20:42

Mam taki problem z poniższym pluginem, że sprites z zadawanymi obrażeniami jest widoczny dla wszystkich.

 

I teraz moje pytanie brzmi, jak przerobić go tak aby był widoczny tylko i wyłącznie dla atakującego?

public fwdAddToFullPack_Post( es, e, ent, host, host_flags, player, p_set )
{
	if (!is_nullent(ent) && get_entvar(ent,var_owner) == host && host != ent)
	{
		if(iMeters > 9) set_es( es , ES_Scale , 5.37/19)
		else if(iMeters > 4 && iMeters < 9) set_es( es , ES_Scale , 3.20/22)
		else set_es( es , ES_Scale , iMeters/25);
	}

	return FMRES_IGNORED;
}

public CBasePlayer_TakeDamage(const victim, inflictor, const attacker, Float:damage)
{
	if(victim == attacker || !rg_is_player_can_takedamage(victim, attacker) || !is_user_connected(attacker))
		return HC_CONTINUE;

	new Float:kOrigin[ 3 ], Float:vOrigin[ 3 ]
		
	pev( attacker, pev_origin, kOrigin )
	pev( victim, pev_origin, vOrigin )
		
	iDist = get_distance_f( kOrigin, vOrigin )
	iMeters = iDist * 0.0254 
		
	new MODEL_ent = rg_create_entity("env_sprite")
			
	if(!is_nullent(MODEL_ent)){
		new Float:Color[3] , Float:Velocity[3] , Float:Origin[3] , Float:height = 25 + ( random_num(0,3) * 7.0 )
		Velocity[2] = 20.0
		Velocity[1] = random_float(-4.0,4.0)
		Velocity[0] = random_float(-4.0,4.0)
		
		Color[0] = 255.0
		Color[1] = floatround(damage) > 100 ? 0.0 : ((255.0 - ( floatround(damage) * 4.55 )) * ( 1.0 - (floatround(damage)/100.0) ) )
		Color[2] = Color[1]
			
		get_entvar( victim , var_origin , Origin )
			
		if(iMeters > 7) Origin[2] += height * 1.05
		else Origin[2] += height
				
		set_entvar( MODEL_ent , var_owner , attacker)
		set_entvar( MODEL_ent , var_model , Numbers_Model)
		set_entvar( MODEL_ent , var_modelindex , Numbers_Modelindex)
		set_entvar( MODEL_ent , var_rendermode , kRenderTransAdd)
		set_entvar( MODEL_ent , var_movetype,MOVETYPE_NOCLIP)
		set_entvar( MODEL_ent , var_renderamt , 300.0)
		set_entvar( MODEL_ent , var_scale , 0.0)
		set_entvar( MODEL_ent , var_rendercolor,Color)
		set_entvar( MODEL_ent , var_velocity , Velocity )
		set_entvar( MODEL_ent , var_origin , Origin )
		set_entvar( MODEL_ent , var_frame , damage )
			
		DecreaseSpeed(MODEL_ent)
		SetThink(MODEL_ent, "ReducingTransparency")
		ReducingTransparency( MODEL_ent )	
	}
	return HC_CONTINUE;
}
public DecreaseSpeed(ent){
	if ( !is_nullent(ent)){
		new Float:Velocity[3]
		get_entvar( ent , var_velocity ,Velocity )
		Velocity[2] -= 1.0
		set_entvar( ent , var_velocity ,Velocity )
		set_task(1.0,"DecreaseSpeed",ent)
	}
}
public ReducingTransparency(ent){
	static Float:Renderamt
	get_entvar( ent , var_renderamt ,Renderamt )
	Renderamt -= 10.0
	
	if ( Renderamt < 10 )
		set_entvar( ent , var_flags , FL_KILLME ) , remove_task(ent)
	else {
		set_entvar( ent , var_renderamt , Renderamt )
		set_entvar(ent, var_nextthink, get_gametime( ) + 0.2)
	}
}

[ROZWIĄZANE] Problem z odczytywaniem adresu IP gracza z bazy danych (SQL)

22.10.2023 19:16

Witam!

 

Tak wygląda funkcja zapisu danych:

public sql_save(id)
{
	if (gTablesLoaded[id] == 1)
	{
		if ( gIntermission )
		{
			sql_save_nonthreaded(id);
			return;
		}
		new tempSaveKeyID[63], tempSaveKeyIP[63];
		copy(tempSaveKeyID, charsmax(tempSaveKeyID), gSaveKeyID[id]);
		replace_all(tempSaveKeyID, charsmax(tempSaveKeyID), "'", "\'" );

		copy(tempSaveKeyIP, charsmax(tempSaveKeyIP), gSaveKeyIP[id]);
		replace_all(tempSaveKeyIP, charsmax(tempSaveKeyIP), "'", "\'" );

		formatex(g_Cache, charsmax(g_Cache), "UPDATE zp_user_weapons SET player_selection=%i, weapon_first=%i, weapon_second=%i, player_ip=^"%s^" WHERE player_id=^"%s^"", typ_wybierania[id] == 1 ? 0 : typ_wybierania[id], typ_wybierania[id] == 0 ? -1 : first_selection[id], typ_wybierania[id] == 0 ? -1 : second_selection[id], tempSaveKeyIP, tempSaveKeyID);
		SQL_ThreadQuery(g_SqlTuple, "QueryHandle", g_Cache);
	}
}

Wszystko dziala poprawanie:

 

03675b23f5e3a33509c1eb8e2b9b283d.png

 

I teraz kiedy probuje odczytac adres IP danego gracza i porownac go z adresem podczas laczenia sie z serwerem to juz mam problemy z tym.

 

 

Funkcja sprawdzania/odczytu danych z bazy SQL:

public SelectHandle(FailState, Handle:Query, Error[], Errcode, Data[], DataSize) {
	if (FailState) {
		if (FailState == TQUERY_CONNECT_FAILED) {
			log_amx("Load - Could not connect to SQL database.  [%d] %s", Errcode, Error);
		}
		else if (FailState == TQUERY_QUERY_FAILED) {
			log_amx("Load Query failed. [%d] %s", Errcode, Error);
		}
		return;
	}

	new id = Data[0];

	if (!SQL_NumResults(Query)) {
		typ_wybierania[id] = 0;
		first_selection[id] = 0;
		second_selection[id] = 0;

		new tempSaveKeyID[63];
		copy(tempSaveKeyID, charsmax(tempSaveKeyID), gSaveKeyID[id]);
		replace_all(tempSaveKeyID, charsmax(tempSaveKeyID), "'", "\'" );	

		formatex(g_Cache, charsmax(g_Cache), "INSERT INTO zp_user_weapons VALUES('%s', '0', '0', '0', '0')", tempSaveKeyID);
		SQL_ThreadQuery(g_SqlTuple, "QueryHandle", g_Cache);
	}
	else
	{
		new tempSaveKeyIP[63];

		copy(tempSaveKeyIP, charsmax(tempSaveKeyIP), gSaveKeyIP[id]);
		replace_all(tempSaveKeyIP, charsmax(tempSaveKeyIP), "'", "\'" );

		typ_wybierania[id] = SQL_ReadResult(Query, 0);
		first_selection[id] = SQL_ReadResult(Query, 1);
		second_selection[id] = SQL_ReadResult(Query, 2);
	}
	gTablesLoaded[id]++;
}

I w moim przypadku adres IP będzie: SQL_ReadResult(Query, 3);

Kiedy tworze zmienną adres_ip[33]

i próbuję ustawić to w ten sposób:

 

adres_ip[id] = SQL_ReadResult(Query, 3);

A następnie chcę odczytać ten adres IP robiąc to używajac kodu ponizej:

public PokazIP(id)
{
	new tempSaveKeyIP[63]//, tempSaveKeyOldIP[63]

	copy(tempSaveKeyIP, charsmax(tempSaveKeyIP), gSaveKeyIP[id]);
	replace_all(tempSaveKeyIP, charsmax(tempSaveKeyIP), "'", "\'" );	

	//copy(tempSaveKeyOldIP, charsmax(tempSaveKeyOldIP), gSavedKeyIP[id][64]);
	//replace_all(tempSaveKeyOldIP, charsmax(tempSaveKeyOldIP), "'", "\'" );

	client_print(id, print_chat, "Twoje IP: %s, a w bazie widnieje jako %s", tempSaveKeyIP, dane)
}

To wyswietla mi tylko info:

 

"widnieje jako 185" reszty adresu IP nie widac, tylko pierwsze trzy cyfry to kropki.

 

Jakie pomysly, co zle robie?

 

TakeDamage_Pre - sprawdzenie funkcji

28.05.2023 17:23

Witam,

 

Chciałbym zapoznać się z waszymi opiniami czy według was jest to stabilna forma zmiany obrażeń poszczególnej broni:

#define IsPlayer(%1) (1 <= %1 <= g_iMaxPlayers)
new g_iMaxPlayers;

new const Float:hit_area[][] = {
    { 1.0,   1.0,   1.0    },  // HIT_GENERIC
    { 50.0,  10.0,  30.0   },  // HIT_HEAD
    { 25.0,  8.0,   15.0   },  // HIT_CHEST
    { 20.25, 6.25,  12.25  },  // HIT_STOMACH
    { 10.0,  4.0,   8.0    },  // HIT_LEFTARM
    { 10.0,  4.0,   8.0    },  // HIT_RIGHTARM
    { 8.75,  2.75,  5.75   },  // HIT_LEFTLEG
    { 8.75,  2.75,  5.75   },  // HIT_RIGHTLEG
    { 0.0,   0.0,   0.0    }   // HIT_SHIELD
}

public plugin_init() {
    RegisterHam(Ham_TakeDamage, "player", "Ham_CBasePlayer_TakeDamage_Pre", 0);
    g_iMaxPlayers = get_maxplayers();
}

public Ham_CBasePlayer_TakeDamage_Pre(id, iInflictor, iAttacker, Float:flDamage, bitsDamageType) {
    if(id != iAttacker && is_user_connected(iAttacker) && IsPlayer(iAttacker)) {
        const XTRA_OFS_PLAYER = 5; const m_LastHitGroup = 75; const m_iTeam = 114;
        new weapon = get_user_weapon(iAttacker), hitbox = get_pdata_int(id, m_LastHitGroup, XTRA_OFS_PLAYER);

        switch(weapon) {
            case CSW_KNIFE: if(bitsDamageType & DMG_BULLET && get_pdata_int(id, m_iTeam, XTRA_OFS_PLAYER) != get_pdata_int(iAttacker, m_iTeam, XTRA_OFS_PLAYER)) SetHamParamFloat(4, hit_area[hitbox][0])         
            case CSW_FIVESEVEN: if(bitsDamageType & DMG_BULLET && get_pdata_int(id, m_iTeam, XTRA_OFS_PLAYER) != get_pdata_int(iAttacker, m_iTeam, XTRA_OFS_PLAYER)) SetHamParamFloat(4, hit_area[hitbox][1])
            case CSW_M4A1: if(bitsDamageType & DMG_BULLET && get_pdata_int(id, m_iTeam, XTRA_OFS_PLAYER) != get_pdata_int(iAttacker, m_iTeam, XTRA_OFS_PLAYER)) SetHamParamFloat(4, hit_area[hitbox][2])          
        }
        return HAM_OVERRIDE 
    }
    return HAM_IGNORED
}

Dodam, że łącznie będzie tam 24 case'ów z każdą bronią ;)

Czy według was jest to dobrze zoptymalizowane?

 

 

Z góry dziękuję za wszelkie sugestie!