Skip to content

Commit

Permalink
party fixes
Browse files Browse the repository at this point in the history
- Add cancel handler
- Fix bug when party ready/unready logic
- Add missing connectionIn to DB queries
- Fix argument id in om command
- Fix issue where repop NTC was only sent to the player who killed the
  enemy.
- Changed certain OM update packets to only send to the client who
  requested.
- Fix barrier purchase so it only unlocks for the person who bought.
  • Loading branch information
pacampbell committed Nov 25, 2024
1 parent ebd1277 commit 423eb1e
Show file tree
Hide file tree
Showing 17 changed files with 165 additions and 27 deletions.
4 changes: 2 additions & 2 deletions Arrowgene.Ddon.GameServer/Characters/CharacterManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,11 +59,11 @@ public Character SelectCharacter(uint characterId, DbConnection? connectionIn =
return null;
}

character.EpitaphRoadState.UnlockedContent = _Server.Database.GetEpitaphRoadUnlocks(character.CharacterId);
character.EpitaphRoadState.UnlockedContent = _Server.Database.GetEpitaphRoadUnlocks(character.CharacterId, connectionIn);

if (_Server.Setting.GameLogicSetting.EnableEpitaphWeeklyRewards)
{
character.EpitaphRoadState.WeeklyRewardsClaimed = _Server.Database.GetEpitaphClaimedWeeklyRewards(character.CharacterId);
character.EpitaphRoadState.WeeklyRewardsClaimed = _Server.Database.GetEpitaphClaimedWeeklyRewards(character.CharacterId, connectionIn);
}


Expand Down
10 changes: 9 additions & 1 deletion Arrowgene.Ddon.GameServer/Characters/DungeonManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ public void MarkNotReady(PartyGroup party, Character character)
{
lock (_ReadyStatus)
{
if (_ReadyStatus.ContainsKey(party.Id))
if (!_ReadyStatus.ContainsKey(party.Id))
{
return;
}
Expand All @@ -122,6 +122,14 @@ public bool PartyIsReady(PartyGroup party)
}
}

public bool IsReadyCheckInProgress(PartyGroup party)
{
lock (_ReadyStatus)
{
return _ReadyStatus.ContainsKey(party.Id);
}
}

public void EndPartyReadyCheck(PartyGroup party)
{
lock (_ReadyStatus)
Expand Down
4 changes: 2 additions & 2 deletions Arrowgene.Ddon.GameServer/Characters/EpitaphRoadManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -455,7 +455,7 @@ public void EvaluateEnemyKilled(PartyGroup party, StageId stageId, uint posId, I
return;
}

var trialEndState = SoulOrdealEndState.Unknown;
var trialEndState = SoulOrdealEndState.Cancel;
if (HasObjective(partyState, SoulOrdealObjective.DefeatEnemyWithAbnormalStatusCount) &&
partyState.AbnormalStatus.ContainsKey((stageId, posId)))
{
Expand Down Expand Up @@ -1053,7 +1053,7 @@ public void HandleStatueUnlock(GameClient client, StageId stageId, uint posId)
}

// We need to send back a packet still, otherwise the player will get soft locked.
client.Party.SendToAll(new S2CSeasonDungeonSetOmStateNtc()
client.Send(new S2CSeasonDungeonSetOmStateNtc()
{
LayoutId = stageId.ToStageLayoutId(),
PosId = posId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public class UpdateOmCommand : ChatCommand
{
public override AccountStateType AccountState => AccountStateType.User;
public override string Key => "updateom";
public override string HelpText => "usage: `/updateom groupid subgroupid value`";
public override string HelpText => "usage: `/updateom groupid posid value`";

private DdonGameServer Server;

Expand All @@ -31,7 +31,7 @@ public override void Execute(string[] command, GameClient client, ChatMessage me
try
{
uint groupId = uint.Parse(command[0]);
uint subgroupId = uint.Parse(command[1]);
uint posId = uint.Parse(command[1]);
byte value = byte.Parse(command[2]);
uint limit = 0;

Expand All @@ -51,7 +51,7 @@ public override void Execute(string[] command, GameClient client, ChatMessage me
StageId = client.Character.Stage.Id,
GroupId = groupId
},
PosId = subgroupId,
PosId = posId,
State = (SoulOrdealOmState)value
};
client.Party.SendToAll(ntc);
Expand All @@ -67,7 +67,7 @@ public override void Execute(string[] command, GameClient client, ChatMessage me
StageId = client.Character.Stage.Id,
GroupId = i
},
PosId = subgroupId,
PosId = posId,
State = (SoulOrdealOmState)value
};
client.Party.SendToAll(ntc);
Expand Down
1 change: 1 addition & 0 deletions Arrowgene.Ddon.GameServer/DdonGameServer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -590,6 +590,7 @@ private void LoadPacketHandler()
AddHandler(new SeasonDungeonUpdateKeyPointDoorStatusHandler(this));
AddHandler(new SeasonDungeonGetSoulOrdealRewardListForViewHandler(this));
AddHandler(new SeasonDungeonInterruptSoulOrdealHandler(this));
AddHandler(new SeasonDungeonSoulOrdealCancelReadyHandler(this));

AddHandler(new ServerGameTimeGetBaseinfoHandler(this));
AddHandler(new ServerGetGameSettingHandler(this));
Expand Down
5 changes: 5 additions & 0 deletions Arrowgene.Ddon.GameServer/GameClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,11 @@ public QuestStateManager QuestState { get
}
}

public bool IsPartyLeader()
{
return Party.Leader.Client == this;
}

// TODO: Place somewhere else more sensible
public uint LastWarpPointId { get; set; }
public DateTime LastWarpDateTime { get; set; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public override S2CInstanceEnemyKillRes Handle(GameClient client, C2SInstanceEne
EnemyInfo = enemyKilled.asCDataStageLayoutEnemyPresetEnemyInfoClient()
}
};
client.Enqueue(repopNtc, queuedPackets);
client.Party.EnqueueToAll(repopNtc, queuedPackets);
//client.Send(repopNtc);
}
else
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public override S2CSeasonDungeonDeliverItemForExRes Handle(GameClient client, C2
else if (EpitaphId.GetKind(request.EpitaphId) == EpitaphIdKind.Barrier)
{
var barrier = Server.EpitaphRoadManager.GetBarrier(request.EpitaphId);
client.Party.SendToAll(new S2CSeasonDungeonSetOmStateNtc()
client.Send(new S2CSeasonDungeonSetOmStateNtc()
{
LayoutId = barrier.StageId.ToStageLayoutId(),
State = SoulOrdealOmState.AreaUnlocked
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using Arrowgene.Ddon.Shared.Entity.PacketStructure;
using Arrowgene.Ddon.Shared.Model.EpitaphRoad;
using Arrowgene.Logging;
using YamlDotNet.Core.Tokens;

namespace Arrowgene.Ddon.GameServer.Handler
{
Expand Down Expand Up @@ -32,12 +33,22 @@ public override S2CSeasonDungeonGetSoulOrdealListfromOmRes Handle(GameClient cli
}
else if (!Server.EpitaphRoadManager.TrialCompleted(client.Party, stageId, request.PosId))
{
// TODO: Check to make sure no one in party has rewards available
result.Type = Server.EpitaphRoadManager.IsTrialUnlocked(client.Party, stageId, request.PosId) ? SoulOrdealOrderState.GetList : SoulOrdealOrderState.UnlockTrial;
if (result.Type == SoulOrdealOrderState.GetList)
if (client.IsPartyLeader())
{
var trial = Server.EpitaphRoadManager.GetTrial(stageId, request.PosId);
result.ElementParamList = trial.SoulOrdealOptions();
result.Type = Server.EpitaphRoadManager.IsTrialUnlocked(client.Party, stageId, request.PosId) ? SoulOrdealOrderState.GetList : SoulOrdealOrderState.UnlockTrial;
if (result.Type == SoulOrdealOrderState.GetList)
{
var trial = Server.EpitaphRoadManager.GetTrial(stageId, request.PosId);
result.ElementParamList = trial.SoulOrdealOptions();
}
}
else if (!Server.DungeonManager.IsReadyCheckInProgress(client.Party))
{
result.Type = SoulOrdealOrderState.Waiting;
}
else
{
result.Type = SoulOrdealOrderState.Start;
}
result.Unk2 = true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public override void Handle(GameClient client, StructurePacket<C2SSeasonDungeonG
StageId stageId = packet.Structure.LayoutId.AsStageId();
if (_Server.EpitaphRoadManager.IsStatueUnlocked(client, stageId, packet.Structure.PosId))
{
client.Party.SendToAll(new S2CSeasonDungeonSetOmStateNtc()
client.Send(new S2CSeasonDungeonSetOmStateNtc()
{
LayoutId = packet.Structure.LayoutId,
PosId = packet.Structure.PosId,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
using Arrowgene.Ddon.Server;
using Arrowgene.Ddon.Shared.Entity.PacketStructure;
using Arrowgene.Ddon.Shared.Model.EpitaphRoad;
using Arrowgene.Logging;

namespace Arrowgene.Ddon.GameServer.Handler
{
public class SeasonDungeonSoulOrdealCancelReadyHandler : GameRequestPacketHandler<C2SSeasonDungeonSoulOrdealCancelReadyReq, S2CSeasonDungeonSoulOrdealCancelReadyRes>
{
private static readonly ServerLogger Logger = LogProvider.Logger<ServerLogger>(typeof(SeasonDungeonSoulOrdealCancelReadyHandler));

public SeasonDungeonSoulOrdealCancelReadyHandler(DdonGameServer server) : base(server)
{
}

public override S2CSeasonDungeonSoulOrdealCancelReadyRes Handle(GameClient client, C2SSeasonDungeonSoulOrdealCancelReadyReq request)
{
if (client.IsPartyLeader())
{
Server.DungeonManager.EndPartyReadyCheck(client.Party);

client.Party.SendToAll(new S2CSeasonDungeonEndSoulOrdealNtc()
{
EndState = SoulOrdealEndState.Cancel
});
}
else
{
Server.DungeonManager.MarkNotReady(client.Party, client.Character);
#if false
client.Send(new S2CSeasonDungeonEndSoulOrdealNtc()
{
EndState = SoulOrdealEndState.Cancel
});
#endif
}

return new S2CSeasonDungeonSoulOrdealCancelReadyRes()
{
Unk0 = true
};
}
}
}

Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
using Arrowgene.Ddon.Server;
using Arrowgene.Ddon.Shared.Entity.PacketStructure;
using Arrowgene.Ddon.Shared.Model;
using Arrowgene.Ddon.Shared.Model.EpitaphRoad;
using Arrowgene.Logging;
using System.Collections.Generic;
using System.IO;

namespace Arrowgene.Ddon.GameServer.Handler
{
Expand Down
17 changes: 11 additions & 6 deletions Arrowgene.Ddon.Shared/Asset/EpitaphTrialAsset.cs
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,16 @@ public Dictionary<SoulOrdealObjective, EpitaphObjective> CreateNewObjectiveState
}
return results;
}

public CDataSoulOrdealElementParam AsCDataSoulOrdealElementParam()
{
return new CDataSoulOrdealElementParam()
{
TrialId = EpitaphId,
TrialName = TrialName,
TrialCost = EntryCost
};
}
}

public class EpitaphTrial : EpitaphObject
Expand All @@ -201,12 +211,7 @@ public List<CDataSoulOrdealElementParam> SoulOrdealOptions()

foreach (var option in Options)
{
results.Add(new CDataSoulOrdealElementParam()
{
TrialId = option.EpitaphId,
TrialName = option.TrialName,
TrialCost = option.EntryCost
});
results.Add(option.AsCDataSoulOrdealElementParam());
}

return results;
Expand Down
2 changes: 2 additions & 0 deletions Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -814,6 +814,7 @@ static EntitySerializer()
Create(new C2SSeasonDungeonUpdateKeyPointDoorStatusReq.Serializer());
Create(new C2SSeasonDungeonGetSoulOrdealRewardListForViewReq.Serializer());
Create(new C2SSeasonDungeonInterruptSoulOrdealReq.Serializer());
Create(new C2SSeasonDungeonSoulOrdealCancelReadyReq.Serializer());

Create(new C2SSetShortcutReq.Serializer());
Create(new C2SShopBuyShopGoodsReq.Serializer());
Expand Down Expand Up @@ -1373,6 +1374,7 @@ static EntitySerializer()
Create(new S2CSeasonDungeonUpdateKeyPointDoorStatusRes.Serializer());
Create(new S2CSeasonDungeonGetSoulOrdealRewardListForViewRes.Serializer());
Create(new S2CSeasonDungeonInterruptSoulOrdealRes.Serializer());
Create(new S2CSeasonDungeonSoulOrdealCancelReadyRes.Serializer());

Create(new S2CServerGameTimeGetBaseInfoRes.Serializer());
Create(new S2CServerGetRealTimeRes.Serializer());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using Arrowgene.Buffers;
using Arrowgene.Ddon.Shared.Network;

namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
{
public class C2SSeasonDungeonSoulOrdealCancelReadyReq : IPacketStructure
{
public C2SSeasonDungeonSoulOrdealCancelReadyReq()
{
}

public PacketId Id => PacketId.C2S_SEASON_DUNGEON_SOUL_ORDEAL_CANCEL_READY_REQ;

public uint Unk0 { get; set; }

public class Serializer : PacketEntitySerializer<C2SSeasonDungeonSoulOrdealCancelReadyReq>
{
public override void Write(IBuffer buffer, C2SSeasonDungeonSoulOrdealCancelReadyReq obj)
{
WriteUInt32(buffer, obj.Unk0);
}

public override C2SSeasonDungeonSoulOrdealCancelReadyReq Read(IBuffer buffer)
{
C2SSeasonDungeonSoulOrdealCancelReadyReq obj = new C2SSeasonDungeonSoulOrdealCancelReadyReq();
obj.Unk0 = ReadUInt32(buffer);
return obj;
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
using Arrowgene.Buffers;
using Arrowgene.Ddon.Shared.Network;

namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
{
public class S2CSeasonDungeonSoulOrdealCancelReadyRes : ServerResponse
{
public override PacketId Id => PacketId.S2C_SEASON_DUNGEON_SOUL_ORDEAL_CANCEL_READY_RES;

public S2CSeasonDungeonSoulOrdealCancelReadyRes()
{
}

public bool Unk0 { get; set; }

public class Serializer : PacketEntitySerializer<S2CSeasonDungeonSoulOrdealCancelReadyRes>
{
public override void Write(IBuffer buffer, S2CSeasonDungeonSoulOrdealCancelReadyRes obj)
{
WriteServerResponse(buffer, obj);
WriteBool(buffer, obj.Unk0);
}

public override S2CSeasonDungeonSoulOrdealCancelReadyRes Read(IBuffer buffer)
{
S2CSeasonDungeonSoulOrdealCancelReadyRes obj = new S2CSeasonDungeonSoulOrdealCancelReadyRes();
ReadServerResponse(buffer, obj);
obj.Unk0 = ReadBool(buffer);
return obj;
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ namespace Arrowgene.Ddon.Shared.Model.EpitaphRoad
{
public enum SoulOrdealEndState : byte
{
Unknown = 0, // Trial ends no message
Cancel = 0, // Trial ends no message
Success = 1,
Failed = 2
}
Expand Down

0 comments on commit 423eb1e

Please sign in to comment.