Skip to content

Commit

Permalink
Clean up rebase from hell; add areapoint and arearank commands.
Browse files Browse the repository at this point in the history
  • Loading branch information
RyanYappert committed Jan 17, 2025
1 parent 453508c commit a926307
Show file tree
Hide file tree
Showing 13 changed files with 180 additions and 144 deletions.
3 changes: 3 additions & 0 deletions Arrowgene.Ddon.GameServer/Arrowgene.Ddon.GameServer.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,7 @@
<ItemGroup>
<ProjectReference Include="..\Arrowgene.Ddon.Server\Arrowgene.Ddon.Server.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="Chat\Command\Commands\" />
</ItemGroup>
</Project>
61 changes: 21 additions & 40 deletions Arrowgene.Ddon.GameServer/Characters/AreaRankManager.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
using Arrowgene.Ddon.Database.Model;
using Arrowgene.Ddon.GameServer.Quests;
using Arrowgene.Ddon.Server;
using Arrowgene.Ddon.Server.Network;
Expand All @@ -7,12 +6,9 @@
using Arrowgene.Ddon.Shared.Model;
using Arrowgene.Ddon.Shared.Model.Quest;
using Arrowgene.Logging;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using static Arrowgene.Ddon.GameServer.Characters.BitterblackMazeManager;
using System.Reflection.Emit;

namespace Arrowgene.Ddon.GameServer.Characters
{
Expand All @@ -37,17 +33,12 @@ public List<CDataRewardItemInfo> GetSupplyRewardList(QuestAreaId areaId, uint ra
throw new ResponseErrorException(ErrorCode.ERROR_CODE_AREAMASTER_SUPPLY_NOT_AVAILABLE, $"No valid asset for {areaId} found in AreaRankSupply asset.");
}

var rankSupplies = areaSupplies.Where(x => x.MinRank <= rank).OrderBy(x => x.MinRank).LastOrDefault();
if (rankSupplies is null)
{
throw new ResponseErrorException(ErrorCode.ERROR_CODE_AREAMASTER_SUPPLY_NOT_AVAILABLE, $"No valid asset for {areaId}, rank {rank} found in AreaRankSupply asset.");
}
var rankSupplies = areaSupplies.Where(x => x.MinRank <= rank).OrderBy(x => x.MinRank).LastOrDefault()
?? throw new ResponseErrorException(ErrorCode.ERROR_CODE_AREAMASTER_SUPPLY_NOT_AVAILABLE, $"No valid asset for {areaId}, rank {rank} found in AreaRankSupply asset.");

var pointSupplies = rankSupplies.SupplyItemInfoList.Where(x => x.MinAreaPoint <= points).OrderBy(x => x.MinAreaPoint).LastOrDefault();
if (pointSupplies is null)
{
throw new ResponseErrorException(ErrorCode.ERROR_CODE_AREAMASTER_SUPPLY_NOT_AVAILABLE, $"No valid asset for {areaId}, rank {rank}, {points} points found in AreaRankSupply asset.");
}
var pointSupplies = rankSupplies.SupplyItemInfoList.Where(x => x.MinAreaPoint <= points).OrderBy(x => x.MinAreaPoint).LastOrDefault()
?? throw new ResponseErrorException(ErrorCode.ERROR_CODE_AREAMASTER_SUPPLY_NOT_AVAILABLE, $"No valid asset for {areaId}, rank {rank}, {points} points found in AreaRankSupply asset.");

return pointSupplies.SupplyItemList.Select((x, i) => new CDataRewardItemInfo()
{
Index = (uint)i,
Expand Down Expand Up @@ -159,16 +150,29 @@ public PacketQueue AddAreaPoint(GameClient client, QuestAreaId areaId, uint poin
return queue;
}

public uint GetEffectiveRank(Character character, QuestAreaId areaId)
{
AreaRank rank = character.AreaRanks.GetValueOrDefault(areaId)
?? throw new ResponseErrorException(ErrorCode.ERROR_CODE_AREAMASTER_AREA_INFO_NOT_FOUND);

uint effectiveRank = rank.Rank;
if (!Server.GameLogicSettings.EnableAreaRankSpotLocks)
{
effectiveRank = MaxRank(areaId);
}
return effectiveRank;
}

public uint GetAreaPointReward(Quest quest)
{
uint amount;
uint areaId = (uint)quest.QuestAreaId;
QuestAreaId areaId = quest.QuestAreaId;

if (areaId < 1 || areaId > 21)
if (areaId < QuestAreaId.HidellPlains || areaId > QuestAreaId.UrtecaMountains)
{
return 0;
}
else if (areaId > 12)
else if (areaId >= QuestAreaId.BloodbaneIsle)
{
amount = 500;
}
Expand All @@ -185,28 +189,5 @@ public uint GetAreaPointReward(Quest quest)

return amount;
}

public IEnumerable<AreaRankSpotInfo> GetAreaRankSpots(GameClient client, QuestAreaId areaId)
{
AreaRank clientRank = client.Character.AreaRanks.GetValueOrDefault(areaId)
?? throw new ResponseErrorException(ErrorCode.ERROR_CODE_AREAMASTER_AREA_INFO_NOT_FOUND);
var completedQuests = client.Character.CompletedQuests;

if (Server.GameLogicSettings.EnableAreaRankSpotLocks)
{
return Server.AssetRepository.AreaRankSpotInfoAsset
.Where(x =>
x.AreaId == areaId
&& x.UnlockRank <= clientRank.Rank
&& (x.UnlockQuest == 0 || completedQuests.ContainsKey((QuestId)x.UnlockQuest))
);
}
else
{
return Server.AssetRepository.AreaRankSpotInfoAsset
.Where(x => x.AreaId == areaId);
}

}
}
}
2 changes: 1 addition & 1 deletion Arrowgene.Ddon.GameServer/Characters/ExpManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -915,7 +915,7 @@ public uint GetScaledPointAmount(GameMode gameMode, RewardSource source, PointTy
case PointType.PlayPoints:
modifier = _GameSettings.PpModifier;
break;
case ExpType.AreaPoints:
case PointType.AreaPoints:
modifier = _GameSettings.ApModifier;
break;
default:
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Arrowgene.Ddon.Server;
using Arrowgene.Ddon.Shared.Entity.PacketStructure;
using Arrowgene.Ddon.Shared.Model.Quest;
using Arrowgene.Logging;
using System.Linq;

Expand All @@ -18,9 +19,12 @@ public override S2CAreaGetAreaBaseInfoListRes Handle(GameClient client, C2SAreaG
// TODO: ClanAreaPoint
S2CAreaGetAreaBaseInfoListRes res = new();

foreach ((var area, var rank) in client.Character.AreaRanks)
foreach ((var area, var rank) in client.Character.AreaRanks)
{
if (rank.Rank == 0 && (uint)area > 1)
// The client gets very angry if the unlocks are desynced from their actual ranks, so we have to spoof the rank here too.
uint effectiveRank = Server.AreaRankManager.GetEffectiveRank(client.Character, area);

if (effectiveRank == 0 && area > QuestAreaId.HidellPlains)
{
// Unranked areas are not displayed, except Hidell Plains.
continue;
Expand All @@ -29,7 +33,7 @@ public override S2CAreaGetAreaBaseInfoListRes Handle(GameClient client, C2SAreaG
res.AreaBaseInfoList.Add(new()
{
AreaID = rank.AreaId,
Rank = rank.Rank,
Rank = effectiveRank,
CurrentPoint = rank.Point,
WeekPoint = rank.WeekPoint,
NextPoint = Server.AreaRankManager.GetMaxPoints(rank.AreaId, rank.Rank),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,12 @@ public override S2CAreaGetAreaMasterInfoRes Handle(GameClient client, C2SAreaGet
result.LastWeekPoint = clientRank.LastWeekPoint;
result.ToNextPoint = Server.AreaRankManager.GetMaxPoints(request.AreaId, clientRank.Rank);

result.ReleaseList = Server.AreaRankManager.GetAreaRankSpots(client, request.AreaId)
result.ReleaseList = Server.AssetRepository.AreaRankSpotInfoAsset
.Where(x =>
x.AreaId == request.AreaId
&& x.UnlockRank <= clientRank.Rank
&& (x.UnlockQuest == 0 || completedQuests.ContainsKey((QuestId)x.UnlockQuest))
)
.Select(x => new CDataCommonU32(x.SpotId))
.ToList();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,26 @@ public override S2CAreaGetLeaderAreaReleaseListRes Handle(GameClient client, C2S
var result = new S2CAreaGetLeaderAreaReleaseListRes();
var clientRank = client.Character.AreaRanks;
var completedQuests = client.Character.CompletedQuests;
foreach ( (var area, var rank) in clientRank)
foreach ((var area, var rank) in clientRank)
{
var releaseList = Server.AreaRankManager.GetAreaRankSpots(client, area)
.Select(x => new CDataCommonU32(x.SpotId))
.ToList();
// The client gets very angry if the unlocks are desynced from their actual ranks,
// so spoof the rank in AreaGetAreaBaseInfoListHandler too.
uint effectiveRank = Server.AreaRankManager.GetEffectiveRank(client.Character, area);

var releaseList = Server.AssetRepository.AreaRankSpotInfoAsset
.Where(x =>
x.AreaId == area
&& x.UnlockRank <= effectiveRank
&& (x.UnlockQuest == 0 || completedQuests.ContainsKey((QuestId)x.UnlockQuest))
)
.DistinctBy(x => x.SpotId)
.OrderBy(x => x.SpotId)
.Select(x => new CDataCommonU32(x.SpotId))
.ToList();

result.ReleaseAreaInfoSetList.Add(new()
{
AreaId = rank.AreaId,
AreaId = area,
ReleaseList = releaseList
});
}
Expand Down
6 changes: 3 additions & 3 deletions Arrowgene.Ddon.GameServer/Quests/QuestStateManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -638,17 +638,17 @@ protected PacketQueue SendWalletRewards(DdonGameServer server, GameClient client
var ntc = server.PPManager.AddPlayPoint(client, amount, type: 1, connectionIn: connectionIn);
client.Enqueue(ntc, packets);
break;
case ExpType.AreaPoints:
case PointType.AreaPoints:
var areaRankNtcs = server.AreaRankManager.AddAreaPoint(client, quest.QuestAreaId, amount, connectionIn);
packets.AddRange(areaRankNtcs);
break;
}
}

// Fallback so that existing quests still get AP.
if (!scaledRewards.Where(x => x.Type == ExpType.AreaPoints).Any() && QuestManager.IsWorldQuest(quest) || QuestManager.IsBoardQuest(quest))
if (!scaledRewards.Where(x => x.Type == PointType.AreaPoints).Any() && QuestManager.IsWorldQuest(quest) || QuestManager.IsBoardQuest(quest))
{
var amount = server.ExpManager.GetScaledPointAmount(RewardSource.Quest, ExpType.AreaPoints, server.AreaRankManager.GetAreaPointReward(quest));
var amount = server.ExpManager.GetScaledPointAmount(GameMode.Normal, RewardSource.Quest, PointType.AreaPoints, server.AreaRankManager.GetAreaPointReward(quest));
var areaRankNtcs = server.AreaRankManager.AddAreaPoint(client, quest.QuestAreaId, amount, connectionIn);
packets.AddRange(areaRankNtcs);
}
Expand Down
6 changes: 3 additions & 3 deletions Arrowgene.Ddon.Shared/AssetReader/QuestAssetDeserializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -377,10 +377,10 @@ private void ParseRewards(QuestAssetData assetData, JsonElement quest)
});
break;
case "ap":
assetData.PointRewards.Add(new PointReward()
assetData.PointRewards.Add(new QuestPointReward()
{
ExpType = ExpType.AreaPoints,
ExpReward = reward.GetProperty("amount").GetUInt32()
PointType = PointType.AreaPoints,
Amount = reward.GetProperty("amount").GetUInt32()
});
assetData.LightQuestDetail.GetAp = reward.GetProperty("amount").GetUInt32();
break;
Expand Down
47 changes: 22 additions & 25 deletions Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,12 @@ static EntitySerializer()
Create(new CDataAllPlayerContext.Serializer());
Create(new CDataAreaBaseInfo.Serializer());
Create(new CDataAreaBonus.Serializer());
//Create(new CDataAreaInfoList.Serializer());
//Create(new CDataAreaQuestHint.Serializer());
Create(new CDataAreaInfoList.Serializer());
Create(new CDataAreaQuestHint.Serializer());
Create(new CDataAreaRank.Serializer());
//Create(new CDataAreaRankSeason3.Serializer());
//Create(new CDataAreaRankUnk0.Serializer());
//Create(new CDataAreaRankUpQuestInfo.Serializer());
Create(new CDataAreaRankSeason3.Serializer());
Create(new CDataAreaRankUnk0.Serializer());
Create(new CDataAreaRankUpQuestInfo.Serializer());
Create(new CDataAreaSpotSet.Serializer());
Create(new CDataArisenProfile.Serializer());

Expand All @@ -65,7 +65,7 @@ static EntitySerializer()
Create(new CDataBazaarItemHistoryInfo.Serializer());
Create(new CDataBazaarItemInfo.Serializer());
Create(new CDataBazaarItemNumOfExhibitionInfo.Serializer());
//Create(new CDataBorderSupplyItem.Serializer());
Create(new CDataBorderSupplyItem.Serializer());

Create(new CDataC2SActionSetPlayerActionHistoryReqElement.Serializer());
Create(new CDataChangeEquipJobItem.Serializer());
Expand Down Expand Up @@ -141,9 +141,6 @@ static EntitySerializer()
Create(new CDataCraftSupportPawnID.Serializer());
Create(new CDataCraftTimeSaveCost.Serializer());
Create(new CDataCurrentEquipInfo.Serializer());
//Create(new CDataCycleContentsNews.Serializer());
//Create(new CDataCycleContentsNewsDetail.Serializer());
//Create(new CDataCycleContentsRank.Serializer());
Create(new CDataCycleContentsStateList.Serializer());
Create(new CDataCycleContentsNews.Serializer());
Create(new CDataCycleContentsNewsDetail.Serializer());
Expand Down Expand Up @@ -789,8 +786,8 @@ static EntitySerializer()
Create(new C2SQuestGetAdventureGuideQuestListReq.Serializer());
Create(new C2SQuestGetAdventureGuideQuestNtcReq.Serializer());
Create(new C2SQuestGetAreaBonusListReq.Serializer());
//Create(new C2SQuestGetAreaInfoListReq.Serializer());
//Create(new C2SQuestGetCycleContentsNewsListReq.Serializer());
Create(new C2SQuestGetAreaInfoListReq.Serializer());
Create(new C2SQuestGetCycleContentsNewsListReq.Serializer());
Create(new C2SQuestGetCycleContentsStateListReq.Serializer());
Create(new C2SQuestGetEndContentsGroupReq.Serializer());
Create(new C2SQuestGetEndContentsRecruitListReq.Serializer());
Expand All @@ -801,7 +798,7 @@ static EntitySerializer()
Create(new C2SQuestGetMobHuntQuestListReq.Serializer());
Create(new C2SQuestGetPackageQuestListReq.Serializer());
Create(new C2SQuestGetPartyBonusListReq.Serializer());
//Create(new C2SQuestGetPartyQuestProgressInfoReq.Serializer());
Create(new C2SQuestGetPartyQuestProgressInfoReq.Serializer());
Create(new C2SQuestGetPriorityQuestReq.Serializer());
Create(new C2SQuestGetQuestPartyBonusListReq.Serializer());
Create(new C2SQuestGetQuestCompleteListReq.Serializer());
Expand Down Expand Up @@ -932,19 +929,19 @@ static EntitySerializer()
Create(new S2CAchievementGetRewardListRes.Serializer());
Create(new S2CAchievementRewardReceiveRes.Serializer());
Create(new S2CActionSetPlayerActionHistoryRes.Serializer());
//Create(new S2CAreaAreaRankUpRes.Serializer());
//Create(new S2CAreaBuyAreaQuestHintRes.Serializer());
Create(new S2CAreaAreaRankUpRes.Serializer());
Create(new S2CAreaBuyAreaQuestHintRes.Serializer());
Create(new S2CAreaGetAreaBaseInfoListRes.Serializer());
//Create(new S2CAreaGetAreaMasterInfoRes.Serializer());
//Create(new S2CAreaGetAreaQuestHintListRes.Serializer());
//Create(new S2CAreaGetAreaReleaseListRes.Serializer());
//Create(new S2CAreaGetAreaRewardInfoRes.Serializer());
//Create(new S2CAreaGetAreaSupplyInfoRes.Serializer());
//Create(new S2CAreaGetAreaSupplyRes.Serializer());
Create(new S2CAreaGetAreaMasterInfoRes.Serializer());
Create(new S2CAreaGetAreaQuestHintListRes.Serializer());
Create(new S2CAreaGetAreaReleaseListRes.Serializer());
Create(new S2CAreaGetAreaRewardInfoRes.Serializer());
Create(new S2CAreaGetAreaSupplyInfoRes.Serializer());
Create(new S2CAreaGetAreaSupplyRes.Serializer());
Create(new S2CAreaGetLeaderAreaReleaseListRes.Serializer());
//Create(new S2CAreaGetSpotInfoListRes.Serializer());
//Create(new S2CAreaPointUpNtc.Serializer());
//Create(new S2CAreaRankUpReadyNtc.Serializer());
Create(new S2CAreaGetSpotInfoListRes.Serializer());
Create(new S2CAreaPointUpNtc.Serializer());
Create(new S2CAreaRankUpReadyNtc.Serializer());

Create(new S2CBattleContentAreaChangeNtc.Serializer());
Create(new S2CBattleContentCharacterInfoRes.Serializer());
Expand Down Expand Up @@ -1381,8 +1378,8 @@ static EntitySerializer()
Create(new S2CQuestEndDistributionQuestCancelRes.Serializer());
Create(new S2CQuestGetAdventureGuideQuestNtcRes.Serializer());
Create(new S2CQuestGetAreaBonusListRes.Serializer());
//Create(new S2CQuestGetAreaInfoListRes.Serializer());
//Create(new S2CQuestGetCycleContentsNewsListRes.Serializer());
Create(new S2CQuestGetAreaInfoListRes.Serializer());
Create(new S2CQuestGetCycleContentsNewsListRes.Serializer());
Create(new S2CQuestGetCycleContentsStateListRes.Serializer());
Create(new S2CQuestGetEndContentsGroupRes.Serializer());
Create(new S2CQuestGetEndContentsRecruitListRes.Serializer());
Expand Down
Loading

0 comments on commit a926307

Please sign in to comment.