Skip to content

Commit 6c0a671

Browse files
authored
Merge pull request #998 from pacampbell/implement_og_world_quest_rotation
feat: Implement Server Reset World Quest Rotation
2 parents 044d278 + 418588e commit 6c0a671

25 files changed

Lines changed: 491 additions & 34 deletions

File tree

Arrowgene.Ddon.Database/DdonDatabaseBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public static class DdonDatabaseBuilder
1313
{
1414
private const string DefaultSchemaFile = "Script/schema_sqlite.sql";
1515

16-
public const uint Version = 54;
16+
public const uint Version = 55;
1717
private static readonly ILogger Logger = LogProvider.Logger<Logger>(typeof(DdonDatabaseBuilder));
1818

1919
public static IDatabase Build(DatabaseSetting settings)
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
INSERT INTO "ddon_schedule_next" ("type", "timestamp")
2+
VALUES (8, 0);
3+
4+
CREATE UNIQUE INDEX idx_quest_progress_identity ON "ddon_quest_progress" ("character_common_id", "quest_schedule_id");
5+
6+
DROP TABLE IF EXISTS ddon_priority_quests;
7+
CREATE TABLE IF NOT EXISTS "ddon_priority_quests"
8+
(
9+
"character_common_id" INTEGER NOT NULL,
10+
"quest_schedule_id" INTEGER NOT NULL,
11+
CONSTRAINT "fk_priority_to_progress"
12+
FOREIGN KEY ("character_common_id", "quest_schedule_id")
13+
REFERENCES "ddon_quest_progress" ("character_common_id", "quest_schedule_id")
14+
ON DELETE CASCADE,
15+
CONSTRAINT "fk_ddon_priority_quests_character_common_id"
16+
FOREIGN KEY ("character_common_id")
17+
REFERENCES "ddon_character_common" ("character_common_id")
18+
ON DELETE CASCADE,
19+
CONSTRAINT "uq_character_common_id_quest_schedule_id" UNIQUE ("character_common_id", "quest_schedule_id")
20+
);

Arrowgene.Ddon.Database/Files/Database/Script/schema_sqlite.sql

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,7 @@ CREATE TABLE IF NOT EXISTS "ddon_quest_progress"
546546
"quest_type" INTEGER NOT NULL,
547547
"quest_schedule_id" INTEGER NOT NULL,
548548
"step" INTEGER NOT NULL,
549+
CONSTRAINT "pk_ddon_quest_progress" PRIMARY KEY ("character_common_id", "quest_schedule_id"),
549550
CONSTRAINT "fk_ddon_quest_progress_character_common_id" FOREIGN KEY ("character_common_id") REFERENCES "ddon_character_common" ("character_common_id") ON DELETE CASCADE
550551
);
551552
CREATE INDEX IF NOT EXISTS "idx_ddon_quest_progress_character_common_id" ON "ddon_quest_progress" ("character_common_id");
@@ -566,6 +567,7 @@ CREATE TABLE IF NOT EXISTS "ddon_priority_quests"
566567
(
567568
"character_common_id" INTEGER NOT NULL,
568569
"quest_schedule_id" INTEGER NOT NULL,
570+
CONSTRAINT "fk_priority_to_progress" FOREIGN KEY ("character_common_id", "quest_schedule_id") REFERENCES "ddon_quest_progress" ("character_common_id", "quest_schedule_id") ON DELETE CASCADE,
569571
CONSTRAINT "fk_ddon_priority_quests_character_common_id" FOREIGN KEY ("character_common_id") REFERENCES "ddon_character_common" ("character_common_id") ON DELETE CASCADE,
570572
CONSTRAINT "uq_character_common_id_quest_schedule_id" UNIQUE ("character_common_id", "quest_schedule_id")
571573
);
@@ -1100,3 +1102,6 @@ VALUES (20, 0);
11001102

11011103
INSERT INTO "ddon_schedule_next"(type, timestamp)
11021104
VALUES (25, 0);
1105+
1106+
INSERT INTO "ddon_schedule_next" ("type", "timestamp")
1107+
VALUES (8, 0);

Arrowgene.Ddon.Database/IDatabase.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,7 @@ List<CDataReleaseOrbElement> SelectOrbReleaseElementFromDragonForceAugmentation(
317317
bool InsertQuestProgress(uint characterCommonId, uint questScheduleId, QuestType questType, uint step, DbConnection? connectionIn = null);
318318
bool UpdateQuestProgress(uint characterCommonId, uint questScheduleId, QuestType questType, uint step, DbConnection? connectionIn = null);
319319
bool RemoveQuestProgress(uint characterCommonId, uint questScheduleId, QuestType questType, DbConnection? connectionIn = null);
320+
bool RemoveAllQuestProgressByType(QuestType questType, DbConnection? connectionIn = null);
320321
List<QuestProgress> GetQuestProgressByType(uint characterCommonId, QuestType questType, DbConnection? connectionIn = null);
321322
QuestProgress GetQuestProgressByScheduleId(uint characterCommonId, uint questScheduleId, DbConnection? connectionIn = null);
322323

Arrowgene.Ddon.Database/Sql/Core/DdonSqlQuestProgress.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ public partial class DdonSqlDb : SqlDb
1515
private readonly string SqlDeleteQuestProgress =
1616
"DELETE FROM \"ddon_quest_progress\" WHERE \"character_common_id\"=@character_common_id AND \"quest_type\"=@quest_type AND \"quest_schedule_id\"=@quest_schedule_id;";
1717

18+
private readonly string SqlDeleteAllQuestProgressByType =
19+
"DELETE FROM \"ddon_quest_progress\" WHERE \"quest_type\"=@quest_type;";
20+
1821
private readonly string SqlInsertQuestProgress =
1922
$"INSERT INTO \"ddon_quest_progress\" ({BuildQueryField(QuestProgressFields)}) VALUES ({BuildQueryInsert(QuestProgressFields)});";
2023

@@ -110,6 +113,17 @@ public override bool RemoveQuestProgress(uint characterCommonId, uint questSched
110113
});
111114
}
112115

116+
public override bool RemoveAllQuestProgressByType(QuestType questType, DbConnection? connectionIn = null)
117+
{
118+
return ExecuteQuerySafe(connectionIn, connection =>
119+
{
120+
return ExecuteNonQuery(connection, SqlDeleteAllQuestProgressByType, command =>
121+
{
122+
AddParameter(command, "quest_type", (uint)questType);
123+
}) >= 0;
124+
});
125+
}
126+
113127
public override bool InsertQuestProgress(uint characterCommonId, uint questScheduleId, QuestType questType, uint step, DbConnection? connectionIn = null)
114128
{
115129
return ExecuteQuerySafe(connectionIn, connection =>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using System.Data.Common;
2+
3+
namespace Arrowgene.Ddon.Database.Sql.Core.Migration
4+
{
5+
public class WorldQuestRotationScheduleMigration(DatabaseSetting databaseSetting) : IMigrationStrategy
6+
{
7+
public uint From => 54;
8+
public uint To => 55;
9+
10+
public bool Migrate(IDatabase db, DbConnection conn)
11+
{
12+
string adaptedSchema = DdonDatabaseBuilder.GetAdaptedSchema(databaseSetting, "Script/migration_world_quest_rotation.sql");
13+
db.Execute(conn, adaptedSchema, true);
14+
return true;
15+
}
16+
}
17+
}

Arrowgene.Ddon.Database/Sql/SqlDb.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,7 @@ public abstract int UpdateContact(uint requestingCharacterId, uint requestedChar
460460
public abstract bool InsertQuestProgress(uint characterCommonId, uint questScheduleId, QuestType questType, uint step, DbConnection? connectionIn = null);
461461
public abstract bool UpdateQuestProgress(uint characterCommonId, uint questScheduleId, QuestType questType, uint step, DbConnection? connectionIn = null);
462462
public abstract bool RemoveQuestProgress(uint characterCommonId, uint questScheduleId, QuestType questType, DbConnection? connectionIn = null);
463+
public abstract bool RemoveAllQuestProgressByType(QuestType questType, DbConnection? connectionIn = null);
463464
public abstract List<QuestProgress> GetQuestProgressByType(uint characterCommonId, QuestType questType, DbConnection? connectionIn = null);
464465
public abstract QuestProgress GetQuestProgressByScheduleId(uint characterCommonId, uint questScheduleId, DbConnection? connectionIn = null);
465466
public abstract bool InsertPriorityQuest(uint characterCommonId, uint questScheduleId, DbConnection? connectionIn = null);

Arrowgene.Ddon.GameServer/DdonGameServer.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ public DdonGameServer(GameServerSetting setting, GameSettings gameSettings, IDat
9696
RentalPawnManager = new RentalPawnManager(this);
9797
OrbUnlockManager = new OrbUnlockManager(this);
9898
BitterblackMazeManager = new BitterblackMazeManager(this);
99+
WorldQuestManager = new WorldQuestManager(this);
99100

100101
S2CStageGetStageListRes stageListPacket =
101102
EntitySerializer.Get<S2CStageGetStageListRes>().Read(GameDump.data_Dump_19);
@@ -141,6 +142,7 @@ public DdonGameServer(GameServerSetting setting, GameSettings gameSettings, IDat
141142
public JobEmblemManager JobEmblemManager { get; }
142143
public RentalPawnManager RentalPawnManager { get; }
143144
public BitterblackMazeManager BitterblackMazeManager { get; }
145+
public WorldQuestManager WorldQuestManager { get; }
144146
public ChatLogHandler ChatLogHandler { get; }
145147
public LightQuestManager LightQuestManager { get; }
146148

@@ -156,6 +158,7 @@ public override void Start()
156158
ScriptManager.Initialize();
157159

158160
QuestManager.LoadQuests(this);
161+
WorldQuestManager.Initialize();
159162
GpCourseManager.EvaluateCourses();
160163

161164
if (ServerUtils.IsHeadServer(this))

Arrowgene.Ddon.GameServer/Handler/QuestGetSetQuestListHandler.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,11 @@ public override S2CQuestGetSetQuestListRes Handle(GameClient client, C2SQuestGet
6969
continue;
7070
}
7171

72-
if (quest.OrderConditions.Any(c => c.Type == QuestOrderConditionType.AreaRank
73-
&& (leaderCharacter == null
74-
|| !leaderCharacter.AreaRanks.ContainsKey((QuestAreaId)c.Param01)
75-
|| Server.AreaRankManager.GetEffectiveRank(leaderCharacter, (QuestAreaId)c.Param01) < (uint)c.Param02)))
72+
if (Server.GameSettings.GameServerSettings.WorldQuestFilterByLeaderAreaRank
73+
&& quest.OrderConditions.Any(c => c.Type == QuestOrderConditionType.AreaRank
74+
&& (leaderCharacter == null
75+
|| !leaderCharacter.AreaRanks.ContainsKey((QuestAreaId)c.Param01)
76+
|| Server.AreaRankManager.GetEffectiveRank(leaderCharacter, (QuestAreaId)c.Param01) < (uint)c.Param02)))
7677
{
7778
continue;
7879
}

Arrowgene.Ddon.GameServer/Handler/QuestSetNavigationHandler.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ public override S2CQuestSetNavigationQuestRes Handle(GameClient client, C2SQuest
4242
case QuestType.World:
4343
ntc.SetQuestOrderList.Add(quest.ToCDataSetQuestOrderList(0, 0));
4444
break;
45-
// case QuestType.ExpiredQuestList:
46-
// break;
45+
// case QuestType.ExpiredQuestList:
46+
// break;
4747
}
4848
client.Party.SendToAll(ntc);
4949
}

0 commit comments

Comments
 (0)