Advertisement
Guest User

Dynamic Door System

a guest
Nov 24th, 2013
1,559
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 14.13 KB | None | 0 0
  1. #define FILTERSCRIPT
  2.  
  3. #include <a_samp>
  4. #include <SII>
  5. #include <zcmd>
  6. #include <sscanf2>
  7. #include <streamer>
  8.  
  9. #define PRESSED(%0) \
  10.     (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
  11.  
  12. #define COLOR_YELLOW         0xFFFF00AA
  13. #define COLOR_WHITE          0xFFFFFFFF
  14. #define COLOR_GREY           0xB4B5B7FF
  15.  
  16. #define MAX_DOORS 500
  17.  
  18. enum dInfo
  19. {
  20.     dName[128],
  21.     dPickup,
  22.     dPickupModel,
  23.     Float: dEnterX,
  24.     Float: dEnterY,
  25.     Float: dEnterZ,
  26.     Float: dExitX,
  27.     Float: dExitY,
  28.     Float: dExitZ,
  29.     Text3D: dLabel,
  30.     dInt,
  31.     dExitVW,
  32.     dExitInt,
  33.     dEnterVW,
  34.     dEnterInt
  35. }
  36. new DoorInfo[MAX_DOORS][dInfo];
  37. new DoorIDTaken[MAX_DOORS];
  38.  
  39. stock LoadDoors()
  40. {
  41.     new dStr[128];
  42.     new file[128];
  43.     for(new idx=1; idx<MAX_DOORS; idx++)
  44.     {
  45.         format(file, sizeof(file), "Doors/%d.ini", idx);
  46.         if(fexist(file) && INI_Open(file))
  47.         {
  48.             DoorInfo[idx][dPickupModel] = INI_ReadInt("PickupModel");
  49.             DoorInfo[idx][dEnterX] = INI_ReadFloat("EnterX");
  50.             DoorInfo[idx][dEnterY] = INI_ReadFloat("EnterY");
  51.             DoorInfo[idx][dEnterZ] = INI_ReadFloat("EnterZ");
  52.             DoorInfo[idx][dExitX]  = INI_ReadFloat("ExitX");
  53.             DoorInfo[idx][dExitY]  = INI_ReadFloat("ExitY");
  54.             DoorInfo[idx][dExitZ]  = INI_ReadFloat("ExitZ");
  55.             DoorInfo[idx][dInt] = INI_ReadInt("Int");
  56.             DoorInfo[idx][dExitVW] = INI_ReadInt("ExitVW");
  57.             DoorInfo[idx][dExitInt] = INI_ReadInt("ExitInt");
  58.             DoorInfo[idx][dEnterVW] = INI_ReadInt("EnterVW");
  59.             DoorInfo[idx][dEnterInt] = INI_ReadInt("EnterInt");
  60.            
  61.             INI_ReadString(DoorInfo[idx][dName],"Name", 128);
  62.             format(dStr, sizeof(dStr), "[%s]\nID: %d\nPress C to enter.",DoorInfo[idx][dName], idx);
  63.  
  64.             DoorInfo[idx][dLabel] = CreateDynamic3DTextLabel(dStr, COLOR_YELLOW, DoorInfo[idx][dEnterX], DoorInfo[idx][dEnterY], DoorInfo[idx][dEnterZ], 10.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, -1, -1, -1, 100.0);
  65.             DoorInfo[idx][dPickup] = CreateDynamicPickup(DoorInfo[idx][dPickupModel], 23, DoorInfo[idx][dEnterX], DoorInfo[idx][dEnterY], DoorInfo[idx][dEnterZ], 0, 0, -1, 70.0);
  66.  
  67.             DoorIDTaken[idx] = 1;
  68.            
  69.             INI_Close();
  70.         }
  71.     }
  72.     return 1;
  73. }
  74.  
  75. SaveDoors()
  76. {
  77.     new file[128];
  78.     for(new i= 1; i < MAX_DOORS; i++)
  79.     {
  80.         if(DoorIDTaken[i] == 0) continue;
  81.         format(file, sizeof(file), "Doors/%d.ini", i);
  82.         if(INI_Open(file))
  83.         {
  84.             INI_WriteInt("PickupModel",DoorInfo[i][dPickupModel]);
  85.             INI_WriteFloat("EnterX",DoorInfo[i][dEnterX]);
  86.             INI_WriteFloat("EnterY",DoorInfo[i][dEnterY]);
  87.             INI_WriteFloat("EnterZ",DoorInfo[i][dEnterZ]);
  88.             INI_WriteFloat("ExitX",DoorInfo[i][dExitX]);
  89.             INI_WriteFloat("ExitY",DoorInfo[i][dExitY]);
  90.             INI_WriteFloat("ExitZ",DoorInfo[i][dExitZ]);
  91.             INI_WriteInt("Int",DoorInfo[i][dInt]);
  92.             INI_WriteInt("ExitVW",DoorInfo[i][dExitVW]);
  93.             INI_WriteInt("ExitInt",DoorInfo[i][dExitInt]);
  94.             INI_WriteInt("EnterVW",DoorInfo[i][dEnterVW]);
  95.             INI_WriteInt("EnterInt",DoorInfo[i][dEnterInt]);
  96.             INI_WriteString("Name", DoorInfo[i][dName]);
  97.             INI_Save();
  98.             INI_Close();
  99.         }
  100.     }
  101.     return 1;
  102. }
  103.  
  104. stock GetAvailableID()
  105. {
  106.     for(new i = 1; i<MAX_DOORS; i++)
  107.     {
  108.         if(DoorIDTaken[i] == 0) return i;
  109.     }
  110.     return -1;
  111. }
  112.  
  113. stock IsValidPickupModel(modelid) // Credits to creator
  114. {
  115.     static modeldat[] =
  116.     {
  117.         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -128,
  118.         -515899393, -134217729, -1, -1, 33554431, -1, -1, -1, -14337, -1, -33,
  119.         127, 0, 0, 0, 0, 0, -8388608, -1, -1, -1, -16385, -1, -1, -1, -1, -1,
  120.        -1, -1, -33, -1, -771751937, -1, -9, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  121.        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  122.        -1, -1, -1, -1, -1, -1, -1, -1, 33554431, -25, -1, -1, -1, -1, -1, -1,
  123.        -1073676289, -2147483648, 34079999, 2113536, -4825600, -5, -1, -3145729,
  124.        -1, -16777217, -63, -1, -1, -1, -1, -201326593, -1, -1, -1, -1, -1,
  125.        -257, -1, 1073741823, -133122, -1, -1, -65, -1, -1, -1, -1, -1, -1,
  126.        -2146435073, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1073741823, -64, -1,
  127.        -1, -1, -1, -2635777, 134086663, 0, -64, -1, -1, -1, -1, -1, -1, -1,
  128.        -536870927, -131069, -1, -1, -1, -1, -1, -1, -1, -1, -16384, -1,
  129.        -33554433, -1, -1, -1, -1, -1, -1610612737, 524285, -128, -1,
  130.        2080309247, -1, -1, -1114113, -1, -1, -1, 66977343, -524288, -1, -1, -1,
  131.        -1, -2031617, -1, 114687, -256, -1, -4097, -1, -4097, -1, -1,
  132.        1010827263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -32768, -1, -1, -1, -1, -1,
  133.        2147483647, -33554434, -1, -1, -49153, -1148191169, 2147483647,
  134.        -100781080, -262145, -57, 134217727, -8388608, -1, -1, -1, -1, -1, -1,
  135.        -1, -1, -1, -1, -1, -1, -1, -1, -1048577, -1, -449, -1017, -1, -1, -1,
  136.        -1, -1, -1, -1, -1, -1, -1, -1, -1835009, -2049, -1, -1, -1, -1, -1, -1,
  137.        -8193, -1, -536870913, -1, -1, -1, -1, -1, -87041, -1, -1, -1, -1, -1,
  138.        -1, -209860, -1023, -8388609, -2096897, -1, -1048577, -1, -1, -1, -1,
  139.        -1, -1, -897, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1610612737,
  140.        -3073, -28673, -1, -1, -1, -1537, -1, -1, -13, -1, -1, -1, -1, -1985,
  141.        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1056964609, -1, -1, -1,
  142.        -1, -1, -1, -1, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  143.        -236716037, -1, -1, -1, -1, -1, -1, -1, -536870913, 3, 0, 0, 0, 0, 0, 0,
  144.        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  145.        0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  146.        -1, -1, -1, -1, -1, -2097153, -2109441, -1, 201326591, -4194304, -1, -1,
  147.        -241, -1, -1, -1, -1, -1, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  148.        0, -32768, -1, -1, -1, -2, -671096835, -1, -8388609, -66323585, -13,
  149.        -1793, -32257, -247809, -1, -1, -513, 16252911, 0, 0, 0, -131072,
  150.        33554383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  151.        0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  152.        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8356095, 0, 0, 0, 0, 0,
  153.        0, -256, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  154.        -268435449, -1, -1, -2049, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  155.        92274627, -65536, -2097153, -268435457, 591191935, 1, 0, -16777216, -1,
  156.        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 127
  157.     };
  158.     if ((modelid >= 0) && ((modelid / 32) < sizeof (modeldat)) && (modeldat[modelid / 32] & (1 << (modelid % 32))))
  159.     {
  160.         return 1;
  161.     }
  162.     // EDITED FOR 0.3c, 0.3d & 0.3e OBJECTS
  163.     switch (modelid)
  164.     {
  165.         case 0, 331, 333..339, 341, 318..321, 325, 326, 342..344, 346..353, 355..370, 372,
  166.         18632..18645, 18646..18658, 18659..18667, 18668..19299, 19301..19515, 18631:
  167.         {
  168.             return 1;
  169.         }
  170.         case 19516..19521: // 0.3x RC2-4 objects
  171.         {
  172.             return 1;
  173.         }
  174.     }
  175.     return 0;
  176. }
  177.  
  178. #if defined FILTERSCRIPT
  179.  
  180. public OnFilterScriptInit()
  181. {
  182.     print("\n--------------------------------------");
  183.     print(" Dynamic Door System by FeRRum");
  184.     print("--------------------------------------\n");
  185.    
  186.     LoadDoors();
  187.     return 1;
  188. }
  189.  
  190. public OnFilterScriptExit()
  191. {
  192.     SaveDoors();
  193.     return 1;
  194. }
  195.  
  196. #else
  197.  
  198. main()
  199. {
  200.     print("\n----------------------------------");
  201.     print(" Dynamic Door System by FeRRum");
  202.     print("----------------------------------\n");
  203. }
  204.  
  205. #endif
  206.  
  207. public OnPlayerCommandText(playerid, cmdtext[])
  208. {
  209.     if (strcmp("/mycommand", cmdtext, true, 10) == 0)
  210.     {
  211.         // Do something here
  212.         return 1;
  213.     }
  214.     return 0;
  215. }
  216.  
  217. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  218. {
  219.     if(PRESSED(KEY_CROUCH))
  220.     {
  221.         for(new i = 0; i < sizeof(DoorInfo); i++)
  222.         {
  223.             if(IsPlayerInRangeOfPoint(playerid,3.0,DoorInfo[i][dEnterX],DoorInfo[i][dEnterY],DoorInfo[i][dEnterZ]))
  224.             {
  225.                 if(DoorInfo[i][dExitX] == 0) return SendClientMessage(playerid, COLOR_GREY, "No interior set up!");
  226.                 SetPlayerPos(playerid, DoorInfo[i][dExitX],DoorInfo[i][dExitY],DoorInfo[i][dExitZ]);
  227.                 SetPlayerInterior(playerid, DoorInfo[i][dExitInt]);
  228.                 SetPlayerVirtualWorld(playerid, DoorInfo[i][dExitVW]);
  229.             }
  230.             else if(IsPlayerInRangeOfPoint(playerid,3.0,DoorInfo[i][dExitX],DoorInfo[i][dExitY],DoorInfo[i][dExitZ]))
  231.             {
  232.                 SetPlayerPos(playerid, DoorInfo[i][dEnterX],DoorInfo[i][dEnterY],DoorInfo[i][dEnterZ]);
  233.                 SetPlayerInterior(playerid, DoorInfo[i][dEnterInt]);
  234.                 SetPlayerVirtualWorld(playerid, DoorInfo[i][dEnterVW]);
  235.             }
  236.         }
  237.     }
  238.     return 1;
  239. }
  240.  
  241.  
  242. CMD:createdoor(playerid, params[])
  243. {
  244.     if(IsPlayerAdmin(playerid))
  245.     {
  246.         new doorname[128], Float: dPos[3], string[254];
  247.         if(sscanf(params, "s[128]", doorname)) return SendClientMessage(playerid, COLOR_WHITE, "Usage: /createdoor [name]");
  248.  
  249.         new id = GetAvailableID();
  250.         GetPlayerPos(playerid, dPos[0], dPos[1], dPos[2]);
  251.         DoorIDTaken[id] = 1;
  252.         DoorInfo[id][dEnterX] = dPos[0];
  253.         DoorInfo[id][dEnterY] = dPos[1];
  254.         DoorInfo[id][dEnterZ] = dPos[2];
  255.         DoorInfo[id][dExitX] = 0.0;
  256.         DoorInfo[id][dExitY] = 0.0;
  257.         DoorInfo[id][dExitZ] = 0.0;
  258.         DoorInfo[id][dInt] = 0;
  259.         DoorInfo[id][dExitVW] = 0;
  260.         DoorInfo[id][dExitInt] = 0;
  261.         DoorInfo[id][dEnterVW] = GetPlayerVirtualWorld(playerid);
  262.         DoorInfo[id][dEnterInt] = GetPlayerInterior(playerid);
  263.         DoorInfo[id][dPickupModel] = 19130;
  264.         DoorInfo[id][dName] = doorname;
  265.        
  266.         format(string, sizeof(string), "[%s]\nID: %d\nPress C to enter.",DoorInfo[id][dName], id);
  267.         DoorInfo[id][dLabel] = CreateDynamic3DTextLabel(string, COLOR_YELLOW, DoorInfo[id][dEnterX], DoorInfo[id][dEnterY], DoorInfo[id][dEnterZ], 10.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, -1, -1, -1, 50.0);
  268.         DoorInfo[id][dPickup] = CreateDynamicPickup(19130, 23, dPos[0], dPos[1], dPos[2], 0, 0, -1, 50.0);
  269.         SaveDoors();
  270.         return 1;
  271.     }
  272.     else
  273.     {
  274.         SendClientMessage(playerid,COLOR_GREY,"You're not a rcon admin!");
  275.     }
  276.     return 1;
  277. }
  278.  
  279. CMD:editdoor(playerid, params[])
  280. {
  281.     if(IsPlayerAdmin(playerid))
  282.     {
  283.         new string[128], option[32], id, amount, Float: Pos[3];
  284.         if(sscanf(params, "ds[32]D(10)", id, option, amount))
  285.         {
  286.             SendClientMessage(playerid, COLOR_WHITE, "USAGE: /editdoor [doorid] [name] [amount]");
  287.             SendClientMessage(playerid, COLOR_WHITE, "Available names: exterior, interior, pickup, delete");
  288.             return 1;
  289.         }
  290.         if (id < 1 || id > MAX_DOORS)
  291.         {
  292.             format(string, sizeof(string), "ID cannot be below 1 or above %d.", MAX_DOORS);
  293.             SendClientMessage(playerid, COLOR_GREY, string);
  294.             return 1;
  295.         }
  296.         if(!DoorIDTaken[id])
  297.         {
  298.             SendClientMessage(playerid, COLOR_GREY, "ID not taken.");
  299.             return 1;
  300.         }
  301.  
  302.         if(strcmp(option, "exterior", true) == 0)
  303.         {
  304.             new dname[128];
  305.             GetPlayerPos(playerid, Pos[0],Pos[1],Pos[2]);
  306.             DoorInfo[id][dEnterX] = Pos[0];
  307.             DoorInfo[id][dEnterY] = Pos[1];
  308.             DoorInfo[id][dEnterZ] = Pos[2];
  309.             DoorInfo[id][dEnterVW] = GetPlayerVirtualWorld(playerid);
  310.             DoorInfo[id][dEnterInt] = GetPlayerInterior(playerid);
  311.  
  312.             DestroyDynamicPickup(DoorInfo[id][dPickup]);
  313.             DestroyDynamic3DTextLabel(DoorInfo[id][dLabel]);
  314.  
  315.             format(dname, sizeof(dname), "[%s]\nID: %d\nPress C to enter.",DoorInfo[id][dName], id);
  316.             DoorInfo[id][dLabel] = CreateDynamic3DTextLabel(dname, COLOR_YELLOW, DoorInfo[id][dEnterX], DoorInfo[id][dEnterY], DoorInfo[id][dEnterZ], 10.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, -1, -1, -1, 50.0);
  317.             DoorInfo[id][dPickup] = CreateDynamicPickup(DoorInfo[id][dPickupModel], 23, Pos[0], Pos[1], Pos[2], 0, 0, -1, 50.0);
  318.  
  319.             SaveDoors();
  320.         }
  321.         else if(strcmp(option, "interior", true) == 0)
  322.         {
  323.             GetPlayerPos(playerid, Pos[0],Pos[1],Pos[2]);
  324.             DoorInfo[id][dExitX] = Pos[0];
  325.             DoorInfo[id][dExitY] = Pos[1];
  326.             DoorInfo[id][dExitZ] = Pos[2];
  327.             DoorInfo[id][dExitVW] = GetPlayerVirtualWorld(playerid) + 2000;
  328.             DoorInfo[id][dExitInt] = GetPlayerInterior(playerid);
  329.             SaveDoors();
  330.         }
  331.         else if(strcmp(option, "pickup", true) == 0)
  332.         {
  333.             DestroyDynamicPickup(DoorInfo[id][dPickup]);
  334.             if(!IsValidPickupModel(amount)) return 1;
  335.             DoorInfo[id][dPickupModel] = amount;
  336.             DoorInfo[id][dPickup] = CreateDynamicPickup(amount, 23, DoorInfo[id][dEnterX], DoorInfo[id][dEnterY], DoorInfo[id][dEnterZ], 0, 0, -1, 50.0);
  337.             SaveDoors();
  338.         }
  339.         else if(strcmp(option, "delete", true) == 0)
  340.         {
  341.             new file[128];
  342.             DoorIDTaken[id] = 0;
  343.             DoorInfo[id][dEnterX] = 0.0;
  344.             DoorInfo[id][dEnterY] = 0.0;
  345.             DoorInfo[id][dEnterZ] = 0.0;
  346.             DoorInfo[id][dExitX] = 0.0;
  347.             DoorInfo[id][dExitY] = 0.0;
  348.             DoorInfo[id][dExitZ] = 0.0;
  349.             DoorInfo[id][dExitVW] = 0;
  350.             DoorInfo[id][dExitInt] = 0;
  351.             DoorInfo[id][dEnterVW] = 0;
  352.             DoorInfo[id][dEnterInt] = 0;
  353.             DoorInfo[id][dPickupModel] = 0;
  354.             DestroyDynamic3DTextLabel(DoorInfo[id][dLabel]);
  355.             DestroyDynamicPickup(DoorInfo[id][dPickup]);
  356.             SendClientMessage(playerid, COLOR_WHITE, "Door System: Door Deleted!");
  357.             SaveDoors();
  358.             format(file, sizeof(file), "Doors/%d.ini", id);
  359.             if(fexist(file)) fremove(file);
  360.         }
  361.     }
  362.     else
  363.     {
  364.         SendClientMessage(playerid,COLOR_GREY,"You're not a rcon admin!");
  365.     }
  366.     return 1;
  367. }
  368.  
  369. CMD:doorname(playerid, params[])
  370. {
  371.     new string[128], id, doorname[128];
  372.     if(IsPlayerAdmin(playerid))
  373.     {
  374.         if(sscanf(params, "ds[128]", id, doorname)) return SendClientMessage(playerid, COLOR_WHITE, "USAGE: /doorname [doorid] [name]");
  375.         if (id < 1 || id > MAX_DOORS)
  376.         {
  377.             format(string, sizeof(string), "ID cannot be below 1 or above %d.", MAX_DOORS);
  378.             SendClientMessage(playerid, COLOR_GREY, string);
  379.             return 1;
  380.         }
  381.         if(!DoorIDTaken[id])
  382.         {
  383.             SendClientMessage(playerid, COLOR_GREY, "ID not taken.");
  384.             return 1;
  385.         }
  386.  
  387.         DoorInfo[id][dName] = doorname;
  388.         DestroyDynamic3DTextLabel(DoorInfo[id][dLabel]);
  389.         format(string, sizeof(string), "[%s]\nID: %d\nPress C to enter.",DoorInfo[id][dName], id);
  390.         DoorInfo[id][dLabel] = CreateDynamic3DTextLabel(string, COLOR_YELLOW, DoorInfo[id][dEnterX], DoorInfo[id][dEnterY], DoorInfo[id][dEnterZ], 10.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, -1, -1, -1, 50.0);
  391.         SaveDoors();
  392.     }
  393.     else
  394.     {
  395.         SendClientMessage(playerid,COLOR_GREY,"You're not a rcon admin!");
  396.     }
  397.     return 1;
  398. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement