· 6 years ago · Jun 11, 2019, 07:36 PM
1#define FILTERSCRIPT
2#include <a_samp>
3#include <izcmd>
4#include <sqlitei>
5#include <sscanf2>
6#include <streamer>
7#include <YSI\y_iterate>
8
9#define MAX_PLANTS (250) // limit drogových rostlin
10#define MAX_DEALERS (15) // limit drogových dealerů
11
12 // -- VŠECHNO V SEKUNDÁCH --
13
14#define USE_DRUNKLEVEL // když se smaže tahle řádka, hráč nebude mít drunklevel po požití
15#define PLAYER_LIMIT (5) // hráč může zasadit maximálně X rostlin (výchozí: 5)
16#define PLANT_MAX_GROWTH (75) // hráč může nechat růst max. X gramů drog (výchizí: 75)
17#define GROWTH_INTERVAL (45) // rostlina poporoste každých X sekund (výchozí: 45)
18#define ROT_INTERVAL (300) // rostlina schnije X sekund po dokončení růstu (výchozí: 300)
19#define CARRY_LIMIT (150) // hráč může max. nést X gramů drog (výchozí: 150)
20#define SEED_LIMIT (25) // hráč může nést max. X semínek (výchozí: 25)
21#define SEED_PRICE (50) // cena semínek rostlin u dealera (výchozí: 50)
22#define DRUG_BUY_PRICE (20) // cena 1 gramu u dealera (výchozí: 20)
23#define DRUG_SELL_PRICE (16) // částka kterou dealeři zaplatí az gram drogy(výchozí: 16)
24#define OFFER_COOLDOWN (30) // jak dlouho musí hráč čekat než pošle další nabídku hráči (výchozí: 30)
25
26enum _:E_DIALOG
27{
28 DIALOG_DRUG_STATS = 8620,
29 DIALOG_CONFIRM_RESET,
30 DIALOG_DRUG_DEALER,
31 DIALOG_DRUG_DEALER_BUY_SEEDS,
32 DIALOG_DRUG_DEALER_BUY_DRUGS,
33 DIALOG_DRUG_DEALER_SELL,
34 DIALOG_DRUG_OFFER
35}
36
37enum E_PLANT
38{
39 plantedBy[MAX_PLAYER_NAME],
40 Float: plantX,
41 Float: plantY,
42 Float: plantZ,
43 plantGrowth,
44 plantObj,
45 plantTimer,
46 Text3D: plantLabel,
47 bool: gotLeaves
48}
49
50enum E_PLAYER
51{
52 // uložení
53 Drugs,
54 Seeds,
55 TotalUsed,
56 TotalPlanted,
57 TotalHarvestedPlants,
58 TotalHarvestedGrams,
59 TotalGiven,
60 TotalReceived,
61 TotalBought,
62 TotalBoughtPrice,
63 TotalSold,
64 TotalSoldPrice,
65 // temp
66 DrugsCooldown,
67 DealerID,
68 DrugsOfferedBy,
69 DrugsOfferedPrice,
70 DrugsOfferCooldown
71}
72
73enum E_DEALER
74{
75 // nahráno z db
76 dealerSkin,
77 dealerDrugs,
78 Float: dealerX,
79 Float: dealerY,
80 Float: dealerZ,
81 Float: dealerA,
82 // temp
83 dealerActorID,
84 Text3D: dealerLabel
85}
86
87new
88 PlantData[MAX_PLANTS][E_PLANT],
89 Iterator: Plants<MAX_PLANTS>;
90
91new
92 PlayerDrugData[MAX_PLAYERS][E_PLAYER],
93 RegenTimer[MAX_PLAYERS] = {-1, ...},
94 EffectTimer[MAX_PLAYERS] = {-1, ...};
95
96new
97 DealerData[MAX_DEALERS][E_DEALER],
98 Iterator: Dealers<MAX_DEALERS>;
99
100new
101 DB: DrugDB;
102
103new
104 DBStatement: LoadPlayer,
105 DBStatement: InsertPlayer,
106 DBStatement: SavePlayer;
107
108new
109 DBStatement: LoadDealers,
110 DBStatement: AddDealer,
111 DBStatement: UpdateDealer,
112 DBStatement: UpdateDealerDrugs,
113 DBStatement: RemoveDealer;
114
115RandomEx(min, max)
116 return random(max - min) + min;
117
118formatInt(intVariable, iThousandSeparator = ',', iCurrencyChar = '$')
119{
120 static
121 s_szReturn[ 32 ],
122 s_szThousandSeparator[ 2 ] = { ' ', EOS },
123 s_szCurrencyChar[ 2 ] = { ' ', EOS },
124 s_iVariableLen,
125 s_iChar,
126 s_iSepPos,
127 bool:s_isNegative
128 ;
129
130 format( s_szReturn, sizeof( s_szReturn ), "%d", intVariable );
131
132 if(s_szReturn[0] == '-')
133 s_isNegative = true;
134 else
135 s_isNegative = false;
136
137 s_iVariableLen = strlen( s_szReturn );
138
139 if ( s_iVariableLen >= 4 && iThousandSeparator)
140 {
141 s_szThousandSeparator[ 0 ] = iThousandSeparator;
142
143 s_iChar = s_iVariableLen;
144 s_iSepPos = 0;
145
146 while ( --s_iChar > _:s_isNegative )
147 {
148 if ( ++s_iSepPos == 3 )
149 {
150 strins( s_szReturn, s_szThousandSeparator, s_iChar );
151
152 s_iSepPos = 0;
153 }
154 }
155 }
156 if(iCurrencyChar) {
157 s_szCurrencyChar[ 0 ] = iCurrencyChar;
158 strins( s_szReturn, s_szCurrencyChar, _:s_isNegative );
159 }
160 return s_szReturn;
161}
162
163Float: DistanceBetweenPlayers(player1, player2)
164{
165 new Float: x, Float: y, Float: z;
166 GetPlayerPos(player2, x, y, z);
167 return GetPlayerDistanceFromPoint(player1, x, y, z);
168}
169
170GetClosestPlant(playerid, Float: range = 1.5)
171{
172 new id = -1, Float: dist = range, Float: tempdist;
173 foreach(new i : Plants)
174 {
175 tempdist = GetPlayerDistanceFromPoint(playerid, PlantData[i][plantX], PlantData[i][plantY], PlantData[i][plantZ]);
176
177 if(tempdist > range) continue;
178 if(tempdist <= dist)
179 {
180 dist = tempdist;
181 id = i;
182 }
183 }
184
185 return id;
186}
187
188GetClosestDealer(playerid, Float: range = 2.0)
189{
190 new id = -1, Float: dist = range, Float: tempdist;
191 foreach(new i : Dealers)
192 {
193 tempdist = GetPlayerDistanceFromPoint(playerid, DealerData[i][dealerX], DealerData[i][dealerY], DealerData[i][dealerZ]);
194
195 if(tempdist > range) continue;
196 if(tempdist <= dist)
197 {
198 dist = tempdist;
199 id = i;
200 }
201 }
202
203 return id;
204}
205
206ShowDrugStats(playerid)
207{
208 new dialog[350];
209 format(
210 dialog,
211 sizeof(dialog),
212 "Drugs\t%s gramů\n\
213 Semínka\t%s\n\
214 Použité drogy\t%s gramů\n\
215 Zasazené drogy\t%s\n\
216 Sklizené rostliny\t%s (%s gramů)\n\
217 Rozdané drogy\t%s gramů\n\
218 Získané drogy\t%s gramů\n\
219 Koupené drogy\t%s gramů {2ECC71}(%s)\n\
220 Prodané drogy\t%s gramů {2ECC71}(%s)\n\
221 {FF0000}Resetovat statistiku",
222 formatInt(PlayerDrugData[playerid][Drugs], .iCurrencyChar = '\0'),
223 formatInt(PlayerDrugData[playerid][Seeds], .iCurrencyChar = '\0'),
224 formatInt(PlayerDrugData[playerid][TotalUsed], .iCurrencyChar = '\0'),
225 formatInt(PlayerDrugData[playerid][TotalPlanted], .iCurrencyChar = '\0'),
226 formatInt(PlayerDrugData[playerid][TotalHarvestedPlants], .iCurrencyChar = '\0'), formatInt(PlayerDrugData[playerid][TotalHarvestedGrams], .iCurrencyChar = '\0'),
227 formatInt(PlayerDrugData[playerid][TotalGiven], .iCurrencyChar = '\0'),
228 formatInt(PlayerDrugData[playerid][TotalReceived], .iCurrencyChar = '\0'),
229 formatInt(PlayerDrugData[playerid][TotalBought], .iCurrencyChar = '\0'), formatInt(PlayerDrugData[playerid][TotalBoughtPrice]),
230 formatInt(PlayerDrugData[playerid][TotalSold], .iCurrencyChar = '\0'), formatInt(PlayerDrugData[playerid][TotalSoldPrice])
231 );
232
233 ShowPlayerDialog(playerid, DIALOG_DRUG_STATS, DIALOG_STYLE_TABLIST, "Statistika drog", dialog, "Vybrat", "Zavřít");
234 return 1;
235}
236
237ShowDealerMenu(playerid)
238{
239 new dialog[300], id = PlayerDrugData[playerid][DealerID];
240 format(
241 dialog,
242 sizeof(dialog),
243 "Možnost\tCena\tVlastníš\n\
244 {%06x}Koupit semínka drogy\t{2ECC71}%s\t%s\n\
245 {%06x}Koupit drogy (%s gramů na dealera)\t{2ECC71}%s x gramů\t%s gramů\n\
246 {%06x}Prodat drogy\t{2ECC71}%s x gramů\t%s gramů",
247 (PlayerDrugData[playerid][Seeds] < SEED_LIMIT) ? 0xFFFFFFFF >>> 8 : 0xE74C3CFF >>> 8, formatInt(SEED_PRICE), formatInt(PlayerDrugData[playerid][Seeds], .iCurrencyChar = '\0'),
248 (PlayerDrugData[playerid][Drugs] >= CARRY_LIMIT || DealerData[id][dealerDrugs] < 1) ? 0xE74C3CFF >>> 8 : 0xFFFFFFFF >>> 8, formatInt(DealerData[id][dealerDrugs], .iCurrencyChar = '\0'), formatInt(DRUG_BUY_PRICE), formatInt(PlayerDrugData[playerid][Drugs], .iCurrencyChar = '\0'),
249 (PlayerDrugData[playerid][Drugs] > 0) ? 0xFFFFFFFF >>> 8 : 0xE74C3CFF >>> 8, formatInt(DRUG_SELL_PRICE), formatInt(PlayerDrugData[playerid][Drugs], .iCurrencyChar = '\0')
250 );
251
252 ShowPlayerDialog(playerid, DIALOG_DRUG_DEALER, DIALOG_STYLE_TABLIST_HEADERS, "Dealer drog", dialog, "Vybrat", "Zavřít");
253 return 1;
254}
255
256Player_GetName(playerid)
257{
258 new name[MAX_PLAYER_NAME];
259 GetPlayerName(playerid, name, MAX_PLAYER_NAME);
260 return name;
261}
262
263Player_PlantCount(playerid)
264{
265 new count = 0, name[MAX_PLAYER_NAME];
266 GetPlayerName(playerid, name, MAX_PLAYER_NAME);
267 foreach(new i : Plants) if(!strcmp(PlantData[i][plantedBy], name, true)) count++;
268 return count;
269}
270
271Player_Init(playerid)
272{
273 new emptydata[E_PLAYER];
274 PlayerDrugData[playerid] = emptydata;
275 PlayerDrugData[playerid][DrugsOfferedBy] = INVALID_PLAYER_ID;
276 RegenTimer[playerid] = EffectTimer[playerid] = -1;
277
278 // nahrání hráče
279 new drugs, seeds, totalused, totalplanted, harvested[2], given, received, bought[2], sold[2];
280 stmt_bind_value(LoadPlayer, 0, DB::TYPE_STRING, Player_GetName(playerid));
281 stmt_bind_result_field(LoadPlayer, 0, DB::TYPE_INTEGER, drugs);
282 stmt_bind_result_field(LoadPlayer, 1, DB::TYPE_INTEGER, seeds);
283 stmt_bind_result_field(LoadPlayer, 2, DB::TYPE_INTEGER, totalused);
284 stmt_bind_result_field(LoadPlayer, 3, DB::TYPE_INTEGER, totalplanted);
285 stmt_bind_result_field(LoadPlayer, 4, DB::TYPE_INTEGER, harvested[0]);
286 stmt_bind_result_field(LoadPlayer, 5, DB::TYPE_INTEGER, harvested[1]);
287 stmt_bind_result_field(LoadPlayer, 6, DB::TYPE_INTEGER, given);
288 stmt_bind_result_field(LoadPlayer, 7, DB::TYPE_INTEGER, received);
289 stmt_bind_result_field(LoadPlayer, 8, DB::TYPE_INTEGER, bought[0]);
290 stmt_bind_result_field(LoadPlayer, 9, DB::TYPE_INTEGER, bought[1]);
291 stmt_bind_result_field(LoadPlayer, 10, DB::TYPE_INTEGER, sold[0]);
292 stmt_bind_result_field(LoadPlayer, 11, DB::TYPE_INTEGER, sold[1]);
293
294 if(stmt_execute(LoadPlayer))
295 {
296 if(stmt_rows_left(LoadPlayer) > 0) {
297 stmt_fetch_row(LoadPlayer);
298
299 PlayerDrugData[playerid][Drugs] = drugs;
300 PlayerDrugData[playerid][Seeds] = seeds;
301 PlayerDrugData[playerid][TotalUsed] = totalused;
302 PlayerDrugData[playerid][TotalPlanted] = totalplanted;
303 PlayerDrugData[playerid][TotalHarvestedPlants] = harvested[0];
304 PlayerDrugData[playerid][TotalHarvestedGrams] = harvested[1];
305 PlayerDrugData[playerid][TotalGiven] = given;
306 PlayerDrugData[playerid][TotalReceived] = received;
307 PlayerDrugData[playerid][TotalBought] = bought[0];
308 PlayerDrugData[playerid][TotalBoughtPrice] = bought[1];
309 PlayerDrugData[playerid][TotalSold] = sold[0];
310 PlayerDrugData[playerid][TotalSoldPrice] = sold[1];
311 }else{
312 stmt_bind_value(InsertPlayer, 0, DB::TYPE_STRING, Player_GetName(playerid));
313 stmt_execute(InsertPlayer);
314 }
315 }
316
317 return 1;
318}
319
320Player_SaveDrugs(playerid)
321{
322 stmt_bind_value(SavePlayer, 0, DB::TYPE_INTEGER, PlayerDrugData[playerid][Drugs]);
323 stmt_bind_value(SavePlayer, 1, DB::TYPE_INTEGER, PlayerDrugData[playerid][Seeds]);
324 stmt_bind_value(SavePlayer, 2, DB::TYPE_INTEGER, PlayerDrugData[playerid][TotalUsed]);
325 stmt_bind_value(SavePlayer, 3, DB::TYPE_INTEGER, PlayerDrugData[playerid][TotalPlanted]);
326 stmt_bind_value(SavePlayer, 4, DB::TYPE_INTEGER, PlayerDrugData[playerid][TotalHarvestedPlants]);
327 stmt_bind_value(SavePlayer, 5, DB::TYPE_INTEGER, PlayerDrugData[playerid][TotalHarvestedGrams]);
328 stmt_bind_value(SavePlayer, 6, DB::TYPE_INTEGER, PlayerDrugData[playerid][TotalGiven]);
329 stmt_bind_value(SavePlayer, 7, DB::TYPE_INTEGER, PlayerDrugData[playerid][TotalReceived]);
330 stmt_bind_value(SavePlayer, 8, DB::TYPE_INTEGER, PlayerDrugData[playerid][TotalBought]);
331 stmt_bind_value(SavePlayer, 9, DB::TYPE_INTEGER, PlayerDrugData[playerid][TotalBoughtPrice]);
332 stmt_bind_value(SavePlayer, 10, DB::TYPE_INTEGER, PlayerDrugData[playerid][TotalSold]);
333 stmt_bind_value(SavePlayer, 11, DB::TYPE_INTEGER, PlayerDrugData[playerid][TotalSoldPrice]);
334 stmt_bind_value(SavePlayer, 12, DB::TYPE_STRING, Player_GetName(playerid));
335 return stmt_execute(SavePlayer);
336}
337
338Plant_GrowthPercentage(id)
339{
340 if(!Iter_Contains(Plants, id)) return 0;
341 return (PlantData[id][plantGrowth] * 100) / PLANT_MAX_GROWTH;
342}
343
344Plant_GetOwnerID(id)
345{
346 if(!Iter_Contains(Plants, id)) return INVALID_PLAYER_ID;
347 foreach(new i : Player) if(!strcmp(PlantData[id][plantedBy], Player_GetName(i), true)) return i;
348 return INVALID_PLAYER_ID;
349}
350
351Plant_Destroy(id)
352{
353 if(!Iter_Contains(Plants, id)) return 0;
354 KillTimer(PlantData[id][plantTimer]);
355 DestroyDynamicObject(PlantData[id][plantObj]);
356 DestroyDynamic3DTextLabel(PlantData[id][plantLabel]);
357
358 PlantData[id][plantObj] = PlantData[id][plantTimer] = -1;
359 PlantData[id][plantLabel] = Text3D: -1;
360 PlantData[id][gotLeaves] = false;
361
362 Iter_Remove(Plants, id);
363 return 1;
364}
365
366public OnFilterScriptInit()
367{
368 for(new i; i < MAX_PLANTS; i++)
369 {
370 PlantData[i][plantObj] = PlantData[i][plantTimer] = -1;
371 PlantData[i][plantLabel] = Text3D: -1;
372 }
373
374 for(new i; i < MAX_DEALERS; i++)
375 {
376 DealerData[i][dealerActorID] = -1;
377 DealerData[i][dealerLabel] = Text3D: -1;
378 }
379
380 // databáze
381 DrugDB = db_open("drugs.db");
382 db_query(DrugDB, "CREATE TABLE IF NOT EXISTS playerdrugs (Name TEXT, Drugs INTEGER, Seeds INTEGER, TotalUsed INTEGER, TotalPlanted INTEGER, TotalHarvestedPlants INTEGER, TotalHarvestedGrams INTEGER, TotalGiven INTEGER, TotalReceived INTEGER, TotalBought INTEGER, TotalBoughtPrice INTEGER, TotalSold INTEGER, TotalSoldPrice INTEGER)");
383 db_query(DrugDB, "CREATE TABLE IF NOT EXISTS dealers (ID INTEGER, Skin INTEGER, Drugs INTEGER, PosX FLOAT, PosY FLOAT, PosZ FLOAT, PosA FLOAT)");
384
385 // příprava queries hráčů
386 LoadPlayer = db_prepare(DrugDB, "SELECT Drugs, Seeds, TotalUsed, TotalPlanted, TotalHarvestedPlants, TotalHarvestedGrams, TotalGiven, TotalReceived, TotalBought, TotalBoughtPrice, TotalSold, TotalSoldPrice FROM playerdrugs WHERE Name=?");
387 InsertPlayer = db_prepare(DrugDB, "INSERT INTO playerdrugs (Name) VALUES (?)");
388 SavePlayer = db_prepare(DrugDB, "UPDATE playerdrugs SET Drugs=?, Seeds=?, TotalUsed=?, TotalPlanted=?, TotalHarvestedPlants=?, TotalHarvestedGrams=?, TotalGiven=?, TotalReceived=?, TotalBought=?, TotalBoughtPrice=?, TotalSold=?, TotalSoldPrice=? WHERE Name=?");
389
390 // příprava queries dealerů
391 LoadDealers = db_prepare(DrugDB, "SELECT * FROM dealers");
392 AddDealer = db_prepare(DrugDB, "INSERT INTO dealers (ID, Skin, PosX, PosY, PosZ, PosA) VALUES (?, ?, ?, ?, ?, ?)");
393 UpdateDealer = db_prepare(DrugDB, "UPDATE dealers SET Skin=?, PosX=?, PosY=?, PosZ=?, PosA=? WHERE ID=?");
394 UpdateDealerDrugs = db_prepare(DrugDB, "UPDATE dealers SET Drugs=? WHERE ID=?");
395 RemoveDealer = db_prepare(DrugDB, "DELETE FROM dealers WHERE ID=?");
396
397 // inicializace připojených hráčů
398 foreach(new i : Player) Player_Init(i);
399
400 // nahrání dealerů
401 new id, skin, drugs, Float: pos[4];
402 stmt_bind_result_field(LoadDealers, 0, DB::TYPE_INTEGER, id);
403 stmt_bind_result_field(LoadDealers, 1, DB::TYPE_INTEGER, skin);
404 stmt_bind_result_field(LoadDealers, 2, DB::TYPE_INTEGER, drugs);
405 stmt_bind_result_field(LoadDealers, 3, DB::TYPE_FLOAT, pos[0]);
406 stmt_bind_result_field(LoadDealers, 4, DB::TYPE_FLOAT, pos[1]);
407 stmt_bind_result_field(LoadDealers, 5, DB::TYPE_FLOAT, pos[2]);
408 stmt_bind_result_field(LoadDealers, 6, DB::TYPE_FLOAT, pos[3]);
409
410 if(stmt_execute(LoadDealers))
411 {
412 new label[128];
413 while(stmt_fetch_row(LoadDealers))
414 {
415 DealerData[id][dealerSkin] = skin;
416 DealerData[id][dealerDrugs] = drugs;
417 DealerData[id][dealerX] = pos[0];
418 DealerData[id][dealerY] = pos[1];
419 DealerData[id][dealerZ] = pos[2];
420 DealerData[id][dealerA] = pos[3];
421
422 DealerData[id][dealerActorID] = CreateActor(DealerData[id][dealerSkin], DealerData[id][dealerX], DealerData[id][dealerY], DealerData[id][dealerZ], DealerData[id][dealerA]);
423 SetActorInvulnerable(DealerData[id][dealerActorID], 1);
424
425 format(label, sizeof(label), "Dealer drog (%d)\n\n{FFFFFF}Použijte {F1C40F}/dealer {FFFFFF}pro otevření dealer menu.", id);
426 DealerData[id][dealerLabel] = CreateDynamic3DTextLabel(label, 0xF1C40FFF, DealerData[id][dealerX], DealerData[id][dealerY], DealerData[id][dealerZ] + 0.25, 5.0, .testlos = 1);
427
428 Iter_Add(Dealers, id);
429 }
430 }
431
432 return 1;
433}
434
435public OnFilterScriptExit()
436{
437 foreach(new i : Player) Player_SaveDrugs(i);
438 foreach(new i : Dealers) DestroyActor(DealerData[i][dealerActorID]);
439
440 db_close(DrugDB);
441 return 1;
442}
443
444public OnPlayerConnect(playerid)
445{
446 Player_Init(playerid);
447 return 1;
448}
449
450public OnPlayerDeath(playerid, killerid, reason)
451{
452 PlayerDrugData[playerid][DrugsCooldown] = 0;
453
454 if(RegenTimer[playerid] != -1)
455 {
456 KillTimer(RegenTimer[playerid]);
457 RegenTimer[playerid] = -1;
458 }
459
460 if(EffectTimer[playerid] != -1)
461 {
462 KillTimer(EffectTimer[playerid]);
463 EffectTimer[playerid] = -1;
464 }
465
466 foreach(new i : Player)
467 {
468 if(PlayerDrugData[i][DrugsOfferedBy] == playerid)
469 {
470 PlayerDrugData[i][DrugsOfferedBy] = INVALID_PLAYER_ID;
471 ShowPlayerDialog(i, -1, DIALOG_STYLE_MSGBOX, "Title", "Content", "Button1", "Button2");
472
473 SendClientMessage(i, 0x3498DBFF, "DROGY: {FFFFFF}Hráč co vám poslal nabídku drog zemřel.");
474 }
475 }
476
477 return 1;
478}
479
480public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
481{
482 switch(dialogid)
483 {
484 ////////////////////////////////////////////////////////////////
485 case DIALOG_DRUG_STATS:
486 {
487 if(!response) return 1;
488 if(listitem < 9) {
489 ShowDrugStats(playerid);
490 }else{
491 ShowPlayerDialog(playerid, DIALOG_CONFIRM_RESET, DIALOG_STYLE_MSGBOX, "Drogové statistiky: Resetovat", "Chcete resetovat vaše drogové statistiky ?", "Ano", "Ne");
492 }
493
494 return 1;
495 }
496 ////////////////////////////////////////////////////////////////
497 case DIALOG_CONFIRM_RESET:
498 {
499 if(!response) return ShowDrugStats(playerid);
500 PlayerDrugData[playerid][TotalUsed] = PlayerDrugData[playerid][TotalPlanted] = PlayerDrugData[playerid][TotalHarvestedPlants] = PlayerDrugData[playerid][TotalHarvestedGrams] =
501 PlayerDrugData[playerid][TotalGiven] = PlayerDrugData[playerid][TotalReceived] = PlayerDrugData[playerid][TotalBought] = PlayerDrugData[playerid][TotalBoughtPrice] =
502 PlayerDrugData[playerid][TotalSold] = PlayerDrugData[playerid][TotalSoldPrice] = 0;
503
504 Player_SaveDrugs(playerid);
505 ShowDrugStats(playerid);
506 return 1;
507 }
508 ////////////////////////////////////////////////////////////////
509 case DIALOG_DRUG_DEALER:
510 {
511 if(response)
512 {
513 if(listitem == 0)
514 {
515 if(PlayerDrugData[playerid][Seeds] >= SEED_LIMIT)
516 {
517 SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Nemůžete koupit víc semínek");
518 return ShowDealerMenu(playerid);
519 }
520
521 ShowPlayerDialog(playerid, DIALOG_DRUG_DEALER_BUY_SEEDS, DIALOG_STYLE_INPUT, "Dealer: Prodává semínka", "Kolik semínek chcete koupit ?", "Koupit", "Zpět");
522 }
523
524 if(listitem == 1)
525 {
526 if(PlayerDrugData[playerid][Drugs] >= CARRY_LIMIT)
527 {
528 SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Nemůžete koupit víc drog");
529 return ShowDealerMenu(playerid);
530 }
531
532 if(DealerData[ PlayerDrugData[playerid][DealerID] ][dealerDrugs] < 1)
533 {
534 SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Tento dealer nemá žádné drogy");
535 return ShowDealerMenu(playerid);
536 }
537
538 ShowPlayerDialog(playerid, DIALOG_DRUG_DEALER_BUY_DRUGS, DIALOG_STYLE_INPUT, "Dealer: Prodává drogy", "Kolik gramů chcete koupit ?", "Koupit", "Zpět");
539 }
540
541 if(listitem == 2)
542 {
543 if(PlayerDrugData[playerid][Drugs] < 1)
544 {
545 SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Nemáte žádné drogy.");
546 return ShowDealerMenu(playerid);
547 }
548
549 ShowPlayerDialog(playerid, DIALOG_DRUG_DEALER_SELL, DIALOG_STYLE_INPUT, "Dealer: Kupuje drogy", "Kolik gramů chcete prodat ?", "Prodat", "Zpět");
550 }
551 }
552
553 return 1;
554 }
555 ////////////////////////////////////////////////////////////////
556 case DIALOG_DRUG_DEALER_BUY_SEEDS:
557 {
558 if(!response) return ShowDealerMenu(playerid);
559 if(isnull(inputtext)) return ShowPlayerDialog(playerid, DIALOG_DRUG_DEALER_BUY_SEEDS, DIALOG_STYLE_INPUT, "Dealer: Kupuje semínka", "{E74C3C}Nemůžete koupit nic.\n\n{FFFFFF}Kolik semínek chcete koupit ?", "Koupit", "Zpět");
560 new amount = strval(inputtext);
561 if(!(0 < amount <= SEED_LIMIT)) return ShowPlayerDialog(playerid, DIALOG_DRUG_DEALER_BUY_SEEDS, DIALOG_STYLE_INPUT, "Dealer: Kupuje semínka", "{E74C3C}Špatně zadaná částka.\n\n{FFFFFF}Kolik semínek chcete koupit ?", "Koupit", "Zpět");
562 if(PlayerDrugData[playerid][Seeds] + amount > SEED_LIMIT) amount = SEED_LIMIT - PlayerDrugData[playerid][Seeds];
563 new price = amount * SEED_PRICE;
564 if(price > GetPlayerMoney(playerid)) return ShowPlayerDialog(playerid, DIALOG_DRUG_DEALER_BUY_SEEDS, DIALOG_STYLE_INPUT, "Dealer: Kupuje semínka", "{E74C3C}Nemáš dostatek peněz.\n\n{FFFFFF}Kolik semínek chcete koupit ?", "Koupit", "Zpět");
565 PlayerDrugData[playerid][Seeds] += amount;
566 GivePlayerMoney(playerid, -price);
567
568 new string[96];
569 format(string, sizeof(string), "DRUG DEALER: {FFFFFF}Bought %s seeds for {2ECC71}%s.", formatInt(amount, .iCurrencyChar = '\0'), formatInt(price));
570 SendClientMessage(playerid, 0x3498DBFF, string);
571 return 1;
572 }
573 ////////////////////////////////////////////////////////////////
574 case DIALOG_DRUG_DEALER_BUY_DRUGS:
575 {
576 if(!response) return ShowDealerMenu(playerid);
577 if(isnull(inputtext)) return ShowPlayerDialog(playerid, DIALOG_DRUG_DEALER_BUY_DRUGS, DIALOG_STYLE_INPUT, "Dealer: Kupuje drogy", "{E74C3C}Nemůžete koupit nic.\n\n{FFFFFF}Kolik gramů chcete koupit ?", "Koupit", "Zpět");
578 new amount = strval(inputtext), id = PlayerDrugData[playerid][DealerID];
579 if(!(0 < amount <= CARRY_LIMIT)) return ShowPlayerDialog(playerid, DIALOG_DRUG_DEALER_BUY_DRUGS, DIALOG_STYLE_INPUT, "Dealer: Kupouje semínka", "{E74C3C}Špatně zadaná částka.\n\n{FFFFFF}Kolik gramů chcete koupit ?", "Koupit", "Zpět");
580 if(amount > DealerData[id][dealerDrugs])
581 {
582 SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Dealer doesn't have that much drugs.");
583 return ShowDealerMenu(playerid);
584 }
585
586 if(PlayerDrugData[playerid][Drugs] + amount > CARRY_LIMIT) amount = CARRY_LIMIT - PlayerDrugData[playerid][Drugs];
587 new price = amount * DRUG_BUY_PRICE;
588 if(price > GetPlayerMoney(playerid)) return ShowPlayerDialog(playerid, DIALOG_DRUG_DEALER_BUY_DRUGS, DIALOG_STYLE_INPUT, "Dealer: Kupuje semínka", "{E74C3C}Nemáš dostatek peněz.\n\n{FFFFFF}Kolik gramů chcete koupit ?", "Koupit", "Zpět");
589 DealerData[id][dealerDrugs] -= amount;
590 PlayerDrugData[playerid][Drugs] += amount;
591 PlayerDrugData[playerid][TotalBought] += amount;
592 PlayerDrugData[playerid][TotalBoughtPrice] += price;
593 GivePlayerMoney(playerid, -price);
594
595 new string[96];
596 format(string, sizeof(string), "DRUG DEALER: {FFFFFF}Bought %s grams of drugs for {2ECC71}%s.", formatInt(amount, .iCurrencyChar = '\0'), formatInt(price));
597 SendClientMessage(playerid, 0x3498DBFF, string);
598
599 stmt_bind_value(UpdateDealerDrugs, 0, DB::TYPE_INTEGER, DealerData[id][dealerDrugs]);
600 stmt_bind_value(UpdateDealerDrugs, 1, DB::TYPE_INTEGER, id);
601 stmt_execute(UpdateDealerDrugs);
602 return 1;
603 }
604 ////////////////////////////////////////////////////////////////
605 case DIALOG_DRUG_DEALER_SELL:
606 {
607 if(!response) return ShowDealerMenu(playerid);
608 if(isnull(inputtext)) return ShowPlayerDialog(playerid, DIALOG_DRUG_DEALER_SELL, DIALOG_STYLE_INPUT, "Dealer: Kupuje drogy", "{E74C3C}Částka nemůže být prázdná.\n\n{FFFFFF}Kolik gramů chete prodat ?", "Prodat", "Zpět");
609 new amount = strval(inputtext), id = PlayerDrugData[playerid][DealerID];
610 if(!(0 < amount <= CARRY_LIMIT)) return ShowPlayerDialog(playerid, DIALOG_DRUG_DEALER_SELL, DIALOG_STYLE_INPUT, "Dealer: Kupuje drogy", "{E74C3C}Špatně zadaná částka.\n\n{FFFFFF}Kolik gramů chcete prodat ?", "Prodat", "Zpět");
611 if(amount > PlayerDrugData[playerid][Drugs]) return ShowPlayerDialog(playerid, DIALOG_DRUG_DEALER_SELL, DIALOG_STYLE_INPUT, "Drug Dealer: Selling Drugs", "{E74C3C}You don't have that much drugs.\n\n{FFFFFF}How many grams would you like to sell?", "Sell", "Back");
612 new price = amount * DRUG_SELL_PRICE;
613 DealerData[id][dealerDrugs] += amount;
614 PlayerDrugData[playerid][Drugs] -= amount;
615 PlayerDrugData[playerid][TotalSold] += amount;
616 PlayerDrugData[playerid][TotalSoldPrice] += price;
617 GivePlayerMoney(playerid, price);
618
619 new string[96];
620 format(string, sizeof(string), "Dealer drog: {FFFFFF}Prodal %s gramů drog za {2ECC71}%s.", formatInt(amount, .iCurrencyChar = '\0'), formatInt(price));
621 SendClientMessage(playerid, 0x3498DBFF, string);
622
623 stmt_bind_value(UpdateDealerDrugs, 0, DB::TYPE_INTEGER, DealerData[id][dealerDrugs]);
624 stmt_bind_value(UpdateDealerDrugs, 1, DB::TYPE_INTEGER, id);
625 stmt_execute(UpdateDealerDrugs);
626 return 1;
627 }
628 ////////////////////////////////////////////////////////////////
629 case DIALOG_DRUG_OFFER:
630 {
631 if(!response)
632 {
633 new string[96];
634 format(string, sizeof(string), "DRUGS: {FFFFFF}Vaše nabídka byla odmítnuta %s(%d).", Player_GetName(playerid), playerid);
635 SendClientMessage(PlayerDrugData[playerid][DrugsOfferedBy], 0x3498DBFF, string);
636
637 PlayerDrugData[playerid][DrugsOfferedBy] = INVALID_PLAYER_ID;
638 return 1;
639 }
640
641 new id = PlayerDrugData[playerid][DrugsOfferedBy], offeredp = PlayerDrugData[playerid][DrugsOfferedPrice], amount = strval(inputtext);
642 PlayerDrugData[playerid][DrugsOfferedBy] = INVALID_PLAYER_ID;
643 if(!IsPlayerConnected(id)) return SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Dealer je offline.");
644 if(DistanceBetweenPlayers(playerid, id) > 5.0) return SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Musíte být poblíž dealera od kterého chcete koupit drogy");
645 if(!(0 < amount <= CARRY_LIMIT)) return SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Špatně zadaná částka");
646 if(amount > PlayerDrugData[id][Drugs]) return SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Dealer nemá tolik gramů.");
647 if(PlayerDrugData[playerid][Drugs] + amount > CARRY_LIMIT) amount = CARRY_LIMIT - PlayerDrugData[playerid][Drugs];
648 new price = amount * offeredp;
649 if(price > GetPlayerMoney(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Nemáte dostatek peněz.");
650 PlayerDrugData[playerid][Drugs] += amount;
651 PlayerDrugData[id][Drugs] -= amount;
652 GivePlayerMoney(playerid, -price);
653 GivePlayerMoney(id, price);
654
655 new string[128];
656 format(string, sizeof(string), "Drogy: {FFFFFF}Prodal %s gramů drog hráči %s(%d) za {2ECC71}%s.", formatInt(amount, .iCurrencyChar = '\0'), Player_GetName(playerid), playerid, formatInt(price));
657 SendClientMessage(id, 0x3498DBFF, string);
658
659 format(string, sizeof(string), "Drogy: {FFFFFF}Koupil %s gramů drog od %s(%d) za {2ECC71}%s.", formatInt(amount, .iCurrencyChar = '\0'), Player_GetName(id), id, formatInt(price));
660 SendClientMessage(playerid, 0x3498DBFF, string);
661 return 1;
662 }
663 ////////////////////////////////////////////////////////////////
664 }
665
666 return 0;
667}
668
669public OnPlayerDisconnect(playerid, reason)
670{
671 if(RegenTimer[playerid] != -1)
672 {
673 KillTimer(RegenTimer[playerid]);
674 RegenTimer[playerid] = -1;
675 }
676
677 foreach(new i : Player)
678 {
679 if(PlayerDrugData[i][DrugsOfferedBy] == playerid)
680 {
681 PlayerDrugData[i][DrugsOfferedBy] = INVALID_PLAYER_ID;
682 ShowPlayerDialog(i, -1, DIALOG_STYLE_MSGBOX, "Title", "Content", "Button1", "Button2");
683
684 SendClientMessage(i, 0x3498DBFF, "Drogy: {FFFFFF}Hráč který vám poslal nabídku se odpojil.");
685 }
686 }
687
688 RemoveEffects(playerid);
689 Player_SaveDrugs(playerid);
690 return 1;
691}
692
693forward PlantGrowth(id);
694public PlantGrowth(id)
695{
696 new label_string[128];
697 PlantData[id][plantGrowth] += RandomEx(3, 7);
698
699 if(PlantData[id][plantGrowth] >= PLANT_MAX_GROWTH) {
700 PlantData[id][plantGrowth] = PLANT_MAX_GROWTH;
701 KillTimer(PlantData[id][plantTimer]);
702 PlantData[id][plantTimer] = SetTimerEx("PlantRot", ROT_INTERVAL * 1000, false, "i", id);
703
704 new percentage = Plant_GrowthPercentage(id);
705 format(label_string, sizeof(label_string), "Schnijící drogová rostlina (%d)\n\n{FFFFFF}Položena hráčem %s\nRůst: {%06x}%d%%\n\n{FFFFFF}/plant harvest", id, PlantData[id][plantedBy], (percentage < 25) ? 0xE74C3CFF >>> 8 : 0x2ECC71FF >>> 8, percentage);
706 UpdateDynamic3DTextLabelText(PlantData[id][plantLabel], 0xF1C40FFF, label_string);
707
708 SetDynamicObjectMaterial(PlantData[id][plantObj], 2, 2, "plants_TABLETOP", "CJ_PLANT", 0xFFD35400);
709
710 new owner_id = Plant_GetOwnerID(id);
711 if(IsPlayerConnected(owner_id)) SendClientMessage(owner_id, 0x3498DBFF, "Drogová rostlina: {FFFFFF}Jedna z vašich rostlin vyrostla. Skliďte jí než vám schnije!");
712 }else{
713 new percentage = Plant_GrowthPercentage(id);
714 if(!PlantData[id][gotLeaves] && percentage >= 25)
715 {
716 SetDynamicObjectMaterial(PlantData[id][plantObj], 2, 2, "plants_TABLETOP", "CJ_PLANT", 0xFF2ECC71);
717 PlantData[id][gotLeaves] = true;
718 }
719
720 format(label_string, sizeof(label_string), "Drogová rostlina (%d)\n\n{FFFFFF}Položena hráčem %s\nRůst: {%06x}%d%%\n\n{FFFFFF}/plant harvest", id, PlantData[id][plantedBy], (percentage < 25) ? 0xE74C3CFF >>> 8 : 0x2ECC71FF >>> 8, percentage);
721 UpdateDynamic3DTextLabelText(PlantData[id][plantLabel], 0xF1C40FFF, label_string);
722 }
723
724 return 1;
725}
726
727forward PlantRot(id);
728public PlantRot(id)
729{
730 new owner_id = Plant_GetOwnerID(id);
731 if(IsPlayerConnected(owner_id)) SendClientMessage(owner_id, 0x3498DBFF, "Drogová rostlina: {FFFFFF}Jedna z vašich rostlin schnila !");
732
733 Plant_Destroy(id);
734 return 1;
735}
736
737forward RegenHealth(playerid, amount);
738public RegenHealth(playerid, amount)
739{
740 amount--;
741
742 new Float: health;
743 GetPlayerHealth(playerid, health);
744
745 if(health + 2.5 < 95.0) SetPlayerHealth(playerid, health + 2.5);
746 if(amount > 0) {
747 #if defined USE_DRUNKLEVEL
748 SetPlayerDrunkLevel(playerid, 4999);
749 #endif
750
751 RegenTimer[playerid] = SetTimerEx("RegenHealth", 500, false, "ii", playerid, amount);
752 }else{
753 #if defined USE_DRUNKLEVEL
754 SetPlayerDrunkLevel(playerid, 0);
755 #endif
756
757 if(RegenTimer[playerid] != -1)
758 {
759 KillTimer(RegenTimer[playerid]);
760 RegenTimer[playerid] = -1;
761 }
762 }
763
764 return 1;
765}
766
767forward RemoveEffects(playerid);
768public RemoveEffects(playerid)
769{
770 #if defined USE_DRUNKLEVEL
771 SetPlayerDrunkLevel(playerid, 0);
772 #endif
773
774 SetPlayerWeather(playerid, 10);
775
776 if(EffectTimer[playerid] != -1)
777 {
778 KillTimer(EffectTimer[playerid]);
779 EffectTimer[playerid] = -1;
780 }
781
782 return 1;
783}
784
785// Příkazy hráčů
786CMD:usedrugs(playerid, params[])
787{
788 if(PlayerDrugData[playerid][DrugsCooldown] > gettime()) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Právě nelze použít drogy");
789 new amount;
790 if(sscanf(params, "i", amount)) return SendClientMessage(playerid, 0xE88732FF, "SYNTAX: {FFFFFF}/usedrugs [grams]");
791 if(!(0 < amount <= 10)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Nelze poslat naráz více než 10 gramů");
792 if(amount > PlayerDrugData[playerid][Drugs]) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Nemáte dostatek drog");
793 PlayerDrugData[playerid][DrugsCooldown] = gettime() + (10 * amount);
794 PlayerDrugData[playerid][Drugs] -= amount;
795 PlayerDrugData[playerid][TotalUsed] += amount;
796
797 SetPlayerWeather(playerid, 234);
798 RegenTimer[playerid] = SetTimerEx("RegenHealth", 500, false, "ii", playerid, (3 * amount));
799 EffectTimer[playerid] = SetTimerEx("RemoveEffects", (2 * amount) * 1000, false, "i", playerid);
800
801 new string[48];
802 format(string, sizeof(string), "Drogy: {FFFFFF}Použil %d gramů drog.", amount);
803 SendClientMessage(playerid, 0x3498DBFF, string);
804 return 1;
805}
806
807CMD:givedrugs(playerid, params[])
808{
809 new id, amount;
810 if(sscanf(params, "ui", id, amount)) return SendClientMessage(playerid, 0xE88732FF, "{FFFFFF}/givedrugs [player id] [gramy]");
811 if(id == playerid) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Nemůžete poslat sám sobě drogy.");
812 if(!IsPlayerConnected(id)) return SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Invalid ID.");
813 if(DistanceBetweenPlayers(playerid, id) > 5.0) return SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Musíte být poblíž hráče kterému chcete nabídnout drogy");
814 if(!(0 < amount <= 50)) return SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Nelze poslat naráz více než 50 gramů");
815 if(amount > PlayerDrugData[playerid][Drugs]) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Nemáte dostatek drog");
816 if(PlayerDrugData[id][Drugs] + amount > CARRY_LIMIT) amount = CARRY_LIMIT - PlayerDrugData[id][Drugs];
817 PlayerDrugData[playerid][Drugs] -= amount;
818 PlayerDrugData[playerid][TotalGiven] += amount;
819
820 PlayerDrugData[id][Drugs] += amount;
821 PlayerDrugData[id][TotalReceived] += amount;
822
823 new string[96];
824 format(string, sizeof(string), "Drogy: {FFFFFF}%s(%d) vám poslal %d gramů drog.", Player_GetName(playerid), playerid, amount);
825 SendClientMessage(id, 0x3498DBFF, string);
826 format(string, sizeof(string), "Drogy: {FFFFFF}%d posláno gramů hráči %s(%d).", amount, Player_GetName(id), id);
827 SendClientMessage(playerid, 0x3498DBFF, string);
828 return 1;
829}
830
831CMD:selldrugs(playerid, params[])
832{
833 if(PlayerDrugData[playerid][Drugs] < 1) return SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Nemáte žádné drogy.");
834 new id, price;
835 if(sscanf(params, "ui", id, price)) return SendClientMessage(playerid, 0xE88732FF, "{FFFFFF}/selldrugs [player id] [cena za gram]");
836 if(id == playerid) return SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Nelze prodat drogy sám sobě");
837 if(!IsPlayerConnected(id)) return SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Špatné ID.");
838 if(DistanceBetweenPlayers(playerid, id) > 5.0) return SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Musíte být poblíž hráče kterému chcete nabídnout drogy");
839 if(IsPlayerConnected(PlayerDrugData[id][DrugsOfferedBy])) return SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Nyní nelze prodat tomuto hráči drogy");
840 if(!(0 < price <= 5000)) return SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Cena nemůže být menší než $1 nebo větší než $5,000.");
841 if(PlayerDrugData[id][Drugs] >= CARRY_LIMIT) return SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Hráči kterému posíláte nabídku má maximální počet gramů");
842 if(PlayerDrugData[id][DrugsOfferCooldown] > gettime()) return SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Počkejte chvíli než budete posílat další nabídku");
843 PlayerDrugData[id][DrugsOfferedBy] = playerid;
844 PlayerDrugData[id][DrugsOfferedPrice] = price;
845 PlayerDrugData[id][DrugsOfferCooldown] = gettime() + OFFER_COOLDOWN;
846
847 new string[172];
848 format(string, sizeof(string), "{FFFFFF}%s(%d) vám nabídl drogy.\nCena: {2ECC71}%s za gram {FFFFFF}(má %s gramů)\n\nKolik gramů chcete koupit ?", Player_GetName(playerid), playerid, formatInt(price), formatInt(PlayerDrugData[playerid][Drugs], .iCurrencyChar = '\0'));
849 ShowPlayerDialog(id, DIALOG_DRUG_OFFER, DIALOG_STYLE_INPUT, "Drug Offer", string, "Koupit", "Zavřít");
850
851 format(string, sizeof(string), "DRUGS: {FFFFFF}Nabídka odeslána %s(%d).", Player_GetName(id), id);
852 SendClientMessage(playerid, 0x3498DBFF, string);
853 return 1;
854}
855
856CMD:drugstats(playerid, params[])
857{
858 ShowDrugStats(playerid);
859 return 1;
860}
861
862CMD:dealer(playerid, params[])
863{
864 new id = GetClosestDealer(playerid);
865 if(id == -1) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Nejste poblíž drogového dealera");
866 PlayerDrugData[playerid][DealerID] = id;
867 ShowDealerMenu(playerid);
868 return 1;
869}
870
871CMD:plant(playerid, params[])
872{
873 if(IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Tento příkaz nelze použít ve vozidle");
874 if(isnull(params)) return SendClientMessage(playerid, 0xE88732FF, "{FFFFFF}/plant [place/harvest]");
875
876 if(!strcmp(params, "place", true)) {
877 /* -- sázení -- */
878 if(PlayerDrugData[playerid][Seeds] < 1) return SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Nemáte žádné drogové semínka");
879 if(Player_PlantCount(playerid) >= PLAYER_LIMIT) return SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Nemůžete zasadit další drogové rostliny");
880 if(GetClosestPlant(playerid) != -1) return SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Nemůžete položit drogovou rostlinu protože je jedna poblíž");
881 new id = Iter_Free(Plants);
882 if(id == -1) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Limit drogových rostlin dosažen.");
883 GetPlayerName(playerid, PlantData[id][plantedBy], MAX_PLAYER_NAME);
884 GetPlayerPos(playerid, PlantData[id][plantX], PlantData[id][plantY], PlantData[id][plantZ]);
885
886 PlantData[id][plantGrowth] = 0;
887 PlantData[id][plantObj] = CreateDynamicObject(2244, PlantData[id][plantX], PlantData[id][plantY], PlantData[id][plantZ] - 0.70, 0.0, 0.0, 0.0);
888 SetDynamicObjectMaterial(PlantData[id][plantObj], 2, 19478, "signsurf", "sign", 0xFFFFFFFF);
889
890 new label_string[128];
891 format(label_string, sizeof(label_string), "Drug Plant (%d)\n\n{FFFFFF}Položena hráčem %s\nRůst {E74C3C}0%%\n\n{FFFFFF}/plant harvest", id, PlantData[id][plantedBy]);
892 PlantData[id][plantLabel] = CreateDynamic3DTextLabel(label_string, 0xF1C40FFF, PlantData[id][plantX], PlantData[id][plantY], PlantData[id][plantZ], 5.0);
893
894 PlantData[id][plantTimer] = SetTimerEx("PlantGrowth", GROWTH_INTERVAL * 1000, true, "i", id);
895 Iter_Add(Plants, id);
896
897 PlayerDrugData[playerid][Seeds]--;
898 PlayerDrugData[playerid][TotalPlanted]++;
899 /* -- sázení -- */
900 }else if(!strcmp(params, "harvest")) {
901 /* -- sklízení -- */
902 if(PlayerDrugData[playerid][Drugs] >= CARRY_LIMIT) return SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Nemůžete nosit více drog");
903 new id = GetClosestPlant(playerid);
904 if(id == -1) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You're not near a drug plant.");
905 if(!PlantData[id][gotLeaves]) return SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Nemůžete sklidit tuto rostlinu, ještě kvete.");
906 new harvested = PlantData[id][plantGrowth], string[96];
907 if(PlayerDrugData[playerid][Drugs] + harvested > CARRY_LIMIT) harvested = CARRY_LIMIT - PlayerDrugData[playerid][Drugs];
908 format(string, sizeof(string), "DRUG PLANT: {FFFFFF}Sklidil jste rostlinu a získal jste %d gramů.", harvested);
909 SendClientMessage(playerid, 0x3498DBFF, string);
910
911 PlayerDrugData[playerid][Drugs] += harvested;
912 PlayerDrugData[playerid][TotalHarvestedPlants]++;
913 PlayerDrugData[playerid][TotalHarvestedGrams] += harvested;
914
915 new owner_id = Plant_GetOwnerID(id);
916 if(strcmp(PlantData[id][plantedBy], Player_GetName(playerid), true) && IsPlayerConnected(owner_id)) SendClientMessage(owner_id, 0x3498DBFF, "Drogová rostlina: {FFFFFF}Někdo sklidil vaší rostlinu!");
917
918 Plant_Destroy(id);
919 /* -- sklízení -- */
920 }else{
921 SendClientMessage(playerid, 0xE88732FF, "{FFFFFF}/plant [place/harvest]");
922 }
923
924 return 1;
925}
926
927// Admin příkazy - Dealeři
928CMD:createdealer(playerid, params[])
929{
930 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Pouze RCON admini mohou použít tento příkaz");
931 new skin;
932 if(sscanf(params, "i", skin)) return SendClientMessage(playerid, 0xE88732FF, "{FFFFFF}/createdealer [skin id]");
933 if(!(0 <= skin <= 311)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Invalid skin ID.");
934 new id = Iter_Free(Dealers);
935 if(id == -1) return SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Nelze přidat ještě více dealerů.");
936 GetPlayerPos(playerid, DealerData[id][dealerX], DealerData[id][dealerY], DealerData[id][dealerZ]);
937 GetPlayerFacingAngle(playerid, DealerData[id][dealerA]);
938
939 DealerData[id][dealerSkin] = skin;
940 DealerData[id][dealerDrugs] = 0;
941 DealerData[id][dealerActorID] = CreateActor(skin, DealerData[id][dealerX], DealerData[id][dealerY], DealerData[id][dealerZ], DealerData[id][dealerA]);
942 SetActorInvulnerable(DealerData[id][dealerActorID], 1);
943
944 new label[128];
945 format(label, sizeof(label), "Dealer (%d)\n\n{FFFFFF}Napište {F1C40F}/dealer {FFFFFF}pro otevření dealer menu.", id);
946 DealerData[id][dealerLabel] = CreateDynamic3DTextLabel(label, 0xF1C40FFF, DealerData[id][dealerX], DealerData[id][dealerY], DealerData[id][dealerZ] + 0.25, 5.0, .testlos = 1);
947 Iter_Add(Dealers, id);
948
949 stmt_bind_value(AddDealer, 0, DB::TYPE_INTEGER, id);
950 stmt_bind_value(AddDealer, 1, DB::TYPE_INTEGER, skin);
951 stmt_bind_value(AddDealer, 2, DB::TYPE_FLOAT, DealerData[id][dealerX]);
952 stmt_bind_value(AddDealer, 3, DB::TYPE_FLOAT, DealerData[id][dealerY]);
953 stmt_bind_value(AddDealer, 4, DB::TYPE_FLOAT, DealerData[id][dealerZ]);
954 stmt_bind_value(AddDealer, 5, DB::TYPE_FLOAT, DealerData[id][dealerA]);
955
956 if(stmt_execute(AddDealer))
957 {
958 SendClientMessage(playerid, 0x3498DBFF, "DEALER: {FFFFFF}Dealer vytvořen.");
959 SetPlayerPos(playerid, DealerData[id][dealerX] + (1.5 * floatsin(-DealerData[id][dealerA], degrees)), DealerData[id][dealerY] + (1.5 * floatcos(-DealerData[id][dealerA], degrees)), DealerData[id][dealerZ]);
960 }
961
962 return 1;
963}
964
965CMD:setdealerskin(playerid, params[])
966{
967 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Pouze RCON admini mohou použít tento příkaz");
968 if(isnull(params)) return SendClientMessage(playerid, 0xE88732FF, "{FFFFFF}/setdealerskin [dealer id] [skin id]");
969 new id, skin;
970 if(sscanf(params, "ii", id, skin)) return SendClientMessage(playerid, 0xE88732FF, "{FFFFFF}/setdealerskin [dealer id] [skin id]");
971 if(!Iter_Contains(Dealers, id)) return SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Špatné ID");
972 if(!(0 <= skin <= 311)) return SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Špatné ID skinu");
973 DealerData[id][dealerSkin] = skin;
974
975 DestroyActor(DealerData[id][dealerActorID]);
976 DealerData[id][dealerActorID] = CreateActor(skin, DealerData[id][dealerX], DealerData[id][dealerY], DealerData[id][dealerZ], DealerData[id][dealerA]);
977 SetActorInvulnerable(DealerData[id][dealerActorID], 1);
978
979 stmt_bind_value(UpdateDealer, 0, DB::TYPE_INTEGER, skin);
980 stmt_bind_value(UpdateDealer, 1, DB::TYPE_FLOAT, DealerData[id][dealerX]);
981 stmt_bind_value(UpdateDealer, 2, DB::TYPE_FLOAT, DealerData[id][dealerY]);
982 stmt_bind_value(UpdateDealer, 3, DB::TYPE_FLOAT, DealerData[id][dealerZ]);
983 stmt_bind_value(UpdateDealer, 4, DB::TYPE_FLOAT, DealerData[id][dealerA]);
984 stmt_bind_value(UpdateDealer, 5, DB::TYPE_INTEGER, id);
985
986 if(stmt_execute(UpdateDealer)) SendClientMessage(playerid, 0x3498DBFF, "DEALER: {FFFFFF}Dealer aktualizován.");
987 return 1;
988}
989
990CMD:setdealerpos(playerid, params[])
991{
992 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Pouze RCON admini mohou použít tento příkaz.");
993 new id;
994 if(sscanf(params, "i", id)) return SendClientMessage(playerid, 0xE88732FF, "{FFFFFF}/setdealerpos [dealer id]");
995 if(!Iter_Contains(Dealers, id)) return SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Špatné ID");
996 GetPlayerPos(playerid, DealerData[id][dealerX], DealerData[id][dealerY], DealerData[id][dealerZ]);
997 GetPlayerFacingAngle(playerid, DealerData[id][dealerA]);
998
999 DestroyActor(DealerData[id][dealerActorID]);
1000 DealerData[id][dealerActorID] = CreateActor(DealerData[id][dealerSkin], DealerData[id][dealerX], DealerData[id][dealerY], DealerData[id][dealerZ], DealerData[id][dealerA]);
1001 SetActorInvulnerable(DealerData[id][dealerActorID], 1);
1002
1003 Streamer_SetFloatData(STREAMER_TYPE_3D_TEXT_LABEL, DealerData[id][dealerLabel], E_STREAMER_X, DealerData[id][dealerX]);
1004 Streamer_SetFloatData(STREAMER_TYPE_3D_TEXT_LABEL, DealerData[id][dealerLabel], E_STREAMER_Y, DealerData[id][dealerY]);
1005 Streamer_SetFloatData(STREAMER_TYPE_3D_TEXT_LABEL, DealerData[id][dealerLabel], E_STREAMER_Z, DealerData[id][dealerZ] + 0.25);
1006
1007 stmt_bind_value(UpdateDealer, 0, DB::TYPE_INTEGER, DealerData[id][dealerSkin]);
1008 stmt_bind_value(UpdateDealer, 1, DB::TYPE_FLOAT, DealerData[id][dealerX]);
1009 stmt_bind_value(UpdateDealer, 2, DB::TYPE_FLOAT, DealerData[id][dealerY]);
1010 stmt_bind_value(UpdateDealer, 3, DB::TYPE_FLOAT, DealerData[id][dealerZ]);
1011 stmt_bind_value(UpdateDealer, 4, DB::TYPE_FLOAT, DealerData[id][dealerA]);
1012 stmt_bind_value(UpdateDealer, 5, DB::TYPE_INTEGER, id);
1013
1014 if(stmt_execute(UpdateDealer))
1015 {
1016 SendClientMessage(playerid, 0x3498DBFF, "Dealer: {FFFFFF}Dealer aktualizován.");
1017 SetPlayerPos(playerid, DealerData[id][dealerX] + (1.5 * floatsin(-DealerData[id][dealerA], degrees)), DealerData[id][dealerY] + (1.5 * floatcos(-DealerData[id][dealerA], degrees)), DealerData[id][dealerZ]);
1018 }
1019
1020 return 1;
1021}
1022
1023CMD:removedealer(playerid, params[])
1024{
1025 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "Chyva: {FFFFFF}Pouze RCON admini mohou použít tento příkaz.");
1026 new id;
1027 if(sscanf(params, "i", id)) return SendClientMessage(playerid, 0xE88732FF, "{FFFFFF}/removedealer [dealer id]");
1028 if(!Iter_Contains(Dealers, id)) return SendClientMessage(playerid, 0xE74C3CFF, "Chyba: {FFFFFF}Špatné ID.");
1029 DestroyActor(DealerData[id][dealerActorID]);
1030 DestroyDynamic3DTextLabel(DealerData[id][dealerLabel]);
1031
1032 DealerData[id][dealerDrugs] = 0;
1033 DealerData[id][dealerActorID] = -1;
1034 DealerData[id][dealerLabel] = Text3D: -1;
1035 Iter_Remove(Dealers, id);
1036
1037 stmt_bind_value(RemoveDealer, 0, DB::TYPE_INTEGER, id);
1038 if(stmt_execute(RemoveDealer)) SendClientMessage(playerid, 0x3498DBFF, "DEALER: {FFFFFF}Dealer odstraněn.");
1039 return 1;
1040}