static bool Prefix(ref CookingStation __instance, ref ZNetView ___m_nview, Humanoid user, bool hold) { if (hold) { return(false); } Traverse t_cookingStation = Traverse.Create(__instance); ZDO zdo = ___m_nview.GetZDO(); for (int slot = 0; slot < __instance.m_slots.Length; ++slot) { string itemName = zdo.GetString(nameof(slot) + slot); bool isItemDone = t_cookingStation.Method("IsItemDone", itemName).GetValue <bool>(); if (itemName != "" && itemName != __instance.m_overCookedItem.name && isItemDone) { JustAnotherCookingSkill.raiseCookingSkill(user, JustAnotherCookingSkill.cookingStaticExperienceGain.Value * 0.5f); string qualityPrefix = JustAnotherCookingSkill.getQualityBasedOnSkill(user); // check if such object exist string qualifyMealName = qualityPrefix + itemName; if (Prefab.Cache.GetPrefab <ItemDrop>(qualifyMealName) == null) { Log.LogError($"No object registered for qualify meal: {qualifyMealName}"); return(true); } // instead of processing normal food, we spawn qualified variant MethodInfo method = __instance.GetType().GetMethod("SpawnItem"); if (method == null) { Log.LogError("Method SpawnItem does not exist on type CookingStation"); return(true); } method.Invoke(__instance, new object[] { qualifyMealName }); zdo.Set("slot" + slot, ""); ___m_nview.InvokeRPC(ZNetView.Everybody, "SetSlotVisual", new object[] { slot, "" }); // Unfortunately we replace this hook totally and extra modifications will conflict on those. I gonna find better way return(false); } } return(true); }
public static bool Prefix(InventoryGui __instance, ref Recipe ___m_craftRecipe, ref ItemDrop.ItemData ___m_craftUpgradeItem, Player player) { if (___m_craftRecipe == null) { return(true); } bool isCauldronRecipe = ___m_craftRecipe.m_craftingStation?.m_name == "$piece_cauldron"; bool haveRequirements = player.HaveRequirements(___m_craftRecipe, false, 1) || player.NoCostCheat(); if (!isCauldronRecipe || !haveRequirements || ___m_craftUpgradeItem != null) { // thats not our case return(true); } if (!player.GetInventory().HaveEmptySlot()) { return(false); // weird way, but as temp solution } // isCauldronRecipe + food which has m_maxQuality is our way to figure out that this food is affected by our module if (___m_craftRecipe.m_item.m_itemData.m_shared.m_maxQuality == Meals.Cooking.qualityPrefixes.Length) { JustAnotherCookingSkill.raiseCookingSkill(player, JustAnotherCookingSkill.cauldronStaticExperienceGain.Value * 0.5f); string itemName = ___m_craftRecipe.m_item.gameObject.name; string qualityPrefix = JustAnotherCookingSkill.getQualityBasedOnSkill(player); // check if such object exist // TODO; /** * string qualityMealName = qualityPrefix + itemName; * GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(qualityMealName); * if (itemPrefab == null) * { * Log($"No prefab registered for qualify meal: {qualityMealName}"); * return true; * } * * ItemDrop qualityItemDrop = ObjectManager.Instance.GetItemDrop(qualityMealName); * * if (player.GetInventory().AddItem(qualityMealName, ___m_craftRecipe.m_amount, qualityItemDrop.m_itemData.m_quality, 0, player.GetPlayerID(), player.GetPlayerName()) != null) * { * if (!player.NoCostCheat()) * { * player.ConsumeResources(___m_craftRecipe.m_resources, 1); * } * * ReflectionUtils.InvokePrivate(__instance, "UpdateCraftingPanel", new object[] { false }); * } * * CraftingStation currentCraftingStation = Player.m_localPlayer.GetCurrentCraftingStation(); * if (currentCraftingStation) * { * currentCraftingStation.m_craftItemDoneEffects.Create(player.transform.position, Quaternion.identity, null, 1f); * } * * Game.instance.GetPlayerProfile().m_playerStats.m_crafts++; * Gogan.LogEvent("Game", "Crafted", itemName, (long)1); * * return false; // we have already crafted our recipe, skip origin method **/ } return(true); }