create or replace package body loader as procedure get_version_number(current_version in out number, min_version in out number) as begin select version_number, min_version_number into current_version, min_version from version_number; end; function get_character_name_list return cursortype as result_cursor cursortype; begin -- free up names that aren't in use anymore delete from players where not exists (select 1 from objects where objects.object_id = character_object); open result_cursor for select character_object, station_id, uc_character_name, character_full_name, (create_time - to_date('01/01/1970', 'MM/DD/YYYY')) * 24 * 3600, (last_login_time - to_date('01/01/1970', 'MM/DD/YYYY')) * 24 * 3600 from players; return result_cursor; end; function locate_player (p_object_id number) return number as begin insert into object_list (object_id, container_level) select object_id, 100 from objects where load_with = p_object_id and deleted = 0; return sql%rowcount; end; procedure locate_universe as begin insert into object_list (object_id) select o.object_id from objects o, universe_objects u where o.object_id = u.object_id and o.deleted=0; end; procedure locate_contained_object (p_container_id number, p_object_id number) as begin insert into object_list (object_id, container_level) select object_id, 100 from objects o start with o.object_id = p_object_id and o.contained_by = p_container_id and o.deleted = 0 connect by prior o.object_id = o.contained_by and o.deleted = 0; end; function locate_by_loadwith_batch (p_loadwiths vaofstring, p_chunk_size number) return number as begin forall i in 1..p_chunk_size insert into object_list (object_id) select o.object_id from objects o where o.load_with = p_loadwiths(i) and o.deleted = 0; return sql%rowcount; end; procedure locate_contents (p_container_id number) as begin insert into object_list (object_id, container_level) select object_id, 100 from objects o where o.load_with = p_container_id and o.deleted = 0; end; procedure locate_structure (p_object_id number, p_x out number, p_z out number, p_scene_id out varchar2, p_found out number) as begin select x, z, scene_id, 1 into p_x, p_z, p_scene_id, p_found from objects where object_id = p_object_id and deleted = 0 and type_id in (1112885583, -- BuildingObject 1212763727, -- HarvesterInstallationObject 1229869903, -- InstallationObject 1296649807); -- ManufactureInstallationObject exception when no_data_found then p_found := 0; end; function get_characters (p_station_id number) return cursortype as result_cursor cursortype; begin open result_cursor for select character_object, object_template_id, scene_id, object_name, container, x, y, z from character_view where station_id = p_station_id; return result_cursor; end; function load_chunk_object_list (p_scene_id varchar, p_node_x float, p_node_z float) return number as num number; begin select count(*) into num from objects where node_x = p_node_x and node_z = p_node_z and scene_id = p_scene_id and deleted = 0; if (num > 0) then insert into object_list (object_id, container_level) select object_id, level from objects start with node_x = p_node_x and node_z = p_node_z and scene_id = p_scene_id and deleted = 0 and contained_by = 0 and player_controlled = 'N' connect by prior object_id = contained_by and deleted = 0 and player_controlled='N' and prior load_contents='Y'; return sql%rowcount; else return 0; end if; end; function load_manf_schematic_attributes return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T) */ t.object_id, t.attribute_type, t.value from object_list l, manf_schematic_attributes t where t.object_id = l.object_id; return result_cursor; end; function load_armor return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T) */ t.object_id, t.layer, t.object_template, t.effectiveness, t.integrity, t.special_protections, t.encumberance_0, t.encumberance_1, t.encumberance_2, t.encumberance_3, t.encumberance_4, t.encumberance_5, t.encumberance_6, t.encumberance_7, t.encumberance_8 from object_list l, armor t where t.object_id = l.object_id; return result_cursor; end; function load_scripts return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T)*/ t.object_id, t.script, t.sequence_no from object_list l, scripts t where t.object_id = l.object_id; return result_cursor; end; function load_object_variables return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T)*/ t.object_id, t.name_id, t.type, t.value from object_list l, object_variables t where l.object_id = t.object_id and nvl(t.detached,0) = 0; return result_cursor; end; function load_property_lists return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T) */ t.object_id, t.list_id, t.value from object_list l, property_lists t where t.object_id = l.object_id; return result_cursor; end; function load_experience return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T) */ t.object_id, t.experience_type, t.points from object_list l, experience_points t where t.object_id = l.object_id; return result_cursor; end; function load_battlefield_participants return cursortype as result_cursor cursortype; begin open result_cursor for select t.region_object_id, t.character_object_id, t.faction_id /*+ ORDERED USE_NL(T) */ from object_list l, battlefield_participants t where t.region_object_id = l.object_id; -- order does not matter return result_cursor; end; function load_messages return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(MESSAGES) */ target, message_id, method, data, call_time, guaranteed, delivery_type from object_list, messages where target =object_list.object_id; return result_cursor; end; function load_location return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T) */ t.object_id, t.list_id, t.sequence_number, t.name, t.scene, t.x, t.y, t.z, t.radius from object_list l, location_lists t where t.object_id = l.object_id; return result_cursor; end; function load_object return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T) */ t.object_id, x, y, z, quaternion_w, quaternion_x, quaternion_y, quaternion_z, node_x, node_y, node_z, object_template_id, type_id, scene_id, controller_type, deleted, object_name, volume, contained_by, slot_arrangement, player_controlled, cache_version, load_contents, cash_balance, bank_balance, complexity, name_string_table, name_string_text, static_item_name, nvl(static_item_version,0), nvl(conversion_id,0), load_with, objvar_0_name, objvar_0_type, objvar_0_value, objvar_1_name, objvar_1_type, objvar_1_value, objvar_2_name, objvar_2_type, objvar_2_value, objvar_3_name, objvar_3_type, objvar_3_value, objvar_4_name, objvar_4_type, objvar_4_value, objvar_5_name, objvar_5_type, objvar_5_value, objvar_6_name, objvar_6_type, objvar_6_value, objvar_7_name, objvar_7_type, objvar_7_value, objvar_8_name, objvar_8_type, objvar_8_value, objvar_9_name, objvar_9_type, objvar_9_value, objvar_10_name, objvar_10_type, objvar_10_value, objvar_11_name, objvar_11_type, objvar_11_value, objvar_12_name, objvar_12_type, objvar_12_value, objvar_13_name, objvar_13_type, objvar_13_value, objvar_14_name, objvar_14_type, objvar_14_value, objvar_15_name, objvar_15_type, objvar_15_value, objvar_16_name, objvar_16_type, objvar_16_value, objvar_17_name, objvar_17_type, objvar_17_value, objvar_18_name, objvar_18_type, objvar_18_value, objvar_19_name, objvar_19_type, objvar_19_value, script_list, l.container_level from object_list l, objects t where t.object_id=l.object_id; return result_cursor; end; function verify_containment_chain(p_start_with_object_id in number) return number as -- result codes: -- 1 = containment chain is recursive and is in starting(character) object chain -- (can be fixed by placing the object in the world if its a character) -- 2 = containment chain is recursive but not in starting object chain (this must be fixed manually) -- 3 = no recursion in containment chain m_retval pls_integer; m_temp pls_integer; begin /* m_retval := 2; select count(*) into m_temp from objects start with object_id = p_start_with_object_id connect by prior object_id = contained_by and object_id != p_start_with_object_id; */ m_retval := 1; select count(*) into m_temp from objects start with object_id = p_start_with_object_id connect by object_id = prior contained_by; m_retval := 3; return m_retval; exception when others then return m_retval; end; function fix_player_containment_chain(p_start_with_object_id in number) return number as -- result codes: -- 0 = database error -- 4 = success fix player containment issues PRAGMA AUTONOMOUS_TRANSACTION; begin update objects set contained_by = 0 where object_id = p_start_with_object_id; admin.fix_load_with(p_start_with_object_id, p_start_with_object_id); commit; return 4; exception when others then return 0; end; procedure verify_character (p_station_id in number, p_character_id in number, p_gold_schema in varchar2, p_approved out varchar2, p_character_name out varchar2, p_scene_id out varchar2, p_container_id out number, p_x out number, p_y out number, p_z out number, p_containment_check out number) as -- p_containment_check is a flag indicating the containment stautus to be used for logging on the C sid -- 0 = there was a database error trying to fix containment -- 1 = there is a recursive containment error in the character object chain that wasn't fixed -- 2 = there is a recursive containment error in the containment chain not in the character chain -- 3 = the containment chain is ok -- 4 = there was a recursive containment error in the character object chain that was fixed m_containment_ok pls_integer; wsx number := null; wsy number := null; wsz number := null; begin -- check containment chain m_containment_ok := verify_containment_chain(p_character_id); -- if containment is bad for the character object try to fix it if (m_containment_ok = 1) then m_containment_ok := fix_player_containment_chain(p_character_id); end if; p_containment_check := m_containment_ok; if (m_containment_ok >= 3) then select object_name, scene_id, contained_by, x, y, z, ws_x, ws_y, ws_z into p_character_name, p_scene_id, p_container_id, p_x, p_y, p_z, wsx, wsy, wsz from players p, objects o, creature_objects c where p.station_id = p_station_id and p.character_object = p_character_id and o.object_id = p.character_object and c.object_id = o.object_id and o.deleted = 0; if (p_container_id = 0) then begin p_container_id := p_character_id; p_approved := 'Y'; end; else begin select object_id, x,y,z,'Y' into p_container_id, p_x, p_y, p_z, p_approved from objects where contained_by=0 start with object_id = p_character_id connect by prior contained_by=object_id and prior scene_id=scene_id and player_controlled = 'N'; exception when no_data_found then -- might be in a gold building if (p_gold_schema is not null) then begin execute immediate 'select object_id, x,y,z,''Y'' ' || 'from ' || p_gold_schema || 'objects ' || 'where contained_by=0 ' || 'start with object_id = :container_id ' || 'connect by prior contained_by=object_id' into p_container_id, p_x, p_y, p_z, p_approved using p_container_id; exception when no_data_found then select object_id, x,y,z,'Y' into p_container_id, p_x, p_y, p_z, p_approved from objects where object_id = p_character_id; end; else select object_id, x,y,z,'Y' into p_container_id, p_x, p_y, p_z, p_approved from objects where object_id = p_character_id; end if; end; end if; else select 'N' into p_approved from dual; end if; if ( wsx is not null ) then begin p_x := wsx; p_y := wsy; p_z := wsz; end; end if; update players set last_login_time = sysdate where station_id = p_station_id and character_object = p_character_id; exception when no_data_found then select 'N' into p_approved from dual; when too_many_rows then select 'N' into p_approved from dual; when others then select 'N' into p_approved from dual; end; function load_waypoint return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T) */ t.object_id, t.waypoint_id, t.appearance_name_crc, t.location_x, t.location_y, t.location_z, t.location_cell, t.location_scene, t.name, t.color, t.active from object_list l, waypoints t where t.object_id=l.object_id; return result_cursor; end; function load_player_object return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T) USE_NL(A)*/ t.object_id, t.station_id, a.house_id, t.num_lots, a.is_outcast, a.cheater_level, a.max_lots_adjustment, t.personal_profile_id, t.character_profile_id, t.skill_title, t.born_date, t.played_time, t.force_regen_rate, t.force_power, t.max_force_power, t.active_quests, t.completed_quests, t.current_quest, t.quests, t.role_icon_choice, t.quests2, t.quests3, t.quests4, t.skill_template, t.working_skill, nvl(t.current_gcw_points,0), nvl(t.current_gcw_rating,-1), nvl(t.current_pvp_kills,0), nvl(t.lifetime_gcw_points,0), nvl(t.max_gcw_imperial_rating,-1), nvl(t.max_gcw_rebel_rating,-1), nvl(t.lifetime_pvp_kills,0), nvl(t.next_gcw_rating_calc_time,0), t.collections, nvl(t.show_backpack,'Y'), nvl(t.show_helmet,'Y'), t.collections2 from object_list l, player_objects t, accounts a where t.station_id = a.station_id and t.object_id=l.object_id; return result_cursor; end; function load_resource_types return cursortype as result_cursor cursortype; begin open result_cursor for select resource_id, resource_name, resource_class, attributes, fractal_seeds, depleted_timestamp from resource_types; return result_cursor; end; function load_bounty_hunter_targets return cursortype as result_cursor cursortype; begin open result_cursor for select object_id, target_id from bounty_hunter_targets where target_id <> 0; return result_cursor; end; -- GENERATED PLSQL FOLLOWS -- generated by makeloader.pl function load_battlefield_marker_object return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T) */ t.object_id, t.region_name from object_list l, battlefield_marker_objects t where t.object_id=l.object_id; return result_cursor; end; function load_building_object return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T) */ t.object_id, t.maintenance_cost, t.time_last_checked, t.is_public, t.city_id from object_list l, building_objects t where t.object_id=l.object_id; return result_cursor; end; function load_cell_object return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T) */ t.object_id, t.cell_number, t.is_public from object_list l, cell_objects t where t.object_id=l.object_id; return result_cursor; end; function load_city_object return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T) */ t.object_id from object_list l, city_objects t where t.object_id=l.object_id; return result_cursor; end; function load_creature_object return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T) */ t.object_id, t.scale_factor, t.states, t.posture, t.shock_wounds, t.master_id, t.rank, t.base_walk_speed, t.base_run_speed, t.attribute_0, t.attribute_1, t.attribute_2, t.attribute_3, t.attribute_4, t.attribute_5, t.attribute_6, t.attribute_7, t.attribute_8, t.attribute_9, t.attribute_10, t.attribute_11, t.attribute_12, t.attribute_13, t.attribute_14, t.attribute_15, t.attribute_16, t.attribute_17, t.attribute_18, t.attribute_19, t.attribute_20, t.attribute_21, t.attribute_22, t.attribute_23, t.attribute_24, t.attribute_25, t.attribute_26, t.persisted_buffs, t.ws_x, t.ws_y, t.ws_z from object_list l, creature_objects t where t.object_id=l.object_id; return result_cursor; end; function load_factory_object return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T) */ t.object_id from object_list l, factory_objects t where t.object_id=l.object_id; return result_cursor; end; function load_guild_object return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T) */ t.object_id from object_list l, guild_objects t where t.object_id=l.object_id; return result_cursor; end; function load_harvester_inst_object return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T) */ t.object_id, t.installed_efficiency, t.max_extraction_rate, t.current_extraction_rate, t.max_hopper_amount, t.hopper_resource, t.hopper_amount, t.resource_type from object_list l, harvester_installation_objects t where t.object_id=l.object_id; return result_cursor; end; function load_installation_object return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T) */ t.object_id, t.installation_type, t.activated, t.tick_count, t.activate_start_time, t.power, t.power_rate from object_list l, installation_objects t where t.object_id=l.object_id; return result_cursor; end; function load_intangible_object return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T) */ t.object_id, t.count from object_list l, intangible_objects t where t.object_id=l.object_id; return result_cursor; end; function load_manf_schematic_object return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T) */ t.object_id, t.creator_id, t.creator_name, t.items_per_container, t.manufacture_time, t.draft_schematic from object_list l, manf_schematic_objects t where t.object_id=l.object_id; return result_cursor; end; function load_manufacture_inst_object return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T) */ t.object_id from object_list l, manufacture_inst_objects t where t.object_id=l.object_id; return result_cursor; end; function load_mission_object return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T) */ t.object_id, t.difficulty, t.end_x, t.end_y, t.end_z, t.end_cell, t.end_scene, t.mission_creator, t.reward, t.root_script_name, t.start_x, t.start_y, t.start_z, t.start_cell, t.start_scene, t.description_table, t.description_text, t.title_table, t.title_text, t.mission_holder_id, t.status, t.mission_type, t.target_appearance, t.target_name from object_list l, mission_objects t where t.object_id=l.object_id; return result_cursor; end; function load_planet_object return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T) */ t.object_id, t.planet_name from object_list l, planet_objects t where t.object_id=l.object_id; return result_cursor; end; function load_resource_container_object return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T) */ t.object_id, t.resource_type, t.quantity, t.source from object_list l, resource_container_objects t where t.object_id=l.object_id; return result_cursor; end; function load_ship_object return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T) */ t.object_id, t.slide_dampener, t.current_chassis_hit_points, t.maximum_chassis_hit_points, t.chassis_type, t.cmp_armor_hp_maximum, t.cmp_armor_hp_current, t.cmp_efficiency_general, t.cmp_efficiency_eng, t.cmp_eng_maintenance, t.cmp_mass, t.cmp_crc, t.cmp_hp_current, t.cmp_hp_maximum, t.cmp_flags, t.cmp_names, t.weapon_damage_maximum, t.weapon_damage_minimum, t.weapon_effectiveness_shields, t.weapon_effectiveness_armor, t.weapon_eng_per_shot, t.weapon_refire_rate, t.weapon_ammo_current, t.weapon_ammo_maximum, t.weapon_ammo_type, t.shield_hp_front_maximum, t.shield_hp_back_maximum, t.shield_recharge_rate, t.capacitor_eng_maximum, t.capacitor_eng_recharge_rate, t.engine_acc_rate, t.engine_deceleration_rate, t.engine_pitch_acc_rate, t.engine_yaw_acc_rate, t.engine_roll_acc_rate, t.engine_pitch_rate_maximum, t.engine_yaw_rate_maximum, t.engine_roll_rate_maximum, t.engine_speed_maximum, t.reactor_eng_generation_rate, t.booster_eng_maximum, t.booster_eng_recharge_rate, t.booster_eng_consumption_rate, t.booster_acc, t.booster_speed_maximum, t.droid_if_cmd_speed, t.installed_dcd, t.chassis_cmp_mass_maximum, t.cmp_creators, t.cargo_hold_contents_maximum, t.cargo_hold_contents_current, t.cargo_hold_contents from object_list l, ship_objects t where t.object_id=l.object_id; return result_cursor; end; function load_static_object return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T) */ t.object_id from object_list l, static_objects t where t.object_id=l.object_id; return result_cursor; end; function load_tangible_object return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T) */ t.object_id, t.max_hit_points, t.owner_id, t.visible, t.appearance_data, t.interest_radius, t.pvp_type, t.pvp_faction, t.damage_taken, t.custom_appearance, t.count, t.condition, t.creator_id, t.source_draft_schematic from object_list l, tangible_objects t where t.object_id=l.object_id; return result_cursor; end; function load_token_object return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T) */ t.object_id, t.reference, t.target_server_template_name, t.target_shared_template_name, t.waypoint from object_list l, token_objects t where t.object_id=l.object_id; return result_cursor; end; function load_universe_object return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T) */ t.object_id from object_list l, universe_objects t where t.object_id=l.object_id; return result_cursor; end; function load_vehicle_object return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T) */ t.object_id, t.bogus from object_list l, vehicle_objects t where t.object_id=l.object_id; return result_cursor; end; function load_weapon_object return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T) */ t.object_id, t.min_damage, t.max_damage, t.damage_type, t.elemental_type, t.elemental_value, t.attack_speed, t.wound_chance, t.accuracy, t.attack_cost, t.damage_radius, t.min_range, t.max_range from object_list l, weapon_objects t where t.object_id=l.object_id; return result_cursor; end; function load_player_quest_object return cursortype as result_cursor cursortype; begin open result_cursor for select /*+ ORDERED USE_NL(T) */ t.object_id, t.title, t.description, t.creator, t.total_tasks, t.difficulty, t.task_title1, t.task_description1, t.task_title2, t.task_description2, t.task_title3, t.task_description3, t.task_title4, t.task_description4, t.task_title5, t.task_description5, t.task_title6, t.task_description6, t.task_title7, t.task_description7, t.task_title8, t.task_description8, t.task_title9, t.task_description9, t.task_title10, t.task_description10, t.task_title11, t.task_description11, t.task_title12, t.task_description12 from object_list l, player_quest_objects t where t.object_id=l.object_id; return result_cursor; end; end; /