--- /dev/null
+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; }
+ }
+}
\ No newline at end of file
-using Impostor.Api.Net;
+using System.Threading.Tasks;
+using Impostor.Api.Net;
using Impostor.Api.Net.Messages;
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);
using System;
using System.Numerics;
+using System.Threading.Tasks;
using Impostor.Api.Net;
using Impostor.Api.Net.Messages;
using Microsoft.Extensions.Logging;
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)
{
{
_logger.LogWarning("{0}: Unknown rpc call {1}", nameof(InnerCustomNetworkTransform), call);
}
+
+ return default;
}
public override bool Serialize(IMessageWriter writer, bool initialState)
using System;
+using System.Threading.Tasks;
using Impostor.Api.Net;
using Impostor.Api.Net.Messages;
using Microsoft.Extensions.Logging;
_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))
var ventEnter = call == RpcCalls.EnterVent;
// TODO: Do stuff.
+
+ return default;
}
public override bool Serialize(IMessageWriter writer, bool initialState)
using System;
using System.Collections.Generic;
+using System.Threading.Tasks;
using Impostor.Api.Net;
using Impostor.Api.Net.Messages;
using Microsoft.Extensions.Logging;
_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();
var targetClientId = reader.ReadInt32();
// TODO: Use.
+
+ return default;
}
public override bool Serialize(IMessageWriter writer, bool initialState)
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;
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)
{
break;
}
}
+
+ return default;
}
public override bool Serialize(IMessageWriter writer, bool initialState)
-using Impostor.Api.Games;
+using System.Threading.Tasks;
+using Impostor.Api.Games;
using Impostor.Api.Net;
using Impostor.Api.Net.Messages;
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();
}
using System;
using System.Linq;
+using System.Threading.Tasks;
using Impostor.Api.Games;
using Impostor.Api.Net;
using Impostor.Api.Net.Messages;
.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)
{
break;
}
}
+
+ return default;
}
public override bool Serialize(IMessageWriter writer, bool initialState)
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;
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);
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)
{
}
var chat = reader.ReadString();
+
+ await _eventManager.CallAsync(new PlayerChatEvent(_game, this, chat));
break;
}
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;
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)
{
break;
}
}
+
+ return default;
}
public override bool Serialize(IMessageWriter writer, bool initialState)
{
Console.WriteLine(e.PlayerControl.PlayerInfo.PlayerName + " destroyed");
}
+
+ [EventListener]
+ public void OnPlayerChat(PlayerChatEvent e)
+ {
+ Console.WriteLine(e.PlayerControl.PlayerInfo.PlayerName + " said " + e.Message);
+ }
}
}
\ No newline at end of file
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>();
}
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();
}
var returnTarget = Expression.Label(typeof(ValueTask));
+
Expression invoke = Expression.Call(Expression.Convert(instance, _eventListenerType), method, arguments);
if (method.ReturnType == typeof(void))