Skip to content

Commit 52a283b

Browse files
committed
Glacio uhh stuff yeah!
1 parent efdaba6 commit 52a283b

18 files changed

Lines changed: 337 additions & 12 deletions

File tree

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.github.ethanicuss.astraladditions.blocks;
2+
3+
import com.github.ethanicuss.astraladditions.util.ModUtils;
4+
import net.minecraft.block.Block;
5+
import net.minecraft.block.BlockState;
6+
import net.minecraft.block.Blocks;
7+
import net.minecraft.block.Material;
8+
import net.minecraft.entity.Entity;
9+
import net.minecraft.entity.FallingBlockEntity;
10+
import net.minecraft.particle.ParticleTypes;
11+
import net.minecraft.server.world.ServerWorld;
12+
import net.minecraft.tag.BlockTags;
13+
import net.minecraft.util.math.BlockPos;
14+
import net.minecraft.world.World;
15+
16+
public class BubbleBlock extends Block {
17+
18+
public BubbleBlock(Settings settings) {
19+
super(settings);
20+
}
21+
22+
public void onSteppedOn(World world, BlockPos pos, BlockState state, Entity entity) {
23+
world.setBlockState(pos, Blocks.AIR.getDefaultState());
24+
ModUtils.spawnForcedParticles((ServerWorld)world, ParticleTypes.BUBBLE, pos.getX(), pos.getY(), pos.getZ(), 10, 0.8, 0.8, 0.8, 0.1);
25+
ModUtils.spawnForcedParticles((ServerWorld)world, ParticleTypes.SPLASH, pos.getX(), pos.getY(), pos.getZ(), 10, 0.8, 0.8, 0.8, 0.1);
26+
27+
super.onSteppedOn(world, pos, state, entity);
28+
}
29+
}

src/main/java/com/github/ethanicuss/astraladditions/blocks/CrackedIceBlock.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@ public CrackedIceBlock(Settings settings) {
2222
}
2323

2424
public void onSteppedOn(World world, BlockPos pos, BlockState state, Entity entity) {
25-
if (canFallThrough(world.getBlockState(pos.down())) && pos.getY() >= world.getBottomY()) {
25+
if (canFallThrough(world.getBlockState(pos.down())) && pos.getY() >= world.getBottomY() && !world.isClient()) {
2626
FallingBlockEntity fallingBlockEntity = FallingBlockEntity.spawnFromBlock(world, pos, state);
27+
ModUtils.spawnForcedParticles((ServerWorld)world, ParticleTypes.SNOWFLAKE, pos.getX(), pos.getY(), pos.getZ(), 20, 0.5, 0.5, 0.5, 0.3);
28+
ModUtils.spawnForcedParticles((ServerWorld)world, ParticleTypes.CAMPFIRE_COSY_SMOKE, pos.getX(), pos.getY(), pos.getZ(), 3, 0.5, 0.5, 0.5, 0);
2729
}
2830

2931
super.onSteppedOn(world, pos, state, entity);
Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,68 @@
11
package com.github.ethanicuss.astraladditions.blocks;
22

3+
import com.github.ethanicuss.astraladditions.entities.ModEntities;
4+
import com.github.ethanicuss.astraladditions.entities.prismatic_geyser.PrismaticGeyserEntity;
5+
import com.github.ethanicuss.astraladditions.entities.shimmerblaze.ShimmerBlazeRainEntity;
36
import com.github.ethanicuss.astraladditions.util.ModUtils;
7+
import io.github.fabricators_of_create.porting_lib.data.SoundDefinition;
48
import net.minecraft.block.Block;
59
import net.minecraft.block.BlockState;
610
import net.minecraft.enchantment.EnchantmentHelper;
711
import net.minecraft.entity.Entity;
812
import net.minecraft.entity.LivingEntity;
913
import net.minecraft.entity.damage.DamageSource;
14+
import net.minecraft.entity.player.PlayerEntity;
1015
import net.minecraft.particle.ParticleTypes;
1116
import net.minecraft.server.world.ServerWorld;
17+
import net.minecraft.sound.SoundCategory;
18+
import net.minecraft.sound.SoundEvent;
19+
import net.minecraft.sound.SoundEvents;
20+
import net.minecraft.util.ActionResult;
21+
import net.minecraft.util.Hand;
22+
import net.minecraft.util.hit.BlockHitResult;
1223
import net.minecraft.util.math.BlockPos;
24+
import net.minecraft.util.math.Box;
25+
import net.minecraft.util.math.MathHelper;
1326
import net.minecraft.world.World;
1427

28+
import java.util.List;
29+
import java.util.Random;
30+
1531
public class GeyserBlock extends Block {
1632

1733
public GeyserBlock(Settings settings) {
1834
super(settings);
1935
}
2036

37+
public ActionResult onUse(BlockState blockState, World world, BlockPos pos, PlayerEntity placedBy, Hand hand, BlockHitResult blockHitResult) {
38+
if (!world.isClient) {
39+
world.playSound(pos.getX(), pos.getY() + 1, pos.getZ(), SoundEvents.ENTITY_GENERIC_EXPLODE, SoundCategory.BLOCKS, 1, 0.5f, true);
40+
}
41+
42+
return ActionResult.PASS;
43+
}
44+
2145
public void onSteppedOn(World world, BlockPos pos, BlockState state, Entity entity) {
22-
if (!entity.isFireImmune() && entity instanceof LivingEntity && !EnchantmentHelper.hasFrostWalker((LivingEntity)entity)) {
23-
entity.damage(DamageSource.HOT_FLOOR, 3.0F);
46+
Box box = new Box(pos.getX(), pos.getY(), pos.getZ(), pos.getX()+1, pos.getY()+1.5, pos.getZ()+1);
47+
List<Entity> ls = world.getOtherEntities(entity, box);
48+
for (Entity p : ls) {
49+
if (p instanceof PrismaticGeyserEntity) {
50+
return;
51+
}
2452
}
25-
entity.addVelocity(0, 1, 0);
53+
54+
PrismaticGeyserEntity geyser = new PrismaticGeyserEntity(ModEntities.PRISMATIC_GEYSER, world);
55+
geyser.setPosition(pos.getX() + 0.5, pos.getY() + 1, pos.getZ() + 0.5);
56+
geyser.refreshPositionAndAngles(pos.getX() + 0.5, pos.getY() + 1, pos.getZ() + 0.5, 0.0f, 0.0f);
57+
world.spawnEntity(geyser);
2658

2759
if (world instanceof ServerWorld) {
28-
ModUtils.spawnForcedParticles((ServerWorld)world, ParticleTypes.BUBBLE, pos.getX(), pos.getY() + 1.5, pos.getZ(), 20, 0.3, 3, 0.3, 0.1);
29-
ModUtils.spawnForcedParticles((ServerWorld)world, ParticleTypes.CLOUD, pos.getX(), pos.getY() + 2, pos.getZ(), 20, 0.5, 4, 0.5, 0.1);
60+
ModUtils.spawnForcedParticles((ServerWorld)world, ParticleTypes.CLOUD, pos.getX() + 0.5, pos.getY() + 1.1, pos.getZ() + 0.5, 10, 0.2, 0.2, 0.2, 0.1);
61+
ModUtils.spawnForcedParticles((ServerWorld)world, ParticleTypes.SNOWFLAKE, entity.getX(), (double)(pos.getY() + 1), entity.getZ(), 1, (double)(MathHelper.nextBetween(world.random, -1.0F, 1.0F) * 0.083333336F), 0.05000000074505806D, (double)(MathHelper.nextBetween(world.random, -1.0F, 1.0F) * 0.083333336F), 0);
62+
3063
}
3164

65+
3266
super.onSteppedOn(world, pos, state, entity);
3367
}
3468
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.github.ethanicuss.astraladditions.effects.frost;
2+
3+
import com.github.ethanicuss.astraladditions.AstralAdditions;
4+
import net.minecraft.block.Blocks;
5+
import net.minecraft.entity.LivingEntity;
6+
import net.minecraft.entity.attribute.AttributeContainer;
7+
import net.minecraft.entity.effect.StatusEffect;
8+
import net.minecraft.entity.effect.StatusEffectCategory;
9+
import net.minecraft.entity.effect.StatusEffectInstance;
10+
import net.minecraft.particle.ParticleTypes;
11+
import net.minecraft.util.math.BlockPos;
12+
import net.minecraft.util.math.MathHelper;
13+
import net.minecraft.util.math.Vec3d;
14+
import net.minecraft.world.World;
15+
import org.slf4j.Logger;
16+
import org.slf4j.LoggerFactory;
17+
18+
import java.util.Random;
19+
20+
21+
public class FrostEffect extends StatusEffect {
22+
23+
public static final Logger LOGGER = LoggerFactory.getLogger(AstralAdditions.MOD_ID);
24+
25+
public FrostEffect(StatusEffectCategory statusEffectCategory, int color) {
26+
super(statusEffectCategory, color);
27+
}
28+
29+
@Override
30+
public void applyUpdateEffect(LivingEntity entity, int amplifier) {
31+
World world = entity.getWorld();
32+
BlockPos pos = entity.getBlockPos();
33+
34+
if (world.isClient) {
35+
Random random = world.getRandom();
36+
boolean bl = entity.lastRenderX != entity.getX() || entity.lastRenderZ != entity.getZ();
37+
if (bl && random.nextBoolean()) {
38+
world.addParticle(ParticleTypes.SNOWFLAKE, entity.getX(), (double)(pos.getY() + 1), entity.getZ(), (double)(MathHelper.nextBetween(random, -1.0F, 1.0F) * 0.083333336F), 0.05000000074505806D, (double)(MathHelper.nextBetween(random, -1.0F, 1.0F) * 0.083333336F));
39+
}
40+
}
41+
42+
entity.setInPowderSnow(true);
43+
}
44+
45+
@Override
46+
public void onRemoved(LivingEntity entity, AttributeContainer attributes, int amplifier) {
47+
48+
}
49+
50+
51+
@Override
52+
public boolean canApplyUpdateEffect(int duration, int amplifier) {
53+
return true;
54+
}
55+
56+
@Override
57+
public boolean isInstant() {
58+
return false;
59+
}
60+
61+
}

src/main/java/com/github/ethanicuss/astraladditions/entities/ModEntities.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import com.github.ethanicuss.astraladditions.entities.moonman.MoonmanEntityRenderer;
2626
import com.github.ethanicuss.astraladditions.entities.phast.PhastEntity;
2727
import com.github.ethanicuss.astraladditions.entities.phast.PhastEntityRenderer;
28+
import com.github.ethanicuss.astraladditions.entities.prismatic_geyser.PrismaticGeyserEntity;
29+
import com.github.ethanicuss.astraladditions.entities.prismatic_geyser.PrismaticGeyserRenderer;
2830
import com.github.ethanicuss.astraladditions.entities.pylon.PylonEntity;
2931
import com.github.ethanicuss.astraladditions.entities.pylon.PylonEntityRenderer;
3032
import com.github.ethanicuss.astraladditions.entities.shimmerblaze.*;
@@ -119,6 +121,11 @@ public class ModEntities {
119121
new Identifier(AstralAdditions.MOD_ID, "shimmer_rain"),
120122
FabricEntityTypeBuilder.create(SpawnGroup.MISC, ShimmerBlazeRainEntity::new).dimensions(EntityDimensions.fixed(1.0f, 5.0f)).build()
121123
);
124+
public static final EntityType<PrismaticGeyserEntity> PRISMATIC_GEYSER = Registry.register(
125+
Registry.ENTITY_TYPE,
126+
new Identifier(AstralAdditions.MOD_ID, "prismatic_geyser"),
127+
FabricEntityTypeBuilder.create(SpawnGroup.MISC, PrismaticGeyserEntity::new).dimensions(EntityDimensions.fixed(1.0f, 5.0f)).build()
128+
);
122129
public static final EntityType<PhastEntity> PHAST = Registry.register(
123130
Registry.ENTITY_TYPE,
124131
new Identifier(AstralAdditions.MOD_ID, "phast"),
@@ -212,6 +219,8 @@ public static void initClient() {
212219

213220
EntityRendererRegistry.register(SHIMMER_RAIN, ShimmerBlazeRainEntityRenderer::new);
214221

222+
EntityRendererRegistry.register(PRISMATIC_GEYSER, PrismaticGeyserRenderer::new);
223+
215224
EntityRendererRegistry.register(SHIMMER_FISHING_BOBBER, ShimmerFishingBobberRenderer::new);
216225

217226
EntityRendererRegistry.register(BOOMERANG, BoomerangEntityRenderer::new);
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package com.github.ethanicuss.astraladditions.entities.prismatic_geyser;
2+
3+
import com.github.ethanicuss.astraladditions.entities.shimmerblaze.ShimmerBlazeEntity;
4+
import com.github.ethanicuss.astraladditions.registry.ModEffects;
5+
import net.minecraft.entity.Entity;
6+
import net.minecraft.entity.EntityType;
7+
import net.minecraft.entity.LivingEntity;
8+
import net.minecraft.entity.damage.DamageSource;
9+
import net.minecraft.entity.data.DataTracker;
10+
import net.minecraft.entity.data.TrackedData;
11+
import net.minecraft.entity.data.TrackedDataHandlerRegistry;
12+
import net.minecraft.entity.effect.StatusEffectInstance;
13+
import net.minecraft.nbt.NbtCompound;
14+
import net.minecraft.network.Packet;
15+
import net.minecraft.network.packet.s2c.play.EntitySpawnS2CPacket;
16+
import net.minecraft.particle.ParticleTypes;
17+
import net.minecraft.util.math.Box;
18+
import net.minecraft.world.World;
19+
20+
import java.util.List;
21+
22+
public class PrismaticGeyserEntity extends Entity {
23+
private static final TrackedData<Integer> AGE = DataTracker.registerData(PrismaticGeyserEntity.class, TrackedDataHandlerRegistry.INTEGER);
24+
25+
public PrismaticGeyserEntity(EntityType<? extends Entity> type, World world) {
26+
super(type, world);
27+
}
28+
29+
public void setAge(int _age){
30+
this.getDataTracker().set(AGE, _age);
31+
}
32+
33+
@Override
34+
public void tick() {
35+
this.getDataTracker().set(AGE, this.getDataTracker().get(AGE)+1);
36+
if (this.getDataTracker().get(AGE) == 10){
37+
for (var i = 0; i < 20; i++) {
38+
this.world.addParticle(ParticleTypes.EFFECT, true, this.getX() - 0.5 + random.nextFloat(), this.getY() + 0.1 + random.nextFloat() * 5, this.getZ() - 0.5 + random.nextFloat(), 0, 2.0, 0);
39+
this.world.addParticle(ParticleTypes.CAMPFIRE_COSY_SMOKE, true, this.getX() - 0.5 + random.nextFloat(), this.getY() + 0.1 + random.nextFloat() * 5, this.getZ() - 0.5 + random.nextFloat(), 0, i/30f, 0);
40+
}
41+
}
42+
if (this.getDataTracker().get(AGE) >= 10){
43+
this.world.addParticle(ParticleTypes.EFFECT, true, this.getX()-0.5 + random.nextFloat(), this.getY() + 0.1 + random.nextFloat()*5, this.getZ()-0.5 + random.nextFloat(), 0, 1.0, 0);
44+
45+
if (this.getDataTracker().get(AGE) < 90) {
46+
Box box = new Box(this.getX() - 0.5, this.getY() - 1, this.getZ() - 0.5, this.getX() + 0.5, this.getY() + 6, this.getZ() + 0.5);
47+
List<Entity> ls = this.world.getOtherEntities(this, box);
48+
for (Entity p : ls) {
49+
if (p instanceof LivingEntity) {
50+
p.damage(DamageSource.FREEZE, 3.0f);
51+
((LivingEntity) p).addStatusEffect(new StatusEffectInstance(ModEffects.FROST, 600, 0), this);
52+
p.setVelocity(0, 1.5, 0);
53+
}
54+
}
55+
}
56+
}
57+
else{
58+
this.world.addParticle(ParticleTypes.CLOUD, true, this.getX(), this.getY() + 0.1, this.getZ(), 0, 0.1, 0);
59+
}
60+
if (this.getDataTracker().get(AGE) >= 120){
61+
this.discard();
62+
}
63+
}
64+
65+
@Override
66+
protected void initDataTracker() {
67+
this.dataTracker.startTracking(AGE, 0);
68+
}
69+
70+
@Override
71+
protected void readCustomDataFromNbt(NbtCompound nbt) {
72+
73+
}
74+
75+
@Override
76+
protected void writeCustomDataToNbt(NbtCompound nbt) {
77+
78+
}
79+
80+
@Override
81+
public Packet<?> createSpawnPacket() {
82+
return new EntitySpawnS2CPacket(this);
83+
}
84+
85+
public int getAge(){
86+
return this.getDataTracker().get(AGE);
87+
}
88+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package com.github.ethanicuss.astraladditions.entities.prismatic_geyser;
2+
3+
import com.github.ethanicuss.astraladditions.AstralAdditions;
4+
import net.fabricmc.api.EnvType;
5+
import net.fabricmc.api.Environment;
6+
import net.minecraft.client.render.OverlayTexture;
7+
import net.minecraft.client.render.RenderLayer;
8+
import net.minecraft.client.render.VertexConsumer;
9+
import net.minecraft.client.render.VertexConsumerProvider;
10+
import net.minecraft.client.render.entity.EntityRenderer;
11+
import net.minecraft.client.render.entity.EntityRendererFactory;
12+
import net.minecraft.client.util.math.MatrixStack;
13+
import net.minecraft.util.Identifier;
14+
import net.minecraft.util.math.BlockPos;
15+
import net.minecraft.util.math.Matrix3f;
16+
import net.minecraft.util.math.Matrix4f;
17+
import net.minecraft.util.math.Vec3f;
18+
19+
@Environment(value= EnvType.CLIENT)
20+
public class PrismaticGeyserRenderer
21+
extends EntityRenderer<PrismaticGeyserEntity> {
22+
private static final Identifier TEXTURE = new Identifier(AstralAdditions.MOD_ID, "textures/entity/prismatic_geyser/prismatic_geyser.png");
23+
private static final RenderLayer LAYER = RenderLayer.getEntityTranslucent(TEXTURE);
24+
25+
public PrismaticGeyserRenderer(EntityRendererFactory.Context context) {
26+
super(context);
27+
}
28+
29+
@Override
30+
protected int getBlockLight(PrismaticGeyserEntity geyser, BlockPos blockPos) {
31+
return 15;
32+
}
33+
34+
@Override
35+
public void render(PrismaticGeyserEntity geyser, float f, float g, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i) {
36+
matrixStack.push();
37+
if (geyser.getAge() < 10){
38+
matrixStack.translate(0, 2, 0);
39+
matrixStack.scale(0, 0, 0);
40+
}
41+
else {
42+
if (geyser.getAge() < 90) {
43+
matrixStack.translate(0, Math.min(((float) geyser.getAge()-10)/10*2, 2), 0);
44+
float width = 2.0f - ((float) geyser.getAge() - 10)/80 + (float)Math.sin(geyser.getAge())/20;
45+
matrixStack.scale(width, Math.min((float) geyser.getAge() - 10, 10.0f), width);
46+
}
47+
else{
48+
matrixStack.translate(0, 2 - Math.min(((float) geyser.getAge()-90)/30*2, 2), 0);
49+
float width = 1.0f - ((float) geyser.getAge() - 90)/30;
50+
matrixStack.scale(width, 10.0f - ((float) geyser.getAge() - 90)/30*10, width);
51+
}
52+
}
53+
matrixStack.multiply(this.dispatcher.getRotation());
54+
matrixStack.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(180.0f));
55+
MatrixStack.Entry entry = matrixStack.peek();
56+
Matrix4f matrix4f = entry.getPositionMatrix();
57+
Matrix3f matrix3f = entry.getNormalMatrix();
58+
VertexConsumer vertexConsumer = vertexConsumerProvider.getBuffer(LAYER);
59+
produceVertex(vertexConsumer, matrix4f, matrix3f, i, 0.0f, 0, 0, 1);
60+
produceVertex(vertexConsumer, matrix4f, matrix3f, i, 1.0f, 0, 1, 1);
61+
produceVertex(vertexConsumer, matrix4f, matrix3f, i, 1.0f, 1, 1, 0);
62+
produceVertex(vertexConsumer, matrix4f, matrix3f, i, 0.0f, 1, 0, 0);
63+
matrixStack.pop();
64+
super.render(geyser, f, g, matrixStack, vertexConsumerProvider, i);
65+
}
66+
67+
private static void produceVertex(VertexConsumer vertexConsumer, Matrix4f positionMatrix, Matrix3f normalMatrix, int light, float x, int y, int textureU, int textureV) {
68+
vertexConsumer.vertex(positionMatrix, x - 0.5f, (float)y - 0.25f, 0.0f).color(255, 255, 255, 255).texture(textureU, textureV).overlay(OverlayTexture.DEFAULT_UV).light(light).normal(normalMatrix, 0.0f, 1.0f, 0.0f).next();
69+
}
70+
71+
@Override
72+
public Identifier getTexture(PrismaticGeyserEntity geyser) {
73+
return TEXTURE;
74+
}
75+
}

src/main/java/com/github/ethanicuss/astraladditions/registry/ModBlocks.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ private static ToIntFunction<BlockState> createLightLevelFromLitBlockState(int l
6060
public static final Block MISSING_BLOCK = new MissingBlock(FabricBlockSettings.of(Material.LAVA).ticksRandomly().sounds(BlockSoundGroup.CROP).collidable(false).nonOpaque().allowsSpawning(ModBlocks::never).suffocates(ModBlocks::never));
6161

6262
public static final Block PRISMATIC_GEYSER_BLOCK = new GeyserBlock(FabricBlockSettings.of(Material.STONE).ticksRandomly().sounds(BlockSoundGroup.STONE).allowsSpawning(ModBlocks::never));
63-
public static final Block CRACKED_ICE_BLOCK = new CrackedIceBlock(FabricBlockSettings.of(Material.ICE).ticksRandomly().sounds(BlockSoundGroup.GLASS).allowsSpawning(ModBlocks::never));
63+
public static final Block CRACKED_ICE_BLOCK = new CrackedIceBlock(FabricBlockSettings.of(Material.ICE).ticksRandomly().sounds(BlockSoundGroup.GLASS).nonOpaque().allowsSpawning(ModBlocks::never).suffocates(ModBlocks::never));
6464

6565
public static final Block ENDERRACK_BLOCK = new Block(FabricBlockSettings.of(Material.STONE).sounds(BlockSoundGroup.NETHERRACK).strength(2.0f));
6666
public static final BlockItem ENDERRACK_ITEM = new BlockItem(ENDERRACK_BLOCK, new FabricItemSettings().group(ItemGroup.BUILDING_BLOCKS));
@@ -173,6 +173,7 @@ public static void registerClient() {
173173
BlockEntityRendererRegistry.register(JAR_BLOCKENTITY, JarBlockEntityRenderer::new);
174174
BlockRenderLayerMap.INSTANCE.putBlock(JAR_BLOCK, RenderLayer.getCutout());
175175
BlockRenderLayerMap.INSTANCE.putBlock(JAR_BLOCK, RenderLayer.getTranslucent());
176+
BlockRenderLayerMap.INSTANCE.putBlock(CRACKED_ICE_BLOCK, RenderLayer.getTranslucent());
176177
BlockRenderLayerMap.INSTANCE.putBlock(ENDER_SPROUT_BLOCK, RenderLayer.getCutout());
177178
BlockRenderLayerMap.INSTANCE.putBlock(ENDER_SPROUT_BLOCK, RenderLayer.getTranslucent());
178179
BlockRenderLayerMap.INSTANCE.putBlock(ENDER_TIP_BLOCK, RenderLayer.getCutout());

0 commit comments

Comments
 (0)