HandleRpc async for sending events

This commit is contained in:
AeonLucid committed 2020-10-24 07:00:36 +02:00
1 parent e0481833d4
commit 198cd7911b
13 files changed
+78 -15

No files matched your search

@@ -0,0 +1,21 @@
using Impostor.Api.Games;
using Impostor.Api.Innersloth.Net.Objects;
namespace Impostor.Api.Events.Net
{
public class PlayerChatEvent : IGameEvent
{
public PlayerChatEvent(IGame game, InnerPlayerControl playerControl, string message)
{
Game = game;
PlayerControl = playerControl;
Message = message;
}
public IGame Game { get; }
public InnerPlayerControl PlayerControl { get; }
public string Message { get; }
}
}
@@ -1,4 +1,5 @@
using Impostor.Api.Net;
using System.Threading.Tasks;
using Impostor.Api.Net;
using Impostor.Api.Net.Messages;
namespace Impostor.Api.Innersloth.Net
@@ -13,7 +14,7 @@ namespace Impostor.Api.Innersloth.Net
public SpawnFlags SpawnFlags { get; internal set; }
public abstract void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader);
public abstract ValueTask HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader);
public abstract bool Serialize(IMessageWriter writer, bool initialState);
@@ -1,5 +1,6 @@
using System;
using System.Numerics;
using System.Threading.Tasks;
using Impostor.Api.Net;
using Impostor.Api.Net.Messages;
using Microsoft.Extensions.Logging;
@@ -45,7 +46,7 @@ namespace Impostor.Api.Innersloth.Net.Objects.Components
return new Vector2(XRange.Lerp(v1), YRange.Lerp(v2));
}
public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader)
public override ValueTask HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader)
{
if (call == RpcCalls.SnapTo)
{
@@ -55,6 +56,8 @@ namespace Impostor.Api.Innersloth.Net.Objects.Components
{
_logger.LogWarning("{0}: Unknown rpc call {1}", nameof(InnerCustomNetworkTransform), call);
}
return default;
}
public override bool Serialize(IMessageWriter writer, bool initialState)
@@ -1,4 +1,5 @@
using System;
using System.Threading.Tasks;
using Impostor.Api.Net;
using Impostor.Api.Net.Messages;
using Microsoft.Extensions.Logging;
@@ -14,12 +15,12 @@ namespace Impostor.Api.Innersloth.Net.Objects.Components
_logger = logger;
}
public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader)
public override ValueTask HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader)
{
if (call != RpcCalls.EnterVent && call != RpcCalls.ExitVent)
{
_logger.LogWarning("{0}: Unknown rpc call {1}", nameof(InnerPlayerPhysics), call);
return;
return default;
}
if (!sender.IsOwner(this))
@@ -41,6 +42,8 @@ namespace Impostor.Api.Innersloth.Net.Objects.Components
var ventEnter = call == RpcCalls.EnterVent;
// TODO: Do stuff.
return default;
}
public override bool Serialize(IMessageWriter writer, bool initialState)
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Impostor.Api.Net;
using Impostor.Api.Net.Messages;
using Microsoft.Extensions.Logging;
@@ -17,12 +18,12 @@ namespace Impostor.Api.Innersloth.Net.Objects.Components
_votes = new Dictionary<int, int[]>();
}
public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader)
public override ValueTask HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader)
{
if (call != RpcCalls.AddVote)
{
_logger.LogWarning("{0}: Unknown rpc call {1}", nameof(InnerVoteBanSystem), call);
return;
return default;
}
var clientId = reader.ReadInt32();
@@ -39,6 +40,8 @@ namespace Impostor.Api.Innersloth.Net.Objects.Components
var targetClientId = reader.ReadInt32();
// TODO: Use.
return default;
}
public override bool Serialize(IMessageWriter writer, bool initialState)
@@ -1,6 +1,7 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading.Tasks;
using Impostor.Api.Games;
using Impostor.Api.Innersloth.Net.Objects.Components;
using Impostor.Api.Net;
@@ -40,7 +41,7 @@ namespace Impostor.Api.Innersloth.Net.Objects
return _allPlayers.TryGetValue(id, out var player) ? player : null;
}
public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader)
public override ValueTask HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader)
{
switch (call)
{
@@ -105,6 +106,8 @@ namespace Impostor.Api.Innersloth.Net.Objects
break;
}
}
return default;
}
public override bool Serialize(IMessageWriter writer, bool initialState)
@@ -1,4 +1,5 @@
using Impostor.Api.Games;
using System.Threading.Tasks;
using Impostor.Api.Games;
using Impostor.Api.Net;
using Impostor.Api.Net.Messages;
@@ -15,7 +16,8 @@ namespace Impostor.Api.Innersloth.Net.Objects
Components.Add(this);
}
public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader)
public override ValueTask HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call,
IMessageReader reader)
{
throw new System.NotImplementedException();
}
@@ -1,5 +1,6 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using Impostor.Api.Games;
using Impostor.Api.Net;
using Impostor.Api.Net.Messages;
@@ -38,7 +39,7 @@ namespace Impostor.Api.Innersloth.Net.Objects
.ToArray();
}
public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader)
public override ValueTask HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader)
{
switch (call)
{
@@ -105,6 +106,8 @@ namespace Impostor.Api.Innersloth.Net.Objects
break;
}
}
return default;
}
public override bool Serialize(IMessageWriter writer, bool initialState)
@@ -1,4 +1,7 @@
using System;
using System.Threading.Tasks;
using Impostor.Api.Events.Managers;
using Impostor.Api.Events.Net;
using Impostor.Api.Games;
using Impostor.Api.Innersloth.Data;
using Impostor.Api.Innersloth.Net.Objects.Components;
@@ -12,11 +15,13 @@ namespace Impostor.Api.Innersloth.Net.Objects
public class InnerPlayerControl : InnerNetObject
{
private readonly ILogger<InnerPlayerControl> _logger;
private readonly IEventManager _eventManager;
private readonly IGame _game;
public InnerPlayerControl(ILogger<InnerPlayerControl> logger, IServiceProvider serviceProvider, IGame game)
public InnerPlayerControl(ILogger<InnerPlayerControl> logger, IServiceProvider serviceProvider, IEventManager eventManager, IGame game)
{
_logger = logger;
_eventManager = eventManager;
_game = game;
Components.Add(this);
@@ -32,7 +37,7 @@ namespace Impostor.Api.Innersloth.Net.Objects
public InnerGameData.PlayerInfo PlayerInfo { get; internal set; }
public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader)
public override async ValueTask HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader)
{
switch (call)
{
@@ -269,6 +274,8 @@ namespace Impostor.Api.Innersloth.Net.Objects
}
var chat = reader.ReadString();
await _eventManager.CallAsync(new PlayerChatEvent(_game, this, chat));
break;
}
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Impostor.Api.Games;
using Impostor.Api.Innersloth.Net.Objects.Systems;
using Impostor.Api.Innersloth.Net.Objects.Systems.ShipStatus;
@@ -42,7 +43,7 @@ namespace Impostor.Api.Innersloth.Net.Objects
Components.Add(this);
}
public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader)
public override ValueTask HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader)
{
switch (call)
{
@@ -90,6 +91,8 @@ namespace Impostor.Api.Innersloth.Net.Objects
break;
}
}
return default;
}
public override bool Serialize(IMessageWriter writer, bool initialState)
@@ -17,5 +17,11 @@ namespace Impostor.Plugins.Example.Handlers
{
Console.WriteLine(e.PlayerControl.PlayerInfo.PlayerName + " destroyed");
}
[EventListener]
public void OnPlayerChat(PlayerChatEvent e)
{
Console.WriteLine(e.PlayerControl.PlayerInfo.PlayerName + " said " + e.Message);
}
}
}
+8 -1
View File
@@ -8,16 +8,19 @@ using Impostor.Api.Events;
using Impostor.Api.Events.Managers;
using Impostor.Server.Events.Register;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
namespace Impostor.Server.Events
{
internal class EventManager : IEventManager
{
private readonly ConcurrentDictionary<Type, TemporaryEventRegister> _temporaryEventListeners;
private readonly ILogger<EventManager> _logger;
private readonly IServiceProvider _serviceProvider;
public EventManager(IServiceProvider serviceProvider)
public EventManager(ILogger<EventManager> logger, IServiceProvider serviceProvider)
{
_logger = logger;
_serviceProvider = serviceProvider;
_temporaryEventListeners = new ConcurrentDictionary<Type, TemporaryEventRegister>();
}
@@ -76,6 +79,10 @@ namespace Impostor.Server.Events
await eventListener.InvokeAsync(handler, @event, scope.ServiceProvider);
}
}
catch (Exception e)
{
_logger.LogError(e, "Invocation of event {0} threw an exception.", @event.GetType().Name);
}
finally
{
scope.Dispose();
@@ -77,6 +77,7 @@ namespace Impostor.Server.Events.Register
}
var returnTarget = Expression.Label(typeof(ValueTask));
Expression invoke = Expression.Call(Expression.Convert(instance, _eventListenerType), method, arguments);
if (method.ReturnType == typeof(void))