mirror of
https://github.com/sebastian-heinz/Arrowgene.DragonsDogmaOnline
synced 2026-08-03 11:12:41 -04:00
* Fix bug where appraising certain items in BBM while you had a copy of that item in your regular character's storage chest would throw an error. Fix bugs where SQLite would occasionally have a DB lock conflict due to poor connection management. * Be more aggressive when clearing out invalid priority quests. * Fix bug where the Beauty Shop would sometimes complain about PRICE_NO_MATCH when trying to pay with Silver Tickets. * Fix bugs where pawn search wouldn't display craft levels, and didn't support filtering by craft level. * Migrate 58 > 59. Store character_id in the connections table so we can use it for player tracking. Adjust player tracking to be driven by the DB. * Fix bugs where bazaar processes could sometimes delete items if the storage was full. * Add feature where you can sell special items (like PP crystals) to consume them, instead of having to spam use them. * Fix bug where deleting pawns would badly mangle the equipment entries of other pawns owned by the same character. * Add support for LightQuestRepeatsPerDay, limiting the number of times a board quest can be offered to a single player per day. * Research for EquipStatId. * Maybe fix bug where base game augments were secretly applying even in BBM? Maybe fix bug where certain alt-pallet skills wouldn't work in multiplayer due to missing context information. * Update database migration version. * Automatically promote localhost players to admin when running in debug mode. Adjust /finishquesttype to clear progress when finishing quests. * Fix bug where hired pawns wearing job emblems weren't benefiting from the stats on them. Hired pawns now reflect the hiring character's job emblems entirely.
112 lines
5 KiB
C#
112 lines
5 KiB
C#
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;
|
|
using System.Linq;
|
|
|
|
namespace Arrowgene.Ddon.GameServer.Handler
|
|
{
|
|
public class CraftGetCraftProductHandler : GameRequestPacketHandler<C2SCraftGetCraftProductReq, S2CCraftGetCraftProductRes>
|
|
{
|
|
private static readonly ServerLogger Logger = LogProvider.Logger<ServerLogger>(typeof(CraftGetCraftProductHandler));
|
|
|
|
public CraftGetCraftProductHandler(DdonGameServer server) : base(server)
|
|
{
|
|
}
|
|
|
|
public override S2CCraftGetCraftProductRes Handle(GameClient client, C2SCraftGetCraftProductReq request)
|
|
{
|
|
S2CCraftGetCraftProductRes craftGetCraftProductRes = new S2CCraftGetCraftProductRes();
|
|
|
|
PacketQueue queue = new();
|
|
|
|
Server.Database.ExecuteInTransaction(connection =>
|
|
{
|
|
CraftProgress craftProgress = Server.Database.SelectPawnCraftProgress(client.Character.CharacterId, request.CraftMainPawnID, connection);
|
|
|
|
craftGetCraftProductRes.CraftProduct = new CDataCraftProduct()
|
|
{
|
|
ItemID = craftProgress.ItemId,
|
|
ItemNum = craftProgress.CreateCount,
|
|
PlusValue = (byte)craftProgress.PlusValue
|
|
};
|
|
|
|
var (specialQueue, isSpecial) = Server.ItemManager.HandleSpecialItem(client, new(), (ItemId)craftProgress.ItemId, craftProgress.CreateCount, SpecialItemMode.OnAcquire, connection);
|
|
|
|
if (isSpecial)
|
|
{
|
|
queue.AddRange(specialQueue);
|
|
}
|
|
else if (craftProgress.AdditionalStatusId != 0 && Server.AssetRepository.CraftAddStatusAsset.AddStatuses.TryGetValue(craftProgress.AdditionalStatusId, out var addStatus))
|
|
{
|
|
var craftItem = new Item()
|
|
{
|
|
ItemId = craftProgress.ItemId,
|
|
PlusValue = (byte)craftProgress.PlusValue,
|
|
AddStatusParamList = [
|
|
new() {
|
|
EnhanceType = EquipEnhanceType.AdditionalCraftMaterial,
|
|
EnhanceId = addStatus.BuffId,
|
|
}
|
|
]
|
|
};
|
|
|
|
// AddNewItem doesn't support merging stacks, while AddItem does.
|
|
// This is split to maintain support for crafting consumables while still allowing us to create a custom item.
|
|
craftGetCraftProductRes.UpdateItemList.Add(Server.ItemManager.AddNewItem(
|
|
Server,
|
|
client.Character,
|
|
request.StorageType != StorageType.ReceiveInStorageCraft,
|
|
craftItem, craftProgress.CreateCount,
|
|
connection)
|
|
);
|
|
}
|
|
else
|
|
{
|
|
List<CDataItemUpdateResult> itemUpdateResult = Server.ItemManager.AddItem(
|
|
Server,
|
|
client.Character,
|
|
request.StorageType != StorageType.ReceiveInStorageCraft,
|
|
craftProgress.ItemId,
|
|
craftProgress.CreateCount,
|
|
(byte)craftProgress.PlusValue,
|
|
connection
|
|
);
|
|
craftGetCraftProductRes.UpdateItemList.AddRange(itemUpdateResult);
|
|
}
|
|
|
|
Server.Database.DeletePawnCraftProgress(client.Character.CharacterId, request.CraftMainPawnID, connection);
|
|
|
|
Pawn mainPawn = client.Character.Pawns.First(p => p.PawnId == request.CraftMainPawnID);
|
|
mainPawn.PawnState = PawnState.None;
|
|
Server.Database.UpdatePawnBaseInfo(mainPawn, connection);
|
|
foreach (var supportId in new List<uint>(){
|
|
craftProgress.CraftSupportPawnId1,
|
|
craftProgress.CraftSupportPawnId2,
|
|
craftProgress.CraftSupportPawnId3
|
|
})
|
|
{
|
|
Pawn supportPawn = client.Character.Pawns.FirstOrDefault(p => p.PawnId == supportId, null);
|
|
if (supportPawn != null)
|
|
{
|
|
supportPawn.PawnState = PawnState.None;
|
|
if (supportPawn.PawnType == PawnType.Main)
|
|
{
|
|
Server.Database.UpdatePawnBaseInfo(supportPawn, connection);
|
|
}
|
|
}
|
|
}
|
|
|
|
var itemInfo = Server.AssetRepository.ClientItemInfos[craftProgress.ItemId];
|
|
queue.AddRange(Server.AchievementManager.HandleCraft(client, itemInfo, connection));
|
|
});
|
|
|
|
queue.Send();
|
|
return craftGetCraftProductRes;
|
|
}
|
|
}
|
|
}
|