static void context_hud_pre_show_handler(window_info *win, int widget_id, int mx, int my, window_info *cm_win) { #ifdef NEW_SOUND cm_sound_enabled = sound_on; cm_music_enabled = music_on; #endif // NEW_SOUND cm_minimap_shown = get_show_window(minimap_win); cm_rangstats_shown = get_show_window(range_win); }
void draw_ingame_interface() { #ifdef OPENGL_TRACE CHECK_GL_ERRORS(); #endif //OPENGL_TRACE #ifdef OLD_CLOSE_BAG // watch for closing a bag if(ground_items_win >= 0) { int old_view= view_ground_items; view_ground_items= get_show_window(ground_items_win); // watch for telling the server we need to close the bag if(old_view && !view_ground_items) { unsigned char protocol_name; protocol_name= S_CLOSE_BAG; my_tcp_send(my_socket,&protocol_name,1); } } #endif //OLD_CLOSE_BAG glColor3f(1.0f, 1.0f, 1.0f); draw_hud_frame(); //draw_hud_interface(); display_spells_we_have(); #ifdef OPENGL_TRACE CHECK_GL_ERRORS(); #endif //OPENGL_TRACE }
void draw_scene() { CHECK_GL_ERRORS(); glClearColor(skybox_fog_color[0], skybox_fog_color[1], skybox_fog_color[2], 0.0); if(!shadows_on || !have_stencil)glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT); else glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT|GL_STENCIL_BUFFER_BIT); if (!have_display) { new_zoom_level = zoom_level; // No scrolling when switching modes... if (quickbar_relocatable && quickbar_win >= 0) // Hack { if (get_show_window (quickbar_win) && windows_list.window[quickbar_win].cur_x < window_width - hud_x && window_height - windows_list.window[quickbar_win].cur_y > hud_y) hide_window (quickbar_win); } } glLoadIdentity (); // Reset The Matrix Enter2DMode (); display_windows (1); // Have to draw the dragged item *after* all windows glColor3f(1.0f,1.0f,1.0f); if (item_dragged != -1) drag_item (item_dragged, 0, 0); else if (use_item != -1 && current_cursor == CURSOR_USE_WITEM) drag_item (use_item, 0, 1); else if (storage_item_dragged != -1) drag_item (storage_item_dragged, 1, 0); draw_special_cursors(); Leave2DMode (); if(elwin_mouse >= 0) { if (current_cursor != elwin_mouse) change_cursor(elwin_mouse); elwin_mouse = -1; } SDL_GL_SwapBuffers(); CHECK_GL_ERRORS(); /* start or stop the harvesting effect depending on harvesting state */ check_harvesting_effect(); if (draw_delay > 0) { SDL_Delay (draw_delay); draw_delay = 0; } }
void display_book_window(book *b) { int *p; if(!b) return; if(b->type==1){ p=&paper_win; if(book_win!=-1) hide_window(book_win); } else { p=&book_win; if(paper_win!=-1) hide_window(paper_win); } book_opened = b->id; if(*p<0){ if(b->type==1) *p=create_window(b->title, -1, 0, book_win_x, book_win_y, 320, 400, ELW_WIN_DEFAULT^ELW_CLOSE_BOX); else if(b->type==2) *p=create_window(b->title, -1, 0, book_win_x, book_win_y, 528, 320, ELW_WIN_DEFAULT^ELW_CLOSE_BOX); //width/height are different set_window_handler(*p, ELW_HANDLER_DISPLAY, &display_book_handler); set_window_handler(*p, ELW_HANDLER_MOUSEOVER, &mouseover_book_handler); set_window_handler(*p, ELW_HANDLER_CLICK, &click_book_handler); windows_list.window[*p].data=b; } else { if((point)windows_list.window[*p].data!=(point)b) { safe_snprintf(windows_list.window[*p].window_name, sizeof(windows_list.window[*p].window_name), "%s", b->title); windows_list.window[*p].data=b; if(!get_show_window(*p)) show_window(*p); select_window(*p); } else if(!get_show_window(*p)) { show_window(*p); select_window(*p); } } }
// display the current time for the hud timer, coloured by stopped or running // int Hud_Timer::display(window_info *win, int base_y_start) { char str[10]; int x; check_cm_menu(win, base_y_start); if (input && (!view_hud_timer || !get_show_window(input->popup_win))) destroy_popup(); if (!view_hud_timer) return 0; base_y_start -= height; safe_snprintf(str, sizeof(str), "%c%1d:%02d", ((mode_coundown) ?countdown_str[0] :stopwatch_str[0]), current_value/60, current_value%60); x= 3+(win->len_x - (get_string_width((unsigned char*)str)*11)/12)/2; if (running) draw_string_shadowed(x, 2 + base_y_start, (unsigned char*)str, 1,0.5f, 1.0f, 0.5f,0.0f,0.0f,0.0f); else draw_string_shadowed(x, 2 + base_y_start, (unsigned char*)str, 1,1.0f, 0.5f, 0.5f,0.0f,0.0f,0.0f); if (mouse_over) { char *use_str = ((mode_coundown) ?countdown_str:stopwatch_str); draw_string_small_shadowed(-(int)(SMALL_FONT_X_LEN*(strlen(use_str)+0.5)), base_y_start, (unsigned char*)use_str, 1,1.0f,1.0f,1.0f,0.0f,0.0f,0.0f); mouse_over = false; } return height; }
void process_message_from_server(unsigned char *in_data, int data_lenght) { //see what kind of data we got switch (in_data[PROTOCOL]) { case RAW_TEXT: { // do filtering and ignoring data_lenght=filter_or_ignore_text(&in_data[3],data_lenght-3)+3; if(data_lenght > 3) { //how to display it if(interface_mode!=interface_opening) put_text_in_buffer(&in_data[3],data_lenght-3,0); else put_text_in_buffer(&in_data[3],data_lenght-3,54); //lets log it write_to_log(&in_data[3],data_lenght-3); } } break; case SMALL_WINDOW_TEXT: { add_text_to_small_text_buffer(in_data+3, data_lenght-3); display_small_text_window(); } break; case ADD_NEW_ACTOR: { add_actor_from_server(&in_data[3]); } break; case ADD_NEW_ENHANCED_ACTOR: { add_enhanced_actor_from_server(&in_data[3]); } break; case ADD_ACTOR_COMMAND: { add_command_to_actor(*((short *)(in_data+3)),in_data[5]); } break; case REMOVE_ACTOR: { destroy_actor(*((short *)(in_data+3))); } break; case KILL_ALL_ACTORS: { destroy_all_actors(); } break; case NEW_MINUTE: { game_minute=*((short *)(in_data+3)); new_minute(); } break; case LOG_IN_OK: { interface_mode=interface_game; previously_logged_in=1; } break; case HERE_YOUR_STATS: { get_the_stats((Sint16 *)(in_data+3)); } break; case SEND_PARTIAL_STAT: { get_partial_stat(*((Uint8 *)(in_data+3)),*((Sint32 *)(in_data+4))); } break; case GET_KNOWLEDGE_LIST: { get_knowledge_list(*(Uint16 *)(in_data+1)-1, in_data+3); } break; case GET_NEW_KNOWLEDGE: { get_new_knowledge(*(Uint16 *)(in_data+3)); } break; case HERE_YOUR_INVENTORY: { get_your_items(in_data+3); } break; case GET_NEW_INVENTORY_ITEM: { get_new_inventory_item(in_data+3); } break; case REMOVE_ITEM_FROM_INVENTORY: { remove_item_from_inventory(*((Uint8 *)(in_data+3))); } break; case INVENTORY_ITEM_TEXT: { put_small_text_in_box(&in_data[3],data_lenght-3,6*51+100,items_string); if(!(get_show_window(items_win)||get_show_window(trade_win))) { put_text_in_buffer(&in_data[3],data_lenght-3,0); } } break; case GET_KNOWLEDGE_TEXT: { put_small_text_in_box(&in_data[3],data_lenght-3,6*51+150,knowledge_string); } break; case CHANGE_MAP: { current_sector=-1; if(map_file_name[0]!=0) save_map(map_file_name); object_under_mouse=-1;//to prevent a nasty crash, while looking for bags, when we change the map close_dialogue(); // close the dialogue window if open destroy_all_particles(); if(!load_map(&in_data[4])){ // creating map if it does not exist int size=(in_data[3]&0x1f)<<4; new_map(size,size); dungeon=(in_data[3]&0x20)?1:0; strcpy(map_file_name,&in_data[4]); save_map(map_file_name); } kill_local_sounds(); #ifndef NO_MUSIC playing_music=0; #endif //NO_MUSIC get_map_playlist(); have_a_map=1; //also, stop the rain seconds_till_rain_starts=-1; seconds_till_rain_stops=-1; is_raining=0; rain_sound=0;//kill local sounds also kills the rain sound weather_light_offset=0; rain_light_offset=0; } break; case GET_TELEPORTERS_LIST: { add_teleporters_from_list(&in_data[3]); } break; case PLAY_MUSIC: { if(!no_sound)play_music(*((short *)(in_data+3))); } break; case PLAY_SOUND: { if(!no_sound)add_sound_object(*((short *)(in_data+3)),*((short *)(in_data+5)),*((short *)(in_data+7)),*((char *)(in_data+9)),*((short *)(in_data+10))); } break; case TELEPORT_OUT: { add_particle_sys_at_tile("./particles/teleport_in.part",*((short *)(in_data+3)),*((short *)(in_data+5))); if(!no_sound)add_sound_object(snd_tele_out,*((short *)(in_data+3)),*((short *)(in_data+5)),1,0); } break; case TELEPORT_IN: { add_particle_sys_at_tile("./particles/teleport_in.part",*((short *)(in_data+3)),*((short *)(in_data+5))); if(!no_sound)add_sound_object(snd_tele_in,*((short *)(in_data+3)),*((short *)(in_data+5)),1,0); } break; case LOG_IN_NOT_OK: { sprintf(log_in_error_str,"%s: %s",reg_error_str,invalid_pass); } break; case REDEFINE_YOUR_COLORS: { strcpy(log_in_error_str,redefine_your_colours); } break; case YOU_DONT_EXIST: { sprintf(log_in_error_str,"%s: %s",reg_error_str,char_dont_exist); } break; case CREATE_CHAR_NOT_OK: { sprintf(create_char_error_str,"%s: %s",reg_error_str,char_name_in_use); return; } break; case CREATE_CHAR_OK: { login_from_new_char(); } break; case YOU_ARE: { yourself=*((short *)(in_data+3)); } break; case START_RAIN: { seconds_till_rain_starts=*((Uint8 *)(in_data+3)); seconds_till_rain_stops=-1; } break; case STOP_RAIN: { seconds_till_rain_stops=*((Uint8 *)(in_data+3)); seconds_till_rain_starts=-1; } break; case THUNDER: { add_thunder(rand()%5,*((Uint8 *)(in_data+3))); } break; case SYNC_CLOCK: { server_time_stamp=*((int *)(in_data+3)); client_time_stamp=SDL_GetTicks(); client_server_delta_time=server_time_stamp-client_time_stamp; } break; case PONG: { Uint8 str[160]; sprintf(str,"%s: %i MS",server_latency, SDL_GetTicks()-*((Uint32 *)(in_data+3))); log_to_console(c_green1,str); } break; case UPGRADE_NEW_VERSION: { log_to_console(c_red1,update_your_client); log_to_console(c_red1,(char*)web_update_address); } break; case UPGRADE_TOO_OLD: { log_to_console(c_red1,client_ver_not_supported); log_to_console(c_red1,(char*)web_update_address); this_version_is_invalid=1; } break; case GET_NEW_BAG: { put_bag_on_ground(*((Uint16 *)(in_data+3)),*((Uint16 *)(in_data+5)),*((Uint8 *)(in_data+7))); } break; case GET_BAGS_LIST: { add_bags_from_list(&in_data[3]); } break; case SPAWN_BAG_PARTICLES: { add_particle_sys_at_tile("./particles/bag_in.part",*((Uint16 *)(in_data+3)),*((Uint16 *)(in_data+5))); } break; case GET_NEW_GROUND_ITEM: { get_bag_item(in_data+3); } break; case HERE_YOUR_GROUND_ITEMS: { get_bags_items_list(&in_data[3]); } break; case CLOSE_BAG: { hide_window(ground_items_win); } break; case REMOVE_ITEM_FROM_GROUND: { remove_item_from_ground(in_data[3]); } break; case DESTROY_BAG: { remove_bag(in_data[3]); } break; case NPC_TEXT: { put_small_text_in_box(&in_data[3],data_lenght-3,dialogue_menu_x_len-70,dialogue_string); display_dialogue(); if(in_data[3]>=127 && in_data[4]>=127) { add_questlog(&in_data[4],data_lenght-4); } } break; case SEND_NPC_INFO: { my_strcp(npc_name,&in_data[3]); cur_portrait=in_data[23]; } break; case NPC_OPTIONS_LIST: { build_response_entries(&in_data[3],*((Uint16 *)(in_data+1))); } break; case GET_TRADE_ACCEPT: { if(!in_data[3])trade_you_accepted=1; else trade_other_accepted=1; } break; case GET_TRADE_REJECT: { if(!in_data[3])trade_you_accepted=0; else trade_other_accepted=0; } break; case GET_TRADE_EXIT: { hide_window(trade_win); } break; case GET_YOUR_TRADEOBJECTS: { get_your_trade_objects(in_data+3); } break; case GET_TRADE_OBJECT: { put_item_on_trade(in_data+3); } break; case REMOVE_TRADE_OBJECT: { remove_item_from_trade(in_data+3); } break; case GET_TRADE_PARTNER_NAME: { get_trade_partner_name(&in_data[3],*((Uint16 *)(in_data+1))-1); } break; case GET_ACTOR_DAMAGE: { get_actor_damage(*((Uint16 *)(in_data+3)),in_data[5]); } break; case GET_ACTOR_HEAL: { get_actor_heal(*((Uint16 *)(in_data+3)),in_data[5]); } break; case ACTOR_UNWEAR_ITEM: { unwear_item_from_actor(*((Uint16 *)(in_data+3)),in_data[5]); } break; case ACTOR_WEAR_ITEM: { actor_wear_item(*((Uint16 *)(in_data+3)),in_data[5],in_data[6]); } break; case NPC_SAY_OVERTEXT: { add_displayed_text_to_actor( get_actor_ptr_from_id( *((Uint16 *)(in_data+3)) ), in_data+5 ); } break; case BUDDY_EVENT: { if(in_data[3]==1) add_buddy(&in_data[5],in_data[4],data_lenght-5); else if(in_data[3]==0) del_buddy(&in_data[4],data_lenght-4); } break; // BARREN MOON NEW MESSAGES case THIS_IS_ACTIVE_SECTOR: active_sector=*((Uint16 *)(in_data+3)); break; case GET_TILE_DATA: get_tile_data(in_data+3); break; case GET_3D_OBJECTS: get_3d_objects(in_data+3); break; case GET_2D_OBJECTS: get_2d_objects(in_data+3); break; case GET_LIGHT_OBJECTS: get_light_objects(in_data+3); break; case GET_PARTICLE_OBJECTS: get_particle_objects(in_data+3); break; case GET_3D_OBJECTS_FULL_ROTATION: get_3d_objects_full_rotation(in_data+3); break; case GET_CHECKSUMS: { actor *actor=pf_get_our_actor(); get_checksums(in_data+3, sector_get(actor->x_pos,actor->y_pos)); break; } case ADD_3D_OBJECT: add_3d_object(in_data+3); break; case ADD_3D_OBJECT_FULL_ROTATION: add_3d_object_fullrotation(in_data+3); break; case DELETE_3D_OBJECT: delete_3d_object(in_data+3); break; case REPLACE_3D_OBJECT: replace_3d_object(in_data+3); break; case ADD_2D_OBJECT: add_2d_object(in_data+3); break; case DELETE_2D_OBJECT: delete_2d_object(in_data+3); break; case REPLACE_2D_OBJECT: replace_2d_object(in_data+3); break; case ADD_LIGHT: add_lights(in_data+3); break; case DELETE_LIGHT: delete_light(in_data+3); break; case ADD_PARTICLE: add_particle(in_data+3); break; case DELETE_PARTICLE: delete_particle(in_data+3); break; case REPLACE_PARTICLE: replace_particle(in_data+3); break; default: { /* Unknown data type?? */; } break; } }
bool shown(void) const { return get_show_window(main_win_id); }
void change_map (const char *mapname) { #ifndef MAP_EDITOR remove_all_bags(); remove_all_mines(); #endif //MAP_EDITOR set_all_intersect_update_needed(main_bbox_tree); object_under_mouse=-1;//to prevent a nasty crash, while looking for bags, when we change the map #ifndef MAP_EDITOR2 #ifdef EXTRA_DEBUG ERR(); #endif close_dialogue(); // close the dialogue window if open close_storagewin(); //if storage is open, close it destroy_all_particles(); ec_delete_all_effects(); #ifdef NEW_SOUND stop_all_sounds(); #endif //NEW_SOUND missiles_clear(); if (!el_load_map(mapname)) { char error[255]; safe_snprintf(error, sizeof(error), cant_change_map, mapname); LOG_TO_CONSOLE(c_red4, error); LOG_TO_CONSOLE(c_red4, empty_map_str); LOG_ERROR(cant_change_map, mapname); load_empty_map(); } else { locked_to_console = 0; } load_map_marks(); #ifdef NEW_SOUND get_map_playlist(); setup_map_sounds(get_cur_map(mapname)); #endif // NEW_SOUND have_a_map=1; //also, stop the rain weather_clear(); if ( get_show_window (map_root_win) ) { hide_window(map_root_win); show_window(game_root_win); } #else // !MAP_EDITOR2 destroy_all_particles(); #ifdef NEW_SOUND stop_all_sounds(); #endif //NEW_SOUND if (!load_map(mapname)) { char error[255]; safe_snprintf(error, sizeof(error), cant_change_map, mapname); LOG_TO_CONSOLE(c_red4, error); LOG_TO_CONSOLE(c_red4, empty_map_str); LOG_ERROR(cant_change_map, mapname); load_empty_map(); } #ifdef NEW_SOUND get_map_playlist(); setup_map_sounds(get_cur_map(mapname)); #endif // NEW_SOUND have_a_map=1; #endif //MAP_EDITOR2 change_minimap(); #ifdef PAWN run_pawn_map_function ("change_map", "s", mapname); #endif }
int update_have_display(window_info * win) { // if the calling window is shown, we have a display, else check all 3d windows have_display = (win->displayed || get_show_window(game_root_win) || get_show_window(newchar_root_win)); return 0; }
// finish up on one file that just downloaded void handle_file_download(struct http_get_struct *get) { int sts; if(!get){ // huh? what are you doing? return; } // lock the mutex CHECK_AND_LOCK_MUTEX(download_mutex); if(get->status == 0){ // replace the current file (creates all required directories) sts = move_file_to_updates(download_temp_file, download_cur_file, doing_custom); LOG_DEBUG("Moved \"%s\" to \"%s\"", download_temp_file, download_cur_file); // check for errors if(!sts){ // TODO: make the restart more intelligent if(allow_restart){ if(strstr(download_cur_file, "2dobjects/")==NULL && strstr(download_cur_file, "3dobjects/")==NULL && strstr(download_cur_file, "maps/")==NULL && strstr(download_cur_file, "music/")==NULL && strstr(download_cur_file, "textures/")==NULL && strstr(download_cur_file, ".menu")==NULL) restart_required++; if(strstr(download_cur_file, ".menu") > 0) reload_user_menus(); if(restart_required == 1) { LOG_TO_CONSOLE(c_red1, "Downloading Updates..."); } } } else { LOG_ERROR("Unable to finish processing of %s (%d)", download_cur_file, errno); // the final renamed failed, no restart permitted allow_restart= 0; restart_required= 0; } } else { // and make sure we can't restart since we had a total failure allow_restart= 0; restart_required= 0; } // wait for the just completed thread so we free it's resources assert(get->thread_index<MAX_THREADS); SDL_WaitThread(thread_list[get->thread_index], NULL); thread_list[get->thread_index] = NULL; // release the filename free(download_cur_file); free(download_cur_md5); download_cur_file= NULL; // unlock mutex CHECK_AND_UNLOCK_MUTEX(download_mutex); // now, release everything free(get); // lock the mutex CHECK_AND_LOCK_MUTEX(download_mutex); if(download_queue_size > 0 && !download_cur_file){ // start a thread if a file is waiting to download and no download active char buffer[512]; FILE *fp; safe_snprintf(download_temp_file, sizeof(download_temp_file), "tmp/temp%03d.dat", ++temp_counter); fp = open_file_config(download_temp_file, "wb+"); if(fp == NULL){ LOG_ERROR("%s: %s \"%s\": %s\n", reg_error_str, cant_open_file, download_temp_file, strerror(errno)); } else { // build the proper URL to download download_cur_file= download_queue[--download_queue_size]; download_cur_md5= download_MD5s[download_queue_size]; if(is_this_files_lst) { safe_snprintf(buffer, sizeof(buffer), "http://%s/updates%d%d%d/%s", update_server, VER_MAJOR, VER_MINOR, VER_RELEASE, download_cur_file); } else { safe_snprintf(buffer, sizeof(buffer), "http://%s/updates/%s", update_server, download_cur_file); } buffer[sizeof(buffer)-1]= '\0'; http_threaded_get_file(update_server, buffer, fp, download_cur_md5, EVENT_DOWNLOAD_COMPLETE); } } // check to see if this was the last file && a restart is required if(!update_busy && restart_required && allow_restart && download_queue_size <= 0 && !download_cur_file){ // yes, now trigger a restart LOG_INFO("Restart required because of update"); // Display something on the screen for a little bit before restarting if(autoupdate_delay >= 0) { int i; for (i=0; i < windows_list.num_windows;i++) { if(get_show_window(i)) break; } create_update_root_window (window_width, window_height, autoupdate_delay, i); show_window (update_root_win); } else { LOG_TO_CONSOLE(c_red2, "You need to restart the client to activate the updates!"); } } // unlock mutex CHECK_AND_UNLOCK_MUTEX(download_mutex); }
void draw_scene() { CHECK_GL_ERRORS(); glClearColor(skybox_fog_color[0], skybox_fog_color[1], skybox_fog_color[2], 0.0); if(!shadows_on || !have_stencil)glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT); else glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT|GL_STENCIL_BUFFER_BIT); if (!have_display) { new_zoom_level = zoom_level; // No scrolling when switching modes... if (quickbar_relocatable && quickbar_win >= 0) // Hack { if (get_show_window (quickbar_win) && windows_list.window[quickbar_win].cur_x < window_width - hud_x && window_height - windows_list.window[quickbar_win].cur_y > hud_y) hide_window (quickbar_win); } } glLoadIdentity (); // Reset The Matrix Enter2DMode (); display_windows (1); // Have to draw the dragged item *after* all windows glColor3f(1.0f,1.0f,1.0f); if (item_dragged != -1) drag_item (item_dragged, 0, 0); else if (use_item != -1 && current_cursor == CURSOR_USE_WITEM) drag_item (use_item, 0, 1); else if (storage_item_dragged != -1) drag_item (storage_item_dragged, 1, 0); draw_special_cursors(); Leave2DMode (); if(elwin_mouse >= 0) { if (current_cursor != elwin_mouse) change_cursor(elwin_mouse); elwin_mouse = -1; } SDL_GL_SwapWindow(el_gl_window); CHECK_GL_ERRORS(); /* stuff to do not every frame, twice a second is fine */ { static Uint32 last_half_second_timer = 0; static int first_time = 1; Uint32 current_time = SDL_GetTicks(); if (first_time) { last_half_second_timer = current_time; first_time = 0; } if ((current_time - last_half_second_timer) > 500u) { /* start or stop the harvesting effect depending on harvesting state */ check_harvesting_effect(); /* check for and possibly do auto save */ auto_save_local_and_server(); /* action on afk state changes */ check_afk_state(); /* the timer in the hud */ update_hud_timer(); /* check if we need to do buff duration requests */ check_then_do_buff_duration_request(); /* check if we are doing a server connection test */ check_if_testing_server_connection(); /* until next time */ last_half_second_timer = current_time; } } if (draw_delay > 0) { SDL_Delay (draw_delay); draw_delay = 0; } }
void close(void) { if (get_show_window(ipu.popup_win)) clear_popup_window(&ipu); }