Code:
local trace_walls = bit.bor(CONTENTS_TESTFOGVOLUME, CONTENTS_EMPTY, CONTENTS_MONSTER, CONTENTS_HITBOX);
local NoPenetration = {[MAT_SLOSH] = true};
local PenMod = {[MAT_SAND] = 0.5, [MAT_DIRT] = 0.8, [MAT_METAL] = 1.1, [MAT_TILE] = 0.9, [MAT_WOOD] = 1.2};
local trace_normal = bit.bor(CONTENTS_SOLID, CONTENTS_OPAQUE, CONTENTS_MOVEABLE, CONTENTS_DEBRIS, CONTENTS_MONSTER, CONTENTS_HITBOX, 402653442, CONTENTS_WATER);
local function fasAutowall(wep, startPos)
local traces = {};
local traceResults = {};
local dir = (aimPos - startPos):GetNormalized();
traces[1] = { start = startPos, filter = me, mask = trace_normal, endpos = aimPos, };
traceResults[1] = util.TraceLine(traces[1]);
if(NoPenetration[traceResults[1].MatType]) then return false; end
if(-dir:DotProduct(traceResults[1].HitNormal) <= .26) then return false; end
traces[2] = { start = traceResults[1].HitPos, endpos = traceResults[1].HitPos + dir * wep.PenStr * (PenMod[traceResults[1].MatType] || 1) * wep.PenMod, filter = me, mask = trace_walls, };
traceResults[2] = util.TraceLine(traces[2]);
traces[3] = { start = traceResults[2].HitPos, endpos = traceResults[2].HitPos + dir * .1, filter = me, mask = trace_normal, };
traceResults [3] = util.TraceLine(traces[3]);
traces[4] = { start = traceResults[2].HitPos, endpos = aimPos, filter = me, mask = MASK_SHOT, };
traceResults[4] = util.TraceLine(traces[4]);
if(traceResults[4].Entity != aimTarget) then return false; end
return(!traceResults[3].Hit);
end
local penetrationValues = {
["SniperPenetratedRound"] = 20,
["pistol"] = 9,
["357"] = 12,
["smg1"] = 14,
["ar2"] = 16,
["buckshot"] = 5,
["slam"] = 5,
["AirboatGun"] = 17,
};
local double = {
[MAT_GLASS] = true,
[MAT_PLASTIC] = true,
[MAT_WOOD] = true,
[MAT_FLESH] = true,
[MAT_ALIENFLESH] = true,
};
local function m9kAutowall(wep, tr)
local maxPen = penetrationValues[wep.MaxPenetration] || 14;
local penDir = tr.Normal * (double[tr.Hit] && maxPen * 2 || maxPen);
local trace = { endpos = tr.HitPos, start = tr.HitPos + penDir, mask = MASK_SHOT, filter = me };
trace = util.TraceLine(trace);
if(trace.StartSolid || trace.Fraction >= 1 || tr.Fraction <= 0) then return false; end
local trace = { endpos = aimPos, start = trace.HitPos, mask = MASK_SHOT, filter = me };
return(util.TraceLine(trace).Entity == aimTarget);
end
local function canAutowall()
local wep = me:GetActiveWeapon();
if(!wep || !wep:IsValid()) then return false; end
if(isVisible(aimPos, aimTarget)) then return true; end
if(wep.PenStr) then return fasAutowall(wep, me:EyePos()); end //gay
if(wep.OrigCrossHair) then return m9kAutowall(wep, util.TraceLine({endpos = aimPos, start = me:EyePos(), mask = MASK_SHOT, filter = me,})); end //gay
return false;
end