mirror of
https://github.com/sebastian-heinz/Arrowgene.DragonsDogmaOnline
synced 2026-08-03 11:12:41 -04:00
144 lines
7.2 KiB
C#
144 lines
7.2 KiB
C#
using Arrowgene.Ddon.Database.Model;
|
|
using Arrowgene.Ddon.GameServer.Characters;
|
|
using Arrowgene.Ddon.Server;
|
|
using Arrowgene.Ddon.Server.Network;
|
|
using Arrowgene.Ddon.Shared.Entity.PacketStructure;
|
|
using Arrowgene.Ddon.Shared.Entity.Structure;
|
|
using Arrowgene.Ddon.Shared.Model;
|
|
using Arrowgene.Logging;
|
|
using System.Collections.Generic;
|
|
|
|
namespace Arrowgene.Ddon.GameServer.Handler
|
|
{
|
|
public class BattleContentContentResetHandler : GameRequestPacketHandler<C2SBattleContentContentResetReq, S2CBattleContentContentResetRes>
|
|
{
|
|
private static readonly ServerLogger Logger = LogProvider.Logger<ServerLogger>(typeof(BattleContentContentResetHandler));
|
|
|
|
//Helper function to get the list of items to send to the client after a reset
|
|
private List<CDataItemUpdateResult> GetRefreshInventoryList(Character character, StorageType storageType)
|
|
{
|
|
List<CDataItemUpdateResult> result = new List<CDataItemUpdateResult>();
|
|
for (int i = 0; i < character.Storage.GetStorage(storageType).Items.Count; i++)
|
|
{
|
|
ushort slotNo = (ushort)(i + 1);
|
|
var storageItem = character.Storage.GetStorage(storageType).GetItem(slotNo);
|
|
if(storageItem != null)
|
|
{
|
|
result.Add(Server.ItemManager.CreateItemUpdateResult(null, storageItem.Item1, storageType, slotNo, storageItem.Item2, storageItem.Item2));
|
|
}
|
|
else
|
|
{
|
|
Item item = new Item()
|
|
{
|
|
ItemId = 0,
|
|
UId = ""
|
|
};
|
|
result.Add(Server.ItemManager.CreateItemUpdateResult(null, item, storageType, slotNo, 0, 0));
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
public BattleContentContentResetHandler(DdonGameServer server) : base(server)
|
|
{
|
|
}
|
|
|
|
public override S2CBattleContentContentResetRes Handle(GameClient client, C2SBattleContentContentResetReq request)
|
|
{
|
|
PacketQueue queue = new();
|
|
bool isPaidRequest = request.ResetIndex > 0;
|
|
|
|
S2CItemUpdateCharacterItemNtc updateCharacterItemNtc = new S2CItemUpdateCharacterItemNtc();
|
|
|
|
// Add back equipment templates
|
|
client.Character.EquipmentTemplate = new EquipmentTemplate(Server.AssetRepository.BitterblackMazeAsset.GenerateStarterEquipment(), Server.AssetRepository.BitterblackMazeAsset.GenerateStarterJobEquipment());
|
|
|
|
List<CDataItemUpdateResult> updateItemList = null;
|
|
Server.Database.ExecuteInTransaction(connection =>
|
|
{
|
|
// Remove all items from the player inventory
|
|
updateItemList = Server.ItemManager.RemoveAllItemsFromInventory(client.Character, client.Character.Storage, ItemManager.AllItemStorages, connection);
|
|
|
|
// Remove items equipped in the database
|
|
Server.Database.DeleteAllEquipItems(client.Character.CommonId, connection);
|
|
|
|
// Recreate starting items for player
|
|
Server.Database.CreateItems(connection, client.Character);
|
|
|
|
// Add starter job items and starter consumable items for Bitterblack Maze characters
|
|
if(client.Character.GameMode == GameMode.BitterblackMaze)
|
|
{
|
|
Server.Database.CreateListItems(connection, client.Character, StorageType.ItemBagConsumable, Server.AssetRepository.BitterblackMazeAsset.GenerateStarterConsumableItems());
|
|
Server.Database.CreateListItems(connection, client.Character, StorageType.ItemBagJob, Server.AssetRepository.BitterblackMazeAsset.GenerateStarterJobItems());
|
|
}
|
|
|
|
if (isPaidRequest)
|
|
{
|
|
// Pay ticket cost.
|
|
switch (request.ResetIndex)
|
|
{
|
|
case 1:
|
|
updateCharacterItemNtc.UpdateWalletList.Add(Server.WalletManager.RemoveFromWallet(client.Character, WalletType.BitterblackMazeResetTicket, 1, connection));
|
|
break;
|
|
case 2:
|
|
// TODO: Do all the premium reset stuff; better starting gear (IR 11, e.g. Sublime Set) and rewards.
|
|
updateCharacterItemNtc.UpdateWalletList.Add(
|
|
Server.WalletManager.RemoveFromWallet(client.Character, WalletType.GoldenGemstones, Server.GameSettings.GameServerSettings.BBMResetGGCost, connection)
|
|
);
|
|
Server.Database.InsertBBMGGReset(client.Character.CharacterId, connection);
|
|
break;
|
|
|
|
}
|
|
|
|
// Reset mark reward tracking
|
|
Server.Database.RemoveBBMRewards(client.Character.CharacterId, connection);
|
|
|
|
// Reset treasure tracking.
|
|
Server.Database.RemoveBBMContentTreasure(client.Character.CharacterId, connection);
|
|
}
|
|
|
|
//job and consumable items added for Bitterblack Maze needs to be updated to the Client
|
|
updateItemList.AddRange(GetRefreshInventoryList(client.Character, StorageType.ItemBagConsumable));
|
|
updateItemList.AddRange(GetRefreshInventoryList(client.Character, StorageType.ItemBagJob));
|
|
updateCharacterItemNtc.UpdateType = ItemNoticeType.SwitchingStorage;
|
|
updateCharacterItemNtc.UpdateItemList = updateItemList;
|
|
|
|
client.Enqueue(updateCharacterItemNtc, queue);
|
|
|
|
// Add back equipment
|
|
client.Character.Equipment = client.Character.Storage.GetCharacterEquipment();
|
|
|
|
// Reset EXP
|
|
queue.AddRange(Server.ExpManager.ResetExpData(client, client.Character, connection));
|
|
|
|
// Set current job back to level 1 stats
|
|
queue.AddRange(Server.JobManager.SetJob(client, client.Character, client.Character.Job, connection));
|
|
|
|
// Reset progress
|
|
client.Character.BbmProgress.StartTime = 0;
|
|
client.Character.BbmProgress.ContentId = 0;
|
|
client.Character.BbmProgress.Tier = 0;
|
|
client.Character.BbmProgress.KilledDeath = false;
|
|
client.Character.BbmProgress.IsPaidReset = isPaidRequest;
|
|
Server.Database.UpdateBBMProgress(client.Character.CharacterId, client.Character.BbmProgress, connection);
|
|
|
|
// Update the situation information
|
|
S2CBattleContentProgressNtc ntc2 = new()
|
|
{
|
|
BattleContentStatusList = [BitterblackMazeManager.GetUpdatedContentStatus(Server, client.Character, connection)]
|
|
};
|
|
client.Enqueue(ntc2, queue);
|
|
});
|
|
|
|
// Restore to maximum life in case of equipment shenanigans.
|
|
var ntc3 = client.Character.S2CContextGetLobbyPlayerContextNtc;
|
|
ntc3.Context.PlayerInfo.HP = uint.MaxValue;
|
|
ntc3.Context.PlayerInfo.WhiteHP = uint.MaxValue;
|
|
ntc3.Context.PlayerInfo.Stamina = uint.MaxValue;
|
|
client.Enqueue(ntc3, queue);
|
|
|
|
queue.Send();
|
|
|
|
return new S2CBattleContentContentResetRes();
|
|
}
|
|
}
|
|
}
|