예제 #1
0
        public bool Save(TSPlayer player)
        {
            if (player == null)
            {
                return(false);
            }

            RecipeData data;

            return((data = player.GetRecipeData()) != null && SaveSlot(player.Name, data));
        }
예제 #2
0
        void OnGetData(GetDataEventArgs args)
        {
            if (config.CraftFromInventory)
            {
                return;
            }

            if (args.MsgID == PacketTypes.ItemDrop)
            {
                if (args.Handled)
                {
                    return;
                }

                using (var data = new MemoryStream(args.Msg.readBuffer, args.Index, args.Length))
                {
                    Int16 id      = data.ReadInt16();
                    float posx    = data.ReadSingle();
                    float posy    = data.ReadSingle();
                    float velx    = data.ReadSingle();
                    float vely    = data.ReadSingle();
                    Int16 stacks  = data.ReadInt16();
                    int   prefix  = data.ReadByte();
                    bool  nodelay = data.ReadBoolean();
                    Int16 netid   = data.ReadInt16();

                    Item item = new Item();
                    item.SetDefaults(netid);

                    if (id != 400)
                    {
                        return;
                    }

                    TSPlayer   tsplayer = TShock.Players[args.Msg.whoAmI];
                    RecipeData recData;
                    if (tsplayer != null && tsplayer.Active && (recData = tsplayer.GetRecipeData()) != null && recData.activeRecipe != null)
                    {
                        List <Ingredient> fulfilledIngredient = new List <Ingredient>();
                        foreach (Ingredient ing in recData.activeIngredients)
                        {
                            //ing.prefix == -1 means accepts any prefix
                            if (ing.name == item.Name && (ing.prefix == -1 || ing.prefix == prefix))
                            {
                                ing.stack -= stacks;

                                if (ing.stack > 0)
                                {
                                    tsplayer.SendInfoMessage("Drop another {0}.", Utils.FormatItem((Item)ing));
                                    if (recData.droppedItems.Exists(i => i.name == ing.name))
                                    {
                                        recData.droppedItems.Find(i => i.name == ing.name).stack += stacks;
                                    }
                                    else
                                    {
                                        recData.droppedItems.Add(new RecItem(item.Name, stacks, prefix));
                                    }
                                    args.Handled = true;
                                    return;
                                }
                                else if (ing.stack < 0)
                                {
                                    tsplayer.SendInfoMessage("Giving back {0}.", Utils.FormatItem((Item)ing));
                                    tsplayer.GiveItem(item.type, item.Name, item.width, item.height, Math.Abs(ing.stack), prefix);
                                    if (recData.droppedItems.Exists(i => i.name == ing.name))
                                    {
                                        recData.droppedItems.Find(i => i.name == ing.name).stack += (stacks + ing.stack);
                                    }
                                    else
                                    {
                                        recData.droppedItems.Add(new RecItem(item.Name, stacks + ing.stack, prefix));
                                    }
                                    foreach (Ingredient ingr in recData.activeIngredients)
                                    {
                                        if ((ingr.group == 0 && ingr.name == ing.name) || (ingr.group != 0 && ingr.group == ing.group))
                                        {
                                            fulfilledIngredient.Add(ingr);
                                        }
                                    }
                                    args.Handled = true;
                                }
                                else
                                {
                                    tsplayer.SendInfoMessage("Dropped {0}.", Utils.FormatItem((Item)ing, stacks));
                                    if (recData.droppedItems.Exists(i => i.name == ing.name))
                                    {
                                        recData.droppedItems.Find(i => i.name == ing.name).stack += stacks;
                                    }
                                    else
                                    {
                                        recData.droppedItems.Add(new RecItem(item.Name, stacks, prefix));
                                    }
                                    foreach (Ingredient ingr in recData.activeIngredients)
                                    {
                                        if ((ingr.group == 0 && ingr.name == ing.name) || (ingr.group != 0 && ingr.group == ing.group))
                                        {
                                            fulfilledIngredient.Add(ingr);
                                        }
                                    }
                                    args.Handled = true;
                                }
                            }
                        }

                        if (fulfilledIngredient.Count < 1)
                        {
                            return;
                        }

                        recData.activeIngredients.RemoveAll(i => fulfilledIngredient.Contains(i));

                        foreach (Ingredient ing in recData.activeRecipe.ingredients)
                        {
                            if (ing.name == item.Name && ing.prefix == -1)
                            {
                                ing.prefix = prefix;
                            }
                        }

                        if (recData.activeIngredients.Count < 1)
                        {
                            List <Product> lDetPros = Utils.DetermineProducts(recData.activeRecipe.products);
                            foreach (Product pro in lDetPros)
                            {
                                Item product = new Item();
                                product.SetDefaults(TShock.Utils.GetItemByIdOrName(pro.name).First().netID);
                                //itm.Prefix(-1) means at least a 25% chance to hit prefix = 0. if < -1, even chances.
                                product.Prefix(pro.prefix);
                                pro.prefix = product.prefix;
                                tsplayer.GiveItem(product.type, product.Name, product.width, product.height, pro.stack, product.prefix);
                                tsplayer.SendSuccessMessage("Received {0}.", Utils.FormatItem((Item)pro));
                            }
                            List <RecItem> prods = new List <RecItem>();
                            lDetPros.ForEach(i => prods.Add(new RecItem(i.name, i.stack, i.prefix)));
                            Log.Recipe(new LogRecipe(recData.activeRecipe.name, recData.droppedItems, prods), tsplayer.Name);
                            // Commands :o (NullReferenceException-free :l)
                            recData.activeRecipe.Clone().ExecuteCommands(tsplayer);
                            recData.activeRecipe = null;
                            recData.droppedItems.Clear();
                            tsplayer.SendInfoMessage("Finished crafting.");
                        }
                    }
                }
            }
        }