1
Fork 0
mirror of https://bitbucket.org/Ioncannon/project-meteor-server.git synced 2025-04-20 11:47:48 +00:00
project-meteor-server/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs

168 lines
5.1 KiB
C#
Raw Normal View History

using FFXIVClassic_Map_Server;
using FFXIVClassic.Common;
using FFXIVClassic_Map_Server.packets;
using FFXIVClassic_Map_Server.Actors;
using FFXIVClassic_Map_Server.lua;
using FFXIVClassic_Map_Server.packets.send.actor;
2015-09-25 18:52:25 -04:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FFXIVClassic_Map_Server.dataobjects
{
class ConnectedPlayer
{
public uint actorID = 0;
Player playerActor;
public List<Actor> actorInstanceList = new List<Actor>();
public uint languageCode = 1;
private ClientConnection zoneConnection;
private ClientConnection chatConnection;
2015-09-25 18:52:25 -04:00
private uint lastPingPacket = Utils.UnixTimeStampUTC();
public string errorMessage = "";
2015-09-25 18:52:25 -04:00
public ConnectedPlayer(uint actorId)
2015-09-25 18:52:25 -04:00
{
this.actorID = actorId;
playerActor = new Player(this, actorId);
actorInstanceList.Add(playerActor);
2015-09-25 18:52:25 -04:00
}
public void SetConnection(int type, ClientConnection conn)
2015-09-25 18:52:25 -04:00
{
conn.connType = type;
switch (type)
{
case BasePacket.TYPE_ZONE:
zoneConnection = conn;
break;
case BasePacket.TYPE_CHAT:
chatConnection = conn;
break;
}
2015-09-25 18:52:25 -04:00
}
public bool IsClientConnectionsReady()
2015-09-25 18:52:25 -04:00
{
return (zoneConnection != null && chatConnection != null);
2015-09-25 18:52:25 -04:00
}
public void Disconnect()
2015-09-25 18:52:25 -04:00
{
zoneConnection.Disconnect();
chatConnection.Disconnect();
}
2015-09-25 18:52:25 -04:00
public bool IsDisconnected()
{
return (!zoneConnection.IsConnected() && !chatConnection.IsConnected());
}
public void QueuePacket(BasePacket basePacket)
{
zoneConnection.QueuePacket(basePacket);
}
public void QueuePacket(SubPacket subPacket, bool isAuthed, bool isEncrypted)
{
zoneConnection.QueuePacket(subPacket, isAuthed, isEncrypted);
}
public Player GetActor()
{
return playerActor;
}
public void Ping()
{
lastPingPacket = Utils.UnixTimeStampUTC();
}
public bool CheckIfDCing()
{
uint currentTime = Utils.UnixTimeStampUTC();
if (currentTime - lastPingPacket >= 5000) //Show D/C flag
playerActor.SetDCFlag(true);
else if (currentTime - lastPingPacket >= 30000) //DCed
return true;
else
playerActor.SetDCFlag(false);
return false;
}
public void UpdatePlayerActorPosition(float x, float y, float z, float rot, ushort moveState)
{
playerActor.oldPositionX = playerActor.positionX;
playerActor.oldPositionY = playerActor.positionY;
playerActor.oldPositionZ = playerActor.positionZ;
playerActor.oldRotation = playerActor.rotation;
2015-09-25 18:52:25 -04:00
playerActor.positionX = x;
playerActor.positionY = y;
playerActor.positionZ = z;
playerActor.rotation = rot;
playerActor.moveState = moveState;
GetActor().zone.UpdateActorPosition(GetActor());
2015-09-25 18:52:25 -04:00
}
public void 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]))
{
GetActor().QueuePacket(RemoveActorPacket.BuildPacket(playerActor.actorId, actorInstanceList[i].actorId));
actorInstanceList.RemoveAt(i);
}
}
//Add new actors or move
for (int i = 0; i < list.Count; i++)
{
Actor actor = list[i];
if (actor.actorId == playerActor.actorId)
continue;
if (actorInstanceList.Contains(actor))
2015-10-13 22:58:21 -04:00
{
GetActor().QueuePacket(actor.CreatePositionUpdatePacket(playerActor.actorId));
2015-10-13 22:58:21 -04:00
}
else
2015-10-13 22:58:21 -04:00
{
GetActor().QueuePacket(actor.GetSpawnPackets(playerActor.actorId, 1));
GetActor().QueuePacket(actor.GetInitPackets(playerActor.actorId));
GetActor().QueuePacket(actor.GetSetEventStatusPackets(playerActor.actorId));
2015-10-13 22:58:21 -04:00
actorInstanceList.Add(actor);
if (actor is Npc)
{
((Npc)actor).DoOnActorSpawn(playerActor);
}
2015-10-13 22:58:21 -04:00
}
}
}
public void ClearInstance()
{
actorInstanceList.Clear();
}
2015-09-25 18:52:25 -04:00
}
}