public override void OnBlockAdded(int value, int oldValue, int x, int y, int z)
        {
            try
            {
                Point3 point = new Point3(x, y, z);

                int id  = ILibrary.getItemId(value);
                int bid = Terrain.ExtractContents(value);
                if (bid == 1003)
                {
                    switch (id)
                    {        //39,40,41为动态储罐
                    case 27: //燃煤发电机
                        ILibrary.addCoalGeneratorEntity(Project, point, 1024);
                        devices.Add(point);
                        break;

                    case 30:                                                                    //太阳能发电
                        ILibrary.addBaseEnergyEntity(Project, "SolarEnergyBlock", point, 1024); //1k eu电量
                        devices.Add(point);
                        break;

                    case 40:

                        NewMutiBlockCheck.Result result = mutiBlockCheck.checkMutiBlocks(SubsystemTerrain.Terrain, point, dynamic_outsideaccept, dynamic_insideaccept, dynamic_sideaccept, dynamic_faceaccept);
                        if (result.finish)
                        {
                            int v = result.Size.X * result.Size.Y * result.Size.Z;
                            if (!MutiDevices.ContainsKey(result.savaPoint))
                            {
                                MutiDevices.Add(result.savaPoint, result.blocks); ILibrary.addMekDynamicEntity(Project, result.savaPoint, 1000 * v);
                            }
                            if (component != null)
                            {
                                component.ComponentGui.DisplaySmallMessage($"动态储罐成型,储量{1000 * result.Size.X * result.Size.Y * result.Size.Z}MB t:{result.Size}", false, false);
                            }
                        }

                        break;

                    case 41:

                        result = mutiBlockCheck.checkMutiBlocks(SubsystemTerrain.Terrain, point, dynamic_outsideaccept, dynamic_insideaccept, dynamic_sideaccept, dynamic_faceaccept);
                        if (result.finish)
                        {
                            int v = result.Size.X * result.Size.Y * result.Size.Z;
                            if (!MutiDevices.ContainsKey(result.savaPoint))
                            {
                                MutiDevices.Add(result.savaPoint, result.blocks);
                                ILibrary.addMekDynamicEntity(Project, result.savaPoint, 1000 * v);
                            }
                            if (component != null)
                            {
                                component.ComponentGui.DisplaySmallMessage($"动态储罐成型,储量{1000 * result.Size.X * result.Size.Y * result.Size.Z}MB t:{result.Size}", false, false);
                            }
                        }
                        break;

                    case 63:                                                                          //基础能量立方
                        ILibrary.addBaseEnergyEntity(Project, "BaseEnergyBlock", point, 1024 * 1024); //1k eu电量
                        devices.Add(point);
                        break;

                    case 64:    //传送机
                        NewMutiBlockCheck.TranmitResult tranmitResult = mutiBlockCheck.checkTransmit(SubsystemTerrain, point, new List <int>()
                        {
                            Terrain.MakeBlockValue(1003, 0, 64), Terrain.MakeBlockValue(1003, 0, 65)
                        }, Terrain.MakeBlockValue(1007));
                        if (tranmitResult.finished)
                        {
                            component.ComponentGui.DisplaySmallMessage("传送门成型", false, false);
                            if (!tranmitPoints.ContainsKey(tranmitResult.savePoint))
                            {
                                tranmitPoints.Add(tranmitResult.savePoint, tranmitResult);
                            }
                        }
                        break;

                    case 65:    //传送框架
                        tranmitResult = mutiBlockCheck.checkTransmit(SubsystemTerrain, point, new List <int>()
                        {
                            Terrain.MakeBlockValue(1003, 0, 64), Terrain.MakeBlockValue(1003, 0, 65)
                        }, Terrain.MakeBlockValue(1007));
                        if (tranmitResult.finished)
                        {
                            component.ComponentGui.DisplaySmallMessage("传送门成型", false, false);
                            if (!tranmitPoints.ContainsKey(tranmitResult.savePoint))
                            {
                                tranmitPoints.Add(tranmitResult.savePoint, tranmitResult);
                            }
                        }
                        break;


                    case 47:                                             //粉碎机
                        ILibrary.addCrusherEntity(Project, point, 1024); //1k eu电量
                        devices.Add(point);
                        break;

                    case 72:                                              //充能冶炼炉
                        ILibrary.addMekSmeltEntity(Project, point, 1024); //1k eu电量
                        devices.Add(point);
                        break;

                    case 78:
                        ILibrary.addEnrichEntity(Project, point, 1024);    //1k eu电量
                        devices.Add(point);
                        break;

                    case 80:                                           //合金炉
                        ILibrary.addAlloyEntity(Project, point, 1024); //1k eu电量
                        devices.Add(point);
                        break;

                    case 82:                                                     //制造厂
                        ILibrary.addManufactorymeltEntity(Project, point, 1024); //1k eu电量
                        devices.Add(point);
                        break;
                    }
                }
                else if (bid == 1007)
                {
                    switch (id)
                    {
                    case 39:
                        NewMutiBlockCheck.Result result = mutiBlockCheck.checkMutiBlocks(SubsystemTerrain.Terrain, point, dynamic_outsideaccept, dynamic_insideaccept, dynamic_sideaccept, dynamic_faceaccept);
                        if (result.finish)
                        {
                            int v = result.Size.X * result.Size.Y * result.Size.Z;
                            if (!MutiDevices.ContainsKey(result.savaPoint))
                            {
                                MutiDevices.Add(result.savaPoint, result.blocks);
                                ILibrary.addMekDynamicEntity(Project, result.savaPoint, 1000 * v);
                            }
                            if (component != null)
                            {
                                component.ComponentGui.DisplaySmallMessage($"动态储罐成型,储量{1000 * result.Size.X * result.Size.Y * result.Size.Z}MB t:{result.Size}", false, false);
                            }
                        }
                        break;
                    }
                }
                updateList();
            }
            catch (Exception e)
            {
                if (component != null)
                {
                    component.ComponentGui.DisplaySmallMessage(e.ToString(), false, false);
                }
            }
        }
        public override bool OnInteract(TerrainRaycastResult raycastResult, ComponentMiner componentMiner)
        {
            ComponentEnergyMachine mcomponent;
            ComponentFluidStore    componentFluidStore;
            PanelWidget            panelWidget = new PanelWidget();
            int    value = raycastResult.Value;
            Point3 point = raycastResult.CellFace.Point;
            int    ID    = ILibrary.getItemId(value);

            if (Terrain.ExtractContents(value) == 1003)
            {
                switch (ID)
                {
                case 27:
                    mcomponent = subsystemBlockEntities.GetBlockEntity(point.X, point.Y, point.Z).Entity.FindComponent <ComponentCoalGenerator>(true);
                    componentMiner.ComponentPlayer.ComponentGui.ModalPanelWidget = new CoalGeneratorWidget((ComponentCoalGenerator)mcomponent);
                    break;

                case 30:
                    mcomponent = subsystemBlockEntities.GetBlockEntity(point.X, point.Y, point.Z).Entity.FindComponent <CptEgySolarGtor>(true);
                    componentMiner.ComponentPlayer.ComponentGui.ModalPanelWidget = new AspSolarWidget((CptEgySolarGtor)mcomponent);
                    break;

                case 40:
                    NewMutiBlockCheck.Result result = mutiBlockCheck.checkMutiBlocks(SubsystemTerrain.Terrain, point, dynamic_outsideaccept, dynamic_insideaccept, dynamic_sideaccept, dynamic_faceaccept);
                    if (result.finish)
                    {
                        componentFluidStore = subsystemBlockEntities.GetBlockEntity(result.savaPoint.X, result.savaPoint.Y, result.savaPoint.Z).Entity.FindComponent <ComponentMekDynamic>(true);
                        componentMiner.ComponentPlayer.ComponentGui.ModalPanelWidget = new MekDynamicWidget((ComponentMekDynamic)componentFluidStore);
                    }
                    break;

                case 41:
                    result = mutiBlockCheck.checkMutiBlocks(SubsystemTerrain.Terrain, point, dynamic_outsideaccept, dynamic_insideaccept, dynamic_sideaccept, dynamic_faceaccept);
                    if (result.finish)
                    {
                        componentFluidStore = subsystemBlockEntities.GetBlockEntity(result.savaPoint.X, result.savaPoint.Y, result.savaPoint.Z).Entity.FindComponent <ComponentMekDynamic>(true);
                        componentMiner.ComponentPlayer.ComponentGui.ModalPanelWidget = new MekDynamicWidget((ComponentMekDynamic)componentFluidStore);
                    }
                    break;

                case 47:
                    mcomponent = subsystemBlockEntities.GetBlockEntity(point.X, point.Y, point.Z).Entity.FindComponent <ComponentCrusher>();
                    componentMiner.ComponentPlayer.ComponentGui.ModalPanelWidget = new CrusherWidget((ComponentCrusher)mcomponent);
                    break;

                case 48: break;

                case 49: break;

                case 50: break;

                case 51: break;

                case 52: break;

                case 63:    //基础能量立方
                    mcomponent = subsystemBlockEntities.GetBlockEntity(point.X, point.Y, point.Z).Entity.FindComponent <ComponentEnergyMachine>(true);
                    componentMiner.ComponentPlayer.ComponentGui.ModalPanelWidget = new EnergyCubeWidget(mcomponent);
                    break;

                case 64:
                    if (Terrain.ExtractContents(componentMiner.ActiveBlockValue) == 1006 && Terrain.ExtractData(componentMiner.ActiveBlockValue) == 500)
                    {
                        return(true);
                    }
                    if (tranmitPoints.TryGetValue(point, out NewMutiBlockCheck.TranmitResult tranmitResult))
                    {
                        componentMiner.ComponentPlayer.ComponentGui.DisplaySmallMessage("conn:" + tranmitResult.connectPoint.ToString(), false, false);
                    }
                    break;

                case 65:

                    break;

                case 72:         //充能冶炼炉
                    mcomponent = subsystemBlockEntities.GetBlockEntity(point.X, point.Y, point.Z).Entity.FindComponent <ComponentSmelt>(true);
                    componentMiner.ComponentPlayer.ComponentGui.ModalPanelWidget = new MekSmeltWidget((ComponentSmelt)mcomponent);
                    break;

                case 78:    //富集仓
                    mcomponent = subsystemBlockEntities.GetBlockEntity(point.X, point.Y, point.Z).Entity.FindComponent <ComponentEnrich>(true);
                    componentMiner.ComponentPlayer.ComponentGui.ModalPanelWidget = new EnrichWidget((ComponentEnrich)mcomponent);
                    break;

                case 80:    //合金炉
                    mcomponent = subsystemBlockEntities.GetBlockEntity(point.X, point.Y, point.Z).Entity.FindComponent <ComponentAlloy>(true);
                    componentMiner.ComponentPlayer.ComponentGui.ModalPanelWidget = new AlloyWidget((ComponentAlloy)mcomponent);
                    break;

                case 82:    //制造厂
                    mcomponent = subsystemBlockEntities.GetBlockEntity(point.X, point.Y, point.Z).Entity.FindComponent <ComponentManufactory>(true);
                    componentMiner.ComponentPlayer.ComponentGui.ModalPanelWidget = new ManufactoryWidget((ComponentManufactory)mcomponent);
                    break;

                default:
                    panelWidget.setText(subsystemItemElectric.scanSlot(SubsystemTerrain.Terrain, point));
                    component.ComponentGui.ModalPanelWidget = panelWidget;
                    break;
                }
            }
            else if (Terrain.ExtractContents(value) == 1007)
            {
                switch (ID)
                {
                case 39:
                    NewMutiBlockCheck.Result result = mutiBlockCheck.checkMutiBlocks(SubsystemTerrain.Terrain, point, dynamic_outsideaccept, dynamic_insideaccept, dynamic_sideaccept, dynamic_faceaccept);
                    if (result.finish)
                    {
                        componentFluidStore = subsystemBlockEntities.GetBlockEntity(result.savaPoint.X, result.savaPoint.Y, result.savaPoint.Z).Entity.FindComponent <ComponentMekDynamic>(true);
                        componentMiner.ComponentPlayer.ComponentGui.ModalPanelWidget = new MekDynamicWidget((ComponentMekDynamic)componentFluidStore);
                    }
                    break;
                }
            }
            return(false);
        }