public bool Save(TSPlayer player) { if (player == null) { return(false); } RecipeData data; return((data = player.GetRecipeData()) != null && SaveSlot(player.Name, data)); }
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."); } } } } }