Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit BulletProjectiveLine;
- const
- //Increase to see the long trajectories. Decrease to reduce the range to indicate the trajectory.
- //The higher the need for greater power cpu.
- Range = 255;
- //Dont Edit
- Gravity = 0.06;
- g_ = 0.135;
- k_ = 0.01;
- ik_ = 1.0 - k_;
- type
- tTVector = record
- x, y, vx, vy: single;
- t: word;
- end;
- var
- WeaponSpeed: array [0..16] of single;
- Vec: tTVector;
- CheckPlayerID: byte;
- function BallisticAim(x1, y1, x2, y2, v, gravity: single): single; external 'ballistic_aim@aim.dll';
- function atan(Value: Double): Double;
- var
- HelpValue, Score: Double;
- begin
- HelpValue := 10;
- Value := StrToFloat(FormatFloat('0.####', Value));
- if (Value < -90) then begin
- Score := -pi/2;
- Result := Score;
- exit;
- end;
- if (Value > 90) then begin
- Score := pi/2;
- Result := Score;
- exit;
- end;
- if (Value > -90) AND (Value < 0) then begin
- HelpValue := Value;
- Value := -Value;
- end;
- case Value of
- 0..0.0174: Score := 0;
- 0.0175..0.0348: Score := 0.0174982138698566;
- 0.0349..0.0523: Score := 0.0348858408298337;
- 0.0524..0.0698: Score := 0.0523521195814978;
- 0.0699..0.0874: Score := 0.0697864885524836;
- 0.0875..0.1050: Score := 0.0872777129494614;
- 0.1051..0.1227: Score := 0.104715566127497;
- 0.1228..0.1404: Score := 0.12218825740471;
- 0.1405..0.1583: Score := 0.139586296165376;
- 0.1584..0.1583: Score := 0.157094811546099;
- 0.1763..0.1943: Score := 0.174506757938147;
- 0.1944..0.2125: Score := 0.192005191605331;
- 0.2126..0.2308: Score := 0.209481070481662;
- 0.2309..0.2492: Score := 0.226923001799405;
- 0.2493..0.2678: Score := 0.244319731162834;
- 0.2679..0.2866: Score := 0.261753490071652;
- 0.2867..0.3056: Score := 0.279210742282217;
- 0.3057..0.3248: Score := 0.296677913828006;
- 0.3249..0.3248: Score := 0.314141449845828;
- 0.3443..0.3639: Score := 0.331587871239654;
- 0.3640..0.3838: Score := 0.349092133951802;
- 0.3839..0.4039: Score := 0.366550488612585;
- 0.4040..0.4244: Score := 0.383949889672296;
- 0.4245..0.4451: Score := 0.401447066726006;
- 0.4452..0.4662: Score := 0.41885508046026;
- 0.4663..0.4876: Score := 0.436326022619059;
- 0.4877..0.5094: Score := 0.4537592791353;
- 0.5095..0.5316: Score := 0.471218693664511;
- 0.5317..0.5542: Score := 0.488684837639843;
- 0.5543..0.5773: Score := 0.506138559055801;
- 0.5774..0.6008: Score := 0.523636072902899;
- 0.6009..0.6248: Score := 0.541081002224753;
- 0.6249..0.6493: Score := 0.558527401999266;
- 0.6494..0.6744: Score := 0.575953312325017;
- 0.6745..0.7001: Score := 0.593406092001082;
- 0.7002..0.7264: Score := 0.610860179965463;
- 0.7265..0.7535: Score := 0.628290695214164;
- 0.7536..0.7812: Score := 0.645801130293335;
- 0.7813..0.8097: Score := 0.663234041073618;
- 0.8098..0.8390: Score := 0.680688051447693;
- 0.8391..0.8692: Score := 0.698131917231749;
- 0.8693..0.9003: Score := 0.715592547229579;
- 0.9004..0.9324: Score := 0.733036052312088;
- 0.9325..0.9656: Score := 0.750483509050129;
- 0.9657..0.9999: Score := 0.767950679318179;
- 1..1.0354: Score := 0.785398163397448;
- 1.0355..1.0723: Score := 0.802836827768543;
- 1.0724..1.1105: Score := 0.820319301858688;
- 1.1106..1.1503: Score := 0.837752437585743;
- 1.1504..1.1917: Score := 0.855224931221501;
- 1.1918..1.2348: Score := 0.872683799981186;
- 1.2349..1.2798: Score := 0.890119044653214;
- 1.2799..1.3296: Score := 0.907555430491315;
- 1.3270..1.3763: Score := 0.925008269653536;
- 1.3764..1.4280: Score := 0.942484042346821;
- 1.4281..1.4825: Score := 0.959915294505986;
- 1.4826..1.5398: Score := 0.977396585913373;
- 1.5399..1.6002: Score := 0.994848066312935;
- 1.6003..1.6642: Score := 1.01228126975339;
- 1.6643..1.7320: Score := 1.02974970122561;
- 1.7321..1.8039: Score := 1.04720984904242;
- 1.8040..1.8806: Score := 1.06463961907269;
- 1.8807..1.9625: Score := 1.08209830311626;
- 1.9626..2.0502: Score := 1.09955526348515;
- 2.0503..2.1444: Score := 1.11700998304179;
- 2.1445..2.2459: Score := 1.13446277774716;
- 2.2460..2.3558: Score := 1.15191122255343;
- 2.3559..2.4750: Score := 1.16937787106011;
- 2.4751..2.6050: Score := 1.18682573620912;
- 2.6051..2.7474: Score := 1.20427858826594;
- 2.7475..2.9041: Score := 1.2217331177989;
- 2.9042..3.0776: Score := 1.23918261593696;
- 3.0777..3.2708: Score := 1.25663863348819;
- 3.2709..3.4873: Score := 1.27409440413169;
- 3.4874..3.7320: Score := 1.29154254908704;
- 3.7321..4.0107: Score := 1.30900023422327;
- 4.0108..4.3314: Score := 1.32645134739846;
- 4.3315..4.7045: Score := 1.34390474486222;
- 4.7046..5.1445: Score := 1.36135551499702;
- 5.1446..5.6712: Score := 1.378811783251;
- 5.6713..6.3137: Score := 1.39626394979936;
- 6.3138..7.1153: Score := 1.41371788062687;
- 7.1154..8.1442: Score := 1.43117057308465;
- 8.1443..9.5143: Score := 1.44862258959679;
- 9.5144..11.4300: Score := 1.46607696005406;
- 11.4301..14.3006: Score := 1.48353022650779;
- 14.3007..19.0810: Score := 1.50098332090842;
- 19.0811..28.6362: Score := 1.51843634874527;
- 28.6363..57.2899: Score := 1.53588979865515;
- 57.290..90: Score := 1.5533430459617;
- end;
- if HelpValue < 0 then Score := -Score;
- Result := Score;
- end;
- function arctan2(X, Y: single): single;
- begin
- if X < 0 then Result := atan(Y/X) + Pi else
- if X > 0 then Result := atan(Y/X) else
- if Y > 0 then Result := 2.3562 else
- Result := -0.7854;
- end;
- function GetWeaponName(Weapon: Byte): String;
- begin
- case (Weapon) of
- 0: Result := 'USSOCOM';
- 1: Result := 'Desert Eagles';
- 2: Result := 'HK MP5';
- 3: Result := 'Ak-74';
- 4: Result := 'Steyr AUG';
- 5: Result := 'Spas-12';
- 6: Result := 'Ruger 77';
- 7: Result := 'M79';
- 8: Result := 'Barret M82A1';
- 9: Result := 'FN Minimi';
- 10: Result := 'XM214 Minigun';
- 11: Result:= 'Combat Knife';
- 12: Result:= 'Chainsaw';
- 13: Result:= 'M72 LAW';
- 14: Result:= 'Flamer';
- 15: Result:= 'Rambo Bow';
- 16: Result:= 'Flamed Arrows';
- else Result := '';
- end;
- end;
- procedure CastAndDraw(x, y, g: single; var vec: tTVector; CheckPlayerOnly, CheckBulletOnly: boolean);
- var x2, y2: single;
- begin
- while vec.t > 0 do begin
- vec.t := vec.t - 1;
- x2 := x;
- x := x + vec.vx;
- vec.vx := vec.vx * ik_;
- vec.vy := vec.vy + g;
- y2 := y;
- y := y + vec.vy;
- vec.vy := vec.vy * ik_;
- if Map.RayCast(x, y, x2, y2, CheckPlayerOnly, false, CheckBulletOnly, CheckBulletOnly, 0) then begin
- vec.X := x2;
- vec.Y := y2;
- Players.WorldText(vec.t, '.', 60, $33CC00, 0.09, x2-2.5, y2-12.3);
- exit;
- end else
- begin
- Players.WorldText(vec.t, '.',60, $FF0000, 0.08, x2-2.5, y2-12.3);
- end;
- end;
- vec.X := x2;
- vec.Y := y2;
- end;
- procedure DrawBulletProjectiveLines(Player: TActivePlayer);
- var Speed, Angle: single;
- begin
- if (Player.Primary.WType<>255) then begin
- Speed := iif(Player.Primary.WType<>11, WeaponSpeed[Player.Primary.WType],8.95);
- Angle := arctan2(-Player.X + single(Player.MouseAimX), -Player.Y+5.9 + single(Player.MouseAimY));
- Vec.vx := (cos(angle)*Speed);
- Vec.vy := (sin(angle)*Speed);
- Vec.T := Range;
- CastAndDraw(Player.X, Player.Y-12, g_*Gravity/Gravity, vec, true, true);
- end;
- end;
- procedure Check(Ticks: integer);
- begin
- if (CheckPlayerID<>255) then if (Players[CheckPlayerID].Active) and (Players[CheckPlayerID].Alive) then begin
- DrawBulletProjectiveLines(Players[CheckPlayerID]);
- Players.WorldText(255+CheckPlayerID, '+', 60, $DCB2010, 0.10, single(Players[CheckPlayerID].MouseAimX)-6.3, single(Players[CheckPlayerID].MouseAimY)-11.1);
- end;
- end;
- procedure ReadWeaponsSpeed();
- var i: byte; WeaponINI: TIniFile;
- begin
- if (Game.Realistic) then WeaponINI := File.CreateINI('weapons.ini') else WeaponINI := File.CreateINI('weapons_realistic.ini');
- for i := 0 to 16 do WeaponSpeed[i] := (WeaponINI.ReadInteger(GetWeaponName(i), 'Speed', 0)/10);
- end;
- function Commands(Player: TActivePlayer; Text: string): Boolean;
- var i: integer;
- begin
- if (Player.IsAdmin) then begin
- if (Copy(Text,1,12) = '/trajectory ') then begin
- i := StrToInt(Copy(Text,12,length(Text)));
- if (CheckPlayerID=i) then CheckPlayerID:=255 else if (i<33) and (i>0) then CheckPlayerID:=i;
- end;
- end;
- Result:=false;
- end;
- var Decl:byte;
- begin
- CheckPlayerID:=255;
- ReadWeaponsSpeed();
- Game.TickThreshold := 1;
- Game.OnClockTick := @Check;
- for Decl := 1 to 32 do Players[Decl].OnCommand := @Commands;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement