Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
hitplot.qc
Go to the documentation of this file.
1#include "hitplot.qh"
2
3#include <common/state.qh>
4#include <common/stats.qh>
7#include <common/wepent.qh>
8#include <server/antilag.qh>
9#include <server/client.qh>
10#include <server/world.qh>
11
12vector W_HitPlotUnnormalizedUntransform(vector screenforward, vector screenright, vector screenup, vector v)
13{
14 vector ret;
15 ret.x = screenright * v;
16 ret.y = screenup * v;
17 ret.z = screenforward * v;
18 return ret;
19}
20
21vector W_HitPlotNormalizedUntransform(vector org, entity targ, vector screenforward, vector screenright, vector screenup, vector v)
22{
23 float i, j, k;
24 vector mi, ma, thisv, myv, ret;
25
26 myv = W_HitPlotUnnormalizedUntransform(screenforward, screenright, screenup, org);
27
28 // x = 0..1 relative to hitbox; y = 0..1 relative to hitbox; z = distance
29
30 mi = ma = targ.origin + 0.5 * (targ.mins + targ.maxs);
31 for(i = 0; i < 2; ++i) for(j = 0; j < 2; ++j) for(k = 0; k < 2; ++k)
32 {
33 thisv = targ.origin;
34 if(i) thisv.x += targ.maxs.x; else thisv.x += targ.mins.x;
35 if(j) thisv.y += targ.maxs.y; else thisv.y += targ.mins.y;
36 if(k) thisv.z += targ.maxs.z; else thisv.z += targ.mins.z;
37 thisv = W_HitPlotUnnormalizedUntransform(screenforward, screenright, screenup, thisv);
38 if(i || j || k)
39 {
40 if(mi.x > thisv.x) mi.x = thisv.x; if(ma.x < thisv.x) ma.x = thisv.x;
41 if(mi.y > thisv.y) mi.y = thisv.y; if(ma.y < thisv.y) ma.y = thisv.y;
42 //if(mi_z > thisv_z) mi_z = thisv_z; if(ma_z < thisv_z) ma_y = thisv_z;
43 }
44 else
45 {
46 // first run
47 mi = ma = thisv;
48 }
49 }
50
51 thisv = W_HitPlotUnnormalizedUntransform(screenforward, screenright, screenup, v);
52 ret.x = (thisv.x - mi.x) / (ma.x - mi.x);
53 ret.y = (thisv.y - mi.y) / (ma.y - mi.y);
54 ret.z = thisv.z - myv.z;
55 return ret;
56}
57
58void W_HitPlotAnalysis(entity player, entity wep, vector screenforward, vector screenright, vector screenup)
59{
60 if(CS(player).hitplotfh >= 0)
61 {
62 float lag = ANTILAG_LATENCY(player);
63 if(lag < 0.001)
64 lag = 0;
65 if(!IS_REAL_CLIENT(player))
66 lag = 0; // only antilag for clients
67
68 vector org = player.origin + player.view_ofs;
69 traceline_antilag_force(player, org, org + screenforward * max_shot_distance, MOVE_NORMAL, player, lag);
71 {
73 antilag_takeback(trace_ent, store, time - lag);
74 vector hitplot = W_HitPlotNormalizedUntransform(org, trace_ent, screenforward, screenright, screenup, trace_endpos);
76 fputs(CS(player).hitplotfh, strcat(ftos(hitplot.x), " ", ftos(hitplot.y), " ", ftos(hitplot.z), " ", ftos(wep.m_id), "\n"));
77 //print(strcat(ftos(hitplot_x), " ", ftos(hitplot_y), " ", ftos(hitplot_z), "\n"));
78 }
79 }
80}
81
83{
85 {
86 CS(player).hitplotfh = fopen(strcat("hits-", matchid, "-", player.netaddress, "-", ftos(player.playerid), ".plot"), FILE_WRITE);
87 fputs(CS(player).hitplotfh, strcat("#name ", playername(player.netname, player.team, false), "\n"));
88 }
89 else { CS(player).hitplotfh = -1; }
90}
91
93{
94 if(CS(player).hitplotfh >= 0)
95 {
96 fclose(CS(player).hitplotfh);
97 CS(player).hitplotfh = -1;
98 }
99}
void antilag_restore(entity e, entity store)
Definition antilag.qc:101
void traceline_antilag_force(entity source, vector v1, vector v2, float nomonst, entity forent, float lag)
Definition antilag.qc:199
void antilag_takeback(entity e, entity store, float t)
Definition antilag.qc:86
#define ANTILAG_LATENCY(e)
Definition antilag.qh:19
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
#define IS_CLIENT(s)
Definition player.qh:242
string playername(string thename, int teamid, bool team_colorize)
Definition util.qc:2082
entity trace_ent
const float MOVE_NORMAL
const float FILE_WRITE
float time
vector trace_endpos
vector W_HitPlotNormalizedUntransform(vector org, entity targ, vector screenforward, vector screenright, vector screenup, vector v)
Definition hitplot.qc:21
vector W_HitPlotUnnormalizedUntransform(vector screenforward, vector screenright, vector screenup, vector v)
Definition hitplot.qc:12
void W_HitPlotAnalysis(entity player, entity wep, vector screenforward, vector screenright, vector screenup)
Definition hitplot.qc:58
void W_HitPlotOpen(entity player)
Definition hitplot.qc:82
void W_HitPlotClose(entity player)
Definition hitplot.qc:92
float hitplotfh
Definition hitplot.qh:6
bool autocvar_g_hitplots
Definition hitplot.qh:3
string autocvar_g_hitplots_individuals
Definition hitplot.qh:4
void fclose(float fhandle)
void fputs(float fhandle, string s)
float fopen(string filename, float mode)
string ftos(float f)
strcat(_("^F4Countdown stopped!"), "\n^BG", _("Teams are too unbalanced."))
vector
Definition self.qh:92
vector org
Definition self.qh:92
ClientState CS(Client this)
Definition state.qh:47
#define strhasword(s, w)
Definition string.qh:370
#define IS_REAL_CLIENT(v)
Definition utils.qh:17
#define IS_MONSTER(v)
Definition utils.qh:21
int max_shot_distance
Definition weapon.qh:203
string matchid
Definition world.qh:63