public override void OnInteract(EntityAgent byEntity, ItemSlot itemslot, Vec3d hitPosition, EnumInteractMode mode, ref EnumHandling handled)
        {
            base.OnInteract(byEntity, itemslot, hitPosition, mode, ref handled);

            IPlayer byPlayer = byEntity.World.PlayerByUid((byEntity as EntityPlayer).PlayerUID);

            if (owner != null && owner != byPlayer)
            {
                return;
            }

            if (mode == EnumInteractMode.Interact)
            {
                if (byEntity.Controls.Sneak && byEntity.Controls.Sprint && !invLocked)
                {
                    workInv[0].TryFlipWith(itemslot);
                    return;
                }
                if (itemslot.Itemstack?.Collectible is ItemHammer)
                {
                    if (entity.GetBehavior <EntityBehaviorHealth>()?.Health < entity.GetBehavior <EntityBehaviorHealth>()?.MaxHealth)
                    {
                        itemslot.Itemstack.Collectible.DamageItem(entity.World, byEntity, itemslot, 5);
                        entity.World.PlaySoundAt(new AssetLocation("game:sounds/effect/anvilhit3.ogg"), entity, byPlayer);
                        entity.ReceiveDamage(new DamageSource()
                        {
                            Type = EnumDamageType.Heal
                        }, 1);
                        return;
                    }
                }
                if (byEntity.Controls.Sprint && !restricted && itemslot?.Itemstack?.Collectible is ItemProgCard)
                {
                    ItemStack stack = itemslot.Itemstack.Attributes.GetItemstack("workStack");
                    if (stack == null)
                    {
                        return;
                    }
                    stack.ResolveBlockOrItem(entity.World);

                    if (stack != null)
                    {
                        workInv.DropAll(entity.ServerPos.XYZ);
                        workStack = stack;
                        maintree.SetItemstack("workStack", workStack);
                        (byPlayer as IServerPlayer)?.SendMessage(GlobalConstants.InfoLogChatGroup, Lang.Get("temporalhack:work-itemprogram"), EnumChatType.Notification);
                    }

                    return;
                }
                else if (byEntity.Controls.Sprint && itemslot.Empty && byPlayer != null && workArea != null)
                {
                    BlockPos min = workArea.Start.AsBlockPos;
                    BlockPos max = workArea.End.AsBlockPos;
                    max.Y += 1;
                    List <BlockPos> blocks = new List <BlockPos>()
                    {
                        min, max
                    };
                    List <int> colors = new List <int>()
                    {
                        ColorUtil.ColorFromRgba(215, 94, 94, 64), ColorUtil.ColorFromRgba(215, 94, 94, 64)
                    };

                    entity.Api.World.HighlightBlocks(byPlayer, 56, blocks, colors, EnumHighlightBlocksMode.Absolute, EnumHighlightShape.Cube);
                    entity.Api.World.RegisterCallback((dt) => entity.Api.World.HighlightBlocks(byPlayer, 56, new List <BlockPos>(), new List <int>()), 3000);
                }

                if (byEntity.Controls.Sneak && itemslot?.Itemstack?.Collectible is ItemProgCard)
                {
                    ITreeAttribute area   = itemslot.Itemstack.Attributes.GetTreeAttribute("workArea");
                    ITreeAttribute box    = null;
                    ITreeAttribute barrel = null;

                    if (!nochest)
                    {
                        box = itemslot.Itemstack.Attributes.GetTreeAttribute("workChest");
                    }
                    if (!nobarrel)
                    {
                        barrel = itemslot.Itemstack.Attributes.GetTreeAttribute("workBarrel");
                    }

                    StopAll();

                    if (area != null)
                    {
                        maintree["workArea"] = area.Clone();
                        workArea             = cuboiddFromTree(area);
                    }

                    if (box != null)
                    {
                        maintree["workChest"] = box.Clone();
                        workChest             = new BlockPos(box.GetInt("x"), box.GetInt("y"), box.GetInt("z"));
                    }

                    if (barrel != null)
                    {
                        maintree["workBarrel"] = barrel.Clone();
                        workBarrel             = new BlockPos(barrel.GetInt("x"), barrel.GetInt("y"), barrel.GetInt("z"));
                    }

                    if (area != null || box != null || barrel != null)
                    {
                        (byPlayer as IServerPlayer)?.SendMessage(GlobalConstants.InfoLogChatGroup, Lang.Get("temporalhack:work-program"), EnumChatType.Notification);
                    }
                }
                else if (byEntity.Controls.Sneak && itemslot.Empty)
                {
                    AssetLocation item = new AssetLocation(entity.Code.Domain, "deploybot-" + entity.Code.Path);
                    if (item != null)
                    {
                        EntityBehaviorHealth bh    = entity.GetBehavior <EntityBehaviorHealth>();
                        ItemStack            stack = new ItemStack(entity.World.GetItem(item));

                        stack.Attributes.SetInt("workEnergy", energy);
                        if (bh != null)
                        {
                            stack.Attributes.SetFloat("workHealth", bh.MaxHealth - bh.Health);
                        }

                        byEntity.World.SpawnItemEntity(stack, entity.SidedPos.XYZ);


                        workInv.DropAll(entity.ServerPos.XYZ);
                        entity.Die(EnumDespawnReason.Removed);
                    }
                }
                else if (byEntity.Controls.Sneak && itemslot?.Itemstack?.Collectible?.CombustibleProps?.BurnDuration != null)
                {
                    if (itemslot.Itemstack.Collectible.CombustibleProps.BurnTemperature >= 200)
                    {
                        AddEnergy((itemslot.Itemstack.Collectible.CombustibleProps.BurnTemperature / 100) * (int)itemslot.Itemstack.Collectible.CombustibleProps.BurnDuration);
                        itemslot.TakeOut(1);
                        entity.World.PlaySoundAt(new AssetLocation("game:sounds/effect/extinguish2.ogg"), entity, byPlayer);
                    }
                }
            }
            else
            {
                if (byEntity.Controls.Sneak)
                {
                    StopAll();
                    workStack = null;
                    workInv.DropAll(entity.ServerPos.XYZ);
                    RemoveArea();
                    RemoveBarrel();
                    RemoveChest();
                    (byPlayer as IServerPlayer)?.SendMessage(GlobalConstants.InfoLogChatGroup, Lang.Get("temporalhack:work-memoryloss"), EnumChatType.Notification);
                }
            }
        }