Added ConsoleCommand, and an example to go with it
This commit is contained in:
@@ -77,7 +77,8 @@ namespace OpenRA.Traits
|
||||
}
|
||||
case "DevGiveCash":
|
||||
{
|
||||
self.Trait<PlayerResources>().GiveCash(Info.Cash);
|
||||
var amount = order.ExtraData != 0 ? (int)order.ExtraData : Info.Cash;
|
||||
self.Trait<PlayerResources>().GiveCash(amount);
|
||||
break;
|
||||
}
|
||||
case "DevGrowResources":
|
||||
|
||||
56
OpenRA.Mods.RA/ChatCommands.cs
Normal file
56
OpenRA.Mods.RA/ChatCommands.cs
Normal file
@@ -0,0 +1,56 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2014 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 COPYING.
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using OpenRA.Traits;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace OpenRA.Mods.RA
|
||||
{
|
||||
public class ChatCommandsInfo : TraitInfo<ChatCommands> { }
|
||||
|
||||
public class ChatCommands : INotifyChat
|
||||
{
|
||||
public Dictionary<string, IChatCommand> Commands { get; private set; }
|
||||
|
||||
public ChatCommands()
|
||||
{
|
||||
Commands = new Dictionary<string, IChatCommand>();
|
||||
}
|
||||
|
||||
public bool OnChat(string playername, string message)
|
||||
{
|
||||
if (message.StartsWith("/"))
|
||||
{
|
||||
var name = message.Substring(1).Split(' ')[0].ToLower();
|
||||
var command = Commands.FirstOrDefault(x => x.Key == name);
|
||||
|
||||
if (command.Value != null)
|
||||
command.Value.InvokeCommand(name.ToLower(), message.Substring(1 + name.Length));
|
||||
else
|
||||
Game.Debug("{0} is not a valid command.", name);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void RegisterCommand(string name, IChatCommand command)
|
||||
{
|
||||
Commands.Add(name.ToLower(), command);
|
||||
}
|
||||
}
|
||||
|
||||
public interface IChatCommand
|
||||
{
|
||||
void InvokeCommand(string command, string arg);
|
||||
}
|
||||
}
|
||||
83
OpenRA.Mods.RA/DevCommands.cs
Normal file
83
OpenRA.Mods.RA/DevCommands.cs
Normal file
@@ -0,0 +1,83 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2014 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 COPYING.
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.RA
|
||||
{
|
||||
public class DevCommandsInfo : TraitInfo<DevCommands> { }
|
||||
|
||||
public class DevCommands : IChatCommand, IWorldLoaded
|
||||
{
|
||||
World world;
|
||||
|
||||
public DevCommands() { }
|
||||
|
||||
public void WorldLoaded(World w, WorldRenderer wr)
|
||||
{
|
||||
world = w;
|
||||
var console = world.WorldActor.Trait<ChatCommands>();
|
||||
var help = world.WorldActor.Trait<HelpCommand>();
|
||||
|
||||
console.RegisterCommand("shroud", this);
|
||||
console.RegisterCommand("give", this);
|
||||
console.RegisterCommand("instabuild", this);
|
||||
console.RegisterCommand("buildrange", this);
|
||||
console.RegisterCommand("power", this);
|
||||
console.RegisterCommand("tech", this);
|
||||
|
||||
help.RegisterHelp("shroud", "enables or disables shroud.");
|
||||
help.RegisterHelp("give", "gives the default or specified amount of money.");
|
||||
help.RegisterHelp("instabuild", "enables or disables instant building");
|
||||
help.RegisterHelp("buildrange", "allows or disallows you to build out of your build-range");
|
||||
help.RegisterHelp("power", "enables or disables infinite power");
|
||||
help.RegisterHelp("tech", "gives or takes the ability to build everything");
|
||||
}
|
||||
|
||||
public void InvokeCommand(string name, string arg)
|
||||
{
|
||||
if (!world.LobbyInfo.GlobalSettings.AllowCheats)
|
||||
{
|
||||
Game.Debug("Cheats are disabled.");
|
||||
return;
|
||||
}
|
||||
|
||||
switch (name)
|
||||
{
|
||||
case "give":
|
||||
var order = new Order("DevGiveCash", world.LocalPlayer.PlayerActor, false);
|
||||
var cash = 0;
|
||||
|
||||
if (int.TryParse(arg, out cash))
|
||||
order.ExtraData = (uint)cash;
|
||||
|
||||
Game.Debug("Giving {0} credits to player {1}.", (cash == 0 ? "cheat default" : cash.ToString()), world.LocalPlayer.PlayerName);
|
||||
world.IssueOrder(order);
|
||||
|
||||
break;
|
||||
|
||||
case "shroud": IssueDevCommand(world, "DevShroudDisable"); break;
|
||||
case "instabuild": IssueDevCommand(world, "DevFastBuild"); break;
|
||||
case "buildrange": IssueDevCommand(world, "DevBuildAnywhere"); break;
|
||||
case "power": IssueDevCommand(world, "DevUnlimitedPower"); break;
|
||||
case "tech": IssueDevCommand(world, "DevEnableTech"); break;
|
||||
case "support": IssueDevCommand(world, "DevFastCharge"); break;
|
||||
}
|
||||
}
|
||||
|
||||
void IssueDevCommand(World world, string command)
|
||||
{
|
||||
world.IssueOrder(new Order(command, world.LocalPlayer.PlayerActor, false));
|
||||
}
|
||||
}
|
||||
}
|
||||
59
OpenRA.Mods.RA/HelpCommand.cs
Normal file
59
OpenRA.Mods.RA/HelpCommand.cs
Normal file
@@ -0,0 +1,59 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2014 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 COPYING.
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.RA
|
||||
{
|
||||
public class HelpCommandInfo : TraitInfo<HelpCommand> { }
|
||||
|
||||
public class HelpCommand : IChatCommand, IWorldLoaded
|
||||
{
|
||||
World world;
|
||||
ChatCommands console;
|
||||
Dictionary<string, string> helpDescriptions;
|
||||
|
||||
public HelpCommand()
|
||||
{
|
||||
helpDescriptions = new Dictionary<string, string>();
|
||||
}
|
||||
|
||||
public void WorldLoaded(World w, WorldRenderer wr)
|
||||
{
|
||||
world = w;
|
||||
console = world.WorldActor.Trait<ChatCommands>();
|
||||
|
||||
console.RegisterCommand("help", this);
|
||||
RegisterHelp("help", "provides useful info about various commands");
|
||||
}
|
||||
|
||||
public void InvokeCommand(string name, string arg)
|
||||
{
|
||||
Game.Debug("Here are the available commands:");
|
||||
|
||||
foreach (var key in console.Commands.Keys)
|
||||
{
|
||||
var description = "";
|
||||
if (!helpDescriptions.TryGetValue(key, out description))
|
||||
description = "no description available.";
|
||||
|
||||
Game.Debug("{0}: {1}", key, description);
|
||||
}
|
||||
}
|
||||
|
||||
public void RegisterHelp(string name, string description)
|
||||
{
|
||||
helpDescriptions.Add(name, description);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -521,6 +521,9 @@
|
||||
<Compile Include="Scripting\Global\CameraGlobal.cs" />
|
||||
<Compile Include="Scripting\Properties\ChronosphereProperties.cs" />
|
||||
<Compile Include="Scripting\ScriptInvulnerable.cs" />
|
||||
<Compile Include="DevCommands.cs" />
|
||||
<Compile Include="HelpCommand.cs" />
|
||||
<Compile Include="ChatCommands.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\OpenRA.Game\OpenRA.Game.csproj">
|
||||
|
||||
@@ -48,4 +48,5 @@ namespace OpenRA.Mods.RA
|
||||
public interface INotifyTransform { void OnTransform(Actor self); }
|
||||
public interface INotifyTransformed { void OnTransformed(Actor toActor); }
|
||||
public interface INotifyAttack { void Attacking(Actor self, Target target, Armament a, Barrel barrel); }
|
||||
public interface INotifyChat { bool OnChat(string from, string message); }
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2013 The OpenRA Developers (see AUTHORS)
|
||||
* Copyright 2007-2014 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,
|
||||
@@ -8,10 +8,13 @@
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using OpenRA.Network;
|
||||
using OpenRA.Widgets;
|
||||
using OpenRA.Traits;
|
||||
using OpenRA.Graphics;
|
||||
|
||||
namespace OpenRA.Mods.RA.Widgets.Logic
|
||||
{
|
||||
@@ -25,11 +28,15 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
||||
readonly ContainerWidget chatTemplate;
|
||||
readonly TextFieldWidget chatText;
|
||||
|
||||
readonly List<INotifyChat> chatTraits;
|
||||
|
||||
bool teamChat;
|
||||
|
||||
[ObjectCreator.UseCtor]
|
||||
public IngameChatLogic(Widget widget, OrderManager orderManager, World world)
|
||||
{
|
||||
chatTraits = world.WorldActor.TraitsImplementing<INotifyChat>().ToList();
|
||||
|
||||
var players = world.Players.Where(p => p != world.LocalPlayer && !p.NonCombatant && !p.IsBot);
|
||||
var disableTeamChat = world.LocalPlayer == null || world.LobbyInfo.IsSinglePlayer || !players.Any(p => p.IsAlliedWith(world.LocalPlayer));
|
||||
teamChat = !disableTeamChat;
|
||||
@@ -117,6 +124,9 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
||||
|
||||
public void AddChatLine(Color c, string from, string text)
|
||||
{
|
||||
if (chatTraits != null && !chatTraits.All(x => x.OnChat(from, text)))
|
||||
return;
|
||||
|
||||
chatOverlayDisplay.AddLine(c, from, text);
|
||||
|
||||
var template = chatTemplate.Clone();
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
World:
|
||||
GameConsole:
|
||||
ScreenMap:
|
||||
ActorMap:
|
||||
LoadWidgetAtGameStart:
|
||||
|
||||
Reference in New Issue
Block a user