From b4582640b7a7dd0ba5f3586e02e20d84e2d93288 Mon Sep 17 00:00:00 2001 From: QuImUfu Date: Tue, 13 Aug 2024 08:20:13 +0200 Subject: [PATCH] add colourful pearl and air --- README.md | 2 +- gradle.properties | 4 +- .../colourful_portals/ColourfulAirBlock.java | 153 ++++++++++ .../ColourfulPortalsMod.java | 63 +++- .../ColourfulPortalsModClient.java | 33 --- .../colourful_portals/MixinConfig.java | 2 +- .../colourful_portals/PortalBlock.java | 63 +--- .../client/ColourfulPortalsModClient.java | 57 ++++ .../mixin}/AnimationMixin.java | 6 +- .../AnimationResourceMetadataMixin.java | 4 +- .../AnimationResourceMetadataReaderMixin.java | 4 +- .../client/mixin/MinecraftClientAccessor.java | 11 + .../mixin}/SodiumFluidRendererMixin.java | 4 +- .../mixin}/SpriteContentsMixin.java | 4 +- .../particle/ColourfulAirSparkleParticle.java | 84 ++++++ .../AlphaBlendingAnimator.java | 2 +- .../AlphaInterpolationHolder.java | 2 +- .../fluid}/CommonPortalFluidRenderer.java | 2 +- .../fluid}/CommonPortalFluidRendererV1.java | 2 +- .../fluid}/CommonPortalFluidRendererV2.java | 2 +- .../fluid}/PortalFluidRenderHandler.java | 4 +- .../SodiumPortalFluidRenderHandler.java | 5 +- .../{ => rendering/fluid}/VertexEater.java | 2 +- .../config/ColourfulPortalConfig.java | 93 ++++-- .../entity/ColourfulPearlEntity.java | 268 ++++++++++++++++++ .../general_util/LinkedList.java | 1 - .../general_util/WeightedSelector.java | 33 +++ .../item/ColourfulAirBottleItem.java | 101 +++++++ .../item/ColourfulPearlItem.java | 36 +++ .../BlockChangeAndEntityMovementMixin.java | 21 +- .../portal/PortalHelper.java | 10 +- .../portal/PortalManager.java | 21 ++ .../util/AdditionalMath.java | 17 ++ .../util/CollisionAwareShapeContext.java | 32 --- .../assets/colourful_portals/lang/de_de.json | 23 +- .../assets/colourful_portals/lang/en_us.json | 13 +- .../models/item/colourful_air_bottle.json | 24 ++ .../item/colourful_air_bottle/black.json | 6 + .../item/colourful_air_bottle/blue.json | 6 + .../item/colourful_air_bottle/brown.json | 6 + .../item/colourful_air_bottle/cyan.json | 6 + .../item/colourful_air_bottle/gray.json | 6 + .../item/colourful_air_bottle/green.json | 6 + .../item/colourful_air_bottle/light_blue.json | 6 + .../item/colourful_air_bottle/light_gray.json | 6 + .../item/colourful_air_bottle/lime.json | 6 + .../item/colourful_air_bottle/magenta.json | 6 + .../item/colourful_air_bottle/orange.json | 6 + .../item/colourful_air_bottle/pink.json | 6 + .../item/colourful_air_bottle/purple.json | 6 + .../models/item/colourful_air_bottle/red.json | 6 + .../item/colourful_air_bottle/white.json | 6 + .../item/colourful_air_bottle/yellow.json | 6 + .../models/item/colourful_pearl.json | 6 + .../black_colourful_air_sparkle.json | 12 + .../particles/blue_colourful_air_sparkle.json | 12 + .../brown_colourful_air_sparkle.json | 12 + .../particles/colourful_air_particle.json | 132 +++++++++ .../particles/cyan_colourful_air_sparkle.json | 12 + .../particles/gray_colourful_air_sparkle.json | 12 + .../green_colourful_air_sparkle.json | 12 + .../light_blue_colourful_air_sparkle.json | 12 + .../light_gray_colourful_air_sparkle.json | 12 + .../particles/lime_colourful_air_sparkle.json | 12 + .../magenta_colourful_air_sparkle.json | 12 + .../orange_colourful_air_sparkle.json | 12 + .../particles/pink_colourful_air_sparkle.json | 12 + .../purple_colourful_air_sparkle.json | 12 + .../particles/red_colourful_air_sparkle.json | 12 + .../white_colourful_air_sparkle.json | 12 + .../yellow_colourful_air_sparkle.json | 12 + .../assets/colourful_portals/sounds.json | 11 + .../sounds/teleport_away.ogg | Bin 0 -> 110252 bytes .../textures/item/colourful_pearl.png | Bin 0 -> 572 bytes .../black_colourful_air_0_0.png | Bin 0 -> 362 bytes .../black_colourful_air_0_1.png | Bin 0 -> 358 bytes .../black_colourful_air_1_0.png | Bin 0 -> 358 bytes .../black_colourful_air_1_1.png | Bin 0 -> 358 bytes .../black_colourful_air_2_0.png | Bin 0 -> 358 bytes .../black_colourful_air_2_1.png | Bin 0 -> 358 bytes .../black_colourful_air_3_0.png | Bin 0 -> 362 bytes .../black_colourful_air_3_1.png | Bin 0 -> 358 bytes .../blue_colourful_air_0_0.png | Bin 0 -> 373 bytes .../blue_colourful_air_0_1.png | Bin 0 -> 361 bytes .../blue_colourful_air_1_0.png | Bin 0 -> 365 bytes .../blue_colourful_air_1_1.png | Bin 0 -> 361 bytes .../blue_colourful_air_2_0.png | Bin 0 -> 365 bytes .../blue_colourful_air_2_1.png | Bin 0 -> 353 bytes .../blue_colourful_air_3_0.png | Bin 0 -> 361 bytes .../blue_colourful_air_3_1.png | Bin 0 -> 361 bytes .../brown_colourful_air_0_0.png | Bin 0 -> 358 bytes .../brown_colourful_air_0_1.png | Bin 0 -> 358 bytes .../brown_colourful_air_1_0.png | Bin 0 -> 362 bytes .../brown_colourful_air_1_1.png | Bin 0 -> 362 bytes .../brown_colourful_air_2_0.png | Bin 0 -> 366 bytes .../brown_colourful_air_2_1.png | Bin 0 -> 362 bytes .../brown_colourful_air_3_0.png | Bin 0 -> 366 bytes .../brown_colourful_air_3_1.png | Bin 0 -> 362 bytes .../cyan_colourful_air_0_0.png | Bin 0 -> 357 bytes .../cyan_colourful_air_0_1.png | Bin 0 -> 353 bytes .../cyan_colourful_air_1_0.png | Bin 0 -> 361 bytes .../cyan_colourful_air_1_1.png | Bin 0 -> 361 bytes .../cyan_colourful_air_2_0.png | Bin 0 -> 365 bytes .../cyan_colourful_air_2_1.png | Bin 0 -> 361 bytes .../cyan_colourful_air_3_0.png | Bin 0 -> 365 bytes .../cyan_colourful_air_3_1.png | Bin 0 -> 361 bytes .../green_colourful_air_0_0.png | Bin 0 -> 358 bytes .../green_colourful_air_0_1.png | Bin 0 -> 354 bytes .../green_colourful_air_1_0.png | Bin 0 -> 362 bytes .../green_colourful_air_1_1.png | Bin 0 -> 362 bytes .../green_colourful_air_2_0.png | Bin 0 -> 366 bytes .../green_colourful_air_2_1.png | Bin 0 -> 362 bytes .../green_colourful_air_3_0.png | Bin 0 -> 366 bytes .../green_colourful_air_3_1.png | Bin 0 -> 362 bytes .../grey_colourful_air_0_0.png | Bin 0 -> 357 bytes .../grey_colourful_air_0_1.png | Bin 0 -> 353 bytes .../grey_colourful_air_1_0.png | Bin 0 -> 357 bytes .../grey_colourful_air_1_1.png | Bin 0 -> 361 bytes .../grey_colourful_air_2_0.png | Bin 0 -> 365 bytes .../grey_colourful_air_2_1.png | Bin 0 -> 361 bytes .../grey_colourful_air_3_0.png | Bin 0 -> 361 bytes .../grey_colourful_air_3_1.png | Bin 0 -> 361 bytes .../light_blue_colourful_air_0_0.png | Bin 0 -> 363 bytes .../light_blue_colourful_air_0_1.png | Bin 0 -> 359 bytes .../light_blue_colourful_air_1_0.png | Bin 0 -> 367 bytes .../light_blue_colourful_air_1_1.png | Bin 0 -> 367 bytes .../light_blue_colourful_air_2_0.png | Bin 0 -> 371 bytes .../light_blue_colourful_air_2_1.png | Bin 0 -> 367 bytes .../light_blue_colourful_air_3_0.png | Bin 0 -> 371 bytes .../light_blue_colourful_air_3_1.png | Bin 0 -> 367 bytes .../light_grey_colourful_air_0_0.png | Bin 0 -> 363 bytes .../light_grey_colourful_air_0_1.png | Bin 0 -> 359 bytes .../light_grey_colourful_air_1_0.png | Bin 0 -> 367 bytes .../light_grey_colourful_air_1_1.png | Bin 0 -> 367 bytes .../light_grey_colourful_air_2_0.png | Bin 0 -> 371 bytes .../light_grey_colourful_air_2_1.png | Bin 0 -> 367 bytes .../light_grey_colourful_air_3_0.png | Bin 0 -> 367 bytes .../light_grey_colourful_air_3_1.png | Bin 0 -> 367 bytes .../lime_colourful_air_0_0.png | Bin 0 -> 357 bytes .../lime_colourful_air_0_1.png | Bin 0 -> 353 bytes .../lime_colourful_air_1_0.png | Bin 0 -> 361 bytes .../lime_colourful_air_1_1.png | Bin 0 -> 361 bytes .../lime_colourful_air_2_0.png | Bin 0 -> 365 bytes .../lime_colourful_air_2_1.png | Bin 0 -> 361 bytes .../lime_colourful_air_3_0.png | Bin 0 -> 365 bytes .../lime_colourful_air_3_1.png | Bin 0 -> 361 bytes .../magenta_colourful_air_0_0.png | Bin 0 -> 360 bytes .../magenta_colourful_air_0_1.png | Bin 0 -> 356 bytes .../magenta_colourful_air_1_0.png | Bin 0 -> 364 bytes .../magenta_colourful_air_1_1.png | Bin 0 -> 364 bytes .../magenta_colourful_air_2_0.png | Bin 0 -> 368 bytes .../magenta_colourful_air_2_1.png | Bin 0 -> 364 bytes .../magenta_colourful_air_3_0.png | Bin 0 -> 368 bytes .../magenta_colourful_air_3_1.png | Bin 0 -> 364 bytes .../orange_colourful_air_0_0.png | Bin 0 -> 359 bytes .../orange_colourful_air_0_1.png | Bin 0 -> 355 bytes .../orange_colourful_air_1_0.png | Bin 0 -> 363 bytes .../orange_colourful_air_1_1.png | Bin 0 -> 363 bytes .../orange_colourful_air_2_0.png | Bin 0 -> 367 bytes .../orange_colourful_air_2_1.png | Bin 0 -> 363 bytes .../orange_colourful_air_3_0.png | Bin 0 -> 367 bytes .../orange_colourful_air_3_1.png | Bin 0 -> 363 bytes .../pink_colourful_air_0_0.png | Bin 0 -> 357 bytes .../pink_colourful_air_0_1.png | Bin 0 -> 353 bytes .../pink_colourful_air_1_0.png | Bin 0 -> 361 bytes .../pink_colourful_air_1_1.png | Bin 0 -> 361 bytes .../pink_colourful_air_2_0.png | Bin 0 -> 361 bytes .../pink_colourful_air_2_1.png | Bin 0 -> 361 bytes .../pink_colourful_air_3_0.png | Bin 0 -> 361 bytes .../pink_colourful_air_3_1.png | Bin 0 -> 361 bytes .../purple_colourful_air_0_0.png | Bin 0 -> 359 bytes .../purple_colourful_air_0_1.png | Bin 0 -> 355 bytes .../purple_colourful_air_1_0.png | Bin 0 -> 363 bytes .../purple_colourful_air_1_1.png | Bin 0 -> 363 bytes .../purple_colourful_air_2_0.png | Bin 0 -> 367 bytes .../purple_colourful_air_2_1.png | Bin 0 -> 363 bytes .../purple_colourful_air_3_0.png | Bin 0 -> 367 bytes .../purple_colourful_air_3_1.png | Bin 0 -> 363 bytes .../red_colourful_air_0_0.png | Bin 0 -> 356 bytes .../red_colourful_air_0_1.png | Bin 0 -> 352 bytes .../red_colourful_air_1_0.png | Bin 0 -> 360 bytes .../red_colourful_air_1_1.png | Bin 0 -> 360 bytes .../red_colourful_air_2_0.png | Bin 0 -> 364 bytes .../red_colourful_air_2_1.png | Bin 0 -> 360 bytes .../red_colourful_air_3_0.png | Bin 0 -> 364 bytes .../red_colourful_air_3_1.png | Bin 0 -> 360 bytes .../white_colourful_air_0_0.png | Bin 0 -> 358 bytes .../white_colourful_air_0_1.png | Bin 0 -> 354 bytes .../white_colourful_air_1_0.png | Bin 0 -> 362 bytes .../white_colourful_air_1_1.png | Bin 0 -> 362 bytes .../white_colourful_air_2_0.png | Bin 0 -> 347 bytes .../white_colourful_air_2_1.png | Bin 0 -> 358 bytes .../white_colourful_air_3_0.png | Bin 0 -> 362 bytes .../white_colourful_air_3_1.png | Bin 0 -> 362 bytes .../yellow_colourful_air_0_0.png | Bin 0 -> 359 bytes .../yellow_colourful_air_0_1.png | Bin 0 -> 355 bytes .../yellow_colourful_air_1_0.png | Bin 0 -> 363 bytes .../yellow_colourful_air_1_1.png | Bin 0 -> 363 bytes .../yellow_colourful_air_2_0.png | Bin 0 -> 359 bytes .../yellow_colourful_air_2_1.png | Bin 0 -> 363 bytes .../yellow_colourful_air_3_0.png | Bin 0 -> 367 bytes .../yellow_colourful_air_3_1.png | Bin 0 -> 363 bytes .../colourful_portals.client.mixins.json | 19 ++ .../resources/colourful_portals.mixins.json | 10 +- .../block/colourful_pearl_replaceable.json | 17 ++ .../entity_type/pearl_not_teleportable.json | 9 + src/main/resources/fabric.mod.json | 5 +- 207 files changed, 1492 insertions(+), 213 deletions(-) create mode 100644 src/main/java/quimufu/colourful_portals/ColourfulAirBlock.java delete mode 100644 src/main/java/quimufu/colourful_portals/ColourfulPortalsModClient.java create mode 100644 src/main/java/quimufu/colourful_portals/client/ColourfulPortalsModClient.java rename src/main/java/quimufu/colourful_portals/{mixin/client => client/mixin}/AnimationMixin.java (89%) rename src/main/java/quimufu/colourful_portals/{mixin/client => client/mixin}/AnimationResourceMetadataMixin.java (82%) rename src/main/java/quimufu/colourful_portals/{mixin/client => client/mixin}/AnimationResourceMetadataReaderMixin.java (90%) create mode 100644 src/main/java/quimufu/colourful_portals/client/mixin/MinecraftClientAccessor.java rename src/main/java/quimufu/colourful_portals/{mixin/client => client/mixin}/SodiumFluidRendererMixin.java (90%) rename src/main/java/quimufu/colourful_portals/{mixin/client => client/mixin}/SpriteContentsMixin.java (94%) create mode 100644 src/main/java/quimufu/colourful_portals/client/particle/ColourfulAirSparkleParticle.java rename src/main/java/quimufu/colourful_portals/client/{ => rendering}/AlphaBlendingAnimator.java (98%) rename src/main/java/quimufu/colourful_portals/client/{ => rendering}/AlphaInterpolationHolder.java (78%) rename src/main/java/quimufu/colourful_portals/client/{ => rendering/fluid}/CommonPortalFluidRenderer.java (87%) rename src/main/java/quimufu/colourful_portals/client/{ => rendering/fluid}/CommonPortalFluidRendererV1.java (99%) rename src/main/java/quimufu/colourful_portals/client/{ => rendering/fluid}/CommonPortalFluidRendererV2.java (99%) rename src/main/java/quimufu/colourful_portals/client/{ => rendering/fluid}/PortalFluidRenderHandler.java (96%) rename src/main/java/quimufu/colourful_portals/client/{ => rendering/fluid}/SodiumPortalFluidRenderHandler.java (95%) rename src/main/java/quimufu/colourful_portals/client/{ => rendering/fluid}/VertexEater.java (86%) create mode 100644 src/main/java/quimufu/colourful_portals/entity/ColourfulPearlEntity.java create mode 100644 src/main/java/quimufu/colourful_portals/general_util/WeightedSelector.java create mode 100644 src/main/java/quimufu/colourful_portals/item/ColourfulAirBottleItem.java create mode 100644 src/main/java/quimufu/colourful_portals/item/ColourfulPearlItem.java create mode 100644 src/main/java/quimufu/colourful_portals/util/AdditionalMath.java delete mode 100644 src/main/java/quimufu/colourful_portals/util/CollisionAwareShapeContext.java create mode 100644 src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle.json create mode 100644 src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/black.json create mode 100644 src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/blue.json create mode 100644 src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/brown.json create mode 100644 src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/cyan.json create mode 100644 src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/gray.json create mode 100644 src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/green.json create mode 100644 src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/light_blue.json create mode 100644 src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/light_gray.json create mode 100644 src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/lime.json create mode 100644 src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/magenta.json create mode 100644 src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/orange.json create mode 100644 src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/pink.json create mode 100644 src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/purple.json create mode 100644 src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/red.json create mode 100644 src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/white.json create mode 100644 src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/yellow.json create mode 100644 src/main/resources/assets/colourful_portals/models/item/colourful_pearl.json create mode 100644 src/main/resources/assets/colourful_portals/particles/black_colourful_air_sparkle.json create mode 100644 src/main/resources/assets/colourful_portals/particles/blue_colourful_air_sparkle.json create mode 100644 src/main/resources/assets/colourful_portals/particles/brown_colourful_air_sparkle.json create mode 100644 src/main/resources/assets/colourful_portals/particles/colourful_air_particle.json create mode 100644 src/main/resources/assets/colourful_portals/particles/cyan_colourful_air_sparkle.json create mode 100644 src/main/resources/assets/colourful_portals/particles/gray_colourful_air_sparkle.json create mode 100644 src/main/resources/assets/colourful_portals/particles/green_colourful_air_sparkle.json create mode 100644 src/main/resources/assets/colourful_portals/particles/light_blue_colourful_air_sparkle.json create mode 100644 src/main/resources/assets/colourful_portals/particles/light_gray_colourful_air_sparkle.json create mode 100644 src/main/resources/assets/colourful_portals/particles/lime_colourful_air_sparkle.json create mode 100644 src/main/resources/assets/colourful_portals/particles/magenta_colourful_air_sparkle.json create mode 100644 src/main/resources/assets/colourful_portals/particles/orange_colourful_air_sparkle.json create mode 100644 src/main/resources/assets/colourful_portals/particles/pink_colourful_air_sparkle.json create mode 100644 src/main/resources/assets/colourful_portals/particles/purple_colourful_air_sparkle.json create mode 100644 src/main/resources/assets/colourful_portals/particles/red_colourful_air_sparkle.json create mode 100644 src/main/resources/assets/colourful_portals/particles/white_colourful_air_sparkle.json create mode 100644 src/main/resources/assets/colourful_portals/particles/yellow_colourful_air_sparkle.json create mode 100644 src/main/resources/assets/colourful_portals/sounds.json create mode 100644 src/main/resources/assets/colourful_portals/sounds/teleport_away.ogg create mode 100644 src/main/resources/assets/colourful_portals/textures/item/colourful_pearl.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/black_colourful_air_0_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/black_colourful_air_0_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/black_colourful_air_1_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/black_colourful_air_1_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/black_colourful_air_2_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/black_colourful_air_2_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/black_colourful_air_3_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/black_colourful_air_3_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/blue_colourful_air_0_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/blue_colourful_air_0_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/blue_colourful_air_1_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/blue_colourful_air_1_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/blue_colourful_air_2_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/blue_colourful_air_2_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/blue_colourful_air_3_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/blue_colourful_air_3_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/brown_colourful_air_0_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/brown_colourful_air_0_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/brown_colourful_air_1_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/brown_colourful_air_1_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/brown_colourful_air_2_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/brown_colourful_air_2_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/brown_colourful_air_3_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/brown_colourful_air_3_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/cyan_colourful_air_0_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/cyan_colourful_air_0_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/cyan_colourful_air_1_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/cyan_colourful_air_1_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/cyan_colourful_air_2_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/cyan_colourful_air_2_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/cyan_colourful_air_3_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/cyan_colourful_air_3_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/green_colourful_air_0_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/green_colourful_air_0_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/green_colourful_air_1_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/green_colourful_air_1_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/green_colourful_air_2_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/green_colourful_air_2_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/green_colourful_air_3_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/green_colourful_air_3_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/grey_colourful_air_0_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/grey_colourful_air_0_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/grey_colourful_air_1_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/grey_colourful_air_1_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/grey_colourful_air_2_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/grey_colourful_air_2_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/grey_colourful_air_3_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/grey_colourful_air_3_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/light_blue_colourful_air_0_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/light_blue_colourful_air_0_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/light_blue_colourful_air_1_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/light_blue_colourful_air_1_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/light_blue_colourful_air_2_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/light_blue_colourful_air_2_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/light_blue_colourful_air_3_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/light_blue_colourful_air_3_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/light_grey_colourful_air_0_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/light_grey_colourful_air_0_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/light_grey_colourful_air_1_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/light_grey_colourful_air_1_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/light_grey_colourful_air_2_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/light_grey_colourful_air_2_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/light_grey_colourful_air_3_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/light_grey_colourful_air_3_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/lime_colourful_air_0_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/lime_colourful_air_0_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/lime_colourful_air_1_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/lime_colourful_air_1_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/lime_colourful_air_2_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/lime_colourful_air_2_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/lime_colourful_air_3_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/lime_colourful_air_3_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/magenta_colourful_air_0_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/magenta_colourful_air_0_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/magenta_colourful_air_1_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/magenta_colourful_air_1_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/magenta_colourful_air_2_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/magenta_colourful_air_2_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/magenta_colourful_air_3_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/magenta_colourful_air_3_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/orange_colourful_air_0_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/orange_colourful_air_0_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/orange_colourful_air_1_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/orange_colourful_air_1_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/orange_colourful_air_2_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/orange_colourful_air_2_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/orange_colourful_air_3_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/orange_colourful_air_3_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/pink_colourful_air_0_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/pink_colourful_air_0_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/pink_colourful_air_1_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/pink_colourful_air_1_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/pink_colourful_air_2_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/pink_colourful_air_2_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/pink_colourful_air_3_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/pink_colourful_air_3_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/purple_colourful_air_0_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/purple_colourful_air_0_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/purple_colourful_air_1_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/purple_colourful_air_1_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/purple_colourful_air_2_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/purple_colourful_air_2_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/purple_colourful_air_3_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/purple_colourful_air_3_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/red_colourful_air_0_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/red_colourful_air_0_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/red_colourful_air_1_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/red_colourful_air_1_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/red_colourful_air_2_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/red_colourful_air_2_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/red_colourful_air_3_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/red_colourful_air_3_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/white_colourful_air_0_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/white_colourful_air_0_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/white_colourful_air_1_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/white_colourful_air_1_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/white_colourful_air_2_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/white_colourful_air_2_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/white_colourful_air_3_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/white_colourful_air_3_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/yellow_colourful_air_0_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/yellow_colourful_air_0_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/yellow_colourful_air_1_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/yellow_colourful_air_1_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/yellow_colourful_air_2_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/yellow_colourful_air_2_1.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/yellow_colourful_air_3_0.png create mode 100644 src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/yellow_colourful_air_3_1.png create mode 100644 src/main/resources/colourful_portals.client.mixins.json create mode 100644 src/main/resources/data/colourful_portals/tags/block/colourful_pearl_replaceable.json create mode 100644 src/main/resources/data/colourful_portals/tags/entity_type/pearl_not_teleportable.json diff --git a/README.md b/README.md index 9601697..7596229 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ # Colourful Portals Reimagined -A Fabric Minecraft mod adding colourful portalRepresentations, based on Immersive Portals \ No newline at end of file +A Fabric Minecraft mod adding colourful portals, based on Immersive Portals \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 4054115..968ae96 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,8 +11,8 @@ loader_version=0.15.11 # Mod Properties mod_version=0.9.6 -maven_group=quimufu.colourful-portalRepresentations -archives_base_name=colourful-portalRepresentations +maven_group=quimufu.colourful-portals +archives_base_name=colourful-portals # Dependencies fabric_version=0.100.1+1.21 diff --git a/src/main/java/quimufu/colourful_portals/ColourfulAirBlock.java b/src/main/java/quimufu/colourful_portals/ColourfulAirBlock.java new file mode 100644 index 0000000..a97264a --- /dev/null +++ b/src/main/java/quimufu/colourful_portals/ColourfulAirBlock.java @@ -0,0 +1,153 @@ +package quimufu.colourful_portals; + +import net.minecraft.block.*; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.fluid.Fluid; +import net.minecraft.fluid.FluidState; +import net.minecraft.item.*; +import net.minecraft.item.tooltip.TooltipType; +import net.minecraft.network.packet.s2c.play.ParticleS2CPacket; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.EnumProperty; +import net.minecraft.text.Text; +import net.minecraft.util.DyeColor; +import net.minecraft.util.Hand; +import net.minecraft.util.ItemActionResult; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.random.Random; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.world.BlockView; +import net.minecraft.world.World; +import net.minecraft.world.WorldAccess; +import net.minecraft.world.WorldView; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class ColourfulAirBlock extends Block implements FluidFillable { + public static final EnumProperty DYE_COLOR = EnumProperty.of("colour", DyeColor.class); + + + public ColourfulAirBlock(Settings settings) { + super(settings); + this.setDefaultState(this.stateManager.getDefaultState().with(DYE_COLOR, DyeColor.BLACK)); + } + + @Override + protected ItemActionResult onUseWithItem(ItemStack stack, BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { + if(stack.getItem() == Items.GLASS_BOTTLE){ + ItemStack filledBottle = getPickStack(world, pos, state); + player.setStackInHand(hand, ItemUsage.exchangeStack(stack, player, filledBottle)); + if(!world.isClient){ + world.setBlockState(pos, Blocks.AIR.getDefaultState()); + } + return ItemActionResult.success(world.isClient); + } + return ItemActionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; + } + + @Override + protected void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState oldState, boolean notify) { + scheduleTick(world, pos, true); + } + + + @Override + public void appendTooltip(ItemStack stack, + Item.TooltipContext context, + List tooltip, TooltipType options) { + + DyeColor color = stack.getOrDefault(DataComponentTypes.BASE_COLOR, DyeColor.BLACK); + tooltip.add(Text.translatable("color.minecraft." + color.getName()) + .withColor(color.getEntityColor())); + + } + + @Override + public ItemStack getPickStack(WorldView world, BlockPos pos, BlockState state) { + ItemStack stack = ColourfulPortalsMod.COLOURFUL_AIR_BOTTLE_ITEM.getDefaultStack(); + stack.set(DataComponentTypes.BASE_COLOR, state.get(DYE_COLOR)); + return stack; + } + + @Override + public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos blockPos, ShapeContext shapeContext) { + if (shapeContext.isHolding(Items.DEBUG_STICK) + || shapeContext.isHolding(ColourfulPortalsMod.COLOURFUL_AIR_BOTTLE_ITEM) + || shapeContext.isHolding(Items.GLASS_BOTTLE)) { + return VoxelShapes.fullCube(); + } + return VoxelShapes.empty(); + } + + @Override + protected BlockRenderType getRenderType(BlockState state) { + return BlockRenderType.INVISIBLE; + } + + @Override + protected void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { + scheduleTick(world, pos, false); + } + + @Override + protected void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { + DyeColor dyeColor = state.get(DYE_COLOR); + for (ServerPlayerEntity player : world.getPlayers()) { + double x = pos.getX() + .5D; + double y = pos.getY() + .5D; + double z = pos.getZ() + .5D; + ParticleS2CPacket particleS2CPacket = new ParticleS2CPacket( + ColourfulPortalsMod.COLOURFUL_AIR_PARTICLE_BY_COLOUR.get(dyeColor), + true, + x, y, z, + 0.25F, 0.25F, 0.25F, + 0, + 1); + + world.sendToPlayerIfNearby(player, true, x, y, z, particleS2CPacket); + } + scheduleTick(world, pos, false); + } + + private void scheduleTick(WorldAccess world, BlockPos pos, boolean asap) { + if (!world.isClient() && !world.getBlockTickScheduler().isQueued(pos, this)) { + if(asap){ + world.scheduleBlockTick(pos, this, 2); + } else if (world.getClosestPlayer(pos.getX(),pos.getY(),pos.getZ(),512,false) != null) { + world.scheduleBlockTick(pos, this, 20); + } + } + } + + @Override + public BlockState getPlacementState(ItemPlacementContext ctx) { + DyeColor color = ctx.getStack().getOrDefault(DataComponentTypes.BASE_COLOR, DyeColor.BLACK); + return this.getDefaultState().with(DYE_COLOR, color); + } + + public BlockState getRandomState(Random random) { + DyeColor color = DyeColor.values()[random.nextInt(DyeColor.values().length)]; + return this.getDefaultState().with(DYE_COLOR, color); + } + + @Override + protected void appendProperties(StateManager.Builder builder) { + builder.add(DYE_COLOR); + } + + @Override + public boolean canFillWithFluid(@Nullable PlayerEntity player, BlockView world, BlockPos pos, BlockState state, Fluid fluid) { + return false; + } + + @Override + public boolean tryFillWithFluid(WorldAccess world, BlockPos pos, BlockState state, FluidState fluidState) { + return false; + } +} diff --git a/src/main/java/quimufu/colourful_portals/ColourfulPortalsMod.java b/src/main/java/quimufu/colourful_portals/ColourfulPortalsMod.java index 26182e9..e7e3821 100644 --- a/src/main/java/quimufu/colourful_portals/ColourfulPortalsMod.java +++ b/src/main/java/quimufu/colourful_portals/ColourfulPortalsMod.java @@ -6,33 +6,42 @@ import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; import net.fabricmc.fabric.api.event.registry.FabricRegistryBuilder; import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroupEntries; import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents; +import net.fabricmc.fabric.api.particle.v1.FabricParticleTypes; import net.minecraft.block.AbstractBlock; +import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.enums.NoteBlockInstrument; +import net.minecraft.component.DataComponentTypes; import net.minecraft.entity.EntityType; +import net.minecraft.entity.SpawnGroup; import net.minecraft.item.*; +import net.minecraft.particle.SimpleParticleType; import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.tag.TagKey; import net.minecraft.server.MinecraftServer; import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.sound.SoundEvent; +import net.minecraft.util.DyeColor; import net.minecraft.util.Identifier; import net.minecraft.util.Rarity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.BlockView; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import quimufu.colourful_portals.client.CommonPortalFluidRenderer; -import quimufu.colourful_portals.client.CommonPortalFluidRendererV1; -import quimufu.colourful_portals.client.CommonPortalFluidRendererV2; import quimufu.colourful_portals.config.ColourfulPortalConfig; +import quimufu.colourful_portals.entity.ColourfulPearlEntity; +import quimufu.colourful_portals.general_util.WeightedSelector; +import quimufu.colourful_portals.item.ColourfulAirBottleItem; +import quimufu.colourful_portals.item.ColourfulPearlItem; import quimufu.colourful_portals.portal.*; import quimufu.colourful_portals.portal_fluid.PortalFluid; import quimufu.colourful_portals.portal_fluid.PortalFluidBlock; import quimufu.colourful_portals.portal_fluid.PortalFluidBucketItem; -import java.util.Comparator; -import java.util.HashSet; +import java.util.*; import static quimufu.colourful_portals.Components.PORTAL_CANDIDATE_LIST; import static quimufu.colourful_portals.Components.PORTAL_LIST; @@ -41,17 +50,41 @@ public class ColourfulPortalsMod implements ModInitializer { public static final String MOD_ID = "colourful_portals"; public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); + public static final HashSet PORTAL_BLOCKS = new HashSet<>(); - public static final PortalBlock PORTAL_BLOCK = new PortalBlock(AbstractBlock.Settings.create().instrument(NoteBlockInstrument.HAT).sounds(BlockSoundGroup.GLASS).strength(-1.0f, 3600000.8f).dropsNothing().nonOpaque().luminance((bs) -> 15).allowsSpawning(ColourfulPortalsMod::never).solidBlock(ColourfulPortalsMod::never).suffocates(ColourfulPortalsMod::never).blockVision(ColourfulPortalsMod::never).ticksRandomly()); + public static final ColourfulAirBlock COLOURFUL_AIR = new ColourfulAirBlock(AbstractBlock.Settings.create().instrument(NoteBlockInstrument.HAT).sounds(BlockSoundGroup.GLASS).strength(-1.0f, 3600000.8f).dropsNothing().noCollision().luminance((bs) -> 7).allowsSpawning(ColourfulPortalsMod::never).solidBlock(ColourfulPortalsMod::never).suffocates(ColourfulPortalsMod::never).blockVision(ColourfulPortalsMod::never).ticksRandomly()); + public static final ColourfulAirBottleItem COLOURFUL_AIR_BOTTLE_ITEM = new ColourfulAirBottleItem(COLOURFUL_AIR, new Item.Settings().rarity(Rarity.RARE).component(DataComponentTypes.BASE_COLOR, DyeColor.BLACK)); + + public static final EnumMap COLOURFUL_AIR_PARTICLE_BY_COLOUR; + static { + COLOURFUL_AIR_PARTICLE_BY_COLOUR = new EnumMap<>(DyeColor.class); + for (DyeColor dyeColor : DyeColor.values()) { + COLOURFUL_AIR_PARTICLE_BY_COLOUR.put(dyeColor, FabricParticleTypes.simple(true)); + } + } + + public static final PortalBlock PORTAL_BLOCK = new PortalBlock(AbstractBlock.Settings.create().instrument(NoteBlockInstrument.HAT).sounds(BlockSoundGroup.GLASS).strength(-1.0f, 3600000.8f).dropsNothing().noCollision().luminance((bs) -> 15).allowsSpawning(ColourfulPortalsMod::never).solidBlock(ColourfulPortalsMod::never).suffocates(ColourfulPortalsMod::never).blockVision(ColourfulPortalsMod::never).ticksRandomly()); public static final BlockItem PORTAL_BLOCK_ITEM = new BlockItem(PORTAL_BLOCK, new Item.Settings().rarity(Rarity.EPIC)); + public static final Item BLOB_DARK = new Item(new Item.Settings()); public static final Item BLOB_BRIGHT = new Item(new Item.Settings()); + + public static final Identifier COLOURFUL_PEARL_ID = Identifier.of(MOD_ID, "colourful_pearl"); + public static final Item COLOURFUL_PEARL_ITEM = new ColourfulPearlItem(new Item.Settings().maxCount(8)); + public static final TagKey COLOURFUL_PEARL_REPLACEABLE_BLOCK_TAG = TagKey.of(RegistryKeys.BLOCK, Identifier.of(MOD_ID, "colourful_pearl_replaceable")); + public static final WeightedSelector DIMENSION_WEIGHTS_COLOURFUL_PEARL = new WeightedSelector<>(); + public static final EntityType COLOURFUL_PEARL_ENTITY_TYPE = EntityType.Builder.create(ColourfulPearlEntity::new, SpawnGroup.MISC).dimensions(0.25f, 0.25f).maxTrackingRange(4).trackingTickInterval(10).build(COLOURFUL_PEARL_ID.toString()); + public static final TagKey> COLOURFUL_PEARL_NOT_TELEPORTABLE = TagKey.of(RegistryKeys.ENTITY_TYPE, Identifier.of(MOD_ID, "pearl_not_teleportable")); + + public static final SoundEvent TELEPORT_AWAY_SOUND = SoundEvent.of(Identifier.of(MOD_ID, "entity.colourful_pearl.teleport_away")); + + public static final PortalFluid PORTAL_FLUID = new PortalFluid(); public static final PortalFluidBlock PORTAL_FLUID_BLOCk = new PortalFluidBlock(PORTAL_FLUID, AbstractBlock.Settings.create().sounds(BlockSoundGroup.INTENTIONALLY_EMPTY).luminance((bs) -> 15).noCollision().strength(100.0f).dropsNothing()); public static final BucketItem PORTAL_FLUID_BUCKET_ITEM = new PortalFluidBucketItem(PORTAL_FLUID, new Item.Settings().recipeRemainder(Items.BUCKET).maxCount(1).rarity(Rarity.RARE)); - public static PortalManager PORTAL_MANAGER; + public static PortalManager PORTAL_MANAGER; public static final RegistryKey> PORTAL_LINKING_SYSTEM_BUILDER_REGISTRY_KEY = RegistryKey.ofRegistry(Identifier.of(MOD_ID, "portal_linking_system")); public static final Registry PORTAL_LINKING_SYSTEM_BUILDER_REGISTRY = FabricRegistryBuilder.createSimple(PORTAL_LINKING_SYSTEM_BUILDER_REGISTRY_KEY).buildAndRegister(); @@ -74,6 +107,10 @@ public class ColourfulPortalsMod implements ModInitializer { if (!ColourfulPortalConfig.disableImmersivePortals && hasImmPtl()) { Registry.register(PORTAL_LINKING_SYSTEM_BUILDER_REGISTRY, ImmersivePortalsLinkingSystem.IMMERSIVE_PORTALS_LINKING_SYSTEM, new PrioritizedPortalLinkingSystemBuilder(ImmersivePortalsLinkingSystem::new, 100)); } + for (Map.Entry entry : COLOURFUL_AIR_PARTICLE_BY_COLOUR.entrySet()) { + Registry.register(Registries.PARTICLE_TYPE, Identifier.of(MOD_ID, entry.getKey().getName() + "_colourful_air_sparkle"), entry.getValue()); + } + Registry.register(PORTAL_LINKING_SYSTEM_BUILDER_REGISTRY, DefaultLinkingSystem.DEFAULT_LINKING_SYSTEM, new PrioritizedPortalLinkingSystemBuilder(DefaultLinkingSystem::new, 90)); Identifier identifier = Identifier.of(MOD_ID, "portal_block"); @@ -81,6 +118,14 @@ public class ColourfulPortalsMod implements ModInitializer { Registry.register(Registries.BLOCK, identifier, PORTAL_BLOCK); Registry.register(Registries.ITEM, identifier, PORTAL_BLOCK_ITEM); + Registry.register(Registries.BLOCK, Identifier.of(MOD_ID, "colourful_air"), COLOURFUL_AIR); + Registry.register(Registries.ITEM, Identifier.of(MOD_ID, "colourful_air_bottle"), COLOURFUL_AIR_BOTTLE_ITEM); + + + Registry.register(Registries.ENTITY_TYPE, COLOURFUL_PEARL_ID, COLOURFUL_PEARL_ENTITY_TYPE); + Registry.register(Registries.ITEM, COLOURFUL_PEARL_ID, COLOURFUL_PEARL_ITEM); + Registry.register(Registries.SOUND_EVENT, TELEPORT_AWAY_SOUND.getId(), TELEPORT_AWAY_SOUND); + Registry.register(Registries.ITEM, Identifier.of(MOD_ID, "portal_fluid_bucket"), PORTAL_FLUID_BUCKET_ITEM); Registry.register(Registries.FLUID, Identifier.of(MOD_ID, "portal_fluid"), PORTAL_FLUID); Registry.register(Registries.BLOCK, Identifier.of(MOD_ID, "portal_fluid_block"), PORTAL_FLUID_BLOCk); @@ -104,6 +149,10 @@ public class ColourfulPortalsMod implements ModInitializer { LOGGER.info(id); PORTAL_BLOCKS.add(Identifier.tryParse(id)); } + DIMENSION_WEIGHTS_COLOURFUL_PEARL.clear(); + for (Map.Entry weight : ColourfulPortalConfig.pearlDimensionWeights.entrySet()) { + DIMENSION_WEIGHTS_COLOURFUL_PEARL.add(Identifier.of(weight.getKey()),weight.getValue()); + } } private boolean hasImmPtl() { diff --git a/src/main/java/quimufu/colourful_portals/ColourfulPortalsModClient.java b/src/main/java/quimufu/colourful_portals/ColourfulPortalsModClient.java deleted file mode 100644 index dd3cb72..0000000 --- a/src/main/java/quimufu/colourful_portals/ColourfulPortalsModClient.java +++ /dev/null @@ -1,33 +0,0 @@ -package quimufu.colourful_portals; - -import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; -import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandlerRegistry; -import net.minecraft.client.render.RenderLayer; -import quimufu.colourful_portals.client.CommonPortalFluidRenderer; -import quimufu.colourful_portals.client.CommonPortalFluidRendererV1; -import quimufu.colourful_portals.client.CommonPortalFluidRendererV2; -import quimufu.colourful_portals.client.PortalFluidRenderHandler; -import quimufu.colourful_portals.config.ColourfulPortalConfig; - -public class ColourfulPortalsModClient implements ClientModInitializer { - public static ThreadLocal FLUID_RENDERER = ThreadLocal.withInitial(CommonPortalFluidRendererV2::new); - - public void onInitializeClient() { - BlockRenderLayerMap.INSTANCE.putBlock(ColourfulPortalsMod.PORTAL_BLOCK, RenderLayer.getTranslucent()); - BlockRenderLayerMap.INSTANCE.putFluid(ColourfulPortalsMod.PORTAL_FLUID, RenderLayer.getTranslucent()); - FluidRenderHandlerRegistry.INSTANCE.register(ColourfulPortalsMod.PORTAL_FLUID, new PortalFluidRenderHandler()); - ColourfulPortalConfig.registerListener(this::onConfigUpdate); - onConfigUpdate(); - } - - private void onConfigUpdate() { - if(ColourfulPortalConfig.blockyPortalFluid){ - FLUID_RENDERER = ThreadLocal.withInitial(CommonPortalFluidRendererV1::new); - } else { - FLUID_RENDERER = ThreadLocal.withInitial(CommonPortalFluidRendererV2::new); - } - - } - -} \ No newline at end of file diff --git a/src/main/java/quimufu/colourful_portals/MixinConfig.java b/src/main/java/quimufu/colourful_portals/MixinConfig.java index b9ac9e3..f5035e2 100644 --- a/src/main/java/quimufu/colourful_portals/MixinConfig.java +++ b/src/main/java/quimufu/colourful_portals/MixinConfig.java @@ -14,7 +14,7 @@ public class MixinConfig implements IMixinConfigPlugin { private static final Supplier TRUE = () -> true; private static final Map> CONDITIONS = Map.of( - "quimufu.colourful_portals.mixin.client.SodiumFluidRendererMixin", () -> FabricLoader.getInstance().isModLoaded("sodium") + "quimufu.colourful_portals.client.mixin.SodiumFluidRendererMixin", () -> FabricLoader.getInstance().isModLoaded("sodium") ); @Override diff --git a/src/main/java/quimufu/colourful_portals/PortalBlock.java b/src/main/java/quimufu/colourful_portals/PortalBlock.java index f93cf2c..6aa1a14 100644 --- a/src/main/java/quimufu/colourful_portals/PortalBlock.java +++ b/src/main/java/quimufu/colourful_portals/PortalBlock.java @@ -4,7 +4,6 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.FluidFillable; import net.minecraft.block.ShapeContext; -import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.FluidState; @@ -23,7 +22,6 @@ import net.minecraft.world.BlockView; import net.minecraft.world.World; import net.minecraft.world.WorldAccess; import org.jetbrains.annotations.Nullable; -import quimufu.colourful_portals.util.CollisionAwareShapeContext; import static quimufu.colourful_portals.ColourfulPortalsMod.PORTAL_MANAGER; @@ -67,60 +65,12 @@ public class PortalBlock extends Block implements FluidFillable { if (shapeContext.isHolding(Items.DEBUG_STICK) || shapeContext.isHolding(ColourfulPortalsMod.PORTAL_BLOCK_ITEM) || shapeContext.isHolding(ColourfulPortalsMod.PORTAL_FLUID_BUCKET_ITEM)) { - return switch (state.get(AXIS)) { - case Z -> Z_AABB; - case Y -> Y_AABB; - default -> X_AABB; - }; + return getShape(state); } return VoxelShapes.empty(); } - protected void onEntityCollisionOld(BlockState state, World world, BlockPos pos, Entity entity) { - ColourfulPortalsMod.LOGGER.info("detected collision {}", entity.getType()); - if (entity.getBoundingBox() - .intersects(getShape(state, world, pos).getBoundingBox())) { - Vec3d vec3d = new Vec3d(0.5, 0.5f, 0.5); - entity.slowMovement(state, vec3d); - } - Vec3d entityPos = entity.getPos(); - Vec3d prevEntityPos = new Vec3d(entity.prevX, entity.prevY, entity.prevZ); - if(entityPos.equals(prevEntityPos) && entity.getVelocity().squaredDistanceTo(Vec3d.ZERO) >= 0.01D){ - //in this case, the collision logic was called prior to the movement logic, - // so we'll have to calculate our own next postion - entityPos = entityPos.add(entity.getVelocity()); - } - Vec3d movement = entityPos.subtract(prevEntityPos); - if (world instanceof ServerWorld) { - Direction.Axis axis = state.get(AXIS); - double centerPosAlongAxis = pos.toCenterPos().getComponentAlongAxis(axis); - double entityPosAlongAxis = entityPos.getComponentAlongAxis(axis); - double prevEntityPosAlongAxis = prevEntityPos.getComponentAlongAxis(axis); - double movementAlongAxis = entityPosAlongAxis - prevEntityPosAlongAxis; - if (prevEntityPosAlongAxis > entityPosAlongAxis) { - if (entityPosAlongAxis < centerPosAlongAxis - && prevEntityPosAlongAxis >= centerPosAlongAxis) { - double plainHitAfter = (centerPosAlongAxis - entityPosAlongAxis) / movementAlongAxis; - Vec3d planeHitPoint = entityPos.add(movement.multiply(plainHitAfter)); - if (Box.from(new BlockBox(pos)).contains(planeHitPoint)) { - PORTAL_MANAGER.onPortalPassed(entity, pos, (ServerWorld) world, axis); - } - } - } else if (prevEntityPosAlongAxis < entityPosAlongAxis) { - if (entityPosAlongAxis > centerPosAlongAxis - && prevEntityPosAlongAxis <= centerPosAlongAxis) { - double plainHitAfter = (centerPosAlongAxis - entityPosAlongAxis) / movementAlongAxis; - Vec3d planeHitPoint = entityPos.add(movement.multiply(plainHitAfter)); - if (Box.from(new BlockBox(pos)).contains(planeHitPoint)) { - PORTAL_MANAGER.onPortalPassed(entity, pos, (ServerWorld) world, axis); - } - } - } - } - - } - - public VoxelShape getShape(BlockState state, BlockView world, BlockPos pos) { + public VoxelShape getShape(BlockState state) { return switch (state.get(AXIS)) { case Z -> Z_AABB; case Y -> Y_AABB; @@ -128,14 +78,6 @@ public class PortalBlock extends Block implements FluidFillable { }; } - @Override - public VoxelShape getCollisionShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { - if (context instanceof CollisionAwareShapeContext) { - return getShape(state, world, pos); - } - return VoxelShapes.empty(); - } - @Override public BlockState rotate(BlockState state, BlockRotation rotation) { return changeRotation(state, rotation); @@ -159,7 +101,6 @@ public class PortalBlock extends Block implements FluidFillable { public BlockState getStateWith(DyeColor color, Direction.Axis axis) { return this.getDefaultState().with(AXIS, axis).with(DYE_COLOR, color); - } @Override diff --git a/src/main/java/quimufu/colourful_portals/client/ColourfulPortalsModClient.java b/src/main/java/quimufu/colourful_portals/client/ColourfulPortalsModClient.java new file mode 100644 index 0000000..8f01759 --- /dev/null +++ b/src/main/java/quimufu/colourful_portals/client/ColourfulPortalsModClient.java @@ -0,0 +1,57 @@ +package quimufu.colourful_portals.client; + +import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; +import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry; +import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandlerRegistry; +import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry; +import net.minecraft.client.item.ModelPredicateProviderRegistry; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.entity.FlyingItemEntityRenderer; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.particle.SimpleParticleType; +import net.minecraft.util.DyeColor; +import net.minecraft.util.Identifier; +import quimufu.colourful_portals.ColourfulPortalsMod; +import quimufu.colourful_portals.client.particle.ColourfulAirSparkleParticle; +import quimufu.colourful_portals.client.rendering.fluid.CommonPortalFluidRenderer; +import quimufu.colourful_portals.client.rendering.fluid.CommonPortalFluidRendererV1; +import quimufu.colourful_portals.client.rendering.fluid.CommonPortalFluidRendererV2; +import quimufu.colourful_portals.client.rendering.fluid.PortalFluidRenderHandler; +import quimufu.colourful_portals.config.ColourfulPortalConfig; + +import java.util.Map; + +public class ColourfulPortalsModClient implements ClientModInitializer { + public static ThreadLocal FLUID_RENDERER = ThreadLocal.withInitial(CommonPortalFluidRendererV2::new); + + public void onInitializeClient() { + BlockRenderLayerMap.INSTANCE.putBlock(ColourfulPortalsMod.PORTAL_BLOCK, RenderLayer.getTranslucent()); + BlockRenderLayerMap.INSTANCE.putBlock(ColourfulPortalsMod.COLOURFUL_AIR, RenderLayer.getTranslucent()); + BlockRenderLayerMap.INSTANCE.putFluid(ColourfulPortalsMod.PORTAL_FLUID, RenderLayer.getTranslucent()); + FluidRenderHandlerRegistry.INSTANCE.register(ColourfulPortalsMod.PORTAL_FLUID, new PortalFluidRenderHandler()); + + EntityRendererRegistry.register(ColourfulPortalsMod.COLOURFUL_PEARL_ENTITY_TYPE, FlyingItemEntityRenderer::new); + + ColourfulPortalConfig.registerListener(this::onConfigUpdate); + onConfigUpdate(); + + + for (Map.Entry entry : ColourfulPortalsMod.COLOURFUL_AIR_PARTICLE_BY_COLOUR.entrySet()) { + ParticleFactoryRegistry.getInstance() + .register(entry.getValue(), ColourfulAirSparkleParticle::create); + } + ModelPredicateProviderRegistry.register(ColourfulPortalsMod.COLOURFUL_AIR_BOTTLE_ITEM, Identifier.of(ColourfulPortalsMod.MOD_ID,"color_id"),((stack, world, entity, seed) -> stack.getOrDefault(DataComponentTypes.BASE_COLOR, DyeColor.BLACK).getId())); + + } + + private void onConfigUpdate() { + if (ColourfulPortalConfig.blockyPortalFluid) { + FLUID_RENDERER = ThreadLocal.withInitial(CommonPortalFluidRendererV1::new); + } else { + FLUID_RENDERER = ThreadLocal.withInitial(CommonPortalFluidRendererV2::new); + } + + } + +} \ No newline at end of file diff --git a/src/main/java/quimufu/colourful_portals/mixin/client/AnimationMixin.java b/src/main/java/quimufu/colourful_portals/client/mixin/AnimationMixin.java similarity index 89% rename from src/main/java/quimufu/colourful_portals/mixin/client/AnimationMixin.java rename to src/main/java/quimufu/colourful_portals/client/mixin/AnimationMixin.java index 1e7118c..c6175ab 100644 --- a/src/main/java/quimufu/colourful_portals/mixin/client/AnimationMixin.java +++ b/src/main/java/quimufu/colourful_portals/client/mixin/AnimationMixin.java @@ -1,4 +1,4 @@ -package quimufu.colourful_portals.mixin.client; +package quimufu.colourful_portals.client.mixin; import net.minecraft.client.texture.Animator; import net.minecraft.client.texture.SpriteContents; @@ -10,8 +10,8 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import quimufu.colourful_portals.client.AlphaBlendingAnimator; -import quimufu.colourful_portals.client.AlphaInterpolationHolder; +import quimufu.colourful_portals.client.rendering.AlphaBlendingAnimator; +import quimufu.colourful_portals.client.rendering.AlphaInterpolationHolder; import java.util.List; diff --git a/src/main/java/quimufu/colourful_portals/mixin/client/AnimationResourceMetadataMixin.java b/src/main/java/quimufu/colourful_portals/client/mixin/AnimationResourceMetadataMixin.java similarity index 82% rename from src/main/java/quimufu/colourful_portals/mixin/client/AnimationResourceMetadataMixin.java rename to src/main/java/quimufu/colourful_portals/client/mixin/AnimationResourceMetadataMixin.java index 0e2b08d..1cd1a4a 100644 --- a/src/main/java/quimufu/colourful_portals/mixin/client/AnimationResourceMetadataMixin.java +++ b/src/main/java/quimufu/colourful_portals/client/mixin/AnimationResourceMetadataMixin.java @@ -1,9 +1,9 @@ -package quimufu.colourful_portals.mixin.client; +package quimufu.colourful_portals.client.mixin; import net.minecraft.client.resource.metadata.AnimationResourceMetadata; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; -import quimufu.colourful_portals.client.AlphaInterpolationHolder; +import quimufu.colourful_portals.client.rendering.AlphaInterpolationHolder; @Mixin(AnimationResourceMetadata.class) public class AnimationResourceMetadataMixin implements AlphaInterpolationHolder { diff --git a/src/main/java/quimufu/colourful_portals/mixin/client/AnimationResourceMetadataReaderMixin.java b/src/main/java/quimufu/colourful_portals/client/mixin/AnimationResourceMetadataReaderMixin.java similarity index 90% rename from src/main/java/quimufu/colourful_portals/mixin/client/AnimationResourceMetadataReaderMixin.java rename to src/main/java/quimufu/colourful_portals/client/mixin/AnimationResourceMetadataReaderMixin.java index 93207a3..c82f0b1 100644 --- a/src/main/java/quimufu/colourful_portals/mixin/client/AnimationResourceMetadataReaderMixin.java +++ b/src/main/java/quimufu/colourful_portals/client/mixin/AnimationResourceMetadataReaderMixin.java @@ -1,4 +1,4 @@ -package quimufu.colourful_portals.mixin.client; +package quimufu.colourful_portals.client.mixin; import com.google.gson.JsonObject; import net.minecraft.client.resource.metadata.AnimationResourceMetadata; @@ -8,7 +8,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import quimufu.colourful_portals.client.AlphaInterpolationHolder; +import quimufu.colourful_portals.client.rendering.AlphaInterpolationHolder; @Mixin(AnimationResourceMetadataReader.class) public class AnimationResourceMetadataReaderMixin { diff --git a/src/main/java/quimufu/colourful_portals/client/mixin/MinecraftClientAccessor.java b/src/main/java/quimufu/colourful_portals/client/mixin/MinecraftClientAccessor.java new file mode 100644 index 0000000..0a6b052 --- /dev/null +++ b/src/main/java/quimufu/colourful_portals/client/mixin/MinecraftClientAccessor.java @@ -0,0 +1,11 @@ +package quimufu.colourful_portals.client.mixin; + +import net.minecraft.client.MinecraftClient; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(MinecraftClient.class) +public interface MinecraftClientAccessor { + @Accessor + void setItemUseCooldown(int itemUseCooldown); +} diff --git a/src/main/java/quimufu/colourful_portals/mixin/client/SodiumFluidRendererMixin.java b/src/main/java/quimufu/colourful_portals/client/mixin/SodiumFluidRendererMixin.java similarity index 90% rename from src/main/java/quimufu/colourful_portals/mixin/client/SodiumFluidRendererMixin.java rename to src/main/java/quimufu/colourful_portals/client/mixin/SodiumFluidRendererMixin.java index 719c8ce..a69ef9c 100644 --- a/src/main/java/quimufu/colourful_portals/mixin/client/SodiumFluidRendererMixin.java +++ b/src/main/java/quimufu/colourful_portals/client/mixin/SodiumFluidRendererMixin.java @@ -1,4 +1,4 @@ -package quimufu.colourful_portals.mixin.client; +package quimufu.colourful_portals.client.mixin; import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuildBuffers; import me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.FluidRenderer; @@ -10,7 +10,7 @@ import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import quimufu.colourful_portals.client.SodiumPortalFluidRenderHandler; +import quimufu.colourful_portals.client.rendering.fluid.SodiumPortalFluidRenderHandler; import static quimufu.colourful_portals.ColourfulPortalsMod.PORTAL_FLUID; diff --git a/src/main/java/quimufu/colourful_portals/mixin/client/SpriteContentsMixin.java b/src/main/java/quimufu/colourful_portals/client/mixin/SpriteContentsMixin.java similarity index 94% rename from src/main/java/quimufu/colourful_portals/mixin/client/SpriteContentsMixin.java rename to src/main/java/quimufu/colourful_portals/client/mixin/SpriteContentsMixin.java index 37b1b8e..88bfc5f 100644 --- a/src/main/java/quimufu/colourful_portals/mixin/client/SpriteContentsMixin.java +++ b/src/main/java/quimufu/colourful_portals/client/mixin/SpriteContentsMixin.java @@ -1,4 +1,4 @@ -package quimufu.colourful_portals.mixin.client; +package quimufu.colourful_portals.client.mixin; import net.minecraft.client.resource.metadata.AnimationResourceMetadata; import net.minecraft.client.texture.SpriteContents; @@ -11,7 +11,7 @@ import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import quimufu.colourful_portals.client.AlphaInterpolationHolder; +import quimufu.colourful_portals.client.rendering.AlphaInterpolationHolder; @Mixin(SpriteContents.class) public abstract class SpriteContentsMixin { diff --git a/src/main/java/quimufu/colourful_portals/client/particle/ColourfulAirSparkleParticle.java b/src/main/java/quimufu/colourful_portals/client/particle/ColourfulAirSparkleParticle.java new file mode 100644 index 0000000..9a09be2 --- /dev/null +++ b/src/main/java/quimufu/colourful_portals/client/particle/ColourfulAirSparkleParticle.java @@ -0,0 +1,84 @@ +package quimufu.colourful_portals.client.particle; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.particle.v1.FabricSpriteProvider; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.option.ParticlesMode; +import net.minecraft.client.particle.ParticleFactory; +import net.minecraft.client.particle.ParticleTextureSheet; +import net.minecraft.client.particle.SpriteBillboardParticle; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.particle.ParticleGroup; +import net.minecraft.particle.SimpleParticleType; +import org.joml.Random; + +import java.util.EnumMap; +import java.util.Map; +import java.util.Optional; + +import static net.minecraft.client.option.ParticlesMode.*; + +@Environment(value = EnvType.CLIENT) +public class ColourfulAirSparkleParticle extends SpriteBillboardParticle { + + public static ParticleGroup COLOURFUL_AIR_GROUP = new ParticleGroup(0) { + private static final Random rnd = new Random(747906141); + private static final EnumMap COUNTS = new EnumMap<>( + Map.of( + ALL, 1 << 12, + DECREASED, 1 << 11, + MINIMAL, 1 << 8 + ) + ); + + @Override + public int getMaxCount() { + Integer count = COUNTS + .getOrDefault(MinecraftClient.getInstance().options.getParticles().getValue(), 0); + return count / 4 + rnd.nextInt((count * 3) / 4); + } + }; + + private final FabricSpriteProvider spriteProvider; + private final int variant; + + protected ColourfulAirSparkleParticle(ClientWorld clientWorld, + double posX, double posY, double posZ, + FabricSpriteProvider spriteProvider + + ) { + super(clientWorld, posX, posY, posZ); + this.spriteProvider = spriteProvider; + int variants = spriteProvider.getSprites().size() / 2; + variant = random.nextInt(variants); + setSprite(spriteProvider.getSprites().get(variant * 2)); + setMaxAge(20 + random.nextInt(20) + random.nextInt(20)); + gravityStrength = 0; + } + + @Override + public void tick() { + super.tick(); + if (age == maxAge / 2) { + setSprite(spriteProvider.getSprites().get(variant * 2 + 1)); + } + } + + @Override + public Optional getGroup() { + return Optional.ofNullable(COLOURFUL_AIR_GROUP); + } + + @Override + public ParticleTextureSheet getType() { + return ParticleTextureSheet.PARTICLE_SHEET_TRANSLUCENT; + } + + public static ParticleFactory create(FabricSpriteProvider provider) { + return (parameters, world, x, y, z, velocityX, velocityY, velocityZ) -> + new ColourfulAirSparkleParticle(world, x, y, z, provider); + } + + +} diff --git a/src/main/java/quimufu/colourful_portals/client/AlphaBlendingAnimator.java b/src/main/java/quimufu/colourful_portals/client/rendering/AlphaBlendingAnimator.java similarity index 98% rename from src/main/java/quimufu/colourful_portals/client/AlphaBlendingAnimator.java rename to src/main/java/quimufu/colourful_portals/client/rendering/AlphaBlendingAnimator.java index 76813d5..7e9391e 100644 --- a/src/main/java/quimufu/colourful_portals/client/AlphaBlendingAnimator.java +++ b/src/main/java/quimufu/colourful_portals/client/rendering/AlphaBlendingAnimator.java @@ -1,4 +1,4 @@ -package quimufu.colourful_portals.client; +package quimufu.colourful_portals.client.rendering; import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.texture.Animator; diff --git a/src/main/java/quimufu/colourful_portals/client/AlphaInterpolationHolder.java b/src/main/java/quimufu/colourful_portals/client/rendering/AlphaInterpolationHolder.java similarity index 78% rename from src/main/java/quimufu/colourful_portals/client/AlphaInterpolationHolder.java rename to src/main/java/quimufu/colourful_portals/client/rendering/AlphaInterpolationHolder.java index 089e2fd..dd42539 100644 --- a/src/main/java/quimufu/colourful_portals/client/AlphaInterpolationHolder.java +++ b/src/main/java/quimufu/colourful_portals/client/rendering/AlphaInterpolationHolder.java @@ -1,4 +1,4 @@ -package quimufu.colourful_portals.client; +package quimufu.colourful_portals.client.rendering; public interface AlphaInterpolationHolder { diff --git a/src/main/java/quimufu/colourful_portals/client/CommonPortalFluidRenderer.java b/src/main/java/quimufu/colourful_portals/client/rendering/fluid/CommonPortalFluidRenderer.java similarity index 87% rename from src/main/java/quimufu/colourful_portals/client/CommonPortalFluidRenderer.java rename to src/main/java/quimufu/colourful_portals/client/rendering/fluid/CommonPortalFluidRenderer.java index 12eebbe..3fc43a5 100644 --- a/src/main/java/quimufu/colourful_portals/client/CommonPortalFluidRenderer.java +++ b/src/main/java/quimufu/colourful_portals/client/rendering/fluid/CommonPortalFluidRenderer.java @@ -1,4 +1,4 @@ -package quimufu.colourful_portals.client; +package quimufu.colourful_portals.client.rendering.fluid; import net.minecraft.fluid.FluidState; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/quimufu/colourful_portals/client/CommonPortalFluidRendererV1.java b/src/main/java/quimufu/colourful_portals/client/rendering/fluid/CommonPortalFluidRendererV1.java similarity index 99% rename from src/main/java/quimufu/colourful_portals/client/CommonPortalFluidRendererV1.java rename to src/main/java/quimufu/colourful_portals/client/rendering/fluid/CommonPortalFluidRendererV1.java index 99ea8b6..ab437e3 100644 --- a/src/main/java/quimufu/colourful_portals/client/CommonPortalFluidRendererV1.java +++ b/src/main/java/quimufu/colourful_portals/client/rendering/fluid/CommonPortalFluidRendererV1.java @@ -1,4 +1,4 @@ -package quimufu.colourful_portals.client; +package quimufu.colourful_portals.client.rendering.fluid; import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandler; import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandlerRegistry; diff --git a/src/main/java/quimufu/colourful_portals/client/CommonPortalFluidRendererV2.java b/src/main/java/quimufu/colourful_portals/client/rendering/fluid/CommonPortalFluidRendererV2.java similarity index 99% rename from src/main/java/quimufu/colourful_portals/client/CommonPortalFluidRendererV2.java rename to src/main/java/quimufu/colourful_portals/client/rendering/fluid/CommonPortalFluidRendererV2.java index 26f198d..502a1b8 100644 --- a/src/main/java/quimufu/colourful_portals/client/CommonPortalFluidRendererV2.java +++ b/src/main/java/quimufu/colourful_portals/client/rendering/fluid/CommonPortalFluidRendererV2.java @@ -1,4 +1,4 @@ -package quimufu.colourful_portals.client; +package quimufu.colourful_portals.client.rendering.fluid; import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandler; import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandlerRegistry; diff --git a/src/main/java/quimufu/colourful_portals/client/PortalFluidRenderHandler.java b/src/main/java/quimufu/colourful_portals/client/rendering/fluid/PortalFluidRenderHandler.java similarity index 96% rename from src/main/java/quimufu/colourful_portals/client/PortalFluidRenderHandler.java rename to src/main/java/quimufu/colourful_portals/client/rendering/fluid/PortalFluidRenderHandler.java index 7923037..f525bc5 100644 --- a/src/main/java/quimufu/colourful_portals/client/PortalFluidRenderHandler.java +++ b/src/main/java/quimufu/colourful_portals/client/rendering/fluid/PortalFluidRenderHandler.java @@ -1,4 +1,4 @@ -package quimufu.colourful_portals.client; +package quimufu.colourful_portals.client.rendering.fluid; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -16,7 +16,7 @@ import org.jetbrains.annotations.Nullable; import org.joml.Quaternionf; import org.joml.Vector3f; import quimufu.colourful_portals.ColourfulPortalsMod; -import quimufu.colourful_portals.ColourfulPortalsModClient; +import quimufu.colourful_portals.client.ColourfulPortalsModClient; @Environment(value = EnvType.CLIENT) public class PortalFluidRenderHandler implements FluidRenderHandler, VertexEater { diff --git a/src/main/java/quimufu/colourful_portals/client/SodiumPortalFluidRenderHandler.java b/src/main/java/quimufu/colourful_portals/client/rendering/fluid/SodiumPortalFluidRenderHandler.java similarity index 95% rename from src/main/java/quimufu/colourful_portals/client/SodiumPortalFluidRenderHandler.java rename to src/main/java/quimufu/colourful_portals/client/rendering/fluid/SodiumPortalFluidRenderHandler.java index a1a3c45..ba37189 100644 --- a/src/main/java/quimufu/colourful_portals/client/SodiumPortalFluidRenderHandler.java +++ b/src/main/java/quimufu/colourful_portals/client/rendering/fluid/SodiumPortalFluidRenderHandler.java @@ -1,4 +1,4 @@ -package quimufu.colourful_portals.client; +package quimufu.colourful_portals.client.rendering.fluid; import me.jellysquid.mods.sodium.client.model.quad.ModelQuad; import me.jellysquid.mods.sodium.client.model.quad.ModelQuadView; @@ -18,8 +18,7 @@ import net.minecraft.util.math.Direction; import net.minecraft.world.BlockRenderView; import org.joml.Quaternionf; import org.joml.Vector3f; -import quimufu.colourful_portals.ColourfulPortalsMod; -import quimufu.colourful_portals.ColourfulPortalsModClient; +import quimufu.colourful_portals.client.ColourfulPortalsModClient; @Environment(value = EnvType.CLIENT) public class SodiumPortalFluidRenderHandler implements VertexEater { diff --git a/src/main/java/quimufu/colourful_portals/client/VertexEater.java b/src/main/java/quimufu/colourful_portals/client/rendering/fluid/VertexEater.java similarity index 86% rename from src/main/java/quimufu/colourful_portals/client/VertexEater.java rename to src/main/java/quimufu/colourful_portals/client/rendering/fluid/VertexEater.java index b7c5fb8..a40cbd8 100644 --- a/src/main/java/quimufu/colourful_portals/client/VertexEater.java +++ b/src/main/java/quimufu/colourful_portals/client/rendering/fluid/VertexEater.java @@ -1,4 +1,4 @@ -package quimufu.colourful_portals.client; +package quimufu.colourful_portals.client.rendering.fluid; import net.minecraft.client.texture.Sprite; import net.minecraft.util.math.Direction; diff --git a/src/main/java/quimufu/colourful_portals/config/ColourfulPortalConfig.java b/src/main/java/quimufu/colourful_portals/config/ColourfulPortalConfig.java index 5d39a14..d52ee54 100644 --- a/src/main/java/quimufu/colourful_portals/config/ColourfulPortalConfig.java +++ b/src/main/java/quimufu/colourful_portals/config/ColourfulPortalConfig.java @@ -2,80 +2,99 @@ package quimufu.colourful_portals.config; import com.google.common.collect.Lists; import eu.midnightdust.lib.config.MidnightConfig; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; +import net.minecraft.registry.RegistryKey; +import net.minecraft.server.MinecraftServer; import net.minecraft.util.DyeColor; +import net.minecraft.world.World; +import quimufu.colourful_portals.ColourfulPortalsMod; import quimufu.colourful_portals.util.Procedure; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; public class ColourfulPortalConfig extends MidnightConfig { - @Entry(category = "text", name = "Disable Immersive Portals integration") + @Entry(category = "integrations", name = "Disable Immersive Portals integration") public static boolean disableImmersivePortals = false; - @Comment(category = "text") - public static Comment explanation; + @Comment(category = "portal_colours") + public static Comment explanation1; + @Comment(category = "portal_colours") + public static Comment explanation2; - @Entry(category = "text", name = "Blocks that create white portals") + @Entry(category = "portal_colours") public static List white = Lists.newArrayList("minecraft:white_wool"); - @Entry(category = "text", name = "Blocks that create orange portals") + @Entry(category = "portal_colours") public static List orange = Lists.newArrayList("minecraft:orange_wool"); - @Entry(category = "text", name = "Blocks that create magenta portals") + @Entry(category = "portal_colours") public static List magenta = Lists.newArrayList("minecraft:magenta_wool"); - @Entry(category = "text", name = "Blocks that create light blue portals") + @Entry(category = "portal_colours") public static List light_blue = Lists.newArrayList("minecraft:light_blue_wool"); - @Entry(category = "text", name = "Blocks that create yellow portals") + @Entry(category = "portal_colours") public static List yellow = Lists.newArrayList("minecraft:yellow_wool"); - @Entry(category = "text", name = "Blocks that create lime portals") + @Entry(category = "portal_colours") public static List lime = Lists.newArrayList("minecraft:lime_wool"); - @Entry(category = "text", name = "Blocks that create pink portals") + @Entry(category = "portal_colours") public static List pink = Lists.newArrayList("minecraft:pink_wool"); - @Entry(category = "text", name = "Blocks that create gray portals") + @Entry(category = "portal_colours") public static List gray = Lists.newArrayList("minecraft:gray_wool"); - @Entry(category = "text", name = "Blocks that create light gray portals") + @Entry(category = "portal_colours") public static List light_gray = Lists.newArrayList("minecraft:light_gray_wool"); - @Entry(category = "text", name = "Blocks that create cyan portals") + @Entry(category = "portal_colours") public static List cyan = Lists.newArrayList("minecraft:cyan_wool"); - @Entry(category = "text", name = "Blocks that create purple portals") + @Entry(category = "portal_colours") public static List purple = Lists.newArrayList("minecraft:purple_wool"); - @Entry(category = "text", name = "Blocks that create blue portals") + @Entry(category = "portal_colours") public static List blue = Lists.newArrayList("minecraft:blue_wool"); - @Entry(category = "text", name = "Blocks that create brown portals") + @Entry(category = "portal_colours") public static List brown = Lists.newArrayList("minecraft:brown_wool"); - @Entry(category = "text", name = "Blocks that create green portals") + @Entry(category = "portal_colours") public static List green = Lists.newArrayList("minecraft:green_wool"); - @Entry(category = "text", name = "Blocks that create red portals") + @Entry(category = "portal_colours") public static List red = Lists.newArrayList("minecraft:red_wool"); - @Entry(category = "text", name = "Blocks that create black portals") + @Entry(category = "portal_colours") public static List black = Lists.newArrayList("minecraft:black_wool"); - @Entry(category = "text", name = "Blocks that create fully transparent portals") + @Entry(category = "portal_colours") public static List none = Lists.newArrayList(); - @Entry(category = "text", name = "Use the old Portal Fluid look") + @Entry(category = "visuals") public static boolean blockyPortalFluid = false; + + @Entry(category = "colourful_pearl") + public static Map pearlDimensionWeights = new HashMap<>( + Map.of("minecraft:overworld", 79, + "minecraft:the_nether", 20, + "minecraft:the_end", 1) + ); + + @Entry(category = "colourful_pearl", isSlider = true, min = 0f, max = 1f, precision = 1000) + public static double pearlSameDimensionLikelihood = 0.9D; + + @Entry(category = "colourful_pearl", isSlider = true, min = 1 << 4, max = 1 << 16, precision = 10) + public static double maxPearlDistance = 1 << 14; + + @Entry(category = "colourful_pearl", isSlider = true, min = 1 << 4, max = 1 << 16, precision = 10) + public static double minPearlDistance = 1 << 12; + private static final ArrayList onWrite = new ArrayList<>(2); + public static Set getAllPortalBlocks() { Set allBlocks = new HashSet<>(); allBlocks.addAll(white); @@ -150,4 +169,24 @@ public class ColourfulPortalConfig extends MidnightConfig { public static void registerListener(Procedure p) { onWrite.add(p); } + + public static void addMissingDimensionsToConfig(MinecraftServer server) { + Set> worlds = server.getWorldRegistryKeys(); + boolean changed = false; + for (RegistryKey world : worlds) { + if (!pearlDimensionWeights.containsKey(world.getValue().toString())) { + pearlDimensionWeights.put(world.getValue().toString(), 1); + changed = true; + } + } + if (maxPearlDistance < minPearlDistance) { + double min = maxPearlDistance; + maxPearlDistance = minPearlDistance; + minPearlDistance = min; + changed = true; + } + if (changed) { + write(ColourfulPortalsMod.MOD_ID); + } + } } diff --git a/src/main/java/quimufu/colourful_portals/entity/ColourfulPearlEntity.java b/src/main/java/quimufu/colourful_portals/entity/ColourfulPearlEntity.java new file mode 100644 index 0000000..12d3274 --- /dev/null +++ b/src/main/java/quimufu/colourful_portals/entity/ColourfulPearlEntity.java @@ -0,0 +1,268 @@ +package quimufu.colourful_portals.entity; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.projectile.thrown.ThrownItemEntity; +import net.minecraft.item.Item; +import net.minecraft.particle.ParticleTypes; +import net.minecraft.predicate.entity.EntityPredicates; +import net.minecraft.registry.Registries; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvents; +import net.minecraft.util.Identifier; +import net.minecraft.util.hit.HitResult; +import net.minecraft.util.math.*; +import net.minecraft.world.Heightmap; +import net.minecraft.world.TeleportTarget; +import net.minecraft.world.World; +import net.minecraft.world.border.WorldBorder; +import net.minecraft.world.dimension.DimensionType; +import org.jetbrains.annotations.Nullable; +import org.joml.Vector3f; +import quimufu.colourful_portals.ColourfulPortalsMod; +import quimufu.colourful_portals.config.ColourfulPortalConfig; +import quimufu.colourful_portals.portal.PortalHelper; +import quimufu.colourful_portals.util.AdditionalMath; + +import java.util.List; + +public class ColourfulPearlEntity + extends ThrownItemEntity { + + public ColourfulPearlEntity(EntityType entityType, World world) { + super(entityType, world); + } + + public ColourfulPearlEntity(World world, LivingEntity owner) { + super(ColourfulPortalsMod.COLOURFUL_PEARL_ENTITY_TYPE, owner, world); + } + + + @Override + protected Item getDefaultItem() { + return ColourfulPortalsMod.COLOURFUL_PEARL_ITEM; + } + + @Override + public void onRemoved() { + if (this.getRemovalReason() == RemovalReason.DISCARDED) { + if (getWorld() instanceof ClientWorld clientWorld) { + clientWorld.playSound( + this.getX(), this.getY(), this.getZ(), + ColourfulPortalsMod.TELEPORT_AWAY_SOUND, + SoundCategory.BLOCKS, + 100F, 1.25F, + false); + } + + List entities = getWorld() + .getOtherEntities(this, this.getBoundingBox().expand(5)); + + entities.stream() + .filter(e -> e.squaredDistanceTo(this) < 25) + .forEach(this::spawnTeleportationParticles); + } + } + + private void spawnTeleportationParticles(Entity entity) { + for (int i = 0; i < 64; ++i) { + Box box = entity.getBoundingBox(); + float xOffset = (float) ((AdditionalMath.root(random.nextFloat() * 2 - 1, 3) / 2) * box.getLengthX() * 2); + float yOffset = (float) (AdditionalMath.root(random.nextFloat(), 3) * box.getLengthY() * 2); + float zOffset = (float) ((AdditionalMath.root(random.nextFloat() * 2 - 1, 3) / 2) * box.getLengthZ() * 2); + + Vector3f offset = new Vector3f(xOffset, yOffset, zOffset); + addHitParticle(this.getWorld(), entity, offset); + } + } + + @Override + protected void onCollision(HitResult hitResult) { + if (getWorld().isClient()) { + return; + } + if (isRemoved()) { + return; + } + List entities = getWorld() + .getOtherEntities(this, this.getBoundingBox().expand(5), EntityPredicates.EXCEPT_SPECTATOR + .and(entity -> entity instanceof LivingEntity) + .and(entity -> !entity.getType().isIn(ColourfulPortalsMod.COLOURFUL_PEARL_NOT_TELEPORTABLE))); + entities.stream() + .filter(e -> e.squaredDistanceTo(this) < 25) + .forEach(this::tryTeleport); + this.discard(); + } + + private void tryTeleport(Entity entity) { + if (!(getWorld() instanceof ServerWorld serverWorld)) { + return; + } + if (entity == null || !canTeleportEntityTo(entity, serverWorld)) { + return; + } + if (entity.hasVehicle()) { + entity.detach(); + } + TeleportTarget target = findTarget(serverWorld, entity, null); + while (target == null || !targetValid(target, entity)) { + target = findTarget(serverWorld, entity, target); + } + prepareTarget(target, entity); + + if (entity instanceof ServerPlayerEntity serverPlayerEntity) { + if (serverPlayerEntity.networkHandler.isConnectionOpen()) { + + Entity entityAfterTeleport = entity.teleportTo(target); + if (entityAfterTeleport == null) { + return; + } + entityAfterTeleport.onLanding(); + serverPlayerEntity.clearCurrentExplosion(); + entityAfterTeleport.damage(this.getDamageSources().fall(), 5.0f); + serverPlayerEntity.playSoundToPlayer(SoundEvents.ENTITY_PLAYER_TELEPORT, SoundCategory.PLAYERS, 1F, 0.75F); + } + } else { + Entity entityAfterTeleport = entity.teleportTo(target); + if (entityAfterTeleport == null) { + return; + } + entityAfterTeleport.onLanding(); + serverWorld.playSound(entityAfterTeleport, entityAfterTeleport.getBlockPos(), + SoundEvents.ENTITY_PLAYER_TELEPORT, SoundCategory.NEUTRAL, + 1F, 0.75F); + } + } + + private void addHitParticle(World world, Entity entity, Vector3f offset) { + Vector3f endPos = randomInside(this.getDimensions(null).getBoxAt(entity.getPos())) + .add(offset); + world.addParticle(ParticleTypes.PORTAL, + endPos.x, endPos.y, endPos.z, + -offset.x, -offset.y, -offset.z); + } + + private Vector3f randomInside(Box box) { + return box.getMinPos().toVector3f() + .add(((float) box.getLengthX()) * random.nextFloat(), + ((float) box.getLengthY()) * random.nextFloat(), + ((float) box.getLengthZ()) * random.nextFloat()); + } + + private boolean targetValid(TeleportTarget target, Entity entity) { + Box boundingBox = entity.getDimensions(entity.getPose()) + .getBoxAt(target.pos()) + .stretch(0, -1, 0); + boolean foundAir = false; + boolean foundNonAir = false; + for (BlockPos pos : PortalHelper.blockPosInBox(boundingBox)) { + BlockState blockState = target.world().getBlockState(pos); + if (!blockState.isIn(ColourfulPortalsMod.COLOURFUL_PEARL_REPLACEABLE_BLOCK_TAG)) { + ColourfulPortalsMod.LOGGER.info("invalid location at {}, block {}", pos, Registries.BLOCK.getId(blockState.getBlock())); + return false; + } + if (blockState.isAir()) { + foundAir = true; + } else { + foundNonAir = true; + } + } + return foundAir && foundNonAir; + } + + + private void prepareTarget(TeleportTarget target, Entity entity) { + Box entityBody = entity.getDimensions(entity.getPose()).getBoxAt(target.pos()); + double minY = entityBody.getMinPos().getY(); + Box floor = entityBody.withMinY(minY - 1).withMaxY(minY - 0.5); + for (BlockPos pos : PortalHelper.blockPosInBox(entityBody)) { + target.world().setBlockState(pos, ColourfulPortalsMod.COLOURFUL_AIR.getRandomState(random)); + } + for (BlockPos pos : PortalHelper.blockPosInBox(floor)) { + target.world().setBlockState(pos, Blocks.STONE.getDefaultState()); + } + + } + + private @Nullable TeleportTarget findTarget(ServerWorld serverWorld, Entity entity, TeleportTarget target) { + if (target != null + //position makes sense to retry + && !isEmptyPosition(target) + //prevents potential infinite loop if position does have weird block compositions + && random.nextInt(target.world().getLogicalHeight() * 2) != 0) { + return new TeleportTarget(target.world(), + target.pos().withAxis(Direction.Axis.Y, getTargetY(target.world())), + target.velocity(), + target.yaw(), + target.pitch(), + target.postDimensionTransition()); + } + //re-use targetWorld to prevent dimensions with less valid spawning positions from becoming less likely + ServerWorld targetWorld = target == null ? getTargetWorld(serverWorld) : target.world(); + if (targetWorld == null) { + return null; + } + //adjust position within target + Vec3d minPos = Vec3d.of(getTargetPos(serverWorld, targetWorld, getPos())); + int width = MathHelper.ceil(entity.getBoundingBox().getLengthX()); + int depth = MathHelper.ceil(entity.getBoundingBox().getLengthZ()); + Vec3d targetLocation = minPos.add((width % 2) * 0.5F, 0, (depth % 2) * 0.5F); + + return new TeleportTarget(targetWorld, targetLocation, entity.getVelocity(), entity.getYaw(), entity.getPitch(), TeleportTarget.NO_OP); + } + + private static boolean isEmptyPosition(TeleportTarget target) { + return target.world().getTopY(Heightmap.Type.WORLD_SURFACE, (int) target.pos().x, (int) target.pos().z) == target.world().getBottomY(); + } + + private @Nullable ServerWorld getTargetWorld(ServerWorld serverWorld) { + if (this.getRandom().nextDouble() < ColourfulPortalConfig.pearlSameDimensionLikelihood) { + return serverWorld; + } + + MinecraftServer server = serverWorld.getServer(); + ColourfulPortalConfig.addMissingDimensionsToConfig(server); + Identifier targetWorldId = ColourfulPortalsMod.DIMENSION_WEIGHTS_COLOURFUL_PEARL.getWeighted(random); + + return server.getWorld(RegistryKey.of(RegistryKeys.WORLD, targetWorldId)); + } + + private BlockPos getTargetPos(ServerWorld fromWorld, ServerWorld toWorld, Vec3d pos) { + + double distance = ColourfulPortalConfig.minPearlDistance + + getRandom().nextDouble() * + (ColourfulPortalConfig.maxPearlDistance - ColourfulPortalConfig.minPearlDistance); + + double angle = Math.PI * 2 * getRandom().nextDouble(); + int targetY = getTargetY(toWorld); + + Vec3d target = new Vec3d(pos.getX() + Math.cos(angle) * distance, targetY, pos.getZ() + Math.sin(angle) * distance); + + WorldBorder worldBorder = toWorld.getWorldBorder(); + double d = DimensionType.getCoordinateScaleFactor(fromWorld.getDimension(), toWorld.getDimension()); + return worldBorder.clamp(target.getX() * d, target.getY(), target.getZ() * d); + } + + private int getTargetY(ServerWorld toWorld) { + return toWorld.getBottomY() + 4 + (getRandom().nextInt(toWorld.getLogicalHeight() - 8)); + } + + private static boolean canTeleportEntityTo(Entity entity, World world) { + if (entity.getWorld().getRegistryKey() == world.getRegistryKey()) { + if (entity instanceof LivingEntity livingEntity) { + return livingEntity.isAlive() && !livingEntity.isSleeping(); + } + return entity.isAlive(); + } + return entity.canUsePortals(true); + } +} diff --git a/src/main/java/quimufu/colourful_portals/general_util/LinkedList.java b/src/main/java/quimufu/colourful_portals/general_util/LinkedList.java index dc5901b..c4fed96 100644 --- a/src/main/java/quimufu/colourful_portals/general_util/LinkedList.java +++ b/src/main/java/quimufu/colourful_portals/general_util/LinkedList.java @@ -26,7 +26,6 @@ public class LinkedList implements List { size++; node = node.getNext(); } - LOGGER.info("" + size); return size; } diff --git a/src/main/java/quimufu/colourful_portals/general_util/WeightedSelector.java b/src/main/java/quimufu/colourful_portals/general_util/WeightedSelector.java new file mode 100644 index 0000000..175a4ff --- /dev/null +++ b/src/main/java/quimufu/colourful_portals/general_util/WeightedSelector.java @@ -0,0 +1,33 @@ +package quimufu.colourful_portals.general_util; + +import net.minecraft.util.math.random.Random; + +import java.util.TreeMap; + +public class WeightedSelector { + + private final TreeMap backingMap = new TreeMap<>(); + + private int total = 0; + + public void add(E object, int weight){ + if(weight <= 0){ + return; + } + backingMap.put(total, object); + total += weight; + } + + public void clear() { + total = 0; + backingMap.clear(); + } + + public E getWeighted(Random random) { + if(total == 0){ + throw new IllegalStateException("tried to receive Weighted Result from empty Selector"); + } + return backingMap.floorEntry(random.nextInt(total)).getValue(); + } + +} diff --git a/src/main/java/quimufu/colourful_portals/item/ColourfulAirBottleItem.java b/src/main/java/quimufu/colourful_portals/item/ColourfulAirBottleItem.java new file mode 100644 index 0000000..1bda896 --- /dev/null +++ b/src/main/java/quimufu/colourful_portals/item/ColourfulAirBottleItem.java @@ -0,0 +1,101 @@ +package quimufu.colourful_portals.item; + +import net.minecraft.advancement.criterion.Criteria; +import net.minecraft.block.Block; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.*; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.sound.SoundEvent; +import net.minecraft.sound.SoundEvents; +import net.minecraft.stat.Stats; +import net.minecraft.util.*; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.event.GameEvent; +import org.jetbrains.annotations.Nullable; +import quimufu.colourful_portals.ColourfulAirBlock; +import quimufu.colourful_portals.ColourfulPortalsMod; +import quimufu.colourful_portals.client.mixin.MinecraftClientAccessor; + +public class ColourfulAirBottleItem + extends AliasedBlockItem { + private static final int MAX_USE_TIME = 40; + + public ColourfulAirBottleItem(Block block, Settings settings) { + super(block, settings); + } + + @Override + public ItemStack finishUsing(ItemStack stack, World world, LivingEntity user) { + if (!tryPlaceAtHead(stack, world, user)) { + return stack; + } + user.emitGameEvent(GameEvent.DRINK); + + if (user instanceof PlayerEntity playerEntity) { + stack = ItemUsage.exchangeStack(stack, playerEntity, new ItemStack(Items.GLASS_BOTTLE)); + if(world.isClient){ + ((MinecraftClientAccessor)MinecraftClient.getInstance()) + .setItemUseCooldown(16); + } + } + + if (user instanceof ServerPlayerEntity serverPlayerEntity) { + Criteria.CONSUME_ITEM.trigger(serverPlayerEntity, stack); + serverPlayerEntity.incrementStat(Stats.USED.getOrCreateStat(this)); + } + return stack; + } + + private boolean tryPlaceAtHead(ItemStack stack, World world, LivingEntity user) { + BlockPos headPos = BlockPos.ofFloored(user.getEyePos()); + if (world.getBlockState(headPos).isIn(ColourfulPortalsMod.COLOURFUL_PEARL_REPLACEABLE_BLOCK_TAG)) { + DyeColor color = stack.getOrDefault(DataComponentTypes.BASE_COLOR, DyeColor.BLACK); + return world.setBlockState(headPos, getBlock().getDefaultState() + .withIfExists(ColourfulAirBlock.DYE_COLOR, color), + Block.NOTIFY_ALL_AND_REDRAW); + } + return false; + } + + @Override + public ActionResult useOnBlock(ItemUsageContext context) { + if (context.getPlayer() != null && context.getPlayer().isSneaking()) { + return ActionResult.PASS; + } + return super.useOnBlock(context); + } + + @Override + public int getMaxUseTime(ItemStack stack, LivingEntity user) { + return MAX_USE_TIME; + } + + @Override + public UseAction getUseAction(ItemStack stack) { + return UseAction.DRINK; + } + + @Override + public SoundEvent getDrinkSound() { + //todo + return SoundEvents.ITEM_HONEY_BOTTLE_DRINK; + } + + @Override + public SoundEvent getEatSound() { + //todo + return SoundEvents.ITEM_HONEY_BOTTLE_DRINK; + } + + @Override + public TypedActionResult use(World world, PlayerEntity user, Hand hand) { + return ItemUsage.consumeHeldItem(world, user, hand); + } +} + diff --git a/src/main/java/quimufu/colourful_portals/item/ColourfulPearlItem.java b/src/main/java/quimufu/colourful_portals/item/ColourfulPearlItem.java new file mode 100644 index 0000000..2466c0c --- /dev/null +++ b/src/main/java/quimufu/colourful_portals/item/ColourfulPearlItem.java @@ -0,0 +1,36 @@ +package quimufu.colourful_portals.item; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvents; +import net.minecraft.stat.Stats; +import net.minecraft.util.Hand; +import net.minecraft.util.TypedActionResult; +import net.minecraft.world.World; +import quimufu.colourful_portals.entity.ColourfulPearlEntity; + +public class ColourfulPearlItem + extends Item { + + public ColourfulPearlItem(Item.Settings settings) { + super(settings); + } + + @Override + public TypedActionResult use(World world, PlayerEntity user, Hand hand) { + ItemStack stackInHand = user.getStackInHand(hand); + world.playSound(null, user.getX(), user.getY(), user.getZ(), SoundEvents.ENTITY_ENDER_PEARL_THROW, SoundCategory.NEUTRAL, 0.5f, 0.4f / (world.getRandom().nextFloat() * 0.4f + 0.8f)); + user.getItemCooldownManager().set(this, 50); + if (!world.isClient) { + ColourfulPearlEntity colourfulPearlEntity = new ColourfulPearlEntity(world, user); + colourfulPearlEntity.setItem(stackInHand); + colourfulPearlEntity.setVelocity(user, user.getPitch(), user.getYaw(), 0.0f, 1.5f, 1.0f); + world.spawnEntity(colourfulPearlEntity); + } + user.incrementStat(Stats.USED.getOrCreateStat(this)); + stackInHand.decrementUnlessCreative(1, user); + return TypedActionResult.success(stackInHand, world.isClient()); + } +} diff --git a/src/main/java/quimufu/colourful_portals/mixin/BlockChangeAndEntityMovementMixin.java b/src/main/java/quimufu/colourful_portals/mixin/BlockChangeAndEntityMovementMixin.java index df45094..aa4bdde 100644 --- a/src/main/java/quimufu/colourful_portals/mixin/BlockChangeAndEntityMovementMixin.java +++ b/src/main/java/quimufu/colourful_portals/mixin/BlockChangeAndEntityMovementMixin.java @@ -74,16 +74,29 @@ public abstract class BlockChangeAndEntityMovementMixin { // This code is injected into the end of ServerWorld.onBlockChanged()V if (oldBlock.getBlock() != newBlock.getBlock()) { if (PORTAL_BLOCKS.contains(Registries.BLOCK.getId(newBlock.getBlock()))) { - LOGGER.info("onBlockNew {} -> {}", oldBlock, newBlock); + LOGGER.debug("onBlockNew {} -> {}", oldBlock, newBlock); Identifier blockId = Registries.BLOCK.getId(newBlock.getBlock()); - world.getServer().execute(() -> PORTAL_MANAGER.onPortalBlockPlaced(world, pos, blockId)); + synchronized (PORTAL_MANAGER.pendingUpdates){ + PORTAL_MANAGER.pendingUpdates.add(() -> + PORTAL_MANAGER.onPortalBlockPlaced(world, pos, blockId)); + } + if(!PORTAL_MANAGER.blockUpdatesPending.getAndSet(true)){ + world.getServer().execute(PORTAL_MANAGER::runPendingUpdates); + } } if (PORTAL_BLOCKS.contains(Registries.BLOCK.getId(oldBlock.getBlock()))) { - LOGGER.info("onBlockOld {} -> {}", oldBlock, newBlock); + LOGGER.debug("onBlockOld {} -> {}", oldBlock, newBlock); Identifier blockId = Registries.BLOCK.getId(oldBlock.getBlock()); - world.getServer().execute(() -> PORTAL_MANAGER.onPortalBlockBroken(world, pos, blockId)); + synchronized (PORTAL_MANAGER.pendingUpdates){ + PORTAL_MANAGER.pendingUpdates.add(() -> + PORTAL_MANAGER.onPortalBlockBroken(world, pos, blockId)); + } + if(!PORTAL_MANAGER.blockUpdatesPending.getAndSet(true)){ + world.getServer().execute(PORTAL_MANAGER::runPendingUpdates); + } } } } + } \ No newline at end of file diff --git a/src/main/java/quimufu/colourful_portals/portal/PortalHelper.java b/src/main/java/quimufu/colourful_portals/portal/PortalHelper.java index 4b1d7e9..ac8b3de 100644 --- a/src/main/java/quimufu/colourful_portals/portal/PortalHelper.java +++ b/src/main/java/quimufu/colourful_portals/portal/PortalHelper.java @@ -8,10 +8,8 @@ import net.minecraft.registry.RegistryKeys; import net.minecraft.server.MinecraftServer; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3i; +import net.minecraft.util.math.*; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; @@ -230,6 +228,10 @@ public class PortalHelper { return world.getDimensionEntry().getKey().orElseThrow().getValue(); } + public static @NotNull Iterable blockPosInBox(Box boundinBox) { + return BlockPos.iterate(MathHelper.floor(boundinBox.minX), MathHelper.floor(boundinBox.minY), MathHelper.floor(boundinBox.minZ), MathHelper.floor(boundinBox.maxX), MathHelper.floor(boundinBox.maxY), MathHelper.floor(boundinBox.maxZ)); + } + private static class BlockPosIterator implements Iterator { private final BlockPos startPos; diff --git a/src/main/java/quimufu/colourful_portals/portal/PortalManager.java b/src/main/java/quimufu/colourful_portals/portal/PortalManager.java index 221d7ac..d4994d8 100644 --- a/src/main/java/quimufu/colourful_portals/portal/PortalManager.java +++ b/src/main/java/quimufu/colourful_portals/portal/PortalManager.java @@ -15,7 +15,9 @@ import quimufu.colourful_portals.general_util.LinkedList; import java.util.HashSet; import java.util.List; +import java.util.Queue; import java.util.Set; +import java.util.concurrent.atomic.AtomicBoolean; import static quimufu.colourful_portals.ColourfulPortalsMod.*; @@ -24,6 +26,9 @@ public class PortalManager { private final PortalListComponent portalCandidateList; private final PortalListComponent portalList; + public final AtomicBoolean blockUpdatesPending = new AtomicBoolean(false); + public final Queue pendingUpdates = new java.util.LinkedList<>(); + public PortalLinkingSystem getLinkingSystem() { return linkingSystem; } @@ -275,4 +280,20 @@ public class PortalManager { } } + + public void runPendingUpdates() { + if(pendingUpdates.size()<20){ + blockUpdatesPending.set(false); + } + for (int i = 0; i < Math.min(20, pendingUpdates.size()); i++) { + Runnable runnable; + synchronized (pendingUpdates) { + runnable = pendingUpdates.poll(); + } + if(runnable == null){ + return; + } + runnable.run(); + } + } } diff --git a/src/main/java/quimufu/colourful_portals/util/AdditionalMath.java b/src/main/java/quimufu/colourful_portals/util/AdditionalMath.java new file mode 100644 index 0000000..94d4d52 --- /dev/null +++ b/src/main/java/quimufu/colourful_portals/util/AdditionalMath.java @@ -0,0 +1,17 @@ +package quimufu.colourful_portals.util; + +import static java.lang.Float.NaN; + +public class AdditionalMath { + + public static float root(float x, int nThRoot){ + if(nThRoot<=0){ + return NaN; + } + if(x<0 && nThRoot%2 == 1){ + return -(float) Math.pow(-x, 1D / nThRoot); + } + return (float) Math.pow(x, 1D / nThRoot); + + } +} diff --git a/src/main/java/quimufu/colourful_portals/util/CollisionAwareShapeContext.java b/src/main/java/quimufu/colourful_portals/util/CollisionAwareShapeContext.java deleted file mode 100644 index ee02a75..0000000 --- a/src/main/java/quimufu/colourful_portals/util/CollisionAwareShapeContext.java +++ /dev/null @@ -1,32 +0,0 @@ -package quimufu.colourful_portals.util; - -import net.minecraft.block.ShapeContext; -import net.minecraft.fluid.FluidState; -import net.minecraft.item.Item; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.shape.VoxelShape; - -public class CollisionAwareShapeContext implements ShapeContext { - public CollisionAwareShapeContext() { - } - - @Override - public boolean isDescending() { - return false; - } - - @Override - public boolean isAbove(VoxelShape shape, BlockPos pos, boolean defaultValue) { - return false; - } - - @Override - public boolean isHolding(Item item) { - return false; - } - - @Override - public boolean canWalkOnFluid(FluidState stateAbove, FluidState state) { - return false; - } -} diff --git a/src/main/resources/assets/colourful_portals/lang/de_de.json b/src/main/resources/assets/colourful_portals/lang/de_de.json index 32ef1b3..5d31cb2 100644 --- a/src/main/resources/assets/colourful_portals/lang/de_de.json +++ b/src/main/resources/assets/colourful_portals/lang/de_de.json @@ -1,28 +1,39 @@ { "block.colourful_portals.portal_block": "Farbenfrohes Portal", "block.colourful_portals.portal_fluid_block": "Farbenfrohe Flüssigkeit", + "colourful_portals.midnightconfig.disableImmersivePortals": "Immersive Portals integration deaktivieren", "colourful_portals.midnightconfig.black": "Blöcke, die schwarze Portale erzeugen", "colourful_portals.midnightconfig.blue": "Blöcke, die blaue Portale erzeugen", "colourful_portals.midnightconfig.brown": "Blöcke, die braune Portale erzeugen", "colourful_portals.midnightconfig.cyan": "Blöcke, die cyanfarbene Portale erzeugen", - "colourful_portals.midnightconfig.disableImmersivePortals": "Immersive Portals integration deaktivieren", - "colourful_portals.midnightconfig.explanation": "Diese Konfiguration erlaubt es, zusätzliche/andere Portalblocke zu definieren.\nPortale aus diesen verbinden sich mit anderen aus dem selben Block.\nDie Liste, der der Block hinzugefügt wird, bestimmt dabei nur die Portalfarbe.\nÄnderungen treten für neue Portale oder bei Aktualisierung eines Portals in Kraft.", + "colourful_portals.midnightconfig.explanation1": "Diese Konfiguration erlaubt es, zusätzliche/andere Portalblocke zu definieren.\nPortale aus diesen verbinden sich mit anderen aus dem selben Block.", + "colourful_portals.midnightconfig.explanation2": "Die Liste, der der Block hinzugefügt wird, bestimmt dabei nur die Portalfarbe.\nÄnderungen treten für neue Portale oder bei Aktualisierung eines Portals in Kraft.", "colourful_portals.midnightconfig.gray": "Blöcke, die graue Portale erzeugen", - "colourful_portals.midnightconfig.green": "Blöcke, die grüne Portale erstellen", + "colourful_portals.midnightconfig.green": "Blöcke, die grüne Portale erzeugen", "colourful_portals.midnightconfig.light_blue": "Blöcke, die hellblaue Portale erzeugen", "colourful_portals.midnightconfig.light_gray": "Blöcke, die hellgraue Portale erzeugen", "colourful_portals.midnightconfig.lime": "Blöcke, die limonenfarbene Portale erzeugen", "colourful_portals.midnightconfig.magenta": "Blöcke, die magentafarbene Portale erzeugen", - "colourful_portals.midnightconfig.none": "Blöcke, die vollständig transparente Portale erstellen", + "colourful_portals.midnightconfig.none": "Blöcke, die vollständig transparente Portale erzeugen", "colourful_portals.midnightconfig.orange": "Blöcke, die orangefarbene Portale erzeugen", "colourful_portals.midnightconfig.pink": "Blöcke, die rosa Portale erzeugen", "colourful_portals.midnightconfig.purple": "Blöcke, die violette Portale erzeugen", "colourful_portals.midnightconfig.red": "Blöcke, die rote Portale erzeugen", "colourful_portals.midnightconfig.white": "Blöcke, die weiße Portale erzeugen", "colourful_portals.midnightconfig.yellow": "Blöcke, die gelbe Portale erzeugen", + "colourful_portals.midnightconfig.blockyPortalFluid": "Das alte Aussehen von der farbenfrohen Flüssigkeit wiederherstellen", + "colourful_portals.midnightconfig.pearlDimensionWeights": "Die Gewichtungen für verschiedene Dimensionen bei Dimensionswechsel (bearbeitbar nur über die Konfigurationsdatei)", + "colourful_portals.midnightconfig.pearlSameDimensionLikelihood": "Die Wahrscheinlichkeit bei einer Teleportation mit einer Farbenfrohen Perle in der selben Dimension zu verbleiben", + "colourful_portals.midnightconfig.maxPearlDistance": "Der Mindestabstand, um den der Spieler von einer farbenfrohen Perle teleportiert werden", + "colourful_portals.midnightconfig.minPearlDistance": "Der Maximalabstand, um den der Spieler von einer farbenfrohen Perle teleportiert werden", + "colourful_portals.midnightconfig.category.portal_colours": "Portalblöcke", + "colourful_portals.midnightconfig.category.visuals": "Visuell", + "colourful_portals.midnightconfig.category.colourful_pearl": "Farbenfrohe Perle", + "colourful_portals.midnightconfig.category.integrations": "Mod Integrationen", + "subtitles.colourful_portals.entity.colourful_pearl.teleport_away": "Farbenfrohe Perle teleportiert weg", "item.colourful_portals.colour_blob_bright": "Heller Farbmix", "item.colourful_portals.colour_blob_dark": "Dunkler Farbmix", "item.colourful_portals.portal_fluid_bucket": "Farbeimer", - "tag.block.c.crystals": "Kristalle", - "tag.block.c.slime_balls": "Schleimbälle" + "tag.block.c.slime_balls": "Schleimbälle", + "tag.block.c.crystals": "Kristalle" } \ No newline at end of file diff --git a/src/main/resources/assets/colourful_portals/lang/en_us.json b/src/main/resources/assets/colourful_portals/lang/en_us.json index ed391fa..02e73f3 100644 --- a/src/main/resources/assets/colourful_portals/lang/en_us.json +++ b/src/main/resources/assets/colourful_portals/lang/en_us.json @@ -6,7 +6,8 @@ "colourful_portals.midnightconfig.blue": "Blocks that create blue portals", "colourful_portals.midnightconfig.brown": "Blocks that create brown portals", "colourful_portals.midnightconfig.cyan": "Blocks that create cyan portals", - "colourful_portals.midnightconfig.explanation": "This configuration allows you to define additional/other portal blocks.\nPortals from these connect to others from the same block.\nThe list to which the block is added only determines the portal color.\nChanges take effect for new portals or when a portal is updated.", + "colourful_portals.midnightconfig.explanation1": "This configuration allows you to define additional/other portal blocks.\nPortals from these connect to others from the same block.", + "colourful_portals.midnightconfig.explanation2": "The list to which the block is added only determines the portal color.\nChanges take effect for new portals or when a portal is updated.", "colourful_portals.midnightconfig.gray": "Blocks that create gray portals", "colourful_portals.midnightconfig.green": "Blocks that create green portals", "colourful_portals.midnightconfig.light_blue": "Blocks that create light blue portals", @@ -20,6 +21,16 @@ "colourful_portals.midnightconfig.red": "Blocks that create red portals", "colourful_portals.midnightconfig.white": "Blocks that create white portals", "colourful_portals.midnightconfig.yellow": "Blocks that create yellow portals", + "colourful_portals.midnightconfig.blockyPortalFluid": "Use the old Portal Fluid look", + "colourful_portals.midnightconfig.pearlDimensionWeights": "The weight for the different dimensions on dimension switch (only editable in config file)", + "colourful_portals.midnightconfig.pearlSameDimensionLikelihood": "Likelihood for a colourful pearl to teleport within the same dimension", + "colourful_portals.midnightconfig.maxPearlDistance": "The maximal distance a colourful pearl will teleport the player", + "colourful_portals.midnightconfig.minPearlDistance": "The minimal distance a colourful pearl will teleport the player", + "colourful_portals.midnightconfig.category.portal_colours": "Portal Blocks", + "colourful_portals.midnightconfig.category.visuals": "Visual", + "colourful_portals.midnightconfig.category.colourful_pearl": "Colourful Pearl", + "colourful_portals.midnightconfig.category.integrations": "Mod Integrations", + "subtitles.colourful_portals.entity.colourful_pearl.teleport_away": "Colourful pearl teleporting away", "item.colourful_portals.colour_blob_bright": "Bright Colour Mix", "item.colourful_portals.colour_blob_dark": "Dark Colour Mix", "item.colourful_portals.portal_fluid_bucket": "Colourful Bucket", diff --git a/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle.json b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle.json new file mode 100644 index 0000000..3d0de4e --- /dev/null +++ b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle.json @@ -0,0 +1,24 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/honey_bottle" + }, + "overrides": [ + { "predicate": { "color_id": 0 }, "model": "colourful_portals:item/colourful_air_bottle/white" }, + { "predicate": { "color_id": 1 }, "model": "colourful_portals:item/colourful_air_bottle/orange" }, + { "predicate": { "color_id": 2 }, "model": "colourful_portals:item/colourful_air_bottle/magenta" }, + { "predicate": { "color_id": 3 }, "model": "colourful_portals:item/colourful_air_bottle/light_blue" }, + { "predicate": { "color_id": 4 }, "model": "colourful_portals:item/colourful_air_bottle/yellow" }, + { "predicate": { "color_id": 5 }, "model": "colourful_portals:item/colourful_air_bottle/lime" }, + { "predicate": { "color_id": 6 }, "model": "colourful_portals:item/colourful_air_bottle/pink" }, + { "predicate": { "color_id": 7 }, "model": "colourful_portals:item/colourful_air_bottle/gray" }, + { "predicate": { "color_id": 8 }, "model": "colourful_portals:item/colourful_air_bottle/light_gray" }, + { "predicate": { "color_id": 9 }, "model": "colourful_portals:item/colourful_air_bottle/cyan" }, + { "predicate": { "color_id": 10 }, "model": "colourful_portals:item/colourful_air_bottle/purple" }, + { "predicate": { "color_id": 11 }, "model": "colourful_portals:item/colourful_air_bottle/blue" }, + { "predicate": { "color_id": 12 }, "model": "colourful_portals:item/colourful_air_bottle/brown" }, + { "predicate": { "color_id": 13 }, "model": "colourful_portals:item/colourful_air_bottle/green" }, + { "predicate": { "color_id": 14 }, "model": "colourful_portals:item/colourful_air_bottle/red" }, + { "predicate": { "color_id": 15 }, "model": "colourful_portals:item/colourful_air_bottle/black" } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/black.json b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/black.json new file mode 100644 index 0000000..62b600f --- /dev/null +++ b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/black.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "colourful_portals:item/colourful_air_bottle/black" + } +} diff --git a/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/blue.json b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/blue.json new file mode 100644 index 0000000..47761ff --- /dev/null +++ b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/blue.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "colourful_portals:item/colourful_air_bottle/blue" + } +} diff --git a/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/brown.json b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/brown.json new file mode 100644 index 0000000..1d16694 --- /dev/null +++ b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/brown.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "colourful_portals:item/colourful_air_bottle/brown" + } +} diff --git a/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/cyan.json b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/cyan.json new file mode 100644 index 0000000..eae3faf --- /dev/null +++ b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/cyan.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "colourful_portals:item/colourful_air_bottle/cyan" + } +} diff --git a/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/gray.json b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/gray.json new file mode 100644 index 0000000..4a63ecf --- /dev/null +++ b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/gray.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "colourful_portals:item/colourful_air_bottle/gray" + } +} diff --git a/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/green.json b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/green.json new file mode 100644 index 0000000..ed4504f --- /dev/null +++ b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/green.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "colourful_portals:item/colourful_air_bottle/green" + } +} diff --git a/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/light_blue.json b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/light_blue.json new file mode 100644 index 0000000..1ef7ebf --- /dev/null +++ b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/light_blue.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "colourful_portals:item/colourful_air_bottle/light_blue" + } +} diff --git a/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/light_gray.json b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/light_gray.json new file mode 100644 index 0000000..34b4df9 --- /dev/null +++ b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/light_gray.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "colourful_portals:item/colourful_air_bottle/light_gray" + } +} diff --git a/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/lime.json b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/lime.json new file mode 100644 index 0000000..d31e6cc --- /dev/null +++ b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/lime.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "colourful_portals:item/colourful_air_bottle/lime" + } +} diff --git a/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/magenta.json b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/magenta.json new file mode 100644 index 0000000..780537a --- /dev/null +++ b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/magenta.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "colourful_portals:item/colourful_air_bottle/magenta" + } +} diff --git a/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/orange.json b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/orange.json new file mode 100644 index 0000000..c77dae4 --- /dev/null +++ b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/orange.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "colourful_portals:item/colourful_air_bottle/orange" + } +} diff --git a/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/pink.json b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/pink.json new file mode 100644 index 0000000..9678adf --- /dev/null +++ b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/pink.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "colourful_portals:item/colourful_air_bottle/pink" + } +} diff --git a/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/purple.json b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/purple.json new file mode 100644 index 0000000..4b750f2 --- /dev/null +++ b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/purple.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "colourful_portals:item/colourful_air_bottle/purple" + } +} diff --git a/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/red.json b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/red.json new file mode 100644 index 0000000..00e9c7c --- /dev/null +++ b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/red.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "colourful_portals:item/colourful_air_bottle/red" + } +} diff --git a/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/white.json b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/white.json new file mode 100644 index 0000000..1dc659f --- /dev/null +++ b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/white.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "colourful_portals:item/colourful_air_bottle/white" + } +} diff --git a/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/yellow.json b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/yellow.json new file mode 100644 index 0000000..77d0502 --- /dev/null +++ b/src/main/resources/assets/colourful_portals/models/item/colourful_air_bottle/yellow.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "colourful_portals:item/colourful_air_bottle/yellow" + } +} diff --git a/src/main/resources/assets/colourful_portals/models/item/colourful_pearl.json b/src/main/resources/assets/colourful_portals/models/item/colourful_pearl.json new file mode 100644 index 0000000..08e9804 --- /dev/null +++ b/src/main/resources/assets/colourful_portals/models/item/colourful_pearl.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "colourful_portals:item/colourful_pearl" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/colourful_portals/particles/black_colourful_air_sparkle.json b/src/main/resources/assets/colourful_portals/particles/black_colourful_air_sparkle.json new file mode 100644 index 0000000..9455e78 --- /dev/null +++ b/src/main/resources/assets/colourful_portals/particles/black_colourful_air_sparkle.json @@ -0,0 +1,12 @@ +{ + "textures": [ + "colourful_portals:colourful_air_particle/black_colourful_air_0_0", + "colourful_portals:colourful_air_particle/black_colourful_air_0_1", + "colourful_portals:colourful_air_particle/black_colourful_air_1_0", + "colourful_portals:colourful_air_particle/black_colourful_air_1_1", + "colourful_portals:colourful_air_particle/black_colourful_air_2_0", + "colourful_portals:colourful_air_particle/black_colourful_air_2_1", + "colourful_portals:colourful_air_particle/black_colourful_air_3_0", + "colourful_portals:colourful_air_particle/black_colourful_air_3_1" + ] +} diff --git a/src/main/resources/assets/colourful_portals/particles/blue_colourful_air_sparkle.json b/src/main/resources/assets/colourful_portals/particles/blue_colourful_air_sparkle.json new file mode 100644 index 0000000..4ddcbf6 --- /dev/null +++ b/src/main/resources/assets/colourful_portals/particles/blue_colourful_air_sparkle.json @@ -0,0 +1,12 @@ +{ + "textures": [ + "colourful_portals:colourful_air_particle/blue_colourful_air_0_0", + "colourful_portals:colourful_air_particle/blue_colourful_air_0_1", + "colourful_portals:colourful_air_particle/blue_colourful_air_1_0", + "colourful_portals:colourful_air_particle/blue_colourful_air_1_1", + "colourful_portals:colourful_air_particle/blue_colourful_air_2_0", + "colourful_portals:colourful_air_particle/blue_colourful_air_2_1", + "colourful_portals:colourful_air_particle/blue_colourful_air_3_0", + "colourful_portals:colourful_air_particle/blue_colourful_air_3_1" + ] +} diff --git a/src/main/resources/assets/colourful_portals/particles/brown_colourful_air_sparkle.json b/src/main/resources/assets/colourful_portals/particles/brown_colourful_air_sparkle.json new file mode 100644 index 0000000..81b4508 --- /dev/null +++ b/src/main/resources/assets/colourful_portals/particles/brown_colourful_air_sparkle.json @@ -0,0 +1,12 @@ +{ + "textures": [ + "colourful_portals:colourful_air_particle/brown_colourful_air_0_0", + "colourful_portals:colourful_air_particle/brown_colourful_air_0_1", + "colourful_portals:colourful_air_particle/brown_colourful_air_1_0", + "colourful_portals:colourful_air_particle/brown_colourful_air_1_1", + "colourful_portals:colourful_air_particle/brown_colourful_air_2_0", + "colourful_portals:colourful_air_particle/brown_colourful_air_2_1", + "colourful_portals:colourful_air_particle/brown_colourful_air_3_0", + "colourful_portals:colourful_air_particle/brown_colourful_air_3_1" + ] +} diff --git a/src/main/resources/assets/colourful_portals/particles/colourful_air_particle.json b/src/main/resources/assets/colourful_portals/particles/colourful_air_particle.json new file mode 100644 index 0000000..97055ae --- /dev/null +++ b/src/main/resources/assets/colourful_portals/particles/colourful_air_particle.json @@ -0,0 +1,132 @@ +{ + "textures": [ + "black_colourful_air_0_0", + "black_colourful_air_0_1", + "black_colourful_air_1_0", + "black_colourful_air_1_1", + "black_colourful_air_2_0", + "black_colourful_air_2_1", + "black_colourful_air_3_0", + "black_colourful_air_3_1", + "blue_colourful_air_0_0", + "blue_colourful_air_0_1", + "blue_colourful_air_1_0", + "blue_colourful_air_1_1", + "blue_colourful_air_2_0", + "blue_colourful_air_2_1", + "blue_colourful_air_3_0", + "blue_colourful_air_3_1", + "brown_colourful_air_0_0", + "brown_colourful_air_0_1", + "brown_colourful_air_1_0", + "brown_colourful_air_1_1", + "brown_colourful_air_2_0", + "brown_colourful_air_2_1", + "brown_colourful_air_3_0", + "brown_colourful_air_3_1", + "cyan_colourful_air_0_0", + "cyan_colourful_air_0_1", + "cyan_colourful_air_1_0", + "cyan_colourful_air_1_1", + "cyan_colourful_air_2_0", + "cyan_colourful_air_2_1", + "cyan_colourful_air_3_0", + "cyan_colourful_air_3_1", + "green_colourful_air_0_0", + "green_colourful_air_0_1", + "green_colourful_air_1_0", + "green_colourful_air_1_1", + "green_colourful_air_2_0", + "green_colourful_air_2_1", + "green_colourful_air_3_0", + "green_colourful_air_3_1", + "grey_colourful_air_0_0", + "grey_colourful_air_0_1", + "grey_colourful_air_1_0", + "grey_colourful_air_1_1", + "grey_colourful_air_2_0", + "grey_colourful_air_2_1", + "grey_colourful_air_3_0", + "grey_colourful_air_3_1", + "light_blue_colourful_air_0_0", + "light_blue_colourful_air_0_1", + "light_blue_colourful_air_1_0", + "light_blue_colourful_air_1_1", + "light_blue_colourful_air_2_0", + "light_blue_colourful_air_2_1", + "light_blue_colourful_air_3_0", + "light_blue_colourful_air_3_1", + "light_grey_colourful_air_0_0", + "light_grey_colourful_air_0_1", + "light_grey_colourful_air_1_0", + "light_grey_colourful_air_1_1", + "light_grey_colourful_air_2_0", + "light_grey_colourful_air_2_1", + "light_grey_colourful_air_3_0", + "light_grey_colourful_air_3_1", + "lime_colourful_air_0_0", + "lime_colourful_air_0_1", + "lime_colourful_air_1_0", + "lime_colourful_air_1_1", + "lime_colourful_air_2_0", + "lime_colourful_air_2_1", + "lime_colourful_air_3_0", + "lime_colourful_air_3_1", + "magenta_colourful_air_0_0", + "magenta_colourful_air_0_1", + "magenta_colourful_air_1_0", + "magenta_colourful_air_1_1", + "magenta_colourful_air_2_0", + "magenta_colourful_air_2_1", + "magenta_colourful_air_3_0", + "magenta_colourful_air_3_1", + "orange_colourful_air_0_0", + "orange_colourful_air_0_1", + "orange_colourful_air_1_0", + "orange_colourful_air_1_1", + "orange_colourful_air_2_0", + "orange_colourful_air_2_1", + "orange_colourful_air_3_0", + "orange_colourful_air_3_1", + "pink_colourful_air_0_0", + "pink_colourful_air_0_1", + "pink_colourful_air_1_0", + "pink_colourful_air_1_1", + "pink_colourful_air_2_0", + "pink_colourful_air_2_1", + "pink_colourful_air_3_0", + "pink_colourful_air_3_1", + "purple_colourful_air_0_0", + "purple_colourful_air_0_1", + "purple_colourful_air_1_0", + "purple_colourful_air_1_1", + "purple_colourful_air_2_0", + "purple_colourful_air_2_1", + "purple_colourful_air_3_0", + "purple_colourful_air_3_1", + "red_colourful_air_0_0", + "red_colourful_air_0_1", + "red_colourful_air_1_0", + "red_colourful_air_1_1", + "red_colourful_air_2_0", + "red_colourful_air_2_1", + "red_colourful_air_3_0", + "red_colourful_air_3_1", + "white_colourful_air_0_0", + "white_colourful_air_0_1", + "white_colourful_air_1_0", + "white_colourful_air_1_1", + "white_colourful_air_2_0", + "white_colourful_air_2_1", + "white_colourful_air_3_0", + "white_colourful_air_3_1", + "yellow_colourful_air_0_0", + "yellow_colourful_air_0_1", + "yellow_colourful_air_1_0", + "yellow_colourful_air_1_1", + "yellow_colourful_air_2_0", + "yellow_colourful_air_2_1", + "yellow_colourful_air_3_0", + "yellow_colourful_air_3_1" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/colourful_portals/particles/cyan_colourful_air_sparkle.json b/src/main/resources/assets/colourful_portals/particles/cyan_colourful_air_sparkle.json new file mode 100644 index 0000000..b351753 --- /dev/null +++ b/src/main/resources/assets/colourful_portals/particles/cyan_colourful_air_sparkle.json @@ -0,0 +1,12 @@ +{ + "textures": [ + "colourful_portals:colourful_air_particle/cyan_colourful_air_0_0", + "colourful_portals:colourful_air_particle/cyan_colourful_air_0_1", + "colourful_portals:colourful_air_particle/cyan_colourful_air_1_0", + "colourful_portals:colourful_air_particle/cyan_colourful_air_1_1", + "colourful_portals:colourful_air_particle/cyan_colourful_air_2_0", + "colourful_portals:colourful_air_particle/cyan_colourful_air_2_1", + "colourful_portals:colourful_air_particle/cyan_colourful_air_3_0", + "colourful_portals:colourful_air_particle/cyan_colourful_air_3_1" + ] +} diff --git a/src/main/resources/assets/colourful_portals/particles/gray_colourful_air_sparkle.json b/src/main/resources/assets/colourful_portals/particles/gray_colourful_air_sparkle.json new file mode 100644 index 0000000..4eadd5b --- /dev/null +++ b/src/main/resources/assets/colourful_portals/particles/gray_colourful_air_sparkle.json @@ -0,0 +1,12 @@ +{ + "textures": [ + "colourful_portals:colourful_air_particle/grey_colourful_air_0_0", + "colourful_portals:colourful_air_particle/grey_colourful_air_0_1", + "colourful_portals:colourful_air_particle/grey_colourful_air_1_0", + "colourful_portals:colourful_air_particle/grey_colourful_air_1_1", + "colourful_portals:colourful_air_particle/grey_colourful_air_2_0", + "colourful_portals:colourful_air_particle/grey_colourful_air_2_1", + "colourful_portals:colourful_air_particle/grey_colourful_air_3_0", + "colourful_portals:colourful_air_particle/grey_colourful_air_3_1" + ] +} diff --git a/src/main/resources/assets/colourful_portals/particles/green_colourful_air_sparkle.json b/src/main/resources/assets/colourful_portals/particles/green_colourful_air_sparkle.json new file mode 100644 index 0000000..58946ef --- /dev/null +++ b/src/main/resources/assets/colourful_portals/particles/green_colourful_air_sparkle.json @@ -0,0 +1,12 @@ +{ + "textures": [ + "colourful_portals:colourful_air_particle/green_colourful_air_0_0", + "colourful_portals:colourful_air_particle/green_colourful_air_0_1", + "colourful_portals:colourful_air_particle/green_colourful_air_1_0", + "colourful_portals:colourful_air_particle/green_colourful_air_1_1", + "colourful_portals:colourful_air_particle/green_colourful_air_2_0", + "colourful_portals:colourful_air_particle/green_colourful_air_2_1", + "colourful_portals:colourful_air_particle/green_colourful_air_3_0", + "colourful_portals:colourful_air_particle/green_colourful_air_3_1" + ] +} diff --git a/src/main/resources/assets/colourful_portals/particles/light_blue_colourful_air_sparkle.json b/src/main/resources/assets/colourful_portals/particles/light_blue_colourful_air_sparkle.json new file mode 100644 index 0000000..cdf41b3 --- /dev/null +++ b/src/main/resources/assets/colourful_portals/particles/light_blue_colourful_air_sparkle.json @@ -0,0 +1,12 @@ +{ + "textures": [ + "colourful_portals:colourful_air_particle/light_blue_colourful_air_0_0", + "colourful_portals:colourful_air_particle/light_blue_colourful_air_0_1", + "colourful_portals:colourful_air_particle/light_blue_colourful_air_1_0", + "colourful_portals:colourful_air_particle/light_blue_colourful_air_1_1", + "colourful_portals:colourful_air_particle/light_blue_colourful_air_2_0", + "colourful_portals:colourful_air_particle/light_blue_colourful_air_2_1", + "colourful_portals:colourful_air_particle/light_blue_colourful_air_3_0", + "colourful_portals:colourful_air_particle/light_blue_colourful_air_3_1" + ] +} diff --git a/src/main/resources/assets/colourful_portals/particles/light_gray_colourful_air_sparkle.json b/src/main/resources/assets/colourful_portals/particles/light_gray_colourful_air_sparkle.json new file mode 100644 index 0000000..a4912e8 --- /dev/null +++ b/src/main/resources/assets/colourful_portals/particles/light_gray_colourful_air_sparkle.json @@ -0,0 +1,12 @@ +{ + "textures": [ + "colourful_portals:colourful_air_particle/light_grey_colourful_air_0_0", + "colourful_portals:colourful_air_particle/light_grey_colourful_air_0_1", + "colourful_portals:colourful_air_particle/light_grey_colourful_air_1_0", + "colourful_portals:colourful_air_particle/light_grey_colourful_air_1_1", + "colourful_portals:colourful_air_particle/light_grey_colourful_air_2_0", + "colourful_portals:colourful_air_particle/light_grey_colourful_air_2_1", + "colourful_portals:colourful_air_particle/light_grey_colourful_air_3_0", + "colourful_portals:colourful_air_particle/light_grey_colourful_air_3_1" + ] +} diff --git a/src/main/resources/assets/colourful_portals/particles/lime_colourful_air_sparkle.json b/src/main/resources/assets/colourful_portals/particles/lime_colourful_air_sparkle.json new file mode 100644 index 0000000..58f1c02 --- /dev/null +++ b/src/main/resources/assets/colourful_portals/particles/lime_colourful_air_sparkle.json @@ -0,0 +1,12 @@ +{ + "textures": [ + "colourful_portals:colourful_air_particle/lime_colourful_air_0_0", + "colourful_portals:colourful_air_particle/lime_colourful_air_0_1", + "colourful_portals:colourful_air_particle/lime_colourful_air_1_0", + "colourful_portals:colourful_air_particle/lime_colourful_air_1_1", + "colourful_portals:colourful_air_particle/lime_colourful_air_2_0", + "colourful_portals:colourful_air_particle/lime_colourful_air_2_1", + "colourful_portals:colourful_air_particle/lime_colourful_air_3_0", + "colourful_portals:colourful_air_particle/lime_colourful_air_3_1" + ] +} diff --git a/src/main/resources/assets/colourful_portals/particles/magenta_colourful_air_sparkle.json b/src/main/resources/assets/colourful_portals/particles/magenta_colourful_air_sparkle.json new file mode 100644 index 0000000..2916ad6 --- /dev/null +++ b/src/main/resources/assets/colourful_portals/particles/magenta_colourful_air_sparkle.json @@ -0,0 +1,12 @@ +{ + "textures": [ + "colourful_portals:colourful_air_particle/magenta_colourful_air_0_0", + "colourful_portals:colourful_air_particle/magenta_colourful_air_0_1", + "colourful_portals:colourful_air_particle/magenta_colourful_air_1_0", + "colourful_portals:colourful_air_particle/magenta_colourful_air_1_1", + "colourful_portals:colourful_air_particle/magenta_colourful_air_2_0", + "colourful_portals:colourful_air_particle/magenta_colourful_air_2_1", + "colourful_portals:colourful_air_particle/magenta_colourful_air_3_0", + "colourful_portals:colourful_air_particle/magenta_colourful_air_3_1" + ] +} diff --git a/src/main/resources/assets/colourful_portals/particles/orange_colourful_air_sparkle.json b/src/main/resources/assets/colourful_portals/particles/orange_colourful_air_sparkle.json new file mode 100644 index 0000000..703cc97 --- /dev/null +++ b/src/main/resources/assets/colourful_portals/particles/orange_colourful_air_sparkle.json @@ -0,0 +1,12 @@ +{ + "textures": [ + "colourful_portals:colourful_air_particle/orange_colourful_air_0_0", + "colourful_portals:colourful_air_particle/orange_colourful_air_0_1", + "colourful_portals:colourful_air_particle/orange_colourful_air_1_0", + "colourful_portals:colourful_air_particle/orange_colourful_air_1_1", + "colourful_portals:colourful_air_particle/orange_colourful_air_2_0", + "colourful_portals:colourful_air_particle/orange_colourful_air_2_1", + "colourful_portals:colourful_air_particle/orange_colourful_air_3_0", + "colourful_portals:colourful_air_particle/orange_colourful_air_3_1" + ] +} diff --git a/src/main/resources/assets/colourful_portals/particles/pink_colourful_air_sparkle.json b/src/main/resources/assets/colourful_portals/particles/pink_colourful_air_sparkle.json new file mode 100644 index 0000000..4a623d5 --- /dev/null +++ b/src/main/resources/assets/colourful_portals/particles/pink_colourful_air_sparkle.json @@ -0,0 +1,12 @@ +{ + "textures": [ + "colourful_portals:colourful_air_particle/pink_colourful_air_0_0", + "colourful_portals:colourful_air_particle/pink_colourful_air_0_1", + "colourful_portals:colourful_air_particle/pink_colourful_air_1_0", + "colourful_portals:colourful_air_particle/pink_colourful_air_1_1", + "colourful_portals:colourful_air_particle/pink_colourful_air_2_0", + "colourful_portals:colourful_air_particle/pink_colourful_air_2_1", + "colourful_portals:colourful_air_particle/pink_colourful_air_3_0", + "colourful_portals:colourful_air_particle/pink_colourful_air_3_1" + ] +} diff --git a/src/main/resources/assets/colourful_portals/particles/purple_colourful_air_sparkle.json b/src/main/resources/assets/colourful_portals/particles/purple_colourful_air_sparkle.json new file mode 100644 index 0000000..2a3a56b --- /dev/null +++ b/src/main/resources/assets/colourful_portals/particles/purple_colourful_air_sparkle.json @@ -0,0 +1,12 @@ +{ + "textures": [ + "colourful_portals:colourful_air_particle/purple_colourful_air_0_0", + "colourful_portals:colourful_air_particle/purple_colourful_air_0_1", + "colourful_portals:colourful_air_particle/purple_colourful_air_1_0", + "colourful_portals:colourful_air_particle/purple_colourful_air_1_1", + "colourful_portals:colourful_air_particle/purple_colourful_air_2_0", + "colourful_portals:colourful_air_particle/purple_colourful_air_2_1", + "colourful_portals:colourful_air_particle/purple_colourful_air_3_0", + "colourful_portals:colourful_air_particle/purple_colourful_air_3_1" + ] +} diff --git a/src/main/resources/assets/colourful_portals/particles/red_colourful_air_sparkle.json b/src/main/resources/assets/colourful_portals/particles/red_colourful_air_sparkle.json new file mode 100644 index 0000000..83aa6a7 --- /dev/null +++ b/src/main/resources/assets/colourful_portals/particles/red_colourful_air_sparkle.json @@ -0,0 +1,12 @@ +{ + "textures": [ + "colourful_portals:colourful_air_particle/red_colourful_air_0_0", + "colourful_portals:colourful_air_particle/red_colourful_air_0_1", + "colourful_portals:colourful_air_particle/red_colourful_air_1_0", + "colourful_portals:colourful_air_particle/red_colourful_air_1_1", + "colourful_portals:colourful_air_particle/red_colourful_air_2_0", + "colourful_portals:colourful_air_particle/red_colourful_air_2_1", + "colourful_portals:colourful_air_particle/red_colourful_air_3_0", + "colourful_portals:colourful_air_particle/red_colourful_air_3_1" + ] +} diff --git a/src/main/resources/assets/colourful_portals/particles/white_colourful_air_sparkle.json b/src/main/resources/assets/colourful_portals/particles/white_colourful_air_sparkle.json new file mode 100644 index 0000000..020fb1c --- /dev/null +++ b/src/main/resources/assets/colourful_portals/particles/white_colourful_air_sparkle.json @@ -0,0 +1,12 @@ +{ + "textures": [ + "colourful_portals:colourful_air_particle/white_colourful_air_0_0", + "colourful_portals:colourful_air_particle/white_colourful_air_0_1", + "colourful_portals:colourful_air_particle/white_colourful_air_1_0", + "colourful_portals:colourful_air_particle/white_colourful_air_1_1", + "colourful_portals:colourful_air_particle/white_colourful_air_2_0", + "colourful_portals:colourful_air_particle/white_colourful_air_2_1", + "colourful_portals:colourful_air_particle/white_colourful_air_3_0", + "colourful_portals:colourful_air_particle/white_colourful_air_3_1" + ] +} diff --git a/src/main/resources/assets/colourful_portals/particles/yellow_colourful_air_sparkle.json b/src/main/resources/assets/colourful_portals/particles/yellow_colourful_air_sparkle.json new file mode 100644 index 0000000..a1f7599 --- /dev/null +++ b/src/main/resources/assets/colourful_portals/particles/yellow_colourful_air_sparkle.json @@ -0,0 +1,12 @@ +{ + "textures": [ + "colourful_portals:colourful_air_particle/yellow_colourful_air_0_0", + "colourful_portals:colourful_air_particle/yellow_colourful_air_0_1", + "colourful_portals:colourful_air_particle/yellow_colourful_air_1_0", + "colourful_portals:colourful_air_particle/yellow_colourful_air_1_1", + "colourful_portals:colourful_air_particle/yellow_colourful_air_2_0", + "colourful_portals:colourful_air_particle/yellow_colourful_air_2_1", + "colourful_portals:colourful_air_particle/yellow_colourful_air_3_0", + "colourful_portals:colourful_air_particle/yellow_colourful_air_3_1" + ] +} diff --git a/src/main/resources/assets/colourful_portals/sounds.json b/src/main/resources/assets/colourful_portals/sounds.json new file mode 100644 index 0000000..cf4b5a7 --- /dev/null +++ b/src/main/resources/assets/colourful_portals/sounds.json @@ -0,0 +1,11 @@ +{ + "entity.colourful_pearl.teleport_away": { + "subtitle": "subtitles.colourful_portals.entity.colourful_pearl.teleport_away", + "sounds": [ + { + "name": "colourful_portals:teleport_away", + "attenuation_distance": 64 + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/colourful_portals/sounds/teleport_away.ogg b/src/main/resources/assets/colourful_portals/sounds/teleport_away.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2eae91def4ee1ff0ca82f4e9d7863388e55b3c75 GIT binary patch literal 110252 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 KP?Adm*&qUEs5xi= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/item/colourful_pearl.png b/src/main/resources/assets/colourful_portals/textures/item/colourful_pearl.png new file mode 100644 index 0000000000000000000000000000000000000000..9f245d4e91c7c2566c840523f4be1dd417629cc9 GIT binary patch literal 572 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMf+W?;sS0K&A#H7x`Y{Jg!$jz}q zPi?B2ybnLO6fbL-sa(FBrnMB4o;0tyqCkQ!tDg$<@(_W1Gxh){o}zd$TO;f||(lIho)7F)eQ{dv^ z6%Z2P;WrYM^kU~!6%?`O;WOgl;b&!KV`t}JW@eFL)%26hHsp2D<FD)G%-X}G*Gp!8_fB)FEyOC8TWl8GMot85q_v|^yW jIRP0Jw|@VxPhn=@VEE5?rq*&QP@KWj)z4*}Q$iB}TG`*y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/black_colourful_air_0_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/black_colourful_air_0_0.png new file mode 100644 index 0000000000000000000000000000000000000000..f1c2575b0c81ce7f91df207d3101670e99a788b6 GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;;NvaA}6OLC#MJ` zOBw#l$}0T-|KIEuTOm*ZTS<^#aC=>Q`>OUChI=f4B8*Ai?k;SJX*+6x9QG1VUsv`Q z9PDDcY+h{%`amH;PZ!4!j_b(@AqfVY2?o4C*S=@eUb*IhNPUt44$rjF6*2UngG2u BUhMz? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/black_colourful_air_0_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/black_colourful_air_0_1.png new file mode 100644 index 0000000000000000000000000000000000000000..ad967c9fb3d0d60630739673de7474a4d5bf4fb3 GIT binary patch literal 358 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAr#;f;wmevRLbyQK|$pU z!+#kW#sB~RzeufL0hDDe3GxeWU)6r8{rF{lPoMx}lDE4H>yP}G$AKL75>H=O_7@!N zV!CWzZ3+57Awf?U#}JO|$q69|0%8dTDGUruLJVzHzc?=eB~?pYBT7;dOH!?pi&B9U zgOP!eiLQZ#u7P=ok&%^&k(IH9wt<0_fq{;6_k9!%x%nxXX_dG&#JU+L12rgvY)H$@ zNzF^lO|?o&EKX%e%1KPlj!(|d$uBKRE6s^d%q)sGI1%q+4^+FVdQ&MBb@05?}* A`Tzg` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/black_colourful_air_1_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/black_colourful_air_1_0.png new file mode 100644 index 0000000000000000000000000000000000000000..821e67f2b80c997ef853144a54dce4cf9aca47d8 GIT binary patch literal 358 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAr#;f;wmSn1Vjo7DzdVQ zUl{%a!CYQQz@c^t@LFY)wsWq-lJE~d-o z)s~>7V8TB~?pYBT7;dOH!?pi&B9UgOP!e ziLQZ#u7P=ok&%^&k(IH9wt<0_fq{;6_k9!%x%nxXX_dG&#JU+L12rgvY)H$@NzF^l wO|?o&EKX%e%1KPlj!(|d$uBKRE6s^d%q)sG+#gZ05~!TP)78&qol`;+0C^8$4*&oF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/black_colourful_air_1_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/black_colourful_air_1_1.png new file mode 100644 index 0000000000000000000000000000000000000000..66c50017ef2a72865d1d8553bf1d12d30af9759e GIT binary patch literal 358 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAr#;f;wmSn_=VxWf`ZC_ z25vbyrT_o`?-1Et3zTIo3GxeWU)6r8{rF{lPoMx}lDE4H>yP}G$AKL75>H=O_7@!N zV!CWzZ3+57Awf?U#}JO|$q69|0%8dTAq)&mMhwd??mD#sD5+ZF8c~vxSdwa$T$Bo= z7>o>zOmqz_bPdcyjEt;IjI4|;v<(cb3=DLnyYHiD$jwj5OsmALA=b?}8K^-SWJ6kJ zPHJ9aZmLyMVsR=%QchxWc6@SvPJU@oT4_#vVrEgi;r@t{l|bbTp00i_>zopr00kam Aj{pDw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/black_colourful_air_2_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/black_colourful_air_2_0.png new file mode 100644 index 0000000000000000000000000000000000000000..779bb3e02de94bdc25ccd0ae4759d11dc0e7b5dd GIT binary patch literal 358 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAr#;f;wmGfC@ZVP(EVRQ zK}A|x;s5{t6=t?T9Sp1`L4LvQ?W@|`lP;-n00kJ6yxm<`f8@VB4&<21szu;gO z(`EB&OV9@j33|FXhHzX@P7p{)FiI#e1M2w6ux-}qXl@vNAEUGPck*Ft9Q((2?%GkD?(rKP5A*61Rp}H{)cW24#>9X_+~x yd5O8HR!ND)sSHUuiOJdV$@w|?rA29_Iq`{^Me#;zfvUnl5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAr#;f;wmSn#L)ep;r|yo zIYn7nh5!HmGgzNl2b5(k3GxeWUv;UyJu4#%WFupex4R4LkNlU%fgJV{PhVH|7aZ(j zx@=x;3Hm@GK~ERQ5RU7~2`LEzLJ0;XKpnmeQ%@h5D+!cTEpd$~Nl7e8wMs5Z1yT$~ z21X{j1{S&o<{?H#RwhPP#unNJ237_JI?~5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;wmevC?}_+pr9fr zr^xXCi>$1||Ns9b?RRSe6|j{A`31KF!K(JVqJ1Jj5ym8McNezAv>mlT4tt5GuPgft z4t6nJHm|k>eV~w_r;B3<$MxidkOYIo1P)UM2Bz~2x0~{R1Kq%&TH+c}l9E`GYL#4+ z3Zxi}42(>44J>pG%tMTftW1ooj4iYc46F5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAr#;f;wmSn#PI)%f`SV7 ze+D@@#sB~Rm))$$1DJL;GJ3cu-C%?2Ptu!Y-F|#P%I514K6{wuS)78&qol`;+03tVG A&Hw-a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/blue_colourful_air_0_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/blue_colourful_air_0_0.png new file mode 100644 index 0000000000000000000000000000000000000000..e590e46d10945ee0e1437753489a8316fec90bae GIT binary patch literal 373 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAs65i;_BeE)!AvUhwC9P z*W>LB|NWef`#T>GayTCBaQy%O{}LI_5kQrkB|(0{?Le>!M4Z1q%^fJnnB?v5!uj#$ z(l5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;%e`-v7O<+gVWak z3_k*#jt4m$|NsBLLk!DLpaQm%Aiv=DRqdDB+t*2676pnhCV9KNuqCGLs0DJ^OFVsD z*o>zOmqz_bPdcyjEt;IjI4|;v<(cb3=DLnyYHiD$jwj5OsmALA=b?}8K^-C zWJ6kJPHJ9aZmLyMVsR=%Qch`Vd~$wHerZu!X-<4%W>LJsqPXdxz+~`r^>bP0l+XkK D>!@Ud literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/blue_colourful_air_1_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/blue_colourful_air_1_0.png new file mode 100644 index 0000000000000000000000000000000000000000..0b424a1b930a04a12586713e33b8e625ee16ff18 GIT binary patch literal 365 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgArasc;%eiv%FcP6gVT0f zmsS56emFbrc6HwO|NsAnO_5?iHS8rpe!=ZPu&TX%_f3nxKq1B?Z+91VvBZwoV0lkp zSN0bi>|(lXUTq2bKp{a-7sn8e>&Xcr2?m@A0$xBD?_`u9nO2EgL#&%|GEjpO z$cD7coYcI;+*GTi#Nt$jq@2>!_~iVY{L-Sd(wz9j%%XV1tC7o(097-1y85}Sb4q9e E0P&e-)Bpeg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/blue_colourful_air_1_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/blue_colourful_air_1_1.png new file mode 100644 index 0000000000000000000000000000000000000000..93a7a6fe20dbb6c5bdf6b70f1041ba67f52a8289 GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;%e=>{6E7F2dC}- z*%@q|*SR|H`~Uxc%K8tFfC|`3g8YKpSG8YiZ(k>QSrjP3nB?v5!j_n}qZY_vFY)ws zWq-lJE~d-o)s~IjMPxxv5r3iN&c5Njasd@yYo)`K3i^r8)75nMLu2S0k4n0jg&3boFyt=akR{ E0Bgu)xc~qF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/blue_colourful_air_2_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/blue_colourful_air_2_0.png new file mode 100644 index 0000000000000000000000000000000000000000..444a590a4c77d767cfc8f277e426b4aa821b4345 GIT binary patch literal 365 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgArasc;%e`-(ZOk}qti}D zr(Fz{|Giv~Iy>$C|Np<|MRsMN8upSPzu@-v_U2XX?Iyd|uL24&CV9KNu!|*jyavmA z`ns~e;9wWiW%FuF&<6?$db&7 zRdP`(kYX@0Ff!3Ku+TLy4>2;bGBL6;w$L^(ure^vk?y{aq9HdwB{QuOw}x0Z<7A)) zC6EninK`L>iMgp(Nr}a&3`seqsqxAAIr*hUX{9;wiJ3+5Mm_=G>VT>lJYD@<);T3K F0RV6_WOD!j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/blue_colourful_air_2_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/blue_colourful_air_2_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e0d60c030ba7abaf5cd1ede3c3d1d8dd5cdf5219 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!5`og;%e=>oT2i+jq56g zAOC@%F67ZSpcG3A5F;Zi6C*2Q3vB}fD+2=^>F)a|8glbfGSez?Ylw9-P6ldF0@;w3nUk8An44;q slvtd~kd#xJ8lRk>lV4htR+5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;%e)%%HC#paQm%Aiv;tAXwFYSF}$AD8iWJ?e4;sn6{%9$YC$>^mS!_ z!ND%3%jVUVpbr!h^mK6y;kcfh5Rzb!n80Dmz`%5#;dWF0Z=f3(R7+eVN>UO_QmvAU zQh^kMk%5tku7QQFfq96Lk(G&&m9d4kfq|8QfsS zNXyJg%}dNpwMt4XPGv~SDNT(}&d5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;%eu-j^W3D57$Es z|JkiwmpeFZ|NsBLZSa&eKm}|iL4LvQv)eDVw;M$`DFa0qlf2zs*b>ur)B-u|C7!;n z>@PUj#dO)c+7k4ELV}(yjv*Y^lM_M`1jG^wco-O%k{GW2wKVzylvFKojVMV;EJ?LW zE=mPb3`PbDW^0wJ~=-pzqBZ=G$%eWvnbx!I{X+gOc)qEUHx3vIVCg! E0J{%khyVZp literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/brown_colourful_air_0_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/brown_colourful_air_0_0.png new file mode 100644 index 0000000000000000000000000000000000000000..5ec1e98acfff10bc402ffa1d29c019ecd15be8d4 GIT binary patch literal 358 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAr#;f;#%pcUFWO!pNXM4 z$gnTo^8f$;=j%)qfU>M5L4LvQ?W@|`lP;-n00kJ6yxm<`f8@VB4&<21szu;gO z(`EB&OV9@j33|FXhHzX@PDn{e5K1s81nOXB=%~A)69<%3Epd$~Nl7e8wMs5Z1yT$~ z21X{j1{S&o<{?H#RwhPP#unNJ237_JI?~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/brown_colourful_air_0_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/brown_colourful_air_0_1.png new file mode 100644 index 0000000000000000000000000000000000000000..c3d1cefe548d1d3cc2db07c416f47be6b2df2aff GIT binary patch literal 358 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAr#;f;@TW!_@9a4KSOPu zuU@66_W%F?x0&f~1j@3O1o;KGue#LUo|TaWvXL>#+ueorNB+y>Kn{C}r>`sf3l4TM zT{f?_1bv{8pr?yt2*>s0gp>pUp#*~xpblS#sizOjl>|zvmbgZgq$HN4S|t~y0x1R~ z10xe%0}EXP^AIB=D-$CtV+(Bq11kdq9qI1-C>nC}Q!>*kachWmGfoC-PzKqMmYI{9 ymzbMsm6TYV%8*o)U!E7AoS&0lT9j6r6Q7t_6mL+n^J*nfIfJLGpUXO@geCy&RAPAm literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/brown_colourful_air_1_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/brown_colourful_air_1_0.png new file mode 100644 index 0000000000000000000000000000000000000000..9a8ad526c6988353ae6b63a48213b0787a7d9e36 GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;@TWy)E93#EzP#h zSMNVVZKbF7|Ns9FW?Yj6Dqt%K@(XSUf>rHzMf*g6B8*Ai?k;SJX*+6x9QG1VUsv`Q z9PDDcY+h{%`amH;PZ!4!j_b(@AqfVF2^^*j3{2-4Za3xs2D*VkwZt`|BqgyV)hf9t z6-Y4{85o)98d&HWn1>h{S(zAF8Cz%@7+4t?=ty_pN70a*pOTqYiCaUgn{hHwgEGj5 zw9K5;yu{p8tE9x@REDIY{PMi`5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;@TNy_Mf44ahY2a z!~Z&8y=iH-|NsB*C>Fg9RKQje~H`i&Ghrit@|z;*;}p@=J@-N^{~9GmGL4nfEFVdQ&MBb@ E01!E3LjV8( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/brown_colourful_air_2_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/brown_colourful_air_2_0.png new file mode 100644 index 0000000000000000000000000000000000000000..c058399501c46ca8c0e4b46fef4e2041498aec87 GIT binary patch literal 366 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgArasc;<~)jV{M(+jxN8& zWp01|GtA7gpI_+m|NsB!cfJ}xHS8rpe!=ZPu&TX%_f3nxKq1B?Z+91VvBZwoV0lkp zSN0bi>|(lXUTq2bKp{a-7sn8e>&Xcr2?l}*9LWp}Ob;3MTvfAu1C&%Pag8WRNi0dV zN-jzTQVd20Mkcxj7PSeolUAQCewEd}3x%ywR-fTS9@#89ZJ6T-G@y GGywqn=4jyn literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/brown_colourful_air_2_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/brown_colourful_air_2_1.png new file mode 100644 index 0000000000000000000000000000000000000000..4a8982543edfbc38317d9a16de2f1750e12d88f4 GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;yNqG@y~yTI$yoo z{|xgBT{@%8{{R2auqfm+Pyt&>kY8~7s`g9m?dv2jivmR$lf2zs*b>ur)B-u|C7!;n z>@PUj#dO)c+7k4ELV}(yjv*Y^lM_M`1jG^wco-O%k{GW2wKVzylvFKojVMV;EJ?LW zE=mPb3`PbsVKiZFFrXxC%?2Ptu!Y-F|#P%Xx8>Ep+Myfp00i_>zopr E06sNkQvd(} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/brown_colourful_air_3_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/brown_colourful_air_3_0.png new file mode 100644 index 0000000000000000000000000000000000000000..b99a1b62f17083ea50cff028641251cda0624658 GIT binary patch literal 366 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgArasc;@TW!*coLuEzPz$ z#HjW^!|Ytg`Gqe3|Nnn}cdZ~$4SPwDUvN7RtZHxHebeGEP>3sVKiZFFrXxC%?2Ptu!Y-F|#P%`0a+4!$9Q>p00i_>zopr E0D2E+!vFvP literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/brown_colourful_air_3_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/brown_colourful_air_3_1.png new file mode 100644 index 0000000000000000000000000000000000000000..7d7d6818a938d439397cbf0c3ef49379eac62415 GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;#%jcSNoq~TAD4x z|E7)zllg@%|NsA2oujoLsDP~`$S=5kRr{s(_H~k%MS&uWN#5=*Y>8<*YJnW~5>H=O z_7@!NV!CWzZ3+57Awf?U#}JO|$q69|0%8dTJPZs>NetKiS{i);N~)H)MwFx^mZVxG z7o`Fz1|tI_6I}xfT?6wFBO@ylBP(MIZ36=<0|OoD?)xYja`RI%(<*Umh;=hg25L|S z*^ri*lbV;9n`)JmSe(j`RFq$y7oVJ;lV4htR+5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAr#;f;wn6;Pk8!dhX2z= z=gg8^u=M}`|MO$lwE<;WOM?7@o0?WNHBI;!-2fC|O!9VjVf~T+@;H#gUgGKN%Kn0b zT}+qFt1UqvC?x3V;uyklJvkvIAwej?pb)5onW3ZZhE5z%Qnkc2q9i4;B-JXpC>2OC z7#SFu=o(n)8kmO|8CjVaSs7bs8yHv_80biM-$&7qo1c=IR*73ftebH%P=gZ4hP2F_ y)V##pRI8-K;#7v@%EY|*5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!5`og;wn6;kKzAxhW`@6 z(;&*WMyJxWo)5sU|?lnpd;OVA4NlMeoAIqC2kF|ZpO(#4N4#z(lT>W^AdAY ut&$RpQyG#g6Z7Je^K5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;wm<0j^u)+GRxKq zPoK>2UqX0N-~a#r|K0t+8K{7*B*-tg2?$m-vABmd0!0{;yxm>c64Q3n0y*p@p1!W^ zFF4r6blJSx67+#Wf}SppAsp9}6G9RU5)(K~85o$(Gu&><{|$5lgKCLuL`h0wNvc(H zQ7VvPFfuSQ(KWEpH82k`GO{u;vNE>NHZZU5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;wmwB0mFX@g;hJA z|7Q@MK3Qhj+W-ImKlQa^2P$AI3GxeWn%#7%sVO2%IRhxdnB?v5!j_n}qZY_vFY)ws zWq-lJE~d-o)s~IjMPxxv5r3iN&c5$(4zD@yYo)`K3i^r8)75nMLu2yyaWXfT|fhUHx3vIVCg! E04s!JIsgCw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/cyan_colourful_air_2_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/cyan_colourful_air_2_0.png new file mode 100644 index 0000000000000000000000000000000000000000..742cb5b200466e24ab1d0b10283f543249106465 GIT binary patch literal 365 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgArasc;;OKAkHUsSa+}U7 ztlGhl{$Fc#S%MSgXKMa zUD;o7u#4%kd9@|z1BC=VT^vI=t|upiBp3)La3nJ@Fg;}0b5+gu4Ny|G#5JNMC9x#c zD!C{XNHG{07@6oASm+viMgp(Nr}a&49S&=dGX2lIr*hUX{9;wiJ3+5MpNpZfWnW#)78&qol`;+ E03cFk?f?J) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/cyan_colourful_air_2_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/cyan_colourful_air_2_1.png new file mode 100644 index 0000000000000000000000000000000000000000..dbd92893c1eb018ba7b84096af265a40a8adf8a1 GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;wrcC6hr!dna!6a z82-yH-=MH+$N&HTC8obW4^+Tb666=$w5sV+Q_~UgO>saG#w2fd7q-N-9koCXdx@v7 zEBgx$b}?NxueJnzppc-ai(?4K_2h(*1Oc&x0v-kirX+@Ie=Uu^03}sRTq8g|2~lh>?+%iIJ7Dg|>l#m4ShdboYG}4Y~O#nQ4`{HN?6ZCj&Jo zfow?2%t_5l%uTgQN-R!gNUluGi%-ta$uBKRE6s^d%q)sGno{=!6m|@ru6{1-oD!M< D@SA2c literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/cyan_colourful_air_3_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/cyan_colourful_air_3_0.png new file mode 100644 index 0000000000000000000000000000000000000000..8915971ad21e00b174d2b0a347e20a1f41fbc5dc GIT binary patch literal 365 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgArasc;wn04mc-lzGRxMA z&6y*?@Lz8EM){Rn|NsAQ8xtZ5RKs2pc#S%MSgXKMa zUD;o7u#4%kd9@|z1BC=VT^vI=t|upiBp7fe2zUWqypvIaZTgcxKuOgS*NBpo#FA92 z1GbWniEq-F+WLLvDUbW?Cg~4Y6*<$v_QC zARE#$b5ipXb5pI75{pwAk}DJQ;*;}p@=J@-N^{~9GmGMlA6H(H0;*>4boFyt=akR{ E0DjSA5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;wn6SvIN6_nPqGL zGdvfczd(NF*8l(icg58E0~N591o;Iwt!lc|)O19AQyfr)G0EHAg)K2{M=g-UUgGKN z%Kn0bT}+qFt1UqvC?x3V;uyklJvkvHK|m~_fQNyBDT(3QUrVDeKuOgS*NBpo#FA92 z1GbWniEq-F+WLLvDUbW?Cg~4Y6*<$v_QC zARE#$b5ipXb5pI75{pwAk}DJQ;*;}p@=J@-N^{~9GmGMlA6H(H0;*>4boFyt=akR{ E01x$L5dZ)H literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/green_colourful_air_0_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/green_colourful_air_0_0.png new file mode 100644 index 0000000000000000000000000000000000000000..f99b07464a79f5d860c777372258aae770478b8f GIT binary patch literal 358 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAr#;f;u=*X8e1;<{}Mw& zjaX8v#Q*>QOMgv{0?M+M1o;J5Rj;aT$otru4-{Zb@^*J&{gMCjIFQ3$;_2(k{(^&D zOqb28EkPeBBK`6nX5U7Khp`-4GP8?8DwZt`|BqgyV)hf9t6-Y4{ z85o)98d&HWn1>h{S(zAF8Cz%@7+4t?=ty_pN70a*pOTqYiCaUgn{hHwgEGj5w9K5; zyu{p8tE9x@REG4T)YQEA5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!5`og;u=*X`u`Hc|6qpL za?$_)|7Sl-+5nVdDGBlmu3B}eT3r3(Um%|`$=lt9r9b0lAdtge;_2(k{(^&DOqb28 zEkPeBB@vNAEUGPck*Ft9Q((2?%GkD?(rKP5A*61Rp}H{)cW24#>9X_+~xd5O8H vR!ND)sSN2wsi}GK$@w|?rA29_Iq`{^Mezpff7ERTDrfL?^>bP0l+XkK$hTp{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/green_colourful_air_1_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/green_colourful_air_1_0.png new file mode 100644 index 0000000000000000000000000000000000000000..d0350a592d02a21abfe4540b75fa7b44d61ac69d GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;u=>YmeeYd)+ZTT zF8V*1A*x99|Ns9Bj|i9o6|j{A`32WDG*z#vnrtv91}MUq}eU1M?6gBP$alD`N|70|P4q10Ct^`zRW6^HVa@DsgLwbu&%|YETB* zkd~Q~nwOZHYL%2&oXU`1l$x3spPZkQUs{w_niHRxSrl)0Y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/green_colourful_air_1_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/green_colourful_air_1_1.png new file mode 100644 index 0000000000000000000000000000000000000000..5b5dd2b2d59020d259aaa52989a0745f07b10bf8 GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;+oJP{y&%@Yo_#n zhBdL}qG^4S|NsA=_gl{msDP~`$S=5VcKfC3rW4Bo&HzOilf2zs*b>ur)B-u|C7!;n z>@PUj#dO)c+7k4ELV}(yjv*Y^lM_M`1jG^wco-O%k{GW2wKVzylvFKojVMV;EJ?LW zE=mPb3`Pby(l#`FFrXxC%?2Ptu!Y-F|#P%@Wy{XRiJVPPgg&ebxsLQ E0NYt)5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgArasc;+iv8CU1#M{yMp= znbJD{88RkFWlWR$|Np|%)>ufg)3 zzOL*qIM~H>*}U2k^npTxo-U3d9M_W*LJ|xF6F8C?7?>V1?76CD`vxefTH+c}l9E`G zYL#4+3Zxi}42(>44J>pG%tMTftW1ooj4iYc46F5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;+nTcR_8xM{#JR0 z|G^m(q_Sp8|NsC0sj9|)YD>@u3JH3;IEHXsPfiF)5D-f!;9+23N@BS7*V5<9nO2EgL#&%|GEjpu z$cD7coYcI;+*GTi#Nt$j^rF<%y!hn&ocz+Fw9=gT#LS|2Bgb#@^MT44JYD@<);T3K F0RUx}WC;KO literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/green_colourful_air_3_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/green_colourful_air_3_0.png new file mode 100644 index 0000000000000000000000000000000000000000..4dc094654531f67e4251f62b5501888384c4f4c2 GIT binary patch literal 366 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgArasc;+jw+me3%c)+ZTP zBgXJQIDL{-#x$w_|NkGCIV%HH!(I~P7hGG{RJ*FRb&F^IGN2G+lDE4HyI5k!Yp}eh zuPgft4t6nJHm|k>eV~w_r;B3<$MxidkOTwH1OYFgi+3_guuXsR2Pmmp;u=wsl30>z zm0Xkxq!^40j7)S5EOZUbLyU~9OpL6IEwl{`tPBivq`U8PDeolUAQCewEd}3x%ys_CweNLcq22WQ%mvv4F FO#tD@V|@Ss literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/green_colourful_air_3_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/green_colourful_air_3_1.png new file mode 100644 index 0000000000000000000000000000000000000000..9a73d190b98451e488340c950658b380ca607af7 GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;u>2n%J4rptxu9+ z&Huy(@r-Fw|Ns9#*ni~#Pyt&>kY8~1s-{bItrwmjoC_3TO!9VjVM|QgQ48d-mw5WR zvcKS97t>|)YD>@u3JH3;IEHXsPfiF)5D-f!;9+23N@BS7*V5<9nO2EgL#&%|GEjpu z$cD7coYcI;+*GTi#Nt$j^rF<%y!hn&ocz+Fw9=gT#LS|2W3!L?oIvFap00i_>zopr E04*qGh5!Hn literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/grey_colourful_air_0_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/grey_colourful_air_0_0.png new file mode 100644 index 0000000000000000000000000000000000000000..dc35a135bf347e50ec80b7041ea624d583e499e2 GIT binary patch literal 357 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAr#;f;_B?<@8%!G@c+7d zK(I$(=>Px!`J`u<17%rDg8YJ;npQP6P52ny02E+M@^*J&{gMCjIFQ3$;_2(k{(^&D zOqb28EkPeBBK`6nX5U7Khp`-4GP8?8DwZt`|BqgyV)hf9t6-Y4{ z85o)98d&HWn1>h{S(zAF8Cz%@7+4t?=ty_pN70a*pOTqYiCaUgn{hHwgA&Mww9K5; yyu{p8tE9x@REG4T)XMne{G9yKqO{VS_{7Yjc!NcZ$DaaKGkCiCxvX5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!5`og;_B?<&+z{`!~Y03 z|DgZ>|4&=Cbt_Pcr6kBNxM|g;rU_G8d4YV!ByV>Ymi~;Jfj|y>iKnkC`wI?sF5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAr#;f;_Buf9^|NsC0n-2v$0cBZBg8YJ;nwnNM{r>c*2q?gq;&*WMyJxWo)5sU|?lnpd;OVA4NlMeoAIqC2kF|ZpO(#4N4#z(lT>W y^AdAYt&$RpQyJ2WQY+(=^K5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;_4m{%NHZZU5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgArasc;_4q67Z{xw7@g!7 z5zC@PUj#dO)c+7k4ELV}(yjv*Y^lM_M`3o>zOmqz_bPdcyjEt;IjI4|;v<(cb3=DLnyYHiD$jwj5OsmALA=b?pXcvPL z$cD7coYcI;+*GTi#Nt$j^rF5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;u;v8$e{i|Fe)j6 z;lFQKlwU;b|NsA$mgrsrDqt%K@(XTS)pV(;>4^BIIG_k)lDE4HTVmRdS|EqL#M9T6 z{RIcRm@b=FTY^4NNYK;8F@)oKazaRgfLKBS4+8^J62rB>mPTKIlBy-H5hW>!C8<`) zMX5lF!N|bKMAyJV*T6i)$jHjX$jaD4+rYrez(7a3`#y?>-29Zxv`X9>V%?0Bff|%R zHl$_dq~;~&rdlN>7N;_#7o}FlC+Fwnmlma!=ENsv7R4L+@GmgTe~DWM4f DKcr&F literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/grey_colourful_air_3_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/grey_colourful_air_3_0.png new file mode 100644 index 0000000000000000000000000000000000000000..e916694f55647db70b0370706031dc86cbcd3fee GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;_4m{>=PR4<{uQn z@ZUEq$}c?T|NsAwOy>#%6|j{A`2{yMHLYrD%6EBR3>0BZ@^*J&OHA8Q3*@kuc>21s zzu;gO(`EB&OV9@j33|FXhHzX@P7p{4C`(A-VPIgYVmO*RDJ&Z(saoP1QIe8al4_M) zlnSI6j0}uSbPX(Y4a`G~jI2zItc)$R4GgRd40NQs@1tnQ%}>cptHiA#*3CE>s6h#2 zLt17|YF=V)s#Q{AaVkT4QEFv;a(+&JX;E5fPJCi!QM|D=$Fz8$Y6eeNKbLh*2~7Za C+hJ1x literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/grey_colourful_air_3_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/grey_colourful_air_3_1.png new file mode 100644 index 0000000000000000000000000000000000000000..18986229942c4679dc7c4cfa6556946de26114a5 GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;_Buf6v6P{Cp7Xu z!*Y+n5Wn!4|NsA+o2@(wRKQjeYw#2j@wLlJgiKnkC z`wI?sFgTe~DWM4f Dffr(e literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/light_blue_colourful_air_0_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/light_blue_colourful_air_0_0.png new file mode 100644 index 0000000000000000000000000000000000000000..9ae7b9ea87af94755b971c0527813da0b78072d2 GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAr#;f;%dI(g2m>m4F9iM zZoOr@?aBZD|2JVW`>Ts8#-}7N!1e9h?11Vl2ohYqEsNo zU}RuqqHAEGYhWH?WMpMxWMyojZD3$!V4x%2eIG?bZhlH;S|x4`v2Mo6Kn)ro8`3g! zQu7jXQ>~H`i&GhLGSf3k;*)YpQ{$8KbMi}z(n@pU6ElnA4a%5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!5`og;%dI(0>l5S4FAI{ zHedb!|Np03sq8>0mXaX9;HFiVnkGzX@PUj#dO)c z+7k4ELV}(yjv*Y^lM_-B1cVX{On^FU8Cs9^P6z=?s+PD$l%yn}eU1M?6gBP$alD`N|70|P4q10Ct^`zRW6^HVa@DsgLwbu&%|YR~}Lkd~Q~nwOZH zYL%2&oXU`snVwM+pOjOY8lRk>lV4htR+5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;%c?|mhHAD_PgF% zY`)6yKg@i?h5!Hm8{K=Z4phKa666=$1O%&^Slq)Jfg+4a-tI1JiD^4(fgJV{PhVH| z7aZ(jx@=x;3Hm@GK~ERQ5RU7~2_Xpvi3uF03=B-?8E!Y_{|35&LAAs+q9i4;B-JXp zC>2OC7#SFu=o(n)8kmO|8CjVaSs7bs8yHv_80biM-$&7qo1c=IR*73ftebH%P=f}@ zhP2F_)V##pRI8-K;#7v5%=C5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;%c+yKEwYo=RLnx z{%5e*eARx}+yDRn&yIU>8mNG+B*-tgX?D}4rlyE65jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgArasc;_AHbuhag&_WS-i z@A<```QKsp2dCZN{{R24bG6zHsD`~H$S=4F2v#*UdGr5F1PU=GdAqx?izRlv2FrW; zy0X9EU>DP6^J+`b2MP&#x;Tb#Tu)92NiYyh;7Dd*V0y@~=c=0R8=$0WiEBhjN@7W> zRdP`(kYX@0Ff!3Ku+TLy4>2;bGBL6;w$L^(ure^vk?y{aq9HdwB{QuOw}x0ZW1w9O z8Xz0eGILV%5_40nk`jwk8FDhyGfLuS6G7 L^>bP0l+XkKn5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;%dM5FN5ZP+r59o z82&r#{@}dl*Z=?j%Vr)40V-fC3GxeWTGe!^sp*LLrZ}JoW0JSK3tM8^j#?mxy~NYk zmHh<=yO=JUS6hNUP)N|z#W95AdU8TYf`C{;0S^NMQxe0qzm`T{fRd^ut`Q|Ei6yC4 z$wjF^iowXh$VAt`Lf61N#K_3X#K_9nLfgQ=%D_NJy8AwghTQy=%(P0}8e-jylYtsE zKsKah=A`B&=B8RDB^IYL5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgArasc;%d3|md%#?_PgF% zZN3%8@ZWLQC#T)t{{R2~=+*6YKsD?oL4LtaK(MN*$(#RYB2b7i$=lt9T`aNVHCW!$ z*OmPR2fLUqn^#+cK2S)|)5S4_<9c#JNP+=pf`Av$#XA`#*rq@E1C&%Pag8WRNi0dV zN-jzTQVd20Mkcxj7P5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;%c$^Y8b4^BIIG_k)lDE4HTVmRdS|EqL#M9T6 z{RIcRm@b=FTY^4NNYK;8F@)oKazaRgfLKBS4+8^J62rB>mPTKIlBy-H5hW>!C8<`) zMX5lF!N|bKMAyJV*T6i)$jHjX$jaD4+rYrez(7a3`#y?>-29Zxv`X9>V%?0Bff_VG zHl$_dq~;~&rdlN>7N;`gWTt17#3$vHrp71d=j4|brIqHyCuSDK8^625G!v+Y!PC{x JWt~$(695FVX&?Xq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/light_grey_colourful_air_0_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/light_grey_colourful_air_0_0.png new file mode 100644 index 0000000000000000000000000000000000000000..05417f89f665326c199808689f55031644f3610f GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAr#;f;yPtY|IC?F{?BEY zJ9oyCCG-FP|1Zckm&bt|_7YEDSN0bi z>|(lXUTq2bKp{a-7sn8e>&Xcz2?;_828BQ!%nTiMH+15FlBy-H5hW>!C8<`)MX5lF z!N|bKMAyJV*T6i)$jHjX$jaD4+rYrez(7a3`#y?>-29Zxv`X9>V%?0Bff_VGHl$_d zq~;~&rdlN>7N;`gWTt17#HSafR>mji=j4|brIqHyCuSDK85jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!5`og;yPtY|NprR|K%8F z&Ybf9|NoTd9}fYgSW1HYf}2)dYML;ml^4ioO!9VjVd>Af83^RCmw5WRvcKS97t>|) zYD>@u3JH3;IEHXsPfkcl5D-c*FaheYWoSLtJ0S!psaoP1QIe8al4_M)lnSI6j0}uS zbPX(Y4a`G~jI2zItc)$R4GgRd40NQs@1tnQ%}>cptHiA#*3CE>s6hi{Lt17|YF=V) zs#Q{AaVkSjW_m_Re0ou8WqfjePJU@oT4_#vVrEgiL3tPR6rdgkPgg&ebxsLQ04ro< ABLDyZ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/light_grey_colourful_air_1_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/light_grey_colourful_air_1_0.png new file mode 100644 index 0000000000000000000000000000000000000000..132a9e5812fee9ca99bf00ac1a39e82ea6d3cccd GIT binary patch literal 367 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;yQQkj3rCvuU@@u z=FBPoHq)#e=y&|wLk@IB|(0{O+c`!iN!sv5h%i#%D}*Mp5b;={%@cg7*tDKBT7;dOH!?p zi&B9UgOP!eiLQZ#u7P=ok&%^&k(IH9wt<0_fq{;6_k9!%x%nxXX_dG&#JU+L12t%X zY)H$@NzF^lO|?o&EKX&}$xP2EiBB&|t&C63&&e+>N-NEYPs}WeH)QBFW&-MA@O1Ta JS?83{1ONl|XWIY( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/light_grey_colourful_air_1_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/light_grey_colourful_air_1_1.png new file mode 100644 index 0000000000000000000000000000000000000000..90f39da4fdc182e465d10a279c5ef2ee6421eb5a GIT binary patch literal 367 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;<{kL?Ei8MTeoib z&+u^O%qgo^FZ=)hzxv)Se}M|vN`m}?n`Sp%YHErIQ_cX2FeZ7syRapu?WhHE*h@Tp zUD;o7u#4%kd9@|z1BC=VT^vI=t|upiBnXHl6!0)GFeNcu`)g_R1t_Un;u=wsl30>z zm0Xkxq!^40j7)S5EOZUbLyU~9OpL6IEwl{`tPBivq`U85jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgArasc;<{tUroDT&A3nNo z>(&j4{~6Y;Te)e|+W-Imn?!nT1*%~$3GxeW0)kadP2T)J6M;gEN#5=*>|%)>ufg)3 zzOL*qIM~H>*}U2k^npTxo-U3d9M_W*LJ|xF6F8C?7?>V1?76CD`vxefTH+c}l9E`G zYL#4+3Zxi}42(>44J>pG%tMTftW1ooj4iYc46FfO;4_ MUHx3vIVCg!0Ir;EFaQ7m literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/light_grey_colourful_air_2_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/light_grey_colourful_air_2_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e94e4906cd405e33a035c5e49c17c198b06376c4 GIT binary patch literal 367 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;(GA#p2YtQ$4?$& z_%F9^-O8<7H~jzqpDjma0#E^4NswP~)2gORO-)C{H^l)(7?Zr+UDy)ScGLnn>?NMQ zuIw*3*u`|&yxJ15jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;yQQkj0Fp3uU@^3 z;lJGa^{X~*TKoV1|437X4xj?Ik|4j}rlzJ|(lXUTq2bKp{a-7sn8e>&Xcr2?=Eh0zjuTl`tF^zQcD6D5+ZF8c~vxSdwa$ zT$Bo=7>o>zOmqz_bPdcyjEt;IjI4|;v<(cb3=DLnyYHiD$jwj5OsmALA=b?}8K^-6 zWJ6kJPHJ9aZmLyMVsR=%PG)*WNql-yYGr(KeolUAQCewEd}3x%yz#r{AU&WS22WQ% Jmvv4FO#ma+Xt)3X literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/light_grey_colourful_air_3_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/light_grey_colourful_air_3_1.png new file mode 100644 index 0000000000000000000000000000000000000000..5ffd0ee2b834067e595593aee0f0125113cbae1d GIT binary patch literal 367 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;yQEY6o&tDt5+{$ zc=&(e!a18Zt^NQ1f8Y9b9zX?bB|(0{O{DP6^J+`b2MP&#x;Tb#Tu)92Ne~cADBxjWU`k@R_Se$r3s6$E#5JNMC9x#c zD!C{XNHG{07@6oASm+vhMdgwjFR~DqSVUx5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAr#;f;#$8)rty&MpZ^R^ z$K{$XD*gZeUo7%nDNvTRB*-tgscBVH(}a)F4L||LByV>Y)*tyVj{`aEC7!;n>@PUj z#dO)c+7k4ELV}(yjv*Y^lM_-B5`+>A3V}M989M52=)?gfRZCnWN>UO_QmvAUQh^kM zk%5tku7QQFfq96Lk(G&&m9d4kfq|8QfsSNXyJg y%}dNpwMt4XPG!i+%uS6?&d5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!5`og;#$8)=FfkI|IG}I zhh+c%|1Z_D!4@dRQWE4B+_dUa(}XFlyg)u;&*WMyJxWo)5sU|?lnpd;OVA4NlMeoAIqC2kF|ZpO(#4N4#z(lT>W^AdAY ut&$RpQyFqHb5rA!^K5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;@WUrzUiV;%Pp10 zL$d#y8S3}Q{Qv*oxM-_3Pyt&>kY8{U5UgrqaSv+*iZCX5ySuO@rtPQ&a@b2eeO=jK zaIlN%vU#;7=mUiWJzX3_IIbrrgd`XwCUBTCFfg5GxZRZh8|VfG)e_f;l9a@fRIB8o zR3OD*WME{XYha;kU>;&*WMyJxWo)5sU|?lnpd;OVA4NlMeoAIqC2kF|ZpO(#4N4#z z(lT>W^AdAYt&$RpQyFqHb5rA!^K5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;@Wsd@qaTz%X5wY z3^k31WLs{j{Qv)-;g8xEpaQm%Aiv8<*YJnW~5>H=O z_7@!NV!CWzZ3+57Awf?U#}JO|$q69|0%8dTJPZs>NetKiS{i|jQ!R0gC`m~yNwrEY zN(E93Mg~SEx&{`y2Ie6~Mph<9R>l_E1_o9J20GH+_fa(D=BH$)RpQnV>t>t`)Sv{i zAuTf}H7_wY)ha2mIF%tMGdDFpIX@@Av?#4KCq6N=DBke&&B?q#)eN4lelF{r5}E)m C&1DJz literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/lime_colourful_air_2_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/lime_colourful_air_2_0.png new file mode 100644 index 0000000000000000000000000000000000000000..1310a43c204193fd0d09319874fbae8bd71b0009 GIT binary patch literal 365 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgArasc;@bLJqxF+|(?8{w z=Nb(ESz7L@wmeq<|NsAXE|3g|2~lh>?+%iIJ7Dg|>l#m4ShdboYG}4Y~O#nQ4`{HN?6Z1MOl^ z0@;w3nUk8An44;qlvtd~kdv948lRk>lV4htR+5LZ2$lO literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/lime_colourful_air_2_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/lime_colourful_air_2_1.png new file mode 100644 index 0000000000000000000000000000000000000000..fa5de7785f0b807d82513401cfe95e8e6faa2482 GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;@bFInc+W6{eMM< z|IICTRa>5G{Qv*olx3bDPyt&>kY8}qs-{a#O-IBx#Q{Yalf2zs*b>ur)B-u|C7!;n z>@PUj#dO)c+7k4ELV}(yjv*Y^lM_M`1jG^wco-O%k{GW2wKVzylvFKojVMV;EJ?LW zE=mPb3`PbCo?xSJ~=-pzqBZ=G$%eWvnbvu=)$4xK-CPMu6{1-oD!M< D@gHR_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/lime_colourful_air_3_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/lime_colourful_air_3_0.png new file mode 100644 index 0000000000000000000000000000000000000000..635e312545ed405665ae1e144592ec26205d99ef GIT binary patch literal 365 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgArasc;@WgvuJMdw%Pp0L z5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;@Wsfmf?SM%Pkd# zn*U8_6j~mu|NsC0bPPubPyt&>kY8}qs-{a#O-IBx#Q{Yalf2zs*b>ur)B-u|C7!;n z>@PUj#dO)c+7k4ELV}(yjv*Y^lM_M`1jG^wco-O%k{GW2wKVzylvFKojVMV;EJ?LW zE=mPb3`PbCo?xSJ~=-pzqBZ=G$%eWvnbwJ_4+48plSwBS3j3^P65jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAr#;f;=0ds=V9+Xs~P?u z_t}3T@X-JN|7U($xezGJS`y?J+|;zHscFK;=mwwwW0JSK3+s>km&bt|_7YEDSN0bi z>|(lXUTq2bKp{a-7sn8e>&Xcz2?;_828BQ!%nTiMH+15FlBy-H5hW>!C8<`)MX5lF z!N|bKMAyJV*T6i)$jHjX$jaD4+rYrez(7a3`#y?>-29Zxv`X9>V%?0BVH(mhb5ipX zb5pI75{pwAaud^2^GXuqlk;=(ON-JbP0l+XkKcKBzv literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/magenta_colourful_air_0_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/magenta_colourful_air_0_1.png new file mode 100644 index 0000000000000000000000000000000000000000..ce280d5b64137e0cb15db81ade1fbd293b69cfe7 GIT binary patch literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!5`og;=0ds=W2%kIt>30 zd++)G|G(TqFBYH_OG%JlaMP+wO%tZH@&fscN#5=*Ed3cb1A!d&5>H=O_7@!NV!CWz zZ3+57Awf?U#}JO|$q6Y50zwG}CO{pw46Vm{CxiecRZCnWN>UO_QmvAUQh^kMk%5tk zu7QQFfq96Lk(G&&m9d4kfq|8QfsS u7N;`gCZ?z6l_bU|=jY^?7NwQu#3yDJ#T#7Q5bFliz~JfX=d#Wzp$Pz0m0^5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;(FY7?}flaH-e8J z_THnz@PD7@&j0`an_iN<1XRFQ666=$1O%&^Slq)Jfg+4a-tI1JiD^4(fgJV{PhVH| z7aZ(jx@=x;3Hm@GK~ERQ5RU7~2_Xpvi3uF03=B-?8E!Y_{|35&LAAs+q9i4;B-JXp zC>2OC7#SFu=o(n)8kmO|8CjVaSs7bs8yHv_80biM-$&7qo1c=IR*73ftebH%OhZ~` zPHJ9aZmLyMVsR=%Zen_BUP)qna(+&JX;E5fPJCi!QM}=@?YS3#8W=oX{an^LB{Ts5 DBsgfU literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/magenta_colourful_air_1_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/magenta_colourful_air_1_1.png new file mode 100644 index 0000000000000000000000000000000000000000..82a613fd596e07a02615a38d788272e27e6ff9ce GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;(Eq^zYfFyM-itP zF8@F5z2`>o@&Et-`%lVR0#v|O666=$G`s0iQ&U8kat2U@G0EHAg)K2{M=g-UUgGKN z%Kn0bT}+qFt1UqvC?x3V;uyklJvkvHK|m~_fQNyBDT(3QUrVDeKuOgS*NBpo#FA92 z1GbWniEq-F+WLLvDUbW?Cg~4Y6*<$uJFR znK`L>iMgp(Nr}a&47rKvsd*)d@yYo)`K3i^r8)75nMLu2%eLoU0BT_HboFyt=akR{ E0P*E$DgXcg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/magenta_colourful_air_2_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/magenta_colourful_air_2_0.png new file mode 100644 index 0000000000000000000000000000000000000000..9454ca22716d654f4f8cb4ac1e85da01fa75c0a1 GIT binary patch literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgArasc;`%t^?4$7Wk3!Br zia7nBA^3L4i3i~)|NsAAntdY#sD`~H$S=4F2v#*UdGr5F1PU=GdAqx?izRlv2FrW; zy0X9EU>DP6^J+`b2MP&#x;Tb#Tu)92NiYyh;7Dd*V0y@~=c=0R8=$0WiEBhjN@7W> zRdP`(kYX@0Ff!3Ku+TLy4>2;bGBL6;w$L^(ure^vk?y{aq9HdwB{QuOw}x0ZW1w9S z8`3g!Qu7jXQ>~H`i&GhL6Vp@kN)qFf^K5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;`%7${C|evN5L2V z>oD97Iq@js^#A|=>twjvfC|`3g8YJ;RyAE}YC0mmDGn&YnB?v5!j_n}qZY_vFY)ws zWq-lJE~d-o)s~hTO#T)Vz|!_~iVY{L-Sd(wz9j%%XTB`+YW9Kn)C@u6{1-oD!M< D#1>~8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/magenta_colourful_air_3_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/magenta_colourful_air_3_0.png new file mode 100644 index 0000000000000000000000000000000000000000..3cd68b271ea18d5784b82a2822561835fe7332c6 GIT binary patch literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgArasc;(FX?{~7=NH-e8J z_ucznhv81>i3i~)|NsA=@N1a^Pz`%YkY8{U5Ugry^5*}U2oz#W@^*J&7fbAT4VL%x zb!C6S!7irD=GB&<4-^vgba4#fxSpI4l3>7@Am9ab@lHkww&_p)03}sRTq8g|2~lh>?+%iIJ7Dg|>l#m4ShdboYG}4Y~O#nQ4`{HN?6ZC&M(P zW#**jCFZ7DB_$T8GUO(vr{5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;(FM7&wm|;8^Omf z|7SSkci=(z$^ZZVf0SO(3sk^X666=$w5sV+Q_~UgO>saG#w2fd7q-N-9koCXdx@v7 zEBgx$b}?NxueJnzppc-ai(?4K_2h(*1Oc&x0v-kirX+@Ie=Uu^03}sRTq8g|2~lh>?+%iIJ7Dg|>l#m4ShdboYG}4Y~O#nQ4`{HN?6ZC&M(P zW#**jCFZ7DB_$T8GUO(vr{FVdQ&MBb@ E0M%7!p#T5? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/orange_colourful_air_0_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/orange_colourful_air_0_0.png new file mode 100644 index 0000000000000000000000000000000000000000..386324b99eb0a2b3bcd1adc3db74dce6d04699c2 GIT binary patch literal 359 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAr#;f;`**g_Dh+}e{J1g zHPZjPW&Z#FKeunc4p5f0B*-tgscBVH(}a)F4L||LByV>Y)*tyVj{`aEC7!;n>@PUj z#dO)c+7k4ELV}(yjv*Y^lM_-B5`+>A3V}M989M52=)?gfRZCnWN>UO_QmvAUQh^kM zk%5tku7QQFfq96Lk(G&&m9d4kfq|8QfsS4WNXyJg z%}dNpwMt4XPG!h1O3X`7jZe5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!5`og;`**g_P@67f3?eB z%4Gik|6f@0B^M~gQWE4B+_dUa(}XFlyg)u;&*WMyJxWo)5sU|?lnpd;OVA4NlMeoAIqC2kF|ZpO(#4JsfT(lT>W^AdAY wt&$RpQyKD$67$ki5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;`*aO_J6m`|H(36 z%4GhlU4B<2`~Uy{*>0DY02Q#61o;Iw0l}&!7Wc45pa^4# z1qZvBE}K_df<914(9^{+gyVX0LP&x^VgiRL0|V1}hTBc~zkzOGP%UwdC`m~yNwrEY zN(E93Mg~SEx&{`y2Ie6~Mph<9R>l_E1_o9J20GH+_fa(D=BH$)RpQnV>t>t`)Sv>g zAuTf}H7_wY)ha2mIF%v4C^0WRH9k2%C%?2Ptu!Y-F|#P%u%f``EKogzr>mdKI;Vst E0GsJ&k^lez literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/orange_colourful_air_1_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/orange_colourful_air_1_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b591cda6d85695a4f7d74d437d00d84a7cc1e66a GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;`+Bu_P^TY|4U>p zs{a2{Ci8!?%>V!Yg{7*V0Tr;71o;Iw&2GBX)D#h>oB|)YD>@u3JH3;IEHXsPfiF)5D-f!;9+23N@BS7*V5<9nO2EgL#&%|GEjpG z$cD7coYcI;+*GTi#Nt$j{G!CX^wjv|{G9yKqO{VS_{7Yjc*BYUo3lXm44$rjF6*2U FngA5kW~BfC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/orange_colourful_air_2_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/orange_colourful_air_2_0.png new file mode 100644 index 0000000000000000000000000000000000000000..80b4f82680f29c64ec88eb0db5f9868e1a5e0445 GIT binary patch literal 367 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgArasc;`)Du^#66@|Mv?1 zUn2AWKjZ)DGXEC<8UMHJIc5x0!(I~P7u*B{tD2g;`F|z?g&32(-Cfwl5<6al9nO2EgL#&%I&@KiQ zkPT^>IjMPxxv5r3iN&c5`9+C&>8bI_`8oNeMQNou@rjv5@kS3TbIXD189ZJ6T-G@y GGywn{foih= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/orange_colourful_air_2_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/orange_colourful_air_2_1.png new file mode 100644 index 0000000000000000000000000000000000000000..f28882d3cd933dd5872c5f1bbe4375909305dc12 GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;`)E5(EtC8|BvzR z|1b1^y3GG2GXMYoZ}Hnc38;XrB*-tgX;ssurlup}o8o{Xj7i?^E^LWuJ8FR(_7YED zSN0bi>|(lXUTq2bKp{a-7sn8e>&Xcr2?AmX1w0H4Oi2va{#qJ+0ZOWtxJHzuB$lLF zB^RXvDF!10BNJT%3ta>A5F;Zi6C*2Q3vB}fD+2=^>F)a|8glbfGSez?Ylw9-P6ldF z0ojn2nUk8An44;qlvtd~kYALTm!2A*oS&0lT9j6r6Q7t_6mRsfGPfM4p25@A&t;uc GLK6U`S7@F9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/orange_colourful_air_3_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/orange_colourful_air_3_0.png new file mode 100644 index 0000000000000000000000000000000000000000..f400a98804cbcf7b481072501b5c031a4edbaf1e GIT binary patch literal 367 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgArasc;`*yb`fr=;|H(2x z8f5qX7y3U(=Klhj|Ns9>NKXv_s$nk)@(XSPf>ljT-uyokfkKQ)-tI2!Vu>BE!SbHI zuIw*3*u`|&yxJ1IjMPxxv5r3iN&c5`9+C&>8bI_`8oNeMQNou@rjv5@y65YVjlw4GkCiCxvX5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;`*gbX8(Vo|C40| z|L^_RBJ+QN%>V!YxjZ#2fC|`3g8YJ;RyAE}YC0mmDGn&YnB?v5!j_n}qZY_vFY)ws zWq-lJE~d-o)s~IjMPxxv5r3iN&c5`9+C&>8bI_`8oNeMQNou@rjv5@y65YVjlw4GkCiCxvX5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAr#;f;`+H`_2JVW`>Ts8#-}7N!1e9h?11Vl2ohYqEsNo zU}RuqqHAEGYhWH?WMpMxWMyojZD3$!V4x%2eIG?bZhlH;S|x4`v2Mo6Kn+SD8`3g! zQu7jXQ>~H`i&Gg2GV`+Ilk;=(ON-J5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!5`og;`+H`^?!zi_Za?v z?p*W#|9_V|b#s7HEG0pH!A+|!HBFe($_wN(CV9KNu=Ho#3l_E1_o9J20GH+_fa(D=BH$)RpQnV>t>t`)Sv{iAuTf}H7_wY u)ha2mIF+FwGcP+nIX@@Av?#4KCq6N=DBeJ&M_?gPHG`+CpUXO@geCx$>|#3r literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/pink_colourful_air_1_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/pink_colourful_air_1_0.png new file mode 100644 index 0000000000000000000000000000000000000000..5e91dd097c884f27d871f2d4643a686413dfc063 GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;`+IJ)tA1NUnZ>j z+_~l+!~f46tN;K1zi#H1P@n>~k|4j}CLmbV#Nr;-2ozyV@^*J&OHA8Q3*@kuc>21s zzu;gO(`EB&OV9@j33|FXhHzX@P6$abNKD``Wnf@B&v3gb|2NPL45}rr5hW>!C8<`) zMX5lF!N|bKMAyJV*T6i)$jHjX$jaD4+rYrez(7a3`#y?>-29Zxv`X9>V%?0Bff|%R zHl$_dq~;~&rdlN>7N;^4WaeeZC+Fwnmlma!=ENsv7R4I|cPp3!RWo?H`njxgN@xNA DbMt7* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/pink_colourful_air_1_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/pink_colourful_air_1_1.png new file mode 100644 index 0000000000000000000000000000000000000000..751e748b3fcf889a465b7db3cc7a099f5c8b211b GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;`*g`g|2~lh>?+%iIJ7Dg|>l#m4ShdboYG}4Y~O#nQ4`{HN?6ZCj&Jo zfow?2%t_5l%uTgQN-R!gD9Fsqj!(|d$uBKRE6s^d%q)sG4DMDi2dZZ9boFyt=akR{ E0PT-v5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;`(LsiZ7Fve(9h4 zKc3;s#8qD=t^EK0|BHYIF`xprk|4j}rlzJ|(lXUTq2bKp{a-7sn8e>&Xcr2?=5e1*t$Crx>c(yH$?>B~?pYBT7;dOH!?p zi&B9UgOP!eiLQZ#u7P=ok&%^&k(IH9wt<0_fq{;6_k9!%x%nxXX_dG&#JU+L12rgt zY)H$@NzF^lO|?o&EKX%8$jr-*PtMQDFD*(d&52LUEQ&We)l}FERL$V&>gTe~DWM4f Dq~&Os literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/pink_colourful_air_2_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/pink_colourful_air_2_1.png new file mode 100644 index 0000000000000000000000000000000000000000..4a11cd2c1fb5b53240145d61a0fd5c56b43d4887 GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;`*h3?*Dj(&%HDL z-(&bPan+Z}EB^ogzgOLUEl>elNswP~)2gORO-)C{H^l)(7?Zr+UDy)ScGLnn>?NMQ zuIw*3*u`|&yxJ1mdKI;Vst E0Crz!hyVZp literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/pink_colourful_air_3_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/pink_colourful_air_3_0.png new file mode 100644 index 0000000000000000000000000000000000000000..80c300e0257d5ec66c7bf2bd3de731873b6bd1ec GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;`+I3^_Sk2UnZ>j z+`a1mJ%%rnR{sD0e{yrsa-agXk|4j}CLmbV#Nr;-2ozyV@^*J&OHA8Q3*@kuc>21s zzu;gO(`EB&OV9@j33|FXhHzX@P6$ab;7kwzI-PkXBZo7u(nO%7YKdz^NlIc#s#S7P zDv)9@GB7gHHL%b%Fb^>@vNAEUGPck*Ft9Q((2?%GkD?(rKP5A*61Rp}H{)cW1|^UU zX_+~xd5O8HR!ND)sSE{~dD-#F`8oNeMQNou@rjv5@y2^w9i@S)89ZJ6T-G@yGywoQ CDP_3; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/pink_colourful_air_3_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/pink_colourful_air_3_1.png new file mode 100644 index 0000000000000000000000000000000000000000..eb0435b0005fc22db4ba108184eb8baeeaf81b98 GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;`+IB&HsB0UnZYXZ4p!EC2uh{~^o67^r})B*-tgX;ssurlup}o8o{Xj7i?^E^LWuJ8FR(_7YED zSN0bi>|(lXUTq2bKp{a-7sn8e>&Xcr2?AmX1w0H4Oi2va{#qJ+0ZOWtxJHzuB$lLF zB^RXvDF!10BNJT%3ta>A5F;Zi6C*2Q3vB}fD+2=^>F)a|8glbfGSez?Ylw9-P6ldF z0@;w3nUk8An44;qlvtd~P>`9I9iN<^lV4htR+5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAr#;f;##M_zR6&-9mD?) z!yVJi4*mcC|HY#%yg*sjk|4j}rlwU*O%pywHvk0~lf2zsSbyZdJPzcrmw5WRvcKS9 z7t>|)YD>@u3JH3;IEHXsPfkclNDxXeCl_E1_o9J20GH+_fa(D=BH$)RpQnV>t>t`)Sv>gAuTf} zH7_wY)ha2mIF+HGw5T8_H9k2%C%?2Ptu!Y-F|#P%K&>i49;lwd)78&qol`;+0NVLv AHUIzs literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/purple_colourful_air_0_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/purple_colourful_air_0_1.png new file mode 100644 index 0000000000000000000000000000000000000000..46631e2dc2ea859006edfd58ff17efaf0aba33e9 GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!5`og;##M_-j3lvgX8}u zgU$c{|DStW=`v7?r6kBNxM|g;rU_G8d4YV!ByV>Ymi~;Jfj|y>iKnkC`wI?sF5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;@WAnW188ad6uV| z3^p@3{;$(t|NsC0zxyt(04iWB3GxeW0)kadEbd{AKoQ0yZ+92A#Izl?Kn{C}r>`sf z3l4TMT{f?_1bv{8pr?yt2*>s0gpdS-!~_mg1_q|{47Z!|e*@jXpjzS@QIe8al4_M) zlnSI6j0}uSbPX(Y4a`G~jI2zItc)$R4GgRd40NQs@1tnQ%}>cptHiA#*3CE>s6ho} zLt17|YF=V)s#Q{AaVkSWX;DE=YJ75jPJU@oT4_#vVrEgiVPI`QCr~|ur>mdKI;Vst E04We={{R30 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/purple_colourful_air_1_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/purple_colourful_air_1_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b3e54c42fbe4858fe6cbbd102265956222e52d28 GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;yTfEFN5R%4R+TU z{_krt*gVhj)c^ngUGMH*3sk^X666=$G`s0iQ&U8kat2U@G0EHAg)K2{M=g-UUgGKN z%Kn0bT}+qFt1UqvC?x3V;uyklJvkvHK|m~_fQNyBDT(3QUrVDeKuOgS*NBpo#FA92 z1GbWniEq-F+WLLvDUbW?Cg~4Y6*<$v_P% zARE#$b5ipXb5pI75{pwA3QCI#a#G`y^K5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgArasc;=0-H)-JmTCv2W= zu)Fr3;lLuRv#V?_{r~@e>$77Afoj-Gg8YJ;fM8WqlQ;j*M4%93lDE4HyI5k!Yp}eh zuPgft4t6nJHm|k>eV~w_r;B3<$MxidkOTw41de0|2BwD$d#nC}Q!>*kachWmGX~nl zpaQZXEi)%IFEKaODk-rzm7$=ts30dbJ~=-pzqBZ=G$%eWvnbx^L5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;(FBP*?)!u7p$NE zXK-9(b#{Z@wg3PBTbG5b1u9@G3GxeWTGe!^sp*LLrZ}JoW0JSK3tM8^j#?mxy~NYk zmHh<=yO=JUS6hNUP)N|z#W95AdU8TYf`C{;0S^NMQxe0qzm`T{fRd^ut`Q|Ei6yC4 z$wjF^iowXh$VAt`Lf61N#K_3X#K_9nLfgQ=%D_NJy8AwghTQy=%(P0}8e-jylYtsk zKsKah=A`B&=B8RDB^IYL6qFVf5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgArasc;@V-jW1{Kad6uU- zjduKJa9n16ewEFo|Ns9to3L;K)v%WY`2{xt!K$VvZ~mW&Kq1B?Z+91VvBZwoV0lkp zSN0bi>|(lXUTq2bKp{a-7sn8e>&Xcr2?m@A0$xBD?_`u9nO2EgL#&%|GEjpG z$cD7coYcI;+*GTi#Nt$jg3_XboYeT_{G9yKqO{VS_{7Yjc;o%WhD(9!89ZJ6T-G@y GGywo#A!eNb literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/purple_colourful_air_3_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/purple_colourful_air_3_1.png new file mode 100644 index 0000000000000000000000000000000000000000..a0d14b288f7771d7b3f142a910a2edb5491e505e GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;@V`e`9Fi>Jj+x6 z_c8RD>|JGZ>Hq)#$*IjMPxxv5r3iN&c51*Js=IjQl<`8oNeMQNou@rjv5@y7d$4VMDdGkCiCxvX5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAr#;f;<`*#X|=lY3$>yR z+A6!uHUIzrKT~j%08o~-B*-tgscBVH(}a)F4L||LByV>Y)*tyVj{`aEC7!;n>@PUj z#dO)c+7k4ELV}(yjv*Y^lM_-B5`+>A3V}M989M52=)?gfRZCnWN>UO_QmvAUQh^kM zk%5tku7QQFfq96Lk(G&&m9d4kfq|8QfsSN-NEYPs}WeH#oIyvpP^QgQu&X%Q~loCIC5xVPF6N literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/red_colourful_air_0_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/red_colourful_air_0_1.png new file mode 100644 index 0000000000000000000000000000000000000000..efaec2b9efbe57d0c661cebe970d633d7e67f61c GIT binary patch literal 352 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!5`og;<`*#>4jR+D~$)M z)s_GM|9`!F0uNA%r6kBNxM|g;rU_G8d4YV!ByV>Ymi~;Jfj|y>iKnkC`wI?sF5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;<`akZI`*`VH=&* z>dLP)9xPK;`v3pGZpJK5paQm%Aiv-yAXwGJ;vUur6k$yAc6VV*OxsZl4WaJwo0H_#0XswJ)wB`Jv|saDBF zsX&Us$iT=%*T6#8z&ymr$jZdX%Gg5Nz`)ADKu5a!K8l9i{FKbJO57S^-Helg8Wce` zq-Ex$<|XE)S|ueGr!o|!ro<=b=j4|brIqHyCuSDK8}41$yb-9F!PC{xWt~$(69A)f BV+a5M literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/red_colourful_air_1_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/red_colourful_air_1_1.png new file mode 100644 index 0000000000000000000000000000000000000000..c61d8c80af09f66f03e6f15f8099b3723e847609 GIT binary patch literal 360 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;=0vXo>zOmqz_bPdcyjEt;IjI4|;v<(cb3=DLnyYHiD$jwj5OsmALA=b?}8K^-K zWJ6kJPHJ9aZmLyMVsR=%QEEzja(+&JX;E5fPJCi!QM}>ah0Pm*iWxjz{an^LB{Ts5 D9>HWl literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/red_colourful_air_2_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/red_colourful_air_2_0.png new file mode 100644 index 0000000000000000000000000000000000000000..9ea331ebaa9b735369d29b9cc62968434afa79a8 GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgArasc;(FQJ@Rpz9(=dYz zo`zo!8XvRQJ>zEZ|NsAc8<~J=8Q4pL{DPZ+U{zC-H~-H>pb%q{x4R3wSYpR(u)L?Q zEBgx$b}?NxueJnzppc-ai(?4K_2h(*1OveYj${S~riToBuBzF-0ZOWtxJHzuB$lLF zB^RXvDF!10BNJT%3ta>A5F;Zi6C*2Q3vB}fD+2=^>F)a|8glbfGSez?Ylw9-2HM4- z2(lq9Gbc4KF*nsJDX}<}p(r&aJ~=-pzqBZ=G$%eWvnbw3WyK|KpkfA3S3j3^P65jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;`%7W;Ojx-H&OZ@ zepwu|*S+9r`2YX^3aLfSKm}|iL4LtatC}t~H60P(6bBSxO!9VjVM|QgQ48d-mw5WR zvcKS97t>|)YD>@u3JH3;IEHXsPfiF)5D-f!;9+23N@BS7*V5<9nO2EgL#&%|GEjpe z$cD7coYcI;+*GTi#Nt$jqSTc5byiWxjz{an^LB{Ts5 Dk4I$Z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/red_colourful_air_3_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/red_colourful_air_3_0.png new file mode 100644 index 0000000000000000000000000000000000000000..9b84cfb9dddbb176a2bec15a128c6c044b02ca32 GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgArasc;<`awWvj8qVH=$d zdTJkjS)6dzJL6{X|Ns9A?fniwHS8rpe!)#Zu&SxaoBwAbP>35jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;<{R0`NJ=Z!!|nl z9|N`;s-JN)`2YXEMMb+cPyt&>kY8}qs-{a#O-IBx#Q{Yalf2zs*b>ur)B-u|C7!;n z>@PUj#dO)c+7k4ELV}(yjv*Y^lM_M`1jG^wco-O%k{GW2wKVzylvFKojVMV;EJ?LW zE=mPb3`Pbtq@L literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/white_colourful_air_0_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/white_colourful_air_0_0.png new file mode 100644 index 0000000000000000000000000000000000000000..750a9369de064301ec3778f65896fa9955d7304e GIT binary patch literal 358 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAr#;f;`;6Xx9|UdB>ZRi z@&C`C{~*9vmYxfgWi1Kv3vOy!)zmcMV{`*hfHBG2-G%i>{>$S)4tt5GuPgft4t6nJ zHm|k>eV~w_r;B3<$Mxidl!OGK1cO4L4rYdqx*IxiKuOgS*NBpo#FA921GbWniEq-F+WLLvDUbW?Cg~4Y6*<$v_RtARE#$b5ipX xb5pI75{pwA$}=)cQsa~JbMi}z(n@pU6ElnA4UX4#9snw5@O1TaS?83{1OQ>&Y7_tf literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/white_colourful_air_0_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/white_colourful_air_0_1.png new file mode 100644 index 0000000000000000000000000000000000000000..732edcbed99726663dd406dda50974ac6c8f9075 GIT binary patch literal 354 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!5`og;`;6Xw}k%;_y03| z|NrCv|NsB)e_I2TVkrso3vOCNHZZU5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;`;Odzd!%~|NH;{ z`~M&J|1*61|Ly<(|GR(foD5XJRubeF+yn%xnpoV!8i68=N#5=*Y>8<*YJnW~5>H=O z_7@!NV!CWzZ3+57Awf?U#}JO|$q69|28jtArVI>B=NWD{<^Kk{fkCyzHKHUXu_V9nO2EgL#&%|GEjpu z$cD7coYcI;+*GTi#Nt$j@{G)q)cEB5ocz+Fw9=gT#LS|2!wpqC!+^>eJYD@<);T3K F0RVwNZsq_0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/white_colourful_air_1_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/white_colourful_air_1_1.png new file mode 100644 index 0000000000000000000000000000000000000000..03431a4a106b3d4fe6e0a96a3a9e6a7095f4dd77 GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;`;ml|NH+L{sVym z!}tF`{()Hk-?}zj2P$AI3GxeWn%#7%sVO2%IRhxdnB?v5!j_n}qZY_vFY)wsWq-lJ zE~d-o)s~ zIjMPxxv5r3iN&c5LqiJ#!!Mvv!wUw6QUeBtR|yOZRx=nF#0%!^3bX-A@C5jTxc>kD|KI=r4F4AZ z8B*}U2k^npTr zo-U3d9M_W*5(5$vfcz>3)uc_g)&W_nC9V-ADTyViR>?)FK#IZ0z{o_`z(Uu+JjBSz z%EZXZ*h1UDz{5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAr#;f;`;CZe}?}H{s77Q z{~=((&e8)wS=N#uzu=}-O_!P~Cryh53NR*lySuRd$bWep$YC$>^mS!_!ND%3%jVUV zpbr!h^mK6y;kcfh5RxDumQYZ_z`zv5a7;QW(g!H1TH+c}l9E`GYL#4+3Zxi}42(>4 z4J>pG%tMTftW1ooj4iYc46FpK34w literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/white_colourful_air_3_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/white_colourful_air_3_0.png new file mode 100644 index 0000000000000000000000000000000000000000..3875be472a54b7818a00707cabd7f68ca9fe78d9 GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;`-zNpWpxg|NH;{ z=l_2U_y0q{`W#(epaQm%Aiv-yAXwGJ;vUur6k$yAc6VV*OxsZlRdP`(kYX@0 zFf!3Ku+TLy4>2;bGBL6;w$L^(ure^vk?y{aq9HdwB{QuOw}x0Z<7A))WsnVNnK`L> yiMgp(Nr}a&4CNV_C8_br`8oNeMQNou@rjv5@y2l_H>!Zj89ZJ6T-G@yGywqgrfK>B literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/white_colourful_air_3_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/white_colourful_air_3_1.png new file mode 100644 index 0000000000000000000000000000000000000000..68520d413e200a94df5ced16093f61feb09dbeff GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;`;sn4~F~y|NZ~3 z!0`Xqe<&zWaZm>;U@Hmo3vOD~bg8N7i1?;Bpa^4#1qZvB zE}K_df<914(9^{+gyVX0LP&yuSV9300|QeM!?nMbMqhxEswJ)wB`Jv|saDBFsX&Us z$iT=%*T6#8z&ymr$jZdX%Gg5Nz`)ADKu5a!K8l9i{FKbJO57S^-Helg8k9jcq-Ex$ z<|XE)S|ueGr!tghWR|4HC+Fwnmlma!=ENsv7R4LKmE5QTDrfL?^>bP0l+XkK6?bb1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/yellow_colourful_air_0_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/yellow_colourful_air_0_0.png new file mode 100644 index 0000000000000000000000000000000000000000..a20ad1a2d0facc97944fb686d91fd55a9bce1787 GIT binary patch literal 359 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAr#;f;`-%;_0MzG|5F(L zUA6xI%2OC z7#SFu=o(n)8kmO|8CjVaSs7bs8yHv_80biM-$&7qo1c=IR*73ftebH%P=gA{hP2F_ z)V##pRI8-K;#7vp)SR6B^7!QZocz+Fw9=gT#LS|2g9oeij{wy(c)I$ztaD0e0suDP BXXF3? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/yellow_colourful_air_0_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/yellow_colourful_air_0_1.png new file mode 100644 index 0000000000000000000000000000000000000000..3624c31005c25a2a3bd631545e67182ce14425e9 GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!5`og;`-%;_5T!x{|wSU z&sqQf|6f(*wI)!Cr6kBNxM|g;rU_G8d4YV!ByV>Ymi~;Jfj|y>iKnkC`wI?sF5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;`;A~&Hrb1|3BLQ zJZJr%LHf%H>;M1%>s~#^0#v|O666=$1O%&^Slq)Jfg+4a-tI1JiD^4(fgJV{PhVH| z7aZ(jx@=x;3Hm@GK~ERQ5RU7~2_Xpvi3uF03=B-?8E!Y_{|35&LAAs+q9i4;B-JXp zC>2OC7#SFu=o(n)8kmO|8CjVaSs7bs8yHv_80biM-$&7qo1c=IR*73ftebH%P=gA{ zhP2F_)V##pRI8-K;#7vp)SR6B^7!QZocz+Fw9=gT#LS|2!|7|}LBYx3>FVdQ&MBb@ E0I=z3d;kCd literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/yellow_colourful_air_1_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/yellow_colourful_air_1_1.png new file mode 100644 index 0000000000000000000000000000000000000000..24e6dedeaff83001ae88ea08af8bc6e7e79f9c80 GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;`;x-?SBU8|Noty zF#P{{&iemH`~Uy{TYvIO1S()F3GxeWn%#7%sVO2%IRhxdnB?v5!j_n}qZY_vFY)ws zWq-lJE~d-o)s~IjMPxxv5r3iN&c5m8m&7`Q`D+`8oNeMQNou@rjv5@rKja$b*8D!PC{xWt~$( F698YuXWRe) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/yellow_colourful_air_2_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/yellow_colourful_air_2_0.png new file mode 100644 index 0000000000000000000000000000000000000000..faf606a3dd9a832eefa9523cee65dc361b02a405 GIT binary patch literal 359 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAr#;f;`;x;)BpdD|Nq<0 z`p@wHoBjX){|{ufeF4g{mIV0)H#Ie_YWn@@Q4vspG0EHAh4n}N%i}-}dx@v7EBgx$ zb}?NxueJnzppc-ai(?4K_2h(*gaomKf)t>RLkwlhB8?vdB~?pYBT7;dOH!?pi&B9U zgOP!eiLQZ#u7P=ok&%^&k(IH9wt<0_fq{;6_k9!%x%nxXX_dG&#JU+L12w3CY)H$@ zNzF^lO|?o&EKX&pOwGy3FON^o&&e+>N-NEYPs}WeH{x6B2MiGg22WQ%mvv4FO#tkr BYL@^2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/yellow_colourful_air_2_1.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/yellow_colourful_air_2_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d84f810430d4bae74b8b36454ca5d709505dd107 GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;`;x;?X3R{|NmP{ z1Icgp|NlGv|Np-+m7xr%fUP9RFSuz{)1{`SBjTIlfFg`Z-tI1JiD^4(fgJV{PhVH| z7aZ(jx@=x;3Hm@GK~ERQ5RU7~2_XprVhII23=B+34A=fz8hrsus+PD$l%yn}eU1M?6gBP$alD`N|70|P4q10Ct^`zRW6^HVa@DsgLwbu&%|YES{$ zkd~Q~nwOZHYL%2&oXSv{nv;`X9-o|_lV4htR+zopr E0I82?X#fBK literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/yellow_colourful_air_3_0.png b/src/main/resources/assets/colourful_portals/textures/particle/colourful_air_particle/yellow_colourful_air_3_0.png new file mode 100644 index 0000000000000000000000000000000000000000..adbfc77a54d9296e8ce5fc6c2d21ec0dc9341135 GIT binary patch literal 367 zcmeAS@N?(olHy`uVBq!ia0vp^%plAHBA2kO=mAnJ>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgArasc;`;BZ_5b^}|3BLQ zyI~{!pW**+hyVW_|NsBLz_ETKPz`%YkY8{U5Ugry^5*}U2oz#W@^*J&7fbAT4VL%x zb!C6S!7irD=GB&<4-^vgba4#fxSpI4l3>7@Am9ab@lHkww&_p)03}sRTq8g|2~lh>?+%iIJ7Dg|>l#m4ShdboYG}4Y~O#nQ4`{HN?6ZCj&L8 zfNV(1%t_5l%uTgQN-R!gs7%et$uEyj&d5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAsXNl;`;NPwe)|6{~zrc z{y+JD*XI9!$N&HT|7Pej2P$AI3GxeWTGe!^sp*LLrZ}JoW0JSK3tM8^j#?mxy~NYk zmHh<=yO=JUS6hNUP)N|z#W95AdU8TYf`C{;0S^NMQxe0qzm`T{fRd^ut`Q|Ei6yC4 z$wjF^iowXh$VAt`Lf61N#K_3X#K_9nLfgQ=%D_NJy8AwghTQy=%(P0}8e-jylYtsk zKsKah=A`B&=B8RDB^IYLRHo+SHs;dL4XYh3Ob6Mw< G&;$VQqG;v- literal 0 HcmV?d00001 diff --git a/src/main/resources/colourful_portals.client.mixins.json b/src/main/resources/colourful_portals.client.mixins.json new file mode 100644 index 0000000..5aa5edf --- /dev/null +++ b/src/main/resources/colourful_portals.client.mixins.json @@ -0,0 +1,19 @@ +{ + "required": true, + "package": "quimufu.colourful_portals.client.mixin", + "compatibilityLevel": "JAVA_17", + "injectors": { + "defaultRequire": 1 + }, + "plugin": "quimufu.colourful_portals.MixinConfig", + "client": [ + "AnimationMixin", + "AnimationResourceMetadataMixin", + "AnimationResourceMetadataReaderMixin", + "SodiumFluidRendererMixin", + "SpriteContentsMixin" + ], + "mixins": [ + "MinecraftClientAccessor" + ] +} \ No newline at end of file diff --git a/src/main/resources/colourful_portals.mixins.json b/src/main/resources/colourful_portals.mixins.json index 11721df..910ea8b 100644 --- a/src/main/resources/colourful_portals.mixins.json +++ b/src/main/resources/colourful_portals.mixins.json @@ -9,13 +9,5 @@ ], "injectors": { "defaultRequire": 1 - }, - "plugin": "quimufu.colourful_portals.MixinConfig", - "client": [ - "client.AnimationMixin", - "client.AnimationResourceMetadataMixin", - "client.AnimationResourceMetadataReaderMixin", - "client.SodiumFluidRendererMixin", - "client.SpriteContentsMixin" - ] + } } \ No newline at end of file diff --git a/src/main/resources/data/colourful_portals/tags/block/colourful_pearl_replaceable.json b/src/main/resources/data/colourful_portals/tags/block/colourful_pearl_replaceable.json new file mode 100644 index 0000000..cf05f00 --- /dev/null +++ b/src/main/resources/data/colourful_portals/tags/block/colourful_pearl_replaceable.json @@ -0,0 +1,17 @@ +{ + "values": [ + "#minecraft:replaceable", + "#minecraft:overworld_carver_replaceables", + "#minecraft:nether_carver_replaceables", + "#c:ores", + "#minecraft:sculk_replaceable", + "#minecraft:flowers", + "#minecraft:ice", + "#minecraft:corals", + "#minecraft:coral_blocks", + "#minecraft:enderman_holdable", + "#minecraft:logs", + "#minecraft:leaves", + "colourful_portals:colourful_air" + ] +} \ No newline at end of file diff --git a/src/main/resources/data/colourful_portals/tags/entity_type/pearl_not_teleportable.json b/src/main/resources/data/colourful_portals/tags/entity_type/pearl_not_teleportable.json new file mode 100644 index 0000000..25b19f0 --- /dev/null +++ b/src/main/resources/data/colourful_portals/tags/entity_type/pearl_not_teleportable.json @@ -0,0 +1,9 @@ +{ + "values": [ + "#c:teleporting_not_supported", + "#c:bosses", + "minecraft:silverfish", + "minecraft:spider", + "minecraft:cave_spider" + ] +} \ No newline at end of file diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 8f867d3..d560dc0 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -19,7 +19,7 @@ "quimufu.colourful_portals.ColourfulPortalsMod" ], "client": [ - "quimufu.colourful_portals.ColourfulPortalsModClient" + "quimufu.colourful_portals.client.ColourfulPortalsModClient" ], "cardinal-components": [ "quimufu.colourful_portals.Components" @@ -38,7 +38,8 @@ }, "accessWidener" : "colourful_portals.accesswidener", "mixins": [ - "colourful_portals.mixins.json" + "colourful_portals.mixins.json", + "colourful_portals.client.mixins.json" ], "depends": { "fabricloader": ">=${loader_version}",