diff --git a/packages/misc/damageindicator.png b/packages/misc/damageindicator.png new file mode 100644 index 00000000..8500de8b Binary files /dev/null and b/packages/misc/damageindicator.png differ diff --git a/source/src/clientgame.cpp b/source/src/clientgame.cpp index 21eca2f5..6f27529a 100644 --- a/source/src/clientgame.cpp +++ b/source/src/clientgame.cpp @@ -378,7 +378,8 @@ void dodamage(int damage, playerent *pl, playerent *actor, bool gib, bool local) if(pl==player1) { - damageblend(damage); + //damageblend(damage); + updatedmgindicator(actor->o); pl->damageroll(damage); } else damageeffect(damage, pl); diff --git a/source/src/menus.cpp b/source/src/menus.cpp index bdcb1207..ec9dbc73 100644 --- a/source/src/menus.cpp +++ b/source/src/menus.cpp @@ -586,9 +586,11 @@ void rendermenumdl() gmenu &m = *curmenu; if(!m.mdl) return; - glPushMatrix (); - + extern int scr_w, scr_h; + + glPushMatrix(); glLoadIdentity(); + glTranslatef(0, 1.5f, -1.0f); glRotatef(90+180, 0, -1, 0); glRotatef(90, -1, 0, 0); glScalef(1, -1, 1); @@ -598,7 +600,7 @@ void rendermenumdl() vec pos; if(isplayermodel) pos = vec(2.0f, 1.2f, -0.4f); else pos = vec(2.0f, 0, 1.7f); - + float yaw = 1.0f; if(m.rotspeed) yaw += lastmillis/5.0f/100.0f*m.rotspeed; diff --git a/source/src/protos.h b/source/src/protos.h index 0a0ad708..89e2e52a 100644 --- a/source/src/protos.h +++ b/source/src/protos.h @@ -124,7 +124,6 @@ struct gmenu void render(); void renderbg(int x1, int y1, int x2, int y2, bool border); - void rendermenumdl(); void refresh(); void open(); void close(); @@ -370,6 +369,7 @@ extern void damageblend(int n); extern void loadingscreen(const char *fmt = NULL, ...); extern void hudoutf(const char *s, ...); extern void show_out_of_renderloop_progress(float bar1, const char *text1, float bar2 = 0, const char *text2 = NULL); +extern void updatedmgindicator(vec &attack); // renderparticles extern void particleinit(); diff --git a/source/src/renderhud.cpp b/source/src/renderhud.cpp index f9cf8cf6..2c7a015b 100644 --- a/source/src/renderhud.cpp +++ b/source/src/renderhud.cpp @@ -121,6 +121,55 @@ void drawcrosshair(bool showteamwarning) glEnd(); } +VARP(damageindicatorsize, 0, 200, 10000); +VARP(damageindicatordist, 0, 300, 10000); +VARP(damageindicatortime, 1, 1000, 10000); +int damagedirections[4] = {0}; + +void updatedmgindicator(vec &attack) +{ + if(!damageindicatorsize) return; + float bestdist = 0.0f; + int bestdir = -1; + loopi(4) + { + vec d; + d.x = (float)(cosf(RAD*(player1->yaw-90+(i*90)))); + d.y = (float)(sinf(RAD*(player1->yaw-90+(i*90)))); + d.z = 0.0f; + d.add(player1->o); + float dist = d.dist(attack); + if(dist < bestdist || bestdir==-1) + { + bestdist = dist; + bestdir = i; + } + } + damagedirections[bestdir] = lastmillis+damageindicatortime; +} + +void drawdmgindicator() +{ + if(!damageindicatorsize) return; + glBlendFunc(GL_ONE, GL_ONE); + static Texture *tex = NULL; + if(!tex) tex = textureload("packages/misc/damageindicator.png"); + float size = (float)damageindicatorsize; + loopi(4) + { + if(!damagedirections[i] || damagedirections[i] < lastmillis) continue; + float t = damageindicatorsize/(float)(damagedirections[i]-lastmillis); + glPushMatrix(); + glColor3ub(150, 0, 0); + glTranslatef(VIRTW/2, VIRTH/2, 0); + glRotatef(i*90, 0, 0, 1); + glTranslatef(0, (float)-damageindicatordist, 0); + glScalef(max(0.0f, 1.0f-t), max(0.0f, 1.0f-t), 0); + quad(tex->id, -size/2.0f, -size/2.0f, size, 0, 0, 1.0f, 1.0f); + glPopMatrix(); + } +} + void drawequipicons() { glDisable(GL_BLEND); @@ -339,6 +388,8 @@ void gl_drawhud(int w, int h, int curfps, int nquads, int curvert, bool underwat else if((player1->weaponsel->type!=GUN_SNIPER || drawteamwarning)) drawcrosshair(drawteamwarning); } + drawdmgindicator(); + if(player1->state==CS_ALIVE) drawequipicons(); glMatrixMode(GL_MODELVIEW); diff --git a/source/src/weapon.cpp b/source/src/weapon.cpp index bfb9adbd..520de196 100644 --- a/source/src/weapon.cpp +++ b/source/src/weapon.cpp @@ -254,7 +254,8 @@ void hit(int damage, playerent *d, playerent *at, const vec &vel, int gun, bool { h.dir = ivec(0, 0, 0); d->damageroll(damage); - damageblend(damage); + //damageblend(damage); + updatedmgindicator(at->o); playsound(S_PAIN6); } else