Skip to content

Commit 6999bd7

Browse files
Merge pull request #82 from yuwui/skill-syncing
Skill syncing
2 parents 18927b0 + 8820acf commit 6999bd7

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+1472
-1157
lines changed

Uchu.World/Enums/MovementType.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ namespace Uchu.World
22
{
33
public enum MovementType : uint
44
{
5-
Ground = 1,
5+
Moving,
6+
Ground,
67
Jump,
78
Falling,
89
DoubleJump,
9-
Jetpack = 6,
10-
Stunned
10+
Air,
11+
Jetpack,
12+
Unknown
1113
}
1214
}

Uchu.World/Handlers/GameMessages/SkillHandler.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Linq;
4+
using System.Threading;
35
using System.Threading.Tasks;
46
using Uchu.Core;
57

Uchu.World/Objects/Components/ReplicaComponents/BaseCombatAIComponent.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public BaseCombatAiComponent()
5959
);
6060

6161
await SkillComponent.CalculateSkillAsync((int) skillEntry.SkillId, true);
62-
62+
6363
SkillEntries.Add(new NpcSkillEntry
6464
{
6565
SkillId = skillEntry.SkillId,

Uchu.World/Objects/Components/ReplicaComponents/SkillComponent.cs

Lines changed: 39 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -161,17 +161,18 @@ private async Task EquipSkill(Lot item)
161161

162162
private async Task MountSkill(Lot item)
163163
{
164-
if (item == default) return;
164+
if (item == default)
165+
return;
165166

166167
var infos = await BehaviorTree.GetSkillsForObject(item);
167-
168168
var onEquip = infos.FirstOrDefault(i => i.CastType == SkillCastType.OnEquip);
169-
170-
if (onEquip == default) return;
169+
170+
if (onEquip == default)
171+
return;
171172

172173
var tree = await BehaviorTree.FromLotAsync(item);
173-
174-
await tree.MountAsync(GameObject);
174+
tree.Deserialize(GameObject, new BitReader(new MemoryStream()));
175+
await tree.MountAsync();
175176

176177
if (GameObject.TryGetComponent<MissionInventoryComponent>(out var missionInventory))
177178
{
@@ -181,33 +182,33 @@ private async Task MountSkill(Lot item)
181182

182183
private async Task DismountSkill(Lot item)
183184
{
184-
if (item == default) return;
185+
if (item == default)
186+
return;
185187

186188
var infos = await BehaviorTree.GetSkillsForObject(item);
187-
188189
var onEquip = infos.FirstOrDefault(i => i.CastType == SkillCastType.OnEquip);
189190

190-
if (onEquip == default) return;
191+
if (onEquip == default)
192+
return;
191193

192194
var tree = await BehaviorTree.FromLotAsync(item);
193-
194-
await tree.DismantleAsync(GameObject);
195+
tree.Deserialize(GameObject, new BitReader(new MemoryStream()));
196+
await tree.DismantleAsync();
195197
}
196198

197-
public async Task<float> CalculateSkillAsync(int skillId, bool prepare = false)
199+
public async Task<float> CalculateSkillAsync(int skillId, bool precalculate = false)
198200
{
199201
var tree = await BehaviorTree.FromSkillAsync(skillId);
202+
if (precalculate)
203+
return 0;
200204

201-
if (prepare) return 0;
202-
203205
var stream = new MemoryStream();
204206
using var writer = new BitWriter(stream, leaveOpen: true);
205-
206207
var syncId = ClaimSyncId();
207208

208-
var context = await tree.CalculateAsync(GameObject, writer, skillId, syncId, Transform.Position);
209-
210-
if (!context.FoundTarget) return 0;
209+
var context = tree.Serialize(GameObject, writer, skillId, syncId, Transform.Position);
210+
if (!context.FoundTarget)
211+
return 0;
211212

212213
Zone.BroadcastMessage(new EchoStartSkillMessage
213214
{
@@ -220,6 +221,7 @@ public async Task<float> CalculateSkillAsync(int skillId, bool prepare = false)
220221
OriginatorRotation = GameObject.Transform.Rotation
221222
});
222223

224+
await tree.ExecuteAsync();
223225
return context.SkillTime;
224226
}
225227

@@ -231,8 +233,7 @@ public async Task<float> CalculateSkillAsync(int skillId, GameObject target)
231233
using var writer = new BitWriter(stream, leaveOpen: true);
232234

233235
var syncId = ClaimSyncId();
234-
235-
var context = await tree.CalculateAsync(GameObject, writer, skillId, syncId, Transform.Position, target);
236+
var context = tree.Serialize(GameObject, writer, skillId, syncId, Transform.Position, target);
236237

237238
Zone.BroadcastMessage(new EchoStartSkillMessage
238239
{
@@ -245,6 +246,8 @@ public async Task<float> CalculateSkillAsync(int skillId, GameObject target)
245246
OriginatorRotation = GameObject.Transform.Rotation
246247
});
247248

249+
await tree.ExecuteAsync();
250+
248251
return context.SkillTime;
249252
}
250253

@@ -261,43 +264,29 @@ public async Task StartUserSkillAsync(StartSkillMessage message)
261264
message.OptionalTarget = null;
262265
else if (!message.OptionalTarget.GetComponent<DestructibleComponent>()?.Alive ?? true)
263266
message.OptionalTarget = null;
264-
/*
265-
else if (Vector3.Distance(message.OptionalTarget.Transform.Position, Transform.Position) > TargetRange)
266-
message.OptionalTarget = null;
267-
*/
267+
/* else if (Vector3.Distance(message.OptionalTarget.Transform.Position, Transform.Position) > TargetRange)
268+
message.OptionalTarget = null;*/
268269
}
269270
}
270271
catch (Exception e)
271272
{
272273
Logger.Error(e);
273-
274274
return;
275275
}
276276

277277
var stream = new MemoryStream(message.Content);
278278
using (var reader = new BitReader(stream, leaveOpen: true))
279279
{
280280
var tree = await BehaviorTree.FromSkillAsync(message.SkillId);
281-
282-
var context = await tree.ExecuteAsync(
281+
var context = tree.Deserialize(
283282
GameObject,
284283
reader,
285284
SkillCastType.OnUse,
286285
message.OptionalTarget
287286
);
288287

289288
HandledSkills[message.SkillHandle] = context;
290-
291-
if (GameObject.TryGetComponent<DestroyableComponent>(out var stats))
292-
{
293-
var info = tree.BehaviorIds.FirstOrDefault(b => b.SkillId == message.SkillId);
294289

295-
if (info != default)
296-
{
297-
stats.Imagination = (uint) ((int) stats.Imagination - info.ImaginationCost);
298-
}
299-
}
300-
301290
Zone.ExcludingMessage(new EchoStartSkillMessage
302291
{
303292
Associate = GameObject,
@@ -312,6 +301,17 @@ public async Task StartUserSkillAsync(StartSkillMessage message)
312301
SkillId = message.SkillId,
313302
UsedMouse = message.UsedMouse
314303
}, GameObject as Player);
304+
305+
await tree.ExecuteAsync();
306+
307+
if (GameObject.TryGetComponent<DestroyableComponent>(out var stats))
308+
{
309+
var info = tree.BehaviorIds.FirstOrDefault(b => b.SkillId == message.SkillId);
310+
if (info != default)
311+
{
312+
stats.Imagination = (uint) ((int) stats.Imagination - info.ImaginationCost);
313+
}
314+
}
315315
}
316316

317317
await GameObject.GetComponent<MissionInventoryComponent>().UseSkillAsync(
@@ -348,7 +348,7 @@ public async Task SyncUserSkillAsync(SyncSkillMessage message)
348348
}, GameObject as Player);
349349
}
350350

351-
public void SetSkill(BehaviorSlot slot, uint skillId)
351+
private void SetSkill(BehaviorSlot slot, uint skillId)
352352
{
353353
if (!(GameObject is Player player)) return;
354354

@@ -394,11 +394,8 @@ public void RemoveSkill(BehaviorSlot slot)
394394
SkillId = currentSkill
395395
});
396396
}
397-
398-
//
399-
// Get default skill
400-
//
401397

398+
// Get default skill
402399
var skillId = slot switch
403400
{
404401
BehaviorSlot.Invalid => 0u,

Uchu.World/Objects/GameObjects/Player.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ private Player()
100100

101101
public string GuildInviteName { get; set; }
102102

103-
private SemaphoreSlim Lock { get; }
103+
public SemaphoreSlim Lock { get; }
104104

105105
public int Ping => Connection.AveragePing;
106106

Uchu.World/Objects/Projectile.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,14 @@ public async Task ImpactAsync(byte[] data, GameObject target)
3030
await target.NetFavorAsync();
3131

3232
var distance = Vector3.Distance(Destination, target.Transform.Position);
33-
34-
if (distance > RadiusCheck) return;
33+
if (distance > RadiusCheck)
34+
return;
3535

3636
var tree = await BehaviorTree.FromLotAsync(Lot);
37-
3837
await using var stream = new MemoryStream(data);
39-
4038
var reader = new BitReader(stream);
41-
42-
await tree.UseAsync(Owner, reader, target);
39+
40+
tree.Deserialize(Owner, reader, target: target);
4341

4442
Zone.BroadcastMessage(new DoClientProjectileImpact
4543
{
@@ -49,6 +47,8 @@ public async Task ImpactAsync(byte[] data, GameObject target)
4947
ProjectileId = ClientObjectId,
5048
Target = target
5149
});
50+
51+
await tree.UseAsync();
5252
}
5353

5454
public async Task CalculateImpactAsync(GameObject target)
@@ -58,16 +58,14 @@ public async Task CalculateImpactAsync(GameObject target)
5858
await target.NetFavorAsync();
5959

6060
var distance = Vector3.Distance(Destination, target.Transform.Position);
61-
62-
if (distance > RadiusCheck) return;
61+
if (distance > RadiusCheck)
62+
return;
6363

6464
var tree = await BehaviorTree.FromLotAsync(Lot);
65-
6665
await using var stream = new MemoryStream();
67-
6866
var writer = new BitWriter(stream);
6967

70-
await tree.CalculateAsync(
68+
tree.Serialize(
7169
Owner,
7270
writer,
7371
tree.SkillRoots.First().Key,
@@ -84,6 +82,8 @@ await tree.CalculateAsync(
8482
ProjectileId = ClientObjectId,
8583
Target = target
8684
});
85+
86+
await tree.ExecuteAsync();
8787
}
8888
}
8989
}

Uchu.World/Packets/GameMessages/Client/SyncSkillMessage.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ public class SyncSkillMessage : GeneralGameMessage
1717
public override void Deserialize(BitReader reader)
1818
{
1919
Done = reader.ReadBit();
20-
2120
Content = new byte[reader.Read<uint>()];
2221

2322
for (var i = 0; i < Content.Length; i++) Content[i] = reader.Read<byte>();
@@ -29,14 +28,12 @@ public override void Deserialize(BitReader reader)
2928
public override void SerializeMessage(BitWriter writer)
3029
{
3130
writer.WriteBit(Done);
32-
3331
writer.Write((uint) Content.Length);
3432

3533
foreach (var b in Content)
3634
writer.Write(b);
3735

3836
writer.Write(BehaviorHandle);
39-
4037
writer.Write(SkillHandle);
4138
}
4239
}
Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,19 @@
1+
using System;
2+
using System.Diagnostics;
13
using System.Threading.Tasks;
4+
using Uchu.Core;
25

36
namespace Uchu.World.Systems.Behaviors
47
{
5-
public class AirMovementBehavior : BehaviorBase
8+
public class AirMovementBehaviorExecutionParameters : BehaviorExecutionParameters
9+
{
10+
public uint Handle { get; set; }
11+
public BehaviorBase Action { get; set; }
12+
public BehaviorExecutionParameters ActionParameters { get; set; }
13+
public ulong TargetId { get; set; }
14+
}
15+
16+
public class AirMovementBehavior : BehaviorBase<AirMovementBehaviorExecutionParameters>
617
{
718
public override BehaviorTemplateId Id => BehaviorTemplateId.AirMovement;
819

@@ -11,33 +22,30 @@ public override Task BuildAsync()
1122
return Task.CompletedTask;
1223
}
1324

14-
public override async Task ExecuteAsync(ExecutionContext context, ExecutionBranchContext branchContext)
25+
protected override void DeserializeStart(AirMovementBehaviorExecutionParameters behaviorExecutionParameters)
1526
{
16-
await base.ExecuteAsync(context, branchContext);
17-
18-
var handle = context.Reader.Read<uint>();
19-
20-
RegisterHandle(handle, context, branchContext);
27+
behaviorExecutionParameters.Handle = behaviorExecutionParameters.Context.Reader.Read<uint>();
28+
RegisterHandle(behaviorExecutionParameters.Handle, behaviorExecutionParameters);
2129
}
2230

23-
public override async Task SyncAsync(ExecutionContext context, ExecutionBranchContext branchContext)
31+
protected override async void DeserializeSync(AirMovementBehaviorExecutionParameters behaviorExecutionParameters)
2432
{
25-
await base.ExecuteAsync(context, branchContext);
33+
behaviorExecutionParameters.Action = await GetBehavior(
34+
behaviorExecutionParameters.Context.Reader.Read<uint>());
2635

27-
var actionId = context.Reader.Read<uint>();
28-
29-
var action = await GetBehavior(actionId);
30-
31-
var id = context.Reader.Read<ulong>();
32-
33-
context.Associate.Zone.TryGetGameObject((long) id, out var target);
34-
35-
var branch = new ExecutionBranchContext(target)
36-
{
37-
Duration = branchContext.Duration
38-
};
36+
behaviorExecutionParameters.TargetId = behaviorExecutionParameters.Context.Reader.Read<ulong>();
37+
38+
behaviorExecutionParameters.ActionParameters = behaviorExecutionParameters.Action.DeserializeStart(
39+
behaviorExecutionParameters.Context, behaviorExecutionParameters.BranchContext);
40+
}
3941

40-
await action.ExecuteAsync(context, branch);
42+
protected override async Task ExecuteSync(AirMovementBehaviorExecutionParameters behaviorExecutionParameters)
43+
{
44+
behaviorExecutionParameters.ActionParameters.Context.Associate.Zone.TryGetGameObject(
45+
(long)behaviorExecutionParameters.TargetId, out var target);
46+
behaviorExecutionParameters.ActionParameters.BranchContext.Target = target;
47+
48+
await behaviorExecutionParameters.Action.ExecuteStart(behaviorExecutionParameters.ActionParameters);
4149
}
4250
}
4351
}

0 commit comments

Comments
 (0)