using System.Collections.Generic;
static int ChunkRadius = 10;
static long SEED = -5739502533733940043;
static bool IncludePlatinumVeins = true;
static string VeinToFind = "Uranium";
static readonly Dictionary<string, int> VeinChance = new Dictionary<string, int>();
static JavaRandom GetRandomWithSeed(int chunkX, int chunkZ, int seed)
return new JavaRandom(SEED + chunkX * chunkX * 4987142 + chunkX * 5947611 + (long) (chunkZ * chunkZ) * 4392871 + chunkZ * 389711 ^ seed);
static int GetVeinWeightTotal()
foreach (var i in VeinChance.Values)
static string GetRandomMineral(int chunkX, int chunkZ)
var r = GetRandomWithSeed(chunkX, chunkZ, 940610);
var weight = Math.Abs(query % GetVeinWeightTotal());
foreach (var kv in VeinChance)
static public void Main(string[] args)
VeinChance.Add("Iron", 25);
VeinChance.Add("Magnetite", 25);
VeinChance.Add("Pyrite", 20);
VeinChance.Add("Bauxite", 20);
VeinChance.Add("Copper", 30);
VeinChance.Add("Cassiterite", 15);
VeinChance.Add("Gold", 20);
VeinChance.Add("Nickel", 20);
if (IncludePlatinumVeins)
VeinChance.Add("Platinum", 5);
VeinChance.Add("Uranium", 10);
VeinChance.Add("Quartzite", 5);
VeinChance.Add("Galena", 15);
VeinChance.Add("Lead", 10);
VeinChance.Add("Silver", 10);
VeinChance.Add("Lapis", 10);
VeinChance.Add("Coal", 25);
int chunkX = (PosX >> 4);
int chunkZ = (PosZ >> 4);
for (int x = -ChunkRadius; x < ChunkRadius; x++)
for (int z = -ChunkRadius; z < ChunkRadius; z++)
var mineral = GetRandomMineral(chunkX + x, chunkZ + z);
if (!string.IsNullOrEmpty(mineral) && (VeinToFind == null || mineral == VeinToFind))
var posX = (chunkX + x) << 4;
var posZ = (chunkZ + z) << 4;
Console.WriteLine("Chunk {0}, {1} has {2}", posX, posZ, mineral);
#region Nested type: JavaRandom
public JavaRandom(long seed)
this.seed = (seed ^ 0x5DEECE66DL) & ((1L << 48) - 1);
public double NextDouble()
return (((long) Next(26) << 27) + Next(27)) / ((double) (1L << 53));
private int Next(int bits)
seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
return (int) (seed >> (48 - bits));