· 9 years ago · Oct 31, 2016, 04:10 AM
1/*
2
3FOR NOOB ZEUS
4DONT TRY TO ADD IN CNRSF. IF YOU WANT EDIT SOME THINGS HAHAHHAHA (especially first line)
5
6Credits:
7
8http://imgur.com/a/8AIaN
9
10*/
11
12
13#define FILTERSCRIPT
14#include <a_samp>
15#include <izcmd> // http://forum.sa-mp.com/showthread.php?t=576114
16#include <sqlitei> // http://forum.sa-mp.com/showthread.php?t=303682
17#include <sscanf2> // http://forum.sa-mp.com/showthread.php?t=602923
18#include <streamer> // http://forum.sa-mp.com/showthread.php?t=102865
19
20// internal defines
21#define MAX_ZONE_NAME (28)
22#define MAX_GIFT_BOXES (200)
23#define MAX_PUMPKINS (200)
24
25// event config
26#define I_WANT_HATS_DAMMIT // enables hats, remove/comment this line if you don't want people to have a witch hat
27#define PUMPKIN_DROPS // enables pumpkin drops on death, remove/comment this line if you don't want it
28#define ATTACH_INDEX (8) // for SetPlayerAttachedObject
29
30// gift box config
31#define GIFT_AMOUNT (3) // amount of gifts dropped on a timed drop (Default: 3)
32#define GIFT_INTERVAL (600) // drop gifts every x seconds (Default: 600)
33#define GIFT_LIFETIME (300) // a gift box will stay for x seconds (Default: 300)
34#define GIFT_MIN_MONEY (500)
35#define GIFT_MAX_MONEY (2000)
36#define GIFT_MIN_CANDY (3)
37#define GIFT_MAX_CANDY (9)
38
39// pumpkin config
40#define PUMPKIN_LIFETIME (120) // a dropped pumpkin will stay for x seconds (Default: 120)
41#define PUMPKIN_CANDY (3) // a pumpkin will contain x candies (Default: 3)
42
43// shop config
44#define MEDKIT_PRICE (5) // price of a medkit (Default: 5)
45#define ARMOR_PRICE (5) // price of a body armor (Default: 5)
46#define GIFT_PRICE (5000) // price of a gift box (Default: 5000)
47#define GIFT_PRICE_CANDY (10) // price of a gift box, in candy (Default: 10)
48
49enum _:E_DIALOG
50{
51 DIALOG_UNUSED = 7785,
52 DIALOG_CANDY_SHOP,
53 DIALOG_BUY_GIFT,
54 DIALOG_BUY_WEAPON
55}
56
57enum E_SHOP_WEAPONS
58{
59 WeaponID,
60 WeaponAmmo,
61 WeaponPrice
62}
63
64enum E_SAZONE_MAIN
65{
66 SAZONE_NAME[MAX_ZONE_NAME],
67 Float: SAZONE_AREA[6]
68}
69
70enum E_HALLOWEEN
71{
72 DropTimeLeft,
73 EventTimer
74}
75
76enum E_GIFT_BOX_COORDS
77{
78 Float: GiftBoxSpawnX,
79 Float: GiftBoxSpawnY,
80 Float: GiftBoxSpawnZ
81}
82
83enum E_GIFT_BOX
84{
85 Float: GiftBoxX,
86 Float: GiftBoxY,
87 Float: GiftBoxZ,
88 GiftBoxTimeLeft,
89 GiftBoxPickup,
90 Text3D: GiftBoxLabel,
91 GiftBoxTimer,
92 bool: GiftBoxExists
93}
94
95enum E_PUMPKIN
96{
97 PumpkinTimeLeft,
98 PumpkinPickup,
99 Text3D: PumpkinLabel,
100 PumpkinTimer,
101 bool: PumpkinExists
102}
103
104new
105 DB: HalloweenDB,
106 DBStatement: LoadFromTable,
107 DBStatement: InsertToTable,
108 DBStatement: SaveToTable,
109 DBStatement: TopCandies;
110
111new
112 HalloweenData[E_HALLOWEEN];
113
114new
115 GiftBoxData[MAX_GIFT_BOXES][E_GIFT_BOX];
116
117new
118 PumpkinData[MAX_PUMPKINS][E_PUMPKIN];
119
120new
121 Text: HalloweenText,
122 Text: PumpkinIcon,
123 Text: TimerText,
124 Text: TimerIcon;
125
126new
127 CandyCount[MAX_PLAYERS],
128 PlayerText: CandyText[MAX_PLAYERS];
129
130static const
131 ShopWeapons[][E_SHOP_WEAPONS] = {
132 // weapon id, ammo, price (candy)
133 {WEAPON_BAT, 1, 1},
134 {WEAPON_KNIFE, 1, 1},
135 {WEAPON_DEAGLE, 50, 20},
136 {WEAPON_SHOTGUN, 25, 10},
137 {WEAPON_AK47, 90, 15},
138 {WEAPON_RIFLE, 25, 15},
139 {WEAPON_MINIGUN, 100, 250}
140 };
141
142static const
143 GiftBoxCoords[][E_GIFT_BOX_COORDS] = {
144 {2743.0, 1316.0, 8.0},
145 {2168.66, 2267.96, 15.34},
146 {2408.0, 1389.0, 22.0},
147 {2034.0, 842.0, 10.0},
148 {2096.0, 1287.0, 10.8},
149 {1987.0, 1543.0, 16.0},
150 {1854.0, 912.0, 10.8},
151 {2540.38, 2527.85, 10.39},
152 {1548.02, 1024.47, 10.39},
153 {1592.91, 2053.83, 10.26},
154 {1971.29, 2330.26, 10.41},
155 {1700.74, 1792.7, 10.41},
156 {2581.0, -1491.0, 24.0},
157 {2296.0, -1696.0, 14.0},
158 {2273.0, -1099.0, 38.0},
159 {2716.0, -1048.0, 66.0},
160 {2614.0, -2496.0, 33.0},
161 {1183.85, -1250.68, 14.7},
162 {1970.0, -1158.0, 21.0},
163 {734.0, -1137.0, 18.0},
164 {2553.76, -2464.31, 13.62},
165 {1204.06, -1613.89, 13.28},
166 {611.21, -1459.63, 14.01},
167 {1116.67, -719.91, 100.17},
168 {-1903.1, -466.44, 25.18},
169 {-2657.0, -144.0, 4.0},
170 {-2454.0, -166.0, 35.0},
171 {-2009.0, 1227.0, 32.0},
172 {-2120.0, 96.39, 39.0},
173 {-2411.0, -334.0, 37.0},
174 {-1690.0, 450.0, 13.0},
175 {-1991.26, -1144.13, 29.69},
176 {-2636.13, -492.83, 70.09},
177 {-2022.68, 345.98, 35.17},
178 {-2683.2, 784.13, 49.98},
179 {-1820.67, -154.12, 9.4},
180 {-736.0, 66.0, 24.0},
181 {262.33, -149.12, 1.58},
182 {1643.0, 264.0, 20.0},
183 {601.98, 2150.38, 39.41},
184 {-1407.0, -2039.0, 1.0},
185 {-2156.0, -2371.0, 31.0},
186 {-419.25, 1362.36, 12.21},
187 {629.04, 2842.83, 25.21},
188 {690.49, -209.59, 25.6},
189 {88.82, -125.1, 0.85},
190 {215.69, 1089.1, 16.4},
191 {-2305.24, 2310.11, 4.98},
192 {-213.61, 2717.44, 62.68}
193 };
194
195// taken from here: http://forum.sa-mp.com/showthread.php?t=27598
196static const
197 SAZones[][E_SAZONE_MAIN] = {
198 {"The Big Ear", {-410.00,1403.30,-3.00,-137.90,1681.20,200.00}},
199 {"Aldea Malvada", {-1372.10,2498.50,0.00,-1277.50,2615.30,200.00}},
200 {"Angel Pine", {-2324.90,-2584.20,-6.10,-1964.20,-2212.10,200.00}},
201 {"Arco del Oeste", {-901.10,2221.80,0.00,-592.00,2571.90,200.00}},
202 {"Avispa Country Club", {-2646.40,-355.40,0.00,-2270.00,-222.50,200.00}},
203 {"Avispa Country Club", {-2831.80,-430.20,-6.10,-2646.40,-222.50,200.00}},
204 {"Avispa Country Club", {-2361.50,-417.10,0.00,-2270.00,-355.40,200.00}},
205 {"Avispa Country Club", {-2667.80,-302.10,-28.80,-2646.40,-262.30,71.10}},
206 {"Avispa Country Club", {-2470.00,-355.40,0.00,-2270.00,-318.40,46.10}},
207 {"Avispa Country Club", {-2550.00,-355.40,0.00,-2470.00,-318.40,39.70}},
208 {"Back o Beyond", {-1166.90,-2641.10,0.00,-321.70,-1856.00,200.00}},
209 {"Battery Point", {-2741.00,1268.40,-4.50,-2533.00,1490.40,200.00}},
210 {"Bayside", {-2741.00,2175.10,0.00,-2353.10,2722.70,200.00}},
211 {"Bayside Marina", {-2353.10,2275.70,0.00,-2153.10,2475.70,200.00}},
212 {"Beacon Hill", {-399.60,-1075.50,-1.40,-319.00,-977.50,198.50}},
213 {"Blackfield", {964.30,1203.20,-89.00,1197.30,1403.20,110.90}},
214 {"Blackfield", {964.30,1403.20,-89.00,1197.30,1726.20,110.90}},
215 {"Blackfield Chapel", {1375.60,596.30,-89.00,1558.00,823.20,110.90}},
216 {"Blackfield Chapel", {1325.60,596.30,-89.00,1375.60,795.00,110.90}},
217 {"Blackfield Intersection", {1197.30,1044.60,-89.00,1277.00,1163.30,110.90}},
218 {"Blackfield Intersection", {1166.50,795.00,-89.00,1375.60,1044.60,110.90}},
219 {"Blackfield Intersection", {1277.00,1044.60,-89.00,1315.30,1087.60,110.90}},
220 {"Blackfield Intersection", {1375.60,823.20,-89.00,1457.30,919.40,110.90}},
221 {"Blueberry", {104.50,-220.10,2.30,349.60,152.20,200.00}},
222 {"Blueberry", {19.60,-404.10,3.80,349.60,-220.10,200.00}},
223 {"Blueberry Acres", {-319.60,-220.10,0.00,104.50,293.30,200.00}},
224 {"Caligula's Palace", {2087.30,1543.20,-89.00,2437.30,1703.20,110.90}},
225 {"Caligula's Palace", {2137.40,1703.20,-89.00,2437.30,1783.20,110.90}},
226 {"Calton Heights", {-2274.10,744.10,-6.10,-1982.30,1358.90,200.00}},
227 {"Chinatown", {-2274.10,578.30,-7.60,-2078.60,744.10,200.00}},
228 {"City Hall", {-2867.80,277.40,-9.10,-2593.40,458.40,200.00}},
229 {"Come-A-Lot", {2087.30,943.20,-89.00,2623.10,1203.20,110.90}},
230 {"Commerce", {1323.90,-1842.20,-89.00,1701.90,-1722.20,110.90}},
231 {"Commerce", {1323.90,-1722.20,-89.00,1440.90,-1577.50,110.90}},
232 {"Commerce", {1370.80,-1577.50,-89.00,1463.90,-1384.90,110.90}},
233 {"Commerce", {1463.90,-1577.50,-89.00,1667.90,-1430.80,110.90}},
234 {"Commerce", {1583.50,-1722.20,-89.00,1758.90,-1577.50,110.90}},
235 {"Commerce", {1667.90,-1577.50,-89.00,1812.60,-1430.80,110.90}},
236 {"Conference Center", {1046.10,-1804.20,-89.00,1323.90,-1722.20,110.90}},
237 {"Conference Center", {1073.20,-1842.20,-89.00,1323.90,-1804.20,110.90}},
238 {"Cranberry Station", {-2007.80,56.30,0.00,-1922.00,224.70,100.00}},
239 {"Creek", {2749.90,1937.20,-89.00,2921.60,2669.70,110.90}},
240 {"Dillimore", {580.70,-674.80,-9.50,861.00,-404.70,200.00}},
241 {"Doherty", {-2270.00,-324.10,-0.00,-1794.90,-222.50,200.00}},
242 {"Doherty", {-2173.00,-222.50,-0.00,-1794.90,265.20,200.00}},
243 {"Downtown", {-1982.30,744.10,-6.10,-1871.70,1274.20,200.00}},
244 {"Downtown", {-1871.70,1176.40,-4.50,-1620.30,1274.20,200.00}},
245 {"Downtown", {-1700.00,744.20,-6.10,-1580.00,1176.50,200.00}},
246 {"Downtown", {-1580.00,744.20,-6.10,-1499.80,1025.90,200.00}},
247 {"Downtown", {-2078.60,578.30,-7.60,-1499.80,744.20,200.00}},
248 {"Downtown", {-1993.20,265.20,-9.10,-1794.90,578.30,200.00}},
249 {"Downtown Los Santos", {1463.90,-1430.80,-89.00,1724.70,-1290.80,110.90}},
250 {"Downtown Los Santos", {1724.70,-1430.80,-89.00,1812.60,-1250.90,110.90}},
251 {"Downtown Los Santos", {1463.90,-1290.80,-89.00,1724.70,-1150.80,110.90}},
252 {"Downtown Los Santos", {1370.80,-1384.90,-89.00,1463.90,-1170.80,110.90}},
253 {"Downtown Los Santos", {1724.70,-1250.90,-89.00,1812.60,-1150.80,110.90}},
254 {"Downtown Los Santos", {1370.80,-1170.80,-89.00,1463.90,-1130.80,110.90}},
255 {"Downtown Los Santos", {1378.30,-1130.80,-89.00,1463.90,-1026.30,110.90}},
256 {"Downtown Los Santos", {1391.00,-1026.30,-89.00,1463.90,-926.90,110.90}},
257 {"Downtown Los Santos", {1507.50,-1385.20,110.90,1582.50,-1325.30,335.90}},
258 {"East Beach", {2632.80,-1852.80,-89.00,2959.30,-1668.10,110.90}},
259 {"East Beach", {2632.80,-1668.10,-89.00,2747.70,-1393.40,110.90}},
260 {"East Beach", {2747.70,-1668.10,-89.00,2959.30,-1498.60,110.90}},
261 {"East Beach", {2747.70,-1498.60,-89.00,2959.30,-1120.00,110.90}},
262 {"East Los Santos", {2421.00,-1628.50,-89.00,2632.80,-1454.30,110.90}},
263 {"East Los Santos", {2222.50,-1628.50,-89.00,2421.00,-1494.00,110.90}},
264 {"East Los Santos", {2266.20,-1494.00,-89.00,2381.60,-1372.00,110.90}},
265 {"East Los Santos", {2381.60,-1494.00,-89.00,2421.00,-1454.30,110.90}},
266 {"East Los Santos", {2281.40,-1372.00,-89.00,2381.60,-1135.00,110.90}},
267 {"East Los Santos", {2381.60,-1454.30,-89.00,2462.10,-1135.00,110.90}},
268 {"East Los Santos", {2462.10,-1454.30,-89.00,2581.70,-1135.00,110.90}},
269 {"Easter Basin", {-1794.90,249.90,-9.10,-1242.90,578.30,200.00}},
270 {"Easter Basin", {-1794.90,-50.00,-0.00,-1499.80,249.90,200.00}},
271 {"Easter Bay Airport", {-1499.80,-50.00,-0.00,-1242.90,249.90,200.00}},
272 {"Easter Bay Airport", {-1794.90,-730.10,-3.00,-1213.90,-50.00,200.00}},
273 {"Easter Bay Airport", {-1213.90,-730.10,0.00,-1132.80,-50.00,200.00}},
274 {"Easter Bay Airport", {-1242.90,-50.00,0.00,-1213.90,578.30,200.00}},
275 {"Easter Bay Airport", {-1213.90,-50.00,-4.50,-947.90,578.30,200.00}},
276 {"Easter Bay Airport", {-1315.40,-405.30,15.40,-1264.40,-209.50,25.40}},
277 {"Easter Bay Airport", {-1354.30,-287.30,15.40,-1315.40,-209.50,25.40}},
278 {"Easter Bay Airport", {-1490.30,-209.50,15.40,-1264.40,-148.30,25.40}},
279 {"Easter Bay Chemicals", {-1132.80,-768.00,0.00,-956.40,-578.10,200.00}},
280 {"Easter Bay Chemicals", {-1132.80,-787.30,0.00,-956.40,-768.00,200.00}},
281 {"El Castillo del Diablo", {-464.50,2217.60,0.00,-208.50,2580.30,200.00}},
282 {"El Castillo del Diablo", {-208.50,2123.00,-7.60,114.00,2337.10,200.00}},
283 {"El Castillo del Diablo", {-208.50,2337.10,0.00,8.40,2487.10,200.00}},
284 {"El Corona", {1812.60,-2179.20,-89.00,1970.60,-1852.80,110.90}},
285 {"El Corona", {1692.60,-2179.20,-89.00,1812.60,-1842.20,110.90}},
286 {"El Quebrados", {-1645.20,2498.50,0.00,-1372.10,2777.80,200.00}},
287 {"Esplanade East", {-1620.30,1176.50,-4.50,-1580.00,1274.20,200.00}},
288 {"Esplanade East", {-1580.00,1025.90,-6.10,-1499.80,1274.20,200.00}},
289 {"Esplanade East", {-1499.80,578.30,-79.60,-1339.80,1274.20,20.30}},
290 {"Esplanade North", {-2533.00,1358.90,-4.50,-1996.60,1501.20,200.00}},
291 {"Esplanade North", {-1996.60,1358.90,-4.50,-1524.20,1592.50,200.00}},
292 {"Esplanade North", {-1982.30,1274.20,-4.50,-1524.20,1358.90,200.00}},
293 {"Fallen Tree", {-792.20,-698.50,-5.30,-452.40,-380.00,200.00}},
294 {"Fallow Bridge", {434.30,366.50,0.00,603.00,555.60,200.00}},
295 {"Fern Ridge", {508.10,-139.20,0.00,1306.60,119.50,200.00}},
296 {"Financial", {-1871.70,744.10,-6.10,-1701.30,1176.40,300.00}},
297 {"Fisher's Lagoon", {1916.90,-233.30,-100.00,2131.70,13.80,200.00}},
298 {"Flint Intersection", {-187.70,-1596.70,-89.00,17.00,-1276.60,110.90}},
299 {"Flint Range", {-594.10,-1648.50,0.00,-187.70,-1276.60,200.00}},
300 {"Fort Carson", {-376.20,826.30,-3.00,123.70,1220.40,200.00}},
301 {"Foster Valley", {-2270.00,-430.20,-0.00,-2178.60,-324.10,200.00}},
302 {"Foster Valley", {-2178.60,-599.80,-0.00,-1794.90,-324.10,200.00}},
303 {"Foster Valley", {-2178.60,-1115.50,0.00,-1794.90,-599.80,200.00}},
304 {"Foster Valley", {-2178.60,-1250.90,0.00,-1794.90,-1115.50,200.00}},
305 {"Frederick Bridge", {2759.20,296.50,0.00,2774.20,594.70,200.00}},
306 {"Gant Bridge", {-2741.40,1659.60,-6.10,-2616.40,2175.10,200.00}},
307 {"Gant Bridge", {-2741.00,1490.40,-6.10,-2616.40,1659.60,200.00}},
308 {"Ganton", {2222.50,-1852.80,-89.00,2632.80,-1722.30,110.90}},
309 {"Ganton", {2222.50,-1722.30,-89.00,2632.80,-1628.50,110.90}},
310 {"Garcia", {-2411.20,-222.50,-0.00,-2173.00,265.20,200.00}},
311 {"Garcia", {-2395.10,-222.50,-5.30,-2354.00,-204.70,200.00}},
312 {"Garver Bridge", {-1339.80,828.10,-89.00,-1213.90,1057.00,110.90}},
313 {"Garver Bridge", {-1213.90,950.00,-89.00,-1087.90,1178.90,110.90}},
314 {"Garver Bridge", {-1499.80,696.40,-179.60,-1339.80,925.30,20.30}},
315 {"Glen Park", {1812.60,-1449.60,-89.00,1996.90,-1350.70,110.90}},
316 {"Glen Park", {1812.60,-1100.80,-89.00,1994.30,-973.30,110.90}},
317 {"Glen Park", {1812.60,-1350.70,-89.00,2056.80,-1100.80,110.90}},
318 {"Green Palms", {176.50,1305.40,-3.00,338.60,1520.70,200.00}},
319 {"Greenglass College", {964.30,1044.60,-89.00,1197.30,1203.20,110.90}},
320 {"Greenglass College", {964.30,930.80,-89.00,1166.50,1044.60,110.90}},
321 {"Hampton Barns", {603.00,264.30,0.00,761.90,366.50,200.00}},
322 {"Hankypanky Point", {2576.90,62.10,0.00,2759.20,385.50,200.00}},
323 {"Harry Gold Parkway", {1777.30,863.20,-89.00,1817.30,2342.80,110.90}},
324 {"Hashbury", {-2593.40,-222.50,-0.00,-2411.20,54.70,200.00}},
325 {"Hilltop Farm", {967.30,-450.30,-3.00,1176.70,-217.90,200.00}},
326 {"Hunter Quarry", {337.20,710.80,-115.20,860.50,1031.70,203.70}},
327 {"Idlewood", {1812.60,-1852.80,-89.00,1971.60,-1742.30,110.90}},
328 {"Idlewood", {1812.60,-1742.30,-89.00,1951.60,-1602.30,110.90}},
329 {"Idlewood", {1951.60,-1742.30,-89.00,2124.60,-1602.30,110.90}},
330 {"Idlewood", {1812.60,-1602.30,-89.00,2124.60,-1449.60,110.90}},
331 {"Idlewood", {2124.60,-1742.30,-89.00,2222.50,-1494.00,110.90}},
332 {"Idlewood", {1971.60,-1852.80,-89.00,2222.50,-1742.30,110.90}},
333 {"Jefferson", {1996.90,-1449.60,-89.00,2056.80,-1350.70,110.90}},
334 {"Jefferson", {2124.60,-1494.00,-89.00,2266.20,-1449.60,110.90}},
335 {"Jefferson", {2056.80,-1372.00,-89.00,2281.40,-1210.70,110.90}},
336 {"Jefferson", {2056.80,-1210.70,-89.00,2185.30,-1126.30,110.90}},
337 {"Jefferson", {2185.30,-1210.70,-89.00,2281.40,-1154.50,110.90}},
338 {"Jefferson", {2056.80,-1449.60,-89.00,2266.20,-1372.00,110.90}},
339 {"Julius Thruway East", {2623.10,943.20,-89.00,2749.90,1055.90,110.90}},
340 {"Julius Thruway East", {2685.10,1055.90,-89.00,2749.90,2626.50,110.90}},
341 {"Julius Thruway East", {2536.40,2442.50,-89.00,2685.10,2542.50,110.90}},
342 {"Julius Thruway East", {2625.10,2202.70,-89.00,2685.10,2442.50,110.90}},
343 {"Julius Thruway North", {2498.20,2542.50,-89.00,2685.10,2626.50,110.90}},
344 {"Julius Thruway North", {2237.40,2542.50,-89.00,2498.20,2663.10,110.90}},
345 {"Julius Thruway North", {2121.40,2508.20,-89.00,2237.40,2663.10,110.90}},
346 {"Julius Thruway North", {1938.80,2508.20,-89.00,2121.40,2624.20,110.90}},
347 {"Julius Thruway North", {1534.50,2433.20,-89.00,1848.40,2583.20,110.90}},
348 {"Julius Thruway North", {1848.40,2478.40,-89.00,1938.80,2553.40,110.90}},
349 {"Julius Thruway North", {1704.50,2342.80,-89.00,1848.40,2433.20,110.90}},
350 {"Julius Thruway North", {1377.30,2433.20,-89.00,1534.50,2507.20,110.90}},
351 {"Julius Thruway South", {1457.30,823.20,-89.00,2377.30,863.20,110.90}},
352 {"Julius Thruway South", {2377.30,788.80,-89.00,2537.30,897.90,110.90}},
353 {"Julius Thruway West", {1197.30,1163.30,-89.00,1236.60,2243.20,110.90}},
354 {"Julius Thruway West", {1236.60,2142.80,-89.00,1297.40,2243.20,110.90}},
355 {"Juniper Hill", {-2533.00,578.30,-7.60,-2274.10,968.30,200.00}},
356 {"Juniper Hollow", {-2533.00,968.30,-6.10,-2274.10,1358.90,200.00}},
357 {"K.A.C.C. Military Fuels", {2498.20,2626.50,-89.00,2749.90,2861.50,110.90}},
358 {"Kincaid Bridge", {-1339.80,599.20,-89.00,-1213.90,828.10,110.90}},
359 {"Kincaid Bridge", {-1213.90,721.10,-89.00,-1087.90,950.00,110.90}},
360 {"Kincaid Bridge", {-1087.90,855.30,-89.00,-961.90,986.20,110.90}},
361 {"King's", {-2329.30,458.40,-7.60,-1993.20,578.30,200.00}},
362 {"King's", {-2411.20,265.20,-9.10,-1993.20,373.50,200.00}},
363 {"King's", {-2253.50,373.50,-9.10,-1993.20,458.40,200.00}},
364 {"LVA Freight Depot", {1457.30,863.20,-89.00,1777.40,1143.20,110.90}},
365 {"LVA Freight Depot", {1375.60,919.40,-89.00,1457.30,1203.20,110.90}},
366 {"LVA Freight Depot", {1277.00,1087.60,-89.00,1375.60,1203.20,110.90}},
367 {"LVA Freight Depot", {1315.30,1044.60,-89.00,1375.60,1087.60,110.90}},
368 {"LVA Freight Depot", {1236.60,1163.40,-89.00,1277.00,1203.20,110.90}},
369 {"Las Barrancas", {-926.10,1398.70,-3.00,-719.20,1634.60,200.00}},
370 {"Las Brujas", {-365.10,2123.00,-3.00,-208.50,2217.60,200.00}},
371 {"Las Colinas", {1994.30,-1100.80,-89.00,2056.80,-920.80,110.90}},
372 {"Las Colinas", {2056.80,-1126.30,-89.00,2126.80,-920.80,110.90}},
373 {"Las Colinas", {2185.30,-1154.50,-89.00,2281.40,-934.40,110.90}},
374 {"Las Colinas", {2126.80,-1126.30,-89.00,2185.30,-934.40,110.90}},
375 {"Las Colinas", {2747.70,-1120.00,-89.00,2959.30,-945.00,110.90}},
376 {"Las Colinas", {2632.70,-1135.00,-89.00,2747.70,-945.00,110.90}},
377 {"Las Colinas", {2281.40,-1135.00,-89.00,2632.70,-945.00,110.90}},
378 {"Las Payasadas", {-354.30,2580.30,2.00,-133.60,2816.80,200.00}},
379 {"Las Venturas Airport", {1236.60,1203.20,-89.00,1457.30,1883.10,110.90}},
380 {"Las Venturas Airport", {1457.30,1203.20,-89.00,1777.30,1883.10,110.90}},
381 {"Las Venturas Airport", {1457.30,1143.20,-89.00,1777.40,1203.20,110.90}},
382 {"Las Venturas Airport", {1515.80,1586.40,-12.50,1729.90,1714.50,87.50}},
383 {"Last Dime Motel", {1823.00,596.30,-89.00,1997.20,823.20,110.90}},
384 {"Leafy Hollow", {-1166.90,-1856.00,0.00,-815.60,-1602.00,200.00}},
385 {"Liberty City", {-1000.00,400.00,1300.00,-700.00,600.00,1400.00}},
386 {"Lil' Probe Inn", {-90.20,1286.80,-3.00,153.80,1554.10,200.00}},
387 {"Linden Side", {2749.90,943.20,-89.00,2923.30,1198.90,110.90}},
388 {"Linden Station", {2749.90,1198.90,-89.00,2923.30,1548.90,110.90}},
389 {"Linden Station", {2811.20,1229.50,-39.50,2861.20,1407.50,60.40}},
390 {"Little Mexico", {1701.90,-1842.20,-89.00,1812.60,-1722.20,110.90}},
391 {"Little Mexico", {1758.90,-1722.20,-89.00,1812.60,-1577.50,110.90}},
392 {"Los Flores", {2581.70,-1454.30,-89.00,2632.80,-1393.40,110.90}},
393 {"Los Flores", {2581.70,-1393.40,-89.00,2747.70,-1135.00,110.90}},
394 {"Los Santos International", {1249.60,-2394.30,-89.00,1852.00,-2179.20,110.90}},
395 {"Los Santos International", {1852.00,-2394.30,-89.00,2089.00,-2179.20,110.90}},
396 {"Los Santos International", {1382.70,-2730.80,-89.00,2201.80,-2394.30,110.90}},
397 {"Los Santos International", {1974.60,-2394.30,-39.00,2089.00,-2256.50,60.90}},
398 {"Los Santos International", {1400.90,-2669.20,-39.00,2189.80,-2597.20,60.90}},
399 {"Los Santos International", {2051.60,-2597.20,-39.00,2152.40,-2394.30,60.90}},
400 {"Marina", {647.70,-1804.20,-89.00,851.40,-1577.50,110.90}},
401 {"Marina", {647.70,-1577.50,-89.00,807.90,-1416.20,110.90}},
402 {"Marina", {807.90,-1577.50,-89.00,926.90,-1416.20,110.90}},
403 {"Market", {787.40,-1416.20,-89.00,1072.60,-1310.20,110.90}},
404 {"Market", {952.60,-1310.20,-89.00,1072.60,-1130.80,110.90}},
405 {"Market", {1072.60,-1416.20,-89.00,1370.80,-1130.80,110.90}},
406 {"Market", {926.90,-1577.50,-89.00,1370.80,-1416.20,110.90}},
407 {"Market Station", {787.40,-1410.90,-34.10,866.00,-1310.20,65.80}},
408 {"Martin Bridge", {-222.10,293.30,0.00,-122.10,476.40,200.00}},
409 {"Missionary Hill", {-2994.40,-811.20,0.00,-2178.60,-430.20,200.00}},
410 {"Montgomery", {1119.50,119.50,-3.00,1451.40,493.30,200.00}},
411 {"Montgomery", {1451.40,347.40,-6.10,1582.40,420.80,200.00}},
412 {"Montgomery Intersection", {1546.60,208.10,0.00,1745.80,347.40,200.00}},
413 {"Montgomery Intersection", {1582.40,347.40,0.00,1664.60,401.70,200.00}},
414 {"Mulholland", {1414.00,-768.00,-89.00,1667.60,-452.40,110.90}},
415 {"Mulholland", {1281.10,-452.40,-89.00,1641.10,-290.90,110.90}},
416 {"Mulholland", {1269.10,-768.00,-89.00,1414.00,-452.40,110.90}},
417 {"Mulholland", {1357.00,-926.90,-89.00,1463.90,-768.00,110.90}},
418 {"Mulholland", {1318.10,-910.10,-89.00,1357.00,-768.00,110.90}},
419 {"Mulholland", {1169.10,-910.10,-89.00,1318.10,-768.00,110.90}},
420 {"Mulholland", {768.60,-954.60,-89.00,952.60,-860.60,110.90}},
421 {"Mulholland", {687.80,-860.60,-89.00,911.80,-768.00,110.90}},
422 {"Mulholland", {737.50,-768.00,-89.00,1142.20,-674.80,110.90}},
423 {"Mulholland", {1096.40,-910.10,-89.00,1169.10,-768.00,110.90}},
424 {"Mulholland", {952.60,-937.10,-89.00,1096.40,-860.60,110.90}},
425 {"Mulholland", {911.80,-860.60,-89.00,1096.40,-768.00,110.90}},
426 {"Mulholland", {861.00,-674.80,-89.00,1156.50,-600.80,110.90}},
427 {"Mulholland Intersection", {1463.90,-1150.80,-89.00,1812.60,-768.00,110.90}},
428 {"North Rock", {2285.30,-768.00,0.00,2770.50,-269.70,200.00}},
429 {"Ocean Docks", {2373.70,-2697.00,-89.00,2809.20,-2330.40,110.90}},
430 {"Ocean Docks", {2201.80,-2418.30,-89.00,2324.00,-2095.00,110.90}},
431 {"Ocean Docks", {2324.00,-2302.30,-89.00,2703.50,-2145.10,110.90}},
432 {"Ocean Docks", {2089.00,-2394.30,-89.00,2201.80,-2235.80,110.90}},
433 {"Ocean Docks", {2201.80,-2730.80,-89.00,2324.00,-2418.30,110.90}},
434 {"Ocean Docks", {2703.50,-2302.30,-89.00,2959.30,-2126.90,110.90}},
435 {"Ocean Docks", {2324.00,-2145.10,-89.00,2703.50,-2059.20,110.90}},
436 {"Ocean Flats", {-2994.40,277.40,-9.10,-2867.80,458.40,200.00}},
437 {"Ocean Flats", {-2994.40,-222.50,-0.00,-2593.40,277.40,200.00}},
438 {"Ocean Flats", {-2994.40,-430.20,-0.00,-2831.80,-222.50,200.00}},
439 {"Octane Springs", {338.60,1228.50,0.00,664.30,1655.00,200.00}},
440 {"Old Venturas Strip", {2162.30,2012.10,-89.00,2685.10,2202.70,110.90}},
441 {"Palisades", {-2994.40,458.40,-6.10,-2741.00,1339.60,200.00}},
442 {"Palomino Creek", {2160.20,-149.00,0.00,2576.90,228.30,200.00}},
443 {"Paradiso", {-2741.00,793.40,-6.10,-2533.00,1268.40,200.00}},
444 {"Pershing Square", {1440.90,-1722.20,-89.00,1583.50,-1577.50,110.90}},
445 {"Pilgrim", {2437.30,1383.20,-89.00,2624.40,1783.20,110.90}},
446 {"Pilgrim", {2624.40,1383.20,-89.00,2685.10,1783.20,110.90}},
447 {"Pilson Intersection", {1098.30,2243.20,-89.00,1377.30,2507.20,110.90}},
448 {"Pirates in Men's Pants", {1817.30,1469.20,-89.00,2027.40,1703.20,110.90}},
449 {"Playa del Seville", {2703.50,-2126.90,-89.00,2959.30,-1852.80,110.90}},
450 {"Prickle Pine", {1534.50,2583.20,-89.00,1848.40,2863.20,110.90}},
451 {"Prickle Pine", {1117.40,2507.20,-89.00,1534.50,2723.20,110.90}},
452 {"Prickle Pine", {1848.40,2553.40,-89.00,1938.80,2863.20,110.90}},
453 {"Prickle Pine", {1938.80,2624.20,-89.00,2121.40,2861.50,110.90}},
454 {"Queens", {-2533.00,458.40,0.00,-2329.30,578.30,200.00}},
455 {"Queens", {-2593.40,54.70,0.00,-2411.20,458.40,200.00}},
456 {"Queens", {-2411.20,373.50,0.00,-2253.50,458.40,200.00}},
457 {"Randolph Industrial Estate", {1558.00,596.30,-89.00,1823.00,823.20,110.90}},
458 {"Redsands East", {1817.30,2011.80,-89.00,2106.70,2202.70,110.90}},
459 {"Redsands East", {1817.30,2202.70,-89.00,2011.90,2342.80,110.90}},
460 {"Redsands East", {1848.40,2342.80,-89.00,2011.90,2478.40,110.90}},
461 {"Redsands West", {1236.60,1883.10,-89.00,1777.30,2142.80,110.90}},
462 {"Redsands West", {1297.40,2142.80,-89.00,1777.30,2243.20,110.90}},
463 {"Redsands West", {1377.30,2243.20,-89.00,1704.50,2433.20,110.90}},
464 {"Redsands West", {1704.50,2243.20,-89.00,1777.30,2342.80,110.90}},
465 {"Regular Tom", {-405.70,1712.80,-3.00,-276.70,1892.70,200.00}},
466 {"Richman", {647.50,-1118.20,-89.00,787.40,-954.60,110.90}},
467 {"Richman", {647.50,-954.60,-89.00,768.60,-860.60,110.90}},
468 {"Richman", {225.10,-1369.60,-89.00,334.50,-1292.00,110.90}},
469 {"Richman", {225.10,-1292.00,-89.00,466.20,-1235.00,110.90}},
470 {"Richman", {72.60,-1404.90,-89.00,225.10,-1235.00,110.90}},
471 {"Richman", {72.60,-1235.00,-89.00,321.30,-1008.10,110.90}},
472 {"Richman", {321.30,-1235.00,-89.00,647.50,-1044.00,110.90}},
473 {"Richman", {321.30,-1044.00,-89.00,647.50,-860.60,110.90}},
474 {"Richman", {321.30,-860.60,-89.00,687.80,-768.00,110.90}},
475 {"Richman", {321.30,-768.00,-89.00,700.70,-674.80,110.90}},
476 {"Robada Intersection", {-1119.00,1178.90,-89.00,-862.00,1351.40,110.90}},
477 {"Roca Escalante", {2237.40,2202.70,-89.00,2536.40,2542.50,110.90}},
478 {"Roca Escalante", {2536.40,2202.70,-89.00,2625.10,2442.50,110.90}},
479 {"Rockshore East", {2537.30,676.50,-89.00,2902.30,943.20,110.90}},
480 {"Rockshore West", {1997.20,596.30,-89.00,2377.30,823.20,110.90}},
481 {"Rockshore West", {2377.30,596.30,-89.00,2537.30,788.80,110.90}},
482 {"Rodeo", {72.60,-1684.60,-89.00,225.10,-1544.10,110.90}},
483 {"Rodeo", {72.60,-1544.10,-89.00,225.10,-1404.90,110.90}},
484 {"Rodeo", {225.10,-1684.60,-89.00,312.80,-1501.90,110.90}},
485 {"Rodeo", {225.10,-1501.90,-89.00,334.50,-1369.60,110.90}},
486 {"Rodeo", {334.50,-1501.90,-89.00,422.60,-1406.00,110.90}},
487 {"Rodeo", {312.80,-1684.60,-89.00,422.60,-1501.90,110.90}},
488 {"Rodeo", {422.60,-1684.60,-89.00,558.00,-1570.20,110.90}},
489 {"Rodeo", {558.00,-1684.60,-89.00,647.50,-1384.90,110.90}},
490 {"Rodeo", {466.20,-1570.20,-89.00,558.00,-1385.00,110.90}},
491 {"Rodeo", {422.60,-1570.20,-89.00,466.20,-1406.00,110.90}},
492 {"Rodeo", {466.20,-1385.00,-89.00,647.50,-1235.00,110.90}},
493 {"Rodeo", {334.50,-1406.00,-89.00,466.20,-1292.00,110.90}},
494 {"Royal Casino", {2087.30,1383.20,-89.00,2437.30,1543.20,110.90}},
495 {"San Andreas Sound", {2450.30,385.50,-100.00,2759.20,562.30,200.00}},
496 {"Santa Flora", {-2741.00,458.40,-7.60,-2533.00,793.40,200.00}},
497 {"Santa Maria Beach", {342.60,-2173.20,-89.00,647.70,-1684.60,110.90}},
498 {"Santa Maria Beach", {72.60,-2173.20,-89.00,342.60,-1684.60,110.90}},
499 {"Shady Cabin", {-1632.80,-2263.40,-3.00,-1601.30,-2231.70,200.00}},
500 {"Shady Creeks", {-1820.60,-2643.60,-8.00,-1226.70,-1771.60,200.00}},
501 {"Shady Creeks", {-2030.10,-2174.80,-6.10,-1820.60,-1771.60,200.00}},
502 {"Sobell Rail Yards", {2749.90,1548.90,-89.00,2923.30,1937.20,110.90}},
503 {"Spinybed", {2121.40,2663.10,-89.00,2498.20,2861.50,110.90}},
504 {"Starfish Casino", {2437.30,1783.20,-89.00,2685.10,2012.10,110.90}},
505 {"Starfish Casino", {2437.30,1858.10,-39.00,2495.00,1970.80,60.90}},
506 {"Starfish Casino", {2162.30,1883.20,-89.00,2437.30,2012.10,110.90}},
507 {"Temple", {1252.30,-1130.80,-89.00,1378.30,-1026.30,110.90}},
508 {"Temple", {1252.30,-1026.30,-89.00,1391.00,-926.90,110.90}},
509 {"Temple", {1252.30,-926.90,-89.00,1357.00,-910.10,110.90}},
510 {"Temple", {952.60,-1130.80,-89.00,1096.40,-937.10,110.90}},
511 {"Temple", {1096.40,-1130.80,-89.00,1252.30,-1026.30,110.90}},
512 {"Temple", {1096.40,-1026.30,-89.00,1252.30,-910.10,110.90}},
513 {"The Camel's Toe", {2087.30,1203.20,-89.00,2640.40,1383.20,110.90}},
514 {"The Clown's Pocket", {2162.30,1783.20,-89.00,2437.30,1883.20,110.90}},
515 {"The Emerald Isle", {2011.90,2202.70,-89.00,2237.40,2508.20,110.90}},
516 {"The Farm", {-1209.60,-1317.10,114.90,-908.10,-787.30,251.90}},
517 {"The Four Dragons Casino", {1817.30,863.20,-89.00,2027.30,1083.20,110.90}},
518 {"The High Roller", {1817.30,1283.20,-89.00,2027.30,1469.20,110.90}},
519 {"The Mako Span", {1664.60,401.70,0.00,1785.10,567.20,200.00}},
520 {"The Panopticon", {-947.90,-304.30,-1.10,-319.60,327.00,200.00}},
521 {"The Pink Swan", {1817.30,1083.20,-89.00,2027.30,1283.20,110.90}},
522 {"The Sherman Dam", {-968.70,1929.40,-3.00,-481.10,2155.20,200.00}},
523 {"The Strip", {2027.40,863.20,-89.00,2087.30,1703.20,110.90}},
524 {"The Strip", {2106.70,1863.20,-89.00,2162.30,2202.70,110.90}},
525 {"The Strip", {2027.40,1783.20,-89.00,2162.30,1863.20,110.90}},
526 {"The Strip", {2027.40,1703.20,-89.00,2137.40,1783.20,110.90}},
527 {"The Visage", {1817.30,1863.20,-89.00,2106.70,2011.80,110.90}},
528 {"The Visage", {1817.30,1703.20,-89.00,2027.40,1863.20,110.90}},
529 {"Unity Station", {1692.60,-1971.80,-20.40,1812.60,-1932.80,79.50}},
530 {"Valle Ocultado", {-936.60,2611.40,2.00,-715.90,2847.90,200.00}},
531 {"Verdant Bluffs", {930.20,-2488.40,-89.00,1249.60,-2006.70,110.90}},
532 {"Verdant Bluffs", {1073.20,-2006.70,-89.00,1249.60,-1842.20,110.90}},
533 {"Verdant Bluffs", {1249.60,-2179.20,-89.00,1692.60,-1842.20,110.90}},
534 {"Verdant Meadows", {37.00,2337.10,-3.00,435.90,2677.90,200.00}},
535 {"Verona Beach", {647.70,-2173.20,-89.00,930.20,-1804.20,110.90}},
536 {"Verona Beach", {930.20,-2006.70,-89.00,1073.20,-1804.20,110.90}},
537 {"Verona Beach", {851.40,-1804.20,-89.00,1046.10,-1577.50,110.90}},
538 {"Verona Beach", {1161.50,-1722.20,-89.00,1323.90,-1577.50,110.90}},
539 {"Verona Beach", {1046.10,-1722.20,-89.00,1161.50,-1577.50,110.90}},
540 {"Vinewood", {787.40,-1310.20,-89.00,952.60,-1130.80,110.90}},
541 {"Vinewood", {787.40,-1130.80,-89.00,952.60,-954.60,110.90}},
542 {"Vinewood", {647.50,-1227.20,-89.00,787.40,-1118.20,110.90}},
543 {"Vinewood", {647.70,-1416.20,-89.00,787.40,-1227.20,110.90}},
544 {"Whitewood Estates", {883.30,1726.20,-89.00,1098.30,2507.20,110.90}},
545 {"Whitewood Estates", {1098.30,1726.20,-89.00,1197.30,2243.20,110.90}},
546 {"Willowfield", {1970.60,-2179.20,-89.00,2089.00,-1852.80,110.90}},
547 {"Willowfield", {2089.00,-2235.80,-89.00,2201.80,-1989.90,110.90}},
548 {"Willowfield", {2089.00,-1989.90,-89.00,2324.00,-1852.80,110.90}},
549 {"Willowfield", {2201.80,-2095.00,-89.00,2324.00,-1989.90,110.90}},
550 {"Willowfield", {2541.70,-1941.40,-89.00,2703.50,-1852.80,110.90}},
551 {"Willowfield", {2324.00,-2059.20,-89.00,2541.70,-1852.80,110.90}},
552 {"Willowfield", {2541.70,-2059.20,-89.00,2703.50,-1941.40,110.90}},
553 {"Yellow Bell Station", {1377.40,2600.40,-21.90,1492.40,2687.30,78.00}},
554 {"Los Santos", {44.60,-2892.90,-242.90,2997.00,-768.00,900.00}},
555 {"Las Venturas", {869.40,596.30,-242.90,2997.00,2993.80,900.00}},
556 {"Bone County", {-480.50,596.30,-242.90,869.40,2993.80,900.00}},
557 {"Tierra Robada", {-2997.40,1659.60,-242.90,-480.50,2993.80,900.00}},
558 {"Tierra Robada", {-1213.90,596.30,-242.90,-480.50,1659.60,900.00}},
559 {"San Fierro", {-2997.40,-1115.50,-242.90,-1213.90,1659.60,900.00}},
560 {"Red County", {-1213.90,-768.00,-242.90,2997.00,596.30,900.00}},
561 {"Flint County", {-1213.90,-2892.90,-242.90,44.60,-768.00,900.00}},
562 {"Whetstone", {-2997.40,-2892.90,-242.90,-1213.90,-1115.50,900.00}}
563 };
564
565GetZoneName(Float: x, Float: y, Float: z)
566{
567 new zone[28];
568 for(new i = 0; i < sizeof(SAZones); i++)
569 {
570 if(x >= SAZones[i][SAZONE_AREA][0] && x <= SAZones[i][SAZONE_AREA][3] && y >= SAZones[i][SAZONE_AREA][1] && y <= SAZones[i][SAZONE_AREA][4] && z >= SAZones[i][SAZONE_AREA][2] && z <= SAZones[i][SAZONE_AREA][5])
571 {
572 strcat(zone, SAZones[i][SAZONE_NAME]);
573 return zone;
574 }
575 }
576
577 strcat(zone, "Unknown");
578 return zone;
579}
580
581GetCityName(Float: x, Float: y, Float: z)
582{
583 new city[28];
584 for(new i = 356; i < sizeof(SAZones); i++)
585 {
586 if(x >= SAZones[i][SAZONE_AREA][0] && x <= SAZones[i][SAZONE_AREA][3] && y >= SAZones[i][SAZONE_AREA][1] && y <= SAZones[i][SAZONE_AREA][4] && z >= SAZones[i][SAZONE_AREA][2] && z <= SAZones[i][SAZONE_AREA][5])
587 {
588 strcat(city, SAZones[i][SAZONE_NAME]);
589 return city;
590 }
591 }
592
593 strcat(city, "San Andreas");
594 return city;
595}
596
597RandomEx(min, max)
598 return random(max - min) + min;
599
600ReturnPlayerName(playerid)
601{
602 new name[MAX_PLAYER_NAME];
603 GetPlayerName(playerid, name, sizeof(name));
604 return name;
605}
606
607formatTime(time)
608{
609 // http://forum.sa-mp.com/showpost.php?p=3223897&postcount=11
610 new string[15];//-2000000000:00 could happen, so make the string 15 chars to avoid any errors
611 format(string, sizeof(string), "%02d:%02d", time / 60, time % 60);
612 return string;
613}
614
615/* Player Functions */
616Halloween_InitPlayer(playerid)
617{
618 #if defined I_WANT_HATS_DAMMIT
619 SetPlayerAttachedObject(playerid, ATTACH_INDEX, 19528, 2, 0.091, 0.025, 0.0, 0.0, 0.0, -26.1, 1.227, 1.395, 1.4);
620 #endif
621
622 TextDrawShowForPlayer(playerid, HalloweenText);
623 TextDrawShowForPlayer(playerid, PumpkinIcon);
624 TextDrawShowForPlayer(playerid, TimerText);
625 TextDrawShowForPlayer(playerid, TimerIcon);
626
627 CandyCount[playerid] = 0;
628
629 CandyText[playerid] = CreatePlayerTextDraw(playerid, 499.000000, 98.000000, "000000000");
630 PlayerTextDrawBackgroundColor(playerid, CandyText[playerid], 255);
631 PlayerTextDrawFont(playerid, CandyText[playerid], 3);
632 PlayerTextDrawLetterSize(playerid, CandyText[playerid], 0.580000, 2.199999);
633 PlayerTextDrawColor(playerid, CandyText[playerid], 0x9158B6FF);
634 PlayerTextDrawSetOutline(playerid, CandyText[playerid], 1);
635 PlayerTextDrawSetProportional(playerid, CandyText[playerid], 1);
636 PlayerTextDrawSetSelectable(playerid, CandyText[playerid], 0);
637 PlayerTextDrawShow(playerid, CandyText[playerid]);
638
639 // load from database
640 stmt_bind_value(LoadFromTable, 0, DB::TYPE_STRING, ReturnPlayerName(playerid));
641 stmt_bind_result_field(LoadFromTable, 0, DB::TYPE_INTEGER, CandyCount[playerid]);
642
643 if(stmt_execute(LoadFromTable))
644 {
645 if(stmt_rows_left(LoadFromTable) > 0) {
646 stmt_fetch_row(LoadFromTable);
647
648 new string[10];
649 format(string, sizeof(string), "%09d", CandyCount[playerid]);
650 PlayerTextDrawSetString(playerid, CandyText[playerid], string);
651 }else{
652 stmt_bind_value(InsertToTable, 0, DB::TYPE_STRING, ReturnPlayerName(playerid));
653 stmt_execute(InsertToTable);
654 }
655 }
656
657 return 1;
658}
659
660Halloween_ChangeCandy(playerid, amount)
661{
662 CandyCount[playerid] += amount;
663
664 new string[10];
665 format(string, sizeof(string), "%09d", CandyCount[playerid]);
666 PlayerTextDrawSetString(playerid, CandyText[playerid], string);
667
668 // save to database
669 stmt_bind_value(SaveToTable, 0, DB::TYPE_INTEGER, CandyCount[playerid]);
670 stmt_bind_value(SaveToTable, 1, DB::TYPE_STRING, ReturnPlayerName(playerid));
671 stmt_execute(SaveToTable);
672 return 1;
673}
674
675Halloween_ShowShopMenu(playerid)
676{
677 new string[144];
678 format(string, sizeof(string), "Item\tPrice\n");
679 format(string, sizeof(string), "%sMedkit\t{9158B6}C%d\nBody Armor\t{9158B6}C%d\nGift Box\t{2ECC71}$%d {FFFFFF}/ {9158B6}C%d\nWeapons", string, MEDKIT_PRICE, ARMOR_PRICE, GIFT_PRICE, GIFT_PRICE_CANDY);
680 ShowPlayerDialog(playerid, DIALOG_CANDY_SHOP, DIALOG_STYLE_TABLIST_HEADERS, "Candy Shop", string, "Select", "Cancel");
681 return 1;
682}
683
684Halloween_ShowGiftMenu(playerid)
685{
686 new string[70];
687 format(string, sizeof(string), "Buy Using Money {2ECC71}($%d)\nBuy Using Candy {9158B6}(C%d)", GIFT_PRICE, GIFT_PRICE_CANDY);
688 ShowPlayerDialog(playerid, DIALOG_BUY_GIFT, DIALOG_STYLE_LIST, "Candy Shop » {FFFFFF}Gift Box", string, "Buy", "Back");
689 return 1;
690}
691
692Halloween_ShowWeaponsMenu(playerid)
693{
694 new string[256], w_name[32];
695 format(string, sizeof(string), "Weapon\tAmmo\tPrice\n");
696
697 for(new i; i < sizeof(ShopWeapons); i++)
698 {
699 GetWeaponName(ShopWeapons[i][WeaponID], w_name, sizeof(w_name));
700 format(string, sizeof(string), "%s%s\t%d\t{9158B6}C%d\n", string, w_name, ShopWeapons[i][WeaponAmmo], ShopWeapons[i][WeaponPrice]);
701 }
702
703 ShowPlayerDialog(playerid, DIALOG_BUY_WEAPON, DIALOG_STYLE_TABLIST_HEADERS, "Candy Shop » {FFFFFF}Weapons", string, "Buy", "Back");
704 return 1;
705}
706
707#if defined PUMPKIN_DROPS
708/* Pumpkin Code */
709Halloween_CreatePumpkin(Float: x, Float: y, Float: z, virtualworld, interior)
710{
711 new id = Pumpkin_FindFreeID();
712 if(id == -1) return -1;
713 z += 0.15;
714
715 PumpkinData[id][PumpkinTimeLeft] = PUMPKIN_LIFETIME;
716 PumpkinData[id][PumpkinPickup] = CreateDynamicPickup(19320, 1, x, y, z, virtualworld, interior);
717 Streamer_SetIntData(STREAMER_TYPE_PICKUP, PumpkinData[id][PumpkinPickup], E_STREAMER_EXTRA_ID, id);
718
719 new string[50];
720 format(string, sizeof(string), "Pumpkin\n\n{FFFFFF}It's filled with candy!\n%s", formatTime(PumpkinData[id][PumpkinTimeLeft]));
721 PumpkinData[id][PumpkinLabel] = CreateDynamic3DTextLabel(string, 0xFFA944FF, x, y, z, 10.0, _, _, 1, virtualworld, interior);
722
723 PumpkinData[id][PumpkinTimer] = SetTimerEx("Pumpkin_Countdown", 1000, true, "i", id);
724 PumpkinData[id][PumpkinExists] = true;
725 return id;
726}
727
728Pumpkin_FindFreeID()
729{
730 for(new i; i < MAX_PUMPKINS; i++) if(!PumpkinData[i][PumpkinExists]) return i;
731 return -1;
732}
733
734Pumpkin_Destroy(id)
735{
736 if(!(0 <= id <= MAX_PUMPKINS) || !PumpkinData[id][PumpkinExists]) return -1;
737 KillTimer(PumpkinData[id][PumpkinTimer]);
738 DestroyDynamicPickup(PumpkinData[id][PumpkinPickup]);
739 DestroyDynamic3DTextLabel(PumpkinData[id][PumpkinLabel]);
740
741 PumpkinData[id][PumpkinTimeLeft] = 0;
742 PumpkinData[id][PumpkinPickup] = PumpkinData[id][PumpkinTimer] = -1;
743 PumpkinData[id][PumpkinLabel] = Text3D: -1;
744 PumpkinData[id][PumpkinExists] = false;
745 return 1;
746}
747
748forward Pumpkin_Countdown(id);
749public Pumpkin_Countdown(id)
750{
751 new string[50];
752 if(PumpkinData[id][PumpkinTimeLeft] > 1) {
753 PumpkinData[id][PumpkinTimeLeft]--;
754
755 format(string, sizeof(string), "Pumpkin\n\n{FFFFFF}It's filled with candy!\n%s", formatTime(PumpkinData[id][PumpkinTimeLeft]));
756 UpdateDynamic3DTextLabelText(PumpkinData[id][PumpkinLabel], 0xFFA944FF, string);
757 }else if(PumpkinData[id][PumpkinTimeLeft] == 1) {
758 Pumpkin_Destroy(id);
759 }
760
761 return 1;
762}
763#endif
764
765/* Gift Box Code */
766Halloween_CreateGiftBox(Float: x, Float: y, Float: z, virtualworld, interior)
767{
768 new id = GiftBox_FindFreeID();
769 if(id == -1) return -1;
770 z += 0.15;
771
772 GiftBoxData[id][GiftBoxX] = x;
773 GiftBoxData[id][GiftBoxY] = y;
774 GiftBoxData[id][GiftBoxZ] = z;
775 GiftBoxData[id][GiftBoxTimeLeft] = GIFT_LIFETIME;
776 GiftBoxData[id][GiftBoxPickup] = CreateDynamicPickup(19054 + random(5), 1, x, y, z, virtualworld, interior);
777 Streamer_SetIntData(STREAMER_TYPE_PICKUP, GiftBoxData[id][GiftBoxPickup], E_STREAMER_EXTRA_ID, id);
778
779 new string[128];
780 format(string, sizeof(string), "Gift Box\n\n{FFFFFF}It has a surprise inside!\n%s", formatTime(GiftBoxData[id][GiftBoxTimeLeft]));
781 GiftBoxData[id][GiftBoxLabel] = CreateDynamic3DTextLabel(string, 0xFFA944FF, x, y, z, 10.0, _, _, 1, virtualworld, interior);
782
783 GiftBoxData[id][GiftBoxTimer] = SetTimerEx("GiftBox_Countdown", 1000, true, "i", id);
784 GiftBoxData[id][GiftBoxExists] = true;
785
786 format(string, sizeof(string), "HALLOWEEN: {FFFFFF}A gift box dropped at {FFA944}%s, %s!", GetZoneName(x, y, z), GetCityName(x, y, z));
787 SendClientMessageToAll(0x9158B6FF, string);
788 return id;
789}
790
791GiftBox_FindFreeID()
792{
793 for(new i; i < MAX_GIFT_BOXES; i++) if(!GiftBoxData[i][GiftBoxExists]) return i;
794 return -1;
795}
796
797GiftBox_Destroy(id)
798{
799 if(!(0 <= id <= MAX_GIFT_BOXES) || !GiftBoxData[id][GiftBoxExists]) return -1;
800 KillTimer(GiftBoxData[id][GiftBoxTimer]);
801 DestroyDynamicPickup(GiftBoxData[id][GiftBoxPickup]);
802 DestroyDynamic3DTextLabel(GiftBoxData[id][GiftBoxLabel]);
803
804 GiftBoxData[id][GiftBoxTimeLeft] = 0;
805 GiftBoxData[id][GiftBoxPickup] = GiftBoxData[id][GiftBoxTimer] = -1;
806 GiftBoxData[id][GiftBoxLabel] = Text3D: -1;
807 GiftBoxData[id][GiftBoxExists] = false;
808 return 1;
809}
810
811forward GiftBox_Countdown(id);
812public GiftBox_Countdown(id)
813{
814 new string[54];
815 if(GiftBoxData[id][GiftBoxTimeLeft] > 1) {
816 GiftBoxData[id][GiftBoxTimeLeft]--;
817
818 format(string, sizeof(string), "Gift Box\n\n{FFFFFF}It has a surprise inside!\n%s", formatTime(GiftBoxData[id][GiftBoxTimeLeft]));
819 UpdateDynamic3DTextLabelText(GiftBoxData[id][GiftBoxLabel], 0xFFA944FF, string);
820 }else if(GiftBoxData[id][GiftBoxTimeLeft] == 1) {
821 GiftBox_Destroy(id);
822 }
823
824 return 1;
825}
826
827/* Drop Timer */
828forward Halloween_GiftDrop();
829public Halloween_GiftDrop()
830{
831 if(HalloweenData[DropTimeLeft] > 1) {
832 HalloweenData[DropTimeLeft]--;
833
834 TextDrawSetString(TimerText, formatTime(HalloweenData[DropTimeLeft]));
835 }else if(HalloweenData[DropTimeLeft] == 1) {
836 new id;
837 for(new i; i < GIFT_AMOUNT; i++)
838 {
839 id = random(sizeof(GiftBoxCoords));
840 Halloween_CreateGiftBox(GiftBoxCoords[id][GiftBoxSpawnX], GiftBoxCoords[id][GiftBoxSpawnY], GiftBoxCoords[id][GiftBoxSpawnZ], -1, -1);
841 }
842
843 HalloweenData[DropTimeLeft] = GIFT_INTERVAL;
844 }
845
846 return 1;
847}
848
849/* Callbacks */
850public OnFilterScriptInit()
851{
852 // database
853 HalloweenDB = db_open("halloween.db");
854 db_query(HalloweenDB, "CREATE TABLE IF NOT EXISTS halloween_players (Name TEXT, Candy INTEGER)");
855
856 // prepare queries
857 LoadFromTable = db_prepare(HalloweenDB, "SELECT Candy FROM halloween_players WHERE Name=?");
858 InsertToTable = db_prepare(HalloweenDB, "INSERT INTO halloween_players (Name) VALUES (?)");
859 SaveToTable = db_prepare(HalloweenDB, "UPDATE halloween_players SET Candy=? WHERE Name=?");
860 TopCandies = db_prepare(HalloweenDB, "SELECT * FROM halloween_players ORDER BY Candy DESC LIMIT 15");
861
862 // init
863 HalloweenData[DropTimeLeft] = GIFT_INTERVAL;
864 HalloweenData[EventTimer] = SetTimer("Halloween_GiftDrop", 1000, true);
865
866 for(new i; i < MAX_GIFT_BOXES; i++)
867 {
868 GiftBoxData[i][GiftBoxPickup] = GiftBoxData[i][GiftBoxTimer] = -1;
869 GiftBoxData[i][GiftBoxLabel] = Text3D: -1;
870 }
871
872 for(new i; i < MAX_PUMPKINS; i++)
873 {
874 PumpkinData[i][PumpkinPickup] = PumpkinData[i][PumpkinTimer] = -1;
875 PumpkinData[i][PumpkinLabel] = Text3D: -1;
876 }
877
878 // textdraws
879 HalloweenText = TextDrawCreate(515.000000, 7.000000, "Happy Halloween!");
880 TextDrawBackgroundColor(HalloweenText, 255);
881 TextDrawFont(HalloweenText, 2);
882 TextDrawLetterSize(HalloweenText, 0.210000, 1.100000);
883 TextDrawColor(HalloweenText, 0xFF9922FF);
884 TextDrawSetOutline(HalloweenText, 1);
885 TextDrawSetProportional(HalloweenText, 1);
886 TextDrawSetSelectable(HalloweenText, 0);
887
888 PumpkinIcon = TextDrawCreate(486.000000, -20.000000, "_");
889 TextDrawBackgroundColor(PumpkinIcon, 0);
890 TextDrawFont(PumpkinIcon, 5);
891 TextDrawLetterSize(PumpkinIcon, 0.210000, 1.100000);
892 TextDrawColor(PumpkinIcon, -1);
893 TextDrawSetOutline(PumpkinIcon, 1);
894 TextDrawSetProportional(PumpkinIcon, 1);
895 TextDrawUseBox(PumpkinIcon, 1);
896 TextDrawBoxColor(PumpkinIcon, 255);
897 TextDrawTextSize(PumpkinIcon, 40.000000, 40.000000);
898 TextDrawSetPreviewModel(PumpkinIcon, 19320);
899 TextDrawSetPreviewRot(PumpkinIcon, 0.000000, 0.000000, 0.000000, 0.550000);
900 TextDrawSetSelectable(PumpkinIcon, 0);
901
902 TimerText = TextDrawCreate(557.000000, 28.000000, formatTime(GIFT_INTERVAL));
903 TextDrawBackgroundColor(TimerText, 255);
904 TextDrawFont(TimerText, 1);
905 TextDrawLetterSize(TimerText, 0.190000, 1.000000);
906 TextDrawColor(TimerText, -1);
907 TextDrawSetOutline(TimerText, 1);
908 TextDrawSetProportional(TimerText, 1);
909 TextDrawSetSelectable(TimerText, 0);
910
911 TimerIcon = TextDrawCreate(545.000000, 25.000000, "ld_grav:timer");
912 TextDrawBackgroundColor(TimerIcon, 255);
913 TextDrawFont(TimerIcon, 4);
914 TextDrawLetterSize(TimerIcon, 0.500000, 1.000000);
915 TextDrawColor(TimerIcon, -1);
916 TextDrawSetOutline(TimerIcon, 1);
917 TextDrawSetProportional(TimerIcon, 1);
918 TextDrawUseBox(TimerIcon, 1);
919 TextDrawBoxColor(TimerIcon, 255);
920 TextDrawTextSize(TimerIcon, 11.000000, 13.000000);
921 TextDrawSetSelectable(TimerIcon, 0);
922
923 // load player data
924 for(new i, maxp = GetPlayerPoolSize(); i <= maxp; i++) if(IsPlayerConnected(i)) Halloween_InitPlayer(i);
925 return 1;
926}
927
928public OnFilterScriptExit()
929{
930 // remove textdraws
931 TextDrawHideForAll(HalloweenText);
932 TextDrawHideForAll(PumpkinIcon);
933 TextDrawHideForAll(TimerText);
934 TextDrawHideForAll(TimerIcon);
935
936 TextDrawDestroy(HalloweenText);
937 TextDrawDestroy(PumpkinIcon);
938 TextDrawDestroy(TimerText);
939 TextDrawDestroy(TimerIcon);
940
941 // remove player stuff
942 for(new i, maxp = GetPlayerPoolSize(); i <= maxp; i++)
943 {
944 if(!IsPlayerConnected(i)) continue;
945 PlayerTextDrawDestroy(i, CandyText[i]);
946
947 #if defined I_WANT_HATS_DAMMIT
948 RemovePlayerAttachedObject(i, ATTACH_INDEX);
949 #endif
950 }
951
952 // close database
953 db_close(HalloweenDB);
954 return 1;
955}
956
957public OnPlayerConnect(playerid)
958{
959 // load player data
960 Halloween_InitPlayer(playerid);
961 return 1;
962}
963
964public OnPlayerDisconnect(playerid, reason)
965{
966 CandyCount[playerid] = 0;
967 return 1;
968}
969
970#if defined I_WANT_HATS_DAMMIT
971public OnPlayerSpawn(playerid)
972{
973 SetPlayerAttachedObject(playerid, ATTACH_INDEX, 19528, 2, 0.091, 0.025, 0.0, 0.0, 0.0, -26.1, 1.227, 1.395, 1.4);
974 return 1;
975}
976#endif
977
978#if defined PUMPKIN_DROPS
979public OnPlayerDeath(playerid, killerid, reason)
980{
981 if(IsPlayerConnected(killerid))
982 {
983 new Float: x, Float: y, Float: z;
984 GetPlayerPos(playerid, x, y, z);
985 Halloween_CreatePumpkin(x, y, z, GetPlayerVirtualWorld(playerid), GetPlayerInterior(playerid));
986 }
987
988 return 1;
989}
990#endif
991
992public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
993{
994 switch(dialogid)
995 {
996 case DIALOG_CANDY_SHOP:
997 {
998 if(response)
999 {
1000 new string[96];
1001
1002 switch(listitem)
1003 {
1004 // medkit
1005 case 0:
1006 {
1007 if(MEDKIT_PRICE > CandyCount[playerid]) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You don't have enough candies."), Halloween_ShowShopMenu(playerid);
1008 SetPlayerHealth(playerid, 100.0);
1009 Halloween_ChangeCandy(playerid, -MEDKIT_PRICE);
1010
1011 format(string, sizeof(string), "CANDY SHOP: {FFFFFF}Bought {FFA944}medkit {FFFFFF}using {9158B6}C%d.", MEDKIT_PRICE);
1012 SendClientMessage(playerid, 0x9158B6FF, string);
1013 Halloween_ShowShopMenu(playerid);
1014 }
1015
1016 // body armor
1017 case 1:
1018 {
1019 if(ARMOR_PRICE > CandyCount[playerid]) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You don't have enough candies."), Halloween_ShowShopMenu(playerid);
1020 SetPlayerArmour(playerid, 100.0);
1021 Halloween_ChangeCandy(playerid, -ARMOR_PRICE);
1022
1023 format(string, sizeof(string), "CANDY SHOP: {FFFFFF}Bought {FFA944}body armor {FFFFFF}using {9158B6}C%d.", ARMOR_PRICE);
1024 SendClientMessage(playerid, 0x9158B6FF, string);
1025 Halloween_ShowShopMenu(playerid);
1026 }
1027
1028 // gift box
1029 case 2: Halloween_ShowGiftMenu(playerid);
1030
1031 // weapons
1032 case 3: Halloween_ShowWeaponsMenu(playerid);
1033 }
1034 }
1035
1036 return 1;
1037 }
1038
1039 case DIALOG_BUY_GIFT:
1040 {
1041 if(!response) return Halloween_ShowShopMenu(playerid);
1042 switch(listitem)
1043 {
1044 // use money
1045 case 0:
1046 {
1047 if(GIFT_PRICE > GetPlayerMoney(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You don't have enough money."), Halloween_ShowGiftMenu(playerid);
1048 new Float: x, Float: y, Float: z, Float: a;
1049 GetPlayerPos(playerid, x, y, z);
1050 GetPlayerFacingAngle(playerid, a);
1051
1052 x += (2.0 * floatsin(-a, degrees));
1053 y += (2.0 * floatcos(-a, degrees));
1054
1055 if(Halloween_CreateGiftBox(x, y, z, GetPlayerVirtualWorld(playerid), GetPlayerInterior(playerid)) != -1)
1056 {
1057 GivePlayerMoney(playerid, -GIFT_PRICE);
1058 Halloween_ShowGiftMenu(playerid);
1059 }
1060 }
1061
1062 // use candy
1063 case 1:
1064 {
1065 if(GIFT_PRICE_CANDY > CandyCount[playerid]) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You don't have enough candies."), Halloween_ShowGiftMenu(playerid);
1066 new Float: x, Float: y, Float: z, Float: a;
1067 GetPlayerPos(playerid, x, y, z);
1068 GetPlayerFacingAngle(playerid, a);
1069
1070 x += (2.0 * floatsin(-a, degrees));
1071 y += (2.0 * floatcos(-a, degrees));
1072
1073 if(Halloween_CreateGiftBox(x, y, z, GetPlayerVirtualWorld(playerid), GetPlayerInterior(playerid)) != -1)
1074 {
1075 Halloween_ChangeCandy(playerid, -GIFT_PRICE_CANDY);
1076 Halloween_ShowGiftMenu(playerid);
1077 }
1078 }
1079 }
1080
1081 return 1;
1082 }
1083
1084 case DIALOG_BUY_WEAPON:
1085 {
1086 if(!response) return Halloween_ShowShopMenu(playerid);
1087 new price = ShopWeapons[listitem][WeaponPrice];
1088 if(price > CandyCount[playerid]) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You don't have enough candies."), Halloween_ShowWeaponsMenu(playerid);
1089 GivePlayerWeapon(playerid, ShopWeapons[listitem][WeaponID], ShopWeapons[listitem][WeaponAmmo]);
1090 Halloween_ChangeCandy(playerid, -price);
1091
1092 new string[128], w_name[32];
1093 GetWeaponName(ShopWeapons[listitem][WeaponID], w_name, sizeof(w_name));
1094 format(string, sizeof(string), "CANDY SHOP: {FFFFFF}Bought {FFA944}%s {FFFFFF}using {9158B6}C%d.", w_name, price);
1095 SendClientMessage(playerid, 0x9158B6FF, string);
1096 Halloween_ShowWeaponsMenu(playerid);
1097 return 1;
1098 }
1099 }
1100
1101 return 0;
1102}
1103
1104public OnPlayerPickUpDynamicPickup(playerid, STREAMER_TAG_PICKUP pickupid)
1105{
1106 switch(Streamer_GetIntData(STREAMER_TYPE_PICKUP, pickupid, E_STREAMER_MODEL_ID))
1107 {
1108 // gift boxes
1109 case 19054..19058:
1110 {
1111 new id = Streamer_GetIntData(STREAMER_TYPE_PICKUP, pickupid, E_STREAMER_EXTRA_ID), string[144];
1112 format(string, sizeof(string), "HALLOWEEN: {FFFFFF}%s(%d) has found a gift box at {FFA944}%s, %s!", ReturnPlayerName(playerid), playerid, GetZoneName(GiftBoxData[id][GiftBoxX], GiftBoxData[id][GiftBoxY], GiftBoxData[id][GiftBoxZ]), GetCityName(GiftBoxData[id][GiftBoxX], GiftBoxData[id][GiftBoxY], GiftBoxData[id][GiftBoxZ]));
1113 SendClientMessageToAll(0x9158B6FF, string);
1114
1115 switch(random(11))
1116 {
1117 case 0..2:
1118 {
1119 SetPlayerHealth(playerid, 100.0);
1120 SendClientMessage(playerid, 0x9158B6FF, "HALLOWEEN: {FFFFFF}Found a {FFA944}medkit.");
1121 }
1122
1123 case 4, 5:
1124 {
1125 SetPlayerArmour(playerid, 100.0);
1126 SendClientMessage(playerid, 0x9158B6FF, "HALLOWEEN: {FFFFFF}Found a {FFA944}body armor.");
1127 }
1128
1129 case 6..8:
1130 {
1131 new money = RandomEx(GIFT_MIN_MONEY, GIFT_MAX_MONEY);
1132 GivePlayerMoney(playerid, money);
1133
1134 format(string, sizeof(string), "HALLOWEEN: {FFFFFF}Found {2ECC71}$%d.", money);
1135 SendClientMessage(playerid, 0x9158B6FF, string);
1136 }
1137
1138 default:
1139 {
1140 new candy = RandomEx(GIFT_MIN_CANDY, GIFT_MAX_CANDY);
1141 Halloween_ChangeCandy(playerid, candy);
1142
1143 format(string, sizeof(string), "HALLOWEEN: {FFFFFF}Found {FFA944}%d candy.", candy);
1144 SendClientMessage(playerid, 0x9158B6FF, string);
1145 }
1146 }
1147
1148 GiftBox_Destroy(id);
1149 }
1150
1151 #if defined PUMPKIN_DROPS
1152 // pumpkin
1153 case 19320:
1154 {
1155 new id = Streamer_GetIntData(STREAMER_TYPE_PICKUP, pickupid, E_STREAMER_EXTRA_ID);
1156 Halloween_ChangeCandy(playerid, PUMPKIN_CANDY);
1157 Pumpkin_Destroy(id);
1158 }
1159 #endif
1160 }
1161
1162 return 1;
1163}
1164
1165CMD:giftboxes(playerid, params[])
1166{
1167 new string[2048], found; // overkill af but just in case
1168 format(string, sizeof(string), "Area\tCity\tTime Left\n");
1169
1170 for(new i; i < MAX_GIFT_BOXES; i++)
1171 {
1172 if(!GiftBoxData[i][GiftBoxExists]) continue;
1173 format(string, sizeof(string), "%s%s\t%s\t%s\n", string, GetZoneName(GiftBoxData[i][GiftBoxX], GiftBoxData[i][GiftBoxY], GiftBoxData[i][GiftBoxZ]), GetCityName(GiftBoxData[i][GiftBoxX], GiftBoxData[i][GiftBoxY], GiftBoxData[i][GiftBoxZ]), formatTime(GiftBoxData[i][GiftBoxTimeLeft]));
1174 found++;
1175 }
1176
1177 if(found > 0) {
1178 new title[24];
1179 format(title, sizeof(title), "Gift Boxes (%d Found)", found);
1180 ShowPlayerDialog(playerid, DIALOG_UNUSED, DIALOG_STYLE_TABLIST_HEADERS, title, string, "Close", "");
1181 }else{
1182 ShowPlayerDialog(playerid, DIALOG_UNUSED, DIALOG_STYLE_MSGBOX, "Gift Boxes", "No gift boxes found.", "Close", "");
1183 }
1184
1185 return 1;
1186}
1187
1188CMD:topcollectors(playerid, params[])
1189{
1190 new name[MAX_PLAYER_NAME], candies;
1191 stmt_bind_result_field(TopCandies, 0, DB::TYPE_STRING, name, MAX_PLAYER_NAME);
1192 stmt_bind_result_field(TopCandies, 1, DB::TYPE_INTEGER, candies);
1193
1194 if(stmt_execute(TopCandies))
1195 {
1196 new idx, string[700], colors[] = {0xF1C40FFF, 0xA8A8A8FF, 0x965A38FF};
1197 format(string, sizeof(string), "#\tName\tCandies\n");
1198
1199 while(stmt_fetch_row(TopCandies))
1200 {
1201 if(idx < 3) {
1202 format(string, sizeof(string), "%s{%06x}%d\t{%06x}%s\t{%06x}%d\n", string, colors[idx] >>> 8, idx + 1, colors[idx] >>> 8, name, colors[idx] >>> 8, candies);
1203 }else{
1204 format(string, sizeof(string), "%s%d\t%s\t%d\n", string, idx + 1, name, candies);
1205 }
1206
1207 idx++;
1208 }
1209
1210 ShowPlayerDialog(playerid, DIALOG_UNUSED, DIALOG_STYLE_TABLIST_HEADERS, "Top Candy Collectors", string, "Close", "");
1211 }
1212
1213 return 1;
1214}
1215
1216CMD:candyshop(playerid, params[])
1217{
1218 // https://youtu.be/SRcnnId15BA
1219 Halloween_ShowShopMenu(playerid);
1220 return 1;
1221}
1222
1223/* Admin Commands */
1224CMD:givecandy(playerid, params[])
1225{
1226 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Only RCON admins can use this command.");
1227 new id, amount;
1228 if(sscanf(params, "ui", id, amount)) return SendClientMessage(playerid, 0xF39C12FF, "SYNTAX: {FFFFFF}/giveplayercandy [player] [amount]");
1229 if(id == INVALID_PLAYER_ID) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Player is offline.");
1230 Halloween_ChangeCandy(id, amount);
1231
1232 new string[128];
1233 format(string, sizeof(string), "HALLOWEEN: {FFFFFF}You gave %s(%d) {9158B6}C%d.", ReturnPlayerName(id), id, amount);
1234 SendClientMessage(playerid, 0x9158B6FF, string);
1235
1236 format(string, sizeof(string), "HALLOWEEN: {FFFFFF}Admin %s(%d) gave you {9158B6}C%d.", ReturnPlayerName(playerid), playerid, amount);
1237 SendClientMessage(id, 0x9158B6FF, string);
1238 return 1;
1239}
1240
1241CMD:giveallcandy(playerid, params[])
1242{
1243 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Only RCON admins can use this command.");
1244 new amount;
1245 if(sscanf(params, "i", amount)) return SendClientMessage(playerid, 0xF39C12FF, "SYNTAX: {FFFFFF}/giveallcandy [amount]");
1246 for(new i, maxp = GetPlayerPoolSize(); i <= maxp; i++) if(IsPlayerConnected(i)) Halloween_ChangeCandy(i, amount);
1247
1248 new string[128];
1249 format(string, sizeof(string), "HALLOWEEN: {FFFFFF}Admin %s(%d) gave everyone {9158B6}C%d.", ReturnPlayerName(playerid), playerid, amount);
1250 SendClientMessageToAll(0x9158B6FF, string);
1251 return 1;
1252}
1253
1254CMD:dropgift(playerid, params[])
1255{
1256 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Only RCON admins can use this command.");
1257 new Float: x, Float: y, Float: z, Float: a;
1258 GetPlayerPos(playerid, x, y, z);
1259 GetPlayerFacingAngle(playerid, a);
1260
1261 x += (2.0 * floatsin(-a, degrees));
1262 y += (2.0 * floatcos(-a, degrees));
1263
1264 if(Halloween_CreateGiftBox(x, y, z, GetPlayerVirtualWorld(playerid), GetPlayerInterior(playerid)) != -1)
1265 {
1266 new string[128];
1267 format(string, sizeof(string), "HALLOWEEN: {FFFFFF}Admin %s(%d) spawned a gift box on their location.", ReturnPlayerName(playerid), playerid);
1268 SendClientMessageToAll(0x9158B6FF, string);
1269 }
1270
1271 return 1;
1272}
1273
1274CMD:dropgiftaround(playerid, params[])
1275{
1276 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Only RCON admins can use this command.");
1277 new amount;
1278 if(sscanf(params, "i", amount)) return SendClientMessage(playerid, 0xF39C12FF, "SYNTAX: {FFFFFF}/dropgiftaround [amount]");
1279 if(!(1 <= amount <= 10)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You can't drop less than 1 and more than 10 gift boxes at once.");
1280 new id, total;
1281 for(new i; i < amount; i++)
1282 {
1283 id = random(sizeof(GiftBoxCoords));
1284 if(Halloween_CreateGiftBox(GiftBoxCoords[id][GiftBoxSpawnX], GiftBoxCoords[id][GiftBoxSpawnY], GiftBoxCoords[id][GiftBoxSpawnZ], -1, -1) != -1) total++;
1285 }
1286
1287 if(total > 0)
1288 {
1289 new string[128];
1290 format(string, sizeof(string), "HALLOWEEN: {FFFFFF}Admin %s(%d) spawned %d gift boxes.", ReturnPlayerName(playerid), playerid, total);
1291 SendClientMessageToAll(0x9158B6FF, string);
1292 }
1293
1294 return 1;
1295}