mirror of
https://github.com/ClassiCube/MCGalaxy.git
synced 2025-09-25 22:30:52 -04:00
H:/PortableApps/GitPortable/App/Git/line uses DrawOp now, also remove duplication of line making code in CmdMissile.
This commit is contained in:
parent
6b70fa09dc
commit
5d7c2fc1ed
@ -21,7 +21,7 @@ namespace MCGalaxy.Commands
|
||||
{
|
||||
public override string name { get { return "emote"; } }
|
||||
public override string shortcut { get { return "<3"; } }
|
||||
public override string type { get { return CommandTypes.Other; } }
|
||||
public override string type { get { return CommandTypes.Chat; } }
|
||||
public override bool museumUsable { get { return true; } }
|
||||
public override LevelPermission defaultRank { get { return LevelPermission.Banned; } }
|
||||
public CmdEmote() { }
|
@ -23,33 +23,24 @@ namespace MCGalaxy.Commands
|
||||
{
|
||||
public override string name { get { return "high5"; } }
|
||||
public override string shortcut { get { return ""; } }
|
||||
public override string type { get { return CommandTypes.Other; } }
|
||||
public override string type { get { return CommandTypes.Chat; } }
|
||||
public override bool museumUsable { get { return false; } }
|
||||
public override LevelPermission defaultRank { get { return LevelPermission.Guest; } }
|
||||
public CmdHigh5() { }
|
||||
public override void Use(Player p, string message)
|
||||
{
|
||||
if (message == "")
|
||||
{
|
||||
Help(p);
|
||||
return;
|
||||
}
|
||||
Player player1 = Player.Find(message);
|
||||
if (player1 == null || player1.hidden)
|
||||
{
|
||||
Player.SendMessage(p, "Could not find player specified.");
|
||||
return;
|
||||
|
||||
public override void Use(Player p, string message) {
|
||||
if (message == "") { Help(p); return; }
|
||||
Player who = Player.Find(message);
|
||||
if (who == null || who.hidden) {
|
||||
Player.SendMessage(p, "Could not find player specified."); return;
|
||||
}
|
||||
|
||||
string giver = (p == null) ? "The Console" : p.DisplayName;
|
||||
string color = (p == null) ? "" : p.color;
|
||||
Player.SendMessage(player1, giver + " just highfived you");
|
||||
Player.GlobalMessage(color + giver + " " + Server.DefaultColor + "just highfived " + player1.color + player1.DisplayName);
|
||||
string giver = (p == null) ? "(console)" : p.color + p.DisplayName;
|
||||
Player.SendMessage(who, giver + " just highfived you");
|
||||
Player.GlobalMessage(giver + " %Sjust highfived " + who.color + who.DisplayName);
|
||||
}
|
||||
|
||||
// This one controls what happens when you use /help [commandname].
|
||||
public override void Help(Player p)
|
||||
{
|
||||
public override void Help(Player p) {
|
||||
Player.SendMessage(p, "/high5 <player> - High five someone :D");
|
||||
}
|
||||
}
|
@ -23,22 +23,22 @@ namespace MCGalaxy
|
||||
{
|
||||
public override string name { get { return "hug"; } }
|
||||
public override string shortcut { get { return ""; } }
|
||||
public override string type { get { return CommandTypes.Other; } }
|
||||
public override string type { get { return CommandTypes.Chat; } }
|
||||
public override bool museumUsable { get { return true; } }
|
||||
public override LevelPermission defaultRank { get { return LevelPermission.Guest; } }
|
||||
public override void Use(Player p, string message)
|
||||
{
|
||||
|
||||
public override void Use(Player p, string message) {
|
||||
if (message == "") { Help(p); return; }
|
||||
Player who = Player.Find(message);
|
||||
if (who == null || who.hidden) { Player.SendMessage(p, "Could not find specified player!"); return; }
|
||||
else
|
||||
{
|
||||
string msg = String.Format("the {0}Console [&a{1}{0}]", Server.DefaultColor, Server.ZallState);
|
||||
string giver = (p == null) ? msg : p.color + p.DisplayName;
|
||||
Player.GlobalMessage(who.color + who.DisplayName + Server.DefaultColor + " was hugged by " + giver);
|
||||
if (who == null || who.hidden) {
|
||||
Player.SendMessage(p, "Could not find player specified."); return;
|
||||
}
|
||||
|
||||
string giver = (p == null) ? "(console)" : p.color + p.DisplayName;
|
||||
Player.GlobalMessage(who.color + who.DisplayName + " %Swas hugged by " + giver);
|
||||
}
|
||||
public override void Help(Player p)
|
||||
{
|
||||
|
||||
public override void Help(Player p) {
|
||||
Player.SendMessage(p, "/hug <player> - hugs the given player");
|
||||
}
|
||||
}
|
@ -48,10 +48,7 @@ namespace MCGalaxy.Commands
|
||||
}
|
||||
|
||||
if (brush == null) brush = new SolidBrush(cpos.type, cpos.extType);
|
||||
ushort x1 = Math.Min(cpos.x, x), x2 = Math.Max(cpos.x, x);
|
||||
ushort y1 = Math.Min(cpos.y, y), y2 = Math.Max(cpos.y, y);
|
||||
ushort z1 = Math.Min(cpos.z, z), z2 = Math.Max(cpos.z, z);
|
||||
if (!DrawOp.DoDrawOp(drawOp, brush, p, x1, y1, z1, x2, y2, z2))
|
||||
if (!DrawOp.DoDrawOp(drawOp, brush, p, cpos.x, cpos.y, cpos.z, x, y, z))
|
||||
return;
|
||||
if (p.staticCommands)
|
||||
p.Blockchange += new Player.BlockchangeEventHandler(Blockchange1);
|
||||
|
@ -53,94 +53,33 @@ namespace MCGalaxy.Commands {
|
||||
RevertAndClearState(p, x, y, z);
|
||||
CatchPos cpos = (CatchPos)p.blockchangeObject;
|
||||
GetRealBlock(type, extType, p, ref cpos);
|
||||
List<Pos> buffer = new List<Pos>();
|
||||
Pos pos = new Pos();
|
||||
|
||||
if (cpos.solid == SolidType.straight) {
|
||||
int xdif = Math.Abs(cpos.x - x);
|
||||
int ydif = Math.Abs(cpos.y - y);
|
||||
int zdif = Math.Abs(cpos.z - z);
|
||||
int dx = Math.Abs(cpos.x - x);
|
||||
int dy = Math.Abs(cpos.y - y);
|
||||
int dz = Math.Abs(cpos.z - z);
|
||||
|
||||
if (xdif > ydif && xdif > zdif) {
|
||||
if (dx > dy && dx > dz) {
|
||||
y = cpos.y; z = cpos.z;
|
||||
} else if (ydif > xdif && ydif > zdif) {
|
||||
} else if (dy > dx && dy > dz) {
|
||||
x = cpos.x; z = cpos.z;
|
||||
} else if (zdif > ydif && zdif > xdif) {
|
||||
} else if (dz > dy && dz > dx) {
|
||||
y = cpos.y; x = cpos.x;
|
||||
}
|
||||
}
|
||||
|
||||
Line lx, ly, lz;
|
||||
int[] pixel = { cpos.x, cpos.y, cpos.z };
|
||||
int dx = x - cpos.x, dy = y - cpos.y, dz = z - cpos.z;
|
||||
lx.inc = Math.Sign(dx); ly.inc = Math.Sign(dy); lz.inc = Math.Sign(dz);
|
||||
|
||||
int xLen = Math.Abs(dx), yLen = Math.Abs(dy), zLen = Math.Abs(dz);
|
||||
lx.dx2 = xLen << 1; ly.dx2 = yLen << 1; lz.dx2 = zLen << 1;
|
||||
lx.index = 0; ly.index = 1; lz.index = 2;
|
||||
|
||||
if (xLen >= yLen && xLen >= zLen)
|
||||
DoLine(ly, lz, lx, xLen, pixel, buffer);
|
||||
else if (yLen >= xLen && yLen >= zLen)
|
||||
DoLine(lx, lz, ly, yLen, pixel, buffer);
|
||||
else
|
||||
DoLine(ly, lx, lz, zLen, pixel, buffer);
|
||||
|
||||
pos.x = (ushort)pixel[0]; pos.y = (ushort)pixel[1]; pos.z = (ushort)pixel[2];
|
||||
buffer.Add(pos);
|
||||
int maxLen = cpos.data == null ? int.MaxValue : (ushort)cpos.data;
|
||||
|
||||
int count = Math.Min(buffer.Count, maxLen);
|
||||
if (cpos.solid == SolidType.walls)
|
||||
count *= Math.Abs(cpos.y - y);
|
||||
|
||||
if (count > p.group.maxBlocks) {
|
||||
Player.SendMessage(p, "You tried to draw " + count + " blocks at once.");
|
||||
Player.SendMessage(p, "You are limited to " + p.group.maxBlocks);
|
||||
|
||||
LineDrawOp drawOp = new LineDrawOp();
|
||||
drawOp.WallsMode = cpos.solid == SolidType.walls;
|
||||
if (cpos.data != null)
|
||||
drawOp.MaxLength = (ushort)cpos.data;
|
||||
Brush brush = new SolidBrush(cpos.type, cpos.extType);
|
||||
|
||||
if (!DrawOp.DoDrawOp(drawOp, brush, p, cpos.x, cpos.y, cpos.z, x, y, z))
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = 0; i < maxLen && i < buffer.Count; i++) {
|
||||
pos = buffer[i];
|
||||
if (cpos.solid == SolidType.walls) {
|
||||
for (ushort yy = Math.Min(cpos.y, y); yy <= Math.Max(cpos.y, y); yy++) {
|
||||
p.level.Blockchange(p, pos.x, yy, pos.z, type, extType);
|
||||
}
|
||||
} else {
|
||||
p.level.Blockchange(p, pos.x, pos.y, pos.z, type, extType);
|
||||
}
|
||||
}
|
||||
|
||||
count = Math.Min(maxLen, buffer.Count);
|
||||
Player.SendMessage(p, "Line was " + count + " blocks long.");
|
||||
if (p.staticCommands)
|
||||
p.Blockchange += new Player.BlockchangeEventHandler(Blockchange1);
|
||||
}
|
||||
|
||||
struct Line { public int dx2, inc, index; }
|
||||
|
||||
struct Pos { public ushort x, y, z; }
|
||||
|
||||
static void DoLine(Line l1, Line l2, Line l3, int len, int[] pixel, List<Pos> buffer) {
|
||||
int err_1 = l1.dx2 - len, err_2 = l2.dx2 - len;
|
||||
Pos pos;
|
||||
for (int i = 0; i < len; i++) {
|
||||
pos.x = (ushort)pixel[0]; pos.y = (ushort)pixel[1]; pos.z = (ushort)pixel[2];
|
||||
buffer.Add(pos);
|
||||
|
||||
if (err_1 > 0) {
|
||||
pixel[l1.index] += l1.inc;
|
||||
err_1 -= l3.dx2;
|
||||
}
|
||||
if (err_2 > 0) {
|
||||
pixel[l2.index] += l2.inc;
|
||||
err_2 -= l3.dx2;
|
||||
}
|
||||
err_1 += l1.dx2; err_2 += l2.dx2;
|
||||
pixel[l3.index] += l3.inc;
|
||||
}
|
||||
}
|
||||
|
||||
public override void Help(Player p) {
|
||||
Player.SendMessage(p, "%T/line [block type] <mode> <length>");
|
||||
Player.SendMessage(p, " %HCreates a line between two points.");
|
||||
|
@ -45,10 +45,7 @@ namespace MCGalaxy.Commands
|
||||
drawOp = new PyramidReverseDrawOp(); break;
|
||||
}
|
||||
|
||||
ushort x1 = Math.Min(cpos.x, x), x2 = Math.Max(cpos.x, x);
|
||||
ushort y1 = Math.Min(cpos.y, y), y2 = Math.Max(cpos.y, y);
|
||||
ushort z1 = Math.Min(cpos.z, z), z2 = Math.Max(cpos.z, z);
|
||||
if (!DrawOp.DoDrawOp(drawOp, brush, p, x1, y1, z1, x2, y2, z2))
|
||||
if (!DrawOp.DoDrawOp(drawOp, brush, p, cpos.x, cpos.y, cpos.z, x, y, z))
|
||||
return;
|
||||
if (p.staticCommands)
|
||||
p.Blockchange += new Player.BlockchangeEventHandler(Blockchange1);
|
||||
|
@ -45,14 +45,11 @@ namespace MCGalaxy.Commands {
|
||||
public void Blockchange2(Player p, ushort x, ushort y, ushort z, byte type, byte extType) {
|
||||
RevertAndClearState(p, x, y, z);
|
||||
CatchPos cpos = (CatchPos)p.blockchangeObject;
|
||||
ushort x1 = Math.Min(cpos.x, x), x2 = Math.Max(cpos.x, x);
|
||||
ushort y1 = Math.Min(cpos.y, y), y2 = Math.Max(cpos.y, y);
|
||||
ushort z1 = Math.Min(cpos.z, z), z2 = Math.Max(cpos.z, z);
|
||||
ReplaceDrawOp drawOp = new ReplaceDrawOp();
|
||||
drawOp.ToReplace = toAffect;
|
||||
drawOp.Target = target;
|
||||
|
||||
if (!DrawOp.DoDrawOp(drawOp, null, p, x1, y1, z1, x2, y2, z2))
|
||||
if (!DrawOp.DoDrawOp(drawOp, null, p, cpos.x, cpos.y, cpos.z, x, y, z))
|
||||
return;
|
||||
if (p.staticCommands)
|
||||
p.Blockchange += new Player.BlockchangeEventHandler(Blockchange1);
|
||||
|
@ -44,14 +44,11 @@ namespace MCGalaxy.Commands {
|
||||
public void Blockchange2(Player p, ushort x, ushort y, ushort z, byte type, byte extType) {
|
||||
RevertAndClearState(p, x, y, z);
|
||||
CatchPos cpos = (CatchPos)p.blockchangeObject;
|
||||
ushort x1 = Math.Min(cpos.x, x), x2 = Math.Max(cpos.x, x);
|
||||
ushort y1 = Math.Min(cpos.y, y), y2 = Math.Max(cpos.y, y);
|
||||
ushort z1 = Math.Min(cpos.z, z), z2 = Math.Max(cpos.z, z);
|
||||
ReplaceNotDrawOp drawOp = new ReplaceNotDrawOp();
|
||||
drawOp.ToReplace = toAffect;
|
||||
drawOp.Target = target;
|
||||
|
||||
if (!DrawOp.DoDrawOp(drawOp, null, p, x1, y1, z1, x2, y2, z2))
|
||||
if (!DrawOp.DoDrawOp(drawOp, null, p, cpos.x, cpos.y, cpos.z, x, y, z))
|
||||
return;
|
||||
if (p.staticCommands)
|
||||
p.Blockchange += new Player.BlockchangeEventHandler(Blockchange1);
|
||||
|
@ -39,11 +39,8 @@ namespace MCGalaxy.Commands {
|
||||
case SolidType.vertical:
|
||||
drawOp = new CylinderDrawOp(); break;
|
||||
}
|
||||
|
||||
ushort x1 = Math.Min(cpos.x, x), x2 = Math.Max(cpos.x, x);
|
||||
ushort y1 = Math.Min(cpos.y, y), y2 = Math.Max(cpos.y, y);
|
||||
ushort z1 = Math.Min(cpos.z, z), z2 = Math.Max(cpos.z, z);
|
||||
if (!DrawOp.DoDrawOp(drawOp, brush, p, x1, y1, z1, x2, y2, z2))
|
||||
|
||||
if (!DrawOp.DoDrawOp(drawOp, brush, p, cpos.x, cpos.y, cpos.z, x, y, z))
|
||||
return;
|
||||
if (p.staticCommands)
|
||||
p.Blockchange += new Player.BlockchangeEventHandler(Blockchange1);
|
||||
|
@ -184,6 +184,7 @@ namespace MCGalaxy.Commands
|
||||
pos.z = startZ;
|
||||
|
||||
int total = 0;
|
||||
List<FillPos> buffer = new List<FillPos>(2);
|
||||
|
||||
while (true)
|
||||
{
|
||||
@ -198,7 +199,7 @@ namespace MCGalaxy.Commands
|
||||
|
||||
CatchPos lookedAt;
|
||||
int i;
|
||||
for (i = 1; true; i++)
|
||||
for (i = 1; ; i++)
|
||||
{
|
||||
lookedAt.x = (ushort)Math.Round(startX + (double)(a * i));
|
||||
lookedAt.y = (ushort)Math.Round(startY + (double)(c * i));
|
||||
@ -266,7 +267,7 @@ namespace MCGalaxy.Commands
|
||||
lookedAt.y = (ushort)Math.Round(startY + (double)(c * (i - 1)));
|
||||
lookedAt.z = (ushort)Math.Round(startZ + (double)(b * (i - 1)));
|
||||
|
||||
findNext(lookedAt, ref pos);
|
||||
FindNext(lookedAt, ref pos, buffer);
|
||||
|
||||
by = p.level.GetTile(pos.x, pos.y, pos.z);
|
||||
if (total > 3)
|
||||
@ -361,100 +362,22 @@ namespace MCGalaxy.Commands
|
||||
}));
|
||||
gunThread.Name = "MCG_Missile";
|
||||
gunThread.Start();
|
||||
}
|
||||
public override void Help(Player p)
|
||||
{
|
||||
Player.SendMessage(p, "/missile [at end] - Allows you to fire missiles at people");
|
||||
Player.SendMessage(p, "Available [at end] values: &cexplode, destroy");
|
||||
Player.SendMessage(p, "Differs from /gun in that the missile is guided");
|
||||
}
|
||||
}
|
||||
|
||||
struct CatchPos { public ushort x, y, z; }
|
||||
struct Pos { public ushort x, y, z; public int ending; }
|
||||
|
||||
void findNext(CatchPos lookedAt, ref CatchPos pos)
|
||||
{
|
||||
int dx, dy, dz, l, m, n, x_inc, y_inc, z_inc, err_1, err_2, dx2, dy2, dz2;
|
||||
int[] pixel = new int[3];
|
||||
|
||||
pixel[0] = pos.x; pixel[1] = pos.y; pixel[2] = pos.z;
|
||||
dx = lookedAt.x - pos.x; dy = lookedAt.y - pos.y; dz = lookedAt.z - pos.z;
|
||||
|
||||
x_inc = (dx < 0) ? -1 : 1; l = Math.Abs(dx);
|
||||
y_inc = (dy < 0) ? -1 : 1; m = Math.Abs(dy);
|
||||
z_inc = (dz < 0) ? -1 : 1; n = Math.Abs(dz);
|
||||
|
||||
dx2 = l << 1; dy2 = m << 1; dz2 = n << 1;
|
||||
|
||||
if ((l >= m) && (l >= n))
|
||||
{
|
||||
err_1 = dy2 - l;
|
||||
err_2 = dz2 - l;
|
||||
|
||||
pixel[0] += x_inc;
|
||||
if (err_1 > 0)
|
||||
{
|
||||
pixel[1] += y_inc;
|
||||
err_1 -= dx2;
|
||||
}
|
||||
if (err_2 > 0)
|
||||
{
|
||||
pixel[2] += z_inc;
|
||||
err_2 -= dx2;
|
||||
}
|
||||
err_1 += dy2;
|
||||
err_2 += dz2;
|
||||
|
||||
pos.x = (ushort)pixel[0];
|
||||
pos.y = (ushort)pixel[1];
|
||||
pos.z = (ushort)pixel[2];
|
||||
}
|
||||
else if ((m >= l) && (m >= n))
|
||||
{
|
||||
err_1 = dx2 - m;
|
||||
err_2 = dz2 - m;
|
||||
|
||||
pixel[1] += y_inc;
|
||||
if (err_1 > 0)
|
||||
{
|
||||
pixel[0] += x_inc;
|
||||
err_1 -= dy2;
|
||||
}
|
||||
if (err_2 > 0)
|
||||
{
|
||||
pixel[2] += z_inc;
|
||||
err_2 -= dy2;
|
||||
}
|
||||
err_1 += dx2;
|
||||
err_2 += dz2;
|
||||
|
||||
pos.x = (ushort)pixel[0];
|
||||
pos.y = (ushort)pixel[1];
|
||||
pos.z = (ushort)pixel[2];
|
||||
}
|
||||
else
|
||||
{
|
||||
err_1 = dy2 - n;
|
||||
err_2 = dx2 - n;
|
||||
|
||||
pixel[2] += z_inc;
|
||||
if (err_1 > 0)
|
||||
{
|
||||
pixel[1] += y_inc;
|
||||
err_1 -= dz2;
|
||||
}
|
||||
if (err_2 > 0)
|
||||
{
|
||||
pixel[0] += x_inc;
|
||||
err_2 -= dz2;
|
||||
}
|
||||
err_1 += dy2;
|
||||
err_2 += dx2;
|
||||
|
||||
pos.x = (ushort)pixel[0];
|
||||
pos.y = (ushort)pixel[1];
|
||||
pos.z = (ushort)pixel[2];
|
||||
}
|
||||
void FindNext(CatchPos lookedAt, ref CatchPos pos, List<FillPos> buffer) {
|
||||
LineDrawOp.DrawLine(pos.x, pos.y, pos.z, 2, lookedAt.x, lookedAt.y, lookedAt.z, buffer);
|
||||
FillPos end = buffer[buffer.Count - 1];
|
||||
pos.x = end.X; pos.y = end.Y; pos.z = end.Z;
|
||||
buffer.Clear();
|
||||
}
|
||||
|
||||
public override void Help(Player p) {
|
||||
Player.SendMessage(p, "/missile [at end] - Allows you to fire missiles at people");
|
||||
Player.SendMessage(p, "Available [at end] values: &cexplode, destroy");
|
||||
Player.SendMessage(p, "Differs from /gun in that the missile is guided");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -27,6 +27,8 @@ namespace MCGalaxy {
|
||||
protected const int reloadLimit = 10000;
|
||||
protected int method;
|
||||
|
||||
public virtual bool MinMaxCoords { get { return true; } }
|
||||
|
||||
public abstract string Name { get; }
|
||||
|
||||
public abstract int GetBlocksAffected(Level lvl, ushort x1, ushort y1, ushort z1, ushort x2, ushort y2, ushort z2);
|
||||
@ -91,6 +93,13 @@ namespace MCGalaxy {
|
||||
public static bool DoDrawOp(DrawOp op, Brush brush, Player p,
|
||||
ushort x1, ushort y1, ushort z1, ushort x2, ushort y2, ushort z2) {
|
||||
int affected = 0;
|
||||
if (op.MinMaxCoords) {
|
||||
ushort xx1 = x1, yy1 = y1, zz1 = z1, xx2 = x2, yy2 = y2, zz2 = z2;
|
||||
x1 = Math.Min(xx1, xx2); x2 = Math.Max(xx1, xx2);
|
||||
y1 = Math.Min(yy1, yy2); y2 = Math.Max(yy1, yy2);
|
||||
z1 = Math.Min(zz1, zz2); z2 = Math.Max(zz1, zz2);
|
||||
}
|
||||
|
||||
if (!op.CanDraw(x1, y1, z1, x2, y2, z2, p, out affected))
|
||||
return false;
|
||||
Player.SendMessage(p, op.Name + ": affecting up to an estimated " + affected + " blocks");
|
||||
|
109
Drawing/DrawOps/LineDrawOp.cs
Normal file
109
Drawing/DrawOps/LineDrawOp.cs
Normal file
@ -0,0 +1,109 @@
|
||||
/*
|
||||
Copyright 2011 MCGalaxy
|
||||
|
||||
Dual-licensed under the Educational Community License, Version 2.0 and
|
||||
the GNU General Public License, Version 3 (the "Licenses"); you may
|
||||
not use this file except in compliance with the Licenses. You may
|
||||
obtain a copy of the Licenses at
|
||||
|
||||
http://www.opensource.org/licenses/ecl2.php
|
||||
http://www.gnu.org/licenses/gpl-3.0.html
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the Licenses are distributed on an "AS IS"
|
||||
BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||
or implied. See the Licenses for the specific language governing
|
||||
permissions and limitations under the Licenses.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace MCGalaxy {
|
||||
|
||||
public class LineDrawOp : DrawOp {
|
||||
|
||||
public bool WallsMode;
|
||||
public int MaxLength = int.MaxValue;
|
||||
|
||||
public override string Name { get { return "Line"; } }
|
||||
|
||||
public override bool MinMaxCoords { get { return false; } }
|
||||
|
||||
public override int GetBlocksAffected(Level lvl, ushort x1, ushort y1, ushort z1, ushort x2, ushort y2, ushort z2) {
|
||||
double dx = Math.Abs(x2 - x1) + 0.25, dy = Math.Abs(y2 - y1) + 0.25, dz = Math.Abs(z2 - z1) + 0.25;
|
||||
if (WallsMode) {
|
||||
int baseLen = (int)Math.Ceiling(Math.Sqrt(dx * dx + dz * dz));
|
||||
return Math.Min(baseLen, MaxLength) * (Math.Abs(y2 - y1) + 1);
|
||||
} else {
|
||||
int baseLen = (int)Math.Ceiling(Math.Sqrt(dx * dx + dy * dy + dz * dz));
|
||||
return Math.Min(baseLen, MaxLength);
|
||||
}
|
||||
}
|
||||
|
||||
public override void Perform(ushort x1, ushort y1, ushort z1, ushort x2,
|
||||
ushort y2, ushort z2, Player p, Level lvl, Brush brush) {
|
||||
List<FillPos> buffer = new List<FillPos>();
|
||||
DrawLine(x1, y1, z1, MaxLength, x2, y2, z2, buffer);
|
||||
if (WallsMode) {
|
||||
ushort yy1 = y1, yy2 = y2;
|
||||
y1 = Math.Min(yy1, yy2); y2 = Math.Max(yy1, yy2);
|
||||
}
|
||||
|
||||
for (int i = 0; i < buffer.Count; i++) {
|
||||
FillPos pos = buffer[i];
|
||||
if (WallsMode) {
|
||||
for (ushort yy = y1; yy <= y2; yy++)
|
||||
PlaceBlock(p, lvl, pos.X, yy, pos.Z, brush);
|
||||
} else {
|
||||
PlaceBlock(p, lvl, pos.X, pos.Y, pos.Z, brush);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal static void DrawLine(ushort x1, ushort y1, ushort z1, int maxLen,
|
||||
ushort x2, ushort y2, ushort z2, List<FillPos> buffer) {
|
||||
Line lx, ly, lz;
|
||||
int[] pixel = { x1, y1, z1 };
|
||||
int dx = x2 - x1, dy = y2 - y1, dz = z2 - z1;
|
||||
lx.inc = Math.Sign(dx); ly.inc = Math.Sign(dy); lz.inc = Math.Sign(dz);
|
||||
|
||||
int xLen = Math.Abs(dx), yLen = Math.Abs(dy), zLen = Math.Abs(dz);
|
||||
lx.dx2 = xLen << 1; ly.dx2 = yLen << 1; lz.dx2 = zLen << 1;
|
||||
lx.index = 0; ly.index = 1; lz.index = 2;
|
||||
|
||||
if (xLen >= yLen && xLen >= zLen)
|
||||
DoLine(ly, lz, lx, xLen, pixel, maxLen, buffer);
|
||||
else if (yLen >= xLen && yLen >= zLen)
|
||||
DoLine(lx, lz, ly, yLen, pixel, maxLen, buffer);
|
||||
else
|
||||
DoLine(ly, lx, lz, zLen, pixel, maxLen, buffer);
|
||||
|
||||
FillPos pos;
|
||||
pos.X = (ushort)pixel[0]; pos.Y = (ushort)pixel[1]; pos.Z = (ushort)pixel[2];
|
||||
buffer.Add(pos);
|
||||
}
|
||||
|
||||
struct Line { public int dx2, inc, index; }
|
||||
|
||||
static void DoLine(Line l1, Line l2, Line l3, int len,
|
||||
int[] pixel, int maxLen, List<FillPos> buffer) {
|
||||
int err_1 = l1.dx2 - len, err_2 = l2.dx2 - len;
|
||||
FillPos pos;
|
||||
for (int i = 0; i < len && i < (maxLen - 1); i++) {
|
||||
pos.X = (ushort)pixel[0]; pos.Y = (ushort)pixel[1]; pos.Z = (ushort)pixel[2];
|
||||
buffer.Add(pos);
|
||||
|
||||
if (err_1 > 0) {
|
||||
pixel[l1.index] += l1.inc;
|
||||
err_1 -= l3.dx2;
|
||||
}
|
||||
if (err_2 > 0) {
|
||||
pixel[l2.index] += l2.inc;
|
||||
err_2 -= l3.dx2;
|
||||
}
|
||||
err_1 += l1.dx2; err_2 += l2.dx2;
|
||||
pixel[l3.index] += l3.inc;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -680,35 +680,16 @@ namespace MCGalaxy
|
||||
return true;
|
||||
}
|
||||
|
||||
public void ChatLevel(string message)
|
||||
{
|
||||
foreach (Player pl in Player.players.Where(pl => pl.level == this))
|
||||
{
|
||||
pl.SendMessage(message);
|
||||
}
|
||||
}
|
||||
public void ChatLevel(string message) { ChatLevel(message, LevelPermission.Banned); }
|
||||
|
||||
public void ChatLevelOps(string message)
|
||||
{
|
||||
foreach (
|
||||
Player pl in
|
||||
Player.players.Where(
|
||||
pl =>
|
||||
pl.level == this &&
|
||||
pl.group.Permission >= Server.opchatperm))
|
||||
{
|
||||
pl.SendMessage(message);
|
||||
}
|
||||
}
|
||||
public void ChatLevelOps(string message) { ChatLevel(message, Server.opchatperm); }
|
||||
|
||||
public void ChatLevelAdmins(string message)
|
||||
{
|
||||
foreach (
|
||||
Player pl in
|
||||
Player.players.Where(
|
||||
pl => pl.level == this &&
|
||||
pl.group.Permission >= Server.adminchatperm))
|
||||
{
|
||||
public void ChatLevelAdmins(string message) { ChatLevel(message, Server.adminchatperm); }
|
||||
|
||||
public void ChatLevel(string message, LevelPermission minPerm) {
|
||||
foreach (Player pl in Player.players) {
|
||||
if (pl.level != this) continue;
|
||||
if (pl.group.Permission < minPerm) continue;
|
||||
pl.SendMessage(message);
|
||||
}
|
||||
}
|
||||
|
@ -138,10 +138,13 @@
|
||||
<Compile Include="Commands\building\ReplaceCmd.cs" />
|
||||
<Compile Include="Commands\Chat\CmdAdminChat.cs" />
|
||||
<Compile Include="Commands\Chat\CmdChatRoom.cs" />
|
||||
<Compile Include="Commands\Chat\CmdEmote.cs" />
|
||||
<Compile Include="Commands\Chat\CmdGcaccept.cs" />
|
||||
<Compile Include="Commands\Chat\CmdGcrules.cs" />
|
||||
<Compile Include="Commands\Chat\CmdGlobal.cs" />
|
||||
<Compile Include="Commands\Chat\CmdGlobalCLS.cs" />
|
||||
<Compile Include="Commands\Chat\CmdHigh5.cs" />
|
||||
<Compile Include="Commands\Chat\CmdHug.cs" />
|
||||
<Compile Include="Commands\Chat\CmdIgnore.cs" />
|
||||
<Compile Include="Commands\Chat\CmdMe.cs" />
|
||||
<Compile Include="Commands\Chat\CmdOpChat.cs" />
|
||||
@ -167,16 +170,18 @@
|
||||
<Compile Include="Commands\Economy\CmdGive.cs" />
|
||||
<Compile Include="Commands\Economy\CmdMoney.cs" />
|
||||
<Compile Include="Commands\Economy\CmdPay.cs" />
|
||||
<Compile Include="Commands\Games\CmdCountdown.cs" />
|
||||
<Compile Include="Commands\Games\CmdCtf.cs" />
|
||||
<Compile Include="Commands\Games\CmdDisinfect.cs" />
|
||||
<Compile Include="Commands\Games\CmdInfect.cs" />
|
||||
<Compile Include="Commands\Games\CmdInfected.cs" />
|
||||
<Compile Include="Commands\Games\CmdLavaSurvival.cs" />
|
||||
<Compile Include="Commands\Games\CmdTntWars.cs" />
|
||||
<Compile Include="Commands\Games\CmdZombieGame.cs" />
|
||||
<Compile Include="Commands\Games\CmdZombieSpawn.cs" />
|
||||
<Compile Include="Commands\Games\CmdZombieSurvival.cs" />
|
||||
<Compile Include="Commands\Fun\CmdCountdown.cs" />
|
||||
<Compile Include="Commands\Fun\CmdCtf.cs" />
|
||||
<Compile Include="Commands\Fun\CmdDisinfect.cs" />
|
||||
<Compile Include="Commands\Fun\CmdFliphead.cs" />
|
||||
<Compile Include="Commands\Fun\CmdFlipHeads.cs" />
|
||||
<Compile Include="Commands\Fun\CmdInfect.cs" />
|
||||
<Compile Include="Commands\Fun\CmdInfected.cs" />
|
||||
<Compile Include="Commands\Fun\CmdLavaSurvival.cs" />
|
||||
<Compile Include="Commands\Fun\CmdTntWars.cs" />
|
||||
<Compile Include="Commands\Fun\CmdZombieGame.cs" />
|
||||
<Compile Include="Commands\Fun\CmdZombieSpawn.cs" />
|
||||
<Compile Include="Commands\Fun\CmdZombieSurvival.cs" />
|
||||
<Compile Include="Commands\Information\CmdAbout.cs" />
|
||||
<Compile Include="Commands\Information\CmdAfk.cs" />
|
||||
<Compile Include="Commands\Information\CmdBlocks.cs" />
|
||||
@ -306,17 +311,12 @@
|
||||
<Compile Include="Commands\Other\cmdCTFADSFD.cs" />
|
||||
<Compile Include="Commands\Other\CmdDescend.cs" />
|
||||
<Compile Include="Commands\Other\CmdDisagree.cs" />
|
||||
<Compile Include="Commands\Other\CmdEmote.cs" />
|
||||
<Compile Include="Commands\Other\CmdFakerank.cs" />
|
||||
<Compile Include="Commands\Other\CmdFliphead.cs" />
|
||||
<Compile Include="Commands\Other\CmdFlipHeads.cs" />
|
||||
<Compile Include="Commands\Other\CmdFly.cs" />
|
||||
<Compile Include="Commands\Other\CmdGarbage.cs" />
|
||||
<Compile Include="Commands\Other\CmdGun.cs" />
|
||||
<Compile Include="Commands\Other\CmdHackRank.cs" />
|
||||
<Compile Include="Commands\Other\CmdHeartbeat.cs" />
|
||||
<Compile Include="Commands\Other\CmdHigh5.cs" />
|
||||
<Compile Include="Commands\Other\CmdHug.cs" />
|
||||
<Compile Include="Commands\Other\CmdImpersonate.cs" />
|
||||
<Compile Include="Commands\Other\CmdInterval.cs" />
|
||||
<Compile Include="Commands\Other\CmdInvincible.cs" />
|
||||
@ -396,6 +396,7 @@
|
||||
<Compile Include="Drawing\DrawOps\CuboidDrawOp.cs" />
|
||||
<Compile Include="Drawing\DrawOps\DrawOp.cs" />
|
||||
<Compile Include="Drawing\DrawOps\FillDrawOp.cs" />
|
||||
<Compile Include="Drawing\DrawOps\LineDrawOp.cs" />
|
||||
<Compile Include="Drawing\DrawOps\ReplaceDrawOp.cs" />
|
||||
<Compile Include="Drawing\DrawOps\SpheroidDrawOp.cs" />
|
||||
<Compile Include="Drawing\DrawOps\PyramidDrawOp.cs" />
|
||||
@ -697,7 +698,7 @@
|
||||
<ItemGroup>
|
||||
<Folder Include="Commands" />
|
||||
<Folder Include="Commands\Building" />
|
||||
<Folder Include="Commands\Games" />
|
||||
<Folder Include="Commands\Fun" />
|
||||
<Folder Include="Commands\Information" />
|
||||
<Folder Include="Commands\Moderation" />
|
||||
<Folder Include="Commands\Economy" />
|
||||
|
Loading…
x
Reference in New Issue
Block a user