From 69b39a8133895b445821e92f232705f2857a7bec Mon Sep 17 00:00:00 2001 From: Earthfiredrake Date: Mon, 3 Apr 2017 02:52:15 -0600 Subject: [PATCH] Adds option for onscreen waypoints locating lore alerts. Fixes (another) bug with AutoReport settings not saving --- LoreHound.fla | Bin 68568 -> 68641 bytes README.md | 25 ++-- config/Strings.xml | 6 + efd/LoreHound/LoreHound.as | 144 +++++++++++++++++++---- efd/LoreHound/gui/ConfigWindowContent.as | 30 +++-- efd/LoreHound/lib/ConfigWrapper.as | 3 +- 6 files changed, 166 insertions(+), 42 deletions(-) diff --git a/LoreHound.fla b/LoreHound.fla index 97536af96009332c0deff70d3dee4ce3c27bd7db..ee807ca577b38675a9c35c08a3e5adefc3254546 100644 GIT binary patch delta 11533 zcmZ8n1y~%*vffW$DR|d*cekq&QmSTAP%RB9^K5yw#^IuzJkXF_X8^90v|(4d zUielYUH0hPoE3tUdgHKGMt{$kXwmw zUmF&%2Ktz4DxDSujD!<*GAINK6WbFOKN==Ebdq-@{FwcTGos0VKfr)OZQH1G_9l7n z)HX}Xx!8l}1lfXZnZrs2U} zMa0=AkM&`5r~NI?OI0sYjrNA&t5TKSR`3}Tt8O!60XN5hFU^pL;Cz2~NHiuBHQ#AFmm6>x zhq=tx+2H7ju@tPaxj6M$7a;^`j$6y)vVTRIDEvra5+EzCX6&fP1K*|QrY9$6taJoJ za;$`(!eKqeF*hW(KN z1MhuO*vTAAf2rEuC`CB&@F{&kg(V?oLRRB>EdvhE^3K~0KhdSPwnyovmbdF_kuyj5 z>y*r@V4hwFW|ulJrv*}xpiQ1Z{T^x7?E3e%T}jJSQ#( zyG91H+pBi_C2-@JEI3{A(-zZd^Nw$mA!terM;wGFC%Spe7plU^^U$09S}52>Pz zrLo5>I(8Px0oyhr(5H{AcD|V6Wp(Gb@~>Q2zi}#Tj7_UQo|L;~Md(#9(et?of!?^< ze^3$G8D^<9EVoG-h;4SL>aYzXjP<0*r-X7K8#LxQI`dNCbIHG2CB493Z09c}&UlB+ zpHya$?#kl?jv}O>jB?{K{z*ZzuO=ZNIZ8n$jE-0-Z^P`REl__GvkCj&XTkkpZDhAv z5{jhuJ{2JS87dv7fD6lt>I=_prh{}J z{6y8*Vb)b%Cy&OVogBvzIj4-q2g8RhIYb=77v^TY#`PUO{^yFP+OhDmr;gN4MXJ-- zU?&hUHaJ-HUEY|I5LPeGiFT3WbUK0wv*{qoA^2@;kw#ojO_0>Pk!T;LHK9bepU4Vh z{G}&Ls%5Jr)o`Bs5DXNu-f|{`$W-UJ`=`}G$4I==*e5s3N5wR`H2 z6Vh~rAvlX0gHV)Ode`=foQzzb8ErsvN4bBVr}A^wuaf{P=q|KoI>c4QIcanL(fRoBQArjC78?M9hX=rrGt2P86HRx+0ssN*000gE z5`T{eK1kPfN$1AySw4M*f78s>Oc_zVIO;a{^2mK|aK8OfQL zI{Amw++l&}81vu^jL0^)>{Rp}{Kn|%Is4EOj-8|OS0=pm-@~!sVByr*F2h}HIcReu zgQ0KH$G2pD0>c7d2gFDPvNNKm`n=mR@azc7z}vOrkg^`*G)+A5wad5PmGNy$za0Je zw2%Ssm)?fxs*VRF$rXkJpqg+8!y^9lLqzvy1<{LG0hB?GBF0tA-}+J?Nhhz(Pv#n1 zdBL2hm2>W?Vx#Zt2rGV9l`Kmr!B<0%-@pwG<;qV7iJ#iiIghZ3Lnb$Cm`cT~cobMl zzR!;^Us#yNn|aJ8^J9D{IXen?MOy?8Sx;QuVA49LJp|Fo2hF888WeH~>3f@Mr;J zcJk|IwsWJCFY-r4p0chnzP-|c9f0lzFoUGq(Vm)@m)B{7n!qF^^sEV^9VZwDy7^*JZqGI1_iV>@bZHMd;TzUpz>HTOnBE!L1i!RD!S z#PpVowQ-{M1i{}#KKXC5nJ03K))U9dE1JnC={p3rL5Et)0CUdW#1;~BGXtRhV7O2! zE61{H;ft8vh!KscrGJUp4v# zZWPNm^pAN?M-;b^9LbgO|0|Drnors z$p(YhtA%3T{j_~n2;_AmVtpg_Pd{7pfmKaGI=l@HNc+IT8GeOf1y2pG{-np-_<1!W z9-j4cyjVgvf3$)mL$1jX@;Bt1tRJT1YR`?u zOdHnr>BEl|I4Klc;?gV$C}%!#V&B_N8;V-dYCH%V^oorRORx6F! z<<=9!FwF(R#mZPy(n1u!togX2D_O#B1V?6)NLj$|7>k=5^nR_LJGG2W|B(Orbi{u{kL^;w@;$+OUhNLVv9DuZ`gS`vO^S`jIxw9*?qrD{nzzl#oy#x|M(cyux z5N1MjQLKOQ6fG?NW?}vtwEqiZ#{CzjV(#eh-xkRL5a1=r(*WrHYMKag2tj-*z5Y+> zH31roG3DRALWHv6ApN*LF!uiiOz=Wro~RHud}^ozEbs*c3ts^SApaL#7E+1N1uTGU z;nRai0g&T;V({~8nVf^Oxs-#Oz1j1b0r=X=0RZ6B`QkmvbB^$z{J9Kz64WR8ukOD& z?teHa|1U@UPx-mdb6fvESNb>br2k)fCSyIxfAi;#Up&ckN6+d1m!Gk}uB77wVJ$XM zmNAO`QF#{k)2n9%< zKq_*CsLoyk9bO+nXo`4Wj^rybp2Q2Lo0RZx;gvm8C&Xmd#|kgEpu)5FBz4j za6}1{9m@$h0< z`$Gn)3UwWqI?=~53wz7MefP)v zOoUJukD(Q3^s;4hrrrl4xO?slo`C%h0z-<^z~7k$9D-S#bIl8l8JyzUshrXE4FOzL zLtcuJZd=};7m?A>x>(QdEnbfd)4v0?Arl(l0uHvPBf&$WE&*otJ&)~dRS3HJKEl

48fyj_!_i{5TBg==npJnv!@V@ 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 delta 11209 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 + + + + diff --git a/efd/LoreHound/LoreHound.as b/efd/LoreHound/LoreHound.as index 2c17d4b..93592b0 100644 --- a/efd/LoreHound/LoreHound.as +++ b/efd/LoreHound/LoreHound.as @@ -2,15 +2,21 @@ // Released under the terms of the MIT License // https://github.com/Earthfiredrake/TSW-LoreHound +import flash.geom.Point; + import gfx.utils.Delegate; import com.GameInterface.Dynels; +import com.GameInterface.Game.Character; import com.GameInterface.Game.Dynel; import com.GameInterface.Lore; import com.GameInterface.LoreNode; import com.GameInterface.MathLib.Vector3; import com.GameInterface.VicinitySystem; -import com.GameInterface.WaypointInterface; // Playfield change notifications +import com.GameInterface.Waypoint; +import com.GameInterface.WaypointInterface; +import GUI.Waypoints.CustomWaypoint; +import com.Utils.Archive; //DEPRECIATED(v1.1.0.alpha): Required for bugfix that corrects forgetting AutoReport settings import com.Utils.ID32; import com.Utils.LDBFormat; @@ -24,7 +30,7 @@ class efd.LoreHound.LoreHound extends Mod { // Debug settings at top so that commenting out leaves no hanging ',' // Trace : true, Name : "LoreHound", - Version : "1.1.0.alpha", + Version : "1.1.0", Type : e_ModType_Reactive, MinUpgradableVersion : "1.0.0", IconData : { UpdateState : UpdateIcon, @@ -64,7 +70,9 @@ class efd.LoreHound.LoreHound extends Mod { DetailStatMode = 2; // Defaulting to mode 2 based on repeated comments in game source that it is somehow "full" SystemsLoaded.CategoryIndex = false; + RecentLore = new Object(); TrackedLore = new Object(); + WaypointSystem = _root.waypoints; WaypointInterface.SignalPlayfieldChanged.Connect(ClearTracking, this); var arConfig:ConfigWrapper = AutoReport.Initialize(ModName, Version, DevName); @@ -83,7 +91,9 @@ class efd.LoreHound.LoreHound extends Mod { Config.NewSetting("IgnoreUnclaimedLore", true); // Ignore lore if the player hasn't picked it up already Config.NewSetting("IgnoreOffSeasonLore", true); // Ignore event lore if the event isn't running (TODO: Test this when a game event is running) Config.NewSetting("TrackDespawns", true); // Track lore drops for when they despawn - Config.NewSetting("CheckNewContent", false); // Does extra tests to detect lore that isn't on the index list at all yet (ie: new content!) + Config.NewSetting("ShowWaypoints", true); // Show onscreen waypoints for any reported lores + Config.NewSetting("CheckNewContent", false); // DEPRECIATED(v1.1.0.alpha): Renamed + Config.NewSetting("ExtraTesting", false); // Does extra tests to detect lore that isn't on the index list at all yet (ie: new content!) // Extended information, regardless of this setting: // - Is always ommitted from Fifo notifications, to minimize spam @@ -108,7 +118,18 @@ class efd.LoreHound.LoreHound extends Mod { private function ConfigChanged(setting:String, newValue, oldValue):Void { switch(setting) { case "TrackDespawns": - if (!newValue) { ClearTracking(); } + if (!newValue) { ClearDespawnTracking(); } + break; + case "ShowWaypoints": + if (newValue) { + for (var key:String in RecentLore) { + var dynel:Dynel = RecentLore[key]; + // TODO: This is a bit of a hack, it'll do slightly odd things if people toggle it around incomplete dynels (like inactive event lore) + // Still is quicker than doing a full identification and reasonably accurate + CreateWaypoint(dynel, AttemptIdentification(dynel.GetStat(e_Stats_LoreId, 2))); + } + } + else { ClearWaypoints(); } break; default: super.ConfigChanged(setting, newValue, oldValue); @@ -161,10 +182,25 @@ class efd.LoreHound.LoreHound extends Mod { // Version specific updates // Some upgrades may reflect unreleased builds, for consistency on develop branch + if (CompareVersions("1.1.0.alpha", oldVersion) >= 0) { + // Renaming setting due to recent events + Config.SetValue("ExtraTesting", Config.GetValue("CheckNewContent")); + // May have lost the config settings for the auto report system :( + if (Config.GetValue("AutoReport") instanceof Archive) { + Config.SetValue("AutoReport", Config.GetDefault("AutoReport")); + ChatMsg(LocaleManager.GetString("Patch", "AutoReportRepair")); + } + } + } + + private function LoadComplete():Void { + super.LoadComplete(); + Config.DeleteSetting("CheckNewContent"); // DEPRECIATED(v1.1.0.alpha): Renamed } private function Activate():Void { AutoReport.IsEnabled = true; // Only updates this component's view of the mod state + HostMovie.onEnterFrame = Delegate.create(this, UpdateWaypoints); VicinitySystem.SignalDynelEnterVicinity.Connect(LoreSniffer, this); Dynels.DynelGone.Connect(LoreDespawned, this); } @@ -176,14 +212,10 @@ class efd.LoreHound.LoreHound extends Mod { // Detection notices between the deactivate-activate pair have a strange habit of providing the correct LoreId, but being unable to link to an actual lore object Dynels.DynelGone.Disconnect(LoreDespawned, this); VicinitySystem.SignalDynelEnterVicinity.Disconnect(LoreSniffer, this); + delete HostMovie.onEnterFrame; AutoReport.IsEnabled = false; // Only updates this component's view of the mod state } - private function TopbarRegistered():Void { - // Topbar icon does not copy custom state variable, so needs explicit refresh - // Icon.UpdateState(ef_IconState_Report, AutoReport.HasReportsPending); - } - private function UpdateIcon():Void { Icon.RefreshTooltip(); if (Config.GetValue("Enabled")) { // If game disables mod, it isn't visible at all, so only user disables matter @@ -232,9 +264,10 @@ class efd.LoreHound.LoreHound extends Mod { // category: The string table to pull from? Constantly 50200 whenever I've checked // key: Some sort of hash? May vary by id# or string content (shrouded and regular lore have different values), but seems constant within a group // knubot: No idea at all. Always seems to be 0 for what it's worth. - // GetID() - The ID type seems to be constant (51320) for all lore, but is shared with a wide variety of other props + // GetID() - The ID type seems to be constant (51320) for all lore, but is shared with a wide variety of other props (simple dynels) // Other types: // 50000 - used by all creatures (players, pets, npcs, monsters, etc.) + // 51321 - destructibles (according to global enums) // 51322 - loot bags // As a note for later, the other category uses a different GetName() system (is pre-localized, rather than the xml tag used by objects) // Instance ids of fixed lore may vary slightly between sessions, seemingly depending on load orders or caching of map info. @@ -265,7 +298,8 @@ class efd.LoreHound.LoreHound extends Mod { /// Lore detection and sorting private function LoreSniffer(dynelId:ID32):Void { - if (dynelId.m_Type != e_DynelType_Object) { return; } // Dynel is not of supertype associated with lore + if (dynelId.m_Type != _global.Enums.TypeID.e_Type_GC_SimpleDynel) { return; } // Dynel is not of supertype associated with lore + if (RecentLore[dynelId.toString()]) { return; } // Lore has already been reported recently var dynel:Dynel = Dynel.GetDynel(dynelId); var dynelName:String = dynel.GetName(); @@ -278,7 +312,7 @@ class efd.LoreHound.LoreHound extends Mod { // Categorize the detected item var loreType:Number = ClassifyID(categorizationId); if (loreType == ef_LoreType_None) { - if (Config.GetValue("CheckNewContent") && ExpandedDetection(dynel)) { loreType = ef_LoreType_Unknown; } // It's so new it hasn't been added to the index list yet + if (Config.GetValue("ExtraTesting") && ExpandedDetection(dynel)) { loreType = ef_LoreType_Unknown; } // It's so new it hasn't been added to the index list yet else { return; } } @@ -289,6 +323,15 @@ class efd.LoreHound.LoreHound extends Mod { private function ProcessAndNotify(dynel:Dynel, loreType:Number, categorizationId:Number, repeat:Number):Void { if (ProcessLore(dynel, loreType, categorizationId, repeat)) { SendLoreNotifications(loreType, categorizationId, dynel); + var dynelId:ID32 = dynel.GetID(); + RecentLore[dynelId.toString()] = dynel; + // Used to register for RecentLore system... + // _global.enums.Property.e_ObjScreenPos seems like it would be more useful, and returns the same value :( + // Can't tell if it actually updates the value on a regular basis... as lore doesn't move + Dynels.RegisterProperty(dynelId.m_Type, dynelId.m_Instance, _global.enums.Property.e_ObjPos); + if (Config.GetValue("ShowWaypoints")) { + CreateWaypoint(dynel, AttemptIdentification(dynel.GetStat(e_Stats_LoreId, 2), loreType, categorizationId)); + } } } @@ -353,20 +396,35 @@ class efd.LoreHound.LoreHound extends Mod { } UpdateIcon(); } + if (RecentLore[despawnedId]) { + if (Config.GetValue("ShowWaypoints")) { + delete WaypointSystem.m_CurrentPFInterface.m_Waypoints[despawnedId]; + WaypointSystem.m_CurrentPFInterface.SignalWaypointRemoved.Emit(new ID32(type, instance)); + } + delete RecentLore[despawnedId]; + } } private function ClearTracking():Void { - for (var key:String in TrackedLore) { - var id:Array = key.split(":"); - // Probably don't *have* to unregister, the dynel is most likely about to be destroyed anyway - // This is more for cleaning up my end of things - Dynels.UnregisterProperty(id[0], id[1], _global.enums.Property.e_ObjPos); - } + ClearDespawnTracking(); + // Don't need to clear waypoints, as the playfield change will reset the waypoint interface + delete RecentLore; + RecentLore = new Object(); + } + + private function ClearDespawnTracking():Void { delete TrackedLore; TrackedLore = new Object(); UpdateIcon(); } + private function ClearWaypoints():Void { + for (var key:String in RecentLore) { + delete WaypointSystem.m_CurrentPFInterface.m_Waypoints[key]; + WaypointSystem.m_CurrentPFInterface.SignalWaypointRemoved.Emit(RecentLore[key].GetID()); + } + } + /// Lore identification // Much of the primary categorization info is now contained in the xml data file private function ClassifyID(categorizationId:Number):Number { @@ -386,7 +444,6 @@ class efd.LoreHound.LoreHound extends Mod { } /// Notification and message formatting - private function SendLoreNotifications(loreType:Number, categorizationId:Number, dynel:Dynel):Void { var messageStrings:Array = GetMessageStrings(loreType, dynel.GetStat(e_Stats_LoreId, 2), dynel, categorizationId); var detailStrings:Array = GetDetailStrings(loreType, dynel); @@ -570,8 +627,53 @@ class efd.LoreHound.LoreHound extends Mod { } } + /// Waypoint rendering + private function CreateWaypoint(dynel:Dynel, loreName:String):Void { + var waypoint:Waypoint = new Waypoint(); + waypoint.m_Id = dynel.GetID(); + waypoint.m_WaypointType = _global.Enums.WaypointType.e_RMWPScannerBlip; + waypoint.m_WaypointState = _global.Enums.QuestWaypointState.e_WPStateActive; + waypoint.m_Label = loreName; + waypoint.m_IsScreenWaypoint = true; + waypoint.m_IsStackingWaypoint = true; + waypoint.m_Radius = 0; + waypoint.m_Color = 0xF6D600; + waypoint.m_WorldPosition = dynel.GetPosition(0); + var scrPos:Point = dynel.GetScreenPosition(); + waypoint.m_ScreenPositionX = scrPos.x; + waypoint.m_ScreenPositionY = scrPos.y; + waypoint.m_CollisionOffsetX = 0; + waypoint.m_CollisionOffsetY = 0; + waypoint.m_DistanceToCam = dynel.GetCameraDistance(0); + waypoint.m_MinViewDistance = 0; + waypoint.m_MaxViewDistance = 50; + + WaypointSystem.m_CurrentPFInterface.m_Waypoints[waypoint.m_Id.toString()] = waypoint; + WaypointSystem.m_CurrentPFInterface.SignalWaypointAdded.Emit(waypoint.m_Id); + } + + // Ugly, but I don't really see any alternative to doing a per/frame update + private function UpdateWaypoints():Void { + if (Config.GetValue("ShowWaypoints")) { + for (var key:String in RecentLore) { + // The waypoints that are added to the PFInterface are constantly stomped by the C++ side. + // So I'm updating the data held by the rendered copy, and then forcing it to redo the layout before it gets stomped again. + // As long as the mod is updated after the main interface, this should work. + // To do this properly, I'd have to implement my own waypoint system, which just isn't worth it at this point. + var dynel:Dynel = RecentLore[key]; + var scrPos:Point = dynel.GetScreenPosition(); + var waypoint:CustomWaypoint = WaypointSystem.m_RenderedWaypoints[key]; + waypoint.m_Waypoint.m_ScreenPositionX = scrPos.x; + waypoint.m_Waypoint.m_ScreenPositionY = scrPos.y; + waypoint.m_Waypoint.m_DistanceToCam = dynel.GetCameraDistance(0); + + waypoint.Update(Stage.visibleRect.width); + waypoint = undefined; + } + } + } + /// Variables - private static var e_DynelType_Object:Number = 51320; // All known lore shares this dynel type with a wide variety of other props private static var e_Stats_LoreId:Number = 2000560; // Most lore dynels seem to store the LoreId at this stat index, those that don't are either not fully loaded, or event related private static var c_ShroudedLoreCategory:Number = 7993128; // Keep ending up with special cases for this particular one @@ -585,5 +687,7 @@ class efd.LoreHound.LoreHound extends Mod { private var IndexFile:XML; private var CategoryIndex:Array; + private var RecentLore:Object; private var TrackedLore:Object; + private var WaypointSystem:Object; } diff --git a/efd/LoreHound/gui/ConfigWindowContent.as b/efd/LoreHound/gui/ConfigWindowContent.as index 5fc6c09..20f451b 100644 --- a/efd/LoreHound/gui/ConfigWindowContent.as +++ b/efd/LoreHound/gui/ConfigWindowContent.as @@ -20,9 +20,10 @@ class efd.LoreHound.gui.ConfigWindowContent extends WindowComponentContent { CBModEnabled.disableFocus = true; CBIgnoreUnclaimedLore.disableFocus = true; CBIgnoreOffSeasonLore.disableFocus = true; + CBWaypoints.disableFocus = true; CBTrackDespawns.disableFocus = true; CBErrorReports.disableFocus = true; - CBNewContent.disableFocus = true; + CBExtraTests.disableFocus = true; CBDetailTimestamp.disableFocus = true; CBDetailLocation.disableFocus = true; CBDetailCategory.disableFocus = true; @@ -37,9 +38,10 @@ class efd.LoreHound.gui.ConfigWindowContent extends WindowComponentContent { LocaleManager.ApplyLabel(LBEnable); LocaleManager.ApplyLabel(LBUnclaimed); LocaleManager.ApplyLabel(LBInactive); + LocaleManager.ApplyLabel(LBWaypoints); LocaleManager.ApplyLabel(LBDespawn); LocaleManager.ApplyLabel(LBAutoReport); - LocaleManager.ApplyLabel(LBNewContent); + LocaleManager.ApplyLabel(LBExtraTests); } public function AttachConfig(config:ConfigWrapper):Void { @@ -52,9 +54,10 @@ class efd.LoreHound.gui.ConfigWindowContent extends WindowComponentContent { CBModEnabled.addEventListener("select", this, "CBModEnabled_Select"); CBIgnoreUnclaimedLore.addEventListener("select", this, "CBIgnoreUnclaimedLore_Select"); CBIgnoreOffSeasonLore.addEventListener("select", this, "CBIgnoreOffSeasonLore_Select"); + CBWaypoints.addEventListener("select", this, "CBWaypoints_Select"); CBTrackDespawns.addEventListener("select", this, "CBTrackDespawns_Select"); CBErrorReports.addEventListener("select", this, "CBErrorReports_Select"); - CBNewContent.addEventListener("select", this, "CBNewContent_Select"); + CBExtraTests.addEventListener("select", this, "CBExtraTests_Select"); CBDetailTimestamp.addEventListener("select", this, "CBDetailTimestamp_Select"); CBDetailLocation.addEventListener("select", this, "CBDetailLocation_Select"); CBDetailCategory.addEventListener("select", this, "CBDetailCategory_Select"); @@ -77,11 +80,14 @@ class efd.LoreHound.gui.ConfigWindowContent extends WindowComponentContent { if (setting == "IgnoreOffSeasonLore" || setting == undefined) { CBIgnoreOffSeasonLore.selected = Config.GetValue("IgnoreOffSeasonLore"); } + if (setting == "ShowWaypoints" || setting == undefined) { + CBWaypoints.selected = Config.GetValue("ShowWaypoints"); + } if (setting == "TrackDespawns" || setting == undefined) { CBTrackDespawns.selected = Config.GetValue("TrackDespawns"); } - if (setting == "CheckNewContent" || setting == undefined) { - CBNewContent.selected = Config.GetValue("CheckNewContent"); + if (setting == "ExtraTesting" || setting == undefined) { + CBExtraTests.selected = Config.GetValue("ExtraTesting"); } if (setting == "Details" || setting == undefined) { var details = Config.GetValue("Details"); @@ -111,6 +117,10 @@ class efd.LoreHound.gui.ConfigWindowContent extends WindowComponentContent { Config.SetValue("IgnoreOffSeasonLore", event.selected); } + private function CBWaypoints_Select(event:Object):Void { + Config.SetValue("ShowWaypoints", event.selected); + } + private function CBTrackDespawns_Select(event:Object):Void { Config.SetValue("TrackDespawns", event.selected); } @@ -119,8 +129,8 @@ class efd.LoreHound.gui.ConfigWindowContent extends WindowComponentContent { Config.GetValue("AutoReport").SetValue("Enabled", event.selected); } - private function CBNewContent_Select(event:Object):Void { - Config.SetValue("CheckNewContent", event.selected); + private function CBExtraTests_Select(event:Object):Void { + Config.SetValue("ExtraTesting", event.selected); } private function CBDetailTimestamp_Select(event:Object):Void { @@ -149,17 +159,19 @@ class efd.LoreHound.gui.ConfigWindowContent extends WindowComponentContent { private var LBEnable:TextField; private var LBUnclaimed:TextField; private var LBInactive:TextField; + private var LBWaypoints:TextField; private var LBDespawn:TextField; private var LBAutoReport:TextField; - private var LBNewContent:TextField; + private var LBExtraTests:TextField; // Checkboxes private var CBModEnabled:CheckBox; private var CBIgnoreUnclaimedLore:CheckBox; private var CBIgnoreOffSeasonLore:CheckBox; + private var CBWaypoints:CheckBox; private var CBTrackDespawns:CheckBox; private var CBErrorReports:CheckBox; - private var CBNewContent:CheckBox; + private var CBExtraTests:CheckBox; private var CBDetailTimestamp:CheckBox; private var CBDetailLocation:CheckBox; diff --git a/efd/LoreHound/lib/ConfigWrapper.as b/efd/LoreHound/lib/ConfigWrapper.as index f611574..056e5c8 100644 --- a/efd/LoreHound/lib/ConfigWrapper.as +++ b/efd/LoreHound/lib/ConfigWrapper.as @@ -141,7 +141,7 @@ class efd.LoreHound.lib.ConfigWrapper { } public function SaveConfig():Archive { - if (IsDirty) { + if (IsDirty || !IsLoaded) { UpdateCachedArchive(); if (ArchiveName != undefined) { DistributedValue.SetDValue(ArchiveName, CurrentArchive); } } @@ -211,6 +211,7 @@ class efd.LoreHound.lib.ConfigWrapper { DirtyFlag = false; } else { CurrentArchive = new Archive(); // Nothing to load, but we tried + CurrentArchive.AddEntry("ArchiveType", "Config"); // Remember to flag this as a config archive, in case we get saved as an invalid setting } SignalConfigLoaded.Emit(); }