func.pwn 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. LoadBuildingCache() {
  2. g_DBResult = db_query(g_ResourceDB, "SELECT * FROM `building_data`");
  3. new
  4. rows = db_num_rows(g_DBResult),
  5. buildings_loaded,
  6. buildingid
  7. ;
  8. for(new row; row < rows; row ++) {
  9. buildingid = db_get_field_assoc_int(g_DBResult, "buildingid");
  10. if( IsValidBuildingID(buildingid) && !g_BuildingData[buildingid][BUILDING_DATA_ISLOADED] ) {
  11. g_BuildingData[buildingid][BUILDING_DATA_MODEL] = db_get_field_assoc_int (g_DBResult, "model");
  12. g_BuildingData[buildingid][BUILDING_DATA_LODMODEL] = db_get_field_assoc_int (g_DBResult, "lodmodel");
  13. g_BuildingData[buildingid][BUILDING_DATA_X] = db_get_field_assoc_float(g_DBResult, "x");
  14. g_BuildingData[buildingid][BUILDING_DATA_Y] = db_get_field_assoc_float(g_DBResult, "y");
  15. g_BuildingData[buildingid][BUILDING_DATA_Z] = db_get_field_assoc_float(g_DBResult, "z");
  16. g_BuildingData[buildingid][BUILDING_DATA_RX] = db_get_field_assoc_float(g_DBResult, "rx");
  17. g_BuildingData[buildingid][BUILDING_DATA_RY] = db_get_field_assoc_float(g_DBResult, "ry");
  18. g_BuildingData[buildingid][BUILDING_DATA_RZ] = db_get_field_assoc_float(g_DBResult, "rz");
  19. g_BuildingData[buildingid][BUILDING_DATA_OFFSET] = db_get_field_assoc_float(g_DBResult, "offset");
  20. g_BuildingData[buildingid][BUILDING_DATA_ISLOADED] = true;
  21. buildings_loaded ++;
  22. }
  23. db_next_row(g_DBResult);
  24. }
  25. db_free_result(g_DBResult);
  26. if( buildings_loaded != BUILDING_DATA_SIZE ) {
  27. printf("error: %i / %i buildings were loaded!", buildings_loaded, BUILDING_DATA_SIZE);
  28. }
  29. }
  30. RemoveBuildingIDForPlayer(playerid, buildingid) {
  31. RemoveBuildingForPlayer(playerid,
  32. .modelid = g_BuildingData[buildingid][BUILDING_DATA_MODEL],
  33. .fX = g_BuildingData[buildingid][BUILDING_DATA_X],
  34. .fY = g_BuildingData[buildingid][BUILDING_DATA_Y],
  35. .fZ = g_BuildingData[buildingid][BUILDING_DATA_Z],
  36. .fRadius = g_BuildingData[buildingid][BUILDING_DATA_OFFSET] + REMOVE_BUILDING_RANGE
  37. );
  38. if( g_BuildingData[buildingid][BUILDING_DATA_LODMODEL] != INVALID_BUILDING_LODMODEL ) {
  39. RemoveBuildingForPlayer(playerid,
  40. .modelid = g_BuildingData[buildingid][BUILDING_DATA_LODMODEL],
  41. .fX = g_BuildingData[buildingid][BUILDING_DATA_X],
  42. .fY = g_BuildingData[buildingid][BUILDING_DATA_Y],
  43. .fZ = g_BuildingData[buildingid][BUILDING_DATA_Z],
  44. .fRadius = g_BuildingData[buildingid][BUILDING_DATA_OFFSET] + REMOVE_BUILDING_RANGE
  45. );
  46. }
  47. }
  48. RemoveBuildingIDForAll(buildingid) {
  49. for(new playerid, max_playerid = GetPlayerPoolSize(); playerid <= max_playerid; playerid ++) {
  50. if( IsPlayerConnected(playerid) ) {
  51. RemoveBuildingIDForPlayer(playerid, buildingid);
  52. }
  53. }
  54. }
  55. GetBuildingsInRange(result[], result_size, search_modelid, Float:search_x, Float:search_y, Float:search_z, Float:search_radius) {
  56. new
  57. result_count,
  58. building_modelid,
  59. Float: building_x,
  60. Float: building_y,
  61. Float: building_z,
  62. Float: building_distance
  63. ;
  64. for(new b; b < BUILDING_DATA_SIZE; b ++) {
  65. if( result_count >= result_size ) {
  66. break;
  67. }
  68. building_modelid = g_BuildingData[b][BUILDING_DATA_MODEL];
  69. building_x = g_BuildingData[b][BUILDING_DATA_X];
  70. building_y = g_BuildingData[b][BUILDING_DATA_Y];
  71. building_z = g_BuildingData[b][BUILDING_DATA_Z];
  72. building_distance = GetDistanceBetweenPoints(search_x, search_y, search_z, building_x, building_y, building_z);
  73. if( ( search_modelid == -1 || search_modelid == building_modelid ) && building_distance <= search_radius ) {
  74. result[result_count ++] = b;
  75. }
  76. }
  77. return result_count;
  78. }
  79. GetNearestBuilding(Float:search_x, Float:search_y, Float:search_z, &Float:ret_distance, Float:min_distance = 0.0, incmode = BUILDING_INCMODE_ALL) {
  80. new
  81. ret_buildingid = INVALID_BUILDING_ID,
  82. Float: building_x,
  83. Float: building_y,
  84. Float: building_z,
  85. Float: building_distance
  86. ;
  87. for(new b; b < BUILDING_DATA_SIZE; b ++) {
  88. building_x = g_BuildingData[b][BUILDING_DATA_X];
  89. building_y = g_BuildingData[b][BUILDING_DATA_Y];
  90. building_z = g_BuildingData[b][BUILDING_DATA_Z];
  91. building_distance = GetDistanceBetweenPoints(search_x, search_y, search_z, building_x, building_y, building_z);
  92. if(
  93. ( incmode == BUILDING_INCMODE_ALL || ( incmode == BUILDING_INCMODE_REMOVED && g_BuildingData[b][BUILDING_DATA_ISREMOVED] ) || ( incmode == BUILDING_INCMODE_EXISTING && !g_BuildingData[b][BUILDING_DATA_ISREMOVED] ) ) &&
  94. ( min_distance == 0.0 || building_distance > min_distance ) &&
  95. ( ret_buildingid == INVALID_BUILDING_ID || building_distance < ret_distance )
  96. ) {
  97. ret_buildingid = b;
  98. ret_distance = building_distance;
  99. }
  100. }
  101. return ret_buildingid;
  102. }
  103. FindBuildings(result[], result_size, offset, incmode, Float:x, Float:y, Float:z) {
  104. new
  105. buildingid,
  106. rows_found,
  107. rows_added,
  108. Float: min_distance
  109. ;
  110. for(new b; b < BUILDING_DATA_SIZE; b ++) {
  111. buildingid = GetNearestBuilding(x, y, z, min_distance, min_distance, incmode);
  112. if( buildingid == INVALID_BUILDING_ID ) {
  113. break;
  114. }
  115. if( rows_found ++ < offset ) {
  116. continue;
  117. }
  118. if( rows_added >= result_size ) {
  119. break;
  120. }
  121. result[rows_added ++] = buildingid;
  122. }
  123. return rows_added;
  124. }