JSValueRef js_proj_action_reflect_func(JSContextRef cx,JSObjectRef func,JSObjectRef j_obj,size_t argc,const JSValueRef argv[],JSValueRef *exception) { proj_type *proj; if (!script_check_param_count(cx,func,argc,0,exception)) return(script_null_to_value(cx)); proj=proj_get_attach(j_obj); if (proj==NULL) return(script_null_to_value(cx)); projectile_reflect(proj,FALSE); return(script_null_to_value(cx)); }
bool projectile_hit(int tick,proj_type *proj,bool hit_scan) { int uid; bool auto_hit,wall_hit; obj_type *obj,*hurt_obj; weapon_type *weap; proj_setup_type *proj_setup; // auto-hit? auto_hit=FALSE; if (proj->action.hit_tick!=0) { auto_hit=((proj->start_tick+proj->action.hit_tick)<=tick); } // hits? if (!hit_scan) { // hit scans always hit if ((proj->contact.hit_poly.mesh_idx==-1) && (proj->contact.obj_uid==-1) && (proj->contact.proj_uid==-1) && (!proj->contact.melee) && (!auto_hit)) return(FALSE); } // auto-bounces and reflects if ((!auto_hit) && (!hit_scan) && (proj->contact.hit_poly.mesh_idx!=-1)) { wall_hit=collide_contact_is_wall_hit(&proj->contact.hit_poly); if ((proj->action.reflect) && (wall_hit)) { projectile_reflect(proj,TRUE); return(FALSE); } if ((proj->action.bounce) && (!wall_hit)) { if (!projectile_bounce(proj,proj->action.bounce_min_move,proj->action.bounce_reduce,TRUE)) return(FALSE); } } // call projectile hit scripts_post_event_console(&proj->attach,sd_event_hit,0,0); if (!proj->dispose) return(FALSE); // object damage obj=object_find_uid(proj->obj_uid); weap=weapon_find_uid(proj->weap_uid); proj_setup=proj_setups_find_uid(proj->proj_setup_uid); uid=proj->contact.obj_uid; if (uid!=-1) { // damage object hurt_obj=object_find_uid(uid); object_damage(hurt_obj,obj,weap,proj,NULL,proj_setup->damage); // push object if (proj_setup->push.on) object_push(hurt_obj,&proj->ang,proj_setup->push.force,TRUE); } // decals projectile_decals(proj,proj_setup); return(TRUE); }