2024-09-10 01:13:20 +08:00
using PSO2SERVER.Database ;
using PSO2SERVER.Models ;
using PSO2SERVER.Object ;
2024-11-27 18:05:53 +08:00
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 ;
2024-11-27 18:05:53 +08:00
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 )
} ;
Logger . Write ( $"PKT:Object1 {pkt.Object1.ToString()} Object3 {pkt.Object3.ToString()} Action {pkt.Action}" ) ;
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 13:33:57 +08:00
srcObj = ObjectManager . Instance . getObjectByID ( context . CurrentZone . 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 ,
2024-12-03 13:10:49 +08:00
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 13:33:57 +08:00
if ( pkt . Action = = "Transfer" & & context . CurrentZone . 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" ) ;
2024-12-03 13:10:49 +08:00
// 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 ,
} ;
2024-12-03 13:10:49 +08:00
// 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
}
}
}
}
}