BlockPlaceUtils class
Пакет: com.hypixel.hytale.server.core.modules.interaction
Файл: com/hypixel/hytale/server/core/modules/interaction/BlockPlaceUtils.java
Поля (71)
| Модификаторы | Тип | Имя |
|---|---|---|
|
|
return |
|
|
return |
|
|
var1 |
|
ItemStackSlotTransaction |
var10 |
|
Holder |
var10 |
|
Vector3i |
var10 |
|
int |
var10 |
|
ItemStackTransaction |
var11 |
|
Ref |
var11 |
|
String |
var11 |
|
|
var11 |
|
BlockSection |
var12 |
|
String |
var12 |
|
|
var12 |
|
SoftBlockDropType |
var13 |
|
int |
var14 |
|
Ref |
var15 |
|
|
var15 |
|
WorldConfig |
var15 |
|
Vector3i |
var16 |
|
Player |
var16 |
|
RotationTuple |
var17 |
|
|
var17 |
|
PlayerRef |
var17 |
|
BlockSection |
var18 |
|
|
var18 |
|
boolean |
var18 |
|
boolean |
var19 |
|
int |
var19 |
|
|
var2 |
|
BlockPlacementSettings |
var2 |
|
PlaceBlockEvent |
var20 |
|
Environment |
var20 |
|
boolean |
var21 |
|
int |
var21 |
|
boolean |
var22 |
|
BlockBoundingBoxes |
var22 |
|
boolean |
var23 |
|
int |
var23 |
|
ItemStackSlotTransaction |
var24 |
|
int |
var24 |
|
String |
var25 |
|
Ref |
var25 |
|
Ref |
var26 |
|
UUIDComponent |
var26 |
|
BlockChunk |
var27 |
|
PlacedByInteractionComponent |
var27 |
|
BlockComponentSection |
var28 |
|
BlockType |
var28 |
|
boolean |
var29 |
|
int |
var29 |
|
Store |
var3 |
|
PlayerRef |
var31 |
|
Player |
var32 |
|
BlockType |
var33 |
|
ChunkSection |
var34 |
|
PrefabListAsset |
var4 |
|
PrefabBuffer.PrefabBufferAccessor |
var4 |
|
Path |
var5 |
|
int |
var5 |
|
World |
var6 |
|
int |
var6 |
|
BsonDocument |
var7 |
|
PrefabBuffer |
var7 |
|
int |
var7 |
|
InventoryComponent.Hotbar |
var8 |
|
BsonValue |
var8 |
|
BlockType |
var8 |
|
ItemContainer |
var9 |
|
BsonDocument |
var9 |
|
BlockGathering |
var9 |
Методы (52)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
static |
void |
breakAndDropReplacedBlockvoid breakAndDropReplacedBlock(@Nonnull Vector3i var0,
@Nonnull BlockSection var1,
@Nonnull Ref<ChunkStore> var2,
@Nonnull Ref<EntityStore> var3,
@Nonnull ComponentAccessor<ChunkStore> var4,
@Nonnull ComponentAccessor<EntityStore> var5,
boolean var6) |
abstract |
|
breakAndDropReplacedBlock breakAndDropReplacedBlock(var10, var8, var7, var0, var10, var11, var14) |
abstract |
|
breakAndDropReplacedBlock breakAndDropReplacedBlock(var10, var12, var11, var0, var10, var11, var14) |
abstract |
|
breakAndDropReplacedBlock breakAndDropReplacedBlock(var2, var8, var7, var0, var10, var11, var14) |
static |
boolean |
canPlaceBlockboolean canPlaceBlock(@Nonnull BlockType var0, @Nonnull String var1) |
|
|
if if(var18 == null) |
|
|
if if(var21) |
|
|
if if(var21) |
|
|
if if(var18 == null) |
|
|
if if(var23) |
|
|
if if(var31 != null) |
|
|
if if(var2 == null && var1 != null) |
|
|
if if(var33 != null) |
|
|
if if(var34 == null) |
|
|
if if(var26 == null) |
|
|
if if(var27 == null) |
|
|
if if(var28 == null) |
|
|
if if(var29) |
|
|
if if(var8 != null && var1 != null && var3) |
|
|
if if(var1 != null) |
|
|
if if(var7 != null) |
|
|
if if(var8 != null) |
|
|
if if(var10 != null) |
|
|
if if(var0 == null) |
|
|
if if(var1 != null) |
|
|
if if(var1 != null) |
|
|
if if(var1 != null) |
|
|
if if(var4 == null) |
|
|
if if(var2 != null) |
|
|
if if(var5 == null) |
|
|
if if(var2 != null) |
|
|
if if(var2 != null) |
|
|
if if(var18) |
|
|
if if(var17 != null) |
|
|
if if(var28 == null) |
|
|
if if(var22 != null) |
|
|
if if(var12 != null) |
|
|
if if(!var14) |
|
|
if if(var25 != null) |
|
|
if if(var7 != 0) |
|
|
if if(var8 != null) |
|
|
if if(var9 != null) |
|
|
if if(var13 != null) |
|
|
if if(!var6) |
static |
void |
onPlaceBlockFailurevoid onPlaceBlockFailure(@Nonnull Ref<EntityStore> var0,
@Nullable ItemStack var1,
byte var2,
boolean var3,
@Nullable PlayerRef var4,
@Nonnull BlockSection var5,
@Nonnull Vector3i var6,
@Nonnull ComponentAccessor<EntityStore> var7) |
abstract |
|
onPlaceBlockFailure onPlaceBlockFailure(var0, var1, var7, var23, var31, var18, var16, var11) |
static |
void |
onPlaceBlockSuccessvoid onPlaceBlockSuccess(@Nonnull ComponentAccessor<ChunkStore> var0,
@Nullable ItemStack var1,
@Nonnull Ref<ChunkStore> var2,
@Nonnull BlockComponentSection var3,
@Nonnull Vector3i var4,
BlockType var5,
RotationTuple var6) |
abstract |
|
onPlaceBlockSuccess onPlaceBlockSuccess(var10, var1, var15, var28, var16, var33, var17) |
static |
boolean |
placeBlockboolean placeBlock(@Nonnull Ref<EntityStore> var0,
@Nullable ItemStack var1,
@Nullable String var2,
@Nonnull ItemContainer var3,
@Nonnull Vector3i var4,
@Nonnull Vector3i var5,
@Nonnull BlockRotation var6,
byte var7,
boolean var8,
@Nonnull Ref<ChunkStore> var9,
@Nonnull ComponentAccessor<ChunkStore> var10,
@Nonnull ComponentAccessor<EntityStore> var11,
boolean var12,
boolean var13,
boolean var14) |
static |
boolean |
tryPlaceBlockboolean tryPlaceBlock(@Nonnull Ref<EntityStore> var0,
@Nonnull Vector3i var1,
@Nonnull Vector3i var2,
@Nonnull String var3,
@Nonnull RotationTuple var4,
@Nonnull Ref<ChunkStore> var5,
@Nonnull BlockChunk var6,
@Nonnull Ref<ChunkStore> var7,
@Nonnull BlockSection var8,
@Nonnull BlockComponentSection var9,
@Nonnull ComponentAccessor<ChunkStore> var10,
@Nonnull ComponentAccessor<EntityStore> var11,
boolean var12,
boolean var13,
boolean var14) |
static |
boolean |
validateAndPlacePrefabboolean validateAndPlacePrefab(@Nonnull Vector3i var0, @Nonnull String var1, @Nullable PlayerRef var2, @Nonnull ComponentAccessor<EntityStore> var3) |
static |
boolean |
validateBlockToPlaceboolean validateBlockToPlace(@Nullable String var0, @Nullable PlayerRef var1) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.modules.interaction;
class="kw">import com.hypixel.hytale.codec.EmptyExtraInfo;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.util.FastRandom;
class="kw">import com.hypixel.hytale.protocol.BlockMaterial;
class="kw">import com.hypixel.hytale.protocol.BlockRotation;
class="kw">import com.hypixel.hytale.protocol.GameMode;
class="kw">import com.hypixel.hytale.server.core.Message;
class="kw">import com.hypixel.hytale.server.core.asset.type.blockhitbox.BlockBoundingBoxes;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockGathering;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockPlacementSettings;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.Rotation;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.RotationTuple;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.SoftBlockDropType;
class="kw">import com.hypixel.hytale.server.core.asset.type.buildertool.config.PrefabListAsset;
class="kw">import com.hypixel.hytale.server.core.asset.type.environment.config.Environment;
class="kw">import com.hypixel.hytale.server.core.asset.type.gameplay.WorldConfig;
class="kw">import com.hypixel.hytale.server.core.blocktype.component.BlockPhysics;
class="kw">import com.hypixel.hytale.server.core.entity.UUIDComponent;
class="kw">import com.hypixel.hytale.server.core.entity.entities.Player;
class="kw">import com.hypixel.hytale.server.core.event.events.ecs.PlaceBlockEvent;
class="kw">import com.hypixel.hytale.server.core.inventory.InventoryComponent;
class="kw">import com.hypixel.hytale.server.core.inventory.ItemStack;
class="kw">import com.hypixel.hytale.server.core.inventory.container.ItemContainer;
class="kw">import com.hypixel.hytale.server.core.inventory.transaction.ItemStackSlotTransaction;
class="kw">import com.hypixel.hytale.server.core.inventory.transaction.ItemStackTransaction;
class="kw">import com.hypixel.hytale.server.core.modules.block.BlockEntity;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.components.PlacedByInteractionComponent;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.buffer.PrefabBufferUtil;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.buffer.impl.PrefabBuffer;
class="kw">import com.hypixel.hytale.server.core.universe.PlayerRef;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.BlockChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.BlockOperations;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.BlockComponentSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.BlockSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.ChunkSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.connectedblocks.ConnectedBlocksUtil;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.core.util.FillerBlockUtil;
class="kw">import com.hypixel.hytale.server.core.util.PrefabUtil;
class="kw">import com.hypixel.hytale.sneakythrow.SneakyThrow;
class="kw">import java.nio.file.Files;
class="kw">import java.nio.file.Path;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.bson.BsonDocument;
class="kw">import org.bson.BsonValue;
class="kw">import org.joml.Vector3i;
class="kw">public class BlockPlaceUtils {
@Nonnull
class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
@Nonnull
class="kw">private class="kw">static class="kw">final Message MESSAGE_MODULES_INTERACTION_FAILED_ADD_BACK_AFTER_FAILED_PLACE = Message.translation(
"server.modules.interaction.failedAddBackAfterFailedPlace"
);
@Nonnull
class="kw">private class="kw">static class="kw">final Message MESSAGE_MODULES_INTERACTION_FAILED_CHECK_BLOCK = Message.translation("server.modules.interaction.failedCheckBlock");
@Nonnull
class="kw">private class="kw">static class="kw">final Message MESSAGE_MODULES_INTERACTION_FAILED_CHECK_EMPTY = Message.translation("server.modules.interaction.failedCheckEmpty");
@Nonnull
class="kw">private class="kw">static class="kw">final Message MESSAGE_MODULES_INTERACTION_FAILED_CHECK_UNKNOWN = Message.translation("server.modules.interaction.failedCheckUnknown");
@Nonnull
class="kw">private class="kw">static class="kw">final Message MESSAGE_MODULES_INTERACTION_FAILED_CHECK = Message.translation("server.modules.interaction.failedCheck");
@Nonnull
class="kw">private class="kw">static class="kw">final Message MESSAGE_MODULES_INTERACTION_BUILD_FORBIDDEN = Message.translation("server.modules.interaction.buildForbidden");
class="kw">public BlockPlaceUtils() {
}
class="kw">public class="kw">static boolean placeBlock(
@Nonnull Ref<EntityStore> var0,
@Nullable ItemStack var1,
@Nullable String var2,
@Nonnull ItemContainer var3,
@Nonnull Vector3i var4,
@Nonnull Vector3i var5,
@Nonnull BlockRotation var6,
byte var7,
boolean var8,
@Nonnull Ref<ChunkStore> var9,
@Nonnull ComponentAccessor<ChunkStore> var10,
@Nonnull ComponentAccessor<EntityStore> var11,
boolean var12,
boolean var13,
boolean var14
) {
Ref var15 = var9;
RotationTuple var17 = RotationTuple.of(Rotation.valueOf(var6.rotationYaw), Rotation.valueOf(var6.rotationPitch), Rotation.valueOf(var6.rotationRoll));
BlockSection var18 = var10.getComponent(var9, BlockSection.getComponentType());
if (var18 == null) {
class="kw">return false;
}
PlaceBlockEvent var20 = new PlaceBlockEvent(var1, var5, var17);
var11.invoke(var0, var20);
if (var20.isCancelled()) {
var18.invalidateBlock(var5.x(), var5.y(), var5.z());
class="kw">return false;
}
boolean var19 = var20.isConsumeItem();
Vector3i var16 = var20.getTargetBlock();
var17 = var20.getRotation();
boolean var21 = !ChunkUtil.isSameChunkSection(var16.x, var16.y, var16.z, var5.x, var5.y, var5.z);
if (var21) {
var15 = var10.getExternalData().getChunkSectionReferenceAtBlock(var16.x, var16.y, var16.z);
if (var15 == null || !var15.isValid()) {
class="kw">return false;
}
}
if (var21) {
var18.invalidateBlock(var5.x(), var5.y(), var5.z());
}
if (!var15.equals(var9)) {
var18 = var10.getComponent(var15, BlockSection.getComponentType());
if (var18 == null) {
class="kw">return false;
}
}
PlayerRef var31 = var11.getComponent(var0, PlayerRef.getComponentType());
Player var32 = var11.getComponent(var0, Player.getComponentType());
boolean var22 = var32 == null || var32.getGameMode() == GameMode.Adventure;
boolean var23 = var22 && var8 && var19;
if (var23) {
ItemStackSlotTransaction var24 = var3.removeItemStackFromSlot(var7, var1, 1);
if (!var24.succeeded()) {
if (var31 != null) {
var31.sendMessage(MESSAGE_MODULES_INTERACTION_FAILED_CHECK);
}
class="kw">return false;
}
var1 = var24.getOutput();
}
if (var2 == null && var1 != null) {
var2 = var1.getBlockKey();
}
if (!var12 && !validateBlockToPlace(var2, var31)) {
class="kw">return false;
}
assert var2 != null;
BlockType var33 = BlockType.getAssetMap().getAsset(var2);
if (var33 != null) {
String var25 = var33.getPrefabListAssetId();
if (var25 != null && !validateAndPlacePrefab(var5, var25, var31, var11)) {
class="kw">return false;
}
}
ChunkSection var34 = var10.getComponent(var15, ChunkSection.getComponentType());
if (var34 == null) {
class="kw">return false;
}
Ref var26 = var34.getChunkColumnReference();
if (var26 == null) {
class="kw">return false;
}
BlockChunk var27 = var10.getComponent(var26, BlockChunk.getComponentType());
if (var27 == null) {
class="kw">return false;
}
BlockComponentSection var28 = var10.getComponent(var15, BlockComponentSection.getComponentType());
if (var28 == null) {
class="kw">return false;
}
boolean var29 = tryPlaceBlock(var0, var4, var16, var2, var17, var26, var27, var15, var18, var28, var10, var11, var12, var13, var14);
if (var29) {
onPlaceBlockSuccess(var10, var1, var15, var28, var16, var33, var17);
} else {
onPlaceBlockFailure(var0, var1, var7, var23, var31, var18, var16, var11);
}
class="kw">return var29;
}
class="kw">private class="kw">static void onPlaceBlockFailure(
@Nonnull Ref<EntityStore> var0,
@Nullable ItemStack var1,
byte var2,
boolean var3,
@Nullable PlayerRef var4,
@Nonnull BlockSection var5,
@Nonnull Vector3i var6,
@Nonnull ComponentAccessor<EntityStore> var7
) {
InventoryComponent.Hotbar var8 = var7.getComponent(var0, InventoryComponent.Hotbar.getComponentType());
if (var8 != null && var1 != null && var3) {
ItemContainer var9 = var8.getInventory();
ItemStackSlotTransaction var10 = var9.addItemStackToSlot(var2, var1);
if (!var10.succeeded()) {
ItemStackTransaction var11 = var9.addItemStack(var1);
if (!var11.succeeded() && var4 != null) {
var4.sendMessage(MESSAGE_MODULES_INTERACTION_FAILED_ADD_BACK_AFTER_FAILED_PLACE);
}
class="kw">return;
}
}
var5.invalidateBlock(var6.x(), var6.y(), var6.z());
}
class="kw">private class="kw">static void onPlaceBlockSuccess(
@Nonnull ComponentAccessor<ChunkStore> var0,
@Nullable ItemStack var1,
@Nonnull Ref<ChunkStore> var2,
@Nonnull BlockComponentSection var3,
@Nonnull Vector3i var4,
BlockType var5,
RotationTuple var6
) {
if (var1 != null) {
BsonDocument var7 = var1.getMetadata();
if (var7 != null) {
BsonValue var8 = var7.get("BlockHolder");
if (var8 != null) {
try {
BsonDocument var9 = var8.asDocument();
Holder var10 = ChunkStore.REGISTRY.getEntityCodec().decode(var9, EmptyExtraInfo.EMPTY);
if (var10 != null) {
BlockEntity.setBlockEntity(var0, var2, var3, var4.x, var4.y, var4.z, var5, var6.index(), var10);
} else {
LOGGER.at(Level.WARNING).log("Failed to set Block Entity from item metadata: %s, %s", var1.getItemId(), var9);
}
} catch (Exception var11) {
throw SneakyThrow.sneakyThrow(var11);
}
}
}
}
}
class="kw">private class="kw">static boolean validateBlockToPlace(@Nullable String var0, @Nullable PlayerRef var1) {
if (var0 == null) {
if (var1 != null) {
var1.sendMessage(MESSAGE_MODULES_INTERACTION_FAILED_CHECK_BLOCK);
}
class="kw">return false;
} else if (var0.equals("Empty")) {
if (var1 != null) {
var1.sendMessage(MESSAGE_MODULES_INTERACTION_FAILED_CHECK_EMPTY);
}
class="kw">return false;
} else if (var0.equals("Unknown")) {
if (var1 != null) {
var1.sendMessage(MESSAGE_MODULES_INTERACTION_FAILED_CHECK_UNKNOWN);
}
class="kw">return false;
} else {
class="kw">return true;
}
}
class="kw">private class="kw">static boolean validateAndPlacePrefab(
@Nonnull Vector3i var0, @Nonnull String var1, @Nullable PlayerRef var2, @Nonnull ComponentAccessor<EntityStore> var3
) {
PrefabListAsset var4 = PrefabListAsset.getAssetMap().getAsset(var1);
if (var4 == null) {
if (var2 != null) {
var2.sendMessage(Message.translation("server.modules.interaction.placeBlock.prefabListNotFound").param("name", var1));
}
class="kw">return false;
} else {
Path var5 = var4.getRandomPrefab();
if (var5 == null) {
if (var2 != null) {
var2.sendMessage(Message.translation("server.modules.interaction.placeBlock.prefabListEmpty").param("name", var1));
}
class="kw">return false;
} else if (!Files.exists(var5)) {
if (var2 != null) {
var2.sendMessage(Message.translation("server.commands.editprefab.prefabNotFound").param("name", var5.toString()));
}
class="kw">return false;
} else {
World var6 = var3.getExternalData().getWorld();
PrefabBuffer var7 = PrefabBufferUtil.loadBuffer(var5);
var6.execute(() -> {
Store var3 = var6.getEntityStore().getStore();
PrefabBuffer.PrefabBufferAccessor var4 = var7.newAccess();
int var5 = 9;
int var6 = 0;
PrefabUtil.paste(var4, var6, var0, Rotation.None, new FastRandom(), 9, 0, var3);
});
class="kw">return true;
}
}
}
class="kw">private class="kw">static boolean tryPlaceBlock(
@Nonnull Ref<EntityStore> var0,
@Nonnull Vector3i var1,
@Nonnull Vector3i var2,
@Nonnull String var3,
@Nonnull RotationTuple var4,
@Nonnull Ref<ChunkStore> var5,
@Nonnull BlockChunk var6,
@Nonnull Ref<ChunkStore> var7,
@Nonnull BlockSection var8,
@Nonnull BlockComponentSection var9,
@Nonnull ComponentAccessor<ChunkStore> var10,
@Nonnull ComponentAccessor<EntityStore> var11,
boolean var12,
boolean var13,
boolean var14
) {
WorldConfig var15 = var11.getExternalData().getWorld().getGameplayConfig().getWorldConfig();
if (!var15.isBlockPlacementAllowed()) {
class="kw">return false;
}
Player var16 = var11.getComponent(var0, Player.getComponentType());
PlayerRef var17 = var11.getComponent(var0, PlayerRef.getComponentType());
boolean var18 = var16 == null || var16.getGameMode() == GameMode.Adventure;
if (var18) {
int var19 = var6.getEnvironment(var2);
Environment var20 = Environment.getAssetMap().getAsset(var19);
if (var20 != null && !var20.isBlockModificationAllowed()) {
if (var17 != null) {
var17.sendMessage(MESSAGE_MODULES_INTERACTION_BUILD_FORBIDDEN);
}
class="kw">return false;
}
}
BlockType var28 = BlockType.getAssetMap().getAsset(var3);
int var29 = var4.index();
if (var28 == null) {
class="kw">return false;
}
int var21 = BlockType.getAssetMap().getIndex(var3);
if (!var12 && !var13 && !var14 && !BlockOperations.testPlaceBlock(var10, var8, var2.x(), var2.y(), var2.z(), var28, var29)) {
class="kw">return false;
}
BlockBoundingBoxes var22 = BlockBoundingBoxes.getAssetMap().getAsset(var28.getHitboxTypeIndex());
if (var22 != null) {
FillerBlockUtil.forEachFillerBlock(var22.get(var29), (var7x, var8x, var9x) -> {
Vector3i var10 = new Vector3i(var2).add(var7x, var8x, var9x);
if (ChunkUtil.isSameChunkSection(var2.x, var2.y, var2.z, var10.x, var10.y, var10.z)) {
breakAndDropReplacedBlock(var10, var8, var7, var0, var10, var11, var14);
} else {
Ref var11 = var10.getExternalData().getChunkSectionReferenceAtBlock(var10.x, var10.y, var10.z);
if (var11 != null && var11.isValid()) {
BlockSection var12 = var10.getComponent(var11, BlockSection.getComponentType());
if (var12 != null) {
breakAndDropReplacedBlock(var10, var12, var11, var0, var10, var11, var14);
}
}
}
});
} else {
breakAndDropReplacedBlock(var2, var8, var7, var0, var10, var11, var14);
}
int var23 = 0;
if (!var14) {
var23 |= 256;
}
if (!BlockOperations.setBlock(var10.getExternalData(), var7, var2.x(), var2.y(), var2.z(), var21, var28, var29, 0, var23)) {
class="kw">return false;
}
if (var16 != null && (var14 || !var16.isOverrideBlockPlacementRestrictions() && var28.canBePlacedAsDeco())) {
BlockPhysics.markDeco(var10, var7, var2.x, var2.y, var2.z);
}
int var24 = ChunkUtil.indexBlock(var2.x, var2.y, var2.z);
Ref var25 = var9.getBlockReference(var24);
if (var25 != null) {
UUIDComponent var26 = var11.getComponent(var0, UUIDComponent.getComponentType());
assert var26 != null;
PlacedByInteractionComponent var27 = new PlacedByInteractionComponent(var26.getUuid());
var10.putComponent(var25, PlacedByInteractionComponent.getComponentType(), var27);
}
ConnectedBlocksUtil.setConnectedBlockAndNotifyNeighbors(var10.getExternalData(), BlockType.getAssetMap().getIndex(var3), var4, var1, var2, var7, var8);
class="kw">return true;
}
class="kw">private class="kw">static void breakAndDropReplacedBlock(
@Nonnull Vector3i var0,
@Nonnull BlockSection var1,
@Nonnull Ref<ChunkStore> var2,
@Nonnull Ref<EntityStore> var3,
@Nonnull ComponentAccessor<ChunkStore> var4,
@Nonnull ComponentAccessor<EntityStore> var5,
boolean var6
) {
int var7 = var1.get(var0.x, var0.y, var0.z);
if (var7 != 0) {
BlockType var8 = BlockType.getAssetMap().getAsset(var7);
if (var8 != null) {
if (var8.getMaterial() != BlockMaterial.Empty) {
class="kw">return;
}
BlockGathering var9 = var8.getGathering();
int var10 = 1;
String var11 = null;
String var12 = null;
if (var9 != null) {
SoftBlockDropType var13 = var9.getSoft();
if (var13 != null) {
var11 = var13.getItemId();
var12 = var13.getDropListId();
}
}
int var14 = 32;
if (!var6) {
var14 |= 256;
}
BlockHarvestUtils.performBlockBreak(var0, var8, null, var10, var11, var12, var14, var3, var2, var5, var4);
}
}
}
class="kw">public class="kw">static boolean canPlaceBlock(@Nonnull BlockType var0, @Nonnull String var1) {
if (var0.getId().equals(var1)) {
class="kw">return true;
}
BlockPlacementSettings var2 = var0.getPlacementSettings();
class="kw">return var2 == null
? false
: var1.equals(var2.getWallPlacementOverrideBlockId())
|| var1.equals(var2.getFloorPlacementOverrideBlockId())
|| var1.equals(var2.getCeilingPlacementOverrideBlockId());
}
}