int add_emote(char *text, int len){ int j; char *id; actor *act=NULL; for(j=1;j<len;j++) if(text[j]==' ') {text[j]=0; break;} id=&text[j+1]; text++; printf("Actor [%s] [%s]\n",text,id); LOCK_ACTORS_LISTS(); for (j = 0; j < max_actors; j++){ if (!strncasecmp(actors_list[j]->actor_name, text, strlen(text)) && (actors_list[j]->actor_name[strlen(text)] == ' ' || actors_list[j]->actor_name[strlen(text)] == '\0')){ act = actors_list[j]; LOG_TO_CONSOLE(c_orange1, "actor found, adding emote"); printf("actor found\n"); add_emote_to_actor(act->actor_id,atoi(id)); printf("message added %s\n",id); } } if (!act){ UNLOCK_ACTORS_LISTS(); LOG_TO_CONSOLE(c_orange1, "actor not found"); return 1; } UNLOCK_ACTORS_LISTS(); *(id-1)=' '; return 1; }
int set_idle(char *text, int len){ int j,x; char *id; actor *act=NULL; for(j=1;j<len;j++) if(text[j]==' ') {text[j]=0; break;} id=&text[j+1]; x=j; text++; printf("Actor [%s] [%s]\n",text,id); LOCK_ACTORS_LISTS(); for (j = 0; j < max_actors; j++){ if (!strncasecmp(actors_list[j]->actor_name, text, strlen(text)) && (actors_list[j]->actor_name[strlen(text)] == ' ' || actors_list[j]->actor_name[strlen(text)] == '\0')){ struct CalMixer *mixer; act = actors_list[j]; mixer=CalModel_GetMixer(act->calmodel); LOG_TO_CONSOLE(c_orange1, "actor found, adding anims"); printf("actor found\n"); CalMixer_ClearCycle(mixer,act->cur_anim.anim_index, 0.0f); while(*id){ int anim_id; double anim_wg; anim_id=atoi(id); id++; while(*id!=' '&&*id!=0) id++; anim_wg=atof(id); id++; while(*id!=' '&&*id!=0) id++; printf("setting anim %i with weight %f\n",anim_id,anim_wg); if(anim_wg<0) CalMixer_ClearCycle(mixer,actors_defs[act->actor_type].cal_frames[anim_id].anim_index, 0.0f); else CalMixer_BlendCycle(mixer,actors_defs[act->actor_type].cal_frames[anim_id].anim_index,anim_wg, 0.1f); } printf("command added %s\n",id); } } if (!act){ UNLOCK_ACTORS_LISTS(); LOG_TO_CONSOLE(c_orange1, "actor not found"); return 1; } UNLOCK_ACTORS_LISTS(); text[x-1]=' '; return 1; }
int horse_cmd(char* text, int len){ int j,x; char *id; actor *act=NULL; for(j=1;j<len;j++) if(text[j]==' ') {text[j]=0; break;} id=&text[j+1]; x=j; text++; printf("Actor [%s] [%s] [%i]\n",text,id,atoi(id)); LOCK_ACTORS_LISTS(); for (j = 0; j < max_actors; j++){ if (!strncasecmp(actors_list[j]->actor_name, text, strlen(text)) && (actors_list[j]->actor_name[strlen(text)] == ' ' || actors_list[j]->actor_name[strlen(text)] == '\0')){ act = actors_list[j]; LOG_TO_CONSOLE(c_orange1, "actor found, adding horse"); } } text[x-1]=' '; if (!act){ UNLOCK_ACTORS_LISTS(); LOG_TO_CONSOLE(c_orange1,"Actor doesn't exist"); return 1; // Eek! We don't have an actor match... o.O } act->sit_idle=act->stand_idle=0; if(act->attached_actor>=0){ //remove horse remove_actor_attachment(act->actor_id); LOG_TO_CONSOLE(c_orange1,"De-horsified"); } else { //add horse int hh=atoi(id); if (hh<=0) hh=200; add_actor_attachment(act->actor_id, hh); LOG_TO_CONSOLE(c_orange1,"Horsified"); } UNLOCK_ACTORS_LISTS(); return 1; }
/* stop or restart the harvesting eye candy effect depending on the harvesting state */ void check_harvesting_effect(void) { /* if the harvesting effect is on but we're not harvesting, stop it */ if ((!harvesting || !use_harvesting_eye_candy) && (harvesting_effect_reference != NULL)) { ec_recall_effect(harvesting_effect_reference); harvesting_effect_reference = NULL; } /* but if we are harvesting but there is no effect, start it if wanted */ else if (harvesting && use_eye_candy && use_harvesting_eye_candy && (harvesting_effect_reference == NULL)) { actor *act; LOCK_ACTORS_LISTS(); act = get_actor_ptr_from_id(yourself); if (act != NULL) harvesting_effect_reference = ec_create_ongoing_harvesting2(act, 1.0, 1.0, (poor_man ? 6 : 10), 1.0); UNLOCK_ACTORS_LISTS(); } }
int set_neck(char *text, int len){ int j; char *id; actor *act=NULL; for(j=1;j<len;j++) if(text[j]==' ') {text[j]=0; break;} id=&text[j+1]; text++; printf("Actor [%s] [%s]\n",text,id); LOCK_ACTORS_LISTS(); for (j = 0; j < max_actors; j++){ if (!strncasecmp(actors_list[j]->actor_name, text, strlen(text)) && (actors_list[j]->actor_name[strlen(text)] == ' ' || actors_list[j]->actor_name[strlen(text)] == '\0')){ act = actors_list[j]; LOG_TO_CONSOLE(c_orange1, "actor found, adding neck item"); printf("actor found\n"); if(atoi(id)) { //wear unwear_item_from_actor(act->actor_id,KIND_OF_NECK); actor_wear_item(act->actor_id,KIND_OF_NECK, atoi(id)); } else { //unwear unwear_item_from_actor(act->actor_id,KIND_OF_NECK); } } } if (!act){ UNLOCK_ACTORS_LISTS(); LOG_TO_CONSOLE(c_orange1, "actor not found"); return 1; } UNLOCK_ACTORS_LISTS(); *(id-1)=' '; return 1; }
int send_cmd(char *text, int len){ int j,x; char *id; actor *act=NULL; for(j=1;j<len;j++) if(text[j]==' ') {text[j]=0; break;} id=&text[j+1]; x=j; text++; printf("Actor [%s] [%s]\n",text,id); LOCK_ACTORS_LISTS(); for (j = 0; j < max_actors; j++){ if (!strncasecmp(actors_list[j]->actor_name, text, strlen(text)) && (actors_list[j]->actor_name[strlen(text)] == ' ' || actors_list[j]->actor_name[strlen(text)] == '\0')){ act = actors_list[j]; LOG_TO_CONSOLE(c_orange1, "actor found, adding command"); printf("actor found\n"); while(*id){ add_command_to_actor(act->actor_id,atoi(id)); id++; while(*id!=' '&&*id!=0) id++; } printf("command added %s\n",id); } } if (!act){ UNLOCK_ACTORS_LISTS(); LOG_TO_CONSOLE(c_orange1, "actor not found"); return 1; } UNLOCK_ACTORS_LISTS(); text[x-1]=' '; return 1; }
int parse_text_for_emote_commands(const char *text, int len) { int i=0, j = 0, wf=0,ef=0, itsme=0; char name[20]; // Yeah, this should be done correctly emote_dict emote_text; actor *act; //printf("parsing local for emotes\n"); //extract name while(text[i]&&i<20){ if (is_color(text[i])) {i++; continue;} name[j]=text[i]; if(text[i]==' ' || text[i]==':') { name[j]=0; if(text[i]==':') i++; break; } i++;j++; } if(j>=20||name[j]) return 0; //out of bound or not terminated //check if we are saying text LOCK_ACTORS_LISTS(); act = get_actor_ptr_from_id(yourself); if (!act){ UNLOCK_ACTORS_LISTS(); LOG_ERROR("Unable to find actor who just said local text?? name: %s", name); return 1; // Eek! We don't have an actor match... o.O } if (!(!strncasecmp(act->actor_name, name, strlen(name)) && (act->actor_name[strlen(name)] == ' ' || act->actor_name[strlen(name)] == '\0'))){ //we are not saying this text, return //UNLOCK_ACTORS_LISTS(); //return 0; itsme=0; } else itsme=1; j=0; do { if (is_color(text[i])) continue; if ((text[i]==' ' || text[i]==0)) { if (j&&j<=MAX_EMOTE_LEN) { wf++; emote_text.command[j]=0; ef+=match_emote(&emote_text,act,itsme); } else wf+= (j) ? 1:0; j=0; } else { if (j<MAX_EMOTE_LEN) emote_text.command[j]=text[i]; j++; } } while(text[i++]); //printf("ef=%i, wf=%i, filter=>%i\n",ef,wf,emote_filter); UNLOCK_ACTORS_LISTS(); return ((ef==wf) ? (emote_filter):(0)); }
int start_rendering() { static int done = 0; static void * network_thread_data[2] = { NULL, NULL }; static Uint32 last_frame_and_command_update = 0; SDL_Thread *network_thread; queue_t *message_queue; #ifndef WINDOWS SDL_EventState(SDL_SYSWMEVENT,SDL_ENABLE); #endif queue_initialise(&message_queue); network_thread_data[0] = message_queue; network_thread_data[1] = &done; network_thread = SDL_CreateThread(get_message_from_server, network_thread_data); /* Loop until done. */ while( !done ) { SDL_Event event; // handle SDL events in_main_event_loop = 1; while( SDL_PollEvent( &event ) ) { done = HandleEvent(&event); } in_main_event_loop = 0; //advance the clock cur_time = SDL_GetTicks(); //check for network data if(!queue_isempty(message_queue)) { message_t *message; while((message = queue_pop(message_queue)) != NULL) { process_message_from_server(message->data, message->length); free(message->data); free(message); } } #ifdef OLC olc_process(); #endif //OLC my_tcp_flush(my_socket); // make sure the tcp output buffer is set if (have_a_map && cur_time > last_frame_and_command_update + 60) { LOCK_ACTORS_LISTS(); next_command(); UNLOCK_ACTORS_LISTS(); move_to_next_frame(); last_frame_and_command_update = cur_time; } while (cur_time > next_second_time && real_game_second < 59) { real_game_second += 1; new_second(); next_second_time += 1000; } #ifdef NEW_SOUND weather_sound_control(); #endif //NEW_SOUND if(!limit_fps || (cur_time-last_time && 1000/(cur_time-last_time) <= limit_fps)) { weather_update(); animate_actors(); //draw everything draw_scene(); last_time=cur_time; } else { SDL_Delay(1);//give up timeslice for anyone else } #ifdef TIMER_CHECK //Check the timers to make sure that they are all still alive... check_timers(); #endif //cache handling if(cache_system)cache_system_maint(); //see if we need to exit if(exit_now) { done = 1; break; } } if(!done) { done = 1; } LOG_INFO("Client closed"); SDL_WaitThread(network_thread,&done); queue_destroy(message_queue); if(pm_log.ppl)free_pm_log(); //save all local data save_local_data(NULL, 0); #ifdef PAWN cleanup_pawn (); #endif #ifdef NEW_SOUND destroy_sound(); // Cleans up physical elements of the sound system and the streams thread clear_sound_data(); // Cleans up the config data #endif // NEW_SOUND ec_destroy_all_effects(); if (have_a_map) { destroy_map(); free_buffers(); } unload_questlog(); save_item_lists(); free_emotes(); free_actor_defs(); free_books(); free_vars(); cleanup_rules(); save_exploration_map(); cleanup_counters(); cleanup_chan_names(); cleanup_hud(); SDL_RemoveTimer(draw_scene_timer); SDL_RemoveTimer(misc_timer); end_particles (); free_bbox_tree(main_bbox_tree); main_bbox_tree = NULL; free_astro_buffer(); free_translations(); free_skybox(); /* Destroy our GL context, etc. */ SDL_QuitSubSystem(SDL_INIT_AUDIO); SDL_QuitSubSystem(SDL_INIT_TIMER); /*#ifdef WINDOWS // attempt to restart if requested if(restart_required > 0){ LOG_INFO("Restarting %s", win_command_line); SDL_CreateThread(system, win_command_line); } #endif //WINDOWS */ #ifdef NEW_SOUND final_sound_exit(); #endif #ifdef CUSTOM_UPDATE stopp_custom_update(); #endif /* CUSTOM_UPDATE */ clear_zip_archives(); destroy_tcp_out_mutex(); if (use_frame_buffer) free_reflection_framebuffer(); printf("doing SDL_Quit\n"); fflush(stderr); SDL_Quit( ); printf("done SDL_Quit\n"); fflush(stderr); cleanup_mem(); xmlCleanupParser(); FreeXML(); exit_logging(); return(0); }