public void initWorldGen() { LoadGlobalConfig(api); rnd = new Random(api.WorldManager.Seed); chunksize = api.WorldManager.ChunkSize; treeSupplier.LoadTrees(); worldheight = api.WorldManager.MapSizeY; chunkMapSizeY = api.WorldManager.MapSizeY / chunksize; regionChunkSize = api.WorldManager.RegionSize / chunksize; RockBlockIdsByType = new Dictionary <string, int>(); RockStrataConfig rockstrata = api.Assets.Get("worldgen/rockstrata.json").ToObject <RockStrataConfig>(); for (int i = 0; i < rockstrata.Variants.Length; i++) { Block block = api.World.GetBlock(rockstrata.Variants[i].BlockCode); RockBlockIdsByType[block.LastCodePart()] = block.BlockId; } IAsset asset = api.Assets.Get("worldgen/blockpatches.json"); bpc = asset.ToObject <BlockPatchConfig>(); bpc.ResolveBlockIds(api, rockstrata); }
void ResolveBlockIds(ICoreServerAPI api, RockStrataConfig rockstrata) { if (BlockCode != null && BlockCode.Path.Length > 0) { if (BlockCode.Path.Contains("{rocktype}")) { BlockIdMapping = new Dictionary <int, int>(); for (int i = 0; i < rockstrata.Variants.Length; i++) { if (rockstrata.Variants[i].IsDeposit) { continue; } string rocktype = rockstrata.Variants[i].BlockCode.Path.Split('-')[1]; Block rockBlock = api.World.GetBlock(rockstrata.Variants[i].BlockCode); Block typedBlock = api.World.GetBlock(BlockCode.CopyWithPath(BlockCode.Path.Replace("{rocktype}", rocktype))); if (rockBlock != null && typedBlock != null) { BlockIdMapping[rockBlock.BlockId] = typedBlock.BlockId; } } } else { BlockId = api.WorldManager.GetBlockId(BlockCode); } } else { BlockCode = null; } }
public void initWorldGen(int seedDiff) { IAsset asset = api.Assets.Get("worldgen/rockstrata.json"); strata = asset.ToObject <RockStrataConfig>(); for (int i = 0; i < strata.Variants.Length; i++) { strata.Variants[i].Init(api.World); } LoadGlobalConfig(api); chunksize = api.WorldManager.ChunkSize; regionSize = api.WorldManager.RegionSize; chunkRatio = (float)chunksize / regionSize; // Unpadded region noise size in chunks regionChunkSize = regionSize / chunksize; rand = new Random(api.WorldManager.Seed + seedDiff); // Unpadded region noise size in blocks int geoProvRegionNoiseSize = regionSize / TerraGenConfig.geoProvMapScale; // Amount of regions in all of the map regionMapSize = api.WorldManager.MapSizeX / (chunksize * geoProvRegionNoiseSize); rockBlockId = (ushort)api.WorldManager.GetBlockId(new AssetLocation("rock-granite")); worldHeight = api.WorldManager.MapSizeY; distort2dx = new SimplexNoise(new double[] { 14, 9, 6, 3 }, new double[] { 1 / 100.0, 1 / 50.0, 1 / 25.0, 1 / 12.5 }, api.World.SeaLevel + 9876 + seedDiff); distort2dz = new SimplexNoise(new double[] { 14, 9, 6, 3 }, new double[] { 1 / 100.0, 1 / 50.0, 1 / 25.0, 1 / 12.5 }, api.World.SeaLevel + 9877 + seedDiff); strataNoises = new MapLayerCustomPerlin[strata.Variants.Length]; for (int i = 0; i < strataNoises.Length; i++) { RockStratum stratum = strata.Variants[i]; double[] ampls = (double[])stratum.Amplitudes.Clone(); double[] freq = (double[])stratum.Frequencies.Clone(); double[] th = (double[])stratum.Thresholds.Clone(); if (ampls.Length != freq.Length || ampls.Length != th.Length) { throw new ArgumentException(string.Format("Bug in Rock stratum {0}: The list of amplitudes ({1} elements), frequencies ({2} elements) and thresholds ({3} elements) are not of the same length!", i, ampls.Length, freq.Length, th.Length)); } for (int j = 0; j < freq.Length; j++) { freq[j] /= TerraGenConfig.rockStrataOctaveScale; ampls[j] *= api.WorldManager.MapSizeY; th[j] *= api.WorldManager.MapSizeY; } strataNoises[i] = new MapLayerCustomPerlin(api.World.Seed + 23423 + i + seedDiff, ampls, freq, th); } }
public void Init(ICoreServerAPI api, RockStrataConfig rockstrata, Random rnd) { if (NoiseAmplitudes != null && NoiseFrequencies != null) { noise = new ClampedSimplexNoise(NoiseAmplitudes, NoiseFrequencies, rnd.Next()); } ResolveBlockIds(api, rockstrata); }
public void initWorldGen() { regionSize = sapi.WorldManager.RegionSize; chunksize = sapi.World.BlockAccessor.ChunkSize; noiseSizeDensityMap = regionSize / TerraGenConfig.blockPatchesMapScale; LoadGlobalConfig(sapi); rnd = new LCGRandom(sapi.WorldManager.Seed - 87698); chunksize = sapi.WorldManager.ChunkSize; treeSupplier.LoadTrees(); worldheight = sapi.WorldManager.MapSizeY; chunkMapSizeY = sapi.WorldManager.MapSizeY / chunksize; regionChunkSize = sapi.WorldManager.RegionSize / chunksize; RockBlockIdsByType = new Dictionary <string, int>(); RockStrataConfig rockstrata = sapi.Assets.Get("worldgen/rockstrata.json").ToObject <RockStrataConfig>(); for (int i = 0; i < rockstrata.Variants.Length; i++) { Block block = sapi.World.GetBlock(rockstrata.Variants[i].BlockCode); RockBlockIdsByType[block.LastCodePart()] = block.BlockId; } IAsset asset = sapi.Assets.Get("worldgen/blockpatches.json"); bpc = asset.ToObject <BlockPatchConfig>(); var blockpatchesfiles = sapi.Assets.GetMany <BlockPatch[]>(sapi.World.Logger, "worldgen/blockpatches/"); foreach (var patches in blockpatchesfiles.Values) { bpc.Patches = bpc.Patches.Append(patches); } bpc.ResolveBlockIds(sapi, rockstrata, rnd); treeSupplier.treeGenerators.forestFloorSystem.SetBlockPatches(bpc); ITreeAttribute worldConfig = sapi.WorldManager.SaveGame.WorldConfiguration; forestMod = worldConfig.GetString("globalForestation").ToFloat(0); blockPatchMapGens.Clear(); foreach (var patch in bpc.Patches) { if (patch.MapCode == null || blockPatchMapGens.ContainsKey(patch.MapCode)) { continue; } int hs = patch.MapCode.GetHashCode(); int seed = sapi.World.Seed + 112897 + hs; blockPatchMapGens[patch.MapCode] = new MapLayerWobbled(seed, 2, 0.9f, TerraGenConfig.forestMapScale, 4000, -3000); } }
public void Init(ICoreServerAPI api, RockStrataConfig rockstrata, LCGRandom rnd, int i) { List <Block> blocks = new List <Block>(); for (int j = 0; j < blockCodes.Length; j++) { AssetLocation code = blockCodes[j]; if (code.Path.Contains("{rocktype}")) { if (BlocksByRockType == null) { BlocksByRockType = new Dictionary <int, Block[]>(); } for (int k = 0; k < rockstrata.Variants.Length; k++) { string rocktype = rockstrata.Variants[k].BlockCode.Path.Split('-')[1]; AssetLocation rocktypedCode = code.CopyWithPath(code.Path.Replace("{rocktype}", rocktype)); Block rockBlock = api.World.GetBlock(rockstrata.Variants[k].BlockCode); if (rockBlock != null) { BlocksByRockType[rockBlock.BlockId] = new Block[] { api.World.GetBlock(rocktypedCode) }; } } } else { Block block = api.World.GetBlock(code); if (block != null) { blocks.Add(block); } else { api.World.Logger.Warning("Block patch Nr. {0}: Unable to resolve block with code {1}. Will ignore.", i, code); } } } Blocks = blocks.ToArray(); if (BlockCodeIndex == null) { BlockCodeIndex = NatFloat.createUniform(0, Blocks.Length); } if (RandomMapCodePool != null) { int index = rnd.NextInt(RandomMapCodePool.Length); MapCode = RandomMapCodePool[index]; } }
internal void ResolveBlockIds(ICoreServerAPI api, RockStrataConfig rockstrata) { for (int i = 0; i < Patches.Length; i++) { BlockPatch patch = Patches[i]; List <Block> blocks = new List <Block>(); for (int j = 0; j < patch.blockCodes.Length; j++) { AssetLocation code = patch.blockCodes[j]; if (code.Path.Contains("{rocktype}")) { if (patch.BlocksByRockType == null) { patch.BlocksByRockType = new Dictionary <int, Block[]>(); } for (int k = 0; k < rockstrata.Variants.Length; k++) { string rocktype = rockstrata.Variants[k].BlockCode.Path.Split('-')[1]; AssetLocation rocktypedCode = code.CopyWithPath(code.Path.Replace("{rocktype}", rocktype)); Block rockBlock = api.World.GetBlock(rockstrata.Variants[k].BlockCode); if (rockBlock != null) { patch.BlocksByRockType[rockBlock.BlockId] = new Block[] { api.World.GetBlock(rocktypedCode) }; } } } else { Block block = api.World.GetBlock(code); if (block != null) { blocks.Add(block); } else { api.World.Logger.Warning("Block patch Nr. {0}: Unable to resolve block with code {1}. Will ignore.", i, code); } } } patch.Blocks = blocks.ToArray(); if (patch.BlockCodeIndex == null) { patch.BlockCodeIndex = NatFloat.createUniform(0, patch.Blocks.Length); } } }
internal void Init(ICoreServerAPI api) { IAsset asset = api.Assets.Get("worldgen/rockstrata.json"); RockStrataConfig rockstrata = asset.ToObject <RockStrataConfig>(); asset = api.Assets.Get("worldgen/blocklayers.json"); blockLayerConfig = asset.ToObject <BlockLayerConfig>(); blockLayerConfig.ResolveBlockIds(api, rockstrata); for (int i = 0; i < Structures.Length; i++) { LCGRandom rand = new LCGRandom(api.World.Seed + i + 512); Structures[i].Init(api, blockLayerConfig, rand); } }
public void InitWorldGen() { LoadGlobalConfig(api); IAsset asset = api.Assets.Get("worldgen/rockstrata.json"); RockStrataConfig rockstrata = asset.ToObject <RockStrataConfig>(); asset = api.Assets.Get("worldgen/blocklayers.json"); blockLayerConfig = asset.ToObject <BlockLayerConfig>(); blockLayerConfig.ResolveBlockIds(api, rockstrata); rnd = new LCGRandom(api.WorldManager.Seed); grassDensity = new ClampedSimplexNoise(new double[] { 4 }, new double[] { 0.5 }, rnd.NextInt()); grassHeight = new ClampedSimplexNoise(new double[] { 1.5 }, new double[] { 0.5 }, rnd.NextInt()); mapheight = api.WorldManager.MapSizeY; }
/// <summary> /// Loads and caches the BlockLayerConfig if it's not already loaded. Otherwise /// returns the cached value /// </summary> /// <param name="api"></param> /// <returns></returns> public static BlockLayerConfig GetInstance(ICoreServerAPI api) { if (api.ObjectCache.ContainsKey(cacheKey)) { return(api.ObjectCache[cacheKey] as BlockLayerConfig); } else { IAsset asset = api.Assets.Get("worldgen/rockstrata.json"); RockStrataConfig rockstrata = asset.ToObject <RockStrataConfig>(); asset = api.Assets.Get("worldgen/blocklayers.json"); BlockLayerConfig blockLayerConfig = asset.ToObject <BlockLayerConfig>(); blockLayerConfig.ResolveBlockIds(api, rockstrata); api.ObjectCache[cacheKey] = blockLayerConfig; return(blockLayerConfig); } }
internal void ResolveBlockIds(ICoreServerAPI api, RockStrataConfig rockstrata, LCGRandom rnd) { List <BlockPatch> patchesNonTree = new List <BlockPatch>(); for (int i = 0; i < Patches.Length; i++) { BlockPatch patch = Patches[i]; bool handledbyTreegen = patch.Placement == EnumBlockPatchPlacement.OnTrees || patch.Placement == EnumBlockPatchPlacement.UnderTrees; if (!handledbyTreegen) { patchesNonTree.Add(patch); } patch.Init(api, rockstrata, rnd, i); } PatchesNonTree = patchesNonTree.ToArray(); }
public void initWorldGen() { LoadGlobalConfig(api); rand = new LCGRandom(api.WorldManager.Seed - 12); searchSize = 3 * chunksize; mapOffset = chunksize; minBoundary = -chunksize + 1; maxBoundary = 2 * chunksize - 1; mapheight = api.WorldManager.MapSizeY; didCheckPosition = new bool[searchSize * searchSize]; IAsset asset = api.Assets.Get("worldgen/rockstrata.json"); RockStrataConfig rockstrata = asset.ToObject <RockStrataConfig>(); asset = api.Assets.Get("worldgen/blocklayers.json"); BlockLayerConfig blockLayerConfig = asset.ToObject <BlockLayerConfig>(); blockLayerConfig.ResolveBlockIds(api, rockstrata); lakebedLayerConfig = blockLayerConfig.LakeBedLayer; }
public void ResolveBlockIds(ICoreServerAPI api, RockStrataConfig rockstrata) { for (int i = 0; i < Blocklayers.Length; i++) { Random rnd = new Random(api.WorldManager.Seed + i); Blocklayers[i].Init(api, rockstrata, rnd); } SnowLayer.BlockId = api.WorldManager.GetBlockId(SnowLayer.BlockCode); for (int i = 0; i < Tallgrass.BlockCodeByMin.Length; i++) { Tallgrass.BlockCodeByMin[i].BlockId = api.WorldManager.GetBlockId(Tallgrass.BlockCodeByMin[i].BlockCode); } for (int i = 0; i < LakeBedLayer.BlockCodeByMin.Length; i++) { Random rnd = new Random(api.WorldManager.Seed + i); LakeBedLayer.BlockCodeByMin[i].Init(api, rockstrata, rnd); } }
public void Init(ICoreServerAPI api, BlockLayerConfig config, RockStrataConfig rockstrata, LCGRandom rand) { this.rand = rand; List <BlockSchematicStructure[]> schematics = new List <BlockSchematicStructure[]>(); for (int i = 0; i < Schematics.Length; i++) { string error = ""; IAsset[] assets; if (Schematics[i].EndsWith("*")) { assets = api.Assets.GetMany("worldgen/schematics/" + Schematics[i].Substring(0, Schematics[i].Length - 1)).ToArray(); } else { assets = new IAsset[] { api.Assets.Get("worldgen/schematics/" + Schematics[i] + ".json") }; } for (int j = 0; j < assets.Length; j++) { IAsset asset = assets[j]; BlockSchematicStructure schematic = asset.ToObject <BlockSchematicStructure>(); if (schematic == null) { api.World.Logger.Warning("Could not load {0}: {1}", Schematics[i], error); continue; } schematic.FromFileName = asset.Name; BlockSchematicStructure[] rotations = new BlockSchematicStructure[4]; rotations[0] = schematic; for (int k = 0; k < 4; k++) { if (k > 0) { rotations[k] = rotations[0].Clone(); rotations[k].TransformWhilePacked(api.World, EnumOrigin.BottomCenter, k * 90); } rotations[k].blockLayerConfig = config; rotations[k].Init(api.World.BlockAccessor); rotations[k].LoadMetaInformationAndValidate(api.World.BlockAccessor, api.World, schematic.FromFileName); } schematics.Add(rotations); } } this.schematicDatas = schematics.ToArray(); if (ReplaceWithBlocklayers != null) { replaceblockids = new int[ReplaceWithBlocklayers.Length]; for (int i = 0; i < replaceblockids.Length; i++) { Block block = api.World.GetBlock(ReplaceWithBlocklayers[i]); if (block == null) { throw new Exception(string.Format("Schematic with code {0} has replace block layer {1} defined, but no such block found!", Code, ReplaceWithBlocklayers[i])); } else { replaceblockids[i] = block.Id; } } } if (InsideBlockCodes != null) { for (int i = 0; i < InsideBlockCodes.Length; i++) { Block block = api.World.GetBlock(InsideBlockCodes[i]); if (block == null) { throw new Exception(string.Format("Schematic with code {0} has inside block {1} defined, but no such block found!", Code, InsideBlockCodes[i])); } else { insideblockids.Add(block.Id); } } } if (ReplaceWithRockType != null) { resolvedReplaceWithRocktype = new Dictionary <int, Dictionary <int, int> >(); foreach (var val in ReplaceWithRockType) { int sourceBlockId = api.World.GetBlock(val.Key).Id; Dictionary <int, int> blockIdByRockId = new Dictionary <int, int>(); foreach (var strat in rockstrata.Variants) { Block rockBlock = api.World.GetBlock(strat.BlockCode); AssetLocation resolvedLoc = val.Value.Clone(); resolvedLoc.Path = resolvedLoc.Path.Replace("{rock}", rockBlock.LastCodePart()); Block resolvedBlock = api.World.GetBlock(resolvedLoc); if (resolvedBlock != null) { blockIdByRockId[rockBlock.Id] = resolvedBlock.Id; Block quartzBlock = api.World.GetBlock(new AssetLocation("ore-quartz-" + rockBlock.LastCodePart())); if (quartzBlock != null) { blockIdByRockId[quartzBlock.Id] = resolvedBlock.Id; } } } resolvedReplaceWithRocktype[sourceBlockId] = blockIdByRockId; } } }
public void Init(ICoreServerAPI api, RockStrataConfig rockstrata, Random rnd) { ResolveBlockIds(api, rockstrata); }