From 332a2b9fc4b235b786b64b3fa002c7f806d59c15 Mon Sep 17 00:00:00 2001 From: dnk-88 Date: Wed, 6 Jul 2011 22:40:35 +0300 Subject: [PATCH] merge from default --- code/CMakeLists.txt | 33 +- code/CMakeModules/FindExternal.cmake | 10 +- code/CMakeModules/PCHSupport.cmake | 18 +- code/CMakeModules/nel.cmake | 50 + code/nel/include/nel/3d/scene_group.h | 4 +- code/nel/include/nel/3d/track_keyframer.h | 1 + code/nel/include/nel/cegui/nelrenderer.h | 76 +- code/nel/include/nel/georges/load_form.h | 12 +- code/nel/include/nel/ligo/primitive_utils.h | 4 +- code/nel/include/nel/misc/config_file.h | 2 +- code/nel/include/nel/misc/diff_tool.h | 4 +- code/nel/include/nel/misc/i_xml.h | 2 +- code/nel/include/nel/misc/o_xml.h | 2 +- code/nel/include/nel/net/module.h | 2 +- code/nel/samples/3d/cluster_viewer/main.cpp | 2 +- code/nel/samples/misc/configfile/main.cpp | 2 +- code/nel/samples/misc/debug/main.cpp | 2 +- code/nel/samples/net/chat/client.cpp | 2 +- .../net/login_system/frontend_service.cpp | 4 +- code/nel/samples/net/udp/bench_service.cpp | 14 +- code/nel/samples/net/udp/client.cpp | 4 +- code/nel/samples/net/udp/receive_task.cpp | 2 +- code/nel/samples/pacs/main.cpp | 2 +- code/nel/samples/sound_sources/main.cpp | 2 +- code/nel/src/3d/animation_set.cpp | 2 +- code/nel/src/3d/async_file_manager_3d.cpp | 6 +- .../3d/driver/direct3d/driver_direct3d.cpp | 2 +- .../direct3d/driver_direct3d_inputs.cpp | 6 +- code/nel/src/3d/driver/opengl/CMakeLists.txt | 1 + .../opengl/driver_opengl_extension_def.h | 63 +- .../3d/driver/opengl/driver_opengl_inputs.cpp | 6 +- .../driver/opengl/driver_opengl_material.cpp | 4 +- .../driver/opengl/driver_opengl_texture.cpp | 6 +- .../opengl/driver_opengl_vertex_buffer_hard.h | 9 +- .../opengl/driver_opengl_vertex_program.cpp | 14 +- .../3d/driver/opengl/driver_opengl_window.cpp | 30 +- .../driver/opengl/mac/cocoa_event_emitter.cpp | 6 +- code/nel/src/3d/driver_user.cpp | 2 +- code/nel/src/3d/instance_group_user.cpp | 2 +- code/nel/src/3d/landscape_user.cpp | 2 +- code/nel/src/3d/ps_mesh.cpp | 2 +- code/nel/src/3d/shader.cpp | 2 +- code/nel/src/3d/texture_grouped.cpp | 4 +- code/nel/src/3d/tile_bank.cpp | 2 +- code/nel/src/3d/vegetable_manager.cpp | 2 +- code/nel/src/3d/zone_lighter.cpp | 6 +- code/nel/src/georges/form_loader.cpp | 6 +- code/nel/src/ligo/ligo_config.cpp | 2 +- code/nel/src/ligo/zone_bank.cpp | 4 +- code/nel/src/misc/command.cpp | 2 +- code/nel/src/misc/config_file/cf_lexical.lpp | 15 + code/nel/src/misc/config_file/config_file.cpp | 2 +- code/nel/src/misc/debug.cpp | 4 +- code/nel/src/misc/diff_tool.cpp | 2 +- code/nel/src/misc/displayer.cpp | 2 +- code/nel/src/misc/file.cpp | 2 +- code/nel/src/misc/inter_window_msg_queue.cpp | 2 +- code/nel/src/misc/system_info.cpp | 14 +- code/nel/src/misc/words_dictionary.cpp | 2 +- code/nel/src/net/buf_client.cpp | 2 +- code/nel/src/net/buf_server.cpp | 6 +- code/nel/src/net/callback_client.cpp | 2 +- code/nel/src/net/callback_net_base.cpp | 2 +- code/nel/src/net/email.cpp | 2 +- code/nel/src/net/login_client.cpp | 8 +- code/nel/src/net/login_server.cpp | 6 +- code/nel/src/net/module.cpp | 2 +- code/nel/src/net/module_gateway.cpp | 2 +- code/nel/src/net/module_gateway_transport.cpp | 2 +- code/nel/src/net/naming_client.cpp | 2 +- code/nel/src/net/net_displayer.cpp | 4 +- code/nel/src/net/service.cpp | 10 +- code/nel/src/net/transport_class.cpp | 2 +- code/nel/src/net/unified_network.cpp | 10 +- code/nel/src/pacs/global_retriever.cpp | 2 +- code/nel/src/pacs/retriever_bank.h | 2 +- code/nel/src/sound/audio_mixer_user.cpp | 10 +- .../driver/dsound/sound_driver_dsound.cpp | 2 +- .../nel/src/sound/driver/openal/source_al.cpp | 22 +- code/nel/src/sound/sample_bank.cpp | 4 +- code/nel/src/sound/sample_bank_manager.cpp | 2 +- .../tools/3d/anim_builder/anim_builder.cpp | 6 +- .../animation_set_builder.cpp | 2 +- .../3d/build_clod_bank/build_clod_bank.cpp | 6 +- code/nel/tools/3d/build_clodtex/main.cpp | 4 +- .../build_coarse_mesh/build_coarse_mesh.cpp | 4 +- .../3d/build_far_bank/build_far_bank.cpp | 4 +- code/nel/tools/3d/build_interface/main.cpp | 2 +- .../3d/build_smallbank/build_smallbank.cpp | 2 +- code/nel/tools/3d/cluster_viewer/view_cs.cpp | 2 +- code/nel/tools/3d/file_info/main.cpp | 6 +- .../3d/hls_bank_maker/hls_bank_maker.cpp | 4 +- code/nel/tools/3d/ig_add/main.cpp | 4 +- code/nel/tools/3d/ig_elevation/main.cpp | 12 +- code/nel/tools/3d/ig_info/ig_info.cpp | 2 +- code/nel/tools/3d/ig_lighter/ig_lighter.cpp | 2 +- code/nel/tools/3d/lightmap_optimizer/main.cpp | 12 +- .../src/plugins/core/core.qrc | 2 + .../src/plugins/core/core_constants.h | 24 +- .../src/plugins/core/icons/ic_nel_redo.png | Bin 0 -> 4694 bytes .../src/plugins/core/icons/ic_nel_undo.png | Bin 0 -> 4714 bytes .../src/plugins/core/main_window.cpp | 199 +++- .../src/plugins/core/main_window.h | 27 +- .../src/plugins/example/plugin1.cpp | 1 - .../src/plugins/object_viewer/main_window.cpp | 17 +- .../zone_painter/zone_painter_main_window.cpp | 2 +- .../zone_painter/zone_painter_main_window.h | 5 +- .../zone_painter/zone_painter_plugin.cpp | 2 + .../zone_painter/zone_painter_plugin.h | 75 +- .../zone_painter_settings_page.cpp | 7 +- .../zone_painter/zone_painter_settings_page.h | 1 + .../tools/3d/panoply_maker/panoply_maker.cpp | 46 +- .../nel_patch_paint/nel_patch_paint.h | 13 +- .../3d/shapes_exporter/shapes_exporter.cpp | 44 +- code/nel/tools/3d/tga_2_dds/tga2dds.cpp | 4 +- code/nel/tools/3d/tga_cut/tga_cut.cpp | 2 +- code/nel/tools/3d/tga_resize/main.cpp | 2 +- .../3d/zone_check_bind/zone_check_bind.cpp | 2 +- .../zone_dependencies/zone_dependencies.cpp | 12 +- code/nel/tools/3d/zone_dump/zone_dump.cpp | 2 +- .../3d/zone_ig_lighter/zone_ig_lighter.cpp | 8 +- .../tools/3d/zone_lighter/zone_lighter.cpp | 16 +- code/nel/tools/3d/zone_welder/zone_welder.cpp | 2 +- code/nel/tools/3d/zviewer/zviewer.cpp | 14 +- .../tools/georges/georges2csv/georges2csv.cpp | 2 +- code/nel/tools/misc/bnp_make/main.cpp | 11 +- code/nel/tools/misc/lock/lock.cpp | 2 +- code/nel/tools/nel_unit_test/ut_net_module.h | 2 +- code/nel/tools/pacs/build_ig_boxes/main.cpp | 4 +- .../tools/pacs/build_indoor_rbank/main.cpp | 6 +- .../tools/pacs/build_rbank/build_rbank.cpp | 12 +- .../nel/tools/pacs/build_rbank/build_surf.cpp | 2 +- code/nel/tools/pacs/build_rbank/main.cpp | 4 +- .../tools/pacs/build_rbank/prim_checker.cpp | 2 +- code/ryzom/client/client_default.cfg | 8 +- code/ryzom/client/client_default.cfg.in | 18 +- .../gamedev/adds/interfaces/color_palette.dds | Bin 0 -> 22032 bytes .../new_texture_interfaces_dxtc.tga | Bin 4194322 -> 4194322 bytes .../new_texture_interfaces_dxtc.txt | 949 ++++++++--------- .../adds/sfx/ul_mission_hall_of_fame.ps | Bin 0 -> 955 bytes .../gamedev/adds/shapes/Ge_gift_blue.shape | Bin 0 -> 9727 bytes .../adds/shapes/Ge_gift_blue_yubo.shape | Bin 0 -> 9730 bytes .../gamedev/adds/shapes/Ge_gift_green.shape | Bin 0 -> 9584 bytes .../adds/shapes/Ge_gift_green_yubo.shape | Bin 0 -> 9587 bytes .../gamedev/adds/shapes/Ge_gift_red.shape | Bin 0 -> 9582 bytes .../adds/shapes/Ge_gift_red_yubo.shape | Bin 0 -> 9585 bytes .../gamedev/adds/shapes/Ge_gift_yellow.shape | Bin 0 -> 9585 bytes .../adds/shapes/Ge_gift_yellow_yubo.shape | Bin 0 -> 9588 bytes .../adds/shapes/UL_Mission_Hall_Of_Fame.shape | Bin 0 -> 74362 bytes .../data/gamedev/interfaces_v3/actions.xml | 27 + .../gamedev/interfaces_v3/bot_chat_v4.xml | 4 + .../data/gamedev/interfaces_v3/config.xml | 3 + .../data/gamedev/interfaces_v3/guild.xml | 169 ++- .../data/gamedev/interfaces_v3/hierarchy.xml | 1 + .../gamedev/interfaces_v3/info_player.xml | 258 +++-- .../data/gamedev/interfaces_v3/inventory.xml | 163 ++- .../data/gamedev/interfaces_v3/keys.xml | 22 + .../data/gamedev/interfaces_v3/reset.xml | 228 ++++- .../data/gamedev/interfaces_v3/taskbar.xml | 9 +- .../ryzom/client/src/bg_downloader_access.cpp | 10 +- code/ryzom/client/src/camera_recorder.cpp | 4 +- code/ryzom/client/src/cdb_branch.cpp | 2 +- code/ryzom/client/src/cdb_synchronised.cpp | 2 +- code/ryzom/client/src/character_cl.cpp | 17 +- code/ryzom/client/src/client.cpp | 4 +- code/ryzom/client/src/client_cfg.cpp | 2 +- code/ryzom/client/src/client_chat_manager.cpp | 10 +- code/ryzom/client/src/color_slot_manager.cpp | 6 +- code/ryzom/client/src/commands.cpp | 8 +- code/ryzom/client/src/connection.cpp | 6 +- code/ryzom/client/src/continent.cpp | 10 +- code/ryzom/client/src/entity_cl.cpp | 12 +- code/ryzom/client/src/far_tp.cpp | 4 +- code/ryzom/client/src/fog_map.cpp | 2 +- code/ryzom/client/src/http_client.cpp | 2 +- code/ryzom/client/src/init.cpp | 6 +- code/ryzom/client/src/init_main_loop.cpp | 5 +- .../src/interface_v3/action_handler.cpp | 4 +- .../src/interface_v3/action_handler_game.cpp | 10 +- .../src/interface_v3/action_handler_help.cpp | 3 +- .../src/interface_v3/action_phrase_faber.cpp | 3 +- .../src/interface_v3/bot_chat_page_trade.cpp | 2 +- .../client/src/interface_v3/chat_filter.cpp | 2 +- .../client/src/interface_v3/ctrl_base.cpp | 1 - .../src/interface_v3/ctrl_base_button.cpp | 9 +- .../src/interface_v3/ctrl_text_button.cpp | 9 +- .../client/src/interface_v3/dbctrl_sheet.cpp | 6 +- .../client/src/interface_v3/dbview_number.cpp | 34 +- .../client/src/interface_v3/dbview_number.h | 1 + .../client/src/interface_v3/group_html.cpp | 30 +- .../src/interface_v3/group_html_webig.cpp | 2 +- .../client/src/interface_v3/group_map.cpp | 2 +- .../client/src/interface_v3/group_tree.h | 2 +- .../interface_v3/input_handler_manager.cpp | 2 +- .../src/interface_v3/interface_element.cpp | 2 +- .../src/interface_v3/interface_manager.cpp | 12 +- .../src/interface_v3/interface_options.cpp | 6 +- .../src/interface_v3/interface_parser.cpp | 4 +- .../interface_v3/item_consumable_effect.cpp | 14 +- .../client/src/interface_v3/lua_helper.cpp | 2 +- .../ryzom/client/src/interface_v3/lua_ihm.cpp | 10 +- .../client/src/interface_v3/lua_object.cpp | 2 +- .../src/interface_v3/people_interraction.cpp | 17 +- .../client/src/interface_v3/people_list.cpp | 9 +- .../client/src/interface_v3/player_trade.cpp | 6 +- .../src/interface_v3/sphrase_manager.cpp | 8 +- .../client/src/interface_v3/yubo_chat.cpp | 6 +- code/ryzom/client/src/light_cycle_manager.cpp | 2 +- .../client/src/lod_character_user_manager.cpp | 2 +- code/ryzom/client/src/login.cpp | 6 +- code/ryzom/client/src/login_patch.cpp | 24 +- .../client/src/login_progress_post_thread.cpp | 2 +- .../include/cj60/CJOutlookBar.h | 6 +- code/ryzom/client/src/main_loop.cpp | 10 +- code/ryzom/client/src/net_manager.cpp | 42 +- code/ryzom/client/src/network_connection.cpp | 22 +- code/ryzom/client/src/pacs_client.cpp | 2 +- code/ryzom/client/src/permanent_ban.cpp | 2 +- code/ryzom/client/src/prim_file.cpp | 2 +- .../client/src/r2/dmc/com_lua_module.cpp | 2 +- code/ryzom/client/src/r2/editor.cpp | 8 +- code/ryzom/client/src/r2/island_collision.cpp | 6 +- code/ryzom/client/src/r2/tool_select_move.cpp | 2 +- .../ryzom/client/src/session_browser_impl.cpp | 12 +- code/ryzom/client/src/sky.cpp | 2 +- code/ryzom/client/src/sound_manager.cpp | 6 +- .../client/src/string_manager_client.cpp | 24 +- code/ryzom/client/src/user_entity.cpp | 3 +- .../src/game_share/character_sync_itf.h | 4 +- code/ryzom/common/src/game_share/mirror.cpp | 26 +- code/ryzom/common/src/game_share/object.cpp | 6 +- code/ryzom/common/src/game_share/object.h | 5 +- .../time_weather_season/weather_predict.cpp | 2 +- .../data_shard/client_commands_privileges.txt | 33 +- .../ai_service/ai_entity_physical_inline.h | 3 +- .../server/src/ai_service/ai_generic_fight.h | 7 +- .../ai_service/ai_generic_fight_helpers.cpp | 11 +- .../server/src/ai_service/ai_grp_npc.cpp | 11 +- .../server/src/ai_service/ai_instance.cpp | 65 +- .../server/src/ai_service/ai_outpost.cpp | 5 +- .../src/ai_service/ai_outpost_actions.cpp | 2 +- .../server/src/ai_service/ai_script_comp.cpp | 24 +- .../src/ai_service/ai_script_data_manager.cpp | 4 +- code/ryzom/server/src/ai_service/ai_spire.cpp | 5 +- code/ryzom/server/src/ai_service/commands.cpp | 11 +- .../server/src/ai_service/continent_inline.h | 2 +- .../src/ai_service/generic_logic_action.cpp | 16 +- code/ryzom/server/src/ai_service/nf_grp.cpp | 37 +- .../server/src/ai_service/nf_grp_npc.cpp | 207 +++- .../src/ai_service/nf_state_instance.cpp | 5 +- .../src/ai_service/npc_description_msg.cpp | 2 +- .../server/src/ai_service/path_behaviors.h | 3 +- .../server/src/ai_service/script_compiler.cpp | 28 +- .../ryzom/server/src/ai_service/script_vm.cpp | 3 +- code/ryzom/server/src/ai_service/sheets.cpp | 4 +- .../server/src/ai_service/world_container.cpp | 2 +- code/ryzom/server/src/ai_share/ai_event.cpp | 14 +- .../server/src/ai_share/primitive_parser.cpp | 7 +- code/ryzom/server/src/ai_share/world_map.cpp | 41 +- code/ryzom/server/src/ai_share/world_map.h | 34 +- .../src/backup_service/backup_file_access.cpp | 4 +- .../src/backup_service/backup_service.cpp | 4 +- .../src/backup_service/web_connection.cpp | 4 +- .../src/entities_game_service/admin.cpp | 967 +++++++++++++++++- .../building_manager/room_instance.cpp | 4 +- .../cdb_struct_banks.cpp | 2 +- .../entities_game_service/client_messages.cpp | 12 +- .../common_shard_callbacks.cpp | 2 +- .../creature_manager/creature.cpp | 6 +- .../creature_manager/creature.h | 2 + .../egs_sheets/egs_static_brick.cpp | 30 + .../egs_sheets/egs_static_brick.cpp.h | 148 ++- .../entities_game_service.cpp | 16 +- .../entity_manager/entity_base.cpp | 6 +- .../entity_manager/entity_callbacks.cpp | 10 +- .../game_item_manager/game_item.cpp | 5 +- .../game_item_manager/game_item.h | 4 +- .../game_item_manager/game_item_manager.cpp | 4 +- .../guild_manager/guild_charge.cpp | 6 +- .../guild_manager/guild_commands.cpp | 2 +- .../guild_manager/guild_manager.cpp | 2 +- .../mission_manager/mission_event.cpp | 23 +- .../mission_manager/mission_event.h | 13 + .../mission_manager/mission_queue_manager.cpp | 2 +- .../mission_manager/mission_step_kill.cpp | 206 +++- .../modules/character_control.cpp | 2 +- .../outpost_manager/outpost_manager.cpp | 2 +- .../outpost_manager/outpost_squad.cpp | 3 +- .../phrase_manager/aura_effect.cpp | 22 +- .../phrase_manager/aura_effect.h | 4 + .../phrase_manager/combat_phrase.cpp | 5 + .../phrase_manager/faber_action.cpp | 15 +- .../phrase_manager/faber_phrase.cpp | 3 - .../phrase_manager/magic_phrase.cpp | 20 +- .../phrase_manager/s_effect.h | 19 +- .../phrase_manager/special_power.cpp | 7 +- .../phrase_manager/special_power.h | 14 +- .../special_power_basic_aura.cpp | 9 +- .../phrase_manager/special_power_phrase.cpp | 70 +- .../phrase_manager/timed_actions.cpp | 11 + .../player_manager/cdb_leaf.cpp | 6 +- .../player_manager/character.cpp | 176 +++- .../player_manager/character.h | 18 +- .../character_inventory_manipulation.cpp | 104 +- .../player_manager/player.cpp | 12 +- .../player_manager/player_manager.cpp | 12 +- .../position_flag_manager.cpp | 2 +- .../primitives_parser.cpp | 2 +- .../progression/progression_pve.cpp | 35 +- .../progression/progression_pve.h | 5 +- .../progression/progression_pvp.cpp | 3 + .../pvp_manager/pvp_manager_2.cpp | 104 +- .../pvp_manager/pvp_manager_2.h | 8 + .../shop_type/named_items.cpp | 2 +- .../shop_type/shop_type_manager.cpp | 2 +- .../team_manager/reward_sharing.cpp | 2 +- .../src/frontend_service/fe_receive_sub.cpp | 10 +- .../src/frontend_service/fe_receive_task.cpp | 4 +- .../src/frontend_service/fe_send_sub.cpp | 2 +- .../src/frontend_service/frontend_service.cpp | 2 +- .../src/frontend_service/id_impulsions.cpp | 16 +- .../src/frontend_service/uid_impulsions.cpp | 4 +- .../server/src/gpm_service/gpm_service.cpp | 4 +- .../gpm_service/world_position_manager.cpp | 6 +- .../src/input_output_service/commands.cpp | 2 +- .../input_output_service.cpp | 4 +- .../src/input_output_service/messages.cpp | 72 +- .../input_output_service/string_manager.cpp | 6 +- .../string_manager_parser.cpp | 6 +- .../src/log_analyser_service/commands.cpp | 4 +- .../log_analyser_service.cpp | 4 +- .../server/src/logger_service/log_query.cpp | 2 +- .../src/logger_service/logger_service.cpp | 2 +- .../src/mail_forum_service/hof_generator.cpp | 2 +- .../mail_forum_service/mail_forum_service.cpp | 10 +- .../src/mirror_service/mirror_service.cpp | 16 +- .../src/mirror_service/mirror_service.h | 2 +- .../src/monitor_service/service_main.cpp | 2 +- .../ryzom/server/src/pd_lib/db_delta_file.cpp | 4 +- .../src/pd_lib/db_description_parser.cpp | 2 +- .../server/src/pd_lib/db_reference_file.cpp | 6 +- code/ryzom/server/src/pd_lib/pd_lib.cpp | 2 +- code/ryzom/server/src/pd_lib/pd_messages.cpp | 4 +- .../server/src/pd_lib/pd_server_utils.cpp | 8 +- .../persistant_data_service/db_manager.cpp | 2 +- .../persistant_data_service/pds_database.cpp | 2 +- .../ryzom_naming_service.cpp | 4 +- .../ryzom_welcome_service.cpp | 8 +- .../src/server_share/continent_container.cpp | 16 +- .../shard_unifier_service/name_manager.cpp | 2 +- .../src/tick_service/range_mirror_manager.cpp | 4 +- .../server/src/tick_service/tick_service.cpp | 14 +- .../ryzom/tools/leveldesign/export/export.cpp | 12 +- .../georges_dll/cool_dialog_bar.cpp | 9 +- .../georges_plugin_sound/listener_view.cpp | 11 +- .../leveldesign/mission_compiler_lib/main.cpp | 4 +- .../mission_compiler_lib/mission_compiler.cpp | 18 +- .../mission_compiler_lib/step_content.cpp | 14 +- .../tools/leveldesign/mp_generator/main.cpp | 2 +- .../named_items_2_csv/named_items_2_csv.cpp | 4 +- .../tools/leveldesign/prim_export/main.cpp | 18 +- .../world_editor/land_export/main.cpp | 10 +- .../world_editor/land_export_lib/export.cpp | 28 +- .../tools/make_alias_file/make_alias_file.cpp | 6 +- .../tools/make_anim_melee_impact/main.cpp | 6 +- .../tools/patch_gen/patch_gen_common.cpp | 22 +- code/ryzom/tools/pd_parser/parser.cpp | 32 +- .../build_world_packed_col.cpp | 16 +- .../packed_world_builder.cpp | 6 +- .../build_world_packed_col/test_col_world.cpp | 12 +- .../server/build_world_packed_col/village.cpp | 6 +- .../tools/sheets_packer/sheets_packer.cpp | 12 +- .../tools/sheets_packer/sheets_packer_cfg.cpp | 8 +- .../tools/skill_extractor/skill_extractor.cpp | 2 +- .../extract_new_sheet_names.cpp | 2 +- code/ryzom/tools/translation_tools/main.cpp | 3 +- .../client/src/snowballs_client.cpp | 5 +- 377 files changed, 5209 insertions(+), 1759 deletions(-) create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/core/icons/ic_nel_redo.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/core/icons/ic_nel_undo.png create mode 100644 code/ryzom/client/data/gamedev/adds/interfaces/color_palette.dds create mode 100644 code/ryzom/client/data/gamedev/adds/sfx/ul_mission_hall_of_fame.ps create mode 100644 code/ryzom/client/data/gamedev/adds/shapes/Ge_gift_blue.shape create mode 100644 code/ryzom/client/data/gamedev/adds/shapes/Ge_gift_blue_yubo.shape create mode 100644 code/ryzom/client/data/gamedev/adds/shapes/Ge_gift_green.shape create mode 100644 code/ryzom/client/data/gamedev/adds/shapes/Ge_gift_green_yubo.shape create mode 100644 code/ryzom/client/data/gamedev/adds/shapes/Ge_gift_red.shape create mode 100644 code/ryzom/client/data/gamedev/adds/shapes/Ge_gift_red_yubo.shape create mode 100644 code/ryzom/client/data/gamedev/adds/shapes/Ge_gift_yellow.shape create mode 100644 code/ryzom/client/data/gamedev/adds/shapes/Ge_gift_yellow_yubo.shape create mode 100644 code/ryzom/client/data/gamedev/adds/shapes/UL_Mission_Hall_Of_Fame.shape diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 004dee0db..630ff4414 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -90,27 +90,11 @@ NL_CONFIGURE_CHECKS() #----------------------------------------------------------------------------- #Platform specifics +SETUP_EXTERNAL() + IF(WIN32) - INCLUDE(${CMAKE_ROOT}/Modules/Platform/Windows-cl.cmake) SET(WINSOCK2_LIB ws2_32.lib) - FIND_PACKAGE(External REQUIRED) - - IF(${CMAKE_MAKE_PROGRAM} MATCHES "Common7") - # convert IDE fullpath to VC++ path - STRING(REGEX REPLACE "Common7/IDE/.+" "VC" VC_DIR ${CMAKE_MAKE_PROGRAM}) - ELSE(${CMAKE_MAKE_PROGRAM} MATCHES "Common7") - IF(${CMAKE_CXX_COMPILER} MATCHES "VC") - # convert compiler fullpath to VC++ path - STRING(REGEX REPLACE "VC/bin/.+" "VC" VC_DIR ${CMAKE_CXX_COMPILER}) - ELSE(${CMAKE_CXX_COMPILER} MATCHES "VC") - # Hack for Visual C++ 2010 - GET_FILENAME_COMPONENT(VC_ROOT_PATH "[HKEY_CURRENT_USER\\Software\\Microsoft\\VCExpress\\10.0_Config;InstallDir]" ABSOLUTE) - # convert IDE fullpath to VC++ path - STRING(REGEX REPLACE "Common7/.*" "VC" VC_DIR ${VC_ROOT_PATH}) - ENDIF(${CMAKE_CXX_COMPILER} MATCHES "VC") - ENDIF(${CMAKE_MAKE_PROGRAM} MATCHES "Common7") - IF(WITH_MFC) FIND_PACKAGE(CustomMFC REQUIRED) ENDIF(WITH_MFC) @@ -130,21 +114,10 @@ IF(WITH_STATIC) IF(APPLE) FIND_PACKAGE(Iconv REQUIRED) SET(LIBXML2_LIBRARIES ${LIBXML2_LIBRARIES} ${ICONV_LIBRARIES}) + INCLUDE_DIRECTORIES(${ICONV_INCLUDE_DIR}) ENDIF(APPLE) ENDIF(WITH_STATIC) -IF(WITH_STLPORT) - FIND_PACKAGE(STLport REQUIRED) - INCLUDE_DIRECTORIES(${STLPORT_INCLUDE_DIR}) - IF(WIN32) - SET(VC_INCLUDE_DIR "${VC_DIR}/include") - - FIND_PACKAGE(WindowsSDK REQUIRED) - # use VC++ and Windows SDK include paths - INCLUDE_DIRECTORIES(${VC_INCLUDE_DIR} ${WINSDK_INCLUDE_DIR}) - ENDIF(WIN32) -ENDIF(WITH_STLPORT) - INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/PCHSupport.cmake) IF(FINAL_VERSION) diff --git a/code/CMakeModules/FindExternal.cmake b/code/CMakeModules/FindExternal.cmake index 436997d99..fae4af92d 100644 --- a/code/CMakeModules/FindExternal.cmake +++ b/code/CMakeModules/FindExternal.cmake @@ -3,6 +3,7 @@ # The following values are defined # EXTERNAL_PATH - where to find external # EXTERNAL_INCLUDE_PATH - where to find external includes +# EXTERNAL_BINARY_PATH - where to find external binaries # EXTERNAL_LIBRARY_PATH - where to find external libraries # EXTERNAL_FOUND - True if the external libraries are available @@ -34,6 +35,13 @@ IF(EXTERNAL_PATH) SET(EXTERNAL_FOUND TRUE) SET(EXTERNAL_INCLUDE_PATH "${EXTERNAL_PATH}/include") + # Using 32 or 64 bits binaries + IF(TARGET_X64) + SET(EXTERNAL_BINARY_PATH "${EXTERNAL_PATH}/bin64") + ELSE(TARGET_X64) + SET(EXTERNAL_BINARY_PATH "${EXTERNAL_PATH}/bin") + ENDIF(TARGET_X64) + # Using 32 or 64 bits libraries IF(TARGET_X64) SET(EXTERNAL_LIBRARY_PATH "${EXTERNAL_PATH}/lib64") @@ -61,4 +69,4 @@ ELSE(EXTERNAL_FOUND) ENDIF(External_FIND_REQUIRED) ENDIF(EXTERNAL_FOUND) -MARK_AS_ADVANCED(EXTERNAL_INCLUDE_PATH EXTERNAL_LIBRARY_PATH) +MARK_AS_ADVANCED(EXTERNAL_INCLUDE_PATH EXTERNAL_BINARY_PATH EXTERNAL_LIBRARY_PATH) diff --git a/code/CMakeModules/PCHSupport.cmake b/code/CMakeModules/PCHSupport.cmake index 7bd202d0d..bb34aebfe 100644 --- a/code/CMakeModules/PCHSupport.cmake +++ b/code/CMakeModules/PCHSupport.cmake @@ -52,13 +52,23 @@ MACRO(_PCH_GET_COMPILE_FLAGS _out_compile_flags) LIST(APPEND ${_out_compile_flags} " ${_PCH_include_prefix}\"${item}\"") ENDFOREACH(item) + # Required for CMake 2.6 + SET(GLOBAL_DEFINITIONS "") + GET_DIRECTORY_PROPERTY(DEFINITIONS COMPILE_DEFINITIONS) + FOREACH(item ${DEFINITIONS}) + LIST(APPEND GLOBAL_DEFINITIONS -D${item}) + ENDFOREACH(item) + GET_DIRECTORY_PROPERTY(_directory_flags DEFINITIONS) - GET_DIRECTORY_PROPERTY(_global_definitions DIRECTORY ${CMAKE_SOURCE_DIR} DEFINITIONS) + GET_DIRECTORY_PROPERTY(_directory_definitions DIRECTORY ${CMAKE_SOURCE_DIR} DEFINITIONS) + LIST(APPEND ${_out_compile_flags} ${GLOBAL_DEFINITIONS}) LIST(APPEND ${_out_compile_flags} ${_directory_flags}) - LIST(APPEND ${_out_compile_flags} ${_global_definitions}) + LIST(APPEND ${_out_compile_flags} ${_directory_definitions}) LIST(APPEND ${_out_compile_flags} ${CMAKE_CXX_FLAGS}) + # Format definitions and remove duplicates SEPARATE_ARGUMENTS(${_out_compile_flags}) + LIST(REMOVE_DUPLICATES ${_out_compile_flags}) ENDMACRO(_PCH_GET_COMPILE_FLAGS) MACRO(_PCH_GET_PDB_FILENAME out_filename _target) @@ -134,7 +144,9 @@ MACRO(ADD_PRECOMPILED_HEADER_TO_TARGET _targetName _input _pch_output_to_use ) ENDIF(CMAKE_COMPILER_IS_GNUCXX) SET_TARGET_PROPERTIES(${_targetName} PROPERTIES COMPILE_FLAGS ${_target_cflags}) - SET_TARGET_PROPERTIES(${_targetName}_pch_dephelp PROPERTIES COMPILE_FLAGS ${_target_cflags}) + IF(oldProps) + SET_TARGET_PROPERTIES(${_targetName}_pch_dephelp PROPERTIES COMPILE_FLAGS ${oldProps}) + ENDIF(oldProps) ADD_CUSTOM_TARGET(pch_Generate_${_targetName} DEPENDS ${_pch_output_to_use}) ADD_DEPENDENCIES(${_targetName} pch_Generate_${_targetName}) ENDMACRO(ADD_PRECOMPILED_HEADER_TO_TARGET) diff --git a/code/CMakeModules/nel.cmake b/code/CMakeModules/nel.cmake index 220e4132d..d2a5cb014 100644 --- a/code/CMakeModules/nel.cmake +++ b/code/CMakeModules/nel.cmake @@ -171,6 +171,7 @@ MACRO(NL_SETUP_DEFAULT_OPTIONS) OPTION(WITH_STATIC "With static libraries." OFF) ENDIF(WIN32) OPTION(WITH_STATIC_DRIVERS "With static drivers." OFF) + OPTION(WITH_STATIC_EXTERNAL "With static external libraries" OFF) ### # GUI toolkits @@ -496,3 +497,52 @@ MACRO(RYZOM_SETUP_PREFIX_PATHS) ENDIF(NOT RYZOM_GAMES_PREFIX) ENDMACRO(RYZOM_SETUP_PREFIX_PATHS) + +MACRO(SETUP_EXTERNAL) + IF(WIN32) + FIND_PACKAGE(External REQUIRED) + + INCLUDE(${CMAKE_ROOT}/Modules/Platform/Windows-cl.cmake) + IF(MSVC10) + GET_FILENAME_COMPONENT(VC_ROOT_DIR "[HKEY_CURRENT_USER\\Software\\Microsoft\\VisualStudio\\10.0_Config;InstallDir]" ABSOLUTE) + # VC_ROOT_DIR is set to "registry" when a key is not found + IF(VC_ROOT_DIR MATCHES "registry") + GET_FILENAME_COMPONENT(VC_ROOT_DIR "[HKEY_CURRENT_USER\\Software\\Microsoft\\VCExpress\\10.0_Config;InstallDir]" ABSOLUTE) + IF(VC_ROOT_DIR MATCHES "registry") + MESSAGE(FATAL_ERROR "Unable to find VC++ 2010 directory!") + ENDIF(VC_ROOT_DIR MATCHES "registry") + ENDIF(VC_ROOT_DIR MATCHES "registry") + # convert IDE fullpath to VC++ path + STRING(REGEX REPLACE "Common7/.*" "VC" VC_DIR ${VC_ROOT_DIR}) + ELSE(MSVC10) + IF(${CMAKE_MAKE_PROGRAM} MATCHES "Common7") + # convert IDE fullpath to VC++ path + STRING(REGEX REPLACE "Common7/.*" "VC" VC_DIR ${CMAKE_MAKE_PROGRAM}) + ELSE(${CMAKE_MAKE_PROGRAM} MATCHES "Common7") + # convert compiler fullpath to VC++ path + STRING(REGEX REPLACE "VC/bin/.+" "VC" VC_DIR ${CMAKE_CXX_COMPILER}) + ENDIF(${CMAKE_MAKE_PROGRAM} MATCHES "Common7") + ENDIF(MSVC10) + ELSE(WIN32) + IF(CMAKE_FIND_LIBRARY_SUFFIXES AND NOT APPLE) + IF(WITH_STATIC_EXTERNAL) + SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a") + ELSE(WITH_STATIC_EXTERNAL) + SET(CMAKE_FIND_LIBRARY_SUFFIXES ".so") + ENDIF(WITH_STATIC_EXTERNAL AND NOT APPLE) + ENDIF(CMAKE_FIND_LIBRARY_SUFFIXES) + ENDIF(WIN32) + + IF(WITH_STLPORT) + FIND_PACKAGE(STLport REQUIRED) + INCLUDE_DIRECTORIES(${STLPORT_INCLUDE_DIR}) + IF(WIN32) + SET(VC_INCLUDE_DIR "${VC_DIR}/include") + + FIND_PACKAGE(WindowsSDK REQUIRED) + # use VC++ and Windows SDK include paths + INCLUDE_DIRECTORIES(${VC_INCLUDE_DIR} ${WINSDK_INCLUDE_DIR}) + ENDIF(WIN32) + ENDIF(WITH_STLPORT) + +ENDMACRO(SETUP_EXTERNAL) diff --git a/code/nel/include/nel/3d/scene_group.h b/code/nel/include/nel/3d/scene_group.h index 9b4f8d792..d587f23d9 100644 --- a/code/nel/include/nel/3d/scene_group.h +++ b/code/nel/include/nel/3d/scene_group.h @@ -107,7 +107,7 @@ public: bool Visible; /// Precomputed Lighting. - // If true (false by default), then the instance don't cast shadow (used by ig_lighter.exe). + // If true (false by default), then the instance don't cast shadow (used by ig_lighter). bool DontCastShadow; // If true (false by default), then the instance's lighting will not be precomputed. bool AvoidStaticLightPreCompute; @@ -120,7 +120,7 @@ public: * If 0xFF => take Ambient of the sun. */ uint8 LocalAmbientId; - /** if true (false by default), the instance don't cast shadow, but ONLY FOR ig_lighter.exe (ig_lighter_lib) + /** if true (false by default), the instance don't cast shadow, but ONLY FOR ig_lighter (ig_lighter_lib) * (zone_lighter and zone_ig_lighter ignore it). * This is a special trick for the "Matis Serre" where the exterior mesh cast shadow in the interior, but * is not visible in the interior in realTime because of cluster clipping.... omg :( diff --git a/code/nel/include/nel/3d/track_keyframer.h b/code/nel/include/nel/3d/track_keyframer.h index 2ae43c011..5f2cde6da 100644 --- a/code/nel/include/nel/3d/track_keyframer.h +++ b/code/nel/include/nel/3d/track_keyframer.h @@ -697,6 +697,7 @@ public: virtual bool addLinearFloatKey(const UKeyLinearFloat &key) { CKeyFloat k; + k.OODeltaTime= 0.f; k.Value= key.Value; addKey(k, key.Time); return true; diff --git a/code/nel/include/nel/cegui/nelrenderer.h b/code/nel/include/nel/cegui/nelrenderer.h index ba1340f5c..84e1221c1 100644 --- a/code/nel/include/nel/cegui/nelrenderer.h +++ b/code/nel/include/nel/cegui/nelrenderer.h @@ -142,11 +142,14 @@ namespace CEGUI void captureCursor(bool capture) { m_Captured=capture; - if(capture) { + if(capture) + { m_Driver->setCapture(true); m_Driver->showCursor(false); m_InputDriver.activateMouse(); - } else { + } + else + { m_Driver->setCapture(false); m_Driver->showCursor(true); m_InputDriver.deactivateMouse(); @@ -178,7 +181,8 @@ namespace CEGUI class NeLInputDriver : public NLMISC::IEventListener { public: - NeLInputDriver() { + NeLInputDriver() + { m_MouseX=0.5f; m_MouseY=0.5f; m_Active=false; @@ -189,7 +193,8 @@ namespace CEGUI } virtual ~NeLInputDriver() { ; } - void addToServer(NLMISC::CEventServer& server) { + void addToServer(NLMISC::CEventServer& server) + { server.addListener(NLMISC::EventMouseMoveId, this); server.addListener(NLMISC::EventMouseDownId, this); server.addListener(NLMISC::EventMouseUpId, this); @@ -200,7 +205,8 @@ namespace CEGUI m_AsyncListener.addToServer(server); } - void removeFromServer(NLMISC::CEventServer& server) { + void removeFromServer(NLMISC::CEventServer& server) + { server.removeListener(NLMISC::EventMouseMoveId, this); server.removeListener(NLMISC::EventMouseDownId, this); server.removeListener(NLMISC::EventMouseUpId, this); @@ -226,9 +232,11 @@ namespace CEGUI * * \param event An event, probably a CEventMouse or CEventKey/Char. */ - virtual void operator ()(const NLMISC::CEvent& event) { + virtual void operator ()(const NLMISC::CEvent& event) + { // don't process any input if we're inactive. - if(m_Active==false) { + if(m_Active==false) + { return; // not processing ANY input } @@ -236,36 +244,51 @@ namespace CEGUI { // otherwise, on with the festivities. // catch ALL mouse event, just in case. - if(event==NLMISC::EventMouseDownId||event==NLMISC::EventMouseUpId||event==NLMISC::EventMouseMoveId||event==NLMISC::EventMouseDblClkId||event==NLMISC::EventMouseWheelId) { - if(!m_MouseActive) { + if(event==NLMISC::EventMouseDownId||event==NLMISC::EventMouseUpId||event==NLMISC::EventMouseMoveId||event==NLMISC::EventMouseDblClkId||event==NLMISC::EventMouseWheelId) + { + if(!m_MouseActive) + { // we're not processing any mouse activity. The cursor isn't captured maybe? return; } NLMISC::CEventMouse *mouseEvent=(NLMISC::CEventMouse *)&event; // a mouse button was pressed. - if(event == NLMISC::EventMouseDownId) { + if(event == NLMISC::EventMouseDownId) + { // it was the left button... - if (mouseEvent->Button & NLMISC::leftButton) { + if (mouseEvent->Button & NLMISC::leftButton) + { CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::LeftButton); // it was the right button... - } else if (mouseEvent->Button & NLMISC::rightButton) { + } + else if (mouseEvent->Button & NLMISC::rightButton) + { CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::RightButton); - } else if (mouseEvent->Button & NLMISC::middleButton) { + } + else if (mouseEvent->Button & NLMISC::middleButton) + { CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::MiddleButton); } // a mouse button was released - } else if (event == NLMISC::EventMouseUpId) { + } + else if (event == NLMISC::EventMouseUpId) + { // it was the left button... - if(mouseEvent->Button & NLMISC::leftButton) { + if(mouseEvent->Button & NLMISC::leftButton) + { CEGUI::System::getSingleton().injectMouseButtonUp(CEGUI::LeftButton); // it was the right button... - } else if (mouseEvent->Button & NLMISC::rightButton) { + } + else if (mouseEvent->Button & NLMISC::rightButton) + { CEGUI::System::getSingleton().injectMouseButtonUp(CEGUI::RightButton); } else if (mouseEvent->Button & NLMISC::middleButton) { CEGUI::System::getSingleton().injectMouseButtonUp(CEGUI::MiddleButton); } - } else if (event == NLMISC::EventMouseMoveId) { + } + else if (event == NLMISC::EventMouseMoveId) + { // convert into screen coordinates. float delta_x=(float)(mouseEvent->X - m_MouseX)*m_Width; float delta_y=(float)((1.0f-mouseEvent->Y) - m_MouseY)*m_Height; @@ -276,18 +299,26 @@ namespace CEGUI // and save for delta. m_MouseX=mouseEvent->X; m_MouseY=1.0f-mouseEvent->Y; - } else if (event == NLMISC::EventMouseWheelId) { + } + else if (event == NLMISC::EventMouseWheelId) + { NLMISC::CEventMouseWheel *ev=(NLMISC::CEventMouseWheel *)&event; float dir=0.0f; if(ev->Direction) dir=0.5f; else dir=-0.5f; CEGUI::System::getSingleton().injectMouseWheelChange(dir); } - } else { // assume otherwise that it's a character. - if(event==NLMISC::EventCharId) { + } + else + { + // assume otherwise that it's a character. + if(event==NLMISC::EventCharId) + { unsigned char c = (char)((NLMISC::CEventChar&)event).Char; CEGUI::System::getSingleton().injectChar((CEGUI::utf32)c); - } else if(event==NLMISC::EventKeyDownId) { + } + else if(event==NLMISC::EventKeyDownId) + { NLMISC::CEventKeyDown *keyvent=(NLMISC::CEventKeyDown *)&event; CEGUI::System::getSingleton().injectKeyDown(m_KeyMap[keyvent->Key]); } @@ -296,7 +327,8 @@ namespace CEGUI catch (CEGUI::Exception) { } } - void initKeyMap() { + void initKeyMap() + { m_KeyMap[NLMISC::Key0 ]=CEGUI::Key::Zero; m_KeyMap[NLMISC::Key1 ]=CEGUI::Key::One; m_KeyMap[NLMISC::Key2 ]=CEGUI::Key::Two; diff --git a/code/nel/include/nel/georges/load_form.h b/code/nel/include/nel/georges/load_form.h index 1a9a759f9..3a2e6d839 100644 --- a/code/nel/include/nel/georges/load_form.h +++ b/code/nel/include/nel/georges/load_form.h @@ -201,7 +201,7 @@ void loadForm (const std::vector &sheetFilters, const std::string & ifile.serialCont (container); ifile.close (); } - catch (NLMISC::Exception &e) + catch (const NLMISC::Exception &e) { // clear the container because it can contains partially loaded sheet so we must clean it before continue container.clear (); @@ -456,7 +456,7 @@ void loadForm (const std::vector &sheetFilters, const std::string & ofile.close (); } } - catch (NLMISC::Exception &e) + catch (const NLMISC::Exception &e) { nlinfo ("loadForm(): Exception during saving the packed file, it will be recreated next launch (%s)", e.what()); } @@ -564,7 +564,7 @@ void loadForm2(const std::vector &sheetFilters, const std::string & ifile.serialPtrCont (container); ifile.close (); } - catch (NLMISC::Exception &e) + catch (const NLMISC::Exception &e) { // clear the container because it can contains partially loaded sheet so we must clean it before continue container.clear (); @@ -819,7 +819,7 @@ void loadForm2(const std::vector &sheetFilters, const std::string & ofile.close (); } } - catch (NLMISC::Exception &e) + catch (const NLMISC::Exception &e) { nlinfo ("loadForm(): Exception during saving the packed file, it will be recreated next launch (%s)", e.what()); } @@ -925,7 +925,7 @@ void loadForm (const std::vector &sheetFilters, const std::string & ifile.serialCont (container); ifile.close (); } - catch (NLMISC::Exception &e) + catch (const NLMISC::Exception &e) { // clear the container because it can contains partially loaded sheet so we must clean it before continue container.clear (); @@ -1183,7 +1183,7 @@ void loadForm (const std::vector &sheetFilters, const std::string & ofile.close (); } } - catch (NLMISC::Exception &e) + catch (const NLMISC::Exception &e) { nlinfo ("loadForm(): Exception during saving the packed file, it will be recreated next launch (%s)", e.what()); } diff --git a/code/nel/include/nel/ligo/primitive_utils.h b/code/nel/include/nel/ligo/primitive_utils.h index cc71e2d50..c5049b06b 100644 --- a/code/nel/include/nel/ligo/primitive_utils.h +++ b/code/nel/include/nel/ligo/primitive_utils.h @@ -261,7 +261,7 @@ inline bool loadXmlPrimitiveFile(CPrimitives &primDoc, const std::string &fileNa // Read it return primDoc.read (xmlIn.getRootNode (), NLMISC::CFile::getFilename(fileName).c_str(), ligoConfig); } - catch(NLMISC::Exception e) + catch(const NLMISC::Exception &e) { nlwarning("Error reading input file '%s': '%s'", fileName.c_str(), e.what()); return false; @@ -294,7 +294,7 @@ inline bool saveXmlPrimitiveFile(CPrimitives &primDoc, const std::string &fileNa // return xmlSaveFile(fileName.c_str(), xmlDoc) != -1; } - catch(NLMISC::Exception e) + catch(const NLMISC::Exception &e) { nlwarning("Error writing output file '%s': '%s'", fileName.c_str(), e.what()); return false; diff --git a/code/nel/include/nel/misc/config_file.h b/code/nel/include/nel/misc/config_file.h index eb7239b14..b1223fa14 100644 --- a/code/nel/include/nel/misc/config_file.h +++ b/code/nel/include/nel/misc/config_file.h @@ -63,7 +63,7 @@ namespace NLMISC * printf ("%d ", bar.asInt (i)); * printf("\n"); * } - * catch (EConfigFile &e) + * catch (const EConfigFile &e) * { * // Something goes wrong... catch that * printf ("%s\n", e.what ()); diff --git a/code/nel/include/nel/misc/diff_tool.h b/code/nel/include/nel/misc/diff_tool.h index b8a8db327..64989fcaf 100644 --- a/code/nel/include/nel/misc/diff_tool.h +++ b/code/nel/include/nel/misc/diff_tool.h @@ -238,11 +238,11 @@ namespace STRING_MANAGER return false; } - bool findCol(ucstring colName, uint &colIndex) + bool findCol(const ucstring &colName, uint &colIndex) { if (Data.empty()) return false; - TWorksheet::TRow::iterator it = std::find(Data[0].begin(), Data[0].end(), ucstring(colName)); + TWorksheet::TRow::iterator it = std::find(Data[0].begin(), Data[0].end(), colName); if (it == Data[0].end()) return false; diff --git a/code/nel/include/nel/misc/i_xml.h b/code/nel/include/nel/misc/i_xml.h index e988375f7..7d2ff86b7 100644 --- a/code/nel/include/nel/misc/i_xml.h +++ b/code/nel/include/nel/misc/i_xml.h @@ -71,7 +71,7 @@ struct EXmlParsingError : public EStream // File not found } } - catch (Exception &e) + catch (const Exception &e) { // Something wrong appends } diff --git a/code/nel/include/nel/misc/o_xml.h b/code/nel/include/nel/misc/o_xml.h index af4e830ff..bbaa2e951 100644 --- a/code/nel/include/nel/misc/o_xml.h +++ b/code/nel/include/nel/misc/o_xml.h @@ -64,7 +64,7 @@ namespace NLMISC { // Close the file file.close (); } - catch (Exception &e) + catch (const Exception &e) { } \endcode diff --git a/code/nel/include/nel/net/module.h b/code/nel/include/nel/net/module.h index 70f11f1bc..62d2a0baf 100644 --- a/code/nel/include/nel/net/module.h +++ b/code/nel/include/nel/net/module.h @@ -524,7 +524,7 @@ namespace NLNET // run the module task command control to module task method (_Module->*_TaskMethod)(); } - catch (NLMISC::Exception e) + catch (const NLMISC::Exception &e) { nlwarning("In module task '%s', exception '%e' thrown", typeid(this).name(), e.what()); } diff --git a/code/nel/samples/3d/cluster_viewer/main.cpp b/code/nel/samples/3d/cluster_viewer/main.cpp index bc314e43a..b77a0d669 100644 --- a/code/nel/samples/3d/cluster_viewer/main.cpp +++ b/code/nel/samples/3d/cluster_viewer/main.cpp @@ -94,7 +94,7 @@ CInstanceGroup* LoadInstanceGroup(const char* sFilename) newIG->serial (file); // All is good } - catch (Exception &) + catch (const Exception &) { // Cannot save the file delete newIG; diff --git a/code/nel/samples/misc/configfile/main.cpp b/code/nel/samples/misc/configfile/main.cpp index f5a3fd472..c23acd652 100644 --- a/code/nel/samples/misc/configfile/main.cpp +++ b/code/nel/samples/misc/configfile/main.cpp @@ -116,7 +116,7 @@ int main (int /* argc */, char ** /* argv */) int val = cf.getVar ("unknown_variable").asInt(); nlinfo("unknown_variable = %d", val); } - catch (EConfigFile &e) + catch (const EConfigFile &e) { nlinfo("something goes wrong with configfile: %s", e.what()); } diff --git a/code/nel/samples/misc/debug/main.cpp b/code/nel/samples/misc/debug/main.cpp index 9d17d158c..84f712c6a 100644 --- a/code/nel/samples/misc/debug/main.cpp +++ b/code/nel/samples/misc/debug/main.cpp @@ -63,7 +63,7 @@ int main (int /* argc */, char ** /* argv */) { nlerror ("nlerror() %d", 4); } - catch(EFatalError &) + catch(const EFatalError &) { // just continue... nlinfo ("nlerror() generated an EFatalError exception, just ignore it"); diff --git a/code/nel/samples/net/chat/client.cpp b/code/nel/samples/net/chat/client.cpp index a22843c0c..c2aee8c86 100644 --- a/code/nel/samples/net/chat/client.cpp +++ b/code/nel/samples/net/chat/client.cpp @@ -109,7 +109,7 @@ int main (int argc, char **argv) CInetAddress addr(LSHost+":3333"); Client->connect(addr); } - catch(ESocket &e) + catch(const ESocket &e) { printf("%s\n", e.what()); return 0; diff --git a/code/nel/samples/net/login_system/frontend_service.cpp b/code/nel/samples/net/login_system/frontend_service.cpp index 189bbaf67..e71e935bf 100644 --- a/code/nel/samples/net/login_system/frontend_service.cpp +++ b/code/nel/samples/net/login_system/frontend_service.cpp @@ -101,7 +101,7 @@ public: { fsPort = IService::ConfigFile.getVar("FSPort").asInt(); } - catch ( EUnknownVar& ) + catch (const EUnknownVar&) { } _FServer.init(fsPort); @@ -148,7 +148,7 @@ public: { fesPort = IService5::ConfigFile.getVar("FESPort").asInt(); } - catch ( EUnknownVar& ) + catch (const EUnknownVar&) { } diff --git a/code/nel/samples/net/udp/bench_service.cpp b/code/nel/samples/net/udp/bench_service.cpp index 0b8db1a71..40786dd26 100644 --- a/code/nel/samples/net/udp/bench_service.cpp +++ b/code/nel/samples/net/udp/bench_service.cpp @@ -190,7 +190,7 @@ void cbInit (CMessage &msgin, TSockId from, CCallbackNetBase &netbase) return; } } - catch (Exception &) + catch (const Exception &) { // bad client version, disconnect it CallbackServer->disconnect (from); @@ -530,7 +530,7 @@ void handleReceivedPong (CClient *client, sint64 pongTime) // init the UDP connection if (client == NULL) { - uint32 session; + uint32 session = 0; msgin.serial (session); // Find a new udp connection, find the linked @@ -568,13 +568,13 @@ void handleReceivedPong (CClient *client, sint64 pongTime) } // Read the message - sint64 pingTime; + sint64 pingTime = 0; msgin.serial(pingTime); - uint32 pongNumber; + uint32 pongNumber = 0; msgin.serial(pongNumber); - uint32 blockNumber; + uint32 blockNumber = 0; msgin.serial(blockNumber); // nlinfo ("receive a pong from %s pongnb %d %"NL_I64"d", CurrentInMsg->AddrFrom.asString().c_str(), pongNumber, pongTime - pingTime); @@ -611,7 +611,7 @@ void sendPing () // send the new ping to the client ReceiveTask->DataSock->sendTo (msgout.buffer(), size, GETCLIENTA(it)->Address); } - catch (Exception &e) + catch (const Exception &e) { nlwarning ("Can't send UDP packet to '%s' (%s)", GETCLIENTA(it)->Address.asString().c_str(), e.what()); } @@ -734,7 +734,7 @@ public: updateStat (); } } - catch (Exception &e) + catch (const Exception &e) { nlerrornoex ("Exception not catched: '%s'", e.what()); } diff --git a/code/nel/samples/net/udp/client.cpp b/code/nel/samples/net/udp/client.cpp index 749797368..dbf15c11d 100644 --- a/code/nel/samples/net/udp/client.cpp +++ b/code/nel/samples/net/udp/client.cpp @@ -232,7 +232,7 @@ void cbInit (CMessage &msgin, TSockId from, CCallbackNetBase &netbase) { UdpSock->connect( CInetAddress (ServerAddr, UDPPort) ); } - catch ( Exception& e ) + catch (const Exception &e) { InfoLog->displayRawNL ("Cannot connect to remote UDP host '%s': %s", ServerAddr.c_str(), e.what() ); exit (""); @@ -291,7 +291,7 @@ int main( int argc, char **argv ) InfoLog->displayRawNL ("Waiting the server answer..."); } - catch(Exception &e) + catch(const Exception &e) { InfoLog->displayRawNL ("Can't connect to %s:%d (%s)\n", ServerAddr.c_str(), TCPPort, e.what()); exit (""); diff --git a/code/nel/samples/net/udp/receive_task.cpp b/code/nel/samples/net/udp/receive_task.cpp index 70276180c..bdfabbe29 100644 --- a/code/nel/samples/net/udp/receive_task.cpp +++ b/code/nel/samples/net/udp/receive_task.cpp @@ -108,7 +108,7 @@ void CReceiveTask::run() DataSock->receivedFrom( _ReceivedMessage.userDataW(), _DatagramLength, _ReceivedMessage.AddrFrom ); d = CTime::getLocalTime (); } - catch ( ESocket& ) + catch (const ESocket&) { // Remove the client corresponding to the address _ReceivedMessage.setTypeEvent( TReceivedMessage::RemoveClient ); diff --git a/code/nel/samples/pacs/main.cpp b/code/nel/samples/pacs/main.cpp index d3d87a938..fcbd7d8a9 100644 --- a/code/nel/samples/pacs/main.cpp +++ b/code/nel/samples/pacs/main.cpp @@ -371,7 +371,7 @@ int main () // Remove mouse listener pDriver->delete3dMouseListener (plistener); } - catch (Exception& e) + catch (const Exception& e) { #ifdef NL_OS_WINDOWS ::MessageBox (NULL, e.what(), "Test collision move", MB_OK|MB_ICONEXCLAMATION); diff --git a/code/nel/samples/sound_sources/main.cpp b/code/nel/samples/sound_sources/main.cpp index 50d28de6a..fb6753f63 100644 --- a/code/nel/samples/sound_sources/main.cpp +++ b/code/nel/samples/sound_sources/main.cpp @@ -85,7 +85,7 @@ void Init() AudioMixer->getListener()->setOrientation( frontvec, upvec ); } - catch( Exception& e ) + catch(const Exception &e) { nlerror( "Error: %s", e.what() ); } diff --git a/code/nel/src/3d/animation_set.cpp b/code/nel/src/3d/animation_set.cpp index 940592396..ec034e300 100644 --- a/code/nel/src/3d/animation_set.cpp +++ b/code/nel/src/3d/animation_set.cpp @@ -227,7 +227,7 @@ bool CAnimationSet::loadFromFiles(const std::string &path, bool recurse /* = tru iFile.close(); } - catch (NLMISC::EStream &e) + catch (const NLMISC::EStream &e) { if (wantWarningMessage) { diff --git a/code/nel/src/3d/async_file_manager_3d.cpp b/code/nel/src/3d/async_file_manager_3d.cpp index 7fbb170d1..382dc0039 100644 --- a/code/nel/src/3d/async_file_manager_3d.cpp +++ b/code/nel/src/3d/async_file_manager_3d.cpp @@ -338,7 +338,7 @@ void CAsyncFileManager3D::CMeshLoad::run() // Finally affect the pointer (Trans-Thread operation -> this operation must be atomic) *_ppShp = mesh.getShapePointer(); } - catch(EPathNotFound &) + catch(const EPathNotFound &) { nlwarning ("Couldn't load '%s'", MeshName.c_str()); *_ppShp = (IShape*)-1; @@ -382,7 +382,7 @@ void CAsyncFileManager3D::CIGLoad::run (void) *_ppIG = pIG; } - catch(EPathNotFound &) + catch(const EPathNotFound &) { nlwarning ("Couldn't load '%s'", _IGName.c_str()); *_ppIG = (CInstanceGroup*)-1; @@ -429,7 +429,7 @@ void CAsyncFileManager3D::CIGLoadUser::run (void) return; } } - catch(EPathNotFound &) + catch(const EPathNotFound &) { nlwarning ("Couldn't load '%s'", _IGName.c_str()); delete pIG; diff --git a/code/nel/src/3d/driver/direct3d/driver_direct3d.cpp b/code/nel/src/3d/driver/direct3d/driver_direct3d.cpp index e05e52e7c..5ac1d2906 100644 --- a/code/nel/src/3d/driver/direct3d/driver_direct3d.cpp +++ b/code/nel/src/3d/driver/direct3d/driver_direct3d.cpp @@ -1600,7 +1600,7 @@ bool CDriverD3D::setDisplay(nlWindow wnd, const GfxMode& mode, bool show, bool r _EventEmitter.addEmitter(diee, true); } } - catch(EDirectInput &e) + catch(const EDirectInput &e) { nlinfo(e.what()); } diff --git a/code/nel/src/3d/driver/direct3d/driver_direct3d_inputs.cpp b/code/nel/src/3d/driver/direct3d/driver_direct3d_inputs.cpp index e64585ad7..eaae085f9 100644 --- a/code/nel/src/3d/driver/direct3d/driver_direct3d_inputs.cpp +++ b/code/nel/src/3d/driver/direct3d/driver_direct3d_inputs.cpp @@ -485,7 +485,7 @@ NLMISC::IMouseDevice* CDriverD3D::enableLowLevelMouse(bool enable, bool exclusiv if (diee) res = diee->getMouseDevice(exclusive); } - catch (EDirectInput &) + catch (const EDirectInput &) { } } @@ -517,7 +517,7 @@ NLMISC::IKeyboardDevice* CDriverD3D::enableLowLevelKeyboard(bool enable) if (diee) res = diee->getKeyboardDevice(); } - catch (EDirectInput &) + catch (const EDirectInput &) { } } @@ -561,7 +561,7 @@ uint CDriverD3D::getDoubleClickDelay(bool hardwareMouse) { md = diee->getMouseDevice(hardwareMouse); } - catch (EDirectInput &) + catch (const EDirectInput &) { // could not get device .. } diff --git a/code/nel/src/3d/driver/opengl/CMakeLists.txt b/code/nel/src/3d/driver/opengl/CMakeLists.txt index 25216998c..6fdecab71 100644 --- a/code/nel/src/3d/driver/opengl/CMakeLists.txt +++ b/code/nel/src/3d/driver/opengl/CMakeLists.txt @@ -1,4 +1,5 @@ FILE(GLOB SRC *.cpp *.h *.def) + IF(APPLE) FILE(GLOB MAC_SRC mac/*.h mac/*.m mac/*.mm mac/*.cpp) SET(SRC ${SRC} ${MAC_SRC}) diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_extension_def.h b/code/nel/src/3d/driver/opengl/driver_opengl_extension_def.h index decd4a0c5..c1ecfe8c0 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_extension_def.h +++ b/code/nel/src/3d/driver/opengl/driver_opengl_extension_def.h @@ -20,22 +20,67 @@ #include "nel/misc/types_nl.h" -#ifdef NL_OS_MAC -# define GL_GLEXT_LEGACY -# include -# include "mac/glext.h" +#ifdef USE_OPENGLES +# include +# include #else -# include -# include // Please download it from http://www.opengl.org/registry/ -# if defined(NL_OS_WINDOWS) -# include -# endif +# ifdef NL_OS_MAC +# define GL_GLEXT_LEGACY +# include +# include "mac/glext.h" +# else +# include +# include +# if defined(NL_OS_WINDOWS) +# include +# endif +# endif #endif #ifdef __cplusplus extern "C" { #endif +#ifdef USE_OPENGLES +// OES_mapbuffer +//============== +typedef void* (APIENTRY * NEL_PFNGLMAPBUFFEROESPROC) (GLenum target, GLenum access); +typedef GLboolean (APIENTRY * NEL_PFNGLUNMAPBUFFEROESPROC) (GLenum target); +typedef void (APIENTRY * NEL_PFNGLGETBUFFERPOINTERVOESPROC) (GLenum target, GLenum pname, void** params); + +typedef void (APIENTRY * NEL_PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); + +// GL_OES_framebuffer_object +//================================== +typedef GLboolean (APIENTRY * NEL_PFNGLISRENDERBUFFEROESPROC) (GLuint renderbuffer); +typedef void (APIENTRY * NEL_PFNGLBINDRENDERBUFFEROESPROC) (GLenum target, GLuint renderbuffer); +typedef void (APIENTRY * NEL_PFNGLDELETERENDERBUFFERSOESPROC) (GLsizei n, const GLuint* renderbuffers); +typedef void (APIENTRY * NEL_PFNGLGENRENDERBUFFERSOESPROC) (GLsizei n, GLuint* renderbuffers); +typedef void (APIENTRY * NEL_PFNGLRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRY * NEL_PFNGLGETRENDERBUFFERPARAMETERIVOESPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (APIENTRY * NEL_PFNGLISFRAMEBUFFEROESPROC) (GLuint framebuffer); +typedef void (APIENTRY * NEL_PFNGLBINDFRAMEBUFFEROESPROC) (GLenum target, GLuint framebuffer); +typedef void (APIENTRY * NEL_PFNGLDELETEFRAMEBUFFERSOESPROC) (GLsizei n, const GLuint* framebuffers); +typedef void (APIENTRY * NEL_PFNGLGENFRAMEBUFFERSOESPROC) (GLsizei n, GLuint* framebuffers); +typedef GLenum (APIENTRY * NEL_PFNGLCHECKFRAMEBUFFERSTATUSOESPROC) (GLenum target); +typedef void (APIENTRY * NEL_PFNGLFRAMEBUFFERRENDERBUFFEROESPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRY * NEL_PFNGLFRAMEBUFFERTEXTURE2DOESPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRY * NEL_PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVOESPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params); +typedef void (APIENTRY * NEL_PFNGLGENERATEMIPMAPOESPROC) (GLenum target); + +// GL_OES_texture_cube_map +//================================== +typedef void (APIENTRY * NEL_PFNGLTEXGENFOESPROC) (GLenum coord, GLenum pname, GLfloat param); +typedef void (APIENTRY * NEL_PFNGLTEXGENFVOESPROC) (GLenum coord, GLenum pname, const GLfloat *params); +typedef void (APIENTRY * NEL_PFNGLTEXGENIOESPROC) (GLenum coord, GLenum pname, GLint param); +typedef void (APIENTRY * NEL_PFNGLTEXGENIVOESPROC) (GLenum coord, GLenum pname, const GLint *params); +typedef void (APIENTRY * NEL_PFNGLTEXGENXOESPROC) (GLenum coord, GLenum pname, GLfixed param); +typedef void (APIENTRY * NEL_PFNGLTEXGENXVOESPROC) (GLenum coord, GLenum pname, const GLfixed *params); +typedef void (APIENTRY * NEL_PFNGLGETTEXGENFVOESPROC) (GLenum coord, GLenum pname, GLfloat *params); +typedef void (APIENTRY * NEL_PFNGLGETTEXGENIVOESPROC) (GLenum coord, GLenum pname, GLint *params); +typedef void (APIENTRY * NEL_PFNGLGETTEXGENXVOESPROC) (GLenum coord, GLenum pname, GLfixed *params); +#endif + // *************************************************************************** // *************************************************************************** // The NEL Functions Typedefs. diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_inputs.cpp b/code/nel/src/3d/driver/opengl/driver_opengl_inputs.cpp index b957b372a..acfdac253 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_inputs.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_inputs.cpp @@ -684,7 +684,7 @@ NLMISC::IMouseDevice* CDriverGL::enableLowLevelMouse(bool enable, bool exclusive if (diee) res = diee->getMouseDevice(exclusive); } - catch (EDirectInput &) + catch (const EDirectInput &) { } } @@ -722,7 +722,7 @@ NLMISC::IKeyboardDevice* CDriverGL::enableLowLevelKeyboard(bool enable) if (diee) res = diee->getKeyboardDevice(); } - catch (EDirectInput &) + catch (const EDirectInput &) { } } @@ -778,7 +778,7 @@ uint CDriverGL::getDoubleClickDelay(bool hardwareMouse) { md = diee->getMouseDevice(hardwareMouse); } - catch (EDirectInput &) + catch (const EDirectInput &) { // could not get device .. } diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_material.cpp b/code/nel/src/3d/driver/opengl/driver_opengl_material.cpp index 9a2d6c596..4fe6e8c71 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_material.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_material.cpp @@ -819,7 +819,7 @@ void CDriverGL::setupLightMapPass(uint pass) // fallBack if extension MulAdd not found. just mul factor with (Ambient+Diffuse) if(_LightMapNoMulAddFallBack) { - // do not use consant color to blend lightmap, but incoming diffuse color, for stage0 only. + // do not use constant color to blend lightmap, but incoming diffuse color, for stage0 only. GLfloat glcol[4]; convColor(lmapFactor, glcol); _DriverGLStates.setEmissive(lmapFactor.getPacked(), glcol); @@ -2191,7 +2191,7 @@ static const float IdentityTexMat[4] = { 1.f, 0.f, 0.f, 1.f }; // *************************************************************************** void CDriverGL::setupWaterPassNV20(const CMaterial &mat) { - H_AUTO_OGL(CDriverGL_setupWaterPassNV20) + H_AUTO_OGL(CDriverGL_setupWaterPassNV20); #ifndef USE_OPENGLES static bool setupDone = false; diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_texture.cpp b/code/nel/src/3d/driver/opengl/driver_opengl_texture.cpp index 43c2441d4..315c9ee2a 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_texture.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_texture.cpp @@ -201,7 +201,7 @@ bool CTextureDrvInfosGL::initFrameBufferObject(ITexture * tex) break; #endif default: - nlwarning("Framebuffer incomplete\n"); + nlwarning("Framebuffer incomplete status %d", (sint)status); //nlassert(0); } @@ -505,7 +505,7 @@ static inline GLenum translateMinFilterToGl(CTextureDrvInfosGL *glText) // *************************************************************************** static inline bool sameDXTCFormat(ITexture &tex, GLint glfmt) { - H_AUTO_OGL(sameDXTCFormat) + H_AUTO_OGL(sameDXTCFormat); if(glfmt==GL_COMPRESSED_RGB_S3TC_DXT1_EXT && tex.PixelFormat==CBitmap::DXTC1) return true; if(glfmt==GL_COMPRESSED_RGBA_S3TC_DXT1_EXT && tex.PixelFormat==CBitmap::DXTC1Alpha) @@ -521,7 +521,7 @@ static inline bool sameDXTCFormat(ITexture &tex, GLint glfmt) // *************************************************************************** static inline bool isDXTCFormat(GLint glfmt) { - H_AUTO_OGL(isDXTCFormat) + H_AUTO_OGL(isDXTCFormat); if(glfmt==GL_COMPRESSED_RGB_S3TC_DXT1_EXT) return true; if(glfmt==GL_COMPRESSED_RGBA_S3TC_DXT1_EXT) diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_vertex_buffer_hard.h b/code/nel/src/3d/driver/opengl/driver_opengl_vertex_buffer_hard.h index a2b7111f4..da454c558 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_vertex_buffer_hard.h +++ b/code/nel/src/3d/driver/opengl/driver_opengl_vertex_buffer_hard.h @@ -113,7 +113,7 @@ protected: bool _Invalid; }; - +#ifndef USE_OPENGLES // *************************************************************************** // *************************************************************************** @@ -456,6 +456,8 @@ public: #endif }; +#endif + // *************************************************************************** // *************************************************************************** // ARB_vertex_buffer_object implementation @@ -553,6 +555,11 @@ private: CVertexArrayRangeARB *_VertexArrayRange; CVertexBuffer::TPreferredMemory _MemType; void *_VertexPtr; // pointer on current datas. Null if not locked +#ifdef USE_OPENGLES + uint8 *_Buffer; + uint32 _BufferSize; + uint32 _LastBufferSize; +#endif // if buffer has been invalidated, returns a dummy memory block and silently fails rendering std::vector _DummyVB; // for use by CVertexArrayRangeARB diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_vertex_program.cpp b/code/nel/src/3d/driver/opengl/driver_opengl_vertex_program.cpp index 45da4d218..4915ed1d4 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_vertex_program.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_vertex_program.cpp @@ -309,7 +309,7 @@ static uint convInputRegisterToVBFlag(uint index) // For debugging with swizzling static void doSwizzle(GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW) { - H_AUTO_OGL(doSwizzle) + H_AUTO_OGL(doSwizzle); nglSwizzleEXT(res, in, outX, outY, outZ, outW); #ifdef DEBUG_SETUP_EXT_VERTEX_SHADER std::string swzStr = "Swizzle : "; @@ -359,7 +359,7 @@ static void doSwizzle(GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum ou // Perform write mask and output de bug information static void doWriteMask(GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW) { - H_AUTO_OGL(doWriteMask) + H_AUTO_OGL(doWriteMask); nglWriteMaskEXT(res, in, outX, outY, outZ, outW); #ifdef DEBUG_SETUP_EXT_VERTEX_SHADER nlinfo("3D: Write Mask : %c%c%c%c", @@ -376,7 +376,7 @@ static void doWriteMask(GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum */ bool CDriverGL::setupEXTVertexShader(const CVPParser::TProgram &program, GLuint id, uint variants[EVSNumVariants], uint16 &usedInputRegisters) { - H_AUTO_OGL(CDriverGL_setupEXTVertexShader) + H_AUTO_OGL(CDriverGL_setupEXTVertexShader); // counter to see what is generated uint numOp = 0; uint numOpIndex = 0; @@ -1440,6 +1440,14 @@ bool CDriverGL::setupARBVertexProgram (const CVPParser::TProgram &inParsedProgra nlassert(0); return false; } + +#ifdef NL_OS_MAC + // Wait for GPU to finish program upload, else draw comands might crash. + // Happened to CVegetableBlendLayerModel (glDrawElements()). + // For more information, see http://dev.ryzom.com/issues/1006 + glFinish(); +#endif + return true; } diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_window.cpp b/code/nel/src/3d/driver/opengl/driver_opengl_window.cpp index eb3083729..6501d70c4 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_window.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_window.cpp @@ -374,18 +374,25 @@ bool CDriverGL::init (uint windowIcon, emptyProc exitFunc) } #endif // HAVE_XRENDER - // list all supported extensions - sint nextensions = 0; - char **extensions = XListExtensions(_dpy, &nextensions); + nldebug("3D: Available X Extensions:"); - std::string exts; + if (DebugLog) + { + // list all supported extensions + sint nextensions = 0; + char **extensions = XListExtensions(_dpy, &nextensions); - for(sint i = 0; i < nextensions; ++i) - exts += NLMISC::toString(" %s", extensions[i]); + for(sint i = 0; i < nextensions; ++i) + { + if(i%5==0) DebugLog->displayRaw("3D: "); + DebugLog->displayRaw(NLMISC::toString("%s ", extensions[i]).c_str()); + if(i%5==4) DebugLog->displayRaw("\n"); + } - XFreeExtensionList(extensions); + DebugLog->displayRaw("\n"); - nlinfo("X Extensions:%s", exts.c_str()); + XFreeExtensionList(extensions); + } // set default X errors handler XSetErrorHandler(nelXErrorsHandler); @@ -906,7 +913,6 @@ bool CDriverGL::setDisplay(nlWindow wnd, const GfxMode &mode, bool show, bool re _hRC=wglCreateContext(_hDC); wglMakeCurrent(_hDC,_hRC); - } /// release old emitter @@ -929,7 +935,7 @@ bool CDriverGL::setDisplay(nlWindow wnd, const GfxMode &mode, bool show, bool re _EventEmitter.addEmitter(diee, true); } } - catch(EDirectInput &e) + catch(const EDirectInput &e) { nlinfo(e.what()); } @@ -1577,7 +1583,7 @@ bool CDriverGL::destroyWindow() #elif defined(NL_OS_MAC) - if(_DestroyWindow) + if (_DestroyWindow) { [[containerView() window] release]; [containerView() release]; @@ -2297,7 +2303,7 @@ emptyProc CDriverGL::getWindowProc() // -------------------------------------------------- bool CDriverGL::activate() { - H_AUTO_OGL(CDriverGL_activate) + H_AUTO_OGL(CDriverGL_activate); if (_win == EmptyWindow) return false; diff --git a/code/nel/src/3d/driver/opengl/mac/cocoa_event_emitter.cpp b/code/nel/src/3d/driver/opengl/mac/cocoa_event_emitter.cpp index 525a59171..95c713021 100644 --- a/code/nel/src/3d/driver/opengl/mac/cocoa_event_emitter.cpp +++ b/code/nel/src/3d/driver/opengl/mac/cocoa_event_emitter.cpp @@ -359,7 +359,7 @@ bool CCocoaEventEmitter::processMessage(NSEvent* event, CEventServer* server) // push the key press event to the event server server->postEvent(new NLMISC::CEventKeyDown( virtualKeycodeToNelKey([event keyCode]), - modifierFlagsToNelKeyButton([event modifierFlags]), + modifiers, [event isARepeat] == NO, this)); // if this was a text event @@ -372,7 +372,7 @@ bool CCocoaEventEmitter::processMessage(NSEvent* event, CEventServer* server) // push the text event to event server as well server->postEvent(new NLMISC::CEventChar( - ucstr[0], NLMISC::noKeyButton, this)); + ucstr[0], modifiers, this)); } break; } @@ -381,7 +381,7 @@ bool CCocoaEventEmitter::processMessage(NSEvent* event, CEventServer* server) // push the key release event to the event server server->postEvent(new NLMISC::CEventKeyUp( virtualKeycodeToNelKey([event keyCode]), - modifierFlagsToNelKeyButton([event modifierFlags]), this)); + modifiers, this)); break; } case NSFlagsChanged:break; diff --git a/code/nel/src/3d/driver_user.cpp b/code/nel/src/3d/driver_user.cpp index 220536c4a..118e02141 100644 --- a/code/nel/src/3d/driver_user.cpp +++ b/code/nel/src/3d/driver_user.cpp @@ -1746,7 +1746,7 @@ void CDriverUser::loadHLSBank(const std::string &fileName) throw EPathNotFound(path); fIn.serial(*hlsBank); } - catch(Exception &) + catch(const Exception &) { delete hlsBank; throw; diff --git a/code/nel/src/3d/instance_group_user.cpp b/code/nel/src/3d/instance_group_user.cpp index 3e79f3c15..722d867da 100644 --- a/code/nel/src/3d/instance_group_user.cpp +++ b/code/nel/src/3d/instance_group_user.cpp @@ -121,7 +121,7 @@ bool CInstanceGroupUser::init (const std::string &instanceGroup, bool async) // Read the class _InstanceGroup.serial (file); } - catch (EStream& e) + catch (const EStream& e) { // Avoid visual warning EStream ee=e; diff --git a/code/nel/src/3d/landscape_user.cpp b/code/nel/src/3d/landscape_user.cpp index c088dcdb4..ed646470a 100644 --- a/code/nel/src/3d/landscape_user.cpp +++ b/code/nel/src/3d/landscape_user.cpp @@ -283,7 +283,7 @@ void CLandscapeUser::refreshZonesAround(const CVector &pos, float radius, std::s { _Landscape->Landscape.checkBinds(Work.Zone->getZoneId()); } - catch (EBadBind &e) + catch (const EBadBind &e) { nlwarning ("Bind error : %s", e.what()); nlstopex(("Zone Data Bind Error. Please send a report. You may continue but it should crash!")); diff --git a/code/nel/src/3d/ps_mesh.cpp b/code/nel/src/3d/ps_mesh.cpp index 1ab6d723f..5cd61aa90 100644 --- a/code/nel/src/3d/ps_mesh.cpp +++ b/code/nel/src/3d/ps_mesh.cpp @@ -1291,7 +1291,7 @@ bool CPSConstraintMesh::update(std::vector *numVertsVect /*= NULL*/) { _ModelBank->load(_MeshShapeFileName[k]); } - catch (NLMISC::EPathNotFound &) + catch (const NLMISC::EPathNotFound &) { nlwarning("mesh not found : %s; used as a constraint mesh particle", _MeshShapeFileName[k].c_str()); // shape not found, so not present in the shape bank -> we create a dummy shape diff --git a/code/nel/src/3d/shader.cpp b/code/nel/src/3d/shader.cpp index 1872b8a4f..deddce762 100644 --- a/code/nel/src/3d/shader.cpp +++ b/code/nel/src/3d/shader.cpp @@ -93,7 +93,7 @@ bool CShader::loadShaderFile (const char *filename) nlwarning ("Can't open the file %s for reading", _filename.c_str()); } } - catch (Exception &e) + catch (const Exception &e) { nlwarning ("Error while reading %s : %s", _filename.c_str(), e.what()); } diff --git a/code/nel/src/3d/texture_grouped.cpp b/code/nel/src/3d/texture_grouped.cpp index fbe593d9d..c7dbe0033 100644 --- a/code/nel/src/3d/texture_grouped.cpp +++ b/code/nel/src/3d/texture_grouped.cpp @@ -50,12 +50,12 @@ static inline void GetTextureSize(ITexture *tex, uint &width, uint &height) width = srcWidth; height = srcHeight; } - catch (NLMISC::EPathNotFound &e) + catch (const NLMISC::EPathNotFound &e) { nlinfo("%s", e.what()); width = height = 0; } - catch (NLMISC::EStream &e) + catch (const NLMISC::EStream &e) { nlinfo("unable to load size from a bitmap ! name = %s", tf->getFileName().c_str()); nlinfo("reason = %s", e.what()); diff --git a/code/nel/src/3d/tile_bank.cpp b/code/nel/src/3d/tile_bank.cpp index 361b3ea83..1f50fa7b5 100644 --- a/code/nel/src/3d/tile_bank.cpp +++ b/code/nel/src/3d/tile_bank.cpp @@ -1573,7 +1573,7 @@ void CTileSet::loadTileVegetableDesc() // load the TileVegetableDesc f.serial(_TileVegetableDesc); } - catch(Exception &e) + catch(const Exception &e) { nlinfo("Error loading TileVegetableDesc: %s", e.what()); } diff --git a/code/nel/src/3d/vegetable_manager.cpp b/code/nel/src/3d/vegetable_manager.cpp index bb472e75a..a51e5c83e 100644 --- a/code/nel/src/3d/vegetable_manager.cpp +++ b/code/nel/src/3d/vegetable_manager.cpp @@ -816,7 +816,7 @@ CVegetableShape *CVegetableManager::getVegetableShape(const std::string &shap ret = NULL; } } - catch (Exception &e) + catch (const Exception &e) { // Warning nlwarning ("CVegetableManager::getVegetableShape error while loading shape file '%s' : '%s'", shape.c_str (), e.what ()); diff --git a/code/nel/src/3d/zone_lighter.cpp b/code/nel/src/3d/zone_lighter.cpp index 4f1e53385..980a83278 100644 --- a/code/nel/src/3d/zone_lighter.cpp +++ b/code/nel/src/3d/zone_lighter.cpp @@ -844,7 +844,7 @@ void SaveZBuffer (CZoneLighter::CZBuffer &zbuffer, const char *filename) // Save it bitmap.writeJPG (outputZFile, 128); } - catch (Exception& except) + catch (const Exception& except) { // Error message nlwarning ("ERROR writing %s: %s\n", filename, except.what()); @@ -3080,13 +3080,13 @@ void CZoneLighter::lightWater(CWaterShape &ws, const CMatrix &MT, const CLightDe diffuseTex->writeTGA(of, 24); of.close(); } - catch (NLMISC::Exception &) + catch (const NLMISC::Exception &) { nlwarning("Zone lighter : while lighting a water shape, writing %s failed! ", texFileName.c_str()); } } } - catch(NLMISC::Exception &e) + catch(const NLMISC::Exception &e) { nlwarning("Water shape lighting failed !"); nlwarning(e.what()); diff --git a/code/nel/src/georges/form_loader.cpp b/code/nel/src/georges/form_loader.cpp index e3098709f..b7d4a522e 100644 --- a/code/nel/src/georges/form_loader.cpp +++ b/code/nel/src/georges/form_loader.cpp @@ -105,7 +105,7 @@ CType *CFormLoader::loadType (const char *filename) type = NULL; } } - catch (Exception &e) + catch (const Exception &e) { // Output error warning (false, "loadType", "Error while loading the form (%s): %s", filename, e.what()); @@ -179,7 +179,7 @@ CFormDfn *CFormLoader::loadFormDfn (const char *filename, bool forceLoad) _MapFormDfn.erase (lowerStr); } } - catch (Exception &e) + catch (const Exception &e) { // Output error warning (false, "loadFormDfn", "Error while loading the form (%s): %s", filename, e.what()); @@ -276,7 +276,7 @@ UForm *CFormLoader::loadForm (const char *filename) _MapForm.erase (lowerStr); } } - catch (Exception &e) + catch (const Exception &e) { // Output error warning (false, "loadForm", "Error while loading the form (%s): %s", filename, e.what()); diff --git a/code/nel/src/ligo/ligo_config.cpp b/code/nel/src/ligo/ligo_config.cpp index c61b03d03..1d062d109 100644 --- a/code/nel/src/ligo/ligo_config.cpp +++ b/code/nel/src/ligo/ligo_config.cpp @@ -220,7 +220,7 @@ bool CLigoConfig::readPrimitiveClass (const char *_fileName, bool parsePrimitive syntaxError (filename.c_str(), root, "Wrong root node, should be NEL_LIGO_PRIMITIVE_CLASS"); } } - catch (Exception &e) + catch (const Exception &e) { errorMessage ("File read error (%s):%s", filename.c_str(), e.what ()); } diff --git a/code/nel/src/ligo/zone_bank.cpp b/code/nel/src/ligo/zone_bank.cpp index a79b98449..decc50f75 100644 --- a/code/nel/src/ligo/zone_bank.cpp +++ b/code/nel/src/ligo/zone_bank.cpp @@ -147,7 +147,7 @@ void CZoneBank::debugSaveInit (CZoneBankElement &zbeTmp, const string &fileName) output.init (&fileOut); zbeTmp.serial (output); } - catch (Exception& /*e*/) + catch (const Exception& /*e*/) { } @@ -544,7 +544,7 @@ bool CZoneBank::addElement (const std::string &elementName, std::string &error) error = "Can't open file " + elementName; } } - catch (Exception& e) + catch (const Exception& e) { error = "Error while loading ligozone "+elementName+" : "+e.what(); } diff --git a/code/nel/src/misc/command.cpp b/code/nel/src/misc/command.cpp index 313f36dcd..80d074386 100644 --- a/code/nel/src/misc/command.cpp +++ b/code/nel/src/misc/command.cpp @@ -188,7 +188,7 @@ bool ICommand::execute (const std::string &commandWithArgs, CLog &log, bool quie { return CCommandRegistry::getInstance().execute(commandWithArgs, log, quiet, human); } - catch(exception e) + catch(const exception &e) { log.displayNL("Command '%s' thrown an exception :", commandWithArgs.c_str()); log.displayNL(e.what()); diff --git a/code/nel/src/misc/config_file/cf_lexical.lpp b/code/nel/src/misc/config_file/cf_lexical.lpp index a6ced1449..0dbab0067 100644 --- a/code/nel/src/misc/config_file/cf_lexical.lpp +++ b/code/nel/src/misc/config_file/cf_lexical.lpp @@ -27,7 +27,10 @@ using namespace NLMISC; #define YY_NEVER_INTERACTIVE 1 #ifdef WIN32 +#define YY_NO_UNISTD_H 1 +#include #define read _read +#define isatty _isatty #endif /* Types */ @@ -122,6 +125,12 @@ string \"[^\"\n]*\" if (!cf_Ignore) { cflval.Val.Type = T_STRING; + if (strlen(yytext+1) >= sizeof(cflval.Val.String)) + { + strcpy (cflval.Val.String, ""); + DEBUG_PRINTF("lex: string '%s' exceeds max length\n", yytext); + return STRING; + } strcpy (cflval.Val.String, yytext+1); cflval.Val.String[strlen(cflval.Val.String)-1] = '\0'; DEBUG_PRINTF("lex: string '%s' '%s'\n", yytext, cflval.Val.String); @@ -133,6 +142,12 @@ string \"[^\"\n]*\" if (!cf_Ignore) { cflval.Val.Type = T_STRING; + if (strlen(yytext+1) >= sizeof(cflval.Val.String)) + { + strcpy (cflval.Val.String, ""); + DEBUG_PRINTF("lex: string '%s' exceeds max length\n", yytext); + return VARIABLE; + } strcpy (cflval.Val.String, yytext); DEBUG_PRINTF("lex: variable '%s' '%s'\n", yytext, cflval.Val.String); return VARIABLE; diff --git a/code/nel/src/misc/config_file/config_file.cpp b/code/nel/src/misc/config_file/config_file.cpp index f85469003..ebbce4867 100644 --- a/code/nel/src/misc/config_file/config_file.cpp +++ b/code/nel/src/misc/config_file/config_file.cpp @@ -832,7 +832,7 @@ void CConfigFile::checkConfigFiles () { (*it)->reparse (); } - catch (EConfigFile &e) + catch (const EConfigFile &e) { nlwarning ("CF: Exception will re-read modified config file '%s': %s", (*it)->getFilename().c_str(), e.what ()); } diff --git a/code/nel/src/misc/debug.cpp b/code/nel/src/misc/debug.cpp index 17cf2fd3b..b6fc1d85c 100644 --- a/code/nel/src/misc/debug.cpp +++ b/code/nel/src/misc/debug.cpp @@ -1016,7 +1016,7 @@ void getCallStack(std::string &result, sint skipNFirst) array[0] = skipNFirst; RaiseException (0xACE0ACE, 0, 1, array); } - catch (EDebug &e) + catch (const EDebug &e) { result += e.what(); } @@ -1051,7 +1051,7 @@ void getCallStackAndLog (string &result, sint /* skipNFirst */) // array[0] = skipNFirst; // RaiseException (0xACE0ACE, 0, 1, array); // } -// catch (EDebug &e) +// catch (const EDebug &e) // { // result += e.what(); // } diff --git a/code/nel/src/misc/diff_tool.cpp b/code/nel/src/misc/diff_tool.cpp index 27621748f..24d7bcc47 100644 --- a/code/nel/src/misc/diff_tool.cpp +++ b/code/nel/src/misc/diff_tool.cpp @@ -84,7 +84,7 @@ bool loadStringFile(const std::string filename, vector &stringInfos buffer = new uint8[size]; fp.serialBuffer(buffer, size); } - catch(Exception &e) + catch(const Exception &e) { nlinfo("Can't open file [%s] (%s)\n", filename.c_str(), e.what()); return true; diff --git a/code/nel/src/misc/displayer.cpp b/code/nel/src/misc/displayer.cpp index cc072fd20..c50935b8f 100644 --- a/code/nel/src/misc/displayer.cpp +++ b/code/nel/src/misc/displayer.cpp @@ -120,7 +120,7 @@ void IDisplayer::display ( const CLog::TDisplayInfo& args, const char *message ) { doDisplay( args, message ); } - catch (Exception &) + catch (const Exception &) { // silence } diff --git a/code/nel/src/misc/file.cpp b/code/nel/src/misc/file.cpp index 515c49014..eb1fa643a 100644 --- a/code/nel/src/misc/file.cpp +++ b/code/nel/src/misc/file.cpp @@ -365,7 +365,7 @@ void CIFile::getline (char *buffer, uint32 bufferSize) // read one byte serialBuffer ((uint8 *)buffer, 1); } - catch (EFile &) + catch (const EFile &) { *buffer = '\0'; return; diff --git a/code/nel/src/misc/inter_window_msg_queue.cpp b/code/nel/src/misc/inter_window_msg_queue.cpp index abdb84338..4cda83a04 100644 --- a/code/nel/src/misc/inter_window_msg_queue.cpp +++ b/code/nel/src/misc/inter_window_msg_queue.cpp @@ -419,7 +419,7 @@ namespace NLMISC } } } - catch(EStream &) + catch(const EStream &) { nlwarning("CInterWindowMsgQueue : Bad message format in inter window communication"); } diff --git a/code/nel/src/misc/system_info.cpp b/code/nel/src/misc/system_info.cpp index 97397f001..54273be94 100644 --- a/code/nel/src/misc/system_info.cpp +++ b/code/nel/src/misc/system_info.cpp @@ -66,15 +66,20 @@ namespace NLMISC { vector splitted; explode(string(buffer), string("\n"), splitted, true); + std::string value; + for(uint32 i = 0; i < splitted.size(); i++) { vector sline; explode(splitted[i], string(":"), sline, true); if(sline.size() == 2 && trim(sline[0]) == colname) { - return trim(sline[1]); + value = sline[1]; } } + + if (!value.empty()) + return trim(value); } nlwarning ("SI: Can't find the colname '%s' in /proc/cpuinfo", colname.c_str()); return ""; @@ -549,7 +554,7 @@ string CSystemInfo::getOS() { OSString += " Professional"; } - else + else { if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) OSString += " Datacenter Server"; @@ -805,6 +810,9 @@ string CSystemInfo::getProc () #elif defined NL_OS_UNIX + uint processors = 0; + if (fromString(getCpuInfo("processor"), processors)) ++processors; + ProcString = getCpuInfo("model name"); ProcString += " / ?"; ProcString += " Family " + getCpuInfo("cpu family"); @@ -815,7 +823,7 @@ string CSystemInfo::getProc () ProcString += " / "; ProcString += getCpuInfo("cpu MHz")+"MHz"; ProcString += " / "; - ProcString += "? Processors found"; + ProcString += toString("%u Processors found", processors); #endif diff --git a/code/nel/src/misc/words_dictionary.cpp b/code/nel/src/misc/words_dictionary.cpp index 687f9ea79..d3b32546d 100644 --- a/code/nel/src/misc/words_dictionary.cpp +++ b/code/nel/src/misc/words_dictionary.cpp @@ -55,7 +55,7 @@ bool CWordsDictionary::init( const string& configFileName ) cf.load( configFileName ); cfFound = true; } - catch ( EConfigFile& e ) + catch (const EConfigFile &e) { nlwarning( "WD: %s", e.what() ); } diff --git a/code/nel/src/net/buf_client.cpp b/code/nel/src/net/buf_client.cpp index 7866f81cc..7bf9a7b08 100644 --- a/code/nel/src/net/buf_client.cpp +++ b/code/nel/src/net/buf_client.cpp @@ -451,7 +451,7 @@ void CClientReceiveTask::run() NbLoop++; } - catch ( ESocket& ) + catch (const ESocket&) { LNETL1_DEBUG( "LNETL1: Client connection %s broken", sockId()->asString().c_str() ); sockId()->Sock->disconnect(); diff --git a/code/nel/src/net/buf_server.cpp b/code/nel/src/net/buf_server.cpp index 57df165c8..67fe4b84b 100644 --- a/code/nel/src/net/buf_server.cpp +++ b/code/nel/src/net/buf_server.cpp @@ -829,7 +829,7 @@ void CListenTask::run() NbLoop++; } - catch ( ESocket& e ) + catch (const ESocket &e) { LNETL1_INFO( "LNETL1: Exception in listen thread: %s", e.what() ); // It can occur when too many sockets are open (e.g. 885 connections) @@ -1131,12 +1131,12 @@ void CServerReceiveTask::run() */ } } -// catch ( ESocketConnectionClosed& ) +// catch (const ESocketConnectionClosed&) // { // LNETL1_DEBUG( "LNETL1: Connection %s closed", serverbufsock->asString().c_str() ); // // The socket went to _Connected=false when throwing the exception // } - catch ( ESocket& ) + catch (const ESocket&) { LNETL1_DEBUG( "LNETL1: Connection %s broken", serverbufsock->asString().c_str() ); (*ic)->Sock->disconnect(); diff --git a/code/nel/src/net/callback_client.cpp b/code/nel/src/net/callback_client.cpp index 6f6011f38..181f48c89 100644 --- a/code/nel/src/net/callback_client.cpp +++ b/code/nel/src/net/callback_client.cpp @@ -280,7 +280,7 @@ void CCallbackClient::connect( const CInetAddress& addr ) _MR_Recorder.recordNext( _MR_UpdateCounter, Connecting, _BufSock, addrmsg ); } } - catch ( ESocketConnectionFailed& ) + catch (const ESocketConnectionFailed&) { if ( _MR_RecordingState == Record ) { diff --git a/code/nel/src/net/callback_net_base.cpp b/code/nel/src/net/callback_net_base.cpp index 8620a75b3..24c2b9038 100644 --- a/code/nel/src/net/callback_net_base.cpp +++ b/code/nel/src/net/callback_net_base.cpp @@ -155,7 +155,7 @@ void CCallbackNetBase::processOneMessage () { receive (msgin, &tsid); } - catch (Exception &e) + catch (const Exception &e) { nlwarning(e.what()); return; diff --git a/code/nel/src/net/email.cpp b/code/nel/src/net/email.cpp index 313405983..efafe3e90 100644 --- a/code/nel/src/net/email.cpp +++ b/code/nel/src/net/email.cpp @@ -330,7 +330,7 @@ bool sendEmail (const string &smtpServer, const string &from, const string &to, ok = true; } } - catch (Exception &e) + catch (const Exception &e) { nlwarning ("EMAIL: Can't send email: %s", e.what()); goto end; diff --git a/code/nel/src/net/login_client.cpp b/code/nel/src/net/login_client.cpp index 550b620ee..9c34b41a3 100644 --- a/code/nel/src/net/login_client.cpp +++ b/code/nel/src/net/login_client.cpp @@ -146,7 +146,7 @@ string CLoginClient::authenticateBegin(const string &loginServiceAddr, const ucs _LSCallbackClient->disconnect(); _LSCallbackClient->connect (CInetAddress(addr)); } - catch (ESocket &e) + catch (const ESocket &e) { delete _LSCallbackClient; _LSCallbackClient = 0; @@ -226,7 +226,7 @@ string CLoginClient::connectToShard(CLoginCookie &lc, const std::string &addr, C // have we received the answer? if (!ShardValidate) return "FES disconnect me"; } - catch (ESocket &e) + catch (const ESocket &e) { return string("FES refused the connection (") + e.what () + ")"; } @@ -250,7 +250,7 @@ string CLoginClient::connectToShard (const std::string &addr, CUdpSock &cnx) // cnx.connect (CInetAddress(addr)); } - catch (ESocket &e) + catch (const ESocket &e) { return string("FES refused the connection (") + e.what () + ")"; } @@ -272,7 +272,7 @@ string CLoginClient::connectToShard (const std::string &addr, CUdpSimSock &cnx) // cnx.connect (CInetAddress(addr)); } - catch (ESocket &e) + catch (const ESocket &e) { return string("FES refused the connection (") + e.what () + ")"; } diff --git a/code/nel/src/net/login_server.cpp b/code/nel/src/net/login_server.cpp index 2ff2e3b88..38c3ec321 100644 --- a/code/nel/src/net/login_server.cpp +++ b/code/nel/src/net/login_server.cpp @@ -349,17 +349,17 @@ void CLoginServer::init (const string &listenAddress) try { cfcbDefaultUserPriv(IService::getInstance()->ConfigFile.getVar("DefaultUserPriv")); IService::getInstance()->ConfigFile.setCallback("DefaultUserPriv", cfcbDefaultUserPriv); - } catch(Exception &) { } + } catch(const Exception &) { } try { cfcbAcceptInvalidCookie (IService::getInstance()->ConfigFile.getVar("AcceptInvalidCookie")); IService::getInstance()->ConfigFile.setCallback("AcceptInvalidCookie", cfcbAcceptInvalidCookie); - } catch(Exception &) { } + } catch(const Exception &) { } try { cfcbTimeBeforeEraseCookie (IService::getInstance()->ConfigFile.getVar("TimeBeforeEraseCookie")); IService::getInstance()->ConfigFile.setCallback("TimeBeforeEraseCookie", cfcbTimeBeforeEraseCookie); - } catch(Exception &) { } + } catch(const Exception &) { } // setup the listen address diff --git a/code/nel/src/net/module.cpp b/code/nel/src/net/module.cpp index d09ed3084..41489abfb 100644 --- a/code/nel/src/net/module.cpp +++ b/code/nel/src/net/module.cpp @@ -330,7 +330,7 @@ namespace NLNET _onProcessModuleMessage(currentSender, currentMessage); _CurrentMessageFailed = false; } - catch (NLMISC::Exception e) + catch (const NLMISC::Exception &e) { nlwarning("In module task '%s' (cotask message receiver), exception '%e' thrown", typeid(this).name(), e.what()); // an exception have been thrown diff --git a/code/nel/src/net/module_gateway.cpp b/code/nel/src/net/module_gateway.cpp index 9f838afd1..efe29ae1b 100644 --- a/code/nel/src/net/module_gateway.cpp +++ b/code/nel/src/net/module_gateway.cpp @@ -109,7 +109,7 @@ namespace NLNET sd->serial(s); } } - catch(EStreamOverflow e) + catch(const EStreamOverflow &) { // FAILED to read the security block, rewind to old pos and serial as unknow nlwarning("Error while reading stream for security data type %u", dataTag); diff --git a/code/nel/src/net/module_gateway_transport.cpp b/code/nel/src/net/module_gateway_transport.cpp index 6088ab3e8..b839584d1 100644 --- a/code/nel/src/net/module_gateway_transport.cpp +++ b/code/nel/src/net/module_gateway_transport.cpp @@ -684,7 +684,7 @@ namespace NLNET route->CallbackClient.connect(addr); nldebug("CGatewayL3ClientTransport : Connected to %s with connId %u", addr.asString().c_str(), connId); } - catch (ESocketConnectionFailed e) + catch (const ESocketConnectionFailed &) { nlinfo("CGatewayL3ClientTransport : Failed to connect to server %s, retrying in %u seconds", addr.asString().c_str(), _RetryInterval); } diff --git a/code/nel/src/net/naming_client.cpp b/code/nel/src/net/naming_client.cpp index 5c735cf97..4aac61ea1 100644 --- a/code/nel/src/net/naming_client.cpp +++ b/code/nel/src/net/naming_client.cpp @@ -502,7 +502,7 @@ bool CNamingClient::lookupAndConnect (const std::string &name, CCallbackClient & // connection succeeded return true; } - catch (ESocketConnectionFailed &e) + catch (const ESocketConnectionFailed &e) { nldebug( "NC: Connection to %s failed: %s, tring another service if available", servaddr.asString().c_str(), e.what() ); diff --git a/code/nel/src/net/net_displayer.cpp b/code/nel/src/net/net_displayer.cpp index d9aff2a49..d2a354786 100644 --- a/code/nel/src/net/net_displayer.cpp +++ b/code/nel/src/net/net_displayer.cpp @@ -79,7 +79,7 @@ void CNetDisplayer::setLogServer (const CInetAddress& logServerAddr) { _Server->connect (_ServerAddr); } - catch( ESocket& ) + catch(const ESocket&) { // Silence } @@ -153,7 +153,7 @@ void CNetDisplayer::doDisplay ( const CLog::TDisplayInfo& args, const char *mess msg.serial( s ); _Server->send (msg, 0, false); } - catch( NLMISC::Exception& ) + catch(const NLMISC::Exception& ) { // Silence } diff --git a/code/nel/src/net/service.cpp b/code/nel/src/net/service.cpp index d59dbe5a8..8ed4c10c9 100644 --- a/code/nel/src/net/service.cpp +++ b/code/nel/src/net/service.cpp @@ -914,7 +914,7 @@ sint IService::main (const char *serviceShortName, const char *serviceLongName, // Get the localhost name localhost = CInetAddress::localHost().hostName(); } - catch (NLNET::ESocket &) + catch (const NLNET::ESocket &) { localhost = ""; } @@ -1091,7 +1091,7 @@ sint IService::main (const char *serviceShortName, const char *serviceLongName, return 10; } } - catch (ESocketConnectionFailed &) + catch (const ESocketConnectionFailed &) { nlinfo ("SERVICE: Could not connect to the Naming Service (%s). Retrying in a few seconds...", loc.asString().c_str()); nlSleep (5000); @@ -1495,13 +1495,13 @@ sint IService::main (const char *serviceShortName, const char *serviceLongName, MyTAT.deactivate(); } } - catch (EFatalError &) + catch (const EFatalError &) { // Somebody call nlerror, so we have to quit now, the message already display // so we don't have to to anything setExitStatus (EXIT_FAILURE); } - catch (ESocket &e) + catch (const ESocket &e) { // Catch NeL network exception to release the system cleanly setExitStatus (EXIT_FAILURE); ErrorLog->displayNL( "NeL Exception in \"%s\": %s", _ShortName.c_str(), e.what() ); @@ -1560,7 +1560,7 @@ sint IService::main (const char *serviceShortName, const char *serviceLongName, nlinfo ("SERVICE: Service released successfully"); } - catch (EFatalError &) + catch (const EFatalError &) { // Somebody call nlerror, so we have to quit now, the message already display // so we don't have to to anything diff --git a/code/nel/src/net/transport_class.cpp b/code/nel/src/net/transport_class.cpp index 1d9796dd2..a5f826728 100644 --- a/code/nel/src/net/transport_class.cpp +++ b/code/nel/src/net/transport_class.cpp @@ -419,7 +419,7 @@ void getNameOfMessageOrTransportClass( NLNET::CMessage& msgin, std::string& msgN msgin.seek( msgin.getHeaderSize(), NLMISC::IStream::begin ); msgin.serial( msgName ); } - catch ( EStreamOverflow& ) + catch (const EStreamOverflow&) { msgName = ""; } diff --git a/code/nel/src/net/unified_network.cpp b/code/nel/src/net/unified_network.cpp index 8a1a87b85..d3b0d16fe 100644 --- a/code/nel/src/net/unified_network.cpp +++ b/code/nel/src/net/unified_network.cpp @@ -481,7 +481,7 @@ void CAliveCheck::run() CheckList[i].AddressValid = true; cbc.disconnect(); } - catch (ESocketConnectionFailed &e) + catch (const ESocketConnectionFailed &e) { #if FINAL_VERSION nlinfo ("HNETL5: can't connect to %s-%hu now (%s)", CheckList[i].ServiceName.c_str(), CheckList[i].ServiceId.get(), e.what ()); @@ -587,7 +587,7 @@ bool CUnifiedNetwork::init(const CInetAddress *addr, CCallbackNetBase::TRecordin { _CbServer->init(port); } - catch (ESocket &) + catch (const ESocket &) { nlwarning("Failed to init the listen socket on port %u, is the service already running ?", port); // wait a little before retrying @@ -866,7 +866,7 @@ void CUnifiedNetwork::addService(const string &name, const vector cbc->connect(addr[i]); connectSuccess = true; } - catch (ESocketConnectionFailed &e) + catch (const ESocketConnectionFailed &e) { nlwarning ("HNETL5: can't connect to %s (sid %u) now (%s) '%s'", name.c_str(), sid.get(), e.what (), addr[i].asString ().c_str()); connectSuccess = false; @@ -1010,7 +1010,7 @@ void CUnifiedNetwork::update(TTime timeout) laddr[i].setPort(_ServerPort); CNamingClient::resendRegisteration (_Name, laddr, _SId); } - catch (ESocketConnectionFailed &) + catch (const ESocketConnectionFailed &) { nlwarning ("HNETL5: Could not connect to the Naming Service (%s). Retrying in a few seconds...", _NamingServiceAddr.asString().c_str()); } @@ -1209,7 +1209,7 @@ void CUnifiedNetwork::autoReconnect( CUnifiedConnection &uc, uint connectionInde // call the user callback callServiceUpCallback (uc.ServiceName, uc.ServiceId); } - catch (ESocketConnectionFailed &e) + catch (const ESocketConnectionFailed &e) { #if FINAL_VERSION nlinfo ("HNETL5: can't connect to %s-%hu now (%s)", uc.ServiceName.c_str(), uc.ServiceId.get(), e.what ()); diff --git a/code/nel/src/pacs/global_retriever.cpp b/code/nel/src/pacs/global_retriever.cpp index c9ab8cd0c..936846dd2 100644 --- a/code/nel/src/pacs/global_retriever.cpp +++ b/code/nel/src/pacs/global_retriever.cpp @@ -387,7 +387,7 @@ void NLPACS::CGlobalRetriever::makeLinks(uint n) instance.link(neighbor, _RetrieverBank->getRetrievers()); neighbor.link(instance, _RetrieverBank->getRetrievers()); } - catch (Exception &e) + catch (const Exception &e) { nlwarning("in NLPACS::CGlobalRetriever::makeLinks()"); nlwarning("caught an exception during linkage of %d and %d: %s", instance.getInstanceId(), neighbor.getInstanceId(), e.what()); diff --git a/code/nel/src/pacs/retriever_bank.h b/code/nel/src/pacs/retriever_bank.h index bce8b11e6..d98a5db57 100644 --- a/code/nel/src/pacs/retriever_bank.h +++ b/code/nel/src/pacs/retriever_bank.h @@ -150,7 +150,7 @@ public: { f.serial(_Retrievers[i]); } - catch (NLMISC::Exception &e) + catch (const NLMISC::Exception &e) { nlwarning("Couldn't load retriever file '%s', %s", fname.c_str(), e.what()); _Retrievers[i].clear(); diff --git a/code/nel/src/sound/audio_mixer_user.cpp b/code/nel/src/sound/audio_mixer_user.cpp index a80592727..367abd0e1 100644 --- a/code/nel/src/sound/audio_mixer_user.cpp +++ b/code/nel/src/sound/audio_mixer_user.cpp @@ -370,7 +370,7 @@ void CAudioMixerUser::initDriver(const std::string &driverName) _SoundDriver = ISoundDriver::createDriver(this, driverType); nlassert(_SoundDriver); } - catch (ESoundDriver &e) + catch (const ESoundDriver &e) { nlwarning(e.what()); delete _SoundDriver; _SoundDriver = NULL; @@ -458,7 +458,7 @@ void CAudioMixerUser::initDevice(const std::string &deviceName, const CInitInfo manualRolloff = false; // not really needed, but set anyway in case this is still used later in this function } } - catch (ESoundDriver &e) + catch (const ESoundDriver &e) { nlwarning(e.what()); delete _SoundDriver; _SoundDriver = NULL; @@ -883,7 +883,7 @@ void CAudioMixerUser::buildSampleBankList() } } } - catch(Exception e) + catch(const Exception &) { upToDate = false; } @@ -2100,7 +2100,7 @@ uint32 CAudioMixerUser::loadSampleBank(bool async, const std::string &name, st { bank->load(async); } - catch (Exception& e) + catch (const Exception& e) { if (notfoundfiles) { @@ -2489,7 +2489,7 @@ void CAudioMixerUser::changeMaxTrack(uint maxTrack) _FreeTracks.insert(_FreeTracks.begin(), _Tracks[i]); } } - catch ( ESoundDriver & ) + catch (const ESoundDriver &) { delete _Tracks[i]; // If the source generation failed, keep only the generated number of sources diff --git a/code/nel/src/sound/driver/dsound/sound_driver_dsound.cpp b/code/nel/src/sound/driver/dsound/sound_driver_dsound.cpp index 62efc1510..15d0d708f 100644 --- a/code/nel/src/sound/driver/dsound/sound_driver_dsound.cpp +++ b/code/nel/src/sound/driver/dsound/sound_driver_dsound.cpp @@ -605,7 +605,7 @@ void CSoundDriverDSound::initDevice(const std::string &device, ISoundDriver::TSo _SourceCount++; } } - catch (ESoundDriver& e) + catch (const ESoundDriver& e) { // Okay, here's the situation: I'm listening to WinAmp while debugging. // The caps told me there were 31 buffers available. In reality, there were diff --git a/code/nel/src/sound/driver/openal/source_al.cpp b/code/nel/src/sound/driver/openal/source_al.cpp index f156bfb7c..fe2dcb086 100644 --- a/code/nel/src/sound/driver/openal/source_al.cpp +++ b/code/nel/src/sound/driver/openal/source_al.cpp @@ -892,12 +892,22 @@ void CSourceAL::setStreamingBuffersMax(uint buffers) for(uint i = 0; i < _BuffersMax; ++i) { - // create a new buffer - CBufferAL *buffer = static_cast(_SoundDriver->createBuffer()); - // use StorageSoftware because buffers will be reused - // deleting and recreating them is a waste of time - buffer->setStorageMode(IBuffer::StorageSoftware); - _Buffers[buffer->bufferName()] = buffer; + try + { + // create a new buffer + CBufferAL *buffer = static_cast(_SoundDriver->createBuffer()); + // use StorageSoftware because buffers will be reused + // deleting and recreating them is a waste of time + buffer->setStorageMode(IBuffer::StorageSoftware); + _Buffers[buffer->bufferName()] = buffer; + } + catch(const ESoundDriverGenBuf &e) + { + nlwarning("Cannot create %d buffers. openal fails after %d buffers", buffers, i); + _BuffersMax = i; + _BuffersName.resize(i); + break; + } } } diff --git a/code/nel/src/sound/sample_bank.cpp b/code/nel/src/sound/sample_bank.cpp index a83166879..8dd764f54 100644 --- a/code/nel/src/sound/sample_bank.cpp +++ b/code/nel/src/sound/sample_bank.cpp @@ -213,7 +213,7 @@ void CSampleBank::load(bool async) _SampleBankManager->m_LoadedSize += _ByteSize; } - catch(Exception &e) + catch(const Exception &e) { // loading failed ! nlwarning("Exception %s during loading of sample bank %s", e.what(), filename.c_str()); @@ -281,7 +281,7 @@ void CSampleBank::load(bool async) // Warn the sound bank that the sample are available. CSoundBank::instance()->bufferLoaded(sampleName, ibuffer); } - catch (ESoundDriver &e) + catch (const ESoundDriver &e) { if (ibuffer != NULL) { delete ibuffer; diff --git a/code/nel/src/sound/sample_bank_manager.cpp b/code/nel/src/sound/sample_bank_manager.cpp index 26b55b25d..374775972 100644 --- a/code/nel/src/sound/sample_bank_manager.cpp +++ b/code/nel/src/sound/sample_bank_manager.cpp @@ -36,7 +36,7 @@ using namespace NLMISC; namespace NLSOUND { -CSampleBankManager::CSampleBankManager(CAudioMixerUser *audioMixer) : m_AudioMixer(audioMixer), m_LoadedSize(NULL) +CSampleBankManager::CSampleBankManager(CAudioMixerUser *audioMixer) : m_AudioMixer(audioMixer), m_LoadedSize(0) { } diff --git a/code/nel/tools/3d/anim_builder/anim_builder.cpp b/code/nel/tools/3d/anim_builder/anim_builder.cpp index f210e49a9..e8ec3001e 100644 --- a/code/nel/tools/3d/anim_builder/anim_builder.cpp +++ b/code/nel/tools/3d/anim_builder/anim_builder.cpp @@ -103,7 +103,7 @@ int main(int argc, char* argv[]) animationOptimizer.addLowPrecisionTrack(anim_low_precision_tracks.asString(lpt)); } } - catch(EUnknownVar &) + catch(const EUnknownVar &) { nlwarning("\"anim_low_precision_tracks\" not found in the parameter file. Add \"Finger\" and \"Ponytail\" by default"); animationOptimizer.addLowPrecisionTrack("Finger"); @@ -126,7 +126,7 @@ int main(int argc, char* argv[]) animationOptimizer.setSampleFrameRate(sr); } } - catch(EUnknownVar &) + catch(const EUnknownVar &) { nlwarning("\"anim_sample_rate\" not found in the parameter file. Use Default of 30 fps."); animationOptimizer.setSampleFrameRate(30); @@ -198,7 +198,7 @@ int main(int argc, char* argv[]) nlinfo("Anim skipped: %4d", numSkipped); } - catch (Exception& except) + catch (const Exception& except) { // Error message nlwarning ("ERROR %s\n", except.what()); diff --git a/code/nel/tools/3d/animation_set_builder/animation_set_builder.cpp b/code/nel/tools/3d/animation_set_builder/animation_set_builder.cpp index b5e35a9e3..a423d7ff8 100644 --- a/code/nel/tools/3d/animation_set_builder/animation_set_builder.cpp +++ b/code/nel/tools/3d/animation_set_builder/animation_set_builder.cpp @@ -124,7 +124,7 @@ int main(int argc, char* argv[]) return -1; } } - catch (Exception& e) + catch (const Exception& e) { // Error message fprintf (stderr, "Error: %s\n", e.what()); diff --git a/code/nel/tools/3d/build_clod_bank/build_clod_bank.cpp b/code/nel/tools/3d/build_clod_bank/build_clod_bank.cpp index 332e7ebad..2caf5c235 100644 --- a/code/nel/tools/3d/build_clod_bank/build_clod_bank.cpp +++ b/code/nel/tools/3d/build_clod_bank/build_clod_bank.cpp @@ -173,7 +173,7 @@ int main(int argc, char *argv[]) // NB: the key name here is the entire file, with the .anim, for easier georges editing. lodBuilder.addAnim(animFileName.c_str(), anim, bakeFrameRate); } - catch(EPathNotFound &) + catch(const EPathNotFound &) { printf("ERROR anim not found %s\n", animFileName.c_str()); delete anim; @@ -186,7 +186,7 @@ int main(int argc, char *argv[]) uint32 shapeId= lodShapeBank.addShape(); *lodShapeBank.getShapeFullAcces(shapeId)= lodBuilder.getLodShape(); } - catch(EUnknownVar &evar) + catch(const EUnknownVar &evar) { nlwarning(evar.what()); // Any other exception will make the program quit. @@ -205,7 +205,7 @@ int main(int argc, char *argv[]) oFile.serial(lodShapeBank); oFile.close(); } - catch (Exception& except) + catch (const Exception& except) { // Error message printf ("ERROR %s.\n Aborting.\n", except.what()); diff --git a/code/nel/tools/3d/build_clodtex/main.cpp b/code/nel/tools/3d/build_clodtex/main.cpp index d92a8f7d2..0d43479dc 100644 --- a/code/nel/tools/3d/build_clodtex/main.cpp +++ b/code/nel/tools/3d/build_clodtex/main.cpp @@ -100,7 +100,7 @@ bool computeOneShape(const char *lodFile, const char *shapeIn, const char *shape COFile dbgF("testDBG.tga"); dbg.writeTGA(dbgF, 32);*/ } - catch(Exception &e) + catch(const Exception &e) { nlwarning("ERROR: %s", e.what()); return false; @@ -179,7 +179,7 @@ int main(int argc, char *argv[]) LodFilters[i]= var.asString(i*2+1); } } - catch(Exception &e) + catch(const Exception &e) { // It is not an error to have a bad config file: files will be copied nlwarning(e.what()); diff --git a/code/nel/tools/3d/build_coarse_mesh/build_coarse_mesh.cpp b/code/nel/tools/3d/build_coarse_mesh/build_coarse_mesh.cpp index 236c2727e..854e7bc18 100644 --- a/code/nel/tools/3d/build_coarse_mesh/build_coarse_mesh.cpp +++ b/code/nel/tools/3d/build_coarse_mesh/build_coarse_mesh.cpp @@ -255,12 +255,12 @@ int main(int argc, char* argv[]) nlwarning ("WARNING no coarse mesh to compute, abort.\n"); } } - catch (EConfigFile &e) + catch (const EConfigFile &e) { // Something goes wrong... catch that nlwarning ("ERROR %s\n", e.what ()); } - catch (Exception &e) + catch (const Exception &e) { // Something goes wrong... catch that nlwarning ("ERROR %s\n", e.what ()); diff --git a/code/nel/tools/3d/build_far_bank/build_far_bank.cpp b/code/nel/tools/3d/build_far_bank/build_far_bank.cpp index be8b48e0e..db49575a7 100644 --- a/code/nel/tools/3d/build_far_bank/build_far_bank.cpp +++ b/code/nel/tools/3d/build_far_bank/build_far_bank.cpp @@ -120,7 +120,7 @@ bool fillTileFar (uint tile, const char* sName, CTileFarBank::TFarType type, CTi // Ok. return true; } - catch (Exception& except) + catch (const Exception& except) { nlwarning ("ERROR %s\n", except.what()); } @@ -409,7 +409,7 @@ int main (int argc, char **argv) nlwarning ("ERROR Can't open file %s for writing\n", argv[2]); } } - catch (Exception& except) + catch (const Exception& except) { nlwarning ("ERROR %s\n", except.what()); } diff --git a/code/nel/tools/3d/build_interface/main.cpp b/code/nel/tools/3d/build_interface/main.cpp index b9e9b44f3..40627bab8 100644 --- a/code/nel/tools/3d/build_interface/main.cpp +++ b/code/nel/tools/3d/build_interface/main.cpp @@ -267,7 +267,7 @@ int main(int nNbArg, char **ppArgs) pBtmp->load(inFile); AllMaps[i] = pBtmp; } - catch (NLMISC::Exception &e) + catch (const NLMISC::Exception &e) { outString (string("ERROR :") + e.what()); return -1; diff --git a/code/nel/tools/3d/build_smallbank/build_smallbank.cpp b/code/nel/tools/3d/build_smallbank/build_smallbank.cpp index 45e995427..888799579 100644 --- a/code/nel/tools/3d/build_smallbank/build_smallbank.cpp +++ b/code/nel/tools/3d/build_smallbank/build_smallbank.cpp @@ -70,7 +70,7 @@ int main(int argc, char* argv[]) } } - catch (Exception& e) + catch (const Exception& e) { // Error nlwarning ("ERROR fatal error: %s", e.what()); diff --git a/code/nel/tools/3d/cluster_viewer/view_cs.cpp b/code/nel/tools/3d/cluster_viewer/view_cs.cpp index bed6a7518..6e19af2f0 100644 --- a/code/nel/tools/3d/cluster_viewer/view_cs.cpp +++ b/code/nel/tools/3d/cluster_viewer/view_cs.cpp @@ -94,7 +94,7 @@ CInstanceGroup* LoadInstanceGroup(const char* sFilename) newIG->serial (file); // All is good } - catch (Exception &) + catch (const Exception &) { // Cannot save the file delete newIG; diff --git a/code/nel/tools/3d/file_info/main.cpp b/code/nel/tools/3d/file_info/main.cpp index 4a14a43c9..306a7fc74 100644 --- a/code/nel/tools/3d/file_info/main.cpp +++ b/code/nel/tools/3d/file_info/main.cpp @@ -331,9 +331,9 @@ void displayInfoFileInStream(FILE *logStream, const char *fileName, const setserial (file); } - catch (Exception &) + catch (const Exception &) { delete newIG; return NULL; @@ -62,7 +62,7 @@ bool SaveInstanceGroup (const char* sFilename, CInstanceGroup *pIG) { pIG->serial (file); } - catch (Exception &) + catch (const Exception &) { return false; } diff --git a/code/nel/tools/3d/ig_elevation/main.cpp b/code/nel/tools/3d/ig_elevation/main.cpp index f0044b651..988cde08e 100644 --- a/code/nel/tools/3d/ig_elevation/main.cpp +++ b/code/nel/tools/3d/ig_elevation/main.cpp @@ -106,7 +106,7 @@ struct SExportOptions CConfigFile::CVar &cvLandFile = cf.getVar("LandFile"); LandFile = cvLandFile.asString(); } - catch (EConfigFile &e) + catch (const EConfigFile &e) { string sTmp = string("ERROR : Error in config file : ") + e.what() + "\n"; outString (sTmp); @@ -173,7 +173,7 @@ CZoneRegion *loadLand (const string &filename) outString (sTmp); } } - catch (Exception& e) + catch (const Exception& e) { string sTmp = string("Error in land file : ") + e.what(); outString (sTmp); @@ -194,7 +194,7 @@ CInstanceGroup* LoadInstanceGroup (const char* sFilename) { newIG->serial (file); } - catch (Exception &) + catch (const Exception &) { // Cannot save the file delete newIG; @@ -220,7 +220,7 @@ void SaveInstanceGroup (const char* sFilename, CInstanceGroup *pIG) { pIG->serial (file); } - catch (Exception &e) + catch (const Exception &e) { outString(string(e.what())); } @@ -339,7 +339,7 @@ int main(int nNbArg, char**ppArgs) HeightMap1 = NULL; } } - catch (Exception &e) + catch (const Exception &e) { string sTmp = string("Cant load height map : ") + options.HeightMapFile1 + " : " + e.what(); outString (sTmp); @@ -365,7 +365,7 @@ int main(int nNbArg, char**ppArgs) HeightMap2 = NULL; } } - catch (Exception &e) + catch (const Exception &e) { string sTmp = string("Cant load height map : ") + options.HeightMapFile2 + " : " + e.what() + "\n"; outString (sTmp); diff --git a/code/nel/tools/3d/ig_info/ig_info.cpp b/code/nel/tools/3d/ig_info/ig_info.cpp index 8de0bcf19..7a765a89c 100644 --- a/code/nel/tools/3d/ig_info/ig_info.cpp +++ b/code/nel/tools/3d/ig_info/ig_info.cpp @@ -83,7 +83,7 @@ int main(int argc, char **argv) printf("TotalCells: %d\n", totalCells); } - catch (std::exception &e) + catch (const std::exception &e) { printf("%s\n", e.what()); } diff --git a/code/nel/tools/3d/ig_lighter/ig_lighter.cpp b/code/nel/tools/3d/ig_lighter/ig_lighter.cpp index f1c30fc20..2a6508399 100644 --- a/code/nel/tools/3d/ig_lighter/ig_lighter.cpp +++ b/code/nel/tools/3d/ig_lighter/ig_lighter.cpp @@ -344,7 +344,7 @@ int main(int argc, char* argv[]) } } - catch (Exception& except) + catch (const Exception& except) { // Error message nlwarning ("ERROR %s\n", except.what()); diff --git a/code/nel/tools/3d/lightmap_optimizer/main.cpp b/code/nel/tools/3d/lightmap_optimizer/main.cpp index 528d85014..7cae0b5f9 100644 --- a/code/nel/tools/3d/lightmap_optimizer/main.cpp +++ b/code/nel/tools/3d/lightmap_optimizer/main.cpp @@ -365,7 +365,7 @@ int main(int nNbArg, char **ppArgs) CMeshBase *pMB = dynamic_cast(mesh.getShapePointer()); AllShapes.push_back (pMB); } - catch (NLMISC::EPathNotFound &e) + catch (const NLMISC::EPathNotFound &e) { outString(string("ERROR: shape not found ")+AllShapeNames[nShp]+" - "+e.what()); return -1; @@ -529,7 +529,7 @@ int main(int nNbArg, char **ppArgs) inFile.open(sTmp2); CBitmap::loadSize(inFile, wRef, hRef); } - catch (NLMISC::Exception &e) + catch (const NLMISC::Exception &e) { outString (string("ERROR :") + e.what()); return -1; @@ -546,7 +546,7 @@ int main(int nNbArg, char **ppArgs) inFile.open(sTmp3); CBitmap::loadSize(inFile, wCur, hCur); } - catch (NLMISC::Exception &) + catch (const NLMISC::Exception &) { } @@ -595,7 +595,7 @@ int main(int nNbArg, char **ppArgs) pBtmp->load(inFile); AllLightmaps[i] = pBtmp; } - catch (NLMISC::Exception &e) + catch (const NLMISC::Exception &e) { outString (string("ERROR :") + e.what()); return -1; @@ -671,7 +671,7 @@ int main(int nNbArg, char **ppArgs) BitmapJ.load (inFile); inFile.close (); } - catch (NLMISC::Exception &e) + catch (const NLMISC::Exception &e) { outString (string("ERROR :") + e.what()); return -1; @@ -883,7 +883,7 @@ int main(int nNbArg, char **ppArgs) meshfile.close (); } } - catch (NLMISC::EPathNotFound &e) + catch (const NLMISC::EPathNotFound &e) { outString(string("ERROR: cannot save shape ")+AllShapeNames[k]+" - "+e.what()); return -1; diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core.qrc b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core.qrc index a4c87d29c..68b6ad141 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core.qrc +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core.qrc @@ -1,6 +1,8 @@ icons/ic_nel_add_item.png + icons/ic_nel_redo.png + icons/ic_nel_undo.png icons/ic_nel_crash.png icons/ic_nel_delete_item.png icons/ic_nel_down_item.png diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core_constants.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core_constants.h index 7f0b5cd15..be6e666a7 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core_constants.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core_constants.h @@ -23,10 +23,10 @@ namespace Core namespace Constants { -const char * const OVQT_VERSION_LONG = "0.0.1"; +const char * const OVQT_VERSION_LONG = "0.1"; const char * const OVQT_VENDOR = "Ryzom Core"; const char * const OVQT_YEAR = "2010, 2011"; -const char * const OVQT_CORE_PLUGIN = "Core"; +const char * const OVQT_CORE_PLUGIN = "Core"; //mainwindow const char * const MAIN_WINDOW = "ObjectViewerQt.MainWindow"; @@ -43,12 +43,26 @@ const char * const M_TOOLS = "ObjectViewerQt.Menu.Tools"; const char * const M_WINDOW = "ObjectViewerQt.Menu.Window"; const char * const M_HELP = "ObjectViewerQt.Menu.Help"; +const char * const M_FILE_RECENTFILES = "ObjectViewerQt.Menu.File.RecentFiles"; const char * const M_SHEET = "ObjectViewerQt.Menu.Sheet"; //actions const char * const NEW = "ObjectViewerQt.New"; -const char * const OPEN = "ObjectViewerQt.Open"; -const char * const EXIT = "ObjectViewerQt.Exit"; +const char * const OPEN = "ObjectViewerQt.Open"; +const char * const SAVE = "ObjectViewerQt.Save"; +const char * const SAVE_AS = "ObjectViewerQt.SaveAs"; +const char * const SAVE_ALL = "ObjectViewerQt.SaveAll"; +const char * const EXIT = "ObjectViewerQt.Exit"; + +const char * const UNDO = "ObjectViewerQt.Undo"; +const char * const REDO = "ObjectViewerQt.Redo"; +const char * const CUT = "ObjectViewerQt.Cut"; +const char * const COPY = "ObjectViewerQt.Copy"; +const char * const PASTE = "ObjectViewerQt.Paste"; +const char * const DEL = "ObjectViewerQt.Del"; +const char * const FIND = "ObjectViewerQt.Find"; +const char * const SELECT_ALL = "ObjectViewerQt.SelectAll"; +const char * const GOTO_POS = "ObjectViewerQt.Goto"; const char * const SETTINGS = "ObjectViewerQt.Settings"; const char * const TOGGLE_FULLSCREEN = "ObjectViewerQt.ToggleFullScreen"; @@ -96,6 +110,8 @@ const char * const ICON_NEW = ":/core/icons/ic_nel_new.png"; const char * const ICON_SAVE = ":/core/icons/ic_nel_save.png"; const char * const ICON_SAVE_AS = ":/core/icons/ic_nel_save_as.png"; const char * const ICON_CRASH = ":/core/icons/ic_nel_crash.png"; +const char * const ICON_UNDO = ":/core/icons/ic_nel_undo.png"; +const char * const ICON_REDO = ":/core/icons/ic_nel_redo.png"; } // namespace Constants } // namespace Core diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/icons/ic_nel_redo.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/icons/ic_nel_redo.png new file mode 100644 index 0000000000000000000000000000000000000000..19ccf20f1e6d0af54458fb9bdb52c0c4f260bb29 GIT binary patch literal 4694 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 +#include #include namespace Core @@ -57,8 +58,15 @@ MainWindow::MainWindow(ExtensionSystem::IPluginManager *pluginManager, QWidget * m_settings = m_pluginManager->settings(); m_coreImpl = new CoreImpl(this); +#ifdef Q_WS_MAC + m_menuBar = new QMenuBar(0); +#else + m_menuBar = new QMenuBar(this); + setMenuBar(m_menuBar); +#endif + m_menuManager = new MenuManager(this); - m_menuManager->setMenuBar(menuBar()); + m_menuManager->setMenuBar(m_menuBar); m_tabWidget = new QTabWidget(this); m_tabWidget->setTabPosition(QTabWidget::South); @@ -98,11 +106,11 @@ bool MainWindow::initialize(QString *errorString) void MainWindow::extensionsInitialized() { - readSettings(); - connect(m_contextManager, SIGNAL(currentContextChanged(Core::IContext*)), - this, SLOT(updateContext(Core::IContext*))); - if (m_contextManager->currentContext() != NULL) - updateContext(m_contextManager->currentContext()); + readSettings(); + connect(m_contextManager, SIGNAL(currentContextChanged(Core::IContext*)), + this, SLOT(updateContext(Core::IContext*))); + if (m_contextManager->currentContext() != NULL) + updateContext(m_contextManager->currentContext()); show(); } @@ -141,6 +149,56 @@ void MainWindow::open() m_contextManager->currentContext()->open(); } +void MainWindow::newFile() +{ +} + +void MainWindow::save() +{ +} + +void MainWindow::saveAs() +{ +} + +void MainWindow::saveAll() +{ +} + +void MainWindow::cut() +{ +} + +void MainWindow::copy() +{ +} + +void MainWindow::paste() +{ +} + +void MainWindow::del() +{ +} + +void MainWindow::find() +{ +} + +void MainWindow::gotoPos() +{ +} + +void MainWindow::setFullScreen(bool enabled) +{ + if (bool(windowState() & Qt::WindowFullScreen) == enabled) + return; + if (enabled) + setWindowState(windowState() | Qt::WindowFullScreen); + else + setWindowState(windowState() & ~Qt::WindowFullScreen); +} + bool MainWindow::showOptionsDialog(const QString &group, const QString &page, QWidget *parent) @@ -186,6 +244,13 @@ void MainWindow::closeEvent(QCloseEvent *event) void MainWindow::createActions() { + m_newAction = new QAction(tr("&New"), this); + m_newAction->setIcon(QIcon(Constants::ICON_NEW)); + m_newAction->setShortcut(QKeySequence::New); + menuManager()->registerAction(m_newAction, Constants::NEW); + connect(m_newAction, SIGNAL(triggered()), this, SLOT(newFile())); + m_newAction->setEnabled(false); + m_openAction = new QAction(tr("&Open..."), this); m_openAction->setIcon(QIcon(Constants::ICON_OPEN)); m_openAction->setShortcut(QKeySequence::Open); @@ -193,12 +258,80 @@ void MainWindow::createActions() menuManager()->registerAction(m_openAction, Constants::OPEN); connect(m_openAction, SIGNAL(triggered()), this, SLOT(open())); + m_saveAction = new QAction(tr("&Save"), this); + m_saveAction->setIcon(QIcon(Constants::ICON_SAVE)); + m_saveAction->setShortcut(QKeySequence::Save); + menuManager()->registerAction(m_saveAction, Constants::SAVE); + connect(m_saveAction, SIGNAL(triggered()), this, SLOT(save())); + m_saveAction->setEnabled(false); + + m_saveAsAction = new QAction(tr("Save &As..."), this); + m_saveAsAction->setIcon(QIcon(Constants::ICON_SAVE_AS)); + m_saveAsAction->setShortcut(QKeySequence::SaveAs); + menuManager()->registerAction(m_saveAsAction, Constants::SAVE_AS); + connect(m_saveAsAction, SIGNAL(triggered()), this, SLOT(saveAs())); + m_saveAsAction->setEnabled(false); + + m_saveAllAction = new QAction(tr("&Save A&ll"), this); + m_saveAllAction->setShortcut(QKeySequence::SelectAll); + menuManager()->registerAction(m_saveAllAction, Constants::SAVE_ALL); + connect(m_saveAllAction, SIGNAL(triggered()), this, SLOT(saveAll())); + m_saveAllAction->setEnabled(false); + m_exitAction = new QAction(tr("E&xit"), this); m_exitAction->setShortcut(QKeySequence(tr("Ctrl+Q"))); m_exitAction->setStatusTip(tr("Exit the application")); menuManager()->registerAction(m_exitAction, Constants::EXIT); connect(m_exitAction, SIGNAL(triggered()), this, SLOT(close())); + m_cutAction = new QAction(tr("Cu&t"), this); + m_cutAction->setShortcut(QKeySequence::Cut); + menuManager()->registerAction(m_cutAction, Constants::CUT); + connect(m_cutAction, SIGNAL(triggered()), this, SLOT(cut())); + m_cutAction->setEnabled(false); + + m_copyAction = new QAction(tr("&Copy"), this); + m_copyAction->setShortcut(QKeySequence::Copy); + menuManager()->registerAction(m_copyAction, Constants::COPY); + connect(m_copyAction, SIGNAL(triggered()), this, SLOT(copy())); + m_copyAction->setEnabled(false); + + m_pasteAction = new QAction(tr("&Paste"), this); + m_pasteAction->setShortcut(QKeySequence::Paste); + menuManager()->registerAction(m_pasteAction, Constants::PASTE); + connect(m_pasteAction, SIGNAL(triggered()), this, SLOT(paste())); + m_pasteAction->setEnabled(false); + + m_delAction = new QAction(tr("&Delete"), this); + m_delAction->setShortcut(QKeySequence::Delete); + menuManager()->registerAction(m_delAction, Constants::DEL); + connect(m_delAction, SIGNAL(triggered()), this, SLOT(del())); + m_delAction->setEnabled(false); + + m_selectAllAction = new QAction(tr("Select &All"), this); + m_selectAllAction->setShortcut(QKeySequence::SelectAll); + menuManager()->registerAction(m_selectAllAction, Constants::SELECT_ALL); + connect(m_selectAllAction, SIGNAL(triggered()), this, SLOT(selectAll())); + m_selectAllAction->setEnabled(false); + + m_findAction = new QAction(tr("&Find"), this); + m_findAction->setShortcut(QKeySequence::Find); + menuManager()->registerAction(m_findAction, Constants::FIND); + connect(m_findAction, SIGNAL(triggered()), this, SLOT(find())); + m_findAction->setEnabled(false); + + m_gotoAction = new QAction(tr("&Go To.."), this); + m_gotoAction->setShortcut(QKeySequence(tr("Ctrl+G"))); + menuManager()->registerAction(m_gotoAction, Constants::GOTO_POS); + connect(m_gotoAction, SIGNAL(triggered()), this, SLOT(gotoPos())); + m_gotoAction->setEnabled(false); + + m_fullscreenAction = new QAction(tr("Fullscreen"), this); + m_fullscreenAction->setCheckable(true); + m_fullscreenAction->setShortcut(QKeySequence(tr("Ctrl+Shift+F11"))); + menuManager()->registerAction(m_fullscreenAction, Constants::TOGGLE_FULLSCREEN); + connect(m_fullscreenAction, SIGNAL(triggered(bool)), this, SLOT(setFullScreen(bool))); + m_settingsAction = new QAction(tr("&Settings"), this); m_settingsAction->setIcon(QIcon(":/images/preferences.png")); m_settingsAction->setShortcut(QKeySequence::Preferences); @@ -232,22 +365,53 @@ void MainWindow::createActions() void MainWindow::createMenus() { - m_fileMenu = menuBar()->addMenu(tr("&File")); + m_fileMenu = m_menuBar->addMenu(tr("&File")); menuManager()->registerMenu(m_fileMenu, Constants::M_FILE); + m_fileMenu->addAction(m_newAction); m_fileMenu->addAction(m_openAction); + m_fileMenu->addSeparator(); + m_fileMenu->addAction(m_saveAction); + m_fileMenu->addAction(m_saveAsAction); + m_fileMenu->addAction(m_saveAllAction); + m_fileMenu->addSeparator(); + + m_recentFilesMenu = m_fileMenu->addMenu(tr("Recent &Files")); + m_recentFilesMenu->setEnabled(false); + menuManager()->registerMenu(m_recentFilesMenu, Constants::M_FILE_RECENTFILES); + m_fileMenu->addSeparator(); m_fileMenu->addAction(m_exitAction); - m_editMenu = menuBar()->addMenu(tr("&Edit")); - m_editMenu->addAction(m_undoGroup->createUndoAction(this)); - m_editMenu->addAction(m_undoGroup->createRedoAction(this)); + m_editMenu = m_menuBar->addMenu(tr("&Edit")); + QAction *undoAction = m_undoGroup->createUndoAction(this); + menuManager()->registerAction(undoAction, Constants::UNDO); + undoAction->setIcon(QIcon(Constants::ICON_UNDO)); + undoAction->setShortcut(QKeySequence::Undo); + QAction *redoAction = m_undoGroup->createRedoAction(this); + menuManager()->registerAction(redoAction, Constants::REDO); + redoAction->setIcon(QIcon(Constants::ICON_REDO)); + redoAction->setShortcut(QKeySequence::Redo); + m_editMenu->addAction(undoAction); + m_editMenu->addAction(redoAction); + m_editMenu->addSeparator(); + m_editMenu->addAction(m_cutAction); + m_editMenu->addAction(m_copyAction); + m_editMenu->addAction(m_pasteAction); + m_editMenu->addAction(m_delAction); + m_editMenu->addSeparator(); + m_editMenu->addAction(m_selectAllAction); + m_editMenu->addSeparator(); + m_editMenu->addAction(m_findAction); + m_editMenu->addAction(m_gotoAction); menuManager()->registerMenu(m_editMenu, Constants::M_EDIT); - m_viewMenu = menuBar()->addMenu(tr("&View")); + m_viewMenu = m_menuBar->addMenu(tr("&View")); + m_viewMenu->addAction(m_fullscreenAction); + m_viewMenu->addAction(m_dockWidget->toggleViewAction()); menuManager()->registerMenu(m_viewMenu, Constants::M_VIEW); - m_toolsMenu = menuBar()->addMenu(tr("&Tools")); + m_toolsMenu = m_menuBar->addMenu(tr("&Tools")); menuManager()->registerMenu(m_toolsMenu, Constants::M_TOOLS); m_sheetMenu = m_toolsMenu->addMenu(tr("&Sheet")); @@ -257,9 +421,9 @@ void MainWindow::createMenus() m_toolsMenu->addAction(m_settingsAction); - menuBar()->addSeparator(); + m_menuBar->addSeparator(); - m_helpMenu = menuBar()->addMenu(tr("&Help")); + m_helpMenu = m_menuBar->addMenu(tr("&Help")); menuManager()->registerMenu(m_helpMenu, Constants::M_HELP); m_helpMenu->addAction(m_aboutAction); m_helpMenu->addAction(m_aboutQtAction); @@ -274,6 +438,13 @@ void MainWindow::createStatusBar() void MainWindow::createDialogs() { m_pluginView = new ExtensionSystem::CPluginView(m_pluginManager, this); + + // Create undo/redo command list + m_dockWidget = new QDockWidget("Command List", this); + m_dockWidget->setObjectName(QString::fromUtf8("UndoRedoCommandDockWidget")); + QUndoView *undoView = new QUndoView(m_undoGroup, m_dockWidget); + m_dockWidget->setWidget(undoView); + addDockWidget(Qt::RightDockWidgetArea, m_dockWidget); } void MainWindow::readSettings() diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/main_window.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/main_window.h index 74ec08957..d594692ee 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/main_window.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/main_window.h @@ -66,6 +66,17 @@ public Q_SLOTS: private Q_SLOTS: void open(); + void newFile(); + void save(); + void saveAs(); + void saveAll(); + void cut(); + void copy(); + void paste(); + void del(); + void find(); + void gotoPos(); + void setFullScreen(bool enabled); void about(); void updateContext(Core::IContext *context); @@ -90,6 +101,7 @@ private: QPalette m_originalPalette; QString m_lastDir; + QDockWidget *m_dockWidget; QUndoGroup *m_undoGroup; QSettings *m_settings; @@ -99,15 +111,28 @@ private: QTabWidget *m_tabWidget; QMenu *m_fileMenu; + QMenu *m_recentFilesMenu; QMenu *m_editMenu; QMenu *m_viewMenu; QMenu *m_toolsMenu; QMenu *m_helpMenu; - + QMenuBar *m_menuBar; QMenu *m_sheetMenu; + QAction *m_newAction; QAction *m_openAction; + QAction *m_saveAction; + QAction *m_saveAsAction; + QAction *m_saveAllAction; QAction *m_exitAction; + QAction *m_cutAction; + QAction *m_copyAction; + QAction *m_pasteAction; + QAction *m_delAction; + QAction *m_selectAllAction; + QAction *m_findAction; + QAction *m_gotoAction; + QAction *m_fullscreenAction; QAction *m_settingsAction; QAction *m_pluginViewAction; QAction *m_aboutAction; diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/example/plugin1.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/example/plugin1.cpp index cde1ca199..f218c3230 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/example/plugin1.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/example/plugin1.cpp @@ -90,7 +90,6 @@ QStringList MyPlugin::dependencies() const { QStringList list; list.append(Core::Constants::OVQT_CORE_PLUGIN); - list.append("ObjectViewer"); return list; } diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.cpp index dd8a4bb1e..e1962cf5b 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.cpp @@ -239,12 +239,6 @@ void CMainWindow::updateStatusBar() void CMainWindow::createActions() { - _openAction = new QAction(tr("&Open..."), this); - _openAction->setIcon(QIcon(Core::Constants::ICON_OPEN)); - _openAction->setShortcut(QKeySequence::Open); - _openAction->setStatusTip(tr("Open an existing file")); - connect(_openAction, SIGNAL(triggered()), this, SLOT(open())); - _setBackColorAction = _GraphicsViewport->createSetBackgroundColor(this); _setBackColorAction->setText(tr("Set &background color")); _setBackColorAction->setIcon(QIcon(Constants::ICON_BGCOLOR)); @@ -259,7 +253,7 @@ void CMainWindow::createActions() connect(_reloadTexturesAction, SIGNAL(triggered()), this, SLOT(reloadTextures())); _saveScreenshotAction = _GraphicsViewport->createSaveScreenshotAction(this); - _saveScreenshotAction->setText(tr("Save &Screenshot")); + _saveScreenshotAction->setText(tr("Save Screenshot")); _saveScreenshotAction->setStatusTip(tr("Make a screenshot of the current viewport and save")); } @@ -267,14 +261,7 @@ void CMainWindow::createMenus() { Core::IMenuManager *menuManager = Core::ICore::instance()->menuManager(); - // register actions for file menu - menuManager->registerAction(_openAction, "ObjectViewer.File.Open"); - - // add actions in file menu - QMenu *fileMenu = menuManager->menu(Core::Constants::M_FILE); - QAction *exitAction = menuManager->action(Core::Constants::EXIT); - //fileMenu->insertAction(exitAction, _openAction); - //fileMenu->insertSeparator(exitAction); + _openAction = menuManager->action(Core::Constants::OPEN); // register actions for view menu menuManager->registerAction(_setBackColorAction, "ObjectViewer.View.SetBackgroundColor"); diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_main_window.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_main_window.cpp index 1bd91f667..01086f231 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_main_window.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_main_window.cpp @@ -77,7 +77,7 @@ ZonePainterMainWindow::ZonePainterMainWindow(QWidget *parent) : Core::ICore::instance()->mainWindow()->statusBar()->addPermanentWidget(m_statusInfo); - + m_undoStack = new QUndoStack(this); } void ZonePainterMainWindow::showEvent(QShowEvent *showEvent) diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_main_window.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_main_window.h index d55eb39e5..0dbfd9948 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_main_window.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_main_window.h @@ -5,6 +5,7 @@ #include #include #include +#include namespace NLQT { class QNLWidget; @@ -26,7 +27,7 @@ public: void loadConfig(); void saveConfig(); - + QUndoStack *getUndoStack() { return m_undoStack; } public Q_SLOTS: void setToolMode(int value); void setToolMode(); @@ -49,7 +50,7 @@ private: QAction *_toolSelectModeAction; QAction *_toolPickModeAction; QMenu *_toolModeMenu; - + QUndoStack *m_undoStack; //QAction *m_setBackColorAction; }; diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_plugin.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_plugin.cpp index 7b8237ccb..9ccfb9053 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_plugin.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_plugin.cpp @@ -19,6 +19,8 @@ namespace Plugin { + NLMISC_SAFE_SINGLETON_IMPL(CZoneManager) + ZonePainterPlugin::~ZonePainterPlugin() { Q_FOREACH(QObject *obj, _autoReleaseObjects) diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_plugin.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_plugin.h index aeae39ba6..2c1dff53e 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_plugin.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_plugin.h @@ -7,10 +7,12 @@ #include "zone_painter_main_window.h" // NeL includes -#include "nel/misc/app_context.h" +#include +#include #include #include #include +#include // Qt includes #include @@ -29,16 +31,15 @@ class IPluginSpec; namespace Plugin { - class CZoneManager { + class CZoneManager + { + NLMISC_SAFE_SINGLETON_DECL(CZoneManager) public: - NL3D::CZone zone; - - std::string getZoneInfo() { - NL3D::CZone zone; - zone.getNumPatchs(); - - return ""; - } + //m_painterLandscape = static_cast + + private: + NL3D::CLandscapeModel *m_painterLandscape; + NL3D::CZone *m_currentZone; }; class ZonePainterPlugin : public QObject, public ExtensionSystem::IPlugin @@ -79,28 +80,38 @@ class CZonePainterContext: public Core::IContext { Q_OBJECT public: - CZonePainterContext(QObject *parent = 0): IContext(parent) - { - m_zonePainterMainWindow = new ZonePainterMainWindow(); - } - virtual ~CZonePainterContext() {} - - virtual QString id() const - { - return QLatin1String("ZonePainterContext"); - } - virtual QString trName() const - { - return tr("Zone Painter"); - } - virtual QIcon icon() const - { - return QIcon(); - } - virtual QWidget *widget() - { - return m_zonePainterMainWindow; - } + CZonePainterContext(QObject *parent = 0): IContext(parent) + { + m_zonePainterMainWindow = new ZonePainterMainWindow(); + } + virtual ~CZonePainterContext() {} + + virtual QString id() const + { + return QLatin1String("ZonePainterContext"); + } + virtual QString trName() const + { + return tr("Zone Painter"); + } + virtual QIcon icon() const + { + return QIcon(); + } + virtual QWidget *widget() + { + return m_zonePainterMainWindow; + } + + virtual QUndoStack *undoStack() + { + return m_zonePainterMainWindow->getUndoStack(); + } + virtual void open() + { + } + + ZonePainterMainWindow *m_zonePainterMainWindow; }; diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_settings_page.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_settings_page.cpp index 69c4e7525..e59f76da1 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_settings_page.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_settings_page.cpp @@ -53,6 +53,11 @@ QString CZonePainterSettingsPage::trCategory() const return tr("General"); } +QIcon CZonePainterSettingsPage::categoryIcon() const +{ + return QIcon(); +} + QWidget *CZonePainterSettingsPage::createPage(QWidget *parent) { _currentPage = new QWidget(parent); @@ -64,4 +69,4 @@ void CZonePainterSettingsPage::apply() { } -} /* namespace Plugin */ \ No newline at end of file +} /* namespace Plugin */ diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_settings_page.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_settings_page.h index 8e4b3f3d6..d84b117eb 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_settings_page.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_settings_page.h @@ -43,6 +43,7 @@ public: virtual QString trName() const; virtual QString category() const; virtual QString trCategory() const; + QIcon categoryIcon() const; virtual QWidget *createPage(QWidget *parent); virtual void apply(); diff --git a/code/nel/tools/3d/panoply_maker/panoply_maker.cpp b/code/nel/tools/3d/panoply_maker/panoply_maker.cpp index 9f51d86f7..6be9590c2 100644 --- a/code/nel/tools/3d/panoply_maker/panoply_maker.cpp +++ b/code/nel/tools/3d/panoply_maker/panoply_maker.cpp @@ -140,7 +140,7 @@ int main(int argc, char* argv[]) NLMISC::CPath::addSearchPath(NLMISC::CPath::standardizePath(additionnal_paths.asString(k)),true, false); } } - catch (NLMISC::EUnknownVar &) + catch (const NLMISC::EUnknownVar &) { } @@ -149,7 +149,7 @@ int main(int argc, char* argv[]) { _Path_Input_TexBases = NLMISC::CPath::standardizePath(cf.getVar ("input_path_texbase").asString()); } - catch (NLMISC::EUnknownVar &) + catch (const NLMISC::EUnknownVar &) { } @@ -158,7 +158,7 @@ int main(int argc, char* argv[]) { _Path_Input_Masks = NLMISC::CPath::standardizePath(cf.getVar ("input_path_mask").asString()); } - catch (NLMISC::EUnknownVar &) + catch (const NLMISC::EUnknownVar &) { } @@ -167,7 +167,7 @@ int main(int argc, char* argv[]) { _Path_Output_MaksOptimized = NLMISC::CPath::standardizePath(cf.getVar ("output_path_mask_optimized").asString()); } - catch (NLMISC::EUnknownVar &) + catch (const NLMISC::EUnknownVar &) { } @@ -176,7 +176,7 @@ int main(int argc, char* argv[]) { _Path_Output_Cgi = NLMISC::CPath::standardizePath(cf.getVar ("output_path_cgi").asString()); } - catch (NLMISC::EUnknownVar &) + catch (const NLMISC::EUnknownVar &) { } @@ -185,12 +185,12 @@ int main(int argc, char* argv[]) { _Path_Output_Gtm = NLMISC::CPath::standardizePath(cf.getVar ("output_path_gtm").asString()); } - catch (NLMISC::EUnknownVar &) + catch (const NLMISC::EUnknownVar &) { } } - catch (std::exception &e) + catch (const std::exception &e) { nlwarning("Panoply building failed."); nlwarning(e.what()); @@ -256,7 +256,7 @@ int main(int argc, char* argv[]) NLMISC::CPath::addSearchPath(NLMISC::CPath::standardizePath(additionnal_paths.asString(k))); } } - catch (NLMISC::EUnknownVar &) + catch (const NLMISC::EUnknownVar &) { } @@ -265,7 +265,7 @@ int main(int argc, char* argv[]) { bi.InputPath = NLMISC::CPath::standardizePath(cf.getVar ("input_path").asString()); } - catch (NLMISC::EUnknownVar &) + catch (const NLMISC::EUnknownVar &) { } @@ -274,7 +274,7 @@ int main(int argc, char* argv[]) { bi.OutputPath = NLMISC::CPath::standardizePath(cf.getVar ("output_path").asString()); } - catch (NLMISC::EUnknownVar &) + catch (const NLMISC::EUnknownVar &) { } @@ -283,7 +283,7 @@ int main(int argc, char* argv[]) { bi.HlsInfoPath = NLMISC::CPath::standardizePath(cf.getVar("hls_info_path").asString()); } - catch (NLMISC::EUnknownVar &) + catch (const NLMISC::EUnknownVar &) { bi.HlsInfoPath = "hlsInfo/"; } @@ -293,7 +293,7 @@ int main(int argc, char* argv[]) { bi.CachePath = NLMISC::CPath::standardizePath(cf.getVar ("cache_path").asString()); } - catch (NLMISC::EUnknownVar &) + catch (const NLMISC::EUnknownVar &) { } @@ -302,7 +302,7 @@ int main(int argc, char* argv[]) { bi.OutputFormat = "." + cf.getVar ("output_format").asString(); } - catch (NLMISC::EUnknownVar &) + catch (const NLMISC::EUnknownVar &) { bi.OutputFormat = ".tga"; } @@ -312,7 +312,7 @@ int main(int argc, char* argv[]) { bi.DefaultSeparator = cf.getVar ("default_separator").asString(); } - catch (NLMISC::EUnknownVar &) + catch (const NLMISC::EUnknownVar &) { bi.DefaultSeparator = '_'; } @@ -330,7 +330,7 @@ int main(int argc, char* argv[]) } } } - catch (NLMISC::EUnknownVar &) + catch (const NLMISC::EUnknownVar &) { bi.BitmapExtensions[0].resize(1); bi.BitmapExtensions[0] = bi.OutputFormat; @@ -340,14 +340,14 @@ int main(int argc, char* argv[]) { bi.LowDefShift = cf.getVar ("low_def_shift").asInt(); } - catch (NLMISC::EUnknownVar &) + catch (const NLMISC::EUnknownVar &) { // tranform 512*512 to 64*64 by default bi.LowDefShift= 3; } } - catch (std::exception &e) + catch (const std::exception &e) { nlwarning("Panoply building failed."); nlwarning(e.what()); @@ -361,7 +361,7 @@ int main(int argc, char* argv[]) { BuildColoredVersions(bi); } - catch (std::exception &e) + catch (const std::exception &e) { nlwarning("Something went wrong while building bitmap : %s", e.what()); return -1; @@ -389,7 +389,7 @@ static void validateCgiInfo() f.serialCont(temp); } - catch(std::exception &e) + catch(const std::exception &e) { nlwarning("Panoply building failed."); } @@ -491,7 +491,7 @@ static void BuildColoredVersions(const CBuildInfo &bi) //nlwarning(("No need to rebuild " + NLMISC::CFile::getFilename(files[k])).c_str()); } } - catch (std::exception &e) + catch (const std::exception &e) { nlwarning("Processing of %s failed : %s \n", files[k].c_str(), e.what()); } @@ -662,7 +662,7 @@ static void BuildColoredVersionForOneBitmap(const CBuildInfo &bi, const std::str return; } } - catch (NLMISC::Exception &) + catch (const NLMISC::Exception &) { nlwarning("File or format error with : %s. Processing next...", fileNameWithExtension.c_str()); return; @@ -743,7 +743,7 @@ static void BuildColoredVersionForOneBitmap(const CBuildInfo &bi, const std::str return; } } - catch (std::exception &e) + catch (const std::exception &e) { nlwarning("Error with : %s : %s. Aborting this bitmap processing", maskFileName.c_str(), e.what()); return; @@ -827,7 +827,7 @@ static void BuildColoredVersionForOneBitmap(const CBuildInfo &bi, const std::str nlwarning(("Couldn't open " + bi.OutputPath + outputFileName + bi.OutputFormat + " for writing").c_str()); } } - catch(NLMISC::EStream &e) + catch(const NLMISC::EStream &e) { nlwarning(("Couldn't write " + bi.OutputPath + outputFileName + bi.OutputFormat + " : " + e.what()).c_str()); } diff --git a/code/nel/tools/3d/plugin_max/nel_patch_paint/nel_patch_paint.h b/code/nel/tools/3d/plugin_max/nel_patch_paint/nel_patch_paint.h index 11b8c8ff2..944807aca 100644 --- a/code/nel/tools/3d/plugin_max/nel_patch_paint/nel_patch_paint.h +++ b/code/nel/tools/3d/plugin_max/nel_patch_paint/nel_patch_paint.h @@ -578,13 +578,16 @@ class PaintPatchData : public LocalModData { LocalModData *Clone() { return new PaintPatchData(*this); } void SetFlag(DWORD f,BOOL on) - { - if ( on ) { + { + if ( on ) + { flags|=f; - } else { - flags&=~f; - } } + else + { + flags&=~f; + } + } DWORD GetFlag(DWORD f) { return flags&f; } EPTempData *TempData(PaintPatchMod *mod); diff --git a/code/nel/tools/3d/shapes_exporter/shapes_exporter.cpp b/code/nel/tools/3d/shapes_exporter/shapes_exporter.cpp index a9cff1fc1..ad8e8ec3f 100644 --- a/code/nel/tools/3d/shapes_exporter/shapes_exporter.cpp +++ b/code/nel/tools/3d/shapes_exporter/shapes_exporter.cpp @@ -99,7 +99,7 @@ bool ShapesExporter::parseConfigFile(const string &filename) // load the config file cf.load(filename); } - catch(exception &e) + catch(const exception &e) { nlwarning("can't parse config file : %s", filename.c_str()); nlwarning(e.what()); @@ -111,7 +111,7 @@ bool ShapesExporter::parseConfigFile(const string &filename) { settings.input_path = CPath::standardizePath(cf.getVar("input_path").asString()); } - catch (EUnknownVar &) + catch (const EUnknownVar &) { } @@ -120,7 +120,7 @@ bool ShapesExporter::parseConfigFile(const string &filename) { settings.output_path = CPath::standardizePath(cf.getVar("output_path").asString()); } - catch (EUnknownVar &) + catch (const EUnknownVar &) { } @@ -129,7 +129,7 @@ bool ShapesExporter::parseConfigFile(const string &filename) { settings.output_format = cf.getVar("output_format").asString(); } - catch (NLMISC::EUnknownVar &) + catch (const NLMISC::EUnknownVar &) { settings.output_format = "jpg"; } @@ -141,7 +141,7 @@ bool ShapesExporter::parseConfigFile(const string &filename) for (uint i=0; i < (uint)search_pathes.size(); ++i) CPath::addSearchPath(CPath::standardizePath(search_pathes.asString(i))); } - catch(EUnknownVar &) + catch(const EUnknownVar &) { } @@ -152,7 +152,7 @@ bool ShapesExporter::parseConfigFile(const string &filename) for (uint i=0; i< (uint)recursive_search_pathes.size(); ++i) CPath::addSearchPath(CPath::standardizePath(recursive_search_pathes.asString(i)), true, false); } - catch(EUnknownVar &) + catch(const EUnknownVar &) { } @@ -171,7 +171,7 @@ bool ShapesExporter::parseConfigFile(const string &filename) CPath::remapExtension(extensions_remapping.asString(i), extensions_remapping.asString(i+1), true); } } - catch (EUnknownVar &) + catch (const EUnknownVar &) { } @@ -180,7 +180,7 @@ bool ShapesExporter::parseConfigFile(const string &filename) { settings.preview_format = cf.getVar("preview_format").asString(); } - catch (NLMISC::EUnknownVar &) + catch (const NLMISC::EUnknownVar &) { settings.preview_format = "jpg"; } @@ -190,7 +190,7 @@ bool ShapesExporter::parseConfigFile(const string &filename) { settings.preview_width = cf.getVar("preview_width").asInt(); } - catch (NLMISC::EUnknownVar &) + catch (const NLMISC::EUnknownVar &) { settings.preview_width = 256; } @@ -200,7 +200,7 @@ bool ShapesExporter::parseConfigFile(const string &filename) { settings.preview_height = cf.getVar("preview_height").asInt(); } - catch (NLMISC::EUnknownVar &) + catch (const NLMISC::EUnknownVar &) { settings.preview_height = 256; } @@ -210,7 +210,7 @@ bool ShapesExporter::parseConfigFile(const string &filename) { settings.preview_quality = (uint8)cf.getVar("preview_quality").asInt(); } - catch (NLMISC::EUnknownVar &) + catch (const NLMISC::EUnknownVar &) { settings.preview_quality = 90; } @@ -223,7 +223,7 @@ bool ShapesExporter::parseConfigFile(const string &filename) settings.output_background.G = (uint8)var.asInt(1); settings.output_background.B = (uint8)var.asInt(2); } - catch (EUnknownVar &) + catch (const EUnknownVar &) { settings.output_background = CRGBA::Black; } @@ -236,7 +236,7 @@ bool ShapesExporter::parseConfigFile(const string &filename) settings.light_ambiant.G = (uint8)var.asInt(1); settings.light_ambiant.B = (uint8)var.asInt(2); } - catch (EUnknownVar &) + catch (const EUnknownVar &) { settings.light_ambiant = CRGBA::White; } @@ -249,7 +249,7 @@ bool ShapesExporter::parseConfigFile(const string &filename) settings.light_diffuse.G = (uint8)var.asInt(1); settings.light_diffuse.B = (uint8)var.asInt(2); } - catch (EUnknownVar &) + catch (const EUnknownVar &) { settings.light_diffuse = CRGBA::White; } @@ -262,7 +262,7 @@ bool ShapesExporter::parseConfigFile(const string &filename) settings.light_specular.G = (uint8)var.asInt(1); settings.light_specular.B = (uint8)var.asInt(2); } - catch (EUnknownVar &) + catch (const EUnknownVar &) { settings.light_specular = CRGBA::White; } @@ -273,7 +273,7 @@ bool ShapesExporter::parseConfigFile(const string &filename) CConfigFile::CVar &var = cf.getVar("light_direction"); settings.light_direction = CVector(var.asFloat(0), var.asFloat(1), var.asFloat(2)); } - catch (EUnknownVar &) + catch (const EUnknownVar &) { settings.light_direction = CVector(0.f, 1.f, 0.f); } @@ -283,7 +283,7 @@ bool ShapesExporter::parseConfigFile(const string &filename) { settings.output_steps_z = cf.getVar("output_steps_z").asInt(); } - catch (NLMISC::EUnknownVar &) + catch (const NLMISC::EUnknownVar &) { settings.output_steps_z = 10; } @@ -293,7 +293,7 @@ bool ShapesExporter::parseConfigFile(const string &filename) { settings.output_steps_x = cf.getVar("output_steps_x").asInt(); } - catch (NLMISC::EUnknownVar &) + catch (const NLMISC::EUnknownVar &) { settings.output_steps_x = 10; } @@ -303,7 +303,7 @@ bool ShapesExporter::parseConfigFile(const string &filename) { settings.output_width = cf.getVar("output_width").asInt(); } - catch (NLMISC::EUnknownVar &) + catch (const NLMISC::EUnknownVar &) { settings.output_width = 256; } @@ -313,7 +313,7 @@ bool ShapesExporter::parseConfigFile(const string &filename) { settings.output_height = cf.getVar("output_height").asInt(); } - catch (NLMISC::EUnknownVar &) + catch (const NLMISC::EUnknownVar &) { settings.output_height = 256; } @@ -323,7 +323,7 @@ bool ShapesExporter::parseConfigFile(const string &filename) { settings.output_antialiasing = (uint8)cf.getVar("output_antialiasing").asInt(); } - catch (NLMISC::EUnknownVar &) + catch (const NLMISC::EUnknownVar &) { settings.output_antialiasing = 2; } @@ -333,7 +333,7 @@ bool ShapesExporter::parseConfigFile(const string &filename) { settings.output_quality = (uint8)cf.getVar("output_quality").asInt(); } - catch (NLMISC::EUnknownVar &) + catch (const NLMISC::EUnknownVar &) { settings.output_quality = 90; } diff --git a/code/nel/tools/3d/tga_2_dds/tga2dds.cpp b/code/nel/tools/3d/tga_2_dds/tga2dds.cpp index 4328c48fb..27e7b1603 100644 --- a/code/nel/tools/3d/tga_2_dds/tga2dds.cpp +++ b/code/nel/tools/3d/tga_2_dds/tga2dds.cpp @@ -629,7 +629,7 @@ int main(int argc, char **argv) picSrc.writePNG (output, 8); } } - catch(NLMISC::EWriteError &e) + catch(const NLMISC::EWriteError &e) { cerr<Name.c_str(), e.what()); } @@ -734,7 +734,7 @@ static void computeZoneIGBBox(const char *zoneName, CLightingBBox &result, TShap { ig.serial(igFile); } - catch (NLMISC::Exception &e) + catch (const NLMISC::Exception &e) { nlwarning("Error while reading an instance group file : %s \n reason : %s", pathName.c_str(), e.what()); return; @@ -803,7 +803,7 @@ static void computeBBoxFromVillage(const NLGEORGES::UFormElm *villageItem, computeIGBBox(group, currBBox, shapeMap); result.makeUnion(currBBox); } - catch(NLMISC::Exception &) + catch(const NLMISC::Exception &) { nlwarning ("Error while loading instance group %s\n", igName.c_str()); continue; @@ -909,7 +909,7 @@ static void computeIGBBoxFromContinent(NLMISC::CConfigFile ¶meter, nlwarning("Can't load continent form : %s", continentName.c_str()); } } - catch (NLMISC::EUnknownVar &e) + catch (const NLMISC::EUnknownVar &e) { nlinfo(e.what()); } diff --git a/code/nel/tools/3d/zone_dump/zone_dump.cpp b/code/nel/tools/3d/zone_dump/zone_dump.cpp index 9e37aa0b3..b03accdc4 100644 --- a/code/nel/tools/3d/zone_dump/zone_dump.cpp +++ b/code/nel/tools/3d/zone_dump/zone_dump.cpp @@ -211,7 +211,7 @@ int main(int argc, char* argv[]) } } } - catch (Exception& e) + catch (const Exception& e) { fprintf (stderr, "FATAL: %s", e.what()); } diff --git a/code/nel/tools/3d/zone_ig_lighter/zone_ig_lighter.cpp b/code/nel/tools/3d/zone_ig_lighter/zone_ig_lighter.cpp index bdf564a66..1c074fd77 100644 --- a/code/nel/tools/3d/zone_ig_lighter/zone_ig_lighter.cpp +++ b/code/nel/tools/3d/zone_ig_lighter/zone_ig_lighter.cpp @@ -241,7 +241,7 @@ int main(int argc, char* argv[]) landscape->TileBank.serial (inputFile); landscape->initTileBanks(); } - catch (Exception &e) + catch (const Exception &e) { // Error nlwarning ("ERROR error loading tile bank %s\n%s\n", bank_name.c_str(), e.what()); @@ -305,7 +305,7 @@ int main(int argc, char* argv[]) } } } - catch (NLMISC::EUnknownVar &) + catch (const NLMISC::EUnknownVar &) { nlinfo("No additionnal ig's to load"); } @@ -515,7 +515,7 @@ int main(int argc, char* argv[]) // Save the new ig outputFile.serial(output); } - catch (Exception& except) + catch (const Exception& except) { // Error message nlwarning ("ERROR writing %s: %s\n", argv[2], except.what()); @@ -533,7 +533,7 @@ int main(int argc, char* argv[]) nlwarning ("ERROR Abort: files are missing.\n"); } } - catch (Exception& except) + catch (const Exception& except) { // Error message nlwarning ("ERROR %s\n", except.what()); diff --git a/code/nel/tools/3d/zone_lighter/zone_lighter.cpp b/code/nel/tools/3d/zone_lighter/zone_lighter.cpp index 8608958e0..d00db9438 100644 --- a/code/nel/tools/3d/zone_lighter/zone_lighter.cpp +++ b/code/nel/tools/3d/zone_lighter/zone_lighter.cpp @@ -158,7 +158,7 @@ static void loadIGFromVillage(const NLGEORGES::UFormElm *villageItem, const std: { group->serial (inputFile); } - catch(NLMISC::Exception &) + catch(const NLMISC::Exception &) { nlwarning ("Error while loading instance group %s\n", igName.c_str()); continue; @@ -266,7 +266,7 @@ static void loadIGFromContinent(NLMISC::CConfigFile ¶meter, std::listTileBank.serial (inputFile); landscape->initTileBanks(); } - catch (Exception &e) + catch (const Exception &e) { // Error nlwarning ("ERROR error loading tile bank %s\n%s\n", bankName.c_str(), e.what()); @@ -581,7 +581,7 @@ int main(int argc, char* argv[]) } } } - catch (NLMISC::EUnknownVar &) + catch (const NLMISC::EUnknownVar &) { nlinfo("No additionnal ig's to load"); } @@ -835,7 +835,7 @@ int main(int argc, char* argv[]) // load it output.serial (zonelFile); } - catch (Exception& except) + catch (const Exception& except) { // Error message nlwarning ("ERROR reading %s: %s\n", argv[2], except.what()); @@ -860,7 +860,7 @@ int main(int argc, char* argv[]) { output.serial (outputFile); } - catch (Exception& except) + catch (const Exception& except) { nlwarning ("ERROR backuping %s: %s\n", bkupFile.c_str(), except.what()); } @@ -886,7 +886,7 @@ int main(int argc, char* argv[]) // Save it output.serial (outputFile); } - catch (Exception& except) + catch (const Exception& except) { // Error message nlwarning ("ERROR writing %s: %s\n", argv[2], except.what()); @@ -909,7 +909,7 @@ int main(int argc, char* argv[]) nlwarning ("ERROR Abort: files are missing.\n"); } } - catch (Exception& except) + catch (const Exception& except) { // Error message nlwarning ("ERROR %s\n", except.what()); diff --git a/code/nel/tools/3d/zone_welder/zone_welder.cpp b/code/nel/tools/3d/zone_welder/zone_welder.cpp index 9e0d94e37..e2b345e9e 100644 --- a/code/nel/tools/3d/zone_welder/zone_welder.cpp +++ b/code/nel/tools/3d/zone_welder/zone_welder.cpp @@ -270,7 +270,7 @@ void weldZones(const char *center) adjZonesName[i]="empty"; } } - catch(exception &e) + catch(const exception &e) { nlwarning ("ERROR %s\n", e.what ()); adjZoneFileFound[i] = false; diff --git a/code/nel/tools/3d/zviewer/zviewer.cpp b/code/nel/tools/3d/zviewer/zviewer.cpp index 6cd17e7df..da966b420 100644 --- a/code/nel/tools/3d/zviewer/zviewer.cpp +++ b/code/nel/tools/3d/zviewer/zviewer.cpp @@ -364,7 +364,7 @@ void displayZones() CIFile bankFile (ViewerCfg.BanksPath + "/" + ViewerCfg.Bank); Landscape->Landscape.TileBank.serial(bankFile); } - catch(Exception) + catch(const Exception &) { string tmp = string("Cant load bankfile ")+ViewerCfg.BanksPath + "/" + ViewerCfg.Bank; nlerror (tmp.c_str()); @@ -390,7 +390,7 @@ void displayZones() CIFile farbankFile(ViewerCfg.BanksPath + "/" + farBank); Landscape->Landscape.TileFarBank.serial(farbankFile); } - catch(Exception) + catch(const Exception &) { string tmp = string("Cant load bankfile ")+ViewerCfg.BanksPath + "/" + farBank; nlerror (tmp.c_str()); @@ -450,7 +450,7 @@ void displayZones() // Add it to collision manager. CollisionManager.addZone(zone.getZoneId()); } - catch(Exception &e) + catch(const Exception &e) { printf("%s\n", e.what ()); } @@ -472,7 +472,7 @@ void displayZones() // Add it to the scene. group->addToScene (*CNELU::Scene); } - catch(Exception &e) + catch(const Exception &e) { printf("%s\n", e.what ()); } @@ -940,7 +940,7 @@ void initViewerConfig(const char * configFileName) } } - catch (EConfigFile &e) + catch (const EConfigFile &e) { nlerror("Problem in config file : %s\n", e.what ()); } @@ -970,7 +970,7 @@ int main(int /* argc */, char ** /* argv */) initViewerConfig("zviewer.cfg"); // Init NELU - NL3D::CNELU::init(ViewerCfg.Width, ViewerCfg.Height, CViewport(), ViewerCfg.Depth, ViewerCfg.Windowed, NULL, false, false); + NL3D::CNELU::init(ViewerCfg.Width, ViewerCfg.Height, CViewport(), ViewerCfg.Depth, ViewerCfg.Windowed, EmptyWindow, false, false); NL3D::CNELU::Driver->setWindowTitle(ucstring("NeL ZViewer")); NL3D::CNELU::Camera->setTransformMode(ITransformable::DirectMatrix); @@ -985,7 +985,7 @@ int main(int /* argc */, char ** /* argv */) // release nelu NL3D::CNELU::release(); } - catch (Exception &e) + catch (const Exception &e) { nlerror("main trapped an exception: '%s'", e.what ()); } diff --git a/code/nel/tools/georges/georges2csv/georges2csv.cpp b/code/nel/tools/georges/georges2csv/georges2csv.cpp index b5785159a..e10d06bf5 100644 --- a/code/nel/tools/georges/georges2csv/georges2csv.cpp +++ b/code/nel/tools/georges/georges2csv/georges2csv.cpp @@ -838,7 +838,7 @@ void convertCsvFile( const string &file, bool generate, const string& sheetType ForceInsertParents = (fiparents->asInt() == 1); nlinfo( "Force insert parents mode: %s", ForceInsertParents ? "ON" : "OFF" ); } - catch ( EConfigFile& e ) + catch (const EConfigFile &e) { nlwarning( "Problem in directory mapping: %s", e.what() ); } diff --git a/code/nel/tools/misc/bnp_make/main.cpp b/code/nel/tools/misc/bnp_make/main.cpp index cf0332d2a..6f0c6a235 100644 --- a/code/nel/tools/misc/bnp_make/main.cpp +++ b/code/nel/tools/misc/bnp_make/main.cpp @@ -99,6 +99,7 @@ struct BNPHeader fclose(f); return false; } + for (uint32 i = 0; i < nNbFile; ++i) { uint8 nStringSize = (uint8)Files[i].Name.size(); @@ -424,13 +425,13 @@ int main (int nNbArg, char **ppArgs) } else { - nlwarning ("ERROR (bnp_make.exe) : can't set current directory to %s", ppArgs[2]); + nlwarning ("ERROR (bnp_make) : can't set current directory to %s", ppArgs[2]); return -1; } } else { - nlwarning ("ERROR (bnp_make.exe) : can't set current directory to %s", ppArgs[3]); + nlwarning ("ERROR (bnp_make) : can't set current directory to %s", ppArgs[3]); return -1; } } @@ -438,7 +439,7 @@ int main (int nNbArg, char **ppArgs) { if (chdir (ppArgs[2]) == -1) { - nlwarning ("ERROR (bnp_make.exe) : can't set current directory to %s", ppArgs[2]); + nlwarning ("ERROR (bnp_make) : can't set current directory to %s", ppArgs[2]); return -1; } //getcwd (sCurDir, MAX_PATH); @@ -475,7 +476,7 @@ int main (int nNbArg, char **ppArgs) } else { - nlwarning ("ERROR (bnp_make.exe) : can't set current directory to %s", path.c_str()); + nlwarning ("ERROR (bnp_make) : can't set current directory to %s", path.c_str()); return -1; } } @@ -521,7 +522,7 @@ int main (int nNbArg, char **ppArgs) } else { - nlwarning ("ERROR (bnp_make.exe) : can't set current directory to %s", path.c_str()); + nlwarning ("ERROR (bnp_make) : can't set current directory to %s", path.c_str()); return -1; } } diff --git a/code/nel/tools/misc/lock/lock.cpp b/code/nel/tools/misc/lock/lock.cpp index efdda5d73..616095bb6 100644 --- a/code/nel/tools/misc/lock/lock.cpp +++ b/code/nel/tools/misc/lock/lock.cpp @@ -25,7 +25,7 @@ int main(int argc, char* argv[]) { if (argc <3) { - printf ("lock.exe [filein] [fleout]\n\t"); + printf ("lock [filein] [fleout]\n\t"); } else { diff --git a/code/nel/tools/nel_unit_test/ut_net_module.h b/code/nel/tools/nel_unit_test/ut_net_module.h index 871901f8d..15d526075 100644 --- a/code/nel/tools/nel_unit_test/ut_net_module.h +++ b/code/nel/tools/nel_unit_test/ut_net_module.h @@ -193,7 +193,7 @@ public: { invokeModuleOperation(proxy, msg, resp); } - catch(IModule::EInvokeFailed) + catch(const IModule::EInvokeFailed &) { ResponseReceived++; } diff --git a/code/nel/tools/pacs/build_ig_boxes/main.cpp b/code/nel/tools/pacs/build_ig_boxes/main.cpp index 046e5ee74..7e917d85e 100644 --- a/code/nel/tools/pacs/build_ig_boxes/main.cpp +++ b/code/nel/tools/pacs/build_ig_boxes/main.cpp @@ -112,7 +112,7 @@ void init() CPath::addSearchPath(cvPathes.asString(i)); } } - catch (EConfigFile &e) + catch (const EConfigFile &e) { printf ("Problem in config file : %s\n", e.what ()); } @@ -219,7 +219,7 @@ int main(int argc, char **argv) COFile output(Output); output.serialCont(Boxes); } - catch (Exception &e) + catch (const Exception &e) { fprintf (stderr,"main trapped an exception: '%s'\n", e.what ()); } diff --git a/code/nel/tools/pacs/build_indoor_rbank/main.cpp b/code/nel/tools/pacs/build_indoor_rbank/main.cpp index 1d459e2ee..b432f372a 100644 --- a/code/nel/tools/pacs/build_indoor_rbank/main.cpp +++ b/code/nel/tools/pacs/build_indoor_rbank/main.cpp @@ -146,7 +146,7 @@ void initConfig() for (i=0; i<(uint)meshes.size(); i++) Meshes.push_back(meshes.asString(i)); } - catch (EConfigFile &e) + catch (const EConfigFile &e) { printf ("Problem in config file : %s\n", e.what ()); } @@ -195,7 +195,7 @@ void makeGlobalRetriever(vector &translation) ninst.push_back(iid); } } - catch (Exception &e) + catch (const Exception &e) { nlwarning("WARNING: can't merge lr '%s.lr': %s", Meshes[i].c_str(), e.what()); } @@ -303,7 +303,7 @@ void createRetriever(vector &translation) // Save the lr file serialAndSave(lr, OutputPath+meshName+".lr"); } - catch (Exception &e) + catch (const Exception &e) { nlwarning("WARNING: can compute lr '%s.lr': %s", meshName.c_str(), e.what()); } diff --git a/code/nel/tools/pacs/build_rbank/build_rbank.cpp b/code/nel/tools/pacs/build_rbank/build_rbank.cpp index 0a8091a5f..295409508 100644 --- a/code/nel/tools/pacs/build_rbank/build_rbank.cpp +++ b/code/nel/tools/pacs/build_rbank/build_rbank.cpp @@ -215,7 +215,7 @@ void processAllPasses(string &zoneName) retriever.serial(outputRetriever); } } - catch(Exception &e) + catch(const Exception &e) { printf("%s\n", e.what ()); } @@ -264,7 +264,7 @@ void tessellateAndMoulineZone(string &zoneName) nlinfo("WARNING: IG list no found"); } } - catch (Exception &) { nlinfo("WARNING: IG list no found"); } + catch (const Exception &) { nlinfo("WARNING: IG list no found"); } for (i=0; iasString(i)); } } - catch (EConfigFile &e) + catch (const EConfigFile &e) { nlwarning("Problem in config file : %s\n", e.what ()); } @@ -383,7 +383,7 @@ int main(int argc, char **argv) if (Verbose) nlinfo("total computation time: %d days, %d hours, %d minutes and %d seconds", workDay, workHour, workMinute, workSecond); } - catch (Exception &e) + catch (const Exception &e) { nlwarning ("main trapped an exception: '%s'\n", e.what ()); } diff --git a/code/nel/tools/pacs/build_rbank/prim_checker.cpp b/code/nel/tools/pacs/build_rbank/prim_checker.cpp index 678972f91..5273db1da 100644 --- a/code/nel/tools/pacs/build_rbank/prim_checker.cpp +++ b/code/nel/tools/pacs/build_rbank/prim_checker.cpp @@ -171,7 +171,7 @@ bool CPrimChecker::build(const string &primitivesPath, const string &igLandPath, } } } - catch (Exception &e) + catch (const Exception &e) { nlwarning("%s", e.what()); } diff --git a/code/ryzom/client/client_default.cfg b/code/ryzom/client/client_default.cfg index ca6534931..c29ca9b93 100644 --- a/code/ryzom/client/client_default.cfg +++ b/code/ryzom/client/client_default.cfg @@ -385,21 +385,21 @@ SystemInfoColors = }; PrintfCommands = { - "52", "15", "55 55 0 255", "28", "uiChapterIV", "624", + "52", "15", "55 55 0 255", "28", "uiChapterV", "624", "428", "0 0 0 255", "18", "", "624", "378", "0 0 0 255", "14", "", "644", "278", "0 0 0 255", "18", "", "52", "17", "255 255 255 255", "28", - "uiChapterIV", "622", "430", "255 255 255 255", "18", "", + "uiChapterV", "622", "430", "255 255 255 255", "18", "", "622", "380", "255 255 255 255", "14", "", "642", "280", "255 255 255 255", "18", "" }; PrintfCommandsFreeTrial = { - "52", "15", "55 55 0 255", "28", "uiChapterIV", "624", + "52", "15", "55 55 0 255", "28", "uiChapterV", "624", "428", "0 0 0 255", "18", "", "624", "378", "0 0 0 255", "14", "", "644", "278", "0 0 0 255", "18", "", "52", "17", "255 255 255 255", "28", - "uiChapterIV", "622", "430", "255 255 255 255", "18", "", + "uiChapterV", "622", "430", "255 255 255 255", "18", "", "622", "380", "255 255 255 255", "14", "", "642", "280", "255 255 255 255", "18", "" }; diff --git a/code/ryzom/client/client_default.cfg.in b/code/ryzom/client/client_default.cfg.in index dad9e3ccb..8ae0117a5 100644 --- a/code/ryzom/client/client_default.cfg.in +++ b/code/ryzom/client/client_default.cfg.in @@ -239,14 +239,14 @@ SkinNbMaxPoly_ps1 = 70000; SkinNbMaxPoly_ps2 = 100000; SkinNbMaxPoly_ps3 = 200000; -NbMaxSkeletonNotCLod = 50; +NbMaxSkeletonNotCLod = 125; NbMaxSkeletonNotCLod_min = 5; -NbMaxSkeletonNotCLod_max = 100; +NbMaxSkeletonNotCLod_max = 255; NbMaxSkeletonNotCLod_step = 5; NbMaxSkeletonNotCLod_ps0 = 10; -NbMaxSkeletonNotCLod_ps1 = 25; -NbMaxSkeletonNotCLod_ps2 = 50; -NbMaxSkeletonNotCLod_ps3 = 100; +NbMaxSkeletonNotCLod_ps1 = 50; +NbMaxSkeletonNotCLod_ps2 = 125; +NbMaxSkeletonNotCLod_ps3 = 255; CharacterFarClip = 200.0; CharacterFarClip_min = 50.0; @@ -386,21 +386,21 @@ SystemInfoColors = }; PrintfCommands = { - "52", "15", "55 55 0 255", "28", "uiChapterIV", "624", + "52", "15", "55 55 0 255", "28", "uiChapterV", "624", "428", "0 0 0 255", "18", "", "624", "378", "0 0 0 255", "14", "", "644", "278", "0 0 0 255", "18", "", "52", "17", "255 255 255 255", "28", - "uiChapterIV", "622", "430", "255 255 255 255", "18", "", + "uiChapterV", "622", "430", "255 255 255 255", "18", "", "622", "380", "255 255 255 255", "14", "", "642", "280", "255 255 255 255", "18", "" }; PrintfCommandsFreeTrial = { - "52", "15", "55 55 0 255", "28", "uiChapterIV", "624", + "52", "15", "55 55 0 255", "28", "uiChapterV", "624", "428", "0 0 0 255", "18", "", "624", "378", "0 0 0 255", "14", "", "644", "278", "0 0 0 255", "18", "", "52", "17", "255 255 255 255", "28", - "uiChapterIV", "622", "430", "255 255 255 255", "18", "", + "uiChapterV", "622", "430", "255 255 255 255", "18", "", "622", "380", "255 255 255 255", "14", "", "642", "280", "255 255 255 255", "18", "" }; diff --git a/code/ryzom/client/data/gamedev/adds/interfaces/color_palette.dds b/code/ryzom/client/data/gamedev/adds/interfaces/color_palette.dds new file mode 100644 index 0000000000000000000000000000000000000000..86be36532130712b2b61e01cce7cf98d795c495f GIT binary patch literal 22032 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 literal 0 HcmV?d00001 diff --git a/code/ryzom/client/data/gamedev/adds/interfaces/new_texture_interfaces_dxtc.tga b/code/ryzom/client/data/gamedev/adds/interfaces/new_texture_interfaces_dxtc.tga index 026fada234b5ef5fa55c2e33ddd992431b66b08e..bbeeab27b137f23de2ef17354622069d33f7c77c 100644 GIT binary patch delta 64023 zcmcef2V7Lww*Sun3L*+9)7u$9EKvaw#g2)wT?_Vx6h%cv!QKTGdmSuWu>dv{3u4>R z7@agVMkO(cCdQhgiLvJ<8Y7(lZ*69<-22|U@BQzMpU-y6IcKf!T6?Xv_daFF%E)lb zLd(chWx8d$XL@8-$gG&@ndy~TDbqW%a;8samCUM{zL|cR{+ZPdR-Za&_3!E^wD$by z(tzo{>~K!lT>kFHfCwM9w;&*h4GdCyu_Hn1NRE#`xv|5AVVV5so`8lvtV=uf8|+Ag zI+86r77)ZgKN|498{2;(Yym&|o^yKw-+LzD2Yg#h-=2H@+v|{Z_-a6y(B;F<+zIey zJMRQkVWWqsqe%aY?{tEM-@Fr01aS}Oz{cXyRf$zKsy$i1e02-4w_UCvzTrpehyy}#K%l=~#|!GI z$Ke2b1vWZgUCX(zjaLm;=epVD1lA=)9nJ2Cs1xjRd)Axd!^{+;%nvtJUxD6M;R!se zh1wHr>I(ULBh>D6Ox*5(%IruZ_39!y)1B?_N;`E{&xe}T6&QA^%#XaK{!NJAJ5Sx* zE_<;1jnoNcd&kq>1OL^%Q)%x}>Zgz${E7*+$({gSCrO>@QuJC+sagNF>Yhb%nmaq1 z9^RK(y1}2DW~kGJJM#CAD>DX!QS8=4!pn7M_hZ!F?6c+JZ`x(-yj1L*SAid&qkia8 zv!O`d;Lc9wgm)7AY*c@*Dw69}%-_4xDR7NCw@6-#T?(DM>`{MP(YlgQRU}7yurA#+71?Lk$yh|zRrQCUY~kA8+=HEb z5Zc`J`(6nTE&tjspLPq~&cfzv;@K8&O*gjBTjR(7K2@9LQ6%q1 zbj;Qyv!lx!)n&JqH)+VSRqA(`B@wwS-aS?s16ajn+D^P$4^4Y_rx#9pgl_*`VJ(>^ z2Kk`z@}iHSzn@pwCIi0OYtVS{`v%Pd559(}E4#CW@tPu5wL0>liMM_rN=KtGb}Oez z7+d47KE|^A)eiP}qc(wbv~g$X_{wa^8g&Pt|0{~>2u1m7cXu|WP@TkT#HeFb>8!rD zJ{eUAhJ9BE!`9eHl}){h-71Wz%d!fzVJvX3Hq5CMY39p@hp6BF7nL>@O1V&aqD-mG zT7;p-H6Xo5Pmn`TkVC`a(DO?J;Lvb&CcAbbq9M|@fy>y@ElBU-e_3xwq4$)~TdY1( z?$tzgw75|{cDuMq1j}wseb|lqu(djaT`rD@LJ=ranc(rSxU|2}atU>XO(|CQWHSmO zOdq4}N7jvG?_F;)gl+Do-e;Hn=yfu?e4TW}|8I1R5ISx<7(;vY1MWRD-fdD|1! zyX|rSy^dj*9z--_`&0inI;IL8PlUIWSG|=UmB5ZFO%f<&+OSfkQ9zl?#CJ!Ph`wxp z`u|4NBB9Dt^W2S%_0^1gH41$jN3)Bw)E(G~S?UCK-M4WB+rK<2i5>QB7>joe5*R{% zI;%fVv(+wV9{OD!t77M`YZF*^H|+o2Jf!V|c^Y5ZEBasQzia`c6)?r>7ckknB#c#n zxnNhn&A1)HFIgMIt2vPg*w7IF<&?pUXCZ4e@O>u#-H&Kyw${|O%MDrgYU%`!&`@Om zwKYif`)f2_?)b?3duUq!D`W+NtR|7oEYu8O=R!3@oI#we>&Nzo5?mfex&3*7yFefJ z7ZO}(!-UGS4xUnmuGpyTIQ9WcbW^L@g~A5W~aLVmt$x_QHgP)68}?H z_ffG$nHo6q|C9Tu;BHLZYd%BDqNKS(Hd_b0R*jpp`>h%V;~jaiRYUsNm_EL|q4NB9 zK2efa<|sSfecx%pi82d<*jI-%C3d+k-xQ`kh~8fs@c$2eMnJa{VNj?Z=1eic+qH3P z_G{OMRul%}?b?t&Hh%FD-xVVg0(S+NdGW^@ca>eP$=5}zkEqzPe}_LW3$#9jR{u+l zCz}$laTPNW2l3#GxS$45Jn_X7Up(_2vRcKp`x@XzQmx3u(W0bY@rY2N5QR>8hkz$(Vg{=)y;FNO0--xh( zOM{LtN>iWyH}$c%c7X@mlut8)d^KhS^EF#vWY3EUK@xj!dD9{6178&550*E@f4+?{ z)$+rKhB26fM~Ez6QAMd`runZeBD?78wyVy!FP)IP7z85Z4yQAlG%l>jiSk|_yFA2 zCKIcAUf0H1BHz}!iv$9$L*Rb=Z@}$OxY@TgJ^7tWnjKg}h;b*@HMi)}U1MTrx)W(P zB8?}~ZbTaIB<)6|-App8c1;&eq*nfUFRcp0d7=(c`k9E*ul^0BBS6a6+(tRF%hlP= z9JPt<3DpF%jSn<_%-lO-AnQJe+&T!lFf@Cy{fU}PR7}kATpyFz#neVvi|We1iDr)z zO$}MdeO+A|sG(gp(T6td z@feesmSJR`pvA}xwGV~b-~I=+j22CN`yy>8_xOXUN2NiHhWyjkJG8G9-*AwW7?~s` zHyJ4niyDsC5#s&OsAO?WQlp{LsOG8SJKAS>)0Fb4fu3dR=VyZz!lZ7-Zu_Ws~ZF6|z-Ps$sbFKrvXQ!1KvNZLR3khB-u z56n1Rw*Qm^($bz;631dM1HjssfbE)o?wDe*tE;uYp$qsjKMf6(fL04=&3`%TkDa9;#L7pz+^y9(l!CUGi|Q`Cny5mJ$|3GZ|XsSaq)TE$O38ms9n;oab#SP zM4!nx+P;7KA!%`s70h0sg{SulPuB!EMPv}$Gv4aMN<6hDZqCy*@vzHpu$$YokHlm| z*3e`G7StdM0{=S;j*io$kpKQK$ z>(;kVpFUO4{`ldCAHF?(`t;^Kd-inRoRTl)4at|br|gn)hisR~YO;7Ax@|$XrObYm zEI2MKXiOHM9+>$3eVSx&*JIxw(mp7ge`*evaYqt2>h^y%-{)CpC|o|BSjN3!;AX)~ zy|8)M4r$k}UE$w;`|XJ%M~*0C$BtE^qM{UEUtiJaJ$*;pzWnmb6Z!f1;dIPagigWO zy%L2JwX$$IC&H!O3ucF44rM=nti30gqg~8z6ElkUf6aUu%t6I-zK}M?Z;{pw$d%R) z%oBb;eE4wZ^XJb$9XD>A;^X7PRCyYGFy1Ki#kq6mo|2Ob#uN&tzBBu%ba>VgX?d?z zi07*Uu#Xc^W^tcuP|3nLUY{bYBiPShX@9oM8KSiDXEB<-@NgwIpqI7}>y85cU(?

ZaM!x=|Jf+DtIz&&BWuonj0)U-lS@VJ}8fX1x#&wAM|>s_ltb~#Mr!`%`!F)+l$ zMi0@pp$h-s81jq^p(M>6yiLjCy@E?#rOj(b2*P*MBiFF|TZ=ed(AB z7cQLGH3?M;RV6=l4<#uKDG`QDav8!OKhz{4yeB)?);FjJ;P^3`C&*DYc7itgpRKWZ zmbVVL6xkaSwusuWZ{NPo6s;5xFXPIxtUP$|K+w`FeSUd6y{BX7*xcOQ&XkQi%5kgc zs1VL~;U0RdP4Hk@Djo9DU5E4GC^EI!)VbOycA=uqK_8=emH}+lKb-_NMDTXF62Z9{ z*+dbm_N0!75814Tk>&u(v5!Cgc(bSjsAx+>`85lz%%zn-_7iITF(+>w0 zY}p}gFuTyGoT#I4!;A~%b>p8BxuTa|k*cpy5fK&dT^LLEp;H!iUk0Mig6I?x4ce!# z!JkBH2f#CLm3ao|LfV!i^cM&-FG%E&wHPw)+__WU6H#GdVH5zO<>cg)lf0Zr)H%0r z-~N_HIvOp@oH9@#TzcV@7~zy2$(r1RF~9RlO?&p)RaEH{+$fV$-MZlTYv zfArp!D|9UC(`G6UG;+=Dx(H4gC5Ubl5k@PSKTbfT=3f|GPBgTfXetq%8FOADA{t9x z&sg${>mLP%+F5JYo8)ZGo|rY_7YC(0H+!aRefY5Aje3o`iWmC=O!>y;QB}3xe|;<6B-f` zU*Y5%l9vZ7=X72GqK$$`>mp)tc5T^kXxIMTJ^#W=BCAGZYs$$AKo);)>gOVsNK!UN z=C%EDq<7wVr!$RpWIy!^#Z_8bnnJxsjfkk^(KgzLsHoRyjz@Dqig5BjdXGJ_ne^Oy zuPzxix8@7FJZ&saH}JSTLAQnI0*P*WIo(k~H|=v#adQx%G*6>OgnRey4gcnwZ~n)5 z&c%xtPi)$>DSSuT9x+EFx}DDV>7C}XN8vI_l2 z#;BY@+eAg8!b~$7`kbAZBON$!pflwr6>C%~QFwm(>8EdLCP{wEPRNmVAeLy>NR|;D z6()+WnSaY8@p4zh{#P@hniZW)#@F0G1M7x96+ji&YY`o8MzTfaby0h`2^fO+MP56L48e>Z2-Ai>c&?Y(2=BU_|Z!oh< ze5`%smVe<_;u}YNzv~?2(IG1Sq>6r;iY^-t; z|CQ--glrwN_~|^EJxAA>v;2jc>ZE2R zsnO^iglVM91NHdjy85+lPA&OPEx7taT9y_G~DA_D@EN zB8XhwyX1umPkp`{o9e4i;+BlpR4go0p(7PONDytp>PFfPJZlz&S9Uq5qA8elV|p8J zIZxkH#WFsz;&uRUJwkn~yFP&?#*5iTAAJW3tS0>W2K`D`U}^OQZfu5C-;0$VLfTqZ zysSQvU0$bshqc|=#Ke~6Xos)}KWz@rvO_hmwnm?UrCVjb(V(9IJ=M$fWU@6TeGI#0 zHHKn=%CGI#uX3rXDU1x&_hsJRTByo>P1R1Q>TNN|EUQqP#2U$DWu8#AU8wTn*>&{D ztFb|4sxnwsT|LfIx8c{0z0lH_wA9&!8+w+->(M8z^v&7jiU#Q0NBYFY^~*;{)!mw~ z>I4?h>wYu%vqoX0uL$~l$g6JlD?h5n?A~wp58w?B>l0uq^fwjyBg*wR*SEo4HT>Gy z7y8>d_4}3S&+e*^VrN?Dq2KXB|0mF|NmT1dKRUHo+ksi5wFh|C`!4-b+U_E0hT~(Q z|D;QQN7CQ@&2s&n^wFW1^U}QcUv11rSLCi;c|qLANgP1LZCKMh6JS4k0s9SL=Y7;n z#}-}J_9ISjRxd`ojc0u>I_ILRbNUlpRyX*2S$BOftG1%0p1l#P&o3v$nFHm&YfdYO z(8j;Jt6w1^2cyI=eV*u3_$yxT!#1Vr8#*y>0Mmo!m+bx=LtiTFKJ4<(0IuV&4`A~i zXwz7u1nStEg7ub*b%bC|BuA#`9p!{BKfX@s`uDUOI_#+0X;0(?RIPHl>3Q zz3#^YA7V6nmC%n}`$Kz>-5C?8VG9%#z$R(hbv)~lApG4$I8_jiA;RhZ2g1aC`VfBG z$FSH9X9x6N?gS^Z?B$3?WP{(KK>aIN=PT(xqD#i`nXhgj3(C+IVyx9uo>w$1Q1R?V zf-8X;mgwL4U%Lw@$ZPXECc^^2Ful&5&e3nq(TB0PUCjb`h@U>i>7w(4G)C50Wop6B z>vbQ|C9-)|RL+nU+T9qFfkUONHgBdeq^fv9HjZPZBMpA+3)S^yA-P0k6AlV7Y*68zMcUJV zJJ8q%+w?t|X7~RMCY(QRZpZ)(*9QT{pKU*(Z_n$8=`npC+XPcBI_s3x3J7)fX?I|d z7YL0E>qUV&bW}e`#rPq8JkuO|4dC^drq8d(H9D#Zf7Zz`833pBH32Y?H;UHBLU#wD zJD9EM3f=V`+O3!j2;FTB47&aJku&-@=>8ZHt39iK_aA!VHC?ak=Fr_h#eW@WNXK;Y zlD@7x?m$zqirw@}_}G3zc`cS559JL$)8=BnAe8qO%GFpR==-YJ;jf@vbLBO|N%8B( zzXsz{K1wLRtq+6pT$Nwz)~)?qLoB`WvBL$(0@n0~76W`D7-&RCpbRxkgBQ&FgFAW* zz=wY%kh}jkkVcpy&wx0d^+X>5kUc7n$#Of0{{wRhr%DsAKhZD_-v#rJpXqz4*wNph z((wGBWan$P{xipKQ?U_oMsJ?B%uok1h7`3SnFX2*``Cr+`u0Wg0!T?QHe_q|8vbM*f@~&!uBPFd8(SP| zXh+v|>gNhMHF&%2hTf19$uHC~w1=D;h9p`m)TwLO!7e;-iJDHLjvJno(Hv=PxaY>^ zwKCxHJ34Kj5LK6VJZ$IzQBC;8riL~U6-lC|v+U*uoWE3Pj#0PFKYr&7Q`|TVD}j`* zBn1`TpYd50U+sd%g{v_c6o$A8e&MZ%V{h-g@lEYFfT%~arY9#OgHxPj$j|Y zXOf|kJLa+moN+c#JW#2oMuNS7{=S>t?WW8rx?1a*sY2& z-Hr8|jhW=0`GzX)7;p^HhYSXYuw-hCJhGxO4Iu8LWaB5~*Y=ER}A!)T!Qhb>tY^uwv)-$HM zv2`slBi@-WBo&e*8ItU>mWPKJCqs@uv#cjM1%@aUJGsp;3rQf{%#ad+>_Vzj;(C(U z;)O&mB%UCNVM1a6uiwa+4vDzS_P(Jxe|*%?5E2g=GVO9-(fzncYzSue(+xgl3t#LO z#;bOIA@h`wNoy)Yw2%pF+ZyK!nU;5n@{FMT*f7^F_n~YFgY%4U+2tw>+i^qcKnUY` zmket7?K;VcF>I({H{)jN-p0j{Q-RI=l;m6%a=s$3^`I_+ocJ<1*bYNS8OOP?N_`D} zyy!Ls>zW57EI~kda@$bjI@}2GElIjVv3ll5lGK&D1d>vnlD;KLGe{CTA%GuxVo*Vn zLXy%Ti5n&wb0Ovz67$SJR}K@XGaw<|Dd87GO|&=AR_W+t^CQ&Q&lX2ZyswKE}7$&E-a1oUcOL5nvmQV}v}!ydOWL zHNw1Xt5eFRRi__=n*7Vf-`L&!Yolqq<+|IG-QZ(7oqGt^~nW1C^^ zT1+duQLN<^V?tTyU%V>h%c8`xDhq?Xn0aRdANI|s!MNh5W1qA~0Gaz5@44|hpCJ%= z$VFqSutG3*A7K2Jo$F;BNK-Eqqpbvf>$+3RUD86aaq*teQkP+93Sbx$qR5^AZc8@) z48b=jluj~ zB00u`XZ_vqG2}EOH{zApO~^rasQrus*<*jB!yWkSk*BtwcmsWt`NHbP*6`?Q5g9B*OZrx`I_r&3 z*$1nsC!lJ>Kd7oFROK7LAXRL}H%3pMw!>Hh`U**(O!{m_hj1AnmFn(o|E-N=k}WVH zjn4`)b|^CeVaGyhk_n$+rDFUDGkYV_%EU_d7^B#lUB+=9FZrv5FoGM4g};WpV+;fT z3E~eU{_wwyKf=Y2I>P0U^Q9qbyF7_Ub{0mQ zGJYz0;_5e;6OKG>tOHAm$&zTYr1f88$rwKSEn|E1#94ODX#B`7?{Jp28?5D7<9clu zfM0IbteLW4!2$(gONMCQeU}wQgazB>L>@U%*mB8uiko|AkctDpHb%ja>tsj_8Pe^q zF(if0=wXb3A?Mh$-lp|<>cGkqu-18XIQt zW#f#^gbiX&z%u_d9;F;<`P{f(Ujg2K)W3g!<;IO0%KiKIm7zn2k{!qG{&RTbQqdKj zruW(6JWXnm?62Z|yiCpL(G3&M*kr(#$Fu%2GvR)Z@>MfOq(`MVfF1Mbju!L zLCsezs3j~2B@1%Ng1rB{1>Ap&u?X;5-ekL}-)r!?uKxc1N@ixJQd(N7;C?YBBqT)i zLQ(bF(|P23!iL7C_t^YA&A1}Dii-D$GPOc4v?3e!kqt%vc^hajoWSQDKz+d-xjgc) zY2d4deBpnZZY{vgLCUjd&lI|Shg~zsHoF|hBhLvV+L?~Ad3l=gMY4~IcW-Y(nvd;D zMmWfb_x~~@J~Vc8<6$RFgI=}ZtTiw&5GgH1dV6~-lP6DBN=ix;T-#PcLqkQ6w9XAR z+2vRsc~#ic=asrB`TQ@l=L=(7H(vLmY3S?rv}w~u!e~M^?WH?(cJAD% z3>-L+Y`5hiZje1U{~CLy@I~Ka(#YSqWg7OHJ;sQL z2(pF#S=`**T*Leld}jW^GP0#a7&6IpoGr-Hj4hI@s(8=Irj`h_bTZ^28S>~qZwUAQ z)p!&({QkNPUwfcG650Kk#!z+@mne8-6*JOc^?Z}#&;-*Aq{RY}7RyZutE++dvC8xx zpXYLacN4)@G{5F>T*~z|y~V#WnR9{2Oz-oFex~UdKRkKAwWcO;Y7RNok2wAR3eM_+ zQ}a(atu1lMxvm*k#aHJOrz|)t^MN}|k>D&OPMJ9O=jf?&f4_C11a@K?Y_n2x#edX3DuALHer6%o*iU^@xeQv@3= zV5{>Xr%m+$TTHOg1ba@02Uy-TZT-)C_AS#1)bFMn;>AVe9TWK8(<$0Yy!dF z(_!H@$h72@1vd8|Z2HiRHymn?`v=LXEwL_b_tIGiIv0U+t9YiMO_7YJZ?UHK;xnF_ z)NZU`yw#V9a}in3aBZ!-n=wH+epwo)Tbw#b-2!OreAJOERsih z@EWsB2R(R`d1jiXd7GV+Ws?a|%Uj}nMF$?Sk)Q_jpDGO;kPeu+QewhF04;$sJCqZ| zI<#zQ^vI3U=nj-YBIEUoVXuwpJREyjmIxxTHZ#q{R3IQvAT# zkU3N8-vZ8P`*V$zox6&AO5V;fN806ST&*+Dz$yh#=veHg6CS+98gnne z8eW0Tal-B)*jNFY2@foUCzbGtnzdCF^UmZ}yt=?D9BXrIvXvW{8d1&QNo0 zaU~XA4gb1>o?ZtAv-zyth@FGVMJnV^J}U`!t#H zK%<+1Dmh!31^)I)b7wGie1);t$#|6TqUhd%U@>aOG#F(-nA!i{=i%?EebpbtmRM!W=eag$O9h ziV0(PLb`At^{EBzZ8r~(@o)BxJuq?O_Pgo350$3xI;bRNtuKulKCYxr?2xDWjy>=C zx9aejPooywJVWY@l>F7rfNaLGo=Jn)`?s0^^FCqv@a@CQcnIN66>CFwr-!jJQ*F_Q zaoY{k*$U3*P%7}Tx6EQ$=>kqMBjq1BflB}!OSNS5$PLo?FY^uTy4h+NjLlxu-N^_rcPcXesM9mv+loTpBib)N@<+0S~loIv4vk zdvj~Wu*Myk<+9q$J}osLpo?tVClT)0bTdxPAvPbH9#!}s*79IgOkM4AcOFs2f;b&D zVl9x$6Qvs7H$+Q8%l54va3pT>^zRmL-%^sCnWl6a)m0gqK3G}8W-8lutt*|Lm0mi0 z(WKJ!Z8@d0cJD7q%h_4dZPubcBZsE_S)<2*Lhm|}%=V?mz&@>N;e7La^Hbcbw%m;3 z=zGX!#_tZ{>hwqKVnxemcKH&UvDlo;-kWQlUL-eF@dz`~rHohy5Q(Cz8Co~ADQH_% zZf-|gb?&5qGo0D-x zb+vguU9PRa!Hml~;+~zu^(-3(j7%0Tqy-1LZ4uf=v^~1unjej}uf3PCb6?4dt?Nst zEK5p59+swP>(1XYN3y)sz^eLuR59vviWubHU`&q01ItNm;(SkJW1Rs@b#) z>(<UB5{Dhh*mdCdsrma#=WX9!x-Dxkv{?8eC`FZVz4%N?| z?~tawJcHbO=rxw1MTp~=H&!uIcxrv z`wz6VR>jfSmpXQvG-dt?DRapOV3R5hp0yxl(ZOTCELy+3bl$93C4NFTWyr!bW&NHF z%9_1flwm8UD$R$ysie+~Q`T)=T{?eP;Wwk~>)I}1pGp}EK9DA7yd$Me*$Oz;dR?fM z6~__XB|&%H+?Q92G2@Ch6L^d${oZF=?c^$l(1 zXO3*zaQxc5T?=>Zc{+dYkkbCc-%{Gl=&wxOxlUnxpR)Wwz7o4+jM8&buhOhdi%Xa9 zKlE(cmV#yV-+sID!mN|htc53~$?5yxwXIU}NLEx=k1=qxrI2sFEx;ZSSb_i>D!}dt zupiBgE{q!Pnji2=Gb|lc@ig8AH)>S1Swix3OP9WfA`(WNoVl~;{(@b5o-bZ7tTcAy z+e+*4U6jsKW0f8g2b9KT3@%NZKdN-Xnq?)63lEem+<&xqjD1bi5_VRaz3@G0#=O(g zglRjZ)X7_<;lr8TKahPflenIk|L(>nD&|;TElqGuv}CIInrBp&^|?&*9KNcwl#qrF zwo5geHmwppVk`^l75}WyycK`WKXB~X+&u^WT)S;e$(q%ZOXtiTR5~twVCn3|qf1w1 z&njWt*OyFKyRl^9!Q)To>?m4<^9kPb?H^0&^H0N1N2JtAdD6)7dD74!S$6+A?Av9Q zP3*|vuqu4Jr{$p=I~l4AW7~Z#b(yA{8nKokVr`xv^tPZ&FZi0HSpyGC64Urt0J;&N zaY>kj;GbL4{AFE}ma#Jn4j%h$$&vS;E}gl$^E^(@v(UZGMA& zy9uQIs12+}oz)F4Q$t)kg}wFOHI6G$uUv2>=H!y?Q^ z?1Faq5_`ndyd7zC3idCUTX1jzURR>6%PiQRyZFGnM^~OW_4VZJyxaZ9Px*a}o!!pZ zwr63RUPFB|7M+x)WqvGrcg*BGX~d+>(h!WCiScY!+c!el^}UvC)~}Y{pBL1$V3eDe zsR3!IrEKnyD>%1XXx@$I|LX|UP(rOisC6w*c%}Eqsfh{m#YBvzqbZ|v2-#h#Q>P+c zD_E_qyi8G1l_ENI^6or%ur_h-;yNQ1u6S$sf~A8;*;&_Cy?W_pEiRU(&3;cBHzi*h zJpt3($vM*Slyz8CEWrYSsrJ1Q!M;CkS;IcbQ0w{r#uhv~iTOhq%^#X!x+pjggA>z5 z{EuZaK}Hf}bAmiakO`R3C&m-#GO(6WGv}X?G8UeaW}$b} z@rr*`G*we)eR~k8ClQeX6wpeH+CemVo*>AK6XE)DV*0L$9v~BEi zbFOc1nc>FnSFtA1IU1WoP@WW&9R+1qqI{buJ6ZnZRjyLeiS0jAN{pK$Cdx^JX>OY( zjTpT_8V${9=)JM1YU8KwlqOEc3SmZ(G;tcJrtQY(0%`1|tx_uJQsKUllXIn^Bi9N- z%w?sxfwO3J@cEt)J?7l(r)!ohtY)lpaP8kR#f?`zV!&D84?Z(L^x)MlipcCQx;vg2 zdsz~AwOEV0imUHgTBzds^_?sYjGZagNHhr_JZLdy_gETOj$-~#6j~7b`@$GG8Z&cZm zEfcWD@>B7XH_UedcuN3|5P+!!IE0*-V)>IM66z8{?AvRs)UWR(u}+PL?eTF~abfY1 zkvIpB7D;{ij*dOLQ*u&k9wU72VvLEerz*z3Du`a~;n{C0w;6e^T zttO}qmaq8jx>mY5I^ROSQCCP%L-}Oca@h&By1|W+cNREOepw{i=wB8)UWatS5!lRo zYaO%huYUz@$%8GgfR#gq2&e)9RY*|V2x_@@--uem%XJk`j$6jP|97R>K1oFJ$}1a-{v z8UL=6bp_oJETD=B3U@t5Tf)kqsxJ$>5%+VtgIdDR8IB=$GRpx8&IRc5o~v64?w^5C zSFU`xv#k5tTJ4y0p0QwNe4&`2J|?KMmUH}itd$|AE?GR>+0^S6tVVDrd5ooQ8C11} z^>6n3X{uwuPt!$<{dvYe0J^+Ko}<`%*=zq5nDA6@>uOBbFI%vDxNx1Iz5)q^f zd#r<6%wrZ(zeM zZ0O1*0?X6-#EnhywIaTNmEpqj&v@fzyIU!a4!1@-{&p+X(fQVxa>SSM$aycLQRcpk z=E_n^1S%cCVxRk(+HiFb4Q}V%U%@JHf>@-FwE)jZS@Yd6xw8HWCMz-3;!RgrbY-sc zpIPTd%O8h0-uyAy(dNhDqPh6UedIdoVCq~7LCTH6cjgF}5tl36sI(CmRSqg?g2{^O z_h5>mCmL}=z|J;VUk zb;Y^^uIyvQ-QM%#t$!m%l;Y1^rMSw_z?-Ho+BwW$cW{`mbadEmbavFb*+a0Bb14j7 z=5%#GWjAqB-Jz^@b-im05sdL*tU*8cW50%b64<7AV(c#%dl6%-6`6e3S_r^lRy-fN zDAn4Yb@8zR@P-S}XMp9V{&=**@bQ}t2eY;mdGamQWToh& z%5>q$<))r|ZdF?i6)RYdJLz^UvQ9+tPGGhr)?@stNdPhdsKs+!SR{F81mQjj58lAf z#pl%`;6}B%^&HigggOFPghR8Xu|vDBnP4;(w{=*qb`)vkN+GJGFT0XLlByXY-f z7ZO~7HC4rqJMd^=qrGw)X4q{#&cALh7od~5)g6pxw)q4Y`+s8!rRz(`4at2p=mtRrreLN%ppJ0Nc4I?zns`5yUnZ1M~Or@X35pw2RThR{4f^SAzqY zUB)@Bw&-*9rpOoWL^+~(q#94|q!L7ols2!&qO0@>#$saZA{dM1emv)lbvEL#0t-2h z$BS%dtw;FfSa~;w=}V}Hb~%*oy>1O=nqb`cwkXC$=x*@3QRz*MLr}t-)bakAbsdyF zl<1T-REMZox;mW3N*Z}wiS3F;8XGAZDO&{Lbs~%tgx87ivWxH<5ni#r%de!!dof7g zw$jh#<5!y>SY_7#PeU;BiLXhp9xLl=ca7%_0ws4+w^M{t3L(vJq9Wa-!inns9gRW= zg_|_E(L5{YyKo~xdTl1VdfMmA&l+bsr z4t{gGyaz@5iS?0Nk*uir@iEp_?*HlKBKuq+s+qRdD)xbbN0oA(A&Hr~6jbWx)=%v6 zKDKOeMCJS=K7q&)e>~)2o$QH$I$fMCsbtbu@Tp;|Ql(aqx^ke!;Hg!c-MuTBBsVv@ zm}JFWP&M2H?+!BxNLMLAFkFD5^zf&+HQK#m!m)Y>N*hyboQ=aQBgI-hBmcjykZj<$`45yN5V5WM!r=eN)rpy4*RN>X*ap%e2=<*n88*_&+b@i2p1K6f6NYn|qqPABwzAW(}I2+$}PkbpL$f?w6KP?m`8 z{m~N8lF`PY5!?do&#(`#Slz!EuUFBo;r(}b{TYt9j$^+l1uk`6Gg_+8ppS9tG~RPAZES zZyat!tBckcJ=+EP$3b@{B4Q%GOGP7Ya_oHY`}1qGsycp|+?t#O!w&x&to9mTh9O{MA^Aqp&1$SPQ* zcvP*T;J6aV_yg@BZd&J5)Dy3iM9e=?ZRU&4+ah3%nO*K`Tg$8cO|GP3 z#xAyD)K~R8$+*mozKL~N^BGy=j)Un6c}=udXkFp^K_H(Ds}|t%T#6z1_yowlhwq<) zwnWpqX{j}~n<6LnQmk=36hqgxioVlZineV_#V`B~rE-w<6>DHcDH>Vy6zvWyx&Ybe zpK8)hyvasON24IF&o+If*U?4fW!G#CVa+=JXMb6SA#r4gA8QaR@1Tx?ohs^Q=_&?tTT!e1kyWd^KR1`F))=RR+%@dny&h$yl^2^o{5gsq&VG~Q-c>Mxw4 z)SQ?stWifti9T^gn?ex=k0_9*K$Zdv{>0~B@%anrLZ4IO57)hmFN>Y1b&_LG{w}XlL#%80r9^C4DBP}X*Gln=sH+e=f{YTn z%;jF5!tIn2NTU*T#XWT8SI|>LcX!Y=+4*Q`XkF2$x=@wHNm?&?83z0eCNHxM64)C8 z9eCuo=M>NsFmE?2pD$Bk(tE8Mi zrZmo9rPNz6Sp>g}o6;DeB|-&!;uXB2U?Gg2;r&B=Ukn|HcZ2XZRp=pT?a=C=k4@KA@n=DsZ1H#mhgaPVd@;qBRNTd6yDf{1_Yr;rhvx0;FIq56b6B|3vTglZJk zCm2UY+(*Zrf-W-!&0I8cJdKep(Sp(FW)~PyOU}eoCN=S7-}Wdg*7$pEc)HNW<~O&( zm`=RvvA~anF^$6HSWlW%xFU&+8G*JCJ-h?T-ml&?;vtL><%W8Lk~C`98YTAhA*JQJ z+Z2j?Dnn$5u0ymaLu54V7cy>$NN7{9zlrZ5iwbTjjCqbR{}!^q0f%9zGl=LP48;^h z4biM6_9e+>8FcHHwXJHI)8ZGw~mQ=t&0ccTZ zWQiS?97Nn+LL8KWq}&oJKNLqzcCS_5m_1HdKn0YB2kHXK7qYa~@qDG>#zo>Yd4S^5 zX$i$wDJ-FZ{2k~)!8V8)KyN6ffsX1S1-cI!a-uz1g8%XNSlY=c_?c3(k<~j-eG|Zr zpL3dXCGfO6Zy6)^6z0(QK%LqEEg34-AQeA=+IwiC9FemLD`2vCU(s+B8h&~!SggMxkq6{*B!#MLTI=%oMGnUMuYD#kt@+W3d zBE7xv>dve673TCsUljC_lUY`Oc{nYTj$b89`f|%%>XzyW6b>m zCo35En1Q^Vyp@R1dUsj5EK+7uwt^XVlr7V308F9 zr&+>|m*BB`OP)T32l@nULDJXY9W#U-9_c7p6(CXvtT^BvMd*}JI8X)%r(?QDuk_j2 zqoW8FI960wV2Mc+Wf6^nWCm5|<_9(@wWf>|ok%XA(1R(@ouTy(Oi6*>4xm;yz<(iV z1~gxc=CnA#bdu*F`#1hcY~)TVsx;xFbP!#GAfxZ7E5u|EqZ@Hj7tqK~qs<63 zN*R(t_3I^DC`}$A>kDAZ2(-7*)V1-S1vXU2Yh?)afN&MBx>nf2V9UkCkm_t(wmgMu z*G03fIeyK;j62wB^E!2dR>GJ_-aS`tBaDI5-Qe{4$nA7=$`z5b81^WhM3keDQl}6! zy^>)7a?M-?ER{5xSy7=*D?YBYdT)E#h=YzKW9T?%CtpJV{v+`({)T95zy@Byo1eFf~KYS^$LjCn^G!^@31>NKVW8Pm#XOebMX z6W-e)M~j}pIPHc?+oDF=;P+`vU;OnMW%=c^O8fVBi@7X~^)zr$CXo$C%iUiX zb6Oa4s@#|}@>IG7;c{m(rYji}$s5H6%|Xw!;JrU{8iR?78^R$CDi`c*~TaX=QfY zkej1ZywVX}ZndY6iVj^q^BK5Hv#)-x6#npSxh(^b0;mTHI!#24Yt}3H&_RfFG5An~ zQOeK^xzmSx#iGQOa@3Jve+WA+!uHv)p%x;$8tRDN2M+N>tAHuDo68QAWQkY%iAr+T zZOmP=?vO1ec6k)_NvhM9>B5$`dE7&}VYw{`gl1s9i@I7$0k-SAZKVPKp@{0c)0V%(j_+a944@kkq<$EH_1;Ls zibyFBI7juWEl-6lPso;MPFrS>E$L*-+q~_PpmFGz4u=NW!pcp7*a)mnKf;XT86`e- z&7oUY6@L4gFl+UdVuiXV@A{V_k3?cq*~U2UDh5DQ8nC%y#3UKC4}~Pc*A-sRu+Jly zo(_5q+~AAj^_5^k1vK}6G{wtC-QsD3Dc&}83o7zbs>sWorfd+Vbml|-Y;|3>sL znD{M%yC47UgFQ;dmnQ``*>dcsnK*ldY&v&sBV$ZUBju%7V1A5 z`l$?1+9M0d4w~lE+-^JUuJ5#ixc1L zbeOQiD;+Xbn05I<$5528Zz;vwI0}@cPmc&@N)=+?ar2UBJHPu{*>LTGD05VMX;`P} z060az(BMSV7)pKWH|i6b)nWUuh_6pjZo9o?hd-r=h%J{LylRwfJ|4(xY@5NdnmTQG zk8C(WHgx0N&juyKhQ54kv@KY~Rl~?g39{YMCspCMVJKl=VqsoN@kNcMA=D`DsVq}D zphmXPEA1#wj!=+qa&1~(VKC|On83me*z z4IOPOu)@NfC+4lZ_m!YwU?0e*#@I|Ejv^X0k}8|3Nyu*x$b1t+NfGouTX5+UksIXq zbN7EziXZ%}oV|Zrx%lX=czp-?LGeT@7aUi9(t$n`JM|$=#a#UZ|9k`6R)W2mliLHx zRm5;no(EO?3hq9{-QUT5-MoYMzZ;YU?pTHr>&0g$*a8GRIle(u6RBE5s|4q{V?5Gh z!Jdry>(}IHDo7tA0e*S{-`AzxZ_s1f^sqVfu^AHA6U`6d*UG8{H zv7VrFH=rgr$9q3#%v4diz{{MTEZ~O`{0Q4BtkH4*ig`DWdmc1cIDKZCO$TnjbmI1@ z?kDNm)|Q&>Pm)l}E27gwP((5jxR2;82^FAk9^Y5)|M5hy6aVcee-}lH#&`-Em*Xk; zY0*SWLUOt&MB#7H@@ z6Zq^5C$R{V06)pnuc6fH_(%yQLBBarQr|$5?*sQbdQV^7Rz~7^Wf$JZrQ#vxOi7iRn-Pa{^3@s#;BH3#D+cu=!Uqe z2*K4bKs3XeY8+zi2nOA#9 zK;ef$IW9J39kp$szp6UuJsEd;uHsppf};WT8Fzc%wxc2vW&lA6uQh2R8EiJm*QS%I zHIS)l5tIk2j3+8jB{Uy2UvySDKobEm8{U|O*K~B;G63~MvUI>PmGHe6d1*|d4nU`o zyYvfs1*hn`g(q8g##`t!+nNU zR&>WH{GLJ!)}lK0{2v8C)*o*d6f;pMc79x z_A%Qs?DB55X?-m(en$>0tjPb^75u(C&#oC53la5fnarYX=E+-!1@`sif4m!v(>EI% z2lm6Z7Pbuhq-)?{eEn%Kozg}2H4gOR1?>Xy=f8V*rp+;d@t&-b4nMS~x)OX4`}p(i zeF9^!d7upsY9s{C@#Me#B92z`f??voQFLG$4&=Z6DYoeO-bsP&am)m z;f*rHK9y^bZZqFMKd=qQMbA0YM#FWcwBCE91`Ra;N|s%GFcPX?=fxkpNkBEUzM?Q`*VV3Y?Neb3gZ zOjqDT$Z>jadJXbk6Mp_lU{4Pek3*KAX>k1F8prT;3x2^fD2BeqpC!Qe^t+jrxyJ?} zymguI@3cVy9_;rGxM4a_4uX6B*d>mAn>GjV`!$2Suz5Fa4hu?0Tpbe{J8*2)VaqW& zg&Y?W9W>LEdz`It2zoovu|{6fE~vzvJv&Pw?1fur#U58`91(lmpA@9yrG0{)V~;CH zW3vwrNf3M7t?`~qhL)?6gZ{uCcb$8ri9Mdzc%Sy*kl}+rDE}OD5Bwgx9}me8n|(s6 zdN6DY;1w4HJ#=Tk``8k=W<}6aPws9CsqWn7y*B7BwwZ8Mx9s3tad6#`!;qao7Wi@R z9b%ul<@@Xln(fKGnuqMgKFPe42R(&|=H;6mVsodE{bIA*>7c)3bEopnp9RhJ5)Q6^Hb0bh)BUcE#C{#^U#Muvpl)q^pFDV zGoDv{N_@|z+hUoeho=3ZxZvKNJYY%4c5I!@uoZVKdj)@qU6x=Mn5ko<2e$HIaW!ko zZ133ciafzD82PK)5V9GEOfOR!sG~!E-(X83sSSA-Ie3gGx9$$1GlKa0@B|i8EBG_) zv%74cTI_y{+PGj)E!>+Yg#{x;gN}vJDYpgO5*7S4c05LvyB52X-_(bd)@k8Im!AoR zkB$x==*izW8?v4Ncwl?l{n=TuJMS11dv(wDZEUZL&D{J1Tmld4GW zM0G@N_i3ptMRSiriN1M%A;$-z6_ncF=ZVzsa9sJ{47$MM0HUmUfH ze$Ai>A6*jC7l%4n+=bee`IyPUD%^IK5u6MV{2WF52ALUmM$@jJM6 zYv!W9<_E_kVLjN!-Eu#6+=M?cAoi`luMB|yzt+A3E~;buUy6Vo6zSk1WtX-Emfi&c z0R?Pe2T`$u1;q*$6crV0*Dh9!6;!-dL}QCsFve)qsL>enG>IBxG*agOJ+n)U?S6=Kp5)BVH^82(M;kr zm#4sN52awO)Ttjlx)Y*oL{4zTmm@)hgmDD7vX(d^RhJ=iacwk*;|WgG!rdlF0pH_r zGQmIAK@}VN+xHR8QnfrA??EwEKX6rK@E}Ip55Sj$P6bGng#Z{q)bSuDb9g$zc}|6Z zO~tk?WqZ(s&IeL#(@fY>XrCyyEz*FRw$#c-hHPyV$gj(t_N{~+>+R#kwk4d$LNs%i z?F3v(u*V%-1Gr@m1yROf8__C=`xc#0ls2BQ?#DO1H#LIP-%&&iH-lw1NlSaXJOCz`1?-!nc=eVu`W~J7 zQ&McjfQK4fxa#U{aCnT%dGNT4pFbs@sL|9dm5EU=ol}g&hUqRBb;~6vgHhATuf1Tm z%+;`>i?oZO`12x{PxSj}0I zJ4raao5M2cXW~GabPwP?6ft}&IeeVMe$sPdUq9&~J)zqP`$U36!lXSBcr}M(q$hC{ zoU{seq+Pa;r;K(=A zIYK<5v z5l4+=NSUDw<^0PQ)KJ5-F^AW2*g}S0xw#B=?vAy+CTt0ZcXL=qu$04YT3E^9;{<2> z6YR_3KrI}`;c5H1{)l{%i%r*C(9t%`~Ao_;8YGj=W!30VNj7FgHgIa zO5-~qOGYxS6ylkuvbjJa#n_iJst41!pLa5E z@zPsa0g#}IZZ44k7IDDHg+>-GSpX8n?#3=*K-O`@!lgotwQ!*uh5L&GB`#_pyE!6r zLA8^)7{O1xI9TbT1ah1selDo5elBHt!tCQT@ev^o4&!h&hhtn$i@jr9cIXMytEq3% zMI4ss;tt<;Ih^7GTan^|=3vrYDv3;RnDTmz%?n$tbIH}CV25=yUMGglNjPF>eevhbfaRD61;R_t*h1gHH zU*KmX_N{U81Kf|pw>aF7y0ng(zGv)17gF9R4nO7aD1uEjy;lF1E`0z`stPL@`u-X{B;WtuC))Zi}-76{#xL#*GUja34iUzUzhUNyXkcqe;vqQi~RL*dR@g| z$MM$}`0HxPNYSRobrLexkH5afU*9EriN4H3E{;(gdCC!PNiooS$)!DwBX2oUOMcMR zU+HL6A$J=>y5Ojx8)canJquB8%#n2*G3N;Eryw`6bQA+5Ze*r*b4yvV+HvE-8YU6I=!s$?7% zw6FzEc_-f&#qUZu?8f0zf;Crx?Y74Ur{~4*$~YXzVNvTFAE=@r7E8{G&#K(02FG#u zf)0p(7^U_-HeO9h4(C>u6t8QsxA zKG3G)YB9FR9rmWJjiQ8O5;TkMVVG!Zurv`q?a*;4HtM*ig29~_AU{WRhTPE?d4CBT zMn6?_oJ@U+?q!@ONXsJ=kBRQ+@g4~6IJa10B_>w64@MC2T39Kbx!|q@oItRd7+>Q) z3~>Js@GZbJHa|9~BMO3_82gYXa{ z(hsery9^vHh05HHLtvLHqCAk#)`bf6bioiRUN`ix2SZ!o?9z^XdDqm~V>CF{YdONi z&&@p~;II%bZR!{!Jag-yMBkY6?9uYzh)1c14R~yXtNS}f3YQcXo?@iZV}zmD>V#su z9vz4b9$(HQ!P02QNIupH^T+_lW#T}w14lIHkO_CLbqwQ`GSLG?qWL|=&PI-8&aqTz zhTAs8uBjfqP-1>ipj2oA$l&loL2_D-^Z2qn(g4?efG2Z!zUZGvY13_~)OduL=6jHs zuv@E8GFJ2|^1!sHfsImAA0TJJgXD~|#%D{6F;U`y*2BPE%K=rEdO($Q38he}a2P_m z@GRpzL0TSn%+PwM5ekZXr~`IQw!{#LbHsn(xX{RvpyjCH9Q{9V+~ORD!qGtvV|W-3 zJ$Kg z;LwWw0r3=yhg0RuKy3em615yWP+o?dln2GUaL6i_xQTtT$IUj`;+CQeW;f? zY$%qz{llT6LaWVYE%}+Ew4O{RQ+wq}<9k~{o-1u3{G&qt2@Q(SUbYby^!8~bo|z}d z2@WCpb`o)X3l(M_P~9T5Ru`Vzh(!zJ<8_5IZ5&6JOQg6GpjbWw9ql3)jdeVPvc?obTXRP%be57G3KZQ!?=a5dC1r&w}FM9tf!Pu)8M;ockhTIve&e&(w4 z^7S~OAy`!=>c*>#x%H_Mf4(R;hIeD^SR?P(MeFPG{TQS*Rjj9&8y0yRiA%neZzBPy zBxq@F$*GTTDttM}@d!=kntdZLLsoO8hQe3v6)Hu}{GBXo=0-L$XB8U-${4rkR|iM8 zE3I3%KH9EbyR9}hHZz@^oVv*6a$9V55|YZyk~A62|4zOa7p3QJ4NO*mzJ zw5zMDTBtN~jMqdk<5zhF@-dy~<1NC*G%=RubQB1b=4OSP-imNZa@rI|G-1{@78y6- zYZH^Ur_9aGkJ{PU72(kQ?tps;$;jV*bTLm-KHd9p~S{W%`>-~P^Q4)=? zyBI5`G{vNjBE~T#eFlr|F@j~!-N8mrS@WB%y>m_b_U*4hBxMc`4inwn+`NU>nL%OV zSTluM2d%z}+IDlr1bu!>ns9xSV;>5$vqUiiVfIqQJH{txvED;xGr#y@%sIT@Yt!~- zcai;zI0SH|OeX6AF-wG*=VX4A;ud1Iv%&)b??J%W-LGgTZkH-By2NcsErl!lDfA9v zXC)7Ps3Kl!rA)#u$}rZOvsTnr9V%tA5GR&@1=9M9VHEMhGOl`x}}HOwG#5;Jr5 zu4~)2?YFog;)<=U?GETL8)YR9f^k{+x@CTv?$Ok zhFZj<*BoKqaS=kIA|J8kD_R-!FJNAw-G#676#-rurL6g&Qr2p~2G#;GH|?{58T<8V zFlpER2UAni`w-s+WUv$p&qXGCAa++_>^K}e&6iS}oB6a5$Mja<#zeh)s{K$wuQAAu#q+Ev4ph> z9l_dnaCwJf`xKJBi;{K@3D}OvCkfpg)e>&q#G%6!;V5Z8P)XC&kPJlvB7NaFg07}( zC#td(ixKU1MJwInQ^Hr<6{;|&1t*zw;W6fvvxnIXUdK#hr!eDy{>;)lkvVwBF`0KP zvvu^SwdvsWtDU{mk7j0OUn2UG*mt~?@+~Z>!DYpK0zGY#qBEkeqv)3jiuPjZWJNbb z&k+51m9GaFmRI!-BPrqQFAxo=PA5}Lx4AxX?TG?Dd8oyG=?T*T7G ztzdz%Bbld981o5;Vk)1|pAq{d#9jiur$g#)o}QkafrXArzU>tI4YtM ze;cO}LS<`9#9zeYKd11IgJ4bK=Q2ybo=h2>z~Xw3W+_AGu_^OEVbd1wg>5Qf>4zDy#KWW#oN30G?@EX2O66fhG8HlA26UoI#H zBi;^9Lxq4dX1K|(gvWbR;g`_DE16lj#j&m_NvoVB!}Px`c4Cz;3h$ap0p&PT*SDwRq&{i#`dvF{EZw>xEA zqxVv-cLfqKaC03hLt$Druwmm@uo;W?A)+!iyZA86nZJvrk6+0` z6DP6m=?mH9`MY6;N*jhvSl%#v;<9>Ix%W>fcAp^u%TcMLP}_v05Gy3$Fi$|xhXjZ` z0ijN5g3n_~oS0Un7=VKJ1_?+WHjf3zj$nR~gIIX{a2A(5p7l!0WkbgmvC&gEvVmiY znOEmA%s+k-8<)3(^-RlS!?Ra33>Z0|`GVFUKYUoI;F5dV-`Ur zd)SZ(tC*tGC?*RY#d;1cW{Cr*vu^#Svc4JlY|zNLuaSTgD0@rY-QA)P?3zd+be_O(z1%#;Bm_l$1+ecn>c$Ln_K`5EGlFDM;9}f z;0z{>n83WEa@e5EViwbLd_!91;<|CU8{a_n>rvxoA>L3b^GPX|mg2zg6p@H`G>`Ww zk2lk4fS`LF$7zmyspyG#oe=M&xjWgk1$$Zk3X#oOc9_jtCbG#3%Gj*p3f8%MHggOd z!Q8vfVy=5oScsAnoqx^>ZxONbS{Hh2+ywkbB_p929 z+ukaYQ08+HdD|q*eidVsNr>AU^6t`OBpr>6@{93h!t9MGWHVU*%w;TV_I5U> z_z>h!!4gKVXP(JL%zNMp<~MW$Q>H9sUMWS)BdLJdc|<-C8q~giXlRvwsN3tQcz3t< zgkdvRl409~81X4jnm9qCjBYBN@1^wf^-0NM1;R15rThz4yy*-pSX%|{?qONe*R!D$ zidgFO9n7cya^??P8<4S)g=Fn)@EW*Mcopf}nN~{2J1fzs8|={HJbCJlpFTcoq zhi+t{6ZW!@iF@(z-^bHnpV3wJZO z@Fb>KijP^=U1X|t7nq0eDU&U)VzOnYn9GXOn%_kynf=H@ri|*#)_ih>C%jyneT`a=AW^N`Dbotex$siYu~%aPkYtTD|U~glhmlEhlhtm z+xPGnXZBXQ=!k~*Ja_8}Ki{PyldSCB*v)z1)J14rD>0@$ySb@K-=?`J*E%TQZS1{< zE_CfO{p;AdM_$KH+xy<7M{a{d`f}zzc_(w9caXWRLI#Q}nG~9pE)<#b?ETDX{3h0M ztiWs|2eX0WmayV&pEZowbgdy|+%A^9A3QO_JJ8g_0voB6$&LNL7fzjphVk;9 zG&S%nOLpD+# z^^ghl1|}=9{_@>UjQliRg`nN4UT~mSm3Db zENadP7Qgr$>$Bq?^B=K|^;&vF8s(%JcfU;Y0G;$Id=b88&|V5_$Nb9!U1%m^sIPbMH2v zMbA3MdTzMMx+1y3S)XushbXzG;*wRATr(T5^*p(l za1&rE$|X3FyVqvr0R7xfqn7pTJY{c8(17VSNcN5JiJ$!B9yjeDK7-e@6i6m^-YFh@ z{NnR0Vd(`HyYLK)hU7@Qp_9v4IHVPxQ_jNhJ1l!I*M_q9V&)t+i79$5hUs1fW3rKX zr>y*8_!8JO&>0?JH=Wa9{>n|?bL20#e_rjvj0VfYk!jvj8dw5LY zj6LWUmMzOAUNoqtR0n4in{~=sYlhTML+Zbi29La@j2nNr|DMMzY2_8>kyrq$aDsJT zUBluE&$7swBFq^~+=M;QaXE|3JIW&Pj&c%}E3$x*TX_n72Csz>i2*fGcpI}VnK$|3r~;ZWyP;nEzd zcI6Tvy-p*+gCfUoFzb}LHX%4;S(z+!)lIT=?o+UyPPy;+FFy zL)Un(0`xT}diaag7nE2kK9&F(Rz@hz%O!w&T}P6P!-g+64M{Hy=rnZE3TJuf2w~wb zzA|YaB*-5L2+iKlx-Gke+Fi-bQfHW{?yIh%rXMBKBz*M?ML11-^Q964xDOL6G@+3y zF1xK9u7?>{=hSjZAR_z*5w;8(FjqII-z)>~zz73jp1$7+`2T%tSFzZAlvgTW2O1)- z`d&E%-ZM4c|9Qel^nR^efb*bD|2c#+QxSsb`A&Heo^zd3gwOTdOZX&p#Z}cq15DU@ z(RnDhg>G}OEoO?5Y6=S4QYfo!k?M#r)+oeKyl$-e%0RP+++@Aic5ugt_svzNm|)&S zj3ufVv9Cmh1z3YUUUXDUm;l&Fyf5WE`!#_b63;7D_Y5$E_BsL{wI;xuzA9UUbBcKK zRNx6y-8K*#s=a7Wr&7anJz8b2U2{2q%{iV@2F66y7Y5?{yIvQ;h&_30vG449vX&7u z$`71lv?)tf1sRIJKKH5tqeR1aB}3)JLo^dEzHpA^c@-~ZsV*Cczt(!ub_tm#>dz*t zTpFWh&e*(^r^=(X95wN{({SAgGrTHUBTpMCc#1fWwVL+iA`4T!4aLs{3gRg3CA@sD*L(4q%bPp#)cPI8Fm&o?nGoN?yF$)^Ma>BXa8l@{l8= zG>OIn_y^=AN2aMYLexa|mLj7dE82QeW*4b7lGCKr&=csA4iZRisWet>Ys`7pslPyG zvAZJxI{`m4C!PbFD7g|2?^fRiY@wOn_)N;-{RAsHd>p>1$g~uEtktICd0$U=Dicy% z;^v8>73N7R!PV-^oXJq!9_`r`_%$iY%u6bJiJajsa-q@M=44NF><>I3hKIzE${C(R z02+o38J^g#a^M9q)DS}!XQ(9xzUy(rWX`~dp^6ytI716>Fwm5sxM4nLXd?qd88H-b z25VyALf9a1h7QEQD@X}va3h9&{ZS+~lyU|IF%(e~kmHD9?FCP4tpEc`dIDzcG$GV*hJKvk7BTRp!soLZ{7vr(r-OZnpZt;k)*uRx!lm#j9*U0+ zf1uB^@I{#rB(v()0bP9R=Ifww*8}NmNl*J;wAbnQjV{)Kb%mLSu*bS?p;udEE?R6~ zgD4r4EIMAUBS;FOqdXKKI-JA@L}!Hfg91Qwk_f6}S(a{w16c!*W zEt%t8JK!zBX8=DUK9AXp1#c|kqph()9^=IJC0GQW)Ez`;G$n&lKz+1Na?^Xli7yTm1tR|>01A)7rSK^p#Am`IrUdZJ z;z`HSsp7Pm)u)V7hA=5&i-`#tCIdY&NfL;O$xfIa?TiVF&iEaM2^(KbP`iT927+lr zLP8k2cs6P}PgneDmzM>fQxBBWAMJ0=C~Aq6!g5RGM=KDf9x!_d%hf}WnAssoSV-5eU5KdDn8rnLLqboi;#wCNp^g>-w2dYRYRJ~e&+JY=W4j?&*%5*fS zCnyy}nWD_+feJuHpjDu?pp76prD-c@oA$W{&l1pj&}z^!&_d8`P!4DeD2*%uML-cz zgbENPfD+PH*w@<9y`NShhA1EHQ7+t&%P8b_Fmg|FryvCoMZZH!rFc^Gl(a>V(4ngv*Q-~rE2*ieH%5&b_2tBg6Tiac)pzsq^6t%= zHS247PMtdSF5cf6IdbGJ@O{y5T(JA&3NW(8$2xw1I)a1${$<&)_}_ssbGaRe<(@NS6gh zMnEcnG+#xViDw2OFN~3kf@9ub+>IlcG%#4LggIr*29+H@-Fq7^mWol3qs2@(= z8He&)fQjxBOel!q;o;Yklan8g88ha`+}zwZxJ~-~h7B9ou3fv>;lqbnWo0G5X_{`E zCL%Yz-@SV`+qiKf-9BA6bLPx5wOI;B&spfZ56BnNZP)+QzkOxl?qY-ertrKyF*Q+rpB*A7b6uTo#1w;nzL@01~7 z@4P}nUb)IWp6E1bLSj1!B5~~m6+@ikNmOLFsMbPpxDvd>VtstrCq8;cQo@PE+!z@M zmor_ui0xl`oi#K;SifK4M$Md&FfvOXm)jmc?LjI~XAos#GNuwYMMOlLg~aaV=jT6P zvSi6Gn>KCwt*or9?$Dt_4IoxgQNg7IN!5ei!u|j3%veqU00tq^!pmg<8t9J&6hu>BC z`aUyrko;js_XM)j>sP2bCX1AYyR41a@i@Bjgx2UUVT z0WF0c8;M#P4*O*bDK_rySj}$eU{e)D;vA>eaGk z%N!(SbDutas!?m7L+G{p_U&Wk<>d^*WK~sF?9{1K?AWnm41%pcc<|sW2=%MId-t9| zabAr(xpVNG2R{e!cNIL3jvqh%0)Bq`^wUr4LEJBew}1bBR#IYHQcDq~q@-MijJF~I zq=a6e5RkC>ft~#*s*PwIEU|bQ6&D-3H!(T+8>x@)&*qNKb%v&942(>_T|3s?!iw1| zy_hmQin#`cu@=_Wgf%qL*RN9thWr*77WSi=sp)OJI|d>PF`F71YDB0glLFAM=;DRI zoe}u{|1j|V2wXUwZk3OV4D`kO&DE#_<0qM$3g?%)B#7;e)kh4y^$?i}=)bzHQs}nE z(JQwjyiuKw1r0?SSNHGV|N6Rh>t3EcdzKNA!JuLeO>m<^H=~1oD=jU(zhlRaGEg?i z8`K7*hxbiEW;=K8^o5a0hql&%&Osv&p&6<^Z=tn%()QW2wwg%Ru3h^I5#PYF9knyV zKye@;ZHJjHt*q#vr$$vIVAPl~6$1wj_{z#r`b#S->jvC0$Q*opnZ3%FN#tr~>!xH5 zYCk6P3ub z4nzc95y9*KGJ@BLK-gU3+PPekqc7gEQd>Yy#DcM9Fg z%-mvR2!iTXZ_tFKq@?}O+=~+@PHNYNl84O z<{-iTPW$$uP@4|a)(mQs?Af!YH!7Zhigpnyd({{ywINU+qau=!kWhw*sUwpNf_<^I z&4dK?VRWqf_U*eQd-BAaAu(NFm^nJu`F2fYQfS4>RnDws9?S}4CY3R3R}W@lCt>X* z_RQ4Io>@3cSyI+iHY9%$Gicqa!Q9&7wVTT08MJf}k!+x@3N;bbp@TIMPA8a$M<9~G z|1lC_)8WQYxo0=Ily2Um<%#5|Yo3CBfxG7<957O*@(yUUw$1ssJ zOC57}5VbY`(@m%FPZrxTl8zmuMk5WBhwe>fV_QxJkE$jaQRt09vGq{u_h^OogNCnP zzupHms~w0!a#Erc=s>y6pjZj&Vjh~adQvRa^Tt4j4&_i(Py7{z2;JQ5Tldm&wDTm|JiJbMy&BeG6mGzBss0spi_X_E4cN%9%OprN zES8jrR(|TUIxTNoynp{*t6s7QuMhLmru5HH0W=+EH>!}sbd)R4aoS702K}yGUP1O+(6nPEs?gMwYSjV z3)I_tt5&VrvV8gSULaX13Z$o-|`UM2M1T+#PobF<4 znG31YK*=mEHFe3{S#usl_Kd5I89xkPVU9bon_2S;()sBz>-EzV9Dch8k)Ci@zTRf`3!?CDpPaOMNFoy9hE4!8~=op ztu0k?h&26giWK+Sx|9nWzsCflYmEAkM)%{!jpGr{nKP%!^XJdG-swqh`XgMUd-3yF zwM0jleb^OhzeZ|LB(-+{6OF5qK-7=;J8$824Dv>Z381l{9x=vAR)~vCI`rAS6v;k42g!yg;Q|*kF)f=||M5Ed%5WK5Lpw$SR z26!Ziq+%0`T=YzIu}wv~cHO!Y!^dR3O3fSDFnpoF#x4<9Pgvo^F%wwVjIpfi@GKUV zlF9;;l9^vpZ{`*f$((&q-=TS1lmcodtz>Sj9qM}i-XpA?oyA*w2g&znQ*R)y*{I(= z&=Yck=9|Oa_$QovV4;dfq~hNc>49RCL!wnmV|{=0=uu--P0&kj0x|Gs<4eLx=SI5X z)xK&+Y%SgEY(cwVuRb8Pr$X&LX>dq2d?9E9=RM7asUB`>sq4|* zzJ>@W>Dd%f+OJlYxv1?1J$m#=tgNc~YT(e+-==O|!4~co+2Zo!ENjI^Hhf_*8@YHT z8v`0RZ7%CMVFv3uGK<9x9m7I;4@3_*oY{IP(V~Z;45(Nu3u_jgmcdkkA@3!w4$s_N z-R>Z=DcCI=gWiB0;-k?**^YpmQ?N0OokKXgasenDE!f|lcH979#GE9if{ADa3k*lUB3dVnT?Rzud8 z(fZcYxP*r0)MR6P^A(!!63}!EE=QrO)g8Eyw%N+V7n;?9%DZ4N^dlL4Xqg>7dX$e$ zX@En&;h`SWA~lF$6KFC>xL&NW=SD+^4;}W!7uUZ{ACp>Nux~rteEKRAsxGnOBWKyV zPp`1ziYitFDuBlGcUQ2vyDHegne$nX3DaQrr}7$4eKhKqwYIWj&gi@Oga^Nu$=#m2 zxw_s&Ka2*L0T}+9p;l9y*!U-0QCO(r5NX}t6sb@?$jTm@r-ii^8ts;8v|Ck$qn+BD z=~K0)YOK$j?H1zoscQR16=MxsY@Y`e$58LADTw;s|H~EILed&*^+)Oz(Dkm~vSkbP zz8IQfwsPf42K!u(nV2`Q)jy&)_AQ$06{x(>kiCa5jJN~J!8Pi(QF);07}#%yKv?7S z4c^xy;D1#wjCKpmFyz(L-1x`P?6kTfv5c)dd4V0ed7tgAxyj1EpywU7_v&rDd&qWI z-(Y1|Z?TFSciFBhx7bFgKMyL;-na{@p3LMCF?`UZ4hwtl8y@&l?jgT~?sji9)hK0Gh)})F|AJLw3^YT9E>sf}wW79lXU^85e2om{x?YvBvvW^>V&d(`tn9`ewhwwebp2~~?9O9$`kQC$>^I-@=eCPC*o4*FSU}Id z%){63w~+9VAJG7Bf=m}}%1w3%6}Ix> zGgexCn>|SApSy53DS##$yJ9=9SuL=as_a5XsQLDH7^GSBO?S)pT1>p8DedD$W8B!1?ad??E8s&wXV={qPe?pU*YPDr6cub!w5$o zpVon?!>8MIOR4Zm9eIA{C*?mC?A}|qs34=E|ESI^d?F@pruJt&CiQC=n3vv=HGfP) z_NpcIi}oL^UvS{qwQ6`)F;f_{G^)lfaf%pcX!Z!xnSk(QR$ z9{r$J-Miy@XlCgW3g%{5Ay@}JGYp9snAoIAlX!t3&s29;tXRQdv}ssf3p@N7B3TLI zy|v9N%`HjIIuo+9)1N+ha(B-Bh3^Y?7PHsLd^v3IoUQxV+T&+gN#zB$`p9Xv?)U|$ z_$u2_d5LX@noFSm5;Vv3ZeR5mY;9FF=n@NviLRH+J-!PF4y-b5*De8dwF7mYsJe z6HaO_5C%5$ZXu=}RTt|Do+GT(!gryr?%2M9MmItl5YQ@Yw^NMQcA3X6s zfA7KC)!SFquUeVYFeiU-!-U)c4YL=GZCJ5(R=u!eU48cI4fP8SRlb|EvwR_KS;c1C zAekpbPm`2GKy#qJV;K9qS+;B$+2e-k)2B1o;_t9HB>OKp>@*XOf66waJ`-)Iya@L>)_d~g275c( zcL9L`_s~~b2_sDXruN#p+a&^lhyIU&3)fFu<mIECvctQL!XKckv@z|{{sb!yb5hC#YR<}XPYvP8I4aOlLF!lS3(Ek5?? zyXBSV>sD8usb6>b^{brJ7UC$DOj!}d+iYs6BA<)7Z+Cyi^`x8hAPWo zg?a5HD~vTit~~_87q4J}-+}KmA}9ornHSPd*xF`T+u7+YT!afv7<)1{C%f*_*VU9& z{@cKY`ZAp2kkzE53Y9i>D|1#iT5U^l!*{Ya!plOCJw=wO2L5u{Uk>*OU ze#te3eDNo_@wd6yq)_brl^Po{JWt!S$LUpAF;wp~^wS+tSnM@*^Uka}yABlO?>ba~ z=W@`Rxw{UOEIN4n*z!{sZs)As{Iu`HDZh>@7M|v9-@72P*D##gY8jTRKr}SZH~^Fb zHIyw{wCMTl*|Xn4Pw$|oT2ciJW-W%QTVW6r@#l+5=7Xm@+)_|SsG}_ms{zI(x(KHU zDxfaN8}v1Z#w!f|S-*b$81&97W@ct4n=-|A3h!EJyUuSA@JaZe56S@1M3sFzXGcei zZ=O6k|K$6pKj+P#U-$jHr$U-8rmkPVf6u=8S}--H|@|N)X2uqubEeTeDkj9>E>zqi(E%8D2fdwZSOn3#~)uU}s|URm|ijD`92-{4&DfBvh-i*KGkW_u5ovHZpO{Ak(?meRX- zLs)otgPpByt;$dRP95p@93gK9&BgLsGA*xBZKU>5B@60;uA~Ek2>>kxRU^!o2(unx zzC@VS2y-dI6in_>#lr!j@3^(hqK*sIxj!Sz+S=Mv^XJd!RumC`q)v2f8R76NnCMFu zivxdCufP}Ct6bA7+IxRtNSBev=eomND5w``EEa`#Ks`@TuU?@Jyg+^U87lZ0s(Xov ziXQ_40-pN#_&h+{cMH4!uj8YEtDw&?QFlS1P+Y+CGrYe9{0h!9|H9YT_YSr>JPHg9 zd=?rS`nq%H&hMdGt|qEuBSu(_Xu$MlEy_hbda*x4{}o8cOi-#Yu*BRw9YJ{9fBg7l z&Fx#S=C3TS-+iotp~L#o-|N@Euvc&1veTC?vB~-QZ0OiA_~Oy00UJo_)sX?eIjiO0 zA;kTlH87OfXlLSR&JXILAtddp!uOwcn4r-N4-hz{{qY(L^(Th^J6-rdaNm#}jEszA z*e<|zK~Hkid%_X2pgL`1RxFt;qHh9qypOiB7OpIHjlqhkcT*!;n|47ugFrOk8xFB= zfjSf)V7UI5(FK9l;0_8>Yx=+J)oJ5!S2v-HTZAB-+jpTAHl)FKSxDHQ4Ola%2;iBx^4P` zne4An?&{}~j*xU`x zu*hhJTaoHjA-?ZqzVc@X@G$5T&=P2C2%0coq_jQyBDB2%8`!NZydD4ZC6d3^5-p&B z43RDcs0%0ua;!tljGp8M#ex*zqao-5v9F~!^*uJZrelTFTL;?dkSm1`e^5MVa8OXt z1~fnqh7KM242$_sV6z^f5D%IhPH{lZ+`55bXYn)>+qIL*nQJO0PFZ=QVp^yzP3Jp8)u+3S~N%J|=mCCgdL zxI7lwa{x0nv#K{RGbT!MCV0572|V2NQG)=IaJbRW&4imLyIZffjZ_8{05!+DuasS}K8iE3&>5Jo})% z3Y5x9X!9bpbHm%)`#$Q%~}!e1-n&wNApB`^?puoA-ms0@sw{do;J zMS2L+)({6Il-4Gw;!SmBX*u`?~LcdQ%^jn$08;eVJ`oUuGAc%&gTB4NaQ2 zuD5n{csFzIoJS}rrA94UjI=N}r!F?_$)(FoaTtSH3`9>IwBH4z{r%BI#2?;K8$uHi z!se)sX@6QJh#BUc0{mkja=5cV^lS`-&t?>ey}NjC(iJMMxu#-8(7PT7K{@1hKxV1q z91Q9PY0rTMs$fGdqkmNmpB6U+sW@cyqk0vZhdwFYSF z{yzwWPc+OGyZ7n%}e4W>Z)6=-Kqp$?pY?Kp|{_XOS_ zhXh4vpd9)71ZBGfT38F4v;yV52%1<7DumRRz>TkmBr75P_2AozIuC)lT#AHHKQDqb@QuR0Yv|ZHlSha*E_{xRzRwoQ zS;VL%%&RBvKaEU<8S2ffe7iN+`bNIDwRd=o)Q!bPWfjUl-ziGw2O6NB({OJajRr8H zN7&f<-mV=9?>`yg|G5Sn0lR(VLo)w7$M|ca+zzfnqmR186NQxtf*8@m83)0_< z@_zur*bRw&0?C!4z1@j&yaV~$iZZcBiChB^+kS}zpGO1cKlTDN2Y zB=yaTT@}BD51rL8VCG7ezPOxC-g%XcTz8tq%_yn2k52o=*-?7aL+%mlh_NA3W27zr zogw`kZwnnigh9gMgx)5?*Zkq#Uyjy^pM;kh*66eGshJ?B)c)t8Km}8{3K*#%PunQB zM*tF#41_JD>fw+`DH`KlFxn+BJ?l{LSCe>A=$E6=FGT@gh{B!^ngyDPLO+8Dzo+Aw z3z`j{d{6=S3sD)C!7qie8AAC4jY=8fIfU?!L_}Cc97n5Di3Z^kRB#?$F z+A`61=fz_sZy0+#bIFFE^7q}S+kUf_ZNBlA?fn`i`qC@5_R{OxiA7s4rDqHu@8KbL zLNv`u_82oj_UN73Xk<@Q(KI)SK{Nu_{QbK@Ht}=WcWRV5J^y(^o5K0OLV5dEy9zl% z?7P5w9qK?EHz=S;+Zwk;5Y`}jkQ>TqUkHC0?Efm*>>>zjG0O5n2yi|L7KbHGhn=4U zd!K~^b4H>b4+9Osxk2gJhdLNf`kjGyqkw0EFB|;RVWH+gA&XIO=ztMY><(C?-Jzkj zp?gsr_hX=c7)mHZhne<~_zvY)SEkLJKiALCm-eai;q+$ggWL!o@5tDH zGdLdb??!h2O+fjYM5V2vv0X(6QbdWiCbUMfs5aPu9MP)|g3$Y*IE{p1$%Yc9<2e)A zn+8Enh9bs6u%jX1VG#6S@DCz_;0Hhf{Xqlpo7`!@hk|c38s`a6#1zzuIS989hHV8D zu@=qDCO6n-vwj6|A{(LuvTlK(G1hoGmKj(4f(Vh?~= z`$FU?pk(|`#v+BrG_@yWhaHfoU1T)8pd0h6e`tImI1ngcS?v#G+KkLc|{tL>&)GfT)w8mL7Qa z#I++ zDUDravgU3O@hf{3L|laHue_By4kTI(K;feaf5QFG15?4I&}u|jqYnP+NnM#g@%+)K z79GgXy!Yq|l?iUi_!ddqebGnMhM*Q8D!%PN<{&GO9f$^6GK|sPG0jABRWxhXOo=Ux zO2}7*Zwge9@$Up#dxF#;ACND|9~1xz1aA=h1tE+egcX2rv3=B*e<4NCz0#QMvc98T>0<_c;<)@MU z`Q0DgRDh}cP<182lPn~ljv$f^5&fn%mN4Q&xF$S8ikK473?yO;{}l-8`$j=E=1W_l zC2-RiPcT_;^?wVBJpYqN3ZO|NX*)ns+!B$qO>! zk=(}gZ5PEv-`du{yOI3Vk3D96?9BVvS;Ulir<}OrdJ0FrW z^LO+moIM(ay8VFPA6%sejNv@6>33eq$4=$P&ajW2iCU*#$0lzD`&7Thf;`o)rMNHE zPhS)0%8ouoE9E}M!q0~0O7T&aUrp=M1B2u`r3do-+R%p+tch)pheG8hk3^w)i3je- zDe{~9=RnC{0cC#*$Z+nlU*10jwX(U~9oK>QP5;yP5C7%8&|D%{iUBYEa{k0ag^&NA zhhvQQ`jj{9AC+4Q*EY#V;hcK^oHl~zE=xLN)NmsS!Ma-*K9LCXiwW1*Dj& z%r2IAX<19a%EkPz3};^Y*@-n}{*V5Gq4Yr2zYAO|l8Kmkgx`UjDnl zr4?TVeDxP$qr?XMRi+OV1*pWwl7MS};a32Im-s{(aOE!;N)LqnW#FHG=BXCHOANUD z7k-6DeLPXdQv+)Lf&q&B%fK~$^Zt$BqJYLim8rzlX&sc?izT7LY?BbgSpt8w&W#g5 z6w2MW0I~EySpW)BsPY0XNrWcJF-UoZ3I?(fApTGja2}RQ^Q!c~!vGYpOeG4`OK^6F zsiEKD!RL73#>quBrT_>ie@4=e231zKqdN3=GQB2}9MZz3{ z<}&BbMa(9+fSIZ$Gh^rB%+hNjiyXC&_0GQ{sPuep(y@b9`hf+l^-OVi_U5-XYxMdR zUKhjL1?Hm>>R^XccqGV-o`WJ&gAQ8yg&6L@Q3at&LhbygYS8|LHDb6IM?(n>Bh)H* zrUvaZzgi5B;AjG&iG*4Q$GEH_ymsT5}HS7hk&_SzcYc(;pkFAiwHG!pQu5TW>t#e%Q?D<&=Nx1I1JUG$qO!u z;afSnpU^Twn_2eKpaYgdRtGtHiqI-T4NN*~(9~65is7Gf^ctZxgc`Q+*Pz2T-4VlY zaP$G84++)PbJL({8zJY%9DPCP%fMy2Iu6=!H+(LJzYa`qqhq6ak-p-V7_JwD7x+H% zgARkZ4m-fNBnZCkG+6iiOVA+46oe^*igk5$oHSrm4us*w!B7IjIOwhcJ7tN`9|sc% zObkMb^^JlwXz;MT&>u$!5t>S9v*s}xR2H`!`r~LOp;?3)8pU!{*T!EAn-DY)MJ|`X zJOZ1yiqm+t@|pqlaj#1WEh4n7Wr_xMi&_QsadZ=*C4^cyXJ}B*#Pv`gNB0w2MyP{2 zM}xMo?F;pB^c100gtl`TP3Sru4=9gg*9fa2thM7Xjn8I=K2RPp23&_qH#!g-Zji=ij<$-zMcrV`j8L|a?+^gN+Yj%E^?1vJ;#dlIt^oy9Bz zrnB~*+005knc4eIXA-Z;tW}4>ta;lmtcjj4YohPX^qU1RgO*{;&^U%QhnZ~eID|>O zbD2x{Vy1{$$-ELaF?rWDOx}GxbL)ZABU9Eg#o+BMWSq#lOgqE6&$-MJb1$)^>6ciS ziDy~Z=o1p=Gx`AY$tYv)y|*z-|M{%B-Ed~msvB$BJd~NV2%y1(N*q5ScnD;f8;E^D zCE}U9VAD4E-dpP`;;v0vR|$9R*SgBM>lC@X#9mdwv*7OS17q~BSl!qHnw(twkX&EB2=0mdheGx!=x2&3mxLl6Un+uw_!(8Ar!o|2{xUR}%2()F z{7e8uhfU!cwNPaB%R#@pQ@J}+;(mZ1GG@D3ti+gW$|!$qez#L+*MJ QJgQhSOFZ*3G_lS91JJ_$N&o-= delta 46202 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 literal 0 HcmV?d00001 diff --git a/code/ryzom/client/data/gamedev/adds/shapes/Ge_gift_blue_yubo.shape b/code/ryzom/client/data/gamedev/adds/shapes/Ge_gift_blue_yubo.shape new file mode 100644 index 0000000000000000000000000000000000000000..c1c313e804defc0c6ffcd45ce65b752b1f559199 GIT binary patch literal 9730 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 literal 0 HcmV?d00001 diff --git a/code/ryzom/client/data/gamedev/adds/shapes/Ge_gift_green.shape b/code/ryzom/client/data/gamedev/adds/shapes/Ge_gift_green.shape new file mode 100644 index 0000000000000000000000000000000000000000..4b2cf8e9298f73ad92f6e8ca8e4bba54cc6f31fb GIT binary patch literal 9584 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 ZdR4?^uOt0`<)M#9Y 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 literal 0 HcmV?d00001 diff --git a/code/ryzom/client/data/gamedev/adds/shapes/Ge_gift_red.shape b/code/ryzom/client/data/gamedev/adds/shapes/Ge_gift_red.shape new file mode 100644 index 0000000000000000000000000000000000000000..6ab854bd5da8d640aa34d97f8b31bc2e130cf7c6 GIT binary patch literal 9582 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 hA~0uMGk#|Mu2)4(^gh`CH@VAFeR@JR8 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 literal 0 HcmV?d00001 diff --git a/code/ryzom/client/data/gamedev/adds/shapes/UL_Mission_Hall_Of_Fame.shape b/code/ryzom/client/data/gamedev/adds/shapes/UL_Mission_Hall_Of_Fame.shape new file mode 100644 index 0000000000000000000000000000000000000000..21773da12f65816544e1c46ac8348ab91d76051b GIT binary patch literal 74362 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 literal 0 HcmV?d00001 diff --git a/code/ryzom/client/data/gamedev/interfaces_v3/actions.xml b/code/ryzom/client/data/gamedev/interfaces_v3/actions.xml index 3b0395826..06cbac804 100644 --- a/code/ryzom/client/data/gamedev/interfaces_v3/actions.xml +++ b/code/ryzom/client/data/gamedev/interfaces_v3/actions.xml @@ -27,6 +27,7 @@ + @@ -165,6 +166,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -262,6 +287,8 @@ + + diff --git a/code/ryzom/client/data/gamedev/interfaces_v3/bot_chat_v4.xml b/code/ryzom/client/data/gamedev/interfaces_v3/bot_chat_v4.xml index 4efed8d2f..caf7394f8 100644 --- a/code/ryzom/client/data/gamedev/interfaces_v3/bot_chat_v4.xml +++ b/code/ryzom/client/data/gamedev/interfaces_v3/bot_chat_v4.xml @@ -4454,6 +4454,10 @@ + + + + + diff --git a/code/ryzom/client/data/gamedev/interfaces_v3/guild.xml b/code/ryzom/client/data/gamedev/interfaces_v3/guild.xml index 3ecd0f746..8bcf456e9 100644 --- a/code/ryzom/client/data/gamedev/interfaces_v3/guild.xml +++ b/code/ryzom/client/data/gamedev/interfaces_v3/guild.xml @@ -1088,7 +1088,8 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/code/ryzom/client/data/gamedev/interfaces_v3/hierarchy.xml b/code/ryzom/client/data/gamedev/interfaces_v3/hierarchy.xml index d3fe32848..4bdd0c761 100644 --- a/code/ryzom/client/data/gamedev/interfaces_v3/hierarchy.xml +++ b/code/ryzom/client/data/gamedev/interfaces_v3/hierarchy.xml @@ -16,6 +16,7 @@ + diff --git a/code/ryzom/client/data/gamedev/interfaces_v3/info_player.xml b/code/ryzom/client/data/gamedev/interfaces_v3/info_player.xml index f9d129789..cc76e5f80 100644 --- a/code/ryzom/client/data/gamedev/interfaces_v3/info_player.xml +++ b/code/ryzom/client/data/gamedev/interfaces_v3/info_player.xml @@ -640,6 +640,13 @@ posparent="tab1" group="content:rpjobs" hardtext="uiRpJobs" + onclick_r="" + params_r="" /> + - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + @@ -3277,7 +3391,7 @@ action="lua:game:onMissionJournalOpened()" /> - + diff --git a/code/ryzom/client/data/gamedev/interfaces_v3/inventory.xml b/code/ryzom/client/data/gamedev/interfaces_v3/inventory.xml index 8fbd69efe..b3817ce12 100644 --- a/code/ryzom/client/data/gamedev/interfaces_v3/inventory.xml +++ b/code/ryzom/client/data/gamedev/interfaces_v3/inventory.xml @@ -985,7 +985,31 @@ tooltip_posref="TR TL" tooltip_posref_alt="TL TR" /> - + + @@ -1290,6 +1314,143 @@ params="value=add(@UI:PHRASE:SELECT_MEMORY,-1)" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/code/ryzom/client/data/gamedev/interfaces_v3/keys.xml b/code/ryzom/client/data/gamedev/interfaces_v3/keys.xml index 5632f3c86..5cad940bd 100644 --- a/code/ryzom/client/data/gamedev/interfaces_v3/keys.xml +++ b/code/ryzom/client/data/gamedev/interfaces_v3/keys.xml @@ -26,6 +26,8 @@ + + @@ -82,6 +84,26 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/code/ryzom/client/data/gamedev/interfaces_v3/reset.xml b/code/ryzom/client/data/gamedev/interfaces_v3/reset.xml index 684d9e85a..6c920a76c 100644 --- a/code/ryzom/client/data/gamedev/interfaces_v3/reset.xml +++ b/code/ryzom/client/data/gamedev/interfaces_v3/reset.xml @@ -95,11 +95,233 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/code/ryzom/client/data/gamedev/interfaces_v3/taskbar.xml b/code/ryzom/client/data/gamedev/interfaces_v3/taskbar.xml index a828dc08b..5ad82b280 100644 --- a/code/ryzom/client/data/gamedev/interfaces_v3/taskbar.xml +++ b/code/ryzom/client/data/gamedev/interfaces_v3/taskbar.xml @@ -1004,7 +1004,10 @@ - + + - + diff --git a/code/ryzom/client/src/bg_downloader_access.cpp b/code/ryzom/client/src/bg_downloader_access.cpp index df95c6454..699f01f3a 100644 --- a/code/ryzom/client/src/bg_downloader_access.cpp +++ b/code/ryzom/client/src/bg_downloader_access.cpp @@ -336,21 +336,21 @@ void CBGDownloaderAccess::CDownloadCoTask::run() } } } - catch(EDownloadException &e) + catch(const EDownloadException &e) { //shutdownDownloader(); Parent->_TaskResult = TaskResult_Error; Parent->_ErrorMsg.fromUtf8(e.what()); Parent->_DownloadThreadPriority = ThreadPriority_DownloaderError; } - catch(EDownloadTerminationRequested &e) + catch(const EDownloadTerminationRequested &e) { shutdownDownloader(); Parent->_TaskResult = TaskResult_Error; Parent->_ErrorMsg = ucstring(e.what()); Parent->_DownloadThreadPriority = ThreadPriority_DownloaderError; } - catch(NLMISC::EStream &e) + catch(const NLMISC::EStream &e) { shutdownDownloader(); Parent->_TaskResult = TaskResult_Error; @@ -358,7 +358,7 @@ void CBGDownloaderAccess::CDownloadCoTask::run() Parent->_ErrorMsg = CI18N::get("uiBGD_ProtocolError") + ucstring(" : ") + ucstring(e.what()); Parent->_DownloadThreadPriority = ThreadPriority_DownloaderError; } - catch (EWaitMessageTimeoutException &e) + catch (const EWaitMessageTimeoutException &e) { shutdownDownloader(); Parent->_TaskResult = TaskResult_Error; @@ -517,7 +517,7 @@ void CBGDownloaderAccess::CDownloadCoTask::restartDownloader() ok = true; break; } - catch (EWaitMessageTimeoutException &) + catch (const EWaitMessageTimeoutException &) { // no-op, just continue the loop for another try } diff --git a/code/ryzom/client/src/camera_recorder.cpp b/code/ryzom/client/src/camera_recorder.cpp index 9ef556b06..309eee039 100644 --- a/code/ryzom/client/src/camera_recorder.cpp +++ b/code/ryzom/client/src/camera_recorder.cpp @@ -239,7 +239,7 @@ class CAHSaveCameraRecord : public IActionHandler nlwarning("Couldn't compute camera recorder next filename"); } } - catch(EStream &e) + catch(const EStream &e) { nlwarning(e.what()); } @@ -283,7 +283,7 @@ NLMISC_COMMAND(loadCamRec, "Load a camera path record file (.cr)", "") f.serialCont(Track); State = Idle; } - catch(EStream &e) + catch(const EStream &e) { nlwarning(e.what()); } diff --git a/code/ryzom/client/src/cdb_branch.cpp b/code/ryzom/client/src/cdb_branch.cpp index 06501e940..60c6b63f4 100644 --- a/code/ryzom/client/src/cdb_branch.cpp +++ b/code/ryzom/client/src/cdb_branch.cpp @@ -87,7 +87,7 @@ extern const char *CDBBankNames[INVALID_CDB_BANK+1]; // reset all static data void CCDBNodeBranch::reset() { - for ( uint b=0; b!=INVALID_CDB_BANK; ++b ) + for ( uint b=0; binit( read.getRootNode (), progressCallBack, true ); } } - catch (Exception &e) + catch (const Exception &e) { // Output error nlwarning ("CFormLoader: Error while loading the form %s: %s", fileName.c_str(), e.what()); diff --git a/code/ryzom/client/src/character_cl.cpp b/code/ryzom/client/src/character_cl.cpp index 87332f42d..1d7c87c2a 100644 --- a/code/ryzom/client/src/character_cl.cpp +++ b/code/ryzom/client/src/character_cl.cpp @@ -4484,8 +4484,9 @@ bool CCharacterCL::isCurrentBehaviourAttackEnd() const case MBEHAV::AREA_ATTACK: return true; default: - return false; + break; } + return false; } @@ -4521,6 +4522,10 @@ void CCharacterCL::applyBehaviourFlyingHPs(const CBehaviourContext &bc, const MB else deltaHPColor = ClientCfg.SystemInfoParams["dg"].Color; } + else + { + deltaHPColor = CRGBA(127,127,127); + } } else { @@ -8333,7 +8338,7 @@ ADD_METHOD(void CCharacterCL::displayDebug(float x, float &y, float lineStep)) / TextContext->printfAt(x, y, "(Walk)Run Factor: %f", runFactor()); y += lineStep; // Display the current animation name(id)(offset)(nbloop) pour le channel MOVE. - TextContext->printfAt(x, y, "Current Animation: %s(%u)(%f)(%u loops)", animId(MOVE)==-1?"[NONE]":currentAnimationName().c_str(), animId(MOVE), animOffset(MOVE), _NbLoopAnim); + TextContext->printfAt(x, y, "Current Animation: %s(%u)(%lf)(%u loops)", animId(MOVE)==std::numeric_limits::max()?"[NONE]":currentAnimationName().c_str(), animId(MOVE), animOffset(MOVE), _NbLoopAnim); y += lineStep; // First Pos if(_First_Pos) @@ -9006,6 +9011,14 @@ void CCharacterCL::setAuraFX(uint index, const CAnimationFX *sheet) if (sheet == NULL) { + std::list::iterator itAttachedFxToStart = _AttachedFXListToStart.begin(); + while(itAttachedFxToStart != _AttachedFXListToStart.end()) + { + if ((*itAttachedFxToStart).MaxNumAnimCount == index) + itAttachedFxToStart = _AttachedFXListToStart.erase(itAttachedFxToStart); + else + ++itAttachedFxToStart; + } // if there's already an aura attached, and if it is not already shutting down if (_AuraFX[index] && _AuraFX[index]->TimeOutDate == 0.f) { diff --git a/code/ryzom/client/src/client.cpp b/code/ryzom/client/src/client.cpp index 8eea73241..72fe1c0b1 100644 --- a/code/ryzom/client/src/client.cpp +++ b/code/ryzom/client/src/client.cpp @@ -85,7 +85,7 @@ using namespace NLNET; // We don't catch(...) because these exception are already trapped with the se_translation that generate the NeL message box #define RYZOM_TRY(_block) try { nlinfo(_block" of Ryzom..."); -#define RYZOM_CATCH(_block) nlinfo(_block" of Ryzom success"); } catch(EFatalError &) { return EXIT_FAILURE; } +#define RYZOM_CATCH(_block) nlinfo(_block" of Ryzom success"); } catch(const EFatalError &) { return EXIT_FAILURE; } ///////////// // GLOBALS // @@ -168,7 +168,7 @@ static bool connect() goto end; } } - catch(Exception &e) + catch(const Exception &e) { nlwarning("Can't connect to web server '%s': %s", server.c_str(), e.what()); goto end; diff --git a/code/ryzom/client/src/client_cfg.cpp b/code/ryzom/client/src/client_cfg.cpp index 94900e123..9b60a4c5f 100644 --- a/code/ryzom/client/src/client_cfg.cpp +++ b/code/ryzom/client/src/client_cfg.cpp @@ -2017,7 +2017,7 @@ void CClientConfig::release () // Save the camera distance writeDouble("CameraDistance", ClientCfg.CameraDistance); } - catch (Exception &e) + catch (const Exception &e) { nlwarning ("Error while set config file variables : %s", e.what ()); } diff --git a/code/ryzom/client/src/client_chat_manager.cpp b/code/ryzom/client/src/client_chat_manager.cpp index 0eafbd007..fa4159b1f 100644 --- a/code/ryzom/client/src/client_chat_manager.cpp +++ b/code/ryzom/client/src/client_chat_manager.cpp @@ -963,7 +963,7 @@ void CClientChatManager::buildTellSentence(const ucstring &sender, const ucstrin else { // Does the char have a CSR title? - csr = CHARACTER_TITLE::isCsrTitle(CEntityCL::getTitleFromName(sender)) ? ucstring("(CSR) ") : ucstring(""); + if (CHARACTER_TITLE::isCsrTitle(CEntityCL::getTitleFromName(sender))) csr = ucstring("(CSR) "); } ucstring cur_time; @@ -1018,7 +1018,7 @@ void CClientChatManager::buildChatSentence(TDataSetIndex /* compressedSenderInde ucstring csr; // Does the char have a CSR title? - csr = CHARACTER_TITLE::isCsrTitle(CEntityCL::getTitleFromName(sender)) ? ucstring("(CSR) ") : ucstring(""); + if (CHARACTER_TITLE::isCsrTitle(CEntityCL::getTitleFromName(sender))) csr = ucstring("(CSR) "); if (UserEntity && senderName == UserEntity->getDisplayName()) { @@ -1267,6 +1267,12 @@ void CClientChatManager::updateChatModeAndButton(uint mode, uint32 dynamicChanne const bool teamActive = pIM->getDbProp("SERVER:GROUP:0:PRESENT")->getValueBool(); const bool guildActive = pIM->getDbProp("SERVER:GUILD:NAME")->getValueBool(); + if (m == CChatGroup::team && ! teamActive) + m = PeopleInterraction.TheUserChat.Filter.getTargetGroup(); + + if (m == CChatGroup::guild && ! guildActive) + m = PeopleInterraction.TheUserChat.Filter.getTargetGroup(); + if (pUserBut) { switch(m) diff --git a/code/ryzom/client/src/color_slot_manager.cpp b/code/ryzom/client/src/color_slot_manager.cpp index 996d256a5..f7c059171 100644 --- a/code/ryzom/client/src/color_slot_manager.cpp +++ b/code/ryzom/client/src/color_slot_manager.cpp @@ -323,7 +323,7 @@ bool CColorSlotManager::addSlotsFromConfigFile(NLMISC::CConfigFile &cf, uint &st { mask_extensions = &cf.getVar("mask_extensions"); } - catch (NLMISC::EUnknownVar &) + catch (const NLMISC::EUnknownVar &) { return false; } @@ -343,7 +343,7 @@ bool CColorSlotManager::addSlotsFromConfigFile(NLMISC::CConfigFile &cf, uint &st _Slots[k + startSlot][l] = extensions.asString(l); } } - catch (NLMISC::EUnknownVar &) + catch (const NLMISC::EUnknownVar &) { _Slots.resize(startSlot); nlwarning(("CColorSlotManager::addSlotsFromConfigFile : invalid config file, variable not found :" + mask_extensions->asString(k) + "_color_id").c_str()); @@ -355,7 +355,7 @@ bool CColorSlotManager::addSlotsFromConfigFile(NLMISC::CConfigFile &cf, uint &st { _Separator = cf.getVar("default_separator").asString(); } - catch (NLMISC::EUnknownVar &) + catch (const NLMISC::EUnknownVar &) { _Separator = "_"; } diff --git a/code/ryzom/client/src/commands.cpp b/code/ryzom/client/src/commands.cpp index fbea6da96..877f80429 100644 --- a/code/ryzom/client/src/commands.cpp +++ b/code/ryzom/client/src/commands.cpp @@ -1096,7 +1096,7 @@ NLMISC_COMMAND(execScript, "Execute a script file (.cmd)","") // read one byte iFile.serialBuffer ((uint8 *)buffer, 1); } - catch (EFile &) + catch (const EFile &) { *buffer = '\0'; eof = true; @@ -5137,7 +5137,7 @@ NLMISC_COMMAND(luaObject, "Dump the content of a lua object", " [max // make a reference to the table to be inspected (is this this a primitive type, just make a copy) luaState->executeScript(std::string(inspectedTable) + " = " + args[0]); } - catch(ELuaError &e) + catch(const ELuaError &e) { CLuaIHM::debugInfo(e.what()); return false; @@ -5407,7 +5407,7 @@ NLMISC_COMMAND(dumpPosAsPrim, "ld helper : add current position to pos.primitive stream.open(path); stream.serialBuffer((uint8 *) &srcFile[0], fileSize); } - catch(NLMISC::EStream &e) + catch(const NLMISC::EStream &e) { nlinfo(e.what()); srcFile.clear(); @@ -5455,7 +5455,7 @@ NLMISC_COMMAND(dumpPosAsPrim, "ld helper : add current position to pos.primitive stream.open(path); stream.serialBuffer((uint8 *) &srcFile[0], (uint)srcFile.size()); } - catch(NLMISC::EStream &e) + catch(const NLMISC::EStream &e) { nlinfo(e.what()); } diff --git a/code/ryzom/client/src/connection.cpp b/code/ryzom/client/src/connection.cpp index 4fafcdd07..1750d253b 100644 --- a/code/ryzom/client/src/connection.cpp +++ b/code/ryzom/client/src/connection.cpp @@ -1011,7 +1011,7 @@ TInterfaceState globalMenu() if ( ! firewallTimeout ) NetMngr.update(); } - catch ( EBlockedByFirewall& ) + catch (const EBlockedByFirewall&) { if ( NetMngr.getConnectionState() == CNetManager::Disconnect ) { @@ -1811,13 +1811,13 @@ string getTarget(CCtrlBase * /* ctrl */, const string &targetName) if (!elem) { nlwarning(" : Element is NULL"); - return false; + return ""; } const CReflectedProperty *pRP = CReflectSystem ::getProperty(elem->getReflectedClassName(), rTI.PropertyName); if (pRP->Type == CReflectedProperty::String) return ((elem->*(pRP->GetMethod.GetString))()); - return string(""); + return ""; } // ------------------------------------------------------------------------------------------------ diff --git a/code/ryzom/client/src/continent.cpp b/code/ryzom/client/src/continent.cpp index dc1d0fdaf..eb5a4dbe6 100644 --- a/code/ryzom/client/src/continent.cpp +++ b/code/ryzom/client/src/continent.cpp @@ -473,7 +473,7 @@ void CContinent::select(const CVectorD &pos, NLMISC::IProgressCallback &progress // Set the texture for the coarse mesh manager Scene->setCoarseMeshManagerTexture (CPath::lookup(seasonname).c_str()); } - catch (Exception &e) + catch (const Exception &e) { nlwarning (e.what()); } @@ -509,7 +509,7 @@ void CContinent::select(const CVectorD &pos, NLMISC::IProgressCallback &progress { LandscapeIGManager.initIG (Scene, CPath::lookup(LandscapeIG).c_str(), Driver, Season, &progress); } - catch (Exception &e) + catch (const Exception &e) { nlwarning (e.what()); } @@ -641,7 +641,7 @@ void CContinent::select(const CVectorD &pos, NLMISC::IProgressCallback &progress BackgroundIG = UInstanceGroup::createInstanceGroup(BackgroundIGName); } } - catch (Exception &e) + catch (const Exception &e) { nlwarning (e.what()); } @@ -1266,7 +1266,7 @@ void CContinent::dumpVillagesLoadingZones(const std::string &filename) { outBitmap.writeTGA(outFile, 24, true); } - catch(EStream &) + catch(const EStream &) { } } @@ -1327,7 +1327,7 @@ void CContinent::dumpFogMap(CFogMapBuild::TMapType mapType, const std::string &f { outBitmap.writeTGA(outFile, 24); } - catch(EStream &) + catch(const EStream &) { } } diff --git a/code/ryzom/client/src/entity_cl.cpp b/code/ryzom/client/src/entity_cl.cpp index bc63d9d85..fbbe0c041 100644 --- a/code/ryzom/client/src/entity_cl.cpp +++ b/code/ryzom/client/src/entity_cl.cpp @@ -3064,7 +3064,8 @@ void CEntityCL::updateVisiblePostPos(const NLMISC::TTime &/* currentTimeInMs */, } } - if (!_StateFX.empty()) { + if (!_StateFX.empty()) + { // Build a matrix for the fx NLMISC::CMatrix mat; mat.identity(); @@ -3529,8 +3530,10 @@ CVector CEntityCL::dirToTarget() const //---------------------------------------------------------------------- void CEntityCL::setStateFx(const std::string &fxName) { - if (fxName != _StateFXName) { - if (!_StateFX.empty() && Scene) { + if (fxName != _StateFXName) + { + if (!_StateFX.empty() && Scene) + { Scene->deleteInstance(_StateFX); } @@ -3556,7 +3559,8 @@ void CEntityCL::setStateFx(const std::string &fxName) //---------------------------------------------------------------------- void CEntityCL::removeStateFx() { - if (!_StateFX.empty() && Scene) { + if (!_StateFX.empty() && Scene) + { Scene->deleteInstance(_StateFX); _StateFXName = ""; } diff --git a/code/ryzom/client/src/far_tp.cpp b/code/ryzom/client/src/far_tp.cpp index b6fceac51..fb23b5810 100644 --- a/code/ryzom/client/src/far_tp.cpp +++ b/code/ryzom/client/src/far_tp.cpp @@ -174,7 +174,7 @@ const std::string& CLoginStateMachine::toString(CLoginStateMachine::TEvent event outputF.close(); \ } \ } \ - catch ( Exception & ) \ + catch (const Exception &) \ {} \ _CurrentState = stateId; \ break; \ @@ -912,7 +912,7 @@ retryJoinEdit: outputF.close(); } } - catch ( Exception & ) + catch (const Exception &) {} // If the session is not a permanent session and has vanished, pop the position diff --git a/code/ryzom/client/src/fog_map.cpp b/code/ryzom/client/src/fog_map.cpp index bd1e47978..78cd7ecda 100644 --- a/code/ryzom/client/src/fog_map.cpp +++ b/code/ryzom/client/src/fog_map.cpp @@ -224,7 +224,7 @@ void CFogMap::load(NLMISC::CBitmap &bm, const std::string &filename) inputFile.close(); } } - catch(NLMISC::EStream &e) + catch(const NLMISC::EStream &e) { nlwarning(e.what()); inputFile.close(); diff --git a/code/ryzom/client/src/http_client.cpp b/code/ryzom/client/src/http_client.cpp index 6a10034cd..4c5f03d6d 100644 --- a/code/ryzom/client/src/http_client.cpp +++ b/code/ryzom/client/src/http_client.cpp @@ -57,7 +57,7 @@ bool CHttpClient::connect(std::string server) nldebug("Connected to web server '%s'", server.c_str()); } } - catch(Exception &e) + catch(const Exception &e) { nlwarning("Can't connect to web server '%s': %s", server.c_str(), e.what()); goto end; diff --git a/code/ryzom/client/src/init.cpp b/code/ryzom/client/src/init.cpp index f94fa8321..55d09c69e 100644 --- a/code/ryzom/client/src/init.cpp +++ b/code/ryzom/client/src/init.cpp @@ -1105,7 +1105,7 @@ void prelogInit() FPU_CHECKER_ONCE } - catch (Exception &e) + catch (const Exception &e) { ExitClientError (e.what()); } @@ -1264,7 +1264,7 @@ void postlogInit() { SoundMngr->init(&ProgressBar); } - catch(Exception &e) + catch(const Exception &e) { nlwarning("init : Error when creating 'SoundMngr' : %s", e.what()); // leak the alocated sound manager... @@ -1433,7 +1433,7 @@ void postlogInit() nlinfo ("PROFILE: %d seconds for postlogInit", (uint32)(ryzomGetLocalTime ()-initStart)/1000); } - catch (Exception &e) + catch (const Exception &e) { ExitClientError (e.what()); } diff --git a/code/ryzom/client/src/init_main_loop.cpp b/code/ryzom/client/src/init_main_loop.cpp index 9b37a1a53..2610b5882 100644 --- a/code/ryzom/client/src/init_main_loop.cpp +++ b/code/ryzom/client/src/init_main_loop.cpp @@ -187,7 +187,8 @@ struct CStatThread : public NLMISC::IRunnable { std::string chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; std::string s; - for (int i = 0; i < 32; i++) { + for (int i = 0; i < 32; i++) + { s += chars[uint(frand(float(chars.size())))]; } return s; @@ -864,7 +865,7 @@ void initMainLoop() // load hlsBank Driver->loadHLSBank("characters.hlsbank"); } - catch(Exception &e) + catch(const Exception &e) { nlwarning("Can't load HLSBank: %s", e.what()); } diff --git a/code/ryzom/client/src/interface_v3/action_handler.cpp b/code/ryzom/client/src/interface_v3/action_handler.cpp index 529c7f1c2..242543531 100644 --- a/code/ryzom/client/src/interface_v3/action_handler.cpp +++ b/code/ryzom/client/src/interface_v3/action_handler.cpp @@ -77,7 +77,7 @@ std::string IActionHandler::getParam (const string &Params, const string &ParamN std::string::size_type e = allparam.find('='); if (e == std::string::npos || e == 0) break; std::string::size_type p = allparam.find('|'); - string tmp = strlwr(allparam.substr(0,e)); + string tmp = NLMISC::toLower(allparam.substr(0,e)); skipBlankAtEnd(tmp); if (tmp == param) { @@ -103,7 +103,7 @@ void IActionHandler::getAllParams (const string &Params, vector< paircloseAllInterfaces(); + + if (PeopleInterraction.TheUserChat.Filter.getTargetGroup() == CChatGroup::guild) + ChatMngr.updateChatModeAndButton(CChatGroup::say); } }; REGISTER_ACTION_HANDLER( CHandlerDoQuitGuild, "do_quit_guild"); @@ -2497,7 +2503,9 @@ class CAHAddShape : public IActionHandler { shape = sShape.substr(0, index); sShape = sShape.substr(index+1); - } else { + } + else + { shape = sShape; have_shapes = false; } diff --git a/code/ryzom/client/src/interface_v3/action_handler_help.cpp b/code/ryzom/client/src/interface_v3/action_handler_help.cpp index f6271f355..4c92fe6e0 100644 --- a/code/ryzom/client/src/interface_v3/action_handler_help.cpp +++ b/code/ryzom/client/src/interface_v3/action_handler_help.cpp @@ -2052,7 +2052,8 @@ void getItemText (CDBCtrlSheet *item, ucstring &itemText, const CItemSheet*pIS) case ITEMFAMILY::CONSUMABLE : { strFindReplace(itemText, "%consumption_time", toString(pIS->Consumable.ConsumptionTime)); - strFindReplace(itemText, "%overdose_timer", toString(pIS->Consumable.OverdoseTimer/60)); + strFindReplace(itemText, "%overdose_timer_min", toString(pIS->Consumable.OverdoseTimer/60)); + strFindReplace(itemText, "%overdose_timer_sec", toString(pIS->Consumable.OverdoseTimer % 60)); // Get Item Consumable infos CItemConsumableEffectHelper::getInstance()->getItemConsumableEffectText(pIS, itemText, item->getQuality()); } diff --git a/code/ryzom/client/src/interface_v3/action_phrase_faber.cpp b/code/ryzom/client/src/interface_v3/action_phrase_faber.cpp index 76b60ade1..53a1258bc 100644 --- a/code/ryzom/client/src/interface_v3/action_phrase_faber.cpp +++ b/code/ryzom/client/src/interface_v3/action_phrase_faber.cpp @@ -1799,7 +1799,8 @@ void CActionPhraseFaber::updateItemResult() } /* Handle change of skill -> recompute success rate */ -void CActionPhraseFaber::CSkillObserver::onSkillChange() { +void CActionPhraseFaber::CSkillObserver::onSkillChange() +{ if (ActionPhraseFaber == NULL) ActionPhraseFaber = new CActionPhraseFaber; // Dont update if the plan has not yet been selected if(ActionPhraseFaber->_ExecuteFromItemPlanBrick==NULL) diff --git a/code/ryzom/client/src/interface_v3/bot_chat_page_trade.cpp b/code/ryzom/client/src/interface_v3/bot_chat_page_trade.cpp index c09c2b16a..dcebe792d 100644 --- a/code/ryzom/client/src/interface_v3/bot_chat_page_trade.cpp +++ b/code/ryzom/client/src/interface_v3/bot_chat_page_trade.cpp @@ -1684,7 +1684,7 @@ void CBotChatPageTrade::setupFactionPointPrice(bool /* sellMode */, uint default // setup icon according to pvp clan CInterfaceManager *pIM= CInterfaceManager::getInstance(); - strlwr(factionName); + factionName = NLMISC::toLower(factionName); string factionIcon= pIM->getDefine(toString("faction_icon_%s", factionName.c_str())); CViewBitmap *vBmp= dynamic_cast(fpGroup->getView("unit_price:item_price:icone")); if(vBmp) vBmp->setTexture(factionIcon); diff --git a/code/ryzom/client/src/interface_v3/chat_filter.cpp b/code/ryzom/client/src/interface_v3/chat_filter.cpp index ef370b689..fc2e6c9c3 100644 --- a/code/ryzom/client/src/interface_v3/chat_filter.cpp +++ b/code/ryzom/client/src/interface_v3/chat_filter.cpp @@ -382,7 +382,7 @@ void CChatTargetFilter::setTargetGroup(CChatGroup::TGroupType groupType, uint32 case CChatGroup::say: entry+="SAY"; break; case CChatGroup::shout: entry+="SHOUT"; break; case CChatGroup::team: if(!teamActive) return; entry+="GROUP"; break; - case CChatGroup::guild: if(!guildActive) return; entry+="CLADE"; break; + case CChatGroup::guild: entry+="CLADE"; break; case CChatGroup::civilization: entry+="CIVILIZATION"; break; case CChatGroup::territory: entry+="TERRITORY"; break; case CChatGroup::universe: diff --git a/code/ryzom/client/src/interface_v3/ctrl_base.cpp b/code/ryzom/client/src/interface_v3/ctrl_base.cpp index 85414ba6e..151d2be6f 100644 --- a/code/ryzom/client/src/interface_v3/ctrl_base.cpp +++ b/code/ryzom/client/src/interface_v3/ctrl_base.cpp @@ -93,7 +93,6 @@ bool CCtrlBase::parse (xmlNodePtr cur, CInterfaceGroup *parentGroup) if (prop) { _OnContextHelp= (const char*)prop; - NLMISC::strlwr(_OnContextHelp); } prop = (char*) xmlGetProp( cur, (xmlChar*)"on_tooltip_params" ); if (prop) diff --git a/code/ryzom/client/src/interface_v3/ctrl_base_button.cpp b/code/ryzom/client/src/interface_v3/ctrl_base_button.cpp index a25bbf56d..b2f03b98b 100644 --- a/code/ryzom/client/src/interface_v3/ctrl_base_button.cpp +++ b/code/ryzom/client/src/interface_v3/ctrl_base_button.cpp @@ -160,21 +160,18 @@ bool CCtrlBaseButton::parse (xmlNodePtr cur,CInterfaceGroup * parentGroup) prop = (char*) xmlGetProp( cur, (xmlChar*)"menu_l" ); if (prop) { - string tmp = (const char *) prop; - _ListMenuLeft = strlwr(tmp); + _ListMenuLeft = NLMISC::toLower(std::string((const char *) prop)); } prop = (char*) xmlGetProp( cur, (xmlChar*)"menu_r" ); if (prop) { - string tmp = (const char *) prop; - _ListMenuRight = strlwr(tmp); + _ListMenuRight = NLMISC::toLower(std::string((const char *) prop)); } // list menu on both clicks prop = (char*) xmlGetProp( cur, (xmlChar*)"menu_b" ); if (prop) { - string tmp = (const char *) prop; - setListMenuBoth(strlwr(tmp)); + setListMenuBoth(NLMISC::toLower(std::string((const char *) prop))); } prop= (char*) xmlGetProp (cur, (xmlChar*)"frozen"); diff --git a/code/ryzom/client/src/interface_v3/ctrl_text_button.cpp b/code/ryzom/client/src/interface_v3/ctrl_text_button.cpp index d2191a4eb..1e8c7c07b 100644 --- a/code/ryzom/client/src/interface_v3/ctrl_text_button.cpp +++ b/code/ryzom/client/src/interface_v3/ctrl_text_button.cpp @@ -86,8 +86,7 @@ bool CCtrlTextButton::parse(xmlNodePtr cur, CInterfaceGroup * parentGroup) prop = (char*) xmlGetProp( cur, (xmlChar*)"tx_normal" ); if (prop) { - string TxName = (const char *) prop; - TxName = strlwr(TxName); + string TxName = toLower(std::string((const char *) prop)); _TextureIdNormal[0].setTexture((TxName+"_l.tga").c_str()); _TextureIdNormal[1].setTexture((TxName+"_m.tga").c_str()); _TextureIdNormal[2].setTexture((TxName+"_r.tga").c_str()); @@ -96,8 +95,7 @@ bool CCtrlTextButton::parse(xmlNodePtr cur, CInterfaceGroup * parentGroup) prop = (char*) xmlGetProp( cur, (xmlChar*)"tx_pushed" ); if (prop) { - string TxName = (const char *) prop; - TxName = strlwr(TxName); + string TxName = toLower(std::string((const char *) prop)); _TextureIdPushed[0].setTexture((TxName+"_l.tga").c_str()); _TextureIdPushed[1].setTexture((TxName+"_m.tga").c_str()); _TextureIdPushed[2].setTexture((TxName+"_r.tga").c_str()); @@ -106,8 +104,7 @@ bool CCtrlTextButton::parse(xmlNodePtr cur, CInterfaceGroup * parentGroup) prop = (char*) xmlGetProp( cur, (xmlChar*)"tx_over" ); if (prop) { - string TxName = (const char *) prop; - TxName = strlwr(TxName); + string TxName = toLower(std::string((const char *) prop)); _TextureIdOver[0].setTexture((TxName+"_l.tga").c_str()); _TextureIdOver[1].setTexture((TxName+"_m.tga").c_str()); _TextureIdOver[2].setTexture((TxName+"_r.tga").c_str()); diff --git a/code/ryzom/client/src/interface_v3/dbctrl_sheet.cpp b/code/ryzom/client/src/interface_v3/dbctrl_sheet.cpp index e328816a9..42f438202 100644 --- a/code/ryzom/client/src/interface_v3/dbctrl_sheet.cpp +++ b/code/ryzom/client/src/interface_v3/dbctrl_sheet.cpp @@ -2095,13 +2095,13 @@ void CDBCtrlSheet::drawSheet (sint32 x, sint32 y, bool draging, bool showSelecti rVR.draw11RotFlipBitmap (_RenderLayer, x, y, 0, false, _DispOverBmpId, armourCol); // decal layer because must drawn after Items/Brick in DXTC // NB: use OverColor, not Over2Color here. Because of hack in updateArmourColor() - rVR.draw11RotFlipBitmap (_RenderLayer+2, x, y, 0, false, _DispOver2BmpId, fastMulRGB(curSheetColor, _IconOverColor)); + rVR.draw11RotFlipBitmap (_RenderLayer+1, x, y, 0, false, _DispOver2BmpId, fastMulRGB(curSheetColor, _IconOverColor)); } else { // decal layer because must drawn after Items/Brick in DXTC - rVR.draw11RotFlipBitmap (_RenderLayer+2, x, y, 0, false, _DispOverBmpId, fastMulRGB(curSheetColor, _IconOverColor)); - rVR.draw11RotFlipBitmap (_RenderLayer+2, x, y, 0, false, _DispOver2BmpId, fastMulRGB(curSheetColor, _IconOver2Color)); + rVR.draw11RotFlipBitmap (_RenderLayer+1, x, y, 0, false, _DispOverBmpId, fastMulRGB(curSheetColor, _IconOverColor)); + rVR.draw11RotFlipBitmap (_RenderLayer+1, x, y, 0, false, _DispOver2BmpId, fastMulRGB(curSheetColor, _IconOver2Color)); } // Draw Quality. -1 for lookandfeel. Draw it with global color diff --git a/code/ryzom/client/src/interface_v3/dbview_number.cpp b/code/ryzom/client/src/interface_v3/dbview_number.cpp index ebfda110e..8ca6e7c94 100644 --- a/code/ryzom/client/src/interface_v3/dbview_number.cpp +++ b/code/ryzom/client/src/interface_v3/dbview_number.cpp @@ -79,6 +79,10 @@ bool CDBViewNumber::parse (xmlNodePtr cur, CInterfaceGroup * parentGroup) if (ptr) _Positive = convertBool(ptr); else _Positive = false; + ptr = xmlGetProp (cur, (xmlChar*)"format"); + if (ptr) _Format = convertBool(ptr); + else _Format = false; + ptr = xmlGetProp (cur, (xmlChar*)"divisor"); if (ptr) fromString((const char*)ptr, _Divisor); @@ -98,6 +102,30 @@ bool CDBViewNumber::parse (xmlNodePtr cur, CInterfaceGroup * parentGroup) return true; } +// *************************************************************************** +// Helper function +ucstring formatThousands(const ucstring& s, const ucstring& separator) +{ + int j; + int k; + int topI = s.length() - 1; + + if (topI < 4) return s; + + ucstring ns; + do + { + for (j = topI, k = 0; j >= 0 && k < 3; --j, ++k ) + { + ns = s[j] + ns; // new char is added to front of ns + if( j > 0 && k == 2) ns = separator + ns; // j > 0 means still more digits + } + topI -= 3; + + } while(topI >= 0); + return ns; +} + // *************************************************************************** void CDBViewNumber::checkCoords() { @@ -106,8 +134,10 @@ void CDBViewNumber::checkCoords() if (_Cache != val) { _Cache= val; - if (_Positive) setText(val >= 0 ? ((string)_Prefix)+toString(val)+(string)_Suffix : "?"); - else setText( ((string)_Prefix)+toString(val)+(string)_Suffix ); + static ucstring separator = NLMISC::CI18N::get("uiThousandsSeparator"); + ucstring value = _Format ? formatThousands(toString(val), separator) : toString(val); + if (_Positive) setText(val >= 0 ? ( ucstring(_Prefix) + value + ucstring(_Suffix) ) : ucstring("?")); + else setText( ucstring(_Prefix) + value + ucstring(_Suffix) ); } } diff --git a/code/ryzom/client/src/interface_v3/dbview_number.h b/code/ryzom/client/src/interface_v3/dbview_number.h index 724209e73..1c7079f06 100644 --- a/code/ryzom/client/src/interface_v3/dbview_number.h +++ b/code/ryzom/client/src/interface_v3/dbview_number.h @@ -57,6 +57,7 @@ protected: CInterfaceProperty _Number; sint64 _Cache; bool _Positive; // only positive values are displayed + bool _Format; // the number will be formatted (like "1,000,000") if >= 10k sint64 _Divisor, _Modulo; // string to append to the value (eg: meters) CStringShared _Suffix; diff --git a/code/ryzom/client/src/interface_v3/group_html.cpp b/code/ryzom/client/src/interface_v3/group_html.cpp index dda2250a8..487344508 100644 --- a/code/ryzom/client/src/interface_v3/group_html.cpp +++ b/code/ryzom/client/src/interface_v3/group_html.cpp @@ -871,6 +871,17 @@ void CGroupHTML::beginElement (uint element_number, const BOOL *present, const c { _TextColor.push_back(_TextColor.empty() ? CRGBA::White : _TextColor.back()); } + + if (present[HTML_FONT_SIZE] && value[HTML_FONT_SIZE]) + { + uint fontsize; + fromString(value[HTML_FONT_SIZE], fontsize); + _FontSize.push_back(fontsize); + } + else + { + _FontSize.push_back(_FontSize.empty() ? TextFontSize : _FontSize.back()); + } } break; case HTML_BR: @@ -1407,6 +1418,7 @@ void CGroupHTML::endElement (uint element_number) { case HTML_FONT: popIfNotEmpty (_TextColor); + popIfNotEmpty (_FontSize); break; case HTML_A: popIfNotEmpty (_TextColor); @@ -2251,8 +2263,9 @@ void CGroupHTML::addImage(const char *img, bool globalColor) else*/ getParagraph()->addChild(newImage); paragraphChange (); - } else { - + } + else + { // // 2/ if it doesn't work, try to load the image in cache // @@ -3394,7 +3407,8 @@ int CGroupHTML::luaInsertText(CLuaState &ls) ucstring text; text.fromUtf8(ls.toString(2)); - if (!_Forms.empty()) { + if (!_Forms.empty()) + { for (uint i=0; i<_Forms.back().Entries.size(); i++) { if (_Forms.back().Entries[i].TextArea && _Forms.back().Entries[i].Name == name) @@ -3438,11 +3452,14 @@ int CGroupHTML::luaAddImage(CLuaState &ls) paragraphChange(); } string url = getLink(); - if (!url.empty()) { + if (!url.empty()) + { string params = "name=" + getId() + "|url=" + getLink (); addButton(CCtrlButton::PushButton, ls.toString(1), ls.toString(1), ls.toString(1), "", ls.toBoolean(2), "browse", params.c_str(), ""); - } else { + } + else + { addImage(ls.toString(1), ls.toBoolean(2)); } @@ -3523,7 +3540,8 @@ int CGroupHTML::luaShowDiv(CLuaState &ls) CLuaIHM::checkArgType(ls, funcName, 1, LUA_TSTRING); CLuaIHM::checkArgType(ls, funcName, 2, LUA_TBOOLEAN); - if (!_Groups.empty()) { + if (!_Groups.empty()) + { for (uint i=0; i<_Groups.size(); i++) { CInterfaceGroup *group = _Groups[i]; diff --git a/code/ryzom/client/src/interface_v3/group_html_webig.cpp b/code/ryzom/client/src/interface_v3/group_html_webig.cpp index ac866830b..7e1781289 100644 --- a/code/ryzom/client/src/interface_v3/group_html_webig.cpp +++ b/code/ryzom/client/src/interface_v3/group_html_webig.cpp @@ -277,7 +277,7 @@ string CGroupHTMLWebIG::home () void CGroupHTMLWebIG::handle () { - Home = "http://atys.ryzom.com/start/index.php"; +// Home = "http://atys.ryzom.com/start/index.php"; CGroupHTML::handle (); } diff --git a/code/ryzom/client/src/interface_v3/group_map.cpp b/code/ryzom/client/src/interface_v3/group_map.cpp index 43021767c..51d07bb88 100644 --- a/code/ryzom/client/src/interface_v3/group_map.cpp +++ b/code/ryzom/client/src/interface_v3/group_map.cpp @@ -775,7 +775,7 @@ bool CGroupMap::parse(xmlNodePtr cur, CInterfaceGroup * parentGroup) _Islands.push_back(island); } } - catch(NLMISC::EFile &e) + catch(const NLMISC::EFile &e) { nlwarning(e.what()); } diff --git a/code/ryzom/client/src/interface_v3/group_tree.h b/code/ryzom/client/src/interface_v3/group_tree.h index 556abab99..c2a299c01 100644 --- a/code/ryzom/client/src/interface_v3/group_tree.h +++ b/code/ryzom/client/src/interface_v3/group_tree.h @@ -106,7 +106,7 @@ public: void setOpened(bool opened) { Opened = opened; } bool getOpened() const { return Opened; } void setText(const ucstring &text) { Text = text; } - ucstring getText() const { return Text; } + const ucstring& getText() const { return Text; } sint32 getFontSize() const { return FontSize; } void setFontSize(sint32 value) { FontSize = value; } sint32 getYDecal() const { return YDecal; } diff --git a/code/ryzom/client/src/interface_v3/input_handler_manager.cpp b/code/ryzom/client/src/interface_v3/input_handler_manager.cpp index 1d755dd56..3ece9f125 100644 --- a/code/ryzom/client/src/interface_v3/input_handler_manager.cpp +++ b/code/ryzom/client/src/interface_v3/input_handler_manager.cpp @@ -518,7 +518,7 @@ bool CInputHandlerManager::readInputConfigFile(const std::string & fileName) root = read.getRootNode(); } - catch (Exception &e) + catch (const Exception &e) { // Output error root = NULL; diff --git a/code/ryzom/client/src/interface_v3/interface_element.cpp b/code/ryzom/client/src/interface_v3/interface_element.cpp index f937a34e9..6db901b10 100644 --- a/code/ryzom/client/src/interface_v3/interface_element.cpp +++ b/code/ryzom/client/src/interface_v3/interface_element.cpp @@ -1235,7 +1235,7 @@ CInterfaceElement *CInterfaceElement::clone() dupStream.fill(&datas[0], (uint32)datas.size()); dupStream.serialPolyPtr(begunThisCloneWarHas); } - catch(NLMISC::EStream &) + catch(const NLMISC::EStream &) { // no-op -> caller has to handle the failure because NULL will be returned } diff --git a/code/ryzom/client/src/interface_v3/interface_manager.cpp b/code/ryzom/client/src/interface_v3/interface_manager.cpp index 478da960b..9762193d9 100644 --- a/code/ryzom/client/src/interface_v3/interface_manager.cpp +++ b/code/ryzom/client/src/interface_v3/interface_manager.cpp @@ -1390,7 +1390,7 @@ void CInterfaceManager::runActionHandler (const string &ahCmdLine, CCtrlBase *pC if(!ahUserParams.empty()) ahParams= ahUserParams; - // Execute the action hanlder + // Execute the action handler CActionHandlerFactoryManager *pAHFM = CActionHandlerFactoryManager::getInstance(); map::iterator it = pAHFM->FactoryMap.find (ahName); if (it == pAHFM->FactoryMap.end()) @@ -1659,7 +1659,7 @@ bool CInterfaceManager::loadConfig (const string &filename) } } } - catch(NLMISC::EStream &) + catch(const NLMISC::EStream &) { f.close(); string sFileNameBackup = sFileName+"backup"; @@ -1846,7 +1846,7 @@ bool CInterfaceManager::saveConfig (const string &filename) return false; } } - catch(NLMISC::EStream &) + catch(const NLMISC::EStream &) { f.close(); nlwarning("Config saving failed."); @@ -4790,7 +4790,7 @@ bool CInterfaceManager::saveKeys(const std::string &filename) nlwarning ("Can't open the file %s", filename.c_str()); } } - catch (Exception &e) + catch (const Exception &e) { nlwarning ("Error while writing the file %s : %s. Remove it.", filename.c_str(), e.what ()); CFile::deleteFile(filename); @@ -5754,7 +5754,7 @@ bool CInterfaceManager::executeLuaScript(const std::string &luaScript, bool smal else _LuaState->executeScript(luaScript); } - catch(ELuaError &e) + catch(const ELuaError &e) { std::string msg = e.luaWhat(); char filename[MAX_PATH]; @@ -6079,7 +6079,7 @@ void CInterfaceManager::createLocalBranch(const std::string &fileName, NLMISC::I ServerToLocalAutoCopySkillPoints.init("USER"); } } - catch (Exception &e) + catch (const Exception &e) { // Output error nlwarning ("CFormLoader: Error while loading the form %s: %s", fileName.c_str(), e.what()); diff --git a/code/ryzom/client/src/interface_v3/interface_options.cpp b/code/ryzom/client/src/interface_v3/interface_options.cpp index ae70f1460..0a8135f71 100644 --- a/code/ryzom/client/src/interface_v3/interface_options.cpp +++ b/code/ryzom/client/src/interface_v3/interface_options.cpp @@ -78,14 +78,14 @@ bool CInterfaceOptions::parse (xmlNodePtr cur) CXMLAutoPtr ptr, val; ptr = xmlGetProp (cur, (xmlChar*)"name"); val = xmlGetProp (cur, (xmlChar*)"value"); - if ((ptr == NULL) || (val == NULL)) + if (!ptr || !val) { nlinfo("param with no name or no value"); ok = false; } else { - string name = strlwr (string((const char*)ptr)); + string name = NLMISC::toLower(string((const char*)ptr)); string value = (string((const char*)val)); _ParamValue[name].init(value); } @@ -321,7 +321,7 @@ bool COptionsList::parse (xmlNodePtr cur) { CXMLAutoPtr ptr, val; val = xmlGetProp (cur, (xmlChar*)"value"); - if (val == NULL) + if (!val) { nlinfo("param with no name or no value"); ok = false; diff --git a/code/ryzom/client/src/interface_v3/interface_parser.cpp b/code/ryzom/client/src/interface_v3/interface_parser.cpp index 90f307316..56b95be88 100644 --- a/code/ryzom/client/src/interface_v3/interface_parser.cpp +++ b/code/ryzom/client/src/interface_v3/interface_parser.cpp @@ -685,7 +685,7 @@ bool CInterfaceParser::parseInterface (const std::vector & strings, i++; } } - catch (Exception &e) + catch (const Exception &e) { // Output error // todo hulud interface syntax error @@ -4721,7 +4721,7 @@ bool CInterfaceParser::loadLUA(const std::string &fileName, std::string &error) { _LuaState->executeFile(pathName); } - catch(ELuaError &e) + catch(const ELuaError &e) { nlwarning(e.luaWhat().c_str()); error= e.luaWhat(); diff --git a/code/ryzom/client/src/interface_v3/item_consumable_effect.cpp b/code/ryzom/client/src/interface_v3/item_consumable_effect.cpp index 35afeb618..3c1e958f8 100644 --- a/code/ryzom/client/src/interface_v3/item_consumable_effect.cpp +++ b/code/ryzom/client/src/interface_v3/item_consumable_effect.cpp @@ -133,8 +133,8 @@ void CItemConsumableEffectHelper::getItemConsumableEffectText(const CItemSheet * strFindReplace(result, "%minutes", toString(duration/60)); strFindReplace(result, "%secondes", toString(duration%60)); strFindReplace(result, "%radius", toString(radius)); - strFindReplace(result, "%targetDisableTime", toString(targetDisableTime)); - strFindReplace(result, "%userDisableTime", toString(userDisableTime)); + strFindReplace(result, "%targetDisableTime", "0"); + strFindReplace(result, "%userDisableTime", "0"); effects += result; effects += "\n"; @@ -183,12 +183,12 @@ void CItemConsumableEffectHelper::getItemConsumableEffectText(const CItemSheet * fromString(params[4].c_str(), userDisableTime); ucstring result = CI18N::get("uiItemConsumableEffectStaminaAura"); - strFindReplace(result, "%modifier", toString(regenMod)); + strFindReplace(result, "%modifier", toString(bonus)); strFindReplace(result, "%minutes", toString(duration/60)); strFindReplace(result, "%secondes", toString(duration%60)); strFindReplace(result, "%radius", toString(radius)); - strFindReplace(result, "%targetDisableTime", toString(targetDisableTime)); - strFindReplace(result, "%userDisableTime", toString(userDisableTime)); + strFindReplace(result, "%targetDisableTime", "0"); + strFindReplace(result, "%userDisableTime", "0"); effects += result; effects += "\n"; @@ -240,8 +240,8 @@ void CItemConsumableEffectHelper::getItemConsumableEffectText(const CItemSheet * strFindReplace(result, "%minutes", toString(duration/60)); strFindReplace(result, "%secondes", toString(duration%60)); strFindReplace(result, "%radius", toString(radius)); - strFindReplace(result, "%targetDisableTime", toString(targetDisableTime)); - strFindReplace(result, "%userDisableTime", toString(userDisableTime)); + strFindReplace(result, "%targetDisableTime", "0"); + strFindReplace(result, "%userDisableTime", "0"); effects += result; effects += "\n"; diff --git a/code/ryzom/client/src/interface_v3/lua_helper.cpp b/code/ryzom/client/src/interface_v3/lua_helper.cpp index 0ec99d5a4..9fa942d41 100644 --- a/code/ryzom/client/src/interface_v3/lua_helper.cpp +++ b/code/ryzom/client/src/interface_v3/lua_helper.cpp @@ -378,7 +378,7 @@ bool CLuaState::executeScriptNoThrow(const std::string &code, int numRet) { executeScript(code, numRet); } - catch (ELuaError &e) + catch (const ELuaError &e) { nlwarning(e.what()); return false; diff --git a/code/ryzom/client/src/interface_v3/lua_ihm.cpp b/code/ryzom/client/src/interface_v3/lua_ihm.cpp index cf34912f8..15dd9872a 100644 --- a/code/ryzom/client/src/interface_v3/lua_ihm.cpp +++ b/code/ryzom/client/src/interface_v3/lua_ihm.cpp @@ -233,7 +233,7 @@ bool CLuaIHM::pop(CLuaState &ls, NLMISC::CRGBA &dest) #endif dest = luabind::object_cast(obj); } - catch(luabind::cast_failed &) + catch(const luabind::cast_failed &) { return false; } @@ -256,7 +256,7 @@ bool CLuaIHM::pop(CLuaState &ls,NLMISC::CVector2f &dest) #endif dest = luabind::object_cast(obj); } - catch(luabind::cast_failed &) + catch(const luabind::cast_failed &) { return false; } @@ -279,7 +279,7 @@ bool CLuaIHM::pop(CLuaState &ls, ucstring &dest) #endif dest = luabind::object_cast(obj); } - catch(luabind::cast_failed &) + catch(const luabind::cast_failed &) { return false; } @@ -3354,7 +3354,7 @@ bool CLuaIHM::popString(CLuaState &ls, std::string & dest) #endif dest = luabind::object_cast(obj); } - catch(luabind::cast_failed &) + catch(const luabind::cast_failed &) { return false; } @@ -3376,7 +3376,7 @@ bool CLuaIHM::popSINT32(CLuaState &ls, sint32 & dest) #endif dest = luabind::object_cast(obj); } - catch(luabind::cast_failed &) + catch(const luabind::cast_failed &) { return false; } diff --git a/code/ryzom/client/src/interface_v3/lua_object.cpp b/code/ryzom/client/src/interface_v3/lua_object.cpp index 86b91af73..eb5f76c4f 100644 --- a/code/ryzom/client/src/interface_v3/lua_object.cpp +++ b/code/ryzom/client/src/interface_v3/lua_object.cpp @@ -613,7 +613,7 @@ void CLuaObject::dump(uint maxDepth /*= 20*/, std::set *alreadySee NLMISC::InfoLog->forceDisplayRaw((res[k] + "\n") .c_str()); } } - catch(std::exception &e) + catch(const std::exception &e) { CLuaIHM::dumpCallStack(); nlwarning(e.what()); diff --git a/code/ryzom/client/src/interface_v3/people_interraction.cpp b/code/ryzom/client/src/interface_v3/people_interraction.cpp index 170d20ffd..e98013f9a 100644 --- a/code/ryzom/client/src/interface_v3/people_interraction.cpp +++ b/code/ryzom/client/src/interface_v3/people_interraction.cpp @@ -1670,7 +1670,7 @@ bool CPeopleInterraction::saveUserChatsInfos(NLMISC::IStream &f) pCGW->saveFreeTeller(f); } } - catch(NLMISC::EStream &e) + catch(const NLMISC::EStream &e) { nlwarning("Error while saving user chat infos : %s", e.what()); return false; @@ -1691,7 +1691,7 @@ bool CPeopleInterraction::saveUserDynChatsInfos(NLMISC::IStream &f) saveFilteredDynChat(f, TheUserChat); } } - catch(NLMISC::EStream &e) + catch(const NLMISC::EStream &e) { nlwarning("Error while saving user dyn chat infos : %s", e.what()); return false; @@ -1756,7 +1756,7 @@ bool CPeopleInterraction::loadUserChatsInfos(NLMISC::IStream &f) if (pCGW) pCGW->loadFreeTeller(f); } } - catch(NLMISC::EStream &e) + catch(const NLMISC::EStream &e) { nlwarning("Error while loading user chat infos : %s", e.what()); return false; @@ -1786,7 +1786,7 @@ bool CPeopleInterraction::loadUserDynChatsInfos(NLMISC::IStream &f) setupUserDynChatFromSummary(fcs, TheUserChat); } } - catch(NLMISC::EStream &e) + catch(const NLMISC::EStream &e) { nlwarning("Error while loading user dyn chat infos : %s", e.what()); return false; @@ -2277,7 +2277,8 @@ public: CPeopleList::TSortOrder order = (CPeopleList::TSortOrder)(pIM->getDbProp("UI:SAVE:CONTACT_LIST:SORT_ORDER")->getValue32()); order = (CPeopleList::TSortOrder)(order + 1); - if (order == CPeopleList::END_SORT_ORDER) { + if (order == CPeopleList::END_SORT_ORDER) + { order = CPeopleList::START_SORT_ORDER; } @@ -2654,8 +2655,10 @@ class CHandlerChatTargetSelected : public IActionHandler } else { - for (uint i = 0; i < CChatGroup::MaxDynChanPerPlayer; i++) { - if (nlstricmp(sParams, "dyn"+toString("%d", i)) == 0) { + for (uint i = 0; i < CChatGroup::MaxDynChanPerPlayer; i++) + { + if (nlstricmp(sParams, "dyn"+toString("%d", i)) == 0) + { cf.setTargetGroup(CChatGroup::dyn_chat, i); } } diff --git a/code/ryzom/client/src/interface_v3/people_list.cpp b/code/ryzom/client/src/interface_v3/people_list.cpp index cd3d75067..ac4764e15 100644 --- a/code/ryzom/client/src/interface_v3/people_list.cpp +++ b/code/ryzom/client/src/interface_v3/people_list.cpp @@ -207,12 +207,14 @@ bool CPeopleList::sortExByOnline(const CPeople& a, const CPeople& b) ucstring name_b = toUpper(b.getName()); // We want order: online/alpha, offworld/alpha, offline/alpha - if (a.Online == b.Online) { + if (a.Online == b.Online) + { return (name_a < name_b); } else { // Compare online status - switch (a.Online) { + switch (a.Online) + { case ccs_online: // a is > if a is online return true; @@ -244,7 +246,8 @@ void CPeopleList::sortEx(TSortOrder order) _BaseContainer->detachContainer(_Peoples[k].Container); } - switch (order) { + switch (order) + { default: case sort_index: std::sort(_Peoples.begin(), _Peoples.end(), CPeopleList::sortExByContactId); diff --git a/code/ryzom/client/src/interface_v3/player_trade.cpp b/code/ryzom/client/src/interface_v3/player_trade.cpp index 671d0047a..7307110d9 100644 --- a/code/ryzom/client/src/interface_v3/player_trade.cpp +++ b/code/ryzom/client/src/interface_v3/player_trade.cpp @@ -78,9 +78,9 @@ void CPlayerTrade::restoreItem(CDBCtrlSheet *exchangeSlot) // *** If not an AMMO, try to 'auto-stack', as server does bool canAutoStack= false; - uint32 autoStackSheetId; - sint32 autoStackQuality; - sint32 autoStackMaxQuantity; + uint32 autoStackSheetId = 0; + sint32 autoStackQuality = 0; + sint32 autoStackMaxQuantity = 0; const CItemSheet *itemSheet= exchangeSlot->asItemSheet(); // NB: cannot auto stack ammo because their full props (dammage etc...) are not sent to client if(itemSheet) diff --git a/code/ryzom/client/src/interface_v3/sphrase_manager.cpp b/code/ryzom/client/src/interface_v3/sphrase_manager.cpp index 6820a10e8..dc12a391f 100644 --- a/code/ryzom/client/src/interface_v3/sphrase_manager.cpp +++ b/code/ryzom/client/src/interface_v3/sphrase_manager.cpp @@ -503,7 +503,6 @@ void CSPhraseManager::updateMemoryDBAll() for(uint i=0;isetValue32(0); - _MemoryAltDbLeaves[i]->setValue32(0); } } else @@ -515,7 +514,14 @@ void CSPhraseManager::updateMemoryDBAll() _MemoryDbLeaves[i]->setValue32(0); else _MemoryDbLeaves[i]->setValue32(slot.Id); + } + } + if(_SelectedMemoryDB != -1 && (sint32)_Memories.size() > 0) + { + // Always update alt gestionsets + for(uint i=0;isetValue32(0); diff --git a/code/ryzom/client/src/interface_v3/yubo_chat.cpp b/code/ryzom/client/src/interface_v3/yubo_chat.cpp index d24ae8bea..55bc17922 100644 --- a/code/ryzom/client/src/interface_v3/yubo_chat.cpp +++ b/code/ryzom/client/src/interface_v3/yubo_chat.cpp @@ -59,7 +59,7 @@ void CYuboChat::connect(const string &url, const std::string &login, const std:: return; } } - catch(Exception &e) + catch(const Exception &e) { addStringReceived(toString("ERROR: exception with server %s: %s", _URL.c_str(), e.what())); } @@ -78,7 +78,7 @@ void CYuboChat::disconnect() { _Sock.disconnect(); } - catch(Exception &e) + catch(const Exception &e) { addStringReceived(toString("ERROR: exception with server %s: %s", _URL.c_str(), e.what())); } @@ -265,7 +265,7 @@ void CYuboChat::sendInternal(const ucstring &msg) size= (uint32)toSend.size()-off; } } - catch(Exception &e) + catch(const Exception &e) { addStringReceived(toString("ERROR: exception with server %s: %s", _URL.c_str(), e.what())); } diff --git a/code/ryzom/client/src/light_cycle_manager.cpp b/code/ryzom/client/src/light_cycle_manager.cpp index cb34c0dd0..4b0488dd5 100644 --- a/code/ryzom/client/src/light_cycle_manager.cpp +++ b/code/ryzom/client/src/light_cycle_manager.cpp @@ -442,7 +442,7 @@ bool CLightCycleManager::isInDayInterval(float startHour, float endHour, float d float CLightCycleManager::getLightLevel(float hour) const { H_AUTO_USE(RZ_LightCycleManager) - float lightValue; + float lightValue = 0.f; if (isInDayInterval(_Desc.NightTransitionStartHour, _Desc.NightTransitionEndHour, _Desc.NumHours, hour, lightValue)) return lightValue; if (isInDayInterval(_Desc.DawnTransitionStartHour, _Desc.DawnTransitionEndHour, _Desc.NumHours, hour, lightValue)) diff --git a/code/ryzom/client/src/lod_character_user_manager.cpp b/code/ryzom/client/src/lod_character_user_manager.cpp index 871f6fc30..5ba9d4a46 100644 --- a/code/ryzom/client/src/lod_character_user_manager.cpp +++ b/code/ryzom/client/src/lod_character_user_manager.cpp @@ -69,7 +69,7 @@ bool CLodCharacterUserManager::addLodShapeBank(const std::string &filename) // load and add the file to the main scene Scene->loadCLodShapeBank(filename); } - catch(Exception &e) + catch(const Exception &e) { nlwarning(e.what()); return false; diff --git a/code/ryzom/client/src/login.cpp b/code/ryzom/client/src/login.cpp index 6f06d1b5f..d1dee738d 100644 --- a/code/ryzom/client/src/login.cpp +++ b/code/ryzom/client/src/login.cpp @@ -1721,15 +1721,15 @@ class CAHReboot : public IActionHandler } LoginSM.pushEvent(CLoginStateMachine::ev_reboot); } - catch (NLMISC::EDiskFullError &) + catch (const NLMISC::EDiskFullError &) { im->messageBoxWithHelp(CI18N::get("uiPatchDiskFull"), "ui:login"); } - catch (NLMISC::EWriteError &) + catch (const NLMISC::EWriteError &) { im->messageBoxWithHelp(CI18N::get("uiPatchWriteError"), "ui:login"); } - catch (std::exception &e) + catch (const std::exception &e) { im->messageBoxWithHelp(ucstring(e.what()), "ui:login", "login_quit"); } diff --git a/code/ryzom/client/src/login_patch.cpp b/code/ryzom/client/src/login_patch.cpp index fa0ef7f57..762cee9c7 100644 --- a/code/ryzom/client/src/login_patch.cpp +++ b/code/ryzom/client/src/login_patch.cpp @@ -386,7 +386,7 @@ void CPatchManager::readClientVersionAndDescFile() DescFilename = "unknown"; ValidDescFile = true; } - catch(Exception &) + catch(const Exception &) { nlwarning("EXCEPTION CATCH: readClientVersionAndDescFile() failed - not important"); // Not important that there is no desc file @@ -1203,7 +1203,7 @@ void CPatchManager::getServerFile (const std::string &name, bool bZipped, const downloadSuccess = true; } - catch (EPatchDownloadException& e) + catch (const EPatchDownloadException& e) { //nlwarning("EXCEPTION CATCH: getServerFile() failed - try to find an alternative: %i: %s",UsedServer,PatchServers[UsedServer].DisplayedServerPath.c_str()); @@ -2492,7 +2492,7 @@ void CCheckThread::run () CheckOk = true; Ended = true; } - catch (NLMISC::EDiskFullError) + catch (const NLMISC::EDiskFullError &) { // more explicit message for this common error case nlwarning("EXCEPTION CATCH: disk full"); @@ -2501,7 +2501,7 @@ void CCheckThread::run () CheckOk = false; Ended = true; } - catch (Exception &e) + catch (const Exception &e) { nlwarning("EXCEPTION CATCH: CCheckThread::run() failed"); ucstring sTranslate = CI18N::get("uiCheckEndWithErr") + " " + e.what(); @@ -2622,7 +2622,7 @@ void CPatchThread::run() } } - catch (NLMISC::EDiskFullError) + catch (const NLMISC::EDiskFullError &) { // more explicit message for this common error case nlwarning("EXCEPTION CATCH: CPatchThread::run() Disk Full"); @@ -2630,7 +2630,7 @@ void CPatchThread::run() sTranslate = CI18N::get("uiPatchDiskFull"); bErr = true; } - catch(Exception &e) + catch(const Exception &e) { nlwarning("EXCEPTION CATCH: CPatchThread::run() failed"); pPM->setState(true, ucstring(e.what())); @@ -2803,7 +2803,7 @@ void CPatchThread::processFile (CPatchManager::SFileToPatch &rFTP) // else -> file comes from a previous download (with .tmp extension, and is up to date) // the remaining code will just rename it with good name and exit } - catch (NLMISC::EWriteError) + catch (const NLMISC::EWriteError &) { // this is a local error, rethrow ... throw; @@ -2814,7 +2814,7 @@ void CPatchThread::processFile (CPatchManager::SFileToPatch &rFTP) pPM->getServerFile(lzmaFile, false, "", &progress); } } - catch (NLMISC::EWriteError) + catch (const NLMISC::EWriteError &) { // this is a local error, rethrow ... throw; @@ -2837,7 +2837,7 @@ void CPatchThread::processFile (CPatchManager::SFileToPatch &rFTP) break; } } - catch (NLMISC::EWriteError) + catch (const NLMISC::EWriteError&) { throw; } @@ -2880,7 +2880,7 @@ void CPatchThread::processFile (CPatchManager::SFileToPatch &rFTP) // remove the subfolder name PatchName = NLMISC::CFile::getFilename(PatchName); } - catch (NLMISC::EWriteError) + catch (const NLMISC::EWriteError &) { throw; } @@ -3027,7 +3027,7 @@ void CPatchThread::xDeltaPatch(const string &patch, const string &src, const str } - // Launching xdelta.exe + // Launching xdelta /* STARTUPINFO si; PROCESS_INFORMATION pi; @@ -3139,7 +3139,7 @@ void CScanDataThread::run () CheckOk = true; Ended = true; } - catch (Exception &e) + catch (const Exception &e) { nlwarning("EXCEPTION CATCH: CScanDataThread::run() failed"); ucstring sTranslate = CI18N::get("uiCheckEndWithErr") + " " + e.what(); diff --git a/code/ryzom/client/src/login_progress_post_thread.cpp b/code/ryzom/client/src/login_progress_post_thread.cpp index 1c38fdd88..ad39de60d 100644 --- a/code/ryzom/client/src/login_progress_post_thread.cpp +++ b/code/ryzom/client/src/login_progress_post_thread.cpp @@ -220,7 +220,7 @@ public: if (StopWanted) break; } } - catch (std::exception &e) + catch (const std::exception &e) { nlwarning(e.what()); } diff --git a/code/ryzom/client/src/lua_ide_dll_nevrax/include/cj60/CJOutlookBar.h b/code/ryzom/client/src/lua_ide_dll_nevrax/include/cj60/CJOutlookBar.h index 0e1434c3b..69eed259a 100644 --- a/code/ryzom/client/src/lua_ide_dll_nevrax/include/cj60/CJOutlookBar.h +++ b/code/ryzom/client/src/lua_ide_dll_nevrax/include/cj60/CJOutlookBar.h @@ -76,10 +76,12 @@ protected: public: CContentItems( UINT nID, CString str ) : - m_nImageID( nID ), m_csText( str ) { + m_nImageID( nID ), m_csText( str ) + { } - void operator = ( CContentItems& pItems ) { + void operator = ( CContentItems& pItems ) + { m_nImageID = pItems.m_nImageID; m_csText = pItems.m_csText; } diff --git a/code/ryzom/client/src/main_loop.cpp b/code/ryzom/client/src/main_loop.cpp index f8ff5ae89..81a63ae60 100644 --- a/code/ryzom/client/src/main_loop.cpp +++ b/code/ryzom/client/src/main_loop.cpp @@ -700,9 +700,6 @@ void updateFromClientCfg() //--------------------------------------------------- if (Landscape) { -#ifdef NL_OS_MAC - Landscape->enableVegetable(false); -#else if (ClientCfg.MicroVeget != LastClientCfg.MicroVeget) { if(ClientCfg.MicroVeget) @@ -722,7 +719,6 @@ void updateFromClientCfg() Landscape->enableVegetable(false); } } -#endif } //--------------------------------------------------- @@ -854,7 +850,7 @@ void updateFromClientCfg() { SoundMngr->init(NULL); } - catch(Exception &e) + catch(const Exception &e) { nlwarning("init : Error when creating 'SoundMngr' : %s", e.what()); SoundMngr = 0; @@ -3781,7 +3777,7 @@ void updateMovieShooting() { MovieShooter.replayMovie(Driver, TextContext); } - catch (Exception &e) + catch (const Exception &e) { Driver->systemMessageBox(e.what(), "MovieShooter"); } @@ -3819,7 +3815,7 @@ void updateMovieShooting() // Save the movie. MovieShooter.saveMovie(Driver, TextContext, theDir.c_str(), ClientCfg.MovieShooterFramePeriod, ClientCfg.MovieShooterBlend, ClientCfg.MovieShooterPrefix.c_str()); } - catch (Exception &e) + catch (const Exception &e) { Driver->systemMessageBox(e.what(), "MovieShooter"); } diff --git a/code/ryzom/client/src/net_manager.cpp b/code/ryzom/client/src/net_manager.cpp index 36a0767cd..29a5a0e37 100644 --- a/code/ryzom/client/src/net_manager.cpp +++ b/code/ryzom/client/src/net_manager.cpp @@ -168,7 +168,7 @@ void impulseDatabaseInitPlayer(NLMISC::CBitMemStream &impulse) IngameDbMngr.setInitPacketReceived(); nlinfo( "DB_INIT:PLR done (%u bytes)", impulse.getPos()-p ); } - catch (Exception &e) + catch (const Exception &e) { BOMB( NLMISC::toString( "Problem while decoding a DB_INIT:PLR msg, skipped: %s", e.what() ), return ); } @@ -185,7 +185,7 @@ void impulseDatabaseUpdatePlayer(NLMISC::CBitMemStream &impulse) // read delta IngameDbMngr.readDelta( serverTick, impulse, CDBPlayer ); // unlike on the server, here there is only one unified CCDBSynchronized object } - catch (Exception &e) + catch (const Exception &e) { BOMB( NLMISC::toString( "Problem while decoding a DB_UPDATE_PLR msg, skipped: %s", e.what() ), return ); @@ -218,7 +218,7 @@ void impulseDatabaseUpdateBank(NLMISC::CBitMemStream &impulse) updateInventoryFromStream( impulse, (INVENTORIES::CInventoryCategoryForGuild*)NULL, false ); } } - catch (Exception &e) + catch (const Exception &e) { BOMB( NLMISC::toString( "Problem while decoding a DB_GROUP:UPDATE_BANK %s msg, skipped: %s", CDBBankNames[bank], e.what() ), return ); } @@ -248,7 +248,7 @@ void impulseDatabaseInitBank(NLMISC::CBitMemStream &impulse) updateInventoryFromStream( impulse, (INVENTORIES::CInventoryCategoryForGuild*)NULL, false ); } } - catch (Exception &e) + catch (const Exception &e) { BOMB( NLMISC::toString( "Problem while decoding a DB_GROUP:INIT_BANK %s msg, skipped: %s", CDBBankNames[bank], e.what() ), return ); } @@ -272,7 +272,7 @@ void impulseDatabaseResetBank(NLMISC::CBitMemStream &impulse) IngameDbMngr.getNodePtr()->resetBank( serverTick, (TCDBBank)bank ); nldebug( "CDB: DB_GROUP:RESET_BANK %s", CDBBankNames[bank] ); } - catch (Exception &e) + catch (const Exception &e) { BOMB( NLMISC::toString( "Problem while decoding a DB_GROUP:RESET_BANK %s msg, skipped: %s", CDBBankNames[bank], e.what() ), return ); } @@ -286,7 +286,7 @@ static void readPrivileges(NLMISC::CBitMemStream &impulse) { impulse.serial(UserPrivileges); } - catch(EStreamOverflow &) + catch(const EStreamOverflow &) { nlwarning("User privileges not serialised, assuming none"); UserPrivileges = ""; @@ -345,7 +345,7 @@ void copyKeySet(const std::string &srcPath, const std::string &destPath) COFile ofile(destPath); ofile.serialBuffer((uint8 *) &srcStr[0], (uint)srcStr.size()); } - catch(EStream &) + catch(const EStream &) { nlwarning("Couldn't copy %s to %s to create new character keyset", srcPath.c_str(), destPath.c_str()); } @@ -805,27 +805,35 @@ void CInterfaceChatDisplayer::displayChat(TDataSetIndex compressedSenderIndex, c else { ucstring::size_type index = finalString.find(ucstring("")); - if (index != ucstring::npos) { + if (index != ucstring::npos) + { bubbleWanted = false; finalString = finalString.substr(index+6,finalString.size()); ucstring::size_type index2 = finalString.find(ucstring(" ")); ucstring playerName; - if (index2 < (finalString.size()-3)) { + if (index2 < (finalString.size()-3)) + { playerName = finalString.substr(0,index2); finalString = finalString.substr(index2+1,finalString.size()); } if (!senderName.empty()) { CEntityCL *senderEntity = EntitiesMngr.getEntityByName (CEntityCL::removeTitleAndShardFromName(senderName), true, true); - if (senderEntity) { - if (senderEntity->Type != CEntityCL::Player) { - if (playerName.empty()) { + if (senderEntity) + { + if (senderEntity->Type != CEntityCL::Player) + { + if (playerName.empty()) + { senderEntity->removeStateFx(); senderEntity->setStateFx(finalString.toString()); nlinfo("empty"); - } else { + } + else + { CEntityCL *destEntity = EntitiesMngr.getEntityByName (CEntityCL::removeTitleAndShardFromName(playerName), false, true); - if (destEntity) { + if (destEntity) + { destEntity->removeStateFx(); destEntity->setStateFx(finalString.toString()); nlinfo("no empty"); @@ -1560,7 +1568,7 @@ void impulseTPCommon2(NLMISC::CBitMemStream &impulse, bool hasSeason) } } - catch (EStream &) + catch (const EStream &) { tpReason = ucstring("TP Reason"); tpCancelText = ucstring("Cancel TP"); // for test @@ -2228,7 +2236,7 @@ void impulseCounter(NLMISC::CBitMemStream &impulse) } } } - catch (Exception &e) + catch (const Exception &e) { nlwarning ("Problem while decoding a COUTNER msg, skipped: %s", e.what()); } @@ -2813,7 +2821,7 @@ void updateInventoryFromStream (NLMISC::CBitMemStream &impulse, const CInventory CInventoryManager::getInstance()->sortBag(); } - catch ( Exception &e ) + catch (const Exception &e) { nlwarning ("Problem while decoding a DB_UPD_INV msg, skipped: %s", e.what()); } diff --git a/code/ryzom/client/src/network_connection.cpp b/code/ryzom/client/src/network_connection.cpp index fe1216b64..f633126e5 100644 --- a/code/ryzom/client/src/network_connection.cpp +++ b/code/ryzom/client/src/network_connection.cpp @@ -141,7 +141,7 @@ void initReceiveLog() ReceiveLogger.displayNL( "LogReceive is on" ); // only when enabled } } - catch ( EConfigFile& ) + catch (const EConfigFile&) {} } @@ -616,7 +616,7 @@ bool CNetworkConnection::connect(string &result) nlinfo ("Can't copy, same path '%s'", arg1.c_str()); } } - catch (Exception &) + catch (const Exception &) { nlwarning ("Can't copy '%s' '%s', try the next file", arg1.c_str(), dstPath.c_str()); } @@ -624,7 +624,7 @@ bool CNetworkConnection::connect(string &result) break; } } - catch (Exception &e) + catch (const Exception &e) { nlwarning (e.what ()); } @@ -635,7 +635,7 @@ bool CNetworkConnection::connect(string &result) } } } - catch (Exception &) + catch (const Exception &) { nlinfo ("There's no shards.cfg, or bad file format, can't copy common files"); } @@ -654,7 +654,7 @@ bool CNetworkConnection::connect(string &result) // _Connection.connect (CInetAddress(_FrontendAddress)); } - catch (ESocket &e) + catch (const ESocket &e) { result = toString ("FS refused the connection (%s)", e.what()); return false; @@ -847,7 +847,7 @@ bool CNetworkConnection::update() } while (stateBroke);// && _TotalMessages<5); } - catch (ESocket &) + catch (const ESocket &) { _ConnectionState = Disconnect; } @@ -968,7 +968,7 @@ void CNetworkConnection::sendSystemLogin() //sendUDP (&(_Connection), message.buffer(), length); _Connection.send( message.buffer(), length ); } - catch ( ESocket& e ) + catch (const ESocket &e) { #ifdef NL_OS_WINDOWS // An exception (10004: Blocking operation interrupted) may occur if a firewall such as Kerio is @@ -1123,7 +1123,7 @@ void CNetworkConnection::receiveSystemSync(CBitMemStream &msgin) if(xmlInvalid) xmlInvalid = (checkMsgXml != _AltMsgXmlMD5 || checkDatabaseXml != _AltDatabaseXmlMD5); } - catch (NLMISC::Exception&) + catch (const NLMISC::Exception&) { } @@ -1720,7 +1720,7 @@ void CNetworkConnection::decodeVisualProperties( CBitMemStream& msgin ) } } } - catch ( EStreamOverflow& ) + catch (const EStreamOverflow&) { // End of stream (saves useless bits) } @@ -2708,7 +2708,7 @@ void CNetworkConnection::send(TGameCycle cycle) sendNormalMessage(); } } - catch (ESocket &/*e*/) + catch (const ESocket &/*e*/) { _ConnectionState = Disconnect; disconnect(); // won't send disconnection message as state is already Disconnect @@ -2732,7 +2732,7 @@ void CNetworkConnection::send() sendNormalMessage(); } } - catch (ESocket &/*e*/) + catch (const ESocket &/*e*/) { _ConnectionState = Disconnect; } diff --git a/code/ryzom/client/src/pacs_client.cpp b/code/ryzom/client/src/pacs_client.cpp index 16147f0f9..4dc7d7535 100644 --- a/code/ryzom/client/src/pacs_client.cpp +++ b/code/ryzom/client/src/pacs_client.cpp @@ -243,7 +243,7 @@ void initPrimitiveBlocks() { addPacsPrim(primFile); } - catch (NLMISC::Exception &) + catch (const NLMISC::Exception &) { nlwarning("Error while loading %s", primFile.c_str()); } diff --git a/code/ryzom/client/src/permanent_ban.cpp b/code/ryzom/client/src/permanent_ban.cpp index 032a5ffaa..ba1ce4188 100644 --- a/code/ryzom/client/src/permanent_ban.cpp +++ b/code/ryzom/client/src/permanent_ban.cpp @@ -87,7 +87,7 @@ static void setPermanentBanFileMarker(const std::string &path, bool on) SetFileAttributes(path.c_str(), FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM); #endif } - catch(EStream &e) + catch(const EStream &e) { nlinfo(e.what()); } diff --git a/code/ryzom/client/src/prim_file.cpp b/code/ryzom/client/src/prim_file.cpp index c9839956e..e1959aabd 100644 --- a/code/ryzom/client/src/prim_file.cpp +++ b/code/ryzom/client/src/prim_file.cpp @@ -167,7 +167,7 @@ void CPrimFileMgr::load (sint primFileIndex) } } - catch (Exception &e) + catch (const Exception &e) { // Error nlwarning ("Error while reading the prim file (%s) : %s", pathName.c_str(), e.what ()); diff --git a/code/ryzom/client/src/r2/dmc/com_lua_module.cpp b/code/ryzom/client/src/r2/dmc/com_lua_module.cpp index b4f6de3a4..69223a2ae 100644 --- a/code/ryzom/client/src/r2/dmc/com_lua_module.cpp +++ b/code/ryzom/client/src/r2/dmc/com_lua_module.cpp @@ -1359,7 +1359,7 @@ CObject* CComLuaModule::loadFromBuffer(const std::string& data, const std::strin } } } - catch(ELuaError &e) + catch(const ELuaError &e) { nlwarning("%s", e.what()); } diff --git a/code/ryzom/client/src/r2/editor.cpp b/code/ryzom/client/src/r2/editor.cpp index a068af182..0de8bc626 100644 --- a/code/ryzom/client/src/r2/editor.cpp +++ b/code/ryzom/client/src/r2/editor.cpp @@ -1706,7 +1706,7 @@ void CEditor::waitScenarioScreen() if ( ! firewallTimeout ) NetMngr.update(); } - catch ( EBlockedByFirewall& ) + catch (const EBlockedByFirewall&) { if ( NetMngr.getConnectionState() == CNetManager::Disconnect ) { @@ -4414,11 +4414,11 @@ bool CEditor::doLuaScript(const char *filename, const char *fileDescText) CLuaStackChecker ls(&getLua()); return true; } - catch(NLMISC::EStream &e) + catch(const NLMISC::EStream &e) { nlwarning("Error while loading R2 %s (file = %s) : %s", fileDescText, filename, e.what()); } - catch(ELuaError &e) + catch(const ELuaError &e) { //char filename[MAX_PATH]; std::string msg = e.what(); @@ -5038,7 +5038,7 @@ void CEditor::onErase(CObject *root, bool &foundInBase, std::string &nameInParen { (*inst).getLuaProjection()["User"].setValue("Erased", true); } - catch (ELuaNotATable &e) + catch (const ELuaNotATable &e) { nlwarning(e.what()); } diff --git a/code/ryzom/client/src/r2/island_collision.cpp b/code/ryzom/client/src/r2/island_collision.cpp index eecddb642..b096a4255 100644 --- a/code/ryzom/client/src/r2/island_collision.cpp +++ b/code/ryzom/client/src/r2/island_collision.cpp @@ -419,7 +419,7 @@ CPackedWorld *CIslandCollision::reloadPackedIsland(const CScenarioEntryPoints::C _PackedIslandName = islandDesc.Island; _IslandDesc = islandDesc; } - catch (Exception &) + catch (const Exception &) { _PackedIslandLoadingFailure = true; } @@ -432,7 +432,7 @@ CPackedWorld *CIslandCollision::reloadPackedIsland(const CScenarioEntryPoints::C f.serialCheck((uint32) 'MHSI'); f.serial(_HeightMap); } - catch(Exception &e) + catch(const Exception &e) { nlwarning(e.what()); _HeightMap.clear(); @@ -572,7 +572,7 @@ void CIslandCollision::loadEntryPoints() { sep.loadCompleteIslands(); } - catch (NLMISC::EStream &e) + catch (const NLMISC::EStream &e) { _EntryPointsLoadingFailure = true; nlwarning(e.what()); diff --git a/code/ryzom/client/src/r2/tool_select_move.cpp b/code/ryzom/client/src/r2/tool_select_move.cpp index 1ad9fd797..6bbbe75ee 100644 --- a/code/ryzom/client/src/r2/tool_select_move.cpp +++ b/code/ryzom/client/src/r2/tool_select_move.cpp @@ -369,7 +369,7 @@ void CToolSelectMove::commitAction(CInstance &instance) pos.setValue("y", _FinalPos.y); pos.setValue("z", _FinalPos.z); } - catch(ELuaNotATable &) + catch(const ELuaNotATable &) { nlwarning("Error while setting position of copied object"); } diff --git a/code/ryzom/client/src/session_browser_impl.cpp b/code/ryzom/client/src/session_browser_impl.cpp index 4f39db901..c5ddb8f47 100644 --- a/code/ryzom/client/src/session_browser_impl.cpp +++ b/code/ryzom/client/src/session_browser_impl.cpp @@ -427,7 +427,7 @@ void CSessionBrowserImpl::fill(const std::vector &session // call into lua callRingAccessPointMethod("onSessionListReceived", 1, 0); } - catch(ELuaError &) + catch(const ELuaError &) { // no-op (error msg already printed at exception launch) } @@ -454,7 +454,7 @@ void CSessionBrowserImpl::playerRatingFill(bool scenarioRated, uint32 rateFun, u // call into lua callScenarioScoresMethod("onScenarioScoresReceived", 1, 0); } - catch(ELuaError &) + catch(const ELuaError &) { // no-op (error msg already printed at exception launch) } @@ -482,7 +482,7 @@ void CSessionBrowserImpl::averageScoresFill(bool scenarioRated, uint32 rateFun, // call into lua callScenarioScoresMethod("onAverageScoresReceived", 1, 0); } - catch(ELuaError &) + catch(const ELuaError &) { // no-op (error msg already printed at exception launch) } @@ -573,7 +573,7 @@ void CSessionBrowserImpl::on_scenarioAverageScores(NLNET::TSockId /* from */, bo // call into lua callScenarioScoresMethod("onScenarioAverageScoresReceived", 1, 0); } - catch(ELuaError &) + catch(const ELuaError &) { // no-op (error msg already printed at exception launch) } @@ -647,7 +647,7 @@ void CSessionBrowserImpl::charsFill(const std::vector &chars // call into lua callRingCharTrackingMethod("onCharsListReceived", 1, 0); } - catch(ELuaError &) + catch(const ELuaError &) { // no-op (error msg already printed at exception launch) } @@ -706,7 +706,7 @@ void CSessionBrowserImpl::ringStatsFill() pSM->tryToUnblockTitleFromRingRatings( _LastAuthorRating, _LastAMRating, _LastMasterlessRating ); } } - catch(ELuaError &) + catch(const ELuaError &) { // no-op (error msg already printed at exception launch) } diff --git a/code/ryzom/client/src/sky.cpp b/code/ryzom/client/src/sky.cpp index 560cf7313..aedee24ce 100644 --- a/code/ryzom/client/src/sky.cpp +++ b/code/ryzom/client/src/sky.cpp @@ -305,7 +305,7 @@ CBitmap *buildSharedBitmap(const std::string &filename, // dump bitmap fisrt line return builtBitmaps.back(); } - catch(EStream &) + catch(const EStream &) { return NULL; } diff --git a/code/ryzom/client/src/sound_manager.cpp b/code/ryzom/client/src/sound_manager.cpp index 762eeb298..fb4b3708f 100644 --- a/code/ryzom/client/src/sound_manager.cpp +++ b/code/ryzom/client/src/sound_manager.cpp @@ -512,7 +512,7 @@ void CSoundManager::init(IProgressCallback *progressCallBack) _AudioMixer->enableBackgroundMusicTimeConstraint(ClientCfg.EnableBackgroundMusicTimeConstraint); /* } - catch( Exception& e ) + catch(const Exception &e) { nlwarning( "Error: %s", e.what() ); } @@ -1732,7 +1732,7 @@ void CSoundManager::updateEventAndGameMusicVolume() materials.push_back( cvMaterials.asInt(i) ); } } - catch (EConfigFile &e) + catch (const EConfigFile &e) { nlerror("Problem in the file %s : %s", fileName,e.what ()); } @@ -1786,7 +1786,7 @@ void CSoundManager::updateEventAndGameMusicVolume() } _Sounds.insert( make_pair( make_pair(moveType,soft), sounds) ); } - catch (EConfigFile &e) + catch (const EConfigFile &e) { nlwarning("Problem in the sounds by material config file : %s", e.what ()); } diff --git a/code/ryzom/client/src/string_manager_client.cpp b/code/ryzom/client/src/string_manager_client.cpp index 6fd3400ae..40886d518 100644 --- a/code/ryzom/client/src/string_manager_client.cpp +++ b/code/ryzom/client/src/string_manager_client.cpp @@ -175,7 +175,7 @@ namespace STRING_MANAGER _CacheLoaded = true; } - catch(NLMISC::Exception &e) + catch(const NLMISC::Exception &e) { nlinfo("SM : loadCache failed, exception : %s", e.what()); nlinfo("SM : cache deactivated"); @@ -620,7 +620,7 @@ restartLoop: { dynInfo.Message.serial(param.StringId); } - catch(Exception &) + catch(const Exception &) { param.StringId = EmptyStringId; } @@ -631,7 +631,7 @@ restartLoop: { dynInfo.Message.serial(param.Integer); } - catch(Exception &) + catch(const Exception &) { param.Integer= 0; } @@ -642,7 +642,7 @@ restartLoop: { dynInfo.Message.serial(param.Time); } - catch(Exception &) + catch(const Exception &) { param.Time= 0; } @@ -653,7 +653,7 @@ restartLoop: { dynInfo.Message.serial(param.Money); } - catch(Exception &) + catch(const Exception &) { param.Money= 0; } @@ -664,7 +664,7 @@ restartLoop: { dynInfo.Message.serial(param.DynStringId); } - catch(Exception &) + catch(const Exception &) { param.DynStringId= EmptyDynStringId; } @@ -1206,15 +1206,15 @@ void CStringManagerClient::initI18NSpecialWords(const std::string &languageCode) continue; // Get the women name index if possible. - uint womenNameColIndex; + uint womenNameColIndex = std::numeric_limits::max(); if( !ws.findCol(womenNameColIdent, womenNameColIndex) ) womenNameColIndex= std::numeric_limits::max(); // Get the description index if possible. - uint descColIndex; + uint descColIndex = std::numeric_limits::max(); if( !ws.findCol(descColIdent, descColIndex) ) descColIndex= std::numeric_limits::max(); - uint descColIndex2; + uint descColIndex2 = std::numeric_limits::max(); if( !ws.findCol(descColIdent2, descColIndex2) ) descColIndex2= std::numeric_limits::max(); @@ -1225,9 +1225,8 @@ void CStringManagerClient::initI18NSpecialWords(const std::string &languageCode) const ucstring &key= ws.getData(j, keyColIndex); const ucstring &name= ws.getData(j, nameColIndex); // Append to the I18N. - string keyStr= key.toString(); // avoid case problems - strlwr(keyStr); + string keyStr= NLMISC::toLower(key.toString()); // append the special key extension. keyStr+= keyExtenstion; @@ -1424,6 +1423,9 @@ const ucchar * CStringManagerClient::getSpecialWord(const std::string &label, bo map::iterator it = _SpecItem_TempMap.find(lwrLabel); if (it != _SpecItem_TempMap.end()) { + if( UseFemaleTitles && women ) + if (!it->second.WomenName.empty()) + return it->second.WomenName.c_str(); return it->second.Name.c_str(); } } diff --git a/code/ryzom/client/src/user_entity.cpp b/code/ryzom/client/src/user_entity.cpp index a5c016f34..64a493d2e 100644 --- a/code/ryzom/client/src/user_entity.cpp +++ b/code/ryzom/client/src/user_entity.cpp @@ -361,7 +361,8 @@ bool CUserEntity::build(const CEntitySheet *sheet) // virtual CInterfaceManager *pIM = CInterfaceManager::getInstance(); { CCDBNodeLeaf *node = pIM->getDbProp("SERVER:USER:IS_INVISIBLE", false); - if (node) { + if (node) + { ICDBNode::CTextId textId; node->addObserver(&_InvisibleObs, textId); } diff --git a/code/ryzom/common/src/game_share/character_sync_itf.h b/code/ryzom/common/src/game_share/character_sync_itf.h index 840dd2845..459659732 100644 --- a/code/ryzom/common/src/game_share/character_sync_itf.h +++ b/code/ryzom/common/src/game_share/character_sync_itf.h @@ -1137,12 +1137,12 @@ namespace CHARSYNC } // - ucstring getFullName() const + const ucstring& getFullName() const { return _FullName; } - void setFullName(ucstring value) + void setFullName(const ucstring &value) { _FullName = value; diff --git a/code/ryzom/common/src/game_share/mirror.cpp b/code/ryzom/common/src/game_share/mirror.cpp index 31304614b..1e025a30d 100644 --- a/code/ryzom/common/src/game_share/mirror.cpp +++ b/code/ryzom/common/src/game_share/mirror.cpp @@ -634,7 +634,7 @@ void CMirror::receiveTracker( bool entitiesOrProp, NLNET::CMessage& msgin ) ++nbSent; } } - catch( EMirror& ) + catch(const EMirror& ) { nlwarning( "MIRROR:ROWMGT:ATE> Invalid dataset name %s for adding tracker", name.c_str() ); } @@ -752,7 +752,7 @@ void CMirror::receiveAcknowledgeAddEntityTracker( NLNET::CMessage& msgin, TSe } } - catch( EMirror& ) + catch(const EMirror& ) { nlwarning( "MIRROR: Invalid dataset name %s for receiving ack of addEntityTracker", datasetname.c_str() ); } @@ -1043,7 +1043,7 @@ void cbAllMirrorsOnline( NLNET::CMessage& msgin, const std::string &/* serviceNa msgin.serial( versionStr ); hasVersion = true; } - catch ( EStreamOverflow& ) + catch (const EStreamOverflow&) {} if ( (! hasVersion) || (MirrorVersion != versionStr) ) nlerror( "Mirror version mismatch! This service: %s; Local MS: %s", MirrorVersion.c_str(), versionStr.c_str() ); @@ -1174,7 +1174,7 @@ void CMirror::receiveServiceHasMirrorReady( const std::string& serviceName, TSer } } } - catch ( EStreamOverflow& ) + catch (const EStreamOverflow&) { nlwarning( "Received SMIRU from old version service %s-%hu", serviceName.c_str(), serviceId.get() ); } @@ -2484,7 +2484,7 @@ NLMISC_CATEGORISED_COMMAND(mirror, displayMirrorRow, "Display the contents of th return true; } } - catch ( EMirror& ) + catch (const EMirror&) { log.displayNL( "Dataset not found" ); return true; @@ -2682,7 +2682,7 @@ NLMISC_CATEGORISED_COMMAND(mirror, displayMirrorEntities, "Display all of part o } } } - catch ( EMirror& ) + catch (const EMirror&) { log.displayNL( "Dataset not found" ); } @@ -2727,7 +2727,7 @@ NLMISC_COMMAND( lookForMirrorValue, "Look for values with criteria (Value can be } MirrorInstance->getDataSet( args[0] ).lookForValue( log, propName, anyValue, valueSearchedStr, onlyEntityType, onlyCreatorId, onlyDynamicId, false, true, false, true ); } - catch ( EMirror& ) + catch (const EMirror&) { log.displayNL( "Dataset not found" ); } @@ -2747,7 +2747,7 @@ NLMISC_CATEGORISED_COMMAND(mirror, displayMirrorTrackers, "Display the trackers { MirrorInstance->getDataSet( args[0] ).displayTrackers( log ); } - catch ( EMirror& ) + catch (const EMirror&) { log.displayNL( "Dataset not found" ); } @@ -2794,7 +2794,7 @@ NLMISC_CATEGORISED_COMMAND(mirror, rescanExistingEntities, "Scan the entities to CMirroredDataSet& dataset = MirrorInstance->getDataSet( args[0] ); MirrorInstance->rescanExistingEntities( dataset, log, true ); } - catch ( EMirror& ) + catch (const EMirror&) { log.displayNL( "Dataset not found" ); } @@ -2815,7 +2815,7 @@ NLMISC_CATEGORISED_COMMAND(mirror, displayUnknownOnlineEntities, "Scan the entit CMirroredDataSet& dataset = MirrorInstance->getDataSet( args[0] ); MirrorInstance->rescanExistingEntities( dataset, log, false ); } - catch ( EMirror& ) + catch (const EMirror&) { log.displayNL( "Dataset not found" ); } @@ -2844,7 +2844,7 @@ NLMISC_CATEGORISED_COMMAND(mirror, monitorMirrorEntity, "Set/unset an entity for else log.displayNL( "Invalid entity index provided" ); } - catch ( EMirror& ) + catch (const EMirror&) { log.displayNL( "Dataset not found" ); } @@ -2867,7 +2867,7 @@ NLMISC_CATEGORISED_DYNVARIABLE(mirror, sint32, MainNbEntities, "Number of online { *pointer = MirrorInstance->getDataSet( "fe_temp" ).getNbOnlineEntities(); } - catch ( EMirror& ) + catch (const EMirror&) { *pointer = -2; // silent } @@ -2888,7 +2888,7 @@ NLMISC_CATEGORISED_DYNVARIABLE(mirror, sint32, LocalEntities, "Number of online { *pointer = MirrorInstance->getDataSet( "fe_temp" ).getNbOwnedEntities(); } - catch ( EMirror& ) + catch (const EMirror&) { *pointer = -2; // silent } diff --git a/code/ryzom/common/src/game_share/object.cpp b/code/ryzom/common/src/game_share/object.cpp index d15497ce4..908cc6e2a 100644 --- a/code/ryzom/common/src/game_share/object.cpp +++ b/code/ryzom/common/src/game_share/object.cpp @@ -1288,7 +1288,8 @@ void CObjectTable::clear() CHECK_TABLE_INTEGRITY TContainer::iterator first(_Value.begin()); TContainer::iterator last(_Value.end()); - for (; first != last ;++first) { + for (; first != last ;++first) + { delete first->second; } _Value.clear(); @@ -3044,7 +3045,8 @@ void CObjectSerializerImpl::serialImpl(NLMISC::IStream& stream, CObject*& data, -- (serializer->Level); } uint endLength = stream.getPos(); - if (serializer->Log) { + if (serializer->Log) + { if (className.empty()) { nldebug("R2NET: (%u) Table sent %u bytes",serializer->Level, endLength - initLength); diff --git a/code/ryzom/common/src/game_share/object.h b/code/ryzom/common/src/game_share/object.h index 0f74d70fa..f4b292e2e 100644 --- a/code/ryzom/common/src/game_share/object.h +++ b/code/ryzom/common/src/game_share/object.h @@ -206,9 +206,8 @@ protected: uint32 _Validation; }; -/*inline std::ostream& operator<<( std::ostream& os, - const CObject& c ) { - +/*inline std::ostream& operator<<( std::ostream& os, const CObject& c ) +{ c.serialize(os); return os; }*/ diff --git a/code/ryzom/common/src/game_share/time_weather_season/weather_predict.cpp b/code/ryzom/common/src/game_share/time_weather_season/weather_predict.cpp index 144b06036..6570e2600 100644 --- a/code/ryzom/common/src/game_share/time_weather_season/weather_predict.cpp +++ b/code/ryzom/common/src/game_share/time_weather_season/weather_predict.cpp @@ -580,7 +580,7 @@ void CPredictWeather::generateWeatherStats(const std::string &fileName, const CW outputFile.serial(output[n]); } } - catch (NLMISC::EStream &e) + catch (const NLMISC::EStream &e) { nlwarning(e.what()); } diff --git a/code/ryzom/server/data_shard/client_commands_privileges.txt b/code/ryzom/server/data_shard/client_commands_privileges.txt index 0ab0e8e9f..c61537dfa 100644 --- a/code/ryzom/server/data_shard/client_commands_privileges.txt +++ b/code/ryzom/server/data_shard/client_commands_privileges.txt @@ -15,10 +15,10 @@ addSkillPoints :DEV:SGM:GM:EM: // Add skill points of given type (Fight=0, M addXPToSkill :DEV:SGM:GM:EM: // Gain experience in the given skill: [] broadcast :DEV:SGM:GM:EM:VG: // Broadcast a message: [repeat= or during=