2017-03-07 00:09:37 -05:00
using FFXIVClassic.Common ;
using System ;
using System.Collections.Generic ;
using System.IO ;
using System.Text ;
using FFXIVClassic_Map_Server.dataobjects ;
using FFXIVClassic_Map_Server.packets.receive ;
using FFXIVClassic_Map_Server.packets.send ;
using FFXIVClassic_Map_Server.packets.send.login ;
using FFXIVClassic_Map_Server.packets.send.actor ;
using FFXIVClassic_Map_Server.packets.send.supportdesk ;
using FFXIVClassic_Map_Server.packets.receive.social ;
using FFXIVClassic_Map_Server.packets.send.social ;
using FFXIVClassic_Map_Server.packets.receive.supportdesk ;
using FFXIVClassic_Map_Server.packets.receive.recruitment ;
using FFXIVClassic_Map_Server.packets.send.recruitment ;
using FFXIVClassic_Map_Server.packets.receive.events ;
using FFXIVClassic_Map_Server.lua ;
2016-12-03 12:19:59 -05:00
using FFXIVClassic_Map_Server.Actors ;
using FFXIVClassic_Map_Server.packets.WorldPackets.Send ;
2017-01-29 11:07:28 -05:00
using FFXIVClassic_Map_Server.packets.WorldPackets.Receive ;
2017-03-07 00:09:37 -05:00
using FFXIVClassic_Map_Server.actors.director ;
namespace FFXIVClassic_Map_Server
{
class PacketProcessor
{
Server mServer ;
public PacketProcessor ( Server server )
{
mServer = server ;
}
public void ProcessPacket ( ZoneConnection client , SubPacket subpacket )
{
2017-06-27 21:08:30 -04:00
Session session = mServer . GetSession ( subpacket . header . sourceId ) ;
2016-12-03 12:19:59 -05:00
if ( session = = null & & subpacket . gameMessage . opcode ! = 0x1000 )
2017-03-07 00:09:37 -05:00
return ;
//Normal Game Opcode
switch ( subpacket . gameMessage . opcode )
{
2016-12-03 14:00:24 -05:00
//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 ;
}
2017-03-07 00:09:37 -05:00
break ;
//World Server - Session Begin
2016-09-26 16:20:01 -04:00
case 0x1000 :
2016-12-03 12:19:59 -05:00
subpacket . DebugPrintSubPacket ( ) ;
2017-06-19 16:30:04 -04:00
SessionBeginPacket beginSessionPacket = new SessionBeginPacket ( subpacket . data ) ;
2017-06-27 21:08:30 -04:00
session = mServer . AddSession ( subpacket . header . sourceId ) ;
2016-12-03 12:19:59 -05:00
2017-06-19 23:11:24 -04:00
if ( ! beginSessionPacket . isLogin )
2016-12-03 12:19:59 -05:00
Server . GetWorldManager ( ) . DoZoneIn ( session . GetActor ( ) , false , session . GetActor ( ) . destinationSpawnType ) ;
2016-12-03 13:23:32 -05:00
Program . Log . Info ( "{0} has been added to the session list." , session . GetActor ( ) . customDisplayName ) ;
2016-12-03 12:19:59 -05:00
client . FlushQueuedSendPackets ( ) ;
2016-09-26 16:20:01 -04:00
break ;
2016-12-03 12:19:59 -05:00
//World Server - Session End
2016-09-26 16:20:01 -04:00
case 0x1001 :
2016-12-03 12:19:59 -05:00
SessionEndPacket endSessionPacket = new SessionEndPacket ( subpacket . data ) ;
2016-09-26 16:20:01 -04:00
2016-12-03 12:19:59 -05:00
if ( endSessionPacket . destinationZoneId = = 0 )
session . GetActor ( ) . CleanupAndSave ( ) ;
else
2016-12-03 13:23:32 -05:00
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 ) ;
2016-12-03 12:19:59 -05:00
2017-06-27 21:08:30 -04:00
session . QueuePacket ( SessionEndConfirmPacket . BuildPacket ( session , endSessionPacket . destinationZoneId ) ) ;
2016-12-03 12:19:59 -05:00
client . FlushQueuedSendPackets ( ) ;
2016-12-20 19:17:50 -05:00
break ;
//World Server - Party Synch
case 0x1020 :
PartySyncPacket partySyncPacket = new PartySyncPacket ( subpacket . data ) ;
2017-03-07 00:09:37 -05:00
Server . GetWorldManager ( ) . PartyMemberListRecieved ( partySyncPacket ) ;
break ;
//Ping
case 0x0001 :
//subpacket.DebugPrintSubPacket();
PingPacket pingPacket = new PingPacket ( subpacket . data ) ;
2017-06-27 21:08:30 -04:00
session . QueuePacket ( PongPacket . BuildPacket ( session . id , pingPacket . time ) ) ;
2017-03-07 00:09:37 -05:00
session . Ping ( ) ;
break ;
//Unknown
case 0x0002 :
2016-08-29 08:17:14 -04:00
subpacket . DebugPrintSubPacket ( ) ;
2017-06-27 21:08:30 -04:00
session . QueuePacket ( _0x2Packet . BuildPacket ( session . id ) ) ;
2017-03-07 00:09:37 -05:00
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 ( "!" ) )
{
2016-08-29 12:48:23 -04:00
if ( Server . GetCommandProcessor ( ) . DoCommand ( chatMessage . message , session ) )
2017-03-07 00:09:37 -05:00
return ; ;
2016-08-29 12:37:41 -04:00
}
2017-01-02 14:35:11 -05:00
if ( chatMessage . logType = = SendMessagePacket . MESSAGE_TYPE_SAY | | chatMessage . logType = = SendMessagePacket . MESSAGE_TYPE_SHOUT )
2017-06-27 16:55:14 -04:00
session . GetActor ( ) . BroadcastPacket ( SendMessagePacket . BuildPacket ( session . id , chatMessage . logType , session . GetActor ( ) . customDisplayName , chatMessage . message ) , false ) ;
2017-03-07 00:09:37 -05:00
break ;
//Langauge Code (Client safe to send packets to now)
case 0x0006 :
2016-08-29 12:37:41 -04:00
LangaugeCodePacket langCode = new LangaugeCodePacket ( subpacket . data ) ;
2017-04-29 20:30:54 -04:00
LuaEngine . GetInstance ( ) . CallLuaFunction ( session . GetActor ( ) , session . GetActor ( ) , "onBeginLogin" , true ) ;
2016-12-18 09:50:23 -05:00
Server . GetWorldManager ( ) . DoZoneIn ( session . GetActor ( ) , true , 0x1 ) ;
2017-04-29 20:30:54 -04:00
LuaEngine . GetInstance ( ) . CallLuaFunction ( session . GetActor ( ) , session . GetActor ( ) , "onLogin" , true ) ;
2017-03-07 00:09:37 -05:00
session . languageCode = langCode . languageCode ;
break ;
//Unknown - Happens a lot at login, then once every time player zones
case 0x0007 :
2017-03-13 14:06:57 -04:00
//subpacket.DebugPrintSubPacket();
ZoneInCompletePacket zoneInCompletePacket = new ZoneInCompletePacket ( subpacket . data ) ;
2017-03-07 00:09:37 -05:00
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 ;
2017-06-27 16:55:14 -04:00
session . GetActor ( ) . BroadcastPacket ( SetActorTargetAnimatedPacket . BuildPacket ( session . id , setTarget . actorID ) , true ) ;
2017-03-07 00:09:37 -05:00
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 )
{
2017-09-09 10:54:40 -04:00
//Is it your retainer?
if ( session . GetActor ( ) . currentSpawnedRetainer ! = null & & session . GetActor ( ) . currentSpawnedRetainer . actorId = = eventStart . scriptOwnerActorID )
ownerActor = session . GetActor ( ) . currentSpawnedRetainer ;
2017-03-07 00:09:37 -05:00
//Is it a instance actor?
2017-09-09 10:54:40 -04:00
if ( ownerActor = = null )
ownerActor = session . GetActor ( ) . zone . FindActorInArea ( session . GetActor ( ) . currentEventOwner ) ;
2017-03-07 00:09:37 -05:00
if ( ownerActor = = null )
{
2017-01-29 11:07:28 -05:00
//Is it a Director?
Director director = session . GetActor ( ) . GetDirector ( eventStart . scriptOwnerActorID ) ;
if ( director ! = null )
2017-03-07 00:09:37 -05:00
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 ( ) ;
2016-12-04 10:12:33 -05:00
break ;
//Group Created Confirm
case 0x0133 :
GroupCreatedPacket groupCreated = new GroupCreatedPacket ( subpacket . data ) ;
2017-04-15 16:33:56 -04:00
Server . GetWorldManager ( ) . SendGroupInit ( session , groupCreated . groupId ) ;
2017-03-07 00:09:37 -05:00
break ;
/* RECRUITMENT */
//Start Recruiting
case 0x01C3 :
StartRecruitingRequestPacket recruitRequestPacket = new StartRecruitingRequestPacket ( subpacket . data ) ;
2017-06-27 21:08:30 -04:00
session . QueuePacket ( StartRecruitingResponse . BuildPacket ( session . id , true ) ) ;
2017-03-07 00:09:37 -05:00
break ;
//End Recruiting
case 0x01C4 :
2017-06-27 21:08:30 -04:00
session . QueuePacket ( EndRecruitmentPacket . BuildPacket ( session . id ) ) ;
2017-03-07 00:09:37 -05:00
break ;
//Party Window Opened, Request State
case 0x01C5 :
2017-06-27 21:08:30 -04:00
session . QueuePacket ( RecruiterStatePacket . BuildPacket ( session . id , false , false , 0 ) ) ;
2017-03-07 00:09:37 -05:00
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 ;
2017-06-27 21:08:30 -04:00
session . QueuePacket ( CurrentRecruitmentDetailsPacket . BuildPacket ( session . id , details ) ) ;
2017-03-07 00:09:37 -05:00
break ;
//Accepted Recruiting
case 0x01C6 :
subpacket . DebugPrintSubPacket ( ) ;
break ;
/* SOCIAL STUFF */
case 0x01C9 :
AddRemoveSocialPacket addBlackList = new AddRemoveSocialPacket ( subpacket . data ) ;
2017-06-27 21:08:30 -04:00
session . QueuePacket ( BlacklistAddedPacket . BuildPacket ( session . id , true , addBlackList . name ) ) ;
2017-03-07 00:09:37 -05:00
break ;
case 0x01CA :
AddRemoveSocialPacket RemoveBlackList = new AddRemoveSocialPacket ( subpacket . data ) ;
2017-06-27 21:08:30 -04:00
session . QueuePacket ( BlacklistRemovedPacket . BuildPacket ( session . id , true , RemoveBlackList . name ) ) ;
2017-03-07 00:09:37 -05:00
break ;
case 0x01CB :
int offset1 = 0 ;
2017-06-27 21:08:30 -04:00
session . QueuePacket ( SendBlacklistPacket . BuildPacket ( session . id , new String [ ] { "Test" } , ref offset1 ) ) ;
2017-03-07 00:09:37 -05:00
break ;
case 0x01CC :
AddRemoveSocialPacket addFriendList = new AddRemoveSocialPacket ( subpacket . data ) ;
2017-06-27 21:08:30 -04:00
session . QueuePacket ( FriendlistAddedPacket . BuildPacket ( session . id , true , ( uint ) addFriendList . name . GetHashCode ( ) , true , addFriendList . name ) ) ;
2017-03-07 00:09:37 -05:00
break ;
case 0x01CD :
AddRemoveSocialPacket RemoveFriendList = new AddRemoveSocialPacket ( subpacket . data ) ;
2017-06-27 21:08:30 -04:00
session . QueuePacket ( FriendlistRemovedPacket . BuildPacket ( session . id , true , RemoveFriendList . name ) ) ;
2017-03-07 00:09:37 -05:00
break ;
case 0x01CE :
int offset2 = 0 ;
2017-06-27 21:08:30 -04:00
session . QueuePacket ( SendFriendlistPacket . BuildPacket ( session . id , new Tuple < long , string > [ ] { new Tuple < long , string > ( 01 , "Test2" ) } , ref offset2 ) ) ;
2017-03-07 00:09:37 -05:00
break ;
case 0x01CF :
2017-06-27 21:08:30 -04:00
session . QueuePacket ( FriendStatusPacket . BuildPacket ( session . id , null ) ) ;
2017-03-07 00:09:37 -05:00
break ;
/* SUPPORT DESK STUFF */
//Request for FAQ/Info List
case 0x01D0 :
FaqListRequestPacket faqRequest = new FaqListRequestPacket ( subpacket . data ) ;
2017-06-27 21:08:30 -04:00
session . QueuePacket ( FaqListResponsePacket . BuildPacket ( session . id , new string [ ] { "Testing FAQ1" , "Coded style!" } ) ) ;
2017-03-07 00:09:37 -05:00
break ;
//Request for body of a faq/info selection
case 0x01D1 :
FaqBodyRequestPacket faqBodyRequest = new FaqBodyRequestPacket ( subpacket . data ) ;
2017-06-27 21:08:30 -04:00
session . QueuePacket ( FaqBodyResponsePacket . BuildPacket ( session . id , "HERE IS A GIANT BODY. Nothing else to say!" ) ) ;
2017-03-07 00:09:37 -05:00
break ;
//Request issue list
case 0x01D2 :
GMTicketIssuesRequestPacket issuesRequest = new GMTicketIssuesRequestPacket ( subpacket . data ) ;
2017-06-27 21:08:30 -04:00
session . QueuePacket ( IssueListResponsePacket . BuildPacket ( session . id , new string [ ] { "Test1" , "Test2" , "Test3" , "Test4" , "Test5" } ) ) ;
2017-03-07 00:09:37 -05:00
break ;
//Request if GM ticket exists
case 0x01D3 :
2017-06-27 21:08:30 -04:00
session . QueuePacket ( StartGMTicketPacket . BuildPacket ( session . id , false ) ) ;
2017-03-07 00:09:37 -05:00
break ;
//Request for GM response message
case 0x01D4 :
2017-06-27 21:08:30 -04:00
session . QueuePacket ( GMTicketPacket . BuildPacket ( session . id , "This is a GM Ticket Title" , "This is a GM Ticket Body." ) ) ;
2017-03-07 00:09:37 -05:00
break ;
//GM Ticket Sent
case 0x01D5 :
GMSupportTicketPacket gmTicket = new GMSupportTicketPacket ( subpacket . data ) ;
Program . Log . Info ( "Got GM Ticket: \n" + gmTicket . ticketTitle + "\n" + gmTicket . ticketBody ) ;
2017-06-27 21:08:30 -04:00
session . QueuePacket ( GMTicketSentResponsePacket . BuildPacket ( session . id , true ) ) ;
2017-03-07 00:09:37 -05:00
break ;
//Request to end ticket
case 0x01D6 :
2017-06-27 21:08:30 -04:00
session . QueuePacket ( EndGMTicketPacket . BuildPacket ( session . id ) ) ;
2017-03-07 00:09:37 -05:00
break ;
default :
Program . Log . Debug ( "Unknown command 0x{0:X} received." , subpacket . gameMessage . opcode ) ;
subpacket . DebugPrintSubPacket ( ) ;
break ;
}
}
}
}
2017-08-26 13:53:23 -04:00