PSO2SERVER/Server/Protocol/Handlers/04-ObjectHandler/04-14-ObjectInteract.cs

145 lines
5.9 KiB
C#
Raw Normal View History

2024-09-10 01:13:20 +08:00
using PSO2SERVER.Database;
using PSO2SERVER.Models;
using PSO2SERVER.Object;
using PSO2SERVER.Protocol.Packets;
2024-12-03 18:17:43 +08:00
using PSO2SERVER.Zone;
2024-09-10 00:31:40 +08:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace PSO2SERVER.Protocol.Handlers
2024-09-10 00:31:40 +08:00
{
2024-09-16 02:56:02 +08:00
[PacketHandlerAttr(0x04, 0x14)]
2024-12-03 13:18:58 +08:00
public class ObjectInteract : PacketHandler
2024-09-10 00:31:40 +08:00
{
2024-12-10 13:33:57 +08:00
public class InteractPacket
{
// Fields
public byte[] Unk1 { get; set; } // [u8; 0xC]
public ObjectHeader Object1 { get; set; }
public byte[] Unk2 { get; set; } // [u8; 0x4]
public ObjectHeader Object3 { get; set; }
public byte[] Object4 { get; set; } // [u8; 0x10]
public string Action { get; set; } // AsciiString
// Constructor
public InteractPacket()
{
Unk1 = new byte[0x0C]; // Initialize arrays with appropriate sizes
Unk2 = new byte[0x04];
Object4 = new byte[0x10];
Action = string.Empty;
}
// Deserialize constructor (for example purposes, if needed)
public InteractPacket(byte[] unk1, ObjectHeader object1, byte[] unk2, ObjectHeader object3, byte[] object4, string action)
{
Unk1 = unk1;
Object1 = object1;
Unk2 = unk2;
Object3 = object3;
Object4 = object4;
Action = action;
}
}
2024-09-10 00:31:40 +08:00
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
2024-12-10 13:33:57 +08:00
var reader = new PacketReader(data, position, size);
var pkt = new InteractPacket
{
Unk1 = reader.ReadBytes(0x0C),
Object1 = reader.ReadObjectHeader(),
Unk2 = reader.ReadBytes(4),
Object3 = reader.ReadObjectHeader(),
Object4 = reader.ReadBytes(0x10),
Action = reader.ReadAscii(0xD711, 0xCA)
};
2024-12-11 04:10:57 +08:00
//Logger.Write($"PKT:Object1 {pkt.Object1.ToString()} Object3 {pkt.Object3.ToString()} Action {pkt.Action}");
2024-12-10 13:33:57 +08:00
2024-09-10 00:31:40 +08:00
PSOObject srcObj;
2024-12-10 13:33:57 +08:00
if(pkt.Object1.ObjectType == ObjectType.Object)
2024-09-10 00:31:40 +08:00
{
2024-12-10 23:08:39 +08:00
srcObj = ObjectManager.Instance.getObjectByID(context.CurrentMap.Name, pkt.Object1.ID);
2024-09-10 00:31:40 +08:00
}
2024-12-10 13:33:57 +08:00
else if(pkt.Object1.ObjectType == ObjectType.Player)
2024-09-10 00:31:40 +08:00
{
2024-09-16 15:30:00 +08:00
srcObj = new PSOObject
{
2024-12-10 13:33:57 +08:00
Header = pkt.Object1,
Name = "Accounts"
2024-09-16 15:30:00 +08:00
};
2024-09-10 00:31:40 +08:00
}
else
{
srcObj = null;
}
2024-12-08 11:33:06 +08:00
//Logger.WriteInternal("[OBJ] {0} (ID {1}) <{2}> --> Ent {3} (ID {4})", srcObj.name, srcObj.Header.ID, command, (ObjectType)dstObject.ObjectType, dstObject.ID);
2024-09-10 00:31:40 +08:00
// TODO: Delete this code and do this COMPLETELY correctly!!!
2024-12-10 23:08:39 +08:00
if (pkt.Action == "Transfer" && context.CurrentMap.Name == "lobby")
2024-09-10 00:31:40 +08:00
{
// Try and get the teleport definition for the object...
2024-09-10 01:13:20 +08:00
using (var db = new ServerEf())
2024-09-10 00:31:40 +08:00
{
db.Configuration.AutoDetectChangesEnabled = true;
2024-12-10 13:33:57 +08:00
var teleporterEndpoint = db.Teleports.Find("lobby", (int)pkt.Object1.ID);
2024-09-10 00:31:40 +08:00
if (teleporterEndpoint == null)
{
2024-12-03 18:17:43 +08:00
Logger.WriteError("[OBJ] 传输 {0} 于 {1} 没有包含一个有效目的地!", srcObj.Header.ID, "lobby");
// Teleport Accounts to default point
2024-09-10 00:31:40 +08:00
context.SendPacket(new TeleportTransferPacket(srcObj, new PSOLocation(0f, 1f, 0f, -0.000031f, -0.417969f, 0.000031f, 134.375f)));
// Unhide player
2024-12-10 13:33:57 +08:00
context.SendPacket(new ObjectActionPacket(pkt.Object3, pkt.Object1, new ObjectHeader(), new ObjectHeader(), "Forwarded"));
2024-09-10 00:31:40 +08:00
}
else
{
PSOLocation endpointLocation = new PSOLocation()
{
RotX = teleporterEndpoint.RotX,
RotY = teleporterEndpoint.RotY,
RotZ = teleporterEndpoint.RotZ,
RotW = teleporterEndpoint.RotW,
PosX = teleporterEndpoint.PosX,
PosY = teleporterEndpoint.PosY,
PosZ = teleporterEndpoint.PosZ,
};
// Teleport Accounts
2024-09-10 00:31:40 +08:00
context.SendPacket(new TeleportTransferPacket(srcObj, endpointLocation));
// Unhide player
2024-12-10 13:33:57 +08:00
context.SendPacket(new ObjectActionPacket(pkt.Object3, pkt.Object1, new ObjectHeader(), new ObjectHeader(), "Forwarded"));
2024-09-10 00:31:40 +08:00
}
}
}
2024-12-10 13:33:57 +08:00
if (pkt.Action == "READY")
2024-09-10 00:31:40 +08:00
{
2024-09-21 13:11:22 +08:00
context.SendPacket(new ObjectActionPacket(new ObjectHeader((uint)context._account.AccountId, ObjectType.Player), srcObj.Header, srcObj.Header,
2024-09-10 00:31:40 +08:00
new ObjectHeader(), "FavsNeutral"));
2024-09-21 13:11:22 +08:00
context.SendPacket(new ObjectActionPacket(new ObjectHeader((uint)context._account.AccountId, ObjectType.Player), srcObj.Header, srcObj.Header,
2024-09-10 00:31:40 +08:00
new ObjectHeader(), "AP")); // Short for Appear, Thanks Zapero!
}
2024-12-10 13:33:57 +08:00
if (pkt.Action == "Sit")
2024-09-10 00:31:40 +08:00
{
foreach (var client in Server.Instance.Clients)
{
if (client.Character == null || client == context)
continue;
2024-09-21 13:11:22 +08:00
client.SendPacket(new ObjectActionPacket(new ObjectHeader((uint)client._account.AccountId, ObjectType.Player), srcObj.Header,
2024-12-10 13:33:57 +08:00
new ObjectHeader(pkt.Object3.ID, ObjectType.Player), new ObjectHeader(), "SitSuccess"));
2024-09-10 00:31:40 +08:00
}
}
}
}
}