/// <summary> /// Generate our XML file /// </summary> /// <param name="db"></param> /// <param name="currentOrder"></param> /// <param name="ContinueOnLevel"></param> /// <param name="HqOnly"></param> /// <param name="GenerateLisbeth"></param> /// <param name="savestrem"></param> public static void Generate(LeveDatabase db, ObservableCollection <Leve> currentOrder, bool ContinueOnLevel, bool HqOnly, bool GenerateLisbeth, Stream savestrem) { using (var sw = new StreamWriter(savestrem)) { sw.WriteLine(Header); foreach (var x in currentOrder.OrderBy(i => i.Level)) { sw.WriteLine(WriteOrder(db, x, ContinueOnLevel, HqOnly, GenerateLisbeth)); } sw.WriteLine(Footer); } }
private static string WriteOrder(LeveDatabase db, Leve leve, bool continueOnLevel, bool hqOnly, bool generateLisbeth) { var pickup = db.Npcs.First(i => i.NpcId == leve.PickUpNpc); var pickuploc = $"{formatFloat(pickup.Pos.X)},{formatFloat(pickup.Pos.Y)},{formatFloat(pickup.Pos.Z)}"; var turnin = db.Npcs.First(i => i.NpcId == leve.TurnInNpc); var turninloc = $"{formatFloat(turnin.Pos.X)},{formatFloat(turnin.Pos.Y)},{formatFloat(turnin.Pos.Z)}"; var itemcount = hqOnly ? "HqItemCount" : "ItemCount"; var hqonlyattrib = hqOnly ? @"HqOnly=""true""" : string.Empty; ClassJobType leveClass; ClassJobType.TryParse(leve.Classes, out leveClass); var col = (continueOnLevel) ? $" and Core.Me.Levels[ClassJobType.{leveClass}] < " + (leve.Level >= 50 ? leve.Level + 2 : leve.Level + 5) : ""; // Default to 5 leves (5 items for single turnins, 15 items for triple turnins) int numLeves = 5; // ExpReward * 2.0 is assuming all of the items are HQ'd and .5 for the exp crafting suborders. var rewardModifier = 2.5; var output = ""; #if RB_CN var LeveTag = "YesText=\"继续交货\""; // #else var LeveTag = @""; #endif var outputTurnin = $@" <LgSwitchGearset Job=""{leve.Classes}"" /> <While Condition=""ExBuddy.Windows.GuildLeve.Allowances > 0 and {itemcount}({leve.ItemId}) > {leve.NumItems - 1}{col} and Core.Me.Levels[ClassJobType.{leveClass}] >= {leve.Level}""> <If Condition=""not IsOnMap({pickup.MapId})""> <GetTo ZoneId=""{pickup.MapId}"" XYZ=""{pickuploc}"" /> </If> <ExPickupGuildLeve LeveIds=""{leve.LeveId}"" LeveType=""{Localization.Localization.Tradecraft}"" NpcId=""{pickup.NpcId}"" NpcLocation=""{pickuploc}"" Timeout=""5"" /> <If Condition=""not IsOnMap({turnin.MapId})""> <GetTo ZoneId=""{turnin.MapId}"" XYZ=""{turninloc}"" /> </If> <ExTurnInGuildLeve NpcId=""{turnin.NpcId}"" NpcLocation=""{turninloc}"" {hqonlyattrib} {LeveTag} /> </While>"; if (generateLisbeth) { // Optimize EXP is checked, figure out optimal orders to craft. if (continueOnLevel) { var currentLevel = Core.Me.Levels[leveClass]; var nextLeveJump = leve.Level >= 50 ? 2 : 5; var nextLeveLevel = leve.Level + nextLeveJump; var requiredExp = 0; for (var i = 0; i < (nextLeveLevel - currentLevel); i++) { requiredExp += ExpRequired[currentLevel + i]; } numLeves = (int)(requiredExp / (leve.ExpReward * rewardModifier)); output += $@" <While Condition=""Core.Me.Levels[ClassJobType.{leveClass}] >= {leve.Level} and Core.Me.Levels[ClassJobType.{leveClass}] < {nextLeveLevel}"">"; } output += $@" <If Condition=""ItemCount({leve.ItemId}) < {leve.NumItems}""> {WriteLisbeth(db, leve, numLeves)} </If> {outputTurnin} "; if (continueOnLevel) { output += $@" </While>"; } } else { output += outputTurnin; } return(output); }
private static string WriteLisbeth(LeveDatabase db, Leve leve, int numLeves) { return($@" <Lisbeth Json=""[{WriteLisbethSubOrder(leve, numLeves)}]"" />"); }