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];
Tworzenie laboratorium
Rozpoczęcie gotowania
Proces gotowania
Eventy podczas gotowania
Zakonczenie gotowania
komendy gracza
ekonomia
Przykładowe lokacje
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:
- Lokacje laboratoryjne (ukryte miejsca w San Andreas)
- Multi-stage crafting (zbieranie składników → gotowanie → pakowanie)
- System jakości (czystość mety wpływa na cenę)
- Ryzyko (policja, wybuchy, zatrucia)
- Ekonomia (supply chain od składników po sprzedaż)
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;
}
{
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);
}
{
// 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;
}
{
// 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));
}
{
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;
}
{
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);
}
{
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%)
#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);
// 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);
Spoiler