Merge branch 'master' of https://github.com/SoDOff-Project/sodoff into moderation

This commit is contained in:
Alan Moon 2025-02-09 15:43:38 -08:00
commit 23cd97b4b2
60 changed files with 143626 additions and 4274 deletions

View File

@ -150,6 +150,7 @@ Almost everything:
#### Implemented enough (probably) #### Implemented enough (probably)
- GetCommonInventory (V1 - returns the viking's inventory if it is called with a viking; otherwise returns 8 viking slots) - GetCommonInventory (V1 - returns the viking's inventory if it is called with a viking; otherwise returns 8 viking slots)
- GetGroupsByGroupType (only useful for Eat My Dust at the moment)
- GetQuestions (doesn't return all questions, probably doesn't need to) - GetQuestions (doesn't return all questions, probably doesn't need to)
- GetRules (doesn't return any rules, probably doesn't need to) - GetRules (doesn't return any rules, probably doesn't need to)
- GetSubscriptionInfo (always returns member, with end date 10 years from now) - GetSubscriptionInfo (always returns member, with end date 10 years from now)
@ -168,6 +169,7 @@ Almost everything:
- GetTopAchievementPointUsers (ignores type [all, buddy, hall of fame, ...] and mode [overall, monthly, weekly] properties) - GetTopAchievementPointUsers (ignores type [all, buddy, hall of fame, ...] and mode [overall, monthly, weekly] properties)
- GetUserAchievements (used by Magic & Mythies) - GetUserAchievements (used by Magic & Mythies)
- GetUserRoomList (room categories are not implemented, but it's enough for SoD) - GetUserRoomList (room categories are not implemented, but it's enough for SoD)
- JoinGroup (for Eat My Dust only)
- ProcessRewardedItems (gives gems, but doesn't give gold, gold is not yet implemented) - ProcessRewardedItems (gives gems, but doesn't give gold, gold is not yet implemented)
- SellItems (gives gems, but doesn't give gold, gold is not yet implemented) - SellItems (gives gems, but doesn't give gold, gold is not yet implemented)
- SetUserAchievementTask (returns a real reward but still use task placeholder) - SetUserAchievementTask (returns a real reward but still use task placeholder)

View File

@ -11,9 +11,12 @@ namespace sodoff.Controllers.Common;
public class AchievementController : Controller { public class AchievementController : Controller {
public readonly DBContext ctx; public readonly DBContext ctx;
private AchievementStoreSingleton achievementStore;
private AchievementService achievementService; private AchievementService achievementService;
public AchievementController(DBContext ctx, AchievementService achievementService) {
public AchievementController(DBContext ctx, AchievementStoreSingleton achievementStore, AchievementService achievementService) {
this.ctx = ctx; this.ctx = ctx;
this.achievementStore = achievementStore;
this.achievementService = achievementService; this.achievementService = achievementService;
} }
@ -42,19 +45,26 @@ public class AchievementController : Controller {
public IActionResult GetAllRanks([FromForm] string apiKey) { public IActionResult GetAllRanks([FromForm] string apiKey) {
uint gameVersion = ClientVersion.GetVersion(apiKey); uint gameVersion = ClientVersion.GetVersion(apiKey);
if (gameVersion <= ClientVersion.Max_OldJS && (gameVersion & ClientVersion.WoJS) != 0) if (gameVersion <= ClientVersion.Max_OldJS && (gameVersion & ClientVersion.WoJS) != 0)
return Ok(XmlUtil.ReadResourceXmlString("allranks_wojs")); return Ok(XmlUtil.ReadResourceXmlString("ranks.allranks_wojs"));
else if (gameVersion == ClientVersion.MB) if (gameVersion == ClientVersion.MB)
return Ok(XmlUtil.ReadResourceXmlString("allranks_mb")); return Ok(XmlUtil.ReadResourceXmlString("ranks.allranks_mb"));
// TODO, this is a placeholder return Ok(XmlUtil.ReadResourceXmlString("ranks.allranks_sod"));
return Ok(XmlUtil.ReadResourceXmlString("allranks"));
} }
[HttpPost] [HttpPost]
//[Produces("application/xml")] [Produces("application/xml")]
[Route("AchievementWebService.asmx/GetAchievementTaskInfo")] [Route("AchievementWebService.asmx/GetAchievementTaskInfo")]
public IActionResult GetAchievementTaskInfo() { public IActionResult GetAchievementTaskInfo([FromForm] string achievementTaskIDList, [FromForm] string apiKey) {
// TODO int[] achievementTaskIDs = XmlUtil.DeserializeXml<int[]>(achievementTaskIDList);
return Ok(XmlUtil.ReadResourceXmlString("achievementtaskinfo")); List<AchievementTaskInfo> achievementTaskInfos = new();
foreach (int taskId in achievementTaskIDs) {
var achievementInfo = achievementStore.GetAllAchievementTaskInfo(taskId, ClientVersion.GetVersion(apiKey));
if (achievementInfo != null)
achievementTaskInfos.AddRange(achievementInfo);
}
return Ok(new ArrayOfAchievementTaskInfo {
AchievementTaskInfo = achievementTaskInfos.ToArray()
});
} }
[HttpPost] [HttpPost]
@ -89,7 +99,6 @@ public class AchievementController : Controller {
} }
AchievementPointTypes xpType = (AchievementPointTypes)type; AchievementPointTypes xpType = (AchievementPointTypes)type;
// TODO: we allow set currencies here, do we want this?
achievementService.SetAchievementPoints(viking, xpType, value); achievementService.SetAchievementPoints(viking, xpType, value);
ctx.SaveChanges(); ctx.SaveChanges();
return Ok("OK"); return Ok("OK");
@ -146,8 +155,8 @@ public class AchievementController : Controller {
ArrayOfUserAchievementInfo arrAchievements = new ArrayOfUserAchievementInfo { ArrayOfUserAchievementInfo arrAchievements = new ArrayOfUserAchievementInfo {
UserAchievementInfo = new UserAchievementInfo[]{ UserAchievementInfo = new UserAchievementInfo[]{
achievementService.CreateUserAchievementInfo(viking, AchievementPointTypes.PlayerXP), achievementService.CreateUserAchievementInfo(viking, AchievementPointTypes.PlayerXP),
achievementService.CreateUserAchievementInfo(viking.Uid, 60000, AchievementPointTypes.PlayerFarmingXP), // TODO: placeholder until there is no leveling for farm XP achievementService.CreateUserAchievementInfo(viking, AchievementPointTypes.PlayerFarmingXP),
achievementService.CreateUserAchievementInfo(viking.Uid, 20000, AchievementPointTypes.PlayerFishingXP), // TODO: placeholder until there is no leveling for fishing XP achievementService.CreateUserAchievementInfo(viking, AchievementPointTypes.PlayerFishingXP),
} }
}; };
@ -171,22 +180,13 @@ public class AchievementController : Controller {
[Route("V2/AchievementWebService.asmx/SetUserAchievementTask")] [Route("V2/AchievementWebService.asmx/SetUserAchievementTask")]
[DecryptRequest("achievementTaskSetRequest")] [DecryptRequest("achievementTaskSetRequest")]
[VikingSession(UseLock=true)] [VikingSession(UseLock=true)]
public IActionResult SetUserAchievementTask(Viking viking) { public IActionResult SetUserAchievementTask(Viking viking, [FromForm] string apiKey) {
AchievementTaskSetRequest request = XmlUtil.DeserializeXml<AchievementTaskSetRequest>(Request.Form["achievementTaskSetRequest"]); AchievementTaskSetRequest request = XmlUtil.DeserializeXml<AchievementTaskSetRequest>(Request.Form["achievementTaskSetRequest"]);
var response = new List<AchievementTaskSetResponse>(); var response = new List<AchievementTaskSetResponse>();
foreach (var task in request.AchievementTaskSet) { foreach (var task in request.AchievementTaskSet) {
response.Add( response.Add(
new AchievementTaskSetResponse { achievementService.ApplyAchievementRewardsByTask(viking, task.TaskID, ClientVersion.GetVersion(apiKey))
Success = true,
UserMessage = true, // TODO: placeholder
AchievementName = "Placeholder Achievement", // TODO: placeholder
Level = 1, // TODO: placeholder
AchievementTaskGroupID = 1279, // TODO: placeholder
LastLevelCompleted = true, // TODO: placeholder
AchievementInfoID = 1279, // TODO: placeholder
AchievementRewards = achievementService.ApplyAchievementRewardsByTask(viking, task)
}
); );
} }
ctx.SaveChanges(); ctx.SaveChanges();
@ -194,6 +194,38 @@ public class AchievementController : Controller {
return Ok(new ArrayOfAchievementTaskSetResponse { AchievementTaskSetResponse = response.ToArray() }); return Ok(new ArrayOfAchievementTaskSetResponse { AchievementTaskSetResponse = response.ToArray() });
} }
[HttpPost]
[Produces("application/xml")]
[Route("AchievementWebService.asmx/SetUserAchievementTask")] // used by World Of Jumpstart
[VikingSession(UseLock=true)]
public IActionResult SetUserAchievementTaskV1(Viking viking, [FromForm] int taskID, [FromForm] string apiKey) {
var response = achievementService.ApplyAchievementRewardsByTask(viking, taskID, ClientVersion.GetVersion(apiKey));
ctx.SaveChanges();
return Ok(response);
}
[HttpPost]
[Produces("application/xml")]
[Route("AchievementWebService.asmx/GetUserAchievementTask")]
// [VikingSession]
public IActionResult GetUserAchievementTask([FromForm] string userId, [FromForm] string apiKey) {
Viking? viking = ctx.Vikings.FirstOrDefault(e => e.Uid == Guid.Parse(userId));
if (viking is null)
return Ok(new ArrayOfUserAchievementTask());
return Ok(new ArrayOfUserAchievementTask {
UserAchievementTask = achievementService.GetUserAchievementTask(viking, ClientVersion.GetVersion(apiKey))
});
}
[HttpPost]
[Produces("application/xml")]
[Route("V2/AchievementWebService.asmx/GetUserAchievementTaskRedeemableRewards")]
// [VikingSession]
public IActionResult GetUserAchievementTaskRedeemableRewards() {
return Ok(); // TODO: this should be <UATRRS>
}
[HttpPost] [HttpPost]
[Produces("application/xml")] [Produces("application/xml")]
[Route("AchievementWebService.asmx/ApplyPayout")] [Route("AchievementWebService.asmx/ApplyPayout")]

View File

@ -184,7 +184,7 @@ public class AuthenticationController : Controller {
[Route("AuthenticationWebService.asmx/LoginChild")] [Route("AuthenticationWebService.asmx/LoginChild")]
[DecryptRequest("childUserID")] [DecryptRequest("childUserID")]
[EncryptResponse] [EncryptResponse]
public IActionResult LoginChild([FromForm] Guid parentApiToken) { public IActionResult LoginChild([FromForm] Guid parentApiToken, [FromForm] string apiKey) {
User? user = ctx.Sessions.FirstOrDefault(e => e.ApiToken == parentApiToken)?.User; User? user = ctx.Sessions.FirstOrDefault(e => e.ApiToken == parentApiToken)?.User;
if (user is null) { if (user is null) {
return Unauthorized(); return Unauthorized();
@ -197,6 +197,19 @@ public class AuthenticationController : Controller {
return Unauthorized(); return Unauthorized();
} }
uint gameVersion = ClientVersion.GetVersion(apiKey);
if (viking.GameVersion is null)
viking.GameVersion = gameVersion;
if (
(viking.GameVersion != gameVersion) &&
!(viking.GameVersion >= ClientVersion.Min_SoD && gameVersion >= ClientVersion.Min_SoD) &&
!(viking.GameVersion >= ClientVersion.WoJS && gameVersion >= ClientVersion.WoJS && viking.GameVersion < ClientVersion.WoJS_NewAvatar && gameVersion < ClientVersion.WoJS_NewAvatar)
)
return Unauthorized();
// do not let players log into users from other games, exceptions:
// 1) different version of SoD
// 2) WoJS with old avatar and lands
// Check if user is viking parent // Check if user is viking parent
if (user != viking.User) { if (user != viking.User) {
return Unauthorized(); return Unauthorized();

View File

@ -1037,7 +1037,7 @@ public class ContentController : Controller {
uint gameVersion = ClientVersion.GetVersion(apiKey); uint gameVersion = ClientVersion.GetVersion(apiKey);
UserMissionStateResult result = new UserMissionStateResult { Missions = new List<Mission>() }; UserMissionStateResult result = new UserMissionStateResult { Missions = new List<Mission>() };
foreach (var mission in viking.MissionStates.Where(x => x.MissionStatus != MissionStatus.Completed)) { foreach (var mission in viking.MissionStates) {
Mission updatedMission = missionService.GetMissionWithProgress(mission.MissionId, viking.Id, gameVersion); Mission updatedMission = missionService.GetMissionWithProgress(mission.MissionId, viking.Id, gameVersion);
if (mission.MissionStatus == MissionStatus.Upcoming) { if (mission.MissionStatus == MissionStatus.Upcoming) {

View File

@ -0,0 +1,104 @@
using Microsoft.AspNetCore.Mvc;
using sodoff.Attributes;
using sodoff.Model;
using sodoff.Schema;
using sodoff.Util;
namespace sodoff.Controllers.Common;
public class GroupController : Controller {
public static readonly Schema.Group EMD_Dragons = new Schema.Group {
GroupID = "8e68214a-c801-4759-8461-d01f28484134",
Name = "Dragons",
Color = "234,57,23",
Logo = "RS_DATA/Content/PlayerData/EMD/IcoEMDTeamDragons.png"
};
public static readonly Schema.Group EMD_Scorpions = new Schema.Group {
GroupID = "db0aa225-2f0e-424c-83a7-73783fe63fef",
Name = "Scorpions",
Color = "120,183,53",
Logo = "RS_DATA/Content/PlayerData/EMD/IcoEMDTeamScorpions.png"
};
private readonly DBContext ctx;
public GroupController(DBContext ctx) {
this.ctx = ctx;
}
[HttpPost]
[Produces("application/xml")]
[Route("GroupWebService.asmx/JoinGroup")]
[VikingSession]
public IActionResult JoinGroup(Viking viking, [FromForm] string apiKey, [FromForm] string groupID) {
AddEMDGroups();
uint version = ClientVersion.GetVersion(apiKey);
// Only implemented for EMD so far.
if (version == ClientVersion.EMD) {
if (viking.Groups.Any(g => {
// Check for loyalty.
string id = g.GroupID.ToString();
return id == EMD_Dragons.GroupID || id == EMD_Scorpions.GroupID;
})) {
return Ok(new JoinGroupResult { GroupStatus = GroupMembershipStatus.ALREADY_MEMBER });
}
groupID = groupID.ToUpper();
Model.Group? group = ctx.Groups.FirstOrDefault(g => g.GroupID.ToString() == groupID);
if (group != null) {
group.Vikings.Add(viking);
ctx.SaveChanges();
return Ok(new JoinGroupResult { GroupStatus = GroupMembershipStatus.APPROVED });
}
}
return Ok(new JoinGroupResult { GroupStatus = GroupMembershipStatus.REJECTED });
}
[HttpPost]
[Produces("application/xml")]
[Route("GroupWebService.asmx/GetGroupsByGroupType")]
[VikingSession]
public Schema.Group[] GetGroupsByGroupType([FromForm] string apiKey, [FromForm] string groupType) {
AddEMDGroups();
List<Schema.Group> groups = new List<Schema.Group>();
foreach (Model.Group group in ctx.Groups) {
if (group.ApiKey == apiKey && group.Type.ToString() == groupType) groups.Add(new Schema.Group {
GroupID = group.GroupID.ToString(),
Name = group.Name,
Color = group.Color,
Logo = group.Logo,
Type = group.Type
});
}
return groups.ToArray();
}
private void AddEMDGroups() {
bool changed = false;
Guid DragonString = new Guid(EMD_Dragons.GroupID);
Guid ScorpionString = new Guid(EMD_Scorpions.GroupID);
if (!ctx.Groups.Any(g => g.GroupID == DragonString)) {
ctx.Groups.Add(new Model.Group {
GroupID = DragonString,
Name = EMD_Dragons.Name,
Color = EMD_Dragons.Color,
Logo = EMD_Dragons.Logo,
Type = GroupType.System,
ApiKey = "dd602cf1-cc98-4738-9a0a-56dde3026947"
});
changed = true;
}
if (!ctx.Groups.Any(g => g.GroupID == ScorpionString)) {
ctx.Groups.Add(new Model.Group {
GroupID = ScorpionString,
Name = EMD_Scorpions.Name,
Color = EMD_Scorpions.Color,
Logo = EMD_Scorpions.Logo,
Type = GroupType.System,
ApiKey = "dd602cf1-cc98-4738-9a0a-56dde3026947"
});
changed = true;
}
if (changed) ctx.SaveChanges();
}
}

View File

@ -59,9 +59,9 @@ public class ItemStoreController : Controller {
public IActionResult GetRankAttributeData([FromForm] string apiKey) { public IActionResult GetRankAttributeData([FromForm] string apiKey) {
uint gameVersion = ClientVersion.GetVersion(apiKey); uint gameVersion = ClientVersion.GetVersion(apiKey);
if (gameVersion == ClientVersion.MB) if (gameVersion == ClientVersion.MB)
return Ok(XmlUtil.ReadResourceXmlString("rankattrib_mb")); return Ok(XmlUtil.ReadResourceXmlString("ranks.rankattrib_mb"));
// TODO, this is a placeholder // TODO, this is a placeholder
return Ok(XmlUtil.ReadResourceXmlString("rankattrib")); return Ok(XmlUtil.ReadResourceXmlString("ranks.rankattrib"));
} }
[Route("ItemStoreWebService.asmx/GetAssetVersions")] [Route("ItemStoreWebService.asmx/GetAssetVersions")]

View File

@ -152,6 +152,22 @@ public class ProfileController : Controller {
UserGameCurrency currency = achievementService.GetUserCurrency(viking); UserGameCurrency currency = achievementService.GetUserCurrency(viking);
ICollection<Model.Group> groups = viking.Groups;
UserProfileGroupData[] groupData = new UserProfileGroupData[groups.Count];
int i = 0;
foreach (Model.Group group in groups) {
groupData[i] = new UserProfileGroupData {
GroupID = group.GroupID.ToString(),
Name = group.Name,
Color = group.Color,
Logo = group.Logo,
TypeID = (int)group.Type,
RoleID = 0
};
i++;
}
return new UserProfileData { return new UserProfileData {
ID = viking.Uid.ToString(), ID = viking.Uid.ToString(),
AvatarInfo = avatar, AvatarInfo = avatar,
@ -169,7 +185,8 @@ public class ProfileController : Controller {
ProfileTags = new List<ProfileTag>(), ProfileTags = new List<ProfileTag>(),
UserID = viking.Uid, UserID = viking.Uid,
UserProfileTagID = 1 UserProfileTagID = 1
} },
Groups = groupData
}; };
} }
} }

View File

@ -1,5 +1,6 @@
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using sodoff.Attributes;
using sodoff.Model; using sodoff.Model;
using sodoff.Schema; using sodoff.Schema;
using sodoff.Util; using sodoff.Util;
@ -8,6 +9,12 @@ namespace sodoff.Controllers.Common;
public class RatingController : Controller public class RatingController : Controller
{ {
private readonly DBContext ctx;
public RatingController(DBContext ctx) {
this.ctx = ctx;
}
[HttpPost] [HttpPost]
[Produces("application/xml")] [Produces("application/xml")]
[Route("MissionWebService.asmx/GetPayout")] // used by World Of Jumpstart [Route("MissionWebService.asmx/GetPayout")] // used by World Of Jumpstart
@ -79,6 +86,30 @@ public class RatingController : Controller
case string x when x.StartsWith("MSCnDucky"): case string x when x.StartsWith("MSCnDucky"):
return Ok(60); return Ok(60);
case string x when x.StartsWith("Calendar"):
return Ok(points / 40);
case string x when x.StartsWith("PearlPush"):
return Ok(points / 20);
case string x when x.StartsWith("FLLetItRide"):
return Ok(points <= 28 ? 2 : 5);
case string x when x.StartsWith("FLLetItRideMastered"):
return Ok(points <= 15 ? 4 :
points <= 25 ? 6 :
points <= 35 ? 9 :
points <= 45 ? 12 : 15);
case string x when x.StartsWith("FashionShowWin"):
return Ok(points >= 1 ? 20 : 0);
case string x when x.StartsWith("FashionShowLose"):
return Ok(points >= 0 ? 10 : 0);
case string x when x.StartsWith("FashionShowTie"):
return Ok(points >= 2 ? 15 : 0);
} }
return Ok(points / (350 / 3)); return Ok(points / (350 / 3));
@ -103,4 +134,161 @@ public class RatingController : Controller
return Ok(5); return Ok(5);
} }
// This method is the only thing that adds ratings.
private RatingInfo SetRating(Viking viking, int category, int? eID, string? uID, int value) {
RatingRank? rank;
Rating? rating = viking.Ratings.FirstOrDefault(
r => category == r.Rank.CategoryID && r.Rank.RatedEntityID == eID && r.Rank.RatedUserID == uID
);
if (rating == null) {
rank = ctx.RatingRanks.FirstOrDefault(rr => rr.CategoryID == category && rr.RatedEntityID == eID && rr.RatedUserID == uID);
if (rank == null) {
rank = new RatingRank {
CategoryID = category,
RatedEntityID = eID,
RatedUserID = uID,
Rank = 0,
Ratings = new List<Rating>()
};
ctx.RatingRanks.Add(rank);
}
rating = new Rating {
VikingId = viking.Id,
Rank = rank
};
ctx.Ratings.Add(rating);
} else {
rank = rating.Rank;
}
rating.Value = value;
rank.RatingAverage = 0;
foreach (Rating r in rank.Ratings) {
rank.RatingAverage += (float)((decimal)r.Value / (decimal)rank.Ratings.Count);
}
if (eID != -1 || uID != null) { // do not sort "single item" (eID == -1 and no uID) category
RatingRank[] ranks = ctx.RatingRanks
.Where(rr => rr != rank && rr.CategoryID == category) // Only rank by category.
.OrderBy(rr => rr.Rank)
.ToArray();
bool resortOthers = false;
rank.Rank = 1; // Start here, work way down.
for (int i=0;i<ranks.Length;i++) {
if (!resortOthers && ranks[i].RatingAverage < rank.RatingAverage) {
rank.Rank = i+1;
resortOthers = true;
}
if (resortOthers) ranks[i].Rank = i+2;
else ranks[i].Rank = i+1;
}
if (!resortOthers) rank.Rank = ranks.Length+1;
}
rating.Date = DateTime.UtcNow;
rank.UpdateDate = rating.Date;
ctx.SaveChanges();
return new RatingInfo() {
Id = rating.Id,
OwnerUid = viking.Uid,
CategoryID = category,
RatedEntityID = eID,
Value = value,
Date = rating.Date
};
}
[HttpPost]
[Produces("application/xml")]
[Route("RatingWebService.asmx/SetRating")]
[VikingSession]
public IActionResult SetRating(Viking viking, [FromForm] int categoryID, [FromForm] int ratedEntityID, [FromForm] int ratedValue) {
return Ok(SetRating(viking, categoryID, ratedEntityID, null, ratedValue));
}
[HttpPost]
[Produces("application/xml")]
[Route("RatingWebService.asmx/SetUserRating")]
[VikingSession]
public IActionResult SetUserRating(Viking viking, [FromForm] int categoryID, [FromForm] string ratedUserID, [FromForm] int ratedValue) {
return Ok(SetRating(viking, categoryID, null, ratedUserID, ratedValue));
}
[HttpPost]
[Produces("application/xml")]
[Route("RatingWebService.asmx/GetRatingByRatedEntity")]
[VikingSession]
public RatingInfo[] GetRatingByRatedEntity(Viking viking, [FromForm] int categoryID, [FromForm] int ratedEntityID) {
return ctx.Ratings
.Where(r => r.Viking == viking && r.Rank.CategoryID == categoryID && r.Rank.RatedEntityID == ratedEntityID && r.Rank.RatedUserID == null)
.Select(r => new RatingInfo {
Id = r.Id,
OwnerUid = r.Viking.Uid,
CategoryID = r.Rank.CategoryID,
RatedEntityID = r.Rank.RatedEntityID,
Value = r.Value,
Date = r.Date
}
).ToArray();
}
[HttpPost]
[Produces("application/xml")]
[Route("RatingWebService.asmx/GetTopRatedByCategoryID")]
public RatingRankInfo[] GetTopRatedByCategoryID([FromForm] int categoryID, [FromForm] int numberOfRecord) {
return ctx.RatingRanks
.Where(rr => categoryID == rr.CategoryID)
.Take(numberOfRecord)
.Select(rr => new RatingRankInfo(rr))
.ToArray();
}
[HttpPost]
[Produces("application/xml")]
[Route("RatingWebService.asmx/GetTopRatedUserByCategoryID")]
public IActionResult GetTopRatedUserByCategoryID([FromForm] int categoryID, [FromForm] int numberOfRecord) {
return Ok(new ArrayOfUserRatingRankInfo {
UserRatingRankInfo = ctx.RatingRanks
.Where(rr => rr.RatedUserID != null && (categoryID == rr.CategoryID
|| (categoryID == 4 && rr.CategoryID == 5) // The party board searches for 4 but the pod rating is set in 5.
))
.OrderBy(rr => rr.Rank)
.Take(numberOfRecord)
.Select(rr => new UserRatingRankInfo { RankInfo = new RatingRankInfo(rr), RatedUserID = new Guid(rr.RatedUserID) })
.ToArray()
});
}
[HttpPost]
[Produces("application/xml")]
[Route("RatingWebService.asmx/GetEntityRatedRank")]
public IActionResult GetEntityRatedRank([FromForm] int categoryID, [FromForm] int ratedEntityID) {
// TODO: Add a shortcut here for shipwreck lagoon tracks.
RatingRank? rank = ctx.RatingRanks.FirstOrDefault(rr => categoryID == rr.CategoryID && rr.RatedEntityID == ratedEntityID);
if (rank == null) return Ok();
return Ok(new RatingRankInfo(rank));
}
[HttpPost]
[Produces("application/xml")]
[Route("RatingWebService.asmx/GetRatingForRatedUser")]
[VikingSession]
public IActionResult GetRatingForRatedUser(Viking viking, [FromForm] int categoryID, [FromForm] string ratedUserID) {
Rating? rating = ctx.Ratings.FirstOrDefault(
r => r.Viking == viking && categoryID == r.Rank.CategoryID && r.Rank.RatedEntityID == null && r.Rank.RatedUserID == ratedUserID
);
return Ok(rating?.Value ?? 0);
}
[HttpPost]
[Produces("application/xml")]
[Route("RatingWebService.asmx/GetRatingForRatedEntity")]
[VikingSession]
public IActionResult GetRatingForRatedEntity(Viking viking, [FromForm] int categoryID, [FromForm] int ratedEntityID) {
Rating? rating = ctx.Ratings.FirstOrDefault(
r => r.Viking == viking && categoryID == r.Rank.CategoryID && r.Rank.RatedEntityID == ratedEntityID && r.Rank.RatedUserID == null
);
return Ok(rating?.Value ?? 0);
}
} }

View File

@ -0,0 +1,15 @@
using System.ComponentModel.DataAnnotations;
using Microsoft.EntityFrameworkCore;
namespace sodoff.Model;
[PrimaryKey(nameof(TaskId), nameof(VikingId))]
public class AchievementTaskState {
public int VikingId { get; set; }
public int TaskId { get; set; }
public int Points { get; set; }
public virtual Viking? Viking { get; set; }
}

View File

@ -25,7 +25,13 @@ public class DBContext : DbContext {
public DbSet<Party> Parties { get; set; } = null!; public DbSet<Party> Parties { get; set; } = null!;
public DbSet<Neighborhood> Neighborhoods { get; set; } = null!; public DbSet<Neighborhood> Neighborhoods { get; set; } = null!;
// we had a brief debate on whether it's neighborhoods or neighborheed // we had a brief debate on whether it's neighborhoods or neighborheed
<<<<<<< HEAD
public DbSet<UserBan> UserBans { get; set; } = null!; public DbSet<UserBan> UserBans { get; set; } = null!;
=======
public DbSet<Group> Groups { get; set; } = null!;
public DbSet<Rating> Ratings { get; set; } = null!;
public DbSet<RatingRank> RatingRanks { get; set; } = null!;
>>>>>>> 13df822608c41690c6744ae8c594368ae1f684b5
private readonly IOptions<ApiServerConfig> config; private readonly IOptions<ApiServerConfig> config;
@ -115,6 +121,9 @@ public class DBContext : DbContext {
builder.Entity<Viking>().HasMany(v => v.TaskStatuses) builder.Entity<Viking>().HasMany(v => v.TaskStatuses)
.WithOne(e => e.Viking); .WithOne(e => e.Viking);
builder.Entity<Viking>().HasMany(v => v.AchievementTaskStates)
.WithOne(e => e.Viking);
builder.Entity<Viking>().HasOne(v => v.SelectedDragon) builder.Entity<Viking>().HasOne(v => v.SelectedDragon)
.WithOne() .WithOne()
.HasForeignKey<Viking>(e => e.SelectedDragonId); .HasForeignKey<Viking>(e => e.SelectedDragonId);
@ -137,6 +146,12 @@ public class DBContext : DbContext {
builder.Entity<Viking>().HasOne(v => v.Neighborhood) builder.Entity<Viking>().HasOne(v => v.Neighborhood)
.WithOne(e => e.Viking); .WithOne(e => e.Viking);
builder.Entity<Viking>().HasMany(v => v.Groups)
.WithMany(e => e.Vikings);
builder.Entity<Viking>().HasMany(v => v.Ratings)
.WithOne(r => r.Viking);
// Dragons // Dragons
builder.Entity<Dragon>().HasOne(d => d.Viking) builder.Entity<Dragon>().HasOne(d => d.Viking)
.WithMany(e => e.Dragons) .WithMany(e => e.Dragons)
@ -219,6 +234,10 @@ public class DBContext : DbContext {
.WithMany(e => e.MissionStates) .WithMany(e => e.MissionStates)
.HasForeignKey(e => e.VikingId); .HasForeignKey(e => e.VikingId);
builder.Entity<AchievementTaskState>().HasOne(m => m.Viking)
.WithMany(e => e.AchievementTaskStates)
.HasForeignKey(e => e.VikingId);
builder.Entity<AchievementPoints>().HasKey(e => new { e.VikingId, e.Type }); builder.Entity<AchievementPoints>().HasKey(e => new { e.VikingId, e.Type });
builder.Entity<AchievementPoints>() builder.Entity<AchievementPoints>()
@ -257,5 +276,21 @@ public class DBContext : DbContext {
builder.Entity<UserBan>().HasOne(r => r.User) builder.Entity<UserBan>().HasOne(r => r.User)
.WithMany(e => e.Bans) .WithMany(e => e.Bans)
.HasForeignKey(e => e.UserId); .HasForeignKey(e => e.UserId);
// Groups
builder.Entity<Group>().HasMany(r => r.Vikings)
.WithMany(e => e.Groups);
// Rating
builder.Entity<Rating>().HasOne(r => r.Viking)
.WithMany(v => v.Ratings)
.HasForeignKey(r => r.VikingId);
builder.Entity<Rating>().HasOne(r => r.Rank)
.WithMany(rr => rr.Ratings)
.HasForeignKey(r => r.RankId);
builder.Entity<RatingRank>().HasMany(rr => rr.Ratings)
.WithOne(r => r.Rank);
} }
} }

25
src/Model/Group.cs Normal file
View File

@ -0,0 +1,25 @@
using sodoff.Schema;
using System.ComponentModel.DataAnnotations;
namespace sodoff.Model;
// Implementation for EMD, add whatever else if needed
public class Group {
[Key]
public int Id { get; set; }
[Required]
public Guid GroupID { get; set; }
public string Name { get; set; }
public GroupType Type { get; set; }
public string Color { get; set; }
public string Logo { get; set; }
public string ApiKey { get; set; }
public virtual ICollection<Viking> Vikings { get; set; } = null!;
}

17
src/Model/Rating.cs Normal file
View File

@ -0,0 +1,17 @@
using System.ComponentModel.DataAnnotations;
namespace sodoff.Model;
public class Rating {
[Key]
public int Id { get; set; }
public int VikingId { get; set; }
public int RankId { get; set; }
public int Value { get; set; }
public DateTime Date { get; set; }
public virtual Viking Viking { get; set; }
public virtual RatingRank Rank { get; set; }
}

18
src/Model/RatingRank.cs Normal file
View File

@ -0,0 +1,18 @@
using System.ComponentModel.DataAnnotations;
namespace sodoff.Model;
public class RatingRank {
[Key]
public int Id { get; set; }
public int CategoryID { get; set; }
public int? RatedEntityID { get; set; }
public string? RatedUserID { get; set; }
public int Rank { get; set; }
public float RatingAverage { get; set; } // On a scale of 1-5
public DateTime UpdateDate { get; set; }
public virtual ICollection<Rating> Ratings { get; set; } = null!;
}

View File

@ -27,6 +27,7 @@ public class Viking {
public virtual ICollection<Image> Images { get; set; } = null!; public virtual ICollection<Image> Images { get; set; } = null!;
public virtual ICollection<MissionState> MissionStates { get; set; } = null!; public virtual ICollection<MissionState> MissionStates { get; set; } = null!;
public virtual ICollection<TaskStatus> TaskStatuses { get; set; } = null!; public virtual ICollection<TaskStatus> TaskStatuses { get; set; } = null!;
public virtual ICollection<AchievementTaskState> AchievementTaskStates { get; set; } = null!;
public virtual ICollection<Room> Rooms { get; set; } = null!; public virtual ICollection<Room> Rooms { get; set; } = null!;
public virtual ICollection<SceneData> SceneData { get; set; } = null!; public virtual ICollection<SceneData> SceneData { get; set; } = null!;
public virtual ICollection<AchievementPoints> AchievementPoints { get; set; } = null!; public virtual ICollection<AchievementPoints> AchievementPoints { get; set; } = null!;
@ -38,9 +39,12 @@ public class Viking {
public virtual ICollection<Party> Parties { get; set; } = null!; public virtual ICollection<Party> Parties { get; set; } = null!;
public virtual ICollection<MMORole> MMORoles { get; set; } = null!; public virtual ICollection<MMORole> MMORoles { get; set; } = null!;
public virtual Neighborhood? Neighborhood { get; set; } = null!; public virtual Neighborhood? Neighborhood { get; set; } = null!;
public virtual ICollection<Group> Groups { get; set; } = null!;
public virtual ICollection<Rating> Ratings { get; set; } = null!;
public virtual Dragon? SelectedDragon { get; set; } public virtual Dragon? SelectedDragon { get; set; }
public DateTime? CreationDate { get; set; } public DateTime? CreationDate { get; set; }
public DateTime? BirthDate { get; set; } public DateTime? BirthDate { get; set; }
public Gender? Gender { get; set; } public Gender? Gender { get; set; }
public uint? GameVersion { get; set; }
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,843 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfAchievementTaskInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://api.jumpstart.com/">
<AchievementTaskInfo>
<AchievementInfoID>12418</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>1</Level>
<MessageID>0</MessageID>
<PointValue>50</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12419</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>2</Level>
<MessageID>0</MessageID>
<PointValue>100</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12420</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>3</Level>
<MessageID>0</MessageID>
<PointValue>150</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12421</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>4</Level>
<MessageID>0</MessageID>
<PointValue>200</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12422</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>5</Level>
<MessageID>0</MessageID>
<PointValue>300</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12423</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>6</Level>
<MessageID>0</MessageID>
<PointValue>400</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12424</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>7</Level>
<MessageID>0</MessageID>
<PointValue>500</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12425</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>8</Level>
<MessageID>0</MessageID>
<PointValue>600</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12426</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>9</Level>
<MessageID>0</MessageID>
<PointValue>700</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12427</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>10</Level>
<MessageID>0</MessageID>
<PointValue>800</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12428</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>11</Level>
<MessageID>0</MessageID>
<PointValue>900</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12429</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>12</Level>
<MessageID>0</MessageID>
<PointValue>1000</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12430</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>13</Level>
<MessageID>0</MessageID>
<PointValue>1500</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12431</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>14</Level>
<MessageID>0</MessageID>
<PointValue>2000</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12432</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>15</Level>
<MessageID>0</MessageID>
<PointValue>2500</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12433</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>16</Level>
<MessageID>0</MessageID>
<PointValue>3000</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12434</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>17</Level>
<MessageID>0</MessageID>
<PointValue>3500</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12435</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>18</Level>
<MessageID>0</MessageID>
<PointValue>4000</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12436</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>19</Level>
<MessageID>0</MessageID>
<PointValue>4500</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12437</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>20</Level>
<MessageID>0</MessageID>
<PointValue>5000</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12438</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>21</Level>
<MessageID>0</MessageID>
<PointValue>5500</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12439</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>22</Level>
<MessageID>0</MessageID>
<PointValue>6000</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12440</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>23</Level>
<MessageID>0</MessageID>
<PointValue>6500</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12441</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>24</Level>
<MessageID>0</MessageID>
<PointValue>7000</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12442</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>25</Level>
<MessageID>0</MessageID>
<PointValue>7500</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12443</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>26</Level>
<MessageID>0</MessageID>
<PointValue>8000</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12444</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>27</Level>
<MessageID>0</MessageID>
<PointValue>8500</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12445</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>28</Level>
<MessageID>0</MessageID>
<PointValue>9000</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12446</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>29</Level>
<MessageID>0</MessageID>
<PointValue>9500</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12447</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>30</Level>
<MessageID>0</MessageID>
<PointValue>10000</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12448</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>31</Level>
<MessageID>0</MessageID>
<PointValue>11000</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12449</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>32</Level>
<MessageID>0</MessageID>
<PointValue>12000</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12450</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>33</Level>
<MessageID>0</MessageID>
<PointValue>13000</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12451</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>34</Level>
<MessageID>0</MessageID>
<PointValue>14000</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12452</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>35</Level>
<MessageID>0</MessageID>
<PointValue>15000</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12453</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>36</Level>
<MessageID>0</MessageID>
<PointValue>16000</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12454</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>37</Level>
<MessageID>0</MessageID>
<PointValue>17000</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12455</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>38</Level>
<MessageID>0</MessageID>
<PointValue>18000</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12456</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>39</Level>
<MessageID>0</MessageID>
<PointValue>19000</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
<AchievementTaskInfo>
<AchievementInfoID>12457</AchievementInfoID>
<AchievementTaskID>2471</AchievementTaskID>
<AchievementTaskGroupID>2418</AchievementTaskGroupID>
<AchievementTaskGroupName>Thawfest 2023 Event Rewards</AchievementTaskGroupName>
<Level>40</Level>
<MessageID>0</MessageID>
<PointValue>20000</PointValue>
<Reproducible>false</Reproducible>
<AllowNonMembers>true</AllowNonMembers>
<Distinct>false</Distinct>
<ProductGroupID>9</ProductGroupID>
<TaskEvent_Points>1</TaskEvent_Points>
<Cumulative>true</Cumulative>
<PreredeemMessageID>0</PreredeemMessageID>
<ValidityFromDate>2023-02-01T00:00:00</ValidityFromDate>
<ValidityToDate>2023-06-07T19:00:00</ValidityToDate>
<isBeyondLevelAllowed>false</isBeyondLevelAllowed>
<VisibilityFromDate>2023-02-01T00:00:00</VisibilityFromDate>
<VisibilityToDate>2023-06-07T19:00:00</VisibilityToDate>
</AchievementTaskInfo>
</ArrayOfAchievementTaskInfo>

View File

@ -1,12 +0,0 @@
<?xml version='1.0' encoding='utf-8'?>
<DefaultMissions>
<!-- list of default mission for most versions (2.9, 3.12, 3.31) -->
<Active>
<id>1750</id>
<id>2298</id>
<id>1044</id>
<id>1074</id>
</Active>
<Upcoming>
</Upcoming>
</DefaultMissions>

View File

@ -0,0 +1,409 @@
<?xml version='1.0' encoding='utf-8'?>
<DefaultMissions>
<!-- list of default mission for Magic and Mythies -->
<Active>
<id>2290</id>
</Active>
<Upcoming>
<id>1739</id>
<id>1750</id>
<id>1751</id>
<id>1752</id>
<id>1753</id>
<id>1754</id>
<id>1756</id>
<id>1757</id>
<id>1761</id>
<id>1763</id>
<id>1764</id>
<id>1766</id>
<id>1767</id>
<id>1768</id>
<id>1770</id>
<id>1772</id>
<id>1773</id>
<id>1776</id>
<id>1792</id>
<id>1793</id>
<id>1795</id>
<id>1798</id>
<id>1799</id>
<id>1800</id>
<id>1803</id>
<id>1804</id>
<id>1805</id>
<id>1807</id>
<id>1808</id>
<id>1809</id>
<id>1811</id>
<id>1814</id>
<id>1816</id>
<id>1820</id>
<id>1825</id>
<id>1826</id>
<id>1827</id>
<id>1829</id>
<id>1830</id>
<id>1831</id>
<id>1832</id>
<id>1833</id>
<id>1834</id>
<id>1835</id>
<id>1836</id>
<id>1837</id>
<id>1838</id>
<id>1839</id>
<id>1840</id>
<id>1841</id>
<id>1842</id>
<id>1843</id>
<id>1844</id>
<id>1845</id>
<id>1846</id>
<id>1847</id>
<id>1848</id>
<id>1849</id>
<id>1850</id>
<id>1851</id>
<id>1852</id>
<id>1853</id>
<id>1854</id>
<id>1855</id>
<id>1856</id>
<id>1857</id>
<id>1858</id>
<id>1859</id>
<id>1860</id>
<id>1861</id>
<id>1862</id>
<id>1863</id>
<id>1864</id>
<id>1865</id>
<id>1866</id>
<id>1867</id>
<id>1868</id>
<id>1869</id>
<id>1870</id>
<id>1871</id>
<id>1872</id>
<id>1873</id>
<id>1874</id>
<id>1875</id>
<id>1876</id>
<id>1877</id>
<id>1878</id>
<id>1879</id>
<id>1880</id>
<id>1881</id>
<id>1882</id>
<id>1883</id>
<id>1884</id>
<id>1885</id>
<id>1886</id>
<id>1887</id>
<id>1888</id>
<id>1889</id>
<id>1890</id>
<id>1891</id>
<id>1892</id>
<id>1893</id>
<id>1894</id>
<id>1895</id>
<id>1896</id>
<id>1897</id>
<id>1898</id>
<id>1899</id>
<id>1900</id>
<id>1901</id>
<id>1902</id>
<id>1903</id>
<id>1904</id>
<id>1905</id>
<id>1906</id>
<id>1907</id>
<id>1908</id>
<id>1909</id>
<id>1910</id>
<id>1911</id>
<id>1912</id>
<id>1913</id>
<id>1914</id>
<id>1915</id>
<id>1916</id>
<id>1917</id>
<id>1918</id>
<id>1919</id>
<id>1920</id>
<id>1921</id>
<id>1922</id>
<id>1923</id>
<id>1924</id>
<id>1925</id>
<id>1926</id>
<id>1927</id>
<id>1928</id>
<id>1929</id>
<id>1930</id>
<id>1931</id>
<id>1932</id>
<id>1933</id>
<id>1934</id>
<id>1935</id>
<id>1936</id>
<id>1937</id>
<id>1938</id>
<id>1939</id>
<id>1940</id>
<id>1941</id>
<id>1942</id>
<id>1943</id>
<id>1944</id>
<id>1945</id>
<id>1946</id>
<id>1947</id>
<id>1948</id>
<id>1949</id>
<id>1950</id>
<id>1951</id>
<id>1952</id>
<id>1953</id>
<id>1954</id>
<id>1955</id>
<id>1956</id>
<id>1957</id>
<id>1958</id>
<id>1959</id>
<id>1960</id>
<id>1981</id>
<id>1982</id>
<id>1983</id>
<id>1988</id>
<id>1989</id>
<id>1992</id>
<id>1993</id>
<id>1994</id>
<id>1995</id>
<id>1996</id>
<id>1997</id>
<id>1998</id>
<id>1999</id>
<id>2000</id>
<id>2001</id>
<id>2002</id>
<id>2003</id>
<id>2004</id>
<id>2005</id>
<id>2006</id>
<id>2007</id>
<id>2008</id>
<id>2009</id>
<id>2010</id>
<id>2011</id>
<id>2012</id>
<id>2013</id>
<id>2014</id>
<id>2015</id>
<id>2016</id>
<id>2017</id>
<id>2018</id>
<id>2019</id>
<id>2020</id>
<id>2021</id>
<id>2022</id>
<id>2023</id>
<id>2024</id>
<id>2025</id>
<id>2026</id>
<id>2027</id>
<id>2028</id>
<id>2029</id>
<id>2030</id>
<id>2031</id>
<id>2032</id>
<id>2033</id>
<id>2034</id>
<id>2035</id>
<id>2036</id>
<id>2037</id>
<id>2038</id>
<id>2039</id>
<id>2040</id>
<id>2041</id>
<id>2042</id>
<id>2043</id>
<id>2044</id>
<id>2045</id>
<id>2046</id>
<id>2047</id>
<id>2048</id>
<id>2049</id>
<id>2050</id>
<id>2051</id>
<id>2052</id>
<id>2053</id>
<id>2054</id>
<id>2055</id>
<id>2056</id>
<id>2057</id>
<id>2058</id>
<id>2059</id>
<id>2060</id>
<id>2061</id>
<id>2062</id>
<id>2063</id>
<id>2064</id>
<id>2065</id>
<id>2066</id>
<id>2067</id>
<id>2068</id>
<id>2069</id>
<id>2070</id>
<id>2071</id>
<id>2072</id>
<id>2073</id>
<id>2074</id>
<id>2075</id>
<id>2076</id>
<id>2077</id>
<id>2078</id>
<id>2079</id>
<id>2080</id>
<id>2081</id>
<id>2082</id>
<id>2083</id>
<id>2084</id>
<id>2085</id>
<id>2086</id>
<id>2087</id>
<id>2088</id>
<id>2089</id>
<id>2090</id>
<id>2091</id>
<id>2092</id>
<id>2093</id>
<id>2094</id>
<id>2095</id>
<id>2096</id>
<id>2097</id>
<id>2098</id>
<id>2099</id>
<id>2100</id>
<id>2101</id>
<id>2102</id>
<id>2103</id>
<id>2104</id>
<id>2105</id>
<id>2106</id>
<id>2107</id>
<id>2108</id>
<id>2109</id>
<id>2110</id>
<id>2111</id>
<id>2112</id>
<id>2113</id>
<id>2114</id>
<id>2115</id>
<id>2116</id>
<id>2117</id>
<id>2118</id>
<id>2119</id>
<id>2120</id>
<id>2121</id>
<id>2122</id>
<id>2123</id>
<id>2124</id>
<id>2125</id>
<id>2126</id>
<id>2127</id>
<id>2128</id>
<id>2129</id>
<id>2130</id>
<id>2131</id>
<id>2132</id>
<id>2133</id>
<id>2134</id>
<id>2135</id>
<id>2136</id>
<id>2137</id>
<id>2138</id>
<id>2140</id>
<id>2142</id>
<id>2145</id>
<id>2146</id>
<id>2149</id>
<id>2151</id>
<id>2152</id>
<id>2158</id>
<id>2160</id>
<id>2161</id>
<id>2162</id>
<id>2163</id>
<id>2164</id>
<id>2165</id>
<id>2166</id>
<id>2167</id>
<id>2168</id>
<id>2169</id>
<id>2170</id>
<id>2171</id>
<id>2172</id>
<id>2173</id>
<id>2189</id>
<id>2190</id>
<id>2192</id>
<id>2193</id>
<id>2202</id>
<id>2236</id>
<id>2237</id>
<id>2238</id>
<id>2239</id>
<id>2240</id>
<id>2241</id>
<id>2242</id>
<id>2243</id>
<id>2244</id>
<id>2245</id>
<id>2246</id>
<id>2247</id>
<id>2248</id>
<id>2249</id>
<id>2250</id>
<id>2251</id>
<id>2252</id>
<id>2253</id>
<id>2254</id>
<id>2255</id>
<id>2256</id>
<id>2257</id>
<id>2258</id>
<id>2259</id>
<id>2260</id>
<id>2261</id>
<id>2262</id>
<id>2263</id>
<id>2264</id>
<id>2265</id>
<id>2266</id>
<id>2267</id>
<id>2268</id>
<id>2269</id>
<id>2270</id>
<id>2271</id>
<id>2272</id>
<id>2273</id>
<id>2274</id>
<id>2275</id>
<id>2276</id>
<id>2277</id>
<id>2278</id>
<id>2279</id>
<id>2280</id>
<id>2281</id>
<id>2282</id>
<id>2283</id>
<id>2297</id>
<id>2301</id>
<id>2305</id>
<id>2306</id>
</Upcoming>
</DefaultMissions>

View File

@ -9,5 +9,7 @@
<id>1512</id> <id>1512</id>
<id>1513</id> <id>1513</id>
<id>1514</id> <id>1514</id>
<id>1651</id>
<id>1653</id>
</Upcoming> </Upcoming>
</DefaultMissions> </DefaultMissions>

File diff suppressed because it is too large Load Diff

View File

@ -125774,186 +125774,4 @@
</AR> </AR>
<RPT>false</RPT> <RPT>false</RPT>
</Mission> </Mission>
<Mission xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<I>1750</I> <!-- fake, completed mission for unlock fishing in Magic and Mythies -->
<N>Unlock Fishing</N>
<G>3</G>
<S></S>
<A>false</A>
<C>1</C>
<MR>
<Prerequisites>
<Type>2</Type>
<Value>False</Value>
<Quantity>0</Quantity>
<ClientRule>false</ClientRule>
</Prerequisites>
<Prerequisites>
<Type>1</Type>
<Value>False</Value>
<Quantity>0</Quantity>
<ClientRule>false</ClientRule>
</Prerequisites>
<Criteria>
<Type>all</Type>
<Ordered>true</Ordered>
<Min>1</Min>
<Repeat>0</Repeat>
<RuleItems>
<Type>1</Type>
<MissionID>1750</MissionID>
<ID>1000</ID>
<Complete>1</Complete>
</RuleItems>
</Criteria>
</MR>
<V>1</V>
<AID>0</AID>
<AAID>0</AAID>
<Task>
<I>1000</I>
<N>Unlock Fishing</N>
<S></S>
<C>1</C>
<F>false</F>
</Task>
<RPT>false</RPT>
</Mission>
<Mission xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<I>2298</I> <!-- fake, completed mission for unlock manna fishing in Magic and Mythies -->
<N>Unlock Fishing</N>
<G>3</G>
<S></S>
<A>false</A>
<C>1</C>
<MR>
<Prerequisites>
<Type>2</Type>
<Value>False</Value>
<Quantity>0</Quantity>
<ClientRule>false</ClientRule>
</Prerequisites>
<Prerequisites>
<Type>1</Type>
<Value>False</Value>
<Quantity>0</Quantity>
<ClientRule>false</ClientRule>
</Prerequisites>
<Criteria>
<Type>all</Type>
<Ordered>true</Ordered>
<Min>1</Min>
<Repeat>0</Repeat>
<RuleItems>
<Type>1</Type>
<MissionID>2298</MissionID>
<ID>1000</ID>
<Complete>1</Complete>
</RuleItems>
</Criteria>
</MR>
<V>1</V>
<AID>0</AID>
<AAID>0</AAID>
<Task>
<I>1000</I>
<N>Unlock Fishing</N>
<S></S>
<C>1</C>
<F>false</F>
</Task>
<RPT>false</RPT>
</Mission>
<Mission xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<I>11044</I> <!-- fake, not-completed mission for unlock mythie grow up (baby -> teen) in Magic and Mythies -->
<!-- must be send to client as 1044, due to entry in MissionManagerDO -> _PetStageQuestData required "baby" state for dragon doing this mission -->
<N>Unlock Grow Up</N>
<G>3</G>
<S></S>
<A>false</A>
<C>0</C>
<MR>
<Prerequisites>
<Type>1</Type>
<Value>False</Value>
<Quantity>0</Quantity>
<ClientRule>false</ClientRule>
</Prerequisites>
<Prerequisites>
<Type>4</Type>
<Value>8,5</Value>
<Quantity>0</Quantity>
<ClientRule>true</ClientRule>
</Prerequisites>
<Criteria>
<Type>all</Type>
<Ordered>true</Ordered>
<Min>1</Min>
<Repeat>1</Repeat>
<RuleItems>
<Type>1</Type>
<MissionID>1044</MissionID>
<ID>11044</ID>
<Complete>0</Complete>
</RuleItems>
</Criteria>
</MR>
<V>1</V>
<AID>0</AID>
<AAID>0</AAID>
<Task>
<I>11044</I>
<N>Unlock Grow Up</N>
<S>&lt;Data>&lt;Objective>&lt;Pair>&lt;Key>Name&lt;/Key>&lt;Value>GrowDragon&lt;/Value>&lt;/Pair>&lt;/Objective>&lt;Type>Action&lt;/Type>&lt;/Data></S>
<C>0</C>
<F>false</F>
</Task>
<RPT>true</RPT>
</Mission>
<Mission xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<I>11074</I> <!-- fake, not-completed mission for unlock mythie grow up (teen -> adult) in Magic and Mythies -->
<!-- must be send to client as 1044, due to entry in MissionManagerDO -> _PetStageQuestData required "teen" state for dragon doing this mission -->
<N>Unlock Grow Up</N>
<G>3</G>
<S></S>
<A>false</A>
<C>0</C>
<MR>
<Prerequisites>
<Type>1</Type>
<Value>False</Value>
<Quantity>0</Quantity>
<ClientRule>false</ClientRule>
</Prerequisites>
<Prerequisites>
<Type>4</Type>
<Value>8,10</Value>
<Quantity>0</Quantity>
<ClientRule>true</ClientRule>
</Prerequisites>
<Criteria>
<Type>all</Type>
<Ordered>true</Ordered>
<Min>1</Min>
<Repeat>1</Repeat>
<RuleItems>
<Type>1</Type>
<MissionID>1074</MissionID>
<ID>11074</ID>
<Complete>0</Complete>
</RuleItems>
</Criteria>
</MR>
<V>1</V>
<AID>0</AID>
<AAID>0</AAID>
<Task>
<I>11074</I>
<N>Unlock Grow Up</N>
<S>&lt;Data>&lt;Objective>&lt;Pair>&lt;Key>Name&lt;/Key>&lt;Value>GrowDragon&lt;/Value>&lt;/Pair>&lt;/Objective>&lt;Type>Action&lt;/Type>&lt;/Data></S>
<C>0</C>
<F>false</F>
</Task>
<RPT>true</RPT>
</Mission>
</Missions> </Missions>

File diff suppressed because it is too large Load Diff

View File

@ -1,524 +0,0 @@
<?xml version='1.0' encoding='utf-8'?>
<Missions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Mission>
<RPT>false</RPT>
<I>1509</I>
<N>1. Find an Eggling and hatch it into a Mythie!</N>
<PID>1</PID>
<G>1</G>
<P xsi:nil="true" />
<S>
&lt;Data&gt;&lt;Repeat&gt;0&lt;/Repeat&gt;&lt;Hidden&gt;0&lt;/Hidden&gt;&lt;End&gt;&lt;Type&gt;VO&lt;/Type&gt;&lt;Asset&gt;RS_DATA/JSDirectedS341.unity3d/DlgIvyDirectedM1509End&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/End&gt;&lt;End&gt;&lt;Type&gt;Popup&lt;/Type&gt;&lt;Asset&gt;RS_DATA/PfUiMissionActionDB.unity3d/PfUiMissionActionDB&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;Text&gt;Congratulations! Your egg has hatched into an amazing Mythie! Here are some JumpStars and Coins to help you raise and train it!
&lt;/Text&gt;&lt;ID&gt;923369&lt;/ID&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/End&gt;&lt;Reward&gt;&lt;Asset&gt;RS_DATA/PfUiMissionRewardDB.unity3d/PfUiMissionRewardDB&lt;/Asset&gt;&lt;/Reward&gt;&lt;Title&gt;&lt;Text&gt;Adopt a Mythie&lt;/Text&gt;&lt;ID&gt;923367&lt;/ID&gt;&lt;/Title&gt;&lt;Desc&gt;&lt;Text&gt;Meet Ivy in Enchanted Sanctuary and adopt your very own Mythie!&lt;/Text&gt;&lt;ID&gt;923368&lt;/ID&gt;&lt;/Desc&gt;&lt;/Data&gt;
</S>
<A>false</A>
<C>0</C>
<MR>
<Prerequisites>
<Type>2</Type>
<Value>False</Value>
<ClientRule>false</ClientRule>
</Prerequisites>
<Prerequisites>
<Type>1</Type>
<Value>False</Value>
<ClientRule>false</ClientRule>
</Prerequisites>
<Criteria>
<Type>all</Type>
<Ordered>true</Ordered>
<Min>4</Min>
<Repeat>1</Repeat>
<RuleItems>
<Type>1</Type>
<MissionID>1509</MissionID>
<ID>1195</ID>
<Complete>0</Complete>
</RuleItems>
<RuleItems>
<Type>1</Type>
<MissionID>1509</MissionID>
<ID>1234</ID>
<Complete>0</Complete>
</RuleItems>
<RuleItems>
<Type>1</Type>
<MissionID>1509</MissionID>
<ID>1235</ID>
<Complete>0</Complete>
</RuleItems>
<RuleItems>
<Type>1</Type>
<MissionID>1509</MissionID>
<ID>1196</ID>
<Complete>0</Complete>
</RuleItems>
<RuleItems>
<Type>1</Type>
<MissionID>1509</MissionID>
<ID>1197</ID>
<Complete>0</Complete>
</RuleItems>
<RuleItems>
<Type>1</Type>
<MissionID>1509</MissionID>
<ID>1199</ID>
<Complete>0</Complete>
</RuleItems>
</Criteria>
</MR>
<V>1</V>
<AID>202676</AID>
<AAID>0</AAID>
<Task>
<I>1195</I>
<N>Get an Eggling</N>
<S>
&lt;Data&gt;&lt;Offer&gt;&lt;Type&gt;VO&lt;/Type&gt;&lt;Asset&gt;RS_DATA/TutMissionBoardIntroJS.unity3d/DlgIvyDirectedTut01&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/Offer&gt;&lt;Offer&gt;&lt;Type&gt;Popup&lt;/Type&gt;&lt;ID&gt;934639&lt;/ID&gt;&lt;Asset&gt;RS_DATA/PfUiMissionActionDB.unity3d/PfUiMissionActionDB&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;Text&gt;I'm Ivy and welcome to World of JumpStart. There is so much to do here I want to make sure you donât miss a thing! Meet me in Enchanted Sanctuary to get started.
&lt;/Text&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/Offer&gt;&lt;Objective&gt;&lt;Pair&gt;&lt;Key&gt;Scene&lt;/Key&gt;&lt;Value&gt;SanctuaryBaby&lt;/Value&gt;&lt;/Pair&gt;&lt;Pair&gt;&lt;Key&gt;NPC&lt;/Key&gt;&lt;Value&gt;PfDyan&lt;/Value&gt;&lt;/Pair&gt;&lt;Pair&gt;&lt;Key&gt;Time&lt;/Key&gt;&lt;Value&gt;0&lt;/Value&gt;&lt;/Pair&gt;&lt;Pair&gt;&lt;Key&gt;HideArrow&lt;/Key&gt;&lt;Value&gt;False&lt;/Value&gt;&lt;/Pair&gt;&lt;/Objective&gt;&lt;Type&gt;Meet&lt;/Type&gt;&lt;Title&gt;&lt;Text&gt;Meet Ivy in Enchanted Sanctuary and get your very own Mythie!&lt;/Text&gt;&lt;ID&gt;934637&lt;/ID&gt;&lt;/Title&gt;&lt;Desc&gt;&lt;Text&gt;Meet Ivy in Enchanted Sanctuary. Use the map or portal to get there.&lt;/Text&gt;&lt;ID&gt;934638&lt;/ID&gt;&lt;/Desc&gt;&lt;/Data&gt;
</S>
<C>0</C>
</Task>
<Task>
<I>1196</I>
<N>Tickle Time</N>
<S>&lt;Data&gt;&lt;Offer&gt;&lt;Type&gt;VO&lt;/Type&gt;&lt;Asset&gt;RS_DATA/PenReconM2T4.unity3d/DlgIvyReconM2T4Offer&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/Offer&gt;&lt;End&gt;&lt;Type&gt;VO&lt;/Type&gt;&lt;Asset&gt;RS_DATA/PenReconM2T4.unity3d/DlgIvyReconM2T4End&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/End&gt;&lt;Objective&gt;&lt;Pair&gt;&lt;Key&gt;Scene&lt;/Key&gt;&lt;Value&gt;SanctuaryBaby&lt;/Value&gt;&lt;/Pair&gt;&lt;Pair&gt;&lt;Key&gt;Name&lt;/Key&gt;&lt;Value&gt;EgglingTickle&lt;/Value&gt;&lt;/Pair&gt;&lt;/Objective&gt;&lt;Type&gt;Action&lt;/Type&gt;&lt;Title&gt;&lt;Text&gt;Tickle Time&lt;/Text&gt;&lt;ID&gt;934640&lt;/ID&gt;&lt;/Title&gt;&lt;Desc&gt;&lt;Text&gt;Click on your Eggling and choose tickle!&lt;/Text&gt;&lt;ID&gt;934641&lt;/ID&gt;&lt;/Desc&gt;&lt;AutoComplete&gt;&lt;Pair&gt;&lt;Key&gt;RaisedPetStage&lt;/Key&gt;&lt;Value&gt;HATCHING&lt;/Value&gt;&lt;/Pair&gt;&lt;/AutoComplete&gt;&lt;/Data&gt;</S>
<C>0</C>
</Task>
<Task>
<I>1197</I>
<N>Dance</N>
<S>&lt;Data&gt;&lt;Offer&gt;&lt;Type&gt;VO&lt;/Type&gt;&lt;Asset&gt;RS_DATA/PenReconM2T5.unity3d/DlgIvyReconM2T5Offer&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/Offer&gt;&lt;End&gt;&lt;Type&gt;VO&lt;/Type&gt;&lt;Asset&gt;RS_DATA/PenReconM2T5.unity3d/DlgIvyReconM2T5End&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/End&gt;&lt;Objective&gt;&lt;Pair&gt;&lt;Key&gt;Name&lt;/Key&gt;&lt;Value&gt;EgglingDance&lt;/Value&gt;&lt;/Pair&gt;&lt;/Objective&gt;&lt;Type&gt;Action&lt;/Type&gt;&lt;Title&gt;&lt;Text&gt;Dance&lt;/Text&gt;&lt;ID&gt;934642&lt;/ID&gt;&lt;/Title&gt;&lt;Desc&gt;&lt;Text&gt;Click on your Eggling and choose Dance.&lt;/Text&gt;&lt;ID&gt;934643&lt;/ID&gt;&lt;/Desc&gt;&lt;AutoComplete&gt;&lt;Pair&gt;&lt;Key&gt;RaisedPetStage&lt;/Key&gt;&lt;Value&gt;HATCHING&lt;/Value&gt;&lt;/Pair&gt;&lt;/AutoComplete&gt;&lt;/Data&gt;</S>
<C>0</C>
</Task>
<Task>
<I>1199</I>
<N>Take your Eggling to the Hatchery</N>
<S>&lt;Data&gt;&lt;Offer&gt;&lt;Type&gt;VO&lt;/Type&gt;&lt;Asset&gt;RS_DATA/PenReconM2T6.unity3d/DlgIvyReconM2T6Offer&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/Offer&gt;&lt;Objective&gt;&lt;Pair&gt;&lt;Key&gt;Scene&lt;/Key&gt;&lt;Value&gt;SanctuaryEggulator&lt;/Value&gt;&lt;/Pair&gt;&lt;Pair&gt;&lt;Key&gt;Time&lt;/Key&gt;&lt;Value&gt;0&lt;/Value&gt;&lt;/Pair&gt;&lt;Pair&gt;&lt;Key&gt;HideArrow&lt;/Key&gt;&lt;Value&gt;False&lt;/Value&gt;&lt;/Pair&gt;&lt;/Objective&gt;&lt;Type&gt;Visit&lt;/Type&gt;&lt;Title&gt;&lt;Text&gt;Take your Eggling to the Hatchery&lt;/Text&gt;&lt;ID&gt;934644&lt;/ID&gt;&lt;/Title&gt;&lt;Desc&gt;&lt;Text&gt;Take your Eggling to the Hatchery in Enchanted Sanctuary.&lt;/Text&gt;&lt;/Desc&gt;&lt;AutoComplete&gt;&lt;Pair&gt;&lt;Key&gt;RaisedPetStage&lt;/Key&gt;&lt;Value&gt;HATCHING&lt;/Value&gt;&lt;/Pair&gt;&lt;/AutoComplete&gt;&lt;/Data&gt;</S>
<C>0</C>
</Task>
<Task>
<I>1234</I>
<N>Collect Hearts</N>
<S>
&lt;Data&gt;&lt;Offer&gt;&lt;Type&gt;VO&lt;/Type&gt;&lt;Asset&gt;RS_DATA/PenReconM2T2.unity3d/DlgIvyReconM2T2Offer&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/Offer&gt;&lt;End&gt;&lt;Type&gt;VO&lt;/Type&gt;&lt;Asset&gt;RS_DATA/PenReconM2T2.unity3d/DlgIvyReconM2T2End&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/End&gt;&lt;Objective&gt;&lt;Pair&gt;&lt;Key&gt;Scene&lt;/Key&gt;&lt;Value&gt;SanctuaryBaby&lt;/Value&gt;&lt;/Pair&gt;&lt;Pair&gt;&lt;Key&gt;Name&lt;/Key&gt;&lt;Value&gt;ESHearts&lt;/Value&gt;&lt;/Pair&gt;&lt;Pair&gt;&lt;Key&gt;Quantity&lt;/Key&gt;&lt;Value&gt;1&lt;/Value&gt;&lt;/Pair&gt;&lt;/Objective&gt;&lt;Type&gt;Collect&lt;/Type&gt;&lt;Title&gt;&lt;Text&gt;Collect 5 hearts around Enchanted Sanctuary&lt;/Text&gt;&lt;ID&gt;934646&lt;/ID&gt;&lt;/Title&gt;&lt;Desc&gt;&lt;Text&gt;Collect some hearts to power up the eggulator.
&lt;/Text&gt;&lt;ID&gt;934647&lt;/ID&gt;&lt;/Desc&gt;&lt;AutoComplete&gt;&lt;Pair&gt;&lt;Key&gt;RaisedPetStage&lt;/Key&gt;&lt;Value&gt;FIND&lt;/Value&gt;&lt;/Pair&gt;&lt;/AutoComplete&gt;&lt;/Data&gt;
</S>
<C>0</C>
</Task>
<Task>
<I>1235</I>
<N>Meet Eggling</N>
<S>
&lt;Data&gt;&lt;Offer&gt;&lt;Type&gt;VO&lt;/Type&gt;&lt;Asset&gt;RS_DATA/PenReconM2T3.unity3d/DlgIvyReconM2T3Offer&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/Offer&gt;&lt;Objective&gt;&lt;Pair&gt;&lt;Key&gt;Scene&lt;/Key&gt;&lt;Value&gt;SanctuaryBaby&lt;/Value&gt;&lt;/Pair&gt;&lt;Pair&gt;&lt;Key&gt;NPC&lt;/Key&gt;&lt;Value&gt;PfMythieEggling&lt;/Value&gt;&lt;/Pair&gt;&lt;Pair&gt;&lt;Key&gt;Time&lt;/Key&gt;&lt;Value&gt;0&lt;/Value&gt;&lt;/Pair&gt;&lt;Pair&gt;&lt;Key&gt;HideArrow&lt;/Key&gt;&lt;Value&gt;False&lt;/Value&gt;&lt;/Pair&gt;&lt;/Objective&gt;&lt;Type&gt;Meet&lt;/Type&gt;&lt;Title&gt;&lt;Text&gt;Go to the Egg Nest and get an eggling!&lt;/Text&gt;&lt;ID&gt;934648&lt;/ID&gt;&lt;/Title&gt;&lt;Desc&gt;&lt;Text&gt;Follow the magic fairy dust to the Egg Nest to get an Egg.
&lt;/Text&gt;&lt;ID&gt;934649&lt;/ID&gt;&lt;/Desc&gt;&lt;AutoComplete&gt;&lt;Pair&gt;&lt;Key&gt;RaisedPetStage&lt;/Key&gt;&lt;Value&gt;EGGINHAND&lt;/Value&gt;&lt;/Pair&gt;&lt;/AutoComplete&gt;&lt;/Data&gt;
</S>
<C>0</C>
</Task>
<AR>
<a>5</a>
<p>1</p>
<i xsi:nil="true" />
<t>1</t>
<r>3</r>
<ii>0</ii>
<ai>202676</ai>
<amulti>true</amulti>
<mina>5</mina>
<maxa>5</maxa>
<d xsi:nil="true" />
<cid>0</cid>
<ui xsi:nil="true" />
<atinfoid>0</atinfoid>
<atid>0</atid>
</AR>
<AR>
<a>25</a>
<p>2</p>
<i xsi:nil="true" />
<t>1</t>
<r>21</r>
<ii>0</ii>
<ai>202676</ai>
<amulti>true</amulti>
<mina>25</mina>
<maxa>25</maxa>
<d xsi:nil="true" />
<cid>0</cid>
<ui xsi:nil="true" />
<atinfoid>0</atinfoid>
<atid>0</atid>
</AR>
</Mission>
<Mission>
<RPT>false</RPT>
<I>1512</I>
<N>5. Ready! Set! Go!</N>
<PID>1</PID>
<G>1</G>
<P xsi:nil="true" />
<S>&lt;Data&gt;&lt;Repeat&gt;0&lt;/Repeat&gt;&lt;Hidden&gt;0&lt;/Hidden&gt;&lt;End&gt;&lt;Type&gt;Popup&lt;/Type&gt;&lt;Asset&gt;RS_DATA/PfUiMissionActionDB.unity3d/PfUiMissionActionDB&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;Text&gt;1st place performance Jumpee! With your skills you're going to do well here! Here are some JumpStars and Coins for all your hard work!&lt;/Text&gt;&lt;ID&gt;923379&lt;/ID&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/End&gt;&lt;End&gt;&lt;Type&gt;VO&lt;/Type&gt;&lt;Asset&gt;S_DATA/JSDirectedS342.unity3d/DlgIvyDirectedM1512End&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/End&gt;&lt;Reward&gt;&lt;Asset&gt;RS_DATA/PfUiMissionRewardDB.unity3d/PfUiMissionRewardDB&lt;/Asset&gt;&lt;/Reward&gt;&lt;Title&gt;&lt;Text&gt;Ready! Set! Go!&lt;/Text&gt;&lt;ID&gt;923377&lt;/ID&gt;&lt;/Title&gt;&lt;Desc&gt;&lt;Text&gt;Visit the JS Stadium in DownTown.&lt;/Text&gt;&lt;ID&gt;923378&lt;/ID&gt;&lt;/Desc&gt;&lt;/Data&gt;</S>
<A>false</A>
<C>0</C>
<MR>
<Prerequisites>
<Type>2</Type>
<Value>true</Value>
<ClientRule>false</ClientRule>
</Prerequisites>
<Prerequisites>
<Type>3</Type>
<Value>1743</Value>
<ClientRule>false</ClientRule>
</Prerequisites>
<Prerequisites>
<Type>1</Type>
<Value>False</Value>
<ClientRule>false</ClientRule>
</Prerequisites>
<Criteria>
<Type>all</Type>
<Ordered>true</Ordered>
<Min>4</Min>
<Repeat>1</Repeat>
<RuleItems>
<Type>1</Type>
<MissionID>1512</MissionID>
<ID>1202</ID>
<Complete>0</Complete>
</RuleItems>
</Criteria>
</MR>
<V>3</V>
<AID>202650</AID>
<AAID>0</AAID>
<Task>
<I>1202</I>
<N>Visit JS Stadium</N>
<S>&lt;Data&gt;&lt;Offer&gt;&lt;Type&gt;VO&lt;/Type&gt;&lt;Asset&gt;RS_DATA/JSDirectedS342.unity3d/DlgIvyS342Offer&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/Offer&gt;&lt;Offer&gt;&lt;Type&gt;Popup&lt;/Type&gt;&lt;ID&gt;934691&lt;/ID&gt;&lt;Asset&gt;RS_DATA/PfUiMissionActionDB.unity3d/PfUiMissionActionDB&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;Text&gt;It's game time! Ready to shoot some hoops, spike a volleyball on the beach or carry the football for a game winning touchdown. Click the OK button to go to the JumpStart Stadium! &lt;/Text&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/Offer&gt;&lt;End&gt;&lt;Type&gt;VO&lt;/Type&gt;&lt;Asset&gt;RS_DATA/JSDirectedS342.unity3d/DlgIvyS342End&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/End&gt;&lt;End&gt;&lt;Type&gt;Popup&lt;/Type&gt;&lt;ID&gt;934692&lt;/ID&gt;&lt;Asset&gt;RS_DATA/PfUiMissionActionDB.unity3d/PfUiMissionActionDB&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;Text&gt;I know you'll give a 1st place performance Jumpee! Go ahead and head down a tunnel to start playing!&lt;/Text&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/End&gt;&lt;Objective&gt;&lt;Pair&gt;&lt;Key&gt;Scene&lt;/Key&gt;&lt;Value&gt;JSStadiumInt&lt;/Value&gt;&lt;/Pair&gt;&lt;/Objective&gt;&lt;Type&gt;Visit&lt;/Type&gt;&lt;Title&gt;&lt;Text&gt;Visit JS Stadium&lt;/Text&gt;&lt;ID&gt;934689&lt;/ID&gt;&lt;/Title&gt;&lt;Desc&gt;&lt;Text&gt;Visit JS Stadium in DownTown.&lt;/Text&gt;&lt;ID&gt;934690&lt;/ID&gt;&lt;/Desc&gt;&lt;/Data&gt;</S>
<C>0</C>
</Task>
<AR>
<a>5</a>
<p>1</p>
<i xsi:nil="true" />
<t>1</t>
<r>3</r>
<ii>0</ii>
<ai>202650</ai>
<amulti>true</amulti>
<mina>5</mina>
<maxa>5</maxa>
<d xsi:nil="true" />
<cid>0</cid>
<ui xsi:nil="true" />
<atinfoid>0</atinfoid>
<atid>0</atid>
</AR>
<AR>
<a>25</a>
<p>2</p>
<i xsi:nil="true" />
<t>1</t>
<r>21</r>
<ii>0</ii>
<ai>202650</ai>
<amulti>true</amulti>
<mina>25</mina>
<maxa>25</maxa>
<d xsi:nil="true" />
<cid>0</cid>
<ui xsi:nil="true" />
<atinfoid>0</atinfoid>
<atid>0</atid>
</AR>
</Mission>
<Mission>
<RPT>false</RPT>
<I>1513</I>
<N>6. It's a Block Party!</N>
<PID>1</PID>
<G>1</G>
<P xsi:nil="true" />
<S>
&lt;Data&gt;&lt;Repeat&gt;0&lt;/Repeat&gt;&lt;Hidden&gt;0&lt;/Hidden&gt;&lt;End&gt;&lt;Type&gt;Popup&lt;/Type&gt;&lt;Asset&gt;RS_DATA/PfUiMissionActionDB.unity3d/PfUiMissionActionDB&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;Text&gt;Your house looks amazing! Party Time! Here are some Coins for you to buy a party or some furniture at the house hut!
&lt;/Text&gt;&lt;ID&gt;923382&lt;/ID&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/End&gt;&lt;End&gt;&lt;Type&gt;VO&lt;/Type&gt;&lt;Asset&gt;S_DATA/JSDirectedS348.unity3d/DlgIvyDirectedM1513End&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/End&gt;&lt;Reward&gt;&lt;Asset&gt;RS_DATA/PfUiMissionRewardDB.unity3d/PfUiMissionRewardDB&lt;/Asset&gt;&lt;/Reward&gt;&lt;Title&gt;&lt;Text&gt;It's a Block Party!&lt;/Text&gt;&lt;ID&gt;923380&lt;/ID&gt;&lt;/Title&gt;&lt;Desc&gt;&lt;Text&gt;Visit your room in My Neighborhood&lt;/Text&gt;&lt;ID&gt;923381&lt;/ID&gt;&lt;/Desc&gt;&lt;/Data&gt;
</S>
<A>false</A>
<C>0</C>
<MR>
<Prerequisites>
<Type>2</Type>
<Value>true</Value>
<ClientRule>false</ClientRule>
</Prerequisites>
<Prerequisites>
<Type>3</Type>
<Value>1743</Value>
<ClientRule>false</ClientRule>
</Prerequisites>
<Prerequisites>
<Type>1</Type>
<Value>False</Value>
<ClientRule>false</ClientRule>
</Prerequisites>
<Criteria>
<Type>all</Type>
<Ordered>true</Ordered>
<Min>4</Min>
<Repeat>1</Repeat>
<RuleItems>
<Type>1</Type>
<MissionID>1513</MissionID>
<ID>1203</ID>
<Complete>0</Complete>
</RuleItems>
</Criteria>
</MR>
<V>3</V>
<AID>202660</AID>
<AAID>0</AAID>
<Task>
<I>1203</I>
<N>Visit Your Room</N>
<S>&lt;Data&gt;&lt;Offer&gt;&lt;Type&gt;VO&lt;/Type&gt;&lt;Asset&gt;RS_DATA/JSDirectedS343.unity3d/DlgIvyS343Offer&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/Offer&gt;&lt;Offer&gt;&lt;Type&gt;Popup&lt;/Type&gt;&lt;ID&gt;934695&lt;/ID&gt;&lt;Asset&gt;RS_DATA/PfUiMissionActionDB.unity3d/PfUiMissionActionDB&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;Text&gt;You have your very own house and neighborhood here at JumpStart! Just find your house inside the neighborhood and head inside to start decorating!&lt;/Text&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/Offer&gt;&lt;End&gt;&lt;Type&gt;VO&lt;/Type&gt;&lt;Asset&gt;RS_DATA/JSDirectedS343.unity3d/DlgIvyS343End&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/End&gt;&lt;End&gt;&lt;Type&gt;Popup&lt;/Type&gt;&lt;ID&gt;934696&lt;/ID&gt;&lt;Asset&gt;RS_DATA/PfUiMissionActionDB.unity3d/PfUiMissionActionDB&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;Text&gt;Block party time! Your house looks so good you have to show it off! You should use the coins you've earned to throw a housewarming party!&lt;/Text&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/End&gt;&lt;Objective&gt;&lt;Pair&gt;&lt;Key&gt;Scene&lt;/Key&gt;&lt;Value&gt;MyRoomsInt&lt;/Value&gt;&lt;/Pair&gt;&lt;/Objective&gt;&lt;Type&gt;Visit&lt;/Type&gt;&lt;Title&gt;&lt;Text&gt;Visit Your Room&lt;/Text&gt;&lt;ID&gt;934693&lt;/ID&gt;&lt;/Title&gt;&lt;Desc&gt;&lt;Text&gt;Visit Your Room in My Neighborhood.&lt;/Text&gt;&lt;ID&gt;934694&lt;/ID&gt;&lt;/Desc&gt;&lt;/Data&gt;</S>
<C>0</C>
</Task>
<AR>
<a>5</a>
<p>1</p>
<i xsi:nil="true" />
<t>1</t>
<r>3</r>
<ii>0</ii>
<ai>202660</ai>
<amulti>true</amulti>
<mina>5</mina>
<maxa>5</maxa>
<d xsi:nil="true" />
<cid>0</cid>
<ui xsi:nil="true" />
<atinfoid>0</atinfoid>
<atid>0</atid>
</AR>
<AR>
<a>25</a>
<p>2</p>
<i xsi:nil="true" />
<t>1</t>
<r>21</r>
<ii>0</ii>
<ai>202660</ai>
<amulti>true</amulti>
<mina>25</mina>
<maxa>25</maxa>
<d xsi:nil="true" />
<cid>0</cid>
<ui xsi:nil="true" />
<atinfoid>0</atinfoid>
<atid>0</atid>
</AR>
</Mission>
<Mission>
<RPT>false</RPT>
<I>1514</I>
<N>7. Want to Hangout with Poseidon?</N>
<PID>1</PID>
<G>1</G>
<P xsi:nil="true" />
<S>&lt;Data&gt;&lt;Repeat&gt;0&lt;/Repeat&gt;&lt;Hidden&gt;0&lt;/Hidden&gt;&lt;End&gt;&lt;Type&gt;VO&lt;/Type&gt;&lt;Asset&gt;S_DATA/JSDirectedS346.unity3d/DlgIvyDirectedM1514End&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/End&gt;&lt;End&gt;&lt;Type&gt;Popup&lt;/Type&gt;&lt;Asset&gt;RS_DATA/PfUiMissionActionDB.unity3d/PfUiMissionActionDB&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;Text&gt;Fantastic! You visited the most happening place in JumpStart! Here are some JumpStars and Coins to spend around!&lt;/Text&gt;&lt;ID&gt;923385&lt;/ID&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/End&gt;&lt;Reward&gt;&lt;Asset&gt;RS_DATA/PfUiMissionRewardDB.unity3d/PfUiMissionRewardDB&lt;/Asset&gt;&lt;/Reward&gt;&lt;Title&gt;&lt;Text&gt;Want to Hangout with Poseidon?&lt;/Text&gt;&lt;ID&gt;923383&lt;/ID&gt;&lt;/Title&gt;&lt;Desc&gt;&lt;Text&gt;Visit the Octolair in Poseidon's Hangout.&lt;/Text&gt;&lt;ID&gt;923384&lt;/ID&gt;&lt;/Desc&gt;&lt;/Data&gt;</S>
<A>false</A>
<C>0</C>
<MR>
<Prerequisites>
<Type>2</Type>
<Value>true</Value>
<ClientRule>false</ClientRule>
</Prerequisites>
<Prerequisites>
<Type>3</Type>
<Value>1743</Value>
<ClientRule>false</ClientRule>
</Prerequisites>
<Prerequisites>
<Type>1</Type>
<Value>False</Value>
<ClientRule>false</ClientRule>
</Prerequisites>
<Criteria>
<Type>all</Type>
<Ordered>true</Ordered>
<Min>4</Min>
<Repeat>1</Repeat>
<RuleItems>
<Type>1</Type>
<MissionID>1514</MissionID>
<ID>1204</ID>
<Complete>0</Complete>
</RuleItems>
</Criteria>
</MR>
<V>3</V>
<AID>202659</AID>
<AAID>0</AAID>
<Task>
<I>1204</I>
<N>Visit the Octolair</N>
<S>&lt;Data&gt;&lt;Offer&gt;&lt;Type&gt;VO&lt;/Type&gt;&lt;Asset&gt;RS_DATA/JSDirectedS346.unity3d/DlgIvyS346Offer&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/Offer&gt;&lt;Offer&gt;&lt;Type&gt;Popup&lt;/Type&gt;&lt;ID&gt;934699&lt;/ID&gt;&lt;Asset&gt;RS_DATA/PfUiMissionActionDB.unity3d/PfUiMissionActionDB&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;Text&gt;Want to watch a live band, dance on stage or compete in a Dance Off! It can all be done in the Octolair in Poseidon's Hangout! Ready to go? Click the OK button to be taken directly there now! &lt;/Text&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/Offer&gt;&lt;End&gt;&lt;Type&gt;VO&lt;/Type&gt;&lt;Asset&gt;RS_DATA/JSDirectedS346.unity3d/DlgIvyS346End&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/End&gt;&lt;End&gt;&lt;Type&gt;Popup&lt;/Type&gt;&lt;ID&gt;934700&lt;/ID&gt;&lt;Asset&gt;RS_DATA/PfUiMissionActionDB.unity3d/PfUiMissionActionDB&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;Text&gt;Poseidon's Hangout is the place to be! Make sure you show off your dance moves on the dance floor and visit your VIP Lounge before you leave!&lt;/Text&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/End&gt;&lt;Objective&gt;&lt;Pair&gt;&lt;Key&gt;Scene&lt;/Key&gt;&lt;Value&gt;LoungeInt&lt;/Value&gt;&lt;/Pair&gt;&lt;/Objective&gt;&lt;Type&gt;Visit&lt;/Type&gt;&lt;Title&gt;&lt;Text&gt;Visit the Octolair&lt;/Text&gt;&lt;ID&gt;934697&lt;/ID&gt;&lt;/Title&gt;&lt;Desc&gt;&lt;Text&gt;Visit the Octolair in Poseidon's Hangout.&lt;/Text&gt;&lt;ID&gt;934698&lt;/ID&gt;&lt;/Desc&gt;&lt;/Data&gt;</S>
<C>0</C>
</Task>
<AR>
<a>5</a>
<p>1</p>
<i xsi:nil="true" />
<t>1</t>
<r>3</r>
<ii>0</ii>
<ai>202659</ai>
<amulti>true</amulti>
<mina>5</mina>
<maxa>5</maxa>
<d xsi:nil="true" />
<cid>0</cid>
<ui xsi:nil="true" />
<atinfoid>0</atinfoid>
<atid>0</atid>
</AR>
<AR>
<a>25</a>
<p>2</p>
<i xsi:nil="true" />
<t>1</t>
<r>21</r>
<ii>0</ii>
<ai>202659</ai>
<amulti>true</amulti>
<mina>25</mina>
<maxa>25</maxa>
<d xsi:nil="true" />
<cid>0</cid>
<ui xsi:nil="true" />
<atinfoid>0</atinfoid>
<atid>0</atid>
</AR>
</Mission>
<Mission>
<RPT>false</RPT>
<I>1743</I>
<N>2. Jumpstart Tour</N>
<PID>3</PID>
<G>1</G>
<P xsi:nil="true" />
<S>&lt;Data&gt;&lt;Repeat&gt;0&lt;/Repeat&gt;&lt;Hidden&gt;0&lt;/Hidden&gt;&lt;Reward&gt;&lt;Asset&gt;RS_DATA/PfUiMissionRewardDB.unity3d/PfUiMissionRewardDB&lt;/Asset&gt;&lt;/Reward&gt;&lt;Title&gt;&lt;Text&gt;Jumpstart Tour&lt;/Text&gt;&lt;ID&gt;934600&lt;/ID&gt;&lt;/Title&gt;&lt;Desc&gt;&lt;Text&gt;Take a tour around Jumpstart and meet new friends!&lt;/Text&gt;&lt;ID&gt;934601&lt;/ID&gt;&lt;/Desc&gt;&lt;/Data&gt;</S>
<A>false</A>
<C>0</C>
<MR>
<Prerequisites>
<Type>2</Type>
<Value>true</Value>
<ClientRule>false</ClientRule>
</Prerequisites>
<Prerequisites>
<Type>3</Type>
<Value>1509</Value>
<ClientRule>false</ClientRule>
</Prerequisites>
<Prerequisites>
<Type>1</Type>
<Value>False</Value>
<ClientRule>false</ClientRule>
</Prerequisites>
<Criteria>
<Type>all</Type>
<Ordered>true</Ordered>
<Min>4</Min>
<Repeat>1</Repeat>
<RuleItems>
<Type>1</Type>
<MissionID>1743</MissionID>
<ID>1781</ID>
<Complete>0</Complete>
</RuleItems>
<RuleItems>
<Type>1</Type>
<MissionID>1743</MissionID>
<ID>1782</ID>
<Complete>0</Complete>
</RuleItems>
<RuleItems>
<Type>1</Type>
<MissionID>1743</MissionID>
<ID>1783</ID>
<Complete>0</Complete>
</RuleItems>
<RuleItems>
<Type>1</Type>
<MissionID>1743</MissionID>
<ID>1784</ID>
<Complete>0</Complete>
</RuleItems>
</Criteria>
</MR>
<V>2</V>
<AID>203011</AID>
<AAID>0</AAID>
<Task>
<I>1781</I>
<N>Windy Hollows Visit</N>
<S>&lt;Data&gt;&lt;Setup&gt;&lt;Scene&gt;Hollows&lt;/Scene&gt;&lt;Asset&gt;RS_DATA/PfEleanor.unity3d/PfEleanor&lt;/Asset&gt;&lt;Location&gt;PfMarker_BroomStickExit&lt;/Location&gt;&lt;Recursive&gt;false&lt;/Recursive&gt;&lt;Persistent&gt;false&lt;/Persistent&gt;&lt;/Setup&gt;&lt;Offer&gt;&lt;Type&gt;Popup&lt;/Type&gt;&lt;ID&gt;934652&lt;/ID&gt;&lt;Asset&gt;RS_DATA/PfUiMissionActionDB.unity3d/PfUiMissionActionDB&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;Text&gt;Windy Hollows is the most magical place here. You can charm your friends into crazy things, play a game of broom ball or fly a broom around the Magic Marsh! Go Meet Eleanor there!&lt;/Text&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/Offer&gt;&lt;Offer&gt;&lt;Type&gt;VO&lt;/Type&gt;&lt;Asset&gt;RS_SOUND/DlgIvyWindyHollows.unity3d/DlgIvyWindyHollows&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/Offer&gt;&lt;End&gt;&lt;Type&gt;Popup&lt;/Type&gt;&lt;ID&gt;934653&lt;/ID&gt;&lt;Asset&gt;RS_DATA/PfUiMissionActionDB.unity3d/PfUiMissionActionDB&lt;/Asset&gt;&lt;NPC&gt;PfEleanor&lt;/NPC&gt;&lt;Text&gt;I've been waiting for you to get here. I'm Eleanor and I'm a new explorer just like you. I can't wait to start the adventures. While you're here, you should play a game or two.&lt;/Text&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/End&gt;&lt;End&gt;&lt;Type&gt;VO&lt;/Type&gt;&lt;Asset&gt;RS_SOUND/DlgEleanorWelcome.unity3d/DlgEleanorWelcome&lt;/Asset&gt;&lt;NPC&gt;PfEleanor&lt;/NPC&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/End&gt;&lt;Objective&gt;&lt;Pair&gt;&lt;Key&gt;Scene&lt;/Key&gt;&lt;Value&gt;Hollows&lt;/Value&gt;&lt;/Pair&gt;&lt;Pair&gt;&lt;Key&gt;NPC&lt;/Key&gt;&lt;Value&gt;PfEleanor&lt;/Value&gt;&lt;/Pair&gt;&lt;Pair&gt;&lt;Key&gt;Time&lt;/Key&gt;&lt;Value&gt;0&lt;/Value&gt;&lt;/Pair&gt;&lt;Pair&gt;&lt;Key&gt;HideArrow&lt;/Key&gt;&lt;Value&gt;False&lt;/Value&gt;&lt;/Pair&gt;&lt;/Objective&gt;&lt;Type&gt;Meet&lt;/Type&gt;&lt;Title&gt;&lt;Text&gt;Meet Eleanor in Windy Hollows to play a game&lt;/Text&gt;&lt;ID&gt;934650&lt;/ID&gt;&lt;/Title&gt;&lt;Desc&gt;&lt;Text&gt;Meet Eleanor in Windy Hollows. Use your map or the portals to get there.&lt;/Text&gt;&lt;ID&gt;934651&lt;/ID&gt;&lt;/Desc&gt;&lt;/Data&gt;</S>
<C>0</C>
</Task>
<Task>
<I>1782</I>
<N>Adventure Canyon Visit</N>
<S>&lt;Data&gt;&lt;Setup&gt;&lt;Scene&gt;AdventureCanyon&lt;/Scene&gt;&lt;Asset&gt;RS_DATA/PfCJ.unity3d/PfCJ&lt;/Asset&gt;&lt;Location&gt;PfMarker_CJMeet&lt;/Location&gt;&lt;Recursive&gt;false&lt;/Recursive&gt;&lt;Persistent&gt;false&lt;/Persistent&gt;&lt;/Setup&gt;&lt;Offer&gt;&lt;Type&gt;Popup&lt;/Type&gt;&lt;ID&gt;934656&lt;/ID&gt;&lt;Asset&gt;RS_DATA/PfUiMissionActionDB.unity3d/PfUiMissionActionDB&lt;/Asset&gt;&lt;NPC&gt;PfEleanor&lt;/NPC&gt;&lt;Text&gt;You're doing such great work! Everyone is talking about your natural explorer skills. You should find CJ now. I hope there will be dancing! CJ is in Adventure Canyon, go meet him now!&lt;/Text&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/Offer&gt;&lt;Offer&gt;&lt;Type&gt;VO&lt;/Type&gt;&lt;Asset&gt;RS_SOUND/DlgEleanorTourEnd.unity3d/DlgEleanorTourEnd&lt;/Asset&gt;&lt;NPC&gt;PfEleanor&lt;/NPC&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/Offer&gt;&lt;End&gt;&lt;Type&gt;Popup&lt;/Type&gt;&lt;ID&gt;934657&lt;/ID&gt;&lt;Asset&gt;RS_DATA/PfUiMissionActionDB.unity3d/PfUiMissionActionDB&lt;/Asset&gt;&lt;NPC&gt;PfCJ&lt;/NPC&gt;&lt;Text&gt;Woo-eee, I'm CJ and I just might be the most adventurous amphibian you'll ever meet. Since you're new, let me show you around. &lt;/Text&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/End&gt;&lt;End&gt;&lt;Type&gt;VO&lt;/Type&gt;&lt;Asset&gt;RS_SOUND/DlgCJWelcome.unity3d/DlgCJWelcome&lt;/Asset&gt;&lt;NPC&gt;PfCJ&lt;/NPC&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/End&gt;&lt;Objective&gt;&lt;Pair&gt;&lt;Key&gt;Scene&lt;/Key&gt;&lt;Value&gt;AdventureCanyon&lt;/Value&gt;&lt;/Pair&gt;&lt;Pair&gt;&lt;Key&gt;NPC&lt;/Key&gt;&lt;Value&gt;PfCJ&lt;/Value&gt;&lt;/Pair&gt;&lt;Pair&gt;&lt;Key&gt;Time&lt;/Key&gt;&lt;Value&gt;0&lt;/Value&gt;&lt;/Pair&gt;&lt;Pair&gt;&lt;Key&gt;HideArrow&lt;/Key&gt;&lt;Value&gt;False&lt;/Value&gt;&lt;/Pair&gt;&lt;/Objective&gt;&lt;Type&gt;Meet&lt;/Type&gt;&lt;Title&gt;&lt;Text&gt;Meet CJ in Adventure Canyon to play Dune Buggy!&lt;/Text&gt;&lt;ID&gt;934654&lt;/ID&gt;&lt;/Title&gt;&lt;Desc&gt;&lt;Text&gt;CJ wants to meet you in Adventure Canyon so he can show you Dune Buggy!&lt;/Text&gt;&lt;ID&gt;934655&lt;/ID&gt;&lt;/Desc&gt;&lt;/Data&gt;</S>
<C>0</C>
</Task>
<Task>
<I>1783</I>
<N>Downtown Visit</N>
<S>&lt;Data&gt;&lt;Setup&gt;&lt;Scene&gt;DownTown&lt;/Scene&gt;&lt;Asset&gt;RS_DATA/PfKisha.unity3d/PfKisha&lt;/Asset&gt;&lt;Location&gt;PfMarker_MeetKisha&lt;/Location&gt;&lt;Recursive&gt;false&lt;/Recursive&gt;&lt;Persistent&gt;false&lt;/Persistent&gt;&lt;/Setup&gt;&lt;Offer&gt;&lt;Type&gt;Popup&lt;/Type&gt;&lt;ID&gt;934660&lt;/ID&gt;&lt;Asset&gt;RS_DATA/PfUiMissionActionDB.unity3d/PfUiMissionActionDB&lt;/Asset&gt;&lt;NPC&gt;PfCJ&lt;/NPC&gt;&lt;Text&gt;Lucky you! Kisha wants to show you something. She's in Downtown! Go meet her there now.&lt;/Text&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/Offer&gt;&lt;Offer&gt;&lt;Type&gt;VO&lt;/Type&gt;&lt;Asset&gt;RS_SOUND/DlgCJTourEnd.unity3d/DlgCJTourEnd&lt;/Asset&gt;&lt;NPC&gt;PfCJ&lt;/NPC&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/Offer&gt;&lt;End&gt;&lt;Type&gt;Popup&lt;/Type&gt;&lt;ID&gt;934661&lt;/ID&gt;&lt;Asset&gt;RS_DATA/PfUiMissionActionDB.unity3d/PfUiMissionActionDB&lt;/Asset&gt;&lt;NPC&gt;PfKisha&lt;/NPC&gt;&lt;Text&gt;Hey there new explorer, it's me Kisha. Let me show you around. &lt;/Text&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/End&gt;&lt;End&gt;&lt;Type&gt;VO&lt;/Type&gt;&lt;Asset&gt;RS_SOUND/DlgKishaWelcome.unity3d/DlgKishaWelcome&lt;/Asset&gt;&lt;NPC&gt;PfKisha&lt;/NPC&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/End&gt;&lt;Objective&gt;&lt;Pair&gt;&lt;Key&gt;Scene&lt;/Key&gt;&lt;Value&gt;DownTown&lt;/Value&gt;&lt;/Pair&gt;&lt;Pair&gt;&lt;Key&gt;NPC&lt;/Key&gt;&lt;Value&gt;PfKisha&lt;/Value&gt;&lt;/Pair&gt;&lt;Pair&gt;&lt;Key&gt;Time&lt;/Key&gt;&lt;Value&gt;0&lt;/Value&gt;&lt;/Pair&gt;&lt;Pair&gt;&lt;Key&gt;HideArrow&lt;/Key&gt;&lt;Value&gt;False&lt;/Value&gt;&lt;/Pair&gt;&lt;/Objective&gt;&lt;Type&gt;Meet&lt;/Type&gt;&lt;Title&gt;&lt;Text&gt;Kisha is waiting for you in Downtown&lt;/Text&gt;&lt;ID&gt;934658&lt;/ID&gt;&lt;/Title&gt;&lt;Desc&gt;&lt;Text&gt;Find Kisha in Dowtown, she would like to meet your mythie.&lt;/Text&gt;&lt;ID&gt;934659&lt;/ID&gt;&lt;/Desc&gt;&lt;/Data&gt;</S>
<C>0</C>
</Task>
<Task>
<I>1784</I>
<N>Enchanted Revisit</N>
<S>&lt;Data&gt;&lt;Setup&gt;&lt;Scene&gt;SanctuaryBaby&lt;/Scene&gt;&lt;Recursive&gt;false&lt;/Recursive&gt;&lt;Persistent&gt;false&lt;/Persistent&gt;&lt;/Setup&gt;&lt;Offer&gt;&lt;Type&gt;Popup&lt;/Type&gt;&lt;ID&gt;934664&lt;/ID&gt;&lt;Asset&gt;RS_DATA/PfUiMissionActionDB.unity3d/PfUiMissionActionDB&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;Text&gt;Come back to the Enchanted Sanctuary and talk to me.&lt;/Text&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/Offer&gt;&lt;Offer&gt;&lt;Type&gt;VO&lt;/Type&gt;&lt;Asset&gt;RS_SOUND/DlgIvyTourEnd.unity3d/DlgIvyTourEnd&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/Offer&gt;&lt;End&gt;&lt;Type&gt;Popup&lt;/Type&gt;&lt;ID&gt;934665&lt;/ID&gt;&lt;Asset&gt;RS_DATA/PfUiMissionActionDB.unity3d/PfUiMissionActionDB&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;Text&gt;Welcome back Jumpee! You've earned a prize!&lt;/Text&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/End&gt;&lt;End&gt;&lt;Type&gt;VO&lt;/Type&gt;&lt;Asset&gt;RS_SOUND/DlgIvyWelcome.unity3d/DlgIvyWelcome&lt;/Asset&gt;&lt;NPC&gt;PfDyan&lt;/NPC&gt;&lt;ItemID&gt;0&lt;/ItemID&gt;&lt;Priority&gt;0&lt;/Priority&gt;&lt;/End&gt;&lt;Objective&gt;&lt;Pair&gt;&lt;Key&gt;Scene&lt;/Key&gt;&lt;Value&gt;SanctuaryBaby&lt;/Value&gt;&lt;/Pair&gt;&lt;Pair&gt;&lt;Key&gt;NPC&lt;/Key&gt;&lt;Value&gt;PfDyan&lt;/Value&gt;&lt;/Pair&gt;&lt;Pair&gt;&lt;Key&gt;Asset&lt;/Key&gt;&lt;Value&gt;RS_DATA/PfDyan.unity3d/PfDyan&lt;/Value&gt;&lt;/Pair&gt;&lt;Pair&gt;&lt;Key&gt;Time&lt;/Key&gt;&lt;Value&gt;0&lt;/Value&gt;&lt;/Pair&gt;&lt;Pair&gt;&lt;Key&gt;HideArrow&lt;/Key&gt;&lt;Value&gt;False&lt;/Value&gt;&lt;/Pair&gt;&lt;/Objective&gt;&lt;Type&gt;Meet&lt;/Type&gt;&lt;Title&gt;&lt;Text&gt;Return to Enchanted Sanctuary to talk with Ivy, she has a reward for you.&lt;/Text&gt;&lt;ID&gt;934662&lt;/ID&gt;&lt;/Title&gt;&lt;Desc&gt;&lt;Text&gt;Ivy wants to give you a gift for meeting all her friends, return to Enchanted Sanctuary to collect it!&lt;/Text&gt;&lt;ID&gt;934663&lt;/ID&gt;&lt;/Desc&gt;&lt;/Data&gt;</S>
<C>0</C>
</Task>
<AR>
<a>5</a>
<p>1</p>
<i xsi:nil="true" />
<t>1</t>
<r>3</r>
<ii>0</ii>
<ai>203011</ai>
<amulti>true</amulti>
<mina>5</mina>
<maxa>5</maxa>
<d xsi:nil="true" />
<cid>0</cid>
<ui xsi:nil="true" />
<atinfoid>0</atinfoid>
<atid>0</atid>
</AR>
<AR>
<a>25</a>
<p>2</p>
<i xsi:nil="true" />
<t>1</t>
<r>21</r>
<ii>0</ii>
<ai>203011</ai>
<amulti>true</amulti>
<mina>25</mina>
<maxa>25</maxa>
<d xsi:nil="true" />
<cid>0</cid>
<ui xsi:nil="true" />
<atinfoid>0</atinfoid>
<atid>0</atid>
</AR>
</Mission>
</Missions>

View File

@ -35,7 +35,21 @@
</MMOServerInfo> </MMOServerInfo>
</Version> </Version>
<!-- Multiple <MMOServerInfo> child can be used instead of <ZoneList> <Version>
<!-- Eat My Dust -->
<VersionMin>0x04000000</VersionMin>
<VersionMax>0x04ffffff</VersionMax>
<ZoneList>BadlandsEMD RoadSideAttractionEMD JunkYardEMD PitRowEMD RacingCircuitEMD MyGarageEMDInt DragonHomeEMD ScorpionHomeEMD CaptureTheFlag CircuitRacing EatMyDust MechanicShopEMDInt</ZoneList>
</Version>
<Version>
<!-- Magic & Mythies -->
<VersionMin>0x80000000</VersionMin>
<VersionMax>0x80ffffff</VersionMax>
<ZoneList>FarmingJSM HubEnchantedJSM HubHollowsJSM HubTreeJSM MythieRaceTrackBroom MythieRaceTrackPet MythieRacingBroom MythieRacingPet StablesJSM TargetPracticeJSM</ZoneList>
</Version>
<!-- Multiple <MMOServerInfo> child can be used instead of <ZoneList>
to provide different MMO servers for different zones (<ZN> tag in <MMOServerInfo>). to provide different MMO servers for different zones (<ZN> tag in <MMOServerInfo>).
For zones not specified in this config, default entry from DWADragonsMain.xml will be used. For zones not specified in this config, default entry from DWADragonsMain.xml will be used.

View File

@ -6601,6 +6601,193 @@ SoD 3.31 main store section and subsection filtering:
<ii>3180</ii> <ii>3180</ii>
<ii>2703</ii> <ii>2703</ii>
</StoreData> </StoreData>
<StoreData>
<i>30024</i>
<s>MainStreet_Vehicles</s>
<d>Vehicles available from MainStreet: Llama, Pony, Skateboard, Ostrich, etc.</d>
<ii>2660</ii>
<ii>2661</ii>
<ii>2662</ii>
<ii>2663</ii>
<ii>2664</ii>
<ii>2665</ii>
<ii>2666</ii>
<ii>2667</ii>
<ii>2668</ii>
<ii>2669</ii>
<ii>2670</ii>
<ii>2671</ii>
<ii>2672</ii>
<ii>2673</ii>
<ii>2674</ii>
<ii>2675</ii>
<ii>2676</ii>
<ii>2677</ii>
<ii>2678</ii>
<ii>2679</ii>
<ii>2680</ii>
<ii>2681</ii>
<ii>2682</ii>
<ii>2683</ii>
<ii>2684</ii>
<ii>2685</ii>
<ii>2686</ii>
<ii>2687</ii>
<ii>2688</ii>
<ii>2689</ii>
<ii>2690</ii>
<ii>2691</ii>
<ii>2692</ii>
<ii>2693</ii>
<ii>2694</ii>
<ii>2695</ii>
<ii>2696</ii>
<ii>2697</ii>
<ii>2698</ii>
<ii>2699</ii>
<ii>2700</ii>
<ii>2701</ii>
<ii>2702</ii>
<ii>2703</ii>
<ii>2704</ii>
<ii>2705</ii>
<ii>2706</ii>
<ii>2707</ii>
<ii>2708</ii>
<ii>2709</ii>
<ii>2710</ii>
<ii>2711</ii>
<ii>2712</ii>
<ii>2713</ii>
<ii>2714</ii>
<ii>2715</ii>
<ii>2716</ii>
<ii>2717</ii>
<ii>2718</ii>
<ii>2735</ii>
<ii>2736</ii>
<ii>2748</ii>
<ii>2749</ii>
<ii>2750</ii>
<ii>2751</ii>
<ii>2752</ii>
<ii>2753</ii>
<ii>2754</ii>
<ii>2755</ii>
<ii>2756</ii>
<ii>2757</ii>
<ii>2758</ii>
<ii>2759</ii>
<ii>2797</ii>
<ii>2798</ii>
<ii>2799</ii>
<ii>2800</ii>
<ii>2801</ii>
<ii>2802</ii>
<ii>2803</ii>
<ii>2804</ii>
<ii>3117</ii>
<ii>3118</ii>
<ii>3119</ii>
<ii>3120</ii>
<ii>3121</ii>
<ii>3179</ii>
<ii>3180</ii>
<ii>3181</ii>
<ii>3182</ii>
<ii>3183</ii>
<ii>3184</ii>
<ii>3185</ii>
<ii>3186</ii>
<ii>3224</ii>
<ii>3225</ii>
<ii>3226</ii>
<ii>3227</ii>
<ii>3265</ii>
<ii>3266</ii>
<ii>3267</ii>
<ii>3268</ii>
<ii>3269</ii>
<ii>3372</ii>
<ii>3415</ii>
<ii>3416</ii>
<ii>3417</ii>
<ii>3418</ii>
<ii>3425</ii>
<ii>3426</ii>
<ii>3427</ii>
<ii>3428</ii>
<ii>3429</ii>
<ii>3430</ii>
<ii>3431</ii>
<ii>3432</ii>
<ii>3433</ii>
<ii>3434</ii>
<ii>3435</ii>
<ii>3436</ii>
<ii>3437</ii>
<ii>3438</ii>
<ii>3439</ii>
<ii>4631</ii>
<ii>4632</ii>
<ii>4633</ii>
<ii>6672</ii>
<ii>6763</ii>
<ii>6764</ii>
<ii>6765</ii>
<ii>6766</ii>
<ii>6767</ii>
<ii>6768</ii>
<ii>6769</ii>
<ii>6770</ii>
<ii>6771</ii>
<ii>6772</ii>
<ii>6773</ii>
<ii>6774</ii>
<ii>6775</ii>
<ii>6776</ii>
<ii>6777</ii>
<ii>6778</ii>
<ii>6779</ii>
<ii>6780</ii>
<ii>6781</ii>
<ii>6782</ii>
<ii>6799</ii>
<ii>6800</ii>
<ii>6942</ii>
<ii>6949</ii>
<ii>6965</ii>
<ii>6966</ii>
<ii>6968</ii>
<ii>6969</ii>
<ii>6974</ii>
<ii>6975</ii>
<ii>6976</ii>
<ii>6979</ii>
<ii>6980</ii>
<ii>6981</ii>
<ii>6982</ii>
<ii>6983</ii>
<ii>6984</ii>
<ii>6985</ii>
<ii>6986</ii>
<ii>6987</ii>
<ii>6988</ii>
<ii>6989</ii>
<ii>6990</ii>
<ii>6995</ii>
<ii>6996</ii>
<ii>6997</ii>
<ii>6998</ii>
<ii>7151</ii>
<ii>7200</ii>
<ii>7201</ii>
<ii>7202</ii>
<ii>7203</ii>
<ii>7204</ii>
<ii>7205</ii>
<ii>7206</ii>
</StoreData>
<StoreData> <StoreData>
<i>25</i> <i>25</i>
<s>JS Petz</s> <s>JS Petz</s>
@ -6734,6 +6921,143 @@ SoD 3.31 main store section and subsection filtering:
<ii>2537</ii> <ii>2537</ii>
<ii>2553</ii> <ii>2553</ii>
</StoreData> </StoreData>
<StoreData>
<i>30025</i>
<s>JS Petz</s>
<d> MainStreet PetStore </d>
<ii>2524</ii>
<ii>2525</ii>
<ii>2526</ii>
<ii>2527</ii>
<ii>2528</ii>
<ii>2529</ii>
<ii>2530</ii>
<ii>2531</ii>
<ii>2532</ii>
<ii>2533</ii>
<ii>2534</ii>
<ii>2535</ii>
<ii>2536</ii>
<ii>2537</ii>
<ii>2538</ii>
<ii>2539</ii>
<ii>2540</ii>
<ii>2541</ii>
<ii>2542</ii>
<ii>2543</ii>
<ii>2544</ii>
<ii>2545</ii>
<ii>2546</ii>
<ii>2547</ii>
<ii>2548</ii>
<ii>2549</ii>
<ii>2550</ii>
<ii>2551</ii>
<ii>2552</ii>
<ii>2553</ii>
<ii>2554</ii>
<ii>2555</ii>
<ii>2556</ii>
<ii>2557</ii>
<ii>2558</ii>
<ii>2559</ii>
<ii>2560</ii>
<ii>2561</ii>
<ii>2562</ii>
<ii>2563</ii>
<ii>2564</ii>
<ii>2565</ii>
<ii>2566</ii>
<ii>2567</ii>
<ii>2568</ii>
<ii>2569</ii>
<ii>2570</ii>
<ii>2571</ii>
<ii>2572</ii>
<ii>2573</ii>
<ii>2574</ii>
<ii>2575</ii>
<ii>2576</ii>
<ii>2577</ii>
<ii>2578</ii>
<ii>2579</ii>
<ii>2580</ii>
<ii>2581</ii>
<ii>2582</ii>
<ii>2583</ii>
<ii>2584</ii>
<ii>2585</ii>
<ii>2586</ii>
<ii>2587</ii>
<ii>2588</ii>
<ii>2589</ii>
<ii>2590</ii>
<ii>2591</ii>
<ii>2592</ii>
<ii>2593</ii>
<ii>2594</ii>
<ii>2595</ii>
<ii>2596</ii>
<ii>2597</ii>
<ii>2598</ii>
<ii>2599</ii>
<ii>2600</ii>
<ii>2601</ii>
<ii>2602</ii>
<ii>2603</ii>
<ii>2604</ii>
<ii>2605</ii>
<ii>2606</ii>
<ii>2607</ii>
<ii>2608</ii>
<ii>2609</ii>
<ii>2610</ii>
<ii>2611</ii>
<ii>2612</ii>
<ii>2613</ii>
<ii>2614</ii>
<ii>2615</ii>
<ii>2616</ii>
<ii>2617</ii>
<ii>2618</ii>
<ii>2619</ii>
<ii>2620</ii>
<ii>2621</ii>
<ii>2622</ii>
<ii>2623</ii>
<ii>2624</ii>
<ii>2625</ii>
<ii>2626</ii>
<ii>2627</ii>
<ii>3144</ii>
<ii>3145</ii>
<ii>3146</ii>
<ii>3147</ii>
<ii>3148</ii>
<ii>3149</ii>
<ii>3150</ii>
<ii>3151</ii>
<ii>3200</ii>
<ii>3201</ii>
<ii>3202</ii>
<ii>3203</ii>
<ii>3215</ii>
<ii>3216</ii>
<ii>3219</ii>
<ii>3420</ii>
<ii>3421</ii>
<ii>3422</ii>
<ii>3423</ii>
<ii>3840</ii>
<ii>3841</ii>
<ii>3842</ii>
<ii>3843</ii>
<ii>3844</ii>
<ii>3845</ii>
<ii>3846</ii>
<ii>4629</ii>
<ii>4630</ii>
</StoreData>
<StoreData> <StoreData>
<i>26</i> <i>26</i>
<s>ML Avatar Default</s> <s>ML Avatar Default</s>

View File

@ -9,6 +9,9 @@ public enum AchievementPointTypes {
[XmlEnum("2")] [XmlEnum("2")]
GameCurrency = 2, // gold GameCurrency = 2, // gold
[XmlEnum("3")]
Unknown3 = 3, // unknown, used in MB AchievementTasks
[XmlEnum("4")] [XmlEnum("4")]
Unknown4 = 4, Unknown4 = 4,

View File

@ -0,0 +1,32 @@
using System.Xml.Serialization;
namespace sodoff.Schema;
[XmlRoot(ElementName = "AchievementTaskInfo", Namespace = "")]
[Serializable]
public class AchievementTaskInfo
{
[XmlElement(ElementName = "AchievementInfoID")]
public int InfoID;
[XmlElement(ElementName = "AchievementTaskID")]
public int TaskID;
[XmlElement(ElementName = "PointValue")]
public int PointValue;
[XmlElement(ElementName = "Reproducible")]
public bool Reproducible;
[XmlElement(ElementName = "AchieventTaskReward")]
public AchievementReward[] Rewards;
[XmlElement(ElementName = "AchievementName")]
public string Name;
[XmlElement(ElementName = "AchievementTaskGroupID")]
public int TaskGroupID;
[XmlElement(ElementName = "Level")]
public int Level;
}

View File

@ -0,0 +1,26 @@
using System.Xml.Serialization;
namespace sodoff.Schema;
[XmlRoot(ElementName = "ATR", Namespace = "")]
[Serializable]
public class AchievementTaskReward
{
[XmlElement(ElementName = "q")]
public int RewardQuantity;
[XmlElement(ElementName = "p")]
public int PointTypeID;
[XmlElement(ElementName = "r")]
public int RewardID;
[XmlElement(ElementName = "pg")]
public int ProductGroupID;
[XmlElement(ElementName = "a")]
public int AchievementInfoID;
[XmlElement(ElementName = "ii", IsNullable = true)]
public int? ItemID;
}

View File

@ -1,14 +0,0 @@
using System.Xml.Serialization;
namespace sodoff.Schema;
[XmlRoot(ElementName = "AchievementsTaskInfo", Namespace = "")]
[Serializable]
public class AchievementsTaskInfo
{
[XmlElement(ElementName = "TID")]
public int TaskID;
[XmlElement(ElementName = "AR")]
public AchievementReward[] AchievementReward;
}

View File

@ -0,0 +1,11 @@
using System.Xml.Serialization;
namespace sodoff.Schema;
[XmlRoot(ElementName = "ArrayOfAchievementTaskInfo", Namespace = "http://api.jumpstart.com/")]
[Serializable]
public class ArrayOfAchievementTaskInfo
{
[XmlElement(ElementName = "AchievementTaskInfo")]
public AchievementTaskInfo[] AchievementTaskInfo;
}

View File

@ -0,0 +1,11 @@
using System.Xml.Serialization;
namespace sodoff.Schema;
[XmlRoot(ElementName = "ArrayOfUserAchievementTask", Namespace = "http://api.jumpstart.com/")]
[Serializable]
public class ArrayOfUserAchievementTask
{
[XmlElement(ElementName = "UserAchievementTask")]
public UserAchievementTask[] UserAchievementTask;
}

View File

@ -0,0 +1,10 @@
using System.Xml.Serialization;
namespace sodoff.Schema;
[XmlRoot(ElementName = "ArrayOfUserRatingRankInfo", Namespace = "")]
[Serializable]
public class ArrayOfUserRatingRankInfo {
[XmlElement(ElementName = "UserRatingRankInfo")]
public UserRatingRankInfo[] UserRatingRankInfo;
}

52
src/Schema/Group.cs Normal file
View File

@ -0,0 +1,52 @@
using System.Xml.Serialization;
namespace sodoff.Schema;
[Serializable]
[XmlRoot(ElementName = "GP", IsNullable = true)]
public class Group {
[XmlElement(ElementName = "G", IsNullable = false)]
public string GroupID;
[XmlElement(ElementName = "N", IsNullable = false)]
public string Name;
[XmlElement(ElementName = "D", IsNullable = false)]
public string Description;
[XmlElement(ElementName = "T", IsNullable = false)]
public GroupType Type;
[XmlElement(ElementName = "O", IsNullable = true)]
public string OwnerID;
[XmlElement(ElementName = "L", IsNullable = true)]
public string Logo;
[XmlElement(ElementName = "C", IsNullable = true)]
public string Color;
[XmlElement(ElementName = "M", IsNullable = true)]
public int? MemberLimit;
[XmlElement(ElementName = "TC", IsNullable = true)]
public int? TotalMemberCount;
[XmlElement(ElementName = "A", IsNullable = false)]
public bool Active;
[XmlElement(ElementName = "P", IsNullable = true)]
public string ParentGroupID;
[XmlElement(ElementName = "PS", IsNullable = true)]
public int? Points;
[XmlElement(ElementName = "RK", IsNullable = true)]
public int? Rank;
[XmlElement(ElementName = "RT", IsNullable = true)]
public int? RankTrend;
[XmlElement(ElementName = "CD")]
public DateTime CreateDate;
}

View File

@ -0,0 +1,18 @@
using System.Xml.Serialization;
namespace sodoff.Schema;
public enum GroupMembershipStatus {
[XmlEnum("1")]
APPROVAL_PENDING = 1,
[XmlEnum("2")]
APPROVED,
[XmlEnum("3")]
REJECTED,
[XmlEnum("4")]
SELF_BLOCKED,
[XmlEnum("5")]
ALREADY_MEMBER,
[XmlEnum("6")]
OTHERS
}

20
src/Schema/GroupType.cs Normal file
View File

@ -0,0 +1,20 @@
using System.Xml.Serialization;
namespace sodoff.Schema;
[XmlRoot(ElementName = "GroupType")]
[Serializable]
public enum GroupType {
[XmlEnum("0")]
None = 0,
[XmlEnum("1")]
System = 1,
[XmlEnum("2")]
Public = 2,
[XmlEnum("3")]
MembersOnly = 3,
[XmlEnum("4")]
Private = 4,
[XmlEnum("5")]
Others = 5
}

View File

@ -0,0 +1,9 @@
using System.Xml.Serialization;
namespace sodoff.Schema;
[XmlRoot(ElementName = "JoinGroupResult", IsNullable = true, Namespace = "")]
public class JoinGroupResult {
[XmlElement(ElementName = "GroupStatus")]
public GroupMembershipStatus GroupStatus;
}

25
src/Schema/RatingInfo.cs Normal file
View File

@ -0,0 +1,25 @@
using System.Xml.Serialization;
namespace sodoff.Schema;
[XmlRoot(ElementName = "RatingInfo", Namespace = "")]
[Serializable]
public class RatingInfo {
[XmlElement(ElementName = "ID")]
public int Id;
[XmlElement(ElementName = "UID")]
public Guid OwnerUid;
[XmlElement(ElementName = "CID")]
public int CategoryID;
[XmlElement(ElementName = "EID")]
public int? RatedEntityID;
[XmlElement(ElementName = "RV")]
public int Value;
[XmlElement(ElementName = "RD")]
public DateTime Date;
}

View File

@ -0,0 +1,41 @@
using sodoff.Model;
using System.Xml.Serialization;
namespace sodoff.Schema;
[XmlRoot(ElementName = "RatingRankInfo", Namespace = "")]
[Serializable]
public class RatingRankInfo {
public RatingRankInfo() {}
public RatingRankInfo(RatingRank rank) {
Id = rank.Id;
CategoryID = rank.CategoryID;
RatedEntityID = rank.RatedEntityID??0;
Rank = rank.Rank;
RatingAverage = rank.RatingAverage;
TotalVotes = rank.Ratings.Count;
UpdateDate = rank.UpdateDate;
}
[XmlElement(ElementName = "ID")]
public int Id;
[XmlElement(ElementName = "CID")]
public int CategoryID;
[XmlElement(ElementName = "EID")]
public int? RatedEntityID;
[XmlElement(ElementName = "R")]
public int Rank;
[XmlElement(ElementName = "RA")]
public float RatingAverage;
[XmlElement(ElementName = "TV")]
public int TotalVotes;
[XmlElement(ElementName = "UD")]
public DateTime UpdateDate;
}

View File

@ -0,0 +1,23 @@
using System.Xml.Serialization;
namespace sodoff.Schema;
[XmlRoot(ElementName = "UAT", Namespace = "")]
[Serializable]
public class UserAchievementTask
{
[XmlElement(ElementName = "gid")]
public int AchievementTaskGroupID;
[XmlElement(ElementName = "aq", IsNullable = true)]
public int? AchievedQuantity; // current points value
[XmlElement(ElementName = "nl", IsNullable = true)]
public int? NextLevel; // next level number
[XmlElement(ElementName = "qr", IsNullable = true)]
public int? QuantityRequired; // points need to reach next level
[XmlElement(ElementName = "ntr", IsNullable = true)]
public AchievementTaskReward[] NextLevelAchievementRewards;
}

View File

@ -0,0 +1,13 @@
using System.Xml.Serialization;
namespace sodoff.Schema;
[XmlRoot(ElementName = "URRI", Namespace = "")]
[Serializable]
public class UserRatingRankInfo {
[XmlElement(ElementName = "RI")]
public RatingRankInfo RankInfo;
[XmlElement(ElementName = "RUID")]
public Guid RatedUserID;
}

View File

@ -82,7 +82,7 @@ namespace sodoff.Services {
viking.AchievementPoints.Add(xpPoints); viking.AchievementPoints.Add(xpPoints);
} }
int initialPoints = xpPoints.Value; int initialPoints = xpPoints.Value;
xpPoints.Value += value ?? 0; xpPoints.Value += value ?? 0;
if (value > 0 && initialPoints > xpPoints.Value) { if (value > 0 && initialPoints > xpPoints.Value) {
@ -154,17 +154,43 @@ namespace sodoff.Services {
} }
} }
public AchievementReward[] ApplyAchievementRewardsByTask(Viking viking, AchievementTask task) { public AchievementTaskSetResponse ApplyAchievementRewardsByTask(Viking viking, int taskID, uint gameVersion) {
var rewards = achievementStore.GetAchievementRewardsByTask(task.TaskID); AchievementTaskState? achievementTaskState = viking.AchievementTaskStates.FirstOrDefault(x => x.TaskId == taskID);
if (rewards != null) { int pointValue = (achievementTaskState?.Points ?? 0);
return ApplyAchievementRewards(viking, rewards); var achievementInfo = achievementStore.GetAchievementTaskInfo(taskID, gameVersion, pointValue);
} else { var lastLevelCompleted = false;
return new AchievementReward[0];
if (achievementInfo == null) return new AchievementTaskSetResponse();
if (pointValue < achievementInfo.PointValue) { // limit points stored value to max points value in achievement tasks
pointValue += 1;
lastLevelCompleted = true;
} }
var rewards = (achievementInfo.Reproducible || pointValue == achievementInfo.PointValue)
? ApplyAchievementRewards(viking, achievementInfo.Rewards)
: Array.Empty<AchievementReward>();
if (achievementTaskState == null)
viking.AchievementTaskStates.Add(new AchievementTaskState { TaskId = taskID, Points = pointValue });
else
achievementTaskState.Points = pointValue;
ctx.SaveChanges();
return new AchievementTaskSetResponse {
Success = true,
UserMessage = true, // TODO: placeholder
AchievementName = achievementInfo.Name,
Level = achievementInfo.Level,
AchievementTaskGroupID = achievementInfo.TaskGroupID,
LastLevelCompleted = lastLevelCompleted,
AchievementInfoID = achievementInfo.InfoID,
AchievementRewards = rewards
};
} }
public UserGameCurrency GetUserCurrency(Viking viking) { public UserGameCurrency GetUserCurrency(Viking viking) {
// TODO: return real values (after implement currency collecting methods)
int? coins = viking.AchievementPoints.FirstOrDefault(x => x.Type == (int)AchievementPointTypes.GameCurrency)?.Value; int? coins = viking.AchievementPoints.FirstOrDefault(x => x.Type == (int)AchievementPointTypes.GameCurrency)?.Value;
int? gems = viking.AchievementPoints.FirstOrDefault(x => x.Type == (int)AchievementPointTypes.CashCurrency)?.Value; int? gems = viking.AchievementPoints.FirstOrDefault(x => x.Type == (int)AchievementPointTypes.CashCurrency)?.Value;
if (coins is null) { if (coins is null) {
@ -206,6 +232,7 @@ namespace sodoff.Services {
DateRange = new DateRange() DateRange = new DateRange()
}; };
} }
public ArrayOfUserAchievementInfo GetTopAchievementBuddies(UserAchievementInfoRequest request) { public ArrayOfUserAchievementInfo GetTopAchievementBuddies(UserAchievementInfoRequest request) {
// TODO: Type and mode are currently ignored // TODO: Type and mode are currently ignored
List<UserAchievementInfo> achievementInfo = new(); List<UserAchievementInfo> achievementInfo = new();
@ -235,5 +262,47 @@ namespace sodoff.Services {
UserAchievementInfo = achievementInfo.ToArray() UserAchievementInfo = achievementInfo.ToArray()
}; };
} }
public UserAchievementTask[] GetUserAchievementTask(Viking viking, uint gameVersion) {
List <UserAchievementTask> userAchievementTasks = new();
foreach (var achievementsGroup in achievementStore.GetAchievementsGroupIdToTaskId(gameVersion)) {
List<AchievementTaskReward> rewards = new();
int nextLevel = 0;
int points = viking.AchievementTaskStates.FirstOrDefault(x => x.TaskId == achievementsGroup.Value)?.Points ?? 0;
var achievementInfo = achievementStore.GetAchievementTaskInfoForNextLevel(
achievementsGroup.Value, gameVersion, points, achievementsGroup.Key
);
if (achievementInfo != null) {
nextLevel = achievementInfo.Level;
if (achievementInfo.Rewards != null) {
foreach (var r in achievementInfo.Rewards) {
rewards.Add(new AchievementTaskReward {
RewardQuantity = r.Amount ?? 0,
PointTypeID = (int)(r.PointTypeID),
ItemID = r.ItemID,
RewardID = r.RewardID,
AchievementInfoID = achievementInfo.InfoID
});
}
}
} else {
achievementInfo = achievementStore.GetAchievementTaskInfoForCurrentLevel(
achievementsGroup.Value, gameVersion, points, achievementsGroup.Key
);
nextLevel = achievementInfo.Level + 1;
}
userAchievementTasks.Add(new UserAchievementTask {
AchievementTaskGroupID = achievementsGroup.Key,
AchievedQuantity = Math.Min(points, achievementInfo.PointValue),
NextLevel = nextLevel,
QuantityRequired = Math.Max(0, achievementInfo.PointValue - points),
NextLevelAchievementRewards = rewards.ToArray()
});
}
return userAchievementTasks.ToArray();
}
} }
} }

View File

@ -4,33 +4,53 @@ using sodoff.Util;
using System.Reflection; using System.Reflection;
using System.Xml; using System.Xml;
using System.Xml.Linq; using System.Xml.Linq;
using System.Collections.ObjectModel;
namespace sodoff.Services { namespace sodoff.Services {
public class AchievementStoreSingleton { public class AchievementStoreSingleton {
class AchievementTasks {
public Dictionary<int, List<AchievementTaskInfo>> achievementsRewardByTask = new();
public readonly ReadOnlyDictionary<int, int> achievementsGroupIdToTaskId;
public AchievementTasks(string xmlFile) {
AchievementTaskInfo[] allAchievementTaskInfo = XmlUtil.DeserializeXml<AchievementTaskInfo[]>(XmlUtil.ReadResourceXmlString(xmlFile));
Dictionary<int, int> achievementsGroupIdToTaskIdTmp = new();
foreach (var achievementTaskInfo in allAchievementTaskInfo) {
if (!achievementsRewardByTask.ContainsKey(achievementTaskInfo.TaskID)) {
achievementsRewardByTask[achievementTaskInfo.TaskID] = new();
}
achievementsRewardByTask[achievementTaskInfo.TaskID].Add(achievementTaskInfo);
achievementsGroupIdToTaskIdTmp[achievementTaskInfo.TaskGroupID] = achievementTaskInfo.TaskID;
}
achievementsGroupIdToTaskId = new(achievementsGroupIdToTaskIdTmp);
}
}
Dictionary<AchievementPointTypes, UserRank[]> ranks = new(); Dictionary<AchievementPointTypes, UserRank[]> ranks = new();
Dictionary<int, AchievementReward[]> achivmentsRewardByID = new(); Dictionary<int, AchievementReward[]> achievementsRewardByID = new();
Dictionary<int, AchievementReward[]> achivmentsRewardByTask = new(); Dictionary<int, List<AchievementTaskInfo>> achievementsRewardByTask = new();
Dictionary<uint, AchievementTasks> achievementsTasks = new();
int dragonAdultMinXP; int dragonAdultMinXP;
int dragonTitanMinXP; int dragonTitanMinXP;
public AchievementStoreSingleton() { public AchievementStoreSingleton() {
ArrayOfUserRank allranks = XmlUtil.DeserializeXml<ArrayOfUserRank>(XmlUtil.ReadResourceXmlString("ranks.allranks_sod"));
ArrayOfUserRank allranks = XmlUtil.DeserializeXml<ArrayOfUserRank>(XmlUtil.ReadResourceXmlString("allranks"));
foreach (var pointType in Enum.GetValues<AchievementPointTypes>()) { foreach (var pointType in Enum.GetValues<AchievementPointTypes>()) {
ranks[pointType] = allranks.UserRank.Where(r => r.PointTypeID == pointType).ToArray(); ranks[pointType] = allranks.UserRank.Where(r => r.PointTypeID == pointType).ToArray();
} }
AchievementsIdInfo[] allAchievementsIdInfo = XmlUtil.DeserializeXml<AchievementsIdInfo[]>(XmlUtil.ReadResourceXmlString("achievementsids")); AchievementsIdInfo[] allAchievementsIdInfo = XmlUtil.DeserializeXml<AchievementsIdInfo[]>(XmlUtil.ReadResourceXmlString("achievements.achievementid_sod"));
foreach (var achievementsIdInfo in allAchievementsIdInfo) { foreach (var achievementsIdInfo in allAchievementsIdInfo) {
achivmentsRewardByID[achievementsIdInfo.AchievementID] = achievementsIdInfo.AchievementReward; achievementsRewardByID[achievementsIdInfo.AchievementID] = achievementsIdInfo.AchievementReward;
} }
AchievementsTaskInfo[] allAchievementsTaskInfo = XmlUtil.DeserializeXml<AchievementsTaskInfo[]>(XmlUtil.ReadResourceXmlString("achievementstasks")); achievementsTasks[ClientVersion.Min_SoD] = new AchievementTasks("achievements.achievementtaskinfo_sod");
foreach (var achievementsTaskInfo in allAchievementsTaskInfo) { achievementsTasks[ClientVersion.MaM] = new AchievementTasks("achievements.achievementtaskinfo_mam");
achivmentsRewardByTask[achievementsTaskInfo.TaskID] = achievementsTaskInfo.AchievementReward; achievementsTasks[ClientVersion.MB] = new AchievementTasks("achievements.achievementtaskinfo_mb");
} achievementsTasks[ClientVersion.EMD] = new AchievementTasks("achievements.achievementtaskinfo_emd");
achievementsTasks[ClientVersion.SS] = new AchievementTasks("achievements.achievementtaskinfo_ss");
achievementsTasks[ClientVersion.WoJS] = new AchievementTasks("achievements.achievementtaskinfo_wojs");
dragonAdultMinXP = ranks[AchievementPointTypes.DragonXP][10].Value; dragonAdultMinXP = ranks[AchievementPointTypes.DragonXP][10].Value;
dragonTitanMinXP = ranks[AchievementPointTypes.DragonXP][20].Value; dragonTitanMinXP = ranks[AchievementPointTypes.DragonXP][20].Value;
@ -41,19 +61,47 @@ namespace sodoff.Services {
} }
public AchievementReward[]? GetAchievementRewardsById(int achievementID) { public AchievementReward[]? GetAchievementRewardsById(int achievementID) {
if (achivmentsRewardByID.ContainsKey(achievementID)) { if (achievementsRewardByID.ContainsKey(achievementID)) {
return achivmentsRewardByID[achievementID]; return achievementsRewardByID[achievementID];
} else { } else {
return null; return null;
} }
} }
public AchievementReward[]? GetAchievementRewardsByTask(int taskID) { public ReadOnlyDictionary<int, int> GetAchievementsGroupIdToTaskId(uint gameVersion) {
if (achivmentsRewardByTask.ContainsKey(taskID)) { gameVersion = GameVersionForTasks(gameVersion);
return achivmentsRewardByTask[taskID]; if (achievementsTasks.ContainsKey(gameVersion))
} else { return achievementsTasks[gameVersion].achievementsGroupIdToTaskId;
return null; return new ReadOnlyDictionary<int, int>(new Dictionary<int, int>());
}
public List<AchievementTaskInfo>? GetAllAchievementTaskInfo(int taskID, uint gameVersion) {
gameVersion = GameVersionForTasks(gameVersion);
if (achievementsTasks.ContainsKey(gameVersion) && achievementsTasks[gameVersion].achievementsRewardByTask.ContainsKey(taskID)) {
return achievementsTasks[gameVersion].achievementsRewardByTask[taskID];
} }
return null;
}
public AchievementTaskInfo? GetAchievementTaskInfo(int taskID, uint gameVersion, int points, int groupID = -1) {
var achievementTasks = GetAchievementTaskInfoForNextLevel(taskID, gameVersion, points, groupID);
if (achievementTasks != null)
return achievementTasks;
return GetAchievementTaskInfoForCurrentLevel(taskID, gameVersion, points, groupID);
}
public AchievementTaskInfo? GetAchievementTaskInfoForNextLevel(int taskID, uint gameVersion, int points, int groupID = -1) {
var achievementTasks = GetAllAchievementTaskInfo(taskID, gameVersion)?.Where(x => x.PointValue > points && (groupID < 0 || x.TaskGroupID == groupID));
if (achievementTasks != null && achievementTasks.Count() > 0)
return achievementTasks.FirstOrDefault(x => x.PointValue == achievementTasks.Min(x => x.PointValue));
return null;
}
public AchievementTaskInfo? GetAchievementTaskInfoForCurrentLevel(int taskID, uint gameVersion, int points, int groupID = -1) {
var achievementTasks = GetAllAchievementTaskInfo(taskID, gameVersion)?.Where(x => x.PointValue <= points && (groupID < 0 || x.TaskGroupID == groupID));
if (achievementTasks != null && achievementTasks.Count() > 0)
return achievementTasks?.FirstOrDefault(x => x.PointValue == achievementTasks.Max(x => x.PointValue));
return null;
} }
public int GetUpdatedDragonXP(int dragonXP, int growthState) { public int GetUpdatedDragonXP(int dragonXP, int growthState) {
@ -66,5 +114,13 @@ namespace sodoff.Services {
} }
return dragonXP; return dragonXP;
} }
private uint GameVersionForTasks(uint gameVersion) {
// all SoD version of SoD using the same Tasks database
if ((gameVersion & ClientVersion.Min_SoD) == 0xa0000000) return ClientVersion.Min_SoD;
// all version of WoJS (including lands) using the same Tasks database
if (gameVersion <= ClientVersion.Max_OldJS && (gameVersion & ClientVersion.WoJS) != 0) return ClientVersion.WoJS;
return gameVersion;
}
} }
} }

View File

@ -16,26 +16,30 @@ public class MissionStoreSingleton {
private int[] upcomingMissionsWoJS; private int[] upcomingMissionsWoJS;
public MissionStoreSingleton() { public MissionStoreSingleton() {
ServerMissionArray missionArray = XmlUtil.DeserializeXml<ServerMissionArray>(XmlUtil.ReadResourceXmlString("missions")); ServerMissionArray missionArray = XmlUtil.DeserializeXml<ServerMissionArray>(XmlUtil.ReadResourceXmlString("missions.missions_sod"));
DefaultMissions defaultMissions = XmlUtil.DeserializeXml<DefaultMissions>(XmlUtil.ReadResourceXmlString("defaultmissionlist")); DefaultMissions defaultMissions = XmlUtil.DeserializeXml<DefaultMissions>(XmlUtil.ReadResourceXmlString("missions.defaultmissionlist"));
foreach (var mission in missionArray.MissionDataArray) { foreach (var mission in missionArray.MissionDataArray) {
SetUpRecursive(mission); SetUpRecursive(mission);
} }
activeMissions = defaultMissions.Active; activeMissions = defaultMissions.Active;
upcomingMissions = defaultMissions.Upcoming; upcomingMissions = defaultMissions.Upcoming;
defaultMissions = XmlUtil.DeserializeXml<DefaultMissions>(XmlUtil.ReadResourceXmlString("defaultmissionlistv1")); defaultMissions = XmlUtil.DeserializeXml<DefaultMissions>(XmlUtil.ReadResourceXmlString("missions.defaultmissionlist_sod_v1"));
activeMissionsV1 = defaultMissions.Active; activeMissionsV1 = defaultMissions.Active;
upcomingMissionsV1 = defaultMissions.Upcoming; upcomingMissionsV1 = defaultMissions.Upcoming;
defaultMissions = XmlUtil.DeserializeXml<DefaultMissions>(XmlUtil.ReadResourceXmlString("defaultmissionlistmam")); missionArray = XmlUtil.DeserializeXml<ServerMissionArray>(XmlUtil.ReadResourceXmlString("missions.missions_mam"));
defaultMissions = XmlUtil.DeserializeXml<DefaultMissions>(XmlUtil.ReadResourceXmlString("missions.defaultmissionlist_mam"));
foreach (var mission in missionArray.MissionDataArray) {
SetUpRecursive(mission);
}
activeMissionsMaM = defaultMissions.Active; activeMissionsMaM = defaultMissions.Active;
upcomingMissionsMaM = defaultMissions.Upcoming; upcomingMissionsMaM = defaultMissions.Upcoming;
missionArray = XmlUtil.DeserializeXml<ServerMissionArray>(XmlUtil.ReadResourceXmlString("missions_wojs")); missionArray = XmlUtil.DeserializeXml<ServerMissionArray>(XmlUtil.ReadResourceXmlString("missions.missions_wojs"));
defaultMissions = XmlUtil.DeserializeXml<DefaultMissions>(XmlUtil.ReadResourceXmlString("defaultmissionlist_wojs")); defaultMissions = XmlUtil.DeserializeXml<DefaultMissions>(XmlUtil.ReadResourceXmlString("missions.defaultmissionlist_wojs"));
foreach (var mission in missionArray.MissionDataArray) { foreach (var mission in missionArray.MissionDataArray) {
SetUpRecursive(mission); // TODO: use separate missions dict for WoJS (?) SetUpRecursive(mission);
} }
activeMissionsWoJS = defaultMissions.Active; activeMissionsWoJS = defaultMissions.Active;
upcomingMissionsWoJS = defaultMissions.Upcoming; upcomingMissionsWoJS = defaultMissions.Upcoming;

View File

@ -29,6 +29,10 @@ public class ClientVersion {
apiKey == "6738196d-2a2c-4ef8-9b6e-1252c6ec7325" apiKey == "6738196d-2a2c-4ef8-9b6e-1252c6ec7325"
) { ) {
return MB; return MB;
} else if (
apiKey == "dd602cf1-cc98-4738-9a0a-56dde3026947"
) {
return EMD;
} else if ( } else if (
apiKey == "34b0ae13-eccc-4d64-b6d0-733d2562080e" apiKey == "34b0ae13-eccc-4d64-b6d0-733d2562080e"
) { ) {

View File

@ -36,59 +36,6 @@
</When> </When>
</Choose> </Choose>
<ItemGroup>
<None Remove="Resources\achievementtaskinfo.xml" />
<None Remove="Resources\items.xml" />
<None Remove="Resources\missions.xml" />
<None Remove="Resources\mmo.xml" />
<None Remove="Resources\displaynames.xml" />
<None Remove="Resources\rankattrib.xml" />
<None Remove="Resources\rankattrib_mb.xml" />
<None Remove="Resources\rewardmultiplier.xml" />
<None Remove="Resources\store.xml" />
<None Remove="Resources\allranks.xml" />
<None Remove="Resources\allranks_mb.xml" />
<None Remove="Resources\allranks_wojs.xml" />
<None Remove="Resources\achievementsids.xml" />
<None Remove="Resources\achievementstasks.xml" />
<None Remove="Resources\defaultmissionlist.xml" />
<None Remove="Resources\defaultmissionlistv1.xml" />
<None Remove="Resources\defaultmissionlistmam.xml" />
<None Remove="Resources\defaultmissionlist_wojs.xml" />
<None Remove="Resources\questiondata.xml" />
<None Remove="Resources\content_jukebox.xml" />
<None Remove="Resources\content_movie.xml" />
<None Remove="Resources\content_blastermovie.xml" />
<None Remove="Resources\content_arcade.xml" />
<None Remove="Resources\content_learning.xml" />
<None Remove="Resources\announcements_wojs.xml" />
<None Remove="Resources\announcements_ss.xml" />
<None Remove="Resources\profiletags.xml" />
<None Remove="Resources\defaulthouse.xml" />
</ItemGroup>
<ItemGroup>
<None Update="Resources\childlist.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Resources\store.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Resources\items.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Resources\tutorialmission.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Resources\achievementsids.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Resources\achievementstasks.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Resources\dtrewards.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
<ItemGroup> <ItemGroup>
<EmbeddedResource Include="Resources\mmo.xml"> <EmbeddedResource Include="Resources\mmo.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
@ -99,31 +46,43 @@
<EmbeddedResource Include="Resources\rewardmultiplier.xml"> <EmbeddedResource Include="Resources\rewardmultiplier.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Resources\rankattrib.xml"> <EmbeddedResource Include="Resources\ranks\rankattrib.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Resources\rankattrib_mb.xml"> <EmbeddedResource Include="Resources\ranks\rankattrib_mb.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="Resources\achievementtaskinfo.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Resources\store.xml"> <EmbeddedResource Include="Resources\store.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Resources\allranks.xml"> <EmbeddedResource Include="Resources\ranks\allranks_sod.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Resources\allranks_mb.xml"> <EmbeddedResource Include="Resources\ranks\allranks_mb.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Resources\allranks_wojs.xml"> <EmbeddedResource Include="Resources\ranks\allranks_wojs.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Resources\achievementsids.xml"> <EmbeddedResource Include="Resources\achievements\achievementid_sod.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Resources\achievementstasks.xml"> <EmbeddedResource Include="Resources\achievements\achievementtaskinfo_sod.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="Resources\achievements\achievementtaskinfo_mam.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="Resources\achievements\achievementtaskinfo_mb.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="Resources\achievements\achievementtaskinfo_emd.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="Resources\achievements\achievementtaskinfo_ss.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="Resources\achievements\achievementtaskinfo_wojs.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Resources\dtrewards.xml"> <EmbeddedResource Include="Resources\dtrewards.xml">
@ -132,22 +91,25 @@
<EmbeddedResource Include="Resources\items.xml"> <EmbeddedResource Include="Resources\items.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Resources\missions.xml"> <EmbeddedResource Include="Resources\missions\missions_sod.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Resources\missions_wojs.xml"> <EmbeddedResource Include="Resources\missions\missions_mam.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Resources\defaultmissionlist.xml"> <EmbeddedResource Include="Resources\missions\missions_wojs.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Resources\defaultmissionlistv1.xml"> <EmbeddedResource Include="Resources\missions\defaultmissionlist.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Resources\defaultmissionlistmam.xml"> <EmbeddedResource Include="Resources\missions\defaultmissionlist_sod_v1.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Resources\defaultmissionlist_wojs.xml"> <EmbeddedResource Include="Resources\missions\defaultmissionlist_mam.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="Resources\missions\defaultmissionlist_wojs.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Resources\questiondata.xml"> <EmbeddedResource Include="Resources\questiondata.xml">