Added ConsoleCommand, and an example to go with it

This commit is contained in:
Chicken man
2014-05-04 10:00:41 -04:00
parent 0783f60ba1
commit fa4b157b42
8 changed files with 217 additions and 3 deletions

View File

@@ -77,7 +77,8 @@ namespace OpenRA.Traits
} }
case "DevGiveCash": case "DevGiveCash":
{ {
self.Trait<PlayerResources>().GiveCash(Info.Cash); var amount = order.ExtraData != 0 ? (int)order.ExtraData : Info.Cash;
self.Trait<PlayerResources>().GiveCash(amount);
break; break;
} }
case "DevGrowResources": case "DevGrowResources":

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

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

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

View File

@@ -521,6 +521,9 @@
<Compile Include="Scripting\Global\CameraGlobal.cs" /> <Compile Include="Scripting\Global\CameraGlobal.cs" />
<Compile Include="Scripting\Properties\ChronosphereProperties.cs" /> <Compile Include="Scripting\Properties\ChronosphereProperties.cs" />
<Compile Include="Scripting\ScriptInvulnerable.cs" /> <Compile Include="Scripting\ScriptInvulnerable.cs" />
<Compile Include="DevCommands.cs" />
<Compile Include="HelpCommand.cs" />
<Compile Include="ChatCommands.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\OpenRA.Game\OpenRA.Game.csproj"> <ProjectReference Include="..\OpenRA.Game\OpenRA.Game.csproj">

View File

@@ -48,4 +48,5 @@ namespace OpenRA.Mods.RA
public interface INotifyTransform { void OnTransform(Actor self); } public interface INotifyTransform { void OnTransform(Actor self); }
public interface INotifyTransformed { void OnTransformed(Actor toActor); } public interface INotifyTransformed { void OnTransformed(Actor toActor); }
public interface INotifyAttack { void Attacking(Actor self, Target target, Armament a, Barrel barrel); } public interface INotifyAttack { void Attacking(Actor self, Target target, Armament a, Barrel barrel); }
public interface INotifyChat { bool OnChat(string from, string message); }
} }

View File

@@ -1,6 +1,6 @@
#region Copyright & License Information #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 * 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 * available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information, * as published by the Free Software Foundation. For more information,
@@ -8,10 +8,13 @@
*/ */
#endregion #endregion
using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Linq; using System.Linq;
using OpenRA.Network; using OpenRA.Network;
using OpenRA.Widgets; using OpenRA.Widgets;
using OpenRA.Traits;
using OpenRA.Graphics;
namespace OpenRA.Mods.RA.Widgets.Logic namespace OpenRA.Mods.RA.Widgets.Logic
{ {
@@ -25,11 +28,15 @@ namespace OpenRA.Mods.RA.Widgets.Logic
readonly ContainerWidget chatTemplate; readonly ContainerWidget chatTemplate;
readonly TextFieldWidget chatText; readonly TextFieldWidget chatText;
readonly List<INotifyChat> chatTraits;
bool teamChat; bool teamChat;
[ObjectCreator.UseCtor] [ObjectCreator.UseCtor]
public IngameChatLogic(Widget widget, OrderManager orderManager, World world) 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 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)); var disableTeamChat = world.LocalPlayer == null || world.LobbyInfo.IsSinglePlayer || !players.Any(p => p.IsAlliedWith(world.LocalPlayer));
teamChat = !disableTeamChat; teamChat = !disableTeamChat;
@@ -117,6 +124,9 @@ namespace OpenRA.Mods.RA.Widgets.Logic
public void AddChatLine(Color c, string from, string text) 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); chatOverlayDisplay.AddLine(c, from, text);
var template = chatTemplate.Clone(); var template = chatTemplate.Clone();
@@ -154,4 +164,4 @@ namespace OpenRA.Mods.RA.Widgets.Logic
Sound.PlayNotification(null, "Sounds", "ChatLine", null); Sound.PlayNotification(null, "Sounds", "ChatLine", null);
} }
} }
} }

View File

@@ -1,4 +1,5 @@
World: World:
GameConsole:
ScreenMap: ScreenMap:
ActorMap: ActorMap:
LoadWidgetAtGameStart: LoadWidgetAtGameStart: