/// <summary> /// Entry point for Modnix 3 actions. /// Action syntax is the same as traditional PPDefModifier mods. /// </summary> public static bool ActionMod(string modid, ModnixAction action) { if (action == null || (!action.ContainsKey("cls") && !action.ContainsKey("guid"))) { return(false); } if (!action.ContainsKey("value") && !action.ContainsKey("modletlist")) { return(false); } ModFile modfile = GetModFile(modid); if (modid != lastactionmod) { logger.Log("Applying mod actions in {0}", modfile); lastactionmod = modid; } ModDefinition def = new ModDefinition(); try { ConvertActionToMod(action, def); modfile.ApplyMod(def); return(true); } catch (Exception e) { logger.Error("Error applying mod action {0}: {1}", def.GetModName(), e.ToString()); return(false); } }
/// <summary> /// Convert and copy fields from a ModnixAction to a ModDefinition. /// Although converting to json and back is simpler, it is also more risky, less type safe. /// </summary> internal static void ConvertActionToMod(ModnixAction action, ModDefinition def) { def.guid = action.GetText("guid"); def.cls = action.GetText("cls"); def.field = action.GetText("field"); def.comment = action.GetText("comment"); action.TryGetValue("value", out def.value); if (action.TryGetValue("modletlist", out object mlist) && mlist is JArray list) { def.modletlist = new List <ModletStep>(); foreach (var item in list.OfType <JObject>()) { var step = new ModletStep { field = item.GetText("field"), value = item.GetValue("value").ToObject <object>(), }; def.modletlist.Add(step); } } if (action.TryGetValue("flags", out object flist) && flist is JArray flags) { def.flags = flags.Select((f) => f?.ToString()).ToArray(); } }
public ModDefinition JsonToModDef(string json) { ModDefinition mod = new ModDefinition(); ModnixAction action = JsonConvert.DeserializeObject <ModnixAction>(json); PPDefMod.ConvertActionToMod(action, mod); return(mod); }