| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- LoadBuildingCache() {
- g_DBResult = db_query(g_ResourceDB, "SELECT * FROM `building_data`");
- new
- rows = db_num_rows(g_DBResult),
- buildings_loaded,
- buildingid
- ;
- for(new row; row < rows; row ++) {
- buildingid = db_get_field_assoc_int(g_DBResult, "buildingid");
- if( IsValidBuildingID(buildingid) && !g_BuildingData[buildingid][BUILDING_DATA_ISLOADED] ) {
- g_BuildingData[buildingid][BUILDING_DATA_MODEL] = db_get_field_assoc_int (g_DBResult, "model");
- g_BuildingData[buildingid][BUILDING_DATA_LODMODEL] = db_get_field_assoc_int (g_DBResult, "lodmodel");
- g_BuildingData[buildingid][BUILDING_DATA_X] = db_get_field_assoc_float(g_DBResult, "x");
- g_BuildingData[buildingid][BUILDING_DATA_Y] = db_get_field_assoc_float(g_DBResult, "y");
- g_BuildingData[buildingid][BUILDING_DATA_Z] = db_get_field_assoc_float(g_DBResult, "z");
- g_BuildingData[buildingid][BUILDING_DATA_RX] = db_get_field_assoc_float(g_DBResult, "rx");
- g_BuildingData[buildingid][BUILDING_DATA_RY] = db_get_field_assoc_float(g_DBResult, "ry");
- g_BuildingData[buildingid][BUILDING_DATA_RZ] = db_get_field_assoc_float(g_DBResult, "rz");
- g_BuildingData[buildingid][BUILDING_DATA_OFFSET] = db_get_field_assoc_float(g_DBResult, "offset");
- g_BuildingData[buildingid][BUILDING_DATA_ISLOADED] = true;
- buildings_loaded ++;
- }
- db_next_row(g_DBResult);
- }
- db_free_result(g_DBResult);
- if( buildings_loaded != BUILDING_DATA_SIZE ) {
- printf("error: %i / %i buildings were loaded!", buildings_loaded, BUILDING_DATA_SIZE);
- }
- }
- RemoveBuildingIDForPlayer(playerid, buildingid) {
- RemoveBuildingForPlayer(playerid,
- .modelid = g_BuildingData[buildingid][BUILDING_DATA_MODEL],
- .fX = g_BuildingData[buildingid][BUILDING_DATA_X],
- .fY = g_BuildingData[buildingid][BUILDING_DATA_Y],
- .fZ = g_BuildingData[buildingid][BUILDING_DATA_Z],
- .fRadius = g_BuildingData[buildingid][BUILDING_DATA_OFFSET] + REMOVE_BUILDING_RANGE
- );
- if( g_BuildingData[buildingid][BUILDING_DATA_LODMODEL] != INVALID_BUILDING_LODMODEL ) {
- RemoveBuildingForPlayer(playerid,
- .modelid = g_BuildingData[buildingid][BUILDING_DATA_LODMODEL],
- .fX = g_BuildingData[buildingid][BUILDING_DATA_X],
- .fY = g_BuildingData[buildingid][BUILDING_DATA_Y],
- .fZ = g_BuildingData[buildingid][BUILDING_DATA_Z],
- .fRadius = g_BuildingData[buildingid][BUILDING_DATA_OFFSET] + REMOVE_BUILDING_RANGE
- );
- }
- }
- RemoveBuildingIDForAll(buildingid) {
- for(new playerid, max_playerid = GetPlayerPoolSize(); playerid <= max_playerid; playerid ++) {
- if( IsPlayerConnected(playerid) ) {
- RemoveBuildingIDForPlayer(playerid, buildingid);
- }
- }
- }
- GetBuildingsInRange(result[], result_size, search_modelid, Float:search_x, Float:search_y, Float:search_z, Float:search_radius) {
- new
- result_count,
- building_modelid,
- Float: building_x,
- Float: building_y,
- Float: building_z,
- Float: building_distance
- ;
- for(new b; b < BUILDING_DATA_SIZE; b ++) {
- if( result_count >= result_size ) {
- break;
- }
- building_modelid = g_BuildingData[b][BUILDING_DATA_MODEL];
- building_x = g_BuildingData[b][BUILDING_DATA_X];
- building_y = g_BuildingData[b][BUILDING_DATA_Y];
- building_z = g_BuildingData[b][BUILDING_DATA_Z];
- building_distance = GetDistanceBetweenPoints(search_x, search_y, search_z, building_x, building_y, building_z);
-
- if( ( search_modelid == -1 || search_modelid == building_modelid ) && building_distance <= search_radius ) {
- result[result_count ++] = b;
- }
- }
- return result_count;
- }
- GetNearestBuilding(Float:search_x, Float:search_y, Float:search_z, &Float:ret_distance, Float:min_distance = 0.0, incmode = BUILDING_INCMODE_ALL) {
- new
- ret_buildingid = INVALID_BUILDING_ID,
- Float: building_x,
- Float: building_y,
- Float: building_z,
- Float: building_distance
- ;
- for(new b; b < BUILDING_DATA_SIZE; b ++) {
- building_x = g_BuildingData[b][BUILDING_DATA_X];
- building_y = g_BuildingData[b][BUILDING_DATA_Y];
- building_z = g_BuildingData[b][BUILDING_DATA_Z];
- building_distance = GetDistanceBetweenPoints(search_x, search_y, search_z, building_x, building_y, building_z);
- if(
- ( incmode == BUILDING_INCMODE_ALL || ( incmode == BUILDING_INCMODE_REMOVED && g_BuildingData[b][BUILDING_DATA_ISREMOVED] ) || ( incmode == BUILDING_INCMODE_EXISTING && !g_BuildingData[b][BUILDING_DATA_ISREMOVED] ) ) &&
- ( min_distance == 0.0 || building_distance > min_distance ) &&
- ( ret_buildingid == INVALID_BUILDING_ID || building_distance < ret_distance )
- ) {
- ret_buildingid = b;
- ret_distance = building_distance;
- }
- }
- return ret_buildingid;
- }
- FindBuildings(result[], result_size, offset, incmode, Float:x, Float:y, Float:z) {
- new
- buildingid,
- rows_found,
- rows_added,
- Float: min_distance
- ;
- for(new b; b < BUILDING_DATA_SIZE; b ++) {
- buildingid = GetNearestBuilding(x, y, z, min_distance, min_distance, incmode);
- if( buildingid == INVALID_BUILDING_ID ) {
- break;
- }
- if( rows_found ++ < offset ) {
- continue;
- }
- if( rows_added >= result_size ) {
- break;
- }
- result[rows_added ++] = buildingid;
- }
- return rows_added;
- }
|