Advertisement
Guest User

Wints by wollodya

a guest
Mar 22nd, 2010
522
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 14.34 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement