void net_reload() { if (prot) { if (net_server) { if (current_level) delete current_level; bFILE *fp; if (!reload_start()) return ; do { // make sure server saves the file fp=open_file(NET_STARTFILE,"rb"); if (fp->open_failure()) { delete fp; fp=NULL; } } while (!fp); spec_directory sd(fp); #if 0 spec_entry *e=sd.find("Copyright 1995 Crack dot Com, All Rights reserved"); if (!e) { the_game->show_help("This level is missing copyright information, cannot load\n"); current_level=new level(100,100,"untitled"); the_game->need_refresh(); } else #endif current_level=new level(&sd,fp,NET_STARTFILE); delete fp; base->current_tick=(current_level->tick_counter()&0xff); reload_end(); } else if (current_level) { join_struct *join_list=base->join_list; while (join_list) { view *f=player_list; for (; f && f->next; f=f->next); // find last player, add one for pn int i,st=0; for (i=0; i<total_objects; i++) if (!strcmp(object_names[i],"START")) st=i; game_object *o=create(current_start_type,0,0); game_object *start=current_level->get_random_start(320,NULL); if (start) { o->x=start->x; o->y=start->y; } else { o->x=100; o->y=100; } f->next=new view(o,NULL,join_list->client_id); strncpy(f->next->name,join_list->name, view::namesize); o->set_controller(f->next); f->next->set_tint(f->next->player_number); if (start) current_level->add_object_after(o,start); else current_level->add_object(o); view *v = f->next; v->m_aa = ivec2(5); v->m_bb = ivec2(319, 199) - ivec2(5); join_list = join_list->next; } base->join_list=NULL; current_level->save(NET_STARTFILE,1); base->mem_lock=0; Jwindow *j=wm->CreateWindow(ivec2(0, yres / 2), ivec2(-1), new info_field(0, 0, 0, symbol_str("resync"), new button(0, wm->font()->Size().y + 5, ID_NET_DISCONNECT, symbol_str("slack"),NULL)),symbol_str("hold!")) ; wm->flush_screen(); if (!reload_start()) return ; base->input_state=INPUT_RELOAD; // if someone missed the game tick with the RELOAD data in it, make sure the get it // wait for all client to reload the level with the new players do { service_net_request(); if (wm->IsPending()) { Event ev; do { wm->get_event(ev); if (ev.type==EV_MESSAGE && ev.message.id==ID_NET_DISCONNECT) { game_face->end_reload(1); base->input_state=INPUT_PROCESSING; } } while (wm->IsPending()); wm->flush_screen(); } } while (!reload_end()); wm->close_window(j); unlink(NET_STARTFILE); the_game->reset_keymap(); base->input_state=INPUT_COLLECTING; } } }
int get_inputs_from_server(unsigned char *buf) { if (prot && base->input_state!=INPUT_PROCESSING) // if input is not here, wait on it { time_marker start; int total_retry=0; Jwindow *abort=NULL; while (base->input_state!=INPUT_PROCESSING) { if (!prot) { base->input_state=INPUT_PROCESSING; return 1; } service_net_request(); time_marker now; // if this is taking to long, the packet was probably lost, ask for it to be resent if (now.diff_time(&start)>0.05) { if (prot->debug_level(net_protocol::DB_IMPORTANT_EVENT)) fprintf(stderr,"(missed packet)"); game_face->input_missing(); start.get_time(); total_retry++; if (total_retry==12000) // 2 minutes and nothing { abort=wm->CreateWindow(ivec2(0, yres / 2), ivec2(-1, wm->font()->Size().y*4), new info_field(0, 0, 0, symbol_str("waiting"), new button(0, wm->font()->Size().y + 5, ID_NET_DISCONNECT, symbol_str("slack"),NULL)),symbol_str("Error")); wm->flush_screen(); } } if (abort) { if (wm->IsPending()) { Event ev; do { wm->get_event(ev); if (ev.type==EV_MESSAGE && ev.message.id==ID_NET_DISCONNECT) { kill_slackers(); base->input_state=INPUT_PROCESSING; } } while (wm->IsPending()); wm->flush_screen(); } } } if (abort) { wm->close_window(abort); the_game->reset_keymap(); } } memcpy(base->last_packet.data,base->packet.data,base->packet.packet_size()+base->packet.packet_prefix_size()); int size=base->packet.packet_size(); memcpy(buf,base->packet.packet_data(),size); base->packet.packet_reset(); base->mem_lock=0; return size; }
int get_inputs_from_server(unsigned char *buf) { if (idle_man) idle_man->idle_reset(); if (prot && base->input_state!=INPUT_PROCESSING) // if input is not here, wait on it { time_marker start; int total_retry=0; jwindow *abort=NULL; while (base->input_state!=INPUT_PROCESSING) { if (!prot) { base->input_state=INPUT_PROCESSING; return 1; } service_net_request(); time_marker now; // if this is taking to long, the packet was probably lost, ask for it to be resent if (now.diff_time(&start)>0.05) { if (idle_man) idle_man->idle(); if (prot->debug_level(net_protocol::DB_IMPORTANT_EVENT)) dprintf("(missed packet)"); if (game_face) game_face->input_missing(); start.get_time(); total_retry++; if (total_retry==12000) // 2 minutes and nothing { abort=eh->new_window(0,yres/2,-1,eh->font()->height()*4, new info_field(WINDOW_FRAME_LEFT, WINDOW_FRAME_TOP, 0,symbol_str("waiting"), new button(WINDOW_FRAME_LEFT, WINDOW_FRAME_TOP+eh->font()->height()+5,ID_NET_DISCONNECT, symbol_str("slack"),NULL)),symbol_str("Error")); eh->flush_screen(); } } if (abort) { if (eh->event_waiting()) { event ev; do { eh->get_event(ev); if (ev.type==EV_MESSAGE && ev.message.id==ID_NET_DISCONNECT) { kill_slackers(); base->input_state=INPUT_PROCESSING; } } while (eh->event_waiting()); eh->flush_screen(); } } } if (abort) { eh->close_window(abort); the_game->reset_keymap(); } } memcpy(base->last_packet.data,base->packet.data,base->packet.packet_size()+base->packet.packet_prefix_size()); int size=base->packet.packet_size(); memcpy(buf,base->packet.packet_data(),size); base->packet.packet_reset(); base->mem_lock=0; return size; }