/*** 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; }
/** * \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); } }