public static SubPacket BuildPacket(uint sourceActorId, uint targettedActorId, uint animationId, uint descriptionId) { byte[] data = new byte[PACKET_SIZE - 0x20]; if (targettedActorId == 0) { targettedActorId = sourceActorId; if (descriptionId != 10105) { descriptionId++; } } using (MemoryStream mem = new MemoryStream(data)) { using (BinaryWriter binWriter = new BinaryWriter(mem)) { uint realAnimID = 0x5000000 | (animationId << 12); binWriter.Write((UInt32)realAnimID); binWriter.Write((UInt32)targettedActorId); binWriter.Write((UInt32)descriptionId); } } SubPacket packet = new SubPacket(OPCODE, sourceActorId, data); packet.DebugPrintSubPacket(); return(packet); }
public void InterceptProcess(Session session, SubPacket subpacket) { switch (subpacket.gameMessage.opcode) { case 0x00C9: subpacket.DebugPrintSubPacket(); PartyChatMessagePacket partyChatMessagePacket = new PartyChatMessagePacket(subpacket.data); Party playerParty = mServer.GetWorldManager().GetPartyManager().GetParty(session.sessionId); for (int i = 0; i < playerParty.members.Count; i++) { Session thatSession = mServer.GetSession(playerParty.members[i]); if (thatSession != null && !session.Equals(thatSession)) { thatSession.clientConnection.QueuePacket(SendMessagePacket.BuildPacket(session.sessionId, thatSession.sessionId, SendMessagePacket.MESSAGE_TYPE_PARTY, mServer.GetNameForId(session.sessionId), partyChatMessagePacket.message)); } } break; case 0x6: mServer.GetWorldManager().DoLogin(session); break; //Special case for groups. If it's a world group, send values, else send to zone server case 0x133: GroupCreatedPacket groupCreatedPacket = new GroupCreatedPacket(subpacket.data); if (!mServer.GetWorldManager().SendGroupInit(session, groupCreatedPacket.groupId)) { session.clientConnection.QueuePacket(subpacket); } break; } }
public override void SendInitWorkValues(Session session) { SynchGroupWorkValuesPacket groupWork = new SynchGroupWorkValuesPacket(groupIndex); groupWork.addProperty(this, "partyGroupWork._globalTemp.owner"); groupWork.setTarget("/_init"); SubPacket test = groupWork.buildPacket(session.sessionId); session.clientConnection.QueuePacket(test); test.DebugPrintSubPacket(); }
public override void SendInitWorkValues(Session session) { SynchGroupWorkValuesPacket groupWork = new SynchGroupWorkValuesPacket(groupIndex); groupWork.addProperty(this, "contentGroupWork._globalTemp.director"); groupWork.addByte(Utils.MurmurHash2("contentGroupWork.property[0]", 0), 1); groupWork.setTarget("/_init"); SubPacket test = groupWork.buildPacket(session.id, session.id); test.DebugPrintSubPacket(); session.QueuePacket(test); }
public override void SendInitWorkValues(Session session) { SynchGroupWorkValuesPacket groupWork = new SynchGroupWorkValuesPacket(groupIndex); groupWork.addProperty(this, "work._globalTemp.host"); groupWork.addProperty(this, "work._globalTemp.variableCommand"); groupWork.setTarget("/_init"); SubPacket test = groupWork.buildPacket(session.id, session.id); test.DebugPrintSubPacket(); session.QueuePacket(test); }
public override void SendInitWorkValues(Session session) { SynchGroupWorkValuesPacket groupWork = new SynchGroupWorkValuesPacket(groupIndex); groupWork.addProperty(this, "work._globalSave.master"); groupWork.addProperty(this, "work._globalSave.crestIcon[0]"); groupWork.addProperty(this, "work._globalSave.rank"); for (int i = 0; i < members.Count; i++) { work._memberSave[i].rank = members[i].rank; groupWork.addProperty(this, String.Format("work._memberSave[{0}].rank", i)); } groupWork.setTarget("/_init"); SubPacket test = groupWork.buildPacket(session.sessionId); test.DebugPrintSubPacket(); session.clientConnection.QueuePacket(test); }
private void ProcessSessionAcknowledgement(ClientConnection client, SubPacket packet) { packet.DebugPrintSubPacket(); SessionPacket sessionPacket = new SessionPacket(packet.data); String clientVersion = sessionPacket.version; Program.Log.Info("Got acknowledgment for secure session."); Program.Log.Info("CLIENT VERSION: {0}", clientVersion); uint userId = Database.GetUserIdFromSession(sessionPacket.session); client.currentUserId = userId; client.currentSessionToken = sessionPacket.session;; if (userId == 0) { ErrorPacket errorPacket = new ErrorPacket(sessionPacket.sequence, 0, 0, 13001, "Your session has expired, please login again."); SubPacket subpacket = errorPacket.BuildPacket(); subpacket.SetTargetId(0xe0006868); BasePacket errorBasePacket = BasePacket.CreatePacket(subpacket, true, false); BasePacket.EncryptPacket(client.blowfish, errorBasePacket); client.QueuePacket(errorBasePacket); Program.Log.Info("Invalid session, kicking..."); return; } Program.Log.Info("USER ID: {0}", userId); List <Account> accountList = new List <Account>(); Account defaultAccount = new Account(); defaultAccount.id = 1; defaultAccount.name = "FINAL FANTASY XIV"; accountList.Add(defaultAccount); AccountListPacket listPacket = new AccountListPacket(1, accountList); BasePacket basePacket = BasePacket.CreatePacket(listPacket.BuildPackets(), true, false); BasePacket.EncryptPacket(client.blowfish, basePacket); client.QueuePacket(basePacket); }
public void OnReceiveSubPacketFromZone(ZoneServer zoneServer, SubPacket subpacket) { uint sessionId = subpacket.header.targetId; Session session = GetSession(sessionId); subpacket.DebugPrintSubPacket(); if (subpacket.gameMessage.opcode >= 0x1000) { //subpacket.DebugPrintSubPacket(); switch (subpacket.gameMessage.opcode) { //Session Begin Confirm case 0x1000: SessionBeginConfirmPacket beginConfirmPacket = new SessionBeginConfirmPacket(subpacket.data); if (beginConfirmPacket.invalidPacket || beginConfirmPacket.errorCode == 0) { Program.Log.Error("Session {0} had a error beginning session.", beginConfirmPacket.sessionId); } break; //Session End Confirm case 0x1001: SessionEndConfirmPacket endConfirmPacket = new SessionEndConfirmPacket(subpacket.data); if (!endConfirmPacket.invalidPacket && endConfirmPacket.errorCode == 0) { //Check destination, if != 0, update route and start new session if (endConfirmPacket.destinationZone != 0) { session.routing1 = Server.GetServer().GetWorldManager().GetZoneServer(endConfirmPacket.destinationZone); session.routing1.SendSessionStart(session); } else { RemoveSession(Session.Channel.ZONE, endConfirmPacket.sessionId); RemoveSession(Session.Channel.CHAT, endConfirmPacket.sessionId); } } else { Program.Log.Error("Session {0} had an error ending session.", endConfirmPacket.sessionId); } break; //Zone Change Request case 0x1002: WorldRequestZoneChangePacket zoneChangePacket = new WorldRequestZoneChangePacket(subpacket.data); if (!zoneChangePacket.invalidPacket) { GetWorldManager().DoZoneServerChange(session, zoneChangePacket.destinationZoneId, "", zoneChangePacket.destinationSpawnType, zoneChangePacket.destinationX, zoneChangePacket.destinationY, zoneChangePacket.destinationZ, zoneChangePacket.destinationRot); } break; //Change leader or kick case 0x1020: PartyModifyPacket partyModifyPacket = new PartyModifyPacket(subpacket.data); Party pt = mWorldManager.GetPartyManager().GetParty(subpacket.header.targetId); if (pt.GetMemberCount() <= 1) { return; } if (partyModifyPacket.command == PartyModifyPacket.MODIFY_LEADER) { pt.SetLeaderPlayerRequest(GetSession(subpacket.header.sourceId), partyModifyPacket.name); } else if (partyModifyPacket.command == PartyModifyPacket.MODIFY_KICKPLAYER) { pt.KickPlayerRequest(GetSession(subpacket.header.sourceId), partyModifyPacket.name); } else if (partyModifyPacket.command == PartyModifyPacket.MODIFY_LEADER + 2) { pt.SetLeaderPlayerRequest(GetSession(subpacket.header.sourceId), partyModifyPacket.actorId); } else if (partyModifyPacket.command == PartyModifyPacket.MODIFY_KICKPLAYER + 2) { pt.KickPlayerRequest(GetSession(subpacket.header.sourceId), partyModifyPacket.actorId); } break; //Party Resign or Disband case 0x1021: PartyLeavePacket partyLeavePacket = new PartyLeavePacket(subpacket.data); Party leavePt = mWorldManager.GetPartyManager().GetParty(subpacket.header.sourceId); if (!partyLeavePacket.isDisband) { leavePt.LeavePlayerRequest(GetSession(subpacket.header.sourceId)); } else { leavePt.DisbandPlayerRequest(GetSession(subpacket.header.sourceId)); } break; //Party Invite Request case 0x1022: PartyInvitePacket partyInvitePacket = new PartyInvitePacket(subpacket.data); if (partyInvitePacket.command == 1) { mWorldManager.ProcessPartyInvite(GetSession(subpacket.header.sourceId), partyInvitePacket.actorId); } else if (partyInvitePacket.command == 0) { Session inviteeByNamesSession = GetSession(partyInvitePacket.name); if (inviteeByNamesSession != null) { mWorldManager.ProcessPartyInvite(GetSession(subpacket.header.sourceId), inviteeByNamesSession.sessionId); } else { //Show not found msg } } break; //Group Invite Result case 0x1023: GroupInviteResultPacket groupInviteResultPacket = new GroupInviteResultPacket(subpacket.data); switch (groupInviteResultPacket.groupType) { case 0x2711: mWorldManager.ProcessPartyInviteResult(GetSession(subpacket.header.sourceId), groupInviteResultPacket.result); break; case 0x2712: mWorldManager.ProcessLinkshellInviteResult(GetSession(subpacket.header.sourceId), groupInviteResultPacket.result); break; } break; //Linkshell create request case 0x1025: CreateLinkshellPacket createLinkshellPacket = new CreateLinkshellPacket(subpacket.data); mWorldManager.GetLinkshellManager().CreateLinkshell(createLinkshellPacket.name, createLinkshellPacket.crestid, createLinkshellPacket.master); break; //Linkshell modify request case 0x1026: ModifyLinkshellPacket modifyLinkshellPacket = new ModifyLinkshellPacket(subpacket.data); switch (modifyLinkshellPacket.argCode) { case 0: break; case 1: mWorldManager.GetLinkshellManager().ChangeLinkshellCrest(modifyLinkshellPacket.currentName, modifyLinkshellPacket.crestid); break; case 2: mWorldManager.GetLinkshellManager().ChangeLinkshellMaster(modifyLinkshellPacket.currentName, modifyLinkshellPacket.master); break; } break; //Linkshell delete request case 0x1027: DeleteLinkshellPacket deleteLinkshellPacket = new DeleteLinkshellPacket(subpacket.data); mWorldManager.GetLinkshellManager().DeleteLinkshell(deleteLinkshellPacket.name); break; //Linkshell set active case 0x1028: LinkshellChangePacket linkshellChangePacket = new LinkshellChangePacket(subpacket.data); mWorldManager.ProcessLinkshellSetActive(GetSession(subpacket.header.sourceId), linkshellChangePacket.lsName); break; //Linkshell invite member case 0x1029: LinkshellInvitePacket linkshellInvitePacket = new LinkshellInvitePacket(subpacket.data); mWorldManager.ProcessLinkshellInvite(GetSession(subpacket.header.sourceId), linkshellInvitePacket.lsName, linkshellInvitePacket.actorId); break; //Linkshell cancel invite case 0x1030: LinkshellInviteCancelPacket linkshellInviteCancelPacket = new LinkshellInviteCancelPacket(subpacket.data); mWorldManager.ProcessLinkshellInviteCancel(GetSession(subpacket.header.sourceId)); break; //Linkshell resign/kicked case 0x1031: LinkshellLeavePacket linkshellLeavePacket = new LinkshellLeavePacket(subpacket.data); Linkshell lsLeave = mWorldManager.GetLinkshellManager().GetLinkshell(linkshellLeavePacket.lsName); if (linkshellLeavePacket.isKicked) { lsLeave.KickRequest(GetSession(subpacket.header.sourceId), linkshellLeavePacket.kickedName); } else { lsLeave.LeaveRequest(GetSession(subpacket.header.sourceId)); } break; //Linkshell rank change case 0x1032: LinkshellRankChangePacket linkshellRankChangePacket = new LinkshellRankChangePacket(subpacket.data); Linkshell lsRankChange = mWorldManager.GetLinkshellManager().GetLinkshell(linkshellRankChangePacket.lsName); lsRankChange.RankChangeRequest(GetSession(subpacket.header.sourceId), linkshellRankChangePacket.name, linkshellRankChangePacket.rank); break; } } else if (mZoneSessionList.ContainsKey(sessionId)) { ClientConnection conn = mZoneSessionList[sessionId].clientConnection; conn.QueuePacket(subpacket); conn.FlushQueuedSendPackets(); } }
public bool SetWorkValue(Player player, string name, string uiFunc, object value) { string[] split = name.Split('.'); int arrayIndex = 0; if (!(split[0].Equals("work") || split[0].Equals("charaWork") || split[0].Equals("playerWork") || split[0].Equals("npcWork"))) { return(false); } Object parentObj = null; Object curObj = this; for (int i = 0; i < split.Length; i++) { //For arrays if (split[i].Contains("[")) { if (split[i].LastIndexOf(']') - split[i].IndexOf('[') <= 0) { return(false); } arrayIndex = Convert.ToInt32(split[i].Substring(split[i].IndexOf('[') + 1, split[i].LastIndexOf(']') - split[i].LastIndexOf('[') - 1)); split[i] = split[i].Substring(0, split[i].IndexOf('[')); } FieldInfo field = curObj.GetType().GetField(split[i]); if (field == null) { return(false); } if (i == split.Length - 1) { parentObj = curObj; } curObj = field.GetValue(curObj); if (curObj == null) { return(false); } } if (curObj == null) { return(false); } else { //Array, we actually care whats inside if (curObj.GetType().IsArray) { if (((Array)curObj).Length <= arrayIndex) { return(false); } if (value.GetType() == ((Array)curObj).GetType().GetElementType() || TypeDescriptor.GetConverter(value.GetType()).CanConvertTo(((Array)curObj).GetType().GetElementType())) { if (value.GetType() == ((Array)curObj).GetType().GetElementType()) { ((Array)curObj).SetValue(value, arrayIndex); } else { ((Array)curObj).SetValue(TypeDescriptor.GetConverter(value.GetType()).ConvertTo(value, curObj.GetType().GetElementType()), arrayIndex); } SetActorPropetyPacket changeProperty = new SetActorPropetyPacket(uiFunc); changeProperty.AddProperty(this, name); changeProperty.AddTarget(); SubPacket subpacket = changeProperty.BuildPacket(player.actorId); player.playerSession.QueuePacket(subpacket); subpacket.DebugPrintSubPacket(); return(true); } } else { if (value.GetType() == curObj.GetType() || TypeDescriptor.GetConverter(value.GetType()).CanConvertTo(curObj.GetType())) { if (value.GetType() == curObj.GetType()) { parentObj.GetType().GetField(split[split.Length - 1]).SetValue(parentObj, value); } else { parentObj.GetType().GetField(split[split.Length - 1]).SetValue(parentObj, TypeDescriptor.GetConverter(value.GetType()).ConvertTo(value, curObj.GetType())); } SetActorPropetyPacket changeProperty = new SetActorPropetyPacket(uiFunc); changeProperty.AddProperty(this, name); changeProperty.AddTarget(); SubPacket subpacket = changeProperty.BuildPacket(player.actorId); player.playerSession.QueuePacket(subpacket); subpacket.DebugPrintSubPacket(); return(true); } } return(false); } }
public void ProcessPacket(ZoneConnection client, SubPacket subpacket) { Session session = mServer.GetSession(subpacket.header.sourceId); if (session == null && subpacket.gameMessage.opcode != 0x1000) { return; } //Normal Game Opcode switch (subpacket.gameMessage.opcode) { //World Server - Error case 0x100A: ErrorPacket worldError = new ErrorPacket(subpacket.data); switch (worldError.errorCode) { case 0x01: session.GetActor().SendGameMessage(Server.GetWorldManager().GetActor(), 60005, 0x20); break; } break; //World Server - Session Begin case 0x1000: subpacket.DebugPrintSubPacket(); SessionBeginPacket beginSessionPacket = new SessionBeginPacket(subpacket.data); session = mServer.AddSession(subpacket.header.sourceId); if (!beginSessionPacket.isLogin) { Server.GetWorldManager().DoZoneIn(session.GetActor(), false, session.GetActor().destinationSpawnType); } Program.Log.Info("{0} has been added to the session list.", session.GetActor().customDisplayName); client.FlushQueuedSendPackets(); break; //World Server - Session End case 0x1001: SessionEndPacket endSessionPacket = new SessionEndPacket(subpacket.data); if (endSessionPacket.destinationZoneId == 0) { session.GetActor().CleanupAndSave(); } else { session.GetActor().CleanupAndSave(endSessionPacket.destinationZoneId, endSessionPacket.destinationSpawnType, endSessionPacket.destinationX, endSessionPacket.destinationY, endSessionPacket.destinationZ, endSessionPacket.destinationRot); } Server.GetServer().RemoveSession(session.id); Program.Log.Info("{0} has been removed from the session list.", session.GetActor().customDisplayName); session.QueuePacket(SessionEndConfirmPacket.BuildPacket(session, endSessionPacket.destinationZoneId)); client.FlushQueuedSendPackets(); break; //World Server - Party Synch case 0x1020: PartySyncPacket partySyncPacket = new PartySyncPacket(subpacket.data); Server.GetWorldManager().PartyMemberListRecieved(partySyncPacket); break; //Ping case 0x0001: //subpacket.DebugPrintSubPacket(); PingPacket pingPacket = new PingPacket(subpacket.data); session.QueuePacket(PongPacket.BuildPacket(session.id, pingPacket.time)); session.Ping(); break; //Unknown case 0x0002: subpacket.DebugPrintSubPacket(); session.QueuePacket(_0x2Packet.BuildPacket(session.id)); client.FlushQueuedSendPackets(); break; //Chat Received case 0x0003: ChatMessagePacket chatMessage = new ChatMessagePacket(subpacket.data); //Program.Log.Info("Got type-{5} message: {0} @ {1}, {2}, {3}, Rot: {4}", chatMessage.message, chatMessage.posX, chatMessage.posY, chatMessage.posZ, chatMessage.posRot, chatMessage.logType); if (chatMessage.message.StartsWith("!")) { if (Server.GetCommandProcessor().DoCommand(chatMessage.message, session)) { return; } ; } if (chatMessage.logType == SendMessagePacket.MESSAGE_TYPE_SAY || chatMessage.logType == SendMessagePacket.MESSAGE_TYPE_SHOUT) { session.GetActor().BroadcastPacket(SendMessagePacket.BuildPacket(session.id, chatMessage.logType, session.GetActor().customDisplayName, chatMessage.message), false); } break; //Langauge Code (Client safe to send packets to now) case 0x0006: LangaugeCodePacket langCode = new LangaugeCodePacket(subpacket.data); LuaEngine.GetInstance().CallLuaFunction(session.GetActor(), session.GetActor(), "onBeginLogin", true); Server.GetWorldManager().DoZoneIn(session.GetActor(), true, 0x1); LuaEngine.GetInstance().CallLuaFunction(session.GetActor(), session.GetActor(), "onLogin", true); session.languageCode = langCode.languageCode; break; //Unknown - Happens a lot at login, then once every time player zones case 0x0007: //subpacket.DebugPrintSubPacket(); ZoneInCompletePacket zoneInCompletePacket = new ZoneInCompletePacket(subpacket.data); break; //Update Position case 0x00CA: //Update Position UpdatePlayerPositionPacket posUpdate = new UpdatePlayerPositionPacket(subpacket.data); session.UpdatePlayerActorPosition(posUpdate.x, posUpdate.y, posUpdate.z, posUpdate.rot, posUpdate.moveState); session.GetActor().SendInstanceUpdate(); if (session.GetActor().IsInZoneChange()) { session.GetActor().SetZoneChanging(false); } break; //Set Target case 0x00CD: //subpacket.DebugPrintSubPacket(); SetTargetPacket setTarget = new SetTargetPacket(subpacket.data); session.GetActor().currentTarget = setTarget.actorID; session.GetActor().BroadcastPacket(SetActorTargetAnimatedPacket.BuildPacket(session.id, setTarget.actorID), true); break; //Lock Target case 0x00CC: LockTargetPacket lockTarget = new LockTargetPacket(subpacket.data); session.GetActor().currentLockedTarget = lockTarget.actorID; break; //Start Event case 0x012D: subpacket.DebugPrintSubPacket(); EventStartPacket eventStart = new EventStartPacket(subpacket.data); /* * if (eventStart.error != null) * { * player.errorMessage += eventStart.error; * * if (eventStart.errorIndex == eventStart.errorNum - 1) * Program.Log.Error("\n"+player.errorMessage); * * * break; * } */ Actor ownerActor = Server.GetStaticActors(eventStart.scriptOwnerActorID); session.GetActor().currentEventOwner = eventStart.scriptOwnerActorID; session.GetActor().currentEventName = eventStart.triggerName; if (ownerActor == null) { //Is it a instance actor? ownerActor = session.GetActor().zone.FindActorInArea(session.GetActor().currentEventOwner); if (ownerActor == null) { //Is it a Director? Director director = session.GetActor().GetDirector(eventStart.scriptOwnerActorID); if (director != null) { ownerActor = director; } else { Program.Log.Debug("\n===Event START===\nCould not find actor 0x{0:X} for event started by caller: 0x{1:X}\nEvent Starter: {2}\nParams: {3}", eventStart.actorID, eventStart.scriptOwnerActorID, eventStart.triggerName, LuaUtils.DumpParams(eventStart.luaParams)); break; } } } session.GetActor().StartEvent(ownerActor, eventStart); Program.Log.Debug("\n===Event START===\nSource Actor: 0x{0:X}\nCaller Actor: 0x{1:X}\nVal1: 0x{2:X}\nVal2: 0x{3:X}\nEvent Starter: {4}\nParams: {5}", eventStart.actorID, eventStart.scriptOwnerActorID, eventStart.val1, eventStart.val2, eventStart.triggerName, LuaUtils.DumpParams(eventStart.luaParams)); break; //Unknown, happens at npc spawn and cutscene play???? case 0x00CE: subpacket.DebugPrintSubPacket(); break; //Event Result case 0x012E: subpacket.DebugPrintSubPacket(); EventUpdatePacket eventUpdate = new EventUpdatePacket(subpacket.data); Program.Log.Debug("\n===Event UPDATE===\nSource Actor: 0x{0:X}\nCaller Actor: 0x{1:X}\nVal1: 0x{2:X}\nVal2: 0x{3:X}\nStep: 0x{4:X}\nParams: {5}", eventUpdate.actorID, eventUpdate.scriptOwnerActorID, eventUpdate.val1, eventUpdate.val2, eventUpdate.step, LuaUtils.DumpParams(eventUpdate.luaParams)); /* * //Is it a static actor? If not look in the player's instance * Actor updateOwnerActor = Server.GetStaticActors(session.GetActor().currentEventOwner); * if (updateOwnerActor == null) * { * updateOwnerActor = Server.GetWorldManager().GetActorInWorld(session.GetActor().currentEventOwner); * * if (session.GetActor().currentDirector != null && session.GetActor().currentEventOwner == session.GetActor().currentDirector.actorId) * updateOwnerActor = session.GetActor().currentDirector; * * if (updateOwnerActor == null) * break; * } */ session.GetActor().UpdateEvent(eventUpdate); //LuaEngine.DoActorOnEventUpdated(session.GetActor(), updateOwnerActor, eventUpdate); break; case 0x012F: subpacket.DebugPrintSubPacket(); ParameterDataRequestPacket paramRequest = new ParameterDataRequestPacket(subpacket.data); if (paramRequest.paramName.Equals("charaWork/exp")) { session.GetActor().SendCharaExpInfo(); } break; //Group Created Confirm case 0x0133: GroupCreatedPacket groupCreated = new GroupCreatedPacket(subpacket.data); Server.GetWorldManager().SendGroupInit(session, groupCreated.groupId); break; /* RECRUITMENT */ //Start Recruiting case 0x01C3: StartRecruitingRequestPacket recruitRequestPacket = new StartRecruitingRequestPacket(subpacket.data); session.QueuePacket(StartRecruitingResponse.BuildPacket(session.id, true)); break; //End Recruiting case 0x01C4: session.QueuePacket(EndRecruitmentPacket.BuildPacket(session.id)); break; //Party Window Opened, Request State case 0x01C5: session.QueuePacket(RecruiterStatePacket.BuildPacket(session.id, false, false, 0)); break; //Search Recruiting case 0x01C7: RecruitmentSearchRequestPacket recruitSearchPacket = new RecruitmentSearchRequestPacket(subpacket.data); break; //Get Recruitment Details case 0x01C8: RecruitmentDetailsRequestPacket currentRecruitDetailsPacket = new RecruitmentDetailsRequestPacket(subpacket.data); RecruitmentDetails details = new RecruitmentDetails(); details.recruiterName = "Localhost Character"; details.purposeId = 2; details.locationId = 1; details.subTaskId = 1; details.comment = "This is a test details packet sent by the server. No implementation has been Created yet..."; details.num[0] = 1; session.QueuePacket(CurrentRecruitmentDetailsPacket.BuildPacket(session.id, details)); break; //Accepted Recruiting case 0x01C6: subpacket.DebugPrintSubPacket(); break; /* SOCIAL STUFF */ case 0x01C9: AddRemoveSocialPacket addBlackList = new AddRemoveSocialPacket(subpacket.data); session.QueuePacket(BlacklistAddedPacket.BuildPacket(session.id, true, addBlackList.name)); break; case 0x01CA: AddRemoveSocialPacket RemoveBlackList = new AddRemoveSocialPacket(subpacket.data); session.QueuePacket(BlacklistRemovedPacket.BuildPacket(session.id, true, RemoveBlackList.name)); break; case 0x01CB: int offset1 = 0; session.QueuePacket(SendBlacklistPacket.BuildPacket(session.id, new String[] { "Test" }, ref offset1)); break; case 0x01CC: AddRemoveSocialPacket addFriendList = new AddRemoveSocialPacket(subpacket.data); session.QueuePacket(FriendlistAddedPacket.BuildPacket(session.id, true, (uint)addFriendList.name.GetHashCode(), true, addFriendList.name)); break; case 0x01CD: AddRemoveSocialPacket RemoveFriendList = new AddRemoveSocialPacket(subpacket.data); session.QueuePacket(FriendlistRemovedPacket.BuildPacket(session.id, true, RemoveFriendList.name)); break; case 0x01CE: int offset2 = 0; session.QueuePacket(SendFriendlistPacket.BuildPacket(session.id, new Tuple <long, string>[] { new Tuple <long, string>(01, "Test2") }, ref offset2)); break; case 0x01CF: session.QueuePacket(FriendStatusPacket.BuildPacket(session.id, null)); break; /* SUPPORT DESK STUFF */ //Request for FAQ/Info List case 0x01D0: FaqListRequestPacket faqRequest = new FaqListRequestPacket(subpacket.data); session.QueuePacket(FaqListResponsePacket.BuildPacket(session.id, new string[] { "Testing FAQ1", "Coded style!" })); break; //Request for body of a faq/info selection case 0x01D1: FaqBodyRequestPacket faqBodyRequest = new FaqBodyRequestPacket(subpacket.data); session.QueuePacket(FaqBodyResponsePacket.BuildPacket(session.id, "HERE IS A GIANT BODY. Nothing else to say!")); break; //Request issue list case 0x01D2: GMTicketIssuesRequestPacket issuesRequest = new GMTicketIssuesRequestPacket(subpacket.data); session.QueuePacket(IssueListResponsePacket.BuildPacket(session.id, new string[] { "Test1", "Test2", "Test3", "Test4", "Test5" })); break; //Request if GM ticket exists case 0x01D3: session.QueuePacket(StartGMTicketPacket.BuildPacket(session.id, false)); break; //Request for GM response message case 0x01D4: session.QueuePacket(GMTicketPacket.BuildPacket(session.id, "This is a GM Ticket Title", "This is a GM Ticket Body.")); break; //GM Ticket Sent case 0x01D5: GMSupportTicketPacket gmTicket = new GMSupportTicketPacket(subpacket.data); Program.Log.Info("Got GM Ticket: \n" + gmTicket.ticketTitle + "\n" + gmTicket.ticketBody); session.QueuePacket(GMTicketSentResponsePacket.BuildPacket(session.id, true)); break; //Request to end ticket case 0x01D6: session.QueuePacket(EndGMTicketPacket.BuildPacket(session.id)); break; default: Program.Log.Debug("Unknown command 0x{0:X} received.", subpacket.gameMessage.opcode); subpacket.DebugPrintSubPacket(); break; } }