Skip to content

Commit f214c45

Browse files
Merge pull request #114 from UchuServer/behaviors/reader-rewrite
Behaviors/reader rewrite
2 parents 588db94 + b419008 commit f214c45

29 files changed

+280
-292
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ public uint SelectedSkill
3737
protected SkillComponent()
3838
{
3939
ActiveBehaviors = new Dictionary<BehaviorSlot, uint>();
40-
4140
HandledSkills = new Dictionary<uint, ExecutionContext>();
4241

4342
Listen(OnStart, async () =>
@@ -60,7 +59,8 @@ protected SkillComponent()
6059

6160
await SetupStandardSkills();
6261

63-
if (!(GameObject is Player)) return;
62+
if (!(GameObject is Player))
63+
return;
6464

6565
ActiveBehaviors[BehaviorSlot.Primary] = 1;
6666
});

Uchu.World/Systems/Behaviors/AirMovementBehavior.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Diagnostics;
33
using System.Threading.Tasks;
4+
using RakDotNet.IO;
45
using Uchu.Core;
56

67
namespace Uchu.World.Systems.Behaviors
@@ -27,23 +28,23 @@ public override async Task BuildAsync()
2728
GroundAction = await GetBehavior("ground_action");
2829
}
2930

30-
protected override void DeserializeStart(AirMovementBehaviorExecutionParameters parameters)
31+
protected override void DeserializeStart(BitReader reader, AirMovementBehaviorExecutionParameters parameters)
3132
{
32-
parameters.Handle = parameters.Context.Reader.Read<uint>();
33+
parameters.Handle = reader.Read<uint>();
3334
parameters.RegisterHandle<AirMovementBehaviorExecutionParameters>(parameters.Handle, DeserializeSync, ExecuteSync);
3435
}
3536

36-
protected override async void DeserializeSync(AirMovementBehaviorExecutionParameters parameters)
37+
protected override async void DeserializeSync(BitReader reader, AirMovementBehaviorExecutionParameters parameters)
3738
{
38-
var behaviorId = parameters.Context.Reader.Read<uint>();
39+
var behaviorId = reader.Read<uint>();
3940
parameters.Action = await GetBehavior(behaviorId);
4041

41-
var targetId = parameters.Context.Reader.Read<ulong>();
42+
var targetId = reader.Read<ulong>();
4243
parameters.Context.Associate.Zone.TryGetGameObject((long)targetId,
4344
out var target);
4445

45-
parameters.ActionParameters = parameters.Action.DeserializeStart(
46-
parameters.Context, new ExecutionBranchContext
46+
parameters.ActionParameters = parameters.Action.DeserializeStart(reader, parameters.Context,
47+
new ExecutionBranchContext
4748
{
4849
Duration = parameters.BranchContext.Duration,
4950
Target = target ?? parameters.BranchContext.Target

Uchu.World/Systems/Behaviors/AndBehavior.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Collections.Generic;
22
using System.Threading.Tasks;
3+
using RakDotNet.IO;
34

45
namespace Uchu.World.Systems.Behaviors
56
{
@@ -30,21 +31,21 @@ public override async Task BuildAsync()
3031
}
3132
}
3233

33-
protected override void DeserializeStart(AndBehaviorExecutionParameters parameters)
34+
protected override void DeserializeStart(BitReader reader, AndBehaviorExecutionParameters parameters)
3435
{
3536
foreach (var behaviorBase in Behaviors)
3637
{
3738
parameters.BehaviorExecutionParameters.Add(
38-
behaviorBase.DeserializeStart(parameters.Context, parameters.BranchContext));
39+
behaviorBase.DeserializeStart(reader, parameters.Context, parameters.BranchContext));
3940
}
4041
}
4142

42-
protected override void SerializeStart(AndBehaviorExecutionParameters parameters)
43+
protected override void SerializeStart(BitWriter writer, AndBehaviorExecutionParameters parameters)
4344
{
4445
foreach (var behaviorBase in Behaviors)
4546
{
4647
parameters.BehaviorExecutionParameters.Add(
47-
behaviorBase.SerializeStart(parameters.NpcContext, parameters.BranchContext));
48+
behaviorBase.SerializeStart(writer, parameters.NpcContext, parameters.BranchContext));
4849
}
4950
}
5051

@@ -56,12 +57,11 @@ protected override void ExecuteStart(AndBehaviorExecutionParameters parameters)
5657
}
5758
}
5859

59-
protected override void SerializeSync(AndBehaviorExecutionParameters parameters)
60+
protected override void SerializeSync(BitWriter writer, AndBehaviorExecutionParameters parameters)
6061
{
61-
foreach (var behaviorBase in Behaviors)
62+
for (var i = 0; i < Behaviors.Length; i++)
6263
{
63-
parameters.BehaviorExecutionParameters.Add(
64-
behaviorBase.SerializeSync(parameters.NpcContext, parameters.BranchContext));
64+
Behaviors[i].SerializeSync(writer, parameters.BehaviorExecutionParameters[i]);
6565
}
6666
}
6767

Uchu.World/Systems/Behaviors/AreaOfEffect.cs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Linq;
44
using System.Numerics;
55
using System.Threading.Tasks;
6+
using RakDotNet.IO;
67
using Uchu.Core;
78

89
namespace Uchu.World.Systems.Behaviors
@@ -32,14 +33,14 @@ public override async Task BuildAsync()
3233
Radius = await GetParameter<float>("radius");
3334
}
3435

35-
protected override void DeserializeStart(AreaOfEffectExecutionParameters parameters)
36+
protected override void DeserializeStart(BitReader reader, AreaOfEffectExecutionParameters parameters)
3637
{
37-
parameters.Length = parameters.Context.Reader.Read<uint>();
38+
parameters.Length = reader.Read<uint>();
3839

3940
var targets = new List<GameObject>();
4041
for (var i = 0; i < parameters.Length; i++)
4142
{
42-
var targetId = parameters.Context.Reader.Read<long>();
43+
var targetId = reader.Read<long>();
4344
if (!parameters.Context.Associate.Zone.TryGetGameObject(targetId,
4445
out var target))
4546
{
@@ -52,7 +53,7 @@ protected override void DeserializeStart(AreaOfEffectExecutionParameters paramet
5253

5354
foreach (var target in targets)
5455
{
55-
var behaviorBase = Action.DeserializeStart(parameters.Context,
56+
var behaviorBase = Action.DeserializeStart(reader, parameters.Context,
5657
new ExecutionBranchContext()
5758
{
5859
Target = target,
@@ -71,7 +72,7 @@ protected override void ExecuteStart(AreaOfEffectExecutionParameters behaviorExe
7172
}
7273
}
7374

74-
protected override void SerializeStart(AreaOfEffectExecutionParameters parameters)
75+
protected override void SerializeStart(BitWriter writer, AreaOfEffectExecutionParameters parameters)
7576
{
7677
if (!parameters.Context.Associate.TryGetComponent<BaseCombatAiComponent>(out var baseCombatAiComponent))
7778
return;
@@ -91,15 +92,15 @@ protected override void SerializeStart(AreaOfEffectExecutionParameters parameter
9192
parameters.NpcContext.FoundTarget = true;
9293

9394
// Write all target ids
94-
parameters.NpcContext.Writer.Write((uint) targets.Length);
95+
writer.Write((uint) targets.Length);
9596
foreach (var target in targets)
9697
{
97-
parameters.NpcContext.Writer.Write(target);
98+
writer.Write(target);
9899
}
99100

100101
foreach (var target in targets)
101102
{
102-
var behaviorBase = Action.SerializeStart(parameters.NpcContext,
103+
var behaviorBase = Action.SerializeStart(writer, parameters.NpcContext,
103104
new ExecutionBranchContext()
104105
{
105106
Target = target,

Uchu.World/Systems/Behaviors/AttackDelayBehavior.cs

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
using System.IO;
12
using System.Threading.Tasks;
3+
using RakDotNet.IO;
24
using Uchu.Core;
35

46
namespace Uchu.World.Systems.Behaviors
@@ -8,6 +10,8 @@ public class AttackDelayBehaviorExecutionParameters : BehaviorExecutionParameter
810
public bool ServerSide { get; set; }
911
public uint Handle { get; set; }
1012
public BehaviorExecutionParameters Parameters { get; set; }
13+
14+
public byte[] SyncStream { get; set; }
1115

1216
public AttackDelayBehaviorExecutionParameters(ExecutionContext context, ExecutionBranchContext branchContext)
1317
: base(context, branchContext)
@@ -39,30 +43,30 @@ public override async Task BuildAsync()
3943
Delay = (int) (delay.Value * 1000);
4044
}
4145

42-
protected override void DeserializeStart(AttackDelayBehaviorExecutionParameters parameters)
46+
protected override void DeserializeStart(BitReader reader, AttackDelayBehaviorExecutionParameters parameters)
4347
{
44-
parameters.Handle = parameters.Context.Reader.Read<uint>();
48+
parameters.Handle = reader.Read<uint>();
4549
for (var i = 0; i < Intervals; i++)
46-
parameters.RegisterHandle<AttackDelayBehaviorExecutionParameters>(parameters.Handle, DeserializeSync, ExecuteSync);
50+
parameters.RegisterHandle<AttackDelayBehaviorExecutionParameters>(parameters.Handle, DeserializeSync,
51+
ExecuteSync);
4752
}
4853

49-
protected override void DeserializeSync(AttackDelayBehaviorExecutionParameters parameters)
54+
protected override void DeserializeSync(BitReader reader, AttackDelayBehaviorExecutionParameters parameters)
5055
{
51-
parameters.Parameters = Action.DeserializeStart(parameters.Context,
52-
parameters.BranchContext);
56+
parameters.Parameters = Action.DeserializeStart(reader, parameters.Context, parameters.BranchContext);
5357
}
5458

55-
protected override void SerializeStart(AttackDelayBehaviorExecutionParameters parameters)
59+
protected override void SerializeStart(BitWriter writer, AttackDelayBehaviorExecutionParameters parameters)
5660
{
5761
parameters.Handle = parameters.NpcContext.Associate.GetComponent<SkillComponent>().ClaimSyncId();
58-
parameters.NpcContext.Writer.Write(parameters.Handle);
62+
writer.Write(parameters.Handle);
5963
}
6064

61-
protected override void SerializeSync(AttackDelayBehaviorExecutionParameters parameters)
65+
protected override void SerializeSync(BitWriter writer, AttackDelayBehaviorExecutionParameters parameters)
6266
{
63-
// Copy the context to clear the writer
64-
parameters.Parameters = Action.SerializeStart(parameters.NpcContext.Copy(),
67+
parameters.Parameters = Action.SerializeStart(writer, parameters.NpcContext,
6568
parameters.BranchContext);
69+
parameters.SyncStream = (writer.BaseStream as MemoryStream)?.ToArray();
6670
parameters.ServerSide = true;
6771
}
6872

@@ -72,8 +76,8 @@ protected override void ExecuteSync(AttackDelayBehaviorExecutionParameters param
7276
{
7377
parameters.Schedule( () =>
7478
{
79+
parameters.NpcContext.Sync(parameters.SyncStream, parameters.Handle);
7580
Action.ExecuteStart(parameters.Parameters);
76-
parameters.NpcContext.Sync(parameters.Handle);
7781
}, Delay);
7882
}
7983
else

Uchu.World/Systems/Behaviors/BasicAttackBehavior.cs

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Threading.Tasks;
3+
using RakDotNet.IO;
34
using Uchu.Core;
45

56
namespace Uchu.World.Systems.Behaviors
@@ -50,36 +51,36 @@ public override async Task BuildAsync()
5051
MaxDamage = await GetParameter<uint>("max damage");
5152
}
5253

53-
protected override void DeserializeStart(BasicAttackBehaviorExecutionParameters behaviorExecutionParameters)
54+
protected override void DeserializeStart(BitReader reader, BasicAttackBehaviorExecutionParameters parameters)
5455
{
55-
behaviorExecutionParameters.Context.Reader.Align();
56+
reader.Align();
5657

57-
behaviorExecutionParameters.Unknown = behaviorExecutionParameters.Context.Reader.Read<byte>();
58-
behaviorExecutionParameters.Unknown1 = behaviorExecutionParameters.Unknown > 0
59-
? behaviorExecutionParameters.Unknown
60-
: behaviorExecutionParameters.Context.Reader.Read<byte>();
58+
parameters.Unknown = reader.Read<byte>();
59+
parameters.Unknown1 = parameters.Unknown > 0
60+
? parameters.Unknown
61+
: reader.Read<byte>();
6162

6263
// Unknown 2
63-
behaviorExecutionParameters.Context.Reader.Read<byte>();
64+
reader.Read<byte>();
6465

6566
// Unused flags
66-
behaviorExecutionParameters.Context.Reader.ReadBit();
67-
behaviorExecutionParameters.Context.Reader.ReadBit();
67+
reader.ReadBit();
68+
reader.ReadBit();
6869

69-
behaviorExecutionParameters.Flag2 = behaviorExecutionParameters.Context.Reader.ReadBit();
70-
if (behaviorExecutionParameters.Flag2)
71-
behaviorExecutionParameters.Context.Reader.Read<uint>();
70+
parameters.Flag2 = reader.ReadBit();
71+
if (parameters.Flag2)
72+
reader.Read<uint>();
7273

73-
behaviorExecutionParameters.Damage = behaviorExecutionParameters.Context.Reader.Read<uint>();
74-
behaviorExecutionParameters.Context.Reader.ReadBit(); // Died?
75-
behaviorExecutionParameters.SuccessState = behaviorExecutionParameters.Context.Reader.Read<byte>();
74+
parameters.Damage = reader.Read<uint>();
75+
reader.ReadBit(); // Died?
76+
parameters.SuccessState = reader.Read<byte>();
7677

77-
if (behaviorExecutionParameters.Unknown1 == 81)
78-
behaviorExecutionParameters.Context.Reader.Read<byte>();
78+
if (parameters.Unknown1 == 81)
79+
reader.Read<byte>();
7980

80-
if (behaviorExecutionParameters.SuccessState == 1)
81-
behaviorExecutionParameters.OnSuccessBehaviorExecutionParameters = OnSuccess.DeserializeStart(
82-
behaviorExecutionParameters.Context, behaviorExecutionParameters.BranchContext);
81+
if (parameters.SuccessState == 1)
82+
parameters.OnSuccessBehaviorExecutionParameters = OnSuccess.DeserializeStart(reader, parameters.Context,
83+
parameters.BranchContext);
8384
}
8485

8586
protected override void ExecuteStart(BasicAttackBehaviorExecutionParameters parameters)
@@ -108,37 +109,37 @@ protected override void ExecuteStart(BasicAttackBehaviorExecutionParameters para
108109
});
109110
}
110111

111-
protected override void SerializeStart(BasicAttackBehaviorExecutionParameters parameters)
112+
protected override void SerializeStart(BitWriter writer, BasicAttackBehaviorExecutionParameters parameters)
112113
{
113114
parameters.ServerSide = true;
114115
parameters.NpcContext.Associate.Transform.LookAt(parameters.BranchContext.Target.Transform.Position);
115-
parameters.NpcContext.Writer.Align();
116+
writer.Align();
116117

117118
// Three unknowns
118-
parameters.NpcContext.Writer.Write<byte>(0);
119-
parameters.NpcContext.Writer.Write<byte>(0);
120-
parameters.NpcContext.Writer.Write<byte>(0);
119+
writer.Write<byte>(0);
120+
writer.Write<byte>(0);
121+
writer.Write<byte>(0);
121122

122-
parameters.NpcContext.Writer.WriteBit(false);
123-
parameters.NpcContext.Writer.WriteBit(false);
124-
parameters.NpcContext.Writer.WriteBit(true);
123+
writer.WriteBit(false);
124+
writer.WriteBit(false);
125+
writer.WriteBit(true);
125126

126127
// flag 2 == true so this should be set
127-
parameters.NpcContext.Writer.Write<uint>(0);
128+
writer.Write<uint>(0);
128129

129130
var damage = (uint)new Random().Next((int)MinDamage, (int)MaxDamage);
130-
parameters.NpcContext.Writer.Write(damage);
131+
writer.Write(damage);
131132

132-
parameters.NpcContext.Writer.WriteBit(!parameters.NpcContext.Alive);
133+
writer.WriteBit(!parameters.NpcContext.Alive);
133134

134135
var success = parameters.NpcContext.IsValidTarget(parameters.BranchContext.Target) &&
135136
parameters.NpcContext.Alive;
136137
parameters.SuccessState = (byte) (success ? 1 : 0);
137-
parameters.NpcContext.Writer.Write(parameters.SuccessState);
138+
writer.Write(parameters.SuccessState);
138139

139140
if (success)
140141
{
141-
parameters.OnSuccessBehaviorExecutionParameters = OnSuccess.SerializeStart(parameters.NpcContext,
142+
parameters.OnSuccessBehaviorExecutionParameters = OnSuccess.SerializeStart(writer, parameters.NpcContext,
142143
parameters.BranchContext);
143144
}
144145
}

0 commit comments

Comments
 (0)