(gecko) Allow mods to override order validation

This commit is contained in:
Chris Forbes
2010-11-02 13:30:49 +13:00
parent 4aa1fb4b86
commit 1409016cbd
6 changed files with 47 additions and 12 deletions

View File

@@ -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; }

View File

@@ -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();

View File

@@ -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":
{ {

View File

@@ -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" />
@@ -257,4 +258,4 @@
<Target Name="AfterBuild"> <Target Name="AfterBuild">
</Target> </Target>
--> -->
</Project> </Project>

View File

@@ -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); }

View 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;
}
}
}