-
Posts
658 -
Joined
-
Last visited
-
Days Won
52
Content Type
Profiles
Forums
News
Documentation
Everything posted by khain.dev
-
enum e_RadarData { bool:rOn, rLimit, rAreaId } new RadarData[MAX_PLAYERS][e_RadarData]; new Iterator:RadarsOn<MAX_PLAYERS>; #define RADAR_STREAMER_IDENTIFIER 999 public OnGameModeExit() { foreach(new i : RadarsOn) { ResetPlayerRadar(i); } Iter_Clear(RadarsOn); return 1; } public OnPlayerDisconnect(playerid, reason) { if(RadarData[playerid][rOn]) { ResetPlayerRadar(playerid); } return 1; } public OnPlayerDeath(playerid, killerid, reason) { if(RadarData[playerid][rOn]) { ResetPlayerRadar(playerid); SendClientMessage(playerid, COLOR_GREY, "Radarul a fost oprit deoarece ai murit."); } return 1; } stock ResetPlayerRadar(playerid) { if(IsValidDynamicArea(RadarData[playerid][rAreaId])) { DestroyDynamicArea(RadarData[playerid][rAreaId]); } RadarData[playerid][rOn] = false; RadarData[playerid][rLimit] = 0; RadarData[playerid][rAreaId] = INVALID_STREAMER_ID; Iter_Remove(RadarsOn, playerid); TogglePlayerControllable(playerid, 1); return 1; } CMD:startradar(playerid, params[]) { if(!IsACop(playerid)) return SendClientMessage(playerid, COLOR_GREY, "Nu faci parte din departament."); if(OnDuty[playerid] != 1) return SendClientMessage(playerid, COLOR_LGREEN, "Eroare: Nu esti la datorie!"); new vehicleid = GetPlayerVehicleID(playerid); if(!Copcar2(vehicleid)) return SendClientMessage(playerid, COLOR_GREY, "Nu esti intr-o masina a factiunii."); if(RadarData[playerid][rOn]) return SendClientMessage(playerid, -1, "Ai deja activat radaru."); new viteza; if(sscanf(params, "d", viteza)) return SendClientMessage(playerid, COLOR_GREY, "USAGE: {FFFFFF}/startradar <Speed Limit>"); if(viteza > 200 || viteza < 40) return SendClientMessage(playerid, -1, "Viteza invalida (40-200)."); new Float:cX, Float:cY, Float:cZ, Float:cAngle; GetVehiclePos(vehicleid, cX, cY, cZ); GetVehicleZAngle(vehicleid, cAngle); new Float:rad = (90.0 - cAngle) * 0.0174532925; new Float:points[8]; points[0] = cX; points[1] = cY; points[2] = cX + (45.0 * floatcos(rad + 0.15)); points[3] = cY + (45.0 * floatsin(rad + 0.15)); points[4] = cX + (45.0 * floatcos(rad - 0.15)); points[5] = cY + (45.0 * floatsin(rad - 0.15)); points[6] = cX; points[7] = cY; new areaid = CreateDynamicPolygon(points, cZ - 3.0, cZ + 6.0, 4); Streamer_SetIntData(STREAMER_TYPE_AREA, areaid, E_STREAMER_EXTRA_ID, playerid + RADAR_STREAMER_IDENTIFIER); RadarData[playerid][rOn] = true; RadarData[playerid][rLimit] = viteza; RadarData[playerid][rAreaId] = areaid; Iter_Add(RadarsOn, playerid); TogglePlayerControllable(playerid, 0); new string[64]; format(string, sizeof(string), "Ai activat radarul. Viteza maxima: %d KM/H.", viteza); SendClientMessage(playerid, COLOR_YELLOW, string); return 1; } CMD:stopradar(playerid, params[]) { if(!IsACop(playerid)) return SendClientMessage(playerid, COLOR_GREY, "Nu faci parte din politie."); if(!RadarData[playerid][rOn]) return SendClientMessage(playerid, COLOR_GREY, "Nu ai radarul activ."); ResetPlayerRadar(playerid); SendClientMessage(playerid, COLOR_YELLOW, "Ai dezactivat radarul!"); return 1; } public OnPlayerEnterDynamicArea(playerid, areaid) { new extraid = Streamer_GetIntData(STREAMER_TYPE_AREA, areaid, E_STREAMER_EXTRA_ID); if(extraid >= RADAR_STREAMER_IDENTIFIER) { new copid = extraid - RADAR_STREAMER_IDENTIFIER; if(IsPlayerConnected(copid) && RadarData[copid][rOn] && RadarData[copid][rAreaId] == areaid) { if(playerid != copid && GetPlayerState(playerid) == PLAYER_STATE_DRIVER && OnDuty[playerid] != 1) { new viteza = Carspeed1(playerid); if(viteza > RadarData[copid][rLimit]) { new targetName[MAX_PLAYER_NAME], copName[MAX_PLAYER_NAME], msg[144]; GetPlayerName(playerid, targetName, sizeof(targetName)); GetPlayerName(copid, copName, sizeof(copName)); format(msg, sizeof(msg), "{FF0000}[RADAR] %s[ID:%d] conduce cu {FFFFFF}%d km/h{FF0000}, Locatie: %s, Limita: %d km/h!", targetName, playerid, viteza, GetPlayerZone(playerid), RadarData[copid][rLimit]); SendClientMessage(copid, COLOR_LIGHTBLUE, msg); format(msg, sizeof(msg), "{FF0000}[RADAR] Ai fost surprins de %s conducand cu {FFFFFF}%d km/h{FF0000}. Limita: %d km/h.", copName, viteza, RadarData[copid][rLimit]); SendClientMessage(playerid, COLOR_YELLOW, msg); } } } } return 1; } Am imbunatatit codul tau, ai avut un bug floatcos/floatsin, eroare de cash
-
enum e_RadarData { bool:rOn, rLimit } new RadarData[MAX_PLAYERS][e_RadarData]; new Iterator:RadarsOn<MAX_PLAYERS>; new pickuptimer; public OnGameModeInit() { pickuptimer = SetTimer("CustomPickups", 1000, true); return 1; } public OnGameModeExit() { KillTimer(pickuptimer); return 1; } CMD:startradar(playerid, params[]) { if(!IsACop(playerid)) return SendClientMessage(playerid, COLOR_GREY, "Nu faci parte din departament."); if(OnDuty[playerid] != 1) return SendClientMessage(playerid, COLOR_LGREEN, "Eroare: Nu esti la datorie!"); if(!Copcar2(GetPlayerVehicleID(playerid))) return SendClientMessage(playerid, COLOR_GREY, "Nu esti intr-o masina a factiunii."); if(RadarData[playerid][rOn]) return SendClientMessage(playerid, -1, "Ai deja activat radaru."); new viteza; if(sscanf(params, "d", viteza)) return SendClientMessage(playerid, COLOR_GREY, "USAGE: {FFFFFF}/startradar <Speed Limit>"); if(viteza > 200 || viteza < 40) return SendClientMessage(playerid, -1, "Viteza invalida (40-200)."); RadarData[playerid][rOn] = true; RadarData[playerid][rLimit] = viteza; Iter_Add(RadarsOn, playerid); TogglePlayerControllable(playerid, 0); new string[64]; format(string, sizeof(string), "Ai activat radarul. Viteza maxima: %d KM/H.", viteza); SendClientMessage(playerid, COLOR_YELLOW, string); return 1; } CMD:stopradar(playerid, params[]) { if(!IsACop(playerid)) return SendClientMessage(playerid, COLOR_GREY, "Nu faci parte din 専用 politiei."); if(!RadarData[playerid][rOn]) return SendClientMessage(playerid, COLOR_GREY, "Nu ai radarul activ."); RadarData[playerid][rOn] = false; RadarData[playerid][rLimit] = 0; Iter_Remove(RadarsOn, playerid); TogglePlayerControllable(playerid, 1); SendClientMessage(playerid, COLOR_YELLOW, "Ai dezactivat radarul!"); return 1; } forward CustomPickups(); public CustomPickups() { if(Iter_Count(RadarsOn) == 0) return 1; new Float:pX, Float:pY, Float:pZ; new targetName[MAX_PLAYER_NAME], copName[MAX_PLAYER_NAME], msg[144]; foreach(new o : Player) { if(GetPlayerState(o) != PLAYER_STATE_DRIVER || OnDuty[o] == 1) continue; new viteza = Carspeed1(o); GetPlayerPos(o, pX, pY, pZ); foreach(new i : RadarsOn) { if(viteza <= RadarData[i][rLimit]) continue; if(IsPlayerInRangeOfPoint(i, 30.0, pX, pY, pZ)) { GetPlayerName(o, targetName, sizeof(targetName)); GetPlayerName(i, copName, sizeof(copName)); format(msg, sizeof(msg), "{FF0000}[RADAR] %s[ID:%d] conduce cu {FF0000}%d km/h, Locatie: %s, Limita: %d km/h!", targetName, o, viteza, GetPlayerZone(o), RadarData[i][rLimit]); SendClientMessage(i, COLOR_LIGHTBLUE, msg); format(msg, sizeof(msg), "{FF0000}[RADAR] Ai fost surprins de %s conducand cu {FF0000}%d km/h. Limita: %d km/h.", copName, viteza, RadarData[i][rLimit]); SendClientMessage(o, COLOR_YELLOW, msg); break; } } } return 1; }
-
#include <a_samp> // Intervalul de timp în milisecunde (Ex: 30 de minute = 30 * 60 * 1000) #define WEATHER_TIMER_DELAY (30 * 60 * 1000) // Lista cu ID-urile de vreme alese de tine new const ValidWeathers[] = {1, 2, 3, 5, 9, 12, 15}; public OnGameModeInit() { // Pornim timerul care va apela funcția "ChangeRandomWeather" periodic SetTimer("ChangeRandomWeather", WEATHER_TIMER_DELAY, true); // Opțional: Setăm o vreme random chiar și când se deschide serverul ChangeRandomWeather(); return 1; } forward ChangeRandomWeather(); public ChangeRandomWeather() { // random(sizeof(ValidWeathers)) alege un index la întâmplare din vector new randomIndex = random(sizeof(ValidWeathers)); new newWeather = ValidWeathers[randomIndex]; // Setăm vremea globală pe server SetWeather(newWeather); // Trimitem un mesaj informativ tuturor jucătorilor (opțional) new string[64]; format(string, sizeof(string), "{FF9900}[Server]{FFFFFF} Vremea a fost schimbată (ID: %d).", newWeather); SendClientMessageToAll(-1, string); return 1; } /* sizeof(ValidWeathers): Află automat câte ID-uri ai pus în listă (în cazul tău, 7 ID-uri). Dacă pe viitor vrei să adaugi și ID-ul 7, doar îl treci în array {1, 2, 3, 5, 9, 12, 15, 7} și codul se va adapta singur. random(...): Extrage o poziție din listă (de la 0 la 6). SetWeather(newWeather): Schimbă vremea pentru toți jucătorii care se conectează sau sunt deja pe server.*/
-
function ScadeTimpBillboard() { new query[248]; for(new i = 0; i < MAX_BILLBOARDS; i++) { if(Billboard[i][blOwned] > 0) { if(Billboard[i][blExpire] > 0) { Billboard[i][blExpire] -= 60; UpdateLabelBillboard(i); mysql_format(SQL, query, sizeof(query), "UPDATE `billboards` SET `expire`='%d' WHERE `ID`='%d'", Billboard[i][blExpire], i); mysql_tquery(SQL, query, "", ""); if(Billboard[i][blExpire] <= 0) { mysql_format(SQL, query, sizeof(query), "UPDATE `users` SET `Billboard` = '0' WHERE `Username` = '%s'", Billboard[i][blOwner]); mysql_tquery(SQL, query, "", "" ); Billboard[i][blOwned] = 0; Billboard[i][blPhone] = 0; Billboard[i][blExpire] = 0; format(Billboard[i][blOwner],25,"AdmBot"); format(Billboard[i][blFont],25,"Arial"); format(Billboard[i][blMessage],32,"Your advertisement here!"); mysql_format(SQL,query,248,"UPDATE `billboards` SET `blFont`='Arial',`blOwned`='0',`blOwner`='AdmBot',`blPhone`='0',`blMessage`='Your advertisement here!',`expire`='0' WHERE `ID` = '%d' LIMIT 1",Billboard[i][blID]); mysql_tquery(SQL,query,"",""); SetDynamicObjectMaterialText(Billboard[i][blObjectID],0,Billboard[i][blMessage], OBJECT_MATERIAL_SIZE_256x128,Billboard[i][blFont], 18, 0, 0xFF000000, 0xFFFFFFFF, OBJECT_MATERIAL_TEXT_ALIGN_CENTER); UpdateLabelBillboard(i); } } } } return 1; } Poftim
-
cea mai proasta investitie in 2026 este deschiderea unui server samp, nu mai credeti in stele fratilor
-
Spor la vanzare, nustiu daca mai deschide cineva servere in 2026
-
Dezvoltare proiect SA-MP - Business International
khain.dev replied to Valentin-Z's topic in Caut servicii / partener / etc.
Daca un server are +- 500 playeri pe zi (in functie evident de sistemul donate pe server), intr-un an de zile lejer poti sa faci 40k+ euro -
Eu zic să nu vă mai pierdeți timpul cu cearta fără rost, fiecare decizie îi aparține și comentariile sau jignirile sunt lipsite de bun simț. Toți sunt proști în programare, nu este unul deștept să le știe pe toate, faptul că unul e mai slab și altul e mai bun în programare nu îți rezervă dreptul de a jigni omul. @Sancky să îți vezi de treaba ta iar @AlexxAdv spor la vânzare și nu mai scrieți prostii în topic să vadă toți bășinile voastre. Mergeți în PM și discutați până ce vă apucă tensiunea.
-
Prea simplu GM-ul pentru 2024.
-
In server log nu ai erori? Vezi ca problema ar putea fi in OnPlayerStreamIn, anume acest plugin aplica animatia daca catre alti jucatori, trimite ce cod ai acolo, plus actualizează plugin-ul streamer inclusiv si includul, ar putea fi problema si aici
-
Hmm...verifica daca CHAINSAW este incarcat corect si nu are erori, este complicat sa ne dăm seama din ce motiv nu arata si celor din jur, incearca si codul de jos CMD:dig(playerid, params[]) { ClearAnimations(playerid); ApplyAnimation(playerid, "CHAINSAW", "WEAPON_csawlo", 4.0, 1, 0, 0, 0, 3000, 1); ForceClassSelection(playerid); return 1; }
-
new Float:x, Float:y, Float:z; GetPlayerPos(playerid, x, y, z); foreach(new i : Player) { if(i != playerid && IsPlayerInRangeOfPoint(i, 10.0, GetPlayerPosX(playerid), GetPlayerPosY(playerid), GetPlayerPosZ(playerid))) { ApplyAnimation(i, "CHAINSAW", "WEAPON_csawlo", 4.0, 0, 0, 0, 0, 3000, 1); } }
-
/* ESTE DOAR UN EXEMPLU CUM POTI REALIZA */ #define MAX_GANGS 9 /* pui enum-urile tale */ enum GangData { GangID, GangTurfCount }; new GangInfo[MAX_GANGS][GangData]; CMD:top(playerid, params[]) { new gangIDs[MAX_GANGS] = {15, 16, 17, 18, 19, 20, 21, 22, 23}, GangCount[MAX_GANGS], new i, j; for (i = 0; i < MAX_GANGS; i++) { GangInfo[i][GangID] = gangIDs[i]; GangInfo[i][GangTurfCount] = 0; } foreach (new i : GangTurfs) { for (j = 0; j < MAX_GANGS; j++) { if (TurfInfo[i][zOwned] == GangInfo[j][GangID]) { GangInfo[j][GangTurfCount]++; break; } } } for (i = 0; i < MAX_GANGS - 1; i++) { for (j = i + 1; j < MAX_GANGS; j++) { if (GangInfo[i][GangTurfCount] < GangInfo[j][GangTurfCount]) { new tempID = GangInfo[i][GangID]; new tempCount = GangInfo[i][GangTurfCount]; GangInfo[i][GangID] = GangInfo[j][GangID]; GangInfo[i][GangTurfCount] = GangInfo[j][GangTurfCount]; GangInfo[j][GangID] = tempID; GangInfo[j][GangTurfCount] = tempCount; } } } SendClientMessage(playerid, COLOR_WHITE, "---------- Top Gangs ----------"); for (i = 0; i < MAX_GANGS; i++) { SendClientMessage(playerid, COLOR_WHITE, "{%s}%s {FFFFFF}- %d turfs", GetFactionColor(GangInfo[i][GangID]), FactionName(GangInfo[i][GangID]), GangInfo[i][GangTurfCount]); } SendClientMessage(playerid, COLOR_WHITE, "-------------------------------------"); return 1; }
-
Caut scripter pentru un proiect de lunga durata
khain.dev replied to IFYOUPLAY.TOP's topic in Caut servicii / partener / etc.
Este posibil să estimezi capacitatea de rezistență sa îi spun așa ce ține de playeri pe server. La o deschidere de server unde te aștepți că o să se conecteze în același timp +200 playeri, atunci poti face un DDos test asupra serverului tău inainte să il deschizi, practic printr-un test ddos asupra serverului poti vedea daca la deschidere o sa reziste sau nu în momentul unor conectari multiple. O altă metodă la care mulți ajung pentru a testa funcitonalitatea bună a GM-ului este adăugarea de boti fizici pe server, după cum știm un bot față de un player real folosește mai multe resurse ale serverului, respectiv poti adăuga un minim de 300 playeri și daca rezistă atât gm-ul cât și serverul, atunci e bine. Revenind la mentiunea ta, este greu sa estimezi cat de bine o sa tina server-ul tau la solicitari mari, totusi metodele mentionate mai sus simuleaza un test asupra functionalității optime al gm-ului și permite să vezi dacă poate rezista la solicitări mari sau nu. -
Nu va mai pierdeți ambii timpul cu acest subiect, în caz contrar, fratele @-=[Vyorel]=- vă rezolvă rapid
-
Ok.
-
Fiecare are dreptul de a folosi acea metodă pe care o consideră cea mai bună.
-
Recomand să te familiarizezi cu acest wiki - https://www.open.mp/docs/tutorials/stringmanipulation. Rezum acest wiki Format se folosește pentru a gestiona adăugarea incrementală de texte în buffer, nu doar pentru a măsura lungimea șirului, spre deosebire de strlen.
-
Cum adaug foreach in gamemode u meu?
khain.dev replied to Divil.Scorpiono's question in Ajutor Scripting
Da, nu este plugin, ai dreptate. -
Salut! format nu returnează o valoare în codul scris de mine, ci doar actualizează buffer-ul de șiruri de caractere pe care îl primește ca parametru, adică, arăt lungimea totală a șirului len care este actualizată cu numărul de caractere adăugate de fiecare dată când format este apelată.
-
Dar iarăși, dacă vrei sa afișezi un Dialog pentru fiecare player care solicita aceasta comanda, nu este rentabil din punct de vedere a utilizării memoriei, la un online +500 o sa ai putine probleme. Din acest motiv, majoritatea folosesc un singur dialog.
-
Pai, dacă luăm în calcul ce ai zis, putem face puțin diferit codul CMD:players(playerid, params[]) { new string[128 * MAX_PLAYERS], playerName[24], playerScore, len = 0; for (new i = 0; i < MAX_PLAYERS; i++) { if (IsPlayerConnected(i)) { GetPlayerName(i, playerName, sizeof(playerName)); playerScore = GetPlayerScore(i); len += format(string[len], sizeof(string) - len, "%s - %d\n", playerName, playerScore); if (len >= sizeof(string) - 128) { break; } } } if (len == 0) { strcat(string, "Nu există jucători pe server.\n", sizeof(string)); } ShowPlayerDialog(playerid, DialogNoResponse, DIALOG_STYLE_LIST, "Jucatori pe server", string, ">", ""); return 1; }
-
Salut! Iti pot propune versiunea mea pentru comanda ta. CMD:players(playerid, params[]) { new string[128 * MAX_PLAYERS], playerName[24], playerScore, len = 0; for (new i = 0; i < MAX_PLAYERS; i++) { if (IsPlayerConnected(i)) { GetPlayerName(i, playerName, sizeof(playerName)); playerScore = GetPlayerScore(i); len += format(string[len], sizeof(string) - len, "%s - %d\n", playerName, playerScore); } } if (len == 0) strcat(string, "Nu există jucători pe server.\n", sizeof(string)); ShowPlayerDialog(playerid, DialogNoResponse, DIALOG_STYLE_LIST, "Jucatori pe server", string, ">", ""); return 1; }
-
Cum adaug foreach in gamemode u meu?
khain.dev replied to Divil.Scorpiono's question in Ajutor Scripting
Acest includ are și plugin -
Cum adaug foreach in gamemode u meu?
khain.dev replied to Divil.Scorpiono's question in Ajutor Scripting
Salut, descărca cea mai noua versiune de aici https://github.com/karimcambridge/samp-foreach In server.cfg nu uita sa adaugi la plugins si foreach.so (linux) sau .dll (windows) /* dupa a_samp baga acest includ */ #include <a_samp> #include <foreach> public OnGameModeInit() { foreach (new p : Player) { /* Cod pentru fiecare jucător */ } foreach (new v : Vehicle) { /* Cod pentru fiecare vehicul */ } return 1; }
