public void startDrill(int x, int y) { Point drillPos = getDrillPosition(x, y); int drillX = drillPos.X, drillY = drillPos.Y; int chestIndex = getChestIndex(x, y); if (chestIndex >= 0) { lastDrills[chestIndex] = Main.time; Chest chest = Main.chest[chestIndex]; if (spelunkerLeft[chestIndex] < 1) { refillSpelunkerTime(chest, chestIndex); } bool foundTile = false; bool isMiningSpelunker = false; while (drillY < Main.Map.MaxHeight && WorldGen.TileEmpty(drillX, drillY) && !foundTile) { if (spelunkerLeft[chestIndex] >= 1) { int maxXoffset = spelunkerWidth / 2; bool foundOre = false; int oreDir = 0; for (int Xoffset = 1; Xoffset <= maxXoffset; Xoffset++) { if (!WorldGen.TileEmpty(drillX - Xoffset, drillY) && Main.tileSpelunker[Main.tile[drillX - Xoffset, drillY].type]) { oreDir = -1; } else if (!WorldGen.TileEmpty(drillX + Xoffset, drillY) && Main.tileSpelunker[Main.tile[drillX + Xoffset, drillY].type]) { oreDir = 1; } if (oreDir != 0) { foundOre = true; break; } } if (foundOre) { for (int Xoffset = 1; Xoffset <= maxXoffset; Xoffset++) { if (!WorldGen.TileEmpty(drillX + oreDir * Xoffset, drillY)) { drillX += oreDir * Xoffset; foundTile = true; isMiningSpelunker = Main.tileSpelunker[Main.tile[drillX, drillY].type]; break; } } } } else { int maxXoffset = width / 2; for (int Xoffset = 1; Xoffset <= maxXoffset; Xoffset++) { if (!WorldGen.TileEmpty(drillX - Xoffset, drillY)) { drillX -= Xoffset; foundTile = true; break; } if (!WorldGen.TileEmpty(drillX + Xoffset, drillY)) { drillX += Xoffset; foundTile = true; break; } } } if (!foundTile) { drillY++; } } if (drillY >= Main.Map.MaxHeight) { return; } int type = Main.tile[drillX, drillY].type; // Main.PlaySound(drillSound, drillX * 16, drillY * 16, 1, 1f, 0f); Main.PlaySound(drillSound, drillX * 16, drillY * 16); bool foundSpace = false; for (int slot = 0; slot < chest.item.Length; slot++) { Item item = chest.item[slot]; if (item.type == ItemID.None) { foundSpace = true; break; } } if (foundSpace) { if (hitTiles[chestIndex] == null) { hitTiles[chestIndex] = new HitTile(); } MineBlock(drillX, drillY, chest.item[0].pick, chest, hitTiles[chestIndex]); collectDrop(drillX, drillY, chest, chestIndex); if (isMiningSpelunker && WorldGen.TileEmpty(drillX, drillY)) { spelunkerLeft[chestIndex]--; } } } }
private int HitTile_AddDamage(Hook.HitTile.orig_AddDamage orig, HitTile self, int tileId, int damageAmount, bool updateAmount) { return(hitTileLastDamage = orig(self, tileId, damageAmount, updateAmount)); }
public void MineBlock(int x, int y, int pickPower, Chest chest, HitTile hitTile) { hitTile.UpdatePosition(Main.tile[x, y].type, x, y); int num = 0; int tileId = hitTile.HitObject(x, y, 1); Tile tile = Main.tile[x, y]; if (Main.tileNoFail[(int)tile.type]) { num = 100; } if (Main.tileDungeon[(int)tile.type] || tile.type == 25 || tile.type == 58 || tile.type == 117 || tile.type == 203) { num += pickPower / 2; } else if (tile.type == 48 || tile.type == 232) { num += pickPower / 4; } else if (tile.type == 226) { num += pickPower / 4; } else if (tile.type == 107 || tile.type == 221) { num += pickPower / 2; } else if (tile.type == 108 || tile.type == 222) { num += pickPower / 3; } else if (tile.type == 111 || tile.type == 223) { num += pickPower / 4; } else if (tile.type == 211) { num += pickPower / 5; } else { TileLoader.MineDamage(pickPower, ref num); } if (tile.type == 211 && pickPower < 200) { num = 0; } if ((tile.type == 25 || tile.type == 203) && pickPower < 65) { num = 0; } else if (tile.type == 117 && pickPower < 65) { num = 0; } else if (tile.type == 37 && pickPower < 50) { num = 0; } else if (tile.type == 404 && pickPower < 65) { num = 0; } else if ((tile.type == 22 || tile.type == 204) && (double)y > Main.worldSurface && pickPower < 55) { num = 0; } else if (tile.type == 56 && pickPower < 65) { num = 0; } else if (tile.type == 58 && pickPower < 65) { num = 0; } else if ((tile.type == 226 || tile.type == 237) && pickPower < 210) { num = 0; } else if (Main.tileDungeon[(int)tile.type] && pickPower < 65) { if ((double)x < (double)Main.maxTilesX * 0.35 || (double)x > (double)Main.maxTilesX * 0.65) { num = 0; } } else if (tile.type == 107 && pickPower < 100) { num = 0; } else if (tile.type == 108 && pickPower < 110) { num = 0; } else if (tile.type == 111 && pickPower < 150) { num = 0; } else if (tile.type == 221 && pickPower < 100) { num = 0; } else if (tile.type == 222 && pickPower < 110) { num = 0; } else if (tile.type == 223 && pickPower < 150) { num = 0; } else { TileLoader.PickPowerCheck(tile, pickPower, ref num); } if (tile.type == 147 || tile.type == 0 || tile.type == 40 || tile.type == 53 || tile.type == 57 || tile.type == 59 || tile.type == 123 || tile.type == 224 || tile.type == 397) { num += pickPower; } if (tile.type == 165 || Main.tileRope[(int)tile.type] || tile.type == 199 || Main.tileMoss[(int)tile.type]) { num = 100; } if (hitTile.AddDamage(tileId, num, false) >= 100 && (tile.type == 2 || tile.type == 23 || tile.type == 60 || tile.type == 70 || tile.type == 109 || tile.type == 199 || Main.tileMoss[(int)tile.type])) { num = 0; } if (tile.type == 128 || tile.type == 269) { if (tile.frameX == 18 || tile.frameX == 54) { x--; tile = Main.tile[x, y]; hitTile.UpdatePosition(tileId, x, y); } if (tile.frameX >= 100) { num = 0; Main.blockMouse = true; } } if (tile.type == 334) { if (tile.frameY == 0) { y++; tile = Main.tile[x, y]; hitTile.UpdatePosition(tileId, x, y); } if (tile.frameY == 36) { y--; tile = Main.tile[x, y]; hitTile.UpdatePosition(tileId, x, y); } int i = (int)tile.frameX; bool flag = i >= 5000; bool flag2 = false; if (!flag) { int num2 = i / 18; num2 %= 3; x -= num2; tile = Main.tile[x, y]; if (tile.frameX >= 5000) { flag = true; } } if (flag) { i = (int)tile.frameX; int num3 = 0; while (i >= 5000) { i -= 5000; num3++; } if (num3 != 0) { flag2 = true; } } if (flag2) { num = 0; Main.blockMouse = true; } } if (!WorldGen.CanKillTile(x, y)) { num = 0; } if (hitTile.AddDamage(tileId, num, true) >= 100) { hitTile.Clear(tileId); if (Main.netMode == 2 && Main.tileContainer[(int)Main.tile[x, y].type]) { WorldGen.KillTile(x, y, true, false, false); NetMessage.SendData(17, -1, -1, "", 0, (float)x, (float)y, 1f, 0, 0, 0); if (TileLoader.IsChest((int)Main.tile[x, y].type)) { NetMessage.SendData(34, -1, -1, "", 1, (float)x, (float)y, 0f, 0, 0, 0); } if (TileLoader.IsDresser((int)Main.tile[x, y].type)) { NetMessage.SendData(34, -1, -1, "", 3, (float)x, (float)y, 0f, 0, 0, 0); } } else { int num4 = y; bool flag3 = Main.tile[x, num4].active(); WorldGen.KillTile(x, num4, false, false, false); if (Main.netMode == 2) { NetMessage.SendData(17, -1, -1, "", 0, (float)x, (float)num4, 0f, 0, 0, 0); } } } else { WorldGen.KillTile(x, y, true, false, false); if (Main.netMode == 2) { NetMessage.SendData(17, -1, -1, "", 0, (float)x, (float)y, 1f, 0, 0, 0); } } if (num != 0) { hitTile.Prune(); } }