mirror of
https://github.com/Impostor/Impostor.git
synced 2026-10-20 01:46:11 +00:00
HandleRpc async for sending events
This commit is contained in:
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,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))
|
||||
|
||||
Reference in new issue
Block a user