void cSlotAreaCrafting::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem) { if (a_ClickAction == caMiddleClick) { MiddleClicked(a_Player, a_SlotNum); return; } // Override for craft result slot if (a_SlotNum == 0) { if ((a_ClickAction == caShiftLeftClick) || (a_ClickAction == caShiftRightClick)) { ShiftClickedResult(a_Player); } else if ((a_ClickAction == caDropKey) || (a_ClickAction == caCtrlDropKey)) { DropClickedResult(a_Player); } else { ClickedResult(a_Player); } return; } super::Clicked(a_Player, a_SlotNum, a_ClickAction, a_ClickedItem); UpdateRecipe(a_Player); }
void cSlotAreaCrafting::ClickedResult(cPlayer & a_Player) { const cItem * ResultSlot = GetSlot(0, a_Player); cItem & DraggingItem = a_Player.GetDraggingItem(); // Get the current recipe: cCraftingRecipe & Recipe = GetRecipeForPlayer(a_Player); cItem * PlayerSlots = GetPlayerSlots(a_Player) + 1; cCraftingGrid Grid(PlayerSlots, m_GridSize, m_GridSize); // If possible, craft: if (DraggingItem.IsEmpty()) { DraggingItem = Recipe.GetResult(); Recipe.ConsumeIngredients(Grid); Grid.CopyToItems(PlayerSlots); } else if (DraggingItem.IsEqual(Recipe.GetResult())) { cItemHandler * Handler = ItemHandler(Recipe.GetResult().m_ItemType); if (DraggingItem.m_ItemCount + Recipe.GetResult().m_ItemCount <= Handler->GetMaxStackSize()) { DraggingItem.m_ItemCount += Recipe.GetResult().m_ItemCount; Recipe.ConsumeIngredients(Grid); Grid.CopyToItems(PlayerSlots); } } // Get the new recipe and update the result slot: UpdateRecipe(a_Player); // We're done. Send all changes to the client and bail out: m_ParentWindow.BroadcastWholeWindow(); }
void cSlotAreaCrafting::SetSlot(int a_SlotNum, cPlayer & a_Player, const cItem & a_Item) { // Update the recipe after setting the slot, if the slot is not the result slot: super::SetSlot(a_SlotNum, a_Player, a_Item); if (a_SlotNum != 0) { UpdateRecipe(a_Player); } }
void RecipeEditor::MessageReceived(BMessage *msg) { switch(msg->what) { case M_QUIT_APP: { be_app->PostMessage(B_QUIT_REQUESTED); break; } case M_CATEGORY_CHANGED: { BString name; if(msg->FindString("name",&name)==B_OK) fCategory = name; break; } case M_EDIT_RECIPE: { BMenuItem *item = fCategories->FindMarked(); if(fCategory.Compare(item->Label()) == 0) { UpdateRecipe(fNumber, fCategory.String(), fNameBox->Text(), fIngredientBox->Text(), fDirectionsBox->Text()); } else { // we're also recategorizing the recipe, so we'll just delete the old // one and add it to the new one DeleteRecipe(fNumber, fCategory.String()); AddRecipe(fCategory.String(), fNameBox->Text(), fIngredientBox->Text(), fDirectionsBox->Text()); } fMessenger.SendMessage(M_SET_RECIPE); PostMessage(B_QUIT_REQUESTED); break; } case M_ADD_RECIPE: { if(fCategory.CountChars() < 1) { BMenuItem *item = fCategories->FindMarked(); if(item) fCategory = item->Label(); else fCategory = "Misc"; } AddRecipe(fCategory.String(), fNameBox->Text(), fIngredientBox->Text(), fDirectionsBox->Text()); PostMessage(B_QUIT_REQUESTED); break; } default: BWindow::MessageReceived(msg); } }
void cSlotAreaCrafting::DropClickedResult(cPlayer & a_Player) { // Get the current recipe: cCraftingRecipe & Recipe = GetRecipeForPlayer(a_Player); const cItem & Result = Recipe.GetResult(); cItem * PlayerSlots = GetPlayerSlots(a_Player) + 1; cCraftingGrid Grid(PlayerSlots, m_GridSize, m_GridSize); a_Player.TossPickup(Result); Recipe.ConsumeIngredients(Grid); Grid.CopyToItems(PlayerSlots); HandleCraftItem(Result, a_Player); UpdateRecipe(a_Player); }
void cSlotAreaCrafting::ShiftClickedResult(cPlayer & a_Player) { cItem Result(*GetSlot(0, a_Player)); if (Result.IsEmpty()) { return; } cItem * PlayerSlots = GetPlayerSlots(a_Player) + 1; for (;;) { // Try distributing the result. If it fails, bail out: cItem ResultCopy(Result); m_ParentWindow.DistributeStack(ResultCopy, a_Player, this, false); if (!ResultCopy.IsEmpty()) { // Couldn't distribute all of it. Bail out return; } // Distribute the result, this time for real: ResultCopy = Result; m_ParentWindow.DistributeStack(ResultCopy, a_Player, this, true); // Remove the ingredients from the crafting grid and update the recipe: cCraftingRecipe & Recipe = GetRecipeForPlayer(a_Player); cCraftingGrid Grid(PlayerSlots, m_GridSize, m_GridSize); Recipe.ConsumeIngredients(Grid); Grid.CopyToItems(PlayerSlots); UpdateRecipe(a_Player); // Broadcast the window, we sometimes move items to different locations than Vanilla, causing needless desyncs: m_ParentWindow.BroadcastWholeWindow(); // If the recipe has changed, bail out: if (!Recipe.GetResult().IsEqual(Result)) { return; } } }
void cSlotAreaCrafting::ShiftClickedResult(cPlayer & a_Player) { cItem Result(*GetSlot(0, a_Player)); if (Result.IsEmpty()) { return; } cItem * PlayerSlots = GetPlayerSlots(a_Player) + 1; do { // Try distributing the result. If it fails, bail out: cItem ResultCopy(Result); m_ParentWindow.DistributeStack(ResultCopy, a_Player, this, false); if (!ResultCopy.IsEmpty()) { // Couldn't distribute all of it. Bail out return; } // Distribute the result, this time for real: ResultCopy = Result; m_ParentWindow.DistributeStack(ResultCopy, a_Player, this, true); // Remove the ingredients from the crafting grid and update the recipe: cCraftingRecipe & Recipe = GetRecipeForPlayer(a_Player); cCraftingGrid Grid(PlayerSlots, m_GridSize, m_GridSize); Recipe.ConsumeIngredients(Grid); Grid.CopyToItems(PlayerSlots); UpdateRecipe(a_Player); if (!Recipe.GetResult().IsEqual(Result)) { // The recipe has changed, bail out return; } } while (true); }