Use GetLocalRole()==ROLE_AutonomousProxy instead of GetRemoteRole()==ROLE_Authority
to restrict the ClientAim/ShootRepCSA RPC path to the owning client only.
Observers (SimulatedProxy) early-out instead of attempting to send Server RPCs
on weapons they don't own, which was spamming "No owning connection" warnings
and doing useless work. Default ClientAimUpdateFrequency raised to 60 Hz.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
P0 - Division by zero fixes:
- Clamp PhysMaterial->Density to min 0.001 before division
- Clamp MuzzleVelocity averages to min 1.0 in all divisions
- Clamp PhysMaterial->Restitution to [0, 1]
P1 - Edge case guards:
- Stop bullet immediately when velocity is near-zero (prevents NaN)
- Handle near-zero cross product at very shallow grazing angles
- Handle zero-length bounceAngle in ricochet calculation
P2 - Improvements:
- Fix typo: BlockTIme -> BlockTime
- Add incidence angle factor to penetration depth: grazing shots
penetrate less (5% at ~5deg) while head-on shots get full depth
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove ~920 lines of dead code:
- Calibration system (replaced by Python analyze_shots.py)
- IMU shock simulation (no longer needed for testing)
- Debug HUD overlay (values are in CSV logs instead)
- Debug line thickness property (fixed to 0)
- Quadratic regression anti-recoil mode (linear regression sufficient)
- AdaptiveMinSpeed property (optimized to 0, not useful)
- AimStabilization dead zone (smoothing done in Blueprint instead)
Remaining anti-recoil modes: Buffer, LinearExtrapolation,
WeightedLinearRegression, KalmanFilter, AdaptiveExtrapolation
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Update defaults from test-driven optimization:
BufferTime=200ms, DiscardTime=30ms, Sensitivity=3.0,
DeadZone=0.95, MinSpeed=0.0, Damping=5.0
- Add ShotFired column to CSV recording for contamination analysis
- Rewrite Python optimizer with 6-parameter search (sensitivity,
dead zone, min speed, damping, buffer time, discard time)
- Fix velocity weighting order bug in Python simulation
- Add dead zone, min speed threshold, and damping to Python sim
- Add shot contamination analysis (analyze_shots.py) to measure
exact IMU perturbation duration per shot
- Support multi-file optimization with mean/worst_case strategies
- Add jitter and overshoot scoring metrics
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add AdaptiveMinSpeed UPROPERTY (default 30 cm/s) to avoid false deceleration at low speeds
- Update default values: BufferTime=300ms, DiscardTime=40ms, Sensitivity=1.5, Damping=8.0
- Replace debug spheres with points to not obstruct aiming view
- Add detailed debug logs with [LOW]/[DZ]/[DEC] tags for dead zone diagnosis
- Convert buffer/discard time units to milliseconds
- Set AdaptiveExtrapolation as default AntiRecoil mode
- Fix DLL copy error handling in DinkeyPlugin and ViveVBS build scripts
- Add AimStabilization dead zone with smooth transition (no hard jumps)
- Add AimSmoothingSpeed property for temporal aim smoothing
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace variance-based confidence (caused constant lag) with targeted
deceleration detection: compares recent speed (last 25% of safe window)
to average speed. During steady movement ratio≈1 → zero lag.
Only reduces extrapolation when actual braking is detected.
- AdaptiveSensitivity: now a power exponent (0.1-5.0, default 1.0)
- AdaptiveDeadZone: new parameter (default 0.8) to ignore normal
speed fluctuations and only react to real deceleration
- DebugAntiRecoilHUD: real-time display of ratio, confidence, speeds, errors
- EndPlay: auto-close CSV file when stopping play (no more locked files)
- Python script updated to match new deceleration-based algorithm
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Anti-recoil prediction improvements:
- New ARM_AdaptiveExtrapolation mode: velocity variance-based confidence
with separate pos/aim tracking and low-speed protection
- New ARM_WeightedLinearRegression mode: preserves original simple linear fit
- ARM_WeightedRegression upgraded to quadratic (y=a+bt+ct²) with
linear/quadratic blend and velocity-reversal clamping
- ExtrapolationDamping parameter (all modes): exp decay on extrapolated velocity
- CSV recording (RecordPredictionCSV) for offline parameter tuning
- Python analysis tool (Tools/analyze_antirecoil.py) to find optimal
AdaptiveSensitivity from recorded data
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Only the top-level plugin folder is renamed. Internal module name
and .uplugin file remain unchanged (EasyBallistics).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds detailed tooltips (units, ranges, behavior, examples) to 82 UPROPERTY
across EBBullet.h (42), EBBarrel.h (25), and EBMaterialResponseMap.h (15).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Set Kalman Filter as default mode with tuned parameters:
BufferTime=0.15, DiscardTime=0.03, KalmanProcessNoise=200,
KalmanMeasurementNoise=0.01, RegressionWeightExponent=3.0,
DebugAntiRecoilLineThickness=0.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Save and restore OwnerSafe state during retrace to prevent the bullet
from hitting the owner's actors when replaying a previous trace where
OwnerSafe was true. Also fix debug DrawDebugLine in Trace.cpp to use
proper velocity-based colors instead of hardcoded values.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>