Skip to content

Commit

Permalink
Merge pull request #70 from alborrajo/feature/multiplayer
Browse files Browse the repository at this point in the history
Chat, quick chat, gestures, lobby leave and non functioning party invites
  • Loading branch information
alborrajo authored Apr 27, 2022
2 parents 629ee26 + 5fe448b commit 303c58e
Show file tree
Hide file tree
Showing 39 changed files with 823 additions and 96 deletions.
9 changes: 6 additions & 3 deletions Arrowgene.Ddon.GameServer/Chat/ChatManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,11 @@ public class ChatManager

private readonly List<IChatHandler> _handler;
private readonly GameRouter _router;
private readonly DdonGameServer _server;

public ChatManager(GameRouter router)
public ChatManager(DdonGameServer server, GameRouter router)
{
_server = server;
_router = router;
_handler = new List<IChatHandler>();
}
Expand Down Expand Up @@ -61,21 +63,22 @@ public void Handle(GameClient client, ChatMessage message)

Deliver(client, response);
}

client.Send(new S2CLobbyChatMsgRes());
}

private void Deliver(GameClient client, ChatResponse response)
{
switch (response.Type)
{
case LobbyChatMsgType.Say:
response.Recipients.Add(client);
response.Recipients.AddRange(_server.Clients);
break;
default:
response.Recipients.Add(client);
break;
}

client.Send(new S2CLobbyChatMsgRes());
_router.Send(response);
}
}
Expand Down
6 changes: 3 additions & 3 deletions Arrowgene.Ddon.GameServer/Chat/ChatMessage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,20 @@ namespace Arrowgene.Ddon.GameServer.Chat
{
public class ChatMessage
{
public ChatMessage(LobbyChatMsgType messageType, uint unk3, uint unk4, uint unk5, string message)
public ChatMessage(LobbyChatMsgType messageType, byte unk2, uint unk3, uint unk4, string message)
{
Type = messageType;
Unk2 = unk2;
Unk3 = unk3;
Unk4 = unk4;
Unk5 = unk5;
Message = message;
Deliver = true;
}

public LobbyChatMsgType Type { get; }
public byte Unk2 { get; set; }
public uint Unk3 { get; set; }
public uint Unk4 { get; set; }
public uint Unk5 { get; set; }
public string Message { get; }
public bool Deliver { get; set; }
}
Expand Down
6 changes: 3 additions & 3 deletions Arrowgene.Ddon.GameServer/Chat/ChatResponse.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,9 @@ public static ChatResponse FromMessage(GameClient client, ChatMessage message)
LastName = client.Character.LastName,
CharacterId = client.Character.Id,
Type = message.Type,
Unk2 = message.Unk2,
Unk3 = message.Unk3,
Unk4 = message.Unk4,
Unk5 = message.Unk5,
Recipients = {client}
};
}
Expand All @@ -49,9 +49,9 @@ public ChatResponse()
Recipients = new List<GameClient>();
Deliver = true;
Type = LobbyChatMsgType.Say;
Unk2 = 0;
Unk3 = 0;
Unk4 = 0;
Unk5 = 0;
CharacterId = 0;
Message = "";
FirstName = "";
Expand All @@ -62,9 +62,9 @@ public ChatResponse()
public List<GameClient> Recipients { get; }
public bool Deliver { get; set; }
public LobbyChatMsgType Type { get; set; }
public byte Unk2 { get; set; }
public uint Unk3 { get; set; }
public uint Unk4 { get; set; }
public uint Unk5 { get; set; }
public string Message { get; set; }
public uint CharacterId { get; set; }
public string FirstName { get; set; }
Expand Down
20 changes: 20 additions & 0 deletions Arrowgene.Ddon.GameServer/ClientConnectionChangeArgs.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using System;
namespace Arrowgene.Ddon.GameServer
{
public class ClientConnectionChangeArgs: EventArgs
{
public enum EventType {
CONNECT,
DISCONNECT
}

public ClientConnectionChangeArgs(EventType eventType, GameClient client)
{
Action = eventType;
Client = client;
}

public EventType Action;
public GameClient Client;
}
}
26 changes: 25 additions & 1 deletion Arrowgene.Ddon.GameServer/DdonGameServer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
* along with Arrowgene.Ddon.GameServer. If not, see <https://www.gnu.org/licenses/>.
*/

using System;
using System.Collections.Generic;
using Arrowgene.Ddon.Database;
using Arrowgene.Ddon.GameServer.Chat;
Expand Down Expand Up @@ -54,13 +55,15 @@ public DdonGameServer(GameServerSetting setting, IDatabase database, AssetReposi
_stages = new Dictionary<StageId, Stage>();
Setting = new GameServerSetting(setting);
Router = new GameRouter();
ChatManager = new ChatManager(Router);
ChatManager = new ChatManager(this, Router);
EnemyManager = new EnemyManager(assetRepository, database);

S2CStageGetStageListRes stageListPacket = EntitySerializer.Get<S2CStageGetStageListRes>().Read(GameDump.data_Dump_19);
StageList = stageListPacket.StageList;
}

public event EventHandler<ClientConnectionChangeArgs> ClientConnectionChangeEvent;

public GameServerSetting Setting { get; }
public ChatManager ChatManager { get; }
public EnemyManager EnemyManager { get; }
Expand All @@ -86,11 +89,27 @@ public override void Start()
protected override void ClientConnected(GameClient client)
{
client.InitializeChallenge();

EventHandler<ClientConnectionChangeArgs> connectionChangeEvent = ClientConnectionChangeEvent;
if (connectionChangeEvent != null)
{
ClientConnectionChangeArgs connectionChangeEventArgs
= new ClientConnectionChangeArgs(ClientConnectionChangeArgs.EventType.CONNECT, client);
connectionChangeEvent(this, connectionChangeEventArgs);
}
}

protected override void ClientDisconnected(GameClient client)
{
_clients.Remove(client);

EventHandler<ClientConnectionChangeArgs> connectionChangeEvent = ClientConnectionChangeEvent;
if (connectionChangeEvent != null)
{
ClientConnectionChangeArgs connectionChangeEventArgs
= new ClientConnectionChangeArgs(ClientConnectionChangeArgs.EventType.DISCONNECT, client);
connectionChangeEvent(this, connectionChangeEventArgs);
}
}

public override GameClient NewClient(ITcpSocket socket)
Expand Down Expand Up @@ -165,6 +184,7 @@ private void LoadPacketHandler()

AddHandler(new Gp_28_2_1_Handler(this));
AddHandler(new GpGetUpdateAppCourseBonusFlagHandler(this));
AddHandler(new GpGetValidChatComGroupHandler(this));

AddHandler(new GroupChatGroupChatGetMemberListHandler(this));

Expand Down Expand Up @@ -194,6 +214,7 @@ private void LoadPacketHandler()
AddHandler(new LoadingInfoLoadingGetInfoHandler(this));

AddHandler(new LobbyLobbyJoinHandler(this));
AddHandler(new LobbyLobbyLeaveHandler(this));
AddHandler(new LobbyLobbyChatMsgHandler(this));
AddHandler(new LobbyLobbyDataMsgHandler(this));

Expand All @@ -218,6 +239,9 @@ private void LoadPacketHandler()
AddHandler(new PartnerPawnPawnLikabilityRewardListGetHandler(this));

AddHandler(new PartyPartyCreateHandler(this));
AddHandler(new PartyPartyInviteCharacterHandler(this));
AddHandler(new PartyPartyInviteEntryHandler(this));
AddHandler(new PartyPartyInvitePrepareAcceptHandler(this));

AddHandler(new PawnGetMypawnDataHandler(this));
AddHandler(new PawnGetMyPawnListHandler(this));
Expand Down
4 changes: 4 additions & 0 deletions Arrowgene.Ddon.GameServer/GameClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,5 +41,9 @@ public void UpdateIdentity()
public float Y { get; set; }
public double Z { get; set; }
// ---

public Party PendingInvitedParty { get; set; } // Maybe its more clean to store this in the handlers ?
public Party Party { get; set; }

}
}
2 changes: 1 addition & 1 deletion Arrowgene.Ddon.GameServer/GameRouter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@ public void Send(ChatResponse response)
{
S2CLobbyChatMsgNotice notice = new S2CLobbyChatMsgNotice();
notice.Type = (byte) response.Type;
notice.Unk2 = response.Unk2;
notice.Unk3 = response.Unk3;
notice.Unk4 = response.Unk4;
notice.Unk5 = response.Unk5;
notice.Message = response.Message;
notice.CharacterBaseInfo.CharacterId = response.CharacterId;
notice.CharacterBaseInfo.CharacterName.FirstName = response.FirstName;
Expand Down
22 changes: 22 additions & 0 deletions Arrowgene.Ddon.GameServer/Handler/GpGetValidChatComGroupHandler.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using Arrowgene.Ddon.Server;
using Arrowgene.Ddon.Server.Network;
using Arrowgene.Ddon.Shared.Entity.PacketStructure;
using Arrowgene.Ddon.Shared.Network;
using Arrowgene.Logging;

namespace Arrowgene.Ddon.GameServer.Handler
{
public class GpGetValidChatComGroupHandler : StructurePacketHandler<GameClient, C2SGpGetValidChatComGroupReq>
{
private static readonly ServerLogger Logger = LogProvider.Logger<ServerLogger>(typeof(GpGetValidChatComGroupHandler));

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

public override void Handle(GameClient client, StructurePacket<C2SGpGetValidChatComGroupReq> packet)
{
client.Send(new S2CGpGetValidChatComGroupRes());
}
}
}
20 changes: 1 addition & 19 deletions Arrowgene.Ddon.GameServer/Handler/LobbyLobbyChatMsgHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,30 +23,12 @@ public override void Handle(GameClient client, StructurePacket<C2SLobbyChatMsgRe
{
ChatMessage message = new ChatMessage(
request.Structure.Type,
request.Structure.Unk2,
request.Structure.Unk3,
request.Structure.Unk4,
request.Structure.Unk5,
request.Structure.StrMessage
);
_chatManager.Handle(client, message);


// Logger.Debug(requestingClient, $"{request.Structure.Type}, {request.Structure.Unk2}, {request.Structure.Unk3}, {request.Structure.Unk4}, {request.Structure.Unk5}: {request.Structure.StrMessage}"); // Log chat message

// S2CLobbyChatMsgRes response = new S2CLobbyChatMsgRes();
// requestingClient.Send(response);

// // Notify all players
// S2CLobbyChatMsgNotice notice = new S2CLobbyChatMsgNotice();
// notice.Unk0 = (byte) request.Structure.Type;
// notice.StrMessage = request.Structure.StrMessage;
// notice.CharacterBaseInfo.strFirstName = requestingClient.Character.FirstName;
// notice.CharacterBaseInfo.strLastName = requestingClient.Character.LastName;
// notice.CharacterBaseInfo.strClanName = "ClanName";
// foreach (GameClient client in Server.Clients)
// {
// client.Send(notice);
// }
}
}
}
2 changes: 0 additions & 2 deletions Arrowgene.Ddon.GameServer/Handler/LobbyLobbyJoinHandler.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using System;
using System.Collections.Generic;
using Arrowgene.Buffers;
using Arrowgene.Ddon.GameServer.Dump;
using Arrowgene.Ddon.Server;
using Arrowgene.Ddon.Server.Network;
Expand Down
49 changes: 49 additions & 0 deletions Arrowgene.Ddon.GameServer/Handler/LobbyLobbyLeaveHandler.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
using Arrowgene.Ddon.Server;
using Arrowgene.Ddon.Server.Network;
using Arrowgene.Ddon.Shared.Entity.PacketStructure;
using Arrowgene.Ddon.Shared.Entity.Structure;
using Arrowgene.Ddon.Shared.Network;
using Arrowgene.Logging;

namespace Arrowgene.Ddon.GameServer.Handler
{
public class LobbyLobbyLeaveHandler : StructurePacketHandler<GameClient, C2SLobbyLeaveReq>
{
private static readonly ServerLogger Logger = LogProvider.Logger<ServerLogger>(typeof(LobbyLobbyLeaveHandler));


public LobbyLobbyLeaveHandler(DdonGameServer server) : base(server)
{
server.ClientConnectionChangeEvent += OnClientConnectionChangeEvent;
}

// I have no idea on when this gets called, not when exiting the game, thats for sure
public override void Handle(GameClient client, StructurePacket<C2SLobbyLeaveReq> packet)
{
client.Send(new S2CLobbyLeaveRes());
NotifyDisconnect(client);
}

private void OnClientConnectionChangeEvent(object sender, ClientConnectionChangeArgs e)
{
if (e.Action == ClientConnectionChangeArgs.EventType.DISCONNECT)
{
NotifyDisconnect(e.Client);
}
}

private void NotifyDisconnect(GameClient client)
{
// Notice all other users
S2CUserListLeaveNtc ntc = new S2CUserListLeaveNtc();
ntc.CharacterList.Add(new CDataCommonU32(client.Character.Id));
foreach (Client otherClient in Server.Clients)
{
if (otherClient != client)
{
otherClient.Send(ntc);
}
}
}
}
}
33 changes: 22 additions & 11 deletions Arrowgene.Ddon.GameServer/Handler/PartyPartyCreateHandler.cs
Original file line number Diff line number Diff line change
@@ -1,39 +1,50 @@
using Arrowgene.Ddon.GameServer.Dump;
using System.Reflection.Metadata;
using Arrowgene.Ddon.GameServer.Dump;
using Arrowgene.Ddon.Server;
using Arrowgene.Ddon.Server.Network;
using Arrowgene.Ddon.Shared.Entity.PacketStructure;
using Arrowgene.Ddon.Shared.Entity.Structure;
using Arrowgene.Ddon.Shared.Model;
using Arrowgene.Ddon.Shared.Network;
using Arrowgene.Logging;

namespace Arrowgene.Ddon.GameServer.Handler
{
public class PartyPartyCreateHandler : PacketHandler<GameClient>
public class PartyPartyCreateHandler : StructurePacketHandler<GameClient, C2SPartyPartyCreateReq>
{
private static readonly ServerLogger Logger = LogProvider.Logger<ServerLogger>(typeof(PartyPartyCreateHandler));


public PartyPartyCreateHandler(DdonGameServer server) : base(server)
{

}

public override PacketId Id => PacketId.C2S_PARTY_PARTY_CREATE_REQ;

public override void Handle(GameClient client, IPacket packet)
public override void Handle(GameClient client, StructurePacket<C2SPartyPartyCreateReq> packet)
{
S2CParty_6_8_16_Ntc ntc_6_8_16 = new S2CParty_6_8_16_Ntc();
client.Party = new Party();
client.Party.Members.Add(client);

S2CPartyPartyJoinNtc partyJoinNtc = new S2CPartyPartyJoinNtc();
CDataPartyMember partyMember = new CDataPartyMember();
partyMember.CharacterListElement.ServerId = Server.AssetRepository.ServerList[0].Id;
partyMember.CharacterListElement.CommunityCharacterBaseInfo.CharacterId = client.Character.Id;
partyMember.CharacterListElement.CommunityCharacterBaseInfo.CharacterName.FirstName = client.Character.FirstName;
partyMember.CharacterListElement.CommunityCharacterBaseInfo.CharacterName.LastName = client.Character.LastName;
ntc_6_8_16.PartyMembers.Add(partyMember);
client.Send(ntc_6_8_16);
partyMember.CharacterListElement.CurrentJobBaseInfo.Job = Server.AssetRepository.ArisenAsset[0].Job;
partyMember.CharacterListElement.CurrentJobBaseInfo.Level = (byte) Server.AssetRepository.ArisenAsset[0].Lv;
partyMember.CharacterListElement.EntryJobBaseInfo.Job = Server.AssetRepository.ArisenAsset[0].Job;
partyMember.CharacterListElement.EntryJobBaseInfo.Level = (byte) Server.AssetRepository.ArisenAsset[0].Lv;
partyJoinNtc.PartyMembers.Add(partyMember);
client.Send(partyJoinNtc);

S2CPartyPartyCreateRes partyCreateRes = new S2CPartyPartyCreateRes();
partyCreateRes.PartyId = client.Party.Id;
client.Send(partyCreateRes);

//client.Send(InGameDump.Dump_103);

// client.Send(InGameDump.Dump_104);
client.Send(InGameDump.Dump_105);
//client.Send(InGameDump.Dump_104);
//client.Send(InGameDump.Dump_105);
}
}
}
Loading

0 comments on commit 303c58e

Please sign in to comment.