add support for missions

still requires achievements to work corrently
This commit is contained in:
Spirtix 2023-07-07 01:25:05 +02:00
parent ba9df2fb10
commit 9cef74dd26
15 changed files with 134270 additions and 504 deletions

View File

@ -52,7 +52,9 @@ methods = [
'GetMMOServerInfoWithZone',
'GetActiveChallenges',
'GetAchievementsByUserID',
'PurchaseItems'
'PurchaseItems',
'AcceptMission',
'GetUserMissionState'
]
def routable(path):

View File

@ -458,44 +458,83 @@ public class ContentController : Controller {
[Produces("application/xml")]
[Route("V2/ContentWebService.asmx/GetUserUpcomingMissionState")]
public IActionResult GetUserUpcomingMissionState([FromForm] string apiToken, [FromForm] string userId) {
Session? session = ctx.Sessions.FirstOrDefault(s => s.ApiToken == apiToken);
UserMissionStateResult result = new UserMissionStateResult();
Viking? viking = ctx.Vikings.FirstOrDefault(x => x.Id == userId);
if (viking is null)
return Ok("error");
UserMissionStateResult result = new UserMissionStateResult { Missions = new List<Mission>() };
foreach (var mission in viking.MissionStates.Where(x => x.MissionStatus == MissionStatus.Upcoming))
result.Missions.Add(missionService.GetMissionWithProgress(mission.MissionId, viking.Id));
if (session is null)
return Ok(result);
result.UserID = Guid.Parse(session.VikingId);
return Ok(result); // TODO: placeholder, returns no upcoming missions
result.UserID = Guid.Parse(viking.Id);
return Ok(result);
}
[HttpPost]
[Produces("application/xml")]
[Route("V2/ContentWebService.asmx/GetUserActiveMissionState")]
public IActionResult GetUserActiveMissionState([FromForm] string apiToken, [FromForm] string userId) {
Session? session = ctx.Sessions.FirstOrDefault(s => s.ApiToken == apiToken);
if (session is null)
Viking? viking = ctx.Vikings.FirstOrDefault(x => x.Id == userId);
if (viking is null)
return Ok("error");
UserMissionStateResult result = new UserMissionStateResult { Missions = new List<Mission>() };
Mission tutorial = missionService.GetMissionWithProgress(999, userId);
result.Missions.Add(tutorial);
result.UserID = Guid.Parse(session.VikingId);
return Ok(result); // TODO: placeholder, returns the tutorial
foreach (var mission in viking.MissionStates.Where(x => x.MissionStatus == MissionStatus.Active))
result.Missions.Add(missionService.GetMissionWithProgress(mission.MissionId, viking.Id));
result.UserID = Guid.Parse(viking.Id);
return Ok(result);
}
[HttpPost]
[Produces("application/xml")]
[Route("V2/ContentWebService.asmx/GetUserCompletedMissionState")]
public IActionResult GetUserCompletedMissionState([FromForm] string apiToken, [FromForm] string userId) {
Session? session = ctx.Sessions.FirstOrDefault(s => s.ApiToken == apiToken);
UserMissionStateResult result = new UserMissionStateResult();
Viking? viking = ctx.Vikings.FirstOrDefault(x => x.Id == userId);
if (viking is null)
return Ok("error");
if (session is null)
return Ok(result);
UserMissionStateResult result = new UserMissionStateResult { Missions = new List<Mission>() };
foreach (var mission in viking.MissionStates.Where(x => x.MissionStatus == MissionStatus.Completed))
result.Missions.Add(missionService.GetMissionWithProgress(mission.MissionId, viking.Id));
result.UserID = Guid.Parse(session.VikingId);
return Ok(result); // TODO: placeholder, returns no completed missions
result.UserID = Guid.Parse(viking.Id);
return Ok(result);
}
[HttpPost]
[Produces("application/xml")]
[Route("ContentWebService.asmx/AcceptMission")]
public IActionResult AcceptMission([FromForm] string userId, [FromForm] int missionId) {
Viking? viking = ctx.Vikings.FirstOrDefault(x => x.Id == userId);
if (viking is null)
return Ok(false);
MissionState? missionState = viking.MissionStates.FirstOrDefault(x => x.MissionId == missionId);
if (missionState is null || missionState.MissionStatus != MissionStatus.Upcoming)
return Ok(false);
missionState.MissionStatus = MissionStatus.Active;
ctx.SaveChanges();
return Ok(true);
}
[HttpPost]
[Produces("application/xml")]
[Route("V2/ContentWebService.asmx/GetUserMissionState")]
public IActionResult GetUserMissionState([FromForm] string userId, [FromForm] string filter) {
MissionRequestFilterV2 filterV2 = XmlUtil.DeserializeXml<MissionRequestFilterV2>(filter);
Viking? viking = ctx.Vikings.FirstOrDefault(x => x.Id == userId);
if (viking is null)
return Ok("error");
UserMissionStateResult result = new UserMissionStateResult { Missions = new List<Mission>() };
foreach (var m in filterV2.MissionPair)
if (m.MissionID != null)
result.Missions.Add(missionService.GetMissionWithProgress((int)m.MissionID, viking.Id));
result.UserID = Guid.Parse(viking.Id);
return Ok(result);
}
[HttpPost]

View File

@ -12,10 +12,12 @@ public class RegistrationController : Controller {
private readonly DBContext ctx;
private ItemService itemService;
private MissionService missionService;
public RegistrationController(DBContext ctx, ItemService itemService) {
public RegistrationController(DBContext ctx, ItemService itemService, MissionService missionService) {
this.ctx = ctx;
this.itemService = itemService;
this.missionService = missionService;
}
[HttpPost]
@ -90,6 +92,9 @@ public class RegistrationController : Controller {
User = user,
Inventory = inv
};
missionService.SetUpMissions(v);
ctx.Vikings.Add(v);
ctx.SaveChanges();

View File

@ -37,6 +37,9 @@ public class DBContext : DbContext {
builder.Entity<Viking>().HasMany(u => u.Sessions)
.WithOne(e => e.Viking);
builder.Entity<Viking>().HasMany(v => v.MissionStates)
.WithOne(e => e.Viking);
builder.Entity<Viking>().HasOne(s => s.User)
.WithMany(e => e.Vikings)
.HasForeignKey(e => e.UserId);
@ -106,6 +109,10 @@ public class DBContext : DbContext {
.HasOne(e => e.Inventory)
.WithMany(e => e.InventoryItems)
.HasForeignKey(e => e.InventoryId);
builder.Entity<MissionState>().HasOne(m => m.Viking)
.WithMany(e => e.MissionStates)
.HasForeignKey(e => e.VikingId);
}
}

20
src/Model/MissionState.cs Normal file
View File

@ -0,0 +1,20 @@
using System.ComponentModel.DataAnnotations;
namespace sodoff.Model;
public class MissionState {
[Key]
public int Id { get; set; }
public int MissionId { get; set; }
public string VikingId { get; set; } = null!;
public virtual Viking? Viking { get; set; }
public MissionStatus MissionStatus { get; set; }
}
public enum MissionStatus {
Upcoming,Active,Completed
}

View File

@ -19,6 +19,7 @@ public class Viking {
public virtual User User { get; set; } = null!;
public virtual ICollection<Dragon> Dragons { get; set; } = null!;
public virtual ICollection<Image> Images { get; set; } = null!;
public virtual ICollection<MissionState> MissionStates { get; set; } = null!;
public virtual Dragon? SelectedDragon { get; set; }
public int InventoryId { get; set; }

View File

@ -0,0 +1,761 @@
<?xml version='1.0' encoding='utf-8'?>
<DefaultMissions>
<Active>
<id>999</id>
<id>1035</id>
<id>1036</id>
<id>1037</id>
<id>1046</id>
<id>1047</id>
<id>1048</id>
<id>1185</id>
<id>1186</id>
<id>1187</id>
<id>1188</id>
<id>1189</id>
<id>1191</id>
<id>1192</id>
<id>1193</id>
<id>1194</id>
<id>1195</id>
<id>1196</id>
<id>1197</id>
<id>1198</id>
<id>1199</id>
<id>1200</id>
<id>1201</id>
<id>1202</id>
<id>1203</id>
<id>1204</id>
<id>1205</id>
<id>1206</id>
<id>1207</id>
<id>1208</id>
<id>1209</id>
<id>1210</id>
<id>1211</id>
<id>1212</id>
<id>1213</id>
<id>1214</id>
<id>1215</id>
<id>1216</id>
<id>1217</id>
<id>1218</id>
<id>1219</id>
<id>1220</id>
<id>1221</id>
<id>1222</id>
<id>1223</id>
<id>1224</id>
<id>1225</id>
<id>1226</id>
<id>1227</id>
<id>1228</id>
<id>1229</id>
<id>1230</id>
<id>1231</id>
<id>1232</id>
<id>1233</id>
<id>1234</id>
<id>1235</id>
<id>1236</id>
<id>1237</id>
<id>1238</id>
<id>1239</id>
<id>1240</id>
<id>1241</id>
<id>1242</id>
<id>1243</id>
<id>1244</id>
<id>1245</id>
<id>1250</id>
<id>1251</id>
<id>1252</id>
<id>1253</id>
<id>1254</id>
<id>1255</id>
<id>1256</id>
<id>1257</id>
<id>1258</id>
<id>1259</id>
<id>1260</id>
<id>1261</id>
<id>1262</id>
<id>1263</id>
<id>1264</id>
<id>1265</id>
<id>1266</id>
<id>1267</id>
<id>1268</id>
<id>1269</id>
<id>1270</id>
<id>1271</id>
<id>1272</id>
<id>1273</id>
<id>1274</id>
<id>1275</id>
<id>1276</id>
<id>1277</id>
<id>1278</id>
<id>1279</id>
<id>1280</id>
<id>1281</id>
<id>1282</id>
<id>1283</id>
<id>1284</id>
<id>1285</id>
<id>1286</id>
<id>1287</id>
<id>1288</id>
<id>1289</id>
<id>1290</id>
<id>1291</id>
<id>1292</id>
<id>1293</id>
<id>1294</id>
<id>1295</id>
<id>1307</id>
<id>1308</id>
<id>1309</id>
<id>1310</id>
<id>1311</id>
<id>1312</id>
<id>1313</id>
<id>1314</id>
<id>1315</id>
<id>1316</id>
<id>1321</id>
<id>1322</id>
<id>1323</id>
<id>1324</id>
<id>1325</id>
<id>1326</id>
<id>1327</id>
<id>1328</id>
<id>1329</id>
<id>1330</id>
<id>1345</id>
<id>1346</id>
<id>1347</id>
<id>1348</id>
<id>1349</id>
<id>1350</id>
<id>1351</id>
<id>1352</id>
<id>1353</id>
<id>1354</id>
<id>1689</id>
<id>1690</id>
<id>1691</id>
<id>1692</id>
<id>1693</id>
<id>1694</id>
<id>1695</id>
<id>1696</id>
<id>1697</id>
<id>1698</id>
<id>1699</id>
<id>1700</id>
<id>1701</id>
<id>1702</id>
<id>1703</id>
<id>1704</id>
<id>1705</id>
<id>1706</id>
<id>1707</id>
<id>1708</id>
<id>1709</id>
<id>1710</id>
<id>1711</id>
<id>1712</id>
<id>1713</id>
<id>1714</id>
<id>1715</id>
<id>1716</id>
<id>1717</id>
<id>1718</id>
<id>1719</id>
<id>1720</id>
<id>1721</id>
<id>1722</id>
<id>1723</id>
<id>1724</id>
<id>1725</id>
<id>1726</id>
<id>1727</id>
<id>1728</id>
<id>1729</id>
<id>1730</id>
<id>2176</id>
<id>2287</id>
<id>2303</id>
<id>2304</id>
<id>2309</id>
<id>2392</id>
<id>2393</id>
<id>2394</id>
<id>2395</id>
<id>2396</id>
<id>2397</id>
<id>2398</id>
<id>2399</id>
<id>2400</id>
<id>2401</id>
<id>2402</id>
<id>2403</id>
<id>2404</id>
<id>2405</id>
<id>2406</id>
<id>2407</id>
<id>2421</id>
<id>2422</id>
<id>2424</id>
<id>2425</id>
<id>2426</id>
<id>2427</id>
<id>2428</id>
<id>2429</id>
<id>2430</id>
<id>2431</id>
<id>2432</id>
<id>2433</id>
<id>2434</id>
<id>2435</id>
<id>2436</id>
<id>2437</id>
<id>2438</id>
<id>2439</id>
<id>2457</id>
<id>2458</id>
<id>2510</id>
<id>2511</id>
<id>2512</id>
<id>2513</id>
<id>2514</id>
<id>2515</id>
<id>2516</id>
<id>2517</id>
<id>2518</id>
<id>2519</id>
<id>2520</id>
<id>2521</id>
<id>2562</id>
<id>2563</id>
<id>2564</id>
<id>2565</id>
<id>2566</id>
<id>2567</id>
<id>2568</id>
<id>2569</id>
<id>2570</id>
<id>2571</id>
<id>2572</id>
<id>2573</id>
<id>2578</id>
<id>2579</id>
<id>2580</id>
<id>2581</id>
<id>2582</id>
<id>2583</id>
<id>2584</id>
<id>2585</id>
<id>2586</id>
<id>2587</id>
<id>2588</id>
<id>2606</id>
<id>2607</id>
<id>2631</id>
<id>2632</id>
<id>2633</id>
<id>2634</id>
<id>2635</id>
<id>2636</id>
<id>2637</id>
<id>2638</id>
<id>2639</id>
<id>2640</id>
<id>2645</id>
<id>2646</id>
<id>2649</id>
<id>2650</id>
<id>2652</id>
<id>2653</id>
<id>2655</id>
<id>2656</id>
<id>2661</id>
<id>2662</id>
<id>2663</id>
<id>2664</id>
<id>2665</id>
<id>2666</id>
<id>2667</id>
<id>2668</id>
<id>2669</id>
<id>2670</id>
<id>2673</id>
<id>2674</id>
<id>2675</id>
<id>2676</id>
<id>2677</id>
<id>2678</id>
<id>2679</id>
<id>2680</id>
<id>2681</id>
<id>2682</id>
<id>2683</id>
<id>2684</id>
<id>2685</id>
<id>2686</id>
<id>2687</id>
<id>2786</id>
<id>2787</id>
<id>2790</id>
<id>2806</id>
<id>2807</id>
<id>2808</id>
<id>2809</id>
<id>2810</id>
<id>2811</id>
<id>2812</id>
<id>2813</id>
<id>2814</id>
<id>2815</id>
<id>2816</id>
<id>2817</id>
<id>2818</id>
<id>2819</id>
<id>2843</id>
<id>2844</id>
<id>2845</id>
<id>2878</id>
<id>2879</id>
<id>2894</id>
<id>2895</id>
<id>2931</id>
<id>2932</id>
<id>2946</id>
<id>2947</id>
<id>2972</id>
<id>2973</id>
<id>3022</id>
<id>3023</id>
<id>3036</id>
<id>3037</id>
<id>3038</id>
<id>3052</id>
<id>3053</id>
<id>3069</id>
<id>3071</id>
<id>3072</id>
<id>3073</id>
<id>3074</id>
<id>3075</id>
<id>3076</id>
<id>3077</id>
<id>3078</id>
<id>3079</id>
<id>3080</id>
<id>3099</id>
<id>3100</id>
<id>3113</id>
<id>3114</id>
<id>3115</id>
<id>3116</id>
<id>3117</id>
<id>3118</id>
<id>3119</id>
<id>3120</id>
<id>3121</id>
<id>3122</id>
<id>3123</id>
<id>3124</id>
<id>3127</id>
<id>3128</id>
<id>3129</id>
<id>3130</id>
<id>3131</id>
<id>3132</id>
<id>3133</id>
<id>3134</id>
<id>3135</id>
<id>3136</id>
<id>3148</id>
<id>3149</id>
</Active>
<Upcoming>
<id>1003</id>
<id>1014</id>
<id>1015</id>
<id>1016</id>
<id>1017</id>
<id>1027</id>
<id>1028</id>
<id>1029</id>
<id>1031</id>
<id>1033</id>
<id>1038</id>
<id>1044</id>
<id>1053</id>
<id>1054</id>
<id>1055</id>
<id>1057</id>
<id>1058</id>
<id>1062</id>
<id>1067</id>
<id>1074</id>
<id>1085</id>
<id>1089</id>
<id>1090</id>
<id>1091</id>
<id>1093</id>
<id>1095</id>
<id>1096</id>
<id>1097</id>
<id>1099</id>
<id>1101</id>
<id>1102</id>
<id>1106</id>
<id>1108</id>
<id>1110</id>
<id>1111</id>
<id>1114</id>
<id>1120</id>
<id>1121</id>
<id>1128</id>
<id>1134</id>
<id>1140</id>
<id>1143</id>
<id>1144</id>
<id>1150</id>
<id>1153</id>
<id>1155</id>
<id>1159</id>
<id>1163</id>
<id>1164</id>
<id>1166</id>
<id>1167</id>
<id>1168</id>
<id>1169</id>
<id>1171</id>
<id>1173</id>
<id>1179</id>
<id>1247</id>
<id>1296</id>
<id>1304</id>
<id>1305</id>
<id>1317</id>
<id>1318</id>
<id>1331</id>
<id>1333</id>
<id>1335</id>
<id>1338</id>
<id>1343</id>
<id>1344</id>
<id>1357</id>
<id>1361</id>
<id>1362</id>
<id>1390</id>
<id>1508</id>
<id>1529</id>
<id>1530</id>
<id>1575</id>
<id>1579</id>
<id>1605</id>
<id>1606</id>
<id>1607</id>
<id>1608</id>
<id>1611</id>
<id>1612</id>
<id>1613</id>
<id>1614</id>
<id>1615</id>
<id>1617</id>
<id>1618</id>
<id>1619</id>
<id>1620</id>
<id>1622</id>
<id>1623</id>
<id>1624</id>
<id>1625</id>
<id>1626</id>
<id>1627</id>
<id>1628</id>
<id>1629</id>
<id>1630</id>
<id>1632</id>
<id>1633</id>
<id>1634</id>
<id>1636</id>
<id>1638</id>
<id>1640</id>
<id>1641</id>
<id>1642</id>
<id>1646</id>
<id>1648</id>
<id>1652</id>
<id>1655</id>
<id>1656</id>
<id>1657</id>
<id>1658</id>
<id>1660</id>
<id>1661</id>
<id>1663</id>
<id>1666</id>
<id>1667</id>
<id>1669</id>
<id>1671</id>
<id>1672</id>
<id>1673</id>
<id>1674</id>
<id>1675</id>
<id>1676</id>
<id>1678</id>
<id>1681</id>
<id>1683</id>
<id>1736</id>
<id>1749</id>
<id>1769</id>
<id>1771</id>
<id>1777</id>
<id>1781</id>
<id>1787</id>
<id>1788</id>
<id>1813</id>
<id>1815</id>
<id>1818</id>
<id>1822</id>
<id>1828</id>
<id>1961</id>
<id>1967</id>
<id>1969</id>
<id>1970</id>
<id>1971</id>
<id>1972</id>
<id>1973</id>
<id>1974</id>
<id>1978</id>
<id>2175</id>
<id>2178</id>
<id>2180</id>
<id>2182</id>
<id>2195</id>
<id>2196</id>
<id>2199</id>
<id>2206</id>
<id>2207</id>
<id>2208</id>
<id>2212</id>
<id>2213</id>
<id>2215</id>
<id>2217</id>
<id>2218</id>
<id>2219</id>
<id>2223</id>
<id>2225</id>
<id>2226</id>
<id>2228</id>
<id>2229</id>
<id>2232</id>
<id>2233</id>
<id>2235</id>
<id>2284</id>
<id>2288</id>
<id>2300</id>
<id>2302</id>
<id>2307</id>
<id>2308</id>
<id>2311</id>
<id>2314</id>
<id>2315</id>
<id>2318</id>
<id>2319</id>
<id>2320</id>
<id>2324</id>
<id>2328</id>
<id>2329</id>
<id>2330</id>
<id>2331</id>
<id>2332</id>
<id>2333</id>
<id>2335</id>
<id>2337</id>
<id>2338</id>
<id>2339</id>
<id>2344</id>
<id>2346</id>
<id>2347</id>
<id>2353</id>
<id>2354</id>
<id>2357</id>
<id>2363</id>
<id>2372</id>
<id>2389</id>
<id>2408</id>
<id>2415</id>
<id>2416</id>
<id>2423</id>
<id>2444</id>
<id>2459</id>
<id>2472</id>
<id>2474</id>
<id>2475</id>
<id>2476</id>
<id>2477</id>
<id>2478</id>
<id>2479</id>
<id>2481</id>
<id>2482</id>
<id>2483</id>
<id>2485</id>
<id>2486</id>
<id>2493</id>
<id>2494</id>
<id>2496</id>
<id>2498</id>
<id>2499</id>
<id>2500</id>
<id>2503</id>
<id>2506</id>
<id>2522</id>
<id>2526</id>
<id>2528</id>
<id>2529</id>
<id>2532</id>
<id>2533</id>
<id>2536</id>
<id>2538</id>
<id>2542</id>
<id>2548</id>
<id>2551</id>
<id>2554</id>
<id>2556</id>
<id>2557</id>
<id>2574</id>
<id>2589</id>
<id>2590</id>
<id>2591</id>
<id>2592</id>
<id>2593</id>
<id>2594</id>
<id>2596</id>
<id>2597</id>
<id>2598</id>
<id>2603</id>
<id>2604</id>
<id>2605</id>
<id>2608</id>
<id>2613</id>
<id>2614</id>
<id>2622</id>
<id>2626</id>
<id>2641</id>
<id>2643</id>
<id>2659</id>
<id>2671</id>
<id>2688</id>
<id>2689</id>
<id>2690</id>
<id>2691</id>
<id>2692</id>
<id>2693</id>
<id>2694</id>
<id>2695</id>
<id>2697</id>
<id>2699</id>
<id>2700</id>
<id>2705</id>
<id>2707</id>
<id>2708</id>
<id>2711</id>
<id>2714</id>
<id>2717</id>
<id>2718</id>
<id>2719</id>
<id>2723</id>
<id>2730</id>
<id>2731</id>
<id>2776</id>
<id>2781</id>
<id>2782</id>
<id>2783</id>
<id>2836</id>
<id>2837</id>
<id>2838</id>
<id>2839</id>
<id>2874</id>
<id>2875</id>
<id>2876</id>
<id>2884</id>
<id>2887</id>
<id>2889</id>
<id>2892</id>
<id>2893</id>
<id>2897</id>
<id>2898</id>
<id>2899</id>
<id>2937</id>
<id>2956</id>
<id>2957</id>
<id>2958</id>
<id>2959</id>
<id>2961</id>
<id>2962</id>
<id>2963</id>
<id>2966</id>
<id>2968</id>
<id>2969</id>
<id>2974</id>
<id>2983</id>
<id>2984</id>
<id>2985</id>
<id>2986</id>
<id>2988</id>
<id>2989</id>
<id>2990</id>
<id>2992</id>
<id>2993</id>
<id>2996</id>
<id>3013</id>
<id>3015</id>
<id>3018</id>
<id>3024</id>
<id>3025</id>
<id>3031</id>
<id>3032</id>
<id>3034</id>
<id>3035</id>
<id>3039</id>
<id>3041</id>
<id>3043</id>
<id>3054</id>
<id>3055</id>
<id>3056</id>
<id>3057</id>
<id>3067</id>
<id>3068</id>
<id>3081</id>
<id>3091</id>
<id>3093</id>
<id>3095</id>
<id>3101</id>
<id>3102</id>
<id>3103</id>
<id>3104</id>
<id>3108</id>
<id>3111</id>
<id>3112</id>
<id>3125</id>
<id>3126</id>
<id>3137</id>
<id>3141</id>
<id>3145</id>
<id>3150</id>
<id>3158</id>
<id>3167</id>
<id>3171</id>
<id>3172</id>
<id>3173</id>
<id>3174</id>
<id>3175</id>
</Upcoming>
</DefaultMissions>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,18 @@
using System.Xml.Serialization;
namespace sodoff.Schema;
// NOTE: This schema is NOT used by the client
// This is a schema specific to the sodoff server
[XmlRoot(ElementName = "DefaultMissions", Namespace = "")]
[Serializable]
public class DefaultMissions
{
[XmlArray(ElementName = "Active")]
[XmlArrayItem("id")]
public int[] Active { get; set; }
[XmlArray(ElementName = "Upcoming")]
[XmlArrayItem("id")]
public int[] Upcoming { get; set; }
}

14
src/Schema/MissionPair.cs Normal file
View File

@ -0,0 +1,14 @@
using System.Xml.Serialization;
namespace sodoff.Schema;
[XmlRoot(ElementName = "MP", Namespace = "")]
[Serializable]
public class MissionPair
{
[XmlElement(ElementName = "MID")]
public int? MissionID { get; set; }
[XmlElement(ElementName = "VID")]
public int? VersionID { get; set; }
}

View File

@ -0,0 +1,29 @@
using System.Xml.Serialization;
namespace sodoff.Schema;
[XmlRoot(ElementName = "RequestFilter", Namespace = "")]
[Serializable]
public class MissionRequestFilterV2
{
[XmlElement(ElementName = "MGID")]
public int[] MissionGroupIDs { get; set; }
[XmlElement(ElementName = "MP")]
public List<MissionPair> MissionPair { get; set; }
[XmlElement(ElementName = "TID")]
public int[] TaskIDList { get; set; }
[XmlElement(ElementName = "PID")]
public int? ProductID { get; set; }
[XmlElement(ElementName = "S")]
public int? SearchDepth { get; set; }
[XmlElement(ElementName = "GCM")]
public bool? GetCompletedMission { get; set; }
[XmlElement(ElementName = "PGID")]
public int ProductGroupID;
}

View File

@ -35,7 +35,8 @@ public class KeyValueService {
};
exists = false;
}
if (schemaData is null || schemaData.Pairs is null)
return true;
// Update or create the key-value pairs
foreach (var p in schemaData.Pairs) {
if (string.IsNullOrEmpty(p.PairValue))

View File

@ -36,10 +36,16 @@ public class MissionService {
if (completed) {
Mission mission = GetMissionWithProgress(missionId, userId);
if (AllMissionsCompleted(mission) && AllTasksCompleted(mission)) {
// Get mission rewards
result.Add(new MissionCompletedResult {
MissionID = missionId,
Rewards = mission.Rewards.ToArray()
});
// Update mission from active to completed
MissionState? missionState = ctx.Vikings.FirstOrDefault(x => x.Id == userId)!.MissionStates.FirstOrDefault(x => x.MissionId == missionId);
if (missionState != null && missionState.MissionStatus == MissionStatus.Active)
missionState.MissionStatus = MissionStatus.Completed;
ctx.SaveChanges();
}
}
return result;
@ -75,6 +81,23 @@ public class MissionService {
}
}
public void SetUpMissions(Viking viking) {
viking.MissionStates = new List<MissionState>();
foreach (int m in missionStore.GetActiveMissions()) {
viking.MissionStates.Add(new MissionState {
MissionId = m,
MissionStatus = MissionStatus.Active
});
}
foreach (int m in missionStore.GetUpcomingMissions()) {
viking.MissionStates.Add(new MissionState {
MissionId = m,
MissionStatus = MissionStatus.Upcoming
});
}
}
private void SetTaskProgressDB(int missionId, int taskId, string userId, bool completed, string xmlPayload) {
Model.TaskStatus? status = ctx.TaskStatuses.FirstOrDefault(task => task.Id == taskId && task.MissionId == missionId && task.VikingId == userId);

View File

@ -6,18 +6,31 @@ namespace sodoff.Services;
public class MissionStoreSingleton {
private Dictionary<int, Mission> missions = new();
private int[] activeMissions;
private int[] upcomingMissions;
public MissionStoreSingleton() {
ServerMissionArray missionArray = XmlUtil.DeserializeXml<ServerMissionArray>(XmlUtil.ReadResourceXmlString("missions"));
DefaultMissions defaultMissions = XmlUtil.DeserializeXml<DefaultMissions>(XmlUtil.ReadResourceXmlString("defaultmissionlist"));
foreach (var mission in missionArray.MissionDataArray) {
SetUpRecursive(mission);
}
activeMissions = defaultMissions.Active;
upcomingMissions = defaultMissions.Upcoming;
}
public Mission GetMission(int missionID) {
return DeepCopy(missions[missionID]);
}
public int[] GetActiveMissions() {
return activeMissions;
}
public int[] GetUpcomingMissions() {
return upcomingMissions;
}
private void SetUpRecursive(Mission mission) {
missions.Add(mission.MissionID, mission);
foreach (var innerMission in mission.Missions) {

View File

@ -20,6 +20,7 @@
<None Remove="Resources\rewardmultiplier.xml" />
<None Remove="Resources\store.xml" />
<None Remove="Resources\allranks.xml" />
<None Remove="Resources\defaultmissionlist.xml" />
</ItemGroup>
<ItemGroup>
<None Update="Resources\childlist.xml">
@ -57,5 +58,8 @@
<EmbeddedResource Include="Resources\missions.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="Resources\defaultmissionlist.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
</ItemGroup>
</Project>