ddon-server/Arrowgene.Ddon.GameServer/Handler/BattleContentContentResetHandler.cs

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();
}
}
}