Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Arrowgene.Ddon.Database/DdonDatabaseBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public static class DdonDatabaseBuilder
{
private const string DefaultSchemaFile = "Script/schema_sqlite.sql";

public const uint Version = 62;
public const uint Version = 63;
private static readonly ILogger Logger = LogProvider.Logger<Logger>(typeof(DdonDatabaseBuilder));

public static IDatabase Build(DatabaseSetting settings)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
ALTER TABLE "ddon_character_common"
ADD COLUMN "saved_online_status" INTEGER NOT NULL DEFAULT 1;
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@ CREATE TABLE IF NOT EXISTS "ddon_character_common"
"character_common_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
"job" SMALLINT NOT NULL,
"hide_equip_head" BOOLEAN NOT NULL,
"hide_equip_lantern" BOOLEAN NOT NULL
"hide_equip_lantern" BOOLEAN NOT NULL,
"saved_online_status" INTEGER NOT NULL DEFAULT 1
);

CREATE TABLE IF NOT EXISTS "ddon_character"
Expand Down
4 changes: 3 additions & 1 deletion Arrowgene.Ddon.Database/Sql/Core/DdonSqlDbCharacterCommon.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public partial class DdonSqlDb : SqlDb

private static readonly string[] CharacterCommonFields = new[]
{
"job", "hide_equip_head", "hide_equip_lantern"
"job", "hide_equip_head", "hide_equip_lantern", "saved_online_status"
};

private static readonly string[] CDataEditInfoFields = new[]
Expand Down Expand Up @@ -431,6 +431,7 @@ private void ReadAllCharacterCommonData(DbDataReader reader, CharacterCommon com
common.HideEquipHead = GetBoolean(reader, "hide_equip_head");
common.HideEquipLantern = GetBoolean(reader, "hide_equip_lantern");
common.JewelrySlotNum = 0;
common.SavedOnlineStatus = (OnlineStatus)GetByte(reader, "saved_online_status");

common.EditInfo.Sex = GetByte(reader, "sex");
common.EditInfo.Voice = GetByte(reader, "voice");
Expand Down Expand Up @@ -532,6 +533,7 @@ private void AddParameter(DbCommand command, CharacterCommon common)
AddParameter(command, "@job", (byte)common.Job);
AddParameter(command, "@hide_equip_head", common.HideEquipHead);
AddParameter(command, "@hide_equip_lantern", common.HideEquipLantern);
AddParameter(command, "@saved_online_status", (byte)common.SavedOnlineStatus);
// CDataEditInfoFields
AddParameter(command, "@sex", common.EditInfo.Sex);
AddParameter(command, "@voice", common.EditInfo.Voice);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using System.Data.Common;

namespace Arrowgene.Ddon.Database.Sql.Core.Migration
{
public class SyncOnlineStatusMigration(DatabaseSetting databaseSetting) : IMigrationStrategy
{
public uint From => 62;
public uint To => 63;

public bool Migrate(IDatabase db, DbConnection conn)
{
string adaptedSchema = DdonDatabaseBuilder.GetAdaptedSchema(databaseSetting, "Script/migration_synconlinestatus.sql");
db.Execute(conn, adaptedSchema, true);
return true;
}
}
}
26 changes: 26 additions & 0 deletions Arrowgene.Ddon.GameServer/Characters/CharacterManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using Arrowgene.Ddon.Shared.Entity.Structure;
using Arrowgene.Ddon.Shared.Model;
using Arrowgene.Ddon.Shared.Model.Quest;
using Arrowgene.Ddon.Shared.Model.Rpc;
using Arrowgene.Logging;
using System;
using System.Collections.Generic;
Expand Down Expand Up @@ -43,6 +44,8 @@ public Character SelectCharacter(uint characterId, bool fetchPawns = true, DbCon
return null;
}

character.OnlineStatus = character.SavedOnlineStatus;

character.Server = Server.AssetRepository.ServerList.Where(server => server.Id == Server.Id).Single().ToCDataGameServerListInfo();

// Apply Emblem stats before setting up character equipment
Expand Down Expand Up @@ -95,6 +98,18 @@ public Character SelectCharacter(uint characterId, bool fetchPawns = true, DbCon
});
}

public static OnlineStatus GetDefaultOnlineStatus(Character character)
{
return character.SavedOnlineStatus switch
{
OnlineStatus.Online => OnlineStatus.Online,
OnlineStatus.Offline => OnlineStatus.Offline,
OnlineStatus.Leaving => OnlineStatus.Leaving,
OnlineStatus.Busy => OnlineStatus.Busy,
_ => OnlineStatus.Online
};
}

/**
* @note It is probably more efficient to have thiese entries in the DB but
* the migration tool doesn't currently load quest data, so this is a workaround
Expand Down Expand Up @@ -373,6 +388,17 @@ public void UpdateOnlineStatus(GameClient client, Character character, OnlineSta
{
memberClient.Send(charUpdateNtc);
}

Server.RpcManager.AnnounceOthers(
"internal/command",
RpcInternalCommand.NotifyOnlineStatusChanged,
new RpcOnlineStatusData()
{
CharacterId = character.CharacterId,
ServerId = (ushort)Server.Id,
OnlineStatus = onlineStatus
}
);
}

public uint GetMaxAugmentAllocation(CharacterCommon character)
Expand Down
8 changes: 4 additions & 4 deletions Arrowgene.Ddon.GameServer/Characters/ClanManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -473,11 +473,11 @@ public List<CDataClanMemberInfo> MemberList(uint clanId)
}
else
{
var channelId = Server.RpcManager.FindPlayerById(memberInfo.CharacterId);
if (channelId > 0)
var presence = Server.RpcManager.FindPlayerPresenceById(memberInfo.CharacterId);
if (presence.ChannelId > 0)
{
member.CharacterListElement.OnlineStatus = OnlineStatus.Online;
member.CharacterListElement.ServerId = channelId;
member.CharacterListElement.OnlineStatus = presence.OnlineStatus;
member.CharacterListElement.ServerId = presence.ChannelId;
}
else
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,11 @@ public override S2CCharacterCommunityCharacterStatusGetRes Handle(GameClient cli
}
else
{
var matchServer = Server.RpcManager.FindPlayerById(character.CommunityCharacterBaseInfo.CharacterId);
if (matchServer != 0)
var presence = Server.RpcManager.FindPlayerPresenceById(character.CommunityCharacterBaseInfo.CharacterId);
if (presence.ChannelId != 0)
{
character.OnlineStatus = OnlineStatus.Online; // TODO
character.ServerId = matchServer;
character.OnlineStatus = presence.OnlineStatus;
character.ServerId = presence.ChannelId;
}
else
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Arrowgene.Ddon.Server;
using Arrowgene.Ddon.Shared.Entity.PacketStructure;
using Arrowgene.Ddon.Shared.Model;
using Arrowgene.Logging;

namespace Arrowgene.Ddon.GameServer.Handler
Expand All @@ -12,12 +13,23 @@ public CharacterSetOnlineStatusHandler(DdonGameServer server) : base(server)
{
}

private static bool IsPersistentOnlineStatus(OnlineStatus status)
{
return status == OnlineStatus.Online
|| status == OnlineStatus.Offline
|| status == OnlineStatus.Leaving
|| status == OnlineStatus.Busy;
}

public override S2CCharacterSetOnlineStatusRes Handle(GameClient client, C2SCharacterSetOnlineStatusReq request)
{
client.Character.OnlineStatus = request.OnlineStatus;
Server.CharacterManager.UpdateOnlineStatus(client, client.Character, request.OnlineStatus);

// TODO: Figure out request.IsSaveSetting
if (request.IsSaveSetting && IsPersistentOnlineStatus(request.OnlineStatus))
{
client.Character.SavedOnlineStatus = request.OnlineStatus;
Server.Database.UpdateCharacterCommonBaseInfo(client.Character);
}

return new S2CCharacterSetOnlineStatusRes()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ public override S2CCharacterSwitchGameModeRes Handle(GameClient client, C2SChara
var acquirableAbilities = client.Character.AcquirableAbilities;
var dispelSeals = client.Character.DispelSeals;
var msgSetList = client.Character.MsgSetList;
var onlineStatus = client.Character.OnlineStatus;
var savedOnlineStatus = client.Character.SavedOnlineStatus;

var serverInfo = client.Character.Server;

Expand Down Expand Up @@ -74,7 +76,8 @@ public override S2CCharacterSwitchGameModeRes Handle(GameClient client, C2SChara
client.Character.BbmProgress = bbmProgress;
client.Character.WalletPointList = walletPointList;
client.Character.ReleasedWarpPoints = warpPointList;
client.Character.OnlineStatus = OnlineStatus.Online;
client.Character.OnlineStatus = onlineStatus;
client.Character.SavedOnlineStatus = savedOnlineStatus;
client.Character.ClanId = clanId;
client.Character.ClanName = clanName;
client.Character.AchievementStatus = achievements.AchievementStatus;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public ConnectionLogoutHandler(DdonGameServer server) : base(server)
public override S2CConnectionLogoutRes Handle(GameClient client, C2SConnectionLogoutReq request)
{
S2CConnectionLogoutRes res = new S2CConnectionLogoutRes();
client.Character.OnlineStatus = OnlineStatus.Offline;
Server.CharacterManager.UpdateOnlineStatus(client, client.Character, OnlineStatus.Offline);
return res;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public override S2CEntryBoardEntryBoardItemLeaveRes Handle(GameClient client, C2
if (memberClient != null)
{
memberClient.Send(new S2CEntryBoardEntryBoardItemLeaveNtc());
Server.CharacterManager.UpdateOnlineStatus(client, memberClient.Character, OnlineStatus.Online);
Server.CharacterManager.UpdateOnlineStatus(memberClient, memberClient.Character, CharacterManager.GetDefaultOnlineStatus(memberClient.Character));
}
}
}
Expand Down Expand Up @@ -68,7 +68,7 @@ public override S2CEntryBoardEntryBoardItemLeaveRes Handle(GameClient client, C2
Server.BoardManager.RemoveCharacterFromGroup(client.Character);
Server.BoardManager.RestartRecruitment(data.EntryItem.Id);

Server.CharacterManager.UpdateOnlineStatus(client, client.Character, OnlineStatus.Online);
Server.CharacterManager.UpdateOnlineStatus(client, client.Character, CharacterManager.GetDefaultOnlineStatus(client.Character));
}

return new S2CEntryBoardEntryBoardItemLeaveRes();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using Arrowgene.Ddon.GameServer.Characters;
using Arrowgene.Ddon.Server;
using Arrowgene.Ddon.Shared.Entity.PacketStructure;
using Arrowgene.Ddon.Shared.Entity.Structure;
Expand Down Expand Up @@ -48,7 +49,7 @@ public override S2CEntryBoardItemKickRes Handle(GameClient client, C2SEntryBoard
kickedMemberClient.Send(new S2CEntryBoardEntryBoardItemLeaveNtc());

Server.BoardManager.RemoveCharacterFromGroup(kickedMemberClient.Character);
Server.CharacterManager.UpdateOnlineStatus(kickedMemberClient, kickedMemberClient.Character, OnlineStatus.Online);
Server.CharacterManager.UpdateOnlineStatus(kickedMemberClient, kickedMemberClient.Character, CharacterManager.GetDefaultOnlineStatus(kickedMemberClient.Character));

return new S2CEntryBoardItemKickRes();
}
Expand Down
34 changes: 31 additions & 3 deletions Arrowgene.Ddon.GameServer/Handler/LobbyLobbyJoinHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using Arrowgene.Ddon.Shared.Entity.PacketStructure;
using Arrowgene.Ddon.Shared.Entity.Structure;
using Arrowgene.Ddon.Shared.Model;
using Arrowgene.Ddon.Shared.Model.Rpc;
using Arrowgene.Logging;

namespace Arrowgene.Ddon.GameServer.Handler
Expand All @@ -21,7 +22,34 @@ public LobbyLobbyJoinHandler(DdonGameServer server) : base(server)

public override S2CLobbyJoinRes Handle(GameClient client, C2SLobbyJoinReq request)
{
client.Character.OnlineStatus = OnlineStatus.Online;
var ownOnlineStatus = client.Character.SavedOnlineStatus;

client.Character.OnlineStatus = ownOnlineStatus;

Server.RpcManager.UpdatePlayerList();

foreach (var element in Server.RpcManager.GetTrackedCharacterListElement())
{
if (element.CommunityCharacterBaseInfo.CharacterId == client.Character.CharacterId)
{
continue;
}

var ntc = new S2CCharacterCommunityCharacterStatusUpdateNtc();
ntc.UpdateCharacterList.Add(element);
client.Send(ntc);
}

Server.RpcManager.AnnounceOthers(
"internal/command",
RpcInternalCommand.NotifyOnlineStatusChanged,
new RpcOnlineStatusData()
{
CharacterId = client.Character.CharacterId,
ServerId = (ushort)Server.Id,
OnlineStatus = client.Character.OnlineStatus
}
);

// Notify new player of already present players
S2CUserListJoinNtc alreadyPresentUsersNtc = new S2CUserListJoinNtc();
Expand All @@ -40,7 +68,7 @@ public override S2CLobbyJoinRes Handle(GameClient client, C2SLobbyJoinReq reques
PawnId = 0,
Unk0 = 1,
Unk1 = 0,
OnlineStatus = OnlineStatus.Online
OnlineStatus = otherClient.Character.OnlineStatus
}
);
}
Expand All @@ -60,7 +88,7 @@ public override S2CLobbyJoinRes Handle(GameClient client, C2SLobbyJoinReq reques
ClanName = client.Character.ClanName.ShortName,
Unk0 = 1, // Platform PC?
Unk1 = 0,
OnlineStatus = OnlineStatus.Online // OnlineStatus?
OnlineStatus = ownOnlineStatus
},
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ public override S2CPartyPartyChangeLeaderRes Handle(GameClient client, C2SPartyP

if (party.MemberCount() == 1)
{
Server.CharacterManager.UpdateOnlineStatus(currentLeader.Client, currentLeader.Client.Character, OnlineStatus.Online);
Server.CharacterManager.UpdateOnlineStatus(currentLeader.Client, currentLeader.Client.Character, CharacterManager.GetDefaultOnlineStatus(currentLeader.Client.Character));
}
else
{
Expand Down
6 changes: 3 additions & 3 deletions Arrowgene.Ddon.GameServer/Handler/PartyPartyLeaveHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public override S2CPartyPartyLeaveRes Handle(GameClient client, C2SPartyPartyLea
if (!data.IsInRecreate)
{
Server.BoardManager.RemoveCharacterFromGroup(client.Character);
Server.CharacterManager.UpdateOnlineStatus(client, client.Character, OnlineStatus.Online);
Server.CharacterManager.UpdateOnlineStatus(client, client.Character, CharacterManager.GetDefaultOnlineStatus(client.Character));

if (BoardManager.BoardIdIsExm(party.ContentId))
{
Expand All @@ -43,12 +43,12 @@ public override S2CPartyPartyLeaveRes Handle(GameClient client, C2SPartyPartyLea
}
else
{
Server.CharacterManager.UpdateOnlineStatus(client, client.Character, OnlineStatus.Online);
Server.CharacterManager.UpdateOnlineStatus(client, client.Character, CharacterManager.GetDefaultOnlineStatus(client.Character));
}

if (party.MemberCount() == 1 && party.Leader != null && !BoardManager.BoardIdIsExm(party.ContentId))
{
Server.CharacterManager.UpdateOnlineStatus(party.Leader.Client, party.Leader.Client.Character, OnlineStatus.Online);
Server.CharacterManager.UpdateOnlineStatus(party.Leader.Client, party.Leader.Client.Character, CharacterManager.GetDefaultOnlineStatus(party.Leader.Client.Character));
}

S2CPartyPartyLeaveNtc partyLeaveNtc = new S2CPartyPartyLeaveNtc();
Expand Down
Loading
Loading