mirror of
https://github.com/FabricMC/fabric.git
synced 2025-05-08 20:30:45 -04:00
Allow setting canPotentiallyExecuteCommands
in BE/E type builders (#4302)
* Allow setting canPotentiallyExecuteCommands in BE/E type builders - Add FabricBlockEntityTypeBuilder#canPotentiallyExecuteCommands - Add FabricEntityType.Builder#canPotentiallyExecuteCommands - Add FabricBlockEntityTypeBuilder#addBlocks(Collection) - Deprecate FabricBlockEntityTypeBuilder#build(Type) * Add bool to canPotentiallyExecuteCommands --------- Co-authored-by: modmuss50 <modmuss50@gmail.com>
This commit is contained in:
parent
4fc7e41ba7
commit
1a8f4cc489
7 changed files with 123 additions and 19 deletions
fabric-object-builder-api-v1/src/main/java/net/fabricmc/fabric
api/object/builder/v1
impl/object/builder
mixin/object/builder
|
@ -16,12 +16,13 @@
|
|||
|
||||
package net.fabricmc.fabric.api.object.builder.v1.block.entity;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import com.mojang.datafixers.types.Type;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
|
@ -29,24 +30,22 @@ import net.minecraft.block.entity.BlockEntity;
|
|||
import net.minecraft.block.entity.BlockEntityType;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
|
||||
import net.fabricmc.fabric.impl.object.builder.ExtendedBlockEntityType;
|
||||
|
||||
/**
|
||||
* Fabric's version of BlockEntityType.Builder with additional convenience methods.
|
||||
*
|
||||
* Use this builder to create a {@link BlockEntityType}.
|
||||
*/
|
||||
public final class FabricBlockEntityTypeBuilder<T extends BlockEntity> {
|
||||
private final Factory<? extends T> factory;
|
||||
private final List<Block> blocks;
|
||||
private final Set<Block> blocks = new HashSet<>();
|
||||
private boolean canPotentiallyExecuteCommands = false;
|
||||
|
||||
private FabricBlockEntityTypeBuilder(Factory<? extends T> factory, List<Block> blocks) {
|
||||
private FabricBlockEntityTypeBuilder(Factory<? extends T> factory) {
|
||||
this.factory = factory;
|
||||
this.blocks = blocks;
|
||||
}
|
||||
|
||||
public static <T extends BlockEntity> FabricBlockEntityTypeBuilder<T> create(Factory<? extends T> factory, Block... blocks) {
|
||||
List<Block> blocksList = new ArrayList<>(blocks.length);
|
||||
Collections.addAll(blocksList, blocks);
|
||||
|
||||
return new FabricBlockEntityTypeBuilder<>(factory, blocksList);
|
||||
return new FabricBlockEntityTypeBuilder<T>(factory).addBlocks(blocks);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -71,12 +70,39 @@ public final class FabricBlockEntityTypeBuilder<T extends BlockEntity> {
|
|||
return this;
|
||||
}
|
||||
|
||||
public BlockEntityType<T> build() {
|
||||
return build(null);
|
||||
/**
|
||||
* Adds supported blocks for the block entity type.
|
||||
*
|
||||
* @param blocks the supported blocks
|
||||
* @return this builder
|
||||
*/
|
||||
public FabricBlockEntityTypeBuilder<T> addBlocks(Collection<? extends Block> blocks) {
|
||||
this.blocks.addAll(blocks);
|
||||
return this;
|
||||
}
|
||||
|
||||
public BlockEntityType<T> build(Type<?> type) {
|
||||
return new BlockEntityType<T>(factory::create, new HashSet<>(blocks));
|
||||
/**
|
||||
* Makes the built {@link BlockEntityType} return {@code true} from
|
||||
* {@link BlockEntityType#canPotentiallyExecuteCommands()}.
|
||||
*
|
||||
* @param canPotentiallyExecuteCommands whether the block entity is able to execute commands
|
||||
* @return this builder
|
||||
*/
|
||||
public FabricBlockEntityTypeBuilder<T> canPotentiallyExecuteCommands(boolean canPotentiallyExecuteCommands) {
|
||||
this.canPotentiallyExecuteCommands = canPotentiallyExecuteCommands;
|
||||
return this;
|
||||
}
|
||||
|
||||
public BlockEntityType<T> build() {
|
||||
return new ExtendedBlockEntityType<>(factory::create, new HashSet<>(blocks), canPotentiallyExecuteCommands);
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated Use {@link #build()} instead.
|
||||
*/
|
||||
@Deprecated
|
||||
public BlockEntityType<T> build(@Nullable Type<?> type) {
|
||||
return build();
|
||||
}
|
||||
|
||||
@FunctionalInterface
|
||||
|
|
|
@ -51,6 +51,16 @@ public interface FabricEntityType {
|
|||
throw new AssertionError("Implemented in Mixin");
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets whether the entity is able to execute commands.
|
||||
*
|
||||
* @param canPotentiallyExecuteCommands whether the entity is able to execute commands
|
||||
* @return this builder
|
||||
*/
|
||||
default EntityType.Builder<T> canPotentiallyExecuteCommands(boolean canPotentiallyExecuteCommands) {
|
||||
throw new AssertionError("Implemented in Mixin");
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an entity type builder for a living entity.
|
||||
*
|
||||
|
|
|
@ -0,0 +1,41 @@
|
|||
/*
|
||||
* Copyright (c) 2016, 2017, 2018, 2019 FabricMC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package net.fabricmc.fabric.impl.object.builder;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.entity.BlockEntity;
|
||||
import net.minecraft.block.entity.BlockEntityType;
|
||||
|
||||
public class ExtendedBlockEntityType<T extends BlockEntity> extends BlockEntityType<T> {
|
||||
private final boolean canPotentiallyExecuteCommands;
|
||||
|
||||
public ExtendedBlockEntityType(BlockEntityFactory<? extends T> factory, Set<Block> blocks, boolean canPotentiallyExecuteCommands) {
|
||||
super(factory, blocks);
|
||||
this.canPotentiallyExecuteCommands = canPotentiallyExecuteCommands;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canPotentiallyExecuteCommands() {
|
||||
if (canPotentiallyExecuteCommands) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return super.canPotentiallyExecuteCommands();
|
||||
}
|
||||
}
|
|
@ -37,6 +37,8 @@ import net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityType;
|
|||
public interface FabricEntityTypeImpl {
|
||||
void fabric_setAlwaysUpdateVelocity(Boolean alwaysUpdateVelocity);
|
||||
|
||||
void fabric_setCanPotentiallyExecuteCommands(Boolean canPotentiallyExecuteCommands);
|
||||
|
||||
interface Builder {
|
||||
void fabric_setLivingEntityBuilder(Living<? extends LivingEntity> livingBuilder);
|
||||
|
||||
|
|
|
@ -43,7 +43,9 @@ public class BlockEntityTypeMixin<T extends BlockEntity> implements FabricBlockE
|
|||
|
||||
@Inject(method = "<init>", at = @At("RETURN"))
|
||||
private void mutableBlocks(BlockEntityType.BlockEntityFactory<? extends T> factory, Set<Block> blocks, CallbackInfo ci) {
|
||||
this.blocks = new HashSet<>(this.blocks);
|
||||
if (!(this.blocks instanceof HashSet)) {
|
||||
this.blocks = new HashSet<>(this.blocks);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -48,6 +48,8 @@ public abstract class EntityTypeBuilderMixin<T extends Entity> implements Fabric
|
|||
|
||||
@Unique
|
||||
private Boolean alwaysUpdateVelocity = null;
|
||||
@Unique
|
||||
private Boolean canPotentiallyExecuteCommands = null;
|
||||
|
||||
@Unique
|
||||
private FabricEntityTypeImpl.Builder.Living<? extends LivingEntity> livingBuilder = null;
|
||||
|
@ -55,8 +57,14 @@ public abstract class EntityTypeBuilderMixin<T extends Entity> implements Fabric
|
|||
private FabricEntityTypeImpl.Builder.Mob<? extends MobEntity> mobBuilder = null;
|
||||
|
||||
@Override
|
||||
public EntityType.Builder<T> alwaysUpdateVelocity(boolean forceTrackedVelocityUpdates) {
|
||||
alwaysUpdateVelocity = forceTrackedVelocityUpdates;
|
||||
public EntityType.Builder<T> alwaysUpdateVelocity(boolean alwaysUpdateVelocity) {
|
||||
this.alwaysUpdateVelocity = alwaysUpdateVelocity;
|
||||
return (EntityType.Builder<T>) (Object) this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EntityType.Builder<T> canPotentiallyExecuteCommands(boolean canPotentiallyExecuteCommands) {
|
||||
this.canPotentiallyExecuteCommands = canPotentiallyExecuteCommands;
|
||||
return (EntityType.Builder<T>) (Object) this;
|
||||
}
|
||||
|
||||
|
@ -67,6 +75,7 @@ public abstract class EntityTypeBuilderMixin<T extends Entity> implements Fabric
|
|||
}
|
||||
|
||||
entityType.fabric_setAlwaysUpdateVelocity(alwaysUpdateVelocity);
|
||||
entityType.fabric_setCanPotentiallyExecuteCommands(canPotentiallyExecuteCommands);
|
||||
|
||||
if (livingBuilder != null) {
|
||||
livingBuilder.onBuild(castLiving(cir.getReturnValue()));
|
||||
|
|
|
@ -30,16 +30,30 @@ import net.fabricmc.fabric.impl.object.builder.FabricEntityTypeImpl;
|
|||
public abstract class EntityTypeMixin implements FabricEntityTypeImpl {
|
||||
@Unique
|
||||
private Boolean alwaysUpdateVelocity;
|
||||
@Unique
|
||||
private Boolean canPotentiallyExecuteCommands;
|
||||
|
||||
@Inject(method = "alwaysUpdateVelocity", at = @At("HEAD"), cancellable = true)
|
||||
public void alwaysUpdateVelocity(CallbackInfoReturnable<Boolean> cir) {
|
||||
public void onAlwaysUpdateVelocity(CallbackInfoReturnable<Boolean> cir) {
|
||||
if (alwaysUpdateVelocity != null) {
|
||||
cir.setReturnValue(alwaysUpdateVelocity);
|
||||
}
|
||||
}
|
||||
|
||||
@Inject(method = "canPotentiallyExecuteCommands", at = @At("HEAD"), cancellable = true)
|
||||
public void onCanPotentiallyExecuteCommands(CallbackInfoReturnable<Boolean> cir) {
|
||||
if (canPotentiallyExecuteCommands != null) {
|
||||
cir.setReturnValue(canPotentiallyExecuteCommands);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fabric_setAlwaysUpdateVelocity(Boolean alwaysUpdateVelocity) {
|
||||
this.alwaysUpdateVelocity = alwaysUpdateVelocity;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fabric_setCanPotentiallyExecuteCommands(Boolean canPotentiallyExecuteCommands) {
|
||||
this.canPotentiallyExecuteCommands = canPotentiallyExecuteCommands;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue