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
 

Deus Vult - zdjęcie

Deus Vult

Rejestracja: 01.09.2019
Aktualnie: Nieaktywny
Poza forum Ostatnio: 22.04.2024 08:35
-----

#776483 [EasyBlock] Paczka EasyBlock z mapami uKelwina [2023]

Napisane przez Deus Vult w 21.02.2023 23:08

Brzmi jak coś za co wariat miał zapłacić 2000zł i wylądowało w necie bo nie zapłacił


  • +
  • -
  • 1


#776468 iMessage - dodanie informacje o rankingu

Napisane przez Deus Vult w 14.02.2023 19:21

Musisz przypisać identyfikator do funkcji infoMessage() bo jest ona wywoływana taskiem więc użycie pętli for może nie być skutecznym rozwiązaniem w tym przypadku.
 

Zamień:

if (freq_im > 0.0)
set_task(freq_im, "infoMessage", 12345)

Na:
 

if (freq_im > 0.0) {
for(new i=1; i<=32; i++) {
if(!is_user_connected(i) || is_user_hltv(i)) continue;
set_task(freq_im, "infoMessage", i+12345)
}
}

Oraz te podmień te funkcje
 

public infoMessage(id)
{
	id -= 12345
	if (g_Current >= g_MessagesNum)
		g_Current = 0
	
	// No messages, just get out of here
	if (g_MessagesNum==0)
	{
		return;
	}
	
	new values[3];
	new Message[384];
	
	ArrayGetString(g_Messages, g_Current, Message, charsmax(Message));
	ArrayGetArray(g_Values, g_Current, values);
	
	new hostname[64];
	
	get_cvar_string("hostname", hostname, charsmax(hostname));
	replace(Message, charsmax(Message), "%hostname%", hostname);
	
	new rankmax[10];
	formatex(rankmax, charsmax(rankmax), "%i", get_statsnum());
	replace(Message, charsmax(Message), "%rankmax%", rankmax);
	
	set_hudmessage(values[0], values[1], values[2], X_POS, Y_POS, 0, 0.5, HOLD_TIME, 2.0, 2.0, -1);
		
	new stats[8], bodyhits[8] //tworzymy tablice na dane statystyk
	new pos = get_user_stats(id, stats, bodyhits) // pobieramy statysytki gracza
		
	new rank[10];
	formatex(rank, charsmax(rank), "%i", pos);
	replace(Message, charsmax(Message), "%rank%", rank);
		
	show_hudmessage(i, "%s", Message);
	
	client_print(0, print_console, "%s", Message);
	++g_Current;
	
	new Float:freq_im = get_pcvar_float(amx_freq_imessage);
	
	if (freq_im > 0.0)
		set_task(freq_im, "infoMessage", id+12345);
}

Powyższa funkcja jest modyfikacją modyfikacji boskiego wiec nie gwarantuje ze sie skompiluje, ale jest przykładem jak to powinno działać


  • +
  • -
  • 1


#776391 [ROZWIĄZANE] Opis komendy/cvar

Napisane przez Deus Vult w 09.02.2023 14:41

Jest to cvar który określa i ogranicza Ci liczbę pakietów wysyłanych pomiędzy serwerem i klientem na lokalnym serwerze.

Nie dam sobie ręki uciąć, ale jest to przydatne w przypadku gdy chcemy puszczać boty na serwer i dane pomiędzy nimi a serwerem są wysyłane do procesu/taska na tym samym serwerze, nadmiar zbędnych danych może crashować serwer z wybiciem pamięci ram ( nie pamiętam jak się zwał ten error)

 

A tutaj taki mały smaczek z funkcji engine

 

 

// Choke local client's/server's packets?   extern ConVar host_limitlocal;

 


  • +
  • -
  • 2


#776338 [ROZWIĄZANE] [Problem] Kościotrup po śmierci - freelook poza mapą

Napisane przez Deus Vult w 04.02.2023 20:07

Prawdopodobnie zachodzi kolizja poprzez nadpisanie bytu corpse (zwłoki gracza):
 

/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <engine>
#include <fakemeta>



#define PLUGIN "DeathBones"
#define VERSION "1.1.0"
#define AUTHOR "mogel"



#define BONE_ALPHA_TASK_BASIS 1000
new pcv_deathmatch	// Deathmatch-Support
new pcv_bonestime	// anzeigen der Bones



#define ALPHA EV_INT_iuser4
#define PLAYER EV_INT_iuser3



public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)

	register_message(get_user_msgid("DeathMsg"), "Event_Death")
	register_event("HLTV", "Event_FreezeTime", "a", "1=0", "2=0")
	
	register_cvar("DeathBones", VERSION, FCVAR_SERVER | FCVAR_SPONLY | FCVAR_UNLOGGED)
	
	pcv_deathmatch = register_cvar("db_deathmatch", "0")	// per default kein DM-Support
	pcv_bonestime = register_cvar("db_bonestime", "30.0")	// 30 Sekunden
	
	set_msg_block(get_user_msgid("ClCorpse"), BLOCK_SET)
}
public plugin_precache() {
	precache_model("models/skeleton.mdl")
}
public Event_FreezeTime() {
	new players[32], count
	get_players(players, count, "h")
	for(new i = 0; i < count; i++)
	{
		new player = players[i]
		
		// Render zurück setzen
		set_pev(player, pev_renderfx, kRenderFxNone)
		set_pev(player, pev_rendercolor, 255,255,255)
		set_pev(player, pev_rendermode, kRenderNormal)
		set_pev(player, pev_renderamt, 0.0)
	}
	
	remove_entity_name("deathbones")
}
public Event_Death() {
	new player = get_msg_arg_int(2)
	
	new Float:bones[3]
	new Float:angle[3]
	
	entity_get_vector(player, EV_VEC_origin, bones)
	entity_get_vector(player, EV_VEC_angles, angle)
	bones[2] -= 32.0 // gleich nach unten setzen
	
	// Bones erstellen
	new entity = create_entity("info_target")
	entity_set_string(entity, EV_SZ_classname, "deathbones")
	entity_set_model(entity, "models/skeleton.mdl")
	entity_set_origin(entity, bones)
	entity_set_vector(entity, EV_VEC_angles, angle)

	entity_set_int(entity, EV_INT_movetype, MOVETYPE_TOSS)
	entity_set_int(entity, EV_INT_solid, SOLID_NOT)
	
	// Bones erstmal unsichtbar
	set_pev(entity, pev_renderfx, kRenderFxNone)
	set_pev(entity, pev_rendercolor, 255,255,255)
	set_pev(entity, pev_rendermode, kRenderTransAlpha)
	set_pev(entity, pev_renderamt, 0.0)

	// Spieler durch Bones wechseln
	entity_set_int(entity, PLAYER, player)		// den Bones dem Spieler zuweisen
	entity_set_int(entity, ALPHA, 0)		// aktuelles Alpha für die Bones
	set_task(1.0, "BonesAlphaIn", entity)
}
public BonesAlphaIn(bones) {
	if (!is_valid_ent(bones)) return
	
	new alpha = entity_get_int(bones, ALPHA) + 1
	new player = entity_get_int(bones, PLAYER)
	
	// Spieler ausblenden, aber nur wenn kein DM-Modus
	if ((is_valid_ent(player)) && !get_pcvar_num(pcv_deathmatch))
	{
		set_pev(player, pev_renderfx, kRenderFxNone)
		set_pev(player, pev_rendercolor, 255,255,255)
		set_pev(player, pev_rendermode, kRenderTransAlpha)
		set_pev(player, pev_renderamt, float(256 - alpha * 16))
	}
	
	if (is_valid_ent(bones))
	{
		set_pev(bones, pev_renderfx, kRenderFxNone)
		set_pev(bones, pev_rendercolor, 255,255,255)
		set_pev(bones, pev_rendermode, kRenderTransAlpha)
		set_pev(bones, pev_renderamt, float(alpha * 16 - 1))
	}
	
	// neuen Alpha-Wert merken
	entity_set_int(bones, ALPHA, alpha)
	
	// jetzt entscheiden .. .weiter Alpha oder liegen lassen
	if (alpha >= 16)
	{
		// wenn kein DM dann Spieler jetzt nach unten setzen
		if (get_pcvar_num(pcv_deathmatch))
		{
			// im DM-Modus nach X Sekunden wieder ausblenden
			set_task(get_pcvar_float(pcv_bonestime), "BonesAlphaOut", bones)
		}
	} else
	{
		set_task(0.1, "BonesAlphaIn", bones)
	}
}
public BonesAlphaOut(bones) {
	if (!is_valid_ent(bones)) return
	
	new alpha = entity_get_int(bones, ALPHA) - 1
	
	if (is_valid_ent(bones))
	{
		set_pev(bones, pev_renderfx, kRenderFxNone)
		set_pev(bones, pev_rendercolor, 255,255,255)
		set_pev(bones, pev_rendermode, kRenderTransAlpha)
		set_pev(bones, pev_renderamt, float(alpha * 16 - 1))
	}
	
	// neuen Alpha-Wert merken
	entity_set_int(bones, ALPHA, alpha)
	
	// jetzt entscheiden .. .weiter Alpha oder killen
	if (alpha)
	{
		set_task(0.1, "BonesAlphaOut", bones)
	} else
	{
		remove_entity(bones)
	}
}

W momencie kiedy giniesz - domyślnie przerzuca Cię na podgląd kolejnego gracza. A w tym wypadku po prostu automatycznie ustawia widok całkowicie poza mapą, na dole, za teksturami. Może ciężko to wytłumaczyć, ale nie mam jak inaczej tego zobrazować :/

 


  • +
  • -
  • 1


#776334 [ROZWIĄZANE] [Problem] Kościotrup po śmierci - freelook poza mapą

Napisane przez Deus Vult w 04.02.2023 16:41

Ciało przenika przez podłoże i leci w dół?
  • +
  • -
  • 1


#776330 [ROZWIĄZANE] [Problem] Formatowanie w HTML

Napisane przez Deus Vult w 04.02.2023 14:43

Tak na przyszłość to nie zalecam wstawiania danych do MySQL tak jak masz w pierwszym poście
  • +
  • -
  • 1


#776313 [ROZWIĄZANE] [Problem] Formatowanie w HTML

Napisane przez Deus Vult w 03.02.2023 11:27

Najprościej to na początku funkcji savedata wrzucić warunek tylko że wtedy musisz skasować jakoś HLTV z bazy danych:

if(is_user_hltv(id)) return;
  • +
  • -
  • 1


#776294 [ROZWIĄZANE] [Problem] Formatowanie w HTML

Napisane przez Deus Vult w 02.02.2023 13:53

Bliżej niż dalej :)

 

Tak jest po zmianie:

 

20230201220141-1.jpg

 

A tak chciałbym, żeby było:

 

20230201215846-1.jpg

 

Z samym HTML i CSS problemu nie mam, tylko w kodzie pluginu wygląda to troszkę inaczej niż kodzie zwykłej strony :P

 

 

Możesz próbować używać dopełnienia stringa/ciągu (%-x1.x2%s). Robisz to w ten sposób:

%s zamieniasz na %-x1.x2s. Za x1 podstawiasz liczbę minimalnych znaków, a za x2 podstawiasz liczbę maksymalnych znaków.

Dajmy na przykład:
%-22.22s     jeżeli ciąg znaków jest krótszy od 22 znaków to resztę dopełni spacjami.

W praktyce wygląda to tak: %-22.22s [znak - lub + po % oznacza wyrównanie do lewej lub prawej]
Wyświetli się "Nick                  " <- wiemy, że zajmuje 4 znaki więc plugin dopisze 18 spacji.

W przypadku typu Integer wygląda to tak: %6d  <- liczba jest mniejsza niż liczba 6cyfrowa to dopisuje spacje.


  • +
  • -
  • 1


#776280 [ROZWIĄZANE] [Problem] Formatowanie w HTML

Napisane przez Deus Vult w 01.02.2023 15:28

Zakładam, że o to ci chodzi - nie kompilowałem na sztywno skleiłem w notesie.

public CmdTimeTop(id)
{
	new iRanks[10], iRanking[10], szKey[5], iTemp, z
	
	for(new x; x < 10; x++)
	{
		for(new i=0; i <= TotalRanks; i++)
		{
			num_to_str(i, szKey, sizeof(szKey) - 1)
			TrieGetCell(Rank, szKey, iTemp)
			
			if(x == 0)
			{
				if(iRanks[x] < iTemp)
				{
					iRanks[x] = iTemp
					iRanking[x] = i
					
					if(z<x)
						z=x
				}
			}
			else
			{
				if(iRanks[x] < iTemp && iRanks[x-1] > iTemp)
				{
					iRanks[x] = iTemp
					iRanking[x] = i
					
					if(z<x)
						z=x
				}
			}
		}
	}
		
	new szName[32]
	new iLen
	
	iLen = formatex(sBuffer, MAX_BUFFER_LENGTH, "<body bgcolor=#000000><font color=#FFB000><pre>%s %s %s^n", "#", "Nick", "Czas na serwerze");
	
	for(new y=0; y <= z; y++)
	{
		num_to_str(iRanking[y], szKey, sizeof(szKey) - 1)
		TrieGetCell(Rank, szKey, iTemp)
		TrieGetString(Name, szKey, szName, sizeof(szName) - 1)
	
		iLen += formatex(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "#%i %s %i^n", y + 1, szName, iTemp);
	}
	
	show_motd(id, sBuffer, "Czas gry - TOP 10")
}


  • +
  • -
  • 1


#776263 [ROZWIĄZANE] [Problem] Licznik wizyt na serwerze

Napisane przez Deus Vult w 31.01.2023 19:56

Nie możesz wyświetlać stringa jako typ Integer. Popraw linijke na tą:

ColorChat( id, TEAM_COLOR, "%s^x01 To Twoja %d wizyta na naszym serwerze.", prefix, str_to_num(tmp) )

i tak jak wyżej kolega napisał usuń czas bo i tak z niego nie korzystasz


  • +
  • -
  • 1


#776252 [ROZWIĄZANE] [Problem] Rangi - wczytuje rangę po pierwszym fragu

Napisane przez Deus Vult w 31.01.2023 11:45

Czyli wychodzi na to że dane gracza get_user_stats są pobierane dopiero po odrodzeniu gracza, wiec to by tłumaczyło dlaczego tak się dzieje (podczas wykonywania forwardu client_authorized, putinserver statystyki gracza wynoszą 0). W tym przypadku odradzam korzystać z taska, bo jednemu serwer może się ładować 2 sekundy drugiemu 10..
Ustawianie rang po pierwszym respawnie od dołączenia powinno rozwiązać problem. 
 

#include <amxmodx>
#include <colorchat>
#include <hamsandwich>
#include <fakemeta>
#include <csx>
#include <fun>

#define PLUGIN "Rangi"
#define AUTHOR "Wicked - amxx.pl/user/60210-wicked/"

#pragma semicolon 1

#define DEBUG_MODE

#define MAX_PLAYERS 32
#define MAX_CHARS 33
#define MAX_RANK_NAME_LENGTH 60

#define TASK_HUD 1337

#define ForRange(%1,%2,%3) for(new %1 = %2; %1 <= %3; %1++)
#define ForArray(%1,%2) for(new %1 = 0; %1 < sizeof %2; %1++)
#define ForDynamicArray(%1,%2) for(new %1 = 0; %1 < ArraySize(%2); %1++)
#define ForFile(%1,%2,%3,%4,%5) for(new %1 = 0; read_file(%2, %1, %3, %4, %5); %1++)

new const configFilePath[] = "addons/amxmodx/configs/RanksConfig.ini";
new const configFileDataSeparator = '=';
new const configFileKillsSeparator = '-';
new const configFileForbiddenChars[] =
{
	'/',
	';',
	'\'
};

new const ranksListMenuCommands[][] =
{
	"/rangi",
	"/ranga",
	"/listarang"
};

new const rankHudCommands[][] =
{
	"/hud",
	"/hudrangi"
};

new const chatPrefix[] = "^x03[RANGI]^x01";

new const rankUpForwardName[] = "user_rank_up";

new const Float:hudInterval = 1.0;

new const nativesData[][][] =
{
	{ "ranks_get_user_rank", "native_get_user_rank", 0 },
	{ "ranks_get_rank_name", "native_get_rank_name", 0 },
	{ "ranks_get_rank_kills", "native_get_rank_frags", 0 }
};

enum dataEnumerator (+= 1)
{
	dataRank,
	dataRankName[MAX_RANK_NAME_LENGTH],
	bool:dataHudEnabled,
	dataKills,
	dataKillsRequired
};


new Array:rankNames,
	Array:rankFrags[2],

	userData[MAX_PLAYERS + 1][dataEnumerator],

	forwardRankUp,

	hudObject;
	
new bool:playerConnected[33];


public plugin_init()
{
	register_plugin(PLUGIN, "v2.2", AUTHOR);

	register_message(get_user_msgid("SayText"), "handleSayText");
	RegisterHam(Ham_Spawn, "player", "OnPlayerSpawn", 1);
	register_event("DeathMsg", "deathMessage", "a");

	forwardRankUp = CreateMultiForward(rankUpForwardName, ET_IGNORE, FP_CELL, FP_CELL);
	hudObject = CreateHudSyncObj();
}

public mainMenu(index)
{
	new name[MAX_CHARS],
		menuIndex;
	
	menuIndex = menu_create(fmt("Twoja ranga: %s (%i / %i)^nLista rang:", userData[index][dataRankName], userData[index][dataRank] + 1, ArraySize(rankNames)), "mainMenu_handler");

	ForDynamicArray(i, rankNames)
	{
		ArrayGetString(rankNames, i, name, charsmax(name));

		menu_additem(menuIndex, fmt("%s (Od: %i || Do: %i)", name, ArrayGetCell(rankFrags[1], i), ArrayGetCell(rankFrags[0], i)));
	}

	menu_display(index, menuIndex);

	return PLUGIN_HANDLED;
}

public mainMenu_handler(index, menu, item)
{
	menu_destroy(menu);

	return PLUGIN_HANDLED;
}

public toggleHud(index)
{
	toggle_hud(index, !userData[index][dataHudEnabled]);
}

public plugin_natives()
{
	ForArray(i, nativesData)
	{
		register_native(nativesData[i][0], nativesData[i][1], nativesData[i][2][0]);
	}
}

public plugin_precache()
{
	loadConfigFile();
}

public OnPlayerSpawn(index)
{
	if(playerConnected[index]) {
		get_user_rank(index, true);
		toggle_hud(index, true);
		playerConnected[index] = false;
	}
}

public client_putinserver(index)
{
	playerConnected[index] = true;
}

public handleSayText(msgId, msgDest, msgEnt)
{
	new index = get_msg_arg_int(1);

	if(!is_user_connected(index))
	{
		return PLUGIN_CONTINUE;
	}

	new chatString[2][192];

	get_msg_arg_string(2, chatString[0], charsmax(chatString[]));

	if(!equal(chatString[0], "#Cstrike_Chat_All"))
	{
		formatex(chatString[1], charsmax(chatString[]), "^x03[^x04%s^x03] %s", userData[index][dataRankName], chatString[0]);
	}
	else
	{
		get_msg_arg_string(4, chatString[0], charsmax(chatString[]));
		set_msg_arg_string(4, "");

		formatex(chatString[1], charsmax(chatString[]), "^x03[^x04%s^x03] %n^x01 : %s", userData[index][dataRankName], index, chatString[0]);
	}

	set_msg_arg_string(2, chatString[1]);

	return PLUGIN_CONTINUE;
}

public deathMessage()
{
	new killer = read_data(1),
		victim = read_data(2);

	// Return if the kill-event doesnt matter.
	if(killer == victim || !is_user_connected(victim) || !is_user_connected(killer))
	{
		return;
	}

	get_user_rank(killer);
}

public displayHud(taskIndex)
{
	new index = taskIndex - TASK_HUD;

	if(!is_user_connected(index))
	{
		return;
	}

	new message[2 << 7];

	// Format hud message.
	formatex(message, charsmax(message), "Twoja ranga: %s (%i / %i)", userData[index][dataRankName], userData[index][dataRank] + 1, ArraySize(rankNames));

	if(userData[index][dataKillsRequired])
	{
		format(message, charsmax(message), "%s^nZabic: %i / %i", message, userData[index][dataKills], userData[index][dataKillsRequired]);
	}

	if(userData[index][dataRank] < ArraySize(rankNames) - 1)
	{
		new nextrankNames[MAX_RANK_NAME_LENGTH];

		ArrayGetString(rankNames, userData[index][dataRank] + 1, nextrankNames, charsmax(nextrankNames));

		format(message, charsmax(message), "%s^nNastepna ranga: %s", message, nextrankNames);
	}

	// Display the message.
	set_hudmessage(150, 150, 150, -1.0, 0.05, 0, 1.0, hudInterval + 0.1);
	ShowSyncHudMsg(index, hudObject, message);
}

toggle_hud(index, bool:status)
{
	userData[index][dataHudEnabled] = status;

	if(userData[index][dataHudEnabled])
	{
		set_task(hudInterval, "displayHud", index + TASK_HUD, .flags = "b");
	}
	else
	{
		// Remove task if it exists.
		if(task_exists(index + TASK_HUD))
		{
			remove_task(index + TASK_HUD);
		}
	}
}

loadConfigFile()
{
	// Initiate dynamic arrays.
	rankNames = ArrayCreate(MAX_RANK_NAME_LENGTH, 1);

	ForRange(i, 0, 1)
	{
		rankFrags[i] = ArrayCreate(1, 1);
	}

	new currentLine[MAX_RANK_NAME_LENGTH * 3],

		lineLength,

		readrankNames[MAX_RANK_NAME_LENGTH],
		readRankKills[2][MAX_CHARS],

		key[MAX_CHARS],
		value[MAX_CHARS * 2],

		bool:continueLine;

	ForFile(i, configFilePath, currentLine, charsmax(currentLine), lineLength)
	{
		// Continue if it's an empty line.
		if(!currentLine[0])
		{
			continue;
		}

		// Continue if found forbidden char (ex. comment) 
		ForArray(j, configFileForbiddenChars)
		{
			if(currentLine[0] == configFileForbiddenChars[j])
			{
				continueLine = true;
				
				break;
			}
		}

		if(continueLine)
		{
			continueLine = false;

			continue;
		}

		// Read line data.
		parse(currentLine, readrankNames, charsmax(readrankNames));

		// Divide line data into key and value.
		strtok(currentLine, key, charsmax(key), value, charsmax(value), configFileDataSeparator);
		
		// Get rid of white-characters.
		trim(value);
		
		// Divide remaining line data into kills range.
		strtok(value, readRankKills[0], charsmax(readRankKills[]), readRankKills[1], charsmax(readRankKills[]), configFileKillsSeparator);
	
		// Add rank name.
		ArrayPushString(rankNames, readrankNames);

		// Add rank kills.
		ForRange(j, 0, 1)
		{
			ArrayPushCell(rankFrags[j], str_to_num(readRankKills[j]));
		}

		#if defined DEBUG_MODE

		log_amx("Registered rank: (name = %s) (kills: %i-%i)", readrankNames, ArrayGetCell(rankFrags[0], ArraySize(rankFrags[0]) - 1), ArrayGetCell(rankFrags[1], ArraySize(rankFrags[1]) - 1));
	
		#endif
	}

	// Pause plugin if no ranks were loaded.
	if(!ArraySize(rankNames))
	{
		set_fail_state("Nie znaleziono zadnych rang.");

		return;
	}

	#if defined DEBUG_MODE

	log_amx("Zaladowano: %i rang(i) w zakresie (%i - %i).", ArraySize(rankNames), ArrayGetCell(rankFrags[0], 0), ArrayGetCell(rankFrags[1], ArraySize(rankNames) - 1));

	#endif

	registerCommands(ranksListMenuCommands, sizeof(ranksListMenuCommands), "mainMenu");
	registerCommands(rankHudCommands, sizeof(rankHudCommands), "toggleHud");
}

get_user_rank(index, bool:connect = false, bool:notify = true)
{
	new userStats[8],
		blank[8];

	get_user_stats(index, userStats, blank);

	// Update player's kills.
	userData[index][dataKills] = userStats[0];

	// Make sure player's rank is not bugged.
	// If so, make it right.
	if(userData[index][dataRank] >= ArraySize(rankNames))
	{
		userData[index][dataRank] = ArraySize(rankNames);

		return;
	}

	new oldRank = userData[index][dataRank];

	ForDynamicArray(i, rankNames)
	{
		// Break the loop if user kills is lower than required.
		// Ranks should be sorted in ascending order, so if the player
		// Has less kills than required, he's surely not gonna
		// Get a rank higher than the one currently proccessed.
		if(userStats[0] < ArrayGetCell(rankFrags[0], i))
		{
			break;
		}

		// Continue if he's got more kills than required.
		if(userStats[0] > ArrayGetCell(rankFrags[1], i) && i < ArraySize(rankNames) - 1)
		{
			continue;
		}

		// Set new rank
		userData[index][dataRank] = userData[index][dataRank] + 1 >= ArraySize(rankNames) ? ArraySize(rankNames) - 1 : i;
		
		// Set kills required for the next rank.
		userData[index][dataKillsRequired] = ArrayGetCell(rankFrags[1], userData[index][dataRank]);

		// Update user rank name.
		ArrayGetString(rankNames, userData[index][dataRank], userData[index][dataRankName], MAX_RANK_NAME_LENGTH);

		// We dont want to show messages when getting the rank for the first time.
		if(connect)
		{
			break;
		}

		// Break the loop if player's rank was not updated.
		if(userData[index][dataRank] <= oldRank)
		{
			break;
		}

		// Format messages if enabled.
		if(notify)
		{
			new message[2 << 7];

			formatex(message, charsmax(message), "%s^x01 Awansowales na range ^"^x03%s^x01^".", chatPrefix, userData[index][dataRankName]);

			if(userData[index][dataRank] + 1 >= ArraySize(rankNames))
			{
				format(message, charsmax(message), "%s Nastepna ranga:^x03 Brak^x01.", message);
			}
			else
			{
				new nextrankNames[MAX_RANK_NAME_LENGTH],
					nextRankFrags[2];

				ArrayGetString(rankNames, userData[index][dataRank] + 1, nextrankNames, charsmax(nextrankNames));

				nextRankFrags[0] = ArrayGetCell(rankFrags[0], userData[index][dataRank] + 1);
				nextRankFrags[1] = ArrayGetCell(rankFrags[1], userData[index][dataRank] + 1);

				format(message, charsmax(message), "%s Nastepna ranga: ^"^x03%s^x01^" (^x03%i^x01 - ^x03%i^x01).", message, nextrankNames, nextRankFrags[0], nextRankFrags[1]);
			}

			ColorChat(index, RED, message);
		}

		// Inform other plugins about player ranking up.
		ExecuteForward(forwardRankUp, _, index, userData[index][dataRank]);

		// No need to do another iteration.
		break;
	}
}

public native_get_user_rank(plugin, params)
{
	// Invalid amount of parameters.
	if(params != 1)
	{
		return -1;
	}

	new index = get_param(1);

	// Return error value if player is not connected.
	if(!is_user_connected(index))
	{
		return -1;
	}

	return userData[index][dataRank];
}

public native_get_rank_name(plugin, params)
{
	// Invalid amount of parameters.
	if(params != 3)
	{
		return;
	}

	new index = get_param(1);

	// Return if invalid rank index was given.
	if(index < 0 || index >= ArraySize(rankNames))
	{
		return;
	}

	new length = get_param(3);

	// Return if invalid length was given.
	if(!length)
	{
		return;
	}

	set_string(2, userData[index][dataRankName], length);
}

public native_get_rank_frags(plugin, params)
{
	// Invalid amount of parameters.
	if(params != 2)
	{
		return -1;
	}

	new index = get_param(1);

	// Invalid index?
	if(index < 0 || index >= ArraySize(rankNames))
	{
		return -1;
	}

	new which = get_param(2);

	// Invalid index?
	if(which < 0 || which > 2)
	{
		return -1;
	}

	return ArrayGetCell(rankFrags[which], index);
}

public ranks_get_ranks_count(plugin, params)
{
	return ArraySize(rankNames);
}

stock registerCommands(const array[][], arraySize, function[])
{
	#if !defined ForRange

		#define ForRange(%1,%2,%3) for(new %1 = %2; %1 <= %3; %1++)

	#endif

	#if AMXX_VERSION_NUM > 183
	
	ForRange(i, 0, arraySize - 1)
	{
		ForRange(j, 0, 1)
		{
			register_clcmd(fmt("%s %s", !j ? "say" : "say_team", array[i]), function);
		}
	}

	#else

	new newCommand[33];

	ForRange(i, 0, arraySize - 1)
	{
		ForRange(j, 0, 1)
		{
			formatex(newCommand, charsmax(newCommand), "%s %s", !j ? "say" : "say_team", array[i]);
			register_clcmd(newCommand, function);
		}
	}

	#endif
}

  • +
  • -
  • 1


#776238 [ROZWIĄZANE] [Problem] Rangi - wczytuje rangę po pierwszym fragu

Napisane przez Deus Vult w 30.01.2023 15:48

Na pierwszy rzut oka wydaje mi się że zmienna bool powoduje problem, ustawia ci wartość connect = true co w skutku przerywa wykonywanie pętli w funkcji get_user_rank.

Nie kompilowałem, sprawdź to:

 

get_user_rank(index, bool:connect = false, bool:notify = true)
{
	new userStats[8],
		blank[8];

	get_user_stats(index, userStats, blank);

	// Update player's kills.
	userData[index][dataKills] = userStats[0];

	// Make sure player's rank is not bugged.
	// If so, make it right.
	if(userData[index][dataRank] >= ArraySize(rankNames))
	{
		userData[index][dataRank] = ArraySize(rankNames);

		return;
	}

	new oldRank = userData[index][dataRank];

	ForDynamicArray(i, rankNames)
	{
		// Break the loop if user kills is lower than required.
		// Ranks should be sorted in ascending order, so if the player
		// Has less kills than required, he's surely not gonna
		// Get a rank higher than the one currently proccessed.
		if(userStats[0] < ArrayGetCell(rankFrags[0], i))
		{
			break;
		}

		// Continue if he's got more kills than required.
		if(userStats[0] > ArrayGetCell(rankFrags[1], i) && i < ArraySize(rankNames) - 1)
		{
			continue;
		}

		// Set new rank
		userData[index][dataRank] = userData[index][dataRank] + 1 >= ArraySize(rankNames) ? ArraySize(rankNames) - 1 : i;
		
		// Set kills required for the next rank.
		userData[index][dataKillsRequired] = ArrayGetCell(rankFrags[1], userData[index][dataRank]);

		// Update user rank name.
		ArrayGetString(rankNames, userData[index][dataRank], userData[index][dataRankName], MAX_RANK_NAME_LENGTH);

		// We dont want to show messages when getting the rank for the first time.


		// Break the loop if player's rank was not updated.
		if(userData[index][dataRank] <= oldRank)
		{
			break;
		}

		// Format messages if enabled.
		if(notify)
		{
			new message[2 << 7];

			formatex(message, charsmax(message), "%s^x01 Awansowales na range ^"^x03%s^x01^".", chatPrefix, userData[index][dataRankName]);

			if(userData[index][dataRank] + 1 >= ArraySize(rankNames))
			{
				format(message, charsmax(message), "%s Nastepna ranga:^x03 Brak^x01.", message);
			}
			else
			{
				new nextrankNames[MAX_RANK_NAME_LENGTH],
					nextRankFrags[2];

				ArrayGetString(rankNames, userData[index][dataRank] + 1, nextrankNames, charsmax(nextrankNames));

				nextRankFrags[0] = ArrayGetCell(rankFrags[0], userData[index][dataRank] + 1);
				nextRankFrags[1] = ArrayGetCell(rankFrags[1], userData[index][dataRank] + 1);

				format(message, charsmax(message), "%s Nastepna ranga: ^"^x03%s^x01^" (^x03%i^x01 - ^x03%i^x01).", message, nextrankNames, nextRankFrags[0], nextRankFrags[1]);
			}

			if(!connect) ColorChat(index, RED, message);
		}

		// Inform other plugins about player ranking up.
		ExecuteForward(forwardRankUp, _, index, userData[index][dataRank]);

		// No need to do another iteration.
		break;
	}
}

  • +
  • -
  • 1


#775850 Zrozumieć istotę tablic - wstęp

Napisane przez Deus Vult w 29.12.2022 22:34

 

 

new arr[2]; // Inicjacja tablicy o rozmiarze 2.

arr[0] = 5; // Przypisywanie wartosci '5' do indeksu '0' tablicy 'arr'.
arr[1] = 6; // Przypisywanie wartosci '6' do indeksu '1' tablicy 'arr'.

Dla tych niekumatych:
Jeżeli masz dużą zmywarkę i masz 3 szuflady na naczynia

arr[0] = 5    // do szuflady pierwszej wlozy 5 talerzy
arr[1] = 6   // do szuflady nastepnej wlozy 6 szklanek

 

Będą one siedziały w tej zmywarce dopóki jej nie opróżnisz


  • +
  • -
  • 1


#775640 wuha.pro - nowy projekt CS 1.6 & CS:GO

Napisane przez Deus Vult w 11.12.2022 02:35

epoki ci sie pojebały xD


  • +
  • -
  • 2


#775545 Asynchroniczne zapytania do bazy danych, a nowe połączenia

Napisane przez Deus Vult w 29.11.2022 19:46

Nie bardzo rozumiem, albo Ty nie rozumiesz mnie.
Chcesz mi powiedzieć, że inna wersja modułu sqlx działa inaczej? W sensie, thread_query nie nawiązuje nowego połączenia za każdym razem?

Chciałem ci powiedzieć, że nie każda wersja modułu jest kompatybilna ze wszystkimi wersjami silnika


  • +
  • -
  • 1