From 65f67f3c57b4363af93ab09f5421f8089e49e704 Mon Sep 17 00:00:00 2001 From: Kevin Chabowski Date: Mon, 12 Aug 2013 14:27:59 +0200 Subject: Added mapper example --- mcmap/examples/mapper/.gitignore | 1 + mcmap/examples/mapper/blockcolors.go | 153 +++++++++++++++++++++++++++++++++++ mcmap/examples/mapper/main.go | 78 ++++++++++++++++++ mcmap/examples/mapper/map.png | Bin 0 -> 2261412 bytes 4 files changed, 232 insertions(+) create mode 100644 mcmap/examples/mapper/.gitignore create mode 100644 mcmap/examples/mapper/blockcolors.go create mode 100644 mcmap/examples/mapper/main.go create mode 100644 mcmap/examples/mapper/map.png (limited to 'mcmap/examples/mapper') diff --git a/mcmap/examples/mapper/.gitignore b/mcmap/examples/mapper/.gitignore new file mode 100644 index 0000000..c60ccd3 --- /dev/null +++ b/mcmap/examples/mapper/.gitignore @@ -0,0 +1 @@ +mapper diff --git a/mcmap/examples/mapper/blockcolors.go b/mcmap/examples/mapper/blockcolors.go new file mode 100644 index 0000000..a714b05 --- /dev/null +++ b/mcmap/examples/mapper/blockcolors.go @@ -0,0 +1,153 @@ +package main + +import ( + "github.com/kch42/gomcmap/mcmap" +) + +type rgb uint32 + +func (x rgb) RGBA() (r, g, b, a uint32) { + a = 0xffff + r = uint32((x >> 16) << 8) + g = uint32(((x >> 8) & 0xff) << 8) + b = uint32((x & 0xff) << 8) + return +} + +var colors = map[mcmap.BlockID]rgb{ + mcmap.BlkStone: 0x666666, + mcmap.BlkGrassBlock: 0x00aa00, + mcmap.BlkDirt: 0x644804, + mcmap.BlkCobblestone: 0x7a7a7a, + mcmap.BlkWoodPlanks: 0xa4721c, + mcmap.BlkBedrock: 0x111111, + mcmap.BlkWater: 0x0000ff, + mcmap.BlkStationaryWater: 0x0000ff, + mcmap.BlkLava: 0xff4400, + mcmap.BlkStationaryLava: 0xff4400, + mcmap.BlkSand: 0xf1ee85, + mcmap.BlkGravel: 0x9ba3a9, + mcmap.BlkGoldOre: 0xffa200, + mcmap.BlkIronOre: 0xe1e1e1, + mcmap.BlkCoalOre: 0x333333, + mcmap.BlkWood: 0xa4721c, + mcmap.BlkLeaves: 0x57a100, + mcmap.BlkGlass: 0xeeeeff, + mcmap.BlkLapisLazuliOre: 0x3114e3, + mcmap.BlkLapisLazuliBlock: 0x3114e3, + mcmap.BlkDispenser: 0x7a7a7a, + mcmap.BlkSandstone: 0xf1ee85, + mcmap.BlkNoteBlock: 0xa4721c, + mcmap.BlkBed: 0xa00000, + mcmap.BlkPoweredRail: 0xff0000, + mcmap.BlkDetectorRail: 0xff0000, + mcmap.BlkStickyPiston: 0x91ba12, + mcmap.BlkCobweb: 0xdddddd, + mcmap.BlkGrass: 0xa0f618, + mcmap.BlkPiston: 0xa4721c, + mcmap.BlkPistonExtension: 0xa4721c, + mcmap.BlkWool: 0xffffff, + mcmap.BlkBlockOfGold: 0xffa200, + mcmap.BlkBlockOfIron: 0xe1e1e1, + mcmap.BlkTNT: 0xa20022, + mcmap.BlkBookshelf: 0xa4721c, + mcmap.BlkMossStone: 0x589b71, + mcmap.BlkObsidian: 0x111144, + mcmap.BlkTorch: 0xffcc00, + mcmap.BlkFire: 0xffcc00, + mcmap.BlkMonsterSpawner: 0x344e6a, + mcmap.BlkOakWoodStairs: 0xa4721c, + mcmap.BlkChest: 0xa4721c, + mcmap.BlkRedstoneWire: 0xff0000, + mcmap.BlkDiamondOre: 0x00fff6, + mcmap.BlkBlockOfDiamond: 0x00fff6, + mcmap.BlkCraftingTable: 0xa4721c, + mcmap.BlkWheat: 0xe7ae00, + mcmap.BlkFarmland: 0x644804, + mcmap.BlkFurnace: 0x7a7a7a, + mcmap.BlkBurningFurnace: 0x7a7a7a, + mcmap.BlkSignPost: 0xa4721c, + mcmap.BlkWoodenDoor: 0xa4721c, + mcmap.BlkLadders: 0xa4721c, + mcmap.BlkRail: 0xdbdbdb, + mcmap.BlkCobblestoneStairs: 0x7a7a7a, + mcmap.BlkWallSign: 0xa4721c, + mcmap.BlkLever: 0xa4721c, + mcmap.BlkStonePressurePlate: 0x666666, + mcmap.BlkIronDoor: 0xe1e1e1, + mcmap.BlkWoodenPressurePlate: 0xa4721c, + mcmap.BlkRedstoneOre: 0xa00000, + mcmap.BlkGlowingRedstoneOre: 0xff0000, + mcmap.BlkRedstoneTorchInactive: 0xff0000, + mcmap.BlkRedstoneTorchActive: 0xff0000, + mcmap.BlkStoneButton: 0x666666, + mcmap.BlkSnow: 0xe5fffe, + mcmap.BlkIce: 0x9fdcff, + mcmap.BlkSnowBlock: 0xe5fffe, + mcmap.BlkCactus: 0x01bc3a, + mcmap.BlkClay: 0x767a82, + mcmap.BlkSugarCane: 0x12db50, + mcmap.BlkJukebox: 0xa4721c, + mcmap.BlkFence: 0xa4721c, + mcmap.BlkPumpkin: 0xff7000, + mcmap.BlkNetherrack: 0x851c2d, + mcmap.BlkSoulSand: 0x796a59, + mcmap.BlkGlowstone: 0xffff00, + mcmap.BlkNetherPortal: 0xff00ff, + mcmap.BlkJackOLantern: 0xff7000, + mcmap.BlkRedstoneRepeaterInactive: 0xff0000, + mcmap.BlkRedstoneRepeaterActive: 0xff0000, + mcmap.BlkTrapdoor: 0xa4721c, + mcmap.BlkStoneBricks: 0x666666, + mcmap.BlkHugeBrownMushroom: 0xb07859, + mcmap.BlkHugeRedMushroom: 0xdd0000, + mcmap.BlkIronBars: 0xe1e1e1, + mcmap.BlkGlassPane: 0xeeeeff, + mcmap.BlkMelon: 0x9ac615, + mcmap.BlkVines: 0x50720d, + mcmap.BlkFenceGate: 0xa4721c, + mcmap.BlkBrickStairs: 0xc42500, + mcmap.BlkStoneBrickStairs: 0x666666, + mcmap.BlkMycelium: 0x7c668c, + mcmap.BlkLilyPad: 0x50720d, + mcmap.BlkNetherBrick: 0xc42500, + mcmap.BlkNetherBrickFence: 0xc42500, + mcmap.BlkNetherBrickStairs: 0xc42500, + mcmap.BlkEnchantmentTable: 0x222244, + mcmap.BlkBrewingStand: 0x666666, + mcmap.BlkCauldron: 0x666666, + mcmap.BlkEndPortal: 0x000000, + mcmap.BlkEndPortalBlock: 0xe0dbce, + mcmap.BlkEndStone: 0xe0dbce, + mcmap.BlkRedstoneLampInactive: 0xffff00, + mcmap.BlkRedstoneLampActive: 0xffff00, + mcmap.BlkSandstoneStairs: 0xf1ee85, + mcmap.BlkEmeraldOre: 0x00c140, + mcmap.BlkEnderChest: 0x222244, + mcmap.BlkBlockOfEmerald: 0x00c140, + mcmap.BlkSpruceWoodStairs: 0xa4721c, + mcmap.BlkBirchWoodStairs: 0xa4721c, + mcmap.BlkJungleWoodStairs: 0xa4721c, + mcmap.BlkCommandBlock: 0xe8ec78, + mcmap.BlkBeacon: 0x00fff6, + mcmap.BlkCobblestoneWall: 0x7a7a7a, + mcmap.BlkCarrots: 0xff6000, + mcmap.BlkPotatoes: 0xc6cd0c, + mcmap.BlkWoodenButton: 0xa4721c, + mcmap.BlkAnvil: 0x444444, + mcmap.BlkTrappedChest: 0xa4721c, + mcmap.BlkRedstoneComparatorInactive: 0xff0000, + mcmap.BlkRedstoneComparatorActive: 0xff0000, + mcmap.BlkBlockOfRedstone: 0xff0000, + mcmap.BlkNetherQuartzOre: 0xe7e7e7, + mcmap.BlkHopper: 0x444444, + mcmap.BlkBlockOfQuartz: 0xe7e7e7, + mcmap.BlkQuartzStairs: 0xe7e7e7, + mcmap.BlkActivatorRail: 0xff0000, + mcmap.BlkDropper: 0x444444, + mcmap.BlkStainedClay: 0x767a82, + mcmap.BlkHayBlock: 0xe7ae00, + mcmap.BlkCarpet: 0xffffff, + mcmap.BlkHardenedClay: 0x767a82, + mcmap.BlkBlockOfCoal: 0x333333, +} diff --git a/mcmap/examples/mapper/main.go b/mcmap/examples/mapper/main.go new file mode 100644 index 0000000..11cc97d --- /dev/null +++ b/mcmap/examples/mapper/main.go @@ -0,0 +1,78 @@ +package main + +import ( + "flag" + "fmt" + "github.com/kch42/gomcmap/mcmap" + "image" + "image/png" + "os" +) + +func main() { + path := flag.String("path", "", "Path to region directory") + output := flag.String("output", "map.png", "File to write image to") + flag.Parse() + + if *path == "" { + flag.Usage() + os.Exit(1) + } + + region, err := mcmap.OpenRegion(*path, true) + if err != nil { + fmt.Fprintf(os.Stderr, "Could not open region: %s\n", err) + os.Exit(1) + } + + xmin, xmax, zmin, zmax := region.MaxDims() + w := (xmax - xmin) * 16 + h := (zmax - zmin) * 16 + img := image.NewRGBA(image.Rect(0, 0, w, h)) + +chunkLoop: + for chunkPos := range region.AllChunks() { + cx, cz := chunkPos.X, chunkPos.Z + chunk, err := region.Chunk(cx, cz) + switch err { + case nil: + case mcmap.NotAvailable: + continue chunkLoop + default: + fmt.Fprintf(os.Stderr, "Error while getting chunk (%d, %d): %s\n", cx, cz, err) + os.Exit(1) + } + + for x := 0; x < 16; x++ { + scanZ: + for z := 0; z < 16; z++ { + ax, az := mcmap.ChunkToBlock(cx, cz, x, z) + for y := 255; y >= 0; y-- { + blk := chunk.Block(x, y, z) + c, ok := colors[blk.ID] + if ok { + img.Set(ax-(xmin*16), az-(zmin*16), c) + continue scanZ + } + } + img.Set(ax-(xmin*16), az-(zmin*16), rgb(0x000000)) + } + } + + if err := region.UnloadChunk(cx, cz); err != nil { + fmt.Fprintf(os.Stderr, "Error while unloading chunk %d, %d: %s\n", cx, cz, err) + os.Exit(1) + } + } + + f, err := os.Create(*output) + if err != nil { + fmt.Fprintf(os.Stderr, "Could not write image: %s", err) + os.Exit(1) + } + defer f.Close() + if err := png.Encode(f, img); err != nil { + fmt.Fprintf(os.Stderr, "Could not write image: %s", err) + os.Exit(1) + } +} diff --git a/mcmap/examples/mapper/map.png b/mcmap/examples/mapper/map.png new file mode 100644 index 0000000..cdba246 Binary files /dev/null and b/mcmap/examples/mapper/map.png differ -- cgit v1.2.3-70-g09d2