![]() |
|
[propozycja]Laboratorium mety - Wersja do druku +- Mrucznik Role Play (https://mrucznik-rp.pl) +-- Dział: Zgłoszenia od graczy (https://mrucznik-rp.pl/forumdisplay.php?fid=18) +--- Dział: Propozycje (https://mrucznik-rp.pl/forumdisplay.php?fid=22) +---- Dział: Serwer (https://mrucznik-rp.pl/forumdisplay.php?fid=24) +---- Wątek: [propozycja]Laboratorium mety (/showthread.php?tid=938) |
[propozycja]Laboratorium mety - Abrav - 17 Grudnia 2025 Dodanie opcji gotowania mety w Journeyu nie będę ukrywał jestem leniwy moze i troche glupi, więc wrzucę szkic mojego pomysłu rozwinięty przez ej aj Zapraszam się do zapoznania ? SYSTEM GOTOWANIA METY W JOURNEY - Kompleksowa Propozycja ? KONCEPCJA OGÓLNA System produkcji narkotyków oparty o:
struktura system //-----------------<[ Definicje: ]>------------------- // Typy lokacji #define METH_LAB_MOBILE 0 // Kamper/przyczepa #define METH_LAB_HOUSE 1 // Dom/baza #define METH_LAB_WAREHOUSE 2 // Magazyn/fabryka // Etapy produkcji #define METH_STAGE_IDLE 0 // Oczekiwanie #define METH_STAGE_PREPARING 1 // Przygotowanie składników #define METH_STAGE_COOKING 2 // Gotowanie #define METH_STAGE_COOLING 3 // Chłodzenie #define METH_STAGE_PACKAGING 4 // Pakowanie #define METH_STAGE_COMPLETE 5 // Gotowe // Jakość produktu #define METH_QUALITY_LOW 0 // 30-50% czystości #define METH_QUALITY_MEDIUM 1 // 51-75% czystości #define METH_QUALITY_HIGH 2 // 76-90% czystości #define METH_QUALITY_ULTRA 3 // 91-99% czystości (blue meth) // Składniki #define INGREDIENT_PSEUDOEPHEDRINE 0 // Pseudoefedryna (z aptek) #define INGREDIENT_LITHIUM 1 // Lit (z baterii) #define INGREDIENT_ANHYDROUS 2 // Amoniak bezwodny (z farm) #define INGREDIENT_ACID 3 // Kwas solny (z magazynów) #define INGREDIENT_RED_PHOSPHORUS 4 // Czerwony fosfor (czarny rynek) #define INGREDIENT_IODINE 5 // Jod (apteki) // Wyposażenie #define EQUIPMENT_BURNER 0 // Palnik #define EQUIPMENT_FLASK 1 // Kolba #define EQUIPMENT_CONDENSER 2 // Skraplacz #define EQUIPMENT_FILTER 3 // Filtr #define EQUIPMENT_SCALE 4 // Waga precyzyjna #define EQUIPMENT_PROTECTIVE 5 // Strój ochronny // Limity #define MAX_METH_LABS 50 #define MAX_COOKING_SLOTS 5 // Max 5 jednoczesnych procesów #define COOKING_TIME_BASE 180 // 3 minuty bazowy czas #define MAX_BATCH_SIZE 10 // Max 10 porcji na raz // Ceny (za gram) #define METH_PRICE_LOW 150 #define METH_PRICE_MEDIUM 300 #define METH_PRICE_HIGH 500 #define METH_PRICE_ULTRA 800 // Ryzyko #define EXPLOSION_CHANCE_BASE 5 // 5% szansy na wybuch #define POLICE_CALL_CHANCE 10 // 10% szansy na zgłoszenie #define CONTAMINATION_CHANCE 15 // 15% szansy na zanieczyszczenie //-----------------<[ Enumy: ]>------------------- enum E_METH_LAB { lab_ID, lab_Type, Float:lab_X, Float:lab_Y, Float:lab_Z, Float:lab_Radius, lab_Interior, lab_VirtualWorld, lab_Owner, // UID właściciela/organizacji lab_OwnerType, // 0=gracz, 1=org lab_SecurityLevel, // 0-5 (wpływa na szansę na rajd) lab_QualityBonus, // 0-20% bonus do jakości lab_SpeedBonus, // 0-30% bonus do szybkości bool:lab_Active, lab_LastRaid, // Timestamp ostatniego rajdu lab_PickupID, lab_IconID, Text3D:lab_Label } enum E_COOKING_PROCESS { cook_LabID, cook_CookerUID, cook_Stage, cook_Progress, // 0-100% cook_Quality, // Przewidywana jakość cook_Purity, // 30-99% czystość cook_BatchSize, // Ile porcji cook_StartTime, cook_EstimatedTime, bool:cook_HasProtection, bool:cook_Active } enum E_INGREDIENT_STORAGE { ing_Pseudoephedrine, ing_Lithium, ing_Anhydrous, ing_Acid, ing_RedPhosphorus, ing_Iodine } enum E_METH_PRODUCT { prod_Quality, prod_Purity, prod_Amount, // Gramy prod_CookedBy, // UID prod_CookedTime, prod_LabID } //-----------------<[ Zmienne: ]>------------------- new MethLabs[MAX_METH_LABS][E_METH_LAB]; new CookingProcesses[MAX_PLAYERS][E_COOKING_PROCESS]; new PlayerIngredients[MAX_PLAYERS][E_INGREDIENT_STORAGE]; new PlayerEquipment[MAX_PLAYERS][6]; // 6 typów wyposażenia new PlayerMethStash[MAX_PLAYERS][10][E_METH_PRODUCT]; // Do 10 batchy w stashu new PlayerCookingSkill[MAX_PLAYERS]; // 0-1000 (wpływa na jakość) new MethLabCount = 0; new bool:CookingInProgress[MAX_PLAYERS]; CreateMethLab(type, Float:x, Float:y, Float:z, ownerUID, ownerType) { if(MethLabCount >= MAX_METH_LABS) return -1; new id = MethLabCount++; MethLabs[id][lab_ID] = id; MethLabs[id][lab_Type] = type; MethLabs[id][lab_X] = x; MethLabs[id][lab_Y] = y; MethLabs[id][lab_Z] = z; MethLabs[id][lab_Owner] = ownerUID; MethLabs[id][lab_OwnerType] = ownerType; MethLabs[id][lab_Active] = true; MethLabs[id][lab_SecurityLevel] = 1; MethLabs[id][lab_QualityBonus] = 0; MethLabs[id][lab_SpeedBonus] = 0; // Ustaw promień w zależności od typu switch(type) { case METH_LAB_MOBILE: MethLabs[id][lab_Radius] = 3.0; case METH_LAB_HOUSE: MethLabs[id][lab_Radius] = 5.0; case METH_LAB_WAREHOUSE: MethLabs[id][lab_Radius] = 10.0; } // Stwórz pickup i mapicon MethLabs[id][lab_PickupID] = CreateDynamicPickup(1279, 1, x, y, z, -1, -1); // Ikonka chemikaliów MethLabs[id][lab_IconID] = CreateDynamicMapIcon(x, y, z, 51, 0, -1, -1, -1, 100.0); // Skull icon // Label 3D new label[256]; format(label, sizeof(label), "{FF0000}[LABORATORIUM METY]\n{FFFFFF}Użyj {FFFF00}/gotujmete\n{FFFFFF}Typ: %s", GetLabTypeName(type) ); MethLabs[id][lab_Label] = CreateDynamic3DTextLabel(label, 0xFF0000FF, x, y, z+0.5, 10.0); Log(serverLog, INFO, "Utworzono laboratorium mety ID:%d typ:%d owner:%d", id, type, ownerUID); return id; } GetLabTypeName(type) { new name[32]; switch(type) { case METH_LAB_MOBILE: name = "Kamper"; case METH_LAB_HOUSE: name = "Dom"; case METH_LAB_WAREHOUSE: name = "Magazyn"; default: name = "Nieznany"; } return name; } CMD:gotujmete(playerid, params[]) { // Sprawdzenia if(!IsPlayerInAnyMethLab(playerid)) return sendErrorMessage(playerid, "Nie jesteś w laboratorium!"); if(CookingInProgress[playerid]) return sendErrorMessage(playerid, "Już gotujesz metę!"); if(PlayerInfo[playerid][pJailed] > 0) return sendErrorMessage(playerid, "Nie możesz tego zrobić w więzieniu!"); new labID = GetPlayerMethLabID(playerid); if(labID == -1) return sendErrorMessage(playerid, "Błąd laboratorium!"); // Sprawdź dostęp if(!HasMethLabAccess(playerid, labID)) return sendErrorMessage(playerid, "Nie masz dostępu do tego laboratorium!"); // Pokaż dialog wyboru recepty ShowMethRecipeDialog(playerid, labID); return 1; } ShowMethRecipeDialog(playerid, labID) { new dialog[2048], line[256]; strcat(dialog, "Receptura\tSkładniki\tCzas\tJakość\n"); // Receptura 1: P2P (prosta, niska jakość) format(line, sizeof(line), "{FFFF00}P2P Method\t{FFFFFF}Pseudo x3, Kwas x2\t{00FF00}3 min\t{FF8800}Niska\n"); strcat(dialog, line); // Receptura 2: Red Phosphorus (średnia) format(line, sizeof(line), "{FFFF00}Red P Method\t{FFFFFF}Pseudo x4, Red P x2, Jod x2\t{FFFF00}5 min\t{FFFF00}Średnia\n"); strcat(dialog, line); // Receptura 3: Birch Reduction (wysoka) format(line, sizeof(line), "{FFFF00}Birch Method\t{FFFFFF}Pseudo x5, Lit x3, Amoniak x3\t{FF8800}7 min\t{00FF00}Wysoka\n"); strcat(dialog, line); // Receptura 4: Blue Sky (ultra - wymaga skill 500+) if(PlayerCookingSkill[playerid] >= 500) { format(line, sizeof(line), "{00FFFF}Blue Sky™\t{FFFFFF}Wszystkie x5\t{FF0000}10 min\t{00FFFF}Ultra\n"); strcat(dialog, line); } ShowPlayerDialogEx(playerid, DIALOG_METH_RECIPE, DIALOG_STYLE_TABLIST_HEADERS, "Wybierz recepturę", dialog, "Gotuj", "Anuluj"); SetPVarInt(playerid, "MethLabID", labID); } // Dialog response case DIALOG_METH_RECIPE: { if(!response) return 1; new labID = GetPVarInt(playerid, "MethLabID"); new recipe = listitem; // Sprawdź składniki if(!HasRequiredIngredients(playerid, recipe)) { sendErrorMessage(playerid, "Brakuje Ci składników!"); ShowIngredientsNeeded(playerid, recipe); return 1; } // Sprawdź wyposażenie if(!HasRequiredEquipment(playerid, recipe)) { sendErrorMessage(playerid, "Brakuje Ci wyposażenia!"); return 1; } // Rozpocznij gotowanie StartCooking(playerid, labID, recipe); } StartCooking(playerid, labID, recipe) { // Zabierz składniki RemoveIngredients(playerid, recipe); // Ustaw proces CookingProcesses[playerid][cook_LabID] = labID; CookingProcesses[playerid][cook_CookerUID] = PlayerInfo[playerid][pUID]; CookingProcesses[playerid][cook_Stage] = METH_STAGE_PREPARING; CookingProcesses[playerid][cook_Progress] = 0; CookingProcesses[playerid][cook_Active] = true; CookingProcesses[playerid][cook_StartTime] = gettime(); // Oblicz parametry new baseTime = GetRecipeTime(recipe); new speedBonus = MethLabs[labID][lab_SpeedBonus]; CookingProcesses[playerid][cook_EstimatedTime] = baseTime - (baseTime * speedBonus / 100); // Oblicz jakość new skill = PlayerCookingSkill[playerid]; new labQuality = MethLabs[labID][lab_QualityBonus]; new baseQuality = GetRecipeQuality(recipe); CookingProcesses[playerid][cook_Quality] = baseQuality; CookingProcesses[playerid][cook_Purity] = 30 + random(20) + (skill / 20) + labQuality; // Ustaw batch size (w zależności od receptury) CookingProcesses[playerid][cook_BatchSize] = GetRecipeBatchSize(recipe); // Sprawdź strój ochronny CookingProcesses[playerid][cook_HasProtection] = (PlayerEquipment[playerid][EQUIPMENT_PROTECTIVE] > 0); CookingInProgress[playerid] = true; // Komunikaty SendClientMessage(playerid, COLOR_YELLOW, "* Rozpoczynasz przygotowywanie składników..."); ApplyAnimation(playerid, "BOMBER", "BOM_Plant", 4.0, 0, 0, 0, 0, 0); // Timer postępu SetTimerEx("MethCookingProgress", 5000, false, "d", playerid); // Logging Log(methLog, INFO, "%s rozpoczął gotowanie mety w lab %d, recipe %d", GetPlayerLogName(playerid), labID, recipe); // Potencjalne zgłoszenie na policję if(random(100) < POLICE_CALL_CHANCE) { CallPoliceForSuspiciousActivity(labID); } } forward MethCookingProgress(playerid); public MethCookingProgress(playerid) { if(!CookingInProgress[playerid]) return; if(!IsPlayerInMethLab(playerid, CookingProcesses[playerid][cook_LabID])) { // Gracz opuścił lab AbortCooking(playerid, "Opuściłeś laboratorium!"); return; } // Zwiększ postęp CookingProcesses[playerid][cook_Progress] += 5; // Komunikat postępu new stage = CookingProcesses[playerid][cook_Stage]; new progress = CookingProcesses[playerid][cook_Progress]; new msg[128]; format(msg, sizeof(msg), "~y~Gotowanie: ~w~%s~n~~g~%d%%", GetStageName(stage), progress); GameTextForPlayer(playerid, msg, 5000, 3); // Zmiana etapu if(progress >= 100) { CookingProcesses[playerid][cook_Progress] = 0; CookingProcesses[playerid][cook_Stage]++; if(CookingProcesses[playerid][cook_Stage] == METH_STAGE_COMPLETE) { CompleteCooking(playerid); return; } else { // Następny etap new newStage = CookingProcesses[playerid][cook_Stage]; format(msg, sizeof(msg), "* %s...", GetStageName(newStage)); SendClientMessage(playerid, COLOR_YELLOW, msg); // Losowe eventy CheckCookingEvents(playerid); } } // Kolejna iteracja SetTimerEx("MethCookingProgress", 5000, false, "d", playerid); } GetStageName(stage) { new name[64]; switch(stage) { case METH_STAGE_PREPARING: name = "Przygotowanie składników"; case METH_STAGE_COOKING: name = "Gotowanie"; case METH_STAGE_COOLING: name = "Chłodzenie"; case METH_STAGE_PACKAGING: name = "Pakowanie"; default: name = "Nieznany"; } return name; } CheckCookingEvents(playerid) { new chance = random(100); new hasProtection = CookingProcesses[playerid][cook_HasProtection]; // 1. WYBUCH (katastrofalne) if(chance < (EXPLOSION_CHANCE_BASE - (hasProtection ? 3 : 0))) { MethLabExplosion(playerid); return; } // 2. Oparzenia chemiczne if(chance < 15 && !hasProtection) { new Float:hp; GetPlayerHealth(playerid, hp); SetPlayerHealth(playerid, hp - 20.0); SendClientMessage(playerid, COLOR_RED, "* Doznałeś oparzeń chemicznych! [-20 HP]"); ApplyAnimation(playerid, "SWEET", "Sweet_injuredloop", 4.0, 1, 0, 0, 0, 0); } // 3. Zanieczyszczenie (obniża jakość) if(chance < CONTAMINATION_CHANCE) { CookingProcesses[playerid][cook_Purity] -= random(10); SendClientMessage(playerid, COLOR_ORANGE, "* Odczynniki uległy zanieczyszczeniu..."); } // 4. Perfekcyjny batch (zwiększa jakość) if(chance > 95 && PlayerCookingSkill[playerid] > 300) { CookingProcesses[playerid][cook_Purity] += random(5); SendClientMessage(playerid, COLOR_LIGHTGREEN, "* Doskonała reakcja chemiczna! [+Jakość]"); PlayerCookingSkill[playerid] += 5; } // 5. Podejrzana aktywność (policja) if(chance < 5) { new labID = CookingProcesses[playerid][cook_LabID]; CallPoliceForSuspiciousActivity(labID); } } MethLabExplosion(playerid) { new labID = CookingProcesses[playerid][cook_LabID]; new Float:x, Float:y, Float:z; x = MethLabs[labID][lab_X]; y = MethLabs[labID][lab_Y]; z = MethLabs[labID][lab_Z]; // Efekty wizualne CreateExplosion(x, y, z, 2, 10.0); CreateExplosion(x+2, y+2, z, 2, 10.0); // Obrażenia SetPlayerHealth(playerid, 0.0); // Zniszcz lab if(MethLabs[labID][lab_SecurityLevel] < 3) { MethLabs[labID][lab_Active] = false; DestroyMethLab(labID); } // Komunikaty SendClientMessage(playerid, COLOR_RED, "* WYBUCH! Laboratorium eksplodowało!"); new msg[128]; format(msg, sizeof(msg), "~r~WYBUCH!"); GameTextForAll(msg, 3000, 3); // Zgłoszenie na policję format(msg, sizeof(msg), "Centrala: Zgłoszono wybuch w okolicy %.0f %.0f %.0f", x, y, z); SendFamilyMessage(FRAC_LSPD, COLOR_ALLDEPT, msg, true); Log(methLog, WARNING, "Laboratorium %d eksplodowało! Gotujący: %s", labID, GetPlayerLogName(playerid)); } CompleteCooking(playerid) { CookingInProgress[playerid] = false; new quality = CookingProcesses[playerid][cook_Quality]; new purity = CookingProcesses[playerid][cook_Purity]; new amount = CookingProcesses[playerid][cook_BatchSize]; // Ograniczenia czystości if(purity < 30) purity = 30; if(purity > 99) purity = 99; // Dodaj do stashu gracza new slot = GetFreeProductSlot(playerid); if(slot == -1) { sendErrorMessage(playerid, "Twój stash jest pełny! Sprzedaj lub schowaj starsze partie."); return; } PlayerMethStash[playerid][slot][prod_Quality] = quality; PlayerMethStash[playerid][slot][prod_Purity] = purity; PlayerMethStash[playerid][slot][prod_Amount] = amount; PlayerMethStash[playerid][slot][prod_CookedBy] = PlayerInfo[playerid][pUID]; PlayerMethStash[playerid][slot][prod_CookedTime] = gettime(); PlayerMethStash[playerid][slot][prod_LabID] = CookingProcesses[playerid][cook_LabID]; // Komunikat sukcesu new msg[256]; format(msg, sizeof(msg), "{00FF00}* Gotowanie zakończone sukcesem!{FFFFFF}\n" \ "Jakość: %s\n" \ "Czystość: {00FFFF}%d%%{FFFFFF}\n" \ "Ilość: {FFFF00}%d gram{FFFFFF}\n" \ "Wartość: {00FF00}$%s", GetQualityName(quality), purity, amount, formatMoney(CalculateMethValue(quality, purity, amount)) ); SendClientMessage(playerid, -1, msg); // Skill up new skillGain = 2 + (quality * 2) + (purity / 20); PlayerCookingSkill[playerid] += skillGain; SendClientMessage(playerid, COLOR_GRAD2, sprintf("* Skill gotowania +%d [%d/1000]", skillGain, PlayerCookingSkill[playerid])); // Achievement if(purity >= 95) { SendClientMessage(playerid, COLOR_ACHIEVEMENT, "*** OSIĄGNIĘCIE: Niemal idealny!"); } // Log Log(methLog, INFO, "%s ukończył gotowanie: quality=%d purity=%d amount=%d", GetPlayerLogName(playerid), quality, purity, amount); // Reset procesu ResetCookingProcess(playerid); } GetQualityName(quality) { new name[32]; switch(quality) { case METH_QUALITY_LOW: name = "{FF8800}Niska"; case METH_QUALITY_MEDIUM: name = "{FFFF00}Średnia"; case METH_QUALITY_HIGH: name = "{00FF00}Wysoka"; case METH_QUALITY_ULTRA: name = "{00FFFF}Ultra (Blue Sky™)"; default: name = "Nieznana"; } return name; } CalculateMethValue(quality, purity, amount) { new basePrice; switch(quality) { case METH_QUALITY_LOW: basePrice = METH_PRICE_LOW; case METH_QUALITY_MEDIUM: basePrice = METH_PRICE_MEDIUM; case METH_QUALITY_HIGH: basePrice = METH_PRICE_HIGH; case METH_QUALITY_ULTRA: basePrice = METH_PRICE_ULTRA; } // Czystość wpływa na cenę (±50%) new purityBonus = ((purity - 65) * basePrice) / 100; new pricePerGram = basePrice + purityBonus; return pricePerGram * amount; } CMD:metastash(playerid) { new dialog[1024], line[128]; new count = 0; strcat(dialog, "Slot\tJakość\tCzystość\tIlość\tWartość\n"); for(new i=0; i<10; i++) { if(PlayerMethStash[playerid][i][prod_Amount] > 0) { new value = CalculateMethValue( PlayerMethStash[playerid][i][prod_Quality], PlayerMethStash[playerid][i][prod_Purity], PlayerMethStash[playerid][i][prod_Amount] ); format(line, sizeof(line), "#%d\t%s\t%d%%\t%dg\t$%s\n", i+1, GetQualityName(PlayerMethStash[playerid][i][prod_Quality]), PlayerMethStash[playerid][i][prod_Purity], PlayerMethStash[playerid][i][prod_Amount], formatMoney(value) ); strcat(dialog, line); count++; } } if(count == 0) { sendErrorMessage(playerid, "Nie masz mety w stashu!"); return 1; } ShowPlayerDialogEx(playerid, DIALOG_METH_STASH, DIALOG_STYLE_TABLIST_HEADERS, "Twój stash mety", dialog, "Sprzedaj", "Wyjdź"); return 1; } CMD:kupskładniki(playerid, params[]) { // Dialog wyboru składników z czarnego rynku ShowIngredientShop(playerid); return 1; } CMD:statymeta(playerid) { new msg[512]; format(msg, sizeof(msg), "{00FF00}=== STATYSTYKI GOTOWANIA METY ==={FFFFFF}\n\n" \ "Skill: {FFFF00}%d/1000{FFFFFF} (poziom %d)\n" \ "Całkowita produkcja: {00FF00}%d gram{FFFFFF}\n" \ "Najwyższa czystość: {00FFFF}%d%%{FFFFFF}\n" \ "Zarobki z mety: {00FF00}$%s{FFFFFF}\n" \ "Wybuchy: {FF0000}%d{FFFFFF}", PlayerCookingSkill[playerid], PlayerCookingSkill[playerid] / 100, GetPVarInt(playerid, "TotalMethProduced"), GetPVarInt(playerid, "BestMethPurity"), formatMoney(GetPVarInt(playerid, "TotalMethEarnings")), GetPVarInt(playerid, "MethExplosions") ); ShowPlayerDialog(playerid, DIALOG_INFO, DIALOG_STYLE_MSGBOX, "Statystyki gotowania", msg, "OK", ""); return 1; }[/spoiiler] dla sluzb [spoiler]CallPoliceForSuspiciousActivity(labID) { new Float:x = MethLabs[labID][lab_X]; new Float:y = MethLabs[labID][lab_Y]; new Float:z = MethLabs[labID][lab_Z]; new msg[256]; format(msg, sizeof(msg), "Centrala: Zgłoszono podejrzaną aktywność chemiczną w okolicy {FFFF00}%.0f, %.0f{FFFFFF}", x, y); SendFamilyMessage(FRAC_LSPD, COLOR_ALLDEPT, msg, true); SendFamilyMessage(FRAC_FBI, COLOR_ALLDEPT, msg, true); // Marker na mapie dla PD (zanika po 2 min) foreach(new i : Player) { if(OnDuty[i] && (PlayerInfo[i][pMember] == FRAC_LSPD || PlayerInfo[i][pMember] == FRAC_FBI)) { SetPlayerCheckpoint(i, x, y, z, 50.0); SetTimerEx("DisablePlayerCheckpoint", 120000, false, "d", i); } } MethLabs[labID][lab_LastRaid] = gettime(); } CMD:rajdlab(playerid, params[]) { if(PlayerInfo[playerid][pMember] != FRAC_LSPD && PlayerInfo[playerid][pMember] != FRAC_FBI) return sendErrorMessage(playerid, "Nie jesteś w LSPD/FBI!"); if(!OnDuty[playerid]) return sendErrorMessage(playerid, "Nie jesteś na służbie!"); new labID = GetNearestMethLab(playerid, 30.0); if(labID == -1) return sendErrorMessage(playerid, "Nie ma laboratorium w pobliżu!"); // Rajd RaidMethLab(playerid, labID); return 1; } RaidMethLab(officerID, labID) { // Aresztuj wszystkich w labie new arrests = 0; foreach(new i : Player) { if(IsPlayerInMethLab(i, labID)) { if(CookingInProgress[i]) { // Gracz gotujący = więcej przestępstw NadajWL(i, 8, "produkcja narkotyków"); ZabierzKase(i, 50000); arrests++; SendClientMessage(i, COLOR_LIGHTRED, "* Zostałeś aresztowany za produkcję metamfetaminy!"); // Zniszcz batch AbortCooking(i, "Rajd policji!"); } else { NadajWL(i, 4, "przebywanie w laboratorium narkotyków"); arrests++; } } } // Zniszcz lab (chyba że wysoki security) if(MethLabs[labID][lab_SecurityLevel] < 4) { MethLabs[labID][lab_Active] = false; DestroyMethLab(labID); SendClientMessage(officerID, COLOR_LIGHTGREEN, "* Laboratorium zostało zniszczone przez DEA!"); } // Nagroda dla PD new reward = 25000 + (arrests * 10000); DajKase(officerID, reward); SendClientMessage(officerID, COLOR_LIGHTGREEN, sprintf("* Pomyślny rajd! Aresztowano: %d osób. Nagroda: $%s", arrests, formatMoney(reward))); Log(methLog, INFO, "%s przeprowadził rajd na lab %d, aresztowano %d osób", GetPlayerLogName(officerID), labID, arrests); } // KOSZTY SKŁADNIKÓW (za sztukę) #define COST_PSEUDOEPHEDRINE 800 // Apteka #define COST_LITHIUM 1200 // Baterie (trudniejsze) #define COST_ANHYDROUS 1500 // Farmy (nielegalny dostęp) #define COST_ACID 600 // Magazyny chemiczne #define COST_RED_PHOSPHORUS 2000 // Czarny rynek #define COST_IODINE 500 // Apteka // RECEPTURY I KOSZTY: // P2P: 3xPseudo + 2xAcid = 3600$ → produkuje 3g @ 150$/g = 450$ (STRATA bez skilla) // Red P: 4xPseudo + 2xRedP + 2xIodine = 9200$ → 5g @ 300$/g = 1500$ (mała strata/zysk) // Birch: 5xPseudo + 3xLit + 3xAmon = 12100$ → 7g @ 500$/g = 3500$ (dobry zysk) // Blue Sky: Wszystkie x5 = 31000$ → 10g @ 800$/g = 8000$ (mega zysk, ale wymaga skill 500+) // WYPOSAŻENIE (jednorazowy zakup, nie zużywa się) #define COST_BURNER 5000 #define COST_FLASK 3000 #define COST_CONDENSER 8000 #define COST_FILTER 2000 #define COST_SCALE 4000 #define COST_PROTECTIVE 15000 // Zmniejsza szansę na obrażenia // LABORATORIUM (koszt założenia) #define COST_LAB_MOBILE 50000 // Kamper #define COST_LAB_HOUSE 150000 // Dom/baza #define COST_LAB_WAREHOUSE 500000 // Magazyn (najlepszy) // UPGRADE'Y LABORATORIUM #define COST_SECURITY_UPGRADE 25000 // +1 security (max 5) #define COST_QUALITY_UPGRADE 50000 // +5% quality bonus (max 20%) #define COST_SPEED_UPGRADE 40000 // +10% speed bonus (max 30%) // W GameModeInit lub przy starcie: // 1. Opuszczona przyczepa w El Quebrados (pustynia) CreateDefaultMethLab(METH_LAB_MOBILE, -1422.5, 2673.5, 55.8, 0, 0, 0); // 2. Dom w Palomino Creek CreateDefaultMethLab(METH_LAB_HOUSE, 2451.7, -1974.5, 13.5, 0, 0, 0); // 3. Magazyn w Docks (Los Santos) CreateDefaultMethLab(METH_LAB_WAREHOUSE, 2787.3, -2436.8, 13.6, 0, 0, 0); // 4. Kamper w Las Venturas (przemysłówka) CreateDefaultMethLab(METH_LAB_MOBILE, 1398.2, 2156.7, 11.0, 0, 0, 0); // 5. Opuszczona farma (Blueberry) CreateDefaultMethLab(METH_LAB_HOUSE, 79.5, -220.3, 2.5, 0, 0, 0); RE: [propozycja]Laboratorium mety - bewu - 17 Grudnia 2025 Petarda RE: [propozycja]Laboratorium mety - JamesBongs - 17 Grudnia 2025 Kody i skrypty z aj nie mają prawą działać trzeba by może ewentualnie bazować na niektórych tylko jego fragmentach. A to spora i długa droga pełna zakrętów. Sam kiedyś próbowałem coś takiego zrobić i z własnego doświadczenia mogę ci mordo powiedzieć to nie ma sensu, bo to po prostu nie działa a wygenerowany skrypt ma w sobie masę błędów i nie jest użyteczny. Sam staram się o rozbudowany system Coffee'Shopa ;) |

Spoiler