Repository navigation
Expand file tree
/
Copy pathNetPackageProxiStack.cs
More file actions
157 lines (143 loc) · 5.89 KB
/
Copy pathNetPackageProxiStack.cs
File metadata and controls
157 lines (143 loc) · 5.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
using System;
using System.Collections.Generic;
using UnityEngine;
namespace ProxiStack
{
/// <summary>
/// Netzwerkpaket für ProxiStack (Stash & Restock) im Multiplayer.
/// Client → Server: Sendet Spieler-ID und Aktionstyp
/// Server → Client: Sendet Container-Offsets zurück
///
/// Für 7DTD v3.0: NetPackage hat keine abstrakte SendTo() mehr.
/// Stattdessen wird via ClientInfo.SendPackage() versendet.
/// </summary>
public class NetPackageProxiStack : NetPackage
{
private int playerEntityId;
private ProxiStackType actionType;
private List<Vector3i> containerOffsets;
public NetPackageProxiStack Setup(int _playerEntityId, ProxiStackType _actionType)
{
playerEntityId = _playerEntityId;
actionType = _actionType;
containerOffsets = null;
return this;
}
public NetPackageProxiStack Setup(int _playerEntityId, ProxiStackType _actionType, List<Vector3i> _offsets)
{
playerEntityId = _playerEntityId;
actionType = _actionType;
containerOffsets = _offsets;
return this;
}
public override NetPackageDirection PackageDirection => NetPackageDirection.Both;
public override bool AllowedBeforeAuth => false;
// v3.3: NetPackage.GetLength() wurde entfernt (kein Vanilla-Paket überschreibt
// es in V 3.3.0 b18 mehr). Der frühere Override verursachte
// CS0115 "marked as an override but no suitable method found to override"
// und damit einen Totalausfall des Mod-Ladens. Die Längenermittlung
// übernimmt jetzt die Basisklasse.
public override void read(PooledBinaryReader _reader)
{
try
{
playerEntityId = _reader.ReadInt32();
actionType = (ProxiStackType)_reader.ReadByte();
int count = _reader.ReadUInt16();
containerOffsets = new List<Vector3i>(count);
for (int i = 0; i < count; i++)
{
containerOffsets.Add(new Vector3i(
_reader.ReadInt16(),
_reader.ReadInt16(),
_reader.ReadInt16()
));
}
}
catch (Exception ex)
{
Log.Warning($"[ProxiStack] NetPackageProxiStack read error: {ex.Message}");
}
}
public override void write(PooledBinaryWriter _writer)
{
try
{
base.write(_writer);
_writer.Write(playerEntityId);
_writer.Write((byte)actionType);
int count = containerOffsets?.Count ?? 0;
_writer.Write((ushort)count);
if (containerOffsets != null)
{
for (int i = 0; i < count; i++)
{
_writer.Write((short)containerOffsets[i].x);
_writer.Write((short)containerOffsets[i].y);
_writer.Write((short)containerOffsets[i].z);
}
}
}
catch (Exception ex)
{
Log.Warning($"[ProxiStack] NetPackageProxiStack write error: {ex.Message}");
}
}
public override void ProcessPackage(World _world, GameManager _callbacks)
{
try
{
// Server erhält Anfrage von Client
if (ConnectionManager.Instance.IsServer)
{
var player = _world.GetEntity(playerEntityId) as EntityPlayer;
if (player == null) return;
// Container im Radius finden
var config = ProxiStackMod.Instance.Config;
var center = new Vector3i(player.position);
var offsets = new List<Vector3i>();
var containers = ContainerHelper.FindNearbyContainersStash(center, config.StashDistance);
foreach (var result in containers)
{
if (result.TileEntity != null)
{
Vector3i pos = result.TileEntity.ToWorldPos();
offsets.Add(pos - center);
}
}
// Antwort an Client senden
var response = NetPackageManager.GetPackage<NetPackageProxiStack>()
.Setup(playerEntityId, actionType, offsets);
var clientInfo = ConnectionManager.Instance.Clients.ForEntityId(playerEntityId);
if (clientInfo != null)
{
clientInfo.SendPackage(response);
}
}
else
{
// Client erhält Antwort vom Server
var player = _world.GetEntity(playerEntityId) as EntityPlayer;
if (player == null) return;
Vector3i center = new Vector3i(player.position);
if (containerOffsets != null)
{
switch (actionType)
{
case ProxiStackType.Stack:
ProxiStackManager.PerformStashClient(center, containerOffsets);
break;
case ProxiStackType.Restock:
ProxiStackManager.PerformRestockClient(center, containerOffsets);
break;
}
}
}
}
catch (Exception ex)
{
Log.Warning($"[ProxiStack] NetPackageProxiStack process error: {ex.Message}");
}
}
}
}