git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@5052 e016b1c5-ed68-44aa-a2f7-31cac88cffde
This commit is contained in:
Rafael Barreto
2010-05-25 21:26:13 +00:00
parent 5d109a6d62
commit db0e2c2ff3
6 changed files with 92 additions and 66 deletions
+1 -1
View File
@@ -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
+3 -1
View File
@@ -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;
}
+8 -6
View File
@@ -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)
{
+22 -1
View File
@@ -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);
+57 -57
View File
@@ -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 {
+1
View File
@@ -127,6 +127,7 @@ struct mapstats
#define OUTBORDRAD(x,y,rad) (int(x-rad)<MINBORD || int(y-rad)<MINBORD || 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; };