diff --git a/FFXIVClassic Map Server/Database.cs b/FFXIVClassic Map Server/Database.cs
index 3c11d4d6..78f859a8 100644
--- a/FFXIVClassic Map Server/Database.cs
+++ b/FFXIVClassic Map Server/Database.cs
@@ -237,7 +237,9 @@ namespace FFXIVClassic_Map_Server
rotation = @rot,
destinationZoneId = @destZone,
destinationSpawnType = @destSpawn,
- currentZoneId = @zoneId
+ currentZoneId = @zoneId,
+ currentPrivateArea = @privateArea,
+ currentPrivateAreaType = @privateAreaType
WHERE id = @charaId
";
@@ -248,6 +250,8 @@ namespace FFXIVClassic_Map_Server
cmd.Parameters.AddWithValue("@z", player.positionZ);
cmd.Parameters.AddWithValue("@rot", player.rotation);
cmd.Parameters.AddWithValue("@zoneId", player.zoneId);
+ cmd.Parameters.AddWithValue("@privateArea", player.privateArea);
+ cmd.Parameters.AddWithValue("@privateAreaType", player.privateAreaType);
cmd.Parameters.AddWithValue("@destZone", player.destinationZone);
cmd.Parameters.AddWithValue("@destSpawn", player.destinationSpawnType);
@@ -327,7 +331,7 @@ namespace FFXIVClassic_Map_Server
VALUES
(@charaId, @slot, @questId, @questData, @questFlags)
ON DUPLICATE KEY UPDATE
- questData = @questData, questFlags = @questFlags
+ questId = @questId, questData = @questData, questFlags = @questFlags
";
cmd = new MySqlCommand(query, conn);
@@ -385,7 +389,9 @@ namespace FFXIVClassic_Map_Server
achievementPoints,
playTime,
destinationZoneId,
- destinationSpawnType
+ destinationSpawnType,
+ currentPrivateArea,
+ currentPrivateAreaType
FROM characters WHERE id = @charId";
cmd = new MySqlCommand(query, conn);
@@ -419,10 +425,17 @@ namespace FFXIVClassic_Map_Server
player.destinationZone = reader.GetUInt32("destinationZoneId");
player.destinationSpawnType = reader.GetByte("destinationSpawnType");
+ if (!reader.IsDBNull(reader.GetOrdinal("currentPrivateArea")))
+ player.privateArea = reader.GetString("currentPrivateArea");
+ player.privateAreaType = reader.GetUInt32("currentPrivateAreaType");
+
if (player.destinationZone != 0)
player.zoneId = player.destinationZone;
-
- player.zone = Server.GetWorldManager().GetZone(player.zoneId);
+
+ if (player.privateArea != null && !player.privateArea.Equals(""))
+ player.zone = Server.GetWorldManager().GetPrivateArea(player.zoneId, player.privateArea, player.privateAreaType);
+ else
+ player.zone = Server.GetWorldManager().GetZone(player.zoneId);
}
}
diff --git a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj
index 48bd244f..230679e2 100644
--- a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj
+++ b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj
@@ -152,7 +152,7 @@
-
+
diff --git a/FFXIVClassic Map Server/PacketProcessor.cs b/FFXIVClassic Map Server/PacketProcessor.cs
index e752b95b..90330659 100644
--- a/FFXIVClassic Map Server/PacketProcessor.cs
+++ b/FFXIVClassic Map Server/PacketProcessor.cs
@@ -1,48 +1,48 @@
-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;
+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;
using FFXIVClassic_Map_Server.Actors;
using FFXIVClassic_Map_Server.packets.WorldPackets.Send;
using FFXIVClassic_Map_Server.packets.WorldPackets.Receive;
-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)
- {
+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)
+ {
Session session = mServer.GetSession(subpacket.header.targetId);
if (session == null && subpacket.gameMessage.opcode != 0x1000)
- return;
-
- //Normal Game Opcode
- switch (subpacket.gameMessage.opcode)
- {
+ return;
+
+ //Normal Game Opcode
+ switch (subpacket.gameMessage.opcode)
+ {
//World Server - Error
case 0x100A:
ErrorPacket worldError = new ErrorPacket(subpacket.data);
@@ -52,8 +52,8 @@ namespace FFXIVClassic_Map_Server
session.GetActor().SendGameMessage(Server.GetWorldManager().GetActor(), 60005, 0x20);
break;
}
- break;
- //World Server - Session Begin
+ break;
+ //World Server - Session Begin
case 0x1000:
subpacket.DebugPrintSubPacket();
session = mServer.AddSession(subpacket.header.targetId);
@@ -83,264 +83,266 @@ namespace FFXIVClassic_Map_Server
//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);
+ Server.GetWorldManager().PartyMemberListRecieved(partySyncPacket);
+ break;
+ //Ping
+ case 0x0001:
+ //subpacket.DebugPrintSubPacket();
+ PingPacket pingPacket = new PingPacket(subpacket.data);
client.QueuePacket(BasePacket.CreatePacket(PongPacket.BuildPacket(session.id, pingPacket.time), true, false));
- session.Ping();
- break;
- //Unknown
- case 0x0002:
-
+ session.Ping();
+ break;
+ //Unknown
+ case 0x0002:
+
subpacket.DebugPrintSubPacket();
client.QueuePacket(_0x2Packet.BuildPacket(session.id), true, false);
- 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("!"))
- {
+ 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; ;
+ return; ;
}
if (chatMessage.logType == SendMessagePacket.MESSAGE_TYPE_SAY || chatMessage.logType == SendMessagePacket.MESSAGE_TYPE_SHOUT)
- session.GetActor().BroadcastPacket(SendMessagePacket.BuildPacket(session.id, session.id, chatMessage.logType, session.GetActor().customDisplayName, chatMessage.message), false);
-
- break;
- //Langauge Code (Client safe to send packets to now)
- case 0x0006:
+ session.GetActor().BroadcastPacket(SendMessagePacket.BuildPacket(session.id, 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);
session = mServer.AddSession(subpacket.header.targetId);
- LuaEngine.OnBeginLogin(session.GetActor());
+ LuaEngine.OnBeginLogin(session.GetActor());
Server.GetWorldManager().DoZoneIn(session.GetActor(), true, 0x1);
LuaEngine.OnLogin(session.GetActor());
- session.languageCode = langCode.languageCode;
- break;
- //Unknown - Happens a lot at login, then once every time player zones
- case 0x0007:
- //subpacket.DebugPrintSubPacket();
- _0x07Packet unknown07 = new _0x07Packet(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, 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 = Server.GetWorldManager().GetActorInWorld(session.GetActor().currentEventOwner);
- if (ownerActor == null)
- {
+ 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);
+ LuaEngine.OnZoneInDone(session.GetActor());
+ 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, 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.FindActorInZone(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:
- 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();
+ 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);
- break;
- /* RECRUITMENT */
- //Start Recruiting
- case 0x01C3:
- StartRecruitingRequestPacket recruitRequestPacket = new StartRecruitingRequestPacket(subpacket.data);
- client.QueuePacket(BasePacket.CreatePacket(StartRecruitingResponse.BuildPacket(session.id, true), true, false));
- break;
- //End Recruiting
- case 0x01C4:
- client.QueuePacket(BasePacket.CreatePacket(EndRecruitmentPacket.BuildPacket(session.id), true, false));
- break;
- //Party Window Opened, Request State
- case 0x01C5:
- client.QueuePacket(BasePacket.CreatePacket(RecruiterStatePacket.BuildPacket(session.id, false, false, 0), true, false));
- 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;
- client.QueuePacket(BasePacket.CreatePacket(CurrentRecruitmentDetailsPacket.BuildPacket(session.id, details), true, false));
- break;
- //Accepted Recruiting
- case 0x01C6:
- subpacket.DebugPrintSubPacket();
- break;
- /* SOCIAL STUFF */
- case 0x01C9:
- AddRemoveSocialPacket addBlackList = new AddRemoveSocialPacket(subpacket.data);
- client.QueuePacket(BasePacket.CreatePacket(BlacklistAddedPacket.BuildPacket(session.id, true, addBlackList.name), true, false));
- break;
- case 0x01CA:
- AddRemoveSocialPacket RemoveBlackList = new AddRemoveSocialPacket(subpacket.data);
- client.QueuePacket(BasePacket.CreatePacket(BlacklistRemovedPacket.BuildPacket(session.id, true, RemoveBlackList.name), true, false));
- break;
- case 0x01CB:
- int offset1 = 0;
- client.QueuePacket(BasePacket.CreatePacket(SendBlacklistPacket.BuildPacket(session.id, new String[] { "Test" }, ref offset1), true, false));
- break;
- case 0x01CC:
- AddRemoveSocialPacket addFriendList = new AddRemoveSocialPacket(subpacket.data);
- client.QueuePacket(BasePacket.CreatePacket(FriendlistAddedPacket.BuildPacket(session.id, true, (uint)addFriendList.name.GetHashCode(), true, addFriendList.name), true, false));
- break;
- case 0x01CD:
- AddRemoveSocialPacket RemoveFriendList = new AddRemoveSocialPacket(subpacket.data);
- client.QueuePacket(BasePacket.CreatePacket(FriendlistRemovedPacket.BuildPacket(session.id, true, RemoveFriendList.name), true, false));
- break;
- case 0x01CE:
- int offset2 = 0;
- client.QueuePacket(BasePacket.CreatePacket(SendFriendlistPacket.BuildPacket(session.id, new Tuple[] { new Tuple(01, "Test2") }, ref offset2), true, false));
- break;
- case 0x01CF:
- client.QueuePacket(BasePacket.CreatePacket(FriendStatusPacket.BuildPacket(session.id, null), true, false));
- break;
- /* SUPPORT DESK STUFF */
- //Request for FAQ/Info List
- case 0x01D0:
- FaqListRequestPacket faqRequest = new FaqListRequestPacket(subpacket.data);
- client.QueuePacket(BasePacket.CreatePacket(FaqListResponsePacket.BuildPacket(session.id, new string[] { "Testing FAQ1", "Coded style!" }), true, false));
- break;
- //Request for body of a faq/info selection
- case 0x01D1:
- FaqBodyRequestPacket faqBodyRequest = new FaqBodyRequestPacket(subpacket.data);
- client.QueuePacket(BasePacket.CreatePacket(FaqBodyResponsePacket.BuildPacket(session.id, "HERE IS A GIANT BODY. Nothing else to say!"), true, false));
- break;
- //Request issue list
- case 0x01D2:
- GMTicketIssuesRequestPacket issuesRequest = new GMTicketIssuesRequestPacket(subpacket.data);
- client.QueuePacket(BasePacket.CreatePacket(IssueListResponsePacket.BuildPacket(session.id, new string[] { "Test1", "Test2", "Test3", "Test4", "Test5" }), true, false));
- break;
- //Request if GM ticket exists
- case 0x01D3:
- client.QueuePacket(BasePacket.CreatePacket(StartGMTicketPacket.BuildPacket(session.id, false), true, false));
- break;
- //Request for GM response message
- case 0x01D4:
- client.QueuePacket(BasePacket.CreatePacket(GMTicketPacket.BuildPacket(session.id, "This is a GM Ticket Title", "This is a GM Ticket Body."), true, false));
- break;
- //GM Ticket Sent
- case 0x01D5:
- GMSupportTicketPacket gmTicket = new GMSupportTicketPacket(subpacket.data);
- Program.Log.Info("Got GM Ticket: \n" + gmTicket.ticketTitle + "\n" + gmTicket.ticketBody);
- client.QueuePacket(BasePacket.CreatePacket(GMTicketSentResponsePacket.BuildPacket(session.id, true), true, false));
- break;
- //Request to end ticket
- case 0x01D6:
- client.QueuePacket(BasePacket.CreatePacket(EndGMTicketPacket.BuildPacket(session.id), true, false));
- break;
- default:
- Program.Log.Debug("Unknown command 0x{0:X} received.", subpacket.gameMessage.opcode);
- subpacket.DebugPrintSubPacket();
- break;
- }
-
- }
-
- }
-}
+ break;
+ /* RECRUITMENT */
+ //Start Recruiting
+ case 0x01C3:
+ StartRecruitingRequestPacket recruitRequestPacket = new StartRecruitingRequestPacket(subpacket.data);
+ client.QueuePacket(BasePacket.CreatePacket(StartRecruitingResponse.BuildPacket(session.id, true), true, false));
+ break;
+ //End Recruiting
+ case 0x01C4:
+ client.QueuePacket(BasePacket.CreatePacket(EndRecruitmentPacket.BuildPacket(session.id), true, false));
+ break;
+ //Party Window Opened, Request State
+ case 0x01C5:
+ client.QueuePacket(BasePacket.CreatePacket(RecruiterStatePacket.BuildPacket(session.id, false, false, 0), true, false));
+ 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;
+ client.QueuePacket(BasePacket.CreatePacket(CurrentRecruitmentDetailsPacket.BuildPacket(session.id, details), true, false));
+ break;
+ //Accepted Recruiting
+ case 0x01C6:
+ subpacket.DebugPrintSubPacket();
+ break;
+ /* SOCIAL STUFF */
+ case 0x01C9:
+ AddRemoveSocialPacket addBlackList = new AddRemoveSocialPacket(subpacket.data);
+ client.QueuePacket(BasePacket.CreatePacket(BlacklistAddedPacket.BuildPacket(session.id, true, addBlackList.name), true, false));
+ break;
+ case 0x01CA:
+ AddRemoveSocialPacket RemoveBlackList = new AddRemoveSocialPacket(subpacket.data);
+ client.QueuePacket(BasePacket.CreatePacket(BlacklistRemovedPacket.BuildPacket(session.id, true, RemoveBlackList.name), true, false));
+ break;
+ case 0x01CB:
+ int offset1 = 0;
+ client.QueuePacket(BasePacket.CreatePacket(SendBlacklistPacket.BuildPacket(session.id, new String[] { "Test" }, ref offset1), true, false));
+ break;
+ case 0x01CC:
+ AddRemoveSocialPacket addFriendList = new AddRemoveSocialPacket(subpacket.data);
+ client.QueuePacket(BasePacket.CreatePacket(FriendlistAddedPacket.BuildPacket(session.id, true, (uint)addFriendList.name.GetHashCode(), true, addFriendList.name), true, false));
+ break;
+ case 0x01CD:
+ AddRemoveSocialPacket RemoveFriendList = new AddRemoveSocialPacket(subpacket.data);
+ client.QueuePacket(BasePacket.CreatePacket(FriendlistRemovedPacket.BuildPacket(session.id, true, RemoveFriendList.name), true, false));
+ break;
+ case 0x01CE:
+ int offset2 = 0;
+ client.QueuePacket(BasePacket.CreatePacket(SendFriendlistPacket.BuildPacket(session.id, new Tuple[] { new Tuple(01, "Test2") }, ref offset2), true, false));
+ break;
+ case 0x01CF:
+ client.QueuePacket(BasePacket.CreatePacket(FriendStatusPacket.BuildPacket(session.id, null), true, false));
+ break;
+ /* SUPPORT DESK STUFF */
+ //Request for FAQ/Info List
+ case 0x01D0:
+ FaqListRequestPacket faqRequest = new FaqListRequestPacket(subpacket.data);
+ client.QueuePacket(BasePacket.CreatePacket(FaqListResponsePacket.BuildPacket(session.id, new string[] { "Testing FAQ1", "Coded style!" }), true, false));
+ break;
+ //Request for body of a faq/info selection
+ case 0x01D1:
+ FaqBodyRequestPacket faqBodyRequest = new FaqBodyRequestPacket(subpacket.data);
+ client.QueuePacket(BasePacket.CreatePacket(FaqBodyResponsePacket.BuildPacket(session.id, "HERE IS A GIANT BODY. Nothing else to say!"), true, false));
+ break;
+ //Request issue list
+ case 0x01D2:
+ GMTicketIssuesRequestPacket issuesRequest = new GMTicketIssuesRequestPacket(subpacket.data);
+ client.QueuePacket(BasePacket.CreatePacket(IssueListResponsePacket.BuildPacket(session.id, new string[] { "Test1", "Test2", "Test3", "Test4", "Test5" }), true, false));
+ break;
+ //Request if GM ticket exists
+ case 0x01D3:
+ client.QueuePacket(BasePacket.CreatePacket(StartGMTicketPacket.BuildPacket(session.id, false), true, false));
+ break;
+ //Request for GM response message
+ case 0x01D4:
+ client.QueuePacket(BasePacket.CreatePacket(GMTicketPacket.BuildPacket(session.id, "This is a GM Ticket Title", "This is a GM Ticket Body."), true, false));
+ break;
+ //GM Ticket Sent
+ case 0x01D5:
+ GMSupportTicketPacket gmTicket = new GMSupportTicketPacket(subpacket.data);
+ Program.Log.Info("Got GM Ticket: \n" + gmTicket.ticketTitle + "\n" + gmTicket.ticketBody);
+ client.QueuePacket(BasePacket.CreatePacket(GMTicketSentResponsePacket.BuildPacket(session.id, true), true, false));
+ break;
+ //Request to end ticket
+ case 0x01D6:
+ client.QueuePacket(BasePacket.CreatePacket(EndGMTicketPacket.BuildPacket(session.id), true, false));
+ break;
+ default:
+ Program.Log.Debug("Unknown command 0x{0:X} received.", subpacket.gameMessage.opcode);
+ subpacket.DebugPrintSubPacket();
+ break;
+ }
+
+ }
+
+ }
+}
diff --git a/FFXIVClassic Map Server/WorldManager.cs b/FFXIVClassic Map Server/WorldManager.cs
index 2e309df7..06272490 100644
--- a/FFXIVClassic Map Server/WorldManager.cs
+++ b/FFXIVClassic Map Server/WorldManager.cs
@@ -111,6 +111,7 @@ namespace FFXIVClassic_Map_Server
id,
parentZoneId,
privateAreaName,
+ privateAreaType,
className,
dayMusic,
nightMusic,
@@ -129,7 +130,7 @@ namespace FFXIVClassic_Map_Server
if (zoneList.ContainsKey(parentZoneId))
{
Zone parent = zoneList[parentZoneId];
- PrivateArea privArea = new PrivateArea(parent, reader.GetUInt32("id"), reader.GetString("className"), reader.GetString("privateAreaName"), 1, reader.GetUInt16("dayMusic"), reader.GetUInt16("nightMusic"), reader.GetUInt16("battleMusic"));
+ PrivateArea privArea = new PrivateArea(parent, reader.GetUInt32("id"), reader.GetString("className"), reader.GetString("privateAreaName"), reader.GetUInt32("privateAreaType"), reader.GetUInt16("dayMusic"), reader.GetUInt16("nightMusic"), reader.GetUInt16("battleMusic"));
parent.AddPrivateArea(privArea);
}
else
@@ -184,7 +185,7 @@ namespace FFXIVClassic_Map_Server
if (!reader.IsDBNull(7))
privArea = reader.GetString(7);
- ZoneEntrance entance = new ZoneEntrance(reader.GetUInt32(1), privArea, reader.GetByte(2), reader.GetFloat(3), reader.GetFloat(4), reader.GetFloat(5), reader.GetFloat(6));
+ ZoneEntrance entance = new ZoneEntrance(reader.GetUInt32(1), privArea, 1, reader.GetByte(2), reader.GetFloat(3), reader.GetFloat(4), reader.GetFloat(5), reader.GetFloat(6));
zoneEntranceList[id] = entance;
count++;
}
@@ -548,19 +549,19 @@ namespace FFXIVClassic_Map_Server
}
ZoneEntrance ze = zoneEntranceList[zoneEntrance];
- DoZoneChange(player, ze.zoneId, ze.privateAreaName, ze.spawnType, ze.spawnX, ze.spawnY, ze.spawnZ, ze.spawnRotation);
+ DoZoneChange(player, ze.zoneId, ze.privateAreaName, ze.privateAreaType, ze.spawnType, ze.spawnX, ze.spawnY, ze.spawnZ, ze.spawnRotation);
}
//Moves actor to new zone, and sends packets to spawn at the given coords.
- public void DoZoneChange(Player player, uint destinationZoneId, string destinationPrivateArea, byte spawnType, float spawnX, float spawnY, float spawnZ, float spawnRotation)
+ public void DoZoneChange(Player player, uint destinationZoneId, string destinationPrivateArea, int destinationPrivateAreaType, byte spawnType, float spawnX, float spawnY, float spawnZ, float spawnRotation)
{
//Add player to new zone and update
Area newArea;
if (destinationPrivateArea == null)
newArea = GetZone(destinationZoneId);
- else
- newArea = GetZone(destinationZoneId).GetPrivateArea(destinationPrivateArea, 0);
+ else //Add check for -1 if it is a instance
+ newArea = GetZone(destinationZoneId).GetPrivateArea(destinationPrivateArea, (uint)destinationPrivateAreaType);
//This server does not contain that zoneId
if (newArea == null)
@@ -581,6 +582,9 @@ namespace FFXIVClassic_Map_Server
//Update player actor's properties
player.zoneId = newArea.actorId;
+
+ player.privateArea = newArea is PrivateArea ? ((PrivateArea)newArea).GetPrivateAreaName() : null;
+ player.privateAreaType = newArea is PrivateArea ? ((PrivateArea)newArea).GetPrivateAreaType() : 0;
player.zone = newArea;
player.positionX = spawnX;
player.positionY = spawnY;
@@ -589,11 +593,15 @@ namespace FFXIVClassic_Map_Server
//Send packets
player.playerSession.QueuePacket(DeleteAllActorsPacket.BuildPacket(player.actorId), true, false);
- player.playerSession.QueuePacket(_0xE2Packet.BuildPacket(player.actorId, 0x0), true, false);
+ player.playerSession.QueuePacket(_0xE2Packet.BuildPacket(player.actorId, 0x10), true, false);
player.SendZoneInPackets(this, spawnType);
player.playerSession.ClearInstance();
player.SendInstanceUpdate();
+ //Send "You have entered an instance" if it's a Private Area
+ if (newArea is PrivateArea)
+ player.SendGameMessage(GetActor(), 34108, 0x20);
+
LuaEngine.OnZoneIn(player);
}
@@ -630,7 +638,7 @@ namespace FFXIVClassic_Map_Server
player.rotation = spawnRotation;
//Send packets
- player.playerSession.QueuePacket(_0xE2Packet.BuildPacket(player.actorId, 0x0), true, false);
+ player.playerSession.QueuePacket(_0xE2Packet.BuildPacket(player.actorId, 0x10), true, false);
player.playerSession.QueuePacket(player.CreateSpawnTeleportPacket(player.actorId, spawnType), true, false);
player.SendInstanceUpdate();
@@ -845,6 +853,17 @@ namespace FFXIVClassic_Map_Server
return null;
}
+ public Actor GetActorInWorldByUniqueId(string uid)
+ {
+ foreach (Zone zone in zoneList.Values)
+ {
+ Actor a = zone.FindActorInZoneByUniqueID(uid);
+ if (a != null)
+ return a;
+ }
+ return null;
+ }
+
public Player GetPCInWorld(uint charId)
{
foreach (Zone zone in zoneList.Values)
@@ -863,6 +882,14 @@ namespace FFXIVClassic_Map_Server
return zoneList[zoneId];
}
+ public PrivateArea GetPrivateArea(uint zoneId, string privateArea, uint privateAreaType)
+ {
+ if (!zoneList.ContainsKey(zoneId))
+ return null;
+
+ return zoneList[zoneId].GetPrivateArea(privateArea, privateAreaType);
+ }
+
public WorldMaster GetActor()
{
return worldMaster;
@@ -877,16 +904,18 @@ namespace FFXIVClassic_Map_Server
{
public uint zoneId;
public string privateAreaName;
+ public int privateAreaType;
public byte spawnType;
public float spawnX;
public float spawnY;
public float spawnZ;
public float spawnRotation;
- public ZoneEntrance(uint zoneId, string privateAreaName, byte spawnType, float x, float y, float z, float rot)
+ public ZoneEntrance(uint zoneId, string privateAreaName, int privateAreaType, byte spawnType, float x, float y, float z, float rot)
{
this.zoneId = zoneId;
this.privateAreaName = privateAreaName;
+ this.privateAreaType = privateAreaType;
this.spawnType = spawnType;
this.spawnX = x;
this.spawnY = y;
diff --git a/FFXIVClassic Map Server/actors/Actor.cs b/FFXIVClassic Map Server/actors/Actor.cs
index 914dc1ad..085fdc65 100644
--- a/FFXIVClassic Map Server/actors/Actor.cs
+++ b/FFXIVClassic Map Server/actors/Actor.cs
@@ -28,6 +28,8 @@ namespace FFXIVClassic_Map_Server.Actors
public float[] moveSpeeds = new float[4];
public uint zoneId, zoneId2;
+ public string privateArea;
+ public uint privateAreaType;
public Area zone = null;
public Area zone2 = null;
public bool isZoning = false;
@@ -351,7 +353,7 @@ namespace FFXIVClassic_Map_Server.Actors
uint zoneId = zone.actorId;
uint privLevel = 0;
if (zone is PrivateArea)
- privLevel = ((PrivateArea)zone).GetPrivateAreaLevel();
+ privLevel = ((PrivateArea)zone).GetPrivateAreaType();
actorName = String.Format("{0}_{1}_{2}@{3:X3}{4:X2}", className, zoneName, classNumber, zoneId, privLevel);
}
diff --git a/FFXIVClassic Map Server/actors/area/Area.cs b/FFXIVClassic Map Server/actors/area/Area.cs
index 33d5ef4c..94c72444 100644
--- a/FFXIVClassic Map Server/actors/area/Area.cs
+++ b/FFXIVClassic Map Server/actors/area/Area.cs
@@ -298,6 +298,19 @@ namespace FFXIVClassic_Map_Server.Actors
if (!mActorList.ContainsKey(id))
return null;
return mActorList[id];
+ }
+
+ public Actor FindActorInZoneByUniqueID(string uniqueId)
+ {
+ foreach (Actor a in mActorList.Values)
+ {
+ if (a is Npc)
+ {
+ if (((Npc)a).GetUniqueId().ToLower().Equals(uniqueId))
+ return a;
+ }
+ }
+ return null;
}
public Player FindPCInZone(string name)
@@ -360,7 +373,16 @@ namespace FFXIVClassic_Map_Server.Actors
if (actorClass == null)
return;
- Npc npc = new Npc(mActorList.Count + 1, actorClass, location.uniqueId, actorId, location.x, location.y, location.z, location.rot, location.state, location.animId, null);
+ uint zoneId;
+
+ if (this is PrivateArea)
+ zoneId = ((PrivateArea)this).GetParentZone().actorId;
+ else
+ zoneId = actorId;
+
+ Npc npc = new Npc(mActorList.Count + 1, actorClass, location.uniqueId, this, location.x, location.y, location.z, location.rot, location.state, location.animId, null);
+
+
npc.LoadEventConditions(actorClass.eventConditions);
AddActorToZone(npc);
diff --git a/FFXIVClassic Map Server/actors/area/PrivateArea.cs b/FFXIVClassic Map Server/actors/area/PrivateArea.cs
index 340648e5..87080fa6 100644
--- a/FFXIVClassic Map Server/actors/area/PrivateArea.cs
+++ b/FFXIVClassic Map Server/actors/area/PrivateArea.cs
@@ -15,14 +15,14 @@ namespace FFXIVClassic_Map_Server.actors.area
{
private Zone parentZone;
private string privateAreaName;
- private uint privateAreaLevel;
+ private uint privateAreaType;
- public PrivateArea(Zone parent, uint id, string className, string privateAreaName, uint privateAreaLevel, ushort bgmDay, ushort bgmNight, ushort bgmBattle)
+ public PrivateArea(Zone parent, uint id, string className, string privateAreaName, uint privateAreaType, ushort bgmDay, ushort bgmNight, ushort bgmBattle)
: base(id, parent.zoneName, parent.regionId, className, bgmDay, bgmNight, bgmBattle, parent.isIsolated, parent.isInn, parent.canRideChocobo, parent.canStealth, true)
{
this.parentZone = parent;
this.privateAreaName = privateAreaName;
- this.privateAreaLevel = privateAreaLevel;
+ this.privateAreaType = privateAreaType;
}
public string GetPrivateAreaName()
@@ -30,9 +30,9 @@ namespace FFXIVClassic_Map_Server.actors.area
return privateAreaName;
}
- public uint GetPrivateAreaLevel()
+ public uint GetPrivateAreaType()
{
- return privateAreaLevel;
+ return privateAreaType;
}
public Zone GetParentZone()
@@ -46,12 +46,11 @@ namespace FFXIVClassic_Map_Server.actors.area
string path = className;
- if (className.ToLower().Contains("content"))
- path = "Content/" + className;
+ string realClassName = className.Substring(className.LastIndexOf("/") + 1);
- lParams = LuaUtils.CreateLuaParamList("/Area/PrivateArea/" + path, false, true, zoneName, privateAreaName, 0x9E, canRideChocobo ? (byte)1 : (byte)0, canStealth, isInn, false, false, false, false, false, false);
- ActorInstantiatePacket.BuildPacket(actorId, playerActorId, actorName, className, lParams).DebugPrintSubPacket();
- return ActorInstantiatePacket.BuildPacket(actorId, playerActorId, actorName, className, lParams);
+ lParams = LuaUtils.CreateLuaParamList("/Area/PrivateArea" + path, false, true, zoneName, privateAreaName, privateAreaType, canRideChocobo ? (byte)1 : (byte)0, canStealth, isInn, false, false, false, false, false, false);
+ ActorInstantiatePacket.BuildPacket(actorId, playerActorId, actorName, realClassName, lParams).DebugPrintSubPacket();
+ return ActorInstantiatePacket.BuildPacket(actorId, playerActorId, actorName, realClassName, lParams);
}
diff --git a/FFXIVClassic Map Server/actors/area/Zone.cs b/FFXIVClassic Map Server/actors/area/Zone.cs
index e0c41e44..c3509458 100644
--- a/FFXIVClassic Map Server/actors/area/Zone.cs
+++ b/FFXIVClassic Map Server/actors/area/Zone.cs
@@ -16,6 +16,7 @@ namespace FFXIVClassic_Map_Server.actors.area
class Zone : Area
{
Dictionary> privateAreas = new Dictionary>();
+ Dictionary> instancedPrivateAreas = new Dictionary>();
public Zone(uint id, string zoneName, ushort regionId, string className, ushort bgmDay, ushort bgmNight, ushort bgmBattle, bool isIsolated, bool isInn, bool canRideChocobo, bool canStealth, bool isInstanceRaid)
: base(id, zoneName, regionId, className, bgmDay, bgmNight, bgmBattle, isIsolated, isInn, canRideChocobo, canStealth, isInstanceRaid)
@@ -26,11 +27,11 @@ namespace FFXIVClassic_Map_Server.actors.area
public void AddPrivateArea(PrivateArea pa)
{
if (privateAreas.ContainsKey(pa.GetPrivateAreaName()))
- privateAreas[pa.GetPrivateAreaName()][0] = pa;
+ privateAreas[pa.GetPrivateAreaName()][pa.GetPrivateAreaType()] = pa;
else
{
privateAreas[pa.GetPrivateAreaName()] = new Dictionary();
- privateAreas[pa.GetPrivateAreaName()][0] = pa;
+ privateAreas[pa.GetPrivateAreaName()][pa.GetPrivateAreaType()] = pa;
}
}
diff --git a/FFXIVClassic Map Server/actors/chara/npc/Npc.cs b/FFXIVClassic Map Server/actors/chara/npc/Npc.cs
index 1fc8389f..fac897d6 100644
--- a/FFXIVClassic Map Server/actors/chara/npc/Npc.cs
+++ b/FFXIVClassic Map Server/actors/chara/npc/Npc.cs
@@ -1,10 +1,10 @@
using FFXIVClassic.Common;
using FFXIVClassic_Map_Server.actors;
+using FFXIVClassic_Map_Server.actors.area;
using FFXIVClassic_Map_Server.actors.chara.npc;
using FFXIVClassic_Map_Server.Actors.Chara;
using FFXIVClassic_Map_Server.dataobjects;
using FFXIVClassic_Map_Server.lua;
-
using FFXIVClassic_Map_Server.packets.receive.events;
using FFXIVClassic_Map_Server.packets.send.actor;
using FFXIVClassic_Map_Server.utils;
@@ -27,8 +27,8 @@ namespace FFXIVClassic_Map_Server.Actors
public NpcWork npcWork = new NpcWork();
- public Npc(int actorNumber, ActorClass actorClass, string uniqueId, uint zoneId, float posX, float posY, float posZ, float rot, ushort actorState, uint animationId, string customDisplayName)
- : base((4 << 28 | zoneId << 19 | (uint)actorNumber))
+ public Npc(int actorNumber, ActorClass actorClass, string uniqueId, Area spawnedArea, float posX, float posY, float posZ, float rot, ushort actorState, uint animationId, string customDisplayName)
+ : base((4 << 28 | spawnedArea.actorId << 19 | (uint)actorNumber))
{
this.positionX = posX;
this.positionY = posY;
@@ -41,8 +41,8 @@ namespace FFXIVClassic_Map_Server.Actors
this.uniqueIdentifier = uniqueId;
- this.zoneId = zoneId;
- this.zone = Server.GetWorldManager().GetZone(zoneId);
+ this.zoneId = spawnedArea.actorId;
+ this.zone = spawnedArea;
this.actorClassId = actorClass.actorClassId;
@@ -131,8 +131,12 @@ namespace FFXIVClassic_Map_Server.Actors
subpackets.AddRange(GetEventConditionPackets(playerActorId));
subpackets.Add(CreateSpeedPacket(playerActorId));
subpackets.Add(CreateSpawnPositonPacket(playerActorId, 0x0));
-
- if (uniqueIdentifier.Equals("door2"))
+
+ if (uniqueIdentifier.Equals("door1"))
+ {
+ subpackets.Add(_0xD8Packet.BuildPacket(actorId, playerActorId, 0xB0D, 0x1af));
+ }
+ else if (uniqueIdentifier.Equals("door2"))
{
subpackets.Add(_0xD8Packet.BuildPacket(actorId, playerActorId, 0xB09, 0x1af));
}
@@ -167,16 +171,16 @@ namespace FFXIVClassic_Map_Server.Actors
}
else if (actorClassId == 5900013)
{
- uint id = 2;
- uint id2 = 5144;
- string val = "fdot";
+ uint id = 201;
+ uint id2 = 0x1415;
+ string val = "fdin";
subpackets.Add(_0xD8Packet.BuildPacket(actorId, playerActorId, id, id2));
subpackets.Add(_0xD9Packet.BuildPacket(actorId, playerActorId, val));
}
else if (actorClassId == 5900014)
{
- uint id = 2;
- uint id2 = 5145;
+ uint id = 201;
+ uint id2 = 0x1415;
string val = "fdot";
subpackets.Add(_0xD8Packet.BuildPacket(actorId, playerActorId, id, id2));
subpackets.Add(_0xD9Packet.BuildPacket(actorId, playerActorId, val));
@@ -374,8 +378,17 @@ namespace FFXIVClassic_Map_Server.Actors
if (File.Exists("./scripts/base/" + classPath + ".lua"))
parent = LuaEngine.LoadScript("./scripts/base/" + classPath + ".lua");
- if (File.Exists(String.Format("./scripts/unique/{0}/{1}/{2}.lua", zone.zoneName, className, uniqueIdentifier)))
- child = LuaEngine.LoadScript(String.Format("./scripts/unique/{0}/{1}/{2}.lua", zone.zoneName, className, uniqueIdentifier));
+
+ if (zone is PrivateArea)
+ {
+ if (File.Exists(String.Format("./scripts/unique/{0}/privatearea/{1}/{2}/{3}.lua", zone.zoneName, ((PrivateArea)zone).GetPrivateAreaName(), className, uniqueIdentifier)))
+ child = LuaEngine.LoadScript(String.Format("./scripts/unique/{0}/privatearea/{1}/{2}/{3}.lua", zone.zoneName, ((PrivateArea)zone).GetPrivateAreaName(), className, uniqueIdentifier));
+ }
+ else
+ {
+ if (File.Exists(String.Format("./scripts/unique/{0}/{1}/{2}.lua", zone.zoneName, className, uniqueIdentifier)))
+ child = LuaEngine.LoadScript(String.Format("./scripts/unique/{0}/{1}/{2}.lua", zone.zoneName, className, uniqueIdentifier));
+ }
if (parent == null && child == null)
{
@@ -402,8 +415,16 @@ namespace FFXIVClassic_Map_Server.Actors
if (File.Exists("./scripts/base/" + classPath + ".lua"))
parent = LuaEngine.LoadScript("./scripts/base/" + classPath + ".lua");
- if (File.Exists(String.Format("./scripts/unique/{0}/{1}/{2}.lua", zone.zoneName, className, uniqueIdentifier)))
- child = LuaEngine.LoadScript(String.Format("./scripts/unique/{0}/{1}/{2}.lua", zone.zoneName, className, uniqueIdentifier));
+ if (zone is PrivateArea)
+ {
+ if (File.Exists(String.Format("./scripts/unique/{0}/privatearea/{1}/{2}/{3}.lua", zone.zoneName, ((PrivateArea)zone).GetPrivateAreaName(), className, uniqueIdentifier)))
+ child = LuaEngine.LoadScript(String.Format("./scripts/unique/{0}/privatearea/{1}/{2}/{3}.lua", zone.zoneName, ((PrivateArea)zone).GetPrivateAreaName(), className, uniqueIdentifier));
+ }
+ else
+ {
+ if (File.Exists(String.Format("./scripts/unique/{0}/{1}/{2}.lua", zone.zoneName, className, uniqueIdentifier)))
+ child = LuaEngine.LoadScript(String.Format("./scripts/unique/{0}/{1}/{2}.lua", zone.zoneName, className, uniqueIdentifier));
+ }
if (parent == null && child == null)
{
diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs
index dbe495ea..26b17698 100644
--- a/FFXIVClassic Map Server/actors/chara/player/Player.cs
+++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs
@@ -1,524 +1,538 @@
-using FFXIVClassic.Common;
-
-using FFXIVClassic_Map_Server.actors.chara.player;
-using FFXIVClassic_Map_Server.actors.director;
-using FFXIVClassic_Map_Server.dataobjects;
-using FFXIVClassic_Map_Server.dataobjects.chara;
-using FFXIVClassic_Map_Server.lua;
-using FFXIVClassic_Map_Server.packets.send;
-using FFXIVClassic_Map_Server.packets.send.actor;
-using FFXIVClassic_Map_Server.packets.send.events;
-using FFXIVClassic_Map_Server.packets.send.player;
-using FFXIVClassic_Map_Server.utils;
-using System;
-using System.Collections.Generic;
-using MoonSharp.Interpreter;
-using FFXIVClassic_Map_Server.packets.receive.events;
+using FFXIVClassic.Common;
+
+using FFXIVClassic_Map_Server.actors.chara.player;
+using FFXIVClassic_Map_Server.actors.director;
+using FFXIVClassic_Map_Server.dataobjects;
+using FFXIVClassic_Map_Server.dataobjects.chara;
+using FFXIVClassic_Map_Server.lua;
+using FFXIVClassic_Map_Server.packets.send;
+using FFXIVClassic_Map_Server.packets.send.actor;
+using FFXIVClassic_Map_Server.packets.send.events;
+using FFXIVClassic_Map_Server.packets.send.player;
+using FFXIVClassic_Map_Server.utils;
+using System;
+using System.Collections.Generic;
+using MoonSharp.Interpreter;
+using FFXIVClassic_Map_Server.packets.receive.events;
using FFXIVClassic_Map_Server.packets.send.actor.inventory;
using FFXIVClassic_Map_Server.actors.group;
using FFXIVClassic_Map_Server.packets.send.group;
using FFXIVClassic_Map_Server.packets.WorldPackets.Send.Group;
-namespace FFXIVClassic_Map_Server.Actors
-{
- class Player : Character
- {
- public const int CLASSID_PUG = 2;
- public const int CLASSID_GLA = 3;
- public const int CLASSID_MRD = 4;
- public const int CLASSID_ARC = 7;
- public const int CLASSID_LNC = 8;
- public const int CLASSID_THM = 22;
- public const int CLASSID_CNJ = 23;
-
- public const int CLASSID_CRP = 29;
- public const int CLASSID_BSM = 30;
- public const int CLASSID_ARM = 31;
- public const int CLASSID_GSM = 32;
- public const int CLASSID_LTW = 33;
- public const int CLASSID_WVR = 34;
- public const int CLASSID_ALC = 35;
- public const int CLASSID_CUL = 36;
-
- public const int CLASSID_MIN = 39;
- public const int CLASSID_BTN = 40;
- public const int CLASSID_FSH = 41;
-
- public const int MAXSIZE_INVENTORY_NORMAL = 200;
- public const int MAXSIZE_INVENTORY_CURRANCY = 320;
- public const int MAXSIZE_INVENTORY_KEYITEMS = 500;
- public const int MAXSIZE_INVENTORY_LOOT = 10;
- public const int MAXSIZE_INVENTORY_MELDREQUEST = 4;
- public const int MAXSIZE_INVENTORY_BAZAAR = 10;
- public const int MAXSIZE_INVENTORY_EQUIPMENT = 35;
-
- public const int TIMER_TOTORAK = 0;
- public const int TIMER_DZEMAEL = 1;
- public const int TIMER_BOWL_OF_EMBERS_HARD = 2;
- public const int TIMER_BOWL_OF_EMBERS = 3;
- public const int TIMER_THORNMARCH = 4;
- public const int TIMER_AURUMVALE = 5;
- public const int TIMER_CUTTERSCRY = 6;
- public const int TIMER_BATTLE_ALEPORT = 7;
- public const int TIMER_BATTLE_HYRSTMILL = 8;
- public const int TIMER_BATTLE_GOLDENBAZAAR = 9;
- public const int TIMER_HOWLING_EYE_HARD = 10;
- public const int TIMER_HOWLING_EYE = 11;
- public const int TIMER_CASTRUM_TOWER = 12;
- public const int TIMER_BOWL_OF_EMBERS_EXTREME = 13;
- public const int TIMER_RIVENROAD = 14;
- public const int TIMER_RIVENROAD_HARD = 15;
- public const int TIMER_BEHEST = 16;
- public const int TIMER_COMPANYBEHEST = 17;
- public const int TIMER_RETURN = 18;
- public const int TIMER_SKIRMISH = 19;
-
- public static int[] MAXEXP = {570, 700, 880, 1100, 1500, 1800, 2300, 3200, 4300, 5000, //Level <= 10
- 5900, 6800, 7700, 8700, 9700, 11000, 12000, 13000, 15000, 16000, //Level <= 20
- 20000, 22000, 23000, 25000, 27000, 29000, 31000, 33000, 35000, 38000, //Level <= 30
- 45000, 47000, 50000, 53000, 56000, 59000, 62000, 65000, 68000, 71000, //Level <= 40
- 74000, 78000, 81000, 85000, 89000, 92000, 96000, 100000, 100000, 110000}; //Level <= 50
-
- //Event Related
- public uint currentEventOwner = 0;
- public string currentEventName = "";
-
- public Coroutine currentEventRunning;
-
+namespace FFXIVClassic_Map_Server.Actors
+{
+ class Player : Character
+ {
+ public const int CLASSID_PUG = 2;
+ public const int CLASSID_GLA = 3;
+ public const int CLASSID_MRD = 4;
+ public const int CLASSID_ARC = 7;
+ public const int CLASSID_LNC = 8;
+ public const int CLASSID_THM = 22;
+ public const int CLASSID_CNJ = 23;
+
+ public const int CLASSID_CRP = 29;
+ public const int CLASSID_BSM = 30;
+ public const int CLASSID_ARM = 31;
+ public const int CLASSID_GSM = 32;
+ public const int CLASSID_LTW = 33;
+ public const int CLASSID_WVR = 34;
+ public const int CLASSID_ALC = 35;
+ public const int CLASSID_CUL = 36;
+
+ public const int CLASSID_MIN = 39;
+ public const int CLASSID_BTN = 40;
+ public const int CLASSID_FSH = 41;
+
+ public const int MAXSIZE_INVENTORY_NORMAL = 200;
+ public const int MAXSIZE_INVENTORY_CURRANCY = 320;
+ public const int MAXSIZE_INVENTORY_KEYITEMS = 500;
+ public const int MAXSIZE_INVENTORY_LOOT = 10;
+ public const int MAXSIZE_INVENTORY_MELDREQUEST = 4;
+ public const int MAXSIZE_INVENTORY_BAZAAR = 10;
+ public const int MAXSIZE_INVENTORY_EQUIPMENT = 35;
+
+ public const int TIMER_TOTORAK = 0;
+ public const int TIMER_DZEMAEL = 1;
+ public const int TIMER_BOWL_OF_EMBERS_HARD = 2;
+ public const int TIMER_BOWL_OF_EMBERS = 3;
+ public const int TIMER_THORNMARCH = 4;
+ public const int TIMER_AURUMVALE = 5;
+ public const int TIMER_CUTTERSCRY = 6;
+ public const int TIMER_BATTLE_ALEPORT = 7;
+ public const int TIMER_BATTLE_HYRSTMILL = 8;
+ public const int TIMER_BATTLE_GOLDENBAZAAR = 9;
+ public const int TIMER_HOWLING_EYE_HARD = 10;
+ public const int TIMER_HOWLING_EYE = 11;
+ public const int TIMER_CASTRUM_TOWER = 12;
+ public const int TIMER_BOWL_OF_EMBERS_EXTREME = 13;
+ public const int TIMER_RIVENROAD = 14;
+ public const int TIMER_RIVENROAD_HARD = 15;
+ public const int TIMER_BEHEST = 16;
+ public const int TIMER_COMPANYBEHEST = 17;
+ public const int TIMER_RETURN = 18;
+ public const int TIMER_SKIRMISH = 19;
+
+ public static int[] MAXEXP = {570, 700, 880, 1100, 1500, 1800, 2300, 3200, 4300, 5000, //Level <= 10
+ 5900, 6800, 7700, 8700, 9700, 11000, 12000, 13000, 15000, 16000, //Level <= 20
+ 20000, 22000, 23000, 25000, 27000, 29000, 31000, 33000, 35000, 38000, //Level <= 30
+ 45000, 47000, 50000, 53000, 56000, 59000, 62000, 65000, 68000, 71000, //Level <= 40
+ 74000, 78000, 81000, 85000, 89000, 92000, 96000, 100000, 100000, 110000}; //Level <= 50
+
+ //Event Related
+ public uint currentEventOwner = 0;
+ public string currentEventName = "";
+
+ public Coroutine currentEventRunning;
+
//Player Info
public uint destinationZone;
- public ushort destinationSpawnType;
- public uint[] timers = new uint[20];
- public ushort currentJob;
- public uint currentTitle;
- public uint playTime;
- public uint lastPlayTimeUpdate;
- public bool isGM = false;
- public bool isZoneChanging = true;
-
- //Inventory
- private Dictionary inventories = new Dictionary();
- private Equipment equipment;
-
- //GC Related
- public byte gcCurrent;
- public byte gcRankLimsa;
- public byte gcRankGridania;
- public byte gcRankUldah;
-
- //Mount Related
- public bool hasChocobo;
- public bool hasGoobbue;
- public byte chocoboAppearance;
- public string chocoboName;
- public byte mountState = 0;
-
- public uint achievementPoints;
-
- //Property Array Request Stuff
- private int lastPosition = 0;
- private int lastStep = 0;
-
- //Quest Actors (MUST MATCH playerWork.questScenario/questGuildleve)
- public Quest[] questScenario = new Quest[16];
+ public ushort destinationSpawnType;
+ public uint[] timers = new uint[20];
+ public ushort currentJob;
+ public uint currentTitle;
+ public uint playTime;
+ public uint lastPlayTimeUpdate;
+ public bool isGM = false;
+ public bool isZoneChanging = true;
+
+ //Inventory
+ private Dictionary inventories = new Dictionary();
+ private Equipment equipment;
+
+ //GC Related
+ public byte gcCurrent;
+ public byte gcRankLimsa;
+ public byte gcRankGridania;
+ public byte gcRankUldah;
+
+ //Mount Related
+ public bool hasChocobo;
+ public bool hasGoobbue;
+ public byte chocoboAppearance;
+ public string chocoboName;
+ public byte mountState = 0;
+
+ public uint achievementPoints;
+
+ //Property Array Request Stuff
+ private int lastPosition = 0;
+ private int lastStep = 0;
+
+ //Quest Actors (MUST MATCH playerWork.questScenario/questGuildleve)
+ public Quest[] questScenario = new Quest[16];
public Quest[] questGuildleve = new Quest[8];
- private List ownedDirectors = new List();
- private Director loginInitDirector = null;
-
- public PlayerWork playerWork = new PlayerWork();
-
- public Session playerSession;
-
- public Player(Session cp, uint actorID) : base(actorID)
- {
- playerSession = cp;
- actorName = String.Format("_pc{0:00000000}", actorID);
- className = "Player";
- currentSubState = SetActorStatePacket.SUB_STATE_PLAYER;
-
- inventories[Inventory.NORMAL] = new Inventory(this, MAXSIZE_INVENTORY_NORMAL, Inventory.NORMAL);
- inventories[Inventory.KEYITEMS] = new Inventory(this, MAXSIZE_INVENTORY_KEYITEMS, Inventory.KEYITEMS);
- inventories[Inventory.CURRENCY] = new Inventory(this, MAXSIZE_INVENTORY_CURRANCY, Inventory.CURRENCY);
- inventories[Inventory.MELDREQUEST] = new Inventory(this, MAXSIZE_INVENTORY_MELDREQUEST, Inventory.MELDREQUEST);
- inventories[Inventory.BAZAAR] = new Inventory(this, MAXSIZE_INVENTORY_BAZAAR, Inventory.BAZAAR);
- inventories[Inventory.LOOT] = new Inventory(this, MAXSIZE_INVENTORY_LOOT, Inventory.LOOT);
-
- equipment = new Equipment(this, inventories[Inventory.NORMAL], MAXSIZE_INVENTORY_EQUIPMENT, Inventory.EQUIPMENT);
-
- //Set the Skill level caps of all FFXIV (classes)skills to 50
- for (int i = 0; i < charaWork.battleSave.skillLevelCap.Length; i++)
- {
- if (i != CLASSID_PUG &&
- i != CLASSID_MRD &&
- i != CLASSID_GLA &&
- i != CLASSID_MRD &&
- i != CLASSID_ARC &&
- i != CLASSID_LNC &&
- i != CLASSID_THM &&
- i != CLASSID_CNJ &&
- i != CLASSID_CRP &&
- i != CLASSID_BSM &&
- i != CLASSID_ARM &&
- i != CLASSID_GSM &&
- i != CLASSID_LTW &&
- i != CLASSID_WVR &&
- i != CLASSID_ALC &&
- i != CLASSID_CUL &&
- i != CLASSID_MIN &&
- i != CLASSID_BTN &&
- i != CLASSID_FSH)
- charaWork.battleSave.skillLevelCap[i] = 0xFF;
- else
- charaWork.battleSave.skillLevelCap[i] = 50;
-
- }
-
- charaWork.property[0] = 1;
- charaWork.property[1] = 1;
- charaWork.property[2] = 1;
- charaWork.property[4] = 1;
-
- charaWork.command[0] = 0xA0F00000 | 21001;
- charaWork.command[1] = 0xA0F00000 | 21001;
-
- charaWork.command[2] = 0xA0F00000 | 21002;
- charaWork.command[3] = 0xA0F00000 | 12004;
- charaWork.command[4] = 0xA0F00000 | 21005;
- charaWork.command[5] = 0xA0F00000 | 21006;
- charaWork.command[6] = 0xA0F00000 | 21007;
- charaWork.command[7] = 0xA0F00000 | 12009;
- charaWork.command[8] = 0xA0F00000 | 12010;
- charaWork.command[9] = 0xA0F00000 | 12005;
- charaWork.command[10] = 0xA0F00000 | 12007;
- charaWork.command[11] = 0xA0F00000 | 12011;
- charaWork.command[12] = 0xA0F00000 | 22012;
- charaWork.command[13] = 0xA0F00000 | 22013;
- charaWork.command[14] = 0xA0F00000 | 29497;
- charaWork.command[15] = 0xA0F00000 | 22015;
-
- charaWork.command[32] = 0xA0F00000 | 27191;
- charaWork.command[33] = 0xA0F00000 | 22302;
- charaWork.command[34] = 0xA0F00000 | 28466;
-
- charaWork.commandAcquired[27150 - 26000] = true;
-
- playerWork.questScenarioComplete[110001 - 110001] = true;
- playerWork.questGuildleveComplete[120050 - 120001] = true;
-
- for (int i = 0; i < charaWork.additionalCommandAcquired.Length; i++ )
- charaWork.additionalCommandAcquired[i] = true;
-
- for (int i = 0; i < charaWork.commandCategory.Length; i++)
- charaWork.commandCategory[i] = 1;
-
- charaWork.battleTemp.generalParameter[3] = 1;
-
- charaWork.eventSave.bazaarTax = 5;
- charaWork.battleSave.potencial = 6.6f;
-
- charaWork.commandCategory[0] = 1;
- charaWork.commandCategory[1] = 1;
- charaWork.commandCategory[32] = 1;
- charaWork.commandCategory[33] = 1;
- charaWork.commandCategory[34] = 1;
-
- charaWork.parameterSave.commandSlot_compatibility[0] = true;
- charaWork.parameterSave.commandSlot_compatibility[1] = true;
- charaWork.parameterSave.commandSlot_compatibility[32] = true;
-
- charaWork.commandBorder = 0x20;
-
- charaWork.parameterTemp.tp = 3000;
-
- Database.LoadPlayerCharacter(this);
- lastPlayTimeUpdate = Utils.UnixTimeStampUTC();
- }
-
- public List Create0x132Packets(uint playerActorId)
- {
- List packets = new List();
- packets.Add(_0x132Packet.BuildPacket(playerActorId, 0xB, "commandForced"));
- packets.Add(_0x132Packet.BuildPacket(playerActorId, 0xA, "commandDefault"));
- packets.Add(_0x132Packet.BuildPacket(playerActorId, 0x6, "commandWeak"));
- packets.Add(_0x132Packet.BuildPacket(playerActorId, 0x4, "commandContent"));
- packets.Add(_0x132Packet.BuildPacket(playerActorId, 0x6, "commandJudgeMode"));
- packets.Add(_0x132Packet.BuildPacket(playerActorId, 0x100, "commandRequest"));
- packets.Add(_0x132Packet.BuildPacket(playerActorId, 0x100, "widgetCreate"));
- packets.Add(_0x132Packet.BuildPacket(playerActorId, 0x100, "macroRequest"));
- return packets;
- }
-
- public override SubPacket CreateScriptBindPacket(uint playerActorId)
- {
- List lParams;
- if (IsMyPlayer(playerActorId))
- {
- if (loginInitDirector != null)
- lParams = LuaUtils.CreateLuaParamList("/Chara/Player/Player_work", false, false, true, loginInitDirector, true, 0, false, timers, true);
- else
- lParams = LuaUtils.CreateLuaParamList("/Chara/Player/Player_work", false, false, false, true, 0, false, timers, true);
- }
- else
- lParams = LuaUtils.CreateLuaParamList("/Chara/Player/Player_work", false, false, false, false, false, true);
- return ActorInstantiatePacket.BuildPacket(actorId, playerActorId, actorName, className, lParams);
+ private List ownedDirectors = new List();
+ private Director loginInitDirector = null;
+
+ public PlayerWork playerWork = new PlayerWork();
+
+ public Session playerSession;
+
+ public Player(Session cp, uint actorID) : base(actorID)
+ {
+ playerSession = cp;
+ actorName = String.Format("_pc{0:00000000}", actorID);
+ className = "Player";
+ currentSubState = SetActorStatePacket.SUB_STATE_PLAYER;
+
+ inventories[Inventory.NORMAL] = new Inventory(this, MAXSIZE_INVENTORY_NORMAL, Inventory.NORMAL);
+ inventories[Inventory.KEYITEMS] = new Inventory(this, MAXSIZE_INVENTORY_KEYITEMS, Inventory.KEYITEMS);
+ inventories[Inventory.CURRENCY] = new Inventory(this, MAXSIZE_INVENTORY_CURRANCY, Inventory.CURRENCY);
+ inventories[Inventory.MELDREQUEST] = new Inventory(this, MAXSIZE_INVENTORY_MELDREQUEST, Inventory.MELDREQUEST);
+ inventories[Inventory.BAZAAR] = new Inventory(this, MAXSIZE_INVENTORY_BAZAAR, Inventory.BAZAAR);
+ inventories[Inventory.LOOT] = new Inventory(this, MAXSIZE_INVENTORY_LOOT, Inventory.LOOT);
+
+ equipment = new Equipment(this, inventories[Inventory.NORMAL], MAXSIZE_INVENTORY_EQUIPMENT, Inventory.EQUIPMENT);
+
+ //Set the Skill level caps of all FFXIV (classes)skills to 50
+ for (int i = 0; i < charaWork.battleSave.skillLevelCap.Length; i++)
+ {
+ if (i != CLASSID_PUG &&
+ i != CLASSID_MRD &&
+ i != CLASSID_GLA &&
+ i != CLASSID_MRD &&
+ i != CLASSID_ARC &&
+ i != CLASSID_LNC &&
+ i != CLASSID_THM &&
+ i != CLASSID_CNJ &&
+ i != CLASSID_CRP &&
+ i != CLASSID_BSM &&
+ i != CLASSID_ARM &&
+ i != CLASSID_GSM &&
+ i != CLASSID_LTW &&
+ i != CLASSID_WVR &&
+ i != CLASSID_ALC &&
+ i != CLASSID_CUL &&
+ i != CLASSID_MIN &&
+ i != CLASSID_BTN &&
+ i != CLASSID_FSH)
+ charaWork.battleSave.skillLevelCap[i] = 0xFF;
+ else
+ charaWork.battleSave.skillLevelCap[i] = 50;
+
+ }
+
+ charaWork.property[0] = 1;
+ charaWork.property[1] = 1;
+ charaWork.property[2] = 1;
+ charaWork.property[4] = 1;
+
+ charaWork.command[0] = 0xA0F00000 | 21001;
+ charaWork.command[1] = 0xA0F00000 | 21001;
+
+ charaWork.command[2] = 0xA0F00000 | 21002;
+ charaWork.command[3] = 0xA0F00000 | 12004;
+ charaWork.command[4] = 0xA0F00000 | 21005;
+ charaWork.command[5] = 0xA0F00000 | 21006;
+ charaWork.command[6] = 0xA0F00000 | 21007;
+ charaWork.command[7] = 0xA0F00000 | 12009;
+ charaWork.command[8] = 0xA0F00000 | 12010;
+ charaWork.command[9] = 0xA0F00000 | 12005;
+ charaWork.command[10] = 0xA0F00000 | 12007;
+ charaWork.command[11] = 0xA0F00000 | 12011;
+ charaWork.command[12] = 0xA0F00000 | 22012;
+ charaWork.command[13] = 0xA0F00000 | 22013;
+ charaWork.command[14] = 0xA0F00000 | 29497;
+ charaWork.command[15] = 0xA0F00000 | 22015;
+
+ charaWork.command[32] = 0xA0F00000 | 27191;
+ charaWork.command[33] = 0xA0F00000 | 22302;
+ charaWork.command[34] = 0xA0F00000 | 28466;
+
+ charaWork.commandAcquired[27150 - 26000] = true;
+
+ playerWork.questScenarioComplete[110001 - 110001] = true;
+ playerWork.questGuildleveComplete[120050 - 120001] = true;
+
+ for (int i = 0; i < charaWork.additionalCommandAcquired.Length; i++ )
+ charaWork.additionalCommandAcquired[i] = true;
+
+ for (int i = 0; i < charaWork.commandCategory.Length; i++)
+ charaWork.commandCategory[i] = 1;
+
+ charaWork.battleTemp.generalParameter[3] = 1;
+
+ charaWork.eventSave.bazaarTax = 5;
+ charaWork.battleSave.potencial = 6.6f;
+
+ charaWork.commandCategory[0] = 1;
+ charaWork.commandCategory[1] = 1;
+ charaWork.commandCategory[32] = 1;
+ charaWork.commandCategory[33] = 1;
+ charaWork.commandCategory[34] = 1;
+
+ charaWork.parameterSave.commandSlot_compatibility[0] = true;
+ charaWork.parameterSave.commandSlot_compatibility[1] = true;
+ charaWork.parameterSave.commandSlot_compatibility[32] = true;
+
+ charaWork.commandBorder = 0x20;
+
+ charaWork.parameterTemp.tp = 3000;
+
+ Database.LoadPlayerCharacter(this);
+ lastPlayTimeUpdate = Utils.UnixTimeStampUTC();
+ }
+
+ public List Create0x132Packets(uint playerActorId)
+ {
+ List packets = new List();
+ packets.Add(_0x132Packet.BuildPacket(playerActorId, 0xB, "commandForced"));
+ packets.Add(_0x132Packet.BuildPacket(playerActorId, 0xA, "commandDefault"));
+ packets.Add(_0x132Packet.BuildPacket(playerActorId, 0x6, "commandWeak"));
+ packets.Add(_0x132Packet.BuildPacket(playerActorId, 0x4, "commandContent"));
+ packets.Add(_0x132Packet.BuildPacket(playerActorId, 0x6, "commandJudgeMode"));
+ packets.Add(_0x132Packet.BuildPacket(playerActorId, 0x100, "commandRequest"));
+ packets.Add(_0x132Packet.BuildPacket(playerActorId, 0x100, "widgetCreate"));
+ packets.Add(_0x132Packet.BuildPacket(playerActorId, 0x100, "macroRequest"));
+ return packets;
+ }
+
+ /*
+ * PLAYER ARGS:
+ * Unknown - Bool
+ * Unknown - Bool
+ * Is Init Director - Bool
+ * Unknown - Bool
+ * Unknown - Number
+ * Unknown - Bool
+ * Timer Array - 20 Number
+ */
+
+ public override SubPacket CreateScriptBindPacket(uint playerActorId)
+ {
+ List lParams;
+ if (IsMyPlayer(playerActorId))
+ {
+ if (loginInitDirector != null)
+ lParams = LuaUtils.CreateLuaParamList("/Chara/Player/Player_work", false, false, true, loginInitDirector, true, 0, false, timers, true);
+ else
+ lParams = LuaUtils.CreateLuaParamList("/Chara/Player/Player_work", true, false, false, true, 0, false, timers, true);
+ }
+ else
+ lParams = LuaUtils.CreateLuaParamList("/Chara/Player/Player_work", false, false, false, false, false, true);
+
+ ActorInstantiatePacket.BuildPacket(actorId, playerActorId, actorName, className, lParams).DebugPrintSubPacket();
+
+ return ActorInstantiatePacket.BuildPacket(actorId, playerActorId, actorName, className, lParams);
+ }
+
+ public override BasePacket GetSpawnPackets(uint playerActorId, ushort spawnType)
+ {
+ List subpackets = new List();
+ subpackets.Add(CreateAddActorPacket(playerActorId, 8));
+ if (IsMyPlayer(playerActorId))
+ subpackets.AddRange(Create0x132Packets(playerActorId));
+ subpackets.Add(CreateSpeedPacket(playerActorId));
+ subpackets.Add(CreateSpawnPositonPacket(playerActorId, spawnType));
+ subpackets.Add(CreateAppearancePacket(playerActorId));
+ subpackets.Add(CreateNamePacket(playerActorId));
+ subpackets.Add(_0xFPacket.BuildPacket(playerActorId, playerActorId));
+ subpackets.Add(CreateStatePacket(playerActorId));
+ subpackets.Add(CreateIdleAnimationPacket(playerActorId));
+ subpackets.Add(CreateInitStatusPacket(playerActorId));
+ subpackets.Add(CreateSetActorIconPacket(playerActorId));
+ subpackets.Add(CreateIsZoneingPacket(playerActorId));
+ subpackets.AddRange(CreatePlayerRelatedPackets(playerActorId));
+ subpackets.Add(CreateScriptBindPacket(playerActorId));
+ return BasePacket.CreatePacket(subpackets, true, false);
+ }
+
+ public List CreatePlayerRelatedPackets(uint playerActorId)
+ {
+ List subpackets = new List();
+
+ if (gcCurrent != 0)
+ subpackets.Add(SetGrandCompanyPacket.BuildPacket(actorId, playerActorId, gcCurrent, gcRankLimsa, gcRankGridania, gcRankUldah));
+
+ if (currentTitle != 0)
+ subpackets.Add(SetPlayerTitlePacket.BuildPacket(actorId, playerActorId, currentTitle));
+
+ if (currentJob != 0)
+ subpackets.Add(SetCurrentJobPacket.BuildPacket(actorId, playerActorId, currentJob));
+
+ if (IsMyPlayer(playerActorId))
+ {
+ subpackets.Add(_0x196Packet.BuildPacket(playerActorId, playerActorId));
+
+ if (hasChocobo && chocoboName != null && !chocoboName.Equals(""))
+ {
+ subpackets.Add(SetChocoboNamePacket.BuildPacket(actorId, playerActorId, chocoboName));
+ subpackets.Add(SetHasChocoboPacket.BuildPacket(playerActorId, hasChocobo));
+ }
+
+ if (hasGoobbue)
+ subpackets.Add(SetHasGoobbuePacket.BuildPacket(playerActorId, hasGoobbue));
+
+ subpackets.Add(SetAchievementPointsPacket.BuildPacket(playerActorId, achievementPoints));
+ subpackets.Add(Database.GetLatestAchievements(this));
+ subpackets.Add(Database.GetAchievementsPacket(this));
+ }
+
+ return subpackets;
+ }
+
+ public override BasePacket GetInitPackets(uint playerActorId)
+ {
+ ActorPropertyPacketUtil propPacketUtil = new ActorPropertyPacketUtil("/_init", this, playerActorId);
+
+ propPacketUtil.AddProperty("charaWork.eventSave.bazaarTax");
+ propPacketUtil.AddProperty("charaWork.battleSave.potencial");
+
+ //Properties
+ for (int i = 0; i < charaWork.property.Length; i++)
+ {
+ if (charaWork.property[i] != 0)
+ propPacketUtil.AddProperty(String.Format("charaWork.property[{0}]", i));
+ }
+
+ //Parameters
+ propPacketUtil.AddProperty("charaWork.parameterSave.hp[0]");
+ propPacketUtil.AddProperty("charaWork.parameterSave.hpMax[0]");
+ propPacketUtil.AddProperty("charaWork.parameterSave.mp");
+ propPacketUtil.AddProperty("charaWork.parameterSave.mpMax");
+ propPacketUtil.AddProperty("charaWork.parameterTemp.tp");
+ propPacketUtil.AddProperty("charaWork.parameterSave.state_mainSkill[0]");
+ propPacketUtil.AddProperty("charaWork.parameterSave.state_mainSkillLevel");
+
+ //Status Times
+ for (int i = 0; i < charaWork.statusShownTime.Length; i++)
+ {
+ if (charaWork.statusShownTime[i] != 0xFFFFFFFF)
+ propPacketUtil.AddProperty(String.Format("charaWork.statusShownTime[{0}]", i));
+ }
+
+ //General Parameters
+ for (int i = 3; i < charaWork.battleTemp.generalParameter.Length; i++)
+ {
+ if (charaWork.battleTemp.generalParameter[i] != 0)
+ propPacketUtil.AddProperty(String.Format("charaWork.battleTemp.generalParameter[{0}]", i));
+ }
+
+ propPacketUtil.AddProperty("charaWork.battleTemp.castGauge_speed[0]");
+ propPacketUtil.AddProperty("charaWork.battleTemp.castGauge_speed[1]");
+
+ //Battle Save Skillpoint
+
+ //Commands
+ propPacketUtil.AddProperty("charaWork.commandBorder");
+
+
+ for (int i = 0; i < charaWork.command.Length; i++)
+ {
+ if (charaWork.command[i] != 0)
+ propPacketUtil.AddProperty(String.Format("charaWork.command[{0}]", i));
+ }
+
+
+ for (int i = 0; i < charaWork.commandCategory.Length; i++)
+ {
+ charaWork.commandCategory[i] = 1;
+ if (charaWork.commandCategory[i] != 0)
+ propPacketUtil.AddProperty(String.Format("charaWork.commandCategory[{0}]", i));
+ }
+
+ for (int i = 0; i < charaWork.commandAcquired.Length; i++)
+ {
+ if (charaWork.commandAcquired[i] != false)
+ propPacketUtil.AddProperty(String.Format("charaWork.commandAcquired[{0}]", i));
+ }
+
+
+ for (int i = 0; i < charaWork.additionalCommandAcquired.Length; i++)
+ {
+ if (charaWork.additionalCommandAcquired[i] != false)
+ propPacketUtil.AddProperty(String.Format("charaWork.additionalCommandAcquired[{0}]", i));
+ }
+
+ for (int i = 0; i < charaWork.parameterSave.commandSlot_compatibility.Length; i++)
+ {
+ charaWork.parameterSave.commandSlot_compatibility[i] = true;
+ if (charaWork.parameterSave.commandSlot_compatibility[i])
+ propPacketUtil.AddProperty(String.Format("charaWork.parameterSave.commandSlot_compatibility[{0}]", i));
+ }
+
+ /*
+ for (int i = 0; i < charaWork.parameterSave.commandSlot_recastTime.Length; i++)
+ {
+ if (charaWork.parameterSave.commandSlot_recastTime[i] != 0)
+ propPacketUtil.AddProperty(String.Format("charaWork.parameterSave.commandSlot_recastTime[{0}]", i));
+ }
+ */
+
+ //System
+ propPacketUtil.AddProperty("charaWork.parameterTemp.forceControl_float_forClientSelf[0]");
+ propPacketUtil.AddProperty("charaWork.parameterTemp.forceControl_float_forClientSelf[1]");
+ propPacketUtil.AddProperty("charaWork.parameterTemp.forceControl_int16_forClientSelf[0]");
+ propPacketUtil.AddProperty("charaWork.parameterTemp.forceControl_int16_forClientSelf[1]");
+
+ charaWork.parameterTemp.otherClassAbilityCount[0] = 4;
+ charaWork.parameterTemp.otherClassAbilityCount[1] = 5;
+ charaWork.parameterTemp.giftCount[1] = 5;
+
+ propPacketUtil.AddProperty("charaWork.parameterTemp.otherClassAbilityCount[0]");
+ propPacketUtil.AddProperty("charaWork.parameterTemp.otherClassAbilityCount[1]");
+ propPacketUtil.AddProperty("charaWork.parameterTemp.giftCount[1]");
+
+ propPacketUtil.AddProperty("charaWork.depictionJudge");
+
+ //Scenario
+ for (int i = 0; i < playerWork.questScenario.Length; i++)
+ {
+ if (playerWork.questScenario[i] != 0)
+ propPacketUtil.AddProperty(String.Format("playerWork.questScenario[{0}]", i));
+ }
+
+ //Guildleve - Local
+ for (int i = 0; i < playerWork.questGuildleve.Length; i++)
+ {
+ if (playerWork.questGuildleve[i] != 0)
+ propPacketUtil.AddProperty(String.Format("playerWork.questGuildleve[{0}]", i));
+ }
+
+ //Guildleve - Regional
+ for (int i = 0; i < work.guildleveId.Length; i++)
+ {
+ if (work.guildleveId[i] != 0)
+ propPacketUtil.AddProperty(String.Format("work.guildleveId[{0}]", i));
+ if (work.guildleveDone[i] != false)
+ propPacketUtil.AddProperty(String.Format("work.guildleveDone[{0}]", i));
+ if (work.guildleveChecked[i] != false)
+ propPacketUtil.AddProperty(String.Format("work.guildleveChecked[{0}]", i));
+ }
+
+ //NPC Linkshell
+ for (int i = 0; i < playerWork.npcLinkshellChatCalling.Length; i++)
+ {
+ if (playerWork.npcLinkshellChatCalling[i] != false)
+ propPacketUtil.AddProperty(String.Format("playerWork.npcLinkshellChatCalling[{0}]", i));
+ if (playerWork.npcLinkshellChatExtra[i] != false)
+ propPacketUtil.AddProperty(String.Format("playerWork.npcLinkshellChatExtra[{0}]", i));
+ }
+
+ propPacketUtil.AddProperty("playerWork.restBonusExpRate");
+
+ //Profile
+ propPacketUtil.AddProperty("playerWork.tribe");
+ propPacketUtil.AddProperty("playerWork.guardian");
+ propPacketUtil.AddProperty("playerWork.birthdayMonth");
+ propPacketUtil.AddProperty("playerWork.birthdayDay");
+ propPacketUtil.AddProperty("playerWork.initialTown");
+
+ return BasePacket.CreatePacket(propPacketUtil.Done(), true, false);
}
- public override BasePacket GetSpawnPackets(uint playerActorId, ushort spawnType)
- {
- List subpackets = new List();
- subpackets.Add(CreateAddActorPacket(playerActorId, 8));
- if (IsMyPlayer(playerActorId))
- subpackets.AddRange(Create0x132Packets(playerActorId));
- subpackets.Add(CreateSpeedPacket(playerActorId));
- subpackets.Add(CreateSpawnPositonPacket(playerActorId, spawnType));
- subpackets.Add(CreateAppearancePacket(playerActorId));
- subpackets.Add(CreateNamePacket(playerActorId));
- subpackets.Add(_0xFPacket.BuildPacket(playerActorId, playerActorId));
- subpackets.Add(CreateStatePacket(playerActorId));
- subpackets.Add(CreateIdleAnimationPacket(playerActorId));
- subpackets.Add(CreateInitStatusPacket(playerActorId));
- subpackets.Add(CreateSetActorIconPacket(playerActorId));
- subpackets.Add(CreateIsZoneingPacket(playerActorId));
- subpackets.AddRange(CreatePlayerRelatedPackets(playerActorId));
- subpackets.Add(CreateScriptBindPacket(playerActorId));
- return BasePacket.CreatePacket(subpackets, true, false);
- }
-
- public List CreatePlayerRelatedPackets(uint playerActorId)
- {
- List subpackets = new List();
-
- if (gcCurrent != 0)
- subpackets.Add(SetGrandCompanyPacket.BuildPacket(actorId, playerActorId, gcCurrent, gcRankLimsa, gcRankGridania, gcRankUldah));
-
- if (currentTitle != 0)
- subpackets.Add(SetPlayerTitlePacket.BuildPacket(actorId, playerActorId, currentTitle));
-
- if (currentJob != 0)
- subpackets.Add(SetCurrentJobPacket.BuildPacket(actorId, playerActorId, currentJob));
-
- if (IsMyPlayer(playerActorId))
- {
- subpackets.Add(_0x196Packet.BuildPacket(playerActorId, playerActorId));
-
- if (hasChocobo && chocoboName != null && !chocoboName.Equals(""))
- {
- subpackets.Add(SetChocoboNamePacket.BuildPacket(actorId, playerActorId, chocoboName));
- subpackets.Add(SetHasChocoboPacket.BuildPacket(playerActorId, hasChocobo));
- }
-
- if (hasGoobbue)
- subpackets.Add(SetHasGoobbuePacket.BuildPacket(playerActorId, hasGoobbue));
-
- subpackets.Add(SetAchievementPointsPacket.BuildPacket(playerActorId, achievementPoints));
- subpackets.Add(Database.GetLatestAchievements(this));
- subpackets.Add(Database.GetAchievementsPacket(this));
- }
-
- return subpackets;
- }
-
- public override BasePacket GetInitPackets(uint playerActorId)
- {
- ActorPropertyPacketUtil propPacketUtil = new ActorPropertyPacketUtil("/_init", this, playerActorId);
-
- propPacketUtil.AddProperty("charaWork.eventSave.bazaarTax");
- propPacketUtil.AddProperty("charaWork.battleSave.potencial");
-
- //Properties
- for (int i = 0; i < charaWork.property.Length; i++)
- {
- if (charaWork.property[i] != 0)
- propPacketUtil.AddProperty(String.Format("charaWork.property[{0}]", i));
- }
-
- //Parameters
- propPacketUtil.AddProperty("charaWork.parameterSave.hp[0]");
- propPacketUtil.AddProperty("charaWork.parameterSave.hpMax[0]");
- propPacketUtil.AddProperty("charaWork.parameterSave.mp");
- propPacketUtil.AddProperty("charaWork.parameterSave.mpMax");
- propPacketUtil.AddProperty("charaWork.parameterTemp.tp");
- propPacketUtil.AddProperty("charaWork.parameterSave.state_mainSkill[0]");
- propPacketUtil.AddProperty("charaWork.parameterSave.state_mainSkillLevel");
-
- //Status Times
- for (int i = 0; i < charaWork.statusShownTime.Length; i++)
- {
- if (charaWork.statusShownTime[i] != 0xFFFFFFFF)
- propPacketUtil.AddProperty(String.Format("charaWork.statusShownTime[{0}]", i));
- }
-
- //General Parameters
- for (int i = 3; i < charaWork.battleTemp.generalParameter.Length; i++)
- {
- if (charaWork.battleTemp.generalParameter[i] != 0)
- propPacketUtil.AddProperty(String.Format("charaWork.battleTemp.generalParameter[{0}]", i));
- }
-
- propPacketUtil.AddProperty("charaWork.battleTemp.castGauge_speed[0]");
- propPacketUtil.AddProperty("charaWork.battleTemp.castGauge_speed[1]");
-
- //Battle Save Skillpoint
-
- //Commands
- propPacketUtil.AddProperty("charaWork.commandBorder");
-
-
- for (int i = 0; i < charaWork.command.Length; i++)
- {
- if (charaWork.command[i] != 0)
- propPacketUtil.AddProperty(String.Format("charaWork.command[{0}]", i));
- }
-
-
- for (int i = 0; i < charaWork.commandCategory.Length; i++)
- {
- charaWork.commandCategory[i] = 1;
- if (charaWork.commandCategory[i] != 0)
- propPacketUtil.AddProperty(String.Format("charaWork.commandCategory[{0}]", i));
- }
-
- for (int i = 0; i < charaWork.commandAcquired.Length; i++)
- {
- if (charaWork.commandAcquired[i] != false)
- propPacketUtil.AddProperty(String.Format("charaWork.commandAcquired[{0}]", i));
- }
-
-
- for (int i = 0; i < charaWork.additionalCommandAcquired.Length; i++)
- {
- if (charaWork.additionalCommandAcquired[i] != false)
- propPacketUtil.AddProperty(String.Format("charaWork.additionalCommandAcquired[{0}]", i));
- }
-
- for (int i = 0; i < charaWork.parameterSave.commandSlot_compatibility.Length; i++)
- {
- charaWork.parameterSave.commandSlot_compatibility[i] = true;
- if (charaWork.parameterSave.commandSlot_compatibility[i])
- propPacketUtil.AddProperty(String.Format("charaWork.parameterSave.commandSlot_compatibility[{0}]", i));
- }
-
- /*
- for (int i = 0; i < charaWork.parameterSave.commandSlot_recastTime.Length; i++)
- {
- if (charaWork.parameterSave.commandSlot_recastTime[i] != 0)
- propPacketUtil.AddProperty(String.Format("charaWork.parameterSave.commandSlot_recastTime[{0}]", i));
- }
- */
-
- //System
- propPacketUtil.AddProperty("charaWork.parameterTemp.forceControl_float_forClientSelf[0]");
- propPacketUtil.AddProperty("charaWork.parameterTemp.forceControl_float_forClientSelf[1]");
- propPacketUtil.AddProperty("charaWork.parameterTemp.forceControl_int16_forClientSelf[0]");
- propPacketUtil.AddProperty("charaWork.parameterTemp.forceControl_int16_forClientSelf[1]");
-
- charaWork.parameterTemp.otherClassAbilityCount[0] = 4;
- charaWork.parameterTemp.otherClassAbilityCount[1] = 5;
- charaWork.parameterTemp.giftCount[1] = 5;
-
- propPacketUtil.AddProperty("charaWork.parameterTemp.otherClassAbilityCount[0]");
- propPacketUtil.AddProperty("charaWork.parameterTemp.otherClassAbilityCount[1]");
- propPacketUtil.AddProperty("charaWork.parameterTemp.giftCount[1]");
-
- propPacketUtil.AddProperty("charaWork.depictionJudge");
-
- //Scenario
- for (int i = 0; i < playerWork.questScenario.Length; i++)
- {
- if (playerWork.questScenario[i] != 0)
- propPacketUtil.AddProperty(String.Format("playerWork.questScenario[{0}]", i));
- }
-
- //Guildleve - Local
- for (int i = 0; i < playerWork.questGuildleve.Length; i++)
- {
- if (playerWork.questGuildleve[i] != 0)
- propPacketUtil.AddProperty(String.Format("playerWork.questGuildleve[{0}]", i));
- }
-
- //Guildleve - Regional
- for (int i = 0; i < work.guildleveId.Length; i++)
- {
- if (work.guildleveId[i] != 0)
- propPacketUtil.AddProperty(String.Format("work.guildleveId[{0}]", i));
- if (work.guildleveDone[i] != false)
- propPacketUtil.AddProperty(String.Format("work.guildleveDone[{0}]", i));
- if (work.guildleveChecked[i] != false)
- propPacketUtil.AddProperty(String.Format("work.guildleveChecked[{0}]", i));
- }
-
- //NPC Linkshell
- for (int i = 0; i < playerWork.npcLinkshellChatCalling.Length; i++)
- {
- if (playerWork.npcLinkshellChatCalling[i] != false)
- propPacketUtil.AddProperty(String.Format("playerWork.npcLinkshellChatCalling[{0}]", i));
- if (playerWork.npcLinkshellChatExtra[i] != false)
- propPacketUtil.AddProperty(String.Format("playerWork.npcLinkshellChatExtra[{0}]", i));
- }
-
- propPacketUtil.AddProperty("playerWork.restBonusExpRate");
-
- //Profile
- propPacketUtil.AddProperty("playerWork.tribe");
- propPacketUtil.AddProperty("playerWork.guardian");
- propPacketUtil.AddProperty("playerWork.birthdayMonth");
- propPacketUtil.AddProperty("playerWork.birthdayDay");
- propPacketUtil.AddProperty("playerWork.initialTown");
-
- return BasePacket.CreatePacket(propPacketUtil.Done(), true, false);
- }
-
public void SendSeamlessZoneInPackets()
{
QueuePacket(SetMusicPacket.BuildPacket(actorId, zone.bgmDay, SetMusicPacket.EFFECT_FADEIN));
QueuePacket(SetWeatherPacket.BuildPacket(actorId, SetWeatherPacket.WEATHER_CLEAR, 1));
- }
-
- public void SendZoneInPackets(WorldManager world, ushort spawnType)
- {
- QueuePacket(SetActorIsZoningPacket.BuildPacket(actorId, actorId, false));
- QueuePacket(_0x10Packet.BuildPacket(actorId, 0xFF));
- QueuePacket(SetMusicPacket.BuildPacket(actorId, zone.bgmDay, 0x01));
- QueuePacket(SetWeatherPacket.BuildPacket(actorId, SetWeatherPacket.WEATHER_CLEAR, 1));
-
- QueuePacket(SetMapPacket.BuildPacket(actorId, zone.regionId, zone.actorId));
-
- QueuePacket(GetSpawnPackets(actorId, spawnType));
- //GetSpawnPackets(actorId, spawnType).DebugPrintPacket();
-
- #region Inventory & Equipment
- QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId));
- inventories[Inventory.NORMAL].SendFullInventory();
- inventories[Inventory.CURRENCY].SendFullInventory();
- inventories[Inventory.KEYITEMS].SendFullInventory();
- inventories[Inventory.BAZAAR].SendFullInventory();
- inventories[Inventory.MELDREQUEST].SendFullInventory();
- inventories[Inventory.LOOT].SendFullInventory();
- equipment.SendFullEquipment(false);
- playerSession.QueuePacket(InventoryEndChangePacket.BuildPacket(actorId), true, false);
- #endregion
-
- playerSession.QueuePacket(GetInitPackets(actorId));
-
- BasePacket areaMasterSpawn = zone.GetSpawnPackets(actorId);
- BasePacket debugSpawn = world.GetDebugActor().GetSpawnPackets(actorId);
+ }
+
+ public void SendZoneInPackets(WorldManager world, ushort spawnType)
+ {
+ QueuePacket(SetActorIsZoningPacket.BuildPacket(actorId, actorId, false));
+ QueuePacket(_0x10Packet.BuildPacket(actorId, 0xFF));
+ QueuePacket(SetMusicPacket.BuildPacket(actorId, zone.bgmDay, 0x01));
+ QueuePacket(SetWeatherPacket.BuildPacket(actorId, SetWeatherPacket.WEATHER_CLEAR, 1));
+
+ QueuePacket(SetMapPacket.BuildPacket(actorId, zone.regionId, zone.actorId));
+
+ QueuePacket(GetSpawnPackets(actorId, spawnType));
+ //GetSpawnPackets(actorId, spawnType).DebugPrintPacket();
+
+ #region Inventory & Equipment
+ QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId));
+ inventories[Inventory.NORMAL].SendFullInventory();
+ inventories[Inventory.CURRENCY].SendFullInventory();
+ inventories[Inventory.KEYITEMS].SendFullInventory();
+ inventories[Inventory.BAZAAR].SendFullInventory();
+ inventories[Inventory.MELDREQUEST].SendFullInventory();
+ inventories[Inventory.LOOT].SendFullInventory();
+ equipment.SendFullEquipment(false);
+ playerSession.QueuePacket(InventoryEndChangePacket.BuildPacket(actorId), true, false);
+ #endregion
+
+ playerSession.QueuePacket(GetInitPackets(actorId));
+
+ BasePacket areaMasterSpawn = zone.GetSpawnPackets(actorId);
+ BasePacket debugSpawn = world.GetDebugActor().GetSpawnPackets(actorId);
BasePacket worldMasterSpawn = world.GetActor().GetSpawnPackets(actorId);
-
- playerSession.QueuePacket(areaMasterSpawn);
- playerSession.QueuePacket(debugSpawn);
- playerSession.QueuePacket(worldMasterSpawn);
-
- if (zone.isInn)
- {
- SetCutsceneBookPacket cutsceneBookPacket = new SetCutsceneBookPacket();
- for (int i = 0; i < 2048; i++)
- cutsceneBookPacket.cutsceneFlags[i] = true;
-
- SubPacket packet = cutsceneBookPacket.BuildPacket(actorId, "", 11, 1, 1);
-
- packet.DebugPrintSubPacket();
- QueuePacket(packet);
+
+ playerSession.QueuePacket(areaMasterSpawn);
+ playerSession.QueuePacket(debugSpawn);
+ playerSession.QueuePacket(worldMasterSpawn);
+
+ if (zone.isInn)
+ {
+ SetCutsceneBookPacket cutsceneBookPacket = new SetCutsceneBookPacket();
+ for (int i = 0; i < 2048; i++)
+ cutsceneBookPacket.cutsceneFlags[i] = true;
+
+ SubPacket packet = cutsceneBookPacket.BuildPacket(actorId, "", 11, 1, 1);
+
+ packet.DebugPrintSubPacket();
+ QueuePacket(packet);
}
if (zone.GetWeatherDirector() != null)
@@ -527,59 +541,60 @@ namespace FFXIVClassic_Map_Server.Actors
playerSession.QueuePacket(weatherDirectorSpawn);
}
+
foreach (Director director in ownedDirectors)
{
director.GetSpawnPackets(actorId).DebugPrintPacket();
QueuePacket(director.GetSpawnPackets(actorId));
QueuePacket(director.GetInitPackets(actorId));
//QueuePacket(director.GetSetEventStatusPackets(actorId));
- }
-
- }
-
- private void SendRemoveInventoryPackets(List slots)
- {
- int currentIndex = 0;
-
- while (true)
- {
- if (slots.Count - currentIndex >= 64)
- QueuePacket(InventoryRemoveX64Packet.BuildPacket(actorId, slots, ref currentIndex));
- else if (slots.Count - currentIndex >= 32)
- QueuePacket(InventoryRemoveX32Packet.BuildPacket(actorId, slots, ref currentIndex));
- else if (slots.Count - currentIndex >= 16)
- QueuePacket(InventoryRemoveX16Packet.BuildPacket(actorId, slots, ref currentIndex));
- else if (slots.Count - currentIndex >= 8)
- QueuePacket(InventoryRemoveX08Packet.BuildPacket(actorId, slots, ref currentIndex));
- else if (slots.Count - currentIndex == 1)
- QueuePacket(InventoryRemoveX01Packet.BuildPacket(actorId, slots[currentIndex]));
- else
- break;
- }
-
- }
-
- public bool IsMyPlayer(uint otherActorId)
- {
- return actorId == otherActorId;
- }
-
- public void QueuePacket(BasePacket packet)
- {
- playerSession.QueuePacket(packet);
- }
-
- public void QueuePacket(SubPacket packet)
- {
- playerSession.QueuePacket(packet, true, false);
- }
-
- public void QueuePackets(List packets)
- {
- foreach (SubPacket subpacket in packets)
- playerSession.QueuePacket(subpacket, true, false);
- }
-
+ }
+
+ }
+
+ private void SendRemoveInventoryPackets(List slots)
+ {
+ int currentIndex = 0;
+
+ while (true)
+ {
+ if (slots.Count - currentIndex >= 64)
+ QueuePacket(InventoryRemoveX64Packet.BuildPacket(actorId, slots, ref currentIndex));
+ else if (slots.Count - currentIndex >= 32)
+ QueuePacket(InventoryRemoveX32Packet.BuildPacket(actorId, slots, ref currentIndex));
+ else if (slots.Count - currentIndex >= 16)
+ QueuePacket(InventoryRemoveX16Packet.BuildPacket(actorId, slots, ref currentIndex));
+ else if (slots.Count - currentIndex >= 8)
+ QueuePacket(InventoryRemoveX08Packet.BuildPacket(actorId, slots, ref currentIndex));
+ else if (slots.Count - currentIndex == 1)
+ QueuePacket(InventoryRemoveX01Packet.BuildPacket(actorId, slots[currentIndex]));
+ else
+ break;
+ }
+
+ }
+
+ public bool IsMyPlayer(uint otherActorId)
+ {
+ return actorId == otherActorId;
+ }
+
+ public void QueuePacket(BasePacket packet)
+ {
+ playerSession.QueuePacket(packet);
+ }
+
+ public void QueuePacket(SubPacket packet)
+ {
+ playerSession.QueuePacket(packet, true, false);
+ }
+
+ public void QueuePackets(List packets)
+ {
+ foreach (SubPacket subpacket in packets)
+ playerSession.QueuePacket(subpacket, true, false);
+ }
+
public void SendPacket(string path)
{
try
@@ -593,57 +608,57 @@ namespace FFXIVClassic_Map_Server.Actors
{
this.SendMessage(SendMessagePacket.MESSAGE_TYPE_SYSTEM_ERROR, "[SendPacket]", "Unable to send packet.");
}
- }
-
- public void BroadcastPacket(SubPacket packet, bool sendToSelf)
- {
- foreach (Actor a in playerSession.actorInstanceList)
- {
- if (a is Player)
- {
+ }
+
+ public void BroadcastPacket(SubPacket packet, bool sendToSelf)
+ {
+ foreach (Actor a in playerSession.actorInstanceList)
+ {
+ if (a is Player)
+ {
Player p = (Player)a;
if (p.Equals(this) && !sendToSelf)
- continue;
-
- SubPacket clonedPacket = new SubPacket(packet, a.actorId);
- p.QueuePacket(clonedPacket);
- }
- }
- }
-
- public void SetDCFlag(bool flag)
- {
- if (flag)
- {
- BroadcastPacket(SetActorIconPacket.BuildPacket(actorId, actorId, SetActorIconPacket.DISCONNECTING), true);
- }
- else
- {
- if (isGM)
- BroadcastPacket(SetActorIconPacket.BuildPacket(actorId, actorId, SetActorIconPacket.ISGM), true);
- else
- BroadcastPacket(SetActorIconPacket.BuildPacket(actorId, actorId, 0), true);
- }
- }
-
- public void CleanupAndSave()
+ continue;
+
+ SubPacket clonedPacket = new SubPacket(packet, a.actorId);
+ p.QueuePacket(clonedPacket);
+ }
+ }
+ }
+
+ public void SetDCFlag(bool flag)
{
- playerSession.LockUpdates(true);
-
- //Remove actor from zone and main server list
- zone.RemoveActorFromZone(this);
-
+ if (flag)
+ {
+ BroadcastPacket(SetActorIconPacket.BuildPacket(actorId, actorId, SetActorIconPacket.DISCONNECTING), true);
+ }
+ else
+ {
+ if (isGM)
+ BroadcastPacket(SetActorIconPacket.BuildPacket(actorId, actorId, SetActorIconPacket.ISGM), true);
+ else
+ BroadcastPacket(SetActorIconPacket.BuildPacket(actorId, actorId, 0), true);
+ }
+ }
+
+ public void CleanupAndSave()
+ {
+ playerSession.LockUpdates(true);
+
+ //Remove actor from zone and main server list
+ zone.RemoveActorFromZone(this);
+
//Set Destination to 0
this.destinationZone = 0;
- this.destinationSpawnType = 0;
-
- //Clean up parties
- RemoveFromCurrentPartyAndCleanup();
-
- //Save Player
- Database.SavePlayerPlayTime(this);
- Database.SavePlayerPosition(this);
+ this.destinationSpawnType = 0;
+
+ //Clean up parties
+ RemoveFromCurrentPartyAndCleanup();
+
+ //Save Player
+ Database.SavePlayerPlayTime(this);
+ Database.SavePlayerPosition(this);
}
public void CleanupAndSave(uint destinationZone, ushort spawnType, float destinationX, float destinationY, float destinationZ, float destinationRot)
@@ -667,450 +682,489 @@ namespace FFXIVClassic_Map_Server.Actors
//Save Player
Database.SavePlayerPlayTime(this);
Database.SavePlayerPosition(this);
- }
-
- public Area GetZone()
- {
- return zone;
- }
-
- public void SendMessage(uint logType, string sender, string message)
- {
- QueuePacket(SendMessagePacket.BuildPacket(actorId, actorId, logType, sender, message));
- }
-
- public void Logout()
- {
- QueuePacket(LogoutPacket.BuildPacket(actorId));
- CleanupAndSave();
- }
-
- public void QuitGame()
- {
- QueuePacket(QuitPacket.BuildPacket(actorId));
- CleanupAndSave();
- }
-
- public uint GetPlayTime(bool doUpdate)
- {
- if (doUpdate)
- {
- uint curTime = Utils.UnixTimeStampUTC();
- playTime += curTime - lastPlayTimeUpdate;
- lastPlayTimeUpdate = curTime;
- }
-
- return playTime;
- }
-
+ }
+
+ public Area GetZone()
+ {
+ return zone;
+ }
+
+ public void SendMessage(uint logType, string sender, string message)
+ {
+ QueuePacket(SendMessagePacket.BuildPacket(actorId, actorId, logType, sender, message));
+ }
+
+ public void Logout()
+ {
+ QueuePacket(LogoutPacket.BuildPacket(actorId));
+ CleanupAndSave();
+ }
+
+ public void QuitGame()
+ {
+ QueuePacket(QuitPacket.BuildPacket(actorId));
+ CleanupAndSave();
+ }
+
+ public uint GetPlayTime(bool doUpdate)
+ {
+ if (doUpdate)
+ {
+ uint curTime = Utils.UnixTimeStampUTC();
+ playTime += curTime - lastPlayTimeUpdate;
+ lastPlayTimeUpdate = curTime;
+ }
+
+ return playTime;
+ }
+
public void SavePlayTime()
{
Database.SavePlayerPlayTime(this);
- }
-
- public void ChangeMusic(ushort musicId)
- {
- QueuePacket(SetMusicPacket.BuildPacket(actorId, musicId, 1));
- }
-
- public void SendChocoboAppearance()
- {
- BroadcastPacket(SetCurrentMountChocoboPacket.BuildPacket(actorId, chocoboAppearance), true);
- }
-
- public void SendGoobbueAppearance()
- {
- BroadcastPacket(SetCurrentMountGoobbuePacket.BuildPacket(actorId, 1), true);
- }
-
- public void SetMountState(byte mountState)
- {
- this.mountState = mountState;
- }
-
- public byte GetMountState()
- {
- return mountState;
- }
-
- public void DoEmote(uint emoteId)
- {
- BroadcastPacket(ActorDoEmotePacket.BuildPacket(actorId, actorId, currentTarget, emoteId), true);
- }
-
- public void SendGameMessage(Actor sourceActor, Actor textIdOwner, ushort textId, byte log, params object[] msgParams)
+ }
+
+ public void ChangeMusic(ushort musicId)
{
- if (msgParams == null || msgParams.Length == 0)
- {
- QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, sourceActor.actorId, textIdOwner.actorId, textId, log));
- }
- else
- QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, sourceActor.actorId, textIdOwner.actorId, textId, log, LuaUtils.CreateLuaParamList(msgParams)));
- }
-
- public void SendGameMessage(Actor textIdOwner, ushort textId, byte log, params object[] msgParams)
+ QueuePacket(SetMusicPacket.BuildPacket(actorId, musicId, 1));
+ }
+
+ public void SendChocoboAppearance()
{
- if (msgParams == null || msgParams.Length == 0)
- QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, textIdOwner.actorId, textId, log));
- else
- QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, textIdOwner.actorId, textId, log, LuaUtils.CreateLuaParamList(msgParams)));
- }
-
- public void SendGameMessage(Actor textIdOwner, ushort textId, byte log, string customSender, params object[] msgParams)
+ BroadcastPacket(SetCurrentMountChocoboPacket.BuildPacket(actorId, chocoboAppearance), true);
+ }
+
+ public void SendGoobbueAppearance()
{
- if (msgParams == null || msgParams.Length == 0)
- QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, textIdOwner.actorId, textId, customSender, log));
- else
- QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, textIdOwner.actorId, textId, customSender, log, LuaUtils.CreateLuaParamList(msgParams)));
- }
-
- public void SendGameMessage(Actor textIdOwner, ushort textId, byte log, uint displayId, params object[] msgParams)
+ BroadcastPacket(SetCurrentMountGoobbuePacket.BuildPacket(actorId, 1), true);
+ }
+
+ public void SetMountState(byte mountState)
{
- if (msgParams == null || msgParams.Length == 0)
- QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, textIdOwner.actorId, textId, displayId, log));
- else
- QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, textIdOwner.actorId, textId, displayId, log, LuaUtils.CreateLuaParamList(msgParams)));
- }
-
- public void BroadcastWorldMessage(ushort worldMasterId, params object[] msgParams)
- {
- //SubPacket worldMasterMessage =
- //zone.BroadcastPacketAroundActor(this, worldMasterMessage);
- }
-
- public void GraphicChange(uint slot, uint graphicId)
- {
- appearanceIds[slot] = graphicId;
- }
-
- public void GraphicChange(uint slot, uint weapId, uint equipId, uint variantId, uint colorId)
- {
-
- uint mixedVariantId;
-
- if (weapId == 0)
- mixedVariantId = ((variantId & 0x1F) << 5) | colorId;
- else
- mixedVariantId = variantId;
-
- uint graphicId =
- (weapId & 0x3FF) << 20 |
- (equipId & 0x3FF) << 10 |
- (mixedVariantId & 0x3FF);
-
- appearanceIds[slot] = graphicId;
-
- }
-
- public void SendAppearance()
- {
- BroadcastPacket(CreateAppearancePacket(actorId), true);
- }
-
- public void SendCharaExpInfo()
- {
- if (lastStep == 0)
- {
- int maxLength;
- if ((sizeof(short) * charaWork.battleSave.skillLevel.Length)-lastPosition < 0x5E)
- maxLength = (sizeof(short) * charaWork.battleSave.skillLevel.Length) - lastPosition;
- else
- maxLength = 0x5E;
-
- byte[] skillLevelBuffer = new byte[maxLength];
- Buffer.BlockCopy(charaWork.battleSave.skillLevel, 0, skillLevelBuffer, 0, skillLevelBuffer.Length);
- SetActorPropetyPacket charaInfo1 = new SetActorPropetyPacket("charaWork/exp");
-
- charaInfo1.SetIsArrayMode(true);
- if (maxLength == 0x5E)
- {
- charaInfo1.AddBuffer(Utils.MurmurHash2("charaWork.battleSave.skillLevel", 0), skillLevelBuffer, 0, skillLevelBuffer.Length, 0x0);
- lastPosition += maxLength;
- }
- else
- {
- charaInfo1.AddBuffer(Utils.MurmurHash2("charaWork.battleSave.skillLevel", 0), skillLevelBuffer, 0, skillLevelBuffer.Length, 0x3);
- lastPosition = 0;
- lastStep++;
- }
-
- charaInfo1.AddTarget();
-
- QueuePacket(charaInfo1.BuildPacket(actorId, actorId));
- }
- else if (lastStep == 1)
- {
- int maxLength;
- if ((sizeof(short) * charaWork.battleSave.skillLevelCap.Length) - lastPosition < 0x5E)
- maxLength = (sizeof(short) * charaWork.battleSave.skillLevelCap.Length) - lastPosition;
- else
- maxLength = 0x5E;
-
- byte[] skillCapBuffer = new byte[maxLength];
- Buffer.BlockCopy(charaWork.battleSave.skillLevelCap, lastPosition, skillCapBuffer, 0, skillCapBuffer.Length);
- SetActorPropetyPacket charaInfo1 = new SetActorPropetyPacket("charaWork/exp");
-
-
- if (maxLength == 0x5E)
- {
- charaInfo1.SetIsArrayMode(true);
- charaInfo1.AddBuffer(Utils.MurmurHash2("charaWork.battleSave.skillLevelCap", 0), skillCapBuffer, 0, skillCapBuffer.Length, 0x1);
- lastPosition += maxLength;
- }
- else
- {
- charaInfo1.SetIsArrayMode(false);
- charaInfo1.AddBuffer(Utils.MurmurHash2("charaWork.battleSave.skillLevelCap", 0), skillCapBuffer, 0, skillCapBuffer.Length, 0x3);
- lastStep = 0;
- lastPosition = 0;
- }
-
- charaInfo1.AddTarget();
-
- QueuePacket(charaInfo1.BuildPacket(actorId, actorId));
- }
-
- }
-
- public InventoryItem[] GetGearset(ushort classId)
- {
- return Database.GetEquipment(this, classId);
- }
-
- public void PrepareClassChange(byte classId)
- {
- //If new class, init abilties and level
-
- SendCharaExpInfo();
- }
-
- public void DoClassChange(byte classId)
- {
- //load hotbars
- //Calculate stats
- //Calculate hp/mp
-
- //Get Potenciel ??????
-
- //Set HP/MP/TP PARAMS
-
- //Set mainskill and level
-
- //Set Parameters
-
- //Set current EXP
-
- //Set Hotbar Commands 1
- //Set Hotbar Commands 2
- //Set Hotbar Commands 3
-
- //Check if bonus point available... set
-
- //Set rested EXP
-
- charaWork.parameterSave.state_mainSkill[0] = classId;
- charaWork.parameterSave.state_mainSkillLevel = charaWork.battleSave.skillLevel[classId-1];
-
- playerWork.restBonusExpRate = 0.0f;
-
- ActorPropertyPacketUtil propertyBuilder = new ActorPropertyPacketUtil("charaWork/stateForAll", this, actorId);
-
- propertyBuilder.AddProperty("charaWork.parameterSave.state_mainSkill[0]");
- propertyBuilder.AddProperty("charaWork.parameterSave.state_mainSkillLevel");
- propertyBuilder.NewTarget("playerWork/expBonus");
- propertyBuilder.AddProperty("playerWork.restBonusExpRate");
-
- List packets = propertyBuilder.Done();
-
- foreach (SubPacket packet in packets)
- BroadcastPacket(packet, true);
-
- Database.SavePlayerCurrentClass(this);
- }
-
- public void GraphicChange(int slot, InventoryItem invItem)
- {
- if (invItem == null)
- appearanceIds[slot] = 0;
- else
- {
- Item item = Server.GetItemGamedata(invItem.itemId);
- if (item is EquipmentItem)
- {
- EquipmentItem eqItem = (EquipmentItem)item;
-
- uint mixedVariantId;
-
- if (eqItem.graphicsWeaponId == 0)
- mixedVariantId = ((eqItem.graphicsVariantId & 0x1F) << 5) | eqItem.graphicsColorId;
- else
- mixedVariantId = eqItem.graphicsVariantId;
-
- uint graphicId =
- (eqItem.graphicsWeaponId & 0x3FF) << 20 |
- (eqItem.graphicsEquipmentId & 0x3FF) << 10 |
- (mixedVariantId & 0x3FF);
-
- appearanceIds[slot] = graphicId;
- }
- }
-
- Database.SavePlayerAppearance(this);
-
- BroadcastPacket(CreateAppearancePacket(actorId), true);
- }
-
- public Inventory GetInventory(ushort type)
- {
- if (inventories.ContainsKey(type))
- return inventories[type];
- else
- return null;
- }
-
- public Actor GetActorInInstance(uint actorId)
- {
- foreach (Actor a in playerSession.actorInstanceList)
- {
- if (a.actorId == actorId)
- return a;
- }
-
- return null;
- }
-
- public void SetZoneChanging(bool flag)
- {
- isZoneChanging = flag;
- }
-
- public bool IsInZoneChange()
- {
- return isZoneChanging;
- }
-
- public Equipment GetEquipment()
- {
- return equipment;
- }
-
- public byte GetInitialTown()
- {
- return playerWork.initialTown;
- }
-
- public int GetFreeQuestSlot()
- {
- for (int i = 0; i < questScenario.Length; i++)
- {
- if (questScenario[i] == null)
- return i;
- }
-
- return -1;
- }
-
- public void AddQuest(uint id)
- {
- Actor actor = Server.GetStaticActors((0xA0F00000 | id));
- AddQuest(actor.actorName);
- }
-
- public void AddQuest(string name)
- {
- Actor actor = Server.GetStaticActors(name);
-
- if (actor == null)
- return;
-
- uint id = actor.actorId;
-
- int freeSlot = GetFreeQuestSlot();
-
- if (freeSlot == -1)
- return;
-
- playerWork.questScenario[freeSlot] = id;
- questScenario[freeSlot] = new Quest(this, playerWork.questScenario[freeSlot], name, null, 0);
- Database.SaveQuest(this, questScenario[freeSlot]);
- }
-
- public Quest GetQuest(uint id)
- {
- for (int i = 0; i < questScenario.Length; i++)
- {
- if (questScenario[i] != null && questScenario[i].actorId == (0xA0F00000 | id))
- return questScenario[i];
- }
-
- return null;
- }
-
- public Quest GetQuest(string name)
- {
- for (int i = 0; i < questScenario.Length; i++)
- {
- if (questScenario[i] != null && questScenario[i].actorName.ToLower().Equals(name.ToLower()))
- return questScenario[i];
- }
-
- return null;
- }
-
- public bool HasQuest(string name)
- {
- for (int i = 0; i < questScenario.Length; i++)
- {
- if (questScenario[i] != null && questScenario[i].actorName.ToLower().Equals(name.ToLower()))
- return true;
- }
-
- return false;
- }
-
- public bool HasQuest(uint id)
- {
- for (int i = 0; i < questScenario.Length; i++)
- {
- if (questScenario[i] != null && questScenario[i].actorId == (0xA0F00000 | id))
- return true;
- }
-
- return false;
- }
-
- public int GetQuestSlot(uint id)
- {
- for (int i = 0; i < questScenario.Length; i++)
- {
- if (questScenario[i] != null && questScenario[i].actorId == (0xA0F00000 | id))
- return i;
- }
-
- return -1;
- }
-
+ this.mountState = mountState;
+ }
+
+ public byte GetMountState()
+ {
+ return mountState;
+ }
+
+ public void DoEmote(uint emoteId)
+ {
+ BroadcastPacket(ActorDoEmotePacket.BuildPacket(actorId, actorId, currentTarget, emoteId), true);
+ }
+
+ public void SendGameMessage(Actor sourceActor, Actor textIdOwner, ushort textId, byte log, params object[] msgParams)
+ {
+ if (msgParams == null || msgParams.Length == 0)
+ {
+ QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, sourceActor.actorId, textIdOwner.actorId, textId, log));
+ }
+ else
+ QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, sourceActor.actorId, textIdOwner.actorId, textId, log, LuaUtils.CreateLuaParamList(msgParams)));
+ }
+
+ public void SendGameMessage(Actor textIdOwner, ushort textId, byte log, params object[] msgParams)
+ {
+ if (msgParams == null || msgParams.Length == 0)
+ QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, textIdOwner.actorId, textId, log));
+ else
+ QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, textIdOwner.actorId, textId, log, LuaUtils.CreateLuaParamList(msgParams)));
+ }
+
+ public void SendGameMessage(Actor textIdOwner, ushort textId, byte log, string customSender, params object[] msgParams)
+ {
+ if (msgParams == null || msgParams.Length == 0)
+ QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, textIdOwner.actorId, textId, customSender, log));
+ else
+ QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, textIdOwner.actorId, textId, customSender, log, LuaUtils.CreateLuaParamList(msgParams)));
+ }
+
+ public void SendGameMessage(Actor textIdOwner, ushort textId, byte log, uint displayId, params object[] msgParams)
+ {
+ if (msgParams == null || msgParams.Length == 0)
+ QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, textIdOwner.actorId, textId, displayId, log));
+ else
+ QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, textIdOwner.actorId, textId, displayId, log, LuaUtils.CreateLuaParamList(msgParams)));
+ }
+
+ public void BroadcastWorldMessage(ushort worldMasterId, params object[] msgParams)
+ {
+ //SubPacket worldMasterMessage =
+ //zone.BroadcastPacketAroundActor(this, worldMasterMessage);
+ }
+
+ public void GraphicChange(uint slot, uint graphicId)
+ {
+ appearanceIds[slot] = graphicId;
+ }
+
+ public void GraphicChange(uint slot, uint weapId, uint equipId, uint variantId, uint colorId)
+ {
+
+ uint mixedVariantId;
+
+ if (weapId == 0)
+ mixedVariantId = ((variantId & 0x1F) << 5) | colorId;
+ else
+ mixedVariantId = variantId;
+
+ uint graphicId =
+ (weapId & 0x3FF) << 20 |
+ (equipId & 0x3FF) << 10 |
+ (mixedVariantId & 0x3FF);
+
+ appearanceIds[slot] = graphicId;
+
+ }
+
+ public void SendAppearance()
+ {
+ BroadcastPacket(CreateAppearancePacket(actorId), true);
+ }
+
+ public void SendCharaExpInfo()
+ {
+ if (lastStep == 0)
+ {
+ int maxLength;
+ if ((sizeof(short) * charaWork.battleSave.skillLevel.Length)-lastPosition < 0x5E)
+ maxLength = (sizeof(short) * charaWork.battleSave.skillLevel.Length) - lastPosition;
+ else
+ maxLength = 0x5E;
+
+ byte[] skillLevelBuffer = new byte[maxLength];
+ Buffer.BlockCopy(charaWork.battleSave.skillLevel, 0, skillLevelBuffer, 0, skillLevelBuffer.Length);
+ SetActorPropetyPacket charaInfo1 = new SetActorPropetyPacket("charaWork/exp");
+
+ charaInfo1.SetIsArrayMode(true);
+ if (maxLength == 0x5E)
+ {
+ charaInfo1.AddBuffer(Utils.MurmurHash2("charaWork.battleSave.skillLevel", 0), skillLevelBuffer, 0, skillLevelBuffer.Length, 0x0);
+ lastPosition += maxLength;
+ }
+ else
+ {
+ charaInfo1.AddBuffer(Utils.MurmurHash2("charaWork.battleSave.skillLevel", 0), skillLevelBuffer, 0, skillLevelBuffer.Length, 0x3);
+ lastPosition = 0;
+ lastStep++;
+ }
+
+ charaInfo1.AddTarget();
+
+ QueuePacket(charaInfo1.BuildPacket(actorId, actorId));
+ }
+ else if (lastStep == 1)
+ {
+ int maxLength;
+ if ((sizeof(short) * charaWork.battleSave.skillLevelCap.Length) - lastPosition < 0x5E)
+ maxLength = (sizeof(short) * charaWork.battleSave.skillLevelCap.Length) - lastPosition;
+ else
+ maxLength = 0x5E;
+
+ byte[] skillCapBuffer = new byte[maxLength];
+ Buffer.BlockCopy(charaWork.battleSave.skillLevelCap, lastPosition, skillCapBuffer, 0, skillCapBuffer.Length);
+ SetActorPropetyPacket charaInfo1 = new SetActorPropetyPacket("charaWork/exp");
+
+
+ if (maxLength == 0x5E)
+ {
+ charaInfo1.SetIsArrayMode(true);
+ charaInfo1.AddBuffer(Utils.MurmurHash2("charaWork.battleSave.skillLevelCap", 0), skillCapBuffer, 0, skillCapBuffer.Length, 0x1);
+ lastPosition += maxLength;
+ }
+ else
+ {
+ charaInfo1.SetIsArrayMode(false);
+ charaInfo1.AddBuffer(Utils.MurmurHash2("charaWork.battleSave.skillLevelCap", 0), skillCapBuffer, 0, skillCapBuffer.Length, 0x3);
+ lastStep = 0;
+ lastPosition = 0;
+ }
+
+ charaInfo1.AddTarget();
+
+ QueuePacket(charaInfo1.BuildPacket(actorId, actorId));
+ }
+
+ }
+
+ public InventoryItem[] GetGearset(ushort classId)
+ {
+ return Database.GetEquipment(this, classId);
+ }
+
+ public void PrepareClassChange(byte classId)
+ {
+ //If new class, init abilties and level
+
+ SendCharaExpInfo();
+ }
+
+ public void DoClassChange(byte classId)
+ {
+ //load hotbars
+ //Calculate stats
+ //Calculate hp/mp
+
+ //Get Potenciel ??????
+
+ //Set HP/MP/TP PARAMS
+
+ //Set mainskill and level
+
+ //Set Parameters
+
+ //Set current EXP
+
+ //Set Hotbar Commands 1
+ //Set Hotbar Commands 2
+ //Set Hotbar Commands 3
+
+ //Check if bonus point available... set
+
+ //Set rested EXP
+
+ charaWork.parameterSave.state_mainSkill[0] = classId;
+ charaWork.parameterSave.state_mainSkillLevel = charaWork.battleSave.skillLevel[classId-1];
+
+ playerWork.restBonusExpRate = 0.0f;
+
+ ActorPropertyPacketUtil propertyBuilder = new ActorPropertyPacketUtil("charaWork/stateForAll", this, actorId);
+
+ propertyBuilder.AddProperty("charaWork.parameterSave.state_mainSkill[0]");
+ propertyBuilder.AddProperty("charaWork.parameterSave.state_mainSkillLevel");
+ propertyBuilder.NewTarget("playerWork/expBonus");
+ propertyBuilder.AddProperty("playerWork.restBonusExpRate");
+
+ List packets = propertyBuilder.Done();
+
+ foreach (SubPacket packet in packets)
+ BroadcastPacket(packet, true);
+
+ Database.SavePlayerCurrentClass(this);
+ }
+
+ public void GraphicChange(int slot, InventoryItem invItem)
+ {
+ if (invItem == null)
+ appearanceIds[slot] = 0;
+ else
+ {
+ Item item = Server.GetItemGamedata(invItem.itemId);
+ if (item is EquipmentItem)
+ {
+ EquipmentItem eqItem = (EquipmentItem)item;
+
+ uint mixedVariantId;
+
+ if (eqItem.graphicsWeaponId == 0)
+ mixedVariantId = ((eqItem.graphicsVariantId & 0x1F) << 5) | eqItem.graphicsColorId;
+ else
+ mixedVariantId = eqItem.graphicsVariantId;
+
+ uint graphicId =
+ (eqItem.graphicsWeaponId & 0x3FF) << 20 |
+ (eqItem.graphicsEquipmentId & 0x3FF) << 10 |
+ (mixedVariantId & 0x3FF);
+
+ appearanceIds[slot] = graphicId;
+ }
+ }
+
+ Database.SavePlayerAppearance(this);
+
+ BroadcastPacket(CreateAppearancePacket(actorId), true);
+ }
+
+ public Inventory GetInventory(ushort type)
+ {
+ if (inventories.ContainsKey(type))
+ return inventories[type];
+ else
+ return null;
+ }
+
+ public Actor GetActorInInstance(uint actorId)
+ {
+ foreach (Actor a in playerSession.actorInstanceList)
+ {
+ if (a.actorId == actorId)
+ return a;
+ }
+
+ return null;
+ }
+
+ public void SetZoneChanging(bool flag)
+ {
+ isZoneChanging = flag;
+ }
+
+ public bool IsInZoneChange()
+ {
+ return isZoneChanging;
+ }
+
+ public Equipment GetEquipment()
+ {
+ return equipment;
+ }
+
+ public byte GetInitialTown()
+ {
+ return playerWork.initialTown;
+ }
+
+ public int GetFreeQuestSlot()
+ {
+ for (int i = 0; i < questScenario.Length; i++)
+ {
+ if (questScenario[i] == null)
+ return i;
+ }
+
+ return -1;
+ }
+
+ public void AddQuest(uint id)
+ {
+ Actor actor = Server.GetStaticActors((0xA0F00000 | id));
+ AddQuest(actor.actorName);
+ }
+
+ public void AddQuest(string name)
+ {
+ Actor actor = Server.GetStaticActors(name);
+
+ if (actor == null)
+ return;
+
+ uint id = actor.actorId;
+
+ int freeSlot = GetFreeQuestSlot();
+
+ if (freeSlot == -1)
+ return;
+
+ playerWork.questScenario[freeSlot] = id;
+ questScenario[freeSlot] = new Quest(this, playerWork.questScenario[freeSlot], name, null, 0);
+ Database.SaveQuest(this, questScenario[freeSlot]);
+ SendQuestClientUpdate(freeSlot);
+ }
+
+ public void RemoveQuest(uint id)
+ {
+ if (HasQuest(id))
+ {
+ for (int i = 0; i < questScenario.Length; i++)
+ {
+ if (questScenario[i] != null && questScenario[i].actorId == id)
+ {
+ questScenario[i] = null;
+ Database.SaveQuest(this, questScenario[i]);
+ SendQuestClientUpdate(i);
+ break;
+ }
+ }
+ }
+ }
+
+ public void ReplaceQuest(uint oldId, uint newId)
+ {
+ if (HasQuest(oldId))
+ {
+ for (int i = 0; i < questScenario.Length; i++)
+ {
+ if (questScenario[i] != null && questScenario[i].GetQuestId() == oldId)
+ {
+ Actor actor = Server.GetStaticActors((0xA0F00000 | newId));
+ playerWork.questScenario[i] = (0xA0F00000 | newId);
+ questScenario[i] = new Quest(this, playerWork.questScenario[i], actor.actorName, null, 0);
+ Database.SaveQuest(this, questScenario[i]);
+ SendQuestClientUpdate(i);
+ break;
+ }
+ }
+ }
+ }
+
+ public Quest GetQuest(uint id)
+ {
+ for (int i = 0; i < questScenario.Length; i++)
+ {
+ if (questScenario[i] != null && questScenario[i].actorId == (0xA0F00000 | id))
+ return questScenario[i];
+ }
+
+ return null;
+ }
+
+ public Quest GetQuest(string name)
+ {
+ for (int i = 0; i < questScenario.Length; i++)
+ {
+ if (questScenario[i] != null && questScenario[i].actorName.ToLower().Equals(name.ToLower()))
+ return questScenario[i];
+ }
+
+ return null;
+ }
+
+ public bool HasQuest(string name)
+ {
+ for (int i = 0; i < questScenario.Length; i++)
+ {
+ if (questScenario[i] != null && questScenario[i].actorName.ToLower().Equals(name.ToLower()))
+ return true;
+ }
+
+ return false;
+ }
+
+ public bool HasQuest(uint id)
+ {
+ for (int i = 0; i < questScenario.Length; i++)
+ {
+ if (questScenario[i] != null && questScenario[i].actorId == (0xA0F00000 | id))
+ return true;
+ }
+
+ return false;
+ }
+
+ public int GetQuestSlot(uint id)
+ {
+ for (int i = 0; i < questScenario.Length; i++)
+ {
+ if (questScenario[i] != null && questScenario[i].actorId == (0xA0F00000 | id))
+ return i;
+ }
+
+ return -1;
+ }
+
+ private void SendQuestClientUpdate(int slot)
+ {
+ ActorPropertyPacketUtil propPacketUtil = new ActorPropertyPacketUtil("playerWork/journal", this, actorId);
+ propPacketUtil.AddProperty(String.Format("playerWork.questScenario[{0}]", slot));
+ QueuePackets(propPacketUtil.Done());
+ }
+
public void SetLoginDirector(Director director)
{
if (ownedDirectors.Contains(director))
loginInitDirector = director;
- }
-
- public void AddDirector(Director director)
+ }
+
+ public void AddDirector(Director director)
{
if (!ownedDirectors.Contains(director))
{
ownedDirectors.Add(director);
director.AddChild(this);
-
- //director.GetSpawnPackets(actorId).DebugPrintPacket();
-
- //QueuePacket(director.GetSpawnPackets(actorId));
- //QueuePacket(director.GetInitPackets(actorId));
//QueuePacket(director.GetSetEventStatusPackets(actorId));
- }
- }
-
+ }
+ }
+
public void RemoveDirector(Director director)
{
if (!ownedDirectors.Contains(director))
@@ -1118,17 +1172,17 @@ namespace FFXIVClassic_Map_Server.Actors
ownedDirectors.Remove(director);
director.RemoveChild(this);
}
- }
-
- public Director GetDirector(string directorName)
- {
+ }
+
+ public Director GetDirector(string directorName)
+ {
foreach (Director d in ownedDirectors)
{
- if (d.className.Equals(directorName))
+ if (d.GetScriptPath().Equals(directorName))
return d;
}
- return null;
+ return null;
}
public Director GetDirector(uint id)
@@ -1140,61 +1194,61 @@ namespace FFXIVClassic_Map_Server.Actors
}
return null;
- }
-
- public void ExaminePlayer(Actor examinee)
- {
- Player toBeExamined;
- if (examinee is Player)
- toBeExamined = (Player)examinee;
- else
- return;
-
- QueuePacket(InventoryBeginChangePacket.BuildPacket(toBeExamined.actorId, actorId));
- toBeExamined.GetEquipment().SendCheckEquipmentToPlayer(this);
- QueuePacket(InventoryEndChangePacket.BuildPacket(toBeExamined.actorId, actorId));
- }
-
- public void SendRequestedInfo(params object[] parameters)
- {
- List lParams = LuaUtils.CreateLuaParamList(parameters);
- SubPacket spacket = InfoRequestResponsePacket.BuildPacket(actorId, actorId, lParams);
- spacket.DebugPrintSubPacket();
- QueuePacket(spacket);
- }
-
- public void StartEvent(Actor owner, EventStartPacket start)
- {
- //Have to do this to combine LuaParams
- List