mirror of
https://github.com/SoDOff-Project/sodoff.git
synced 2025-10-11 08:18:49 -07:00
hideouts
This commit is contained in:
parent
8416b47fa8
commit
1c01eb25f5
@ -57,7 +57,10 @@ methods = [
|
||||
'GetUserMissionState',
|
||||
'SetAchievementAndGetReward',
|
||||
'SetUserAchievementTask',
|
||||
'GetAnnouncementsByUser'
|
||||
'GetAnnouncementsByUser',
|
||||
'GetUserRoomItemPositions',
|
||||
'SetUserRoomItemPositions',
|
||||
'GetAverageRatingForRoom'
|
||||
]
|
||||
|
||||
def routable(path):
|
||||
|
@ -14,11 +14,13 @@ public class ContentController : Controller {
|
||||
private KeyValueService keyValueService;
|
||||
private ItemService itemService;
|
||||
private MissionService missionService;
|
||||
public ContentController(DBContext ctx, KeyValueService keyValueService, ItemService itemService, MissionService missionService) {
|
||||
private RoomService roomService;
|
||||
public ContentController(DBContext ctx, KeyValueService keyValueService, ItemService itemService, MissionService missionService, RoomService roomService) {
|
||||
this.ctx = ctx;
|
||||
this.keyValueService = keyValueService;
|
||||
this.itemService = itemService;
|
||||
this.missionService = missionService;
|
||||
this.roomService = roomService;
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
@ -149,7 +151,7 @@ public class ContentController : Controller {
|
||||
if (item.Quantity == 0) continue; // Don't include an item that the viking doesn't have
|
||||
ItemData itemData = itemService.GetItem(item.ItemId);
|
||||
UserItemData uid = new UserItemData {
|
||||
UserInventoryID = viking.Inventory.Id,
|
||||
UserInventoryID = item.Id,
|
||||
ItemID = itemData.ItemID,
|
||||
Quantity = item.Quantity,
|
||||
Uses = itemData.Uses,
|
||||
@ -656,6 +658,44 @@ public class ContentController : Controller {
|
||||
return Ok(response);
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
[Produces("application/xml")]
|
||||
[Route("ContentWebService.asmx/GetUserRoomItemPositions")]
|
||||
public IActionResult GetUserRoomItemPositions([FromForm] string apiToken, [FromForm] string roomID) {
|
||||
Room? room = ctx.Sessions.FirstOrDefault(e => e.ApiToken == apiToken)?.Viking?.Rooms.FirstOrDefault(x => x.RoomId == roomID);
|
||||
if (room is null)
|
||||
return Ok();
|
||||
return Ok(roomService.GetUserItemPositionList(room));
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
[Produces("application/xml")]
|
||||
[Route("ContentWebService.asmx/SetUserRoomItemPositions")]
|
||||
public IActionResult SetUserRoomItemPositions([FromForm] string apiToken, [FromForm] string createXml, [FromForm] string updateXml, [FromForm] string removeXml, [FromForm] string roomID) {
|
||||
Room? room = ctx.Sessions.FirstOrDefault(e => e.ApiToken == apiToken)?.Viking?.Rooms.FirstOrDefault(x => x.RoomId == roomID);
|
||||
if (room is null)
|
||||
return Ok();
|
||||
|
||||
UserItemPositionSetRequest[] createItems = XmlUtil.DeserializeXml<UserItemPositionSetRequest[]>(createXml);
|
||||
UserItemPositionSetRequest[] updateItems = XmlUtil.DeserializeXml<UserItemPositionSetRequest[]>(updateXml);
|
||||
int[] deleteItems = XmlUtil.DeserializeXml<int[]>(removeXml);
|
||||
|
||||
int[] ids = roomService.CreateItems(createItems, room);
|
||||
UserItemState[] state = roomService.UpdateItems(updateItems, room);
|
||||
roomService.DeleteItems(deleteItems, room);
|
||||
|
||||
UserItemPositionSetResponse response = new UserItemPositionSetResponse {
|
||||
Success = true,
|
||||
CreatedUserItemPositionIDs = ids,
|
||||
Result = ItemPositionValidationResult.Valid
|
||||
};
|
||||
|
||||
if (state.Length > 0)
|
||||
response.UserItemStates = state;
|
||||
|
||||
return Ok(response);
|
||||
}
|
||||
|
||||
private RaisedPetData GetRaisedPetDataFromDragon (Dragon dragon) {
|
||||
RaisedPetData data = XmlUtil.DeserializeXml<RaisedPetData>(dragon.RaisedPetData);
|
||||
data.RaisedPetID = dragon.Id;
|
||||
|
21
src/Controllers/Common/RatingController.cs
Normal file
21
src/Controllers/Common/RatingController.cs
Normal file
@ -0,0 +1,21 @@
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using sodoff.Model;
|
||||
using sodoff.Schema;
|
||||
using sodoff.Util;
|
||||
|
||||
namespace sodoff.Controllers.Common;
|
||||
|
||||
public class RatingController : Controller
|
||||
{
|
||||
|
||||
[HttpPost]
|
||||
[Produces("application/xml")]
|
||||
[Route("V2/Ratingwebservice.asmx/GetAverageRatingForRoom")]
|
||||
public IActionResult GetAverageRatingForRoom([FromForm] string apiToken, [FromForm] string request)
|
||||
{
|
||||
// TODO: This is a placeholder
|
||||
return Ok(5);
|
||||
}
|
||||
|
||||
}
|
@ -13,11 +13,13 @@ public class RegistrationController : Controller {
|
||||
private readonly DBContext ctx;
|
||||
private ItemService itemService;
|
||||
private MissionService missionService;
|
||||
private RoomService roomService;
|
||||
|
||||
public RegistrationController(DBContext ctx, ItemService itemService, MissionService missionService) {
|
||||
public RegistrationController(DBContext ctx, ItemService itemService, MissionService missionService, RoomService roomService) {
|
||||
this.ctx = ctx;
|
||||
this.itemService = itemService;
|
||||
this.missionService = missionService;
|
||||
this.roomService = roomService;
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
@ -90,7 +92,8 @@ public class RegistrationController : Controller {
|
||||
Id = Guid.NewGuid().ToString(),
|
||||
Name = data.ChildName,
|
||||
User = user,
|
||||
Inventory = inv
|
||||
Inventory = inv,
|
||||
Rooms = new List<Room>()
|
||||
};
|
||||
|
||||
missionService.SetUpMissions(v);
|
||||
@ -98,6 +101,8 @@ public class RegistrationController : Controller {
|
||||
ctx.Vikings.Add(v);
|
||||
ctx.SaveChanges();
|
||||
|
||||
roomService.CreateRoom(v, "MyRoomINT");
|
||||
|
||||
return Ok(new RegistrationResult {
|
||||
UserID = v.Id,
|
||||
Status = MembershipUserStatus.Success
|
||||
|
@ -12,6 +12,9 @@ public class DBContext : DbContext {
|
||||
public DbSet<TaskStatus> TaskStatuses { get; set; } = null!;
|
||||
public DbSet<Inventory> Inventories { get; set; } = null!;
|
||||
public DbSet<InventoryItem> InventoryItems { get; set; } = null!;
|
||||
public DbSet<MissionState> MissionStates { get; set; } = null!;
|
||||
public DbSet<Room> Rooms { get; set; } = null!;
|
||||
public DbSet<RoomItem> RoomItems { get; set; } = null!;
|
||||
|
||||
public string DbPath { get; }
|
||||
|
||||
@ -40,6 +43,9 @@ public class DBContext : DbContext {
|
||||
builder.Entity<Viking>().HasMany(v => v.MissionStates)
|
||||
.WithOne(e => e.Viking);
|
||||
|
||||
builder.Entity<Viking>().HasMany(v => v.Rooms)
|
||||
.WithOne(e => e.Viking);
|
||||
|
||||
builder.Entity<Viking>().HasOne(s => s.User)
|
||||
.WithMany(e => e.Vikings)
|
||||
.HasForeignKey(e => e.UserId);
|
||||
@ -114,5 +120,15 @@ public class DBContext : DbContext {
|
||||
.WithMany(e => e.MissionStates)
|
||||
.HasForeignKey(e => e.VikingId);
|
||||
|
||||
builder.Entity<Room>().HasOne(r => r.Viking)
|
||||
.WithMany(e => e.Rooms)
|
||||
.HasForeignKey(e => e.VikingId);
|
||||
|
||||
builder.Entity<Room>().HasMany(r => r.Items)
|
||||
.WithOne(e => e.Room);
|
||||
|
||||
builder.Entity<RoomItem>().HasOne(i => i.Room)
|
||||
.WithMany(r => r.Items)
|
||||
.HasForeignKey(e => e.RoomId);
|
||||
}
|
||||
}
|
||||
|
16
src/Model/Room.cs
Normal file
16
src/Model/Room.cs
Normal file
@ -0,0 +1,16 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace sodoff.Model;
|
||||
|
||||
public class Room {
|
||||
[Key]
|
||||
public int Id { get; set; }
|
||||
|
||||
public string RoomId { get; set; }
|
||||
|
||||
public string VikingId { get; set; } = null!;
|
||||
|
||||
public virtual Viking? Viking { get; set; }
|
||||
|
||||
public virtual ICollection<RoomItem> Items { get; set; } = null!;
|
||||
}
|
13
src/Model/RoomItem.cs
Normal file
13
src/Model/RoomItem.cs
Normal file
@ -0,0 +1,13 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace sodoff.Model;
|
||||
public class RoomItem {
|
||||
[Key]
|
||||
public int Id { get; set; }
|
||||
|
||||
public int RoomId { get; set; }
|
||||
|
||||
public virtual Room Room { get; set; }
|
||||
|
||||
public string RoomItemData { get; set; }
|
||||
}
|
@ -20,6 +20,7 @@ public class Viking {
|
||||
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 ICollection<Room> Rooms { get; set; } = null!;
|
||||
public virtual Dragon? SelectedDragon { get; set; }
|
||||
|
||||
public int InventoryId { get; set; }
|
||||
|
@ -17,6 +17,7 @@ builder.Services.AddSingleton<ItemService>();
|
||||
builder.Services.AddSingleton<MissionStoreSingleton>();
|
||||
builder.Services.AddScoped<MissionService>();
|
||||
builder.Services.AddSingleton<StoreService>();
|
||||
builder.Services.AddScoped<RoomService>();
|
||||
|
||||
var app = builder.Build();
|
||||
|
||||
|
20
src/Schema/ItemPositionValidationResult.cs
Normal file
20
src/Schema/ItemPositionValidationResult.cs
Normal file
@ -0,0 +1,20 @@
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace sodoff.Schema;
|
||||
|
||||
public enum ItemPositionValidationResult {
|
||||
[XmlEnum("1")]
|
||||
Valid = 1,
|
||||
[XmlEnum("2")]
|
||||
PositionIDInNewItem,
|
||||
[XmlEnum("3")]
|
||||
PositionIDInvalid,
|
||||
[XmlEnum("4")]
|
||||
ParentIndexOutofRange,
|
||||
[XmlEnum("5")]
|
||||
ParentIndexInvalid,
|
||||
[XmlEnum("6")]
|
||||
CommonInventoryIDInvalid,
|
||||
[XmlEnum("7")]
|
||||
ParentIDInvalid
|
||||
}
|
57
src/Schema/UserItemPosition.cs
Normal file
57
src/Schema/UserItemPosition.cs
Normal file
@ -0,0 +1,57 @@
|
||||
using System.Numerics;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace sodoff.Schema;
|
||||
|
||||
[XmlInclude(typeof(UserItemPositionSetRequest))]
|
||||
[XmlRoot(ElementName = "UIP", Namespace = "")]
|
||||
[Serializable]
|
||||
public class UserItemPosition {
|
||||
[XmlElement(ElementName = "iid")]
|
||||
public int? ItemID { get; set; }
|
||||
|
||||
[XmlElement(ElementName = "uses")]
|
||||
public int? Uses { get; set; }
|
||||
|
||||
[XmlElement(ElementName = "invmdate")]
|
||||
public DateTime InvLastModifiedDate { get; set; }
|
||||
|
||||
[XmlElement(ElementName = "uis")]
|
||||
public UserItemState UserItemState { get; set; }
|
||||
|
||||
[XmlElement(ElementName = "uia", IsNullable = true)]
|
||||
public PairData UserItemAttributes { get; set; }
|
||||
|
||||
[XmlElement(ElementName = "uiss", IsNullable = true)]
|
||||
public UserItemStat UserItemStat { get; set; }
|
||||
|
||||
[XmlElement(ElementName = "id", IsNullable = true)]
|
||||
public int? UserItemPositionID;
|
||||
|
||||
[XmlElement(ElementName = "uicid")]
|
||||
public int? UserInventoryCommonID;
|
||||
|
||||
[XmlElement(ElementName = "i")]
|
||||
public ItemData Item;
|
||||
|
||||
[XmlElement(ElementName = "px")]
|
||||
public double? PositionX;
|
||||
|
||||
[XmlElement(ElementName = "py")]
|
||||
public double? PositionY;
|
||||
|
||||
[XmlElement(ElementName = "pz")]
|
||||
public double? PositionZ;
|
||||
|
||||
[XmlElement(ElementName = "rx")]
|
||||
public double? RotationX;
|
||||
|
||||
[XmlElement(ElementName = "ry")]
|
||||
public double? RotationY;
|
||||
|
||||
[XmlElement(ElementName = "rz")]
|
||||
public double? RotationZ;
|
||||
|
||||
[XmlElement(ElementName = "pid", IsNullable = true)]
|
||||
public int? ParentID;
|
||||
}
|
11
src/Schema/UserItemPositionList.cs
Normal file
11
src/Schema/UserItemPositionList.cs
Normal file
@ -0,0 +1,11 @@
|
||||
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace sodoff.Schema;
|
||||
|
||||
[XmlRoot(ElementName = "ArrayOfUserItemPosition", Namespace = "http://api.jumpstart.com/")]
|
||||
[Serializable]
|
||||
public class UserItemPositionList {
|
||||
[XmlElement(ElementName = "UserItemPosition")]
|
||||
public UserItemPosition[] UserItemPosition;
|
||||
}
|
10
src/Schema/UserItemPositionSetRequest.cs
Normal file
10
src/Schema/UserItemPositionSetRequest.cs
Normal file
@ -0,0 +1,10 @@
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace sodoff.Schema;
|
||||
|
||||
[XmlRoot(ElementName = "UIPSR", Namespace = "")]
|
||||
[Serializable]
|
||||
public class UserItemPositionSetRequest : UserItemPosition {
|
||||
[XmlElement(ElementName = "pix")]
|
||||
public int? ParentIndex;
|
||||
}
|
19
src/Schema/UserItemPositionSetResponse.cs
Normal file
19
src/Schema/UserItemPositionSetResponse.cs
Normal file
@ -0,0 +1,19 @@
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace sodoff.Schema;
|
||||
|
||||
[XmlRoot(ElementName = "UIPSRS", Namespace = "")]
|
||||
[Serializable]
|
||||
public class UserItemPositionSetResponse {
|
||||
[XmlElement(ElementName = "s")]
|
||||
public bool Success;
|
||||
|
||||
[XmlElement(ElementName = "ids")]
|
||||
public int[] CreatedUserItemPositionIDs;
|
||||
|
||||
[XmlElement(ElementName = "r")]
|
||||
public ItemPositionValidationResult Result;
|
||||
|
||||
[XmlElement(ElementName = "uciis")]
|
||||
public UserItemState[] UserItemStates;
|
||||
}
|
13
src/Schema/UserItemStat.cs
Normal file
13
src/Schema/UserItemStat.cs
Normal file
@ -0,0 +1,13 @@
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace sodoff.Schema;
|
||||
|
||||
[XmlRoot(ElementName = "UISS", Namespace = "")]
|
||||
[Serializable]
|
||||
public class UserItemStat {
|
||||
[XmlElement(ElementName = "iss", IsNullable = true)]
|
||||
public ItemStat[] ItemStats { get; set; }
|
||||
|
||||
[XmlElement(ElementName = "it", IsNullable = true)]
|
||||
public ItemTier? ItemTier { get; set; }
|
||||
}
|
21
src/Schema/UserItemState.cs
Normal file
21
src/Schema/UserItemState.cs
Normal file
@ -0,0 +1,21 @@
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace sodoff.Schema;
|
||||
|
||||
[Serializable]
|
||||
public class UserItemState {
|
||||
[XmlElement(ElementName = "CIID")]
|
||||
public int CommonInventoryID;
|
||||
|
||||
[XmlElement(ElementName = "UIPID")]
|
||||
public int UserItemPositionID;
|
||||
|
||||
[XmlElement(ElementName = "IID")]
|
||||
public int ItemID;
|
||||
|
||||
[XmlElement(ElementName = "ISID")]
|
||||
public int ItemStateID;
|
||||
|
||||
[XmlElement(ElementName = "SCD")]
|
||||
public DateTime StateChangeDate;
|
||||
}
|
91
src/Services/RoomService.cs
Normal file
91
src/Services/RoomService.cs
Normal file
@ -0,0 +1,91 @@
|
||||
using sodoff.Model;
|
||||
using sodoff.Schema;
|
||||
using sodoff.Util;
|
||||
using System.Reflection;
|
||||
using System.Xml;
|
||||
using System.Xml.Linq;
|
||||
|
||||
namespace sodoff.Services;
|
||||
public class RoomService {
|
||||
|
||||
private readonly DBContext ctx;
|
||||
|
||||
public RoomService(DBContext ctx) {
|
||||
this.ctx = ctx;
|
||||
}
|
||||
|
||||
public void CreateRoom(Viking viking, string roomId) {
|
||||
viking.Rooms.Add(new Room { RoomId = roomId });
|
||||
ctx.SaveChanges();
|
||||
}
|
||||
|
||||
public int[] CreateItems(UserItemPositionSetRequest[] roomItemRequest, Room room) {
|
||||
List<int> ids = new();
|
||||
foreach (var itemRequest in roomItemRequest) {
|
||||
// TODO: Remove item from inventory (using CommonInventoryID)
|
||||
InventoryItem? i = room.Viking?.Inventory.InventoryItems.FirstOrDefault(x => x.Id == itemRequest.UserInventoryCommonID);
|
||||
if (i != null) i.Quantity--;
|
||||
UserItemPosition uip = itemRequest;
|
||||
RoomItem roomItem = new RoomItem {
|
||||
RoomItemData = XmlUtil.SerializeXml<UserItemPosition>(itemRequest).Replace(" xsi:type=\"UserItemPositionSetRequest\"", "") // NOTE: No way to avoid this hack when we're serializing a child class into a base class
|
||||
};
|
||||
|
||||
room.Items.Add(roomItem);
|
||||
ctx.SaveChanges();
|
||||
ids.Add(roomItem.Id);
|
||||
}
|
||||
return ids.ToArray();
|
||||
}
|
||||
|
||||
public UserItemState[] UpdateItems(UserItemPositionSetRequest[] roomItemRequest, Room room) {
|
||||
List<UserItemState> state = new();
|
||||
foreach (var itemRequest in roomItemRequest) {
|
||||
RoomItem? item = room.Items.FirstOrDefault(x => x.Id == itemRequest.UserItemPositionID);
|
||||
if (item is null) continue;
|
||||
|
||||
UserItemPosition itemPosition = XmlUtil.DeserializeXml<UserItemPosition>(item.RoomItemData);
|
||||
|
||||
if (itemRequest.Uses != null) itemPosition.Uses = itemRequest.Uses;
|
||||
itemPosition.InvLastModifiedDate = itemRequest.InvLastModifiedDate;
|
||||
if (itemRequest.UserItemState != null) itemPosition.UserItemState = itemRequest.UserItemState;
|
||||
if (itemRequest.UserItemAttributes != null) itemPosition.UserItemAttributes = itemRequest.UserItemAttributes;
|
||||
if (itemRequest.UserItemStat != null) itemPosition.UserItemStat = itemRequest.UserItemStat;
|
||||
if (itemRequest.Item != null) itemPosition.Item = itemRequest.Item;
|
||||
if (itemRequest.PositionX != null) itemPosition.PositionX = itemRequest.PositionX;
|
||||
if (itemRequest.PositionY != null) itemPosition.PositionY = itemRequest.PositionY;
|
||||
if (itemRequest.PositionZ != null) itemPosition.PositionZ = itemRequest.PositionZ;
|
||||
if (itemRequest.RotationX != null) itemPosition.RotationX = itemRequest.RotationX;
|
||||
if (itemRequest.RotationY != null) itemPosition.RotationY = itemRequest.RotationY;
|
||||
if (itemRequest.RotationZ != null) itemPosition.RotationZ = itemRequest.RotationZ;
|
||||
if (itemRequest.ParentID != null) itemPosition.ParentID = itemRequest.ParentID;
|
||||
|
||||
item.RoomItemData = XmlUtil.SerializeXml(itemPosition);
|
||||
if (itemPosition.UserItemState != null) state.Add(itemPosition.UserItemState);
|
||||
}
|
||||
|
||||
ctx.SaveChanges();
|
||||
return state.ToArray();
|
||||
}
|
||||
|
||||
public void DeleteItems(int[] itemIds, Room room) {
|
||||
for (int i = 0; i < itemIds.Length; i++) {
|
||||
RoomItem? ri = room.Items.FirstOrDefault(x => x.Id == itemIds[i]);
|
||||
if (ri is null) continue;
|
||||
UserItemPosition itemPosition = XmlUtil.DeserializeXml<UserItemPosition>(ri.RoomItemData);
|
||||
room.Items.Remove(ri);
|
||||
InventoryItem? invItem = room.Viking?.Inventory.InventoryItems.FirstOrDefault(x => x.Id == itemPosition.UserInventoryCommonID);
|
||||
if (invItem != null) invItem.Quantity++;
|
||||
}
|
||||
ctx.SaveChanges();
|
||||
}
|
||||
|
||||
public UserItemPositionList GetUserItemPositionList(Room room) {
|
||||
List<UserItemPosition> itemPosition = new();
|
||||
foreach (var item in room.Items) {
|
||||
UserItemPosition data = XmlUtil.DeserializeXml<UserItemPosition>(item.RoomItemData);
|
||||
data.UserItemPositionID = item.Id;
|
||||
itemPosition.Add(data);
|
||||
}
|
||||
return new UserItemPositionList { UserItemPosition = itemPosition.ToArray() };
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user