cover
git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@5052 e016b1c5-ed68-44aa-a2f7-31cac88cffde
This commit is contained in:
+1
-1
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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,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
@@ -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 {
|
||||
|
||||
@@ -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; };
|
||||
|
||||
|
||||
Reference in New Issue
Block a user