Skip to content

Commit

Permalink
Code Review Feedback
Browse files Browse the repository at this point in the history
- Added comments documenting some special numbers.
- Fixed an issue with GetContentStatusFromOmReq.
- Updated migration logic to use sql commands directly.
- Fixed an issue a crash occured after resetting progress and changing
  jobs.
- S2CBattleContentAreaChange.cs => S2CBattleContentAreaChangeNtc.cs.
- Moved loot generation into instanced manager for BBM.
- Moved SwapCharacterInventories to CharacterSwitchGameModeHandler.
- Added a DB query to get all storages by character id.
- Fixed issue with new character creation.
- Fixed an issue where main quests didn't start.
- Delete BBM character when main character is deleted
  • Loading branch information
pacampbell committed Aug 23, 2024
1 parent 0f5fbf3 commit 2fdc6a7
Show file tree
Hide file tree
Showing 29 changed files with 255 additions and 176 deletions.
4 changes: 2 additions & 2 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ root = true
indent_style = space

# Code files
[*.cs]
[*.{cs,sql}]
indent_size = 4
insert_final_newline = true
charset = utf-8
charset = utf-8
Original file line number Diff line number Diff line change
@@ -1,33 +1,41 @@
ALTER TABLE "ddon_character" ADD "game_mode" INTEGER DEFAULT 1 NOT NULL;

CREATE TABLE "ddon_bbm_character_map" (
"character_id" INTEGER PRIMARY KEY NOT NULL,
"bbm_character_id" INTEGER NOT NULL,
CONSTRAINT fk_ddon_bbm_character_map_character_id FOREIGN KEY ("character_id") REFERENCES "ddon_character" ("character_id") ON DELETE CASCADE
"character_id" INTEGER PRIMARY KEY NOT NULL,
"bbm_character_id" INTEGER NOT NULL,
CONSTRAINT fk_ddon_bbm_character_map_character_id FOREIGN KEY ("character_id") REFERENCES "ddon_character" ("character_id") ON DELETE CASCADE
);

CREATE TABLE "ddon_bbm_progress" (
"character_id" INTEGER PRIMARY KEY NOT NULL,
"character_id" INTEGER PRIMARY KEY NOT NULL,
"start_time" INTEGER NOT NULL,
"content_id" INTEGER NOT NULL,
"content_mode" INTEGER NOT NULL,
"tier" INTEGER NOT NULL,
"tier" INTEGER NOT NULL,
"killed_death" BOOLEAN NOT NULL,
"last_ticket_time" INTEGER NOT NULL,
CONSTRAINT fk_ddon_bbm_progress_character_id FOREIGN KEY ("character_id") REFERENCES "ddon_character" ("character_id") ON DELETE CASCADE
CONSTRAINT fk_ddon_bbm_progress_character_id FOREIGN KEY ("character_id") REFERENCES "ddon_character" ("character_id") ON DELETE CASCADE
);

CREATE TABLE "ddon_bbm_rewards" (
"character_id" INTEGER PRIMARY KEY NOT NULL,
"character_id" INTEGER PRIMARY KEY NOT NULL,
"gold_marks" INTEGER NOT NULL,
"silver_marks" INTEGER NOT NULL,
"red_marks" INTEGER NOT NULL,
CONSTRAINT fk_ddon_bbm_rewards_character_id FOREIGN KEY ("character_id") REFERENCES "ddon_character" ("character_id") ON DELETE CASCADE
);

CREATE TABLE "ddon_bbm_content_treasure" (
"character_id" INTEGER PRIMARY KEY NOT NULL,
"character_id" INTEGER PRIMARY KEY NOT NULL,
"content_id" INTEGER NOT NULL,
"amount" INTEGER NOT NULL,
CONSTRAINT fk_ddon_bbm_content_treasure_character_id FOREIGN KEY ("character_id") REFERENCES "ddon_character" ("character_id") ON DELETE CASCADE
);
);

INSERT INTO ddon_bbm_progress (character_id, start_time, content_id, content_mode, tier, killed_death, last_ticket_time)
SELECT character_id, 0, 0, 0, 0, 0, 0
FROM ddon_character;

INSERT INTO ddon_bbm_rewards (character_id, gold_marks, silver_marks, red_marks)
SELECT character_id, 0, 0, 0
FROM ddon_character;
50 changes: 25 additions & 25 deletions Arrowgene.Ddon.Database/Files/Database/Script/schema_sqlite.sql
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
CREATE TABLE IF NOT EXISTS meta
CREATE TABLE IF NOT EXISTS meta
(
"db_version" INTEGER NOT NULL
);
Expand Down Expand Up @@ -293,16 +293,16 @@ CREATE TABLE IF NOT EXISTS ddon_storage_item

-- CREATE TABLE IF NOT EXISTS ddon_additional_status
-- (
-- "item_uid" VARCHAR(8) NOT NULL,
-- "character_id" INTEGER NOT NULL,
-- "is_add_stat1" TINYINT NOT NULL,
-- "is_add_stat2" TINYINT NOT NULL,
-- "additional_status1" SMALLINT NOT NULL,
-- "additional_status2" SMALLINT NOT NULL,
-- CONSTRAINT pk_ddon_additional_status PRIMARY KEY ("item_uid"),
-- CONSTRAINT fk_additional_status_item_uid FOREIGN KEY ("item_uid") REFERENCES ddon_storage_item ("item_uid") ON DELETE CASCADE,
-- CONSTRAINT fk_additional_status_character_id FOREIGN KEY ("character_id") REFERENCES ddon_character ("character_id") ON DELETE CASCADE
-- );
-- "item_uid" VARCHAR(8) NOT NULL,
-- "character_id" INTEGER NOT NULL,
-- "is_add_stat1" TINYINT NOT NULL,
-- "is_add_stat2" TINYINT NOT NULL,
-- "additional_status1" SMALLINT NOT NULL,
-- "additional_status2" SMALLINT NOT NULL,
-- CONSTRAINT pk_ddon_additional_status PRIMARY KEY ("item_uid"),
-- CONSTRAINT fk_additional_status_item_uid FOREIGN KEY ("item_uid") REFERENCES ddon_storage_item ("item_uid") ON DELETE CASCADE,
-- CONSTRAINT fk_additional_status_character_id FOREIGN KEY ("character_id") REFERENCES ddon_character ("character_id") ON DELETE CASCADE
-- );
-- Put in comments because it seems this might be apart of a larger system. TODO: Revisit this when we start messing around with Craig's crafting.


Expand Down Expand Up @@ -669,33 +669,33 @@ CREATE TABLE IF NOT EXISTS "ddon_binary_data"
);

CREATE TABLE IF NOT EXISTS "ddon_bbm_character_map" (
"character_id" INTEGER PRIMARY KEY NOT NULL,
"bbm_character_id" INTEGER NOT NULL,
CONSTRAINT fk_ddon_bbm_character_map_character_id FOREIGN KEY ("character_id") REFERENCES "ddon_character" ("character_id") ON DELETE CASCADE
"character_id" INTEGER PRIMARY KEY NOT NULL,
"bbm_character_id" INTEGER NOT NULL,
CONSTRAINT fk_ddon_bbm_character_map_character_id FOREIGN KEY ("character_id") REFERENCES "ddon_character" ("character_id") ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS "ddon_bbm_progress" (
"character_id" INTEGER PRIMARY KEY NOT NULL,
"character_id" INTEGER PRIMARY KEY NOT NULL,
"start_time" INTEGER NOT NULL,
"content_id" INTEGER NOT NULL,
"content_mode" INTEGER NOT NULL,
"tier" INTEGER NOT NULL,
"tier" INTEGER NOT NULL,
"killed_death" BOOLEAN NOT NULL,
"last_ticket_time" INTEGER NOT NULL,
CONSTRAINT fk_ddon_bbm_progress_character_id FOREIGN KEY ("character_id") REFERENCES "ddon_character" ("character_id") ON DELETE CASCADE
CONSTRAINT fk_ddon_bbm_progress_character_id FOREIGN KEY ("character_id") REFERENCES "ddon_character" ("character_id") ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS "ddon_bbm_rewards" (
"character_id" INTEGER PRIMARY KEY NOT NULL,
"gold_marks" INTEGER NOT NULL,
"silver_marks" INTEGER NOT NULL,
"red_marks" INTEGER NOT NULL,
"character_id" INTEGER PRIMARY KEY NOT NULL,
"gold_marks" INTEGER NOT NULL,
"silver_marks" INTEGER NOT NULL,
"red_marks" INTEGER NOT NULL,
CONSTRAINT fk_ddon_bbm_rewards_character_id FOREIGN KEY ("character_id") REFERENCES "ddon_character" ("character_id") ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS "ddon_bbm_content_treasure" (
"character_id" INTEGER PRIMARY KEY NOT NULL,
"content_id" INTEGER NOT NULL,
"amount" INTEGER NOT NULL,
"character_id" INTEGER PRIMARY KEY NOT NULL,
"content_id" INTEGER NOT NULL,
"amount" INTEGER NOT NULL,
CONSTRAINT fk_ddon_bbm_content_treasure_character_id FOREIGN KEY ("character_id") REFERENCES "ddon_character" ("character_id") ON DELETE CASCADE
);
);
3 changes: 2 additions & 1 deletion Arrowgene.Ddon.Database/IDatabase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ public interface IDatabase
Account SelectAccountByLoginToken(string loginToken);
bool UpdateAccount(Account account);
bool DeleteAccount(int accountId);
Storages SelectAllStoragesByCharacterId(uint characterId);

// CharacterCommon
bool UpdateCharacterCommonBaseInfo(CharacterCommon common, DbConnection? connectionIn = null);
Expand All @@ -72,7 +73,7 @@ public interface IDatabase
// Character
bool CreateCharacter(Character character);
Character SelectCharacter(uint characterId);
List<Character> SelectCharactersByAccountId(int accountId);
List<Character> SelectCharactersByAccountId(int accountId, GameMode gameMode);
List<Character> SelectAllCharacters();
List<Character> SelectAllCharacters(DbConnection conn);
bool DeleteCharacter(uint characterId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public abstract partial class DdonSqlDb<TCon, TCom, TReader> : SqlDb<TCon, TCom,
};

private readonly string SqlSelectBBMRewards = $"SELECT {BuildQueryField(BitterBlackMazeRewardsFields)} FROM \"ddon_bbm_rewards\" WHERE \"character_id\"=@character_id;";
private readonly string SqlInsertBBMRewards = $"INSERT INTO \"ddon_bbm_rewards\" ({BuildQueryField(BitterBlackMazeRewardsFields)}) VALUES ({BuildQueryInsert(BitterBlackMazeProgressFields)});";
private readonly string SqlInsertBBMRewards = $"INSERT INTO \"ddon_bbm_rewards\" ({BuildQueryField(BitterBlackMazeRewardsFields)}) VALUES ({BuildQueryInsert(BitterBlackMazeRewardsFields)});";
private readonly string SqlUpdateBBMRewards = $"UPDATE \"ddon_bbm_rewards\" SET {BuildQueryUpdate(BitterBlackMazeRewardsFields)} WHERE \"character_id\"=@character_id;";
private readonly string SqlDeleteBBMRewards = $"DELETE FROM \"ddon_bbm_rewards\" WHERE \"character_id\"=@character_id;";

Expand Down
76 changes: 73 additions & 3 deletions Arrowgene.Ddon.Database/Sql/Core/DdonSqlDbCharacter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public abstract partial class DdonSqlDb<TCon, TCom, TReader> : SqlDb<TCon, TCom,
+ "LEFT JOIN \"ddon_character_matching_profile\" ON \"ddon_character_matching_profile\".\"character_id\" = \"ddon_character\".\"character_id\" "
+ "LEFT JOIN \"ddon_character_arisen_profile\" ON \"ddon_character_arisen_profile\".\"character_id\" = \"ddon_character\".\"character_id\" "
+ "LEFT JOIN \"ddon_binary_data\" ON \"ddon_binary_data\".\"character_id\" = \"ddon_character\".\"character_id\" "
+ "WHERE \"account_id\" = @account_id";
+ "WHERE \"account_id\" = @account_id AND \"game_mode\" = @game_mode;";
private readonly string SqlSelectAllCharactersData = $"SELECT \"ddon_character\".\"character_id\", {BuildQueryField("ddon_character", CharacterFields)}, \"ddon_character_common\".\"character_common_id\", {BuildQueryField("ddon_character_common", CharacterCommonFields)}, {BuildQueryField("ddon_edit_info", CDataEditInfoFields)}, {BuildQueryField("ddon_status_info", CDataStatusInfoFields)}, {BuildQueryField("ddon_character_matching_profile", CDataMatchingProfileFields)}, {BuildQueryField("ddon_character_arisen_profile", CDataArisenProfileFields)}, {BuildQueryField("ddon_binary_data", CharacterBinaryDataFields)} "
+ "FROM \"ddon_character\" "
+ "LEFT JOIN \"ddon_character_common\" ON \"ddon_character_common\".\"character_common_id\" = \"ddon_character\".\"character_common_id\" "
Expand Down Expand Up @@ -170,13 +170,16 @@ public Character SelectCharacter(uint characterId)
return character;
}

public List<Character> SelectCharactersByAccountId(int accountId)
public List<Character> SelectCharactersByAccountId(int accountId, GameMode gameMode)
{
List<Character> characters = new List<Character>();
ExecuteInTransaction(conn =>
{
ExecuteReader(conn, SqlSelectAllCharactersDataByAccountId,
command => { AddParameter(command, "@account_id", accountId); }, reader =>
command => {
AddParameter(command, "@account_id", accountId);
AddParameter(command, "@game_mode", (uint) gameMode);
}, reader =>
{
while (reader.Read())
{
Expand Down Expand Up @@ -223,6 +226,13 @@ public List<Character> SelectAllCharacters(DbConnection conn)

public bool DeleteCharacter(uint characterId)
{
uint bbmCharacterId = SelectBBMCharacterId(characterId);
if (bbmCharacterId > 0)
{
ExecuteNonQuery(SqlDeleteCharacter,
command => { AddParameter(command, "@character_id", bbmCharacterId); });
}

int rowsAffected = ExecuteNonQuery(SqlDeleteCharacter,
command => { AddParameter(command, "@character_id", characterId); });
return rowsAffected > NoRowsAffected;
Expand Down Expand Up @@ -505,6 +515,66 @@ public void CreateItems(TCon conn, Character character)
}
}

public Storages SelectAllStoragesByCharacterId(uint characterId)
{
using TCon connection = OpenNewConnection();
return SelectAllStoragesByCharacterId(connection, characterId);
}

public Storages SelectAllStoragesByCharacterId(TCon connection, uint characterId)
{
Storages storages = new Storages(new Dictionary<StorageType, ushort>());

ExecuteReader(connection, SqlSelectAllStoragesByCharacter,
command => { AddParameter(command, "@character_id", characterId); },
reader =>
{
while (reader.Read())
{
Tuple<StorageType, Storage> tuple = ReadStorage(reader);
storages.AddStorage(tuple.Item1, tuple.Item2);
}
});

ExecuteReader(connection, SqlSelectStorageItemsByCharacter,
command => {
AddParameter(command, "@character_id", characterId);
},
reader =>
{
while (reader.Read())
{

StorageType storageType = (StorageType)GetByte(reader, "storage_type");
ushort slot = GetUInt16(reader, "slot_no");
uint itemNum = GetUInt32(reader, "item_num");
var item = new Item();

item.UId = GetString(reader, "item_uid");
item.ItemId = GetUInt32(reader, "item_id");
item.Unk3 = GetByte(reader, "unk3");
item.Color = GetByte(reader, "color");
item.PlusValue = GetByte(reader, "plus_value");
item.EquipPoints = GetUInt32(reader, "equip_points");

ExecuteReader(connection, SqlSelectAllCrestDataByUid,
command2 => {
AddParameter(command2, "item_uid", item.UId);
}, reader2 => {
while (reader2.Read())
{
var result = ReadCrestData(reader2);
item.EquipElementParamList.Add(result.ToCDataEquipElementParam());
}
});

storages.GetStorage(storageType).SetItem(item, itemNum, slot);
}
});

return storages;
}

private Character ReadAllCharacterData(TReader reader)
{
Character character = new Character();
Expand Down
3 changes: 3 additions & 0 deletions Arrowgene.Ddon.Database/Sql/Core/DdonSqlDbCrest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ public abstract partial class DdonSqlDb<TCon, TCom, TReader> : SqlDb<TCon, TCom,
private readonly string SqlUpdateCrestData = $"UPDATE \"ddon_crests\" SET {BuildQueryUpdate(CrestFields)} WHERE \"character_common_id\"=@character_common_id AND \"item_uid\"=@item_uid AND \"slot\"=@slot;";
private readonly string SqlSelectAllCrestData = $"SELECT {BuildQueryField(CrestFields)} FROM \"ddon_crests\" WHERE " +
$"\"character_common_id\" = @character_common_id AND \"item_uid\"=@item_uid;";
private readonly string SqlSelectAllCrestDataByUid = $"SELECT {BuildQueryField(CrestFields)} FROM \"ddon_crests\" WHERE " +
$"\"item_uid\"=@item_uid;";


public bool InsertCrest(uint characterCommonId, string itemUId, uint slot, uint crestId, uint crestAmount, DbConnection? connectionIn = null)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,42 +25,6 @@ public bool Migrate(IDatabase db, DbConnection conn)
{
string adaptedSchema = DdonDatabaseBuilder.GetAdaptedSchema(DatabaseSetting, "Script/bitterblack_maze_migration.sql");
db.Execute(conn, adaptedSchema);

var characterIds = new List<uint>();
db.ExecuteReader(conn, "SELECT * from ddon_character;",
command => { },
reader =>
{
while (reader.Read())
{
characterIds.Add(db.GetUInt32(reader, "character_id"));
}
});

foreach (var characterId in characterIds)
{
db.ExecuteNonQuery(conn, "INSERT INTO ddon_bbm_progress (character_id, start_time, content_id, content_mode, tier, killed_death, last_ticket_time) VALUES(@character_id, @start_time, @content_id, @content_mode, @tier, @killed_death, @last_ticket_time);",
command =>
{
db.AddParameter(command, "character_id", characterId);
db.AddParameter(command, "start_time", 0);
db.AddParameter(command, "content_id", 0);
db.AddParameter(command, "content_mode", 0);
db.AddParameter(command, "tier", 0);
db.AddParameter(command, "killed_death", 0);
db.AddParameter(command, "last_ticket_time", 0);
});

db.ExecuteNonQuery(conn, "INSERT INTO ddon_bbm_rewards (character_id, gold_marks, silver_marks, red_marks) VALUES(@character_id, @gold_marks, @silver_marks, @red_marks);",
command =>
{
db.AddParameter(command, "character_id", characterId);
db.AddParameter(command, "gold_marks", 0);
db.AddParameter(command, "silver_marks", 0);
db.AddParameter(command, "red_marks", 0);
});
}

return true;
}
}
Expand Down
6 changes: 6 additions & 0 deletions Arrowgene.Ddon.GameServer/Characters/AppraisalManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,12 @@ public static uint RollBitterBlackMazeEarringCrest(JobId jobId)

public static ushort RollBitterBlackMazeEarringPercent(JobId job)
{
/**
* Based on research in discord, Warrior and Shield sage earrings can roll a
* higher % range 8-20% when being appraised. The rest of the jobs can roll
* 1-13% bonus on their equipment. The percentage values are incoded as ushorts.
* For example 2 == 2% in the UI.
*/
if (job == JobId.Warrior || job == JobId.ShieldSage)
{
// [8, 20]
Expand Down
34 changes: 0 additions & 34 deletions Arrowgene.Ddon.GameServer/Characters/ItemManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -623,40 +623,6 @@ public CDataItemUpdateResult CreateItemUpdateResult(Character character, Item it
return CreateItemUpdateResult(character, item, storage.Type, slotNo, itemNum, updateItemNum);
}

public List<CDataItemUpdateResult> SwapCharacterInventories(Character character, Storages storageA, Storages storageB, List<StorageType> storageTypes)
{
var results = new List<CDataItemUpdateResult>();
foreach (var storageType in storageTypes)
{
for (int i = 0; i < character.Storage.GetStorage(storageType).Items.Count; i++)
{
ushort slotNo = (ushort)(i + 1);

var storageItemA = storageA.GetStorage(storageType).GetItem(slotNo);
if (storageItemA != null)
{
results.Add(CreateItemUpdateResult(null, storageItemA.Item1, storageType, slotNo, 0, 0));
}

var storageItemB = storageB.GetStorage(storageType).GetItem(slotNo);
if (storageItemB != null)
{
results.Add(CreateItemUpdateResult(null, storageItemB.Item1, storageType, slotNo, storageItemB.Item2, storageItemB.Item2));
}
else if (storageItemA != null)
{
Item item = new Item()
{
ItemId = 0,
UId = ""
};
results.Add(CreateItemUpdateResult(null, item, storageType, slotNo, storageItemA.Item2, storageItemA.Item2));
}
}
}
return results;
}

public uint LookupItemByUID(DdonServer<GameClient> server, string itemUID, DbConnection? connectionIn = null)
{
var item = server.Database.SelectStorageItemByUId(itemUID, connectionIn);
Expand Down
Loading

0 comments on commit 2fdc6a7

Please sign in to comment.