Skip to content

Commit

Permalink
Tweak method of tracking clan quest completion so it should be slight…
Browse files Browse the repository at this point in the history
…ly more robust.
  • Loading branch information
RyanYappert committed Nov 27, 2024
1 parent e7f2a59 commit d9672ae
Show file tree
Hide file tree
Showing 6 changed files with 31 additions and 28 deletions.
23 changes: 8 additions & 15 deletions Arrowgene.Ddon.GameServer/Characters/ClanManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@
using Arrowgene.Ddon.Shared.Entity.Structure;
using Arrowgene.Ddon.Shared.Model;
using Arrowgene.Ddon.Shared.Model.Clan;
using Arrowgene.Ddon.Shared.Model.Rpc;
using Arrowgene.Ddon.Shared.Network;
using Arrowgene.Logging;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Data.Common;
Expand Down Expand Up @@ -520,8 +520,11 @@ public PacketQueue CompleteClanQuest(Quest quest, GameClient client)
{
ClanQuestClearCount[characterId][quest.QuestScheduleId] = ClanQuestClearCount[characterId].GetValueOrDefault(quest.QuestScheduleId) + 1;

// TODO: Revise this; this is a hacky solution so I don't need a dedicated route just for this one mechanic.
Server.RpcManager.AnnounceClanPacket(character.ClanId, ntc, characterId);
Server.RpcManager.AnnounceOthers("internal/tracking", RpcInternalCommand.NotifyClanQuestCompletion, new RpcQuestCompletionData()
{
CharacterId = characterId,
QuestStatus = ClanQuestClearCount[characterId]
});
}

if (ClanQuestClearCount[characterId].GetValueOrDefault(quest.QuestScheduleId) == quest.LightQuestDetail.OrderLimit)
Expand All @@ -534,19 +537,9 @@ public PacketQueue CompleteClanQuest(Quest quest, GameClient client)
}

// For syncing across channels.
public void CompleteClanQuestForeign(Quest quest, uint characterId)
public void UpdateClanQuestCompletion(uint characterId, Dictionary<uint, uint> questStatus)
{
if (!ClanQuestClearCount.ContainsKey(characterId))
{
ClanQuestClearCount[characterId] = new();
}
lock (ClanQuestClearCount[characterId])
{
if (ClanQuestClearCount[characterId].GetValueOrDefault(quest.QuestScheduleId) < quest.LightQuestDetail.OrderLimit)
{
ClanQuestClearCount[characterId][quest.QuestScheduleId] = ClanQuestClearCount[characterId].GetValueOrDefault(quest.QuestScheduleId) + 1;
}
}
ClanQuestClearCount[characterId] = questStatus;
}

public uint ClanQuestCompletionStatistics(uint characterId, uint questScheduleId)
Expand Down
5 changes: 1 addition & 4 deletions Arrowgene.Ddon.GameServer/RpcManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -283,13 +283,10 @@ public ushort FindPlayerById(uint characterId)
public void AnnouncePlayerList()
{
List<RpcCharacterData> rpcCharacterDatas = new List<RpcCharacterData>();
foreach (var character in Server.ClientLookup.GetAllCharacter())
{
if (character.Stage.Id != 0)
foreach (var character in Server.ClientLookup.GetAllCharacter().Where(x => x.Stage.Id != 0))
{
rpcCharacterDatas.Add(new(character));
}
}

AnnounceOthers("internal/tracking", RpcInternalCommand.NotifyPlayerList, rpcCharacterDatas);
CharacterTrackingMap[(ushort) Server.Id].Update(DateTime.Now, rpcCharacterDatas);
Expand Down
9 changes: 0 additions & 9 deletions Arrowgene.Ddon.Rpc.Web/Route/Internal/PacketRoute.cs
Original file line number Diff line number Diff line change
Expand Up @@ -122,15 +122,6 @@ public override RpcCommandResult Execute(DdonGameServer gameServer)
}
}
}
else if (packet.Id == PacketId.S2C_CLAN_CLAN_QUEST_CLEAR_NTC)
{
// TODO: This is an abuse of this packet; it's not actually announced.
var parsedPacket = new S2CClanClanQuestClearNtc.Serializer().Read(data.Data);
var quest = QuestManager.GetQuestsByQuestId((QuestId)parsedPacket.QuestId).First();
gameServer.ClanManager.CompleteClanQuestForeign(quest, data.CharacterId);

checkFunc = x => false;
}
else if (packet.Id == PacketId.S2C_CLAN_CLAN_SHOP_BUY_ITEM_NTC)
{
var parsedPacket = new S2CClanClanShopBuyItemNtc.Serializer().Read(data.Data);
Expand Down
9 changes: 9 additions & 0 deletions Arrowgene.Ddon.Rpc.Web/Route/Internal/TrackingRoute.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,15 @@ public override RpcCommandResult Execute(DdonGameServer gameServer)
Message = $"NotifyPlayerList Channel {_entry.Origin}"
};
}
case RpcInternalCommand.NotifyClanQuestCompletion:
{
RpcQuestCompletionData data = _entry.GetData<RpcQuestCompletionData>();
gameServer.ClanManager.UpdateClanQuestCompletion(data.CharacterId, data.QuestStatus);
return new RpcCommandResult(this, true)
{
Message = $"NotifyClanQuestCompletion for CharacterId {data.CharacterId}"
};
}
default:
return new RpcCommandResult(this, false);
}
Expand Down
1 change: 1 addition & 0 deletions Arrowgene.Ddon.Shared/Model/Rpc/RpcInternalCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ namespace Arrowgene.Ddon.Shared.Model.Rpc
public enum RpcInternalCommand
{
NotifyPlayerList, // List<RpcCharacterData>
NotifyClanQuestCompletion, //RpcQuestCompletionData

SendTellMessage, // RpcChatData
SendClanMessage, // RpcChatData
Expand Down
12 changes: 12 additions & 0 deletions Arrowgene.Ddon.Shared/Model/Rpc/RpcQuestCompletionData.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System.Collections.Generic;

namespace Arrowgene.Ddon.Shared.Model.Rpc
{
public class RpcQuestCompletionData
{
public RpcQuestCompletionData() { }

public uint CharacterId { get; set; }
public Dictionary<uint, uint> QuestStatus { get; set; }
}
}

0 comments on commit d9672ae

Please sign in to comment.