private static bool Prefix(ItemObject item, ref ItemDrop __result) { if (IgnoreItems.allMatchedIDs.Contains(item.ItemDataId)) { ULogger.LogTrace("Dropped item ignored; ID={0}, name={1}", item.ItemDataId, item.ItemBase.Name); __result = ( ItemDrop )null; return(false); } return(true); }
private static void Postfix(Image ___playerIcon, bool ___rotateMap) { if (___playerIcon == null) { ULogger.LogTrace("playerIcon is null, skipping"); return; } if (CameraManager.Instance.SourceCamera == null) { ULogger.LogTrace("SourceCamera is null, skipping"); return; } if (!___rotateMap) { float camRotation = CameraManager.Instance.SourceTransform.eulerAngles.y; ___playerIcon.rectTransform.localEulerAngles = new Vector3(0.0f, 0.0f, -camRotation); } }
private static void Postfix() { var items = ItemPickup.Config.ItemIgnore.Items; if (items.Count == 0 || loaded) { return; } // Yeah yeah, I know, escaping is bad and I should be using query parameters. // I get it. I really do. And normally I would, if I weren't dealing with stupid // needless abstraction layers and crap while patching someone else's product. // But that's what I'm doing. // So I'm not using them. // I hope that hurts you deep down inside, Mr. OMGWHYISNTHEUSINGPARAMETERSOMG. var method = ItemPickup.Config.ItemIgnore.MatchMethod.ToLower(); Func <string, string> escape = s => s.Replace("'", "''"); Func <string, string> nameQueryVal; switch (method) { case "exact": nameQueryVal = name => escape(name); break; case "contains": nameQueryVal = name => $"%{escape( name )}%"; break; case "startswith": nameQueryVal = name => escape(name) + "%"; break; case "endswith": nameQueryVal = name => "%" + escape(name); break; default: ULogger.LogWarn("Invalid MatchMethod value \"{0}\", defaulting to exact", method); method = "exact"; nameQueryVal = name => escape(name); break; } string nameQueryOp = (method != "exact" ? "LIKE" : "="); var lang = ItemPickup.Config.ItemIgnore.Language; if (!validLangs.Contains(lang, StringComparer.OrdinalIgnoreCase)) { ULogger.LogWarn("Invalid Language value \"{0}\", defaulting to English", lang); lang = "English"; } ULogger.LogInfo("Setting up {0} item ignore filters...", items.Count); foreach (var item in items) { ULogger.LogTrace("Processing ignore string \"{0}\"", nameQueryVal(item)); var query = $@" SELECT t.ID Trans_Id, t.{lang}, p.Props_Id, p.Item_Type FROM Translation_hint t INNER JOIN Props_total_table p ON t.ID = p.Props_Name WHERE t.{lang} {nameQueryOp} '{nameQueryVal( item )}'"; SqliteDataReader reader = LocalDb.cur.ExecuteQuery(query); int num = 0; while (reader.Read()) { var trans_id = reader.GetInt32(0); var item_name = reader.GetString(1); var item_id = reader.GetInt32(2); var item_type = reader.GetString(3); ULogger.LogTrace("Item matched; name=\"{0}\", type=\"{1}\", id={2}, tran_id={3}", item_name, item_type, item_id, trans_id); IgnoreItems.allMatchedIDs.Add(item_id); num++; } if (num == 0) { ULogger.LogInfo("Ignore item value \"{0}\" didn't match any items (check spelling?)", item); } } ULogger.LogInfo("Done setting up! There were {0} items matched and will be ignored.", IgnoreItems.allMatchedIDs.Count); }
// Target code (based on v1.1.130102): // UIUtils.ShowNumberSelectMinMax(this.curItem.itemId, 0, Mathf.Max(a, 0), 1, TextMgr.GetStr(100401, -1), new Action<int>(this.StartAutomataResult), (Action) (() => {}), true, (int) totalTime, itemNameStr); // Replacement (transpiled) code: // UIUtils.ShowNumberSelectMinMax(this.curItem.itemId, 0, Mathf.Max(a, 0), Mathf.Max(a, 0), TextMgr.GetStr(100401, -1), new Action<int>(this.StartAutomataResult), (Action) (() => {}), true, (int) totalTime, itemNameStr); private static IEnumerable <CodeInstruction> Transpiler(IEnumerable <CodeInstruction> instructions) { SearchState state = SearchState.INITIAL; List <CodeInstruction> saved_inst = new List <CodeInstruction>(); foreach (CodeInstruction inst in instructions) { if (state != SearchState.DFLT_1 && state != SearchState.TXTMGR_ID) { yield return(inst); } switch (state) { case SearchState.THIS: if (inst.opcode == OpCodes.Ldarg_0) { saved_inst.Clear(); state++; } break; case SearchState.CURITEM: if (inst.operand?.ToString()?.Contains("curItem") == true) { state++; } else { ULogger.LogTrace("Fallback from {0} state; opcode={1}", state.ToString("G"), inst.opcode.ToString()); state = SearchState.INITIAL; } break; case SearchState.ITEMID: if (inst.operand?.ToString()?.Contains("itemId") == true) { state++; } else { ULogger.LogTrace("Fallback from {0} state; opcode={1}", state.ToString("G"), inst.opcode.ToString()); state = SearchState.INITIAL; } break; case SearchState.MIN_0: if (inst.opcode == OpCodes.Ldc_I4_0) { state++; } else { ULogger.LogTrace("Fallback from {0} state; opcode={1}", state.ToString("G"), inst.opcode.ToString()); state = SearchState.INITIAL; } break; case SearchState.LOCAL_VAR: case SearchState.PARAM_0: if (inst.opcode.ToString().StartsWith("Ldloc", true, null) || inst.opcode == OpCodes.Ldc_I4_0) { saved_inst.Add(inst); state++; } else { ULogger.LogTrace("Fallback from {0} state; opcode={1}", state.ToString("G"), inst.opcode.ToString()); state = SearchState.INITIAL; } break; case SearchState.CALL_MAX: if ((inst.opcode == OpCodes.Call || inst.opcode == OpCodes.Callvirt) && (inst.operand?.ToString()?.Contains(" Max(") == true)) { saved_inst.Add(inst); state++; } else { ULogger.LogTrace("Fallback from {0} state; opcode={1}, operand={2}", state.ToString("G"), inst.opcode.ToString(), inst.operand?.ToString()); state = SearchState.INITIAL; } break; case SearchState.DFLT_1: if (inst.opcode == OpCodes.Ldc_I4_1) { state++; } else { ULogger.LogTrace("Fallback from {0} state; opcode={1}", state.ToString("G"), inst.opcode.ToString()); yield return(inst); state = SearchState.INITIAL; } break; case SearchState.TXTMGR_ID: var opVal = (inst.operand as int?); if (opVal == 100401) { foreach (CodeInstruction newinst in saved_inst) { yield return(newinst); } state++; } else { ULogger.LogTrace("Fallback from {0} state; operand={1}, opVal={1}", state.ToString("G"), inst.operand.ToString(), opVal); state = SearchState.INITIAL; } yield return(inst); break; } } if (state != SearchState.END) { ULogger.LogError("Unable to patch default crafting number; game or plugin version is outdated!"); } else { ULogger.LogTrace("Successfully patched"); } }
private static void Prefix() { ULogger.LogTrace("PackageExchangeUICtr::DragEnd"); }
private static void Prefix() { ULogger.LogTrace("PackageExchangeUICtr::DragBeginStoreage"); }
private static void Prefix() { ULogger.LogTrace("PlayerItemBarCtr::DragEnd"); }
private static void Prefix() { ULogger.LogTrace("StorageUIBase::DragEndStoreage"); }
private static void Prefix() { ULogger.LogTrace("PackageUICtr::DragEnd (Main Menu)"); }
private static void Prefix() { ULogger.LogTrace("PackageUIBase::DragEnd"); }