Want more features on Pastebin? Sign Up, it's FREE!
Guest

Wints by wollodya

By: a guest on Mar 22nd, 2010  |  syntax: PAWN  |  size: 14.34 KB  |  views: 422  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. #include <a_samp>
  2.  
  3. /*
  4.         Interior Script - WInts
  5.         scripted by: wollodya
  6.  
  7.         version 1.01 - fixed some potential bugs
  8.  
  9.         Credits to:
  10.         Seif - his Seifader - fading script
  11.         Luk_Ass - som help with scripting
  12.         SpiriX23 - assistance in testing and providing a server to test
  13.         CorteZz - creating the demonstration video
  14.  
  15. */
  16.  
  17. #define DistanceBetweenPoints(%1,%2,%3,%4,%5,%6) floatsqroot((%1 - %4) * (%1 - %4) + (%2 - %5) * (%2 - %5) + (%3 - %6) * (%3 - %6))
  18.  
  19. #define MAX_CREATED_WINTERIORS  500
  20. #define MAX_VIEWED_WINTERIORS   200
  21. #define MAX_PLAYERS_WEX          100
  22. #define INVALID_WZONE           999
  23. #define ID_WVEHICLE             587
  24. #define WINT_OBJECT_ID           969
  25. #define WARROW_DISTANCE                 50
  26. #define WOBJECT_DISTANCE         200
  27. #define PREPARING_WSECS          5
  28. #define MAX_PLAYER_WOBJECTS      50
  29. #define WVEHICLE_OFFSET          4
  30. #define WPORT_DISTANCE           2.5
  31. #define W_FADE_SPEED            15
  32. #define W_FADE_COLOR 0x000000FF
  33.  
  34. //define map and zones
  35. #define WZONES_COUNT_WIDTH              6               // count of zones per width
  36. #define MAX_WIDTH_WZONE               3000    // ddistance from the center of SA to the edge
  37. #define WZONE_EXPAND             100
  38.  
  39. /*
  40. native CreateWInterior(Float:arrowX,Float:arrowY,Float:arrowZ,arrowInterior,Float:targetX,Float:targetY,Float:targetZ,Float:targetAngle,targetInterior);
  41. */
  42.  
  43. forward Wints_Init();
  44. forward Wints_Exit();
  45. forward Wints_OnPlayerConnect(playerid);
  46. forward Wints_OnPlayerDisconnect(playerid, reason);
  47. forward Wints_OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid);
  48.  
  49. // static variables
  50. new Float:IntPos[MAX_CREATED_WINTERIORS][3];
  51. new IntInt[MAX_CREATED_WINTERIORS];
  52. new Float:IntPosTarget[MAX_CREATED_WINTERIORS][3];
  53. new Float:AngleTarget[MAX_CREATED_WINTERIORS];
  54. new IntIntTarget[MAX_CREATED_WINTERIORS];
  55. new IntZone[MAX_CREATED_WINTERIORS];
  56.  
  57. new bool:InteriorPrepared[MAX_CREATED_WINTERIORS];
  58. new InteriorPreparing[MAX_CREATED_WINTERIORS];
  59.  
  60. new CurrentInterior[MAX_PLAYERS_WEX];
  61. new InteriorCount = 0;
  62. new ViewedInteriors = 0;
  63. new bool:ZoneSettled[(WZONES_COUNT_WIDTH*WZONES_COUNT_WIDTH)+1] = false;
  64. new bool:object[MAX_PLAYERS_WEX][MAX_CREATED_WINTERIORS];
  65. new objectid[MAX_PLAYERS_WEX][MAX_CREATED_WINTERIORS];
  66. new ObjectsForPlayer[MAX_PLAYERS_WEX];
  67. new vehicle[MAX_CREATED_WINTERIORS];
  68. new bool:ViewedForPlayer[MAX_CREATED_WINTERIORS][MAX_PLAYERS_WEX];
  69. new bool:IsWarping[MAX_PLAYERS_WEX];
  70.  
  71. new MAX_PLAYER_ID = 0; // effective cycles (thanks to Luk_Ass)
  72.  
  73. // timer
  74. new timer = -1;
  75. new bool:tick = false;
  76.  
  77. // don't change!
  78. new Float:vx = -4.283;
  79. new Float:vy = 1.603;
  80. new Float:vz = -0.776;
  81. new Float:ex = -4.283;
  82. new Float:ey = 1.603;
  83. new Float:ez = -2.651;
  84.  
  85. //--------------- Seifader by Seif -------------------------
  86. new w_colorfade[MAX_PLAYERS_WEX];
  87. new Text:w_screenfade[MAX_PLAYERS_WEX];
  88. forward Wints_ScreenFade(playerid, color, speed);
  89. forward Wints_ScreenFadeColor(playerid, color, speed);
  90. forward Wints_OnPlayerScreenFade(playerid, color, speed);
  91. forward Wints_OnPlayerScreenColorFade(playerid, color, speed);
  92. //-----------------------------------------------------------
  93.  
  94. public Wints_Init()
  95. {
  96.         timer = SetTimer("Wints_Timer",500,1);
  97.         Wints_Seifader_OnInit();
  98.         return 1;
  99. }
  100.  
  101. public Wints_Exit()
  102. {
  103.         for(new i=0;i<InteriorCount;i++)
  104.         {
  105.                 for(new p=0;p<MAX_PLAYER_ID;p++) if(object[i][p] == true) DestroyPlayerObject(p,objectid[p][i]);
  106.                 Wints_CancelInterior(i);
  107.         }
  108.         KillTimer(timer);
  109.         Wints_Seifader_OnExit();
  110.         return 1;
  111. }
  112.  
  113. public Wints_OnPlayerConnect(playerid)
  114. {
  115.         if (playerid >= MAX_PLAYER_ID)
  116.     {
  117.         MAX_PLAYER_ID = playerid +1;
  118.     }
  119.     return 1;
  120. }
  121.  
  122. public Wints_OnPlayerDisconnect(playerid, reason)
  123. {
  124.     if (playerid +1 >= MAX_PLAYER_ID)
  125.     {
  126.         for(new i = MAX_PLAYER_ID -2; i > -1; i--)
  127.         {
  128.             if (IsPlayerConnected(i))
  129.             {
  130.                 MAX_PLAYER_ID = i +1;
  131.                 break;
  132.             }
  133.         }
  134.         if (playerid +1 >= MAX_PLAYER_ID)
  135.         {
  136.             MAX_PLAYER_ID = 0;
  137.         }
  138.     }
  139.     for(new i=0;i<InteriorCount;i++)
  140.     {
  141.         if(object[i][playerid] == true)
  142.             {
  143.                         DestroyPlayerObject(playerid,objectid[playerid][i]);
  144.                         object[i][playerid] = false;
  145.                 }
  146.     }
  147.     ObjectsForPlayer[playerid] = 0;
  148.     W_Seifader_OnPlayerDisconnect(playerid, reason);
  149.     return 1;
  150. }
  151.  
  152. forward OnPlayerInteriorChangePlus(playerid, newinteriorid, oldinteriorid);
  153. public OnPlayerInteriorChangePlus(playerid, newinteriorid, oldinteriorid)
  154. {
  155.         for(new i;i<InteriorCount;i++)
  156.         {
  157.             if(IntInt[i] == newinteriorid && InteriorPreparing[i] > 0) SetVehiclePos(vehicle[i],IntPos[i][0]-vx+ex,IntPos[i][1]-vy+ey,IntPos[i][2]-vz+ez);
  158.         }
  159. }
  160.  
  161. public Wints_OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
  162. {
  163.     OnPlayerInteriorChangePlus(playerid, newinteriorid, oldinteriorid);
  164.         return 1;
  165. }
  166.  
  167. forward Wints_Timer();
  168. public Wints_Timer()
  169. {
  170.     Wints_CheckPlayersPosition();
  171.         if(tick == true)
  172.         {
  173.             tick = false;
  174.             {
  175.                         for(new i=1;i<=(WZONES_COUNT_WIDTH*WZONES_COUNT_WIDTH);i++) // control of each zone
  176.                         {
  177.                             ZoneSettled[i] = false;
  178.                             for(new p=0;p<MAX_PLAYER_ID;p++)
  179.                             {
  180.                                 if(IsPlayerConnected(p))
  181.                                         {
  182.                                             if(IsPlayerNearWZone(p,i))
  183.                                             {
  184.                                         ZoneSettled[i] = true;
  185.                                         break;
  186.                                             }
  187.                                         }
  188.                             }
  189.                         }
  190.                         for(new i=0;i<InteriorCount;i++) // spawning/destroying of vehicles, oops... interiors
  191.                         {
  192.                             if(ZoneSettled[IntZone[i]] == true)
  193.                                 {
  194.                                     if(InteriorPreparing[i] > 0)
  195.                                     {
  196.                                         new Float:Pos[3], Float:h;
  197.                                         GetVehiclePos(vehicle[i],Pos[0],Pos[1],Pos[2]);
  198.                                         GetVehicleHealth(vehicle[i],h);
  199.                                         if(h < 1000.0) SetVehicleHealth(vehicle[i],1000);
  200.                                 if(!(Pos[0] == 0 && Pos[1] == 0 &&Pos[2] == 0))
  201.                                         {
  202.                                                 if(DistanceBetweenPoints(Pos[0],Pos[1],Pos[2],IntPos[i][0]-vx+ex,IntPos[i][1]-vy+ey,IntPos[i][2]-vz+ez) > float(WVEHICLE_OFFSET))
  203.                                                         {
  204.                                                                 SetVehiclePos(vehicle[i],IntPos[i][0]-vx+ex,IntPos[i][1]-vy+ey,IntPos[i][2]-vz+ez);
  205.                                                                 SetVehicleZAngle(vehicle[i],90);
  206.                                                         }
  207.                                                 }
  208.                                     } else Wints_PrepareInterior(i);
  209.                                 }
  210.                             else if(InteriorPreparing[i] > 0) Wints_CancelInterior(i);
  211.                         }
  212.                         for(new p=0;p<MAX_PLAYER_ID;p++)
  213.                         {
  214.                             if(IsPlayerConnected(p))
  215.                             {
  216.                                 new Float:Pos[3];
  217.                                 GetPlayerPos(p,Pos[0],Pos[1],Pos[2]);
  218.                                 for(new i=0;i<InteriorCount;i++) // interior marking whether is the player near them
  219.                                         {
  220.                                             if(DistanceBetweenPoints(Pos[0],Pos[1],Pos[2],IntPos[i][0],IntPos[i][1],IntPos[i][2]) <= WARROW_DISTANCE && GetPlayerInterior(p) == IntInt[i])
  221.                                                 {
  222.                                                         if(ViewedForPlayer[i][p] == false) SetVehicleParamsForPlayer(vehicle[i],p,true,true);
  223.                                                         if(InteriorPrepared[i] == true && ViewedForPlayer[i][p] == false) ViewedForPlayer[i][p] = true;
  224.                                                 }
  225.                                                 else if(ViewedForPlayer[i][p] == true) ViewedForPlayer[i][p] = false;
  226.                                             if(DistanceBetweenPoints(Pos[0],Pos[1],Pos[2],IntPos[i][0],IntPos[i][1],IntPos[i][2]) <= WOBJECT_DISTANCE && GetPlayerInterior(p) == IntInt[i])
  227.                                                 {
  228.                                                     if(object[i][p] == false)
  229.                                                     {
  230.                                                         if(ObjectsForPlayer[p] < MAX_PLAYER_WOBJECTS)
  231.                                                         {
  232.                                                                         objectid[p][i] = CreatePlayerObject(p,WINT_OBJECT_ID,IntPos[i][0]+ex,IntPos[i][1]+ey,IntPos[i][2]+ez,90,0,0);
  233.                                                                         object[i][p] = true;
  234.                                                                         ObjectsForPlayer[p]++;
  235.                                                                 }
  236.                                                         }
  237.                                                 }
  238.                                                 else if(object[i][p] == true)
  239.                                             {
  240.                                                         DestroyPlayerObject(p,objectid[p][i]);
  241.                                                         object[i][p] = false;
  242.                                                         ObjectsForPlayer[p]--;
  243.                                                 }
  244.                                         }
  245.                             }
  246.                         }
  247.                         for(new i=0;i<InteriorCount;i++) // delay to set yellow arrow
  248.                         {
  249.                             if(InteriorPreparing[i] >= PREPARING_WSECS+1 && InteriorPrepared[i] == false)
  250.                                 {
  251.                                         InteriorPrepared[i] = true;
  252.                                 }
  253.                                 else if(InteriorPreparing[i] > 0 && InteriorPreparing[i] < PREPARING_WSECS+1)
  254.                                 {
  255.                                     InteriorPreparing[i]++;
  256.                                 }
  257.                         }
  258.                 }
  259.         }
  260.         else tick = true;
  261.         return 1;
  262. }
  263.  
  264. stock CreateWInterior(Float:posX,Float:posY,Float:posZ,int,Float:posXtarg,Float:posYtarg,Float:posZtarg,Float:Angletarg,inttarg)
  265. {
  266.         if(InteriorCount == MAX_CREATED_WINTERIORS) return -1;
  267.         IntPos[InteriorCount][0] = posX;
  268.         IntPos[InteriorCount][1] = posY;
  269.         IntPos[InteriorCount][2] = posZ;
  270.         IntInt[InteriorCount] = int;
  271.         IntPosTarget[InteriorCount][0] = posXtarg;
  272.         IntPosTarget[InteriorCount][1] = posYtarg;
  273.         IntPosTarget[InteriorCount][2] = posZtarg;
  274.     AngleTarget[InteriorCount] = Angletarg;
  275.         IntIntTarget[InteriorCount] = inttarg;
  276.         IntZone[InteriorCount] = Wints_GetPointZone(posX,posY);
  277.         InteriorCount++;
  278.         return InteriorCount;
  279. }
  280.  
  281. stock Wints_GetPointZone(Float:posX,Float:posY)
  282. {
  283.         if(posX > MAX_WIDTH_WZONE || posX < -MAX_WIDTH_WZONE || posY > MAX_WIDTH_WZONE || posY < -MAX_WIDTH_WZONE) return INVALID_WZONE;
  284.         new zone = (floatround((posY+=MAX_WIDTH_WZONE)/((MAX_WIDTH_WZONE*2)/WZONES_COUNT_WIDTH),floatround_floor)*WZONES_COUNT_WIDTH)+floatround((posX+=MAX_WIDTH_WZONE)/((MAX_WIDTH_WZONE*2)/WZONES_COUNT_WIDTH),floatround_ceil);
  285.         if(zone <= 0 || zone > WZONES_COUNT_WIDTH*WZONES_COUNT_WIDTH) return INVALID_WZONE;
  286.         return zone;
  287. }
  288.  
  289. stock Wints_PrepareInterior(interior)
  290. {
  291.         if(ViewedInteriors >= MAX_VIEWED_WINTERIORS) return 0;
  292.         if(InteriorPreparing[interior] > 0) return 0;
  293.     InteriorPreparing[interior] = 1;
  294.     InteriorPrepared[interior] = false;
  295.         vehicle[interior] = CreateVehicle(ID_WVEHICLE,IntPos[interior][0]-vx+ex,IntPos[interior][1]-vy+ey,IntPos[interior][2]-vz+ez,90,0,0,-1);
  296.         LinkVehicleToInterior(vehicle[interior],IntInt[interior]);
  297.         ViewedInteriors++;
  298.         return 1;
  299. }
  300.  
  301. stock Wints_CancelInterior(interior)
  302. {
  303.         if(InteriorPreparing[interior] == 0) return 0;
  304.     InteriorPrepared[interior] = false;
  305.     InteriorPreparing[interior] = 0;
  306.         DestroyVehicle(vehicle[interior]);
  307.         ViewedInteriors--;
  308.         return 1;
  309. }
  310.  
  311. stock Wints_CheckPlayersPosition()
  312. {
  313.         for(new p=0;p<MAX_PLAYER_ID;p++)
  314.         {
  315.             if(IsPlayerConnected(p) && GetPlayerState(p) == PLAYER_STATE_ONFOOT)
  316.             {
  317.                         new Float:pos[3];
  318.                         GetPlayerPos(p,pos[0],pos[1],pos[2]);
  319.                     for(new i=0;i<InteriorCount;i++)
  320.                     {
  321.                         if(DistanceBetweenPoints(pos[0],pos[1],pos[2],IntPos[i][0],IntPos[i][1],IntPos[i][2]) <= WPORT_DISTANCE)
  322.                                 {
  323.                                         if(!IsWarping[p]) Wints_StartPlayerWarp(p,i);
  324.                                         break;
  325.                                 }
  326.                     }
  327.                 }
  328.         }
  329.         return 1;
  330. }
  331.  
  332. stock IsPlayerNearWZone(player, zone)
  333. {
  334.         new Float:a, Float:b, Float:c, Float:d;
  335.     new var1, var2, Float:z;
  336.         z = float(zone);
  337.         new Float:f=z/WZONES_COUNT_WIDTH;
  338.         var1 = floatround(f, floatround_ceil); // riadok
  339.         var2 = floatround(z-((var1-1)*WZONES_COUNT_WIDTH)); //stlpec
  340.         a = 0.0-MAX_WIDTH_WZONE+((var2-1)*((MAX_WIDTH_WZONE*2)/WZONES_COUNT_WIDTH)-WZONE_EXPAND);
  341.         b = a+((MAX_WIDTH_WZONE*2)/WZONES_COUNT_WIDTH)+(WZONE_EXPAND*2);
  342.         c = 0.0-MAX_WIDTH_WZONE+((var1-1)*((MAX_WIDTH_WZONE*2)/WZONES_COUNT_WIDTH)-WZONE_EXPAND);
  343.         d = c+((MAX_WIDTH_WZONE*2)/WZONES_COUNT_WIDTH)+(WZONE_EXPAND*2);
  344.         new Float:X, Float:Y, Float:Z;
  345.         GetPlayerPos(player, X, Y, Z);
  346.         if(X <= b && X >= a && Y <= d && Y >= c) return 1;
  347.         return 0;
  348. }
  349.  
  350. stock Wints_StartPlayerWarp(p,i)
  351. {
  352.         W_FadePlayerScreenToColor(p, W_FADE_COLOR, W_FADE_SPEED);
  353.         PlayerPlaySound(p, 1083, 0,0,0);
  354.         CurrentInterior[p] = i;
  355.         TogglePlayerControllable(p, false);
  356.         IsWarping[p] = true;
  357.         return 1;
  358. }
  359.  
  360. public Wints_OnPlayerScreenColorFade(playerid, color, speed)
  361. {
  362.         new bool:ichanged;
  363.         W_FadePlayerScreen(playerid, W_FADE_COLOR, W_FADE_SPEED);
  364.         if(GetPlayerInterior(playerid) != IntIntTarget[CurrentInterior[playerid]]) ichanged = true;
  365.         SetPlayerInterior(playerid, IntIntTarget[CurrentInterior[playerid]]);
  366.         if(ichanged == false) OnPlayerInteriorChangePlus(playerid,IntIntTarget[CurrentInterior[playerid]],-1);
  367.         SetPlayerPos(playerid,IntPosTarget[CurrentInterior[playerid]][0],IntPosTarget[CurrentInterior[playerid]][1],IntPosTarget[CurrentInterior[playerid]][2]);
  368.         SetPlayerFacingAngle(playerid, AngleTarget[CurrentInterior[playerid]]);
  369.         SetCameraBehindPlayer(playerid);
  370.         return 1;
  371. }
  372.  
  373. public Wints_OnPlayerScreenFade(playerid, color, speed)
  374. {
  375.         TogglePlayerControllable(playerid, 1);
  376.         IsWarping[playerid] = false;
  377.         return 1;
  378. }
  379.  
  380. //------------------------------ Seifader by Seif ----------------------------------
  381.  
  382. stock Wints_Seifader_OnInit()
  383. {
  384.     for(new all = 0; all < MAX_PLAYERS_WEX; all++)
  385.         {
  386.             w_screenfade[all] = TextDrawCreate(0.0, 0.0, "_");
  387.                 TextDrawFont(w_screenfade[all], 1);
  388.                 TextDrawLetterSize(w_screenfade[all], 0.0, 50.0);
  389.                 TextDrawUseBox(w_screenfade[all], true);
  390.                 TextDrawColor(w_screenfade[all], 0);
  391.                 TextDrawBoxColor(w_screenfade[all], 0);
  392.                 w_colorfade[all] = 0;
  393.         }
  394. }
  395.  
  396. stock Wints_Seifader_OnExit()
  397. {
  398.     for(new all = 0; all < MAX_PLAYERS_WEX; all++) TextDrawDestroy(w_screenfade[all]);
  399. }
  400.  
  401. stock W_Seifader_OnPlayerDisconnect(playerid, reason)
  402. {
  403.         #pragma unused reason
  404.         TextDrawHideForPlayer(playerid, w_screenfade[playerid]);
  405. }
  406.  
  407. stock W_FadePlayerScreen(playerid, color, speed)
  408. {
  409.     w_colorfade[playerid] = color;
  410.     TextDrawBoxColor(w_screenfade[playerid], color);
  411.         TextDrawShowForPlayer(playerid, w_screenfade[playerid]);
  412.         SetTimerEx("Wints_ScreenFade", 100, 0, "ddd", playerid, color, speed);
  413. }
  414.  
  415. stock W_FadePlayerScreenToColor(playerid, color, speed)
  416. {
  417.         color -= 255;
  418.         w_colorfade[playerid] = color;
  419.     TextDrawBoxColor(w_screenfade[playerid], color);
  420.         TextDrawShowForPlayer(playerid, w_screenfade[playerid]);
  421.         SetTimerEx("Wints_ScreenFadeColor", 100, 0, "ddd", playerid, color, speed);
  422. }
  423.  
  424. public Wints_ScreenFade(playerid, color, speed)
  425. {
  426.         if (color <= (w_colorfade[playerid] - 255))
  427.         {
  428.             TextDrawHideForPlayer(playerid, w_screenfade[playerid]);
  429.             Wints_OnPlayerScreenFade(playerid, color, speed);
  430.         }
  431.         else
  432.         {
  433.                 color -= speed;
  434.                 if (color <= (w_colorfade[playerid] - 255)) color = (w_colorfade[playerid] - 255);
  435.                 TextDrawBoxColor(w_screenfade[playerid], color);
  436.                 TextDrawShowForPlayer(playerid, w_screenfade[playerid]);
  437.                 SetTimerEx("Wints_ScreenFade", 100, 0, "ddd", playerid, color, speed);
  438.         }
  439. }
  440.  
  441. public Wints_ScreenFadeColor(playerid, color, speed)
  442. {
  443.         if (color >= (w_colorfade[playerid] + 255))
  444.         {
  445.             Wints_OnPlayerScreenColorFade(playerid, color, speed);
  446.         }
  447.         else
  448.         {
  449.                 color += speed;
  450.                 if (color >= (w_colorfade[playerid] + 255))  color = (w_colorfade[playerid] + 255);
  451.                 TextDrawBoxColor(w_screenfade[playerid], color);
  452.                 TextDrawShowForPlayer(playerid, w_screenfade[playerid]);
  453.                 SetTimerEx("Wints_ScreenFadeColor", 100, 0, "ddd", playerid, color, speed);
  454.         }
  455. }
clone this paste RAW Paste Data