public void Blockchange2(Player p, ushort x, ushort y, ushort z, byte type) { type = p.bindings[type]; p.ClearBlockchange(); byte b = p.level.GetTile(x, y, z); p.SendBlockchange(x, y, z, b); CatchPos cpos = (CatchPos)p.blockchangeObject; ushort cur; if (x == cpos.x && z == cpos.z) { Player.SendMessage(p, "No direction was selected"); return; } if (Math.Abs(cpos.x - x) > Math.Abs(cpos.z - z)) { cur = cpos.x; if (x > cpos.x) { foreach (char c in cpos.givenMessage) { cur = FindReference.writeLetter(p, c, cur, cpos.y, cpos.z, type, 0); } } else { foreach (char c in cpos.givenMessage) { cur = FindReference.writeLetter(p, c, cur, cpos.y, cpos.z, type, 1); } } } else { cur = cpos.z; if (z > cpos.z) { foreach (char c in cpos.givenMessage) { cur = FindReference.writeLetter(p, c, cpos.x, cpos.y, cur, type, 2); } } else { foreach (char c in cpos.givenMessage) { cur = FindReference.writeLetter(p, c, cpos.x, cpos.y, cur, type, 3); } } } if (p.staticCommands) { p.Blockchange += new Player.BlockchangeEventHandler(Blockchange1); } }
void OnDisable() { instance = null; }
void OnEnable() { instance = this; }
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); Bitmap myBitmap = new Bitmap("extra/images/" + bitmaplocation + ".bmp"); myBitmap.RotateFlip(RotateFlipType.RotateNoneFlipY); CatchPos cpos = (CatchPos)p.blockchangeObject; if (x == cpos.x && z == cpos.z) { Player.SendMessage(p, "No direction was selected"); return; } int direction; if (Math.Abs(cpos.x - x) > Math.Abs(cpos.z - z)) { direction = 0; if (x <= cpos.x) { direction = 1; } } else { direction = 2; if (z <= cpos.z) { direction = 3; } } if (layer) { if (popType == 1) { popType = 2; } if (popType == 3) { popType = 4; } } List <FindReference.ColorBlock> refCol = FindReference.popRefCol(popType); FindReference.ColorBlock colblock; Player.SendMessage(p, "" + direction); Thread printThread = new Thread(new ThreadStart(delegate { double[] distance = new double[refCol.Count]; // Array of distances between color pulled from image to the referance colors. int position; // This is the block selector for when we find which distance is the shortest. for (int k = 0; k < myBitmap.Width; k++) { for (int i = 0; i < myBitmap.Height; i++) { if (layer) { colblock.y = cpos.y; if (direction <= 1) { if (direction == 0) { colblock.x = (ushort)(cpos.x + k); colblock.z = (ushort)(cpos.z - i); } else { colblock.x = (ushort)(cpos.x - k); colblock.z = (ushort)(cpos.z + i); } //colblock.z = (ushort)(cpos.z - i); } else { if (direction == 2) { colblock.z = (ushort)(cpos.z + k); colblock.x = (ushort)(cpos.x + i); } else { colblock.z = (ushort)(cpos.z - k); colblock.x = (ushort)(cpos.x - i); } //colblock.x = (ushort)(cpos.x - i); } } else { colblock.y = (ushort)(cpos.y + i); if (direction <= 1) { if (direction == 0) { colblock.x = (ushort)(cpos.x + k); } else { colblock.x = (ushort)(cpos.x - k); } colblock.z = cpos.z; } else { if (direction == 2) { colblock.z = (ushort)(cpos.z + k); } else { colblock.z = (ushort)(cpos.z - k); } colblock.x = cpos.x; } } colblock.r = myBitmap.GetPixel(k, i).R; colblock.g = myBitmap.GetPixel(k, i).G; colblock.b = myBitmap.GetPixel(k, i).B; colblock.a = myBitmap.GetPixel(k, i).A; if (popType == 6) { if ((colblock.r + colblock.g + colblock.b) / 3 < (256 / 4)) { colblock.type = Block.obsidian; } else if (((colblock.r + colblock.g + colblock.b) / 3) >= (256 / 4) && ((colblock.r + colblock.g + colblock.b) / 3) < (256 / 4) * 2) { colblock.type = Block.darkgrey; } else if (((colblock.r + colblock.g + colblock.b) / 3) >= (256 / 4) * 2 && ((colblock.r + colblock.g + colblock.b) / 3) < (256 / 4) * 3) { colblock.type = Block.lightgrey; } else { colblock.type = Block.white; } } else { for (int j = 0; j < distance.Length; j++) // Calculate distances between the colors in the image and the set referance colors, and store them. { distance[j] = Math.Sqrt(Math.Pow((colblock.r - refCol[j].r), 2) + Math.Pow((colblock.b - refCol[j].b), 2) + Math.Pow((colblock.g - refCol[j].g), 2)); } position = 0; double minimum = distance[0]; for (int h = 1; h < distance.Length; h++) // Find the smallest distance in the array of distances. { if (distance[h] < minimum) { minimum = distance[h]; position = h; } } colblock.type = refCol[position].type; // Set the block we found closest to the image to the block we are placing. if (popType == 1) { if (position <= 20) { if (direction == 0) { colblock.z = (ushort)(colblock.z + 1); } else if (direction == 2) { colblock.x = (ushort)(colblock.x - 1); } else if (direction == 1) { colblock.z = (ushort)(colblock.z - 1); } else if (direction == 3) { colblock.x = (ushort)(colblock.x + 1); } } } else if (popType == 3) { if (position <= 3) { if (direction == 0) { colblock.z = (ushort)(colblock.z + 1); } else if (direction == 2) { colblock.x = (ushort)(colblock.x - 1); } else if (direction == 1) { colblock.z = (ushort)(colblock.z - 1); } else if (direction == 3) { colblock.x = (ushort)(colblock.x + 1); } } } } //ALPHA HANDLING (REAL HARD STUFF, YO) if (colblock.a < 20) { colblock.type = Block.air; } FindReference.placeBlock(p.level, p, colblock.x, colblock.y, colblock.z, colblock.type); } } if (bitmaplocation == "tempImage_" + p.name) { File.Delete("extra/images/tempImage_" + p.name + ".bmp"); } string printType; switch (popType) { case 1: printType = "2-layer color"; break; case 2: printType = "1-layer color"; break; case 3: printType = "2-layer grayscale"; break; case 4: printType = "1-layer grayscale"; break; case 5: printType = "Black and White"; break; case 6: printType = "Mathematical grayscale"; break; default: printType = "Something unknown"; break; } Player.SendMessage(p, "Finished printing image using " + printType); })); printThread.Start(); }
static void Init() { FindReference window = (FindReference)EditorWindow.GetWindow(typeof(FindReference)); window.Show(); }
public void Blockchange2(Player p, ushort x, ushort y, ushort z, byte type) { type = p.bindings[type]; p.ClearBlockchange(); byte b = p.level.GetTile(x, y, z); p.SendBlockchange(x, y, z, b); CatchPos cpos = (CatchPos)p.blockchangeObject; ushort cur; if (x == cpos.x && z == cpos.z) { Player.SendMessage(p, "No direction was selected"); return; } ushort msgLength = 0; int breaksmade = 0; if (Math.Abs(cpos.x - x) > Math.Abs(cpos.z - z)) { cur = cpos.x; if (x > cpos.x) { foreach (char c in cpos.givenMessage) { msgLength += (ushort)(FindReference.charWidth(c) + 1); if ((ushort)(cpos.x + msgLength) >= p.level.width) { cpos.y = (ushort)(cpos.y - 6); cur = FindReference.writeLetter(p, c, (ushort)(x - 1), cpos.y, cpos.z, type, 0); breaksmade++; msgLength = 0; } else { cur = FindReference.writeLetter(p, c, cur, cpos.y, cpos.z, type, 0); } } } else { foreach (char c in cpos.givenMessage) { msgLength += (ushort)(FindReference.charWidth(c) + 1); if ((ushort)(cpos.x - msgLength) <= 0) { cpos.y = (ushort)(cpos.y - 6); cur = FindReference.writeLetter(p, c, (ushort)(x + 1), cpos.y, cpos.z, type, 0); breaksmade++; msgLength = 0; } else { cur = FindReference.writeLetter(p, c, cur, cpos.y, cpos.z, type, 1); } } } } else { cur = cpos.z; if (z > cpos.z) { foreach (char c in cpos.givenMessage) { msgLength += (ushort)(FindReference.charWidth(c) + 1); if ((ushort)(cpos.z + msgLength) >= p.level.width) { cpos.y = (ushort)(cpos.y - 6); cur = FindReference.writeLetter(p, c, cpos.x, cpos.y, (ushort)(z - 1), type, 2); breaksmade++; msgLength = 0; } else { cur = FindReference.writeLetter(p, c, cpos.x, cpos.y, cur, type, 2); } } } else { foreach (char c in cpos.givenMessage) { msgLength += (ushort)(FindReference.charWidth(c) + 1); if ((ushort)(cpos.z - msgLength) <= 0) { cpos.y = (ushort)(cpos.y - 6); cur = FindReference.writeLetter(p, c, cpos.x, cpos.y, (ushort)(z + 1), type, 3); breaksmade++; msgLength = 0; } else { cur = FindReference.writeLetter(p, c, cpos.x, cpos.y, cur, type, 3); } } } } if (breaksmade > 0) { Player.SendMessage(p, breaksmade + " line breaks were added."); } if (p.staticCommands) { p.Blockchange += new Player.BlockchangeEventHandler(Blockchange1); } }
/// <summary> /// Indicates that the expression does not depend on a given (formal) parameter /// </summary> /// <param name="expression">The expression to check</param> /// <param name="parameters">The parameters in respect of which the function should be constant</param> /// <returns></returns> public bool IsConstant(Expression expression, params Parameter[] parameters) { bool retVal = true; foreach (Parameter parameter in parameters) { FindReference<InterpreterTreeNode> findReference = new FindReference<InterpreterTreeNode>(parameter); findReference.GatherReferences(expression); if (findReference.References.Count != 0) { retVal = false; break; } } return retVal; }