コード例 #1
0
        //Craft the item
        void craft_Clicked(Base sender, ClickedEventArgs arguments)
        {
            //This shouldn't be client side :(
            //Quickly Look through the inventory and create a catalog of what items we have, and how many
            var availableItemQuantities = new Dictionary <Guid, int>();

            foreach (var item in Globals.Me.Inventory)
            {
                if (item != null)
                {
                    if (availableItemQuantities.ContainsKey(item.ItemId))
                    {
                        availableItemQuantities[item.ItemId] += item.Quantity;
                    }
                    else
                    {
                        availableItemQuantities.Add(item.ItemId, item.Quantity);
                    }
                }
            }

            var craftDescriptor = CraftBase.Get(mCraftId);
            var canCraft        = craftDescriptor?.Ingredients != null;

            if (canCraft)
            {
                foreach (var ingredient in craftDescriptor.Ingredients)
                {
                    if (!availableItemQuantities.TryGetValue(ingredient.ItemId, out var availableQuantity))
                    {
                        canCraft = false;

                        break;
                    }

                    if (availableQuantity < ingredient.Quantity)
                    {
                        canCraft = false;

                        break;
                    }

                    availableItemQuantities[ingredient.ItemId] -= ingredient.Quantity;
                }
            }

            if (canCraft)
            {
                Crafting  = true;
                mBarTimer = Globals.System.GetTimeMs();
                PacketSender.SendCraftItem(mCraftId);
                mCraftWindow.IsClosable = false;

                return;
            }

            ChatboxMsg.AddMessage(new ChatboxMsg(Strings.Crafting.incorrectresources, Color.Red));
        }
コード例 #2
0
 private void lstAvailableCrafts_SelectedValueChanged(object sender, EventArgs e)
 {
     mEditorItem.Crafts.Clear();
     for (var i = 0; i < lstAvailableCrafts.Items.Count; i++)
     {
         if (lstAvailableCrafts.CheckedIndices.Contains(i))
         {
             mEditorItem.Crafts.Add(CraftBase.IdFromList(i));
         }
     }
 }
コード例 #3
0
 protected override void GameObjectUpdatedDelegate(GameObjectType type)
 {
     if (type == GameObjectType.Crafts)
     {
         InitEditor();
         if (mEditorItem != null && !DatabaseObject <CraftBase> .Lookup.Values.Contains(mEditorItem))
         {
             mEditorItem = null;
             UpdateEditor();
         }
     }
 }
コード例 #4
0
        private void lstCrafts_AfterSelect(object sender, TreeViewEventArgs e)
        {
            if (mChangingName)
            {
                return;
            }

            if (lstCrafts.SelectedNode == null || lstCrafts.SelectedNode.Tag == null)
            {
                return;
            }

            mEditorItem = CraftBase.Get((Guid)lstCrafts.SelectedNode.Tag);
            UpdateEditor();
        }
コード例 #5
0
        private void UpdateEditor()
        {
            if (mEditorItem != null)
            {
                pnlContainer.Show();

                txtName.Text = mEditorItem.Name;

                cmbFolder.Text = mEditorItem.Folder;

                //Populate the checked list box
                lstAvailableCrafts.Items.Clear();
                lstAvailableCrafts.Items.AddRange(CraftBase.Names);

                //Clean up crafts array

                foreach (var val in mEditorItem.Crafts)
                {
                    var listIndex = CraftBase.ListIndex(val);
                    if (listIndex > -1)
                    {
                        lstAvailableCrafts.SetItemCheckState(listIndex, CheckState.Checked);
                    }
                }

                if (mChanged.IndexOf(mEditorItem) == -1)
                {
                    mChanged.Add(mEditorItem);
                    mEditorItem.MakeBackup();
                }
            }
            else
            {
                pnlContainer.Hide();
            }

            UpdateToolStripItems();
        }
コード例 #6
0
        //Update the crafting bar
        public void Update()
        {
            if (!mInitialized)
            {
                for (var i = 0; i < Globals.ActiveCraftingTable?.Crafts?.Count; ++i)
                {
                    var activeCraft = CraftBase.Get(Globals.ActiveCraftingTable.Crafts[i]);
                    if (activeCraft == null)
                    {
                        continue;
                    }

                    var tmpRow = mRecipes?.AddRow(i + 1 + ") " + ItemBase.GetName(activeCraft.ItemId));
                    if (tmpRow == null)
                    {
                        continue;
                    }

                    tmpRow.UserData       = Globals.ActiveCraftingTable.Crafts[i];
                    tmpRow.DoubleClicked += tmpNode_DoubleClicked;
                    tmpRow.Clicked       += tmpNode_DoubleClicked;
                    tmpRow.SetTextColor(Color.White);
                    tmpRow.RenderColor = new Color(50, 255, 255, 255);
                }

                //Load the craft data
                if (Globals.ActiveCraftingTable?.Crafts?.Count > 0)
                {
                    LoadCraftItems(Globals.ActiveCraftingTable.Crafts[0]);
                }

                mInitialized = true;
            }

            if (!Crafting)
            {
                mBar.Width = 0;

                return;
            }

            var craft = CraftBase.Get(mCraftId);

            if (craft == null)
            {
                return;
            }

            var delta = Globals.System.GetTimeMs() - mBarTimer;

            if (delta > craft.Time)
            {
                delta    = craft.Time;
                Crafting = false;
                if (mCraftWindow != null)
                {
                    mCraftWindow.IsClosable = true;
                }

                LoadCraftItems(mCraftId);
                mBar.Width = 0;
            }

            var ratio = craft.Time == 0 ? 0 : Convert.ToDecimal(delta) / Convert.ToDecimal(craft.Time);
            var width = ratio * mBarContainer?.Width ?? 0;

            if (mBar == null)
            {
                return;
            }

            mBar.SetTextureRect(
                0, 0, Convert.ToInt32(ratio * mBar.Texture?.GetWidth() ?? 0), mBar.Texture?.GetHeight() ?? 0
                );

            mBar.Width = Convert.ToInt32(width);
        }
コード例 #7
0
        private void LoadCraftItems(Guid id)
        {
            //Combined item
            mCraftId = id;
            if (mCombinedItem != null)
            {
                mCraftWindow.Children.Remove(mCombinedItem.Container);
            }

            //Clear the old item description box
            if (mCombinedItem != null && mCombinedItem.DescWindow != null)
            {
                mCombinedItem.DescWindow.Dispose();
            }

            if (!Globals.ActiveCraftingTable.Crafts.Contains(id))
            {
                return;
            }

            var craft = Globals.ActiveCraftingTable.Crafts.Get(id);

            if (craft == null)
            {
                return;
            }

            mCombinedItem = new RecipeItem(this, new CraftIngredient(craft.ItemId, 0))
            {
                Container = new ImagePanel(mCraftWindow, "CraftedItem")
            };

            mCombinedItem.Setup("CraftedItemIcon");
            mCombinedValue = new Label(mCombinedItem.Container, "CraftedItemQuantity");

            mCombinedItem.Container.LoadJsonUi(GameContentManager.UI.InGame, Graphics.Renderer.GetResolutionString());

            mCombinedItem.LoadItem();
            mCombinedValue.Show();
            var quantity = Math.Max(craft.Quantity, 1);
            var itm      = ItemBase.Get(craft.ItemId);

            if (itm == null || !itm.IsStackable)
            {
                quantity = 1;
            }

            mCombinedValue.Text = quantity.ToString();

            for (var i = 0; i < mItems.Count; i++)
            {
                //Clear the old item description box
                if (mItems[i].DescWindow != null)
                {
                    mItems[i].DescWindow.Dispose();
                }

                mItemContainer.RemoveChild(mItems[i].Container, true);
            }

            mItems.Clear();
            mValues.Clear();

            //Quickly Look through the inventory and create a catalog of what items we have, and how many
            var itemdict = new Dictionary <Guid, int>();

            foreach (var item in Globals.Me.Inventory)
            {
                if (item != null)
                {
                    if (itemdict.ContainsKey(item.ItemId))
                    {
                        itemdict[item.ItemId] += item.Quantity;
                    }
                    else
                    {
                        itemdict.Add(item.ItemId, item.Quantity);
                    }
                }
            }

            for (var i = 0; i < craft.Ingredients.Count; i++)
            {
                mItems.Add(new RecipeItem(this, craft.Ingredients[i]));
                mItems[i].Container = new ImagePanel(mItemContainer, "CraftingIngredient");
                mItems[i].Setup("IngredientItemIcon");

                var lblTemp = new Label(mItems[i].Container, "IngredientItemValue");

                var onHand = 0;
                if (itemdict.ContainsKey(craft.Ingredients[i].ItemId))
                {
                    onHand = itemdict[craft.Ingredients[i].ItemId];
                }

                lblTemp.Text = onHand + "/" + craft.Ingredients[i].Quantity;
                mValues.Add(lblTemp);

                mItems[i].Container.LoadJsonUi(GameContentManager.UI.InGame, Graphics.Renderer.GetResolutionString());

                mItems[i].LoadItem();

                var xPadding = mItems[i].Container.Margin.Left + mItems[i].Container.Margin.Right;
                var yPadding = mItems[i].Container.Margin.Top + mItems[i].Container.Margin.Bottom;
                mItems[i]
                .Container.SetPosition(
                    i %
                    ((mItemContainer.Width - mItemContainer.GetVerticalScrollBar().Width) /
                     (mItems[i].Container.Width + xPadding)) *
                    (mItems[i].Container.Width + xPadding) +
                    xPadding,
                    i /
                    ((mItemContainer.Width - mItemContainer.GetVerticalScrollBar().Width) /
                     (mItems[i].Container.Width + xPadding)) *
                    (mItems[i].Container.Height + yPadding) +
                    yPadding
                    );
            }

            //If crafting & we no longer have the items for the craft then stop!
            if (Crafting)
            {
                var cancraft = true;
                foreach (var c in CraftBase.Get(mCraftId).Ingredients)
                {
                    if (itemdict.ContainsKey(c.ItemId))
                    {
                        if (itemdict[c.ItemId] >= c.Quantity)
                        {
                            itemdict[c.ItemId] -= c.Quantity;
                        }
                        else
                        {
                            cancraft = false;

                            break;
                        }
                    }
                    else
                    {
                        cancraft = false;

                        break;
                    }
                }

                if (!cancraft)
                {
                    Crafting = false;
                    mCraftWindow.IsClosable = true;
                    mBar.Width = 0;
                    ChatboxMsg.AddMessage(new ChatboxMsg(Strings.Crafting.incorrectresources, Color.Red));

                    return;
                }
            }
        }
コード例 #8
0
        public void InitEditor()
        {
            var selectedId  = Guid.Empty;
            var folderNodes = new Dictionary <string, TreeNode>();

            if (lstCrafts.SelectedNode != null && lstCrafts.SelectedNode.Tag != null)
            {
                selectedId = (Guid)lstCrafts.SelectedNode.Tag;
            }

            lstCrafts.Nodes.Clear();

            //Collect folders
            var mFolders = new List <string>();

            foreach (var itm in CraftBase.Lookup)
            {
                if (!string.IsNullOrEmpty(((CraftBase)itm.Value).Folder) &&
                    !mFolders.Contains(((CraftBase)itm.Value).Folder))
                {
                    mFolders.Add(((CraftBase)itm.Value).Folder);
                    if (!mKnownFolders.Contains(((CraftBase)itm.Value).Folder))
                    {
                        mKnownFolders.Add(((CraftBase)itm.Value).Folder);
                    }
                }
            }

            mFolders.Sort();
            mKnownFolders.Sort();
            cmbFolder.Items.Clear();
            cmbFolder.Items.Add("");
            cmbFolder.Items.AddRange(mKnownFolders.ToArray());

            lstCrafts.Sorted = !btnChronological.Checked;

            if (!btnChronological.Checked && !CustomSearch())
            {
                foreach (var folder in mFolders)
                {
                    var node = lstCrafts.Nodes.Add(folder);
                    node.ImageIndex         = 0;
                    node.SelectedImageIndex = 0;
                    folderNodes.Add(folder, node);
                }
            }

            foreach (var itm in CraftBase.ItemPairs)
            {
                var node = new TreeNode(itm.Value);
                node.Tag                = itm.Key;
                node.ImageIndex         = 1;
                node.SelectedImageIndex = 1;

                var folder = CraftBase.Get(itm.Key).Folder;
                if (!string.IsNullOrEmpty(folder) && !btnChronological.Checked && !CustomSearch())
                {
                    var folderNode = folderNodes[folder];
                    folderNode.Nodes.Add(node);
                    if (itm.Key == selectedId)
                    {
                        folderNode.Expand();
                    }
                }
                else
                {
                    lstCrafts.Nodes.Add(node);
                }

                if (CustomSearch())
                {
                    if (!node.Text.ToLower().Contains(txtSearch.Text.ToLower()))
                    {
                        node.Remove();
                    }
                }

                if (itm.Key == selectedId)
                {
                    lstCrafts.SelectedNode = node;
                }
            }

            var selectedNode = lstCrafts.SelectedNode;

            if (!btnChronological.Checked)
            {
                lstCrafts.Sort();
            }

            lstCrafts.SelectedNode = selectedNode;
            foreach (var node in mExpandedFolders)
            {
                if (folderNodes.ContainsKey(node))
                {
                    folderNodes[node].Expand();
                }
            }
        }
コード例 #9
0
        //GameObjectPacket
        private static void HandlePacket(GameObjectPacket packet)
        {
            var id      = packet.Id;
            var deleted = packet.Deleted;
            var json    = "";

            if (!packet.Deleted)
            {
                json = packet.Data;
            }

            switch (packet.Type)
            {
            case GameObjectType.Animation:
                if (deleted)
                {
                    var anim = AnimationBase.Get(id);
                    anim.Delete();
                }
                else
                {
                    var anim = new AnimationBase(id);
                    anim.Load(json);
                    try
                    {
                        AnimationBase.Lookup.Set(id, anim);
                    }
                    catch (Exception exception)
                    {
                        Log.Error($"Another mystery NPE. [Lookup={AnimationBase.Lookup}]");
                        if (exception.InnerException != null)
                        {
                            Log.Error(exception.InnerException);
                        }

                        Log.Error(exception);
                        Log.Error($"{nameof(id)}={id},{nameof(anim)}={anim}");

                        throw;
                    }
                }

                break;

            case GameObjectType.Class:
                if (deleted)
                {
                    var cls = ClassBase.Get(id);
                    cls.Delete();
                }
                else
                {
                    var cls = new ClassBase(id);
                    cls.Load(json);
                    ClassBase.Lookup.Set(id, cls);
                }

                break;

            case GameObjectType.Item:
                if (deleted)
                {
                    var itm = ItemBase.Get(id);
                    itm.Delete();
                }
                else
                {
                    var itm = new ItemBase(id);
                    itm.Load(json);
                    ItemBase.Lookup.Set(id, itm);
                }

                break;

            case GameObjectType.Npc:
                if (deleted)
                {
                    var npc = NpcBase.Get(id);
                    npc.Delete();
                }
                else
                {
                    var npc = new NpcBase(id);
                    npc.Load(json);
                    NpcBase.Lookup.Set(id, npc);
                }

                break;

            case GameObjectType.Projectile:
                if (deleted)
                {
                    var proj = ProjectileBase.Get(id);
                    proj.Delete();
                }
                else
                {
                    var proj = new ProjectileBase(id);
                    proj.Load(json);
                    ProjectileBase.Lookup.Set(id, proj);
                }

                break;

            case GameObjectType.Quest:
                if (deleted)
                {
                    var qst = QuestBase.Get(id);
                    qst.Delete();
                }
                else
                {
                    var qst = new QuestBase(id);
                    qst.Load(json);
                    foreach (var tsk in qst.Tasks)
                    {
                        qst.OriginalTaskEventIds.Add(tsk.Id, tsk.CompletionEventId);
                    }

                    QuestBase.Lookup.Set(id, qst);
                }

                break;

            case GameObjectType.Resource:
                if (deleted)
                {
                    var res = ResourceBase.Get(id);
                    res.Delete();
                }
                else
                {
                    var res = new ResourceBase(id);
                    res.Load(json);
                    ResourceBase.Lookup.Set(id, res);
                }

                break;

            case GameObjectType.Shop:
                if (deleted)
                {
                    var shp = ShopBase.Get(id);
                    shp.Delete();
                }
                else
                {
                    var shp = new ShopBase(id);
                    shp.Load(json);
                    ShopBase.Lookup.Set(id, shp);
                }

                break;

            case GameObjectType.Spell:
                if (deleted)
                {
                    var spl = SpellBase.Get(id);
                    spl.Delete();
                }
                else
                {
                    var spl = new SpellBase(id);
                    spl.Load(json);
                    SpellBase.Lookup.Set(id, spl);
                }

                break;

            case GameObjectType.CraftTables:
                if (deleted)
                {
                    var cft = CraftingTableBase.Get(id);
                    cft.Delete();
                }
                else
                {
                    var cft = new CraftingTableBase(id);
                    cft.Load(json);
                    CraftingTableBase.Lookup.Set(id, cft);
                }

                break;

            case GameObjectType.Crafts:
                if (deleted)
                {
                    var cft = CraftBase.Get(id);
                    cft.Delete();
                }
                else
                {
                    var cft = new CraftBase(id);
                    cft.Load(json);
                    CraftBase.Lookup.Set(id, cft);
                }

                break;

            case GameObjectType.Map:
                //Handled in a different packet
                break;

            case GameObjectType.Event:
                var wasCommon = false;
                if (deleted)
                {
                    var evt = EventBase.Get(id);
                    wasCommon = evt.CommonEvent;
                    evt.Delete();
                }
                else
                {
                    var evt = new EventBase(id);
                    evt.Load(json);
                    wasCommon = evt.CommonEvent;
                    EventBase.Lookup.Set(id, evt);
                }

                if (!wasCommon)
                {
                    return;
                }

                break;

            case GameObjectType.PlayerVariable:
                if (deleted)
                {
                    var pvar = PlayerVariableBase.Get(id);
                    pvar.Delete();
                }
                else
                {
                    var pvar = new PlayerVariableBase(id);
                    pvar.Load(json);
                    PlayerVariableBase.Lookup.Set(id, pvar);
                }

                break;

            case GameObjectType.ServerVariable:
                if (deleted)
                {
                    var svar = ServerVariableBase.Get(id);
                    svar.Delete();
                }
                else
                {
                    var svar = new ServerVariableBase(id);
                    svar.Load(json);
                    ServerVariableBase.Lookup.Set(id, svar);
                }

                break;

            case GameObjectType.Tileset:
                var obj = new TilesetBase(id);
                obj.Load(json);
                TilesetBase.Lookup.Set(id, obj);
                if (Globals.HasGameData && !packet.AnotherFollowing)
                {
                    GameContentManager.LoadTilesets();
                }

                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            GameObjectUpdatedDelegate?.Invoke(packet.Type);
        }
コード例 #10
0
        //Update the crafting bar
        public void Update()
        {
            if (!mInitialized)
            {
                //Quickly Look through the inventory and count the luck stat
                double luck = 0;
                foreach (var equip in Globals.Me.Equipment)
                {
                    if (ItemBase.Get(equip)?.Effect?.Type == EffectType.Luck)
                    {
                        luck += ItemBase.Get(equip).Effect.Percentage;
                    }
                }
                var j = 0;
                for (var i = 0; i < Globals.ActiveCraftingTable?.Crafts?.Count; ++i)
                {
                    var activeCraft = CraftBase.Get(Globals.ActiveCraftingTable.Crafts[i]);
                    if (activeCraft == null)
                    {
                        continue;
                    }
                    if (!Globals.ActiveCraftingTableReqs.Contains(i + "-"))
                    {
                        j++;
                        var tmpRow = mRecipes?.AddRow(j + ") " + ItemBase.GetName(activeCraft.ItemId) + " (" + Math.Min(activeCraft.SuccessRate + (luck / 10), 100) + "%) ");
                        if (tmpRow == null)
                        {
                            continue;
                        }

                        tmpRow.UserData       = Globals.ActiveCraftingTable.Crafts[i];
                        tmpRow.DoubleClicked += tmpNode_DoubleClicked;
                        tmpRow.Clicked       += tmpNode_DoubleClicked;
                        tmpRow.SetTextColor(Color.White);
                        tmpRow.RenderColor = new Color(50, 255, 255, 255);
                    }
                }

                //Load the craft data
                if (Globals.ActiveCraftingTable?.Crafts?.Count > 0)
                {
                    LoadCraftItems(Globals.ActiveCraftingTable.Crafts[0]);
                }

                mInitialized = true;
            }

            //We received green light to craft, continue crafting
            if (Globals.canCraftrq && clickedCraft)
            {
                Crafting  = true;
                mBarTimer = Globals.System.GetTimeMs();
                PacketSender.SendCraftItem(Globals.canCraftitem);
                mCraftWindow.IsClosable = false;
                Globals.canCraftrq      = false;
                Globals.canCraftitem    = Guid.Empty;
                clickedCraft            = false;
                return;
            }

            //Uncomment next lines to have the craftbutton disable if requirements are not met

            /*
             * if (!Globals.canCraftrq)
             * {
             *  mCraft.Disable();
             * }
             *
             * if (Globals.canCraftrq)
             * {
             *  mCraft.Enable();
             * }
             */

            if (!Crafting)
            {
                mBar.Width = 0;

                return;
            }

            var craft = CraftBase.Get(mCraftId);

            if (craft == null)
            {
                return;
            }

            var delta = Globals.System.GetTimeMs() - mBarTimer;

            if (delta > craft.Time)
            {
                delta    = craft.Time;
                Crafting = false;
                if (mCraftWindow != null)
                {
                    mCraftWindow.IsClosable = true;
                }

                LoadCraftItems(mCraftId);
                mBar.Width = 0;
            }

            var ratio = craft.Time == 0 ? 0 : Convert.ToDecimal(delta) / Convert.ToDecimal(craft.Time);
            var width = ratio * mBarContainer?.Width ?? 0;

            if (mBar == null)
            {
                return;
            }

            mBar.SetTextureRect(
                0, 0, Convert.ToInt32(ratio * mBar.Texture?.GetWidth() ?? 0), mBar.Texture?.GetHeight() ?? 0
                );

            mBar.Width = Convert.ToInt32(width);
        }
コード例 #11
0
 private void AssignEditorItem(Guid id)
 {
     mEditorItem = CraftBase.Get(id);
     UpdateEditor();
 }