IN PROFILE:
<!-- Use with a closing tag as ExecTag is currently broken -->
<!-- Queue for match (works with all matches found in MatchMaker) -->
<If Condition="Buddy.MatchMaker.Queue('Veteran: Fragment Zero')" />
<!-- Check to see if queued for a game -->
<If Condition="Buddy.MatchMaker.IsQueued" />
<!-- Check to see if a queue has popped -->
<If Condition="Buddy.MatchMaker.IsGamePending" />
<!-- Confirm pending game -->
<If Condition="Buddy.MatchMaker.Join()" />
<!-- Leave group / instance -->
<If Condition="Buddy.MatchMaker.Leave()" />
<If Condition="Buddy.PublicQuest.IsEventActive('Shiphand: Fragment Zero')" >
<!-- Public Quest active -->
</If>
<If Condition="Buddy.PublicQuest.IsObjectiveActive('Kill X')" >
<!-- Objective active -->
</If>
<If Condition="Buddy.PublicQuest.GetObjectiveProgress('Kill Y') == 1" >
<!-- NOTE: When complete/inactive, returns 0, use this with IsObjectiveActive for best results -->
<!-- Returns -1 if objective doesn't exist -->
</If>
<If Condition="Buddy.PublicQuest.ActorExists(12345, 10f, -15f, 120319203f, 12f)" >
<!-- Checks if an actor (creature) exists at a specific location/radius -->
<!-- ActorExists(int creatureId, float x, float y, float z, float radius) -->
</If>
<If Condition="Buddy.PublicQuest.CanInteract(12345, 10f, -15f, 120319203f, 12f)" >
<!-- Checks if an actor (creature) exists and is interactable at a specific location/radius -->
<!-- ActorExists(int creatureId, float x, float y, float z, float radius) -->
</If>
IN PEC:
Log(Buddy.PublicQuest.DumpObjectives())
<Echo Message="Buddy.PublicQuest.CurrentObjective" />
Log(Buddy.PublicQuest.CurrentObjective)
Log(Buddy.PublicQuest.CurrentObjective.Contains('The Current Objective')
<While Condition="Buddy.PublicQuest.CurrentObjective.Contains('Collect escaped Experimental Creatures')" >
<Collect QuestId="-1" QuestObjective="0" CreatureId="69899, 69900, 69901" >
<SearchAreas>
<Hotspot X="-40.1287766" Y="4.95038748" Z="197.092987" Timeout="60" Range="200" />
</SearchAreas>
</Collect>
</While>
<Collect Condition="Buddy.PublicQuest.CurrentObjective.Contains('Collect escaped Experimental Creatures')" >
<CreatureIds>69899, 69900, 69901</CreatureIds>
<SearchAreas>
<Hotspot X="-40.1287766" Y="4.95038748" Z="197.092987" Timeout="60" Range="200" />
</SearchAreas>
</Collect>
<If Condition="Buddy.PublicQuest.CurrentObjective.Contains('Collect escaped Experimental Creatures')" >
<Collect CreatureId="69899, 69900, 69901" >
<SearchAreas>
<Hotspot X="-40.1287766" Y="4.95038748" Z="197.092987" Timeout="60" Range="200" />
</SearchAreas>
</Collect>
</If>
[XmlAttribute("CreatureId")]
public int CreatureId { get; set; }
[XmlAttribute("CreatureName")]
public string CreatureName { get; set; }
[DefaultValue(5f)]
[XmlAttribute("InteractRange")]
public float InteractRange { get; set; }
[XmlAttribute("MapId")]
public int MapId { get; set; }
[DefaultValue(300)]
[XmlAttribute("MaxWaitTime")]
public int MaxWaitTime { get; set; }
[XmlAttribute("RunOnce")]
public bool RunOnce { get; set; }
[XmlAttribute("SkipIfNpcNotFound")]
public bool SkipIfNpcNotFound { get; set; }
[DefaultValue(true)]
[XmlAttribute("WaitForNpc")]
public bool WaitForNpc { get; set; }
[XmlAttribute("X")]
public float X { get; set; }
[XmlAttribute("Y")]
public float Y { get; set; }
[XmlAttribute("Z")]
public float Z { get; set; }
<If Condition="not IsQuestObjectiveComplete(7103, 0)" >
<Collect QuestId="7103" QuestObjective="0" CreatureId="34152, 34078, 34101" > <!-- Also will collect other mission objects on the way -->
<SearchAreas>
<Hotspot X="-28320.67" Y="-718.3105" Z="-28823.6074" Timeout="750" Range="200" />
</SearchAreas>
</Collect>
</If>
Specifically experiment with the 'RunOnce=true', 'SkipIfNotFound=true', and throw them in a While loop until it's complete?
Consider trying to use '10f' or '5f' as a InteractRange and see if it performs better with that?
Also remember that the XYZ coordinates are effectively a MoveTo and then attempt an interact, so you can use it to navigate the character to the room in question, and it'll move to the closest characterID afterwards just the same. (At least I think that's how it works?)
Finally, Collect does NOT have a Condition attribute, so the final code you suggested likely wouldn't work regardless? Or were you suggesting an implementation?![]()
Alright I must be doing something wrong, I only get normal quests and not any shiphand events when I do the alt shift Q. Any idea where I went wrong? I put the PublicQuest.cs in the plugins folderThat quest refresh thing you are using doesn't work. The way to dump quests is by pressing Alt, Shift + Q. There are no quests in shiphands though, they are events. The plugin gets the current event's name/number so you can use it to make if/while conditions.