Exemple #1
0
/***
Repair an entity.
@function Repair
@param target Target entity.
@param rate Repair rate.
@return Success or fail.
*/
static int Game_Repair(lua_State *L) {
	lent_t *lent;
	float rate;

	LUA_DEBUG("BEGIN - game.Repair");

	lent = Lua_GetEntity(L, 1);
	if(lent == NULL || lent->e == NULL) {
		LUA_DEBUG("ERROR - game.Repair - entity NULL");
		lua_pushboolean(L, qfalse);
		return 1;
	}
	
	rate = (float)luaL_checknumber(L, 2);

	G_Repair(lent->e, NULL, rate); // FIXME ... trance ent?

	LUA_DEBUG("END - game.Repair");
	lua_pushboolean(L, qtrue);
	return 1;
}
Exemple #2
0
/**
 * \brief Handles weapon fire of the Hyperspanner.
 *
 * Handles weapon fire of the Hyperspanner.
 * 
 * @param ent the player
 * @param alt_fire was this alt fire mode?
 */
static void WP_FireHyperspanner(gentity_t *ent, qboolean alt_fire) {
	float		modifier;
	gentity_t   *validEnts[MAX_GENTITIES];
	int			count = 0;
	int			i, nearest = -1;
	float		nearestd = 65000;
	vec3_t		dVec, end;
	vec3_t		mins = { -40, -40, 0 }, maxs = { 40, 40, 0 };
	char*		classnames[] = { "func_breakable", "misc_model_breakable" };

	/* find all vlaid entities in range */
	count = G_RadiusListOfTypes(classnames, 2, ent->r.currentOrigin, 512, NULL, validEnts);
	//G_Printf("Found %d possible candidates\n", count);
	if(count) {
		trace_t tr;
		for(i = 0; i < count; i++) {
			// TODO: fix problems with small distance
			if(validEnts[i]->spawnflags & 512) {
				VectorSubtract(ent->r.currentOrigin, validEnts[i]->s.angles2, dVec);
				VectorMA(validEnts[i]->s.angles2, 1024, dVec, end);
				trap_Trace(&tr, validEnts[i]->s.angles2, mins, maxs, end, validEnts[i]->s.number, MASK_SHOT);
			} else {
				VectorSubtract(ent->r.currentOrigin, validEnts[i]->s.origin, dVec);
				VectorMA(validEnts[i]->s.origin, 1024, dVec, end);
				trap_Trace(&tr, validEnts[i]->s.origin, mins, maxs, end, validEnts[i]->s.number, MASK_SHOT);
			}
			//G_Printf("Checking entity: %d\n", i);
			if(tr.entityNum != ent->s.number) {
				continue;
			}
			//G_Printf("Nothing is blocking view ...\n");
			if(validEnts[i]->spawnflags & 512) {
				VectorSubtract(ent->r.currentOrigin, validEnts[i]->s.angles2, dVec);
			} else {
				VectorSubtract(ent->r.currentOrigin, validEnts[i]->s.origin, dVec);
			}
			if(VectorLength(dVec) < nearestd) {
				nearest = validEnts[i]->s.number;
				nearestd = VectorLength(dVec);
				//G_Printf("New nearest Entity is %d with a distance of %d\n", nearest, nearestd);
			}
		}
	} else {
		return;
	}

	if(nearest == -1) {
		return;
	}

	/* determine the repair rate modifier */
	if(rpg_repairModifier.value < 0) {
		modifier = 1;
	} else {
		modifier = rpg_repairModifier.value;
	}

	/* call G_Repair */
	if(alt_fire) {
		G_Repair(ent, &g_entities[nearest], HYPERSPANNER_ALT_RATE * modifier);
	} else {
		G_Repair(ent, &g_entities[nearest], HYPERSPANNER_RATE * modifier);
	}
}