Advertisement
Guest User

Untitled

a guest
Jul 15th, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 44.21 KB | None | 0 0
  1. #include "YSI\y_hooks"
  2.  
  3. // Система домов
  4. #define MAX_HOUSE (100) // Кол-во домов на сервере
  5. #define INVALID_HOUSE_ID (-1) // ID дома по умолчанию
  6. #define INVALID_OWNER_ID (-1) // ID владельца по умолчанию
  7. #define INVALID_OWNER_NAME "Отсутствует" // Имя владельца по умолчанию
  8. #define MIN_HOUSE_PRICE (1) // Минимальная цена дома
  9. #define MAX_HOUSE_PRICE (10000000) // Максимальная цена дома
  10. #define MAX_HOUSE_CLASS (6) // Максимальное кол-во классов домов
  11. #define MAX_HOUSE_CLASS_TITLE (10) // Максимальное название классов домов
  12. #define SELL_HOUSE_PERCENT (50) // Проценты которые возвращаются за продажу дома
  13. #define TABLE_HOUSE "house" // Таблица с домами (MySQL)
  14. #define PRICE_HOUSE_RESET_VEHICLE_COORD (50) // Цена за подгон автомобиля к дому
  15. #define HOUSE_VALUE_DAY_LAST_LOGIN (5) // Количество дней, за которое слетит дом (с последней авторизации)
  16. #define DEFAULT_HOUSE_VEHICLE (471) // Стандартный автомобиль у дома (номер модели)
  17. #define DEFAULT_HOUSE_VEHICLE_COLOR_1 (0) // Стандартный цвет автомобилья (первый)
  18. #define DEFAULT_HOUSE_VEHICLE_COLOR_2 (1) // Стандартный цвет автомобилья (второй)
  19. #define HOUSE_UPDATE_CUPBOARD (1) // Номер улучшения, с корого будет доступен шкафчик >> HouseUpdate
  20.  
  21. // Улучшения для дома
  22. #define MAX_HOUSE_UPDATE (1) // Количество улучшений для дома
  23. #define MAX_HOUSE_UPDATE_TITLE (24) // Максимальное название улучшения
  24. #define MAX_HOUSE_UPDATE_DESCRIPTION (128) // Максимальная название описания улучшения
  25.  
  26. // Пикапы
  27. #define INVALID_PICKUP_ID (-1) // ID пикапа по умолчанию
  28.  
  29. // MapIcon
  30. #define INVALID_MAPICON_ID (-1) // ID MapIcon по умолчанию
  31.  
  32. // Массивы
  33. #define INVALID_ARRAY_ID (-1) // ID ячейки в массиве по умолчанию
  34.  
  35. // Чекпоинты
  36. #define INVALID_CP_ID (-1) // ID чекпоинта по умолчанию
  37.  
  38. // 3D текста
  39. #define MAX_DRAWN_DISTANCE (18.00) // Максимальная зона видимости 3D текста
  40.  
  41. enum
  42. house_info__ {
  43. H_ID, // ID дома
  44. H_OwnerID, // ID владельца
  45. H_OwnerName[MAX_PLAYER_NAME], // Имя владельца
  46. Float: H_EnterX, // Координата пикапа входа (X)
  47. Float: H_EnterY, // Координата пикапа входа (Y)
  48. Float: H_EnterZ, // Координата пикапа входа (Z)
  49. H_EnterPickupID, // ID пикапа под вход
  50. H_EnterButtonID, // ID кнопки под вход
  51. Float: H_ExitX, // Координата телепорта при выходе из дома (X)
  52. Float: H_ExitY, // Координата телепорта при выходе из дома (Y)
  53. Float: H_ExitZ, // Координата телепорта при выходе из дома (Z)
  54. Float: H_ExitAngle, // Угол поворота при выходе из дома
  55. H_ExitPickup, // ID пикапа под выход
  56. H_ExitButtonID, // ID пикапа под выход
  57. Float: H_VehicleX, // Координаты машины (X)
  58. Float: H_VehicleY, // Координаты машины (Y)
  59. Float: H_VehicleZ, // Координаты машины (Z)
  60. Float: H_VehicleAngle, // Угол поворота машины
  61. H_VehicleModel, // Номер модели автомобиля у дома
  62. H_VehicleColor_1, // Номер цвета автомобиля (первый)
  63. H_VehicleColor_2, // Номер цвета автомобиля (второй)
  64. H_VehicleID, // ID машины
  65. H_VehicleMapIcon, // ID мап-иконки автомобиля (поиск автомобиля)
  66. Float: H_DefaultVehicleX, // Координаты машины по умолчанию (X)
  67. Float: H_DefaultVehicleY, // Координаты машины по умолчанию (X)
  68. Float: H_DefaultVehicleZ, // Координаты машины по умолчанию (X)
  69. Float: H_DefaultVehicleAngle, // Угол поворота машины по умолчанию
  70. H_Price, // Цена дома
  71. H_Lock, // Состояние дверей (0 - закрыты | 1 - открыты)
  72. H_Class, // Номер класса дома (>> HouseClass)
  73. H_Update, // Уровень улучшений дома (>> HouseUpdate)
  74. H_MapIcon, // ID мап-иконки на миникарте
  75. H_CupBoardCP, // ID чекпоинта под шкаф
  76. Text3D: H_CupBoardLabel, // ID 3D текста под шкаф
  77. H_CupBoardButtonID // ID кнопки под шкаф
  78. };
  79.  
  80. static const
  81. NULL_HouseInfo[house_info__] = {
  82. INVALID_HOUSE_ID, // H_ID
  83. INVALID_OWNER_ID, // H_OwnerID
  84. INVALID_OWNER_NAME, // H_OwnerName
  85. 0.00, // H_EnterX
  86. 0.00, // H_EnterY
  87. 0.00, // H_EnterZ
  88. INVALID_PICKUP_ID, // H_EnterPickupID
  89. INVALID_BUTTON_ID, // H_EnterButtonID
  90. 0.00, // H_ExitX
  91. 0.00, // H_ExitY
  92. 0.00, // H_ExitZ
  93. 0.00, // H_ExitAngle
  94. INVALID_PICKUP_ID, // H_EnterPickupID
  95. INVALID_BUTTON_ID, // H_EnterButtonID
  96. 0.00, // H_VehicleX
  97. 0.00, // H_VehicleY
  98. 0.00, // H_VehicleZ
  99. 0.00, // H_VehicleAngle
  100. DEFAULT_HOUSE_VEHICLE, // H_VehicleModel
  101. DEFAULT_HOUSE_VEHICLE_COLOR_1, // H_VehicleColor_1
  102. DEFAULT_HOUSE_VEHICLE_COLOR_2, // H_VehicleColor_2
  103. INVALID_VEHICLE_ID, // H_VehicleID
  104. INVALID_MAPICON_ID, // H_VehicleMapIcon
  105. 0.00, // H_DefaultVehicleX
  106. 0.00, // H_DefaultVehicleY
  107. 0.00, // H_DefaultVehicleZ
  108. 0.00, // H_DefaultVehicleAngle
  109. MAX_HOUSE_PRICE, // H_Price
  110. 1, // H_Lock
  111. 1, // H_Class
  112. 1, // H_Update
  113. INVALID_MAPICON_ID, // H_MapIcon
  114. INVALID_CP_ID, // H_CupBoardCP
  115. Text3D: INVALID_3DTEXT_ID, // H_CupBoardLabel
  116. INVALID_BUTTON_ID // H_CupBoardButtonID
  117. };
  118.  
  119. new HouseInfo[MAX_HOUSE][house_info__];
  120. new
  121. Iterator:House<MAX_HOUSE>, // Итератор домов
  122. Iterator:HouseButtonEnter<MAX_HOUSE>, // Итератор пикапов входа в дома
  123. Iterator:HouseButtonExit<MAX_HOUSE>, // Итератор пикапов выхода из дома
  124. Iterator:HouseVehicle<MAX_HOUSE>; // Итератор домашних автомобилей
  125.  
  126. enum
  127. player_house_info__ {
  128. H_ID, // ID дома у игрока
  129. H_ArrayID // Номер ячейки в массиве (>> HouseInfo)
  130. };
  131. new PlayerHouseInfo[MAX_PLAYERS][player_house_info__];
  132.  
  133. static const
  134. NULL_PlayerHouseInfo[player_house_info__] = {
  135. INVALID_HOUSE_ID, // H_ID
  136. INVALID_ARRAY_ID // H_ArrayID
  137. };
  138.  
  139. enum
  140. house_class__ {
  141. HC_Title[MAX_HOUSE_CLASS_TITLE], // Название класса
  142. Float: HC_PickupX, // Координата пикапа выхода (X)
  143. Float: HC_PickupY, // Координата пикапа выхода (Y)
  144. Float: HC_PickupZ, // Координата пикапа выхода (Z)
  145. Float: HC_EnterX, // Координата телепорта при входе в дом (X)
  146. Float: HC_EnterY, // Координата телепорта при входе в дом (X)
  147. Float: HC_EnterZ, // Координата телепорта при входе в дом (X)
  148. Float: HC_EnterAngle, // Угол поворота при входе в дом
  149. HC_Inter, // ID Интерьера
  150. Float: HC_DefaultCupBoardX, // Координата шкафчика по умолчанию (X)
  151. Float: HC_DefaultCupBoardY, // Координата шкафчика по умолчанию (Y)
  152. Float: HC_DefaultCupBoardZ // Координата шкафчика по умолчанию (Z)
  153. };
  154.  
  155. enum
  156. house_update__ {
  157. HU_Title[MAX_HOUSE_UPDATE_TITLE], // Название улучшения
  158. HU_Description[MAX_HOUSE_UPDATE_DESCRIPTION], // Описание улучшения
  159. HU_Price // Цена улучшения
  160. };
  161.  
  162. static const
  163. HouseClass[MAX_HOUSE_CLASS][house_class__] = {
  164. {"Эконом",
  165. 243.7177, 304.9287, 999.1484, 244.7371, 304.9725, 999.1484, 270.000, 1,
  166. 248.8181, 303.8339, 999.1484
  167. },
  168. {"Доступный",
  169. 2259.3816, -1135.8602, 1050.6403, 2260.3860, -1135.7137, 1050.6328, 270.0000, 10,
  170. 2260.3894, -1139.0548, 1050.6328
  171. },
  172. {"Средний",
  173. 226.7883, 1239.9825, 1082.1406, 225.7504, 1239.9742, 1082.1406, 90.000, 2,
  174. 223.1192, 1249.3690, 1082.1406
  175. },
  176. {"Элитный",
  177. 318.5808, 1114.4803, 1083.8828, 318.6584, 1115.9277, 1083.8828, 360.000, 5,
  178. 308.2591, 1120.4374, 1083.8828
  179. },
  180. {"Премиум",
  181. 491.1681, 1398.5001, 1080.2578, 491.1647, 1399.6277, 1080.2645, 0.000, 2,
  182. 479.2784, 1411.2496, 1080.2714
  183. },
  184. {"Люкс",
  185. 2324.4434, -1149.5470, 1050.7101, 2324.2727, -1147.9423, 1050.7101, 0.00, 12,
  186. 2311.1663, -1135.9784, 1054.3047
  187. }
  188. },
  189. HouseUpdate[MAX_HOUSE_UPDATE][house_update__] = {
  190. {"Сейф", ""color_green"Описание сейфа??? Чтооооо, как это работаеееет!!!!"color_white"", 5000}
  191. };
  192.  
  193. /**
  194. * [House_OnGameModeInit слет и загрузка домов; использовать в OnGameModeInit]
  195. */
  196. House_OnGameModeInit() {
  197. for(new i = 0; i < MAX_HOUSE; i++) {
  198. /*
  199. Сброк массива HouseInfo
  200. на дефолтные значения
  201. */
  202. HouseInfo[i] = NULL_HouseInfo;
  203. }
  204.  
  205. for(new i = 0; i < MAX_PLAYERS; i++) {
  206. /*
  207. Сброс массива PlayerHouseInfo
  208. на дефолтные значения
  209. */
  210. PlayerHouseInfo[i] = NULL_PlayerHouseInfo;
  211. }
  212.  
  213. /*
  214. Запрос на слет домов, после его полного выполнения,
  215. будет вызвана автоматически загрузка домов
  216. */
  217. static const
  218. fmt_str_0[] =
  219. "SELECT \
  220. H.ID, \
  221. H.Price, \
  222. H.OwnerName \
  223. FROM \
  224. house H \
  225. LEFT OUTER JOIN \
  226. users U \
  227. ON \
  228. U.pName = H.OwnerName \
  229. WHERE \
  230. U.LastDate < CURRENT_DATE() - %i";
  231.  
  232. goto skip_array_init_fmt_str_0;
  233. new string_fmt_str_0[sizeof(fmt_str_0)
  234. + (- 2 + 3) // кол-во дней
  235. ];
  236. skip_array_init_fmt_str_0:
  237.  
  238. mysql_format(1, string_fmt_str_0, sizeof(string_fmt_str_0), fmt_str_0, HOUSE_VALUE_DAY_LAST_LOGIN);
  239. mysql_pquery(1, string_fmt_str_0, "@_AutoSaleHouse");
  240. return 1;
  241. }
  242.  
  243. @_AutoSaleHouse();
  244. @_AutoSaleHouse() {
  245. new
  246. rows = cache_num_rows(),
  247. sale_time = GetTickCount();
  248.  
  249. if(rows == 0) {
  250. print("(@_AutoSaleHouse) дома для слета отсутствуют");
  251. } else {
  252. new
  253. id,
  254. price,
  255. ownername[MAX_PLAYER_NAME];
  256.  
  257. for(new i = 0; i < rows; i++) {
  258. id = cache_get_field_content_int(i, !"ID");
  259. price = cache_get_field_content_int(i, !"Price");
  260. cache_get_field_content(i, !"OwnerName", ownername);
  261.  
  262. static const
  263. fmt_str_0[] =
  264. "UPDATE `house` SET `OwnerName`= NULL, `VehicleX` = 0.00, `VehicleY` = 0.00, `VehicleZ` = 0.00, `VehicleAngle` = 0.00, `VehicleModel` = %i, `VehicleColor_1` = %i, `VehicleColor_2` = %i, `Update` = 0, `Lock` = 0 WHERE ID = %i LIMIT 1",
  265. fmt_str_1[] =
  266. "UPDATE users SET pMoney = %i + (SELECT pMoney FROM (SELECT pMoney FROM users WHERE pName = '%e') AS t2) WHERE pName = '%e' LIMIT 1";
  267.  
  268. const
  269. string_size_fmt_str_0 = sizeof(fmt_str_0)
  270. + (- 2 + 3) // ID модели транспорта
  271. + (- 2 + 3) // ID первого цвета автомобиля
  272. + (- 2 + 3) // ID второго цвета автомобиля
  273. + (- 2 + 5), // ID дома
  274. string_size_fmt_str_1 = sizeof(fmt_str_1)
  275. + (- 2 + 11) // Сумма возврата
  276. + (- 2 + MAX_PLAYER_NAME) // Ник игрока
  277. + (- 2 + MAX_PLAYER_NAME); // Ник игрока
  278.  
  279. #if string_size_fmt_str_0 > string_size_fmt_str_1
  280. #define SIZE string_size_fmt_str_0
  281. #else
  282. #define SIZE string_size_fmt_str_1
  283. #endif
  284.  
  285. goto skip_array_init_fmt_str_0;
  286. new string[SIZE];
  287. skip_array_init_fmt_str_0:
  288.  
  289. #undef SIZE
  290.  
  291. mysql_format(1,
  292. string, sizeof(string),
  293. fmt_str_0,
  294. DEFAULT_HOUSE_VEHICLE,
  295. DEFAULT_HOUSE_VEHICLE_COLOR_1,
  296. DEFAULT_HOUSE_VEHICLE_COLOR_2,
  297. id
  298. );
  299. mysql_pquery(1, string);
  300.  
  301. new return_price = (price / 100) * SELL_HOUSE_PERCENT;
  302.  
  303. mysql_format(1,
  304. string, sizeof(string),
  305. fmt_str_1,
  306. return_price,
  307. ownername,
  308. ownername
  309.  
  310. );
  311. mysql_pquery(1, string);
  312.  
  313. printf("(@_AutoSaleHouse) => Дом № %i автоматически продан государству (Бывший владелец %s; Возвращенная сумм %i$)", id, ownername, return_price);
  314. }
  315. printf("(@_AutoSaleHouse) => Продано %i домов, за %i мс.", rows, GetTickCount() - sale_time);
  316. }
  317.  
  318. /*
  319. Запрос на загруку домов
  320. (лучше перечислять все поля, заместо
  321. SELECT * FROM)
  322. */
  323.  
  324. static const
  325. fmt_str_2[] =
  326. "SELECT \
  327. H.ID, \
  328. IF(ISNULL(H.OwnerName), \"%e\", H.OwnerName) AS OwnerName, \
  329. H.PickupX, \
  330. H.PickupY, \
  331. H.PickupZ, \
  332. H.ExitX, \
  333. H.ExitY, \
  334. H.ExitZ, \
  335. H.ExitAngle, \
  336. H.VehicleModel, \
  337. H.VehicleColor_1, \
  338. H.VehicleColor_2, \
  339. H.VehicleX, \
  340. H.VehicleY, \
  341. H.VehicleZ, \
  342. H.VehicleAngle, \
  343. H.DefaultVehicleX, \
  344. H.DefaultVehicleY, \
  345. H.DefaultVehicleZ, \
  346. H.DefaultVehicleAngle, \
  347. H.Class, \
  348. H.Price, \
  349. H.Update, \
  350. H.Lock, \
  351. IF(ISNULL(U.pID), %i, U.pID) as OwnerID \
  352. FROM \
  353. "TABLE_HOUSE" H \
  354. LEFT OUTER JOIN \
  355. users U \
  356. ON U.pName = H.OwnerName";
  357.  
  358. goto skip_array_init_fmt_str_2;
  359. new string_fmt_str_2[sizeof(fmt_str_2)
  360. + (- 2 + MAX_PLAYER_NAME) // Ник владельца
  361. + (- 2 + 2) // ID дома по умолчанию
  362. ];
  363. skip_array_init_fmt_str_2:
  364.  
  365. mysql_format(1,
  366. string_fmt_str_2, sizeof(string_fmt_str_2),
  367. fmt_str_2,
  368. INVALID_OWNER_NAME,
  369. INVALID_OWNER_ID
  370. );
  371. mysql_pquery(1, string_fmt_str_2, !"@_LoadHouse");
  372. }
  373.  
  374. /**
  375. * [@_LoadHouse загрузка домов (кэш mysql)]
  376. */
  377. @_LoadHouse();
  378. @_LoadHouse() {
  379. new
  380. rows = cache_num_rows(),
  381. load_time = GetTickCount();
  382.  
  383. if(rows == 0) {
  384. return print("(@_LoadHouse) => В базе данных отсутствуют дома для загрузки");
  385. } else {
  386. if(rows > MAX_HOUSE) {
  387. print("(@_LoadHouse) => Кол-во домов в базе данных превышает размер массива");
  388. printf("(@_LoadHouse) => rows = %i MAX_HOUSE = %i", rows, MAX_HOUSE);
  389. rows = MAX_HOUSE; // Перебиваем количество значений из базы данных
  390. }
  391.  
  392. for(new i = 0; i < rows; i++) {
  393. HouseInfo[i][H_ID] = cache_get_field_content_int(i, !"ID");
  394. cache_get_field_content(i, !"OwnerName", HouseInfo[i][H_OwnerName]);
  395. HouseInfo[i][H_OwnerID] = cache_get_field_content_int(i, !"OwnerID");
  396. HouseInfo[i][H_EnterX] = cache_get_field_content_float(i, !"PickupX");
  397. HouseInfo[i][H_EnterY] = cache_get_field_content_float(i, !"PickupY");
  398. HouseInfo[i][H_EnterZ] = cache_get_field_content_float(i, !"PickupZ");
  399.  
  400. HouseInfo[i][H_ExitX] = cache_get_field_content_float(i, !"ExitX");
  401. HouseInfo[i][H_ExitY] = cache_get_field_content_float(i, !"ExitY");
  402. HouseInfo[i][H_ExitZ] = cache_get_field_content_float(i, !"ExitZ");
  403. HouseInfo[i][H_ExitAngle] = cache_get_field_content_float(i, !"ExitAngle");
  404.  
  405. HouseInfo[i][H_VehicleModel] = cache_get_field_content_int(i, !"VehicleModel");
  406. if(!IS_IN_RANGE(HouseInfo[i][H_VehicleModel], 400, 610 + 1)) {
  407. printf("(@_LoadHouse) => Некорректный автомобиль (model %i) у дома № %i", HouseInfo[i][H_VehicleModel], HouseInfo[i][H_ID]);
  408. HouseInfo[i][H_VehicleModel] = DEFAULT_HOUSE_VEHICLE;
  409. }
  410. HouseInfo[i][H_VehicleColor_1] = cache_get_field_content_int(i, !"VehicleColor_1");
  411. if(!IS_IN_RANGE(HouseInfo[i][H_VehicleColor_1], 0, 255 + 1)) {
  412. printf("(@_LoadHouse) => Некорректный цвет автомобиля (color_1 %i) у дома № %i", HouseInfo[i][H_VehicleColor_1], HouseInfo[i][H_ID]);
  413. HouseInfo[i][H_VehicleColor_1] = DEFAULT_HOUSE_VEHICLE_COLOR_1;
  414. }
  415. HouseInfo[i][H_VehicleColor_2] = cache_get_field_content_int(i, !"VehicleColor_2");
  416. if(!IS_IN_RANGE(HouseInfo[i][H_VehicleColor_2], 0, 255 + 1)) {
  417. printf("(@_LoadHouse) => Некорректный цвет автомобиля (color_2 %i) у дома № %i", HouseInfo[i][H_VehicleColor_2], HouseInfo[i][H_ID]);
  418. HouseInfo[i][H_VehicleColor_2] = DEFAULT_HOUSE_VEHICLE_COLOR_2;
  419. }
  420.  
  421. HouseInfo[i][H_VehicleX] = cache_get_field_content_float(i, !"VehicleX");
  422. HouseInfo[i][H_VehicleY] = cache_get_field_content_float(i, !"VehicleY");
  423. HouseInfo[i][H_VehicleZ] = cache_get_field_content_float(i, !"VehicleZ");
  424. HouseInfo[i][H_VehicleAngle] = cache_get_field_content_float(i, !"VehicleAngle");
  425.  
  426. HouseInfo[i][H_DefaultVehicleX] = cache_get_field_content_float(i, !"DefaultVehicleX");
  427. HouseInfo[i][H_DefaultVehicleY] = cache_get_field_content_float(i, !"DefaultVehicleY");
  428. HouseInfo[i][H_DefaultVehicleZ] = cache_get_field_content_float(i, !"DefaultVehicleZ");
  429. HouseInfo[i][H_DefaultVehicleAngle] = cache_get_field_content_float(i, !"DefaultVehicleAngle");
  430.  
  431. HouseInfo[i][H_Price] = cache_get_field_content_int(i, !"Price");
  432. HouseInfo[i][H_Lock] = cache_get_field_content_int(i, !"Lock");
  433. HouseInfo[i][H_Class] = cache_get_field_content_int(i, !"Class");
  434.  
  435. HouseInfo[i][H_Update] = cache_get_field_content_int(i, !"Update");
  436.  
  437. new houseclass = HouseInfo[i][H_Class] - 1;
  438.  
  439. if(HouseInfo[i][H_Update] >= HOUSE_UPDATE_CUPBOARD) {
  440. HouseInfo[i][H_CupBoardCP] = CreateDynamicCP(
  441. HouseClass[houseclass][HC_DefaultCupBoardX], HouseClass[houseclass][HC_DefaultCupBoardY], HouseClass[houseclass][HC_DefaultCupBoardZ],
  442. 0.8, MAX_HOUSE + HouseInfo[i][H_ID], HouseClass[houseclass][HC_Inter]
  443. );
  444. HouseInfo[i][H_CupBoardLabel] = CreateDynamic3DTextLabel("Шкаф", COLOR_BLUE,
  445. HouseClass[houseclass][HC_DefaultCupBoardX], HouseClass[houseclass][HC_DefaultCupBoardY], HouseClass[houseclass][HC_DefaultCupBoardZ],
  446. MAX_DRAWN_DISTANCE, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 1,
  447. MAX_HOUSE + HouseInfo[i][H_ID], HouseClass[houseclass][HC_Inter]
  448. );
  449. HouseInfo[i][H_CupBoardButtonID] = CreateButton(
  450. HouseClass[houseclass][HC_DefaultCupBoardX], HouseClass[houseclass][HC_DefaultCupBoardY], HouseClass[houseclass][HC_DefaultCupBoardZ],
  451. "PRESS KEY ~g~~h~F/Enter",
  452. MAX_HOUSE + HouseInfo[i][H_ID], HouseClass[houseclass][HC_Inter]
  453. );
  454. }
  455.  
  456. if(HouseInfo[i][H_Price] > MAX_HOUSE_PRICE) {
  457. HouseInfo[i][H_Price] = MAX_HOUSE_PRICE;
  458. printf("(@_LoadHouse) => Цена дома %i больше максимальной (MAX_HOUSE_PRICE = %i). Текущая цена %i$", HouseInfo[i][H_ID], MAX_HOUSE_PRICE, HouseInfo[i][H_Price]);
  459. }
  460. if(HouseInfo[i][H_Price] < MIN_HOUSE_PRICE) {
  461. HouseInfo[i][H_Price] = MIN_HOUSE_PRICE;
  462. printf("(@_LoadHouse) => Цена дома %i меньше минимальной (MIN_HOUSE_PRICE = %i). Текущая цена %i$", HouseInfo[i][H_ID], MIN_HOUSE_PRICE, HouseInfo[i][H_Price]);
  463. }
  464. HouseInfo[i][H_EnterPickupID] = CreateDynamicPickup(
  465. (HouseInfo[i][H_OwnerID] != INVALID_OWNER_ID) ? (19524) : (1273), 23,
  466. HouseInfo[i][H_EnterX], HouseInfo[i][H_EnterY], HouseInfo[i][H_EnterZ],
  467. MAX_LOBBY + 1, 0
  468. );
  469. HouseInfo[i][H_EnterButtonID] = CreateButton(
  470. HouseInfo[i][H_EnterX], HouseInfo[i][H_EnterY], HouseInfo[i][H_EnterZ],
  471. "PRESS KEY ~g~~h~F/Enter", MAX_LOBBY + 1, 0
  472. );
  473. HouseInfo[i][H_MapIcon] = CreateDynamicMapIcon(
  474. HouseInfo[i][H_EnterX], HouseInfo[i][H_EnterY], HouseInfo[i][H_EnterZ],
  475. (HouseInfo[i][H_OwnerID] != INVALID_OWNER_ID) ? (32) : (31), -1,
  476. MAX_LOBBY + 1, 0
  477. );
  478. HouseInfo[i][H_ExitPickup] = CreateDynamicPickup(19132, 23,
  479. HouseClass[houseclass][HC_PickupX], HouseClass[houseclass][HC_PickupY], HouseClass[houseclass][HC_PickupZ],
  480. MAX_HOUSE + HouseInfo[i][H_ID], HouseClass[houseclass][HC_Inter]
  481. );
  482. HouseInfo[i][H_ExitButtonID] = CreateButton(
  483. HouseClass[houseclass][HC_PickupX], HouseClass[houseclass][HC_PickupY], HouseClass[houseclass][HC_PickupZ],
  484. "PRESS KEY ~g~~h~F/Enter",
  485. MAX_HOUSE + HouseInfo[i][H_ID], HouseClass[houseclass][HC_Inter]
  486. );
  487. new houseid = Iter_Free(House);
  488. Iter_Add(House, houseid);
  489. Iter_Add(HouseButtonEnter, HouseInfo[i][H_EnterButtonID]);
  490. Iter_Add(HouseButtonExit, HouseInfo[i][H_EnterButtonID]);
  491. }
  492. }
  493. return printf("(@_LoadHouse) => загруженно %i домов, за %i мс.", rows, GetTickCount() - load_time);
  494. }
  495. hook OnGameModeExit() {
  496. printf("(OnGameModeExit) вызван");
  497. }
  498.  
  499. hook OnPlayerDisconnect(playerid, reason) {
  500. printf("(OnPlayerDisconnect) вызван");
  501. if(PlayerHouseInfo[playerid][H_ID] != INVALID_HOUSE_ID) {
  502. new arrayid = PlayerHouseInfo[playerid][H_ArrayID];
  503. if(HouseInfo[arrayid][H_VehicleMapIcon] != INVALID_MAPICON_ID && IsValidDynamicMapIcon(HouseInfo[arrayid][H_VehicleMapIcon])) {
  504. DestroyDynamicMapIcon(HouseInfo[arrayid][H_VehicleMapIcon]);
  505. }
  506. SaveVehiclePosition(PlayerHouseInfo[playerid][H_ArrayID]);
  507. }
  508. }
  509. /**
  510. * [OnButtonPress нажатие на кнопку домов]
  511. * @param {int} playerid {ID игрока}
  512. * @param {int} buttonid {ID кнопки}
  513. */
  514. public OnButtonPress(playerid, buttonid) {
  515. foreach(new i:House) {
  516. if(buttonid == HouseInfo[i][H_EnterButtonID]) {
  517. SetPVarInt(playerid, "house_array", i);
  518. if(HouseInfo[i][H_OwnerID] == INVALID_OWNER_ID) {
  519. return Dialog_Show(playerid, Dialog:DIALOG_BUY_HOUSE);
  520. } else {
  521. return Dialog_Show(playerid, Dialog:DIALOG_HOUSE_INFO);
  522. }
  523. } else if(buttonid == HouseInfo[i][H_ExitButtonID]) {
  524. new
  525. inter = GetPlayerInterior(playerid),
  526. world = GetPlayerVirtualWorld(playerid) - MAX_HOUSE;
  527.  
  528. if(HouseInfo[i][H_ID] == world) {
  529. new houseclass = HouseInfo[i][H_Class] - 1;
  530. if(HouseClass[houseclass][HC_Inter] == inter) {
  531. SetPlayerPos(playerid, HouseInfo[i][H_ExitX], HouseInfo[i][H_ExitY], HouseInfo[i][H_ExitZ]);
  532. SetPlayerFacingAngle(playerid, HouseInfo[i][H_ExitAngle]);
  533. SetPlayerInterior(playerid, 0);
  534. SetPlayerVirtualWorld(playerid, MAX_LOBBY + 1);
  535. return SetCameraBehindPlayer(playerid);
  536. }
  537. }
  538. } else if(buttonid == HouseInfo[i][H_CupBoardButtonID]) {
  539. if(HouseInfo[i][H_OwnerID] == playerAccID[playerid]) {
  540. return Dialog_Show(playerid, Dialog:DIALOG_HOUSE_CUPBOARD);
  541. } else {
  542. return SendErrorMessage(playerid, "Вам недоступен домашний шкаф этого дома.");
  543. }
  544. }
  545. }
  546. return 0;
  547. }
  548.  
  549. /**
  550. * [GetPlayerHouse перегонка значений из HouseInfo в PlayerHouseInfo]
  551. * @param {int} playerid {ID игрока}
  552. * @param {int} creave_hehicle {0 - не создавать машину у дома; 1 - создать}
  553. */
  554. stock GetPlayerHouse(playerid, creave_hehicle = 0) {
  555. new account_id = playerAccID[playerid];
  556.  
  557. foreach(new i:House) {
  558. if(HouseInfo[i][H_OwnerID] == account_id) {
  559. PlayerHouseInfo[playerid][H_ID] = HouseInfo[i][H_ID];
  560. PlayerHouseInfo[playerid][H_ArrayID] = i;
  561. if(creave_hehicle == 1) {
  562. CreateVehicleForHouse(i);
  563. }
  564. break;
  565. }
  566. }
  567. }
  568.  
  569. /**
  570. * [ResetPlayerHouse сброс сброк массива PlayerHouseInfo на дефолтные значения]
  571. * @param {int} playerid {ID игрока}
  572. */
  573. stock ResetPlayerHouse(playerid) {
  574. if(PlayerHouseInfo[playerid][H_ID] != INVALID_HOUSE_ID) {
  575. DestroyVehicle(HouseInfo[PlayerHouseInfo[playerid][H_ArrayID]][H_VehicleID]);
  576. }
  577. return PlayerHouseInfo[playerid] = NULL_PlayerHouseInfo;
  578. }
  579.  
  580. DialogCreate:DIALOG_BUY_HOUSE(playerid) {
  581. new arrayid = GetPVarInt(playerid, "house_array");
  582.  
  583. static const
  584. fmt_str_0[] =
  585. ""color_white"\\cОсновная информация о доме\n\n\
  586. \\cНомер дома: "color_green"%i"color_white"\n\
  587. \\cЦена: "color_green"%i$"color_white"\n\
  588. \\cКласс: "color_green"%s"color_white"";
  589.  
  590. goto skip_array_init_fmt_str_0;
  591. new string[sizeof(fmt_str_0)
  592. + (- 2 + 5) // номер дома
  593. + (- 2 + 11) // цена дома
  594. + (- 2 + MAX_HOUSE_CLASS_TITLE)
  595. ];
  596. skip_array_init_fmt_str_0:
  597.  
  598. format(string, sizeof(string), fmt_str_0, HouseInfo[arrayid][H_ID], HouseInfo[arrayid][H_Price], HouseClass[HouseInfo[arrayid][H_Class] - 1][HC_Title]);
  599.  
  600. return Dialog_Open(playerid, Dialog:DIALOG_BUY_HOUSE, DIALOG_STYLE_MSGBOX,
  601. !""color_blue"Недвижимость",
  602. string,
  603. !"Купить", !"Закрыть"
  604. );
  605. }
  606.  
  607. DialogResponse:DIALOG_BUY_HOUSE(playerid, response, listitem, inputtext[]) {
  608. if(!response) {
  609. return DeletePVar(playerid, "house_array");
  610. } else {
  611. if(PlayerHouseInfo[playerid][H_ID] != INVALID_HOUSE_ID) {
  612. SendErrorMessage(playerid, "У вас уже есть дома. Покупка второго невозможна.");
  613. return SendInfoMessage(playerid, "Для продажи дома используйте "color_green"/house -> Продать дом");
  614. }
  615. new
  616. arrayid = GetPVarInt(playerid, "house_array");
  617.  
  618. DeletePVar(playerid, "house_array");
  619.  
  620. if(IS_IN_RANGE(HouseInfo[arrayid][H_Price], 1, MAX_HOUSE_PRICE + 1)) {
  621. if(playerMoney[playerid] < HouseInfo[arrayid][H_Price]) {
  622. return SendErrorMessage(playerid, "У вас недостаточно денег для покупки дома.");
  623. }
  624. playerMoney[playerid] = playerMoney[playerid] - HouseInfo[arrayid][H_Price];
  625. ResetPlayerMoney(playerid);
  626. GivePlayerMoney(playerid, playerMoney[playerid]);
  627. HouseInfo[arrayid][H_OwnerID] = playerAccID[playerid];
  628. strmid(HouseInfo[arrayid][H_OwnerName], pInfo[playerid][Name], 0, strlen(pInfo[playerid][Name]));
  629.  
  630. static const
  631. fmt_str_0[] = "UPDATE "TABLE_HOUSE" SET `OwnerName` = '%e' WHERE ID = %i LIMIT 1";
  632.  
  633. goto skip_array_init_fmt_str_0;
  634. new string[sizeof(fmt_str_0)
  635. + (- 2 + MAX_PLAYER_NAME)
  636. + (- 2 + 5)
  637. ];
  638. skip_array_init_fmt_str_0:
  639.  
  640. GetPlayerHouse(playerid, 1);
  641.  
  642. Streamer_SetIntData(STREAMER_TYPE_PICKUP, HouseInfo[arrayid][H_EnterPickupID], E_STREAMER_MODEL_ID, 19524);
  643.  
  644. mysql_format(1, string, sizeof(string), fmt_str_0, pInfo[playerid][Name], HouseInfo[arrayid][H_ID]);
  645. mysql_tquery(1, string);
  646. SendInfoMessage(playerid, "Вы успешно купили дом. Используйте команду "color_green"/house"color_white" для управления домом.");
  647. return SendInfoMessage(playerid, "Ваш дом автоматически будет продан, если вы долго не будете заходить в игру.");
  648. }
  649. }
  650. return 1;
  651. }
  652.  
  653. DialogCreate:DIALOG_HOUSE_INFO(playerid) {
  654. new arrayid = GetPVarInt(playerid, "house_array");
  655.  
  656. static const
  657. fmt_str_0[] =
  658. ""color_white"\\cОсновная информация о доме\n\n\
  659. \\cНомер дома: "color_green"%i"color_white"\n\
  660. \\cЦена: "color_green"%i$"color_white"\n\
  661. \\cКласс: "color_green"%s"color_white"\n\
  662. \\cВладелец: "color_green"%s"color_white"\n\
  663. \\cДвери: %s"color_white"";
  664.  
  665. goto skip_array_init_fmt_str_0;
  666. new string[sizeof(fmt_str_0)
  667. + (- 2 + 5) // номер дома
  668. + (- 2 + 11) // цена дома
  669. + (- 2 + MAX_HOUSE_CLASS_TITLE)
  670. + (- 2 + MAX_PLAYER_NAME) // владелец
  671. + (- 2 + 16) // двери + цветовое выделение
  672. ];
  673. skip_array_init_fmt_str_0:
  674.  
  675. format(string, sizeof(string), fmt_str_0,
  676. HouseInfo[arrayid][H_ID],
  677. HouseInfo[arrayid][H_Price],
  678. HouseClass[HouseInfo[arrayid][H_Class] - 1][HC_Title],
  679. HouseInfo[arrayid][H_OwnerName],
  680. (HouseInfo[arrayid][H_Lock] == 0) ? (""color_green"Открыты") : (""color_red"Закрыты")
  681. );
  682. return Dialog_Open(playerid, Dialog:DIALOG_HOUSE_INFO, DIALOG_STYLE_MSGBOX,
  683. !""color_blue"Недвижимость",
  684. string,
  685. !"Войти", !"Закрыть"
  686. );
  687. }
  688.  
  689. DialogResponse:DIALOG_HOUSE_INFO(playerid, response, listitem, inputtext[]) {
  690. if(!response) {
  691. return DeletePVar(playerid, "house_array");
  692. } else {
  693. new
  694. arrayid = GetPVarInt(playerid, "house_array");
  695.  
  696. DeletePVar(playerid, "house_array");
  697.  
  698. if(HouseInfo[arrayid][H_Lock] == 1 && HouseInfo[arrayid][H_OwnerID] != playerAccID[playerid]) {
  699. return SendErrorMessage(playerid, "Дом закрыт.");
  700. } else {
  701. new houseclass = HouseInfo[arrayid][H_Class] - 1;
  702.  
  703. SetPlayerPos(playerid, HouseClass[houseclass][HC_EnterX], HouseClass[houseclass][HC_EnterY], HouseClass[houseclass][HC_EnterZ]);
  704. SetPlayerFacingAngle(playerid, HouseClass[houseclass][HC_EnterAngle]);
  705. SetPlayerInterior(playerid, HouseClass[houseclass][HC_Inter]);
  706. SetPlayerVirtualWorld(playerid, MAX_HOUSE + HouseInfo[arrayid][H_ID]);
  707. }
  708. return 1;
  709. }
  710. }
  711.  
  712. /**
  713. * [house команда управления домом]
  714. * @param {int} playerid {ID игрока}
  715. * @param {string} params[] {-}
  716. */
  717. CMD:house(playerid, params[]) {
  718. if(PlayerHouseInfo[playerid][H_ID] == INVALID_HOUSE_ID) {
  719. return SendClientMessage(playerid, COLOR_WHITE, !"У вас нет дома.");
  720. }
  721.  
  722. return Dialog_Show(playerid, Dialog:DIALOG_CMD_HOUSE);
  723. }
  724.  
  725. DialogCreate:DIALOG_CMD_HOUSE(playerid) {
  726. static const
  727. fmt_str_0[] =
  728. ""color_white"Продать дом\n\
  729. Список улучшений\n\
  730. %s"color_white" двери\n\
  731. Отметить транспорт на GPS\n\
  732. Подогнать транспорт к дому";
  733.  
  734.  
  735. goto skip_array_init_fmt_str_0;
  736. new string[sizeof(fmt_str_0)
  737. + (- 2 + 7 + 14) // 7 - открыть/закрыть; 14 - цветовое выделение
  738. ];
  739. skip_array_init_fmt_str_0:
  740.  
  741. new arrayid = PlayerHouseInfo[playerid][H_ArrayID];
  742.  
  743. format(string, sizeof(string),
  744. fmt_str_0,
  745. (HouseInfo[arrayid][H_Lock] == 0) ? (""color_red"Закрыть") : (""color_green"Открыть")
  746. );
  747.  
  748. return Dialog_Open(playerid, Dialog:DIALOG_CMD_HOUSE, DIALOG_STYLE_LIST,
  749. !""color_blue"Недвижимость",
  750. string,
  751. !"Выбрать", !"Закрыть"
  752. );
  753. }
  754.  
  755. DialogResponse:DIALOG_CMD_HOUSE(playerid, response, listitem, inputtext[]) {
  756. if(!response) {
  757. return 1;
  758. } else {
  759. if(PlayerHouseInfo[playerid][H_ID] == INVALID_HOUSE_ID) {
  760. return SendClientMessage(playerid, COLOR_WHITE, !"У вас нет дома.");
  761. }
  762.  
  763. new arrayid = PlayerHouseInfo[playerid][H_ArrayID];
  764.  
  765. if(listitem == 0) {
  766. return Dialog_Show(playerid, Dialog:DIALOG_SELL_HOUSE);
  767. } else if(listitem == 1) {
  768. return Dialog_Show(playerid, Dialog:DIALOG_UPDATE_HOUSE);
  769. } else if(listitem == 2) {
  770. HouseInfo[arrayid][H_Lock] = !HouseInfo[arrayid][H_Lock];
  771.  
  772. if(HouseInfo[arrayid][H_Lock] == 1) {
  773. SendInfoMessage(playerid, "Вы "color_red"закрыли"color_white" входные двери вашего домаю");
  774. } else {
  775. SendInfoMessage(playerid, "Вы "color_green"открыли"color_white" входные двери вашего дома.");
  776. }
  777.  
  778. static const
  779. fmt_str_0[] =
  780. "UPDATE "TABLE_HOUSE" SET `Lock` = %i WHERE `ID` = %i LIMIT 1";
  781.  
  782. goto skip_array_init_fmt_str_0;
  783. new string[sizeof(fmt_str_0)
  784. + (- 2 + 1) // состояние дверей
  785. + (- 2 + 5) // ID дома
  786. ];
  787. skip_array_init_fmt_str_0:
  788.  
  789. mysql_format(1,
  790. string, sizeof(string),
  791. fmt_str_0,
  792. HouseInfo[arrayid][H_Lock],
  793. HouseInfo[arrayid][H_ID]
  794. );
  795. printf(string);
  796. return mysql_pquery(1, string);
  797. } else if(listitem == 3) {
  798. if(IsValidDynamicMapIcon(HouseInfo[arrayid][H_VehicleMapIcon]) == 1) {
  799. DestroyDynamicMapIcon(HouseInfo[arrayid][H_VehicleMapIcon]);
  800. return SendInfoMessage(playerid, "Отметка автомобиля была скрыта с мини-карты.");
  801. }
  802.  
  803. new
  804. Float: vehicle_pos_x,
  805. Float: vehicle_pos_y,
  806. Float: vehicle_pos_z;
  807.  
  808. GetVehiclePos(HouseInfo[arrayid][H_VehicleID], vehicle_pos_x, vehicle_pos_y, vehicle_pos_z);
  809. HouseInfo[arrayid][H_VehicleMapIcon] = CreateDynamicMapIcon(
  810. vehicle_pos_x, vehicle_pos_y, vehicle_pos_z,
  811. 55, -1, MAX_LOBBY + 1, 0,
  812. .style = MAPICON_GLOBAL_CHECKPOINT
  813. );
  814. SendInfoMessage(playerid, "Ваш автомобиль был отмечен на мини-карте в виде "color_green"значка автомобиля.");
  815. return SendInfoMessage(playerid, "Для того чтобы скрыть иконку с мини-карты, повтороно используйте: "color_green"/house -> Отметить транспорт на GPS");
  816. } else if(listitem == 4) {
  817. return Dialog_Show(playerid, Dialog:DIALOG_RESET_VEHICLE_COORD);
  818. }
  819. }
  820. return 1;
  821. }
  822.  
  823. DialogCreate:DIALOG_SELL_HOUSE(playerid) {
  824. if(PlayerHouseInfo[playerid][H_ID] == INVALID_HOUSE_ID) {
  825. return SendClientMessage(playerid, COLOR_WHITE, !"У вас нет дома.");
  826. }
  827.  
  828. static const
  829. fmt_str_0[] =
  830. "\\c"color_white"Вы уверен, что хотите продать свой дом?\n\n\
  831. "color_orange"Вам будет возвращенно %i%% от его стоимости "color_green"(%i$)";
  832.  
  833. goto skip_array_init_fmt_str_0;
  834. new string[sizeof(fmt_str_0)
  835. + (- 2 + 5)
  836. + (- 2 + 11)
  837. ];
  838. skip_array_init_fmt_str_0:
  839.  
  840. Streamer_SetIntData(STREAMER_TYPE_PICKUP, HouseInfo[PlayerHouseInfo[playerid][H_ArrayID]][H_EnterPickupID], E_STREAMER_MODEL_ID, 1273);
  841.  
  842. format(string, sizeof(string), fmt_str_0, SELL_HOUSE_PERCENT, (HouseInfo[PlayerHouseInfo[playerid][H_ArrayID]][H_Price] / 100) * SELL_HOUSE_PERCENT);
  843. return Dialog_Open(playerid, Dialog:DIALOG_SELL_HOUSE, DIALOG_STYLE_MSGBOX,
  844. !""color_blue"Продажа дома",
  845. string,
  846. !"Нет", !"Да"
  847. );
  848. }
  849.  
  850. DialogResponse:DIALOG_SELL_HOUSE(playerid, response, listitem, inputtext[]) {
  851. if(!response) {
  852. if(PlayerHouseInfo[playerid][H_ID] == INVALID_HOUSE_ID) {
  853. return SendClientMessage(playerid, COLOR_WHITE, !"У вас нет дома.");
  854. }
  855.  
  856. new arrayid = PlayerHouseInfo[playerid][H_ArrayID];
  857. HouseInfo[arrayid][H_OwnerID] = INVALID_OWNER_ID;
  858. strmid(HouseInfo[arrayid][H_OwnerName], INVALID_OWNER_NAME, 0, strlen(INVALID_OWNER_NAME));
  859.  
  860. playerMoney[playerid] = playerMoney[playerid] + (HouseInfo[arrayid][H_Price] / 100) * SELL_HOUSE_PERCENT;
  861. ResetPlayerMoney(playerid);
  862. GivePlayerMoney(playerid, playerMoney[playerid]);
  863. static const
  864. fmt_str_0[] = "UPDATE "TABLE_HOUSE" SET `OwnerName`= NULL, `VehicleX` = 0.00, `VehicleY` = 0.00, `VehicleZ` = 0.00, `VehicleAngle` = 0.00, `VehicleModel` = %i, `VehicleColor_1` = %i, `VehicleColor_2` = %i, `Update` = 0, `Lock` = 0 WHERE ID = %i LIMIT 1";
  865.  
  866. goto skip_array_init_fmt_str_0;
  867. new string[sizeof(fmt_str_0)
  868. + (- 2 + 3) // ID модели транспорта
  869. + (- 2 + 3) // ID первого цвета автомобиля
  870. + (- 2 + 3) // ID второго цвета автомобиля
  871. + (- 2 + 5) // ID дома
  872. ];
  873. skip_array_init_fmt_str_0:
  874.  
  875. mysql_format(1,
  876. string, sizeof(string),
  877. fmt_str_0,
  878. DEFAULT_HOUSE_VEHICLE,
  879. DEFAULT_HOUSE_VEHICLE_COLOR_1,
  880. DEFAULT_HOUSE_VEHICLE_COLOR_2,
  881. HouseInfo[arrayid][H_ID]
  882. );
  883. mysql_tquery(1, string);
  884.  
  885. SendInfoMessage(playerid, "Вы успешно продали свой дом!");
  886. return ResetPlayerHouse(playerid);
  887. } else {
  888. return Dialog_Show(playerid, Dialog:DIALOG_CMD_HOUSE);
  889. }
  890. }
  891.  
  892. DialogCreate:DIALOG_UPDATE_HOUSE(playerid) {
  893. if(PlayerHouseInfo[playerid][H_ID] == INVALID_HOUSE_ID) {
  894. return SendClientMessage(playerid, COLOR_WHITE, !"У вас нет дома.");
  895. }
  896.  
  897. new arrayid = PlayerHouseInfo[playerid][H_ArrayID];
  898.  
  899. static const
  900. fmt_str_0[] =
  901. !"Название\tОписание\tЦена\tСтатус\n";
  902.  
  903. goto skip_array_init_fmt_str_0;
  904. new
  905. string_0[sizeof(fmt_str_0)
  906. + ((MAX_HOUSE_UPDATE * (MAX_HOUSE_CLASS_TITLE + MAX_HOUSE_UPDATE_DESCRIPTION)) / 4)
  907. ],
  908. string_1[MAX_HOUSE_UPDATE_TITLE + MAX_HOUSE_UPDATE_DESCRIPTION + 1];
  909. skip_array_init_fmt_str_0:
  910.  
  911. string_0 = fmt_str_0;
  912.  
  913. for(new i = 0; i < MAX_HOUSE_UPDATE; i++) {
  914. format(string_1, sizeof(string_1),
  915. "%s\t%s\t%i\t%s\n",
  916. HouseUpdate[i][HU_Title],
  917. HouseUpdate[i][HU_Description],
  918. HouseUpdate[i][HU_Price],
  919. (HouseInfo[arrayid][H_Update] >= i) ? ("Куплено") : ("Не куплено")
  920. );
  921. strcat(string_0, string_1);
  922. }
  923.  
  924.  
  925. return Dialog_Open(playerid, Dialog:DIALOG_UPDATE_HOUSE, DIALOG_STYLE_TABLIST_HEADERS,
  926. !""color_blue"Улучшения дома",
  927. string_0,
  928. !"Выбрать", !"Закрыть"
  929. );
  930. }
  931.  
  932. DialogResponse:DIALOG_UPDATE_HOUSE(playerid, response, listitem, inputtext[]) {
  933. if(!response) {
  934. return Dialog_Show(playerid, Dialog:DIALOG_CMD_HOUSE);
  935. } else {
  936. if(PlayerHouseInfo[playerid][H_ID] == INVALID_HOUSE_ID) {
  937. return SendClientMessage(playerid, COLOR_WHITE, !"У вас нет дома.");
  938. }
  939.  
  940. new arrayid = PlayerHouseInfo[playerid][H_ArrayID];
  941. if(HouseInfo[arrayid][H_Update] >= listitem + 1) {
  942. return SendClientMessage(playerid, COLOR_WHITE, !"У вас куплено уже это улучшение.");
  943. }
  944.  
  945. new price = HouseUpdate[listitem][HU_Price];
  946. if(playerMoney[playerid] < price) {
  947. return SendClientMessage(playerid, COLOR_WHITE, !"У вас недостаточно денег для покупки улучшения");
  948. }
  949. playerMoney[playerid] = playerMoney[playerid] - price;
  950. ResetPlayerMoney(playerid);
  951. GivePlayerMoney(playerid, playerMoney[playerid]);
  952.  
  953. static const
  954. fmt_str_0[] = "UPDATE "TABLE_HOUSE" SET `Update` = %i WHERE ID = %i LIMIT 1",
  955. fmt_str_1[] = "Вы купили улучшение "color_green"%s"color_white" за "color_green"%i$";
  956.  
  957. const
  958. string_size_fmt_str_0 = sizeof(fmt_str_0)
  959. + (- 2 + 3) // Уровень улучшений
  960. + (- 2 + 5), // ID дома
  961. string_size_fmt_str_1 = sizeof(fmt_str_1)
  962. + (- 2 + MAX_HOUSE_UPDATE_TITLE) // Название улучшения
  963. + (- 2 + 7); // Цена улучшения
  964.  
  965. #if string_size_fmt_str_0 > string_size_fmt_str_1
  966. #define SIZE string_size_fmt_str_0
  967. #else
  968. #define SIZE string_size_fmt_str_1
  969. #endif
  970.  
  971. goto skip_array_init_fmt_str_0;
  972. new string[SIZE];
  973. skip_array_init_fmt_str_0:
  974.  
  975. #undef SIZE
  976.  
  977. mysql_format(1,
  978. string, sizeof(string),
  979. fmt_str_0,
  980. listitem + 1,
  981. PlayerHouseInfo[playerid][H_ID]
  982. );
  983. mysql_tquery(1, string);
  984.  
  985. format(string, sizeof(string),
  986. fmt_str_1,
  987. HouseUpdate[listitem][HU_Title],
  988. price
  989. );
  990. return SendClientMessage(playerid, COLOR_WHITE, string);
  991. }
  992. }
  993.  
  994. /**
  995. * [CreateVehicleForHouse создает машину у дома игрока]
  996. * @param {int} arrayid {номер ячейки >> HouseInfo}
  997. */
  998. stock CreateVehicleForHouse(arrayid) {
  999. if(floatcmp(HouseInfo[arrayid][H_VehicleX], 0.000000) == 0) {
  1000. HouseInfo[arrayid][H_VehicleID] = CreateVehicle(HouseInfo[arrayid][H_VehicleModel],
  1001. HouseInfo[arrayid][H_DefaultVehicleX], HouseInfo[arrayid][H_DefaultVehicleY], HouseInfo[arrayid][H_DefaultVehicleZ],
  1002. HouseInfo[arrayid][H_DefaultVehicleAngle],
  1003. HouseInfo[arrayid][H_VehicleColor_1], HouseInfo[arrayid][H_VehicleColor_2], 6000
  1004. );
  1005. } else {
  1006. HouseInfo[arrayid][H_VehicleID] = CreateVehicle(HouseInfo[arrayid][H_VehicleModel],
  1007. HouseInfo[arrayid][H_VehicleX], HouseInfo[arrayid][H_VehicleY], HouseInfo[arrayid][H_VehicleZ],
  1008. HouseInfo[arrayid][H_VehicleAngle],
  1009. HouseInfo[arrayid][H_VehicleColor_1], HouseInfo[arrayid][H_VehicleColor_2], 6000
  1010. );
  1011. }
  1012. Iter_Add(HouseVehicle, HouseInfo[arrayid][H_VehicleID]);
  1013. return SetVehicleVirtualWorld(HouseInfo[arrayid][H_VehicleID], MAX_LOBBY + 1);
  1014. }
  1015.  
  1016. DialogCreate:DIALOG_RESET_VEHICLE_COORD(playerid) {
  1017. static const
  1018. fmt_str_0[] =
  1019. "\\c"color_white"Вы уверены, что хотите припарковать транспорт к дому?\n\n\
  1020. \\c"color_orange"Цена услуги составляет: "color_green"%i$";
  1021.  
  1022. goto skip_array_init_fmt_str_0;
  1023. new string[sizeof(fmt_str_0)
  1024. + (- 2 + 5) // цена за услугу
  1025. ];
  1026. skip_array_init_fmt_str_0:
  1027.  
  1028. format(string, sizeof(string),
  1029. fmt_str_0,
  1030. PRICE_HOUSE_RESET_VEHICLE_COORD
  1031. );
  1032. return Dialog_Open(playerid, Dialog:DIALOG_RESET_VEHICLE_COORD, DIALOG_STYLE_MSGBOX,
  1033. !""color_blue"Парковка транспорта",
  1034. string,
  1035. !"Да", !"Нет"
  1036. );
  1037. }
  1038.  
  1039. DialogResponse:DIALOG_RESET_VEHICLE_COORD(playerid, response, listitem, inputtext[]) {
  1040. if(!response) {
  1041. return Dialog_Show(playerid, Dialog:DIALOG_CMD_HOUSE);
  1042. } else {
  1043. if(PlayerHouseInfo[playerid][H_ID] == INVALID_HOUSE_ID) {
  1044. return SendClientMessage(playerid, COLOR_WHITE, !"У вас нет дома.");
  1045. }
  1046.  
  1047. new arrayid = PlayerHouseInfo[playerid][H_ArrayID];
  1048.  
  1049. new price = PRICE_HOUSE_RESET_VEHICLE_COORD;
  1050. if(playerMoney[playerid] < price) {
  1051. return SendClientMessage(playerid, COLOR_WHITE, !"У вас недостаточно денег для парковки транспорта к дому.");
  1052. }
  1053. playerMoney[playerid] = playerMoney[playerid] - price;
  1054. ResetPlayerMoney(playerid);
  1055. GivePlayerMoney(playerid, playerMoney[playerid]);
  1056.  
  1057. SetVehiclePos(HouseInfo[arrayid][H_VehicleID],
  1058. HouseInfo[arrayid][H_DefaultVehicleX], HouseInfo[arrayid][H_DefaultVehicleY], HouseInfo[arrayid][H_DefaultVehicleZ]
  1059. );
  1060. SetVehicleZAngle(HouseInfo[arrayid][H_VehicleID], HouseInfo[arrayid][H_DefaultVehicleAngle]);
  1061. return SendInfoMessage(playerid, "Вы успешно подогали транспорт к дому!");
  1062. }
  1063. }
  1064.  
  1065. /**
  1066. * [DestroyVehicleForHouse удаляет домашнию машину (на сервере)]
  1067. * @param {int} arrayid {номер ячейки >> HouseInfo}
  1068. */
  1069. stock DestroyVehicleForHouse(arrayid) {
  1070. Iter_Remove(HouseVehicle, HouseInfo[arrayid][H_VehicleID]);
  1071. DestroyVehicle(HouseInfo[arrayid][H_VehicleID]);
  1072. }
  1073.  
  1074. stock SaveVehiclePosition(arrayid) {
  1075. static const
  1076. fmt_str_0[] =
  1077. "UPDATE "TABLE_HOUSE" SET `VehicleX` = %f, `VehicleY` = %f, `VehicleZ` = %f, `VehicleAngle` = %f WHERE ID = %i LIMIT 1";
  1078.  
  1079. goto skip_array_init_fmt_str_0;
  1080. new string[sizeof(fmt_str_0)
  1081. + (- 2 + 7) // x
  1082. + (- 2 + 7) // y
  1083. + (- 2 + 7) // z
  1084. + (- 2 + 7) // angle
  1085. + (- 2 + 5) // id
  1086. ];
  1087. skip_array_init_fmt_str_0:
  1088.  
  1089. new
  1090. Float: vehicle_x,
  1091. Float: vehicle_y,
  1092. Float: vehicle_z,
  1093. Float: vehicle_angle;
  1094.  
  1095. GetVehiclePos(HouseInfo[arrayid][H_VehicleID], vehicle_x, vehicle_y, vehicle_z);
  1096. GetVehicleZAngle(HouseInfo[arrayid][H_VehicleID], vehicle_angle);
  1097.  
  1098. HouseInfo[arrayid][H_VehicleX] = vehicle_x;
  1099. HouseInfo[arrayid][H_VehicleY] = vehicle_y;
  1100. HouseInfo[arrayid][H_VehicleZ] = vehicle_z;
  1101. HouseInfo[arrayid][H_VehicleAngle] = vehicle_angle;
  1102.  
  1103. mysql_format(1,
  1104. string, sizeof(string),
  1105. fmt_str_0,
  1106. vehicle_x,
  1107. vehicle_y,
  1108. vehicle_z,
  1109. vehicle_angle,
  1110. HouseInfo[arrayid][H_ID]
  1111. );
  1112. return mysql_pquery(1, string);
  1113. }
  1114.  
  1115. DialogCreate:DIALOG_HOUSE_CUPBOARD(playerid) {
  1116. Dialog_Open(playerid, Dialog:DIALOG_HOUSE_CUPBOARD, DIALOG_STYLE_MSGBOX,
  1117. ""color_blue"Шкаф",
  1118. ""color_white"\\cПока тут ничего нет, но скоро тут будет крутооооо. Ехууууу\n\n\
  1119. \\cХочешь покажу тебе текстовой смайлик?\n\n\n\n\n\n\n\n\n\n\\cNot all charasters are representable in Cyrillic (Windows 1251),\nfalling back to UTF-8",
  1120. "Закрыть", "Открыть"
  1121. );
  1122. }
  1123.  
  1124. DialogResponse:DIALOG_HOUSE_CUPBOARD(playerid, response, listitem, inputtext[]) {
  1125. if(!response) {
  1126.  
  1127. } else {
  1128.  
  1129. }
  1130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement