(gecko) Allow mods to override order validation
This commit is contained in:
@@ -18,7 +18,7 @@ using OpenRA.Support;
|
|||||||
|
|
||||||
namespace OpenRA.Network
|
namespace OpenRA.Network
|
||||||
{
|
{
|
||||||
enum ConnectionState
|
public enum ConnectionState
|
||||||
{
|
{
|
||||||
PreConnecting,
|
PreConnecting,
|
||||||
NotConnected,
|
NotConnected,
|
||||||
@@ -26,7 +26,7 @@ namespace OpenRA.Network
|
|||||||
Connected,
|
Connected,
|
||||||
}
|
}
|
||||||
|
|
||||||
interface IConnection : IDisposable
|
public interface IConnection : IDisposable
|
||||||
{
|
{
|
||||||
int LocalClientId { get; }
|
int LocalClientId { get; }
|
||||||
ConnectionState ConnectionState { get; }
|
ConnectionState ConnectionState { get; }
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ using OpenRA.FileFormats;
|
|||||||
|
|
||||||
namespace OpenRA.Network
|
namespace OpenRA.Network
|
||||||
{
|
{
|
||||||
class OrderManager : IDisposable
|
public class OrderManager : IDisposable
|
||||||
{
|
{
|
||||||
readonly SyncReport syncReport;
|
readonly SyncReport syncReport;
|
||||||
readonly FrameData frameData = new FrameData();
|
readonly FrameData frameData = new FrameData();
|
||||||
|
|||||||
@@ -27,14 +27,14 @@ namespace OpenRA.Network
|
|||||||
|
|
||||||
public static void ProcessOrder( OrderManager orderManager, World world, int clientId, Order order )
|
public static void ProcessOrder( OrderManager orderManager, World world, int clientId, Order order )
|
||||||
{
|
{
|
||||||
// Drop exploiting orders
|
if (world != null)
|
||||||
if (order.Subject != null && order.Subject.Owner.ClientIndex != clientId)
|
|
||||||
{
|
{
|
||||||
Game.Debug("Detected exploit order from {0}: {1}".F(clientId, order.OrderString));
|
if (!world.WorldActor.TraitsImplementing<IValidateOrder>().All(vo =>
|
||||||
return;
|
vo.OrderValidation(orderManager, world, clientId, order)))
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch( order.OrderString )
|
switch( order.OrderString )
|
||||||
{
|
{
|
||||||
case "Chat":
|
case "Chat":
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -221,6 +221,7 @@
|
|||||||
<Compile Include="Network\SyncReport.cs" />
|
<Compile Include="Network\SyncReport.cs" />
|
||||||
<Compile Include="Server\IServerExtension.cs" />
|
<Compile Include="Server\IServerExtension.cs" />
|
||||||
<Compile Include="Server\NullServerExtension.cs" />
|
<Compile Include="Server\NullServerExtension.cs" />
|
||||||
|
<Compile Include="Traits\ValidateOrder.cs" />
|
||||||
<Compile Include="TraitDictionary.cs" />
|
<Compile Include="TraitDictionary.cs" />
|
||||||
<Compile Include="Traits\Activities\CancelableActivity.cs" />
|
<Compile Include="Traits\Activities\CancelableActivity.cs" />
|
||||||
<Compile Include="Traits\SharesCell.cs" />
|
<Compile Include="Traits\SharesCell.cs" />
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ using System.Drawing;
|
|||||||
using OpenRA.FileFormats;
|
using OpenRA.FileFormats;
|
||||||
using OpenRA.GameRules;
|
using OpenRA.GameRules;
|
||||||
using OpenRA.Graphics;
|
using OpenRA.Graphics;
|
||||||
|
using OpenRA.Network;
|
||||||
|
|
||||||
namespace OpenRA.Traits
|
namespace OpenRA.Traits
|
||||||
{
|
{
|
||||||
@@ -44,8 +45,10 @@ namespace OpenRA.Traits
|
|||||||
int OrderPriority { get; }
|
int OrderPriority { get; }
|
||||||
bool CanTargetUnit( Actor self, Actor target, bool forceAttack, bool forceMove, ref string cursor );
|
bool CanTargetUnit( Actor self, Actor target, bool forceAttack, bool forceMove, ref string cursor );
|
||||||
bool CanTargetLocation( Actor self, int2 location, List<Actor> actorsAtLocation, bool forceAttack, bool forceMove, ref string cursor );
|
bool CanTargetLocation( Actor self, int2 location, List<Actor> actorsAtLocation, bool forceAttack, bool forceMove, ref string cursor );
|
||||||
}
|
}
|
||||||
public interface IResolveOrder { void ResolveOrder(Actor self, Order order); }
|
public interface IResolveOrder { void ResolveOrder(Actor self, Order order); }
|
||||||
|
public interface IValidateOrder { bool OrderValidation(OrderManager orderManager, World world, int clientId, Order order);
|
||||||
|
}
|
||||||
public interface IOrderCursor { string CursorForOrder(Actor self, Order order); }
|
public interface IOrderCursor { string CursorForOrder(Actor self, Order order); }
|
||||||
public interface IOrderVoice { string VoicePhraseForOrder(Actor self, Order order); }
|
public interface IOrderVoice { string VoicePhraseForOrder(Actor self, Order order); }
|
||||||
|
|
||||||
|
|||||||
31
OpenRA.Game/Traits/ValidateOrder.cs
Normal file
31
OpenRA.Game/Traits/ValidateOrder.cs
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
#region Copyright & License Information
|
||||||
|
/*
|
||||||
|
* Copyright 2007-2010 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. For more information,
|
||||||
|
* see LICENSE.
|
||||||
|
*/
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
using OpenRA.Network;
|
||||||
|
|
||||||
|
namespace OpenRA.Traits
|
||||||
|
{
|
||||||
|
public class ValidateOrderInfo : TraitInfo<ValidateOrder> { }
|
||||||
|
|
||||||
|
public class ValidateOrder : IValidateOrder
|
||||||
|
{
|
||||||
|
public bool OrderValidation(OrderManager orderManager, World world, int clientId, Order order)
|
||||||
|
{
|
||||||
|
// Drop exploiting orders
|
||||||
|
if (order.Subject != null && order.Subject.Owner.ClientIndex != clientId)
|
||||||
|
{
|
||||||
|
Game.Debug("Detected exploit order from {0}: {1}".F(clientId, order.OrderString));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user