Brzmi jak coś za co wariat miał zapłacić 2000zł i wylądowało w necie bo nie zapłacił
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.
|
Deus Vult
Rejestracja: 01.09.2019Aktualnie: Nieaktywny
Poza forum Ostatnio: 22.04.2024 08:35
Statystyki
- Grupa: Użytkownik
- Całość postów: 213
- Odwiedzin: 4 803
- Tytuł: Nowy
- Wiek: 27 lat
- Urodziny: Luty 8, 1997
-
Imię
Mateusz
-
Płeć
Mężczyzna
-
Lokalizacja
Rzeszow
#776483 [EasyBlock] Paczka EasyBlock z mapami uKelwina [2023]
Napisane przez Deus Vult w 21.02.2023 23:08
#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ć
#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;
#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ć
#776334 [ROZWIĄZANE] [Problem] Kościotrup po śmierci - freelook poza mapą
Napisane przez Deus Vult w 04.02.2023 16:41
#776330 [ROZWIĄZANE] [Problem] Formatowanie w HTML
Napisane przez Deus Vult w 04.02.2023 14:43
#776313 [ROZWIĄZANE] [Problem] Formatowanie w HTML
Napisane przez Deus Vult w 03.02.2023 11:27
#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:
A tak chciałbym, żeby było:
Z samym HTML i CSS problemu nie mam, tylko w kodzie pluginu wygląda to troszkę inaczej niż kodzie zwykłej strony
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.
#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") }
#776263 [ROZWIĄZANE] [Problem] Licznik wizyt na serwerze
Napisane przez Deus Vult w 31.01.2023 19:56
#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 }
#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; } }
#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
#775640 wuha.pro - nowy projekt CS 1.6 & CS:GO
Napisane przez Deus Vult w 11.12.2022 02:35
#775545 Asynchroniczne zapytania do bazy danych, a nowe połączenia
Napisane przez Deus Vult w 29.11.2022 19:46
- AMXX.pl: Support AMX Mod X i SourceMod
- → Przeglądanie profilu: Reputacja: Deus Vult
- Regulamin