use of net.minecraft.block.dispenser.DispenserBehavior in project carpet-extra by gnembon.
the class DispenserBlock_GetCustomBehaviorMixin method dispenseCustomBehavior.
@Inject(method = "dispense", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/DispenserBlock;getBehaviorForItem(Lnet/minecraft/item/ItemStack;)Lnet/minecraft/block/dispenser/DispenserBehavior;"), locals = LocalCapture.CAPTURE_FAILHARD, cancellable = true)
private void dispenseCustomBehavior(ServerWorld serverWorld, BlockPos pos, CallbackInfo ci, BlockPointerImpl blockPointer, DispenserBlockEntity dispenserBlockEntity, int i, ItemStack itemStack) {
// get custom behavior
DispenserBehavior behavior = CarpetExtraDispenserBehaviors.getCustomDispenserBehavior(serverWorld, pos, blockPointer, dispenserBlockEntity, itemStack, BEHAVIORS);
// check if custom behavior exists
if (behavior != null) {
// run custom behavior
Value previousStackSnapshot = null;
if (DispenserEvent.needed())
previousStackSnapshot = ValueConversions.of(itemStack);
ItemStack resultStack = behavior.dispense(blockPointer, itemStack);
dispenserBlockEntity.setStack(i, resultStack);
DispenserEvent.call(blockPointer, behavior, pos, previousStackSnapshot, resultStack);
ci.cancel();
}
}
use of net.minecraft.block.dispenser.DispenserBehavior in project TaterCart by Patbox.
the class DispenserMinecartEntity method dispense.
protected void dispense(ServerWorld world, BlockPos pos) {
int i = this.chooseNonEmptySlot();
if (i < 0) {
world.syncWorldEvent(1001, pos, 0);
world.emitGameEvent(GameEvent.DISPENSE_FAIL, pos);
} else {
ItemStack itemStack = this.getStack(i);
DispenserBehavior dispenserBehavior = this.getBehaviorForItem(itemStack);
if (dispenserBehavior != DispenserBehavior.NOOP) {
try {
this.setStack(i, dispenserBehavior.dispense(this.getPointer(), itemStack));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
use of net.minecraft.block.dispenser.DispenserBehavior in project carpet-extra by gnembon.
the class CarpetExtraDispenserBehaviors method getCustomDispenserBehavior.
// get custom dispenser behavior
// this checks conditions such as the item and certain block or entity being in front of the dispenser to decide which rule to return
// if the conditions for the rule match, it returns the instance of the dispenser behavior
// returns null to fallback to vanilla (or another mod's) behavior for the given item
public static DispenserBehavior getCustomDispenserBehavior(ServerWorld world, BlockPos pos, BlockPointer pointer, DispenserBlockEntity dispenserBlockEntity, ItemStack stack, Map<Item, DispenserBehavior> VANILLA_BEHAVIORS) {
Item item = stack.getItem();
Direction dispenserFacing = pointer.getBlockState().get(DispenserBlock.FACING);
BlockPos frontBlockPos = pos.offset(dispenserFacing);
BlockState frontBlockState = world.getBlockState(frontBlockPos);
Block frontBlock = frontBlockState.getBlock();
Box frontBlockBox = new Box(frontBlockPos);
// blazeMeal
if (CarpetExtraSettings.blazeMeal && item == Items.BLAZE_POWDER && frontBlock == Blocks.NETHER_WART) {
return BLAZE_MEAL;
}
// chickenShearing
if (CarpetExtraSettings.chickenShearing && item == Items.SHEARS) {
boolean hasShearableChickens = !world.getEntitiesByType(EntityType.CHICKEN, frontBlockBox, EntityPredicates.VALID_LIVING_ENTITY.and((chickenEntity) -> {
return !((AnimalEntity) chickenEntity).isBaby();
})).isEmpty();
if (hasShearableChickens) {
return SHEAR_CHICKEN;
}
}
// dispensersCarvePumpkins
if (CarpetExtraSettings.dispensersCarvePumpkins && item instanceof ShearsItem && frontBlock == Blocks.PUMPKIN) {
return CARVE_PUMPKIN;
}
// dispensersFeedAnimals
if (CarpetExtraSettings.dispensersFeedAnimals) {
// check for animals that can be bred with the current item being dispensed in front of dispenser
boolean hasFeedableAnimals = !world.getEntitiesByClass(AnimalEntity.class, frontBlockBox, EntityPredicates.VALID_LIVING_ENTITY.and((animalEntity) -> {
return ((AnimalEntity) animalEntity).isBreedingItem(stack);
})).isEmpty();
if (hasFeedableAnimals) {
return FEED_ANIMAL;
}
// get brown mooshrooms in front of dispenser
boolean hasFeedableMooshrooms = !world.getEntitiesByType(EntityType.MOOSHROOM, frontBlockBox, EntityPredicates.VALID_LIVING_ENTITY.and((mooshroomEntity) -> {
return ((MooshroomEntity) mooshroomEntity).getMooshroomType() == MooshroomEntity.Type.BROWN;
})).isEmpty();
// check if item is a small flower
if (hasFeedableMooshrooms && item.getRegistryEntry().isIn(ItemTags.SMALL_FLOWERS)) {
return FEED_MOOSHROOM;
}
}
// dispensersFillMinecarts
if (CarpetExtraSettings.dispensersFillMinecarts) {
// check for minecarts with no riders in front of dispenser
boolean hasMinecarts = !world.getEntitiesByType(EntityType.MINECART, frontBlockBox, EntityPredicates.NOT_MOUNTED).isEmpty();
// if a minecart exist, return dispenser behavior according to item type
if (hasMinecarts) {
if (item == Items.CHEST) {
return FILL_MINECART_CHEST;
} else if (item == Items.FURNACE) {
return FILL_MINECART_FURNACE;
} else if (item == Items.TNT) {
return FILL_MINECART_TNT;
} else if (item == Items.HOPPER) {
return FILL_MINECART_HOPPER;
}
}
}
// dispensersMilkAnimals
if (CarpetExtraSettings.dispensersMilkAnimals) {
// bucket to milk
if (item == Items.BUCKET) {
// check for cows, mooshrooms, or goats in front of dispenser
boolean hasMilkable = !world.getEntitiesByClass(AnimalEntity.class, frontBlockBox, EntityPredicates.VALID_LIVING_ENTITY.and((animalEntity) -> {
return animalEntity instanceof CowEntity || animalEntity instanceof GoatEntity;
})).isEmpty();
if (hasMilkable) {
return MILK_ANIMAL;
}
} else // bowl to stew
if (item == Items.BOWL) {
// check for mooshrooms in front of dispenser
boolean hasMooshroom = !world.getEntitiesByType(EntityType.MOOSHROOM, frontBlockBox, EntityPredicates.VALID_LIVING_ENTITY).isEmpty();
if (hasMooshroom) {
return MILK_MOOSHROOM;
}
}
}
// dispensersPlayRecords
if (CarpetExtraSettings.dispensersPlayRecords && item instanceof MusicDiscItem && frontBlock == Blocks.JUKEBOX) {
return PLAY_DISC;
}
// dispensersPotPlants
if (CarpetExtraSettings.dispensersPotPlants && frontBlock instanceof FlowerPotBlock && FlowerPotHelper.isPottable(item)) {
return FILL_FLOWER_POT;
}
// dispensersStripBlocks
if (CarpetExtraSettings.dispensersStripBlocks && item instanceof AxeItem && (StripBlocksDispenserBehavior.canStrip(frontBlock) || StripBlocksDispenserBehavior.isStripResult(frontBlock))) {
return STRIP_BLOCK;
}
// dispensersTillSoil
if (CarpetExtraSettings.dispensersTillSoil && item instanceof HoeItem) {
// check block in front of dispenser and one block down
for (int i = 0; i < 2; i++) {
BlockPos hoeBlockPos = frontBlockPos.down(i);
Block hoeBlock = world.getBlockState(hoeBlockPos).getBlock();
// check if block is in tilled blocks, or is farmland (to prevent hoe being dispensed when you don't want it to)
if (TillSoilDispenserBehavior.TILLED_BLOCKS.contains(hoeBlock) || hoeBlock == Blocks.FARMLAND) {
return TILL_SOIL;
}
}
}
// dispensersToggleThings
if (CarpetExtraSettings.dispensersToggleThings && item == Items.STICK && ToggleBlockDispenserBehavior.TOGGLEABLE_BLOCKS.contains(frontBlock)) {
return TOGGLE_BLOCK;
}
// dispensersUseCauldrons
if (CarpetExtraSettings.dispensersUseCauldrons && frontBlock instanceof AbstractCauldronBlock) {
// empty cauldron
if (item == Items.BUCKET) {
return CAULDRON_EMPTYING_BUCKET;
} else // fill cauldron
if (item == Items.LAVA_BUCKET || item == Items.WATER_BUCKET || item == Items.POWDER_SNOW_BUCKET) {
return CAULDRON_FILLING_BUCKET;
} else // water cauldron behaviors (leather armor, shulker boxes, banners)
if (CauldronWaterDispenserBehavior.isWaterCauldronItem(stack)) {
return CAULDRON_WATER;
}
}
// renewableEndstone
if (CarpetExtraSettings.renewableEndstone && item == Items.DRAGON_BREATH && frontBlock == Blocks.COBBLESTONE) {
return DRAGON_BREATH_ENDSTONE;
}
// renewableNetherrack
if (CarpetExtraSettings.renewableNetherrack && item == Items.FIRE_CHARGE && frontBlock == Blocks.COBBLESTONE) {
return FIRE_CHARGE_NETHERRACK;
}
// no custom behavior, return null
return null;
}
Aggregations