From db0e2c2ff39c4cb6165108def551476fa9376b1c Mon Sep 17 00:00:00 2001 From: Rafael Barreto Date: Tue, 25 May 2010 21:26:13 +0000 Subject: [PATCH] cover git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@5052 e016b1c5-ed68-44aa-a2f7-31cac88cffde --- source/src/Makefile | 2 +- source/src/clients2c.cpp | 4 +- source/src/server.cpp | 14 +++-- source/src/serveractions.h | 23 +++++++- source/src/serverchecks.h | 114 ++++++++++++++++++------------------- source/src/world.h | 1 + 6 files changed, 92 insertions(+), 66 deletions(-) diff --git a/source/src/Makefile b/source/src/Makefile index 4789bd4c..166c8503 100644 --- a/source/src/Makefile +++ b/source/src/Makefile @@ -269,7 +269,7 @@ scoreboard.o: protos.h server.o: cube.h platform.h tools.h geom.h model.h protocol.h sound.h server.o: weapon.h entity.h world.h i18n.h command.h vote.h console.h server.o: protos.h server.h servercontroller.h serverfiles.h serverevents.h -server.o: serveractions.h +server.o: serveractions.h serverchecks.h serverbrowser.o: cube.h platform.h tools.h geom.h model.h protocol.h sound.h serverbrowser.o: weapon.h entity.h world.h i18n.h command.h vote.h console.h serverbrowser.o: protos.h diff --git a/source/src/clients2c.cpp b/source/src/clients2c.cpp index 4cd2db9c..0e4f25a5 100644 --- a/source/src/clients2c.cpp +++ b/source/src/clients2c.cpp @@ -234,7 +234,9 @@ void showhudextras(char hudextras, char value){ case 0: outf("\f2COMBO"); break; case 1: - outf("\f2COVER"); break; + outf("\f2FLAG DEFENDED"); break; + case 2: + outf("\f2FLAG COVERED"); break; default: outf("\f2new message"); break; } diff --git a/source/src/server.cpp b/source/src/server.cpp index cfebaa58..365f1913 100644 --- a/source/src/server.cpp +++ b/source/src/server.cpp @@ -1307,13 +1307,15 @@ void serverdamage(client *target, client *actor, int damage, int gun, bool gib, ts.dodamage(damage); actor->state.damage += damage != 1000 ? damage : 0; sendf(-1, 1, "ri6", gib ? SV_GIBDAMAGE : SV_DAMAGE, target->clientnum, actor->clientnum, damage, ts.armour, ts.health); - if(target!=actor && !hitpush.iszero()) - { - vec v(hitpush); - if(!v.iszero()) v.normalize(); - sendf(target->clientnum, 1, "ri6", SV_HITPUSH, gun, damage, - int(v.x*DNF), int(v.y*DNF), int(v.z*DNF)); + if(target!=actor){ checkcombo (target, actor, damage, gun); + if(!hitpush.iszero()) + { + vec v(hitpush); + if(!v.iszero()) v.normalize(); + sendf(target->clientnum, 1, "ri6", SV_HITPUSH, gun, damage, + int(v.x*DNF), int(v.y*DNF), int(v.z*DNF)); + } } if(ts.health<=0) { diff --git a/source/src/serveractions.h b/source/src/serveractions.h index a9431bae..ee39ebbe 100644 --- a/source/src/serveractions.h +++ b/source/src/serveractions.h @@ -22,6 +22,27 @@ struct serveraction virtual ~serveraction() { } }; +bool mapisok(mapstats *ms) +{ + /* Check if flags are ok */ + if ( ms->hasflags ) { + struct { short x, y; } fl[2]; + loopi(2) + { + if(ms->flags[i] == 1) + { + short *fe = ms->entposs + ms->flagents[i] * 3; + fl[i].x = *fe; fe++; fl[i].y = *fe; + } + else fl[i].x = fl[i].y = 0; // the map has no valid flags + } + FlagFlag = pow2(fl[0].x - fl[1].x) + pow2(fl[0].y - fl[1].y); + } + else FlagFlag = MINFF * 1000; // the map has no flags + + return Mheight < MAXMHEIGHT && (Mopen = checkarea(maplayout_factor, maplayout)) < MAXMAREA && FlagFlag > MINFF; +} + struct mapaction : serveraction { char *map; @@ -49,7 +70,7 @@ struct mapaction : serveraction bool notify = valid_client(caller); int maploc = MAP_NOTFOUND; mapstats *ms = map[0] ? getservermapstats(map, true, &maploc) : NULL; // this is very redundant, since startgame gets the layout - mapok = mode == GMODE_COOPEDIT || ( ms != NULL && Mheight < MAXMHEIGHT && (Mopen = checkarea(maplayout_factor, maplayout)) < MAXMAREA ); + mapok = mode == GMODE_COOPEDIT || ( ms != NULL && mapisok(ms) ); if(!mapok) { if(notify) sendservmsg("the server does not have/support this map", caller); diff --git a/source/src/serverchecks.h b/source/src/serverchecks.h index ab3a530e..5730f50a 100644 --- a/source/src/serverchecks.h +++ b/source/src/serverchecks.h @@ -1,3 +1,9 @@ +float pow2(float x) +{ + return x*x; +} + +#define POW2XY(A,B) pow2(A.x-B.x)+pow2(A.y-B.y) #define MINELINE 50 @@ -135,66 +141,61 @@ void checkcombo (client *target, client *actor, int damage, int gun) actor->lastgun = gun; } -/** This function is partially temporary... it needs to be re-made */ -void checkcover (client *target, client *actor) // FIXME +int FlagFlag = MINFF * 1000; +#define COVERDIST 2000 // about 45 cubes + +float a2c = 0, c2t = 0, a2t = 0; // distances: actor to covered, covered to target and actor to target + +inline void testcover(int msg, int factor, client *actor) +{ + if ( a2c < COVERDIST && c2t < COVERDIST && a2t < COVERDIST ) { + sendf(actor->clientnum, 1, "ri2", SV_HUDEXTRAS, msg); + actor->points += factor * clientnumber; + actor->ncovers++; + } +} + +#define CALCCOVER(C) \ + a2c = POW2XY(actor->state.o,C);\ + c2t = POW2XY(C,target->state.o);\ + a2t = POW2XY(actor->state.o,target->state.o) + +/** WIP */ +void checkcover (client *target, client *actor) { int team = actor->team; int oteam = team_opposite(team); - sflaginfo &f = sflaginfos[team]; - sflaginfo &of = sflaginfos[oteam]; - float flagflag = sqrt(float((f.x-of.x)*(f.x-of.x) + (f.y-of.y)*(f.y-of.y))); - if ( flagflag < 50 ) return; - if ( flagflag > 200 ) flagflag = 200; - if (m_ctf) { - float range = flagflag / 4; - if (f.state == CTFF_INBASE) { - float dx = actor->state.o.x-f.x, dy = actor->state.o.y-f.y; - float dist = sqrt (dx*dx+dy*dy); - dx = target->state.o.x-f.x, dy = target->state.o.y-f.y; - dist += sqrt (dx*dx+dy*dy); - if ( dist < range ) { - sendf(actor->clientnum, 1, "ri2", SV_HUDEXTRAS, 1); //FIXME - actor->points += 3 * clientnumber / 2; - actor->ncovers++; + if ( m_flags ) { + sflaginfo &f = sflaginfos[team]; + sflaginfo &of = sflaginfos[oteam]; + + if ( m_ctf ) { + if ( f.state == CTFF_INBASE ) { + CALCCOVER(f); + testcover(1, 1, actor); /* Flag defended */ } - } - if (of.state == CTFF_STOLEN && actor->clientnum != of.actor_cn) { - float dx = actor->state.o.x-clients[of.actor_cn]->state.o.x, dy = actor->state.o.y-clients[of.actor_cn]->state.o.y; - float dist = sqrt (dx*dx+dy*dy); - dx = target->state.o.x-clients[of.actor_cn]->state.o.x, dy = target->state.o.y-clients[of.actor_cn]->state.o.y; - dist += sqrt(dx*dx+dy*dy); - if ( dist < range ) { - sendf(actor->clientnum, 1, "ri2", SV_HUDEXTRAS, 1); //FIXME - actor->points += 5 * clientnumber / 2; - actor->ncovers++; + if ( of.state == CTFF_STOLEN && actor->clientnum != of.actor_cn ) { + CALCCOVER(clients[of.actor_cn]->state.o); + testcover(2, 2, actor); /* Flag covered */ } - } - } else if (m_htf) { - float range = flagflag / 5; - if (f.state == CTFF_DROPPED) { - float dx = target->state.o.x-f.pos[0], dy = target->state.o.y-f.pos[1]; - float dist = sqrt (dx*dx+dy*dy); - if ( dist < range ) { - sendf(actor->clientnum, 1, "ri2", SV_HUDEXTRAS, 1); //FIXME - actor->points += 3 * clientnumber / 2; - actor->ncovers++; + } else if ( m_htf ) { + if ( f.state == CTFF_DROPPED ) { + struct { short x, y; } nf; + nf.x = f.pos[0]; nf.y = f.pos[1]; + CALCCOVER(nf); + testcover(1, 1, actor); /* Flag defended */ } - } - if (f.state == CTFF_STOLEN && actor->clientnum != f.actor_cn) { - float dx = actor->state.o.x-clients[f.actor_cn]->state.o.x, dy = actor->state.o.y-clients[f.actor_cn]->state.o.y; - float dist = sqrt (dx*dx+dy*dy); - dx = target->state.o.x-clients[f.actor_cn]->state.o.x, dy = target->state.o.y-clients[f.actor_cn]->state.o.y; - dist += sqrt (dx*dx+dy*dy); - if ( dist < range ) { - sendf(actor->clientnum, 1, "ri2", SV_HUDEXTRAS, 1); //FIXME - actor->points += 6 * clientnumber / 2; - actor->ncovers++; + if ( f.state == CTFF_STOLEN && actor->clientnum != f.actor_cn ) { + CALCCOVER(clients[f.actor_cn]->state.o); + testcover(2, 3, actor); /* Flag covered */ } } } } +#undef CALCCOVER + /** This function is completely temporary, and it is meanless for now */ void checkfrag (client *target, client *actor, int gun, bool gib) { @@ -207,6 +208,14 @@ void checkfrag (client *target, client *actor, int gun, bool gib) if (m_teammode) { if(!m_flags) actor->points += 5 * target->points / 100; else actor->points += 4 * target->points / 100; + + checkcover (target, actor); + if ( m_htf && actorhasflag >= 0 ) actor->points += clientnumber; + + if ( targethasflag >= 0 ) { + actor->points += 3 * clientnumber; + if ( m_htf ) target->points -= clientnumber; + } } else actor->points += 3 * target->points / 100; @@ -220,15 +229,6 @@ void checkfrag (client *target, client *actor, int gun, bool gib) } else actor->points += 10; - if ( targethasflag >= 0 ) { - actor->points += 3 * clientnumber; - if ( m_htf ) target->points -= clientnumber; - } - - if ( m_htf && actorhasflag >= 0 ) actor->points += clientnumber; - - if ( m_flags ) checkcover (target, actor); - if ( actor->combo ) sendf(actor->clientnum, 1, "ri2", SV_HUDEXTRAS, 0); } else { diff --git a/source/src/world.h b/source/src/world.h index 97a4202c..b89ce225 100644 --- a/source/src/world.h +++ b/source/src/world.h @@ -127,6 +127,7 @@ struct mapstats #define OUTBORDRAD(x,y,rad) (int(x-rad)=ssize-MINBORD || (y+rad)>=ssize-MINBORD) #define MAXMHEIGHT 30 #define MAXMAREA 10000 +#define MINFF 2500 struct block { int x, y, xs, ys; };