BuilderToolsPacketHandler class

Пакет: com.hypixel.hytale.builtin.buildertools

Файл: com/hypixel/hytale/builtin/buildertools/BuilderToolsPacketHandler.java

implements: SubPacketHandler

Поля (279)

МодификаторыТипИмя
break
break
break
break
break
break
break
break
break
break
break
break
return
return
return
return
return
return
return
return
return
return
return
return
return
return
return
Integer[] var1
Vector3i var10
int var10
BuilderTool.ArgData var10
Map var10
int var10
int var10
ItemStack var10
BuilderTool.ArgData var10
BuilderTool.ArgData var10
Map var10
boolean var10
String var10
InventoryComponent.Tool var11
int var11
Vector3i var11
int var11
BuilderTool.ArgData var11
RotateBlockMode var11
boolean var11
int var11
boolean var11
BiConsumer var12
PrototypePlayerBuilderToolSettings.FluidChange[] var12
Vector3i var12
int var12
RotateBlockMode var12
int var12
boolean var12
boolean var12
long var13
ArrayList var13
Vector3i var13
int var13
BrushShape var13
Rotation3f var13
var13
var13
long var14
FluidChange[] var14
Rotation3f var14
String var14
BrushOrigin var14
boolean var14
InventoryComponent.Tool var15
PrototypePlayerBuilderToolSettings var15
boolean var15
String var15
int var15
BoundingBox var15
PrototypePlayerBuilderToolSettings.FluidChange var16
long var16
long var16
long var16
int var16
boolean var16
PrototypePlayerBuilderToolSettings.EntityChange var17
int var17
BuilderToolSelectionToolReplyWithClipboard var18
boolean var18
boolean var18
long var18
boolean var18
BlockPattern var18
ClipboardEntityChange[] var19
Quaterniond var19
List var19
String var19
long var19
UUID var2
ModelComponent var2
TransformComponent var2
TransformComponent var2
int var2
BlockSelection var2
BuilderToolEntityTransformSessionEnd var2
List var20
WorldChunk var20
boolean var20
BuilderToolSelectionToolReplyWithClipboard var21
HashSet var21
int var21
var21
boolean var21
long var21
BlockSelection var22
int var22
var22
int var23
int var23
var23
int var24
int var24
int var25
int var25
int var25
ObjectArrayList var26
int var26
ObjectArrayList var27
BlockPattern var27
BrushShape var27
ArrayList var28
int var28
int var28
ArrayList var29
BlockPattern var29
List var29
PermissionsModule var3
Vector3d var3
Vector3d var3
BlockPattern var30
boolean var31
float var31
String var32
BlockPattern var33
int var34
int var35
BlockChange[] var36
String var36
PrototypePlayerBuilderToolSettings.FluidChange[] var37
float var37
PrototypePlayerBuilderToolSettings.EntityChange[] var38
Holder[] var39
float var39
boolean var4
BuilderTool var4
EntityFreezeSnapshot var4
Vector3i var40
var40
boolean var40
String var41
boolean var43
BuilderToolsPlugin.ShadingLight var46
String var48
int[] var49
boolean var5
PermissionsModule var5
Store var5
BlockSelection var5
EntityScaleComponent var5
var5
EntitySettingsSnapshot var5
EntitySettingsSnapshot var5
EntitySettingsSnapshot var5
ItemComponent var5
BlockMask var5
int var50
boolean var53
BuilderToolsPlugin.ShadingLight var54
boolean var56
UUID var6
Player var6
Player var6
int var6
Holder var6
Player var6
Player var6
Player var6
EditorBlocksChange var6
Player var6
Player var6
Player var6
Player var6
Player var6
Player var6
Player var6
Player var6
Player var6
Player var6
Player var6
TransformComponent var6
PrefabEditSessionManager var6
PrefabEditSessionManager var6
Player var6
Player var6
Player var6
ColorLight var6
Ref var6
Player var6
HitboxCollisionConfig var6
Player var6
ItemStack var6
Player var6
boolean var7
Ref var7
Ref var7
TransformComponent var7
BiConsumer var7
PrototypePlayerBuilderToolSettings var7
BlockChange[] var7
boolean var7
var7
BuilderTool var7
BuilderTool var7
long var7
Axis var7
RotateBlockMode var7
var7
boolean var7
var7
BuilderTool var7
BuilderTool var7
Ref var7
Dirty var7
PrefabEditSession var7
PrefabEditSession var7
Ref var7
Ref var7
Ref var7
DynamicLight var7
NPCMarkerComponent var7
Ref var7
HitboxCollision var7
Ref var7
int var7
Player var8
Player var8
BuilderToolsPlugin.BuilderState var8
BiConsumer var8
ArrayList var8
BuilderTool var8
ItemStack var8
ItemStack var8
RotateBlockMode var8
var8
BuilderTool var8
BuilderTool var8
ItemStack var8
ModelTransform var8
PrefabEditingMetadata var8
var8
PropComponent var8
PersistentDynamicLight var8
UUIDComponent var8
PropComponent var8
ItemStack var8
Player var9
Vector3d var9
int var9
ItemStack var9
BuilderTool.ArgData var9
BuilderTool.ArgData var9
int[] var9
BuilderTool var9
ItemStack var9
ItemStack var9
BuilderTool.ArgData var9
HeadRotation var9
Vector3i var9
UUID var9
NPCMarkerComponent var9
BlockEntity var9

Методы (130)

МодификаторыВозвратСигнатура
abstract return new Vector3ireturn new Vector3i(var1.x, var1.y, var1.z)
static long estimateClipboardBlockslong estimateClipboardBlocks(@Nonnull Player var0, @Nonnull PlayerRef var1)
for for(int var15 = 0; var15 < var12.length; var15++)
for for(Integer var6 : var1)
for for(Integer var8 : var1)
abstract for for(int var20 = 0; var20 < var13.size()
public void handleBuilderToolArgUpdatevoid handleBuilderToolArgUpdate(@Nonnull BuilderToolArgUpdate var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5)
public void handleBuilderToolColorActionvoid handleBuilderToolColorAction(@Nonnull BuilderToolColorAction var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5)
public void handleBuilderToolEntityActionvoid handleBuilderToolEntityAction(@Nonnull BuilderToolEntityAction var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5)
public void handleBuilderToolExtrudeActionvoid handleBuilderToolExtrudeAction(@Nonnull BuilderToolExtrudeAction var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5)
public void handleBuilderToolGeneralActionvoid handleBuilderToolGeneralAction(@Nonnull BuilderToolGeneralAction var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5)
public void handleBuilderToolLineActionvoid handleBuilderToolLineAction(@Nonnull BuilderToolLineAction var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5)
public void handleBuilderToolOnUseInteractionvoid handleBuilderToolOnUseInteraction(@Nonnull BuilderToolOnUseInteraction var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5)
public void handleBuilderToolPasteClipboardvoid handleBuilderToolPasteClipboard(@Nonnull BuilderToolPasteClipboard var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5)
public void handleBuilderToolRandomizeClipboardvoid handleBuilderToolRandomizeClipboard(@Nonnull BuilderToolRandomizeClipboard var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5)
public void handleBuilderToolResetClipboardRotationvoid handleBuilderToolResetClipboardRotation(@Nonnull BuilderToolResetClipboardRotation var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5)
public void handleBuilderToolRotateClipboardvoid handleBuilderToolRotateClipboard(@Nonnull BuilderToolRotateClipboard var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5)
public void handleBuilderToolSelectionToolAskForClipboardvoid handleBuilderToolSelectionToolAskForClipboard(@Nonnull BuilderToolSelectionToolAskForClipboard var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5)
private void handleBuilderToolSelectionTransformvoid handleBuilderToolSelectionTransform(@Nonnull BuilderToolSelectionTransform var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5)
public void handleBuilderToolSelectionUpdatevoid handleBuilderToolSelectionUpdate(@Nonnull BuilderToolSelectionUpdate var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5)
public void handleBuilderToolSetEntityCollisionvoid handleBuilderToolSetEntityCollision(@Nonnull BuilderToolSetEntityCollision var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5)
public void handleBuilderToolSetEntityLightvoid handleBuilderToolSetEntityLight(@Nonnull BuilderToolSetEntityLight var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5)
public void handleBuilderToolSetEntityPickupEnabledvoid handleBuilderToolSetEntityPickupEnabled(@Nonnull BuilderToolSetEntityPickupEnabled var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5)
public void handleBuilderToolSetEntityScalevoid handleBuilderToolSetEntityScale(@Nonnull BuilderToolSetEntityScale var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5)
public void handleBuilderToolSetEntityTransformvoid handleBuilderToolSetEntityTransform(@Nonnull BuilderToolSetEntityTransform var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5)
public void handleBuilderToolSetEntityTypevoid handleBuilderToolSetEntityType(@Nonnull BuilderToolSetEntityType var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5)
public void handleBuilderToolSetNPCDebugvoid handleBuilderToolSetNPCDebug(@Nonnull BuilderToolSetNPCDebug var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5)
public void handleBuilderToolSetTransformationModeStatevoid handleBuilderToolSetTransformationModeState(@Nonnull BuilderToolSetTransformationModeState var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5)
public void handleBuilderToolStackAreavoid handleBuilderToolStackArea(@Nonnull BuilderToolStackArea var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5)
public void handleGMaskPresetLoadResponsevoid handleGMaskPresetLoadResponse(@Nonnull BuilderToolGMaskPresetLoadResponse var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5)
public void handleLoadHotbarvoid handleLoadHotbar(@Nonnull LoadHotbar var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5)
public void handlePrefabSetAnchorvoid handlePrefabSetAnchor(@Nonnull PrefabSetAnchor var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5)
public void handlePrefabUnselectPrefabvoid handlePrefabUnselectPrefab(@Nonnull PrefabUnselectPrefab var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5)
public void handleSaveHotbarvoid handleSaveHotbar(@Nonnull SaveHotbar var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5)
static boolean hasPermissionboolean hasPermission(@Nonnull PlayerRef var0)
static boolean hasPermissionboolean hasPermission(@Nonnull PlayerRef var0, @Nullable PermissionQuery var1)
abstract return hasPermissionreturn hasPermission(var0, null)
if if(!var4 && !var5)
if if(!var7)
if if(var6 != null)
if if(var6 != null)
if if(var9 != null)
if if(var7 != null)
if if(var6 != null)
if if(var7 == null)
if if(var1.action == BuilderToolAction.SelectionPosition1)
if if(var15 != null)
if if(var11 != null)
if if(var12 != null)
if if(var6 != null)
if if(var1.xMin == Integer.MIN_VALUE && var1.xMax == Integer.MIN_VALUE && var1.yMin == Integer.MIN_VALUE && var1.yMax == Integer.MIN_VALUE && var1.zMin == Integer.MIN_VALUE && var1.zMax == Integer.MIN_VALUE)
if if(var8 != null)
if if(var7 != null)
if if(var6 != null)
if if(var5 != null)
if if(var7 != null && var7.length > 16000000)
if if(var6 != null)
if if(!var15 && var16 > 4000000L)
if if(var18)
if if(var1.cutOriginal)
if if(var1.initialPastePointForClipboardPaste != null)
if if(var40 != null)
if if(!var1.isExitingTransformMode)
if if(var18)
if if(var1.isExitingTransformMode)
if if(var6 != null)
if if(var9 != null)
if if(var10 != null)
if if(var20 != null)
if if(var24 != 0)
if if(var6 != null)
if if(var0 == null)
if if(var6 != null && var6 > 0)
if if(var2 == 0)
if if(var8 != null && var8 > 0)
if if(var6 != null)
if if(var6 != null)
if if(var6 != null)
if if(var6 != null)
if if(var6 != null)
if if(var6 != null)
if if(var9 != null)
if if(var10 != null)
if if(var6 != null)
if if(var1.isSessionEnd)
if if(var6 == null)
if if(var1.isSessionEnd)
if if(var1.isSessionEnd)
if if(var6 == null)
if if(var1.isSessionEnd)
if if(var8 != null)
if if(var8 != null)
if if(var10)
if if(var11 && var9 != null)
if if(var12)
if if(var1.isSessionEnd)
if if(var14)
if if(var15 != null)
if if(var16 && var9 != null)
if if(var7 == null)
if if(var7 == null)
if if(var12)
if if(var8 == null)
if if(var6 != null)
if if(var5 == null)
if if(var6 != null)
if if(var8 != null)
if if(var6 != null)
if if(var1.light == null)
if if(var7 != null)
if if(var8 != null)
if if(var7 != null)
if if(var8 != null)
if if(var6 != null)
if if(var8 != null || var9 != null)
if if(var6 != null)
if if(var7 != null)
if if(var6 != null)
if if(var5 == null)
if if(var9 != null)
if if(var6 != null)
static boolean isAuthorizedForToolboolean isAuthorizedForTool(@Nonnull PlayerRef var0, @Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2, @Nonnull String var3)
static void resetToIdleAnimationvoid resetToIdleAnimation(@Nonnull Ref<EntityStore> var0, @Nonnull ComponentAccessor<EntityStore> var1)
abstract resetToIdleAnimation resetToIdleAnimation(var7, var3x)
static void sendSessionEndvoid sendSessionEnd(@Nonnull PlayerRef var0, @Nonnull BuilderToolSetEntityTransform var1)
abstract sendSessionEnd sendSessionEnd(var2, var1)
switch switch(var1.action)
switch switch(var1.action)
switch switch(var1.mode)
switch switch(var1.mode)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.buildertools;

class="kw">import com.hypixel.hytale.builtin.buildertools.commands.CopyCommand;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.PrefabEditSession;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.PrefabEditSessionManager;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.PrefabEditingMetadata;
class="kw">import com.hypixel.hytale.builtin.buildertools.snapshot.BlockSelectionSnapshot;
class="kw">import com.hypixel.hytale.builtin.buildertools.snapshot.EntityFreezeSnapshot;
class="kw">import com.hypixel.hytale.builtin.buildertools.snapshot.EntitySettingsSnapshot;
class="kw">import com.hypixel.hytale.builtin.buildertools.snapshot.SelectionSnapshot;
class="kw">import com.hypixel.hytale.builtin.buildertools.tooloperations.ToolOperation;
class="kw">import com.hypixel.hytale.component.AddReason;
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.Axis;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.math.vector.Vector3iUtil;
class="kw">import com.hypixel.hytale.protocol.AnimationSlot;
class="kw">import com.hypixel.hytale.protocol.BlockPosition;
class="kw">import com.hypixel.hytale.protocol.ColorLight;
class="kw">import com.hypixel.hytale.protocol.GameMode;
class="kw">import com.hypixel.hytale.protocol.ModelTransform;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BrushOrigin;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BrushShape;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BuilderToolAction;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BuilderToolArgUpdate;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BuilderToolColorAction;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BuilderToolEntityAction;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BuilderToolEntityTransformSessionEnd;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BuilderToolExtrudeAction;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BuilderToolGMaskPresetLoadResponse;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BuilderToolGeneralAction;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BuilderToolLineAction;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BuilderToolOnUseInteraction;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BuilderToolPasteClipboard;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BuilderToolRandomizeClipboard;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BuilderToolResetClipboardRotation;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BuilderToolRotateClipboard;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BuilderToolSelectionToolAskForClipboard;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BuilderToolSelectionToolReplyWithClipboard;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BuilderToolSelectionTransform;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BuilderToolSelectionUpdate;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BuilderToolSetEntityCollision;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BuilderToolSetEntityLight;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BuilderToolSetEntityPickupEnabled;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BuilderToolSetEntityScale;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BuilderToolSetEntityTransform;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BuilderToolSetEntityType;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BuilderToolSetNPCDebug;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BuilderToolSetTransformationModeState;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BuilderToolStackArea;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.ClipboardEntityChange;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.PrefabSetAnchor;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.PrefabUnselectPrefab;
class="kw">import com.hypixel.hytale.protocol.packets.interface_.BlockChange;
class="kw">import com.hypixel.hytale.protocol.packets.interface_.EditorBlocksChange;
class="kw">import com.hypixel.hytale.protocol.packets.interface_.FluidChange;
class="kw">import com.hypixel.hytale.protocol.packets.interface_.NotificationStyle;
class="kw">import com.hypixel.hytale.protocol.packets.player.LoadHotbar;
class="kw">import com.hypixel.hytale.protocol.packets.player.SaveHotbar;
class="kw">import com.hypixel.hytale.server.core.Message;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.asset.type.buildertool.config.BuilderTool;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.Item;
class="kw">import com.hypixel.hytale.server.core.command.commands.world.entity.EntityRemoveCommand;
class="kw">import com.hypixel.hytale.server.core.command.system.CommandManager;
class="kw">import com.hypixel.hytale.server.core.entity.AnimationUtils;
class="kw">import com.hypixel.hytale.server.core.entity.Dirty;
class="kw">import com.hypixel.hytale.server.core.entity.Frozen;
class="kw">import com.hypixel.hytale.server.core.entity.UUIDComponent;
class="kw">import com.hypixel.hytale.server.core.entity.entities.BlockEntity;
class="kw">import com.hypixel.hytale.server.core.entity.entities.Player;
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.io.handlers.IPacketHandler;
class="kw">import com.hypixel.hytale.server.core.io.handlers.IWorldPacketHandler;
class="kw">import com.hypixel.hytale.server.core.io.handlers.SubPacketHandler;
class="kw">import com.hypixel.hytale.server.core.modules.entity.DespawnComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.BoundingBox;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.DynamicLight;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.EntityScaleComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.HeadRotation;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.ModelComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.NPCMarkerComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.PersistentDynamicLight;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.PropComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.hitboxcollision.HitboxCollision;
class="kw">import com.hypixel.hytale.server.core.modules.entity.hitboxcollision.HitboxCollisionConfig;
class="kw">import com.hypixel.hytale.server.core.modules.entity.item.ItemComponent;
class="kw">import com.hypixel.hytale.server.core.permissions.HytalePermissions;
class="kw">import com.hypixel.hytale.server.core.permissions.PermissionQuery;
class="kw">import com.hypixel.hytale.server.core.permissions.PermissionsModule;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.mask.BlockMask;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.mask.BlockPattern;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.standard.BlockSelection;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.standard.RotateBlockMode;
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.WorldChunk;
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.NotificationUtil;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import java.util.ArrayList;
class="kw">import java.util.HashSet;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import java.util.UUID;
class="kw">import java.util.function.BiConsumer;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Quaterniond;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3i;

class="kw">public class BuilderToolsPacketHandler class="kw">implements SubPacketHandler {
   @Nonnull
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   @Nonnull
   class="kw">private class="kw">static class="kw">final String BUILDER_TOOL_ID_EXTRUDE = "Extrude";
   @Nonnull
   class="kw">private class="kw">static class="kw">final String BUILDER_TOOL_ID_COLOR = "Color";
   @Nonnull
   class="kw">private class="kw">static class="kw">final String BUILDER_TOOL_ID_SELECTION = "Selection";
   @Nonnull
   class="kw">private class="kw">static class="kw">final String BUILDER_TOOL_ID_LINE = "Line";
   @Nonnull
   class="kw">private class="kw">static class="kw">final String BUILDER_TOOL_ID_ENTITY = "Entity";
   @Nonnull
   class="kw">private class="kw">static class="kw">final String BUILDER_TOOL_ID_LASER_POINTER = "LaserPointer";
   @Nonnull
   class="kw">private class="kw">static class="kw">final Message MESSAGE_BUILDER_TOOLS_USAGE_DENIED = Message.translation("server.builderTools.usageDenied");
   @Nonnull
   class="kw">private class="kw">final IPacketHandler packetHandler;

   class="kw">public BuilderToolsPacketHandler(@Nonnull IPacketHandler var1) {
      this.packetHandler = var1;
   }

   class="kw">private class="kw">static boolean hasPermission(@Nonnull PlayerRef var0) {
      class="kw">return hasPermission(var0, null);
   }

   class="kw">private class="kw">static boolean hasPermission(@Nonnull PlayerRef var0, @Nullable PermissionQuery var1) {
      UUID var2 = var0.getUuid();
      PermissionsModule var3 = PermissionsModule.get();
      boolean var4 = var3.hasPermission(var2, HytalePermissions.BUILDER_TOOLS_EDITOR);
      boolean var5 = var1 != null && var3.hasPermission(var2, var1);
      if (!var4 && !var5) {
         var0.sendMessage(MESSAGE_BUILDER_TOOLS_USAGE_DENIED);
         class="kw">return false;
      } else {
         class="kw">return true;
      }
   }

   class="kw">private class="kw">static boolean isAuthorizedForTool(@Nonnull PlayerRef var0, @Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2, @Nonnull String var3) {
      BuilderTool var4 = BuilderTool.getActiveBuilderTool(var1, var2);
      if (var4 != null && var3.equals(var4.getId())) {
         PermissionsModule var5 = PermissionsModule.get();
         UUID var6 = var0.getUuid();
         boolean var7 = var5.hasPermission(var6, HytalePermissions.BUILDER_TOOLS_EDITOR)
            || var5.hasPermission(var6, HytalePermissions.toolPermission(var4.getId()));
         if (!var7) {
            var0.sendMessage(MESSAGE_BUILDER_TOOLS_USAGE_DENIED);
            class="kw">return false;
         }

         if (!var4.isSurvivalAllowed()) {
            Player var8 = var2.getComponent(var1, Player.getComponentType());
            if (var8 == null || var8.getGameMode() != GameMode.Creative) {
               class="kw">return false;
            }
         }

         class="kw">return true;
      } else {
         class="kw">return false;
      }
   }

   @Override
   class="kw">public void registerHandlers() {
      if (BuilderToolsPlugin.get().isDisabled()) {
         this.packetHandler.registerNoOpHandlers(400, 401, 412, 409, 403, 406, 427, 428, 407, 413, 414, 433, 417, 426);
      } else {
         IWorldPacketHandler.registerHandler(this.packetHandler, 106, this::handleLoadHotbar, BuilderToolsPacketHandler::hasPermission);
         IWorldPacketHandler.registerHandler(this.packetHandler, 107, this::handleSaveHotbar, BuilderToolsPacketHandler::hasPermission);
         IWorldPacketHandler.registerHandler(this.packetHandler, 401, this::handleBuilderToolEntityAction);
         IWorldPacketHandler.registerHandler(this.packetHandler, 402, this::handleBuilderToolSetEntityTransform);
         IWorldPacketHandler.registerHandler(this.packetHandler, 420, this::handleBuilderToolSetEntityScale);
         IWorldPacketHandler.registerHandler(
            this.packetHandler, 408, this::handleBuilderToolSetTransformationModeState, BuilderToolsPacketHandler::hasPermission
         );
         IWorldPacketHandler.registerHandler(this.packetHandler, 417, this::handlePrefabUnselectPrefab, BuilderToolsPacketHandler::hasPermission);
         IWorldPacketHandler.registerHandler(this.packetHandler, 426, this::handlePrefabSetAnchor, BuilderToolsPacketHandler::hasPermission);
         IWorldPacketHandler.registerHandler(this.packetHandler, 421, this::handleBuilderToolSetEntityPickupEnabled);
         IWorldPacketHandler.registerHandler(this.packetHandler, 422, this::handleBuilderToolSetEntityLight);
         IWorldPacketHandler.registerHandler(this.packetHandler, 423, this::handleBuilderToolSetNPCDebug);
         IWorldPacketHandler.registerHandler(this.packetHandler, 425, this::handleBuilderToolSetEntityCollision);
         IWorldPacketHandler.registerHandler(this.packetHandler, 424, this::handleBuilderToolSetEntityType);
         IWorldPacketHandler.registerHandler(
            this.packetHandler, 400, this::handleBuilderToolArgUpdate, var0 -> hasPermission(var0, HytalePermissions.EDITOR_BRUSH_CONFIG)
         );
         IWorldPacketHandler.registerHandler(
            this.packetHandler, 409, this::handleBuilderToolSelectionUpdate, var0 -> hasPermission(var0, HytalePermissions.EDITOR_SELECTION_USE)
         );
         IWorldPacketHandler.registerHandler(
            this.packetHandler, 403, this::handleBuilderToolExtrudeAction, var0 -> hasPermission(var0, HytalePermissions.EDITOR_SELECTION_MODIFY)
         );
         IWorldPacketHandler.registerHandler(
            this.packetHandler, 406, this::handleBuilderToolRotateClipboard, var0 -> hasPermission(var0, HytalePermissions.EDITOR_SELECTION_CLIPBOARD)
         );
         IWorldPacketHandler.registerHandler(
            this.packetHandler, 427, this::handleBuilderToolResetClipboardRotation, var0 -> hasPermission(var0, HytalePermissions.EDITOR_SELECTION_CLIPBOARD)
         );
         IWorldPacketHandler.registerHandler(
            this.packetHandler, 428, this::handleBuilderToolRandomizeClipboard, var0 -> hasPermission(var0, HytalePermissions.EDITOR_SELECTION_CLIPBOARD)
         );
         IWorldPacketHandler.registerHandler(
            this.packetHandler, 407, this::handleBuilderToolPasteClipboard, var0 -> hasPermission(var0, HytalePermissions.EDITOR_SELECTION_CLIPBOARD)
         );
         IWorldPacketHandler.registerHandler(this.packetHandler, 413, this::handleBuilderToolOnUseInteraction);
         IWorldPacketHandler.registerHandler(
            this.packetHandler,
            410,
            this::handleBuilderToolSelectionToolAskForClipboard,
            var0 -> hasPermission(var0, HytalePermissions.EDITOR_SELECTION_CLIPBOARD)
         );
         IWorldPacketHandler.registerHandler(
            this.packetHandler, 414, this::handleBuilderToolLineAction, var0 -> hasPermission(var0, HytalePermissions.EDITOR_BRUSH_USE)
         );
         IWorldPacketHandler.registerHandler(
            this.packetHandler, 405, this::handleBuilderToolSelectionTransform, var0 -> hasPermission(var0, HytalePermissions.EDITOR_SELECTION_CLIPBOARD)
         );
         IWorldPacketHandler.registerHandler(
            this.packetHandler, 404, this::handleBuilderToolStackArea, var0 -> hasPermission(var0, HytalePermissions.EDITOR_SELECTION_CLIPBOARD)
         );
         IWorldPacketHandler.registerHandler(
            this.packetHandler, 433, this::handleBuilderToolColorAction, var0 -> hasPermission(var0, HytalePermissions.EDITOR_BRUSH_USE)
         );
         IWorldPacketHandler.registerHandler(this.packetHandler, 412, this::handleBuilderToolGeneralAction);
         IWorldPacketHandler.registerHandler(this.packetHandler, 431, this::handleGMaskPresetLoadResponse, BuilderToolsPacketHandler::hasPermission);
      }
   }

   class="kw">public void handleBuilderToolSetTransformationModeState(
      @Nonnull BuilderToolSetTransformationModeState var1,
      @Nonnull PlayerRef var2,
      @Nonnull Ref<EntityStore> var3,
      @Nonnull World var4,
      @Nonnull Store<EntityStore> var5
   ) {
      LOGGER.at(Level.INFO).log("%s: %s", this.packetHandler.getIdentifier(), var1);
      ToolOperation.getOrCreatePrototypeSettings(var2.getUuid()).setInSelectionTransformationMode(var1.enabled);
   }

   class="kw">public void handleBuilderToolArgUpdate(
      @Nonnull BuilderToolArgUpdate var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5
   ) {
      BuilderToolsPlugin.get().onToolArgUpdate(var3, var2, var1, var5);
   }

   class="kw">public void handleLoadHotbar(
      @Nonnull LoadHotbar var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5
   ) {
      Player var6 = var5.getComponent(var3, Player.getComponentType());
      if (var6 != null) {
         var6.getHotbarManager().loadHotbar(var3, var1.inventoryRow, var5);
      }
   }

   class="kw">public void handleSaveHotbar(
      @Nonnull SaveHotbar var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5
   ) {
      Player var6 = var5.getComponent(var3, Player.getComponentType());
      if (var6 != null) {
         var6.getHotbarManager().saveHotbar(var3, var1.inventoryRow, var5);
      }
   }

   class="kw">public void handleBuilderToolEntityAction(
      @Nonnull BuilderToolEntityAction var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5
   ) {
      if (isAuthorizedForTool(var2, var3, var5, "Entity")) {
         int var6 = var1.entityId;
         Ref var7 = var4.getEntityStore().getRefFromNetworkId(var6);
         Player var8 = var5.getComponent(var3, Player.getComponentType());
         if (var7 == null || !var7.isValid()) {
            var2.sendMessage(Message.translation("server.general.entityNotFound").param("id", var6));
         } else if (var8 != null) {
            Player var9 = var5.getComponent(var7, Player.getComponentType());
            if (var9 != null) {
               var2.sendMessage(Message.translation("server.builderTools.entityTool.cannotTargetPlayer"));
            } else {
               LOGGER.at(Level.INFO).log("%s: %s", this.packetHandler.getIdentifier(), var1);
               class="kw">switch (var1.action) {
                  case Freeze:
                     BuilderToolsPlugin.addToQueue(var8, var2, (var1x, var2x, var3x) -> {
                        EntityFreezeSnapshot var4 = new EntityFreezeSnapshot(var7, var3x);
                        if (var3x.getArchetype(var7).contains(Frozen.getComponentType())) {
                           var3x.tryRemoveComponent(var7, Frozen.getComponentType());
                           AnimationUtils.stopAnimation(var7, AnimationSlot.Movement, var3x);
                        } else {
                           var3x.addComponent(var7, Frozen.getComponentType(), Frozen.get());
                           var3x.tryRemoveComponent(var7, DespawnComponent.getComponentType());
                           resetToIdleAnimation(var7, var3x);
                        }

                        var2x.pushEntityFreezeHistory(var4);
                     });
                     break;
                  case Clone:
                     BuilderToolsPlugin.addToQueue(var8, var2, (var2x, var3x, var4x) -> {
                        Store var5 = var4.getEntityStore().getStore();
                        Holder var6 = var5.copyEntity(var7);
                        if (var6.getComponent(UUIDComponent.getComponentType()) != null) {
                           var6.replaceComponent(UUIDComponent.getComponentType(), new UUIDComponent(UUID.randomUUID()));
                        }

                        var6.tryRemoveComponent(DespawnComponent.getComponentType());
                        Ref var7 = var5.addEntity(var6, AddReason.SPAWN);
                        if (var7 != null) {
                           var3x.pushEntityCloneHistory(var7);
                        }
                     });
                     break;
                  case Remove:
                     BuilderToolsPlugin.addToQueue(var8, var2, (var2x, var3x, var4x) -> {
                        if (var7.isValid()) {
                           var3x.pushEntityRemoveHistory(var7, var4x);
                           EntityRemoveCommand.removeEntity(var3, var7, var4x);
                        }
                     });
               }
            }
         }
      }
   }

   class="kw">private class="kw">static void resetToIdleAnimation(@Nonnull Ref<EntityStore> var0, @Nonnull ComponentAccessor<EntityStore> var1) {
      ModelComponent var2 = var1.getComponent(var0, ModelComponent.getComponentType());
      if (var2 != null && var2.getModel() != null) {
         if (var2.getModel().getAnimationSetMap().containsKey("Idle")) {
            AnimationUtils.playAnimation(var0, AnimationSlot.Movement, "Idle", var1);
            AnimationUtils.stopAnimation(var0, AnimationSlot.Status, var1);
            AnimationUtils.stopAnimation(var0, AnimationSlot.Action, var1);
         }
      }
   }

   class="kw">public void handleBuilderToolGeneralAction(
      @Nonnull BuilderToolGeneralAction var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5
   ) {
      Player var6 = var5.getComponent(var3, Player.getComponentType());
      if (var6 != null) {
         LOGGER.at(Level.INFO).log("%s: %s", this.packetHandler.getIdentifier(), var1);
         class="kw">switch (var1.action) {
            case HistoryUndo:
               if (!hasPermission(var2, HytalePermissions.EDITOR_HISTORY)) {
                  class="kw">return;
               }

               long var14 = BuilderToolsPlugin.getState(var6, var2).peekUndoWeight();
               BuilderToolsPlugin.addToQueue(var6, var2, var14, (var0, var1x, var2x) -> var1x.undo(var0, 1, var2x));
               break;
            case HistoryRedo:
               if (!hasPermission(var2, HytalePermissions.EDITOR_HISTORY)) {
                  class="kw">return;
               }

               long var13 = BuilderToolsPlugin.getState(var6, var2).peekRedoWeight();
               BuilderToolsPlugin.addToQueue(var6, var2, var13, (var0, var1x, var2x) -> var1x.redo(var0, 1, var2x));
               break;
            case SelectionCopy:
               if (!hasPermission(var2, HytalePermissions.EDITOR_SELECTION_CLIPBOARD)) {
                  class="kw">return;
               }

               CopyCommand.copySelection(var3, var5);
               break;
            case SelectionPosition1:
            case SelectionPosition2:
               if (!hasPermission(var2, HytalePermissions.EDITOR_SELECTION_USE)) {
                  class="kw">return;
               }

               TransformComponent var7 = var5.getComponent(var3, TransformComponent.getComponentType());
               if (var7 == null) {
                  class="kw">return;
               }

               BuilderToolsPlugin.BuilderState var8 = BuilderToolsPlugin.getState(var6, var2);
               Vector3d var9 = var7.getPosition();
               Vector3i var10 = new Vector3i(MathUtil.floor(var9.x()), MathUtil.floor(var9.y()), MathUtil.floor(var9.z()));
               BuilderToolsPlugin.addToQueue(var6, var2, (var3x, var4x, var5x) -> {
                  if (var1.action == BuilderToolAction.SelectionPosition1) {
                     var8.pos1(var10, var5x);
                  } else {
                     var8.pos2(var10, var5x);
                  }
               });
               break;
            case ActivateToolMode:
               if (!hasPermission(var2, HytalePermissions.BUILDER_TOOLS_EDITOR)) {
                  class="kw">return;
               }

               InventoryComponent.Tool var15 = var5.getComponent(var3, InventoryComponent.Tool.getComponentType());
               if (var15 != null) {
                  var15.setUsingToolsItem(true);
               }
               break;
            case DeactivateToolMode:
               if (!hasPermission(var2, HytalePermissions.BUILDER_TOOLS_EDITOR)) {
                  class="kw">return;
               }

               InventoryComponent.Tool var11 = var5.getComponent(var3, InventoryComponent.Tool.getComponentType());
               if (var11 != null) {
                  var11.setUsingToolsItem(false);
               }

               BiConsumer var12 = BuilderToolsPlugin.get().getBuilderToolModeDeactivatedCallback();
               if (var12 != null) {
                  var12.accept(var2, var5);
               }
         }
      }
   }

   class="kw">public void handleBuilderToolSelectionUpdate(
      @Nonnull BuilderToolSelectionUpdate var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5
   ) {
      Player var6 = var5.getComponent(var3, Player.getComponentType());
      if (var6 != null) {
         LOGGER.at(Level.INFO).log("%s: %s", this.packetHandler.getIdentifier(), var1);
         if (var1.xMin == Integer.MIN_VALUE
            && var1.xMax == Integer.MIN_VALUE
            && var1.yMin == Integer.MIN_VALUE
            && var1.yMax == Integer.MIN_VALUE
            && var1.zMin == Integer.MIN_VALUE
            && var1.zMax == Integer.MIN_VALUE) {
            BiConsumer var8 = BuilderToolsPlugin.get().getSelectionClearedCallback();
            if (var8 != null) {
               var8.accept(var2, var5);
            }
         } else {
            BiConsumer var7 = BuilderToolsPlugin.get().getSelectionBoundsUpdatedCallback();
            if (var7 != null) {
               var7.accept(var2, var5);
            }

            BuilderToolsPlugin.addToQueue(var6, var2, (var1x, var2x, var3x) -> var2x.update(var1.xMin, var1.yMin, var1.zMin, var1.xMax, var1.yMax, var1.zMax));
         }
      }
   }

   class="kw">public void handleBuilderToolSelectionToolAskForClipboard(
      @Nonnull BuilderToolSelectionToolAskForClipboard var1,
      @Nonnull PlayerRef var2,
      @Nonnull Ref<EntityStore> var3,
      @Nonnull World var4,
      @Nonnull Store<EntityStore> var5
   ) {
      Player var6 = var5.getComponent(var3, Player.getComponentType());
      if (var6 != null) {
         LOGGER.at(Level.INFO).log("%s: %s", this.packetHandler.getIdentifier(), var1);
         PrototypePlayerBuilderToolSettings var7 = ToolOperation.getOrCreatePrototypeSettings(var2.getUuid());
         BuilderToolsPlugin.addToQueue(
            var6,
            var2,
            (var2x, var3x, var4x) -> {
               BlockSelection var5 = var3x.getSelection();
               if (var5 != null) {
                  if (var5.getBlockCount() > 4000000) {
                     var7.setBlockChangesForPlaySelectionToolPasteMode(null);
                     var7.setFluidChangesForPlaySelectionToolPasteMode(null);
                     var7.setEntityChangesForPlaySelectionToolPasteMode(null);
                     BuilderToolSelectionToolReplyWithClipboard var18 = new BuilderToolSelectionToolReplyWithClipboard();
                     var18.blocksOmitted = true;
                     var18.bounds = var5.toEditorSelectionBounds();
                     var2.getPacketHandler().write(var18);
                     class="kw">return;
                  }

                  EditorBlocksChange var6 = var5.toPacket();
                  BlockChange[] var7 = var6.blocksChange;
                  var7.setBlockChangesForPlaySelectionToolPasteMode(var7);
                  ArrayList var8 = new ArrayList<>();
                  int var9 = var5.getAnchorX();
                  int var10 = var5.getAnchorY();
                  int var11 = var5.getAnchorZ();
                  var5.forEachFluid(
                     (var4xx, var5x, var6x, var7x, var8x) -> var8.add(
                        new PrototypePlayerBuilderToolSettings.FluidChange(var4xx - var9, var5x - var10, var6x - var11, var7x, var8x)
                     )
                  );
                  PrototypePlayerBuilderToolSettings.FluidChange[] var12 = var8.toArray(PrototypePlayerBuilderToolSettings.FluidChange[]::new);
                  var7.setFluidChangesForPlaySelectionToolPasteMode(var12);
                  ArrayList var13 = new ArrayList<>();
                  var5.forEachEntity(var1x -> {
                     TransformComponent var2 = var1x.getComponent(TransformComponent.getComponentType());
                     if (var2 != null && var2.getPosition() != null) {
                        Vector3d var3 = var2.getPosition();
                        var13.add(new PrototypePlayerBuilderToolSettings.EntityChange(var3.x(), var3.y(), var3.z(), var1x.clone()));
                     }
                  });
                  var7.setEntityChangesForPlaySelectionToolPasteMode(var13.toArray(PrototypePlayerBuilderToolSettings.EntityChange[]::new));
                  FluidChange[] var14 = new FluidChange[var12.length];

                  for (int var15 = 0; var15 < var12.length; var15++) {
                     PrototypePlayerBuilderToolSettings.FluidChange var16 = var12[var15];
                     var14[var15] = new FluidChange(var16.x(), var16.y(), var16.z(), var16.fluidId(), var16.fluidLevel());
                  }

                  ClipboardEntityChange[] var19 = new ClipboardEntityChange[var13.size()];

                  for (int var20 = 0; var20 < var13.size(); var20++) {
                     PrototypePlayerBuilderToolSettings.EntityChange var17 = var13.get(var20);
                     var19[var20] = BlockSelection.toClipboardEntityChange(var17.entityHolder(), var9, var10, var11);
                  }

                  if (var7 != null && var7.length > 16000000) {
                     NotificationUtil.sendNotification(
                        var2.getPacketHandler(),
                        Message.translation("server.builderTools.copycut.tooLarge"),
                        Message.translation("server.builderTools.copycut.tooLarge.detail").param("overCount", var7.length - 16000000),
                        NotificationStyle.Warning
                     );
                     class="kw">return;
                  }

                  BuilderToolSelectionToolReplyWithClipboard var21 = new BuilderToolSelectionToolReplyWithClipboard();
                  var21.blocksChange = var7;
                  var21.fluidsChange = var14;
                  var21.entityChanges = var19;
                  var2.getPacketHandler().write(var21);
               }
            }
         );
      }
   }

   class="kw">private void handleBuilderToolSelectionTransform(
      @Nonnull BuilderToolSelectionTransform var1,
      @Nonnull PlayerRef var2,
      @Nonnull Ref<EntityStore> var3,
      @Nonnull World var4,
      @Nonnull Store<EntityStore> var5
   ) {
      Player var6 = var5.getComponent(var3, Player.getComponentType());
      if (var6 != null) {
         LOGGER.at(Level.INFO).log("%s: %s", this.packetHandler.getIdentifier(), var1);
         boolean var7 = true;
         BuilderTool var8 = BuilderTool.getActiveBuilderTool(var3, var5);
         if (var8 != null && var8.getId().equals("Selection")) {
            ItemStack var9 = InventoryComponent.getItemInHand(var5, var3);
            BuilderTool.ArgData var10 = var8.getItemArgData(var9);
            if (var10 != null && var10.tool() != null) {
               var7 = (Boolean)var10.tool().getOrDefault("KeepEmptyBlocks", true);
            }
         }

         boolean var18 = var7;
         Quaterniond var19 = new Quaterniond(var1.rotation);
         Vector3i var11 = new Vector3i(var1.translationOffset.x, var1.translationOffset.y, var1.translationOffset.z);
         Vector3i var12 = new Vector3i(var1.initialSelectionMin.x, var1.initialSelectionMin.y, var1.initialSelectionMin.z);
         Vector3i var13 = new Vector3i(var1.initialSelectionMax.x, var1.initialSelectionMax.y, var1.initialSelectionMax.z);
         Rotation3f var14 = new Rotation3f(var1.initialRotationOrigin.x(), var1.initialRotationOrigin.y(), var1.initialRotationOrigin.z());
         PrototypePlayerBuilderToolSettings var15 = ToolOperation.getOrCreatePrototypeSettings(var2.getUuid());
         long var16 = Vector3iUtil.inclusiveBoxVolume(
            var1.initialSelectionMin.x,
            var1.initialSelectionMin.y,
            var1.initialSelectionMin.z,
            var1.initialSelectionMax.x,
            var1.initialSelectionMax.y,
            var1.initialSelectionMax.z
         );
         BuilderToolsPlugin.addToQueue(
            var6,
            var2,
            var16,
            (var12x, var13x, var14x) -> {
               if (var13x.getSelection() != null) {
                  boolean var15 = var15.getBlockChangesForPlaySelectionToolPasteMode() != null;
                  if (!var15 && var16 > 4000000L) {
                     NotificationUtil.sendNotification(
                        var2.getPacketHandler(),
                        Message.translation("server.builderTools.selection.transformTooLarge"),
                        Message.translation("server.builderTools.selection.transformTooLarge.detail"),
                        NotificationStyle.Warning
                     );
                  } else {
                     long var16 = var13x.getSelection().getSelectionVolume();
                     boolean var18 = var16 > 20000L;
                     if (var18) {
                        var2.sendMessage(Message.translation("server.builderTools.selection.large.warning"));
                     }

                     List var19 = new ObjectArrayList();

                     try {
                        if (var15.getBlockChangesForPlaySelectionToolPasteMode() == null) {
                           var13x.syncSelection(var12, var13, var14x);
                           List var20 = var15.getLastTransformEntityRefs();
                           HashSet var21 = var20 != null ? new HashSet<>(var20) : null;
                           if (var1.cutOriginal) {
                              var13x.copyOrCut(var12x, var12.x, var12.y, var12.z, var13.x, var13.y, var13.z, 154, null, var21, var19, var5);
                           } else {
                              var13x.copyOrCut(var12x, var12.x, var12.y, var12.z, var13.x, var13.y, var13.z, 152, null, null, var19, var5);
                           }

                           BlockSelection var22 = var13x.getSelection();
                           int var23 = var22.getAnchorX();
                           int var24 = var22.getAnchorY();
                           int var25 = var22.getAnchorZ();
                           ObjectArrayList var26 = new ObjectArrayList();
                           ObjectArrayList var27 = new ObjectArrayList();
                           var22.forEachBlock((var5x, var6x, var7x, var8x) -> {
                              if (var8x.filler() == 0) {
                                 var26.add(new BlockChange(var5x - var23, var6x - var24, var7x - var25, var8x.blockId(), (byte)var8x.rotation()));
                                 var27.add(var8x.holder() != null ? var8x.holder().clone() : null);
                              }
                           });
                           var15.setBlockChangesForPlaySelectionToolPasteMode((BlockChange[])var26.toArray(BlockChange[]::new));
                           var15.setBlockHoldersForPasteMode((Holder<ChunkStore>[])var27.toArray(new Holder[0]));
                           ArrayList var28 = new ArrayList<>();
                           var22.forEachFluid(
                              (var4x, var5x, var6x, var7x, var8x) -> var28.add(
                                 new PrototypePlayerBuilderToolSettings.FluidChange(var4x - var23, var5x - var24, var6x - var25, var7x, var8x)
                              )
                           );
                           var15.setFluidChangesForPlaySelectionToolPasteMode(var28.toArray(PrototypePlayerBuilderToolSettings.FluidChange[]::new));
                           ArrayList var29 = new ArrayList<>();
                           var22.forEachEntity(var1x -> {
                              TransformComponent var2 = var1x.getComponent(TransformComponent.getComponentType());
                              if (var2 != null && var2.getPosition() != null) {
                                 Vector3d var3 = var2.getPosition();
                                 var29.add(new PrototypePlayerBuilderToolSettings.EntityChange(var3.x(), var3.y(), var3.z(), var1x.clone()));
                              }
                           });
                           var15.setEntityChangesForPlaySelectionToolPasteMode(var29.toArray(PrototypePlayerBuilderToolSettings.EntityChange[]::new));
                           var15.setBlockChangeOffsetOrigin(new Vector3i(var22.getX(), var22.getY(), var22.getZ()));
                        }

                        BlockChange[] var36 = var15.getBlockChangesForPlaySelectionToolPasteMode();
                        PrototypePlayerBuilderToolSettings.FluidChange[] var37 = var15.getFluidChangesForPlaySelectionToolPasteMode();
                        PrototypePlayerBuilderToolSettings.EntityChange[] var38 = var15.getEntityChangesForPlaySelectionToolPasteMode();
                        Holder[] var39 = var15.getBlockHoldersForPasteMode();
                        Vector3i var40 = var15.getBlockChangeOffsetOrigin();
                        if (var1.initialPastePointForClipboardPaste != null) {
                           var40 = new Vector3i(
                              var1.initialPastePointForClipboardPaste.x, var1.initialPastePointForClipboardPaste.y, var1.initialPastePointForClipboardPaste.z
                           );
                        }

                        if (var40 != null) {
                           var15.setLastTransformEntityRefs(null);
                           var13x.transformThenPasteClipboard(var36, var37, var38, var39, var19, var11, var14, var40, var18, var15, var19, var14x);
                           var13x.syncSelection(var12, var13, var14x);
                           var13x.transformSelectionPoints(var19, var11, var14);
                           if (!var1.isExitingTransformMode) {
                              var15.setBlockChangeOffsetOrigin(new Vector3i(var40.x + var11.x, var40.y + var11.y, var40.z + var11.z));
                           }

                           if (var18) {
                              var2.sendMessage(Message.translation("server.builderTools.selection.large.complete"));
                           }

                           class="kw">return;
                        }

                        var2.sendMessage(Message.translation("server.builderTools.selection.noBlockChangeOffsetOrigin"));
                     } catch (Exception var34) {
                        ((HytaleLogger.Api)LOGGER.at(Level.WARNING).withCause(var34)).log("Error during selection transform");
                        class="kw">return;
                     } class="kw">finally {
                        if (!var19.isEmpty()) {
                           boolean var31 = var19.stream().anyMatch(BlockSelectionSnapshot.class::isInstance);
                           var13x.pushHistory(var31 ? BuilderToolsPlugin.Action.CUT_REMOVE : BuilderToolsPlugin.Action.COPY, var19);
                        }

                        if (var1.isExitingTransformMode) {
                           var15.setInSelectionTransformationMode(false);
                           var15.setLastTransformEntityRefs(null);
                        }
                     }
                  }
               }
            }
         );
      }
   }

   class="kw">public void handleBuilderToolExtrudeAction(
      @Nonnull BuilderToolExtrudeAction var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5
   ) {
      Player var6 = var5.getComponent(var3, Player.getComponentType());
      if (var6 != null) {
         BuilderTool var7 = BuilderTool.getActiveBuilderTool(var3, var5);
         if (var7 != null && var7.getId().equals("Extrude")) {
            ItemStack var8 = InventoryComponent.getItemInHand(var5, var3);
            BuilderTool.ArgData var9 = var7.getItemArgData(var8);
            if (var9 != null) {
               Map var10 = var9.tool();
               if (var10 != null) {
                  int var11 = (Integer)var9.tool().get("ExtrudeDepth");
                  int var12 = (Integer)var9.tool().get("ExtrudeWidth");
                  int var13 = (Integer)var9.tool().get("ExtrudeLength");
                  String var14 = (String)var9.tool().get("ExtrudeFilter");
                  String var15 = (String)var9.tool().get("ExtrudeStrategy");
                  long var16 = (long)Math.max(1, var11) * Math.max(1, var12) * Math.max(1, var13);
                  long var18 = ChunkUtil.indexChunkFromBlock(var1.x, var1.z);
                  WorldChunk var20 = var4.getChunk(var18);
                  int var21 = 0;
                  int var22 = 0;
                  int var23 = 0;
                  if (var20 != null) {
                     int var24 = var20.getFiller(var1.x, var1.y, var1.z);
                     if (var24 != 0) {
                        var21 = FillerBlockUtil.unpackX(var24);
                        var22 = FillerBlockUtil.unpackY(var24);
                        var23 = FillerBlockUtil.unpackZ(var24);
                     }
                  }

                  int var28 = var21 != 0 ? (var1.x -= var21) : var1.x;
                  int var25 = var22 != 0 ? (var1.y -= var22) : var1.y;
                  int var26 = var23 != 0 ? (var1.z -= var23) : var1.z;
                  LOGGER.at(Level.INFO).log("%s: %s", this.packetHandler.getIdentifier(), var1);
                  class="kw">switch (var1.mode) {
                     case Extrude:
                        BlockPattern var29 = (BlockPattern)var9.tool().get("ExtrudeMaterial");
                        BuilderToolsPlugin.addToQueue(
                           var6,
                           var2,
                           var16,
                           (var10x, var11x, var12x) -> var11x.extendOrShrinkFace(
                              var28,
                              var25,
                              var26,
                              var1.xNormal,
                              var1.yNormal,
                              var1.zNormal,
                              var11,
                              var12,
                              var13,
                              false,
                              var29,
                              var14,
                              var15,
                              var1.undoGroupSize,
                              var1.isHoldDownInteraction,
                              var12x
                           )
                        );
                        break;
                     case Shrink:
                        BuilderToolsPlugin.addToQueue(
                           var6,
                           var2,
                           var16,
                           (var9x, var10x, var11x) -> var10x.extendOrShrinkFace(
                              var28,
                              var25,
                              var26,
                              var1.xNormal,
                              var1.yNormal,
                              var1.zNormal,
                              var11,
                              var12,
                              var13,
                              true,
                              BlockPattern.EMPTY,
                              var14,
                              var15,
                              var1.undoGroupSize,
                              var1.isHoldDownInteraction,
                              var11x
                           )
                        );
                        break;
                     case Fill:
                        BlockPattern var27 = (BlockPattern)var9.tool().get("FillMaterial");
                        BuilderToolsPlugin.addToQueue(
                           var6,
                           var2,
                           var16,
                           (var8x, var9x, var10x) -> var9x.fillVolume(
                              var28,
                              var25,
                              var26,
                              var1.xNormal,
                              var1.yNormal,
                              var1.zNormal,
                              var11,
                              var12,
                              var13,
                              var27,
                              var1.undoGroupSize,
                              var1.isHoldDownInteraction,
                              var10x
                           )
                        );
                  }
               }
            }
         }
      }
   }

   class="kw">public void handleBuilderToolColorAction(
      @Nonnull BuilderToolColorAction var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5
   ) {
      Player var6 = var5.getComponent(var3, Player.getComponentType());
      if (var6 != null) {
         BuilderTool var7 = BuilderTool.getActiveBuilderTool(var3, var5);
         if (var7 != null && var7.getId().equals("Color")) {
            ItemStack var8 = InventoryComponent.getItemInHand(var5, var3);
            BuilderTool.ArgData var9 = var7.getItemArgData(var8);
            if (var9 != null && var9.tool() != null) {
               int var10 = var9.tool().get("ColorWidth") class="kw">instanceof Integer var11 ? var11 : 5;
               int var25;
               int var50 = var25 = var9.tool().get("ColorHeight") class="kw">instanceof Integer var26 ? var26 : 5;
               BrushShape var27 = parseBrushShape((String)var9.tool().getOrDefault("BrushShape", "Sphere"));
               LOGGER.at(Level.INFO).log("%s: %s", this.packetHandler.getIdentifier(), var1);
               class="kw">switch (var1.mode) {
                  case Coloring:
                     BlockPattern var30 = (BlockPattern)var9.tool().get("ColorMaterial");
                     BlockPattern var33 = var30 != null ? var30 : BlockPattern.parse("Rock_Stone");
                     String var36 = (String)var9.tool().getOrDefault("ColoringSubMode", "SmartMatch");
                     boolean var40 = "SmartMatch".equals(var36);
                     BuilderToolsPlugin.addToQueue(
                        var6,
                        var2,
                        (var6x, var7x, var8x) -> var7x.applyRecoloring(
                           var1.x,
                           var1.y,
                           var1.z,
                           var10,
                           var25,
                           var33,
                           var40,
                           var27,
                           var1.undoGroupSize,
                           var1.isHoldDownInteraction,
                           BuilderToolsPlugin.get().getBlockColorIndex(),
                           var8x
                        )
                     );
                     break;
                  case Gradient:
                     List var29 = BuilderToolsPlugin.parseGradientMaterials(var1.gradientMaterials);
                     String var32 = var1.gradientShape != null ? var1.gradientShape : "Linear";
                     int var35 = var9.tool().get("GradientBlend") class="kw">instanceof Integer var38 ? var38 : 12;
                     float var39 = var35 / 100.0F;
                     boolean var43;
                     boolean var56 = var43 = var9.tool().get("GradientInvert") class="kw">instanceof Boolean var44 && var44;
                     BuilderToolsPlugin.addToQueue(
                        var6,
                        var2,
                        (var8x, var9x, var10x) -> var9x.applyGradient(
                           var1.x,
                           var1.y,
                           var1.z,
                           var10,
                           var25,
                           var1.gradientStartX,
                           var1.gradientStartY,
                           var1.gradientStartZ,
                           var1.gradientEndX,
                           var1.gradientEndY,
                           var1.gradientEndZ,
                           var29,
                           var32,
                           var39,
                           var27,
                           var43,
                           var1.undoGroupSize,
                           var1.isHoldDownInteraction,
                           var10x
                        )
                     );
                     break;
                  case Shading:
                     int var28 = var9.tool().get("ShadingIntensity") class="kw">instanceof Integer var14 ? var14 : 100;
                     float var31 = var28 / 100.0F;
                     int var34 = var9.tool().get("ShadingEdgeBlend") class="kw">instanceof Integer var16 ? var16 : 0;
                     float var37 = var34 / 100.0F;
                     String var41 = (String)var9.tool().getOrDefault("ShadingSubMode", "Auto");
                     boolean var18 = "Auto".equals(var41);
                     String var19 = (String)var9.tool().getOrDefault("ShadingLightSource", "None");
                     boolean var20 = "BrushCenter".equals(var19);
                     boolean var21;
                     boolean var53 = var21 = var9.tool().get("CustomShadeInvert") class="kw">instanceof Boolean var22 && var22;

                     BuilderToolsPlugin.ShadingLight var54 = class="kw">switch (var19) {
                        case "Sun" -> BuilderToolsPlugin.ShadingLight.SUN;
                        case "None" -> BuilderToolsPlugin.ShadingLight.ANGLE;
                        class="kw">default -> BuilderToolsPlugin.ShadingLight.PLAYER;
                     };
                     BuilderToolsPlugin.ShadingLight var46 = var54;
                     String var48 = (String)var9.tool().get("ShadingCustomMaterials");
                     int[] var49 = "Custom".equals(var41) && var48 != null && !var48.isEmpty() ? resolveShadingRamp(BlockPattern.parse(var48)) : null;
                     BuilderToolsPlugin.addToQueue(
                        var6,
                        var2,
                        (var11x, var12, var13) -> var12.applyShading(
                           var1.x,
                           var1.y,
                           var1.z,
                           var1.playerX,
                           var1.playerY,
                           var1.playerZ,
                           var10,
                           var25,
                           var1.shadingLighten,
                           var18,
                           var20,
                           var46,
                           var49,
                           var31,
                           var27,
                           var21,
                           var37,
                           var1.undoGroupSize,
                           var1.isHoldDownInteraction,
                           BuilderToolsPlugin.get().getBlockColorIndex(),
                           var13
                        )
                     );
               }
            }
         }
      }
   }

   @Nonnull
   class="kw">private class="kw">static BrushShape parseBrushShape(@Nullable String var0) {
      if (var0 == null) {
         class="kw">return BrushShape.Cube;
      }

      try {
         class="kw">return BrushShape.valueOf(var0);
      } catch (IllegalArgumentException var2) {
         class="kw">return BrushShape.Cube;
      }
   }

   @Nullable
   class="kw">private class="kw">static int[] resolveShadingRamp(@Nullable BlockPattern var0) {
      if (var0 != null && !var0.isEmpty()) {
         Integer[] var1 = var0.getResolvedKeys();
         int var2 = 0;

         for (Integer var6 : var1) {
            if (var6 != null && var6 > 0) {
               var2++;
            }
         }

         if (var2 == 0) {
            class="kw">return null;
         }

         int[] var9 = new int[var2];
         int var10 = 0;

         for (Integer var8 : var1) {
            if (var8 != null && var8 > 0) {
               var9[var10++] = var8;
            }
         }

         class="kw">return var9;
      } else {
         class="kw">return null;
      }
   }

   class="kw">public void handleBuilderToolStackArea(
      @Nonnull BuilderToolStackArea var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5
   ) {
      Player var6 = var5.getComponent(var3, Player.getComponentType());
      if (var6 != null) {
         LOGGER.at(Level.INFO).log("%s: %s", this.packetHandler.getIdentifier(), var1);
         long var7 = MathUtil.saturatedMultiply(
            Vector3iUtil.inclusiveBoxVolume(
               var1.selectionMin.x, var1.selectionMin.y, var1.selectionMin.z, var1.selectionMax.x, var1.selectionMax.y, var1.selectionMax.z
            ),
            Math.max(1, var1.numStacks)
         );
         BuilderToolsPlugin.addToQueue(
            var6,
            var2,
            var7,
            (var2x, var3x, var4x) -> {
               var3x.select(
                  this.fromBlockPosition(var1.selectionMin), this.fromBlockPosition(var1.selectionMax), "server.builderTools.selectReasons.extrude", var4x
               );
               var3x.extrudeSelectionFace(var2x, new Vector3i(var1.xNormal, var1.yNormal, var1.zNormal), var1.numStacks, 0, false, var4x);
            }
         );
      }
   }

   @Nonnull
   class="kw">public Vector3i fromBlockPosition(@Nonnull BlockPosition var1) {
      class="kw">return new Vector3i(var1.x, var1.y, var1.z);
   }

   class="kw">private class="kw">static long estimateClipboardBlocks(@Nonnull Player var0, @Nonnull PlayerRef var1) {
      BlockSelection var2 = BuilderToolsPlugin.getState(var0, var1).getSelection();
      class="kw">return var2 != null ? var2.getBlockCount() : 0L;
   }

   class="kw">public void handleBuilderToolRotateClipboard(
      @Nonnull BuilderToolRotateClipboard var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5
   ) {
      Player var6 = var5.getComponent(var3, Player.getComponentType());
      if (var6 != null) {
         Axis var7 = var1.axis == com.hypixel.hytale.protocol.packets.buildertools.Axis.X
            ? Axis.X
            : (var1.axis == com.hypixel.hytale.protocol.packets.buildertools.Axis.Y ? Axis.Y : Axis.Z);
         RotateBlockMode var8 = RotateBlockMode.ALL;
         BuilderTool var9 = BuilderTool.getActiveBuilderTool(var3, var5);
         if (var9 != null && var9.getId().equals("Paste")) {
            ItemStack var10 = InventoryComponent.getItemInHand(var5, var3);
            BuilderTool.ArgData var11 = var9.getItemArgData(var10);
            if (var11 != null && var11.tool() != null) {
               var8 = RotateBlockMode.fromString((String)var11.tool().getOrDefault("RotateBlock", "All"));
            }
         }

         RotateBlockMode var12 = var8;
         LOGGER.at(Level.INFO).log("%s: %s", this.packetHandler.getIdentifier(), var1);
         BuilderToolsPlugin.addToQueue(var6, var2, estimateClipboardBlocks(var6, var2), (var3x, var4x, var5x) -> {
            var4x.setSkipNextPreviewRebuild(var12 == RotateBlockMode.ALL);
            var4x.rotate(var3x, var7, var1.angle, var12, var5x);
         });
      }
   }

   class="kw">public void handleBuilderToolRandomizeClipboard(
      @Nonnull BuilderToolRandomizeClipboard var1,
      @Nonnull PlayerRef var2,
      @Nonnull Ref<EntityStore> var3,
      @Nonnull World var4,
      @Nonnull Store<EntityStore> var5
   ) {
      Player var6 = var5.getComponent(var3, Player.getComponentType());
      if (var6 != null) {
         RotateBlockMode var7 = RotateBlockMode.ALL;
         BuilderTool var8 = BuilderTool.getActiveBuilderTool(var3, var5);
         if (var8 != null && var8.getId().equals("Paste")) {
            ItemStack var9 = InventoryComponent.getItemInHand(var5, var3);
            BuilderTool.ArgData var10 = var8.getItemArgData(var9);
            if (var10 != null && var10.tool() != null) {
               var7 = RotateBlockMode.fromString((String)var10.tool().getOrDefault("RotateBlock", "All"));
            }
         }

         RotateBlockMode var11 = var7;
         LOGGER.at(Level.INFO).log("%s: %s", this.packetHandler.getIdentifier(), var1);
         BuilderToolsPlugin.addToQueue(
            var6,
            var2,
            estimateClipboardBlocks(var6, var2),
            (var2x, var3x, var4x) -> var3x.applyRandomizeTransforms(
               var2x, var1.deltaX, var1.deltaY, var1.deltaZ, var1.flipX, var1.flipY, var1.flipZ, var11, var4x
            )
         );
      }
   }

   class="kw">public void handleBuilderToolResetClipboardRotation(
      @Nonnull BuilderToolResetClipboardRotation var1,
      @Nonnull PlayerRef var2,
      @Nonnull Ref<EntityStore> var3,
      @Nonnull World var4,
      @Nonnull Store<EntityStore> var5
   ) {
      Player var6 = var5.getComponent(var3, Player.getComponentType());
      if (var6 != null) {
         LOGGER.at(Level.INFO).log("%s: %s", this.packetHandler.getIdentifier(), var1);
         BuilderToolsPlugin.addToQueue(var6, var2, (var0, var1x, var2x) -> var1x.resetClipboardRotation(var0, var2x));
      }
   }

   class="kw">public void handleBuilderToolPasteClipboard(
      @Nonnull BuilderToolPasteClipboard var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5
   ) {
      Player var6 = var5.getComponent(var3, Player.getComponentType());
      if (var6 != null) {
         boolean var7 = true;
         BuilderTool var8 = BuilderTool.getActiveBuilderTool(var3, var5);
         if (var8 != null && var8.getId().equals("Paste")) {
            ItemStack var9 = InventoryComponent.getItemInHand(var5, var3);
            BuilderTool.ArgData var10 = var8.getItemArgData(var9);
            if (var10 != null && var10.tool() != null) {
               var7 = (Boolean)var10.tool().getOrDefault("PasteAir", true);
            }
         }

         boolean var11 = var7;
         LOGGER.at(Level.INFO).log("%s: %s", this.packetHandler.getIdentifier(), var1);
         BuilderToolsPlugin.addToQueue(
            var6, var2, estimateClipboardBlocks(var6, var2), (var2x, var3x, var4x) -> var3x.paste(var2x, var1.x, var1.y, var1.z, false, !var11, var4x)
         );
      }
   }

   class="kw">public void handleBuilderToolLineAction(
      @Nonnull BuilderToolLineAction var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5
   ) {
      Player var6 = var5.getComponent(var3, Player.getComponentType());
      if (var6 != null) {
         BuilderTool var7 = BuilderTool.getActiveBuilderTool(var3, var5);
         if (var7 != null && var7.getId().equals("Line")) {
            ItemStack var8 = InventoryComponent.getItemInHand(var5, var3);
            BuilderTool.ArgData var9 = var7.getItemArgData(var8);
            if (var9 != null) {
               Map var10 = var9.tool();
               if (var10 != null) {
                  int var11 = (Integer)var10.get("bLineWidth");
                  int var12 = (Integer)var10.get("cLineHeight");
                  BrushShape var13 = BrushShape.valueOf((String)var10.get("dLineShape"));
                  BrushOrigin var14 = BrushOrigin.valueOf((String)var10.get("eLineOrigin"));
                  int var15 = (Integer)var10.get("fLineWallThickness");
                  int var16 = (Integer)var10.get("gLineSpacing");
                  int var17 = (Integer)var10.get("hLineDensity");
                  BlockPattern var18 = (BlockPattern)var10.get("aLineMaterial");
                  LOGGER.at(Level.INFO).log("%s: %s", this.packetHandler.getIdentifier(), var1);
                  long var19 = Math.max(Math.max(Math.abs(var1.xEnd - var1.xStart), Math.abs(var1.yEnd - var1.yStart)), Math.abs(var1.zEnd - var1.zStart)) + 1L;
                  long var21 = var19 * Math.max(1, var11) * Math.max(1, var12);
                  BuilderToolsPlugin.addToQueue(
                     var6,
                     var2,
                     var21,
                     (var10x, var11x, var12x) -> var11x.editLine(
                        var1.xStart,
                        var1.yStart,
                        var1.zStart,
                        var1.xEnd,
                        var1.yEnd,
                        var1.zEnd,
                        var18,
                        var11,
                        var12,
                        var15,
                        var13,
                        var14,
                        var16,
                        var17,
                        ToolOperation.combineMasks(var9, var11x.getGlobalMask()),
                        var12x
                     )
                  );
               }
            }
         }
      }
   }

   class="kw">public void handleBuilderToolOnUseInteraction(
      @Nonnull BuilderToolOnUseInteraction var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5
   ) {
      Player var6 = var5.getComponent(var3, Player.getComponentType());
      if (var6 != null) {
         BuilderTool var7 = BuilderTool.getActiveBuilderTool(var3, var5);
         if (var7 != null && "LaserPointer".equals(var7.getId())) {
            if (!isAuthorizedForTool(var2, var3, var5, "LaserPointer")) {
               class="kw">return;
            }
         } else {
            if (!hasPermission(var2, HytalePermissions.EDITOR_BRUSH_USE)) {
               class="kw">return;
            }

            if (var7 != null && !var7.isSurvivalAllowed() && var6.getGameMode() != GameMode.Creative) {
               class="kw">return;
            }
         }

         LOGGER.at(Level.INFO).log("%s: %s", this.packetHandler.getIdentifier(), var1);
         BuilderToolsPlugin.addToQueue(var6, var2, (var2x, var3x, var4x) -> var3x.edit(var3, var1, var4x));
      }
   }

   class="kw">public void handleBuilderToolSetEntityTransform(
      @Nonnull BuilderToolSetEntityTransform var1,
      @Nonnull PlayerRef var2,
      @Nonnull Ref<EntityStore> var3,
      @Nonnull World var4,
      @Nonnull Store<EntityStore> var5
   ) {
      if (!isAuthorizedForTool(var2, var3, var5, "Entity")) {
         if (var1.isSessionEnd) {
            sendSessionEnd(var2, var1);
         }
      } else {
         Player var6 = var5.getComponent(var3, Player.getComponentType());
         if (var6 == null) {
            if (var1.isSessionEnd) {
               sendSessionEnd(var2, var1);
            }
         } else {
            Ref var7 = var4.getEntityStore().getRefFromNetworkId(var1.entityId);
            if (var7 != null && var7.isValid()) {
               if (var5.getComponent(var7, Player.getComponentType()) != null) {
                  if (var1.isSessionEnd) {
                     sendSessionEnd(var2, var1);
                  }
               } else {
                  BuilderToolsPlugin.addToQueue(
                     var6,
                     var2,
                     (var3x, var4x, var5x) -> {
                        if (var7.isValid()) {
                           TransformComponent var6 = var5x.getComponent(var7, TransformComponent.getComponentType());
                           if (var6 == null) {
                              if (var1.isSessionEnd) {
                                 sendSessionEnd(var2, var1);
                              }
                           } else {
                              Dirty var7 = var5x.getComponent(var7, Dirty.getComponentType());
                              ModelTransform var8 = var1.modelTransform;
                              var4x.handleEntityTransform(var7, var8 != null, var1.isSessionEnd, var5x);
                              if (var8 != null) {
                                 var5x.tryRemoveComponent(var7, DespawnComponent.getComponentType());
                              }

                              HeadRotation var9 = var5x.getComponent(var7, HeadRotation.getComponentType());
                              if (var8 != null) {
                                 boolean var10 = var8.position != null;
                                 boolean var11 = var8.lookOrientation != null;
                                 boolean var12 = var8.bodyOrientation != null;
                                 if (var10) {
                                    var6.getPosition().set(var8.position.x, var8.position.y, var8.position.z);
                                 }

                                 if (var11 && var9 != null) {
                                    var9.getRotation().set(var8.lookOrientation.pitch, var8.lookOrientation.yaw, var8.lookOrientation.roll);
                                 }

                                 if (var12) {
                                    var6.getRotation().set(var8.bodyOrientation.pitch, var8.bodyOrientation.yaw, var8.bodyOrientation.roll);
                                 }

                                 if ((var10 || var11 || var12) && var7 != null) {
                                    var7.markDirty();
                                 }
                              }

                              if (var1.isSessionEnd) {
                                 boolean var14 = var5x.getArchetype(var7).contains(ItemComponent.getComponentType())
                                    || var5x.getArchetype(var7).contains(BlockEntity.getComponentType());
                                 if (var14) {
                                    BoundingBox var15 = var5x.getComponent(var7, BoundingBox.getComponentType());
                                    if (var15 != null) {
                                       boolean var16 = var5x.getArchetype(var7).contains(BlockEntity.getComponentType());
                                       Rotation3f var13;
                                       if (var16 && var9 != null) {
                                          var13 = var9.getRotation();
                                       } else {
                                          var13 = var6.getRotation();
                                       }

                                       var15.applyRotation(var13.pitch(), var13.yaw(), var13.roll());
                                    }
                                 }

                                 sendSessionEnd(var2, var1);
                              }
                           }
                        }
                     }
                  );
               }
            }
         }
      }
   }

   class="kw">private class="kw">static void sendSessionEnd(@Nonnull PlayerRef var0, @Nonnull BuilderToolSetEntityTransform var1) {
      BuilderToolEntityTransformSessionEnd var2 = new BuilderToolEntityTransformSessionEnd();
      var2.entityId = var1.entityId;
      var0.getPacketHandler().writeNoCache(var2);
   }

   class="kw">public void handlePrefabUnselectPrefab(
      @Nonnull PrefabUnselectPrefab var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5
   ) {
      LOGGER.at(Level.INFO).log("%s: %s", this.packetHandler.getIdentifier(), var1);
      PrefabEditSessionManager var6 = BuilderToolsPlugin.get().getPrefabEditSessionManager();
      PrefabEditSession var7 = var6.getPrefabEditSession(var2.getUuid());
      if (var7 == null) {
         var2.sendMessage(Message.translation("server.commands.editprefab.notInEditSession"));
      } else {
         if (var7.clearSelectedPrefab(var3, var5)) {
            var2.sendMessage(Message.translation("server.commands.editprefab.unselected"));
         } else {
            var2.sendMessage(Message.translation("server.commands.editprefab.noPrefabSelected"));
         }
      }
   }

   class="kw">public void handlePrefabSetAnchor(
      @Nonnull PrefabSetAnchor var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5
   ) {
      LOGGER.at(Level.INFO).log("%s: %s", this.packetHandler.getIdentifier(), var1);
      PrefabEditSessionManager var6 = BuilderToolsPlugin.get().getPrefabEditSessionManager();
      PrefabEditSession var7 = var6.getPrefabEditSession(var2.getUuid());
      if (var7 == null) {
         var2.sendMessage(Message.translation("server.commands.editprefab.notInEditSession"));
      } else {
         PrefabEditingMetadata var8 = null;
         Vector3i var9 = new Vector3i(var1.x, var1.y, var1.z);

         for (PrefabEditingMetadata var11 : var7.getLoadedPrefabMetadata().values()) {
            boolean var12 = var11.isLocationWithinPrefabBoundingBox(new Vector3i(var1.x, var1.y, var1.z));
            if (var12) {
               var8 = var11;
               break;
            }
         }

         if (var8 == null) {
            var2.sendMessage(Message.translation("server.commands.editprefab.select.error.noPrefabFound"));
         } else {
            var8.setAnchorPoint(var9, var4);
            var8.sendAnchorHighlightingPacket(var2.getPacketHandler());
         }
      }
   }

   class="kw">public void handleBuilderToolSetEntityScale(
      @Nonnull BuilderToolSetEntityScale var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5
   ) {
      if (isAuthorizedForTool(var2, var3, var5, "Entity")) {
         Player var6 = var5.getComponent(var3, Player.getComponentType());
         if (var6 != null) {
            Ref var7 = var4.getEntityStore().getRefFromNetworkId(var1.entityId);
            if (var7 != null && var7.isValid()) {
               if (var5.getComponent(var7, Player.getComponentType()) == null) {
                  BuilderToolsPlugin.addToQueue(var6, var2, (var2x, var3x, var4x) -> {
                     if (var7.isValid()) {
                        var3x.handleEntityScale(var7, var4x);
                        EntityScaleComponent var5 = var4x.getComponent(var7, EntityScaleComponent.getComponentType());
                        if (var5 == null) {
                           var5 = new EntityScaleComponent(var1.scale);
                           var4x.addComponent(var7, EntityScaleComponent.getComponentType(), var5);
                        } else {
                           var5.setScale(var1.scale);
                        }
                     }
                  });
               }
            }
         }
      }
   }

   class="kw">public void handleBuilderToolSetEntityPickupEnabled(
      @Nonnull BuilderToolSetEntityPickupEnabled var1,
      @Nonnull PlayerRef var2,
      @Nonnull Ref<EntityStore> var3,
      @Nonnull World var4,
      @Nonnull Store<EntityStore> var5
   ) {
      if (isAuthorizedForTool(var2, var3, var5, "Entity")) {
         Player var6 = var5.getComponent(var3, Player.getComponentType());
         if (var6 != null) {
            Ref var7 = var4.getEntityStore().getRefFromNetworkId(var1.entityId);
            if (var7 != null && var7.isValid()) {
               PropComponent var8 = var5.getComponent(var7, PropComponent.getComponentType());
               if (var8 != null) {
                  BuilderToolsPlugin.addToQueue(var6, var2, (var2x, var3x, var4x) -> {
                     if (var7.isValid()) {
                        EntitySettingsSnapshot var5 = new EntitySettingsSnapshot(var7, var4x);
                        EntitySettingsSnapshot.applyPickupState(var7, var1.enabled, var4x);
                        var3x.pushEntitySettingsHistory(var5);
                     }
                  });
               }
            }
         }
      }
   }

   class="kw">public void handleBuilderToolSetEntityLight(
      @Nonnull BuilderToolSetEntityLight var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5
   ) {
      if (isAuthorizedForTool(var2, var3, var5, "Entity")) {
         Player var6 = var5.getComponent(var3, Player.getComponentType());
         if (var6 != null) {
            Ref var7 = var4.getEntityStore().getRefFromNetworkId(var1.entityId);
            if (var7 != null && var7.isValid()) {
               BuilderToolsPlugin.addToQueue(var6, var2, (var2x, var3x, var4x) -> {
                  if (var7.isValid()) {
                     EntitySettingsSnapshot var5 = new EntitySettingsSnapshot(var7, var4x);
                     if (var1.light == null) {
                        var4x.tryRemoveComponent(var7, DynamicLight.getComponentType());
                        var4x.tryRemoveComponent(var7, PersistentDynamicLight.getComponentType());
                     } else {
                        ColorLight var6 = new ColorLight(var1.light.radius, var1.light.red, var1.light.green, var1.light.blue);
                        DynamicLight var7 = var4x.getComponent(var7, DynamicLight.getComponentType());
                        if (var7 != null) {
                           var7.setColorLight(var6);
                        } else {
                           var4x.addComponent(var7, DynamicLight.getComponentType(), new DynamicLight(var6));
                        }

                        PersistentDynamicLight var8 = var4x.getComponent(var7, PersistentDynamicLight.getComponentType());
                        if (var8 != null) {
                           var8.setColorLight(var6);
                        } else {
                           var4x.addComponent(var7, PersistentDynamicLight.getComponentType(), new PersistentDynamicLight(var6));
                        }
                     }

                     var3x.pushEntitySettingsHistory(var5);
                  }
               });
            }
         }
      }
   }

   class="kw">public void handleBuilderToolSetNPCDebug(
      @Nonnull BuilderToolSetNPCDebug var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5
   ) {
      if (isAuthorizedForTool(var2, var3, var5, "Entity")) {
         Ref var6 = var4.getEntityStore().getRefFromNetworkId(var1.entityId);
         if (var6 != null && var6.isValid()) {
            NPCMarkerComponent var7 = var5.getComponent(var6, NPCMarkerComponent.getComponentType());
            if (var7 != null) {
               UUIDComponent var8 = var5.getComponent(var6, UUIDComponent.getComponentType());
               if (var8 != null) {
                  UUID var9 = var8.getUuid();
                  String var10 = var1.enabled ? "npc debug set display --entity " + var9 : "npc debug clear --entity " + var9;
                  CommandManager.get().handleCommand(var2, var10);
               }
            }
         }
      }
   }

   class="kw">public void handleBuilderToolSetEntityCollision(
      @Nonnull BuilderToolSetEntityCollision var1,
      @Nonnull PlayerRef var2,
      @Nonnull Ref<EntityStore> var3,
      @Nonnull World var4,
      @Nonnull Store<EntityStore> var5
   ) {
      if (isAuthorizedForTool(var2, var3, var5, "Entity")) {
         Player var6 = var5.getComponent(var3, Player.getComponentType());
         if (var6 != null) {
            Ref var7 = var4.getEntityStore().getRefFromNetworkId(var1.entityId);
            if (var7 != null && var7.isValid()) {
               PropComponent var8 = var5.getComponent(var7, PropComponent.getComponentType());
               NPCMarkerComponent var9 = var5.getComponent(var7, NPCMarkerComponent.getComponentType());
               if (var8 != null || var9 != null) {
                  BuilderToolsPlugin.addToQueue(var6, var2, (var2x, var3x, var4x) -> {
                     if (var7.isValid()) {
                        EntitySettingsSnapshot var5 = new EntitySettingsSnapshot(var7, var4x);
                        if (var1.collisionType != null && !var1.collisionType.isEmpty()) {
                           HitboxCollisionConfig var6 = HitboxCollisionConfig.getAssetMap().getAsset(var1.collisionType);
                           if (var6 != null) {
                              HitboxCollision var7 = var4x.getComponent(var7, HitboxCollision.getComponentType());
                              if (var7 != null) {
                                 var7.setHitboxCollisionConfig(var6);
                              } else {
                                 var4x.addComponent(var7, HitboxCollision.getComponentType(), new HitboxCollision(var6));
                              }
                           }
                        } else {
                           var4x.tryRemoveComponent(var7, HitboxCollision.getComponentType());
                        }

                        var3x.pushEntitySettingsHistory(var5);
                     }
                  });
               }
            }
         }
      }
   }

   class="kw">public void handleBuilderToolSetEntityType(
      @Nonnull BuilderToolSetEntityType var1, @Nonnull PlayerRef var2, @Nonnull Ref<EntityStore> var3, @Nonnull World var4, @Nonnull Store<EntityStore> var5
   ) {
      if (isAuthorizedForTool(var2, var3, var5, "Entity")) {
         if (var1.typeKey != null && !var1.typeKey.isEmpty()) {
            Player var6 = var5.getComponent(var3, Player.getComponentType());
            if (var6 != null) {
               Ref var7 = var4.getEntityStore().getRefFromNetworkId(var1.entityId);
               if (var7 != null && var7.isValid()) {
                  if (var5.getComponent(var7, Player.getComponentType()) == null) {
                     BuilderToolsPlugin.addToQueue(var6, var2, (var2x, var3x, var4x) -> {
                        if (var7.isValid()) {
                           ItemComponent var5 = var4x.getComponent(var7, ItemComponent.getComponentType());
                           if (var5 == null) {
                              BlockEntity var9 = var4x.getComponent(var7, BlockEntity.getComponentType());
                              if (var9 != null) {
                                 if (BlockType.getAssetMap().getAsset(var1.typeKey) == null) {
                                    class="kw">return;
                                 }

                                 var9.setBlockTypeKey(var1.typeKey, var7, var4x);
                              }
                           } else if (Item.getAssetMap().getAsset(var1.typeKey) != null) {
                              ItemStack var6 = var5.getItemStack();
                              int var7 = var6 != null ? var6.getQuantity() : 1;
                              ItemStack var8 = new ItemStack(var1.typeKey, var7);
                              var8.setOverrideDroppedItemAnimation(var6 == null || var6.getOverrideDroppedItemAnimation());
                              var5.setItemStack(var8);
                           }
                        }
                     });
                  }
               }
            }
         }
      }
   }

   class="kw">public void handleGMaskPresetLoadResponse(
      @Nonnull BuilderToolGMaskPresetLoadResponse var1,
      @Nonnull PlayerRef var2,
      @Nonnull Ref<EntityStore> var3,
      @Nonnull World var4,
      @Nonnull Store<EntityStore> var5
   ) {
      Player var6 = var5.getComponent(var3, Player.getComponentType());
      if (var6 != null) {
         BuilderToolsPlugin.addToQueue(var6, var2, (var2x, var3x, var4x) -> {
            if (var1.maskData != null && !var1.maskData.isEmpty()) {
               try {
                  BlockMask var5 = BlockMask.parse(var1.maskData);
                  var3x.setGlobalMask(var5, var4x);
               } catch (Exception var6) {
                  var2.sendMessage(Message.translation("server.builderTools.globalmask.load.failed").param("reason", var6.getMessage()));
               }
            } else {
               var2.sendMessage(Message.translation("server.builderTools.globalmask.load.empty"));
            }
         });
      }
   }
}