allow more edit commands in coop edit

The edit protocol now allows the following commands in multiplayer:

  arch, slope, edittag, edittagclip, selectionrotate, selectionflip

also:

  mapenlarge has been limited to size 10 in multiplayer

  entitiy undelete in multiplayer has been fixed

SV_EDITS, SV_EDITD and SV_EDITE are to be cleaned up with a protocol bump

DOCREF arch slope edittag edittagclip selectionrotate selectionflip
This commit is contained in:
ac-stef
2016-09-16 14:06:27 +02:00
parent 815f4aa764
commit 4dc54e22b5
8 changed files with 111 additions and 49 deletions
+63 -28
View File
@@ -689,7 +689,7 @@ void editheight(int *flr, int *amount)
loopv(sels)
{
editheightxy(isfloor, *amount, sels[i]);
addmsg(SV_EDITH, "ri6", sels[i].x, sels[i].y, sels[i].xs, sels[i].ys, isfloor, *amount);
addmsg(SV_EDITXY, "ri7", EDITXY_HEIGHT, sels[i].x, sels[i].y, sels[i].xs, sels[i].ys, isfloor, *amount);
}
}
@@ -765,7 +765,7 @@ void edittex(int *type, int *dir)
loopv(sels)
{
edittexxy(*type, t, sels[i]);
addmsg(SV_EDITT, "ri6", sels[i].x, sels[i].y, sels[i].xs, sels[i].ys, *type, t);
addmsg(SV_EDITXY, "ri7", EDITXY_TEX, sels[i].x, sels[i].y, sels[i].xs, sels[i].ys, *type, t, 0);
}
unsavededits++;
lastedittex = lastmillis;
@@ -791,7 +791,7 @@ void settex(int *texture, int *type)
loopv(sels)
{
edittexxy(*type, t, sels[i]);
addmsg(SV_EDITT, "ri6", sels[i].x, sels[i].y, sels[i].xs, sels[i].ys, *type, t);
addmsg(SV_EDITXY, "ri7", EDITXY_TEX, sels[i].x, sels[i].y, sels[i].xs, sels[i].ys, *type, t, 0);
}
unsavededits++;
}
@@ -833,7 +833,7 @@ void edittype(int type)
else
{
edittypexy(type, sel);
addmsg(SV_EDITS, "ri5", sel.x, sel.y, sel.xs, sel.ys, type);
addmsg(SV_EDITXY, "ri7", EDITXY_TYPE, sel.x, sel.y, sel.xs, sel.ys, type, 0);
}
}
}
@@ -869,7 +869,7 @@ void equalize(int *flr)
{
block &sel = sels[i];
editequalisexy(isfloor, sel);
addmsg(SV_EDITE, "ri5", sel.x, sel.y, sel.xs, sel.ys, isfloor);
addmsg(SV_EDITXY, "ri7", EDITXY_EQUALISE, sel.x, sel.y, sel.xs, sel.ys, isfloor, 0);
}
}
COMMAND(equalize, "i");
@@ -886,7 +886,7 @@ void setvdelta(int *delta)
loopv(sels)
{
setvdeltaxy(*delta, sels[i]);
addmsg(SV_EDITD, "ri5", sels[i].x, sels[i].y, sels[i].xs, sels[i].ys, *delta);
addmsg(SV_EDITXY, "ri7", EDITXY_VDELTA, sels[i].x, sels[i].y, sels[i].xs, sels[i].ys, *delta, 0);
}
}
COMMANDN(vdelta, setvdelta, "i");
@@ -907,9 +907,18 @@ void archvertex(int *span, int *vert, int *delta)
}
COMMAND(archvertex, "iii");
void archxy(int sidedelta, int *averts, block &sel)
{
loopselxy(sel, s->vdelta =
sel.xs>sel.ys
? (averts[x] + (y==0 || y==sel.ys-1 ? sidedelta : 0))
: (averts[y] + (x==0 || x==sel.xs-1 ? sidedelta : 0)));
remipmore(sel);
}
void arch(int *sidedelta)
{
EDITSELMP;
EDITSEL;
loopv(sels)
{
block &sel = sels[i];
@@ -917,28 +926,32 @@ void arch(int *sidedelta)
sel.ys++;
if(sel.xs>MAXARCHVERT) sel.xs = MAXARCHVERT;
if(sel.ys>MAXARCHVERT) sel.ys = MAXARCHVERT;
loopselxy(sel, s->vdelta =
sel.xs>sel.ys
? (archverts[sel.xs-1][x] + (y==0 || y==sel.ys-1 ? *sidedelta : 0))
: (archverts[sel.ys-1][y] + (x==0 || x==sel.xs-1 ? *sidedelta : 0)));
remipmore(sel);
int *averts = sel.xs > sel.ys ? &archverts[sel.xs-1][0] : &archverts[sel.ys-1][0];
addmsg(SV_EDITARCH, "ri5v", sel.x, sel.y, sel.xs, sel.ys, *sidedelta, MAXARCHVERT, averts);
archxy(*sidedelta, averts, sel); // (changes xs and ys)
}
}
COMMAND(arch, "i");
void slopexy(int xd, int yd, block &sel)
{
int off = 0;
if(xd < 0) off -= xd * sel.xs;
if(yd < 0) off -= yd * sel.ys;
sel.xs++;
sel.ys++;
loopselxy(sel, s->vdelta = xd * x + yd * y + off);
remipmore(sel);
}
void slope(int *xd, int *yd)
{
EDITSELMP;
EDITSEL;
loopv(sels)
{
block &sel = sels[i];
int off = 0;
if(*xd < 0) off -= *xd * sel.xs;
if(*yd < 0) off -= *yd * sel.ys;
sel.xs++;
sel.ys++;
loopselxy(sel, s->vdelta = *xd * x + *yd * y + off);
remipmore(sel);
addmsg(SV_EDITXY, "ri7", EDITXY_SLOPE, sel.x, sel.y, sel.xs, sel.ys, *xd, *yd);
slopexy(*xd, *yd, sel); // (changes xs and ys)
}
}
COMMAND(slope, "ii");
@@ -971,10 +984,19 @@ VARF(fullbright, 0, 0, 1,
else calclight();
);
void edittagxy(int orv, int andv, block &sel)
{
loopselxy(sel, s->tag = (s->tag & andv) | orv);
}
void edittag(int *tag)
{
EDITSELMP;
loopselsxy(s->tag = *tag);
EDITSEL;
loopv(sels)
{
edittagxy(*tag, 0, sels[i]);
addmsg(SV_EDITXY, "ri7", EDITXY_TAG, sels[i].x, sels[i].y, sels[i].xs, sels[i].ys, *tag, 0);
}
}
COMMAND(edittag, "i");
@@ -984,8 +1006,12 @@ void edittagclip(char *tag)
if(tolower(*tag) == 'n') nt = 0; // "none", "nil, "nop"
else if(!strncasecmp(tag, "pl", 2)) nt = TAGPLCLIP; // "playerclip", "plclip", "pl"
else if(isalpha(*tag)) nt = TAGCLIP; // "clip", "all", "full", "hippo"
EDITSELMP;
loopselsxy(s->tag = (s->tag & TAGTRIGGERMASK) | nt);
EDITSEL;
loopv(sels)
{
edittagxy(nt, TAGTRIGGERMASK, sels[i]);
addmsg(SV_EDITXY, "ri7", EDITXY_TAG, sels[i].x, sels[i].y, sels[i].xs, sels[i].ys, nt, TAGTRIGGERMASK);
}
}
COMMAND(edittagclip, "s");
@@ -1068,23 +1094,32 @@ void selfliprotate(block &sel, int dir)
void selectionrotate(int *dir)
{
EDITSELMP;
EDITSEL;
*dir &= 3;
if(!*dir) return;
loopv(sels)
{
block &sel = sels[i];
if(sel.xs == sel.ys || *dir == 2) selfliprotate(sel, *dir);
if(sel.xs == sel.ys || *dir == 2)
{
selfliprotate(sel, *dir);
addmsg(SV_EDITXY, "ri7", EDITXY_FLIPROT, sel.x, sel.y, sel.xs, sel.ys, *dir, 0);
}
}
}
COMMAND(selectionrotate, "i");
void selectionflip(char *axis)
{
EDITSELMP;
EDITSEL;
char c = toupper(*axis);
if(c != 'X' && c != 'Y') return;
loopv(sels) selfliprotate(sels[i], c == 'X' ? 11 : 12);
int dir = c == 'X' ? 11 : 12;
loopv(sels)
{
selfliprotate(sels[i], dir);
addmsg(SV_EDITXY, "ri7", EDITXY_FLIPROT, sels[i].x, sels[i].y, sels[i].xs, sels[i].ys, dir, 0);
}
}
COMMAND(selectionflip, "s");