Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 1 из 1
  1. #1
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±

    Система создания актёров прямо из игры [MySQL]

    Описание:
    Как и сказано в названии темы, данная система позволяет создавать актёров прямо из игры.
    Система не конфликтует с актёрами, которые были созданы не через функционал данной системы.
    Таблица, требуемая для работы системы, автоматически создастся при первом запуске сервера.




    Команды:
    • /createactor [ID модели] <Имя> <Бессмертие (0-1)> <Здоровье>
      Позволяет создавать актёра с указанными параметрами.
      Все параметры, кроме "ID модели", являются необязательными.
      Примечание:
      Если желаете создать актёра с именем,
      в котором будут пробелы,
      сначала создайте актёра с любым именем
      (или без него)
      и после измените имя на нужное через /editactor

    • /editactor <ID актёра>
      Позволяет отредактировать данные уже созданного актёра.
      Если не указать ID конкретного скина, сервер попытается найти актёра в радиусе одного метра рядом с игроком. Иными словами, можно подойти вплотную к актёру, которого нужно отредактировать, и ввести "/editactor"


    Зависимости:





     Код
    1. В начало мода (после всех инклудов):

      1. #define ACTOR_DB_HANDLE mysql_connection_ID
      2. #define MAX_ACTOR_NAME 30
      3. const ACTOR_COLOR_3D_TEXT = 0xFFFFFFFF;
      4. const Float:ACTOR_3DTEXT_APPEND_Z = 1.1;
      5.  
      6. /*
      7.   "mysql_connection_ID" заменить на свою переменную, хранящую ID подключения к БД.
      8.  
      9.   MAX_ACTOR_NAME - Максимальная длинна имени актёра (3D текст над ботом)
      10.  
      11.   ACTOR_COLOR_3D_TEXT - Цвет 3D текста над актёром, хранящего "имя"
      12.  
      13.   ACTOR_3DTEXT_APPEND_Z - Высота, на которую будет поднят 3D текст относительно центра скина
      14. */
      15.  
      16. enum e_ACTOR_INFO
      17. {
      18. actor_TableID,
      19. actor_Name[MAX_ACTOR_NAME],
      20. actor_ModelID,
      21. Float:actor_PosX,
      22. Float:actor_PosY,
      23. Float:actor_PosZ,
      24. Float:actor_PosA,
      25. actor_Invulnerable,
      26. Float:actor_Health,
      27. actor_VirtualWorld,
      28. actor_Interior,
      29. STREAMER_TAG_3D_TEXT_LABEL:actor_3DText,
      30. }
      31. new ActorInfo[MAX_ACTORS][e_ACTOR_INFO];
      32. new Iterator:iActors<MAX_ACTORS>;
      33.  
      34. new pVar__EditActor_ID[] = "pVar__EditActor_ID";
      35. new pVar__EditActor_Pos[] = "pVar__EditActor_Pos";
      36.  
      37. new dEditActor_Main[] = "dEditActor_Main";
      38. new dEditActor_SetName[] = "dEditActor_SetName";
      39. new dEditActor_Model[] = "dEditActor_Model";
      40. new dEditActor_Health[] = "dEditActor_Health";
      41. new dEditActor_VW[] = "dEditActor_VW";
      42. new dEditActor_Interior[] = "dEditActor_Interior";
      43. new dEditActor_Delete[] = "dEditActor_Delete";

    2. В OnGameModeInit, после кода подключения к БД.

      1. LoadActorInfo();


    3. В конец мода:

      1. LoadActorInfo()
      2. {
      3. new Cache:r = mysql_query(ACTOR_DB_HANDLE, "SHOW TABLES LIKE 'actor_list'", true);
      4.  
      5. if(!cache_num_rows())
      6. {
      7. mysql_query(ACTOR_DB_HANDLE, "\
      8. CREATE TABLE `actor_list` (\
      9. `id` int(11) NOT NULL,\
      10. `name` varchar(30) NOT NULL,\
      11. `model_id` int(11) NOT NULL,\
      12. `pos_x` float NOT NULL,\
      13. `pos_y` float NOT NULL,\
      14. `pos_z` float NOT NULL,\
      15. `pos_a` float NOT NULL,\
      16. `invulnerable` tinyint(1) NOT NULL DEFAULT '1',\
      17. `health` float NOT NULL DEFAULT '100',\
      18. `virtual_world` int(11) NOT NULL DEFAULT '-1',\
      19. `interior` int(11) NOT NULL DEFAULT '-1'\
      20. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;\
      21. ", false);
      22.  
      23. mysql_query(ACTOR_DB_HANDLE, "\
      24. ALTER TABLE `actor_list`\
      25. ADD PRIMARY KEY (`id`);\
      26. ", false);
      27.  
      28.  
      29. mysql_query(ACTOR_DB_HANDLE, "\
      30. ALTER TABLE `actor_list`\
      31. MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\
      32. ", false);
      33.  
      34. print("[MySQL] Таблица actor_list создана.");
      35. }
      36. else
      37. {
      38. cache_delete(r);
      39.  
      40. r = mysql_query(ACTOR_DB_HANDLE, "SELECT * FROM actor_list", true);
      41.  
      42. new row_count;
      43. cache_get_row_count(row_count);
      44.  
      45. if(!row_count)
      46. {
      47. print("[MySQL] Таблица actor_list пуста.");
      48. return;
      49. }
      50.  
      51. if(row_count > MAX_ACTORS)
      52. {
      53. printf("[MySQL: Error] В таблице actor_list количество записей (%d) превышает значение MAX_ACTORS (%d)!", row_count, MAX_ACTORS);
      54. }
      55.  
      56. new buff_actor_info[e_ACTOR_INFO];
      57. for(new i, idx; i < row_count; i++)
      58. {
      59. cache_get_value_name_int(i, "id", buff_actor_info[actor_TableID]);
      60. cache_get_value_name(i, "name", buff_actor_info[actor_Name], MAX_ACTOR_NAME);
      61. cache_get_value_name_int(i, "model_id", buff_actor_info[actor_ModelID]);
      62. cache_get_value_name_float(i, "pos_x", buff_actor_info[actor_PosX]);
      63. cache_get_value_name_float(i, "pos_y", buff_actor_info[actor_PosY]);
      64. cache_get_value_name_float(i, "pos_z", buff_actor_info[actor_PosZ]);
      65. cache_get_value_name_float(i, "pos_a", buff_actor_info[actor_PosA]);
      66. cache_get_value_name_int(i, "invulnerable", buff_actor_info[actor_Invulnerable]);
      67. cache_get_value_name_float(i, "health", buff_actor_info[actor_Health]);
      68. cache_get_value_name_int(i, "virtual_world", buff_actor_info[actor_VirtualWorld]);
      69. cache_get_value_name_int(i, "interior", buff_actor_info[actor_Interior]);
      70.  
      71. idx = CreateDynamicActor(
      72. buff_actor_info[actor_ModelID],
      73. buff_actor_info[actor_PosX],
      74. buff_actor_info[actor_PosY],
      75. buff_actor_info[actor_PosZ],
      76. buff_actor_info[actor_PosA],
      77. buff_actor_info[actor_Invulnerable],
      78. buff_actor_info[actor_Health],
      79. buff_actor_info[actor_VirtualWorld],
      80. buff_actor_info[actor_Interior]);
      81.  
      82. if(idx == INVALID_ACTOR_ID)
      83. {
      84. print("[MySQL: Error] При загрузке данных из таблицы actor_list произошла ошибка: превышен лимит актёров на сервере!");
      85. break;
      86. }
      87. Iter_Add(iActors, idx);
      88.  
      89. ActorInfo[idx] = buff_actor_info;
      90.  
      91. CreateActor3DText(idx);
      92. }
      93. cache_delete(r);
      94. }
      95. }
      96.  
      97. stock CreateActor3DText(idx)
      98. {
      99. if(isnull(ActorInfo[idx][actor_Name]))
      100. return;
      101. ActorInfo[idx][actor_3DText] = CreateDynamic3DTextLabel(
      102. ActorInfo[idx][actor_Name],
      103. ACTOR_COLOR_3D_TEXT,
      104. ActorInfo[idx][actor_PosX],
      105. ActorInfo[idx][actor_PosY],
      106. ActorInfo[idx][actor_PosZ]+ACTOR_3DTEXT_APPEND_Z,
      107. 30.0,
      108. .testlos = 1,
      109. .worldid = ActorInfo[idx][actor_VirtualWorld],
      110. .interiorid = ActorInfo[idx][actor_Interior]);
      111. }
      112.  
      113. stock UpdateActorData(idx, e_ACTOR_INFO:type)
      114. {
      115. new query_string[22+(28+13*4)+9+4+1] = "UPDATE actor_list SET ";
      116. switch(type)
      117. {
      118. case actor_Name:
      119. {
      120. mysql_format(ACTOR_DB_HANDLE, query_string, sizeof(query_string),
      121. "%sname='%e' ", query_string, ActorInfo[idx][type]);
      122. }
      123. case actor_ModelID:
      124. {
      125. format(query_string, sizeof(query_string),
      126. "%smodel_id=%d ", query_string, ActorInfo[idx][type]);
      127. }
      128. case actor_PosX, actor_PosY, actor_PosZ, actor_PosA:
      129. {
      130. format(query_string, sizeof(query_string),
      131. "%spos_x=%0.2f,pos_y=%0.2f,pos_z=%0.2f,pos_a=%0.2f ",
      132. query_string,
      133. ActorInfo[idx][actor_PosX],
      134. ActorInfo[idx][actor_PosY],
      135. ActorInfo[idx][actor_PosZ],
      136. ActorInfo[idx][actor_PosA]);
      137. }
      138. case actor_Invulnerable:
      139. {
      140. format(query_string, sizeof(query_string),
      141. "%sinvulnerable=%d ", query_string, ActorInfo[idx][type]);
      142. }
      143. case actor_Health:
      144. {
      145. format(query_string, sizeof(query_string),
      146. "%shealth=%0.2f ", query_string, ActorInfo[idx][type]);
      147. }
      148. case actor_VirtualWorld:
      149. {
      150. format(query_string, sizeof(query_string),
      151. "%svirtual_world=%d ", query_string, ActorInfo[idx][type]);
      152. }
      153. case actor_Interior:
      154. {
      155. format(query_string, sizeof(query_string),
      156. "%sinterior=%d ", query_string, ActorInfo[idx][type]);
      157. }
      158. }
      159. format(query_string, sizeof(query_string),
      160. "%sWHERE id=%d", query_string, ActorInfo[idx][actor_TableID]);
      161.  
      162. mysql_tquery(ACTOR_DB_HANDLE, query_string, "");
      163. }
      164.  
      165.  
      166. stock Float:GetDynActorDistanceFromPoint(actorid, Float:x, Float:y, Float:z)
      167. {
      168. new Float:current_x, Float:current_y, Float:current_z;
      169. if (GetDynamicActorPos(actorid, current_x, current_y, current_z) == 0)
      170. return 0.0;
      171. return VectorSize(x - current_x, y - current_y, z - current_z);
      172. }
      173.  
      174. stock IsDynamicActorInRangeOfPoint(actorid, Float:range, Float:x, Float:y, Float:z)
      175. {
      176. new Float:dist = GetDynActorDistanceFromPoint(actorid, x, y, z);
      177. return _:(dist < range) != 0;
      178. }

    4. Команды и функционал для них (так же в конец мода):

      1. CMD:createactor(playerid, params[])
      2. {
      3. new modelid;
      4. new invulnerable;
      5. new Float:health;
      6. new name[MAX_ACTOR_NAME];
      7.  
      8. if(sscanf(params, "iS()["#MAX_ACTOR_NAME"]I(1)F(100)", modelid, name, invulnerable, health))
      9. {
      10. SendClientMessage(playerid, 0xAAAAAAFF,
      11. "Используйте: /createactor [Model (0-73, 75-311)] <Имя> <Бессмертие (0-1)> <Здоровье>");
      12.  
      13. SendClientMessage(playerid, 0xAAAAAAFF, "* Примечание:");
      14. SendClientMessage(playerid, 0xAAAAAAFF, "Параметры в угловых скобках не обязательны.");
      15. SendClientMessage(playerid, 0xAAAAAAFF, "Значения по умолчанию:");
      16. SendClientMessage(playerid, 0xAAAAAAFF, "Бессмертие - \"1\"");
      17. SendClientMessage(playerid, 0xAAAAAAFF, "Здоровье - \"100.0\"");
      18. return 1;
      19. }
      20.  
      21. if(!(0 <= modelid <= 73) && !(75 <= modelid <= 311))
      22. {
      23. SendClientMessage(playerid, 0xAAAAAAFF, "Ошибка: Допустимые значения для ModelID: 0-73, 75-311");
      24. return 1;
      25. }
      26.  
      27. if(!(0 <= invulnerable <= 1))
      28. {
      29. SendClientMessage(playerid, 0xAAAAAAFF, "Ошибка: Допустимые значения для invulnerable: 0-1");
      30. return 1;
      31. }
      32.  
      33. if(health <= 0.0)
      34. {
      35. SendClientMessage(playerid, 0xAAAAAAFF, "Ошибка: Здоровье не может быть меньше или равно нулю.");
      36. return 1;
      37. }
      38.  
      39.  
      40. new Float:x;
      41. new Float:y;
      42. new Float:z;
      43. GetPlayerPos(playerid, x, y, z);
      44. new Float:a;
      45. GetPlayerFacingAngle(playerid, a);
      46.  
      47. new worldid = GetPlayerVirtualWorld(playerid);
      48. new interiorid = GetPlayerInterior(playerid);
      49.  
      50. new idx = CreateDynamicActor(modelid, x, y, z, a, invulnerable, health, worldid, interiorid);
      51.  
      52. if(idx == INVALID_ACTOR_ID)
      53. {
      54. SendClientMessage(playerid, 0xAAAAAAFF, "Ошибка: На сервере создано максимальное количество актёров.");
      55. return 1;
      56. }
      57.  
      58. Iter_Add(iActors, idx);
      59.  
      60. ActorInfo[idx][actor_Name][0] = '\0';
      61. strcat(ActorInfo[idx][actor_Name], name, MAX_ACTOR_NAME);
      62. ActorInfo[idx][actor_ModelID] = modelid;
      63. ActorInfo[idx][actor_PosX] = x;
      64. ActorInfo[idx][actor_PosY] = y;
      65. ActorInfo[idx][actor_PosZ] = z;
      66. ActorInfo[idx][actor_PosA] = a;
      67. ActorInfo[idx][actor_Invulnerable] = invulnerable;
      68. ActorInfo[idx][actor_Health] = health;
      69. ActorInfo[idx][actor_VirtualWorld] = worldid;
      70. ActorInfo[idx][actor_Interior] = interiorid;
      71.  
      72. x += (1.0 * floatsin(-a, degrees));
      73. y += (1.0 * floatcos(-a, degrees));
      74. SetPlayerPos(playerid, x, y, z);
      75. SetPlayerFacingAngle(playerid, a-180.0);
      76.  
      77. CreateActor3DText(idx);
      78.  
      79. new query_string[12+11+4+(8+MAX_ACTOR_NAME)+(10+3)+(7+11)+(7+11)+(7+11)+(7+11)+(14+1)+(8+11)+(15+11)+(9+11)+1];
      80. mysql_format(ACTOR_DB_HANDLE, query_string, sizeof(query_string),
      81. "\
      82. INSERT INTO \
      83. actor_list \
      84. SET \
      85. name='%e',\
      86. model_id=%d,\
      87. pos_x=%f,\
      88. pos_y=%f,\
      89. pos_z=%f,\
      90. pos_a=%f,\
      91. invulnerable=%d,\
      92. health=%f,\
      93. virtual_world=%d,\
      94. interior=%d\
      95. ",
      96. name,
      97. modelid,
      98. x,
      99. y,
      100. z,
      101. a,
      102. invulnerable,
      103. health,
      104. worldid,
      105. interiorid);
      106. mysql_tquery(ACTOR_DB_HANDLE, query_string, "@MySQL__GetActorTableID", "i", idx);
      107. return 1;
      108. }
      109.  
      110. @MySQL__GetActorTableID(idx);
      111. @MySQL__GetActorTableID(idx)
      112. {
      113. ActorInfo[idx][actor_TableID] = cache_insert_id();
      114. }
      115.  
      116.  
      117. CMD:editactor(playerid, params[])
      118. {
      119. new actor_id = -1;
      120. if(sscanf(params, "i", actor_id))
      121. {
      122. new Float:x;
      123. new Float:y;
      124. new Float:z;
      125. GetPlayerPos(playerid, x, y, z);
      126.  
      127. foreach(new i: iActors)
      128. {
      129. if(!IsDynamicActorInRangeOfPoint(i, 1.0, x, y, z))
      130. continue;
      131.  
      132. SetPVarInt(playerid, pVar__EditActor_ID, i);
      133. Dialog_Show(playerid, dEditActor_Main);
      134. return 1;
      135. }
      136. SendClientMessage(playerid, 0xAAAAAAFF, "/editactor <ID актёра (1-1000)>");
      137. return 1;
      138. }
      139. if(!Iter_Contains(iActors, actor_id))
      140. {
      141. SendClientMessage(playerid, 0xAAAAAAFF, "Ошибка: Указанный актёр не найден или создан не через систему создания актёров.");
      142. return 1;
      143. }
      144.  
      145. DeletePVar(playerid, pVar__EditActor_Pos);
      146. SetPVarInt(playerid, pVar__EditActor_ID, actor_id);
      147. Dialog_Show(playerid, dEditActor_Main);
      148. return 1;
      149. }
      150.  
      151.  
      152. DialogCreate:dEditActor_Main(playerid)
      153. {
      154. if(!GetPVarType(playerid, pVar__EditActor_ID))
      155. {
      156. SendClientMessage(playerid, 0xAAAAAAFF, "При редактировании актёра произошла ошибка [#001]. Повторите попытку.");
      157. return;
      158. }
      159.  
      160. new idx = GetPVarInt(playerid, pVar__EditActor_ID);
      161.  
      162. new dialog_string[8+(14+MAX_ACTOR_NAME)+(25+3)+(29+10)+(27+13)+(34+11)+(27+11)+28+17+1] = "{FFFFFF}";
      163.  
      164. format(dialog_string, sizeof(dialog_string),
      165. "\
      166. Имя:\t{009900}%s\n\
      167. {FFFFFF}Модель:\t{009900}%d\n\
      168. {FFFFFF}Бессмертие:\t{009900}%s\n\
      169. {FFFFFF}Здоровье:\t{009900}%0.2f\n\
      170. {FFFFFF}Виртуальный мир:\t{009900}%d\n\
      171. {FFFFFF}Интерьер:\t{009900}%d\n\
      172. {FFFFFF}• Изменить позицию\t\n\
      173. • Удалить актёра\t\n\
      174. ",
      175. ActorInfo[idx][actor_Name],
      176. ActorInfo[idx][actor_ModelID],
      177. ActorInfo[idx][actor_Invulnerable] ? ("Бессмертен") : ("Смертен"),
      178. ActorInfo[idx][actor_Health],
      179. ActorInfo[idx][actor_VirtualWorld],
      180. ActorInfo[idx][actor_Interior]);
      181.  
      182. Dialog_Open(playerid, dEditActor_Main, DIALOG_STYLE_TABLIST,
      183. "Редактирование актёра", dialog_string, "Далее", "Закрыть");
      184. }
      185.  
      186. DialogResponse:dEditActor_Main(playerid, response, listitem, inputtext[])
      187. {
      188. if(!response)
      189. {
      190. DeletePVar(playerid, pVar__EditActor_ID);
      191. return 1;
      192. }
      193.  
      194. if(!GetPVarType(playerid, pVar__EditActor_ID))
      195. {
      196. SendClientMessage(playerid, 0xAAAAAAFF, "При редактировании актёра произошла ошибка [#002]. Повторите попытку.");
      197. return 1;
      198. }
      199.  
      200. new idx = GetPVarInt(playerid, pVar__EditActor_ID);
      201. switch(listitem)
      202. {
      203. case 0:
      204. {
      205. Dialog_Show(playerid, dEditActor_SetName);
      206. }
      207. case 1:
      208. {
      209. Dialog_Show(playerid, dEditActor_Model);
      210. }
      211. case 2:
      212. {
      213. ActorInfo[idx][actor_Invulnerable] = !ActorInfo[idx][actor_Invulnerable];
      214. UpdateActorData(idx, actor_Invulnerable);
      215. Streamer_SetIntData(STREAMER_TYPE_ACTOR, idx, E_STREAMER_INVULNERABLE, ActorInfo[idx][actor_Invulnerable]);
      216. Streamer_Update(playerid, STREAMER_TYPE_ACTOR);
      217.  
      218. Dialog_Show(playerid, dEditActor_Main);
      219. }
      220. case 3:
      221. {
      222. Dialog_Show(playerid, dEditActor_Health);
      223. }
      224. case 4:
      225. {
      226. Dialog_Show(playerid, dEditActor_VW);
      227. }
      228. case 5:
      229. {
      230. Dialog_Show(playerid, dEditActor_Interior);
      231. }
      232. case 6:
      233. {
      234. SetPVarInt(playerid, pVar__EditActor_Pos, 1);
      235.  
      236. SendClientMessage(playerid, 0x00AA00AA, "Вы перешли в режим редактирования координат актёра.");
      237. SendClientMessage(playerid, 0x00AA00AA, "Встаньте на желаемую позицию и нажмите на \"~k~~CONVERSATION_YES~\".");
      238. SendClientMessage(playerid, 0x00AA00AA, "Для выхода из режима без изменения координат нажмите \"~k~~CONVERSATION_YES~\".");
      239. }
      240. case 7:
      241. {
      242. Dialog_Show(playerid, dEditActor_Delete);
      243. }
      244. }
      245. return 1;
      246. }
      247.  
      248. DialogInterrupt:dEditActor_Main(playerid)
      249. {
      250. DeletePVar(playerid, pVar__EditActor_ID);
      251. return 1;
      252. }
      253.  
      254.  
      255. DialogCreate:dEditActor_SetName(playerid)
      256. {
      257. if(!GetPVarType(playerid, pVar__EditActor_ID))
      258. {
      259. SendClientMessage(playerid, 0xAAAAAAFF, "При редактировании актёра произошла ошибка [#003]. Повторите попытку.");
      260. return;
      261. }
      262.  
      263. new idx = GetPVarInt(playerid, pVar__EditActor_ID);
      264.  
      265. new dialog_string[8+(30+MAX_ACTOR_NAME)+1+30+1];
      266. format(dialog_string, sizeof(dialog_string),
      267. "{FFFFFF}\
      268. Текущее имя: {00AA00}%s{FFFFFF}\n\
      269. \n\
      270. Укажите новое имя в окно ниже:\
      271. ", ActorInfo[idx][actor_Name]);
      272.  
      273. Dialog_Open(playerid, dEditActor_SetName, DIALOG_STYLE_INPUT,
      274. "Редактирование актёра [Имя]", dialog_string, "Изменить", "Назад");
      275. }
      276.  
      277. DialogResponse:dEditActor_SetName(playerid, response, listitem, inputtext[])
      278. {
      279. if(!response)
      280. {
      281. Dialog_Show(playerid, dEditActor_Main);
      282. return 1;
      283. }
      284.  
      285. if(strlen(inputtext) > MAX_ACTOR_NAME)
      286. {
      287. SendClientMessage(playerid, 0xAAAAAAFF, "Ошибка: Имя не должно быть длиннее "#MAX_ACTOR_NAME" символов.");
      288. Dialog_Show(playerid, dEditActor_SetName);
      289. return 1;
      290. }
      291.  
      292. if(!GetPVarType(playerid, pVar__EditActor_ID))
      293. {
      294. SendClientMessage(playerid, 0xAAAAAAFF, "При редактировании актёра произошла ошибка [#004]. Повторите попытку.");
      295. return 1;
      296. }
      297.  
      298. new idx = GetPVarInt(playerid, pVar__EditActor_ID);
      299.  
      300. if(isnull(inputtext))
      301. {
      302. if(isnull(ActorInfo[idx][actor_Name]))
      303. {
      304. Dialog_Show(playerid, dEditActor_Main);
      305. return 1;
      306. }
      307. else
      308. {
      309. ActorInfo[idx][actor_Name][0] = '\0';
      310. DestroyDynamic3DTextLabel(ActorInfo[idx][actor_3DText]);
      311. }
      312. }
      313. else
      314. {
      315. if(isnull(ActorInfo[idx][actor_Name]))
      316. {
      317. strcat(ActorInfo[idx][actor_Name], inputtext, MAX_ACTOR_NAME);
      318. CreateActor3DText(idx);
      319. Streamer_Update(playerid, STREAMER_TYPE_3D_TEXT_LABEL);
      320. }
      321. else
      322. {
      323. ActorInfo[idx][actor_Name][0] = '\0';
      324. strcat(ActorInfo[idx][actor_Name], inputtext, MAX_ACTOR_NAME);
      325. UpdateDynamic3DTextLabelText(ActorInfo[idx][actor_3DText], ACTOR_COLOR_3D_TEXT, inputtext);
      326. Streamer_Update(playerid, STREAMER_TYPE_3D_TEXT_LABEL);
      327. }
      328. }
      329. UpdateActorData(idx, actor_Name);
      330.  
      331. Dialog_Show(playerid, dEditActor_Main);
      332. return 1;
      333. }
      334.  
      335. DialogInterrupt:dEditActor_SetName(playerid)
      336. {
      337. DeletePVar(playerid, pVar__EditActor_ID);
      338. return 1;
      339. }
      340.  
      341.  
      342. DialogCreate:dEditActor_Model(playerid)
      343. {
      344. if(!GetPVarType(playerid, pVar__EditActor_ID))
      345. {
      346. SendClientMessage(playerid, 0xAAAAAAFF, "При редактировании актёра произошла ошибка [#005]. Повторите попытку.");
      347. return;
      348. }
      349.  
      350. new idx = GetPVarInt(playerid, pVar__EditActor_ID);
      351.  
      352. new dialog_string[8+(30+3)+1+30+1];
      353. format(dialog_string, sizeof(dialog_string),
      354. "{FFFFFF}\
      355. Текущая модель: {00AA00}%d{FFFFFF}\n\
      356. \n\
      357. Укажите новую модель в окно ниже:\
      358. ", ActorInfo[idx][actor_ModelID]);
      359.  
      360. Dialog_Open(playerid, dEditActor_Model, DIALOG_STYLE_INPUT,
      361. "Редактирование актёра [ID скина]", dialog_string, "Изменить", "Назад");
      362. }
      363.  
      364. DialogResponse:dEditActor_Model(playerid, response, listitem, inputtext[])
      365. {
      366. if(!response)
      367. {
      368. Dialog_Show(playerid, dEditActor_Main);
      369. return 1;
      370. }
      371.  
      372. new model_id;
      373. if(sscanf(inputtext, "i", model_id))
      374. {
      375. Dialog_Show(playerid, dEditActor_Model);
      376. return 1;
      377. }
      378.  
      379. if(!(0 <= model_id <= 73) && !(75 <= model_id <= 311))
      380. {
      381. SendClientMessage(playerid, 0xAAAAAAFF, "Ошибка: Допустимые значения для модели: 0-73, 75-311");
      382. Dialog_Show(playerid, dEditActor_Model);
      383. return 1;
      384. }
      385.  
      386. if(!GetPVarType(playerid, pVar__EditActor_ID))
      387. {
      388. SendClientMessage(playerid, 0xAAAAAAFF, "При редактировании актёра произошла ошибка [#006]. Повторите попытку.");
      389. return 1;
      390. }
      391.  
      392. new idx = GetPVarInt(playerid, pVar__EditActor_ID);
      393.  
      394. ActorInfo[idx][actor_ModelID] = model_id;
      395. UpdateActorData(idx, actor_ModelID);
      396. Streamer_SetIntData(STREAMER_TYPE_ACTOR, idx, E_STREAMER_MODEL_ID, model_id);
      397. Streamer_Update(playerid, STREAMER_TYPE_ACTOR);
      398.  
      399. Dialog_Show(playerid, dEditActor_Main);
      400. return 1;
      401. }
      402.  
      403. DialogInterrupt:dEditActor_Model(playerid)
      404. {
      405. DeletePVar(playerid, pVar__EditActor_ID);
      406. return 1;
      407. }
      408.  
      409.  
      410. DialogCreate:dEditActor_Health(playerid)
      411. {
      412. if(!GetPVarType(playerid, pVar__EditActor_ID))
      413. {
      414. SendClientMessage(playerid, 0xAAAAAAFF, "При редактировании актёра произошла ошибка [#007]. Повторите попытку.");
      415. return;
      416. }
      417.  
      418. new idx = GetPVarInt(playerid, pVar__EditActor_ID);
      419.  
      420. new dialog_string[8+(35+13)+1+35+1];
      421. format(dialog_string, sizeof(dialog_string),
      422. "{FFFFFF}\
      423. Текущее здоровье: {00AA00}%0.2f{FFFFFF}\n\
      424. \n\
      425. Укажите новое значение в окно ниже:\
      426. ", ActorInfo[idx][actor_Health]);
      427.  
      428. Dialog_Open(playerid, dEditActor_Health, DIALOG_STYLE_INPUT,
      429. "Редактирование актёра [Здоровье]", dialog_string, "Изменить", "Назад");
      430. }
      431.  
      432. DialogResponse:dEditActor_Health(playerid, response, listitem, inputtext[])
      433. {
      434. if(!response)
      435. {
      436. Dialog_Show(playerid, dEditActor_Main);
      437. return 1;
      438. }
      439.  
      440. new Float:health;
      441. if(sscanf(inputtext, "f", health))
      442. {
      443. Dialog_Show(playerid, dEditActor_Health);
      444. return 1;
      445. }
      446.  
      447. if(health <= 0.0)
      448. {
      449. SendClientMessage(playerid, 0xAAAAAAFF, "Ошибка: Здоровье не может быть меньше или равно нулю.");
      450. Dialog_Show(playerid, dEditActor_Health);
      451. return 1;
      452. }
      453.  
      454. if(!GetPVarType(playerid, pVar__EditActor_ID))
      455. {
      456. SendClientMessage(playerid, 0xAAAAAAFF, "При редактировании актёра произошла ошибка [#008]. Повторите попытку.");
      457. return 1;
      458. }
      459.  
      460. new idx = GetPVarInt(playerid, pVar__EditActor_ID);
      461.  
      462. ActorInfo[idx][actor_Health] = health;
      463. UpdateActorData(idx, actor_Health);
      464. Streamer_SetFloatData(STREAMER_TYPE_ACTOR, idx, E_STREAMER_HEALTH, health);
      465. Streamer_Update(playerid, STREAMER_TYPE_ACTOR);
      466.  
      467. Dialog_Show(playerid, dEditActor_Main);
      468. return 1;
      469. }
      470.  
      471. DialogInterrupt:dEditActor_Health(playerid)
      472. {
      473. DeletePVar(playerid, pVar__EditActor_ID);
      474. return 1;
      475. }
      476.  
      477.  
      478. DialogCreate:dEditActor_VW(playerid)
      479. {
      480. if(!GetPVarType(playerid, pVar__EditActor_ID))
      481. {
      482. SendClientMessage(playerid, 0xAAAAAAFF, "При редактировании актёра произошла ошибка [#009]. Повторите попытку.");
      483. return;
      484. }
      485.  
      486. new idx = GetPVarInt(playerid, pVar__EditActor_ID);
      487.  
      488. new dialog_string[8+(42+11)+1+42+1];
      489. format(dialog_string, sizeof(dialog_string),
      490. "{FFFFFF}\
      491. Текущий виртуальный мир: {00AA00}%d{FFFFFF}\n\
      492. \n\
      493. Укажите новый виртуальный мир в окно ниже:\
      494. ", ActorInfo[idx][actor_VirtualWorld]);
      495.  
      496. Dialog_Open(playerid, dEditActor_VW, DIALOG_STYLE_INPUT,
      497. "Редактирование актёра [Виртуальный мир]", dialog_string, "Изменить", "Назад");
      498. }
      499.  
      500. DialogResponse:dEditActor_VW(playerid, response, listitem, inputtext[])
      501. {
      502. if(!response)
      503. {
      504. Dialog_Show(playerid, dEditActor_Main);
      505. return 1;
      506. }
      507.  
      508. new virtual_world;
      509. if(sscanf(inputtext, "i", virtual_world))
      510. {
      511. Dialog_Show(playerid, dEditActor_VW);
      512. return 1;
      513. }
      514.  
      515. if(virtual_world < -1)
      516. {
      517. SendClientMessage(playerid, 0xAAAAAAFF, "Ошибка: Виртуальный мир не может быть меньше -1!");
      518. Dialog_Show(playerid, dEditActor_VW);
      519. return 1;
      520. }
      521.  
      522. if(!GetPVarType(playerid, pVar__EditActor_ID))
      523. {
      524. SendClientMessage(playerid, 0xAAAAAAFF, "При редактировании актёра произошла ошибка [#010]. Повторите попытку.");
      525. return 1;
      526. }
      527.  
      528. new idx = GetPVarInt(playerid, pVar__EditActor_ID);
      529.  
      530. ActorInfo[idx][actor_VirtualWorld] = virtual_world;
      531. UpdateActorData(idx, actor_VirtualWorld);
      532. Streamer_SetIntData(STREAMER_TYPE_ACTOR, idx, E_STREAMER_WORLD_ID, virtual_world);
      533. Streamer_SetIntData(STREAMER_TYPE_3D_TEXT_LABEL, ActorInfo[idx][actor_3DText], E_STREAMER_WORLD_ID, virtual_world);
      534. Streamer_Update(playerid, STREAMER_TYPE_ACTOR);
      535. Streamer_Update(playerid, STREAMER_TYPE_3D_TEXT_LABEL);
      536.  
      537. Dialog_Show(playerid, dEditActor_Main);
      538. return 1;
      539. }
      540.  
      541. DialogInterrupt:dEditActor_VW(playerid)
      542. {
      543. DeletePVar(playerid, pVar__EditActor_ID);
      544. return 1;
      545. }
      546.  
      547.  
      548. DialogCreate:dEditActor_Interior(playerid)
      549. {
      550. if(!GetPVarType(playerid, pVar__EditActor_ID))
      551. {
      552. SendClientMessage(playerid, 0xAAAAAAFF, "При редактировании актёра произошла ошибка [#011]. Повторите попытку.");
      553. return;
      554. }
      555.  
      556. new idx = GetPVarInt(playerid, pVar__EditActor_ID);
      557.  
      558. new dialog_string[8+(42+11)+1+42+1];
      559. format(dialog_string, sizeof(dialog_string),
      560. "{FFFFFF}\
      561. Текущий интерьер: {00AA00}%d{FFFFFF}\n\
      562. \n\
      563. Укажите новый интерьер в окно ниже:\
      564. ", ActorInfo[idx][actor_Interior]);
      565.  
      566. Dialog_Open(playerid, dEditActor_Interior, DIALOG_STYLE_INPUT,
      567. "Редактирование актёра [Интерьер]", dialog_string, "Изменить", "Назад");
      568. }
      569.  
      570. DialogResponse:dEditActor_Interior(playerid, response, listitem, inputtext[])
      571. {
      572. if(!response)
      573. {
      574. Dialog_Show(playerid, dEditActor_Main);
      575. return 1;
      576. }
      577.  
      578. new interior;
      579. if(sscanf(inputtext, "i", interior))
      580. {
      581. Dialog_Show(playerid, dEditActor_Interior);
      582. return 1;
      583. }
      584.  
      585. if(!(-1 <= interior <= 256))
      586. {
      587. SendClientMessage(playerid, 0xAAAAAAFF, "Ошибка: Интерьер не может быть меньше -1 или больше 256!");
      588. Dialog_Show(playerid, dEditActor_Interior);
      589. return 1;
      590. }
      591.  
      592. if(!GetPVarType(playerid, pVar__EditActor_ID))
      593. {
      594. SendClientMessage(playerid, 0xAAAAAAFF, "При редактировании актёра произошла ошибка [#012]. Повторите попытку.");
      595. return 1;
      596. }
      597.  
      598. new idx = GetPVarInt(playerid, pVar__EditActor_ID);
      599.  
      600. ActorInfo[idx][actor_Interior] = interior;
      601. UpdateActorData(idx, actor_Interior);
      602. Streamer_SetIntData(STREAMER_TYPE_ACTOR, idx, E_STREAMER_INTERIOR_ID, interior);
      603. Streamer_SetIntData(STREAMER_TYPE_3D_TEXT_LABEL, ActorInfo[idx][actor_3DText], E_STREAMER_INTERIOR_ID, interior);
      604. Streamer_Update(playerid, STREAMER_TYPE_ACTOR);
      605. Streamer_Update(playerid, STREAMER_TYPE_3D_TEXT_LABEL);
      606.  
      607. Dialog_Show(playerid, dEditActor_Main);
      608. return 1;
      609. }
      610.  
      611. DialogInterrupt:dEditActor_Interior(playerid)
      612. {
      613. DeletePVar(playerid, pVar__EditActor_ID);
      614. return 1;
      615. }
      616.  
      617.  
      618. DialogCreate:dEditActor_Delete(playerid)
      619. {
      620. if(!GetPVarType(playerid, pVar__EditActor_ID))
      621. {
      622. SendClientMessage(playerid, 0xAAAAAAFF, "При редактировании актёра произошла ошибка [#013]. Повторите попытку.");
      623. return;
      624. }
      625.  
      626. new idx = GetPVarInt(playerid, pVar__EditActor_ID);
      627.  
      628. new dialog_string[8+(24+MAX_ACTOR_NAME)+1+48+1];
      629. format(dialog_string, sizeof(dialog_string),
      630. "{FFFFFF}\
      631. Актёр: {00AA00}%s{FFFFFF}\n\
      632. \n\
      633. Вы действительно желаете удалить данного актёра?\
      634. ",
      635. ActorInfo[idx][actor_Name]);
      636. Dialog_Open(playerid, dEditActor_Delete, DIALOG_STYLE_MSGBOX,
      637. "Удаление актёра", dialog_string, "Удалить", "Назад");
      638. }
      639.  
      640. DialogResponse:dEditActor_Delete(playerid, response, listitem, inputtext[])
      641. {
      642. if(!response)
      643. {
      644. Dialog_Show(playerid, dEditActor_Main);
      645. return 1;
      646. }
      647.  
      648. if(!GetPVarType(playerid, pVar__EditActor_ID))
      649. {
      650. SendClientMessage(playerid, 0xAAAAAAFF, "При редактировании актёра произошла ошибка [#014]. Повторите попытку.");
      651. return 1;
      652. }
      653.  
      654. new idx = GetPVarInt(playerid, pVar__EditActor_ID);
      655.  
      656. Iter_Remove(iActors, idx);
      657.  
      658. DestroyDynamicActor(idx);
      659. DestroyDynamic3DTextLabel(ActorInfo[idx][actor_3DText]);
      660.  
      661. new query_string[34+11+1];
      662. format(query_string, sizeof(query_string),
      663. "DELETE FROM actor_list WHERE id = %d", ActorInfo[idx][actor_TableID]);
      664. mysql_tquery(ACTOR_DB_HANDLE, query_string);
      665. return 1;
      666. }
      667.  
      668. DialogInterrupt:dEditActor_Delete(playerid)
      669. {
      670. DeletePVar(playerid, pVar__EditActor_ID);
      671. return 1;
      672. }

    5. В OnPlayerKeyStateChange

      1. if(GetPVarType(playerid, pVar__EditActor_Pos))
      2. {
      3. if(newkeys & KEY_YES)
      4. {
      5. if(!GetPVarType(playerid, pVar__EditActor_ID))
      6. {
      7. SendClientMessage(playerid, 0xAAAAAAFF, "При редактировании актёра произошла ошибка [#015]. Повторите попытку.");
      8. return 1;
      9. }
      10.  
      11. new idx = GetPVarInt(playerid, pVar__EditActor_ID);
      12.  
      13.  
      14. new Float:x;
      15. new Float:y;
      16. new Float:z;
      17. GetPlayerPos(playerid, x, y, z);
      18. new Float:a;
      19. GetPlayerFacingAngle(playerid, a);
      20.  
      21. new worldid = GetPlayerVirtualWorld(playerid);
      22. new interiorid = GetPlayerInterior(playerid);
      23. ActorInfo[idx][actor_PosX] = x;
      24. ActorInfo[idx][actor_PosY] = y;
      25. ActorInfo[idx][actor_PosZ] = z;
      26. ActorInfo[idx][actor_PosA] = a;
      27. ActorInfo[idx][actor_VirtualWorld] = worldid;
      28. ActorInfo[idx][actor_Interior] = interiorid;
      29.  
      30. new query_string[7+11+4+(7+13)+(7+13)+(7+13)+(7+13)+(15+11)+(10+3)+6+(3+11)+1];
      31.  
      32. format(query_string, sizeof(query_string),
      33. "\
      34. UPDATE \
      35. actor_list \
      36. SET \
      37. pos_x=%0.2f,\
      38. pos_y=%0.2f,\
      39. pos_z=%0.2f,\
      40. pos_a=%0.2f,\
      41. virtual_world=%d,\
      42. interior=%d \
      43. WHERE \
      44. id=%d\
      45. ",
      46. x, y, z, a,
      47. worldid, interiorid,
      48. ActorInfo[idx][actor_TableID]);
      49. mysql_tquery(ACTOR_DB_HANDLE, query_string);
      50.  
      51.  
      52. Streamer_SetFloatData(STREAMER_TYPE_ACTOR, idx, E_STREAMER_X, x);
      53. Streamer_SetFloatData(STREAMER_TYPE_3D_TEXT_LABEL, ActorInfo[idx][actor_3DText], E_STREAMER_X, x);
      54.  
      55. Streamer_SetFloatData(STREAMER_TYPE_ACTOR, idx, E_STREAMER_Y, y);
      56. Streamer_SetFloatData(STREAMER_TYPE_3D_TEXT_LABEL, ActorInfo[idx][actor_3DText], E_STREAMER_Y, y);
      57.  
      58. Streamer_SetFloatData(STREAMER_TYPE_ACTOR, idx, E_STREAMER_Z, z);
      59. Streamer_SetFloatData(STREAMER_TYPE_3D_TEXT_LABEL, ActorInfo[idx][actor_3DText], E_STREAMER_Z, z+ACTOR_3DTEXT_APPEND_Z);
      60.  
      61. Streamer_SetFloatData(STREAMER_TYPE_ACTOR, idx, E_STREAMER_ROTATION, a);
      62.  
      63. Streamer_SetIntData(STREAMER_TYPE_ACTOR, idx, E_STREAMER_WORLD_ID, worldid);
      64. Streamer_SetIntData(STREAMER_TYPE_3D_TEXT_LABEL, ActorInfo[idx][actor_3DText], E_STREAMER_WORLD_ID, worldid);
      65. Streamer_SetIntData(STREAMER_TYPE_ACTOR, idx, E_STREAMER_INTERIOR_ID, interiorid);
      66. Streamer_SetIntData(STREAMER_TYPE_3D_TEXT_LABEL, ActorInfo[idx][actor_3DText], E_STREAMER_INTERIOR_ID, interiorid);
      67.  
      68. Streamer_Update(playerid, STREAMER_TYPE_ACTOR);
      69. Streamer_Update(playerid, STREAMER_TYPE_3D_TEXT_LABEL);
      70. DeletePVar(playerid, pVar__EditActor_Pos);
      71.  
      72.  
      73.  
      74. x += (1.0 * floatsin(-a, degrees));
      75. y += (1.0 * floatcos(-a, degrees));
      76. SetPlayerPos(playerid, x, y, z);
      77. SetPlayerFacingAngle(playerid, a-180.0);
      78.  
      79.  
      80. Dialog_Show(playerid, dEditActor_Main);
      81. return 1;
      82. }
      83. else if(newkeys & KEY_NO)
      84. {
      85. DeletePVar(playerid, pVar__EditActor_Pos);
      86. Dialog_Show(playerid, dEditActor_Main);
      87. return 1;
      88. }
      89. }





    Автор - DeimoS
    Копирование данного материала без разрешения автора запрещено
    Последний раз редактировалось DeimoS; 15.04.2021 в 16:05.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  2. 3 пользователя(ей) сказали cпасибо:
    Aurelius (07.05.2021) Kovshevoy (29.04.2021) Сергей (18.05.2021)
 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •