Skip to content

Behaviors/reader rewrite #114

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Nov 2, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ public uint SelectedSkill
protected SkillComponent()
{
ActiveBehaviors = new Dictionary<BehaviorSlot, uint>();

HandledSkills = new Dictionary<uint, ExecutionContext>();

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

await SetupStandardSkills();

if (!(GameObject is Player)) return;
if (!(GameObject is Player))
return;

ActiveBehaviors[BehaviorSlot.Primary] = 1;
});
Expand Down
15 changes: 8 additions & 7 deletions Uchu.World/Systems/Behaviors/AirMovementBehavior.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using System.Diagnostics;
using System.Threading.Tasks;
using RakDotNet.IO;
using Uchu.Core;

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

protected override void DeserializeStart(AirMovementBehaviorExecutionParameters parameters)
protected override void DeserializeStart(BitReader reader, AirMovementBehaviorExecutionParameters parameters)
{
parameters.Handle = parameters.Context.Reader.Read<uint>();
parameters.Handle = reader.Read<uint>();
parameters.RegisterHandle<AirMovementBehaviorExecutionParameters>(parameters.Handle, DeserializeSync, ExecuteSync);
}

protected override async void DeserializeSync(AirMovementBehaviorExecutionParameters parameters)
protected override async void DeserializeSync(BitReader reader, AirMovementBehaviorExecutionParameters parameters)
{
var behaviorId = parameters.Context.Reader.Read<uint>();
var behaviorId = reader.Read<uint>();
parameters.Action = await GetBehavior(behaviorId);

var targetId = parameters.Context.Reader.Read<ulong>();
var targetId = reader.Read<ulong>();
parameters.Context.Associate.Zone.TryGetGameObject((long)targetId,
out var target);

parameters.ActionParameters = parameters.Action.DeserializeStart(
parameters.Context, new ExecutionBranchContext
parameters.ActionParameters = parameters.Action.DeserializeStart(reader, parameters.Context,
new ExecutionBranchContext
{
Duration = parameters.BranchContext.Duration,
Target = target ?? parameters.BranchContext.Target
Expand Down
16 changes: 8 additions & 8 deletions Uchu.World/Systems/Behaviors/AndBehavior.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using RakDotNet.IO;

namespace Uchu.World.Systems.Behaviors
{
Expand Down Expand Up @@ -30,21 +31,21 @@ public override async Task BuildAsync()
}
}

protected override void DeserializeStart(AndBehaviorExecutionParameters parameters)
protected override void DeserializeStart(BitReader reader, AndBehaviorExecutionParameters parameters)
{
foreach (var behaviorBase in Behaviors)
{
parameters.BehaviorExecutionParameters.Add(
behaviorBase.DeserializeStart(parameters.Context, parameters.BranchContext));
behaviorBase.DeserializeStart(reader, parameters.Context, parameters.BranchContext));
}
}

protected override void SerializeStart(AndBehaviorExecutionParameters parameters)
protected override void SerializeStart(BitWriter writer, AndBehaviorExecutionParameters parameters)
{
foreach (var behaviorBase in Behaviors)
{
parameters.BehaviorExecutionParameters.Add(
behaviorBase.SerializeStart(parameters.NpcContext, parameters.BranchContext));
behaviorBase.SerializeStart(writer, parameters.NpcContext, parameters.BranchContext));
}
}

Expand All @@ -56,12 +57,11 @@ protected override void ExecuteStart(AndBehaviorExecutionParameters parameters)
}
}

protected override void SerializeSync(AndBehaviorExecutionParameters parameters)
protected override void SerializeSync(BitWriter writer, AndBehaviorExecutionParameters parameters)
{
foreach (var behaviorBase in Behaviors)
for (var i = 0; i < Behaviors.Length; i++)
{
parameters.BehaviorExecutionParameters.Add(
behaviorBase.SerializeSync(parameters.NpcContext, parameters.BranchContext));
Behaviors[i].SerializeSync(writer, parameters.BehaviorExecutionParameters[i]);
}
}

Expand Down
17 changes: 9 additions & 8 deletions Uchu.World/Systems/Behaviors/AreaOfEffect.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using System.Linq;
using System.Numerics;
using System.Threading.Tasks;
using RakDotNet.IO;
using Uchu.Core;

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

protected override void DeserializeStart(AreaOfEffectExecutionParameters parameters)
protected override void DeserializeStart(BitReader reader, AreaOfEffectExecutionParameters parameters)
{
parameters.Length = parameters.Context.Reader.Read<uint>();
parameters.Length = reader.Read<uint>();

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

foreach (var target in targets)
{
var behaviorBase = Action.DeserializeStart(parameters.Context,
var behaviorBase = Action.DeserializeStart(reader, parameters.Context,
new ExecutionBranchContext()
{
Target = target,
Expand All @@ -71,7 +72,7 @@ protected override void ExecuteStart(AreaOfEffectExecutionParameters behaviorExe
}
}

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

// Write all target ids
parameters.NpcContext.Writer.Write((uint) targets.Length);
writer.Write((uint) targets.Length);
foreach (var target in targets)
{
parameters.NpcContext.Writer.Write(target);
writer.Write(target);
}

foreach (var target in targets)
{
var behaviorBase = Action.SerializeStart(parameters.NpcContext,
var behaviorBase = Action.SerializeStart(writer, parameters.NpcContext,
new ExecutionBranchContext()
{
Target = target,
Expand Down
28 changes: 16 additions & 12 deletions Uchu.World/Systems/Behaviors/AttackDelayBehavior.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
using System.IO;
using System.Threading.Tasks;
using RakDotNet.IO;
using Uchu.Core;

namespace Uchu.World.Systems.Behaviors
Expand All @@ -8,6 +10,8 @@ public class AttackDelayBehaviorExecutionParameters : BehaviorExecutionParameter
public bool ServerSide { get; set; }
public uint Handle { get; set; }
public BehaviorExecutionParameters Parameters { get; set; }

public byte[] SyncStream { get; set; }

public AttackDelayBehaviorExecutionParameters(ExecutionContext context, ExecutionBranchContext branchContext)
: base(context, branchContext)
Expand Down Expand Up @@ -39,30 +43,30 @@ public override async Task BuildAsync()
Delay = (int) (delay.Value * 1000);
}

protected override void DeserializeStart(AttackDelayBehaviorExecutionParameters parameters)
protected override void DeserializeStart(BitReader reader, AttackDelayBehaviorExecutionParameters parameters)
{
parameters.Handle = parameters.Context.Reader.Read<uint>();
parameters.Handle = reader.Read<uint>();
for (var i = 0; i < Intervals; i++)
parameters.RegisterHandle<AttackDelayBehaviorExecutionParameters>(parameters.Handle, DeserializeSync, ExecuteSync);
parameters.RegisterHandle<AttackDelayBehaviorExecutionParameters>(parameters.Handle, DeserializeSync,
ExecuteSync);
}

protected override void DeserializeSync(AttackDelayBehaviorExecutionParameters parameters)
protected override void DeserializeSync(BitReader reader, AttackDelayBehaviorExecutionParameters parameters)
{
parameters.Parameters = Action.DeserializeStart(parameters.Context,
parameters.BranchContext);
parameters.Parameters = Action.DeserializeStart(reader, parameters.Context, parameters.BranchContext);
}

protected override void SerializeStart(AttackDelayBehaviorExecutionParameters parameters)
protected override void SerializeStart(BitWriter writer, AttackDelayBehaviorExecutionParameters parameters)
{
parameters.Handle = parameters.NpcContext.Associate.GetComponent<SkillComponent>().ClaimSyncId();
parameters.NpcContext.Writer.Write(parameters.Handle);
writer.Write(parameters.Handle);
}

protected override void SerializeSync(AttackDelayBehaviorExecutionParameters parameters)
protected override void SerializeSync(BitWriter writer, AttackDelayBehaviorExecutionParameters parameters)
{
// Copy the context to clear the writer
parameters.Parameters = Action.SerializeStart(parameters.NpcContext.Copy(),
parameters.Parameters = Action.SerializeStart(writer, parameters.NpcContext,
parameters.BranchContext);
parameters.SyncStream = (writer.BaseStream as MemoryStream)?.ToArray();
parameters.ServerSide = true;
}

Expand All @@ -72,8 +76,8 @@ protected override void ExecuteSync(AttackDelayBehaviorExecutionParameters param
{
parameters.Schedule( () =>
{
parameters.NpcContext.Sync(parameters.SyncStream, parameters.Handle);
Action.ExecuteStart(parameters.Parameters);
parameters.NpcContext.Sync(parameters.Handle);
}, Delay);
}
else
Expand Down
67 changes: 34 additions & 33 deletions Uchu.World/Systems/Behaviors/BasicAttackBehavior.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Threading.Tasks;
using RakDotNet.IO;
using Uchu.Core;

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

protected override void DeserializeStart(BasicAttackBehaviorExecutionParameters behaviorExecutionParameters)
protected override void DeserializeStart(BitReader reader, BasicAttackBehaviorExecutionParameters parameters)
{
behaviorExecutionParameters.Context.Reader.Align();
reader.Align();

behaviorExecutionParameters.Unknown = behaviorExecutionParameters.Context.Reader.Read<byte>();
behaviorExecutionParameters.Unknown1 = behaviorExecutionParameters.Unknown > 0
? behaviorExecutionParameters.Unknown
: behaviorExecutionParameters.Context.Reader.Read<byte>();
parameters.Unknown = reader.Read<byte>();
parameters.Unknown1 = parameters.Unknown > 0
? parameters.Unknown
: reader.Read<byte>();

// Unknown 2
behaviorExecutionParameters.Context.Reader.Read<byte>();
reader.Read<byte>();

// Unused flags
behaviorExecutionParameters.Context.Reader.ReadBit();
behaviorExecutionParameters.Context.Reader.ReadBit();
reader.ReadBit();
reader.ReadBit();

behaviorExecutionParameters.Flag2 = behaviorExecutionParameters.Context.Reader.ReadBit();
if (behaviorExecutionParameters.Flag2)
behaviorExecutionParameters.Context.Reader.Read<uint>();
parameters.Flag2 = reader.ReadBit();
if (parameters.Flag2)
reader.Read<uint>();

behaviorExecutionParameters.Damage = behaviorExecutionParameters.Context.Reader.Read<uint>();
behaviorExecutionParameters.Context.Reader.ReadBit(); // Died?
behaviorExecutionParameters.SuccessState = behaviorExecutionParameters.Context.Reader.Read<byte>();
parameters.Damage = reader.Read<uint>();
reader.ReadBit(); // Died?
parameters.SuccessState = reader.Read<byte>();

if (behaviorExecutionParameters.Unknown1 == 81)
behaviorExecutionParameters.Context.Reader.Read<byte>();
if (parameters.Unknown1 == 81)
reader.Read<byte>();

if (behaviorExecutionParameters.SuccessState == 1)
behaviorExecutionParameters.OnSuccessBehaviorExecutionParameters = OnSuccess.DeserializeStart(
behaviorExecutionParameters.Context, behaviorExecutionParameters.BranchContext);
if (parameters.SuccessState == 1)
parameters.OnSuccessBehaviorExecutionParameters = OnSuccess.DeserializeStart(reader, parameters.Context,
parameters.BranchContext);
}

protected override void ExecuteStart(BasicAttackBehaviorExecutionParameters parameters)
Expand Down Expand Up @@ -108,37 +109,37 @@ protected override void ExecuteStart(BasicAttackBehaviorExecutionParameters para
});
}

protected override void SerializeStart(BasicAttackBehaviorExecutionParameters parameters)
protected override void SerializeStart(BitWriter writer, BasicAttackBehaviorExecutionParameters parameters)
{
parameters.ServerSide = true;
parameters.NpcContext.Associate.Transform.LookAt(parameters.BranchContext.Target.Transform.Position);
parameters.NpcContext.Writer.Align();
writer.Align();

// Three unknowns
parameters.NpcContext.Writer.Write<byte>(0);
parameters.NpcContext.Writer.Write<byte>(0);
parameters.NpcContext.Writer.Write<byte>(0);
writer.Write<byte>(0);
writer.Write<byte>(0);
writer.Write<byte>(0);

parameters.NpcContext.Writer.WriteBit(false);
parameters.NpcContext.Writer.WriteBit(false);
parameters.NpcContext.Writer.WriteBit(true);
writer.WriteBit(false);
writer.WriteBit(false);
writer.WriteBit(true);

// flag 2 == true so this should be set
parameters.NpcContext.Writer.Write<uint>(0);
writer.Write<uint>(0);

var damage = (uint)new Random().Next((int)MinDamage, (int)MaxDamage);
parameters.NpcContext.Writer.Write(damage);
writer.Write(damage);

parameters.NpcContext.Writer.WriteBit(!parameters.NpcContext.Alive);
writer.WriteBit(!parameters.NpcContext.Alive);

var success = parameters.NpcContext.IsValidTarget(parameters.BranchContext.Target) &&
parameters.NpcContext.Alive;
parameters.SuccessState = (byte) (success ? 1 : 0);
parameters.NpcContext.Writer.Write(parameters.SuccessState);
writer.Write(parameters.SuccessState);

if (success)
{
parameters.OnSuccessBehaviorExecutionParameters = OnSuccess.SerializeStart(parameters.NpcContext,
parameters.OnSuccessBehaviorExecutionParameters = OnSuccess.SerializeStart(writer, parameters.NpcContext,
parameters.BranchContext);
}
}
Expand Down
Loading