Files
OpenRA/OpenRA.Mods.Common/Traits/World/ValidateOrder.cs
reaperrr aa834db1e3 Make perf.log output for ticking things opt-in
Both writing to perf.log frequently as well as GetTimestamp
aren't free and hurt performance particularly on slower systems
(which can have notably higher output to perf.log, further
amplifying the problem).
Therefore we make simulation perf logging opt-in.

Additionally, logging of the current tick and tick type
(local/net) is removed from debug.log, and some
remnant debug logging for kills and pips is removed
to keep performance-sensitive logging limited to
perf.log.
2021-04-10 15:59:24 +02:00

48 lines
1.6 KiB
C#

#region Copyright & License Information
/*
* Copyright 2007-2020 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version. For more
* information, see COPYING.
*/
#endregion
using OpenRA.Network;
using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits
{
[Desc("Used to detect exploits. Attach this to the world actor.")]
public class ValidateOrderInfo : TraitInfo<ValidateOrder> { }
public class ValidateOrder : IValidateOrder
{
public bool OrderValidation(OrderManager orderManager, World world, int clientId, Order order)
{
if (order.Subject == null || order.Subject.Owner == null)
return true;
var subjectClientId = order.Subject.Owner.ClientIndex;
var subjectClient = orderManager.LobbyInfo.ClientWithIndex(subjectClientId);
if (subjectClient == null)
{
Log.Write("debug", "Tick {0}: Order sent to {1}: resolved ClientIndex `{2}` doesn't exist", world.WorldTick, order.Subject.Owner.PlayerName, subjectClientId);
return false;
}
var isBotOrder = subjectClient.Bot != null && clientId == subjectClient.BotControllerClientIndex;
// Drop orders from players who shouldn't be able to control this actor
// This may be because the owner changed within the last net tick,
// or, less likely, the client may be trying to do something malicious.
if (subjectClientId != clientId && !isBotOrder)
return false;
return order.Subject.AcceptsOrder(order.OrderString);
}
}
}