Guest User

Untitled

a guest
Jun 15th, 2022
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.25 KB | None | 0 0
  1. #include <YSI_Coding\y_hooks>
  2.  
  3. #define MAX_BUILDINGS 50
  4. #define INVALID_BUILDING_ID (-1)
  5.  
  6. #if !defined PRESSED
  7. #define PRESSED(%0) \
  8. (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
  9.  
  10.  
  11. enum eTPInfo {
  12. Float:tpX,
  13. Float:tpY,
  14. Float:tpZ,
  15. Float:tpR,
  16.  
  17. tpVW,
  18. tpInt
  19. }
  20.  
  21. enum eBuildingEnterExit
  22. {
  23. BuildingEntrance,
  24. BuildingExit
  25. }
  26. new BuildingInfo[MAX_BUILDINGS][eBuildingEnterExit][eTPInfo];
  27.  
  28. forward OnBuildingCreated(buildingid);
  29. //======================================================================
  30. //--->>> Functions
  31. //======================================================================
  32. stock bool:IsValidBuilding(buildingid)
  33. {
  34. if(buildingid < 0 || buildingid > MAX_BUILDINGS) return false;
  35. if(BuildingInfo[buildingid][BuildingEntrance][tpX] == 0.0) return false;
  36. return true;
  37. }
  38.  
  39. stock bool:ResetBuildingInfo(buildingid)
  40. {
  41. if(buildingid < 0 || buildingid > MAX_BUILDINGS) return false;
  42. BuildingInfo[buildingid][BuildingEntrance][tpX] = 0.0;
  43. BuildingInfo[buildingid][BuildingEntrance][tpY] = 0.0;
  44. BuildingInfo[buildingid][BuildingEntrance][tpZ] = 0.0;
  45. BuildingInfo[buildingid][BuildingEntrance][tpR] = 0.0;
  46.  
  47. BuildingInfo[buildingid][BuildingEntrance][tpVW] = 0;
  48. BuildingInfo[buildingid][BuildingEntrance][tpInt] = 0;
  49.  
  50. BuildingInfo[buildingid][BuildingExit][tpX] = 0.0;
  51. BuildingInfo[buildingid][BuildingExit][tpY] = 0.0;
  52. BuildingInfo[buildingid][BuildingExit][tpZ] = 0.0;
  53. BuildingInfo[buildingid][BuildingExit][tpR] = 0.0;
  54.  
  55. BuildingInfo[buildingid][BuildingExit][tpVW] = 0;
  56. BuildingInfo[buildingid][BuildingExit][tpInt] = 0;
  57. return true;
  58. }
  59.  
  60. stock GetFreeBuildingID()
  61. {
  62. for(new i = 0; i < MAX_BUILDINGS; i++)
  63. {
  64. if(BuildingInfo[i][BuildingEntrance][tpX] == 0.0) return i;
  65. }
  66. return INVALID_BUILDING_ID;
  67. }
  68.  
  69. //I dont check VW and Interior, you may need to, validate that before range check.
  70. stock GetBuildingNearPlayer(playerid, &eBuildingEnterExit:enterexit = BuildingEntrance)
  71. {
  72. if(!IsPlayerConnected(playerid)) return INVALID_BUILDING_ID;
  73. for(new i = 0; i < MAX_BUILDINGS; i++)
  74. {
  75. if(IsPlayerInRangeOfPoint(playerid, 3.0, BuildingInfo[i][BuildingEntrance][tpX],
  76. BuildingInfo[i][BuildingEntrance][tpY],
  77. BuildingInfo[i][BuildingEntrance][tpZ]))
  78. return i;
  79.  
  80. if(IsPlayerInRangeOfPoint(playerid, 3.0, BuildingInfo[i][BuildingExit][tpX],
  81. BuildingInfo[i][BuildingExit][tpY],
  82. BuildingInfo[i][BuildingExit][tpZ]))
  83. {
  84. enterexit = BuildingExit;
  85. return i;
  86. }
  87. }
  88. return INVALID_BUILDING_ID;
  89. }
  90.  
  91. stock bool:IsPlayerNearBuilding(playerid)
  92. {
  93. if(!IsPlayerConnected(playerid)) return false;
  94. if(GetBuildingNearPlayer(playerid) == INVALID_BUILDING_ID) return false;
  95. return true;
  96. }
  97.  
  98. CreateBuilding(Float:entranceX, Float:entranceY, Float:entranceZ, Float:entranceR, entranceVW = 0, entranceInterior = 0)
  99. {
  100. new buildingid = GetFreeBuildingID();
  101. if(buildingid == INVALID_BUILDING_ID) return INVALID_BUILDING_ID;
  102.  
  103. BuildingInfo[buildingid][BuildingEntrance][tpX] = entranceX;
  104. BuildingInfo[buildingid][BuildingEntrance][tpY] = entranceY;
  105. BuildingInfo[buildingid][BuildingEntrance][tpZ] = entranceZ;
  106. BuildingInfo[buildingid][BuildingEntrance][tpR] = entranceR;
  107.  
  108. BuildingInfo[buildingid][BuildingEntrance][tpX] = entranceVW;
  109. BuildingInfo[buildingid][BuildingEntrance][tpX] = entranceInterior;
  110.  
  111. CallRemoteFunction("OnBuildingCreated", "d", buildingid);
  112. return buildingid;
  113. }
  114.  
  115. stock bool:SetBuildingEntrance(buildingid, Float:entranceX, Float:entranceY, Float:entranceZ, Float:entranceR, entranceVW = 0, entranceInterior = 0)
  116. {
  117. if(!IsValidBuilding(buildingid)) return false;
  118.  
  119. BuildingInfo[buildingid][BuildingEntrance][tpX] = entranceX;
  120. BuildingInfo[buildingid][BuildingEntrance][tpY] = entranceY;
  121. BuildingInfo[buildingid][BuildingEntrance][tpZ] = entranceZ;
  122. BuildingInfo[buildingid][BuildingEntrance][tpR] = entranceR;
  123.  
  124. BuildingInfo[buildingid][BuildingEntrance][tpX] = entranceVW;
  125. BuildingInfo[buildingid][BuildingEntrance][tpX] = entranceInterior;
  126. return true;
  127. }
  128.  
  129. stock bool:SetBuildingExit(buildingid, Float:exitX, Float:exitY, Float:exitZ, Float:exitR, exitVW = 0, exitInterior = 0)
  130. {
  131. if(!IsValidBuilding(buildingid)) return false;
  132.  
  133. BuildingInfo[buildingid][BuildingExit][tpX] = exitX;
  134. BuildingInfo[buildingid][BuildingExit][tpY] = exitY;
  135. BuildingInfo[buildingid][BuildingExit][tpZ] = exitZ;
  136. BuildingInfo[buildingid][BuildingExit][tpR] = exitR;
  137.  
  138. BuildingInfo[buildingid][BuildingExit][tpX] = exitVW;
  139. BuildingInfo[buildingid][BuildingExit][tpX] = exitInterior;
  140. return true;
  141. }
  142. //======================================================================
  143. //--->>> Hooks
  144. //======================================================================
  145. hook OnScriptInit()
  146. {
  147. for(new i = 0; i < MAX_BUILDINGS; i++)
  148. {
  149. ResetBuildingInfo(i);
  150. }
  151.  
  152. IsPlayerNearBuilding(0);
  153. CreateBuilding(0.0,0.0,0.0,0.0,0,0);
  154. SetBuildingEntrance(0, 0.0,0.0,0.0,0.0,0,0);
  155. SetBuildingExit(0, 0.0,0.0,0.0,0.0,0,0);
  156. }
  157.  
  158. hook OnScriptExit()
  159. {
  160.  
  161. }
  162.  
  163. hook OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  164. {
  165. if(!PRESSED(KEY_ACTION)) return Y_HOOKS_CONTINUE_RETURN_0;
  166. if(GetPlayerState(playerid) != PLAYER_STATE_ONFOOT) return Y_HOOKS_CONTINUE_RETURN_0;
  167.  
  168. new eBuildingEnterExit:enterexit, buildingid = GetBuildingNearPlayer(playerid, enterexit);
  169. if(buildingid == INVALID_BUILDING_ID) return Y_HOOKS_CONTINUE_RETURN_0;
  170. if(enterexit == BuildingEntrance) enterexit = BuildingExit;
  171.  
  172. SetPlayerPos(playerid, BuildingInfo[buildingid][enterexit][tpX], BuildingInfo[buildingid][enterexit][tpY], BuildingInfo[buildingid][enterexit][tpZ]);
  173. SetPlayerFacingAngle(playerid, BuildingInfo[buildingid][enterexit][tpR]);
  174. SetPlayerVirtualWorld(playerid, BuildingInfo[buildingid][enterexit][tpVW]);
  175. SetPlayerInterior(playerid, BuildingInfo[buildingid][enterexit][tpInt]);
  176.  
  177. return Y_HOOKS_BREAK_RETURN_1;
  178. }
Advertisement
Add Comment
Please, Sign In to add comment