int change_room(MSG_ROOM room_action, int client_id){ lock_repo(); int i; int room_exists_on_server = FALSE; for(i=0; i<REPO_SIZE; ++i){ if( !strcmp(SHM_ROOM_SERVER_ADRESS[i].room_name, room_action.room_name) && SHM_ROOM_SERVER_ADRESS[i].server_id == MSG_RECEIVER){ room_exists_on_server = TRUE; break; } } unlock_repo(); if (!room_exists_on_server) { int return_flag = create_room(room_action.room_name); if (return_flag == FULL) { return FULL; } } char* old_room = change_users_room_in_local_repo(client_id, room_action.room_name); if( count_people_in_room(old_room) == 0){ delete_room(old_room); } log_data("USER %s CHANGED ROOM FROM %s TO %s", room_action.user_name, old_room, room_action.room_name); free(old_room); return SUCCESS; }
/** * WARNING: This function actually deletes a building. * * @param char_data *ch The person doing the deleting. * @param bld_vnum vnum The vnum to delete. */ void olc_delete_building(char_data *ch, bld_vnum vnum) { void check_for_bad_buildings(); extern bool delete_link_rule_by_type_value(struct adventure_link_rule **list, int type, any_vnum value); void remove_building_from_table(bld_data *bld); descriptor_data *desc; room_data *room, *next_room; craft_data *craft, *next_craft; adv_data *adv, *next_adv; bld_data *bld; int count; bool found, deleted = FALSE; if (!(bld = building_proto(vnum))) { msg_to_char(ch, "There is no such building %d.\r\n", vnum); return; } if (HASH_COUNT(building_table) <= 1) { msg_to_char(ch, "You can't delete the last building.\r\n"); return; } // pull from hash remove_building_from_table(bld); // save index and building file now save_index(DB_BOOT_BLD); save_library_file_for_vnum(DB_BOOT_BLD, vnum); // update world count = 0; HASH_ITER(world_hh, world_table, room, next_room) { if (IS_ANY_BUILDING(room) && BUILDING_VNUM(room) == vnum) { if (GET_ROOM_VNUM(room) >= MAP_SIZE) { delete_room(room, FALSE); // must call check_all_exits deleted = TRUE; } else { // map room if (ROOM_PEOPLE(room)) { act("The building has been deleted.", FALSE, ROOM_PEOPLE(room), NULL, NULL, TO_CHAR | TO_ROOM); } disassociate_building(room); } } } if (deleted) { check_all_exits(); } // adventure zones HASH_ITER(hh, adventure_table, adv, next_adv) { found = delete_link_rule_by_type_value(&GET_ADV_LINKING(adv), ADV_LINK_BUILDING_EXISTING, vnum); found |= delete_link_rule_by_type_value(&GET_ADV_LINKING(adv), ADV_LINK_BUILDING_NEW, vnum); found |= delete_link_rule_by_type_value(&GET_ADV_LINKING(adv), ADV_LINK_PORTAL_BUILDING_EXISTING, vnum); found |= delete_link_rule_by_type_value(&GET_ADV_LINKING(adv), ADV_LINK_PORTAL_BUILDING_NEW, vnum); if (found) { save_library_file_for_vnum(DB_BOOT_ADV, GET_ADV_VNUM(adv)); } }