Claim set · data/claims/infiniminer.yaml

Infiniminer v1.5 (source release)

Game: Infiniminer.

Infiniminer v1.5 has two teams, Red and Blue, and four classes: Prospector, Miner, Engineer, and Sapper. infiniminer/teams-and-classes

CodeInfiniminer v1.5 source code · code/InfiniminerClient/PropertyBag.cs#L18-L40public enum PlayerClass … Prospector, Miner, Engineer, Sapper … public enum PlayerTeam … Red, BlueChecked by claude, 2026-10-26 — read the PlayerClass and PlayerTeam enums at the v1.5 commit

Cited by: Infiniminer

In Infiniminer v1.5's client, which sets each class's kit, every class carries a pickaxe and a construction gun. The Prospector adds a prospecting radar, the Engineer a deconstruction gun, and the Sapper a detonator; the Miner has only the two. The Miner can build its team's solid and translucent blocks and ladders; the Prospector adds its team's beacon, and the Sapper explosives. The Engineer builds its team's solid block, both teams' translucent blocks, road, ladder, jump and shock blocks, and its team's beacon and bank. The server never reads the class when a tool is used (see build-no-class-check), so these lists hold only in the client. infiniminer/class-kits

CodeInfiniminer v1.5 source code · code/InfiniminerServer/InfiniminerServer.cs#L542-L567case InfiniminerMessage.UseTool: { Vector3 playerPosition = msgBuffer.ReadVector3(); Vector3 playerHeading = msgBuffer.ReadVector3(); PlayerTools playerTool = (PlayerTools)msgBuffer.ReadByte(); BlockType blockType = (BlockType)msgBuffer.ReadByte(); switch (playerTool) { case PlayerTools.Pickaxe: UsePickaxe(player, playerPosition, playerHeading); break; case PlayerTools.ConstructionGun: …Infiniminer v1.5 source code · code/InfiniminerClient/PropertyBag.cs#L411-L455switch (playerClass) { case PlayerClass.Prospector: playerTools = new PlayerTools[3] { PlayerTools.Pickaxe, PlayerTools.ConstructionGun, PlayerTools.ProspectingRadar }; playerBlocks = new BlockType[4] { playerTeam == PlayerTeam.Red ? BlockType.SolidRed : BlockType.SolidBlue, playerTeam == PlayerTeam.Red ? BlockType.TransRed : BlockType.TransBlue, playerTeam == PlayerTeam.Red ? BlockType.BeaconRed : BlockType.BeaconBlue, BlockType.Ladder }; break; case PlayerClass.Miner: …Checked by claude, 2026-10-26 — read SetPlayerClass's switch, the client's tool and block lists for each class

Cited by: Infiniminer

In Infiniminer v1.5 the Engineer carries up to 350 ore and the other three classes up to 200. The Miner carries up to 8 units of loot (gold and diamonds) and the others up to 4. infiniminer/class-carry

About: Infiniminer Inventory capacity

CodeInfiniminer v1.5 source code · code/InfiniminerServer/InfiniminerServer.cs#L573-L591switch (playerClass) { case PlayerClass.Engineer: player.OreMax = 350; player.WeightMax = 4; break; case PlayerClass.Miner: player.OreMax = 200; player.WeightMax = 8; break; case PlayerClass.Prospector: player.OreMax = 200; …Checked by claude, 2026-10-26 — read the server's SelectClass handler, which sets OreMax and WeightMax per class

Cited by: Infiniminer

In Infiniminer v1.5 the pickaxe reaches 2 blocks along the player's view and removes dirt, ore, gold, and diamond blocks. It doesn't remove rock, lava, or built blocks. A gold or diamond block stays put while the player's loot is full; an ore block is dug even when the player's ore is full, and its ore is lost. infiniminer/pickaxe-dig

About: Infiniminer Destructible terrain

CodeInfiniminer v1.5 source code · code/InfiniminerServer/InfiniminerServer.cs#L851-L852if (!RayCollision(playerPosition, playerHeading, 2, 10, ref hitPoint, ref buildPoint)) return;Infiniminer v1.5 source code · code/InfiniminerServer/InfiniminerServer.cs#L864-L891switch (BlockAtPoint(hitPoint)) { case BlockType.Dirt: case BlockType.DirtSign: removeBlock = true; sound = InfiniminerSound.DigDirt; break; case BlockType.Ore: removeBlock = true; giveOre = 20; sound = InfiniminerSound.DigMetal; break; …Infiniminer v1.5 source code · code/InfiniminerServer/InfiniminerServer.cs#L893-L918if (giveOre > 0) { if (player.Ore < player.OreMax) { player.Ore = Math.Min(player.Ore + giveOre, player.OreMax); SendResourceUpdate(player); } } if (giveWeight > 0) { if (player.Weight < player.WeightMax) { …Checked by claude, 2026-10-26 — read UsePickaxe: RayCollision over 2 units, the switch that sets removeBlock only for Dirt, DirtSign, Ore, Gold, and Diamond, and the full-load branches

Cited by: Infiniminer

In Infiniminer v1.5 an ore block gives the player 20 ore, up to the class's limit. A gold block gives one unit of loot worth $100, and a diamond one unit worth $1,000. infiniminer/pickaxe-yield

About: Infiniminer Resource harvesting

CodeInfiniminer v1.5 source code · code/InfiniminerServer/InfiniminerServer.cs#L872-L890case BlockType.Ore: removeBlock = true; giveOre = 20; sound = InfiniminerSound.DigMetal; break; case BlockType.Gold: removeBlock = true; giveWeight = 1; giveCash = 100; sound = InfiniminerSound.DigMetal; break; case BlockType.Diamond: …Infiniminer v1.5 source code · code/InfiniminerServer/InfiniminerServer.cs#L893-L912if (giveOre > 0) { if (player.Ore < player.OreMax) { player.Ore = Math.Min(player.Ore + giveOre, player.OreMax); SendResourceUpdate(player); } } if (giveWeight > 0) { if (player.Weight < player.WeightMax) { …Checked by claude, 2026-10-26 — read UsePickaxe's giveOre, giveWeight, and giveCash values and how they are added

Cited by: Infiniminer

In Infiniminer v1.5 the construction gun reaches 6 blocks along the player's view and puts the block in the last empty cell before the first solid one it meets. It fails when nothing is in reach, when the player carries less ore than the block costs, when a player stands in the cell (at feet or head height), at the map's edge, or when the surface aimed at is lava. On success it takes the whole cost from the player's ore; a sandbox server charges nothing. infiniminer/build-placement

About: Infiniminer Construction

CodeInfiniminer v1.5 source code · code/InfiniminerServer/InfiniminerServer.cs#L825-L842public bool RayCollision(Vector3 startPosition, Vector3 rayDirection, float distance, int searchGranularity, ref Vector3 hitPoint, ref Vector3 buildPoint) { Vector3 testPos = startPosition; Vector3 buildPos = startPosition; for (int i = 0; i < searchGranularity; i++) { testPos += rayDirection * distance / searchGranularity; BlockType testBlock = BlockAtPoint(testPos); if (testBlock != BlockType.None) { hitPoint = testPos; buildPoint = buildPos; …Infiniminer v1.5 source code · code/InfiniminerServer/InfiniminerServer.cs#L935-L996public void UseConstructionGun(Player player, Vector3 playerPosition, Vector3 playerHeading, BlockType blockType) { bool actionFailed = false; // If there's no surface within range, bail. Vector3 hitPoint = Vector3.Zero; Vector3 buildPoint = Vector3.Zero; if (!RayCollision(playerPosition, playerHeading, 6, 25, ref hitPoint, ref buildPoint)) actionFailed = true; // If the block is too expensive, bail. uint blockCost = BlockInformation.GetCost(blockType); if (sandboxMode) blockCost = 0; …Checked by claude, 2026-10-26 — read RayCollision (buildPoint is the last empty sample before the hit) and UseConstructionGun's five failure tests and its cost deduction

Cited by: Infiniminer

Infiniminer v1.5's server takes the block type from the client's message and checks a placement's cost and space, not the player's class: the lists of blocks each class may build are kept in the client. infiniminer/build-no-class-check

CodeInfiniminer v1.5 source code · code/InfiniminerServer/InfiniminerServer.cs#L542-L555case InfiniminerMessage.UseTool: { Vector3 playerPosition = msgBuffer.ReadVector3(); Vector3 playerHeading = msgBuffer.ReadVector3(); PlayerTools playerTool = (PlayerTools)msgBuffer.ReadByte(); BlockType blockType = (BlockType)msgBuffer.ReadByte(); switch (playerTool) { case PlayerTools.Pickaxe: UsePickaxe(player, playerPosition, playerHeading); break; case PlayerTools.ConstructionGun: …Infiniminer v1.5 source code · code/InfiniminerServer/InfiniminerServer.cs#L935-L972public void UseConstructionGun(Player player, Vector3 playerPosition, Vector3 playerHeading, BlockType blockType) … if (!RayCollision(playerPosition, playerHeading, 6, 25, ref hitPoint, ref buildPoint)) … uint blockCost = BlockInformation.GetCost(blockType); if (sandboxMode) … if (blockCost > player.Ore) … foreach (Player p in playerList.Values) … if ((int)p.Position.X == x && (int)p.Position.Z == z && ((int)p.Position.Y == y || (int)p.Position.Y - 1 == y)) …Infiniminer v1.5 source code · code/InfiniminerClient/PropertyBag.cs#L396-L411public void SetPlayerClass(PlayerClass playerClass) { if (netClient.Status != NetConnectionStatus.Connected) return; this.playerClass = playerClass; NetBuffer msgBuffer = netClient.CreateBuffer(); msgBuffer.Write((byte)InfiniminerMessage.SelectClass); msgBuffer.Write((byte)playerClass); netClient.SendMessage(msgBuffer, NetChannel.ReliableUnordered); playerToolSelected = 0; playerBlockSelected = 0; switch (playerClass)Checked by claude, 2026-10-26 — read the UseTool handler, which passes the client's blockType straight to UseConstructionGun, whose tests never read the player's class; the class's block list is set in the client's SetPlayerClass

Cited by: Infiniminer

In Infiniminer v1.5 a solid block or a road costs 10 ore; a translucent block, a jump block, or a ladder 25; a bank, a beacon, or a shock block 50; and an explosive 100. infiniminer/block-costs

About: Infiniminer Construction

CodeInfiniminer v1.5 source code · code/InfiniminerClient/BlockInformation.cs#L80-L111public static uint GetCost(BlockType blockType) { switch (blockType) { case BlockType.BankRed: case BlockType.BankBlue: case BlockType.BeaconRed: case BlockType.BeaconBlue: return 50; case BlockType.SolidRed: case BlockType.SolidBlue: return 10; …Checked by claude, 2026-10-26 — read BlockInformation.GetCost

Cited by: Infiniminer

In Infiniminer v1.5 the deconstruction gun, which the client offers only in the Engineer's kit, reaches 6 blocks and removes a block the user's own team built: a solid, translucent, road, ladder, jump, shock, beacon, or bank block. It refunds no ore, and it can't remove explosives or the other team's blocks. The server runs it for any client that sends the tool, checking only the block's builder team and type. infiniminer/deconstruction

CodeInfiniminer v1.5 source code · code/InfiniminerServer/InfiniminerServer.cs#L998-L1044public void UseDeconstructionGun(Player player, Vector3 playerPosition, Vector3 playerHeading) { bool actionFailed = false; // If there's no surface within range, bail. Vector3 hitPoint = Vector3.Zero; Vector3 buildPoint = Vector3.Zero; if (!RayCollision(playerPosition, playerHeading, 6, 25, ref hitPoint, ref buildPoint)) actionFailed = true; ushort x = (ushort)hitPoint.X; ushort y = (ushort)hitPoint.Y; ushort z = (ushort)hitPoint.Z; // If this is another team's block, bail. …Infiniminer v1.5 source code · code/InfiniminerServer/InfiniminerServer.cs#L556-L557case PlayerTools.DeconstructionGun: UseDeconstructionGun(player, playerPosition, playerHeading);Infiniminer v1.5 source code · code/InfiniminerClient/PropertyBag.cs#L431-L434case PlayerClass.Engineer: playerTools = new PlayerTools[3] { PlayerTools.Pickaxe, PlayerTools.ConstructionGun, PlayerTools.DeconstructionGun };Checked by claude, 2026-10-26 — re-read at 639c16ed: UseTool dispatches DeconstructionGun with no class test (L556-L557), the client gives it to the Engineer (L431-L434); UseDeconstructionGun: the team test on blockCreatorTeam, the allowed types, and no change to the player's ore

Cited by: Infiniminer

In Infiniminer v1.5 the detonator, which the client offers only in the Sapper's kit, sets off every explosive that player placed. Each clears the 5 × 5 × 5 cube around it of rock, dirt, ore, solid and translucent blocks, ladders, shock and jump blocks, road, and lava, and sets off any explosive inside it. Gold, diamonds, banks, and beacons survive, and so does the map's outermost layer of blocks, which the blast skips. infiniminer/explosives

About: Infiniminer Destructible terrain

CodeInfiniminer v1.5 source code · code/InfiniminerServer/InfiniminerServer.cs#L993-L994if (blockType == BlockType.Explosive) player.ExplosiveList.Add(buildPoint);Infiniminer v1.5 source code · code/InfiniminerServer/InfiniminerServer.cs#L1081-L1126public void DetonateAtPoint(int x, int y, int z) { // Remove the block that is detonating. SetBlock((ushort)(x), (ushort)(y), (ushort)(z), BlockType.None, PlayerTeam.None); // Remove this from any explosive lists it may be in. foreach (Player p in playerList.Values) p.ExplosiveList.Remove(new Vector3(x, y, z)); // Detonate the block. for (int dx = -2; dx <= 2; dx++) for (int dy = -2; dy <= 2; dy++) for (int dz = -2; dz <= 2; dz++) { …Infiniminer v1.5 source code · code/InfiniminerServer/InfiniminerServer.cs#L1137-L1151public void UseDetonator(Player player) { while (player.ExplosiveList.Count > 0) { Vector3 blockPos = player.ExplosiveList[0]; ushort x = (ushort)blockPos.X; ushort y = (ushort)blockPos.Y; ushort z = (ushort)blockPos.Z; if (blockList[x, y, z] != BlockType.Explosive) player.ExplosiveList.RemoveAt(0); else DetonateAtPoint(x, y, z); …Infiniminer v1.5 source code · code/InfiniminerClient/PropertyBag.cs#L446-L449case PlayerClass.Sapper: playerTools = new PlayerTools[3] { PlayerTools.Pickaxe, PlayerTools.ConstructionGun, PlayerTools.Detonator };Checked by claude, 2026-10-26 — re-read at 639c16ed: UseConstructionGun's ExplosiveList entry, DetonateAtPoint's −2..2 loops with the bounds skip at L1096, chain test and destroy list, and UseDetonator

Cited by: Infiniminer

In Infiniminer v1.5 a player looking at their own team's bank from within 2.5 blocks presses 1 to deposit up to 50 ore into the team's shared store, which holds at most 9,999 (ore deposited past that is lost), and 2 to withdraw up to 50, as much as the player has room for. The distance and team check run in the client; the server moves the ore without checking where the player is. infiniminer/bank

About: Infiniminer Resource harvesting

CodeInfiniminer v1.5 source code · code/InfiniminerClient/States/MainGameState.cs#L418-L430// Deposit and withdraw from a bank. if (_P.AtBankTerminal()) { if (key == Keys.D1) { _P.DepositOre(); _P.PlaySound(InfiniminerSound.ClickHigh); } if (key == Keys.D2) { _P.WithdrawOre(); _P.PlaySound(InfiniminerSound.ClickHigh); …Infiniminer v1.5 source code · code/InfiniminerClient/PropertyBag.cs#L577-L592public bool AtBankTerminal() { // Figure out what we're looking at. Vector3 hitPoint = Vector3.Zero; Vector3 buildPoint = Vector3.Zero; if (!blockEngine.RayCollision(playerPosition, playerCamera.GetLookVector(), 2.5f, 25, ref hitPoint, ref buildPoint)) return false; // If it's a valid bank object, we're good! BlockType blockType = blockEngine.BlockAtPoint(hitPoint); if (blockType == BlockType.BankRed && playerTeam == PlayerTeam.Red) return true; if (blockType == BlockType.BankBlue && playerTeam == PlayerTeam.Blue) …Infiniminer v1.5 source code · code/InfiniminerServer/InfiniminerServer.cs#L1153-L1177public void DepositOre(Player player) { uint depositAmount = Math.Min(50, player.Ore); player.Ore -= depositAmount; if (player.Team == PlayerTeam.Red) teamOreRed = Math.Min(teamOreRed + depositAmount, 9999); else teamOreBlue = Math.Min(teamOreBlue + depositAmount, 9999); } public void WithdrawOre(Player player) { if (player.Team == PlayerTeam.Red) …Checked by claude, 2026-10-26 — read the key handler, AtBankTerminal (a 2.5-unit ray to a bank of the player's team), and DepositOre and WithdrawOre, which take only the player

Cited by: Infiniminer

In Infiniminer v1.5 a player's loot is banked on its own once the player is within 8 blocks of the top of the 64-block map: its cash goes to the team and the player's loot empties. The first team to bank the server's winning amount, $10,000 unless the server's config sets another, wins (Blue, if both teams reach it in the same pass), and the server restarts on a new map 10 seconds later. On a sandbox server team cash doesn't count and nobody wins, but banking still adds to the player's own score and empties the player's cash and loot. infiniminer/cash-and-win

About: Infiniminer Resource harvesting

CodeInfiniminer v1.5 source code · code/InfiniminerServer/InfiniminerServer.cs#L26const int MAPSIZE = 64;Infiniminer v1.5 source code · code/InfiniminerServer/InfiniminerServer.cs#L49uint winningCashAmount = 10000;Infiniminer v1.5 source code · code/InfiniminerClient/InfiniminerGame.cs#L35public const int GROUND_LEVEL = 8;Infiniminer v1.5 source code · code/InfiniminerServer/InfiniminerServer.cs#L746-L760public void DepositForPlayers() { foreach (Player p in playerList.Values) { if (p.Position.Y > 64 - InfiniminerGame.GROUND_LEVEL) DepositCash(p); } if (sandboxMode) return; if (teamCashBlue >= winningCashAmount && winningTeam == PlayerTeam.None) winningTeam = PlayerTeam.Blue; if (teamCashRed >= winningCashAmount && winningTeam == PlayerTeam.None) …Infiniminer v1.5 source code · code/InfiniminerServer/InfiniminerServer.cs#L1179-L1199public void DepositCash(Player player) { if (player.Cash <= 0) return; player.Score += player.Cash; if (!sandboxMode) { if (player.Team == PlayerTeam.Red) teamCashRed += player.Cash; else teamCashBlue += player.Cash; SendServerMessage("SERVER: " + player.Handle + " HAS EARNED $" + player.Cash + " FOR THE " + GetTeamName(player.Team) + " TEAM!"); …Infiniminer v1.5 source code · code/InfiniminerServer/InfiniminerServer.cs#L722-L735// Is the game over? if (winningTeam != PlayerTeam.None && !restartTriggered) { BroadcastGameOver(); restartTriggered = true; restartTime = DateTime.Now.AddSeconds(10); } // Restart the server? if (restartTriggered && DateTime.Now > restartTime) { SaveLevel("autosave_" + (UInt64)DateTime.Now.ToBinary() + ".lvl"); netServer.Shutdown("The server is restarting."); …Checked by claude, 2026-10-26 — read DepositForPlayers (Position.Y > 64 − GROUND_LEVEL), DepositCash, the game-over block in the server loop, and winningCashAmount's default

Cited by: Infiniminer

In Infiniminer v1.5 a player who dies, or respawns, drops to no ore, no cash, and no loot. infiniminer/death

CodeInfiniminer v1.5 source code · code/InfiniminerServer/InfiniminerServer.cs#L606-L612case InfiniminerMessage.PlayerDead: { ConsoleWrite("PLAYER_DEAD: " + player.Handle); player.Ore = 0; player.Cash = 0; player.Weight = 0; player.Alive = false;Infiniminer v1.5 source code · code/InfiniminerServer/InfiniminerServer.cs#L630-L636case InfiniminerMessage.PlayerAlive: { ConsoleWrite("PLAYER_ALIVE: " + player.Handle); player.Ore = 0; player.Cash = 0; player.Weight = 0; player.Alive = true;Checked by claude, 2026-10-26 — read the PlayerDead and PlayerAlive handlers

Cited by: Infiniminer

An Infiniminer v1.5 map is a grid 64 blocks on a side that the server generates in order: dirt throughout; ore laid in random walks (10 by default); 16 veins of gold and 16 single diamonds; the layers above ground level cleared except for random mounds of dirt; caves carved by random walks, and more walks steered by a radial gradient (the code's comment: "Carve the map into a sphere"); then rock and, by default, lava. The later steps can carve away or cover some of the gold and diamonds placed earlier. infiniminer/world

CodeInfiniminer v1.5 source code · code/InfiniminerServer/CaveGenerator.cs#L24-L37public static BlockType[, ,] GenerateCaveSystem(int size, bool includeLava, uint oreFactor) { float gradientStrength = (float)randGen.NextDouble(); BlockType[, ,] caveData = CaveGenerator.GenerateConstant(size, BlockType.Dirt); // Add ore. float[, ,] oreNoise = CaveGenerator.GeneratePerlinNoise(32); oreNoise = InterpolateData(ref oreNoise, 32, size); for (int i = 0; i < oreFactor; i++) CaveGenerator.PaintWithRandomWalk(ref caveData, ref oreNoise, size, 1, BlockType.Ore, false); // Add minerals. AddGold(ref caveData, size); AddDiamond(ref caveData, size);Infiniminer v1.5 source code · code/InfiniminerServer/CaveGenerator.cs#L39-L56// Level off everything above ground level, replacing it with mountains. … int numMountains = randGen.Next(size, size * 3); for (int i = 0; i < numMountains; i++) CaveGenerator.PaintWithRandomWalk(ref mountainData, ref mountainNoise, size, randGen.Next(2, 3), BlockType.Dirt, false); … for (int z = 0; z <= InfiniminerGame.GROUND_LEVEL; z++) if (mountainData[x, y, z] == BlockType.None) caveData[x, y, z] = BlockType.None;Infiniminer v1.5 source code · code/InfiniminerServer/CaveGenerator.cs#L58-L71// Carve some caves into the ground. float[, ,] caveNoise = CaveGenerator.GeneratePerlinNoise(32); caveNoise = InterpolateData(ref caveNoise, 32, size); gradient = CaveGenerator.GenerateGradient(size); CaveGenerator.AddDataTo(ref caveNoise, ref gradient, size, 1 - gradientStrength, gradientStrength); int cavesToCarve = randGen.Next(size / 8, size / 2); for (int i = 0; i < cavesToCarve; i++) CaveGenerator.PaintWithRandomWalk(ref caveData, ref caveNoise, size, randGen.Next(1, 2), BlockType.None, false);Infiniminer v1.5 source code · code/InfiniminerServer/CaveGenerator.cs#L73-L78// Add rocks. AddRocks(ref caveData, size); // Add lava. if (includeLava) AddLava(ref caveData, size);Infiniminer v1.5 source code · code/InfiniminerServer/InfiniminerServer.cs#L29-L34uint oreFactor = 10; bool publicServer = false; uint maxPlayers = 16; string serverName = "Unnamed Server"; bool sandboxMode = false; bool includeLava = true;Infiniminer v1.5 source code · code/InfiniminerServer/CaveGenerator.cs#L168-L173public static void AddDiamond(ref BlockType[, ,] data, int size) { CaveInfo += "diamond"; int numDiamonds = 16; for (int i = 0; i < numDiamonds; i++)Infiniminer v1.5 source code · code/InfiniminerServer/CaveGenerator.cs#L190-L196// Gold appears in fairly numerous streaks, located at medium depths. public static void AddGold(ref BlockType[, ,] data, int size) { CaveInfo += "gold"; int numVeins = 16; for (int i = 0; i < numVeins; i++)Checked by claude, 2026-10-26 — re-read GenerateCaveSystem L24-L78 at 639c16ed: the mountain levelling (L39-L56), cave walks, and sphere-gradient walks (L67-L71) run after AddGold and AddDiamond and write None over whatever is there; AddRocks then paints rock; the server's oreFactor and includeLava defaults, AddDiamond's count, and AddGold's vein count

Cited by: Infiniminer

In Infiniminer v1.5 the client only asks: a dig or a build is a message with the player's position, view, tool, and block type, and the server traces the view, changes its copy of the map, and sends the change to every connected player. infiniminer/server-sets-blocks

CodeInfiniminer v1.5 source code · code/InfiniminerServer/InfiniminerServer.cs#L542-L555case InfiniminerMessage.UseTool: { Vector3 playerPosition = msgBuffer.ReadVector3(); Vector3 playerHeading = msgBuffer.ReadVector3(); PlayerTools playerTool = (PlayerTools)msgBuffer.ReadByte(); BlockType blockType = (BlockType)msgBuffer.ReadByte(); switch (playerTool) { case PlayerTools.Pickaxe: UsePickaxe(player, playerPosition, playerHeading); break; case PlayerTools.ConstructionGun: …Infiniminer v1.5 source code · code/InfiniminerServer/InfiniminerServer.cs#L348-L387public void SetBlock(ushort x, ushort y, ushort z, BlockType blockType, PlayerTeam team) … blockList[x, y, z] = blockType; blockCreatorTeam[x, y, z] = team; … msgBuffer.Write((byte)InfiniminerMessage.BlockSet); … foreach (NetConnection netConn in playerList.Keys) … netServer.SendMessage(msgBuffer, netConn, NetChannel.ReliableUnordered);Checked by claude, 2026-10-26 — read the UseTool handler and SetBlock, which writes blockList and sends BlockSet to every connected client

Cited by: Infiniminer

Infiniminer v1.5's pickaxe takes out a dirt, ore, gold, or diamond block with each successful use and can't dig rock at all. In Minecraft today, by the Minecraft Wiki's account, breaking a block takes time set by its hardness and the tool held, stone and metal blocks yield nothing without a pickaxe, and a few blocks such as bedrock can't be broken in Survival. infiniminer/dig-vs-minecraft

WikiInfiniminer v1.5 source code · code/InfiniminerServer/InfiniminerServer.cs#L864-L891switch (BlockAtPoint(hitPoint)) … case BlockType.Dirt: case BlockType.DirtSign: removeBlock = true; … case BlockType.Ore: removeBlock = true; … case BlockType.Gold: removeBlock = true; … …Infiniminer v1.5 source code · code/InfiniminerServer/InfiniminerServer.cs#L914-L918if (removeBlock) { SetBlock(x, y, z, BlockType.None, PlayerTeam.None); PlaySound(sound, player.Position); }Breaking · SpeedThe base time in seconds is the block's hardness multiplied by: 1.5 if the player can harvest the block with the current tool; 5 if the player cannot.Breaking · leadIn particular, to obtain resources from stone or metal-type blocks, the player must use a pickaxe.Gameplay · Gameplay, leadSome blocks cannot be broken in Survival, such as bedrock, End portal frames, command blocks, and barriers.Checked by claude, 2026-10-26 — re-read UsePickaxe at 639c16ed (one call removes the block when removeBlock is set; Rock isn't in the switch); the Minecraft quotes are the minecraft set's, found in the pinned captures

Infiniminer's side is infiniminer/pickaxe-dig (T3); Minecraft's is minecraft/hand-mining and minecraft/blocks (T1).

Cited by: Infiniminer