void object_player_look(obj_type *obj) { float look_add; weapon_type *weap; look_add=obj->look.ang_add; if (look_add==0) return; // inverted looking if (setup.invert_look) look_add=-look_add; // zoom factors weap=weapon_find_current(obj); if (weap!=NULL) { if ((weap->zoom.on) && (weap->zoom.mode!=zoom_mode_off)) { look_add*=weap->zoom.look_factor; } } // change look obj->view_ang.x=object_player_look_constrain(obj,weap,(obj->view_ang.x+look_add)); }
void view_draw(int tick) { obj_type *obj,*camera_obj; weapon_type *weap; // get player object and held weapon obj=object_find_uid(server.player_obj_uid); weap=weapon_find_current(obj); // camera render view.render=&view_camera_render; // set view camera camera_obj=object_find_uid(camera.obj_uid); camera_get_position(&view.render->camera.pnt,&view.render->camera.ang); view.render->camera.fov=camera.plane.fov; view.render->camera.flip=FALSE; view.render->camera.under_liquid_idx=camera_check_liquid(&view.render->camera.pnt); view.render->no_shadow=FALSE; view.render->force_camera_obj=FALSE; // camera adjustments if (camera.mode==cv_fpp) { view_calculate_scope(tick,obj,camera_obj); view_calculate_recoil(obj); } view_calculate_shakes(tick,obj); view_calculate_sways(tick,obj); view_calculate_bump(obj); // build the scene view_draw_scene_build(tick); // do any back frame rendering gl_back_render_frame_start(tick); // render the scene view_draw_scene_render(tick,obj,weap); // draw tints and fades view_draw_liquid_tint(view.render->camera.under_liquid_idx); view_draw_effect_tint(tick,obj); fade_screen_draw(tick); fade_object_draw(tick,obj); }
void object_player_turn(obj_type *obj) { float turn_add,turn_restrict; weapon_type *weap; // can it turn? if ((obj->turn.only_when_moving) && (!obj->forward_move.moving)) { obj->turn.ang_add.y=0; return; } // get turn speed obj->turn.fix_ang_add.y=0; turn_add=obj->turn.ang_add.y; if (turn_add==0) return; // zoom factors if (camera.mode==cv_fpp) { weap=weapon_find_current(obj); if (weap!=NULL) { if ((weap->zoom.on) && (weap->zoom.mode!=zoom_mode_off)) { if (obj->duck.mode!=dm_duck) { turn_add*=weap->zoom.turn_factor; } else { turn_add*=weap->zoom.crawl_turn_factor; } } } } // restriction if (obj->turn.restrict_player_turning) { turn_restrict=object_get_turn_speed(obj); if (turn_add<-turn_restrict) turn_add=-turn_restrict; if (turn_add>turn_restrict) turn_add=turn_restrict; } // turning obj->ang.y=angle_add(obj->ang.y,turn_add); obj->turn.fix_ang_add.y=turn_add; // turn any standing objects object_rotate_with_standing_object(obj,turn_add); }
JSValueRef js_event_call_held_weapon_func(JSContextRef cx,JSObjectRef func,JSObjectRef j_obj,size_t argc,const JSValueRef argv[],JSValueRef *exception) { int n,arg_count,script_idx; char func_name[64],err_str[256]; JSValueRef rval,args[20]; obj_type *obj; weapon_type *weap; script_type *script; if (!script_check_param_at_least_count(cx,func,argc,1,exception)) return(script_null_to_value(cx)); if (!script_check_fail_in_construct(cx,func,j_obj,exception)) return(script_null_to_value(cx)); // find held weapon script_idx=(int)JSObjectGetPrivate(j_obj); script=js.script_list.scripts[script_idx]; if (script->attach.thing_type!=thing_type_object) { *exception=script_create_exception(cx,"Not an object script"); return(script_null_to_value(cx)); } obj=object_get_attach(j_obj); weap=weapon_find_current(obj); if (weap==NULL) { *exception=script_create_exception(cx,"No held weapon"); return(script_null_to_value(cx)); } // get arguments script_value_to_string(cx,argv[0],func_name,64); arg_count=argc-1; if (arg_count<0) arg_count=0; if (arg_count>20) arg_count=20; for (n=0;n!=arg_count;n++) { args[n]=argv[n+1]; } // call function rval=scripts_direct_call(script_get_index(j_obj),weap->script_idx,-1,func_name,arg_count,args,err_str); if (rval==NULL) { *exception=script_create_exception(cx,err_str); return(script_null_to_value(cx)); } return(rval); }
JSBool js_event_send_message_to_held_weapon_func(JSContext *cx,JSObject *j_obj,uintN argc,jsval *argv,jsval *rval) { obj_type *obj; weapon_type *weap; if (js.attach.thing_type!=thing_type_object) { JS_ReportError(js.cx,"Not an object script"); return(JS_FALSE); } obj=object_find_uid(js.attach.thing_uid); weap=weapon_find_current(obj); if (weap==NULL) { JS_ReportError(js.cx,"No held weapon"); return(JS_FALSE); } memmove(weap->attach.get_msg_data,js.attach.set_msg_data,(sizeof(attach_msg_type)*max_msg_data)); scripts_post_event_console(&weap->attach,sd_event_message,sd_event_message_from_script,JSVAL_TO_INT(argv[0])); return(JS_TRUE); }
void run_objects_no_slice(int tick) { int n; obj_type *obj; weapon_type *weap; obj=server.objs; for (n=0;n!=server.count.obj;n++) { if (!obj->hidden) { model_draw_setup_object(tick,obj); model_run_animation(&obj->draw); if (!obj->scenery.on) { // fades model_fade_run(tick,&obj->draw); model_mesh_fade_run(tick,&obj->draw); // held weapons if (obj->player) { weap=weapon_find_current(obj); if (weap!=NULL) { model_draw_setup_weapon(tick,obj,weap,FALSE,FALSE); weapon_run_hand(obj,tick); } } } } obj++; } }
void camera_chase_get_position(d3pnt *pnt,d3ang *ang) { int n,xadd,yadd,zadd,radius,div, cx,cz,cy; float fang,fx,fy,fz; d3pnt spt,ept,hpt; ray_trace_contact_type contact; matrix_type mat; obj_type *obj; weapon_type *weap; obj=object_find_uid(camera.obj_uid); // get maximum camera offset fx=0; fy=0; fz=(float)camera.chase_distance; fang=angle_add(camera.cur_chase_ang.x,-obj->view_ang.x); matrix_rotate_zyx(&mat,fang,camera.cur_chase_ang.y,camera.cur_chase_ang.z); matrix_vertex_multiply(&mat,&fx,&fy,&fz); cx=(int)fx+obj->pnt.x; cy=(int)fy+obj->pnt.y; cz=(int)fz+obj->pnt.z; // get camera movement div=camera_chase_get_division(abs(cx-obj->pnt.x),abs(cz-obj->pnt.z),abs(cy-obj->pnt.y)); if (div==0) div=1; xadd=(cx-obj->pnt.x)/div; yadd=(cy-obj->pnt.y)/div; zadd=(cz-obj->pnt.z)/div; // get camera starting position radius=camera.chase_size; fx=0; fy=0; fz=(float)(radius>>2); // always move camera back to protect against hitting walls in front of player fang=angle_add(camera.cur_chase_ang.x,(obj->view_ang.x*2)); matrix_rotate_zyx(&mat,fang,camera.cur_chase_ang.y,camera.cur_chase_ang.z); matrix_vertex_multiply(&mat,&fx,&fy,&fz); cx=(int)fx+obj->pnt.x; cz=(int)fz+obj->pnt.z; cy=(int)fy+(obj->pnt.y-obj->size.y); // setup contacts contact.obj.on=TRUE; contact.obj.ignore_uid=obj->uid; contact.proj.on=FALSE; contact.origin=poly_ray_trace_origin_unknown; // move camera for (n=0;n!=div;n++) { // xz movement spt.x=cx; spt.y=cy; spt.z=cz; ept.x=cx+xadd; ept.y=cy; ept.z=cz+zadd; contact.hit_mode=poly_ray_trace_hit_mode_wall_only; if (!ray_trace_map_by_point(&spt,&ept,&hpt,&contact)) { cx+=xadd; cz+=zadd; } // y movement spt.x=cx; spt.y=cy; spt.z=cz; ept.x=cx; ept.y=cy+yadd; ept.z=cz; contact.hit_mode=poly_ray_trace_hit_mode_floor_only; if (!ray_trace_map_by_point(&spt,&ept,&hpt,&contact)) cy+=yadd; } // new camera position camera.pnt.x=cx; camera.pnt.y=cy; camera.pnt.z=cz; // return values memmove(pnt,&camera.pnt,sizeof(d3pnt)); // looking angles ang->x=(camera.cur_chase_ang.x+camera.ang.x)-obj->view_ang.x; weap=weapon_find_current(obj); if (weap!=NULL) ang->x=object_player_look_constrain(obj,weap,ang->x); ang->y=angle_add(camera.cur_chase_ang.y,camera.ang.y); ang->z=camera.ang.z; }
void view_draw_dim3rtl(void) { obj_type *obj,*camera_obj; weapon_type *weap; // get player object and held weapon obj=server.obj_list.objs[server.player_obj_idx]; weap=weapon_find_current(obj); // use the camera render view.render=&view_camera_render; // set view camera camera_view_draw_run(); camera_obj=server.obj_list.objs[camera.obj_idx]; memmove(&view.render->camera.pnt,&camera.cur_pos.pnt,sizeof(d3pnt)); memmove(&view.render->camera.ang,&camera.cur_pos.ang,sizeof(d3ang)); view.render->camera.fov=map.camera.plane.fov; view.render->camera.flip=FALSE; view.render->camera.under_liquid_idx=camera_check_liquid(obj,&view.render->camera.pnt); view.render->cull_idx=0; view.render->force_camera_obj=FALSE; // camera adjustments if (map.camera.camera_mode==cv_fpp) { view_calculate_scope(obj,camera_obj); view_calculate_recoil(obj); } view_calculate_shakes(obj); view_calculate_sways(obj); // build the scene view_draw_dim3rtl_scene_build(); // we setup the 2D elements before // rendering because we get the last // frame so we want to use the last // frames eye point label_draw_setup(); halo_draw_setup(); if ((obj!=NULL) && (weap!=NULL)) { crosshair_setup(obj,weap); zoom_setup(obj,weap); } // dim3rtl rendering view_dim3rtl_render(); // draw 2D opengl elements gl_2D_view_screen(); label_draw_render(); halo_draw_render(); if (!view.cinema.on) { if ((obj!=NULL) && (weap!=NULL)) { crosshair_draw(obj,weap); zoom_draw(obj,weap); } } // draw tints and fades view_draw_liquid_tint(view.render->camera.under_liquid_idx); view_draw_effect_tint(); view_fade_draw(); }
int object_start(spot_type *spot,char *name,int type,int bind,char *err_str) { int idx; obj_type *obj; weapon_type *weap; // create object idx=object_create(name,type,bind); if (idx==-1) { strcpy(err_str,"Out of memory"); return(-1); } obj=server.obj_list.objs[idx]; // player default setup if (obj->type==object_type_player) { obj->team_idx=net_team_none; obj->spawn_spot.name[0]=0x0; obj->hidden=FALSE; obj->tint_color_idx=setup.network.tint_color_idx; obj->character_idx=setup.network.character_idx; server.player_obj_idx=obj->idx; } // regular object setup else { // if there's an editor display model, then // default model to it if (spot->display_model[0]!=0x0) { obj->draw.on=TRUE; strcpy(obj->draw.name,spot->display_model); } // attach object to spot object_set_position(obj,spot->pnt.x,spot->pnt.y,spot->pnt.z,spot->ang.y,0); obj->turn.ang_to.y=spot->ang.y; } // parameters obj->spawn_spot.script[0]=0x0; obj->spawn_spot.params[0]=0x0; if (spot!=NULL) { strcpy(obj->spawn_spot.script,spot->script); strcpy(obj->spawn_spot.params,spot->params); } // if networked player or multiplayer bot, run rules // to pick the team if (net_setup.mode!=net_mode_none) { if ((obj->type==object_type_player) || (obj->type==object_type_bot_multiplayer)) object_multiplayer_setup(obj); } // start script if (!object_start_script(obj,FALSE,err_str)) { server.obj_list.objs[idx]=NULL; free(obj); return(-1); } // load object model if (!model_draw_load(&obj->draw,"Object",obj->name,FALSE,err_str)) { server.obj_list.objs[idx]=NULL; free(obj); return(-1); } // setup held weapon if (obj->held_weapon.current_idx!=-1) { weap=weapon_find_current(obj); weapon_set(obj,weap); } return(obj->idx); }