private void Decorade(Chunk chunk, int x, int z, PopulationParam populationParam, IDecoration decoration) { if (decoration == null || chunk == null) { return; } int height = populationParam.maxDecorationHeight < heightCap ? populationParam.maxDecorationHeight : heightCap; //找出适合当前装饰品的高度 for (int y = height - 1; y >= populationParam.minDecorationHeight; y--) { BlockType curType = chunk.GetBlock(x, y, z).BlockType; if (curType != BlockType.Air && curType != BlockType.StillWater) { List <CheckCondition> conditions = populationParam.checkConditions; bool canDecorate = CheckConditionMeet(chunk, conditions, x, y, z); if (canDecorate && _random.Range(0, 100) < populationParam.heightGenerateRate) { if (decoration.Decorade(chunk, x, y + 1, z, _random)) { return; } } } } }
public GrowDecoration(GrowDecorationParam paras) { _params = paras; _params.growedTime = 0; _growMark = true; _curDecoration = DecorationFactory.GetDecorationInstance((DecorationType)_params.plantData.decorationType); (_curDecoration as DecorationRemoveBase).isGrow = true; _attachChunk = World.world.GetChunk((int)_params.pos.x, (int)_params.pos.y, (int)_params.pos.z); _curDecoration.Decorade(_attachChunk, (int)_params.loacalPos.x, (int)_params.loacalPos.y, (int)_params.loacalPos.z, _params.random); _growNeedTime = _params.plantData.growTime; }
private void changeToNextState() { _params.growedTime = 0; (_curDecoration as DecorationRemoveBase).removeDecoration(_attachChunk); if (_params.plantData.nextId == 0) { HasActionObjectManager.Instance.plantManager.endGrow(_params.aoId); dispose(); return; } _params.plantData = MTBPlantDataManager.Instance.getData(_params.plantData.nextId); _curDecoration = DecorationFactory.GetDecorationInstance((DecorationType)_params.plantData.decorationType); _curDecoration.Decorade(_attachChunk, (int)_params.loacalPos.x, (int)_params.loacalPos.y, (int)_params.loacalPos.z, _params.random); _growNeedTime = DayNightTime.Instance.normalTimeConfig.daySeconds * _params.plantData.growTime; World.world.CheckAndRecalculateMesh((int)_params.pos.x, (int)_params.pos.y, (int)_params.pos.z, World.world.GetBlock((int)_params.pos.x, (int)_params.pos.y, (int)_params.pos.z)); }