public static void CloseDevice() { var player = GetLastClosedBy(); if (!GetIsPC(player) || GetIsDM(player)) { return; } var device = OBJECT_SELF; for (var item = GetFirstItemInInventory(device); GetIsObjectValid(item); item = GetNextItemInInventory(device)) { var resref = GetResRef(item); if (CommandResrefs.Contains(resref)) { DestroyObject(item); } else { Item.ReturnItem(player, item); } } // If player is quitting crafting, clear out their state. var state = Craft.GetPlayerCraftingState(player); if (!state.IsOpeningMenu) { Craft.ClearPlayerCraftingState(player); } }
/// <summary> /// Searches a player's inventory for components matching this recipe's requirements. /// </summary> /// <param name="player">The player to search.</param> private static void LoadComponents(uint player) { var device = OBJECT_SELF; var state = Craft.GetPlayerCraftingState(player); var recipe = Craft.GetRecipe(state.SelectedRecipe); for (var item = GetFirstItemInInventory(player); GetIsObjectValid(item); item = GetNextItemInInventory(player)) { var resref = GetResRef(item); if (recipe.Components.ContainsKey(resref)) { Item.ReturnItem(device, item); } } }
public static void TakeItem() { var disturbType = GetInventoryDisturbType(); if (disturbType != DisturbType.Removed) { return; } var player = GetLastDisturbed(); var item = GetInventoryDisturbItem(); var resref = GetResRef(item); var device = OBJECT_SELF; var state = Craft.GetPlayerCraftingState(player); if (state.IsAutoCrafting) { SendMessageToPC(player, ColorToken.Red("You are auto-crafting.")); return; } // Auto-craft item if (resref == AutoCraftItemResref) { Item.ReturnItem(device, item); AutoCraftItem(player); } // Manually craft the item else if (resref == CraftItemResref) { Item.ReturnItem(device, item); CraftItem(player); } // Load components into container else if (resref == LoadComponentsResref) { Item.ReturnItem(device, item); LoadComponents(player); } // Select a different recipe else if (resref == SelectRecipeResref) { Item.ReturnItem(device, item); SelectRecipe(player); } }
public static void MarketTerminalDisturbed() { if (GetInventoryDisturbType() != DisturbType.Added) { return; } var player = GetLastDisturbed(); var playerId = GetObjectUUID(player); var dbPlayer = DB.Get <Player>(playerId); var dbPlayerStore = DB.Get <PlayerStore>(playerId); var item = GetInventoryDisturbItem(); var itemId = GetObjectUUID(item); var serialized = Object.Serialize(item); var listingLimit = 5 + dbPlayer.SeedProgress.Rank * 5; if (dbPlayerStore.ItemsForSale.Count >= listingLimit || // Listing limit reached. GetBaseItemType(item) == BaseItem.Gold || // Gold can't be listed. string.IsNullOrWhiteSpace(GetResRef(item)) || // Items without resrefs can't be listed. GetHasInventory(item)) // Bags and other containers can't be listed. { Item.ReturnItem(player, item); SendMessageToPC(player, "This item cannot be listed."); return; } dbPlayerStore.ItemsForSale.Add(itemId, new PlayerStoreItem { Data = serialized, Name = GetName(item), Price = 0, StackSize = GetItemStackSize(item) }); DB.Set(playerId, dbPlayerStore); DestroyObject(item); SendMessageToPC(player, $"Listing limit: {dbPlayerStore.ItemsForSale.Count} / {5 + dbPlayer.SeedProgress.Rank * 5}"); }