Advertisement
Guest User

map loader 0.2

a guest
Dec 12th, 2010
3,927
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 8.53 KB | None | 0 0
  1. /*
  2.     Copyright 2010 Michael Dabski (mick88)
  3.     This script is my intelectual property. Please respect that and keep my credits where they are.
  4.     You are free to modify this script or use parts of the code as long as you give me credit for my work.
  5. */
  6.  
  7. /*
  8.     MTA .map loader by mick88
  9.         Release 0.2
  10.     12th December 2010
  11.  
  12.   Requirements: SSCANF2 plugin by Y_Less
  13.  
  14.   Stock functions:
  15.     LoadMtaMap(file[], convert03c)  - loads .map file
  16.     UnloadMtaMap(file[])            - unloads previously loaded .map file
  17.     UnloadAll()                     - unloads all .map files
  18.     IsMapLoaded(file[])             - returns true if map has been loaded (even if loaded partially)
  19.  
  20.   Supported map elements: objects, vehicles
  21.  
  22.   Supported object data: model, posX, posY, posZ, rotX, rotY, rotZ + SAMP 0.3c objects
  23.   Supported vehicle data: model, paintjob, mods (upgrades), colors (2 colors),
  24.                             posX, posY, posZ, rotZ, interior, world (dimension),
  25.                             numberplate (0.3c only)
  26.     Changelog:
  27. * 13th September 2010 ver 0.1:
  28.     - first release
  29.    
  30. * 12th December 2010 ver 0.2
  31.     -Added support for SA-MP 0.3c objects
  32.     -Added storing object/vehicle IDs
  33.     -Added function to unload single map
  34.     -This script is now an include
  35.     -Added support for custom vehicle numberplates (SA-MP 0.3c only)
  36.     -Added function to unload all current map files
  37.     -Added function checking if map is loaded
  38.     -Support for Incognito's streamer
  39.    
  40.     native UnloadMtaMap(file[MAX_MAP_FILE_PATH]);
  41.     native LoadMtaMap(file[MAX_MAP_FILE_PATH], convert03c=false);
  42.     native UnloadAll();
  43.     native IsMapLoaded(file[MAX_MAP_FILE_PATH]);
  44.    
  45. */
  46. #include <sscanf2>
  47.  
  48. #define MAX_LOADED_ELEMENTS         5000    //Max number of vehicles + objects
  49. #define MAX_MAP_FILE_PATH           80
  50. #define VEHICLE_RESPAWN_DELAY       300
  51. #define MAP_STREAM_DISTANCE          300.0
  52.  
  53. #if defined _streamer_included
  54.     #define ADD_OBJECT(%1)              CreateDynamicObject(%1, interior, world, -1, MAP_STREAM_DISTANCE)
  55.     #define DELETE_OBJECT(%1)           DestroyDynamicObject(%1)
  56. #else                                   //Modify these if you use different streamer:
  57.     #define ADD_OBJECT(%1)              CreateObject(%1, MAP_STREAM_DISTANCE)
  58.     #define DELETE_OBJECT(%1)           DestroyObject(%1)
  59. #endif
  60.  
  61. #define MAX_MODS                    14
  62. #define MAX_NUMBERPLATE             9
  63.  
  64. #define ELEMENT_TYPE_NONE           0
  65. #define ELEMENT_TYPE_OBJECT         1
  66. #define ELEMENT_TYPE_VEHICLE        2
  67.  
  68. enum MapElement
  69. {
  70.     eElementID,
  71.     eElementType,
  72.     eElementSource[MAX_MAP_FILE_PATH]
  73. }
  74.  
  75. new
  76.     Float: MapElements[MAX_LOADED_ELEMENTS][MapElement],
  77.     MinElementID = 0;
  78.    
  79. stock NextElementID()
  80. {
  81.     Increment:
  82.     MinElementID++;
  83.     if (MinElementID == MAX_LOADED_ELEMENTS)
  84.     {
  85.         print("ERROR: Cannot load any more map elements. Current maximum "#MAX_LOADED_ELEMENTS" has been reached!");
  86.         return false;
  87.     }
  88.     if (MapElements[MinElementID][eElementType])    goto Increment;
  89.     return true;
  90. }
  91.  
  92. // :::::::::::::::::::::::::: STOCK FUNCTIONS :::::::::::::::::::::::::::
  93. stock UnloadMtaMap(file[])
  94. {
  95.     new n;
  96.     for (new id=MAX_LOADED_ELEMENTS-1; id >= 0; id--) if (MapElements[id][eElementType] && strcmp(file, MapElements[id][eElementSource], false, MAX_MAP_FILE_PATH) == 0)
  97.     {
  98.         switch (MapElements[id][eElementType])
  99.         {
  100.             case ELEMENT_TYPE_OBJECT:   DELETE_OBJECT(MapElements[id][eElementID]);
  101.             case ELEMENT_TYPE_VEHICLE:  DestroyVehicle(MapElements[id][eElementID]);
  102.         }
  103.         MapElements[id][eElementID]         = 0;
  104.         MapElements[id][eElementType]       = ELEMENT_TYPE_NONE;
  105.         MapElements[id][eElementSource][0]  = '\0';
  106.         MinElementID                        = id;
  107.     }
  108.     return n;
  109. }
  110.  
  111. stock IsMapLoaded(file[])
  112. {
  113.     for (new id=MAX_LOADED_ELEMENTS-1; id >= 0; id--) if (MapElements[id][eElementType] && strcmp(file, MapElements[id][eElementSource], false, MAX_MAP_FILE_PATH) == 0) return true;
  114.     return false;
  115. }
  116.  
  117. stock UnloadAll()
  118. {
  119.     new n;
  120.     for (new id=MAX_LOADED_ELEMENTS-1; id >= 0; id--) if (MapElements[id][eElementType])
  121.     {
  122.         switch (MapElements[id][eElementType])
  123.         {
  124.             case ELEMENT_TYPE_OBJECT:   DELETE_OBJECT(MapElements[id][eElementID]);
  125.             case ELEMENT_TYPE_VEHICLE:  DestroyVehicle(MapElements[id][eElementID]);
  126.         }
  127.         MapElements[id][eElementID]         = 0;
  128.         MapElements[id][eElementType]       = ELEMENT_TYPE_NONE;
  129.         MapElements[id][eElementSource][0]  = '\0';
  130.         MinElementID                        = id;
  131.     }
  132.     return n;
  133. }
  134.  
  135. stock LoadMtaMap(file[], convert03c=false)
  136. {
  137.     if (!fexist(file) || MinElementID == MAX_LOADED_ELEMENTS)
  138.     {
  139.         printf("Map %s cannot be loaded", file);
  140.         return 0;
  141.     }
  142.     new File:MapFile=fopen(file),
  143.     n, string[400], numberplate[MAX_NUMBERPLATE],
  144.     Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz,
  145.     modelid, paintjob, interior, world,
  146.     t = GetTickCount();
  147.    
  148.     while(fread(MapFile, string))
  149.     {
  150.         if (!sscanf(string, "p<\">'object''model='d'interior='d'dimension='d'posX='f'posY='f'posZ='f'rotX='f'rotY='f'rotZ='f", modelid, interior, world, x, y, z, rx, ry, rz))
  151.         {
  152.             if (convert03c)
  153.             {
  154.                 switch(modelid)
  155.                 {
  156.                     case 14383..14483:  modelid += 4248;
  157.                     case 14770..14856:  modelid += 4063;
  158.                     case 14858..14871:  modelid += 4062;
  159.                     case 18000..18036:  modelid += 934;
  160.                     case 18038..18101:  modelid += 933;
  161.                     case 14872..14883:  modelid += 4163;
  162.                     case 14885..14891:  modelid += 4162;
  163.                     case 13590..13667:  modelid += 5142;
  164.                     case 14500..14522:  modelid += 4310;
  165.                     case 12835..12944:  modelid -= 6219;
  166.                     case 14892:         modelid += 5009;
  167.                 }
  168.             }
  169.             //modelid x y z rx ry rz interior world
  170.             new objectid = ADD_OBJECT(modelid, x, y, z, rx, ry, rz);
  171.             if (objectid == INVALID_OBJECT_ID) printf("Error, object could not be created. Make sure you don't exceed max number of objects. Use stramer if you need to create more than %d objects!", MAX_OBJECTS);
  172.             else
  173.             {
  174.                 #if defined _streamer_included
  175.                     Streamer_SetFloatData(STREAMER_TYPE_OBJECT, objectid, E_STREAMER_DRAW_DISTANCE, MAP_STREAM_DISTANCE);
  176.                 #endif
  177.                 MapElements[MinElementID][eElementType]     = ELEMENT_TYPE_OBJECT;
  178.                 MapElements[MinElementID][eElementID]       = objectid;
  179.                 strcp(file, MapElements[MinElementID][eElementSource]);
  180.                 //MapElements[MinElementID][eElementSource]     = file;
  181.                 n++;
  182.                 //printf("Object %d loaded into slot %d", objectid, MinElementID);
  183.                 if (!NextElementID())
  184.                 {
  185.                     fclose(MapFile);
  186.                     return n;
  187.                 }
  188.             }
  189.         }
  190.         else if (!sscanf(string, "p<\">'vehicle''paintjob='d'model='d'plate='s["#MAX_NUMBERPLATE"]'interior='d'dimension='d'posX='f'posY='f'posZ='f'rotZ='f", paintjob, modelid, numberplate, interior, world, x, y, z, rz))
  191.         {
  192.             new col1, col2, colors[20], mods[80], mod[MAX_MODS];
  193.             sscanf(string, "p<\">'color='s[20] ", colors);
  194.             sscanf(string, "p<\">'upgrades='s[80] ", mods);
  195.             sscanf(colors, "p<,>dd", col1, col2);
  196.             sscanf(mods, "p<,>A<d>(0)["#MAX_MODS"]", mod);
  197.            
  198.             //modelid x y z rz col1 col2 paintjob interior world
  199.             new vehicleid = CreateVehicle(modelid, x, y, z, rz, col1, col2, VEHICLE_RESPAWN_DELAY);
  200.             if (vehicleid == INVALID_VEHICLE_ID) print("Vehicle failed to load! Check if you exceeded maximum of 2000 vehicles");
  201.             else
  202.             {
  203.                 SetVehicleNumberPlate(vehicleid, numberplate);
  204.                 SetVehicleToRespawn(vehicleid);
  205.                 for (new i; i < MAX_MODS; i++) if (mod[i]) AddVehicleComponent(vehicleid, mod[i]);
  206.                 ChangeVehiclePaintjob(vehicleid, paintjob);
  207.                 LinkVehicleToInterior(vehicleid, interior);
  208.                 SetVehicleVirtualWorld(vehicleid, world);
  209.                
  210.                 MapElements[MinElementID][eElementType]     = ELEMENT_TYPE_VEHICLE;
  211.                 MapElements[MinElementID][eElementID]       = vehicleid;
  212.                 strcp(file, MapElements[MinElementID][eElementSource]);
  213.                 //MapElements[MinElementID][eElementSource]     = file;
  214.                 n++;
  215.                 //printf("Vehicle %d loaded into slot %d", vehicleid, MinElementID);
  216.                 if (!NextElementID())
  217.                 {
  218.                     fclose(MapFile);
  219.                     return n;
  220.                 }
  221.             }
  222.         }
  223.     }
  224.     fclose(MapFile);
  225.     printf("%d items loaded from '%s' in %dms", n, file, GetTickCount()-t);
  226.     return n;
  227. }
  228.  
  229. stock strcp(from[], to[])
  230. {
  231.     new i;
  232.     for (i = 0; from[i]; i++) to[i] = from[i];
  233.     to[i] = '\0';
  234. }
  235.  
  236. /*
  237.     Copyright 2010 Michael Dabski (mick88)
  238.     This script is my intelectual property. Please respect that and keep my credits where they are.
  239.     You are free to modify this script or use parts of the code as long as you give me credit for my work.
  240. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement