Closed gengyoubo closed 5 days ago
@Shadow protected final boolean hasCollision;
protected BlockMixin(boolean hasCollision) {
this.hasCollision = hasCollision;
}
@Inject(method = "getCollisionShape", at = @At("HEAD"), cancellable = true)
private void getCollisionModShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context, CallbackInfoReturnable<VoxelShape> cir) {
if (context instanceof EntityCollisionContext entityContext) {
Entity collidingEntity = entityContext.getEntity();
if (collidingEntity != null && state.is(BlockTags.create(new ResourceLocation("changed_addon:passable_blocks")))) {
// Verifica se a entidade é um jogador
if (collidingEntity instanceof Player player) {
// Verifica uma condição específica do jogador (no caso, ProcessTransfur)
if (ProcessTransfur.isPlayerLatex(player)) {
TransfurVariantInstance<?> transfurVariantInstance = ProcessTransfur.getPlayerTransfurVariant(player);
// Se a habilidade GRAB_ENTITY for nula ou a entidade já foi agarrada, retorna a colisão padrão
if (transfurVariantInstance.getAbilityInstance(ChangedAbilities.GRAB_ENTITY_ABILITY.get()) == null || transfurVariantInstance.getAbilityInstance(ChangedAbilities.GRAB_ENTITY_ABILITY.get()).grabbedEntity != null) {
cir.setReturnValue(this.hasCollision ? state.getShape(world, pos) : Shapes.empty());
}
// Se a configuração permitir, o jogador pode atravessar o bloco
if (ChangedAddonConfigsConfiguration.CAN_PASS_THROUGH_BLOCKS.get()) {
cir.setReturnValue(Shapes.empty()); // Colisão desativada
}
// Verifica se o jogador tem a habilidade SOFTEN ativa
transfurVariantInstance.ifHasAbility(ChangedAddonAbilitys.SOFTEN_ABILITY.get(), instance -> {
if (instance.isActivate()) {
// Se a habilidade SOFTEN estiver ativa, permite que o jogador atravesse o bloco
cir.setReturnValue(Shapes.empty()); // Colisão desativada
}
});
}
}
}
}
cir.setReturnValue(this.hasCollision ? state.getShape(world, pos) : Shapes.empty());
}
@Shadow protected final boolean hasCollision; protected BlockMixin(boolean hasCollision) { this.hasCollision = hasCollision; } @Inject(method = "getCollisionShape", at = @At("HEAD"), cancellable = true) private void getCollisionModShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context, CallbackInfoReturnable<VoxelShape> cir) { if (context instanceof EntityCollisionContext entityContext) { Entity collidingEntity = entityContext.getEntity(); if (collidingEntity != null && state.is(BlockTags.create(new ResourceLocation("changed_addon:passable_blocks")))) { // Verifica se a entidade é um jogador if (collidingEntity instanceof Player player) { // Verifica uma condição específica do jogador (no caso, ProcessTransfur) if (ProcessTransfur.isPlayerLatex(player)) { TransfurVariantInstance<?> transfurVariantInstance = ProcessTransfur.getPlayerTransfurVariant(player); // Se a habilidade GRAB_ENTITY for nula ou a entidade já foi agarrada, retorna a colisão padrão if (transfurVariantInstance.getAbilityInstance(ChangedAbilities.GRAB_ENTITY_ABILITY.get()) == null || transfurVariantInstance.getAbilityInstance(ChangedAbilities.GRAB_ENTITY_ABILITY.get()).grabbedEntity != null) { cir.setReturnValue(this.hasCollision ? state.getShape(world, pos) : Shapes.empty()); } // Se a configuração permitir, o jogador pode atravessar o bloco if (ChangedAddonConfigsConfiguration.CAN_PASS_THROUGH_BLOCKS.get()) { cir.setReturnValue(Shapes.empty()); // Colisão desativada } // Verifica se o jogador tem a habilidade SOFTEN ativa transfurVariantInstance.ifHasAbility(ChangedAddonAbilitys.SOFTEN_ABILITY.get(), instance -> { if (instance.isActivate()) { // Se a habilidade SOFTEN estiver ativa, permite que o jogador atravesse o bloco cir.setReturnValue(Shapes.empty()); // Colisão desativada } }); } } } } cir.setReturnValue(this.hasCollision ? state.getShape(world, pos) : Shapes.empty()); }
I forgot that return;
in mixin does not automatically cancel so i can just cancel manually after the logic match
I think that cancel the mixin would be the best Solution because that would make the value return the original one
cir.cancel()
crash-2024-11-20_17.39.42-client.txt
I guess there is no reference to this.hasCollision after the ruture so there is a null value. The best way is to process the return value, like: