Skip to content

Commit 8ed1473

Browse files
committed
feat: Equipment Presets
Added the ability to save equipment presets.
1 parent 3696012 commit 8ed1473

26 files changed

Lines changed: 802 additions & 8 deletions

Arrowgene.Ddon.Database/Arrowgene.Ddon.Database.csproj

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,6 @@
3333
</ContentWithTargetPath>
3434
</ItemGroup>
3535

36-
<ItemGroup>
37-
<ContentWithTargetPath Remove="files\database\script\migration_quest_variant_refactor.sql" />
38-
</ItemGroup>
39-
4036
<ItemGroup>
4137
<ProjectReference Include="..\Arrowgene.Ddon.Shared\Arrowgene.Ddon.Shared.csproj" />
4238
</ItemGroup>
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
CREATE TABLE "ddon_equip_preset"
2+
(
3+
"character_common_id" INTEGER NOT NULL,
4+
"preset_no" INTEGER NOT NULL,
5+
"job_id" INTEGER NOT NULL,
6+
"preset_name" TEXT NOT NULL,
7+
CONSTRAINT "pk_ddon_equip_preset" PRIMARY KEY ("character_common_id", "job_id", "preset_no"),
8+
CONSTRAINT "fk_ddon_equip_preset_character_common_id" FOREIGN KEY ("character_common_id") REFERENCES "ddon_character_common" ("character_common_id") ON DELETE CASCADE
9+
);
10+
11+
CREATE TABLE "ddon_equip_preset_template"
12+
(
13+
"character_common_id" INTEGER NOT NULL,
14+
"preset_no" INTEGER NOT NULL,
15+
"job_id" INTEGER NOT NULL,
16+
"slot_no" INTEGER NOT NULL,
17+
"item_uid" VARCHAR(8) NOT NULL,
18+
CONSTRAINT "pk_ddon_equip_preset_template" PRIMARY KEY ("character_common_id", "job_id", "preset_no", "slot_no"),
19+
CONSTRAINT "fk_ddon_equip_preset_template_character_common_id" FOREIGN KEY ("character_common_id", "job_id", "preset_no") REFERENCES "ddon_equip_preset" ("character_common_id", "job_id", "preset_no") ON DELETE CASCADE
20+
);

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

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,6 @@ CREATE TABLE IF NOT EXISTS "ddon_contact_list"
513513
"requester_favorite" BOOLEAN NOT NULL,
514514
"requested_favorite" BOOLEAN NOT NULL,
515515
CONSTRAINT "fk_ddon_contact_list_requester_character_id" FOREIGN KEY ("requester_character_id") REFERENCES "ddon_character" ("character_id") ON DELETE CASCADE,
516-
CONSTRAINT "fk_ddon_contact_list_requested_character_id" FOREIGN KEY ("requested_character_id") REFERENCES "ddon_character" ("character_id") ON DELETE CASCADE,
517516
CONSTRAINT "uq_ddon_contact_list_requester_character_id_requested_character_id" UNIQUE ("requester_character_id", "requested_character_id")
518517
);
519518

@@ -750,3 +749,24 @@ CREATE TABLE IF NOT EXISTS "ddon_clan_membership"
750749
CONSTRAINT "fk_ddon_clan_membership_character_id" FOREIGN KEY ("character_id") REFERENCES "ddon_character" ("character_id") ON DELETE CASCADE,
751750
CONSTRAINT "fk_ddon_clan_membership_clan_id" FOREIGN KEY ("clan_id") REFERENCES "ddon_clan_param" ("clan_id") ON DELETE CASCADE
752751
);
752+
753+
CREATE TABLE IF NOT EXISTS "ddon_equip_preset"
754+
(
755+
"character_common_id" INTEGER NOT NULL,
756+
"job_id" INTEGER NOT NULL,
757+
"preset_no" INTEGER NOT NULL,
758+
"preset_name" TEXT NOT NULL,
759+
CONSTRAINT "pk_ddon_equip_preset" PRIMARY KEY ("character_common_id", "job_id", "preset_no"),
760+
CONSTRAINT "fk_ddon_equip_preset_character_common_id" FOREIGN KEY ("character_common_id") REFERENCES "ddon_character_common" ("character_common_id") ON DELETE CASCADE
761+
);
762+
763+
CREATE TABLE IF NOT EXISTS "ddon_equip_preset_template"
764+
(
765+
"character_common_id" INTEGER NOT NULL,
766+
"job_id" INTEGER NOT NULL,
767+
"preset_no" INTEGER NOT NULL,
768+
"slot_no" INTEGER NOT NULL,
769+
"item_uid" VARCHAR(8) NOT NULL,
770+
CONSTRAINT "pk_ddon_equip_preset_template" PRIMARY KEY ("character_common_id", "job_id", "preset_no", "slot_no"),
771+
CONSTRAINT "fk_ddon_equip_preset_template_character_common_id" FOREIGN KEY ("character_common_id", "job_id", "preset_no") REFERENCES "ddon_equip_preset" ("character_common_id", "job_id", "preset_no") ON DELETE CASCADE
772+
);

Arrowgene.Ddon.Database/IDatabase.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -582,5 +582,15 @@ bool InsertBBMContentTreasure(
582582
List<CDataClanMemberInfo> GetClanMemberList(uint clanId, DbConnection? connectionIn = null);
583583
CDataClanMemberInfo GetClanMember(uint characterId, DbConnection? connectionIn = null);
584584
bool UpdateClanMember(CDataClanMemberInfo memberInfo, uint clanId, DbConnection? connectionIn = null);
585+
586+
// Equipment Preset
587+
bool InsertEquipmentPreset(uint characterCommonId, JobId jobId, uint presetNo, string presetName);
588+
bool UpdateEquipmentPreset(uint characterCommonId, JobId jobId, uint presetNo, string presetName);
589+
List<CDataEquipPreset> SelectEquipmentPresets(uint characterCommonId, JobId jobId);
590+
bool DeleteEquipmentPreset(uint characterCommonId, JobId jobId, uint presetNo);
591+
592+
bool InsertEquipmentPresetTemplate(uint characterCommonId, JobId jobId, uint presetNo, uint slotNo, string itemUId);
593+
List<CDataPresetEquipInfo> SelectEquipmentPresetTemplate(uint characterCommonId, JobId jobId, uint presetNo);
594+
bool DeleteEquipmentPresetTemplate(uint characterCommonId, JobId jobId, uint presetNo);
585595
}
586596
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
using System.Collections.Generic;
2+
using System.ComponentModel.Design;
3+
using System.Data.Common;
4+
using System.Reflection.Metadata.Ecma335;
5+
using System.Xml;
6+
using Arrowgene.Ddon.Shared.Entity.Structure;
7+
using Arrowgene.Ddon.Shared.Model;
8+
9+
namespace Arrowgene.Ddon.Database.Sql.Core
10+
{
11+
public abstract partial class DdonSqlDb<TCon, TCom, TReader> : SqlDb<TCon, TCom, TReader>
12+
where TCon : DbConnection
13+
where TCom : DbCommand
14+
where TReader : DbDataReader
15+
{
16+
protected static readonly string[] EquipmentTmeplateFields = new string[]
17+
{
18+
"character_common_id", "job_id", "preset_no", "slot_no", "item_uid"
19+
};
20+
21+
private readonly string SqlInsertEquipmentPresetTemplate = $"INSERT INTO \"ddon_equip_preset_template\" ({BuildQueryField(EquipmentTmeplateFields)}) VALUES ({BuildQueryInsert(EquipmentTmeplateFields)});";
22+
private static readonly string SqlSelectEquipmentPresetTemplate = $"SELECT {BuildQueryField(EquipmentTmeplateFields)} FROM \"ddon_equip_preset_template\" WHERE \"character_common_id\" = @character_common_id AND \"job_id\" = @job_id AND \"preset_no\" = @preset_no;";
23+
private static readonly string SqlDeleteEquipmentPresetTemplate = $"DELETE FROM \"ddon_equip_preset_template\" WHERE \"character_common_id\"=@character_common_id AND \"job_id\"=@job_id AND \"preset_no\"=@preset_no;";
24+
25+
public bool InsertEquipmentPresetTemplate(uint characterCommonId, JobId jobId, uint presetNo, uint slotNo, string itemUId)
26+
{
27+
using TCon connection = OpenNewConnection();
28+
return InsertEquipmentPresetTemplate(connection, characterCommonId, jobId, presetNo, slotNo, itemUId);
29+
}
30+
31+
public bool InsertEquipmentPresetTemplate(TCon conn, uint characterCommonId, JobId jobId, uint presetNo, uint slotNo, string itemUId)
32+
{
33+
return ExecuteNonQuery(conn, SqlInsertEquipmentPresetTemplate, command =>
34+
{
35+
AddParameter(command, "character_common_id", characterCommonId);
36+
AddParameter(command, "job_id", (byte)jobId);
37+
AddParameter(command, "preset_no", presetNo);
38+
AddParameter(command, "slot_no", slotNo);
39+
AddParameter(command, "item_uid", itemUId);
40+
}) == 1;
41+
}
42+
43+
public List<CDataPresetEquipInfo> SelectEquipmentPresetTemplate(uint characterCommonId, JobId jobId, uint presetNo)
44+
{
45+
using TCon connection = OpenNewConnection();
46+
return SelectEquipmentPresetTemplate(connection, characterCommonId, jobId, presetNo);
47+
}
48+
49+
public List<CDataPresetEquipInfo> SelectEquipmentPresetTemplate(TCon conn, uint characterCommonId, JobId jobId, uint presetNo)
50+
{
51+
var results = new List<CDataPresetEquipInfo>();
52+
ExecuteInTransaction(conn =>
53+
{
54+
ExecuteReader(conn, SqlSelectEquipmentPresetTemplate,
55+
command => {
56+
AddParameter(command, "character_common_id", characterCommonId);
57+
AddParameter(command, "job_id", (byte)jobId);
58+
AddParameter(command, "preset_no", presetNo);
59+
}, reader => {
60+
while (reader.Read())
61+
{
62+
results.Add(new CDataPresetEquipInfo()
63+
{
64+
ItemUId = GetString(reader, "item_uid"),
65+
EquipSlotNo = GetByte(reader, "slot_no")
66+
});
67+
}
68+
});
69+
});
70+
return results;
71+
}
72+
73+
public bool DeleteEquipmentPresetTemplate(uint characterCommonId, JobId jobId, uint presetNo)
74+
{
75+
using TCon connection = OpenNewConnection();
76+
return DeleteEquipmentPresetTemplate(connection, characterCommonId, jobId, presetNo);
77+
}
78+
79+
public bool DeleteEquipmentPresetTemplate(TCon conn, uint characterCommonId, JobId jobId, uint presetNo)
80+
{
81+
return ExecuteNonQuery(conn, SqlDeleteEquipmentPresetTemplate, command =>
82+
{
83+
AddParameter(command, "character_common_id", characterCommonId);
84+
AddParameter(command, "job_id", (byte)jobId);
85+
AddParameter(command, "preset_no", presetNo);
86+
}) == 1;
87+
}
88+
}
89+
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
using System.Collections.Generic;
2+
using System.ComponentModel.Design;
3+
using System.Data.Common;
4+
using System.Reflection.Metadata.Ecma335;
5+
using System.Xml;
6+
using Arrowgene.Ddon.Shared.Entity.Structure;
7+
using Arrowgene.Ddon.Shared.Model;
8+
9+
namespace Arrowgene.Ddon.Database.Sql.Core
10+
{
11+
public abstract partial class DdonSqlDb<TCon, TCom, TReader> : SqlDb<TCon, TCom, TReader>
12+
where TCon : DbConnection
13+
where TCom : DbCommand
14+
where TReader : DbDataReader
15+
{
16+
protected static readonly string[] EquipmentPresetFields = new string[]
17+
{
18+
"character_common_id", "job_id", "preset_no", "preset_name"
19+
};
20+
21+
private readonly string SqlInsertEquipmentPreset = $"INSERT INTO \"ddon_equip_preset\" ({BuildQueryField(EquipmentPresetFields)}) VALUES ({BuildQueryInsert(EquipmentPresetFields)});";
22+
private static readonly string SqlSelectEquipmentPresets = $"SELECT {BuildQueryField(EquipmentPresetFields)} FROM \"ddon_equip_preset\" WHERE \"character_common_id\" = @character_common_id AND \"job_id\" = @job_id;";
23+
private static readonly string SqlUpdateEquipmentPreset = $"UPDATE \"ddon_equip_preset\" SET {BuildQueryUpdate(EquipmentPresetFields)} WHERE \"character_common_id\"=@character_common_id AND \"preset_no\"=@preset_no";
24+
private static readonly string SqlDeleteEquipmentPreset = $"DELETE FROM \"ddon_equip_preset\" WHERE \"character_common_id\"=@character_common_id AND \"job_id\"=@job_id AND \"preset_no\"=@preset_no;";
25+
26+
public bool InsertEquipmentPreset(uint characterCommonId, JobId jobId, uint presetNo, string presetName)
27+
{
28+
using TCon connection = OpenNewConnection();
29+
return InsertEquipmentPreset(connection, characterCommonId, jobId, presetNo, presetName);
30+
}
31+
32+
public bool InsertEquipmentPreset(TCon conn, uint characterCommonId, JobId jobId, uint presetNo, string presetName)
33+
{
34+
return ExecuteNonQuery(conn, SqlInsertEquipmentPreset, command =>
35+
{
36+
AddParameter(command, "character_common_id", characterCommonId);
37+
AddParameter(command, "job_id", (byte)jobId);
38+
AddParameter(command, "preset_no", presetNo);
39+
AddParameter(command, "preset_name", presetName);
40+
}) == 1;
41+
}
42+
43+
public bool UpdateEquipmentPreset(uint characterCommonId, JobId jobId, uint presetNo, string presetName)
44+
{
45+
using TCon connection = OpenNewConnection();
46+
return UpdateEquipmentPreset(connection, characterCommonId, jobId, presetNo, presetName);
47+
}
48+
49+
public bool UpdateEquipmentPreset(TCon conn, uint characterCommonId, JobId jobId, uint presetNo, string presetName)
50+
{
51+
return ExecuteNonQuery(conn, SqlUpdateEquipmentPreset, command =>
52+
{
53+
AddParameter(command, "character_common_id", characterCommonId);
54+
AddParameter(command, "job_id", (byte)jobId);
55+
AddParameter(command, "preset_no", presetNo);
56+
AddParameter(command, "preset_name", presetName);
57+
}) == 1;
58+
}
59+
60+
public List<CDataEquipPreset> SelectEquipmentPresets(uint characterCommonId, JobId jobId)
61+
{
62+
using TCon connection = OpenNewConnection();
63+
return SelectEquipmentPresets(connection, characterCommonId, jobId);
64+
}
65+
66+
public List<CDataEquipPreset> SelectEquipmentPresets(TCon conn, uint characterCommonId, JobId jobId)
67+
{
68+
var results = new List<CDataEquipPreset>();
69+
ExecuteInTransaction(conn =>
70+
{
71+
ExecuteReader(conn, SqlSelectEquipmentPresets,
72+
command => {
73+
AddParameter(command, "@character_common_id", characterCommonId);
74+
AddParameter(command, "@job_id", (byte) jobId);
75+
}, reader => {
76+
while (reader.Read())
77+
{
78+
results.Add(new CDataEquipPreset()
79+
{
80+
Job = (JobId)GetByte(reader, "job_id"),
81+
PresetNo = GetUInt32(reader, "preset_no"),
82+
PresetName = GetString(reader, "preset_name")
83+
});
84+
}
85+
});
86+
});
87+
return results;
88+
}
89+
90+
public bool DeleteEquipmentPreset(uint characterCommonId, JobId jobId, uint presetNo)
91+
{
92+
using TCon connection = OpenNewConnection();
93+
return DeleteEquipmentPreset(connection, characterCommonId, jobId, presetNo);
94+
}
95+
96+
public bool DeleteEquipmentPreset(TCon conn, uint characterCommonId, JobId jobId, uint presetNo)
97+
{
98+
return ExecuteNonQuery(conn, SqlDeleteEquipmentPreset, command =>
99+
{
100+
AddParameter(command, "character_common_id", characterCommonId);
101+
AddParameter(command, "job_id", (byte) jobId);
102+
AddParameter(command, "preset_no", presetNo);
103+
}) == 1;
104+
}
105+
}
106+
}

Arrowgene.Ddon.GameServer/DdonGameServer.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,9 @@ private void LoadPacketHandler()
340340
AddHandler(new EquipUpdateHideCharacterLanternHandler(this));
341341
AddHandler(new EquipUpdateHidePawnHeadArmorHandler(this));
342342
AddHandler(new EquipUpdateHidePawnLanternHandler(this));
343+
AddHandler(new EquipGetEquipPresetListHandler(this));
344+
AddHandler(new EquipUpdateEquipPresetHandler(this));
345+
AddHandler(new EquipUpdateEquipPresetNameHandler(this));
343346

344347
AddHandler(new EventStartHandler(this));
345348
AddHandler(new EventEndHandler(this));

Arrowgene.Ddon.GameServer/GameClient.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public void UpdateIdentity()
5353
public InstanceEventDropItemManager InstanceEventDropItemManager { get; }
5454

5555
public GameMode GameMode { get; set; }
56+
public uint EquipPresetIndex { get; set; }
5657

5758
// TODO: Place somewhere else more sensible
5859
public uint LastWarpPointId { get; set; }
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
2+
using Arrowgene.Ddon.GameServer.Characters;
3+
using Arrowgene.Ddon.Server;
4+
using Arrowgene.Ddon.Shared.Entity.PacketStructure;
5+
using Arrowgene.Ddon.Shared.Entity.Structure;
6+
using Arrowgene.Ddon.Shared.Model;
7+
using Arrowgene.Logging;
8+
using System.Drawing;
9+
using System.Linq;
10+
11+
namespace Arrowgene.Ddon.GameServer.Handler
12+
{
13+
public class EquipGetEquipPresetListHandler : GameRequestPacketHandler<C2SEquipGetEquipPresetListReq, S2CEquipGetEquipPresetListRes>
14+
{
15+
private static readonly ServerLogger Logger = LogProvider.Logger<ServerLogger>(typeof(EquipGetEquipPresetListHandler));
16+
17+
public EquipGetEquipPresetListHandler(DdonGameServer server) : base(server)
18+
{
19+
}
20+
21+
public override S2CEquipGetEquipPresetListRes Handle(GameClient client, C2SEquipGetEquipPresetListReq request)
22+
{
23+
var results = new S2CEquipGetEquipPresetListRes();
24+
25+
CharacterCommon characterCommon;
26+
if (client.EquipPresetIndex == 0)
27+
{
28+
characterCommon = client.Character;
29+
}
30+
else
31+
{
32+
characterCommon = client.Character.PawnBySlotNo((byte)client.EquipPresetIndex);
33+
}
34+
35+
foreach (var presetInfo in Server.Database.SelectEquipmentPresets(characterCommon.CommonId, characterCommon.Job))
36+
{
37+
var presetItems = Server.Database.SelectEquipmentPresetTemplate(characterCommon.CommonId, presetInfo.Job, presetInfo.PresetNo);
38+
foreach (var presetItem in presetItems)
39+
{
40+
var matches = client.Character.Storage.FindItemByUIdInStorage(ItemManager.AllItemStorages, presetItem.ItemUId);
41+
if (matches == null)
42+
{
43+
// Item was deleted or sold?
44+
continue;
45+
}
46+
47+
var storageType = matches.Item1;
48+
var item = matches.Item2.Item2;
49+
50+
presetItem.ItemId = item.ItemId;
51+
presetItem.Color = item.Color;
52+
presetItem.PlusValue = item.PlusValue;
53+
presetItem.EquipElementParamList = item.EquipElementParamList;
54+
55+
presetInfo.PresetEquipInfoList.Add(presetItem);
56+
}
57+
58+
results.EquipPresetList.Add(presetInfo);
59+
}
60+
61+
return results;
62+
}
63+
}
64+
}

0 commit comments

Comments
 (0)