Skip to content

Commit

Permalink
Fix missing area ranks on character creation, add ResponseErrorExcept…
Browse files Browse the repository at this point in the history
…ions to Area Rank handlers.
  • Loading branch information
RyanYappert committed Dec 27, 2024
1 parent 56928b2 commit 953a39a
Show file tree
Hide file tree
Showing 7 changed files with 46 additions and 19 deletions.
6 changes: 5 additions & 1 deletion Arrowgene.Ddon.Database/Sql/Core/DdonSqlDbAreaRank.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,17 @@ public abstract partial class DdonSqlDb<TCon, TCom, TReader> : SqlDb<TCon, TCom,

public bool InsertAreaRank(uint characterId, AreaRank areaRank, DbConnection? connectionIn = null)
{
Logger.Debug("Inserting area rank.");
return ExecuteQuerySafe(connectionIn, (connection) =>
{
return ExecuteNonQuery(connection, SqlInsertAreaRank, command =>
{
AddParameter(command, "@character_id", characterId);
AddParameter(command, "@area_id", (uint)areaRank.AreaId);
AddParameter(command, areaRank);
AddParameter(command, "@rank", areaRank.Rank);
AddParameter(command, "@point", areaRank.Point);
AddParameter(command, "@week_point", areaRank.WeekPoint);
AddParameter(command, "@last_week_point", areaRank.LastWeekPoint);
}) == 1;
});
}
Expand Down
6 changes: 4 additions & 2 deletions Arrowgene.Ddon.GameServer/Characters/AreaRankManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,8 @@ public uint GetMaxPoints(QuestAreaId areaId, uint rank)

public bool CanRankUp(GameClient client, QuestAreaId areaId)
{
AreaRank clientRank = client.Character.AreaRanks.Find(x => x.AreaId == areaId);
AreaRank clientRank = client.Character.AreaRanks.Find(x => x.AreaId == areaId)
?? throw new ResponseErrorException(ErrorCode.ERROR_CODE_AREAMASTER_AREA_INFO_NOT_FOUND);
Dictionary<QuestId, CompletedQuest> completedQuests = client.Character.CompletedQuests;
List<AreaRankRequirement> requirements = Server.AssetRepository.AreaRankRequirementAsset.Where(x => x.AreaId == areaId).ToList();

Expand Down Expand Up @@ -117,7 +118,8 @@ public List<CDataAreaRankUpQuestInfo> RankUpQuestInfo(QuestAreaId areaId)
public PacketQueue AddAreaPoint(GameClient client, QuestAreaId areaId, uint point, DbConnection? connectionIn = null)
{
PacketQueue queue = new PacketQueue();
AreaRank clientRank = client.Character.AreaRanks.Find(x => x.AreaId == areaId);
AreaRank clientRank = client.Character.AreaRanks.Find(x => x.AreaId == areaId)
?? throw new ResponseErrorException(ErrorCode.ERROR_CODE_AREAMASTER_AREA_INFO_NOT_FOUND);
if (clientRank is null || clientRank.Rank == 0) {
return queue;
}
Expand Down
3 changes: 2 additions & 1 deletion Arrowgene.Ddon.GameServer/Handler/AreaAreaRankUpHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ public AreaAreaRankUpHandler(DdonGameServer server) : base(server)
public override S2CAreaAreaRankUpRes Handle(GameClient client, C2SAreaAreaRankUpReq request)
{
S2CAreaAreaRankUpRes res = new();
AreaRank clientRank = client.Character.AreaRanks.Find(x => x.AreaId == request.AreaId);
AreaRank clientRank = client.Character.AreaRanks.Find(x => x.AreaId == request.AreaId)
?? throw new ResponseErrorException(ErrorCode.ERROR_CODE_AREAMASTER_AREA_INFO_NOT_FOUND);
lock (clientRank)
{
clientRank.Rank += 1;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using Arrowgene.Ddon.Server;
using Arrowgene.Ddon.Shared.Entity.PacketStructure;
using Arrowgene.Ddon.Shared.Entity.Structure;
using Arrowgene.Ddon.Shared.Model;
using Arrowgene.Ddon.Shared.Model.Quest;
using Arrowgene.Logging;
using System.Linq;
Expand All @@ -19,7 +20,8 @@ public override S2CAreaGetAreaMasterInfoRes Handle(GameClient client, C2SAreaGet
{
//var result = new S2CAreaGetAreaMasterInfoRes.Serializer().Read(PcapData);

var clientRank = client.Character.AreaRanks.Find(x => x.AreaId == request.AreaId);
var clientRank = client.Character.AreaRanks.Find(x => x.AreaId == request.AreaId)
?? throw new ResponseErrorException(ErrorCode.ERROR_CODE_AREAMASTER_AREA_INFO_NOT_FOUND);
var completedQuests = client.Character.CompletedQuests;

S2CAreaGetAreaMasterInfoRes result = new();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,10 @@ public AreaGetAreaSupplyInfoHandler(DdonGameServer server) : base(server)

public override S2CAreaGetAreaSupplyInfoRes Handle(GameClient client, C2SAreaGetAreaSupplyInfoReq request)
{
var pcap = EntitySerializer.Get<S2CAreaGetAreaSupplyInfoRes>().Read(PcapData);
//var pcap = EntitySerializer.Get<S2CAreaGetAreaSupplyInfoRes>().Read(PcapData);

AreaRank clientRank = client.Character.AreaRanks.Find(x => x.AreaId == request.AreaId);
AreaRank clientRank = client.Character.AreaRanks.Find(x => x.AreaId == request.AreaId)
?? throw new ResponseErrorException(ErrorCode.ERROR_CODE_AREAMASTER_AREA_INFO_NOT_FOUND);
S2CAreaGetAreaSupplyInfoRes res = new();

var asset = Server.AssetRepository.AreaRankSupplyAsset
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using Arrowgene.Ddon.Server;
using Arrowgene.Ddon.Shared.Entity;
using Arrowgene.Ddon.Shared.Entity.PacketStructure;
using Arrowgene.Ddon.Shared.Model;
using Arrowgene.Ddon.Shared.Model.Quest;
using Arrowgene.Logging;
using System.Linq;
Expand All @@ -19,10 +20,12 @@ public AreaGetSpotInfoListHandler(DdonGameServer server) : base(server)

public override S2CAreaGetSpotInfoListRes Handle(GameClient client, C2SAreaGetSpotInfoListReq request)
{
// TODO: This still uses the List<CDataAreaRankSeason3> Unk1 from the Pcap, the client complains if its not present.
var pcap = EntitySerializer.Get<S2CAreaGetSpotInfoListRes>().Read(PcapData);
pcap.SpotInfoList = new();

var clientRank = client.Character.AreaRanks.Find(x => x.AreaId == request.AreaId);
var clientRank = client.Character.AreaRanks.Find(x => x.AreaId == request.AreaId)
?? throw new ResponseErrorException(ErrorCode.ERROR_CODE_AREAMASTER_AREA_INFO_NOT_FOUND);
var completedQuests = client.Character.CompletedQuests;

foreach (var spot in Server.AssetRepository.AreaRankSpotInfoAsset.Where(x => x.AreaId == request.AreaId))
Expand Down
36 changes: 25 additions & 11 deletions Arrowgene.Ddon.LoginServer/Handler/CreateCharacterHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -555,20 +555,34 @@ public override void Handle(LoginClient client, StructurePacket<C2LCreateCharact
client.Send(res);
}

// Populate playpoint data.
Enum.GetValues(typeof(JobId)).Cast<JobId>().Select(job => new CDataJobPlayPoint()
Database.ExecuteInTransaction(connection =>
{
Job = job,
PlayPoint = new CDataPlayPointData()
// Populate playpoint data.
Enum.GetValues(typeof(JobId)).Cast<JobId>().Select(job => new CDataJobPlayPoint()
{
ExpMode = ExpMode.Experience, // EXP
PlayPoint = 0
}
}).ToList().ForEach((Action<CDataJobPlayPoint>)(x => {
Database.ReplaceCharacterPlayPointData((uint)character.CharacterId, x);
character.PlayPointList.Add(x);
}));
Job = job,
PlayPoint = new CDataPlayPointData()
{
ExpMode = ExpMode.Experience, // EXP
PlayPoint = 0
}
}).ToList().ForEach((Action<CDataJobPlayPoint>)(x => {
Database.ReplaceCharacterPlayPointData((uint)character.CharacterId, x, connection);
character.PlayPointList.Add(x);
}));

// Populate area ranks.
for (int i = (int)QuestAreaId.HidellPlains; i <= (int)QuestAreaId.UrtecaMountains; i++)
{
var rank = new AreaRank()
{
AreaId = (QuestAreaId)i
};
Database.InsertAreaRank(character.CharacterId, rank, connection);
character.AreaRanks.Add(rank);
}
});

// Default unlock some secret abilities based on server admin desires
foreach (var ability in _AssetRepository.SecretAbilitiesAsset.DefaultSecretAbilities)
{
Expand Down

0 comments on commit 953a39a

Please sign in to comment.