func.pwn 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788
  1. GetObjectAttachObject(objectid) {
  2. if( g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_IDTYPE] == ID_TYPE_OBJECT ) {
  3. return g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_ID];
  4. }
  5. return INVALID_OBJECT_ID;
  6. }
  7. GetObjectAttachVehicle(objectid) {
  8. if( g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_IDTYPE] == ID_TYPE_VEHICLE ) {
  9. return g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_ID];
  10. }
  11. return INVALID_VEHICLE_ID;
  12. }
  13. MigrateObjectMaterialIndexData(from_objectid, to_objectid, materialindex) {
  14. switch( g_ObjectData[from_objectid-1][OBJECT_DATA_MATINDEX_TYPE][materialindex] ) {
  15. case MATERIALINDEX_TYPE_TEXTURE: {
  16. g_ObjectData[to_objectid-1][OBJECT_DATA_MATINDEX_TEXTURE][materialindex] = g_ObjectData[from_objectid-1][OBJECT_DATA_MATINDEX_TEXTURE][materialindex];
  17. g_ObjectData[to_objectid-1][OBJECT_DATA_MATINDEX_COLOR][materialindex] = g_ObjectData[from_objectid-1][OBJECT_DATA_MATINDEX_COLOR][materialindex];
  18. }
  19. case MATERIALINDEX_TYPE_TEXT: {
  20. strunpack(g_ObjectTextString, g_ObjectText[from_objectid-1][materialindex], MAX_OBJECT_TEXT+1);
  21. strunpack(g_FontString, g_ObjectFont[from_objectid-1][materialindex], MAX_FONTNAME_LEN+1);
  22. strpack(g_ObjectText[to_objectid-1][materialindex], g_ObjectTextString, MAX_OBJECT_TEXT+1);
  23. strpack(g_ObjectFont[to_objectid-1][materialindex], g_FontString, MAX_FONTNAME_LEN+1);
  24. g_ObjectData[to_objectid-1][OBJECT_DATA_MATINDEX_SIZE][materialindex] = g_ObjectData[from_objectid-1][OBJECT_DATA_MATINDEX_SIZE][materialindex];
  25. g_ObjectData[to_objectid-1][OBJECT_DATA_MATINDEX_FONTSIZE][materialindex] = g_ObjectData[from_objectid-1][OBJECT_DATA_MATINDEX_FONTSIZE][materialindex];
  26. g_ObjectData[to_objectid-1][OBJECT_DATA_MATINDEX_ISBOLD][materialindex] = g_ObjectData[from_objectid-1][OBJECT_DATA_MATINDEX_ISBOLD][materialindex];
  27. g_ObjectData[to_objectid-1][OBJECT_DATA_MATINDEX_FONTCOLOR][materialindex] = g_ObjectData[from_objectid-1][OBJECT_DATA_MATINDEX_FONTCOLOR][materialindex];
  28. g_ObjectData[to_objectid-1][OBJECT_DATA_MATINDEX_COLOR][materialindex] = g_ObjectData[from_objectid-1][OBJECT_DATA_MATINDEX_COLOR][materialindex];
  29. g_ObjectData[to_objectid-1][OBJECT_DATA_MATINDEX_ALIGNMENT][materialindex] = g_ObjectData[from_objectid-1][OBJECT_DATA_MATINDEX_ALIGNMENT][materialindex];
  30. }
  31. default: {
  32. return 0;
  33. }
  34. }
  35. g_ObjectData[to_objectid-1][OBJECT_DATA_MATINDEX_TYPE][materialindex] = g_ObjectData[from_objectid-1][OBJECT_DATA_MATINDEX_TYPE][materialindex];
  36. return 1;
  37. }
  38. MigrateObjectAttachData(from_objectid, to_objectid, attachtoid) {
  39. switch( g_ObjectData[from_objectid-1][OBJECT_DATA_ATTACH_IDTYPE] ) {
  40. case ID_TYPE_OBJECT, ID_TYPE_VEHICLE: {
  41. }
  42. default: {
  43. return 0;
  44. }
  45. }
  46. g_ObjectData[to_objectid-1][OBJECT_DATA_ATTACH_IDTYPE] = g_ObjectData[from_objectid-1][OBJECT_DATA_ATTACH_IDTYPE];
  47. g_ObjectData[to_objectid-1][OBJECT_DATA_ATTACH_ID] = attachtoid;
  48. g_ObjectData[to_objectid-1][OBJECT_DATA_ATTACH_X] = g_ObjectData[from_objectid-1][OBJECT_DATA_ATTACH_X];
  49. g_ObjectData[to_objectid-1][OBJECT_DATA_ATTACH_Y] = g_ObjectData[from_objectid-1][OBJECT_DATA_ATTACH_Y];
  50. g_ObjectData[to_objectid-1][OBJECT_DATA_ATTACH_Z] = g_ObjectData[from_objectid-1][OBJECT_DATA_ATTACH_Z];
  51. g_ObjectData[to_objectid-1][OBJECT_DATA_ATTACH_RX] = g_ObjectData[from_objectid-1][OBJECT_DATA_ATTACH_RX];
  52. g_ObjectData[to_objectid-1][OBJECT_DATA_ATTACH_RY] = g_ObjectData[from_objectid-1][OBJECT_DATA_ATTACH_RY];
  53. g_ObjectData[to_objectid-1][OBJECT_DATA_ATTACH_RZ] = g_ObjectData[from_objectid-1][OBJECT_DATA_ATTACH_RZ];
  54. return 1;
  55. }
  56. DefaultObjectMaterialIndexData(objectid, materialindex) {
  57. switch( g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_TYPE][materialindex] ) {
  58. case MATERIALINDEX_TYPE_TEXTURE: {
  59. g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_TEXTURE][materialindex] = INVALID_TEXTURE_ID;
  60. g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_COLOR][materialindex] = 0x0;
  61. }
  62. case MATERIALINDEX_TYPE_TEXT: {
  63. strpack(g_ObjectText[objectid-1][materialindex], "Example Text", MAX_OBJECT_TEXT+1);
  64. g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_SIZE][materialindex] = OBJECT_MATERIAL_SIZE_256x128;
  65. strpack(g_ObjectFont[objectid-1][materialindex], "Arial", MAX_FONTNAME_LEN+1);
  66. g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_FONTSIZE][materialindex] = 24;
  67. g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_ISBOLD][materialindex] = true;
  68. g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_FONTCOLOR][materialindex] = 0xFFFFFFFF;
  69. g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_COLOR][materialindex] = 0x0;
  70. g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_ALIGNMENT][materialindex] = 0;
  71. }
  72. }
  73. }
  74. ApplyObjectMaterialIndexData(objectid, materialindex) {
  75. switch( g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_TYPE][materialindex] ) {
  76. case MATERIALINDEX_TYPE_TEXTURE: {
  77. new
  78. textureid = g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_TEXTURE][materialindex],
  79. modelid
  80. ;
  81. GetTextureData(textureid, modelid, g_TextureTXDString, sizeof g_TextureTXDString, g_TextureNameString, sizeof g_TextureNameString);
  82. SetObjectMaterial(objectid, materialindex, modelid, g_TextureTXDString, g_TextureNameString, g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_COLOR][materialindex]);
  83. }
  84. case MATERIALINDEX_TYPE_TEXT: {
  85. strunpack(g_ObjectTextString, g_ObjectText[objectid-1][materialindex], MAX_OBJECT_TEXT+1);
  86. strunpack(g_FontString, g_ObjectFont[objectid-1][materialindex], MAX_FONTNAME_LEN+1);
  87. SetObjectMaterialText(objectid,
  88. g_ObjectTextString,
  89. materialindex,
  90. g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_SIZE][materialindex],
  91. g_FontString,
  92. g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_FONTSIZE][materialindex],
  93. g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_ISBOLD][materialindex],
  94. g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_FONTCOLOR][materialindex],
  95. g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_COLOR][materialindex],
  96. g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_ALIGNMENT][materialindex]
  97. );
  98. }
  99. default: {
  100. return 0;
  101. }
  102. }
  103. return 1;
  104. }
  105. ApplyObjectAttachData(objectid) {
  106. switch( g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_IDTYPE] ) {
  107. case ID_TYPE_OBJECT: {
  108. AttachObjectToObject(objectid,
  109. g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_ID],
  110. g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_X],
  111. g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_Y],
  112. g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_Z],
  113. g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_RX],
  114. g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_RY],
  115. g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_RZ]
  116. );
  117. }
  118. case ID_TYPE_VEHICLE: {
  119. AttachObjectToVehicle(objectid,
  120. g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_ID],
  121. g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_X],
  122. g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_Y],
  123. g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_Z],
  124. g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_RX],
  125. g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_RY],
  126. g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_RZ]
  127. );
  128. }
  129. default: {
  130. return 0;
  131. }
  132. }
  133. return 1;
  134. }
  135. CopyObject(copy_objectid, bool:copy_attachto = true) {
  136. if( !IsValidObject(copy_objectid) ) {
  137. return INVALID_OBJECT_ID;
  138. }
  139. new
  140. modelid = GetObjectModel(copy_objectid),
  141. Float: x,
  142. Float: y,
  143. Float: z,
  144. Float: rx,
  145. Float: ry,
  146. Float: rz,
  147. attachtoid = g_ObjectData[copy_objectid-1][OBJECT_DATA_ATTACH_ID],
  148. bool: isvalid_attachto_object,
  149. bool: isvalid_attachto_vehicle
  150. ;
  151. switch( g_ObjectData[copy_objectid-1][OBJECT_DATA_ATTACH_IDTYPE] ) {
  152. case ID_TYPE_OBJECT: {
  153. isvalid_attachto_object = IsValidObject(attachtoid) ? true : false;
  154. }
  155. case ID_TYPE_VEHICLE: {
  156. isvalid_attachto_vehicle = IsValidVehicle(attachtoid) ? true : false;
  157. }
  158. }
  159. if( isvalid_attachto_object || isvalid_attachto_vehicle ) {
  160. new
  161. Float: att_x,
  162. Float: att_y,
  163. Float: att_z,
  164. Float: att_rx,
  165. Float: att_ry,
  166. Float: att_rz,
  167. Float: off_x,
  168. Float: off_y,
  169. Float: off_z,
  170. Float: off_rx,
  171. Float: off_ry,
  172. Float: off_rz
  173. ;
  174. if( isvalid_attachto_object ) {
  175. GetObjectPos(attachtoid, att_x, att_y, att_z);
  176. GetObjectRot(attachtoid, att_rx, att_ry, att_rz);
  177. } else if( isvalid_attachto_vehicle ) {
  178. GetVehiclePos(attachtoid, att_x, att_y, att_z);
  179. GetVehicleZAngle(attachtoid, att_rz);
  180. }
  181. off_x = g_ObjectData[copy_objectid-1][OBJECT_DATA_ATTACH_X ];
  182. off_y = g_ObjectData[copy_objectid-1][OBJECT_DATA_ATTACH_Y ];
  183. off_z = g_ObjectData[copy_objectid-1][OBJECT_DATA_ATTACH_Z ];
  184. off_rx = g_ObjectData[copy_objectid-1][OBJECT_DATA_ATTACH_RX];
  185. off_ry = g_ObjectData[copy_objectid-1][OBJECT_DATA_ATTACH_RY];
  186. off_rz = g_ObjectData[copy_objectid-1][OBJECT_DATA_ATTACH_RZ];
  187. PositionFromOffset(
  188. att_x,
  189. att_y,
  190. att_z,
  191. att_rx,
  192. att_ry,
  193. att_rz,
  194. off_x,
  195. off_y,
  196. off_z,
  197. x,
  198. y,
  199. z
  200. );
  201. rx = att_rx + off_rx;
  202. ry = att_ry + off_ry;
  203. rz = att_rz + off_rz;
  204. } else {
  205. GetObjectPos(copy_objectid, x, y, z);
  206. GetObjectRot(copy_objectid, rx, ry, rz);
  207. }
  208. new paste_objectid = CreateObject(modelid, x, y, z, rx, ry, rz);
  209. if( paste_objectid == INVALID_OBJECT_ID ) {
  210. return INVALID_OBJECT_ID;
  211. }
  212. for(new materialindex; materialindex < MAX_OBJECT_INDEX; materialindex ++) {
  213. if( MigrateObjectMaterialIndexData(copy_objectid, paste_objectid, materialindex) ) {
  214. ApplyObjectMaterialIndexData(paste_objectid, materialindex);
  215. }
  216. }
  217. strunpack(g_CommentString, g_ObjectData[copy_objectid-1][OBJECT_DATA_COMMENT], sizeof g_CommentString); // Copy Comment
  218. strpack(g_ObjectData[paste_objectid-1][OBJECT_DATA_COMMENT], g_CommentString, sizeof g_CommentString); // Paste Comment
  219. g_ObjectData[paste_objectid-1][OBJECT_DATA_MEMORY_X ] = g_ObjectData[copy_objectid-1][OBJECT_DATA_MEMORY_X ];
  220. g_ObjectData[paste_objectid-1][OBJECT_DATA_MEMORY_Y ] = g_ObjectData[copy_objectid-1][OBJECT_DATA_MEMORY_Y ];
  221. g_ObjectData[paste_objectid-1][OBJECT_DATA_MEMORY_Z ] = g_ObjectData[copy_objectid-1][OBJECT_DATA_MEMORY_Z ];
  222. g_ObjectData[paste_objectid-1][OBJECT_DATA_MEMORY_RX] = g_ObjectData[copy_objectid-1][OBJECT_DATA_MEMORY_RX];
  223. g_ObjectData[paste_objectid-1][OBJECT_DATA_MEMORY_RY] = g_ObjectData[copy_objectid-1][OBJECT_DATA_MEMORY_RY];
  224. g_ObjectData[paste_objectid-1][OBJECT_DATA_MEMORY_RZ] = g_ObjectData[copy_objectid-1][OBJECT_DATA_MEMORY_RZ];
  225. if( copy_attachto ) {
  226. if( MigrateObjectAttachData(copy_objectid, paste_objectid, attachtoid) ) {
  227. ApplyObjectAttachData(paste_objectid);
  228. }
  229. }
  230. return paste_objectid;
  231. }
  232. RecreateObject(copy_objectid, bool:copy_attachto = true) {
  233. new paste_objectid = CopyObject(copy_objectid, copy_attachto);
  234. if( paste_objectid != INVALID_OBJECT_ID ) {
  235. TransferObjectAttachments(copy_objectid, paste_objectid);
  236. for(new playerid, max_playerid = GetPlayerPoolSize(); playerid <= max_playerid; playerid ++) {
  237. if( !IsPlayerConnected(playerid) ) {
  238. continue;
  239. }
  240. if( GetPlayerEditObject(playerid) == copy_objectid ) {
  241. g_PlayerData[playerid][PLAYER_DATA_EDIT_ID] = paste_objectid;
  242. }
  243. if( g_PlayerData[playerid][PLAYER_DATA_EDIT_ATTACHOBJECT] == copy_objectid ) {
  244. g_PlayerData[playerid][PLAYER_DATA_EDIT_ATTACHOBJECT] = paste_objectid;
  245. }
  246. if( g_PlayerData[playerid][PLAYER_DATA_EDIT_MATERIALOBJ] == copy_objectid ) {
  247. g_PlayerData[playerid][PLAYER_DATA_EDIT_MATERIALOBJ] = paste_objectid;
  248. }
  249. for(new row; row < MAX_SELECTLIST_ROWS; row ++) {
  250. if( copy_objectid != g_SelectObjListData[playerid][SELECTLIST_DATA_ROW_ID][row] ) {
  251. continue;
  252. }
  253. g_SelectObjListData[playerid][SELECTLIST_DATA_ROW_ID][row] = paste_objectid;
  254. if( g_PlayerData[playerid][PLAYER_DATA_TDMODE] == TDMODE_SELECTLIST_OBJECT ) {
  255. ApplySelectListRowData(playerid, row);
  256. }
  257. }
  258. }
  259. DestroyObject(copy_objectid);
  260. }
  261. return paste_objectid;
  262. }
  263. CopyObjectAttachments(from_objectid, to_objectid) {
  264. for(new loop_objectid = 1; loop_objectid <= MAX_OBJECTS; loop_objectid ++) {
  265. if( !IsValidObject(loop_objectid) || loop_objectid == from_objectid || loop_objectid == to_objectid ) {
  266. continue;
  267. }
  268. if( GetObjectAttachObject(loop_objectid) != from_objectid ) {
  269. continue;
  270. }
  271. new paste_objectid = CopyObject(loop_objectid, .copy_attachto = false);
  272. if( paste_objectid == INVALID_OBJECT_ID ) {
  273. return 0;
  274. }
  275. if( MigrateObjectAttachData(.from_objectid = loop_objectid, .to_objectid = paste_objectid, .attachtoid = to_objectid) ) {
  276. ApplyObjectAttachData(paste_objectid);
  277. }
  278. }
  279. return 1;
  280. }
  281. TransferObjectAttachments(from_objectid, to_objectid) {
  282. for(new loop_objectid = 1; loop_objectid <= MAX_OBJECTS; loop_objectid ++) {
  283. if( !IsValidObject(loop_objectid) || loop_objectid == from_objectid || loop_objectid == to_objectid ) {
  284. continue;
  285. }
  286. if( GetObjectAttachObject(loop_objectid) == from_objectid ) {
  287. g_ObjectData[loop_objectid-1][OBJECT_DATA_ATTACH_ID] = to_objectid;
  288. ApplyObjectAttachData(loop_objectid);
  289. }
  290. }
  291. }
  292. ShowObjectDialog(playerid, dialogid) {
  293. switch( dialogid ) {
  294. case DIALOGID_OBJECT_MAIN: {
  295. new objectid = GetPlayerEditObject(playerid);
  296. if( !IsValidObject(objectid) ) {
  297. return 1;
  298. }
  299. g_DialogInfo = "";
  300. for(new listitem; listitem < MAX_LISTITEMS_OBJECT; listitem ++) {
  301. switch(listitem) {
  302. case LISTITEM_OBJECT_GOTO: {
  303. strcat(g_DialogInfo, "Goto\t \n");
  304. }
  305. case LISTITEM_OBJECT_GET: {
  306. strcat(g_DialogInfo, "Get\t \n");
  307. }
  308. case LISTITEM_OBJECT_COORD: {
  309. if( g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_IDTYPE] == ID_TYPE_NONE ) {
  310. strcat(g_DialogInfo, "Coordinates & Rotation\t \n");
  311. } else {
  312. strcat(g_DialogInfo, "Offset & Rotation\t \n");
  313. }
  314. }
  315. case LISTITEM_OBJECT_MOVE: {
  316. if( g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_IDTYPE] == ID_TYPE_NONE ) {
  317. strcat(g_DialogInfo, "Click & Drag Move\t \n");
  318. } else {
  319. strcat(g_DialogInfo, "Toggle Offset Editor\t \n");
  320. }
  321. }
  322. case LISTITEM_OBJECT_ATTACH_SELECT: {
  323. strcat(g_DialogInfo, "Select as Attachment\t \n");
  324. }
  325. case LISTITEM_OBJECT_ATTACH_APPLY: {
  326. new attachobject = g_PlayerData[playerid][PLAYER_DATA_EDIT_ATTACHOBJECT];
  327. if( !IsValidObject(attachobject) || attachobject == objectid ) {
  328. strcat(g_DialogInfo, " \t \n");
  329. } else {
  330. strunpack(g_CommentString, g_ObjectData[attachobject-1][OBJECT_DATA_COMMENT], MAX_COMMENT_LEN+1);
  331. format(g_DialogInfoRow, sizeof g_DialogInfoRow, "Attach Selected Object\t%s\n", g_CommentString);
  332. strcat(g_DialogInfo, g_DialogInfoRow);
  333. }
  334. }
  335. case LISTITEM_OBJECT_ATTACH_REMOVE: {
  336. switch( g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_IDTYPE] ) {
  337. case ID_TYPE_OBJECT: {
  338. new attachobject = g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_ID];
  339. strunpack(g_CommentString, g_ObjectData[attachobject-1][OBJECT_DATA_COMMENT], MAX_COMMENT_LEN+1);
  340. format(g_DialogInfoRow, sizeof g_DialogInfoRow, "Un-Attach from Object\t%s\n", g_CommentString );
  341. strcat(g_DialogInfo, g_DialogInfoRow);
  342. }
  343. case ID_TYPE_VEHICLE: {
  344. new attachvehicle = g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_ID];
  345. strunpack(g_CommentString, g_VehicleData[attachvehicle-1][VEHICLE_DATA_COMMENT], MAX_COMMENT_LEN+1);
  346. format(g_DialogInfoRow, sizeof g_DialogInfoRow, "Un-Attach from Vehicle\t%s\n", g_CommentString );
  347. strcat(g_DialogInfo, g_DialogInfoRow);
  348. }
  349. default: {
  350. strcat(g_DialogInfo, "Attempt to Un-Attach\t \n");
  351. }
  352. }
  353. }
  354. case LISTITEM_OBJECT_MATERIALS_COPY: {
  355. strcat(g_DialogInfo, "Select Material Data\t \n");
  356. }
  357. case LISTITEM_OBJECT_MATERIALS_PASTE: {
  358. new copy_from_objectid = g_PlayerData[playerid][PLAYER_DATA_EDIT_MATERIALOBJ];
  359. if( !IsValidObject(copy_from_objectid) || objectid == copy_from_objectid ) {
  360. strcat(g_DialogInfo, " \t \n");
  361. } else {
  362. strunpack(g_CommentString, g_ObjectData[copy_from_objectid-1][OBJECT_DATA_COMMENT], MAX_COMMENT_LEN+1);
  363. format(g_DialogInfoRow, sizeof g_DialogInfoRow, "Paste Material Data from\t%s\n", g_CommentString);
  364. strcat(g_DialogInfo, g_DialogInfoRow);
  365. }
  366. }
  367. case LISTITEM_OBJECT_DUPLICATE: {
  368. strcat(g_DialogInfo, "Duplicate\t \n");
  369. }
  370. case LISTITEM_OBJECT_RECREATE: {
  371. strcat(g_DialogInfo, "Recreate\t \n");
  372. }
  373. case LISTITEM_OBJECT_REMOVE: {
  374. strcat(g_DialogInfo, "Remove\t \n");
  375. }
  376. case LISTITEM_OBJECT_COMMENT: {
  377. strunpack(g_CommentString, g_ObjectData[objectid-1][OBJECT_DATA_COMMENT], MAX_COMMENT_LEN+1);
  378. format(g_DialogInfoRow, sizeof g_DialogInfoRow, "Comment\t%s\n", g_CommentString);
  379. strcat(g_DialogInfo, g_DialogInfoRow);
  380. }
  381. case LISTITEM_OBJECT_COMMENT_RESET: {
  382. GetModelName(GetObjectModel(objectid), g_ModelString, sizeof g_ModelString);
  383. format(g_DialogInfoRow, sizeof g_DialogInfoRow, "Reset Comment To\t%s\n", g_ModelString);
  384. strcat(g_DialogInfo, g_DialogInfoRow);
  385. }
  386. case LISTITEM_OBJECT_INDEX_START..LISTITEM_OBJECT_INDEX_END: {
  387. new materialindex = listitem - LISTITEM_OBJECT_INDEX_START;
  388. switch( g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_TYPE][materialindex] ) {
  389. case MATERIALINDEX_TYPE_TEXTURE: {
  390. new
  391. textureid = g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_TEXTURE][materialindex],
  392. color_argb = g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_COLOR][materialindex],
  393. color_rgb = ARGBtoRGB(color_argb)
  394. ;
  395. if( textureid == INVALID_TEXTURE_ID ) {
  396. format(g_DialogInfoRow, sizeof g_DialogInfoRow, "Material Index %i\t{%06x}Color\n", materialindex, color_rgb);
  397. } else {
  398. new modelid;
  399. GetTextureData(textureid, modelid, g_TextureTXDString, sizeof g_TextureTXDString, g_TextureNameString, sizeof g_TextureNameString);
  400. format(g_DialogInfoRow, sizeof g_DialogInfoRow, "Material Index %i\t{%06x}%i %s %s\n", materialindex, color_rgb, modelid, g_TextureTXDString, g_TextureNameString);
  401. }
  402. }
  403. case MATERIALINDEX_TYPE_TEXT: {
  404. new
  405. color_argb = g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_FONTCOLOR][materialindex],
  406. color_rgb = ARGBtoRGB(color_argb)
  407. ;
  408. strunpack(g_ObjectTextString, g_ObjectText[objectid-1][materialindex], sizeof g_ObjectTextString);
  409. format(g_DialogInfoRow, sizeof g_DialogInfoRow, "Material Index %i\t{%06x}%s\n", materialindex, color_rgb, g_ObjectTextString);
  410. }
  411. default: {
  412. format(g_DialogInfoRow, sizeof g_DialogInfoRow, "Material Index %i\tDefault / Unknown\n", materialindex);
  413. }
  414. }
  415. strcat(g_DialogInfo, g_DialogInfoRow);
  416. }
  417. default: {
  418. strcat(g_DialogInfo, " \t \n");
  419. }
  420. }
  421. }
  422. ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_TABLIST, "Object", g_DialogInfo, "Select", "Cancel");
  423. }
  424. case DIALOGID_OBJECT_INDEX: {
  425. new objectid = GetPlayerEditObject(playerid);
  426. if( !IsValidObject(objectid) ) {
  427. return 1;
  428. }
  429. new
  430. materialindex = g_PlayerData[playerid][PLAYER_DATA_EDIT_OBJMATIDX],
  431. indextype = g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_TYPE][materialindex]
  432. ;
  433. format(g_DialogCaption, sizeof g_DialogCaption, "Material Index: %i", materialindex);
  434. g_DialogInfo = "";
  435. for(new listitem; listitem < MAX_LISTITEMS_OINDEX; listitem ++) {
  436. switch(listitem) {
  437. case LISTITEM_OINDEX_REMOVE: {
  438. strcat(g_DialogInfo, "All\tReset Material Index\t-\n");
  439. }
  440. case LISTITEM_OINDEX_MAT: {
  441. if( indextype == MATERIALINDEX_TYPE_TEXTURE ) {
  442. new
  443. textureid = g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_TEXTURE][materialindex],
  444. modelid
  445. ;
  446. GetTextureData(textureid, modelid, g_TextureTXDString, sizeof g_TextureTXDString, g_TextureNameString, sizeof g_TextureNameString);
  447. format(g_DialogInfoRow, sizeof g_DialogInfoRow, "Texture\tTexture\t%i %s %s\n", modelid, g_TextureTXDString, g_TextureNameString);
  448. strcat(g_DialogInfo, g_DialogInfoRow);
  449. } else {
  450. strcat(g_DialogInfo, "Texture\tTexture\t-\n");
  451. }
  452. }
  453. case LISTITEM_OINDEX_MAT_COLOR_S: {
  454. if( indextype == MATERIALINDEX_TYPE_TEXTURE ) {
  455. new argb = g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_COLOR][materialindex];
  456. format(g_DialogInfoRow, sizeof g_DialogInfoRow, "Texture\tColor\t{%06x}Color\n", ARGBtoRGB(argb) );
  457. strcat(g_DialogInfo, g_DialogInfoRow);
  458. } else {
  459. strcat(g_DialogInfo, "Texture\tColor\t-\n");
  460. }
  461. }
  462. case LISTITEM_OINDEX_MAT_COLOR_A: {
  463. if( indextype == MATERIALINDEX_TYPE_TEXTURE ) {
  464. new argb = g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_COLOR][materialindex];
  465. format(g_DialogInfoRow, sizeof g_DialogInfoRow, "Texture\tAlpha\t%i/%i\n", ARGBtoA(argb), 0xFF );
  466. strcat(g_DialogInfo, g_DialogInfoRow);
  467. } else {
  468. strcat(g_DialogInfo, "Texture\tAlpha\t-\n");
  469. }
  470. }
  471. case LISTITEM_OINDEX_MAT_COLOR_R: {
  472. strcat(g_DialogInfo, "Texture\tReset Color\t-\n");
  473. }
  474. case LISTITEM_OINDEX_TXT: {
  475. if( indextype == MATERIALINDEX_TYPE_TEXT ) {
  476. strunpack(g_ObjectTextString, g_ObjectText[objectid-1][materialindex], MAX_OBJECT_TEXT+1);
  477. format(g_DialogInfoRow, sizeof g_DialogInfoRow, "Text\tString\t%s\n", g_ObjectTextString );
  478. strcat(g_DialogInfo, g_DialogInfoRow);
  479. } else {
  480. strcat(g_DialogInfo, "Text\tString\t-\n");
  481. }
  482. }
  483. case LISTITEM_OINDEX_TXT_MATSIZE: {
  484. if( indextype == MATERIALINDEX_TYPE_TEXT ) {
  485. new materialsize = g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_SIZE][materialindex];
  486. GetMaterialSizeName(materialsize, g_MaterialSizeString, sizeof g_MaterialSizeString);
  487. format(g_DialogInfoRow, sizeof g_DialogInfoRow, "Text\tMaterial Size\t%s\n", g_MaterialSizeString);
  488. strcat(g_DialogInfo, g_DialogInfoRow);
  489. } else {
  490. strcat(g_DialogInfo, "Text\tMaterial Size\t-\n");
  491. }
  492. }
  493. case LISTITEM_OINDEX_TXT_FONTFACE: {
  494. if(indextype == MATERIALINDEX_TYPE_TEXT) {
  495. strunpack(g_FontString, g_ObjectFont[objectid-1][materialindex], MAX_FONTNAME_LEN+1);
  496. format(g_DialogInfoRow, sizeof g_DialogInfoRow, "Text\tFont Face\t%s\n", g_FontString );
  497. strcat(g_DialogInfo, g_DialogInfoRow);
  498. } else {
  499. strcat(g_DialogInfo, "Text\tFont Face\t-\n");
  500. }
  501. }
  502. case LISTITEM_OINDEX_TXT_FONTSIZE: {
  503. if(indextype == MATERIALINDEX_TYPE_TEXT) {
  504. new fontsize = g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_FONTSIZE][materialindex];
  505. format(g_DialogInfoRow, sizeof g_DialogInfoRow, "Text\tFont Size\t%i\n", fontsize );
  506. strcat(g_DialogInfo, g_DialogInfoRow);
  507. } else {
  508. strcat(g_DialogInfo, "Text\tFont Size\t-\n");
  509. }
  510. }
  511. case LISTITEM_OINDEX_TXT_ISBOLD: {
  512. if(indextype == MATERIALINDEX_TYPE_TEXT) {
  513. format(g_DialogInfoRow, sizeof g_DialogInfoRow, "Text\tFont Bold\t%s\n", g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_ISBOLD][materialindex] ? ("Yes") : ("No") );
  514. strcat(g_DialogInfo, g_DialogInfoRow);
  515. } else {
  516. strcat(g_DialogInfo, "Text\tFont Bold\t-\n");
  517. }
  518. }
  519. case LISTITEM_OINDEX_TXT_ALIGN: {
  520. if(indextype == MATERIALINDEX_TYPE_TEXT) {
  521. new alignment = g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_ALIGNMENT][materialindex];
  522. GetAlignmentName(alignment, g_MaterialAlignString, sizeof g_MaterialAlignString);
  523. format(g_DialogInfoRow, sizeof g_DialogInfoRow, "Text\tFont Alignment\t%s\n", g_MaterialAlignString );
  524. strcat(g_DialogInfo, g_DialogInfoRow);
  525. } else {
  526. strcat(g_DialogInfo, "Text\tFont Alignment\t-\n");
  527. }
  528. }
  529. case LISTITEM_OINDEX_TXT_FONTCOLOR_S: {
  530. if(indextype == MATERIALINDEX_TYPE_TEXT) {
  531. new fontcolor = g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_FONTCOLOR][materialindex];
  532. format(g_DialogInfoRow, sizeof g_DialogInfoRow, "Text\tFont Color\t{%06x}Color\n", ARGBtoRGB( fontcolor ) );
  533. strcat(g_DialogInfo, g_DialogInfoRow);
  534. } else {
  535. strcat(g_DialogInfo, "Text\tFont Color\t-\n");
  536. }
  537. }
  538. case LISTITEM_OINDEX_TXT_FONTCOLOR_A: {
  539. if(indextype == MATERIALINDEX_TYPE_TEXT) {
  540. new fontcolor = g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_FONTCOLOR][materialindex];
  541. format(g_DialogInfoRow, sizeof g_DialogInfoRow, "Text\tFont Alpha\t%i/%i\n", ARGBtoA( fontcolor ), 0xFF);
  542. strcat(g_DialogInfo, g_DialogInfoRow);
  543. } else {
  544. strcat(g_DialogInfo, "Text\tFont Alpha\t-\n");
  545. }
  546. }
  547. case LISTITEM_OINDEX_TXT_BACKCOLOR_S: {
  548. if( indextype == MATERIALINDEX_TYPE_TEXT ) {
  549. new argb = g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_COLOR][materialindex];
  550. format(g_DialogInfoRow, sizeof g_DialogInfoRow, "Text\tBackground Color\t{%06x}Color\n", ARGBtoRGB( argb ) );
  551. strcat(g_DialogInfo, g_DialogInfoRow);
  552. } else {
  553. strcat(g_DialogInfo, "Text\tBackground Color\t-\n");
  554. }
  555. }
  556. case LISTITEM_OINDEX_TXT_BACKCOLOR_O: {
  557. strcat(g_DialogInfo, "Text\tBackground Opaque\t-\n");
  558. }
  559. case LISTITEM_OINDEX_TXT_BACKCOLOR_T: {
  560. strcat(g_DialogInfo, "Text\tBackground Transparent\t-\n");
  561. }
  562. default: {
  563. strcat(g_DialogInfo, "-\t-\t-\n");
  564. }
  565. }
  566. }
  567. ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_TABLIST, g_DialogCaption, g_DialogInfo, "Select", "Cancel");
  568. }
  569. case DIALOGID_OBJECT_COORD: {
  570. new objectid = GetPlayerEditObject(playerid);
  571. if( !IsValidObject(objectid) ) {
  572. return 1;
  573. }
  574. new Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz;
  575. if( g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_IDTYPE] == ID_TYPE_NONE ) {
  576. GetObjectPos(objectid, x, y, z);
  577. GetObjectRot(objectid, rx, ry, rz);
  578. } else {
  579. x = g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_X];
  580. y = g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_Y];
  581. z = g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_Z];
  582. rx = g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_RX];
  583. ry = g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_RY];
  584. rz = g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_RZ];
  585. }
  586. g_DialogInfo = "";
  587. format(g_DialogInfoRow, sizeof g_DialogInfoRow, "x \t%f\n", x ), strcat(g_DialogInfo, g_DialogInfoRow);
  588. format(g_DialogInfoRow, sizeof g_DialogInfoRow, "y \t%f\n", y ), strcat(g_DialogInfo, g_DialogInfoRow);
  589. format(g_DialogInfoRow, sizeof g_DialogInfoRow, "z \t%f\n", z ), strcat(g_DialogInfo, g_DialogInfoRow);
  590. format(g_DialogInfoRow, sizeof g_DialogInfoRow, "rx\t%f\n", rx), strcat(g_DialogInfo, g_DialogInfoRow);
  591. format(g_DialogInfoRow, sizeof g_DialogInfoRow, "ry\t%f\n", ry), strcat(g_DialogInfo, g_DialogInfoRow);
  592. format(g_DialogInfoRow, sizeof g_DialogInfoRow, "rz\t%f\n", rz), strcat(g_DialogInfo, g_DialogInfoRow);
  593. ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, "Object Coordinates", g_DialogInfo, "Enter", "Cancel");
  594. }
  595. case DIALOGID_OBJECT_COMMENT: {
  596. new objectid = GetPlayerEditObject(playerid);
  597. if( !IsValidObject(objectid) ) {
  598. return 1;
  599. }
  600. strunpack(g_CommentString, g_ObjectData[objectid-1][OBJECT_DATA_COMMENT], MAX_COMMENT_LEN+1);
  601. format(g_DialogInfo, sizeof g_DialogInfo, "Current Comment: %s", g_CommentString);
  602. ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, "Object Comment", g_DialogInfo, "Enter", "Cancel");
  603. }
  604. case DIALOGID_OBJECT_MATSIZE: {
  605. g_DialogInfo = "";
  606. for(new i; i < MAX_MATERIAL_SIZES; i ++) {
  607. new materialsize = (i + 1) * 10;
  608. GetMaterialSizeName(materialsize, g_MaterialSizeString, sizeof g_MaterialSizeString);
  609. format(g_DialogInfoRow, sizeof g_DialogInfoRow, "%i\t%s\n", materialsize, g_MaterialSizeString);
  610. strcat(g_DialogInfo, g_DialogInfoRow);
  611. }
  612. ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_TABLIST, "Material Sizes", g_DialogInfo, "Select", "Cancel");
  613. }
  614. case DIALOGID_OBJECT_TEXT: {
  615. new objectid = GetPlayerEditObject(playerid);
  616. if( !IsValidObject(objectid) ) {
  617. return 1;
  618. }
  619. new materialindex = g_PlayerData[playerid][PLAYER_DATA_EDIT_OBJMATIDX];
  620. strunpack(g_ObjectTextString, g_ObjectText[objectid-1][materialindex], MAX_OBJECT_TEXT+1);
  621. format(g_DialogInfo, sizeof g_DialogInfo, "Current Text: %s", g_ObjectTextString);
  622. ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, "Object Text", g_DialogInfo, "Enter", "Cancel");
  623. }
  624. case DIALOGID_OBJECT_FONTSIZE: {
  625. new objectid = GetPlayerEditObject(playerid);
  626. if( !IsValidObject(objectid) ) {
  627. return 1;
  628. }
  629. new
  630. materialindex = g_PlayerData[playerid][PLAYER_DATA_EDIT_OBJMATIDX],
  631. fontsize = g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_FONTSIZE][materialindex]
  632. ;
  633. format(g_DialogInfo, sizeof g_DialogInfo, "Current Value: %i/%i", fontsize, MAX_OBJECT_FONTSIZE);
  634. ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, "Object Font Size", g_DialogInfo, "Enter", "Cancel");
  635. }
  636. case DIALOGID_COLORALPHA_TEXTURE, DIALOGID_COLORALPHA_FONTFACE: {
  637. new objectid = GetPlayerEditObject(playerid);
  638. if( !IsValidObject(objectid) ) {
  639. return 1;
  640. }
  641. new materialindex = g_PlayerData[playerid][PLAYER_DATA_EDIT_OBJMATIDX];
  642. switch( dialogid ) {
  643. case DIALOGID_COLORALPHA_TEXTURE: {
  644. g_DialogCaption = "Object Material Alpha";
  645. if( g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_TYPE][materialindex] == MATERIALINDEX_TYPE_TEXTURE ) {
  646. new argb = g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_COLOR][materialindex];
  647. format(g_DialogInfo, sizeof g_DialogInfo, "Current Value: %i/%i", ARGBtoA( argb ), 0xFF);
  648. } else {
  649. g_DialogInfo = "Current Value: none";
  650. }
  651. }
  652. case DIALOGID_COLORALPHA_FONTFACE: {
  653. g_DialogCaption = "Object Text Alpha";
  654. if( g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_TYPE][materialindex] == MATERIALINDEX_TYPE_TEXT ) {
  655. new argb = g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_FONTCOLOR][materialindex];
  656. format(g_DialogInfo, sizeof g_DialogInfo, "Current Value: %i/%i", ARGBtoA( argb ), 0xFF);
  657. } else {
  658. g_DialogInfo = "Current Value: none";
  659. }
  660. }
  661. default: {
  662. return 0;
  663. }
  664. }
  665. ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, g_DialogCaption, g_DialogInfo, "Enter", "Cancel");
  666. }
  667. default: {
  668. return 0;
  669. }
  670. }
  671. return 1;
  672. }
  673. FindObjects(result[], result_size, search[], offset, &max_offset) {
  674. new
  675. rows_found,
  676. rows_added,
  677. search_int = -1,
  678. packed_search[MAX_SEARCH_LEN+1 char]
  679. ;
  680. sscanf(search, "i", search_int);
  681. strpack(packed_search, search);
  682. for(new objectid = 1, modelid, cache_index; objectid <= MAX_OBJECTS; objectid ++) {
  683. if( !IsValidObject(objectid) ) {
  684. continue;
  685. }
  686. modelid = GetObjectModel(objectid);
  687. cache_index = GetModelCacheIndex(modelid);
  688. if(
  689. isempty(search) ||
  690. search_int == objectid ||
  691. search_int == modelid ||
  692. strfind(g_ObjectData[objectid-1][OBJECT_DATA_COMMENT], packed_search, true) != -1 ||
  693. ( cache_index != INVALID_ARRAY_INDEX && strfind(g_ModelCache[cache_index][MODEL_CACHE_NAME], packed_search, true) != -1 )
  694. ) {
  695. if( rows_found ++ < offset ) {
  696. continue;
  697. }
  698. if( rows_added < result_size ) {
  699. result[rows_added ++] = objectid;
  700. }
  701. }
  702. }
  703. max_offset = rows_found - 1;
  704. if( max_offset < 0 ) {
  705. max_offset = 0;
  706. }
  707. return rows_added;
  708. }