public void Blockchange1(Player p, ushort x, ushort y, ushort z, byte type) { p.ClearBlockchange(); byte b = p.level.GetTile(x, y, z); p.SendBlockchange(x, y, z, b); Level.Reflection r = (Level.Reflection)p.blockchangeObject; Level.ReflectionPos rp = new Level.ReflectionPos(); rp.x = x; rp.y = y; rp.z = z; r.reflectionPositions.Add(rp); p.blockchangeObject = r; p.Blockchange += new Player.BlockchangeEventHandler(Blockchange2); }
public void Blockchange2(Player p, ushort x, ushort y, ushort z, byte type) { p.ClearBlockchange(); byte b = p.level.GetTile(x, y, z); p.SendBlockchange(x, y, z, b); Level.Reflection r = (Level.Reflection)p.blockchangeObject; Level.ReflectionPos rp = new Level.ReflectionPos(); rp.x = x; rp.y = y; rp.z = z; r.reflectionPositions.Add(rp); p.blockchangeObject = r; if (r.reflectionType != Level.ReflectionType.Line) { p.Blockchange += new Player.BlockchangeEventHandler(Blockchange3); } else { if (r.reflectionPositions.Count != 2) { Player.SendMessage(p, "Incorrect number of blocks placed."); return; } #region AddLine Level.ReflectionLinePos pos; List<Level.ReflectionLinePos> buffer = new List<Level.ReflectionLinePos>(); int i, dx, dy, dz, l, m, n, x_inc, y_inc, z_inc, err_1, err_2, dx2, dy2, dz2; int[] pixel = new int[3]; Level.Reflection reflection = new Level.Reflection(); for (int ii = 0; ii < p.level.reflections.Keys.Count; ii++) if (new List<string>(p.level.reflections.Keys)[ii] == p.name.ToLower()) reflection = new List<Level.Reflection>(p.level.reflections.Values)[ii]; pixel[0] = reflection.reflectionPositions[0].x; pixel[1] = reflection.reflectionPositions[0].y; pixel[2] = reflection.reflectionPositions[0].z; dx = x - reflection.reflectionPositions[0].x; dy = y - reflection.reflectionPositions[0].y; dz = z - reflection.reflectionPositions[0].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 ((m >= l) && (m >= n)) { dy = 0; m = 0; dy2 = m << 1; } if ((l >= m) && (l >= n)) { err_1 = dy2 - l; err_2 = dz2 - l; for (i = 0; i < p.level.width; i++) { pos.x = (ushort)pixel[0]; pos.y = (ushort)pixel[1]; pos.z = (ushort)pixel[2]; pos.type = p.level.GetTile(pos.x, pos.y, pos.z); buffer.Add(pos); 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; pixel[0] += x_inc; } } else { err_1 = dy2 - n; err_2 = dx2 - n; for (i = 0; i < p.level.depth; i++) { pos.x = (ushort)pixel[0]; pos.y = (ushort)pixel[1]; pos.z = (ushort)pixel[2]; pos.type = p.level.GetTile(pos.x, pos.y, pos.z); buffer.Add(pos); 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; pixel[2] += z_inc; } } pos.x = (ushort)pixel[0]; pos.y = (ushort)pixel[1]; pos.z = (ushort)pixel[2]; pos.type = p.level.GetTile(pos.x, pos.y, pos.z); buffer.Add(pos); if (p.level.reflectionLines.ContainsKey(p.name.ToLower())) p.level.reflectionLines.Remove(p.name.ToLower()); p.level.reflectionLines.Add(p.name.ToLower(), buffer); #endregion p.level.ShowReflectionsLines(p); Player.SendMessage(p, "Reflection line set. Use /reflection clear to remove."); } }
public void Blockchange2(Player p, ushort x, ushort y, ushort z, byte type) { p.ClearBlockchange(); byte b = p.level.GetTile(x, y, z); p.SendBlockchange(x, y, z, b); Level.Reflection r = (Level.Reflection)p.blockchangeObject; Level.ReflectionPos rp = new Level.ReflectionPos(); rp.x = x; rp.y = y; rp.z = z; r.reflectionPositions.Add(rp); p.blockchangeObject = r; if (r.reflectionType != Level.ReflectionType.Line) { p.Blockchange += new Player.BlockchangeEventHandler(Blockchange3); } else { if (r.reflectionPositions.Count != 2) { Player.SendMessage(p, "Incorrect number of blocks placed."); return; } #region AddLine Level.ReflectionLinePos pos; List <Level.ReflectionLinePos> buffer = new List <Level.ReflectionLinePos>(); int i, dx, dy, dz, l, m, n, x_inc, y_inc, z_inc, err_1, err_2, dx2, dy2, dz2; int[] pixel = new int[3]; Level.Reflection reflection = new Level.Reflection(); for (int ii = 0; ii < p.level.reflections.Keys.Count; ii++) { if (new List <string>(p.level.reflections.Keys)[ii] == p.name.ToLower()) { reflection = new List <Level.Reflection>(p.level.reflections.Values)[ii]; } } pixel[0] = reflection.reflectionPositions[0].x; pixel[1] = reflection.reflectionPositions[0].y; pixel[2] = reflection.reflectionPositions[0].z; dx = x - reflection.reflectionPositions[0].x; dy = y - reflection.reflectionPositions[0].y; dz = z - reflection.reflectionPositions[0].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 ((m >= l) && (m >= n)) { dy = 0; m = 0; dy2 = m << 1; } if ((l >= m) && (l >= n)) { err_1 = dy2 - l; err_2 = dz2 - l; for (i = 0; i < p.level.width; i++) { pos.x = (ushort)pixel[0]; pos.y = (ushort)pixel[1]; pos.z = (ushort)pixel[2]; pos.type = p.level.GetTile(pos.x, pos.y, pos.z); buffer.Add(pos); 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; pixel[0] += x_inc; } } else { err_1 = dy2 - n; err_2 = dx2 - n; for (i = 0; i < p.level.depth; i++) { pos.x = (ushort)pixel[0]; pos.y = (ushort)pixel[1]; pos.z = (ushort)pixel[2]; pos.type = p.level.GetTile(pos.x, pos.y, pos.z); buffer.Add(pos); 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; pixel[2] += z_inc; } } pos.x = (ushort)pixel[0]; pos.y = (ushort)pixel[1]; pos.z = (ushort)pixel[2]; pos.type = p.level.GetTile(pos.x, pos.y, pos.z); buffer.Add(pos); if (p.level.reflectionLines.ContainsKey(p.name.ToLower())) { p.level.reflectionLines.Remove(p.name.ToLower()); } p.level.reflectionLines.Add(p.name.ToLower(), buffer); #endregion p.level.ShowReflectionsLines(p); Player.SendMessage(p, "Reflection line set. Use /reflection clear to remove."); } }