Exemple #1
0
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));
}
Exemple #2
0
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);
}