예제 #1
0
        public override void OnResponseReceived(dynamic data)
        {
            KCDatabase db = KCDatabase.Instance;

            foreach (var dock in data)
            {
                int id = (int)dock.api_id;

                if (!db.Docks.ContainsKey(id))
                {
                    var d = new DockData();
                    d.LoadFromResponse(APIName, dock);
                    db.Docks.Add(d);
                }
                else
                {
                    db.Docks[id].LoadFromResponse(APIName, dock);
                }
            }


            db.Fleet.LoadFromResponse(APIName, data);

            base.OnResponseReceived((object)data);
        }
예제 #2
0
            //データ更新時
            public void Update(int dockID)
            {
                KCDatabase db = KCDatabase.Instance;

                DockData dock = db.Docks[dockID];

                RepairTime.BackColor = Color.Transparent;
                ToolTipInfo.SetToolTip(ShipName, null);
                ToolTipInfo.SetToolTip(RepairTime, null);

                if (dock == null || dock.State == -1)
                {
                    //locked
                    ShipName.Text   = "";
                    RepairTime.Text = "";
                    RepairTime.Tag  = null;
                }
                else if (dock.State == 0)
                {
                    //empty
                    ShipName.Text   = "----";
                    RepairTime.Text = "";
                    RepairTime.Tag  = null;
                }
                else
                {
                    //repairing
                    ShipName.Text = db.Ships[dock.ShipID].Name;
                    ToolTipInfo.SetToolTip(ShipName, db.Ships[dock.ShipID].NameWithLevel);
                    RepairTime.Text = DateTimeHelper.ToTimeRemainString(dock.CompletionTime);
                    RepairTime.Tag  = dock.CompletionTime;
                    ToolTipInfo.SetToolTip(RepairTime, "完了日時 : " + DateTimeHelper.TimeToCSVString(dock.CompletionTime));
                }
            }
예제 #3
0
        private void RecalculatePositions(string dockName)
        {
            Hash <string, float> panelPositions = _panelPositions[dockName];

            if (panelPositions == null)
            {
                panelPositions            = new Hash <string, float>();
                _panelPositions[dockName] = panelPositions;
            }

            panelPositions.Clear();

            PanelAlignEnum align       = _pluginConfig.Docks[dockName].Alignment;
            DockData       dock        = _pluginConfig.Docks[dockName];
            DockPosition   pos         = dock.Position;
            float          leftOffset  = dock.DockPadding.Left;
            float          rightOffSet = dock.DockPadding.Right;

            List <PanelRegistration> dockPanels = _registeredPanels.Values
                                                  .Where(rp => rp.Dock == dockName)
                                                  .OrderBy(rp => rp.Order)
                                                  .ToList();

            float startX = pos.XPos;

            if (align == PanelAlignEnum.Right)
            {
                foreach (PanelRegistration panel in dockPanels)
                {
                    startX -= panel.Width + dock.PanelPadding;
                }

                startX    -= leftOffset + rightOffSet;
                dockPanels = dockPanels.OrderByDescending(p => p.Order).ToList();
            }
            else if (align == PanelAlignEnum.Center)
            {
                foreach (PanelRegistration panel in dockPanels)
                {
                    startX -= panel.Width / 2 + dock.PanelPadding / 2;
                }

                startX -= (leftOffset + rightOffSet) / 2;
            }

            float offset = leftOffset;

            foreach (PanelRegistration panel in dockPanels)
            {
                panelPositions[panel.Name] = startX + offset;
                offset += panel.Width + dock.PanelPadding;
                DrawPanel(BasePlayer.activePlayerList, panel, UpdateEnum.All);
            }
        }
예제 #4
0
        private void SetActiveDocument(ContentDocument pane, bool updatePaneOrder)
        {
            SetIcon(pane);
            if (!_panes.Contains(pane))
            {
                AddDocument(pane);
            }
            if (_currentPane != pane)
            {
                if (ActiveDocumentChanging != null)
                {
                    ActiveDocumentChanging(pane);
                }
                if (updatePaneOrder)
                {
                    _panesInOrderUsed.Remove(pane);
                    _panesInOrderUsed.Insert(0, pane);
                }
                if ((pane != _panes[0]) && (pane.TabWidth == 0))
                {
                    // if this pane's tab is not visible, move it to the start
                    _panes.Remove(pane);
                    _panes.Insert(0, pane);
                }
                if (_currentPane != null && _currentPane.Control != null)
                {
                    _currentPane.Control.WindowDeactivated();
                }
                _currentPane = pane;

                AttachTabContextMenu(pane);
                pane.Control.DockingContainer.Text = pane.Name;
                DockData dockData = GetDockData(pane);
                if (pane.Control.DockingContainer == null || pane.Control.DockingContainer.IsDisposed)
                {
                    pane.Control.DockingContainer = new DockingContainer(pane.Control);
                }
                pane.Control.DockingContainer.Show(_dockPanel, dockData);

                pane.Control.DockingContainer.Focus();
                pane.Control.WindowActivated();
            }

            // Do this even if the pane hasn't changed, to ensure
            // that the property grid is refreshed
            if (ActiveDocumentChanged != null)
            {
                ActiveDocumentChanged(pane);
            }
            RefreshWindowsMenu();
        }
예제 #5
0
        public override void OnRequestReceived(Dictionary <string, string> data)
        {
            KCDatabase db = KCDatabase.Instance;

            DockData dock       = db.Docks[int.Parse(data["api_ndock_id"])];
            bool     bucketUsed = data["api_highspeed"] == "1";

            int      shipID = int.Parse(data["api_ship_id"]);
            ShipData ship   = db.Ships[shipID];


            Utility.Logger.Add(2, string.Format("入渠ドック #{0}で {1} ({2}/{3}) の修復を開始しました。(燃料x{4}, 鋼材x{5}, {6})",
                                                dock.DockID, ship.NameWithLevel,
                                                ship.HPCurrent, ship.HPMax,
                                                ship.RepairFuel, ship.RepairSteel,
                                                bucketUsed ? "高速修復材x1" : ("修理完了予定: " + DateTimeHelper.TimeToCSVString(DateTime.Now + TimeSpan.FromMilliseconds(ship.RepairTime)))
                                                ));


            db.Material.Fuel  -= ship.RepairFuel;
            db.Material.Steel -= ship.RepairSteel;


            if (bucketUsed)
            {
                ship.Repair();
                db.Material.InstantRepair--;
            }
            else if (ship.RepairTime <= 60000)
            {
                ship.Repair();
            }
            else
            {
                //この場合は直後に ndock が呼ばれるので自力で更新しなくてもよい

                /*
                 * dock.State = 1;
                 * dock.ShipID = shipID;
                 * dock.CompletionTime = DateTime.Now.AddMilliseconds( ship.RepairTime );
                 */
            }


            db.Fleet.LoadFromRequest(APIName, data);

            base.OnRequestReceived(data);
        }
예제 #6
0
        public override void OnResponseReceived(dynamic data)
        {
            KCDatabase db = KCDatabase.Instance;


            //api_material
            db.Material.LoadFromResponse(APIName, data.api_material);

            //api_basic
            db.Admiral.LoadFromResponse(APIName, data.api_basic);

            //api_ship
            //ちょっと遅くなるかもだけど、齟齬(幽霊とかドッペルゲンガーとか)の発生を防ぐため全入れ替え
            db.Ships.Clear();
            foreach (var elem in data.api_ship)
            {
                var a = new ShipData();
                a.LoadFromResponse(APIName, elem);
                db.Ships.Add(a);
            }


            //api_ndock
            foreach (var elem in data.api_ndock)
            {
                int id = (int)elem.api_id;

                if (!db.Docks.ContainsKey(id))
                {
                    var a = new DockData();
                    a.LoadFromResponse(APIName, elem);
                    db.Docks.Add(a);
                }
                else
                {
                    db.Docks[id].LoadFromResponse(APIName, elem);
                }
            }

            //api_deck_port
            db.Fleet.LoadFromResponse(APIName, data.api_deck_port);
            db.Fleet.CombinedFlag = data.api_combined_flag() ? (int)data.api_combined_flag : 0;


            db.Battle.LoadFromResponse(APIName, data);

            base.OnResponseReceived((object)data);
        }
예제 #7
0
        public void Show(IDockingPanel panel, DockData dockData)
        {
            IsShowing = true;
            DockPanel dockPanel = ((DockingPanel)panel).DockPanel;

            if (dockData.Location != Rectangle.Empty &&
                dockData.DockState == DockingState.Float)
            {
                base.Show(dockPanel, dockData.Location);
            }
            else
            {
                PerformUglyDockHack();
                base.Show(dockPanel, (DockState)dockData.DockState);
            }
        }
예제 #8
0
        public override void OnRequestReceived(Dictionary <string, string> data)
        {
            KCDatabase db = KCDatabase.Instance;

            DockData dock       = db.Docks[int.Parse(data["api_ndock_id"])];
            bool     bucketUsed = data["api_highspeed"] == "1";

            int      shipID = int.Parse(data["api_ship_id"]);
            ShipData ship   = db.Ships[shipID];


            Utility.Logger.Add(2, "",
                               $"入渠船坞 #{dock.DockID} 开始修复舰娘", $" {ship.NameWithLevel} ( {ship.HPCurrent} / {ship.HPMax} ) 。",
                               $"消耗 : 燃料 x {ship.RepairFuel}, 钢材 x {ship.RepairSteel}" + (bucketUsed ? ", 高速修复材 x 1 。" :
                                                                                          $" 。预计完成时间 : {DateTimeHelper.TimeToCSVString(DateTime.Now + TimeSpan.FromMilliseconds(ship.RepairTime))}")
                               );


            db.Material.Fuel  -= ship.RepairFuel;
            db.Material.Steel -= ship.RepairSteel;


            if (bucketUsed)
            {
                ship.Repair();
                db.Material.InstantRepair--;
            }
            else if (ship.RepairTime <= 60000)
            {
                ship.Repair();
            }
            else
            {
                //この場合は直後に ndock が呼ばれるので自力で更新しなくてもよい

                /*
                 * dock.State = 1;
                 * dock.ShipID = shipID;
                 * dock.CompletionTime = DateTime.Now.AddMilliseconds( ship.RepairTime );
                 */
            }


            db.Fleet.LoadFromRequest(APIName, data);

            base.OnRequestReceived(data);
        }
예제 #9
0
        private UiPosition GetDockUiPosition(DockPosition pos, string dockName)
        {
            float startPos = 0f;
            float endPos   = 0f;

            if (_panelPositions.ContainsKey(dockName))
            {
                DockData            dock   = _pluginConfig.Docks[dockName];
                ICollection <float> panels = _panelPositions[dockName].Values;
                if (panels.Count != 0)
                {
                    startPos = panels.Min(pp => pp) - dock.DockPadding.Left;
                    endPos   = panels.Max(pp => pp) + dock.DockPadding.Right;
                    endPos  += _registeredPanels.Values.Where(p => p.Dock == dockName).OrderBy(p => p.Order).Last()?.Width ?? 0;
                }
            }

            return(new UiPosition(startPos, pos.StartYPos, endPos - startPos, pos.Height));
        }
예제 #10
0
        public override void OnRequestReceived(Dictionary <string, string> data)
        {
            KCDatabase db = KCDatabase.Instance;

            DockData dock = db.Docks[int.Parse(data["api_ndock_id"])];

            int      shipID = int.Parse(data["api_ship_id"]);
            ShipData ship   = db.Ships[shipID];


            db.Material.Fuel  -= ship.RepairFuel;
            db.Material.Steel -= ship.RepairSteel;


            if (data["api_highspeed"] == "1")
            {
                ship.Repair();
                db.Material.InstantRepair--;
            }
            else if (ship.RepairTime <= 60000)
            {
                ship.Repair();
            }
            else
            {
                //この場合は直後に ndock が呼ばれるので自力で更新しなくてもよい

                /*
                 * dock.State = 1;
                 * dock.ShipID = shipID;
                 * dock.CompletionTime = DateTime.Now.AddMilliseconds( ship.RepairTime );
                 */
            }


            db.Fleet.LoadFromRequest(APIName, data);

            base.OnRequestReceived(data);
        }
예제 #11
0
    public Dock(DockData data)
    {
        dockName    = data.dockName;
        dockState   = data.dockState;
        DockID      = data.dockID;
        Ship        = data.ship;
        Destination = data.destination;

        if (data.resourcesInShip != null)
        {
            Ship.resourcesModule = new ResourcesModule(data.resourcesInShip);
        }

        var watchFactory = new WatchFactory();

        travelFactory = watchFactory.CreateTravelFactory();

        if (dockState == DockState.Building)
        {
            TripClock = travelFactory.CreateTripClock(data.buildTimeLeft);
        }
    }
예제 #12
0
        public override void OnResponseReceived(dynamic data)
        {
            KCDatabase db = KCDatabase.Instance;


            //api_material
            db.Material.LoadFromResponse(APIName, data.api_material);

            //api_basic
            db.Admiral.LoadFromResponse(APIName, data.api_basic);

            //api_ship
            db.Ships.Clear();
            foreach (var elem in data.api_ship)
            {
                var a = new ShipData();
                a.LoadFromResponse(APIName, elem);
                db.Ships.Add(a);
            }


            //api_ndock
            foreach (var elem in data.api_ndock)
            {
                int id = (int)elem.api_id;

                if (!db.Docks.ContainsKey(id))
                {
                    var a = new DockData();
                    a.LoadFromResponse(APIName, elem);
                    db.Docks.Add(a);
                }
                else
                {
                    db.Docks[id].LoadFromResponse(APIName, elem);
                }
            }

            //api_deck_port
            db.Fleet.LoadFromResponse(APIName, data.api_deck_port);
            db.Fleet.CombinedFlag = data.api_combined_flag() ? (int)data.api_combined_flag : 0;


            // 基地航空隊 配置転換系の処理
            if (data.api_plane_info() && data.api_plane_info.api_base_convert_slot())
            {
                var prev    = db.RelocatedEquipments.Keys.ToArray();
                var current = (int[])data.api_plane_info.api_base_convert_slot;

                foreach (int deleted in prev.Except(current))
                {
                    db.RelocatedEquipments.Remove(deleted);
                }

                foreach (int added in current.Except(prev))
                {
                    db.RelocatedEquipments.Add(new RelocationData(added, DateTime.Now));
                }
            }
            else
            {
                db.RelocatedEquipments.Clear();
            }

            db.Battle.LoadFromResponse(APIName, data);

            base.OnResponseReceived((object)data);
        }
예제 #13
0
        public override void OnResponseReceived(dynamic data)
        {
            KCDatabase db = KCDatabase.Instance;

            db.Fleet.EvacuatePreviousShips();


            //api_material
            db.Material.LoadFromResponse(APIName, data.api_material);

            //api_basic
            db.Admiral.LoadFromResponse(APIName, data.api_basic);

            //api_ship
            db.Ships.Clear();
            foreach (var elem in data.api_ship)
            {
                var a = new ShipData();
                a.LoadFromResponse(APIName, elem);
                db.Ships.Add(a);
            }


            //api_ndock
            foreach (var elem in data.api_ndock)
            {
                int id = (int)elem.api_id;

                if (!db.Docks.ContainsKey(id))
                {
                    var a = new DockData();
                    a.LoadFromResponse(APIName, elem);
                    db.Docks.Add(a);
                }
                else
                {
                    db.Docks[id].LoadFromResponse(APIName, elem);
                }
            }

            //api_deck_port
            db.Fleet.LoadFromResponse(APIName, data.api_deck_port);
            db.Fleet.CombinedFlag = data.api_combined_flag() ? (int)data.api_combined_flag : 0;

            if (Utility.Configuration.Config.Control.EnableDiscordRPC)
            {
                DiscordFormat dataForWS = Instance.data;
                dataForWS.top = Utility.Configuration.Config.Control.DiscordRPCMessage.Replace("{{secretary}}", db.Fleet[1].MembersInstance[0].Name);

                dataForWS.bot = new List <string>();

                if (db.Admiral.Senka != null)
                {
                    dataForWS.bot.Add(string.Format("Rank {0} on {1}", db.Admiral.Senka, db.Server.Name));
                }
                else
                {
                    dataForWS.bot.Add("Rank data not loaded");
                }

                if (Utility.Configuration.Config.Control.DiscordRPCShowFCM)
                {
                    dataForWS.bot.Add(new StringBuilder("First class medals: ").Append(db.Admiral.Medals).ToString());
                }


                dataForWS.large = string.Format("{0} (HQ Level {1})", db.Admiral.AdmiralName, db.Admiral.Level);

                dataForWS.small = db.Admiral.RankString;
            }


            // 基地航空隊 配置転換系の処理
            if (data.api_plane_info() && data.api_plane_info.api_base_convert_slot())
            {
                var prev    = db.RelocatedEquipments.Keys.ToArray();
                var current = (int[])data.api_plane_info.api_base_convert_slot;

                foreach (int deleted in prev.Except(current))
                {
                    db.RelocatedEquipments.Remove(deleted);
                }

                foreach (int added in current.Except(prev))
                {
                    db.RelocatedEquipments.Add(new RelocationData(added, DateTime.Now));
                }
            }
            else
            {
                db.RelocatedEquipments.Clear();
            }

            db.Battle.LoadFromResponse(APIName, data);

            base.OnResponseReceived((object)data);
        }
예제 #14
0
        public override void OnResponseReceived(dynamic data)
        {
            KCDatabase db = KCDatabase.Instance;


            //api_material
            db.Material.LoadFromResponse(APIName, data.api_material);

            //api_basic
            db.Admiral.LoadFromResponse(APIName, data.api_basic);

            //api_ship
            db.Ships.Clear();
            foreach (var elem in data.api_ship)
            {
                var a = new ShipData();
                a.LoadFromResponse(APIName, elem);
                db.Ships.Add(a);
            }


            //api_ndock
            foreach (var elem in data.api_ndock)
            {
                int id = (int)elem.api_id;

                if (!db.Docks.ContainsKey(id))
                {
                    var a = new DockData();
                    a.LoadFromResponse(APIName, elem);
                    db.Docks.Add(a);
                }
                else
                {
                    db.Docks[id].LoadFromResponse(APIName, elem);
                }
            }

            //api_deck_port
            db.Fleet.LoadFromResponse(APIName, data.api_deck_port);
            db.Fleet.CombinedFlag = data.api_combined_flag() ? (int)data.api_combined_flag : 0;


            // 基地航空隊 配置転換系の処理
            if (data.api_event_object() && data.api_event_object.api_base_convert_slot())
            {
                var prev = new HashSet <int>(BaseAirCorpsData.RelocatedEquipments);
                BaseAirCorpsData.SetRelocatedEquipments((int[])data.api_event_object.api_base_convert_slot);

                foreach (int deleted in prev.Except(BaseAirCorpsData.RelocatedEquipments))
                {
                    db.Equipments[deleted].RelocatedTime = DateTime.MinValue;
                }

                foreach (int added in BaseAirCorpsData.RelocatedEquipments.Except(prev))
                {
                    db.Equipments[added].RelocatedTime = DateTime.Now;
                }
            }
            else
            {
                foreach (int deleted in BaseAirCorpsData.RelocatedEquipments)
                {
                    db.Equipments[deleted].RelocatedTime = DateTime.MinValue;
                }

                BaseAirCorpsData.RelocatedEquipments.Clear();
            }

            db.Battle.LoadFromResponse(APIName, data);

            base.OnResponseReceived((object)data);
        }