· 7 years ago · Oct 30, 2018, 08:26 PM
1/*
2 Yet Another House System by rootcause
3
4 Current Version: 1.3 for MySQL Plugin R40
5 Topic: http://forum.sa-mp.com/showthread.php?p=3409290
6
7 Changelog (v1.3):
8 - Added house selling, you can put your houses for sale. When your house is bought by an another player, you'll receive your money.
9 - Added a house buying limiter, a player can't buy more than LIMIT_PER_PLAYER houses. Set LIMIT_PER_PLAYER to 0 if you want no limits.
10 - Internal changes like replacing GetPlayerName with Player_GetName or replacing the DIALOG_HOUSE+x format with e_dialogids enum.
11*/
12
13#define FILTERSCRIPT
14#include <a_samp>
15#include <a_mysql>
16#include <streamer>
17#include <sscanf2>
18#include <YSI\y_iterate>
19#include <zcmd>
20
21#define MAX_HOUSES (100)
22#define MAX_HOUSE_NAME (48)
23#define MAX_HOUSE_PASSWORD (16)
24#define MAX_HOUSE_ADDRESS (48)
25#define MAX_INT_NAME (32)
26#define INVALID_HOUSE_ID (-1)
27#define HOUSE_COOLDOWN (6)
28#define LIMIT_PER_PLAYER (3)
29
30#define SQL_HOST "127.0.0.1"
31#define SQL_USER "root"
32#define SQL_PASSWORD ""
33#define SQL_DBNAME "housedb"
34
35enum _:e_lockmodes
36{
37 LOCK_MODE_NOLOCK,
38 LOCK_MODE_PASSWORD,
39 LOCK_MODE_KEYS,
40 LOCK_MODE_OWNER
41}
42
43enum _:e_selectmodes
44{
45 SELECT_MODE_NONE,
46 SELECT_MODE_EDIT,
47 SELECT_MODE_SELL
48}
49
50enum _:e_dialogids
51{
52 DIALOG_BUY_HOUSE = 7500,
53 DIALOG_HOUSE_PASSWORD,
54 DIALOG_HOUSE_MENU,
55 DIALOG_HOUSE_NAME,
56 DIALOG_HOUSE_NEW_PASSWORD,
57 DIALOG_HOUSE_LOCK,
58 DIALOG_SAFE_MENU,
59 DIALOG_SAFE_TAKE,
60 DIALOG_SAFE_PUT,
61 DIALOG_GUNS_MENU,
62 DIALOG_GUNS_TAKE,
63 DIALOG_FURNITURE_MENU,
64 DIALOG_FURNITURE_BUY,
65 DIALOG_FURNITURE_SELL,
66 DIALOG_VISITORS_MENU,
67 DIALOG_VISITORS,
68 DIALOG_KEYS_MENU,
69 DIALOG_KEYS,
70 DIALOG_SAFE_HISTORY,
71 DIALOG_MY_KEYS,
72 DIALOG_BUY_HOUSE_FROM_OWNER,
73 DIALOG_SELL_HOUSE,
74 DIALOG_SELLING_PRICE
75}
76
77enum e_house
78{
79 Name[MAX_HOUSE_NAME],
80 Owner[MAX_PLAYER_NAME],
81 Password[MAX_HOUSE_PASSWORD],
82 Address[MAX_HOUSE_ADDRESS],
83 Float: houseX,
84 Float: houseY,
85 Float: houseZ,
86 Price,
87 SalePrice,
88 Interior,
89 LockMode,
90 SafeMoney,
91 LastEntered,
92 Text3D: HouseLabel,
93 HousePickup,
94 HouseIcon,
95 bool: Save
96};
97
98enum e_interior
99{
100 IntName[MAX_INT_NAME],
101 Float: intX,
102 Float: intY,
103 Float: intZ,
104 intID,
105 Text3D: intLabel,
106 intPickup
107};
108
109enum e_furnituredata
110{
111 ModelID,
112 Name[32],
113 Price
114};
115
116enum e_furniture
117{
118 SQLID,
119 HouseID,
120 ArrayID,
121 Float: furnitureX,
122 Float: furnitureY,
123 Float: furnitureZ,
124 Float: furnitureRX,
125 Float: furnitureRY,
126 Float: furnitureRZ
127};
128
129enum e_sazone
130{
131 SAZONE_NAME[28],
132 Float: SAZONE_AREA[6]
133};
134
135new
136 MySQL: SQLHandle,
137 HouseTimer = -1,
138 HouseData[MAX_HOUSES][e_house],
139 Iterator: Houses<MAX_HOUSES>,
140 Iterator: HouseKeys[MAX_PLAYERS]<MAX_HOUSES>,
141 InHouse[MAX_PLAYERS] = {INVALID_HOUSE_ID, ...},
142 SelectMode[MAX_PLAYERS] = {SELECT_MODE_NONE, ...},
143 LastVisitedHouse[MAX_PLAYERS] = {INVALID_HOUSE_ID, ...},
144 ListPage[MAX_PLAYERS] = {0, ...},
145 bool: EditingFurniture[MAX_PLAYERS] = {false, ...};
146
147new
148 HouseInteriors[][e_interior] = {
149 // int name, x, y, z, intid
150 {"Interior 1", 2233.4900, -1114.4435, 1050.8828, 5},
151 {"Interior 2", 2196.3943, -1204.1359, 1049.0234, 6},
152 {"Interior 3", 2318.1616, -1026.3762, 1050.2109, 9},
153 {"Interior 4", 421.8333, 2536.9814, 10.0000, 10},
154 {"Interior 5", 225.5707, 1240.0643, 1082.1406, 2},
155 {"Interior 6", 2496.2087, -1692.3149, 1014.7422, 3},
156 {"Interior 7", 226.7545, 1114.4180, 1080.9952, 5},
157 {"Interior 8", 2269.9636, -1210.3275, 1047.5625, 10}
158 };
159
160new
161 HouseFurnitures[][e_furnituredata] = {
162 // modelid, furniture name, price
163 {3111, "Building Plan", 500},
164 {2894, "Book", 20},
165 {2277, "Cat Picture", 100},
166 {1753, "Leather Couch", 150},
167 {1703, "Black Couch", 200},
168 {1255, "Lounger", 75},
169 {19581, "Frying Pan", 10},
170 {19584, "Sauce Pan", 12},
171 {19590, "Woozie's Sword", 1000},
172 {19525, "Wedding Cake", 50},
173 {1742, "Bookshelf", 80},
174 {1518, "TV 1", 130},
175 {19609, "Drum Kit", 500},
176 {19787, "Small LCD TV", 2000},
177 {19786, "Big LCD TV", 4000},
178 {2627, "Treadmill", 130}
179 };
180
181new
182 SAZones[][e_sazone] = {
183 {"The Big Ear", {-410.00,1403.30,-3.00,-137.90,1681.20,200.00}},
184 {"Aldea Malvada", {-1372.10,2498.50,0.00,-1277.50,2615.30,200.00}},
185 {"Angel Pine", {-2324.90,-2584.20,-6.10,-1964.20,-2212.10,200.00}},
186 {"Arco del Oeste", {-901.10,2221.80,0.00,-592.00,2571.90,200.00}},
187 {"Avispa Country Club", {-2646.40,-355.40,0.00,-2270.00,-222.50,200.00}},
188 {"Avispa Country Club", {-2831.80,-430.20,-6.10,-2646.40,-222.50,200.00}},
189 {"Avispa Country Club", {-2361.50,-417.10,0.00,-2270.00,-355.40,200.00}},
190 {"Avispa Country Club", {-2667.80,-302.10,-28.80,-2646.40,-262.30,71.10}},
191 {"Avispa Country Club", {-2470.00,-355.40,0.00,-2270.00,-318.40,46.10}},
192 {"Avispa Country Club", {-2550.00,-355.40,0.00,-2470.00,-318.40,39.70}},
193 {"Back o Beyond", {-1166.90,-2641.10,0.00,-321.70,-1856.00,200.00}},
194 {"Battery Point", {-2741.00,1268.40,-4.50,-2533.00,1490.40,200.00}},
195 {"Bayside", {-2741.00,2175.10,0.00,-2353.10,2722.70,200.00}},
196 {"Bayside Marina", {-2353.10,2275.70,0.00,-2153.10,2475.70,200.00}},
197 {"Beacon Hill", {-399.60,-1075.50,-1.40,-319.00,-977.50,198.50}},
198 {"Blackfield", {964.30,1203.20,-89.00,1197.30,1403.20,110.90}},
199 {"Blackfield", {964.30,1403.20,-89.00,1197.30,1726.20,110.90}},
200 {"Blackfield Chapel", {1375.60,596.30,-89.00,1558.00,823.20,110.90}},
201 {"Blackfield Chapel", {1325.60,596.30,-89.00,1375.60,795.00,110.90}},
202 {"Blackfield Intersection", {1197.30,1044.60,-89.00,1277.00,1163.30,110.90}},
203 {"Blackfield Intersection", {1166.50,795.00,-89.00,1375.60,1044.60,110.90}},
204 {"Blackfield Intersection", {1277.00,1044.60,-89.00,1315.30,1087.60,110.90}},
205 {"Blackfield Intersection", {1375.60,823.20,-89.00,1457.30,919.40,110.90}},
206 {"Blueberry", {104.50,-220.10,2.30,349.60,152.20,200.00}},
207 {"Blueberry", {19.60,-404.10,3.80,349.60,-220.10,200.00}},
208 {"Blueberry Acres", {-319.60,-220.10,0.00,104.50,293.30,200.00}},
209 {"Caligula's Palace", {2087.30,1543.20,-89.00,2437.30,1703.20,110.90}},
210 {"Caligula's Palace", {2137.40,1703.20,-89.00,2437.30,1783.20,110.90}},
211 {"Calton Heights", {-2274.10,744.10,-6.10,-1982.30,1358.90,200.00}},
212 {"Chinatown", {-2274.10,578.30,-7.60,-2078.60,744.10,200.00}},
213 {"City Hall", {-2867.80,277.40,-9.10,-2593.40,458.40,200.00}},
214 {"Come-A-Lot", {2087.30,943.20,-89.00,2623.10,1203.20,110.90}},
215 {"Commerce", {1323.90,-1842.20,-89.00,1701.90,-1722.20,110.90}},
216 {"Commerce", {1323.90,-1722.20,-89.00,1440.90,-1577.50,110.90}},
217 {"Commerce", {1370.80,-1577.50,-89.00,1463.90,-1384.90,110.90}},
218 {"Commerce", {1463.90,-1577.50,-89.00,1667.90,-1430.80,110.90}},
219 {"Commerce", {1583.50,-1722.20,-89.00,1758.90,-1577.50,110.90}},
220 {"Commerce", {1667.90,-1577.50,-89.00,1812.60,-1430.80,110.90}},
221 {"Conference Center", {1046.10,-1804.20,-89.00,1323.90,-1722.20,110.90}},
222 {"Conference Center", {1073.20,-1842.20,-89.00,1323.90,-1804.20,110.90}},
223 {"Cranberry Station", {-2007.80,56.30,0.00,-1922.00,224.70,100.00}},
224 {"Creek", {2749.90,1937.20,-89.00,2921.60,2669.70,110.90}},
225 {"Dillimore", {580.70,-674.80,-9.50,861.00,-404.70,200.00}},
226 {"Doherty", {-2270.00,-324.10,-0.00,-1794.90,-222.50,200.00}},
227 {"Doherty", {-2173.00,-222.50,-0.00,-1794.90,265.20,200.00}},
228 {"Downtown", {-1982.30,744.10,-6.10,-1871.70,1274.20,200.00}},
229 {"Downtown", {-1871.70,1176.40,-4.50,-1620.30,1274.20,200.00}},
230 {"Downtown", {-1700.00,744.20,-6.10,-1580.00,1176.50,200.00}},
231 {"Downtown", {-1580.00,744.20,-6.10,-1499.80,1025.90,200.00}},
232 {"Downtown", {-2078.60,578.30,-7.60,-1499.80,744.20,200.00}},
233 {"Downtown", {-1993.20,265.20,-9.10,-1794.90,578.30,200.00}},
234 {"Downtown Los Santos", {1463.90,-1430.80,-89.00,1724.70,-1290.80,110.90}},
235 {"Downtown Los Santos", {1724.70,-1430.80,-89.00,1812.60,-1250.90,110.90}},
236 {"Downtown Los Santos", {1463.90,-1290.80,-89.00,1724.70,-1150.80,110.90}},
237 {"Downtown Los Santos", {1370.80,-1384.90,-89.00,1463.90,-1170.80,110.90}},
238 {"Downtown Los Santos", {1724.70,-1250.90,-89.00,1812.60,-1150.80,110.90}},
239 {"Downtown Los Santos", {1370.80,-1170.80,-89.00,1463.90,-1130.80,110.90}},
240 {"Downtown Los Santos", {1378.30,-1130.80,-89.00,1463.90,-1026.30,110.90}},
241 {"Downtown Los Santos", {1391.00,-1026.30,-89.00,1463.90,-926.90,110.90}},
242 {"Downtown Los Santos", {1507.50,-1385.20,110.90,1582.50,-1325.30,335.90}},
243 {"East Beach", {2632.80,-1852.80,-89.00,2959.30,-1668.10,110.90}},
244 {"East Beach", {2632.80,-1668.10,-89.00,2747.70,-1393.40,110.90}},
245 {"East Beach", {2747.70,-1668.10,-89.00,2959.30,-1498.60,110.90}},
246 {"East Beach", {2747.70,-1498.60,-89.00,2959.30,-1120.00,110.90}},
247 {"East Los Santos", {2421.00,-1628.50,-89.00,2632.80,-1454.30,110.90}},
248 {"East Los Santos", {2222.50,-1628.50,-89.00,2421.00,-1494.00,110.90}},
249 {"East Los Santos", {2266.20,-1494.00,-89.00,2381.60,-1372.00,110.90}},
250 {"East Los Santos", {2381.60,-1494.00,-89.00,2421.00,-1454.30,110.90}},
251 {"East Los Santos", {2281.40,-1372.00,-89.00,2381.60,-1135.00,110.90}},
252 {"East Los Santos", {2381.60,-1454.30,-89.00,2462.10,-1135.00,110.90}},
253 {"East Los Santos", {2462.10,-1454.30,-89.00,2581.70,-1135.00,110.90}},
254 {"Easter Basin", {-1794.90,249.90,-9.10,-1242.90,578.30,200.00}},
255 {"Easter Basin", {-1794.90,-50.00,-0.00,-1499.80,249.90,200.00}},
256 {"Easter Bay Airport", {-1499.80,-50.00,-0.00,-1242.90,249.90,200.00}},
257 {"Easter Bay Airport", {-1794.90,-730.10,-3.00,-1213.90,-50.00,200.00}},
258 {"Easter Bay Airport", {-1213.90,-730.10,0.00,-1132.80,-50.00,200.00}},
259 {"Easter Bay Airport", {-1242.90,-50.00,0.00,-1213.90,578.30,200.00}},
260 {"Easter Bay Airport", {-1213.90,-50.00,-4.50,-947.90,578.30,200.00}},
261 {"Easter Bay Airport", {-1315.40,-405.30,15.40,-1264.40,-209.50,25.40}},
262 {"Easter Bay Airport", {-1354.30,-287.30,15.40,-1315.40,-209.50,25.40}},
263 {"Easter Bay Airport", {-1490.30,-209.50,15.40,-1264.40,-148.30,25.40}},
264 {"Easter Bay Chemicals", {-1132.80,-768.00,0.00,-956.40,-578.10,200.00}},
265 {"Easter Bay Chemicals", {-1132.80,-787.30,0.00,-956.40,-768.00,200.00}},
266 {"El Castillo del Diablo", {-464.50,2217.60,0.00,-208.50,2580.30,200.00}},
267 {"El Castillo del Diablo", {-208.50,2123.00,-7.60,114.00,2337.10,200.00}},
268 {"El Castillo del Diablo", {-208.50,2337.10,0.00,8.40,2487.10,200.00}},
269 {"El Corona", {1812.60,-2179.20,-89.00,1970.60,-1852.80,110.90}},
270 {"El Corona", {1692.60,-2179.20,-89.00,1812.60,-1842.20,110.90}},
271 {"El Quebrados", {-1645.20,2498.50,0.00,-1372.10,2777.80,200.00}},
272 {"Esplanade East", {-1620.30,1176.50,-4.50,-1580.00,1274.20,200.00}},
273 {"Esplanade East", {-1580.00,1025.90,-6.10,-1499.80,1274.20,200.00}},
274 {"Esplanade East", {-1499.80,578.30,-79.60,-1339.80,1274.20,20.30}},
275 {"Esplanade North", {-2533.00,1358.90,-4.50,-1996.60,1501.20,200.00}},
276 {"Esplanade North", {-1996.60,1358.90,-4.50,-1524.20,1592.50,200.00}},
277 {"Esplanade North", {-1982.30,1274.20,-4.50,-1524.20,1358.90,200.00}},
278 {"Fallen Tree", {-792.20,-698.50,-5.30,-452.40,-380.00,200.00}},
279 {"Fallow Bridge", {434.30,366.50,0.00,603.00,555.60,200.00}},
280 {"Fern Ridge", {508.10,-139.20,0.00,1306.60,119.50,200.00}},
281 {"Financial", {-1871.70,744.10,-6.10,-1701.30,1176.40,300.00}},
282 {"Fisher's Lagoon", {1916.90,-233.30,-100.00,2131.70,13.80,200.00}},
283 {"Flint Intersection", {-187.70,-1596.70,-89.00,17.00,-1276.60,110.90}},
284 {"Flint Range", {-594.10,-1648.50,0.00,-187.70,-1276.60,200.00}},
285 {"Fort Carson", {-376.20,826.30,-3.00,123.70,1220.40,200.00}},
286 {"Foster Valley", {-2270.00,-430.20,-0.00,-2178.60,-324.10,200.00}},
287 {"Foster Valley", {-2178.60,-599.80,-0.00,-1794.90,-324.10,200.00}},
288 {"Foster Valley", {-2178.60,-1115.50,0.00,-1794.90,-599.80,200.00}},
289 {"Foster Valley", {-2178.60,-1250.90,0.00,-1794.90,-1115.50,200.00}},
290 {"Frederick Bridge", {2759.20,296.50,0.00,2774.20,594.70,200.00}},
291 {"Gant Bridge", {-2741.40,1659.60,-6.10,-2616.40,2175.10,200.00}},
292 {"Gant Bridge", {-2741.00,1490.40,-6.10,-2616.40,1659.60,200.00}},
293 {"Ganton", {2222.50,-1852.80,-89.00,2632.80,-1722.30,110.90}},
294 {"Ganton", {2222.50,-1722.30,-89.00,2632.80,-1628.50,110.90}},
295 {"Garcia", {-2411.20,-222.50,-0.00,-2173.00,265.20,200.00}},
296 {"Garcia", {-2395.10,-222.50,-5.30,-2354.00,-204.70,200.00}},
297 {"Garver Bridge", {-1339.80,828.10,-89.00,-1213.90,1057.00,110.90}},
298 {"Garver Bridge", {-1213.90,950.00,-89.00,-1087.90,1178.90,110.90}},
299 {"Garver Bridge", {-1499.80,696.40,-179.60,-1339.80,925.30,20.30}},
300 {"Glen Park", {1812.60,-1449.60,-89.00,1996.90,-1350.70,110.90}},
301 {"Glen Park", {1812.60,-1100.80,-89.00,1994.30,-973.30,110.90}},
302 {"Glen Park", {1812.60,-1350.70,-89.00,2056.80,-1100.80,110.90}},
303 {"Green Palms", {176.50,1305.40,-3.00,338.60,1520.70,200.00}},
304 {"Greenglass College", {964.30,1044.60,-89.00,1197.30,1203.20,110.90}},
305 {"Greenglass College", {964.30,930.80,-89.00,1166.50,1044.60,110.90}},
306 {"Hampton Barns", {603.00,264.30,0.00,761.90,366.50,200.00}},
307 {"Hankypanky Point", {2576.90,62.10,0.00,2759.20,385.50,200.00}},
308 {"Harry Gold Parkway", {1777.30,863.20,-89.00,1817.30,2342.80,110.90}},
309 {"Hashbury", {-2593.40,-222.50,-0.00,-2411.20,54.70,200.00}},
310 {"Hilltop Farm", {967.30,-450.30,-3.00,1176.70,-217.90,200.00}},
311 {"Hunter Quarry", {337.20,710.80,-115.20,860.50,1031.70,203.70}},
312 {"Idlewood", {1812.60,-1852.80,-89.00,1971.60,-1742.30,110.90}},
313 {"Idlewood", {1812.60,-1742.30,-89.00,1951.60,-1602.30,110.90}},
314 {"Idlewood", {1951.60,-1742.30,-89.00,2124.60,-1602.30,110.90}},
315 {"Idlewood", {1812.60,-1602.30,-89.00,2124.60,-1449.60,110.90}},
316 {"Idlewood", {2124.60,-1742.30,-89.00,2222.50,-1494.00,110.90}},
317 {"Idlewood", {1971.60,-1852.80,-89.00,2222.50,-1742.30,110.90}},
318 {"Jefferson", {1996.90,-1449.60,-89.00,2056.80,-1350.70,110.90}},
319 {"Jefferson", {2124.60,-1494.00,-89.00,2266.20,-1449.60,110.90}},
320 {"Jefferson", {2056.80,-1372.00,-89.00,2281.40,-1210.70,110.90}},
321 {"Jefferson", {2056.80,-1210.70,-89.00,2185.30,-1126.30,110.90}},
322 {"Jefferson", {2185.30,-1210.70,-89.00,2281.40,-1154.50,110.90}},
323 {"Jefferson", {2056.80,-1449.60,-89.00,2266.20,-1372.00,110.90}},
324 {"Julius Thruway East", {2623.10,943.20,-89.00,2749.90,1055.90,110.90}},
325 {"Julius Thruway East", {2685.10,1055.90,-89.00,2749.90,2626.50,110.90}},
326 {"Julius Thruway East", {2536.40,2442.50,-89.00,2685.10,2542.50,110.90}},
327 {"Julius Thruway East", {2625.10,2202.70,-89.00,2685.10,2442.50,110.90}},
328 {"Julius Thruway North", {2498.20,2542.50,-89.00,2685.10,2626.50,110.90}},
329 {"Julius Thruway North", {2237.40,2542.50,-89.00,2498.20,2663.10,110.90}},
330 {"Julius Thruway North", {2121.40,2508.20,-89.00,2237.40,2663.10,110.90}},
331 {"Julius Thruway North", {1938.80,2508.20,-89.00,2121.40,2624.20,110.90}},
332 {"Julius Thruway North", {1534.50,2433.20,-89.00,1848.40,2583.20,110.90}},
333 {"Julius Thruway North", {1848.40,2478.40,-89.00,1938.80,2553.40,110.90}},
334 {"Julius Thruway North", {1704.50,2342.80,-89.00,1848.40,2433.20,110.90}},
335 {"Julius Thruway North", {1377.30,2433.20,-89.00,1534.50,2507.20,110.90}},
336 {"Julius Thruway South", {1457.30,823.20,-89.00,2377.30,863.20,110.90}},
337 {"Julius Thruway South", {2377.30,788.80,-89.00,2537.30,897.90,110.90}},
338 {"Julius Thruway West", {1197.30,1163.30,-89.00,1236.60,2243.20,110.90}},
339 {"Julius Thruway West", {1236.60,2142.80,-89.00,1297.40,2243.20,110.90}},
340 {"Juniper Hill", {-2533.00,578.30,-7.60,-2274.10,968.30,200.00}},
341 {"Juniper Hollow", {-2533.00,968.30,-6.10,-2274.10,1358.90,200.00}},
342 {"K.A.C.C. Military Fuels", {2498.20,2626.50,-89.00,2749.90,2861.50,110.90}},
343 {"Kincaid Bridge", {-1339.80,599.20,-89.00,-1213.90,828.10,110.90}},
344 {"Kincaid Bridge", {-1213.90,721.10,-89.00,-1087.90,950.00,110.90}},
345 {"Kincaid Bridge", {-1087.90,855.30,-89.00,-961.90,986.20,110.90}},
346 {"King's", {-2329.30,458.40,-7.60,-1993.20,578.30,200.00}},
347 {"King's", {-2411.20,265.20,-9.10,-1993.20,373.50,200.00}},
348 {"King's", {-2253.50,373.50,-9.10,-1993.20,458.40,200.00}},
349 {"LVA Freight Depot", {1457.30,863.20,-89.00,1777.40,1143.20,110.90}},
350 {"LVA Freight Depot", {1375.60,919.40,-89.00,1457.30,1203.20,110.90}},
351 {"LVA Freight Depot", {1277.00,1087.60,-89.00,1375.60,1203.20,110.90}},
352 {"LVA Freight Depot", {1315.30,1044.60,-89.00,1375.60,1087.60,110.90}},
353 {"LVA Freight Depot", {1236.60,1163.40,-89.00,1277.00,1203.20,110.90}},
354 {"Las Barrancas", {-926.10,1398.70,-3.00,-719.20,1634.60,200.00}},
355 {"Las Brujas", {-365.10,2123.00,-3.00,-208.50,2217.60,200.00}},
356 {"Las Colinas", {1994.30,-1100.80,-89.00,2056.80,-920.80,110.90}},
357 {"Las Colinas", {2056.80,-1126.30,-89.00,2126.80,-920.80,110.90}},
358 {"Las Colinas", {2185.30,-1154.50,-89.00,2281.40,-934.40,110.90}},
359 {"Las Colinas", {2126.80,-1126.30,-89.00,2185.30,-934.40,110.90}},
360 {"Las Colinas", {2747.70,-1120.00,-89.00,2959.30,-945.00,110.90}},
361 {"Las Colinas", {2632.70,-1135.00,-89.00,2747.70,-945.00,110.90}},
362 {"Las Colinas", {2281.40,-1135.00,-89.00,2632.70,-945.00,110.90}},
363 {"Las Payasadas", {-354.30,2580.30,2.00,-133.60,2816.80,200.00}},
364 {"Las Venturas Airport", {1236.60,1203.20,-89.00,1457.30,1883.10,110.90}},
365 {"Las Venturas Airport", {1457.30,1203.20,-89.00,1777.30,1883.10,110.90}},
366 {"Las Venturas Airport", {1457.30,1143.20,-89.00,1777.40,1203.20,110.90}},
367 {"Las Venturas Airport", {1515.80,1586.40,-12.50,1729.90,1714.50,87.50}},
368 {"Last Dime Motel", {1823.00,596.30,-89.00,1997.20,823.20,110.90}},
369 {"Leafy Hollow", {-1166.90,-1856.00,0.00,-815.60,-1602.00,200.00}},
370 {"Liberty City", {-1000.00,400.00,1300.00,-700.00,600.00,1400.00}},
371 {"Lil' Probe Inn", {-90.20,1286.80,-3.00,153.80,1554.10,200.00}},
372 {"Linden Side", {2749.90,943.20,-89.00,2923.30,1198.90,110.90}},
373 {"Linden Station", {2749.90,1198.90,-89.00,2923.30,1548.90,110.90}},
374 {"Linden Station", {2811.20,1229.50,-39.50,2861.20,1407.50,60.40}},
375 {"Little Mexico", {1701.90,-1842.20,-89.00,1812.60,-1722.20,110.90}},
376 {"Little Mexico", {1758.90,-1722.20,-89.00,1812.60,-1577.50,110.90}},
377 {"Los Flores", {2581.70,-1454.30,-89.00,2632.80,-1393.40,110.90}},
378 {"Los Flores", {2581.70,-1393.40,-89.00,2747.70,-1135.00,110.90}},
379 {"Los Santos International", {1249.60,-2394.30,-89.00,1852.00,-2179.20,110.90}},
380 {"Los Santos International", {1852.00,-2394.30,-89.00,2089.00,-2179.20,110.90}},
381 {"Los Santos International", {1382.70,-2730.80,-89.00,2201.80,-2394.30,110.90}},
382 {"Los Santos International", {1974.60,-2394.30,-39.00,2089.00,-2256.50,60.90}},
383 {"Los Santos International", {1400.90,-2669.20,-39.00,2189.80,-2597.20,60.90}},
384 {"Los Santos International", {2051.60,-2597.20,-39.00,2152.40,-2394.30,60.90}},
385 {"Marina", {647.70,-1804.20,-89.00,851.40,-1577.50,110.90}},
386 {"Marina", {647.70,-1577.50,-89.00,807.90,-1416.20,110.90}},
387 {"Marina", {807.90,-1577.50,-89.00,926.90,-1416.20,110.90}},
388 {"Market", {787.40,-1416.20,-89.00,1072.60,-1310.20,110.90}},
389 {"Market", {952.60,-1310.20,-89.00,1072.60,-1130.80,110.90}},
390 {"Market", {1072.60,-1416.20,-89.00,1370.80,-1130.80,110.90}},
391 {"Market", {926.90,-1577.50,-89.00,1370.80,-1416.20,110.90}},
392 {"Market Station", {787.40,-1410.90,-34.10,866.00,-1310.20,65.80}},
393 {"Martin Bridge", {-222.10,293.30,0.00,-122.10,476.40,200.00}},
394 {"Missionary Hill", {-2994.40,-811.20,0.00,-2178.60,-430.20,200.00}},
395 {"Montgomery", {1119.50,119.50,-3.00,1451.40,493.30,200.00}},
396 {"Montgomery", {1451.40,347.40,-6.10,1582.40,420.80,200.00}},
397 {"Montgomery Intersection", {1546.60,208.10,0.00,1745.80,347.40,200.00}},
398 {"Montgomery Intersection", {1582.40,347.40,0.00,1664.60,401.70,200.00}},
399 {"Mulholland", {1414.00,-768.00,-89.00,1667.60,-452.40,110.90}},
400 {"Mulholland", {1281.10,-452.40,-89.00,1641.10,-290.90,110.90}},
401 {"Mulholland", {1269.10,-768.00,-89.00,1414.00,-452.40,110.90}},
402 {"Mulholland", {1357.00,-926.90,-89.00,1463.90,-768.00,110.90}},
403 {"Mulholland", {1318.10,-910.10,-89.00,1357.00,-768.00,110.90}},
404 {"Mulholland", {1169.10,-910.10,-89.00,1318.10,-768.00,110.90}},
405 {"Mulholland", {768.60,-954.60,-89.00,952.60,-860.60,110.90}},
406 {"Mulholland", {687.80,-860.60,-89.00,911.80,-768.00,110.90}},
407 {"Mulholland", {737.50,-768.00,-89.00,1142.20,-674.80,110.90}},
408 {"Mulholland", {1096.40,-910.10,-89.00,1169.10,-768.00,110.90}},
409 {"Mulholland", {952.60,-937.10,-89.00,1096.40,-860.60,110.90}},
410 {"Mulholland", {911.80,-860.60,-89.00,1096.40,-768.00,110.90}},
411 {"Mulholland", {861.00,-674.80,-89.00,1156.50,-600.80,110.90}},
412 {"Mulholland Intersection", {1463.90,-1150.80,-89.00,1812.60,-768.00,110.90}},
413 {"North Rock", {2285.30,-768.00,0.00,2770.50,-269.70,200.00}},
414 {"Ocean Docks", {2373.70,-2697.00,-89.00,2809.20,-2330.40,110.90}},
415 {"Ocean Docks", {2201.80,-2418.30,-89.00,2324.00,-2095.00,110.90}},
416 {"Ocean Docks", {2324.00,-2302.30,-89.00,2703.50,-2145.10,110.90}},
417 {"Ocean Docks", {2089.00,-2394.30,-89.00,2201.80,-2235.80,110.90}},
418 {"Ocean Docks", {2201.80,-2730.80,-89.00,2324.00,-2418.30,110.90}},
419 {"Ocean Docks", {2703.50,-2302.30,-89.00,2959.30,-2126.90,110.90}},
420 {"Ocean Docks", {2324.00,-2145.10,-89.00,2703.50,-2059.20,110.90}},
421 {"Ocean Flats", {-2994.40,277.40,-9.10,-2867.80,458.40,200.00}},
422 {"Ocean Flats", {-2994.40,-222.50,-0.00,-2593.40,277.40,200.00}},
423 {"Ocean Flats", {-2994.40,-430.20,-0.00,-2831.80,-222.50,200.00}},
424 {"Octane Springs", {338.60,1228.50,0.00,664.30,1655.00,200.00}},
425 {"Old Venturas Strip", {2162.30,2012.10,-89.00,2685.10,2202.70,110.90}},
426 {"Palisades", {-2994.40,458.40,-6.10,-2741.00,1339.60,200.00}},
427 {"Palomino Creek", {2160.20,-149.00,0.00,2576.90,228.30,200.00}},
428 {"Paradiso", {-2741.00,793.40,-6.10,-2533.00,1268.40,200.00}},
429 {"Pershing Square", {1440.90,-1722.20,-89.00,1583.50,-1577.50,110.90}},
430 {"Pilgrim", {2437.30,1383.20,-89.00,2624.40,1783.20,110.90}},
431 {"Pilgrim", {2624.40,1383.20,-89.00,2685.10,1783.20,110.90}},
432 {"Pilson Intersection", {1098.30,2243.20,-89.00,1377.30,2507.20,110.90}},
433 {"Pirates in Men's Pants", {1817.30,1469.20,-89.00,2027.40,1703.20,110.90}},
434 {"Playa del Seville", {2703.50,-2126.90,-89.00,2959.30,-1852.80,110.90}},
435 {"Prickle Pine", {1534.50,2583.20,-89.00,1848.40,2863.20,110.90}},
436 {"Prickle Pine", {1117.40,2507.20,-89.00,1534.50,2723.20,110.90}},
437 {"Prickle Pine", {1848.40,2553.40,-89.00,1938.80,2863.20,110.90}},
438 {"Prickle Pine", {1938.80,2624.20,-89.00,2121.40,2861.50,110.90}},
439 {"Queens", {-2533.00,458.40,0.00,-2329.30,578.30,200.00}},
440 {"Queens", {-2593.40,54.70,0.00,-2411.20,458.40,200.00}},
441 {"Queens", {-2411.20,373.50,0.00,-2253.50,458.40,200.00}},
442 {"Randolph Industrial Estate", {1558.00,596.30,-89.00,1823.00,823.20,110.90}},
443 {"Redsands East", {1817.30,2011.80,-89.00,2106.70,2202.70,110.90}},
444 {"Redsands East", {1817.30,2202.70,-89.00,2011.90,2342.80,110.90}},
445 {"Redsands East", {1848.40,2342.80,-89.00,2011.90,2478.40,110.90}},
446 {"Redsands West", {1236.60,1883.10,-89.00,1777.30,2142.80,110.90}},
447 {"Redsands West", {1297.40,2142.80,-89.00,1777.30,2243.20,110.90}},
448 {"Redsands West", {1377.30,2243.20,-89.00,1704.50,2433.20,110.90}},
449 {"Redsands West", {1704.50,2243.20,-89.00,1777.30,2342.80,110.90}},
450 {"Regular Tom", {-405.70,1712.80,-3.00,-276.70,1892.70,200.00}},
451 {"Richman", {647.50,-1118.20,-89.00,787.40,-954.60,110.90}},
452 {"Richman", {647.50,-954.60,-89.00,768.60,-860.60,110.90}},
453 {"Richman", {225.10,-1369.60,-89.00,334.50,-1292.00,110.90}},
454 {"Richman", {225.10,-1292.00,-89.00,466.20,-1235.00,110.90}},
455 {"Richman", {72.60,-1404.90,-89.00,225.10,-1235.00,110.90}},
456 {"Richman", {72.60,-1235.00,-89.00,321.30,-1008.10,110.90}},
457 {"Richman", {321.30,-1235.00,-89.00,647.50,-1044.00,110.90}},
458 {"Richman", {321.30,-1044.00,-89.00,647.50,-860.60,110.90}},
459 {"Richman", {321.30,-860.60,-89.00,687.80,-768.00,110.90}},
460 {"Richman", {321.30,-768.00,-89.00,700.70,-674.80,110.90}},
461 {"Robada Intersection", {-1119.00,1178.90,-89.00,-862.00,1351.40,110.90}},
462 {"Roca Escalante", {2237.40,2202.70,-89.00,2536.40,2542.50,110.90}},
463 {"Roca Escalante", {2536.40,2202.70,-89.00,2625.10,2442.50,110.90}},
464 {"Rockshore East", {2537.30,676.50,-89.00,2902.30,943.20,110.90}},
465 {"Rockshore West", {1997.20,596.30,-89.00,2377.30,823.20,110.90}},
466 {"Rockshore West", {2377.30,596.30,-89.00,2537.30,788.80,110.90}},
467 {"Rodeo", {72.60,-1684.60,-89.00,225.10,-1544.10,110.90}},
468 {"Rodeo", {72.60,-1544.10,-89.00,225.10,-1404.90,110.90}},
469 {"Rodeo", {225.10,-1684.60,-89.00,312.80,-1501.90,110.90}},
470 {"Rodeo", {225.10,-1501.90,-89.00,334.50,-1369.60,110.90}},
471 {"Rodeo", {334.50,-1501.90,-89.00,422.60,-1406.00,110.90}},
472 {"Rodeo", {312.80,-1684.60,-89.00,422.60,-1501.90,110.90}},
473 {"Rodeo", {422.60,-1684.60,-89.00,558.00,-1570.20,110.90}},
474 {"Rodeo", {558.00,-1684.60,-89.00,647.50,-1384.90,110.90}},
475 {"Rodeo", {466.20,-1570.20,-89.00,558.00,-1385.00,110.90}},
476 {"Rodeo", {422.60,-1570.20,-89.00,466.20,-1406.00,110.90}},
477 {"Rodeo", {466.20,-1385.00,-89.00,647.50,-1235.00,110.90}},
478 {"Rodeo", {334.50,-1406.00,-89.00,466.20,-1292.00,110.90}},
479 {"Royal Casino", {2087.30,1383.20,-89.00,2437.30,1543.20,110.90}},
480 {"San Andreas Sound", {2450.30,385.50,-100.00,2759.20,562.30,200.00}},
481 {"Santa Flora", {-2741.00,458.40,-7.60,-2533.00,793.40,200.00}},
482 {"Santa Maria Beach", {342.60,-2173.20,-89.00,647.70,-1684.60,110.90}},
483 {"Santa Maria Beach", {72.60,-2173.20,-89.00,342.60,-1684.60,110.90}},
484 {"Shady Cabin", {-1632.80,-2263.40,-3.00,-1601.30,-2231.70,200.00}},
485 {"Shady Creeks", {-1820.60,-2643.60,-8.00,-1226.70,-1771.60,200.00}},
486 {"Shady Creeks", {-2030.10,-2174.80,-6.10,-1820.60,-1771.60,200.00}},
487 {"Sobell Rail Yards", {2749.90,1548.90,-89.00,2923.30,1937.20,110.90}},
488 {"Spinybed", {2121.40,2663.10,-89.00,2498.20,2861.50,110.90}},
489 {"Starfish Casino", {2437.30,1783.20,-89.00,2685.10,2012.10,110.90}},
490 {"Starfish Casino", {2437.30,1858.10,-39.00,2495.00,1970.80,60.90}},
491 {"Starfish Casino", {2162.30,1883.20,-89.00,2437.30,2012.10,110.90}},
492 {"Temple", {1252.30,-1130.80,-89.00,1378.30,-1026.30,110.90}},
493 {"Temple", {1252.30,-1026.30,-89.00,1391.00,-926.90,110.90}},
494 {"Temple", {1252.30,-926.90,-89.00,1357.00,-910.10,110.90}},
495 {"Temple", {952.60,-1130.80,-89.00,1096.40,-937.10,110.90}},
496 {"Temple", {1096.40,-1130.80,-89.00,1252.30,-1026.30,110.90}},
497 {"Temple", {1096.40,-1026.30,-89.00,1252.30,-910.10,110.90}},
498 {"The Camel's Toe", {2087.30,1203.20,-89.00,2640.40,1383.20,110.90}},
499 {"The Clown's Pocket", {2162.30,1783.20,-89.00,2437.30,1883.20,110.90}},
500 {"The Emerald Isle", {2011.90,2202.70,-89.00,2237.40,2508.20,110.90}},
501 {"The Farm", {-1209.60,-1317.10,114.90,-908.10,-787.30,251.90}},
502 {"The Four Dragons Casino", {1817.30,863.20,-89.00,2027.30,1083.20,110.90}},
503 {"The High Roller", {1817.30,1283.20,-89.00,2027.30,1469.20,110.90}},
504 {"The Mako Span", {1664.60,401.70,0.00,1785.10,567.20,200.00}},
505 {"The Panopticon", {-947.90,-304.30,-1.10,-319.60,327.00,200.00}},
506 {"The Pink Swan", {1817.30,1083.20,-89.00,2027.30,1283.20,110.90}},
507 {"The Sherman Dam", {-968.70,1929.40,-3.00,-481.10,2155.20,200.00}},
508 {"The Strip", {2027.40,863.20,-89.00,2087.30,1703.20,110.90}},
509 {"The Strip", {2106.70,1863.20,-89.00,2162.30,2202.70,110.90}},
510 {"The Strip", {2027.40,1783.20,-89.00,2162.30,1863.20,110.90}},
511 {"The Strip", {2027.40,1703.20,-89.00,2137.40,1783.20,110.90}},
512 {"The Visage", {1817.30,1863.20,-89.00,2106.70,2011.80,110.90}},
513 {"The Visage", {1817.30,1703.20,-89.00,2027.40,1863.20,110.90}},
514 {"Unity Station", {1692.60,-1971.80,-20.40,1812.60,-1932.80,79.50}},
515 {"Valle Ocultado", {-936.60,2611.40,2.00,-715.90,2847.90,200.00}},
516 {"Verdant Bluffs", {930.20,-2488.40,-89.00,1249.60,-2006.70,110.90}},
517 {"Verdant Bluffs", {1073.20,-2006.70,-89.00,1249.60,-1842.20,110.90}},
518 {"Verdant Bluffs", {1249.60,-2179.20,-89.00,1692.60,-1842.20,110.90}},
519 {"Verdant Meadows", {37.00,2337.10,-3.00,435.90,2677.90,200.00}},
520 {"Verona Beach", {647.70,-2173.20,-89.00,930.20,-1804.20,110.90}},
521 {"Verona Beach", {930.20,-2006.70,-89.00,1073.20,-1804.20,110.90}},
522 {"Verona Beach", {851.40,-1804.20,-89.00,1046.10,-1577.50,110.90}},
523 {"Verona Beach", {1161.50,-1722.20,-89.00,1323.90,-1577.50,110.90}},
524 {"Verona Beach", {1046.10,-1722.20,-89.00,1161.50,-1577.50,110.90}},
525 {"Vinewood", {787.40,-1310.20,-89.00,952.60,-1130.80,110.90}},
526 {"Vinewood", {787.40,-1130.80,-89.00,952.60,-954.60,110.90}},
527 {"Vinewood", {647.50,-1227.20,-89.00,787.40,-1118.20,110.90}},
528 {"Vinewood", {647.70,-1416.20,-89.00,787.40,-1227.20,110.90}},
529 {"Whitewood Estates", {883.30,1726.20,-89.00,1098.30,2507.20,110.90}},
530 {"Whitewood Estates", {1098.30,1726.20,-89.00,1197.30,2243.20,110.90}},
531 {"Willowfield", {1970.60,-2179.20,-89.00,2089.00,-1852.80,110.90}},
532 {"Willowfield", {2089.00,-2235.80,-89.00,2201.80,-1989.90,110.90}},
533 {"Willowfield", {2089.00,-1989.90,-89.00,2324.00,-1852.80,110.90}},
534 {"Willowfield", {2201.80,-2095.00,-89.00,2324.00,-1989.90,110.90}},
535 {"Willowfield", {2541.70,-1941.40,-89.00,2703.50,-1852.80,110.90}},
536 {"Willowfield", {2324.00,-2059.20,-89.00,2541.70,-1852.80,110.90}},
537 {"Willowfield", {2541.70,-2059.20,-89.00,2703.50,-1941.40,110.90}},
538 {"Yellow Bell Station", {1377.40,2600.40,-21.90,1492.40,2687.30,78.00}},
539 {"Los Santos", {44.60,-2892.90,-242.90,2997.00,-768.00,900.00}},
540 {"Las Venturas", {869.40,596.30,-242.90,2997.00,2993.80,900.00}},
541 {"Bone County", {-480.50,596.30,-242.90,869.40,2993.80,900.00}},
542 {"Tierra Robada", {-2997.40,1659.60,-242.90,-480.50,2993.80,900.00}},
543 {"Tierra Robada", {-1213.90,596.30,-242.90,-480.50,1659.60,900.00}},
544 {"San Fierro", {-2997.40,-1115.50,-242.90,-1213.90,1659.60,900.00}},
545 {"Red County", {-1213.90,-768.00,-242.90,2997.00,596.30,900.00}},
546 {"Flint County", {-1213.90,-2892.90,-242.90,44.60,-768.00,900.00}},
547 {"Whetstone", {-2997.40,-2892.90,-242.90,-1213.90,-1115.50,900.00}}
548 };
549
550new
551 LockNames[4][32] = {"{2ECC71}Not Locked", "{E74C3C}Password Locked", "{E74C3C}Requires Keys", "{E74C3C}Owner Only"},
552 TransactionNames[2][16] = {"{E74C3C}Taken", "{2ECC71}Added"};
553
554stock LoadHouseKeys(playerid)
555{
556 Iter_Clear(HouseKeys[playerid]);
557
558 new query[72];
559 mysql_format(SQLHandle, query, sizeof(query), "SELECT * FROM housekeys WHERE Player='%e'", Player_GetName(playerid));
560 mysql_tquery(SQLHandle, query, "GiveHouseKeys", "i", playerid);
561 return 1;
562}
563
564stock GetZoneName(Float: x, Float: y, Float: z)
565{
566 new zone[28];
567 for(new i = 0; i < sizeof(SAZones); i++)
568 {
569 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])
570 {
571 strcat(zone, SAZones[i][SAZONE_NAME]);
572 return zone;
573 }
574 }
575
576 strcat(zone, "Unknown");
577 return zone;
578}
579
580stock GetCityName(Float: x, Float: y, Float: z)
581{
582 new city[28];
583 for(new i = 356; i < sizeof(SAZones); i++)
584 {
585 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])
586 {
587 strcat(city, SAZones[i][SAZONE_NAME]);
588 return city;
589 }
590 }
591
592 strcat(city, "San Andreas");
593 return city;
594}
595
596stock convertNumber(value)
597{
598 // http://forum.sa-mp.com/showthread.php?p=843781#post843781
599 new string[24];
600 format(string, sizeof(string), "%d", value);
601
602 for(new i = (strlen(string) - 3); i > (value < 0 ? 1 : 0) ; i -= 3)
603 {
604 strins(string[i], ",", 0);
605 }
606
607 return string;
608}
609
610stock RemovePlayerWeapon(playerid, weapon)
611{
612 new weapons[13], ammo[13];
613 for(new i; i < 13; i++) GetPlayerWeaponData(playerid, i, weapons[i], ammo[i]);
614 ResetPlayerWeapons(playerid);
615 for(new i; i < 13; i++)
616 {
617 if(weapons[i] == weapon) continue;
618 GivePlayerWeapon(playerid, weapons[i], ammo[i]);
619 }
620
621 return 1;
622}
623
624stock GetXYInFrontOfPlayer(playerid, &Float:x, &Float:y, Float:distance)
625{
626 new Float: a;
627 GetPlayerPos(playerid, x, y, a);
628 GetPlayerFacingAngle(playerid, a);
629 if (GetPlayerVehicleID(playerid)) GetVehicleZAngle(GetPlayerVehicleID(playerid), a);
630 x += (distance * floatsin(-a, degrees));
631 y += (distance * floatcos(-a, degrees));
632}
633
634stock Player_GetName(playerid)
635{
636 new name[MAX_PLAYER_NAME];
637 GetPlayerName(playerid, name, MAX_PLAYER_NAME);
638 return name;
639}
640
641stock SendToHouse(playerid, id)
642{
643 if(!Iter_Contains(Houses, id)) return 0;
644 SetPVarInt(playerid, "HousePickupCooldown", gettime() + HOUSE_COOLDOWN);
645 InHouse[playerid] = id;
646 SetPlayerVirtualWorld(playerid, id);
647 SetPlayerInterior(playerid, HouseInteriors[ HouseData[id][Interior] ][intID]);
648 SetPlayerPos(playerid, HouseInteriors[ HouseData[id][Interior] ][intX], HouseInteriors[ HouseData[id][Interior] ][intY], HouseInteriors[ HouseData[id][Interior] ][intZ]);
649
650 new string[128];
651 format(string, sizeof(string), "Welcome to %s's house, %s{FFFFFF}!", HouseData[id][Owner], HouseData[id][Name]);
652 SendClientMessage(playerid, 0xFFFFFFFF, string);
653
654 if(!strcmp(HouseData[id][Owner], Player_GetName(playerid)))
655 {
656 HouseData[id][LastEntered] = gettime();
657 HouseData[id][Save] = true;
658 SendClientMessage(playerid, 0xFFFFFFFF, "Use {3498DB}/house {FFFFFF}to open the house menu.");
659 }
660
661 if(HouseData[id][LockMode] == LOCK_MODE_NOLOCK && LastVisitedHouse[playerid] != id)
662 {
663 new query[128];
664 mysql_format(SQLHandle, query, sizeof(query), "INSERT INTO housevisitors SET HouseID=%d, Visitor='%e', Date=UNIX_TIMESTAMP()", id, Player_GetName(playerid));
665 mysql_tquery(SQLHandle, query, "", "");
666 LastVisitedHouse[playerid] = id;
667 }
668
669 return 1;
670}
671
672stock ShowHouseMenu(playerid)
673{
674 if(strcmp(HouseData[ InHouse[playerid] ][Owner], Player_GetName(playerid))) return SendClientMessage(playerid, 0xE74C3CFF, "You're not the owner of this house.");
675
676 new string[256], id = InHouse[playerid];
677 format(string, sizeof(string), "House Name: %s\nPassword: %s\nLock: %s\nHouse Safe {2ECC71}($%s)\nFurnitures\nGuns\nVisitors\nKeys\nKick Everybody\nSell House", HouseData[id][Name], HouseData[id][Password], LockNames[ HouseData[id][LockMode] ], convertNumber(HouseData[id][SafeMoney]));
678 ShowPlayerDialog(playerid, DIALOG_HOUSE_MENU, DIALOG_STYLE_LIST, HouseData[id][Name], string, "Select", "Close");
679 return 1;
680}
681
682stock ResetHouse(id)
683{
684 if(!Iter_Contains(Houses, id)) return 0;
685 format(HouseData[id][Name], MAX_HOUSE_NAME, "House For Sale");
686 format(HouseData[id][Owner], MAX_PLAYER_NAME, "-");
687 format(HouseData[id][Password], MAX_HOUSE_PASSWORD, "-");
688 HouseData[id][LockMode] = LOCK_MODE_NOLOCK;
689 HouseData[id][SalePrice] = HouseData[id][SafeMoney] = HouseData[id][LastEntered] = 0;
690 HouseData[id][Save] = true;
691
692 new label[200];
693 format(label, sizeof(label), "{2ECC71}House For Sale (ID: %d)\n{FFFFFF}%s\n{F1C40F}Price: {2ECC71}$%s", id, HouseInteriors[ HouseData[id][Interior] ][IntName], convertNumber(HouseData[id][Price]));
694 UpdateDynamic3DTextLabelText(HouseData[id][HouseLabel], 0xFFFFFFFF, label);
695 Streamer_SetIntData(STREAMER_TYPE_PICKUP, HouseData[id][HousePickup], E_STREAMER_MODEL_ID, 1273);
696 Streamer_SetIntData(STREAMER_TYPE_MAP_ICON, HouseData[id][HouseIcon], E_STREAMER_TYPE, 31);
697
698 foreach(new i : Player)
699 {
700 if(InHouse[i] == id)
701 {
702 SetPVarInt(i, "HousePickupCooldown", gettime() + HOUSE_COOLDOWN);
703 SetPlayerVirtualWorld(i, 0);
704 SetPlayerInterior(i, 0);
705 SetPlayerPos(i, HouseData[id][houseX], HouseData[id][houseY], HouseData[id][houseZ]);
706 InHouse[i] = INVALID_HOUSE_ID;
707 }
708
709 if(Iter_Contains(HouseKeys[i], id)) Iter_Remove(HouseKeys[i], id);
710 }
711
712 new query[64], data[e_furniture];
713 mysql_format(SQLHandle, query, sizeof(query), "DELETE FROM houseguns WHERE HouseID=%d", id);
714 mysql_tquery(SQLHandle, query, "", "");
715
716 for(new i, maxval = Streamer_GetUpperBound(STREAMER_TYPE_OBJECT); i <= maxval; ++i)
717 {
718 if(!IsValidDynamicObject(i)) continue;
719 Streamer_GetArrayData(STREAMER_TYPE_OBJECT, i, E_STREAMER_EXTRA_ID, data);
720 if(data[SQLID] > 0 && data[HouseID] == id) DestroyDynamicObject(i);
721 }
722
723 mysql_format(SQLHandle, query, sizeof(query), "DELETE FROM housefurnitures WHERE HouseID=%d", id);
724 mysql_tquery(SQLHandle, query, "", "");
725
726 mysql_format(SQLHandle, query, sizeof(query), "DELETE FROM housevisitors WHERE HouseID=%d", id);
727 mysql_tquery(SQLHandle, query, "", "");
728
729 mysql_format(SQLHandle, query, sizeof(query), "DELETE FROM housekeys WHERE HouseID=%d", id);
730 mysql_tquery(SQLHandle, query, "", "");
731
732 mysql_format(SQLHandle, query, sizeof(query), "DELETE FROM housesafelogs WHERE HouseID=%d", id);
733 mysql_tquery(SQLHandle, query, "", "");
734 return 1;
735}
736
737stock SaveHouse(id)
738{
739 if(!Iter_Contains(Houses, id)) return 0;
740 new query[256];
741 mysql_format(SQLHandle, query, sizeof(query), "UPDATE houses SET HouseName='%e', HouseOwner='%e', HousePassword='%e', HouseSalePrice=%d, HouseLock=%d, HouseMoney=%d, LastEntered=%d WHERE ID=%d",
742 HouseData[id][Name], HouseData[id][Owner], HouseData[id][Password], HouseData[id][SalePrice], HouseData[id][LockMode], HouseData[id][SafeMoney], HouseData[id][LastEntered], id);
743 mysql_tquery(SQLHandle, query, "", "");
744 HouseData[id][Save] = false;
745 return 1;
746}
747
748stock UpdateHouseLabel(id)
749{
750 if(!Iter_Contains(Houses, id)) return 0;
751 new label[256];
752 if(!strcmp(HouseData[id][Owner], "-")) {
753 format(label, sizeof(label), "{2ECC71}House For Sale (ID: %d)\n{FFFFFF}%s\n{F1C40F}Price: {2ECC71}$%s", id, HouseInteriors[ HouseData[id][Interior] ][IntName], convertNumber(HouseData[id][Price]));
754 }else{
755 if(HouseData[id][SalePrice] > 0) {
756 format(label, sizeof(label), "{E67E22}%s's House For Sale (ID: %d)\n{FFFFFF}%s\n{FFFFFF}%s\n{F1C40F}Price: {2ECC71}$%s", HouseData[id][Owner], id, HouseData[id][Name], HouseInteriors[ HouseData[id][Interior] ][IntName], convertNumber(HouseData[id][SalePrice]));
757 }else{
758 format(label, sizeof(label), "{E67E22}%s's House (ID: %d)\n{FFFFFF}%s\n{FFFFFF}%s\n%s\n{FFFFFF}%s", HouseData[id][Owner], id, HouseData[id][Name], HouseInteriors[ HouseData[id][Interior] ][IntName], LockNames[ HouseData[id][LockMode] ], HouseData[id][Address]);
759 }
760 }
761
762 UpdateDynamic3DTextLabelText(HouseData[id][HouseLabel], 0xFFFFFFFF, label);
763 return 1;
764}
765
766stock House_PlayerInit(playerid)
767{
768 InHouse[playerid] = LastVisitedHouse[playerid] = INVALID_HOUSE_ID;
769 ListPage[playerid] = SelectMode[playerid] = SELECT_MODE_NONE;
770 EditingFurniture[playerid] = false;
771 LoadHouseKeys(playerid);
772 return 1;
773}
774
775stock OwnedHouses(playerid)
776{
777 #if LIMIT_PER_PLAYER != 0
778 new count;
779
780 foreach(new i : Houses) if(!strcmp(HouseData[i][Owner], Player_GetName(playerid), true)) count++;
781 return count;
782 #else
783 return 0;
784 #endif
785}
786
787forward ResetAndSaveHouses();
788forward LoadHouses();
789forward LoadFurnitures();
790forward GiveHouseKeys(playerid);
791forward HouseSaleMoney(playerid);
792
793public ResetAndSaveHouses()
794{
795 foreach(new i : Houses)
796 {
797 if(HouseData[i][LastEntered] > 0 && gettime()-HouseData[i][LastEntered] > 604800) ResetHouse(i);
798 if(HouseData[i][Save]) SaveHouse(i);
799 }
800
801 return 1;
802}
803
804public LoadHouses()
805{
806 new rows = cache_num_rows();
807 if(rows)
808 {
809 new id, loaded, for_sale, label[256];
810 while(loaded < rows)
811 {
812 cache_get_value_name_int(loaded, "ID", id);
813 cache_get_value_name(loaded, "HouseName", HouseData[id][Name], MAX_HOUSE_NAME);
814 cache_get_value_name(loaded, "HouseOwner", HouseData[id][Owner], MAX_PLAYER_NAME);
815 cache_get_value_name(loaded, "HousePassword", HouseData[id][Password], MAX_HOUSE_PASSWORD);
816 cache_get_value_name_float(loaded, "HouseX", HouseData[id][houseX]);
817 cache_get_value_name_float(loaded, "HouseY", HouseData[id][houseY]);
818 cache_get_value_name_float(loaded, "HouseZ", HouseData[id][houseZ]);
819 cache_get_value_name_int(loaded, "HousePrice", HouseData[id][Price]);
820 cache_get_value_name_int(loaded, "HouseSalePrice", HouseData[id][SalePrice]);
821 cache_get_value_name_int(loaded, "HouseInterior", HouseData[id][Interior]);
822 cache_get_value_name_int(loaded, "HouseLock", HouseData[id][LockMode]);
823 cache_get_value_name_int(loaded, "HouseMoney", HouseData[id][SafeMoney]);
824 cache_get_value_name_int(loaded, "LastEntered", HouseData[id][LastEntered]);
825 format(HouseData[id][Address], MAX_HOUSE_ADDRESS, "%d, %s, %s", id, GetZoneName(HouseData[id][houseX], HouseData[id][houseY], HouseData[id][houseZ]), GetCityName(HouseData[id][houseX], HouseData[id][houseY], HouseData[id][houseZ]));
826
827 if(strcmp(HouseData[id][Owner], "-")) {
828 if(HouseData[id][SalePrice] > 0) {
829 for_sale = 1;
830 format(label, sizeof(label), "{E67E22}%s's House For Sale (ID: %d)\n{FFFFFF}%s\n{FFFFFF}%s\n{F1C40F}Price: {2ECC71}$%s", HouseData[id][Owner], id, HouseData[id][Name], HouseInteriors[ HouseData[id][Interior] ][IntName], convertNumber(HouseData[id][SalePrice]));
831 }else{
832 for_sale = 0;
833 format(label, sizeof(label), "{E67E22}%s's House (ID: %d)\n{FFFFFF}%s\n{FFFFFF}%s\n%s\n{FFFFFF}%s", HouseData[id][Owner], id, HouseData[id][Name], HouseInteriors[ HouseData[id][Interior] ][IntName], LockNames[ HouseData[id][LockMode] ], HouseData[id][Address]);
834 }
835 }else{
836 for_sale = 1;
837 format(label, sizeof(label), "{2ECC71}House For Sale (ID: %d)\n{FFFFFF}%s\n{F1C40F}Price: {2ECC71}$%s", id, HouseInteriors[ HouseData[id][Interior] ][IntName], convertNumber(HouseData[id][Price]));
838 }
839
840 HouseData[id][HousePickup] = CreateDynamicPickup((!for_sale) ? 19522 : 1273, 1, HouseData[id][houseX], HouseData[id][houseY], HouseData[id][houseZ]);
841 HouseData[id][HouseIcon] = CreateDynamicMapIcon(HouseData[id][houseX], HouseData[id][houseY], HouseData[id][houseZ], (!for_sale) ? 32 : 31, 0);
842 HouseData[id][HouseLabel] = CreateDynamic3DTextLabel(label, 0xFFFFFFFF, HouseData[id][houseX], HouseData[id][houseY], HouseData[id][houseZ]+0.35, 15.0, .testlos = 1);
843 Iter_Add(Houses, id);
844 loaded++;
845 }
846
847 printf(" [House System] Loaded %d houses.", loaded);
848 }
849
850 return 1;
851}
852
853public LoadFurnitures()
854{
855 new rows = cache_num_rows();
856 if(rows)
857 {
858 new id, loaded, vw, interior, data[e_furniture];
859 while(loaded < rows)
860 {
861 cache_get_value_name_int(loaded, "ID", data[SQLID]);
862 cache_get_value_name_int(loaded, "HouseID", data[HouseID]);
863 cache_get_value_name_int(loaded, "FurnitureID", data[ArrayID]);
864 cache_get_value_name_float(loaded, "FurnitureX", data[furnitureX]);
865 cache_get_value_name_float(loaded, "FurnitureY", data[furnitureY]);
866 cache_get_value_name_float(loaded, "FurnitureZ", data[furnitureZ]);
867 cache_get_value_name_float(loaded, "FurnitureRX", data[furnitureRX]);
868 cache_get_value_name_float(loaded, "FurnitureRY", data[furnitureRY]);
869 cache_get_value_name_float(loaded, "FurnitureRZ", data[furnitureRZ]);
870 cache_get_value_name_int(loaded, "FurnitureVW", vw);
871 cache_get_value_name_int(loaded, "FurnitureInt", interior);
872
873 id = CreateDynamicObject(
874 HouseFurnitures[ data[ArrayID] ][ModelID],
875 data[furnitureX], data[furnitureY], data[furnitureZ],
876 data[furnitureRX], data[furnitureRY], data[furnitureRZ],
877 vw, interior
878 );
879
880 Streamer_SetArrayData(STREAMER_TYPE_OBJECT, id, E_STREAMER_EXTRA_ID, data);
881 loaded++;
882 }
883
884 printf(" [House System] Loaded %d furnitures.", loaded);
885 }
886
887 return 1;
888}
889
890public GiveHouseKeys(playerid)
891{
892 if(!IsPlayerConnected(playerid)) return 1;
893 new rows = cache_num_rows();
894 if(rows)
895 {
896 new loaded, house_id;
897 while(loaded < rows)
898 {
899 cache_get_value_name_int(loaded, "HouseID", house_id);
900 Iter_Add(HouseKeys[playerid], house_id);
901 loaded++;
902 }
903 }
904
905 return 1;
906}
907
908public HouseSaleMoney(playerid)
909{
910 new rows = cache_num_rows();
911 if(rows)
912 {
913 new new_owner[MAX_PLAYER_NAME], price, tnid, string[128];
914 for(new i; i < rows; i++)
915 {
916 cache_get_value_name(i, "NewOwner", new_owner);
917 cache_get_value_name_int(i, "Price", price);
918 cache_get_value_name_int(i, "ID", tnid);
919
920 format(string, sizeof(string), "You sold a house to %s for $%s. (Transaction ID: #%d)", new_owner, convertNumber(price), tnid);
921 SendClientMessage(playerid, -1, string);
922 GivePlayerMoney(playerid, price);
923 }
924
925 new query[128];
926 mysql_format(SQLHandle, query, sizeof(query), "DELETE FROM housesales WHERE OldOwner='%e'", Player_GetName(playerid));
927 mysql_tquery(SQLHandle, query, "", "");
928 }
929
930 return 1;
931}
932
933public OnFilterScriptInit()
934{
935 for(new i; i < MAX_HOUSES; ++i)
936 {
937 HouseData[i][HouseLabel] = Text3D: INVALID_3DTEXT_ID;
938 HouseData[i][HousePickup] = -1;
939 HouseData[i][HouseIcon] = -1;
940 HouseData[i][Save] = false;
941 }
942
943 for(new i; i < sizeof(HouseInteriors); ++i)
944 {
945 HouseInteriors[i][intLabel] = CreateDynamic3DTextLabel("Leave House", 0xE67E22FF, HouseInteriors[i][intX], HouseInteriors[i][intY], HouseInteriors[i][intZ]+0.35, 10.0, .testlos = 1, .interiorid = HouseInteriors[i][intID]);
946 HouseInteriors[i][intPickup] = CreateDynamicPickup(1318, 1, HouseInteriors[i][intX], HouseInteriors[i][intY], HouseInteriors[i][intZ], .interiorid = HouseInteriors[i][intID]);
947 }
948
949 Iter_Init(HouseKeys);
950 DisableInteriorEnterExits();
951 SQLHandle = mysql_connect(SQL_HOST, SQL_USER, SQL_PASSWORD, SQL_DBNAME);
952 mysql_log(ERROR | WARNING);
953 if(mysql_errno() != 0) return print(" [House System] Can't connect to MySQL.");
954
955 /* Create Tables */
956 new query[1024];
957 strcat(query, "CREATE TABLE IF NOT EXISTS `houses` (\
958 `ID` int(11) NOT NULL,\
959 `HouseName` varchar(48) NOT NULL default 'House For Sale',\
960 `HouseOwner` varchar(24) NOT NULL default '-',\
961 `HousePassword` varchar(16) NOT NULL default '-',\
962 `HouseX` float NOT NULL,\
963 `HouseY` float NOT NULL,\
964 `HouseZ` float NOT NULL,\
965 `HousePrice` int(11) NOT NULL,\
966 `HouseInterior` tinyint(4) NOT NULL default '0',\
967 `HouseLock` tinyint(4) NOT NULL default '0',\
968 `HouseMoney` int(11) NOT NULL default '0',"
969 );
970
971 strcat(query, "`LastEntered` int(11) NOT NULL,\
972 PRIMARY KEY (`ID`),\
973 UNIQUE KEY `ID_2` (`ID`),\
974 KEY `ID` (`ID`)\
975 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;"
976 );
977
978 mysql_tquery(SQLHandle, query, "", "");
979
980 mysql_tquery(SQLHandle, "CREATE TABLE IF NOT EXISTS `housefurnitures` (\
981 `ID` int(11) NOT NULL auto_increment,\
982 `HouseID` int(11) NOT NULL,\
983 `FurnitureID` tinyint(11) NOT NULL,\
984 `FurnitureX` float NOT NULL,\
985 `FurnitureY` float NOT NULL,\
986 `FurnitureZ` float NOT NULL,\
987 `FurnitureRX` float NOT NULL,\
988 `FurnitureRY` float NOT NULL,\
989 `FurnitureRZ` float NOT NULL,\
990 `FurnitureVW` int(11) NOT NULL,\
991 `FurnitureInt` int(11) NOT NULL,\
992 PRIMARY KEY (`ID`)\
993 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", "", "");
994
995 mysql_tquery(SQLHandle, "CREATE TABLE IF NOT EXISTS `houseguns` (\
996 `HouseID` int(11) NOT NULL,\
997 `WeaponID` tinyint(4) NOT NULL,\
998 `Ammo` int(11) NOT NULL,\
999 UNIQUE KEY `HouseID_2` (`HouseID`,`WeaponID`),\
1000 KEY `HouseID` (`HouseID`),\
1001 CONSTRAINT `houseguns_ibfk_1` FOREIGN KEY (`HouseID`) REFERENCES `houses` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE\
1002 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;", "", "");
1003
1004 mysql_tquery(SQLHandle, "CREATE TABLE IF NOT EXISTS `housevisitors` (\
1005 `HouseID` int(11) NOT NULL,\
1006 `Visitor` varchar(24) NOT NULL,\
1007 `Date` int(11) NOT NULL\
1008 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", "", "");
1009
1010 mysql_tquery(SQLHandle, "CREATE TABLE IF NOT EXISTS `housekeys` (\
1011 `HouseID` int(11) NOT NULL,\
1012 `Player` varchar(24) NOT NULL,\
1013 `Date` int(11) NOT NULL\
1014 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", "", "");
1015
1016 mysql_tquery(SQLHandle, "CREATE TABLE IF NOT EXISTS `housesafelogs` (\
1017 `HouseID` int(11) NOT NULL,\
1018 `Type` int(11) NOT NULL,\
1019 `Amount` int(11) NOT NULL,\
1020 `Date` int(11) NOT NULL\
1021 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", "", "");
1022
1023 mysql_tquery(SQLHandle, "CREATE TABLE IF NOT EXISTS `housesales` (\
1024 `ID` int(11) NOT NULL AUTO_INCREMENT,\
1025 `OldOwner` varchar(24) NOT NULL,\
1026 `NewOwner` varchar(24) NOT NULL,\
1027 `Price` int(11) NOT NULL,\
1028 PRIMARY KEY (`ID`)\
1029 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", "", "");
1030
1031 // 1.3 update, add HouseSalePrice to the houses table
1032 if(!fexist("house_updated.txt"))
1033 {
1034 mysql_tquery(SQLHandle, "ALTER TABLE houses ADD HouseSalePrice INT(11) NOT NULL AFTER HousePrice");
1035
1036 new File: updateFile = fopen("house_updated.txt", io_append);
1037 if(updateFile)
1038 {
1039 fwrite(updateFile, "Don't remove this file.");
1040 fclose(updateFile);
1041 }
1042 }
1043
1044 /* Loading & Stuff */
1045 mysql_tquery(SQLHandle, "SELECT * FROM houses", "LoadHouses", "");
1046 mysql_tquery(SQLHandle, "SELECT * FROM housefurnitures", "LoadFurnitures", "");
1047 foreach(new i : Player) House_PlayerInit(i);
1048
1049 HouseTimer = SetTimer("ResetAndSaveHouses", 10 * 60000, true);
1050 return 1;
1051}
1052
1053public OnFilterScriptExit()
1054{
1055 foreach(new i : Houses) if(HouseData[i][Save]) SaveHouse(i);
1056 KillTimer(HouseTimer);
1057 return 1;
1058}
1059
1060public OnPlayerConnect(playerid)
1061{
1062 House_PlayerInit(playerid);
1063 return 1;
1064}
1065
1066public OnPlayerSpawn(playerid)
1067{
1068 InHouse[playerid] = INVALID_HOUSE_ID;
1069
1070 new query[128];
1071 mysql_format(SQLHandle, query, sizeof(query), "SELECT * FROM housesales WHERE OldOwner='%e'", Player_GetName(playerid));
1072 mysql_tquery(SQLHandle, query, "HouseSaleMoney", "i", playerid);
1073 return 1;
1074}
1075
1076public OnPlayerPickUpDynamicPickup(playerid, pickupid)
1077{
1078 if(GetPVarInt(playerid, "HousePickupCooldown") < gettime())
1079 {
1080 if(InHouse[playerid] == INVALID_HOUSE_ID) {
1081 foreach(new i : Houses)
1082 {
1083 if(pickupid == HouseData[i][HousePickup])
1084 {
1085 SetPVarInt(playerid, "HousePickupCooldown", gettime() + HOUSE_COOLDOWN);
1086 SetPVarInt(playerid, "PickupHouseID", i);
1087
1088 if(!strcmp(HouseData[i][Owner], "-")) {
1089 new string[64];
1090 format(string, sizeof(string), "This house is for sale!\n\nPrice: {2ECC71}$%s", convertNumber(HouseData[i][Price]));
1091 ShowPlayerDialog(playerid, DIALOG_BUY_HOUSE, DIALOG_STYLE_MSGBOX, "House For Sale", string, "Buy", "Close");
1092 }else{
1093 if(HouseData[i][SalePrice] > 0 && strcmp(HouseData[i][Owner], Player_GetName(playerid)))
1094 {
1095 new string[64];
1096 format(string, sizeof(string), "This house is for sale!\n\nPrice: {2ECC71}$%s", convertNumber(HouseData[i][SalePrice]));
1097 ShowPlayerDialog(playerid, DIALOG_BUY_HOUSE_FROM_OWNER, DIALOG_STYLE_MSGBOX, "House For Sale", string, "Buy", "Close");
1098 return 1;
1099 }
1100
1101 switch(HouseData[i][LockMode])
1102 {
1103 case LOCK_MODE_NOLOCK: SendToHouse(playerid, i);
1104 case LOCK_MODE_PASSWORD: ShowPlayerDialog(playerid, DIALOG_HOUSE_PASSWORD, DIALOG_STYLE_INPUT, "House Password", "This house is password protected.\n\nEnter house password:", "Done", "Close");
1105 case LOCK_MODE_KEYS:
1106 {
1107 new gotkeys = Iter_Contains(HouseKeys[playerid], i);
1108 if(!gotkeys) if(!strcmp(HouseData[i][Owner], Player_GetName(playerid))) gotkeys = 1;
1109
1110 if(gotkeys) {
1111 SendToHouse(playerid, i);
1112 }else{
1113 SendClientMessage(playerid, 0xE74C3CFF, "You don't have keys for this house, you can't enter.");
1114 }
1115 }
1116
1117 case LOCK_MODE_OWNER:
1118 {
1119 if(!strcmp(HouseData[i][Owner], Player_GetName(playerid))) {
1120 SetPVarInt(playerid, "HousePickupCooldown", gettime() + HOUSE_COOLDOWN);
1121 SendToHouse(playerid, i);
1122 }else{
1123 SendClientMessage(playerid, 0xE74C3CFF, "Sorry, only the owner can enter this house.");
1124 }
1125 }
1126 }
1127 }
1128
1129 return 1;
1130 }
1131 }
1132 }else{
1133 for(new i; i < sizeof(HouseInteriors); ++i)
1134 {
1135 if(pickupid == HouseInteriors[i][intPickup])
1136 {
1137 SetPVarInt(playerid, "HousePickupCooldown", gettime() + HOUSE_COOLDOWN);
1138 SetPlayerVirtualWorld(playerid, 0);
1139 SetPlayerInterior(playerid, 0);
1140 SetPlayerPos(playerid, HouseData[ InHouse[playerid] ][houseX], HouseData[ InHouse[playerid] ][houseY], HouseData[ InHouse[playerid] ][houseZ]);
1141 InHouse[playerid] = INVALID_HOUSE_ID;
1142 return 1;
1143 }
1144 }
1145 }
1146 }
1147
1148 return 1;
1149}
1150
1151public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
1152{
1153 if(dialogid == DIALOG_BUY_HOUSE)
1154 {
1155 if(!response) return 1;
1156 new id = GetPVarInt(playerid, "PickupHouseID");
1157 if(!IsPlayerInRangeOfPoint(playerid, 2.0, HouseData[id][houseX], HouseData[id][houseY], HouseData[id][houseZ])) return SendClientMessage(playerid, 0xE74C3CFF, "You're not near any house.");
1158 #if LIMIT_PER_PLAYER > 0
1159 if(OwnedHouses(playerid) + 1 > LIMIT_PER_PLAYER) return SendClientMessage(playerid, 0xE74C3CFF, "You can't buy any more houses.");
1160 #endif
1161 if(HouseData[id][Price] > GetPlayerMoney(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "You can't afford this house.");
1162 if(strcmp(HouseData[id][Owner], "-")) return SendClientMessage(playerid, 0xE74C3CFF, "Someone already owns this house.");
1163 GivePlayerMoney(playerid, -HouseData[id][Price]);
1164 GetPlayerName(playerid, HouseData[id][Owner], MAX_PLAYER_NAME);
1165 HouseData[id][LastEntered] = gettime();
1166 HouseData[id][Save] = true;
1167
1168 UpdateHouseLabel(id);
1169 Streamer_SetIntData(STREAMER_TYPE_PICKUP, HouseData[id][HousePickup], E_STREAMER_MODEL_ID, 19522);
1170 Streamer_SetIntData(STREAMER_TYPE_MAP_ICON, HouseData[id][HouseIcon], E_STREAMER_TYPE, 32);
1171 SendToHouse(playerid, id);
1172 return 1;
1173 }
1174
1175 if(dialogid == DIALOG_HOUSE_PASSWORD)
1176 {
1177 if(!response) return 1;
1178 new id = GetPVarInt(playerid, "PickupHouseID");
1179 if(!IsPlayerInRangeOfPoint(playerid, 2.0, HouseData[id][houseX], HouseData[id][houseY], HouseData[id][houseZ])) return SendClientMessage(playerid, 0xE74C3CFF, "You're not near any house.");
1180 if(!(1 <= strlen(inputtext) <= MAX_HOUSE_PASSWORD)) return ShowPlayerDialog(playerid, DIALOG_HOUSE_PASSWORD, DIALOG_STYLE_INPUT, "House Password", "This house is password protected.\n\nEnter house password:\n\n{E74C3C}The password you entered is either too short or too long.", "Try Again", "Close");
1181 if(strcmp(HouseData[id][Password], inputtext)) return ShowPlayerDialog(playerid, DIALOG_HOUSE_PASSWORD, DIALOG_STYLE_INPUT, "House Password", "This house is password protected.\n\nEnter house password:\n\n{E74C3C}Wrong password.", "Try Again", "Close");
1182 SendToHouse(playerid, id);
1183 return 1;
1184 }
1185
1186 if(dialogid == DIALOG_HOUSE_MENU)
1187 {
1188 if(!response) return 1;
1189 new id = InHouse[playerid];
1190 if(id == INVALID_HOUSE_ID) return SendClientMessage(playerid, 0xE74C3CFF, "You're not in a house.");
1191 if(strcmp(HouseData[id][Owner], Player_GetName(playerid))) return SendClientMessage(playerid, 0xE74C3CFF, "You're not the owner of this house.");
1192
1193 if(listitem == 0) ShowPlayerDialog(playerid, DIALOG_HOUSE_NAME, DIALOG_STYLE_INPUT, "House Name", "Write a new name for this house:", "Change", "Back");
1194 if(listitem == 1) ShowPlayerDialog(playerid, DIALOG_HOUSE_NEW_PASSWORD, DIALOG_STYLE_INPUT, "House Password", "Write a new password for this house:", "Change", "Back");
1195 if(listitem == 2) ShowPlayerDialog(playerid, DIALOG_HOUSE_LOCK, DIALOG_STYLE_LIST, "House Lock", "Not Locked\nPassword Lock\nKeys\nOwner Only", "Change", "Back");
1196 if(listitem == 3)
1197 {
1198 if(HouseData[id][SalePrice] > 0)
1199 {
1200 SendClientMessage(playerid, 0xE74C3CFF, "You can't use this feature while the house is for sale.");
1201 return ShowHouseMenu(playerid);
1202 }
1203
1204 new string[144];
1205 format(string, sizeof(string), "Take Money From Safe {2ECC71}($%s)\nPut Money To Safe {2ECC71}($%s)\nView Safe History\nClear Safe History", convertNumber(HouseData[id][SafeMoney]), convertNumber(GetPlayerMoney(playerid)));
1206 ShowPlayerDialog(playerid, DIALOG_SAFE_MENU, DIALOG_STYLE_LIST, "House Safe", string, "Choose", "Back");
1207 }
1208
1209 if(listitem == 4)
1210 {
1211 if(HouseData[id][SalePrice] > 0)
1212 {
1213 SendClientMessage(playerid, 0xE74C3CFF, "You can't use this feature while the house is for sale.");
1214 return ShowHouseMenu(playerid);
1215 }
1216
1217 ShowPlayerDialog(playerid, DIALOG_FURNITURE_MENU, DIALOG_STYLE_LIST, "Furnitures", "Buy Furniture\nEdit Furniture\nSell Furniture\nSell All Furnitures", "Choose", "Back");
1218 }
1219
1220 if(listitem == 5) ShowPlayerDialog(playerid, DIALOG_GUNS_MENU, DIALOG_STYLE_LIST, "Guns", "Put Gun\nTake Gun", "Choose", "Back");
1221 if(listitem == 6)
1222 {
1223 ListPage[playerid] = 0;
1224 ShowPlayerDialog(playerid, DIALOG_VISITORS_MENU, DIALOG_STYLE_LIST, "Visitors", "Look Visitor History\nClear Visitor History", "Choose", "Back");
1225 }
1226
1227 if(listitem == 7)
1228 {
1229 ListPage[playerid] = 0;
1230 ShowPlayerDialog(playerid, DIALOG_KEYS_MENU, DIALOG_STYLE_LIST, "Keys", "View Key Owners\nChange Locks", "Choose", "Back");
1231 }
1232
1233 if(listitem == 8)
1234 {
1235 new string[128];
1236 format(string, sizeof(string), "House owner %s kicked everybody from the house.", HouseData[id][Owner]);
1237
1238 foreach(new i : Player)
1239 {
1240 if(i == playerid) continue;
1241 if(InHouse[i] == id)
1242 {
1243 SetPVarInt(i, "HousePickupCooldown", gettime() + HOUSE_COOLDOWN);
1244 SetPlayerVirtualWorld(i, 0);
1245 SetPlayerInterior(i, 0);
1246 SetPlayerPos(i, HouseData[id][houseX], HouseData[id][houseY], HouseData[id][houseZ]);
1247 InHouse[i] = INVALID_HOUSE_ID;
1248 SendClientMessage(i, -1, string);
1249 }
1250 }
1251
1252 SendClientMessage(playerid, -1, "You kicked everybody from your house.");
1253 }
1254
1255 if(listitem == 9)
1256 {
1257 new string[128];
1258 format(string, sizeof(string), "Sell Instantly\t{2ECC71}$%s\n%s", convertNumber(floatround(HouseData[id][Price]*0.85)), (HouseData[id][SalePrice] > 0) ? ("Remove From Sale") : ("Put For Sale"));
1259 ShowPlayerDialog(playerid, DIALOG_SELL_HOUSE, DIALOG_STYLE_TABLIST, "Sell House", string, "Choose", "Back");
1260 }
1261
1262 return 1;
1263 }
1264
1265 if(dialogid == DIALOG_HOUSE_NAME)
1266 {
1267 if(!response) return ShowHouseMenu(playerid);
1268 new id = InHouse[playerid];
1269 if(id == INVALID_HOUSE_ID) return SendClientMessage(playerid, 0xE74C3CFF, "You're not in a house.");
1270 if(strcmp(HouseData[id][Owner], Player_GetName(playerid))) return SendClientMessage(playerid, 0xE74C3CFF, "You're not the owner of this house.");
1271 if(!(1 <= strlen(inputtext) <= MAX_HOUSE_NAME)) return ShowPlayerDialog(playerid, DIALOG_HOUSE_NAME, DIALOG_STYLE_INPUT, "House Name", "Write a new name for this house:\n\n{E74C3C}The name you entered is either too short or too long.", "Change", "Back");
1272 format(HouseData[id][Name], MAX_HOUSE_NAME, "%s", inputtext);
1273 HouseData[id][Save] = true;
1274
1275 UpdateHouseLabel(id);
1276 ShowHouseMenu(playerid);
1277 return 1;
1278 }
1279
1280 if(dialogid == DIALOG_HOUSE_NEW_PASSWORD)
1281 {
1282 if(!response) return ShowHouseMenu(playerid);
1283 new id = InHouse[playerid];
1284 if(id == INVALID_HOUSE_ID) return SendClientMessage(playerid, 0xE74C3CFF, "You're not in a house.");
1285 if(strcmp(HouseData[id][Owner], Player_GetName(playerid))) return SendClientMessage(playerid, 0xE74C3CFF, "You're not the owner of this house.");
1286 if(!(1 <= strlen(inputtext) <= MAX_HOUSE_PASSWORD)) return ShowPlayerDialog(playerid, DIALOG_HOUSE_NEW_PASSWORD, DIALOG_STYLE_INPUT, "House Password", "Write a new password for this house:\n\n{E74C3C}The pasword you entered is either too short or too long.", "Change", "Back");
1287 format(HouseData[id][Password], MAX_HOUSE_PASSWORD, "%s", inputtext);
1288 HouseData[id][Save] = true;
1289 ShowHouseMenu(playerid);
1290 return 1;
1291 }
1292
1293 if(dialogid == DIALOG_HOUSE_LOCK)
1294 {
1295 if(!response) return ShowHouseMenu(playerid);
1296 new id = InHouse[playerid];
1297 if(id == INVALID_HOUSE_ID) return SendClientMessage(playerid, 0xE74C3CFF, "You're not in a house.");
1298 if(strcmp(HouseData[id][Owner], Player_GetName(playerid))) return SendClientMessage(playerid, 0xE74C3CFF, "You're not the owner of this house.");
1299 HouseData[id][LockMode] = listitem;
1300 HouseData[id][Save] = true;
1301
1302 UpdateHouseLabel(id);
1303 ShowHouseMenu(playerid);
1304 return 1;
1305 }
1306
1307 if(dialogid == DIALOG_SAFE_MENU)
1308 {
1309 if(!response) return ShowHouseMenu(playerid);
1310 new id = InHouse[playerid];
1311 if(id == INVALID_HOUSE_ID) return SendClientMessage(playerid, 0xE74C3CFF, "You're not in a house.");
1312 if(strcmp(HouseData[id][Owner], Player_GetName(playerid))) return SendClientMessage(playerid, 0xE74C3CFF, "You're not the owner of this house.");
1313 if(HouseData[id][SalePrice] > 0) return SendClientMessage(playerid, 0xE74C3CFF, "You can't use this feature while the house is for sale.");
1314 if(listitem == 0) ShowPlayerDialog(playerid, DIALOG_SAFE_TAKE, DIALOG_STYLE_INPUT, "Safe: Take Money", "Write the amount you want to take from safe:", "Take", "Back");
1315 if(listitem == 1) ShowPlayerDialog(playerid, DIALOG_SAFE_PUT, DIALOG_STYLE_INPUT, "Safe: Put Money", "Write the amount you want to put to safe:", "Put", "Back");
1316 if(listitem == 2)
1317 {
1318 ListPage[playerid] = 0;
1319
1320 new query[200], Cache: safelog;
1321 mysql_format(SQLHandle, query, sizeof(query), "SELECT Type, Amount, FROM_UNIXTIME(Date, '%%d/%%m/%%Y %%H:%%i') as TransactionDate FROM housesafelogs WHERE HouseID=%d ORDER BY Date DESC LIMIT 0, 15", id);
1322 safelog = mysql_query(SQLHandle, query);
1323 new rows = cache_num_rows();
1324 if(rows) {
1325 new list[1024], type, amount, date[20];
1326 format(list, sizeof(list), "Action\tDate\n");
1327 for(new i; i < rows; ++i)
1328 {
1329 cache_get_value_name_int(i, "Type", type);
1330 cache_get_value_name_int(i, "Amount", amount);
1331 cache_get_value_name(i, "TransactionDate", date);
1332
1333 format(list, sizeof(list), "%s%s $%s\t{FFFFFF}%s\n", list, TransactionNames[type], convertNumber(amount), date);
1334 }
1335
1336 ShowPlayerDialog(playerid, DIALOG_SAFE_HISTORY, DIALOG_STYLE_TABLIST_HEADERS, "Safe History (Page 1)", list, "Next", "Previous");
1337 }else{
1338 SendClientMessage(playerid, 0xE74C3CFF, "Can't find any safe history.");
1339 }
1340
1341 cache_delete(safelog);
1342 }
1343
1344 if(listitem == 3)
1345 {
1346 new query[64];
1347 mysql_format(SQLHandle, query, sizeof(query), "DELETE FROM housesafelogs WHERE HouseID=%d", id);
1348 mysql_tquery(SQLHandle, query, "", "");
1349 ShowHouseMenu(playerid);
1350 }
1351
1352 return 1;
1353 }
1354
1355 if(dialogid == DIALOG_SAFE_TAKE)
1356 {
1357 if(!response) return ShowHouseMenu(playerid);
1358 new id = InHouse[playerid];
1359 if(id == INVALID_HOUSE_ID) return SendClientMessage(playerid, 0xE74C3CFF, "You're not in a house.");
1360 if(strcmp(HouseData[id][Owner], Player_GetName(playerid))) return SendClientMessage(playerid, 0xE74C3CFF, "You're not the owner of this house.");
1361 if(HouseData[id][SalePrice] > 0) return SendClientMessage(playerid, 0xE74C3CFF, "You can't use this feature while the house is for sale.");
1362 new amount = strval(inputtext);
1363 if(!(1 <= amount <= 10000000)) return ShowPlayerDialog(playerid, DIALOG_SAFE_TAKE, DIALOG_STYLE_INPUT, "Safe: Take Money", "Write the amount you want to take from safe:\n\n{E74C3C}Invalid amount. You can take between $1 - $10,000,000 at a time.", "Take", "Back");
1364 if(amount > HouseData[id][SafeMoney]) return ShowPlayerDialog(playerid, DIALOG_SAFE_TAKE, DIALOG_STYLE_INPUT, "Safe: Take Money", "Write the amount you want to take from safe:\n\n{E74C3C}You don't have that much money in your safe.", "Take", "Back");
1365 new query[128];
1366 mysql_format(SQLHandle, query, sizeof(query), "INSERT INTO housesafelogs SET HouseID=%d, Type=0, Amount=%d, Date=UNIX_TIMESTAMP()", id, amount);
1367 mysql_tquery(SQLHandle, query, "", "");
1368
1369 GivePlayerMoney(playerid, amount);
1370 HouseData[id][SafeMoney] -= amount;
1371 HouseData[id][Save] = true;
1372 ShowHouseMenu(playerid);
1373 return 1;
1374 }
1375
1376 if(dialogid == DIALOG_SAFE_PUT)
1377 {
1378 if(!response) return ShowHouseMenu(playerid);
1379 new id = InHouse[playerid];
1380 if(id == INVALID_HOUSE_ID) return SendClientMessage(playerid, 0xE74C3CFF, "You're not in a house.");
1381 if(strcmp(HouseData[id][Owner], Player_GetName(playerid))) return SendClientMessage(playerid, 0xE74C3CFF, "You're not the owner of this house.");
1382 new amount = strval(inputtext);
1383 if(!(1 <= amount <= 10000000)) return ShowPlayerDialog(playerid, DIALOG_SAFE_PUT, DIALOG_STYLE_INPUT, "Safe: Put Money", "Write the amount you want to put to safe:\n\n{E74C3C}Invalid amount. You can put between $1 - $10,000,000 at a time.", "Put", "Back");
1384 if(amount > GetPlayerMoney(playerid)) return ShowPlayerDialog(playerid, DIALOG_SAFE_PUT, DIALOG_STYLE_INPUT, "Safe: Put Money", "Write the amount you want to put to safe:\n\n{E74C3C}You don't have that much money on you.", "Put", "Back");
1385 new query[128];
1386 mysql_format(SQLHandle, query, sizeof(query), "INSERT INTO housesafelogs SET HouseID=%d, Type=1, Amount=%d, Date=UNIX_TIMESTAMP()", id, amount);
1387 mysql_tquery(SQLHandle, query, "", "");
1388
1389 GivePlayerMoney(playerid, -amount);
1390 HouseData[id][SafeMoney] += amount;
1391 HouseData[id][Save] = true;
1392 ShowHouseMenu(playerid);
1393 return 1;
1394 }
1395
1396 if(dialogid == DIALOG_GUNS_MENU)
1397 {
1398 if(!response) return ShowHouseMenu(playerid);
1399 new id = InHouse[playerid];
1400 if(id == INVALID_HOUSE_ID) return SendClientMessage(playerid, 0xE74C3CFF, "You're not in a house.");
1401 if(strcmp(HouseData[id][Owner], Player_GetName(playerid))) return SendClientMessage(playerid, 0xE74C3CFF, "You're not the owner of this house.");
1402 if(listitem == 0)
1403 {
1404 if(GetPlayerWeapon(playerid) == 0) return SendClientMessage(playerid, 0xE74C3CFF, "You can't put your fists in your house.");
1405 new query[128], weapon = GetPlayerWeapon(playerid), ammo = GetPlayerAmmo(playerid);
1406 RemovePlayerWeapon(playerid, weapon);
1407 mysql_format(SQLHandle, query, sizeof(query), "INSERT INTO houseguns VALUES (%d, %d, %d) ON DUPLICATE KEY UPDATE Ammo=Ammo+%d", id, weapon, ammo, ammo);
1408 mysql_tquery(SQLHandle, query, "", "");
1409 ShowHouseMenu(playerid);
1410 }
1411
1412 if(listitem == 1)
1413 {
1414 new query[80], Cache: weapons;
1415 mysql_format(SQLHandle, query, sizeof(query), "SELECT WeaponID, Ammo FROM houseguns WHERE HouseID=%d ORDER BY WeaponID ASC", id);
1416 weapons = mysql_query(SQLHandle, query);
1417 new rows = cache_num_rows();
1418 if(rows) {
1419 new list[512], weapname[32], weapon_id, weapon_ammo;
1420 format(list, sizeof(list), "#\tWeapon Name\tAmmo\n");
1421 for(new i; i < rows; ++i)
1422 {
1423 cache_get_value_name_int(i, "WeaponID", weapon_id);
1424 cache_get_value_name_int(i, "Ammo", weapon_ammo);
1425
1426 GetWeaponName(weapon_id, weapname, sizeof(weapname));
1427 format(list, sizeof(list), "%s%d\t%s\t%s\n", list, i+1, weapname, convertNumber(weapon_ammo));
1428 }
1429
1430 ShowPlayerDialog(playerid, DIALOG_GUNS_TAKE, DIALOG_STYLE_TABLIST_HEADERS, "House Guns", list, "Take", "Back");
1431 }else{
1432 SendClientMessage(playerid, 0xE74C3CFF, "You don't have any guns in your house.");
1433 }
1434
1435 cache_delete(weapons);
1436 }
1437
1438 return 1;
1439 }
1440
1441 if(dialogid == DIALOG_GUNS_TAKE)
1442 {
1443 if(!response) return ShowHouseMenu(playerid);
1444 new id = InHouse[playerid];
1445 if(id == INVALID_HOUSE_ID) return SendClientMessage(playerid, 0xE74C3CFF, "You're not in a house.");
1446 if(strcmp(HouseData[id][Owner], Player_GetName(playerid))) return SendClientMessage(playerid, 0xE74C3CFF, "You're not the owner of this house.");
1447 new query[96], Cache: weapon;
1448 mysql_format(SQLHandle, query, sizeof(query), "SELECT WeaponID, Ammo FROM houseguns WHERE HouseID=%d ORDER BY WeaponID ASC LIMIT %d, 1", id, listitem);
1449 weapon = mysql_query(SQLHandle, query);
1450 new rows = cache_num_rows();
1451 if(rows) {
1452 new string[64], weapname[32], weaponid, ammo;
1453 cache_get_value_name_int(0, "WeaponID", weaponid);
1454 cache_get_value_name_int(0, "Ammo", ammo);
1455
1456 GetWeaponName(weaponid, weapname, sizeof(weapname));
1457 GivePlayerWeapon(playerid, weaponid, ammo);
1458 format(string, sizeof(string), "You've taken a %s from your house.", weapname);
1459 SendClientMessage(playerid, 0xFFFFFFFF, string);
1460 mysql_format(SQLHandle, query, sizeof(query), "DELETE FROM houseguns WHERE HouseID=%d AND WeaponID=%d", id, weaponid);
1461 mysql_tquery(SQLHandle, query, "", "");
1462 }else{
1463 SendClientMessage(playerid, 0xE74C3CFF, "Can't find that weapon.");
1464 }
1465
1466 cache_delete(weapon);
1467 return 1;
1468 }
1469
1470 if(dialogid == DIALOG_FURNITURE_MENU)
1471 {
1472 if(!response) return ShowHouseMenu(playerid);
1473 new id = InHouse[playerid];
1474 if(id == INVALID_HOUSE_ID) return SendClientMessage(playerid, 0xE74C3CFF, "You're not in a house.");
1475 if(strcmp(HouseData[id][Owner], Player_GetName(playerid))) return SendClientMessage(playerid, 0xE74C3CFF, "You're not the owner of this house.");
1476 if(HouseData[id][SalePrice] > 0) return SendClientMessage(playerid, 0xE74C3CFF, "You can't use this feature while the house is for sale.");
1477
1478 if(listitem == 0)
1479 {
1480 new list[512];
1481 format(list, sizeof(list), "#\tFurniture Name\tPrice\n");
1482 for(new i; i < sizeof(HouseFurnitures); ++i)
1483 {
1484 format(list, sizeof(list), "%s%d\t%s\t$%s\n", list, i+1, HouseFurnitures[i][Name], convertNumber(HouseFurnitures[i][Price]));
1485 }
1486
1487 ShowPlayerDialog(playerid, DIALOG_FURNITURE_BUY, DIALOG_STYLE_TABLIST_HEADERS, "Buy Furniture", list, "Buy", "Back");
1488 }
1489
1490 if(listitem == 1)
1491 {
1492 SelectMode[playerid] = SELECT_MODE_EDIT;
1493 SelectObject(playerid);
1494 SendClientMessage(playerid, 0xFFFFFFFF, "Click on the furniture you want to edit.");
1495 }
1496
1497 if(listitem == 2)
1498 {
1499 SelectMode[playerid] = SELECT_MODE_SELL;
1500 SelectObject(playerid);
1501 SendClientMessage(playerid, 0xFFFFFFFF, "Click on the furniture you want to sell.");
1502 }
1503
1504 if(listitem == 3)
1505 {
1506 new money, sold, data[e_furniture], query[64];
1507 for(new i; i < Streamer_GetUpperBound(STREAMER_TYPE_OBJECT); ++i)
1508 {
1509 if(!IsValidDynamicObject(i)) continue;
1510 Streamer_GetArrayData(STREAMER_TYPE_OBJECT, i, E_STREAMER_EXTRA_ID, data);
1511 if(data[SQLID] > 0 && data[HouseID] == id)
1512 {
1513 sold++;
1514 money += HouseFurnitures[ data[ArrayID] ][Price];
1515 DestroyDynamicObject(i);
1516 }
1517 }
1518
1519 new string[64];
1520 format(string, sizeof(string), "Sold %d furnitures for $%s.", sold, convertNumber(money));
1521 SendClientMessage(playerid, -1, string);
1522 GivePlayerMoney(playerid, money);
1523
1524 mysql_format(SQLHandle, query, sizeof(query), "DELETE FROM housefurnitures WHERE HouseID=%d", id);
1525 mysql_tquery(SQLHandle, query, "", "");
1526 }
1527
1528 return 1;
1529 }
1530
1531 if(dialogid == DIALOG_FURNITURE_BUY)
1532 {
1533 if(!response) return ShowHouseMenu(playerid);
1534 new id = InHouse[playerid];
1535 if(id == INVALID_HOUSE_ID) return SendClientMessage(playerid, 0xE74C3CFF, "You're not in a house.");
1536 if(strcmp(HouseData[id][Owner], Player_GetName(playerid))) return SendClientMessage(playerid, 0xE74C3CFF, "You're not the owner of this house.");
1537 if(HouseData[id][SalePrice] > 0) return SendClientMessage(playerid, 0xE74C3CFF, "You can't use this feature while the house is for sale.");
1538 if(HouseFurnitures[listitem][Price] > GetPlayerMoney(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "You can't afford this furniture.");
1539 GivePlayerMoney(playerid, -HouseFurnitures[listitem][Price]);
1540 new Float: x, Float: y, Float: z;
1541 GetPlayerPos(playerid, x, y, z);
1542 GetXYInFrontOfPlayer(playerid, x, y, 3.0);
1543 new objectid = CreateDynamicObject(HouseFurnitures[listitem][ModelID], x, y, z, 0.0, 0.0, 0.0, GetPlayerVirtualWorld(playerid), GetPlayerInterior(playerid)), query[256];
1544 mysql_format(SQLHandle, query, sizeof(query), "INSERT INTO housefurnitures SET HouseID=%d, FurnitureID=%d, FurnitureX=%f, FurnitureY=%f, FurnitureZ=%f, FurnitureVW=%d, FurnitureInt=%d", id, listitem, x, y, z, GetPlayerVirtualWorld(playerid), GetPlayerInterior(playerid));
1545 new Cache: add = mysql_query(SQLHandle, query), data[e_furniture];
1546 data[SQLID] = cache_insert_id();
1547 data[HouseID] = id;
1548 data[ArrayID] = listitem;
1549 data[furnitureX] = x;
1550 data[furnitureY] = y;
1551 data[furnitureZ] = z;
1552 data[furnitureRX] = 0.0;
1553 data[furnitureRY] = 0.0;
1554 data[furnitureRZ] = 0.0;
1555 cache_delete(add);
1556 Streamer_SetArrayData(STREAMER_TYPE_OBJECT, objectid, E_STREAMER_EXTRA_ID, data);
1557
1558 EditingFurniture[playerid] = true;
1559 EditDynamicObject(playerid, objectid);
1560 return 1;
1561 }
1562
1563 if(dialogid == DIALOG_FURNITURE_SELL)
1564 {
1565 if(!response) return 1;
1566 new id = InHouse[playerid];
1567 if(id == INVALID_HOUSE_ID) return SendClientMessage(playerid, 0xE74C3CFF, "You're not in a house.");
1568 if(strcmp(HouseData[id][Owner], Player_GetName(playerid))) return SendClientMessage(playerid, 0xE74C3CFF, "You're not the owner of this house.");
1569 if(HouseData[id][SalePrice] > 0) return SendClientMessage(playerid, 0xE74C3CFF, "You can't use this feature while the house is for sale.");
1570 new objectid = GetPVarInt(playerid, "SelectedFurniture"), query[64], data[e_furniture];
1571 Streamer_GetArrayData(STREAMER_TYPE_OBJECT, objectid, E_STREAMER_EXTRA_ID, data);
1572 GivePlayerMoney(playerid, HouseFurnitures[ data[ArrayID] ][Price]);
1573 mysql_format(SQLHandle, query, sizeof(query), "DELETE FROM housefurnitures WHERE ID=%d", data[SQLID]);
1574 mysql_tquery(SQLHandle, query, "", "");
1575 DestroyDynamicObject(objectid);
1576 DeletePVar(playerid, "SelectedFurniture");
1577 return 1;
1578 }
1579
1580 if(dialogid == DIALOG_VISITORS_MENU)
1581 {
1582 if(!response) return ShowHouseMenu(playerid);
1583 new id = InHouse[playerid];
1584 if(id == INVALID_HOUSE_ID) return SendClientMessage(playerid, 0xE74C3CFF, "You're not in a house.");
1585 if(strcmp(HouseData[id][Owner], Player_GetName(playerid))) return SendClientMessage(playerid, 0xE74C3CFF, "You're not the owner of this house.");
1586 if(listitem == 0)
1587 {
1588 new query[200], Cache: visitors;
1589 mysql_format(SQLHandle, query, sizeof(query), "SELECT Visitor, FROM_UNIXTIME(Date, '%%d/%%m/%%Y %%H:%%i') as VisitDate FROM housevisitors WHERE HouseID=%d ORDER BY Date DESC LIMIT 0, 15", id);
1590 visitors = mysql_query(SQLHandle, query);
1591 new rows = cache_num_rows();
1592 if(rows) {
1593 new list[1024], visitor_name[MAX_PLAYER_NAME], visit_date[20];
1594 format(list, sizeof(list), "Visitor Name\tDate\n");
1595 for(new i; i < rows; ++i)
1596 {
1597 cache_get_value_name(i, "Visitor", visitor_name);
1598 cache_get_value_name(i, "VisitDate", visit_date);
1599 format(list, sizeof(list), "%s%s\t%s\n", list, visitor_name, visit_date);
1600 }
1601
1602 ShowPlayerDialog(playerid, DIALOG_VISITORS, DIALOG_STYLE_TABLIST_HEADERS, "House Visitors (Page 1)", list, "Next", "Previous");
1603 }else{
1604 SendClientMessage(playerid, 0xE74C3CFF, "You didn't had any visitors.");
1605 }
1606
1607 cache_delete(visitors);
1608 }
1609
1610 if(listitem == 1)
1611 {
1612 new query[64];
1613 mysql_format(SQLHandle, query, sizeof(query), "DELETE FROM housevisitors WHERE HouseID=%d", id);
1614 mysql_tquery(SQLHandle, query, "", "");
1615 ShowHouseMenu(playerid);
1616 }
1617
1618 return 1;
1619 }
1620
1621 if(dialogid == DIALOG_VISITORS)
1622 {
1623 if(!response) {
1624 ListPage[playerid]--;
1625 if(ListPage[playerid] < 0)
1626 {
1627 ListPage[playerid] = 0;
1628 ShowHouseMenu(playerid);
1629 return 1;
1630 }
1631 }else{
1632 ListPage[playerid]++;
1633 }
1634
1635 new id = InHouse[playerid];
1636 if(id == INVALID_HOUSE_ID) return SendClientMessage(playerid, 0xE74C3CFF, "You're not in a house.");
1637 if(strcmp(HouseData[id][Owner], Player_GetName(playerid))) return SendClientMessage(playerid, 0xE74C3CFF, "You're not the owner of this house.");
1638 new query[200], Cache: visitors;
1639 mysql_format(SQLHandle, query, sizeof(query), "SELECT Visitor, FROM_UNIXTIME(Date, '%%d/%%m/%%Y %%H:%%i') as VisitDate FROM housevisitors WHERE HouseID=%d ORDER BY Date DESC LIMIT %d, 15", id, ListPage[playerid]*15);
1640 visitors = mysql_query(SQLHandle, query);
1641 new rows = cache_num_rows();
1642 if(rows) {
1643 new list[1024], visitor_name[MAX_PLAYER_NAME], visit_date[20];
1644 format(list, sizeof(list), "Visitor Name\tDate\n");
1645 for(new i; i < rows; ++i)
1646 {
1647 cache_get_value_name(i, "Visitor", visitor_name);
1648 cache_get_value_name(i, "VisitDate", visit_date);
1649 format(list, sizeof(list), "%s%s\t%s\n", list, visitor_name, visit_date);
1650 }
1651
1652 new title[32];
1653 format(title, sizeof(title), "House Visitors (Page %d)", ListPage[playerid]+1);
1654 ShowPlayerDialog(playerid, DIALOG_VISITORS, DIALOG_STYLE_TABLIST_HEADERS, title, list, "Next", "Previous");
1655 }else{
1656 SendClientMessage(playerid, 0xE74C3CFF, "Can't find any more visitors.");
1657 ListPage[playerid] = 0;
1658 ShowHouseMenu(playerid);
1659 }
1660
1661 cache_delete(visitors);
1662 return 1;
1663 }
1664
1665 if(dialogid == DIALOG_KEYS_MENU)
1666 {
1667 if(!response) return ShowHouseMenu(playerid);
1668 new id = InHouse[playerid];
1669 if(id == INVALID_HOUSE_ID) return SendClientMessage(playerid, 0xE74C3CFF, "You're not in a house.");
1670 if(strcmp(HouseData[id][Owner], Player_GetName(playerid))) return SendClientMessage(playerid, 0xE74C3CFF, "You're not the owner of this house.");
1671 if(listitem == 0)
1672 {
1673 new query[200], Cache: keyowners;
1674 mysql_format(SQLHandle, query, sizeof(query), "SELECT Player, FROM_UNIXTIME(Date, '%%d/%%m/%%Y %%H:%%i') as KeyDate FROM housekeys WHERE HouseID=%d ORDER BY Date DESC LIMIT %d, 15", id, ListPage[playerid]*15);
1675 keyowners = mysql_query(SQLHandle, query);
1676 new rows = cache_num_rows();
1677 if(rows) {
1678 new list[1024], key_name[MAX_PLAYER_NAME], key_date[20];
1679 format(list, sizeof(list), "Key Owner\tKey Given On\n");
1680 for(new i; i < rows; ++i)
1681 {
1682 cache_get_value_name(i, "Player", key_name);
1683 cache_get_value_name(i, "KeyDate", key_date);
1684 format(list, sizeof(list), "%s%s\t%s\n", list, key_name, key_date);
1685 }
1686
1687 ShowPlayerDialog(playerid, DIALOG_KEYS, DIALOG_STYLE_TABLIST_HEADERS, "Key Owners (Page 1)", list, "Next", "Previous");
1688 }else{
1689 SendClientMessage(playerid, 0xE74C3CFF, "Can't find any key owners.");
1690 }
1691
1692 cache_delete(keyowners);
1693 }
1694
1695 if(listitem == 1)
1696 {
1697 foreach(new i : Player)
1698 {
1699 if(Iter_Contains(HouseKeys[i], id)) Iter_Remove(HouseKeys[i], id);
1700 }
1701
1702 new query[64];
1703 mysql_format(SQLHandle, query, sizeof(query), "DELETE FROM housekeys WHERE HouseID=%d", id);
1704 mysql_tquery(SQLHandle, query, "", "");
1705 ShowHouseMenu(playerid);
1706 }
1707
1708 return 1;
1709 }
1710
1711 if(dialogid == DIALOG_KEYS)
1712 {
1713 if(!response) {
1714 ListPage[playerid]--;
1715 if(ListPage[playerid] < 0)
1716 {
1717 ListPage[playerid] = 0;
1718 ShowHouseMenu(playerid);
1719 return 1;
1720 }
1721 }else{
1722 ListPage[playerid]++;
1723 }
1724
1725 new id = InHouse[playerid];
1726 if(id == INVALID_HOUSE_ID) return SendClientMessage(playerid, 0xE74C3CFF, "You're not in a house.");
1727 if(strcmp(HouseData[id][Owner], Player_GetName(playerid))) return SendClientMessage(playerid, 0xE74C3CFF, "You're not the owner of this house.");
1728 new query[200], Cache: keyowners;
1729 mysql_format(SQLHandle, query, sizeof(query), "SELECT Player, FROM_UNIXTIME(Date, '%%d/%%m/%%Y %%H:%%i') as KeyDate FROM housekeys WHERE HouseID=%d ORDER BY Date DESC LIMIT %d, 15", id, ListPage[playerid]*15);
1730 keyowners = mysql_query(SQLHandle, query);
1731 new rows = cache_num_rows();
1732 if(rows) {
1733 new list[1024], key_name[MAX_PLAYER_NAME], key_date[20];
1734 format(list, sizeof(list), "Key Owner\tKey Given On\n");
1735 for(new i; i < rows; ++i)
1736 {
1737 cache_get_value_name(i, "Player", key_name);
1738 cache_get_value_name(i, "KeyDate", key_date);
1739 format(list, sizeof(list), "%s%s\t%s\n", list, key_name, key_date);
1740 }
1741
1742 new title[32];
1743 format(title, sizeof(title), "Key Owners (Page %d)", ListPage[playerid]+1);
1744 ShowPlayerDialog(playerid, DIALOG_KEYS, DIALOG_STYLE_TABLIST_HEADERS, title, list, "Next", "Previous");
1745 }else{
1746 ListPage[playerid] = 0;
1747 ShowHouseMenu(playerid);
1748 SendClientMessage(playerid, 0xE74C3CFF, "Can't find any more key owners.");
1749 }
1750
1751 cache_delete(keyowners);
1752 return 1;
1753 }
1754
1755 if(dialogid == DIALOG_SAFE_HISTORY)
1756 {
1757 if(!response) {
1758 ListPage[playerid]--;
1759 if(ListPage[playerid] < 0)
1760 {
1761 ListPage[playerid] = 0;
1762 ShowHouseMenu(playerid);
1763 return 1;
1764 }
1765 }else{
1766 ListPage[playerid]++;
1767 }
1768
1769 new id = InHouse[playerid];
1770 if(id == INVALID_HOUSE_ID) return SendClientMessage(playerid, 0xE74C3CFF, "You're not in a house.");
1771 if(strcmp(HouseData[id][Owner], Player_GetName(playerid))) return SendClientMessage(playerid, 0xE74C3CFF, "You're not the owner of this house.");
1772 new query[200], Cache: safelog;
1773 mysql_format(SQLHandle, query, sizeof(query), "SELECT Type, Amount, FROM_UNIXTIME(Date, '%%d/%%m/%%Y %%H:%%i') as TransactionDate FROM housesafelogs WHERE HouseID=%d ORDER BY Date DESC LIMIT %d, 15", id, ListPage[playerid]*15);
1774 safelog = mysql_query(SQLHandle, query);
1775 new rows = cache_num_rows();
1776 if(rows) {
1777 new list[1024], type, amount, date[20];
1778 format(list, sizeof(list), "Action\tDate\n");
1779 for(new i; i < rows; ++i)
1780 {
1781 cache_get_value_name_int(i, "Type", type);
1782 cache_get_value_name_int(i, "Amount", amount);
1783 cache_get_value_name(i, "TransactionDate", date);
1784
1785 format(list, sizeof(list), "%s%s $%s\t{FFFFFF}%s\n", list, TransactionNames[type], convertNumber(amount), date);
1786 }
1787
1788 new title[32];
1789 format(title, sizeof(title), "Safe History (Page %d)", ListPage[playerid]+1);
1790 ShowPlayerDialog(playerid, DIALOG_SAFE_HISTORY, DIALOG_STYLE_TABLIST_HEADERS, title, list, "Next", "Previous");
1791 }else{
1792 SendClientMessage(playerid, 0xE74C3CFF, "Can't find any more safe history.");
1793 }
1794
1795 cache_delete(safelog);
1796 return 1;
1797 }
1798
1799 if(dialogid == DIALOG_MY_KEYS)
1800 {
1801 if(!response) {
1802 ListPage[playerid]--;
1803 if(ListPage[playerid] < 0)
1804 {
1805 ListPage[playerid] = 0;
1806 return 1;
1807 }
1808 }else{
1809 ListPage[playerid]++;
1810 }
1811
1812 new query[200], Cache: mykeys;
1813 mysql_format(SQLHandle, query, sizeof(query), "SELECT HouseID, FROM_UNIXTIME(Date, '%%d/%%m/%%Y %%H:%%i') as KeyDate FROM housekeys WHERE Player='%e' ORDER BY Date DESC LIMIT %d, 15", Player_GetName(playerid), ListPage[playerid]*15);
1814 mykeys = mysql_query(SQLHandle, query);
1815
1816 new rows = cache_num_rows();
1817 if(rows) {
1818 new list[1024], id, key_date[20];
1819 format(list, sizeof(list), "House Info\tKey Given On\n");
1820 for(new i; i < rows; ++i)
1821 {
1822 cache_get_value_name_int(i, "HouseID", id);
1823 cache_get_value_name(i, "KeyDate", key_date);
1824 format(list, sizeof(list), "%s%s's %s\t%s\n", list, HouseData[id][Owner], HouseData[id][Name], key_date);
1825 }
1826
1827 new title[32];
1828 format(title, sizeof(title), "My Keys (Page %d)", ListPage[playerid]+1);
1829 ShowPlayerDialog(playerid, DIALOG_MY_KEYS, DIALOG_STYLE_TABLIST_HEADERS, title, list, "Next", "Previous");
1830 }else{
1831 ListPage[playerid] = 0;
1832 SendClientMessage(playerid, 0xE74C3CFF, "Can't find any more keys.");
1833 }
1834
1835 cache_delete(mykeys);
1836 return 1;
1837 }
1838
1839 if(dialogid == DIALOG_BUY_HOUSE_FROM_OWNER)
1840 {
1841 if(!response) return 1;
1842 new id = GetPVarInt(playerid, "PickupHouseID");
1843 if(!IsPlayerInRangeOfPoint(playerid, 2.0, HouseData[id][houseX], HouseData[id][houseY], HouseData[id][houseZ])) return SendClientMessage(playerid, 0xE74C3CFF, "You're not near any house.");
1844 #if LIMIT_PER_PLAYER > 0
1845 if(OwnedHouses(playerid) + 1 > LIMIT_PER_PLAYER) return SendClientMessage(playerid, 0xE74C3CFF, "You can't buy any more houses.");
1846 #endif
1847 if(HouseData[id][SalePrice] > GetPlayerMoney(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "You can't afford this house.");
1848 if(HouseData[id][SalePrice] < 1) return SendClientMessage(playerid, 0xE74C3CFF, "Someone already owns this house.");
1849 new old_owner[MAX_PLAYER_NAME], price = HouseData[id][SalePrice], owner_id = INVALID_PLAYER_ID;
1850 format(old_owner, MAX_PLAYER_NAME, "%s", HouseData[id][Owner]);
1851
1852 foreach(new i : Player)
1853 {
1854 if(!strcmp(HouseData[id][Owner], Player_GetName(i)))
1855 {
1856 owner_id = i;
1857 break;
1858 }
1859 }
1860
1861 GivePlayerMoney(playerid, -HouseData[id][SalePrice]);
1862 GetPlayerName(playerid, HouseData[id][Owner], MAX_PLAYER_NAME);
1863 HouseData[id][LastEntered] = gettime();
1864 HouseData[id][SalePrice] = 0;
1865 HouseData[id][Save] = true;
1866
1867 UpdateHouseLabel(id);
1868 Streamer_SetIntData(STREAMER_TYPE_PICKUP, HouseData[id][HousePickup], E_STREAMER_MODEL_ID, 19522);
1869 Streamer_SetIntData(STREAMER_TYPE_MAP_ICON, HouseData[id][HouseIcon], E_STREAMER_TYPE, 32);
1870 SendToHouse(playerid, id);
1871
1872 foreach(new i : Player)
1873 {
1874 if(i == playerid) continue;
1875 if(InHouse[i] == id)
1876 {
1877 SetPVarInt(i, "HousePickupCooldown", gettime() + HOUSE_COOLDOWN);
1878 SetPlayerVirtualWorld(i, 0);
1879 SetPlayerInterior(i, 0);
1880 SetPlayerPos(i, HouseData[id][houseX], HouseData[id][houseY], HouseData[id][houseZ]);
1881 InHouse[i] = INVALID_HOUSE_ID;
1882 }
1883
1884 if(Iter_Contains(HouseKeys[i], id)) Iter_Remove(HouseKeys[i], id);
1885 }
1886
1887 new query[128];
1888 if(IsPlayerConnected(owner_id)) {
1889 GivePlayerMoney(owner_id, price);
1890
1891 new string[128];
1892 format(string, sizeof(string), "%s(%d) has bought your house for $%s.", HouseData[id][Owner], playerid, convertNumber(price));
1893 SendClientMessage(owner_id, -1, string);
1894 }else{
1895 mysql_format(SQLHandle, query, sizeof(query), "INSERT INTO housesales SET OldOwner='%e', NewOwner='%e', Price=%d", old_owner, HouseData[id][Owner], price);
1896 mysql_tquery(SQLHandle, query, "", "");
1897 }
1898
1899 mysql_format(SQLHandle, query, sizeof(query), "DELETE FROM housevisitors WHERE HouseID=%d", id);
1900 mysql_tquery(SQLHandle, query, "", "");
1901
1902 mysql_format(SQLHandle, query, sizeof(query), "DELETE FROM housekeys WHERE HouseID=%d", id);
1903 mysql_tquery(SQLHandle, query, "", "");
1904
1905 mysql_format(SQLHandle, query, sizeof(query), "DELETE FROM housesafelogs WHERE HouseID=%d", id);
1906 mysql_tquery(SQLHandle, query, "", "");
1907 return 1;
1908 }
1909
1910 if(dialogid == DIALOG_SELL_HOUSE)
1911 {
1912 if(!response) return ShowHouseMenu(playerid);
1913 new id = InHouse[playerid];
1914 if(id == INVALID_HOUSE_ID) return SendClientMessage(playerid, 0xE74C3CFF, "You're not in a house.");
1915 if(strcmp(HouseData[id][Owner], Player_GetName(playerid))) return SendClientMessage(playerid, 0xE74C3CFF, "You're not the owner of this house.");
1916 if(listitem == 0)
1917 {
1918 new money = floatround(HouseData[id][Price] * 0.85) + HouseData[id][SafeMoney];
1919 GivePlayerMoney(playerid, money);
1920 ResetHouse(id);
1921 }
1922
1923 if(listitem == 1)
1924 {
1925 if(HouseData[id][SalePrice] > 0) {
1926 HouseData[id][SalePrice] = 0;
1927 HouseData[id][Save] = true;
1928
1929 UpdateHouseLabel(id);
1930 Streamer_SetIntData(STREAMER_TYPE_PICKUP, HouseData[id][HousePickup], E_STREAMER_MODEL_ID, 19522);
1931 Streamer_SetIntData(STREAMER_TYPE_MAP_ICON, HouseData[id][HouseIcon], E_STREAMER_TYPE, 32);
1932 SendClientMessage(playerid, -1, "Your house is no longer for sale.");
1933 }else{
1934 if(HouseData[id][SafeMoney] > 0) return SendClientMessage(playerid, 0xE74C3CFF, "You can't put your house for sale if there's money in the safe.");
1935 ShowPlayerDialog(playerid, DIALOG_SELLING_PRICE, DIALOG_STYLE_INPUT, "Sell House", "How much do you want for your house?", "Put For Sale", "Cancel");
1936 }
1937 }
1938
1939 return 1;
1940 }
1941
1942 if(dialogid == DIALOG_SELLING_PRICE)
1943 {
1944 if(!response) return ShowHouseMenu(playerid);
1945 new id = InHouse[playerid];
1946 if(id == INVALID_HOUSE_ID) return SendClientMessage(playerid, 0xE74C3CFF, "You're not in a house.");
1947 if(strcmp(HouseData[id][Owner], Player_GetName(playerid))) return SendClientMessage(playerid, 0xE74C3CFF, "You're not the owner of this house.");
1948 new amount = strval(inputtext);
1949 if(!(1 <= amount <= 10000000)) return ShowPlayerDialog(playerid, DIALOG_SELLING_PRICE, DIALOG_STYLE_INPUT, "Sell House", "{E74C3C}You can't put your house for sale for less than $1 or more than $100,000,000.\n\n{FFFFFF}How much do you want for your house?", "Put For Sale", "Cancel");
1950 HouseData[id][SalePrice] = amount;
1951 HouseData[id][Save] = true;
1952
1953 UpdateHouseLabel(id);
1954 Streamer_SetIntData(STREAMER_TYPE_PICKUP, HouseData[id][HousePickup], E_STREAMER_MODEL_ID, 1273);
1955 Streamer_SetIntData(STREAMER_TYPE_MAP_ICON, HouseData[id][HouseIcon], E_STREAMER_TYPE, 31);
1956
1957 new string[128];
1958 format(string, sizeof(string), "You put your house for sale for $%s.", convertNumber(amount));
1959 SendClientMessage(playerid, -1, string);
1960 return 1;
1961 }
1962
1963 return 0;
1964}
1965
1966public OnPlayerSelectDynamicObject(playerid, objectid, modelid, Float: x, Float: y, Float: z)
1967{
1968 switch(SelectMode[playerid])
1969 {
1970 case SELECT_MODE_EDIT:
1971 {
1972 EditingFurniture[playerid] = true;
1973 EditDynamicObject(playerid, objectid);
1974 }
1975
1976 case SELECT_MODE_SELL:
1977 {
1978 CancelEdit(playerid);
1979
1980 new data[e_furniture], string[128];
1981 SetPVarInt(playerid, "SelectedFurniture", objectid);
1982 Streamer_GetArrayData(STREAMER_TYPE_OBJECT, objectid, E_STREAMER_EXTRA_ID, data);
1983 format(string, sizeof(string), "Do you want to sell your %s?\nYou'll get {2ECC71}$%s.", HouseFurnitures[ data[ArrayID] ][Name], convertNumber(HouseFurnitures[ data[ArrayID] ][Price]));
1984 ShowPlayerDialog(playerid, DIALOG_FURNITURE_SELL, DIALOG_STYLE_MSGBOX, "Confirm Sale", string, "Sell", "Close");
1985 }
1986 }
1987
1988 SelectMode[playerid] = SELECT_MODE_NONE;
1989 return 1;
1990}
1991
1992public OnPlayerEditDynamicObject(playerid, objectid, response, Float: x, Float: y, Float: z, Float: rx, Float: ry, Float: rz)
1993{
1994 if(EditingFurniture[playerid])
1995 {
1996 switch(response)
1997 {
1998 case EDIT_RESPONSE_CANCEL:
1999 {
2000 new data[e_furniture];
2001 Streamer_GetArrayData(STREAMER_TYPE_OBJECT, objectid, E_STREAMER_EXTRA_ID, data);
2002 SetDynamicObjectPos(objectid, data[furnitureX], data[furnitureY], data[furnitureZ]);
2003 SetDynamicObjectRot(objectid, data[furnitureRX], data[furnitureRY], data[furnitureRZ]);
2004
2005 EditingFurniture[playerid] = false;
2006 }
2007
2008 case EDIT_RESPONSE_FINAL:
2009 {
2010 new data[e_furniture], query[256];
2011 Streamer_GetArrayData(STREAMER_TYPE_OBJECT, objectid, E_STREAMER_EXTRA_ID, data);
2012 data[furnitureX] = x;
2013 data[furnitureY] = y;
2014 data[furnitureZ] = z;
2015 data[furnitureRX] = rx;
2016 data[furnitureRY] = ry;
2017 data[furnitureRZ] = rz;
2018 SetDynamicObjectPos(objectid, data[furnitureX], data[furnitureY], data[furnitureZ]);
2019 SetDynamicObjectRot(objectid, data[furnitureRX], data[furnitureRY], data[furnitureRZ]);
2020 Streamer_SetArrayData(STREAMER_TYPE_OBJECT, objectid, E_STREAMER_EXTRA_ID, data);
2021
2022 mysql_format(SQLHandle, query, sizeof(query), "UPDATE housefurnitures SET FurnitureX=%f, FurnitureY=%f, FurnitureZ=%f, FurnitureRX=%f, FurnitureRY=%f, FurnitureRZ=%f WHERE ID=%d", data[furnitureX], data[furnitureY], data[furnitureZ], data[furnitureRX], data[furnitureRY], data[furnitureRZ], data[SQLID]);
2023 mysql_tquery(SQLHandle, query, "", "");
2024
2025 EditingFurniture[playerid] = false;
2026 }
2027 }
2028 }
2029
2030 return 1;
2031}
2032
2033/* ============ Player Commands ============ */
2034CMD:house(playerid, params[])
2035{
2036 if(InHouse[playerid] == INVALID_HOUSE_ID) return SendClientMessage(playerid, 0xE74C3CFF, "You're not in a house.");
2037 ShowHouseMenu(playerid);
2038 return 1;
2039}
2040
2041CMD:myhousekeys(playerid, params[])
2042{
2043 new query[200], Cache: mykeys;
2044 mysql_format(SQLHandle, query, sizeof(query), "SELECT HouseID, FROM_UNIXTIME(Date, '%%d/%%m/%%Y %%H:%%i') as KeyDate FROM housekeys WHERE Player='%e' ORDER BY Date DESC LIMIT 0, 15", Player_GetName(playerid));
2045 mykeys = mysql_query(SQLHandle, query);
2046 ListPage[playerid] = 0;
2047
2048 new rows = cache_num_rows();
2049 if(rows) {
2050 new list[1024], id, key_date[20];
2051 format(list, sizeof(list), "House Info\tKey Given On\n");
2052 for(new i; i < rows; ++i)
2053 {
2054 cache_get_value_name_int(i, "HouseID", id);
2055 cache_get_value_name(i, "KeyDate", key_date);
2056 format(list, sizeof(list), "%s%s's %s\t%s\n", list, HouseData[id][Owner], HouseData[id][Name], key_date);
2057 }
2058
2059 ShowPlayerDialog(playerid, DIALOG_MY_KEYS, DIALOG_STYLE_TABLIST_HEADERS, "My Keys (Page 1)", list, "Next", "Close");
2060 }else{
2061 SendClientMessage(playerid, 0xE74C3CFF, "You don't have any keys for any houses.");
2062 }
2063
2064 cache_delete(mykeys);
2065 return 1;
2066}
2067
2068CMD:givehousekeys(playerid, params[])
2069{
2070 if(InHouse[playerid] == INVALID_HOUSE_ID) return SendClientMessage(playerid, 0xE74C3CFF, "You're not in a house.");
2071 new id, houseid = InHouse[playerid];
2072 if(strcmp(HouseData[houseid][Owner], Player_GetName(playerid))) return SendClientMessage(playerid, 0xE74C3CFF, "You're not the owner of this house.");
2073 if(sscanf(params, "u", id)) return SendClientMessage(playerid, 0xE74C3CFF, "USAGE: /givehousekeys [player id]");
2074 if(id == INVALID_PLAYER_ID) return SendClientMessage(playerid, 0xE74C3CFF, "Invalid player ID.");
2075 if(id == playerid) return SendClientMessage(playerid, 0xE74C3CFF, "You're the owner, you don't need keys.");
2076 if(Iter_Contains(HouseKeys[id], houseid)) return SendClientMessage(playerid, 0xE74C3CFF, "That player has keys for this house.");
2077 Iter_Add(HouseKeys[id], houseid);
2078
2079 new query[128];
2080 mysql_format(SQLHandle, query, sizeof(query), "INSERT INTO housekeys SET HouseID=%d, Player='%e', Date=UNIX_TIMESTAMP()", houseid, Player_GetName(id));
2081 mysql_tquery(SQLHandle, query, "", "");
2082
2083 format(query, sizeof(query), "You've given keys to %s for this house.", Player_GetName(id));
2084 SendClientMessage(playerid, -1, query);
2085 format(query, sizeof(query), "Now you have keys for %s's house, %s.", HouseData[houseid][Owner], HouseData[houseid][Name]);
2086 SendClientMessage(id, -1, query);
2087 return 1;
2088}
2089
2090CMD:takehousekeys(playerid, params[])
2091{
2092 if(InHouse[playerid] == INVALID_HOUSE_ID) return SendClientMessage(playerid, 0xE74C3CFF, "You're not in a house.");
2093 new id, houseid = InHouse[playerid];
2094 if(strcmp(HouseData[houseid][Owner], Player_GetName(playerid))) return SendClientMessage(playerid, 0xE74C3CFF, "You're not the owner of this house.");
2095 if(sscanf(params, "u", id)) return SendClientMessage(playerid, 0xE74C3CFF, "USAGE: /takehousekeys [player id]");
2096 if(id == INVALID_PLAYER_ID) return SendClientMessage(playerid, 0xE74C3CFF, "Invalid player ID.");
2097 if(id == playerid) return SendClientMessage(playerid, 0xE74C3CFF, "You're the owner, you can't take your keys.");
2098 if(!Iter_Contains(HouseKeys[id], houseid)) return SendClientMessage(playerid, 0xE74C3CFF, "That player doesn't have keys for this house.");
2099 Iter_Remove(HouseKeys[id], houseid);
2100
2101 new query[128];
2102 mysql_format(SQLHandle, query, sizeof(query), "DELETE FROM housekeys WHERE HouseID=%d AND Player='%e'", houseid, Player_GetName(id));
2103 mysql_tquery(SQLHandle, query, "", "");
2104
2105 format(query, sizeof(query), "You've taken keys from %s for this house.", Player_GetName(id));
2106 SendClientMessage(playerid, -1, query);
2107 format(query, sizeof(query), "House owner %s has taken your keys for their house %s.", HouseData[houseid][Owner], HouseData[houseid][Name]);
2108 SendClientMessage(id, -1, query);
2109 return 1;
2110}
2111
2112CMD:kickfromhouse(playerid, params[])
2113{
2114 if(InHouse[playerid] == INVALID_HOUSE_ID) return SendClientMessage(playerid, 0xE74C3CFF, "You're not in a house.");
2115 new id, houseid = InHouse[playerid];
2116 if(strcmp(HouseData[houseid][Owner], Player_GetName(playerid))) return SendClientMessage(playerid, 0xE74C3CFF, "You're not the owner of this house.");
2117 if(sscanf(params, "u", id)) return SendClientMessage(playerid, 0xE74C3CFF, "USAGE: /kickfromhouse [player id]");
2118 if(id == INVALID_PLAYER_ID) return SendClientMessage(playerid, 0xE74C3CFF, "Invalid player ID.");
2119 if(id == playerid) return SendClientMessage(playerid, 0xE74C3CFF, "You can't kick yourself from your house.");
2120 if(InHouse[id] != houseid) return SendClientMessage(playerid, 0xE74C3CFF, "That player isn't in your house.");
2121 SendClientMessage(playerid, -1, "Player kicked.");
2122 SendClientMessage(id, -1, "You got kicked by the house owner.");
2123 SetPVarInt(id, "HousePickupCooldown", gettime() + HOUSE_COOLDOWN);
2124 SetPlayerVirtualWorld(id, 0);
2125 SetPlayerInterior(id, 0);
2126 SetPlayerPos(id, HouseData[houseid][houseX], HouseData[houseid][houseY], HouseData[houseid][houseZ]);
2127 InHouse[id] = INVALID_HOUSE_ID;
2128 return 1;
2129}
2130
2131/* ============ Admin Commands ============ */
2132CMD:createhouse(playerid, params[])
2133{
2134 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "You can't use this command.");
2135 new interior, price;
2136 if(sscanf(params, "ii", price, interior)) return SendClientMessage(playerid, 0xE74C3CFF, "USAGE: /createhouse [price] [interior id]");
2137 if(!(0 <= interior <= sizeof(HouseInteriors)-1)) return SendClientMessage(playerid, 0xE74C3CFF, "Interior ID you entered does not exist.");
2138 new id = Iter_Free(Houses);
2139 if(id == -1) return SendClientMessage(playerid, 0xE74C3CFF, "You can't create more houses.");
2140 SetPVarInt(playerid, "HousePickupCooldown", gettime() + HOUSE_COOLDOWN);
2141 format(HouseData[id][Name], MAX_HOUSE_NAME, "House For Sale");
2142 format(HouseData[id][Owner], MAX_PLAYER_NAME, "-");
2143 format(HouseData[id][Password], MAX_HOUSE_PASSWORD, "-");
2144 GetPlayerPos(playerid, HouseData[id][houseX], HouseData[id][houseY], HouseData[id][houseZ]);
2145 HouseData[id][Price] = price;
2146 HouseData[id][Interior] = interior;
2147 HouseData[id][LockMode] = LOCK_MODE_NOLOCK;
2148 HouseData[id][SalePrice] = HouseData[id][SafeMoney] = HouseData[id][LastEntered] = 0;
2149 format(HouseData[id][Address], MAX_HOUSE_ADDRESS, "%d, %s, %s", id, GetZoneName(HouseData[id][houseX], HouseData[id][houseY], HouseData[id][houseZ]), GetCityName(HouseData[id][houseX], HouseData[id][houseY], HouseData[id][houseZ]));
2150 HouseData[id][Save] = true;
2151
2152 new label[200];
2153 format(label, sizeof(label), "{2ECC71}House For Sale (ID: %d)\n{FFFFFF}%s\n{F1C40F}Price: {2ECC71}$%s", id, HouseInteriors[interior][IntName], convertNumber(price));
2154 HouseData[id][HouseLabel] = CreateDynamic3DTextLabel(label, 0xFFFFFFFF, HouseData[id][houseX], HouseData[id][houseY], HouseData[id][houseZ]+0.35, 15.0, .testlos = 1);
2155 HouseData[id][HousePickup] = CreateDynamicPickup(1273, 1, HouseData[id][houseX], HouseData[id][houseY], HouseData[id][houseZ]);
2156 HouseData[id][HouseIcon] = CreateDynamicMapIcon(HouseData[id][houseX], HouseData[id][houseY], HouseData[id][houseZ], 31, 0);
2157
2158 new query[256];
2159 mysql_format(SQLHandle, query, sizeof(query), "INSERT INTO houses SET ID=%d, HouseX=%f, HouseY=%f, HouseZ=%f, HousePrice=%d, HouseInterior=%d", id, HouseData[id][houseX], HouseData[id][houseY], HouseData[id][houseZ], price, interior);
2160 mysql_tquery(SQLHandle, query, "", "");
2161 Iter_Add(Houses, id);
2162 return 1;
2163}
2164
2165CMD:gotohouse(playerid, params[])
2166{
2167 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "You can't use this command.");
2168 new id;
2169 if(sscanf(params, "i", id)) return SendClientMessage(playerid, 0xE74C3CFF, "USAGE: /gotohouse [house id]");
2170 if(!Iter_Contains(Houses, id)) return SendClientMessage(playerid, 0xE74C3CFF, "House ID you entered does not exist.");
2171 SetPVarInt(playerid, "HousePickupCooldown", gettime() + HOUSE_COOLDOWN);
2172 SetPlayerPos(playerid, HouseData[id][houseX], HouseData[id][houseY], HouseData[id][houseZ]);
2173 SetPlayerInterior(playerid, 0);
2174 SetPlayerVirtualWorld(playerid, 0);
2175 return 1;
2176}
2177
2178CMD:hsetinterior(playerid, params[])
2179{
2180 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "You can't use this command.");
2181 new id, interior;
2182 if(sscanf(params, "ii", id, interior)) return SendClientMessage(playerid, 0xE74C3CFF, "USAGE: /hsetinterior [house id] [interior id]");
2183 if(!Iter_Contains(Houses, id)) return SendClientMessage(playerid, 0xE74C3CFF, "House ID you entered does not exist.");
2184 if(!(0 <= interior <= sizeof(HouseInteriors)-1)) return SendClientMessage(playerid, 0xE74C3CFF, "Interior ID you entered does not exist.");
2185 HouseData[id][Interior] = interior;
2186
2187 new query[64];
2188 mysql_format(SQLHandle, query, sizeof(query), "UPDATE houses SET HouseInterior=%d WHERE ID=%d", interior, id);
2189 mysql_tquery(SQLHandle, query, "", "");
2190
2191 UpdateHouseLabel(id);
2192 SendClientMessage(playerid, -1, "Interior updated.");
2193 return 1;
2194}
2195
2196CMD:hsetprice(playerid, params[])
2197{
2198 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "You can't use this command.");
2199 new id, price;
2200 if(sscanf(params, "ii", id, price)) return SendClientMessage(playerid, 0xE74C3CFF, "USAGE: /hsetprice [house id] [price]");
2201 if(!Iter_Contains(Houses, id)) return SendClientMessage(playerid, 0xE74C3CFF, "House ID you entered does not exist.");
2202 HouseData[id][Price] = price;
2203
2204 new query[64];
2205 mysql_format(SQLHandle, query, sizeof(query), "UPDATE houses SET HousePrice=%d WHERE ID=%d", price, id);
2206 mysql_tquery(SQLHandle, query, "", "");
2207
2208 UpdateHouseLabel(id);
2209 SendClientMessage(playerid, -1, "Price updated.");
2210 return 1;
2211}
2212
2213CMD:resethouse(playerid, params[])
2214{
2215 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "You can't use this command.");
2216 new id;
2217 if(sscanf(params, "i", id)) return SendClientMessage(playerid, 0xE74C3CFF, "USAGE: /resethouse [house id]");
2218 if(!Iter_Contains(Houses, id)) return SendClientMessage(playerid, 0xE74C3CFF, "House ID you entered does not exist.");
2219 ResetHouse(id);
2220 SendClientMessage(playerid, -1, "House reset.");
2221 return 1;
2222}
2223
2224CMD:deletehouse(playerid, params[])
2225{
2226 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "You can't use this command.");
2227 new id;
2228 if(sscanf(params, "i", id)) return SendClientMessage(playerid, 0xE74C3CFF, "USAGE: /deletehouse [house id]");
2229 if(!Iter_Contains(Houses, id)) return SendClientMessage(playerid, 0xE74C3CFF, "House ID you entered does not exist.");
2230 ResetHouse(id);
2231 DestroyDynamic3DTextLabel(HouseData[id][HouseLabel]);
2232 DestroyDynamicPickup(HouseData[id][HousePickup]);
2233 DestroyDynamicMapIcon(HouseData[id][HouseIcon]);
2234 Iter_Remove(Houses, id);
2235 HouseData[id][HouseLabel] = Text3D: INVALID_3DTEXT_ID;
2236 HouseData[id][HousePickup] = HouseData[id][HouseIcon] = -1;
2237 HouseData[id][Save] = false;
2238
2239 new query[64];
2240 mysql_format(SQLHandle, query, sizeof(query), "DELETE FROM houses WHERE ID=%d", id);
2241 mysql_tquery(SQLHandle, query, "", "");
2242 SendClientMessage(playerid, -1, "House deleted.");
2243 return 1;
2244}