func.pwn 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  1. ShowMapSaveDialog(playerid, dialogid) {
  2. switch( dialogid ) {
  3. case DIALOGID_MAP_SAVE_AS: {
  4. ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, "Save Map", "Enter a name for this map:", "Save", "Cancel");
  5. }
  6. case DIALOGID_MAP_SAVE_CONFIRM: {
  7. format(g_DialogInfo, sizeof g_DialogInfo, "Type & Enter \"%s\" to save this map.", SAVEMAP_COMMAND);
  8. ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, "Save Map", g_DialogInfo, "Save", "Cancel");
  9. }
  10. default: {
  11. return 0;
  12. }
  13. }
  14. return 1;
  15. }
  16. SaveMap(
  17. mapname[],
  18. &objects_saved,
  19. &vehicles_saved,
  20. &pickups_saved,
  21. &actors_saved,
  22. &attachments_saved,
  23. &buildings_saved,
  24. playerid = INVALID_PLAYER_ID
  25. ) {
  26. GetMapFilePath(mapname, g_FilePathString, sizeof g_FilePathString);
  27. new File:file_handle = fopen(g_FilePathString, io_write);
  28. if( !file_handle ) {
  29. return 0;
  30. }
  31. new
  32. slot_objectid [MAX_OBJECTS],
  33. objectid_slot [MAX_OBJECTS],
  34. valid_objects,
  35. slot_vehicleid [MAX_VEHICLES],
  36. vehicleid_slot [MAX_VEHICLES],
  37. valid_vehicles,
  38. slot_pickupid [MAX_PICKUPS],
  39. valid_pickups,
  40. slot_actorid [MAX_ACTORS],
  41. valid_actors
  42. ;
  43. for(new objectid = 1; objectid <= MAX_OBJECTS; objectid ++) {
  44. if(!IsValidObject(objectid)) {
  45. continue;
  46. }
  47. slot_objectid[valid_objects] = objectid;
  48. objectid_slot[objectid-1] = valid_objects ++;
  49. }
  50. for(new vehicleid = 1, max_vehicleid = GetVehiclePoolSize(); vehicleid <= max_vehicleid; vehicleid ++) {
  51. if( !IsValidVehicle(vehicleid) ) {
  52. continue;
  53. }
  54. slot_vehicleid[valid_vehicles] = vehicleid;
  55. vehicleid_slot[vehicleid-1] = valid_vehicles ++;
  56. }
  57. for(new pickupid; pickupid < MAX_PICKUPS; pickupid ++) {
  58. if( !g_PickupData[pickupid][PICKUP_DATA_ISVALID] ) {
  59. continue;
  60. }
  61. slot_pickupid[valid_pickups ++] = pickupid;
  62. }
  63. for(new actorid, max_actorid = GetActorPoolSize(); actorid <= max_actorid; actorid ++) {
  64. if( !IsValidActor(actorid) ) {
  65. continue;
  66. }
  67. slot_actorid[valid_actors ++] = actorid;
  68. }
  69. new write_string[500];
  70. if(valid_objects > 0) {
  71. format(write_string, sizeof write_string, "new g_Object[%i];\r\n", valid_objects);
  72. fwrite(file_handle, write_string);
  73. }
  74. if(valid_vehicles > 0) {
  75. format(write_string, sizeof write_string, "new g_Vehicle[%i];\r\n", valid_vehicles);
  76. fwrite(file_handle, write_string);
  77. }
  78. if(valid_pickups > 0) {
  79. format(write_string, sizeof write_string, "new g_Pickup[%i];\r\n", valid_pickups);
  80. fwrite(file_handle, write_string);
  81. }
  82. if(valid_actors > 0) {
  83. format(write_string, sizeof write_string, "new g_Actor[%i];\r\n", valid_actors);
  84. fwrite(file_handle, write_string);
  85. }
  86. for(new o; o < valid_objects; o ++) {
  87. new
  88. objectid = slot_objectid[o],
  89. Float:x,
  90. Float:y,
  91. Float:z,
  92. Float:rx,
  93. Float:ry,
  94. Float:rz
  95. ;
  96. GetObjectPos(objectid, x, y, z);
  97. GetObjectRot(objectid, rx, ry, rz);
  98. strunpack(g_CommentString, g_ObjectData[objectid-1][OBJECT_DATA_COMMENT], MAX_COMMENT_LEN+1);
  99. format(write_string, sizeof write_string,
  100. "g_Object[%i] = CreateObject(%i, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f); //%s\r\n",
  101. o, GetObjectModel(objectid), x, y, z, rx, ry, rz, g_CommentString
  102. );
  103. fwrite(file_handle, write_string);
  104. for(new materialindex; materialindex < MAX_OBJECT_INDEX; materialindex ++) {
  105. switch( g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_TYPE][materialindex] ) {
  106. case MATERIALINDEX_TYPE_TEXTURE: {
  107. new
  108. textureid = g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_TEXTURE][materialindex],
  109. modelid,
  110. txd[MAX_TEXTURE_TXD+1],
  111. name[MAX_TEXTURE_NAME+1]
  112. ;
  113. GetTextureData(textureid, modelid, txd, sizeof txd, name, sizeof name);
  114. format(write_string, sizeof write_string,
  115. "SetObjectMaterial(g_Object[%i], %i, %i, \"%s\", \"%s\", 0x%08x);\r\n", o, materialindex, modelid, txd, name, g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_COLOR][materialindex]
  116. );
  117. fwrite(file_handle, write_string);
  118. }
  119. case MATERIALINDEX_TYPE_TEXT: {
  120. strunpack(g_ObjectTextString, g_ObjectText[objectid-1][materialindex], MAX_OBJECT_TEXT+1);
  121. strunpack(g_FontString, g_ObjectFont[objectid-1][materialindex], MAX_FONTNAME_LEN+1);
  122. GetMaterialSizeName( g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_SIZE][materialindex], g_MaterialSizeString, sizeof g_MaterialSizeString );
  123. format(write_string, sizeof write_string,
  124. "SetObjectMaterialText(g_Object[%i], \"%s\", %i, %s, \"%s\", %i, %i, 0x%08x, 0x%08x, %i);\r\n", o,
  125. g_ObjectTextString,
  126. materialindex,
  127. g_MaterialSizeString,
  128. g_FontString,
  129. g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_FONTSIZE][materialindex],
  130. g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_ISBOLD][materialindex],
  131. g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_FONTCOLOR][materialindex],
  132. g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_COLOR][materialindex],
  133. g_ObjectData[objectid-1][OBJECT_DATA_MATINDEX_ALIGNMENT][materialindex]
  134. );
  135. fwrite(file_handle, write_string);
  136. }
  137. }
  138. }
  139. }
  140. for(new v; v < valid_vehicles; v ++) {
  141. new vehicleid = slot_vehicleid[v], Float:x, Float:y, Float:z, Float:r;
  142. GetVehiclePos(vehicleid, x, y, z);
  143. GetVehicleZAngle(vehicleid, r);
  144. strunpack(g_CommentString, g_VehicleData[vehicleid-1][VEHICLE_DATA_COMMENT], MAX_COMMENT_LEN+1); // Get Vehicle Comment
  145. format(write_string, sizeof write_string,
  146. "g_Vehicle[%i] = CreateVehicle(%i, %.4f, %.4f, %.4f, %.4f, %i, %i, -1); //%s\r\n", v,
  147. GetVehicleModel(vehicleid),
  148. x, y, z, r,
  149. g_VehicleData[vehicleid-1][VEHICLE_DATA_COLOR_1],
  150. g_VehicleData[vehicleid-1][VEHICLE_DATA_COLOR_2],
  151. g_CommentString
  152. );
  153. fwrite(file_handle, write_string);
  154. for(new slot; slot < 14; slot ++) {
  155. new componentid = GetVehicleComponentInSlot(vehicleid, slot);
  156. if(componentid) {
  157. GetModelName(componentid, g_ModelString, sizeof g_ModelString);
  158. format(write_string, sizeof write_string, "AddVehicleComponent(g_Vehicle[%i], %i);//%s\r\n", v, componentid, g_ModelString);
  159. fwrite(file_handle, write_string);
  160. }
  161. new paintjobid = g_VehicleData[vehicleid-1][VEHICLE_DATA_PAINTJOB];
  162. if( paintjobid != INVALID_PAINTJOB_ID ) {
  163. format(write_string, sizeof write_string, "ChangeVehiclePaintjob(g_Vehicle[%i], %i);\r\n", v, paintjobid);
  164. fwrite(file_handle, write_string);
  165. }
  166. }
  167. }
  168. for(new p; p < valid_pickups; p ++) {
  169. new
  170. pickupid = slot_pickupid[p],
  171. modelid = g_PickupData[pickupid][PICKUP_DATA_MODEL],
  172. Float:x = g_PickupData[pickupid][PICKUP_DATA_X],
  173. Float:y = g_PickupData[pickupid][PICKUP_DATA_Y],
  174. Float:z = g_PickupData[pickupid][PICKUP_DATA_Z]
  175. ;
  176. strunpack(g_CommentString, g_PickupData[pickupid][PICKUP_DATA_COMMENT], MAX_COMMENT_LEN+1); // Get Comment
  177. format(write_string, sizeof write_string,
  178. "g_Pickup[%i] = CreatePickup(%i, 1, %.4f, %.4f, %.4f, -1); //%s\r\n", p, modelid, x, y, z, g_CommentString
  179. );
  180. fwrite(file_handle, write_string);
  181. }
  182. for(new a; a < valid_actors; a ++) {
  183. new actorid = slot_actorid[a], Float:x, Float:y, Float:z, Float:r;
  184. GetActorPos(actorid, x, y, z);
  185. GetActorFacingAngle(actorid, r);
  186. strunpack(g_CommentString, g_ActorData[actorid][ACTOR_DATA_COMMENT], MAX_COMMENT_LEN+1);
  187. format(write_string, sizeof write_string,
  188. "g_Actor[%i] = CreateActor(%i, %.4f, %.4f, %.4f, %.4f); //%s\r\n", a, g_ActorData[actorid][ACTOR_DATA_SKIN], x, y, z, r, g_CommentString
  189. );
  190. fwrite(file_handle, write_string);
  191. new anim_index = g_ActorData[actorid][ACTOR_DATA_ANIM_INDEX];
  192. if(anim_index != INVALID_ANIM_INDEX) {
  193. new lib[MAX_ANIM_LIB+1], name[MAX_ANIM_NAME+1];
  194. GetAnimationName(anim_index, lib, MAX_ANIM_LIB+1, name, MAX_ANIM_NAME+1);
  195. format(write_string, sizeof write_string,
  196. "ApplyActorAnimation(g_Actor[%i], \"%s\", \"%s\", %.4f, %i, %i, %i, %i, %i);\r\n", a, lib, name,
  197. g_ActorData[actorid][ACTOR_DATA_ANIM_DELTA],
  198. g_ActorData[actorid][ACTOR_DATA_ANIM_LOOP],
  199. g_ActorData[actorid][ACTOR_DATA_ANIM_LOCKX],
  200. g_ActorData[actorid][ACTOR_DATA_ANIM_LOCKY],
  201. g_ActorData[actorid][ACTOR_DATA_ANIM_FREEZE],
  202. g_ActorData[actorid][ACTOR_DATA_ANIM_TIME]
  203. );
  204. fwrite(file_handle, write_string);
  205. }
  206. }
  207. for(new o; o < valid_objects; o ++) {
  208. new objectid = slot_objectid[o];
  209. switch( g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_IDTYPE] ) {
  210. case ID_TYPE_OBJECT: {
  211. new
  212. attachtoid = g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_ID],
  213. attachtoslot = objectid_slot[attachtoid-1]
  214. ;
  215. format(write_string, sizeof write_string,
  216. "AttachObjectToObject(g_Object[%i], g_Object[%i], %.4f, %.4f, %.4f, %.4f, %.4f, %.4f);\r\n", o, attachtoslot,
  217. g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_X],
  218. g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_Y],
  219. g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_Z],
  220. g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_RX],
  221. g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_RY],
  222. g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_RZ]
  223. );
  224. fwrite(file_handle, write_string);
  225. }
  226. case ID_TYPE_VEHICLE: {
  227. new
  228. vehicleid = g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_ID],
  229. vehicleslot = vehicleid_slot[vehicleid-1]
  230. ;
  231. format(write_string, sizeof write_string,
  232. "AttachObjectToVehicle(g_Object[%i], g_Vehicle[%i], %.4f, %.4f, %.4f, %.4f, %.4f, %.4f);\r\n", o, vehicleslot,
  233. g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_X],
  234. g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_Y],
  235. g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_Z],
  236. g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_RX],
  237. g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_RY],
  238. g_ObjectData[objectid-1][OBJECT_DATA_ATTACH_RZ]
  239. );
  240. fwrite(file_handle, write_string);
  241. }
  242. }
  243. }
  244. if( playerid != INVALID_PLAYER_ID ) {
  245. new playername[MAX_PLAYER_NAME+1];
  246. GetPlayerName(playerid, playername, sizeof playername);
  247. for(new index; index < MAX_PLAYERATTACH_INDEX; index ++) {
  248. if( !g_PlayerAttachData[playerid][index][PLAYERATTACH_DATA_TOGGLE] ) {
  249. continue;
  250. }
  251. GetModelName(g_PlayerAttachData[playerid][index][PLAYERATTACH_DATA_MODEL], g_ModelString, sizeof g_ModelString);
  252. GetBoneName(g_PlayerAttachData[playerid][index][PLAYERATTACH_DATA_BONE], g_BoneString, sizeof g_BoneString);
  253. format(write_string, sizeof write_string,
  254. "SetPlayerAttachedObject(playerid, %i, %i, %i, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f, 0x%08x, 0x%08x); // %s attached to the %s of %s\r\n",
  255. index,
  256. g_PlayerAttachData[playerid][index][PLAYERATTACH_DATA_MODEL],
  257. g_PlayerAttachData[playerid][index][PLAYERATTACH_DATA_BONE],
  258. g_PlayerAttachData[playerid][index][PLAYERATTACH_DATA_X ],
  259. g_PlayerAttachData[playerid][index][PLAYERATTACH_DATA_Y ],
  260. g_PlayerAttachData[playerid][index][PLAYERATTACH_DATA_Z ],
  261. g_PlayerAttachData[playerid][index][PLAYERATTACH_DATA_RX],
  262. g_PlayerAttachData[playerid][index][PLAYERATTACH_DATA_RY],
  263. g_PlayerAttachData[playerid][index][PLAYERATTACH_DATA_RZ],
  264. g_PlayerAttachData[playerid][index][PLAYERATTACH_DATA_SX],
  265. g_PlayerAttachData[playerid][index][PLAYERATTACH_DATA_SY],
  266. g_PlayerAttachData[playerid][index][PLAYERATTACH_DATA_SZ],
  267. g_PlayerAttachData[playerid][index][PLAYERATTACH_DATA_COLOR1],
  268. g_PlayerAttachData[playerid][index][PLAYERATTACH_DATA_COLOR2],
  269. g_ModelString,
  270. g_BoneString,
  271. playername
  272. );
  273. fwrite(file_handle, write_string);
  274. attachments_saved ++;
  275. }
  276. }
  277. for(new b; b < BUILDING_DATA_SIZE; b ++) {
  278. if( !g_BuildingData[b][BUILDING_DATA_ISLOADED] ) {
  279. continue;
  280. }
  281. if( !g_BuildingData[b][BUILDING_DATA_ISREMOVED] ) {
  282. continue;
  283. }
  284. GetModelName(g_BuildingData[b][BUILDING_DATA_MODEL], g_ModelString, sizeof g_ModelString);
  285. format(write_string, sizeof write_string,
  286. "RemoveBuildingForPlayer(playerid, %i, %.4f, %.4f, %.4f, %.2f); // %s\r\n",
  287. g_BuildingData[b][BUILDING_DATA_MODEL],
  288. g_BuildingData[b][BUILDING_DATA_X],
  289. g_BuildingData[b][BUILDING_DATA_Y],
  290. g_BuildingData[b][BUILDING_DATA_Z],
  291. g_BuildingData[b][BUILDING_DATA_OFFSET] + REMOVE_BUILDING_RANGE,
  292. g_ModelString
  293. );
  294. fwrite(file_handle, write_string);
  295. if( g_BuildingData[b][BUILDING_DATA_LODMODEL] != INVALID_BUILDING_LODMODEL ) {
  296. format(write_string, sizeof write_string,
  297. "RemoveBuildingForPlayer(playerid, %i, %.4f, %.4f, %.4f, %.2f); // LOD Model of %s\r\n",
  298. g_BuildingData[b][BUILDING_DATA_LODMODEL],
  299. g_BuildingData[b][BUILDING_DATA_X],
  300. g_BuildingData[b][BUILDING_DATA_Y],
  301. g_BuildingData[b][BUILDING_DATA_Z],
  302. g_BuildingData[b][BUILDING_DATA_OFFSET] + REMOVE_BUILDING_RANGE,
  303. g_ModelString
  304. );
  305. fwrite(file_handle, write_string);
  306. }
  307. buildings_saved ++;
  308. }
  309. objects_saved = valid_objects;
  310. vehicles_saved = valid_vehicles;
  311. pickups_saved = valid_pickups;
  312. actors_saved = valid_actors;
  313. fclose(file_handle);
  314. return 1;
  315. }