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