mirror of
https://bitbucket.org/Ioncannon/project-meteor-server.git
synced 2025-04-21 20:27:47 +00:00
Rewrote the server commands. They can now accept a client connection, letting a user fire a command from within the game and only receive the response. Added actor removal for the instance system. Removed hardcoded packet 9.
This commit is contained in:
parent
7bc3c8c2dd
commit
f1025f89d3
6 changed files with 149 additions and 92 deletions
|
@ -181,7 +181,10 @@ namespace FFXIVClassic_Lobby_Server
|
|||
case 0x0003:
|
||||
ChatMessagePacket chatMessage = new ChatMessagePacket(subpacket.data);
|
||||
Log.info(String.Format("Got type-{5} message: {0} @ {1}, {2}, {3}, Rot: {4}", chatMessage.message, chatMessage.posX, chatMessage.posY, chatMessage.posZ, chatMessage.posRot, chatMessage.logType));
|
||||
subpacket.debugPrintSubPacket();
|
||||
//subpacket.debugPrintSubPacket();
|
||||
|
||||
mServer.doCommand(chatMessage.message, player);
|
||||
|
||||
break;
|
||||
//Unknown
|
||||
case 0x0007:
|
||||
|
@ -347,16 +350,5 @@ namespace FFXIVClassic_Lobby_Server
|
|||
}
|
||||
}
|
||||
|
||||
public void sendPacket(string path)
|
||||
{
|
||||
BasePacket packet = new BasePacket(path);
|
||||
|
||||
foreach (KeyValuePair<uint, ConnectedPlayer> entry in mPlayers)
|
||||
{
|
||||
packet.replaceActorID(entry.Value.actorID);
|
||||
entry.Value.queuePacket(packet);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -72,62 +72,7 @@ namespace FFXIVClassic_Lobby_Server
|
|||
while (true)
|
||||
{
|
||||
String input = Console.ReadLine();
|
||||
String[] split = input.Split(' ');
|
||||
|
||||
if (split.Length >= 1)
|
||||
{
|
||||
if (split[0].Equals("mypos"))
|
||||
{
|
||||
try
|
||||
{
|
||||
server.printPos();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Log.error("Could not load packet: " + e);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (split.Length >= 2)
|
||||
{
|
||||
if (split[0].Equals("sendpacket"))
|
||||
{
|
||||
try
|
||||
{
|
||||
server.sendPacket("./packets/" + split[1]);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Log.error("Could not load packet: " + e);
|
||||
}
|
||||
}
|
||||
else if (split[0].Equals("music"))
|
||||
{
|
||||
try
|
||||
{
|
||||
server.doMusic(split[1]);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Log.error("Could not change music: " + e);
|
||||
}
|
||||
}
|
||||
else if (split[0].Equals("warp"))
|
||||
{
|
||||
server.doWarp(split[1]);
|
||||
}
|
||||
}
|
||||
if (split.Length >= 3)
|
||||
{
|
||||
if (split[0].Equals("warp"))
|
||||
{
|
||||
server.doWarp(split[1], split[2], split[3], split[4]);
|
||||
}
|
||||
else if (split[0].Equals("property"))
|
||||
{
|
||||
server.testCodePacket(Utils.MurmurHash2(split[1], 0), Convert.ToUInt32(split[2], 16), split[3]);
|
||||
}
|
||||
}
|
||||
server.doCommand(input, null);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -230,9 +230,23 @@ namespace FFXIVClassic_Lobby_Server
|
|||
|
||||
#endregion
|
||||
|
||||
public void sendPacket(string path)
|
||||
public void sendPacket(ConnectedPlayer client, string path)
|
||||
{
|
||||
mProcessor.sendPacket(path);
|
||||
BasePacket packet = new BasePacket(path);
|
||||
|
||||
if (client != null)
|
||||
{
|
||||
packet.replaceActorID(client.actorID);
|
||||
client.queuePacket(packet);
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (KeyValuePair<uint, ConnectedPlayer> entry in mConnectedPlayerList)
|
||||
{
|
||||
packet.replaceActorID(entry.Value.actorID);
|
||||
entry.Value.queuePacket(packet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void testCodePacket(uint id, uint value, string target)
|
||||
|
@ -254,7 +268,7 @@ namespace FFXIVClassic_Lobby_Server
|
|||
}
|
||||
}
|
||||
|
||||
public void doMusic(string music)
|
||||
public void doMusic(ConnectedPlayer client, string music)
|
||||
{
|
||||
ushort musicId;
|
||||
|
||||
|
@ -263,14 +277,19 @@ namespace FFXIVClassic_Lobby_Server
|
|||
else
|
||||
musicId = Convert.ToUInt16(music);
|
||||
|
||||
if (client != null)
|
||||
client.queuePacket(BasePacket.createPacket(SetMusicPacket.buildPacket(client.actorID, musicId, 1), true, false));
|
||||
else
|
||||
{
|
||||
foreach (KeyValuePair<uint, ConnectedPlayer> entry in mConnectedPlayerList)
|
||||
{
|
||||
BasePacket musicPacket = BasePacket.createPacket(SetMusicPacket.buildPacket(entry.Value.actorID, musicId, 1), true, false);
|
||||
entry.Value.queuePacket(musicPacket);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void doWarp(string entranceId)
|
||||
public void doWarp(ConnectedPlayer client, string entranceId)
|
||||
{
|
||||
uint id;
|
||||
|
||||
|
@ -284,13 +303,18 @@ namespace FFXIVClassic_Lobby_Server
|
|||
if (ze == null)
|
||||
return;
|
||||
|
||||
if (client != null)
|
||||
mWorldManager.DoZoneChange(client.getActor(), ze.zoneId, ze.spawnType, ze.spawnX, ze.spawnY, ze.spawnZ, 0.0f);
|
||||
else
|
||||
{
|
||||
foreach (KeyValuePair<uint, ConnectedPlayer> entry in mConnectedPlayerList)
|
||||
{
|
||||
mWorldManager.DoZoneChange(entry.Value.getActor(), ze.zoneId, ze.spawnType, ze.spawnX, ze.spawnY, ze.spawnZ, 0.0f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void doWarp(string map, string sx, string sy, string sz)
|
||||
public void doWarp(ConnectedPlayer client, string map, string sx, string sy, string sz)
|
||||
{
|
||||
uint mapId;
|
||||
float x,y,z;
|
||||
|
@ -304,11 +328,16 @@ namespace FFXIVClassic_Lobby_Server
|
|||
y = Single.Parse(sy);
|
||||
z = Single.Parse(sz);
|
||||
|
||||
if (client != null)
|
||||
mWorldManager.DoZoneChange(client.getActor(), mapId, 0x2, x, y, z, 0.0f);
|
||||
else
|
||||
{
|
||||
foreach (KeyValuePair<uint, ConnectedPlayer> entry in mConnectedPlayerList)
|
||||
{
|
||||
mWorldManager.DoZoneChange(entry.Value.getActor(), mapId, 0x2, x, y, z, 0.0f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public WorldManager GetWorldManager()
|
||||
{
|
||||
|
@ -316,7 +345,14 @@ namespace FFXIVClassic_Lobby_Server
|
|||
}
|
||||
|
||||
|
||||
public void printPos()
|
||||
public void printPos(ConnectedPlayer client)
|
||||
{
|
||||
if (client != null)
|
||||
{
|
||||
Player p = client.getActor();
|
||||
client.queuePacket(BasePacket.createPacket(SendMessagePacket.buildPacket(client.actorID, client.actorID, SendMessagePacket.MESSAGE_TYPE_GENERAL_INFO, "", String.Format("Position: {1}, {2}, {3}, {4}", p.customDisplayName, p.positionX, p.positionY, p.positionZ, p.rotation)), true, false));
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (KeyValuePair<uint, ConnectedPlayer> entry in mConnectedPlayerList)
|
||||
{
|
||||
|
@ -326,4 +362,65 @@ namespace FFXIVClassic_Lobby_Server
|
|||
}
|
||||
}
|
||||
|
||||
internal void doCommand(string input, ConnectedPlayer client)
|
||||
{
|
||||
String[] split = input.Split(' ');
|
||||
|
||||
if (split.Length >= 1)
|
||||
{
|
||||
if (split[0].Equals("mypos"))
|
||||
{
|
||||
try
|
||||
{
|
||||
printPos(client);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Log.error("Could not load packet: " + e);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (split.Length >= 2)
|
||||
{
|
||||
if (split[0].Equals("sendpacket"))
|
||||
{
|
||||
try
|
||||
{
|
||||
sendPacket(client, "./packets/" + split[1]);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Log.error("Could not load packet: " + e);
|
||||
}
|
||||
}
|
||||
else if (split[0].Equals("music"))
|
||||
{
|
||||
try
|
||||
{
|
||||
doMusic(client, split[1]);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Log.error("Could not change music: " + e);
|
||||
}
|
||||
}
|
||||
else if (split[0].Equals("warp"))
|
||||
{
|
||||
doWarp(client, split[1]);
|
||||
}
|
||||
}
|
||||
if (split.Length >= 3)
|
||||
{
|
||||
if (split[0].Equals("warp"))
|
||||
{
|
||||
doWarp(client, split[1], split[2], split[3], split[4]);
|
||||
}
|
||||
else if (split[0].Equals("property"))
|
||||
{
|
||||
testCodePacket(Utils.MurmurHash2(split[1], 0), Convert.ToUInt32(split[2], 16), split[3]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -458,21 +458,18 @@ namespace FFXIVClassic_Map_Server.Actors
|
|||
|
||||
playerSession.queuePacket(getInitPackets(actorId));
|
||||
|
||||
BasePacket innSpawn = zone.getSpawnPackets(actorId);
|
||||
BasePacket areaMasterSpawn = zone.getSpawnPackets(actorId);
|
||||
BasePacket debugSpawn = world.GetDebugActor().getSpawnPackets(actorId);
|
||||
BasePacket worldMasterSpawn = world.GetActor().getSpawnPackets(actorId);
|
||||
playerSession.queuePacket(innSpawn);
|
||||
playerSession.queuePacket(areaMasterSpawn);
|
||||
playerSession.queuePacket(debugSpawn);
|
||||
playerSession.queuePacket(worldMasterSpawn);
|
||||
|
||||
#region hardcode
|
||||
BasePacket reply9 = new BasePacket("./packets/login/login9_zonesetup.bin"); //Bed, Book created
|
||||
BasePacket reply10 = new BasePacket("./packets/login/login10.bin"); //Item Storage, Inn Door created
|
||||
BasePacket reply11 = new BasePacket("./packets/login/login11.bin"); //NPC Create ??? Final init
|
||||
reply9.replaceActorID(actorId);
|
||||
reply10.replaceActorID(actorId);
|
||||
reply11.replaceActorID(actorId);
|
||||
playerSession.queuePacket(reply9);
|
||||
playerSession.queuePacket(reply10);
|
||||
playerSession.queuePacket(reply11);
|
||||
#endregion
|
||||
|
|
|
@ -95,8 +95,23 @@ namespace FFXIVClassic_Map_Server.dataobjects
|
|||
public List<BasePacket> updateInstance(List<Actor> list)
|
||||
{
|
||||
List<BasePacket> basePackets = new List<BasePacket>();
|
||||
List<SubPacket> removeActorSubpackets = new List<SubPacket>();
|
||||
List<SubPacket> posUpdateSubpackets = new List<SubPacket>();
|
||||
|
||||
//Remove missing actors
|
||||
for (int i = 0; i < actorInstanceList.Count; i++)
|
||||
{
|
||||
if (!list.Contains(actorInstanceList[i]))
|
||||
{
|
||||
removeActorSubpackets.Add(RemoveActorPacket.buildPacket(playerActor.actorId, actorInstanceList[i].actorId));
|
||||
actorInstanceList.RemoveAt(i);
|
||||
}
|
||||
}
|
||||
|
||||
if (removeActorSubpackets.Count != 0)
|
||||
basePackets.Add(BasePacket.createPacket(removeActorSubpackets, true, false));
|
||||
|
||||
//Add new actors or move
|
||||
for (int i = 0; i < list.Count; i++)
|
||||
{
|
||||
Actor actor = list[i];
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
using FFXIVClassic_Lobby_Server.packets;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
@ -12,9 +13,19 @@ namespace FFXIVClassic_Map_Server.packets.send.actor
|
|||
public const ushort OPCODE = 0x00CB;
|
||||
public const uint PACKET_SIZE = 0x28;
|
||||
|
||||
public static SubPacket buildPacket(uint playerActorID, uint actorID)
|
||||
public static SubPacket buildPacket(uint playerActorID, uint actorId)
|
||||
{
|
||||
return new SubPacket(OPCODE, playerActorID, actorID, new byte[8]);
|
||||
byte[] data = new byte[PACKET_SIZE - 0x20];
|
||||
|
||||
using (MemoryStream mem = new MemoryStream(data))
|
||||
{
|
||||
using (BinaryWriter binWriter = new BinaryWriter(mem))
|
||||
{
|
||||
binWriter.Write((UInt32)actorId);
|
||||
}
|
||||
}
|
||||
|
||||
return new SubPacket(OPCODE, actorId, playerActorID, data);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue