mirror of
https://bitbucket.org/Ioncannon/project-meteor-server.git
synced 2025-07-24 11:28:22 +02:00
Overhaul of the director system and opening quests. Private Areas further implemented as well.
This commit is contained in:
parent
dcaad5729d
commit
e898c045f7
69 changed files with 2602 additions and 1816 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -152,7 +152,7 @@
|
|||
<Compile Include="packets\receive\supportdesk\GMSupportTicketPacket.cs" />
|
||||
<Compile Include="packets\receive\supportdesk\GMTicketIssuesRequestPacket.cs" />
|
||||
<Compile Include="packets\receive\_0x02ReceivePacket.cs" />
|
||||
<Compile Include="packets\receive\_0x07Packet.cs" />
|
||||
<Compile Include="packets\receive\ZoneInCompletePacket.cs" />
|
||||
<Compile Include="packets\send\actor\ActorDoEmotePacket.cs" />
|
||||
<Compile Include="packets\send\actor\ActorInstantiatePacket.cs" />
|
||||
<Compile Include="packets\send\actor\ActorSpecialGraphicPacket.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<long, string>[] { new Tuple<long, string>(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<long, string>[] { new Tuple<long, string>(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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -16,6 +16,7 @@ namespace FFXIVClassic_Map_Server.actors.area
|
|||
class Zone : Area
|
||||
{
|
||||
Dictionary<string, Dictionary<uint, PrivateArea>> privateAreas = new Dictionary<string, Dictionary<uint, PrivateArea>>();
|
||||
Dictionary<string, List<PrivateArea>> instancedPrivateAreas = new Dictionary<string, List<PrivateArea>>();
|
||||
|
||||
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<uint, PrivateArea>();
|
||||
privateAreas[pa.GetPrivateAreaName()][0] = pa;
|
||||
privateAreas[pa.GetPrivateAreaName()][pa.GetPrivateAreaType()] = pa;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -68,14 +68,42 @@ namespace FFXIVClassic_Map_Server.actors.director
|
|||
return BasePacket.CreatePacket(initProperties.BuildPacket(playerActorId, actorId), true, false);
|
||||
}
|
||||
|
||||
public void OnTalked(Player player, Npc npc)
|
||||
public void OnTalkEvent(Player player, Npc npc)
|
||||
{
|
||||
LuaEngine.DoDirectorOnTalked(this, player, npc);
|
||||
if (File.Exists("./scripts/directors/" + directorScriptPath + ".lua"))
|
||||
{
|
||||
LuaScript script = LuaEngine.LoadScript("./scripts/directors/" + directorScriptPath + ".lua");
|
||||
|
||||
if (script == null)
|
||||
return;
|
||||
|
||||
//Run Script
|
||||
if (!script.Globals.Get("onTalkEvent").IsNil())
|
||||
script.Call(script.Globals["onTalkEvent"], player, npc);
|
||||
}
|
||||
else
|
||||
{
|
||||
LuaEngine.SendError(player, String.Format("ERROR: Could not find script for director {0}.", GetName()));
|
||||
}
|
||||
}
|
||||
|
||||
public void OnCommand(Player player, Command command)
|
||||
public void OnCommandEvent(Player player, Command command)
|
||||
{
|
||||
LuaEngine.DoDirectorOnCommand(this, player, command);
|
||||
if (File.Exists("./scripts/directors/" + directorScriptPath + ".lua"))
|
||||
{
|
||||
LuaScript script = LuaEngine.LoadScript("./scripts/directors/" + directorScriptPath + ".lua");
|
||||
|
||||
if (script == null)
|
||||
return;
|
||||
|
||||
//Run Script
|
||||
if (!script.Globals.Get("onCommandEvent").IsNil())
|
||||
script.Call(script.Globals["onCommandEvent"], player, command);
|
||||
}
|
||||
else
|
||||
{
|
||||
LuaEngine.SendError(player, String.Format("ERROR: Could not find script for director {0}.", GetName()));
|
||||
}
|
||||
}
|
||||
|
||||
public void AddChild(Actor actor)
|
||||
|
@ -186,10 +214,15 @@ namespace FFXIVClassic_Map_Server.actors.director
|
|||
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);
|
||||
}
|
||||
|
||||
public string GetScriptPath()
|
||||
{
|
||||
return directorScriptPath;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -41,6 +41,11 @@ namespace FFXIVClassic_Map_Server.Actors
|
|||
//Inform update
|
||||
}
|
||||
|
||||
public uint GetQuestId()
|
||||
{
|
||||
return actorId & 0xFFFFF;
|
||||
}
|
||||
|
||||
public object GetQuestData(string dataName)
|
||||
{
|
||||
if (questData.ContainsKey(dataName))
|
||||
|
@ -52,12 +57,7 @@ namespace FFXIVClassic_Map_Server.Actors
|
|||
public void ClearQuestData()
|
||||
{
|
||||
questData.Clear();
|
||||
}
|
||||
|
||||
public uint GetQuestId()
|
||||
{
|
||||
return actorId;
|
||||
}
|
||||
}
|
||||
|
||||
public void ClearQuestFlags()
|
||||
{
|
||||
|
@ -98,9 +98,11 @@ namespace FFXIVClassic_Map_Server.Actors
|
|||
return currentPhase;
|
||||
}
|
||||
|
||||
public void NextPhase()
|
||||
public void NextPhase(int phaseNumber)
|
||||
{
|
||||
currentPhase++;
|
||||
currentPhase = phaseNumber;
|
||||
owner.SendGameMessage(Server.GetWorldManager().GetActor(), 25116, 0x20, (object)GetQuestId());
|
||||
SaveData();
|
||||
}
|
||||
|
||||
public uint GetQuestFlags()
|
||||
|
|
|
@ -173,6 +173,23 @@ namespace FFXIVClassic_Map_Server.lua
|
|||
}
|
||||
}
|
||||
|
||||
public static void OnZoneInDone(Player player)
|
||||
{
|
||||
string luaPath = String.Format(FILEPATH_ZONE, player.GetZone().zoneName);
|
||||
|
||||
if (File.Exists(luaPath))
|
||||
{
|
||||
LuaScript script = LoadScript(luaPath);
|
||||
|
||||
if (script == null)
|
||||
return;
|
||||
|
||||
//Run Script
|
||||
if (!script.Globals.Get("onZoneInDone").IsNil())
|
||||
script.Call(script.Globals["onZoneInDone"], player.GetZone(), player);
|
||||
}
|
||||
}
|
||||
|
||||
public static void OnBeginLogin(Player player)
|
||||
{
|
||||
if (File.Exists(FILEPATH_PLAYER))
|
||||
|
@ -393,48 +410,6 @@ namespace FFXIVClassic_Map_Server.lua
|
|||
player.SendMessage(SendMessagePacket.MESSAGE_TYPE_SYSTEM_ERROR, "", message);
|
||||
player.playerSession.QueuePacket(BasePacket.CreatePacket(SendError, true, false));
|
||||
}
|
||||
|
||||
|
||||
internal static void DoDirectorOnTalked(Director director, Player player, Npc npc)
|
||||
{
|
||||
string luaPath = String.Format(FILEPATH_DIRECTORS, director.GetName());
|
||||
|
||||
if (File.Exists(luaPath))
|
||||
{
|
||||
LuaScript script = LoadScript(luaPath);
|
||||
|
||||
if (script == null)
|
||||
return;
|
||||
|
||||
//Run Script
|
||||
if (!script.Globals.Get("onTalked").IsNil())
|
||||
script.Call(script.Globals["onTalked"], player, npc);
|
||||
}
|
||||
else
|
||||
{
|
||||
SendError(player, String.Format("ERROR: Could not find script for director {0}.", director.GetName()));
|
||||
}
|
||||
}
|
||||
|
||||
internal static void DoDirectorOnCommand(Director director, Player player, Command command)
|
||||
{
|
||||
string luaPath = String.Format(FILEPATH_DIRECTORS, director.GetName());
|
||||
|
||||
if (File.Exists(luaPath))
|
||||
{
|
||||
LuaScript script = LoadScript(luaPath);
|
||||
|
||||
if (script == null)
|
||||
return;
|
||||
|
||||
//Run Script
|
||||
if (!script.Globals.Get("onCommand").IsNil())
|
||||
script.Call(script.Globals["onCommand"], player, command);
|
||||
}
|
||||
else
|
||||
{
|
||||
SendError(player, String.Format("ERROR: Could not find script for director {0}.", director.GetName()));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,13 +3,13 @@ using System.IO;
|
|||
|
||||
namespace FFXIVClassic_Map_Server.packets.receive
|
||||
{
|
||||
class _0x07Packet
|
||||
class ZoneInCompletePacket
|
||||
{
|
||||
public bool invalidPacket = false;
|
||||
public uint timestamp;
|
||||
public uint unknown;
|
||||
public int unknown;
|
||||
|
||||
public _0x07Packet(byte[] data)
|
||||
public ZoneInCompletePacket(byte[] data)
|
||||
{
|
||||
using (MemoryStream mem = new MemoryStream(data))
|
||||
{
|
||||
|
@ -17,7 +17,7 @@ namespace FFXIVClassic_Map_Server.packets.receive
|
|||
{
|
||||
try{
|
||||
timestamp = binReader.ReadUInt32();
|
||||
unknown = binReader.ReadUInt32();
|
||||
unknown = binReader.ReadInt32();
|
||||
}
|
||||
catch (Exception){
|
||||
invalidPacket = true;
|
|
@ -24,7 +24,7 @@ namespace FFXIVClassic_Map_Server.packets.send.events
|
|||
binWriter.Write((UInt32)playerActorId);
|
||||
binWriter.Write((UInt32)targetActorId);
|
||||
|
||||
int test = 0x75dc8705; //This will crash if set to 0 on pushCommand but not for mining which has to be 0????
|
||||
int test = 0x75dc1705; //This will crash if set to 0 on pushCommand but not for mining which has to be 0????
|
||||
|
||||
binWriter.Write((UInt32)test);
|
||||
binWriter.Write((UInt32)0x30400000);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue