Merge pull request #6786 from pchote/retire-code
Retire legacy Lua API and IRC code.
This commit is contained in:
10
AUTHORS
10
AUTHORS
@@ -111,13 +111,6 @@ the Apache 2.0 license.
|
|||||||
Using GeoLite2 data created by MaxMind and
|
Using GeoLite2 data created by MaxMind and
|
||||||
distributed under the CC BY-SA 3.0 license.
|
distributed under the CC BY-SA 3.0 license.
|
||||||
|
|
||||||
Using KopiLua created by Mark Feldman and
|
|
||||||
maintained by Vinicius Jarina and distributed
|
|
||||||
under the MIT license.
|
|
||||||
|
|
||||||
Using NLua created by Vinicius Jarina and
|
|
||||||
distributed under the MIT license.
|
|
||||||
|
|
||||||
Using SharpFont created by Robert Rouhani and
|
Using SharpFont created by Robert Rouhani and
|
||||||
distributed under the MIT license.
|
distributed under the MIT license.
|
||||||
|
|
||||||
@@ -127,6 +120,9 @@ MIT license.
|
|||||||
Using SDL2# created by Ethan Lee and released
|
Using SDL2# created by Ethan Lee and released
|
||||||
under the zlib license.
|
under the zlib license.
|
||||||
|
|
||||||
|
Using Eluant created by Chris Howie and released
|
||||||
|
under the MIT license.
|
||||||
|
|
||||||
Using FuzzyLogicLibrary (fuzzynet) by Dmitry
|
Using FuzzyLogicLibrary (fuzzynet) by Dmitry
|
||||||
Kaluzhny and released under the GNU GPL terms.
|
Kaluzhny and released under the GNU GPL terms.
|
||||||
|
|
||||||
|
|||||||
20
Makefile
20
Makefile
@@ -67,7 +67,7 @@ INSTALL_PROGRAM = $(INSTALL) -m755
|
|||||||
INSTALL_DATA = $(INSTALL) -m644
|
INSTALL_DATA = $(INSTALL) -m644
|
||||||
|
|
||||||
# program targets
|
# program targets
|
||||||
CORE = rsdl2 rnull game utility irc ralint
|
CORE = rsdl2 rnull game utility ralint
|
||||||
TOOLS = editor tsbuild crashdialog
|
TOOLS = editor tsbuild crashdialog
|
||||||
|
|
||||||
VERSION = $(shell git name-rev --name-only --tags --no-undefined HEAD 2>/dev/null || echo git-`git rev-parse --short HEAD`)
|
VERSION = $(shell git name-rev --name-only --tags --no-undefined HEAD 2>/dev/null || echo git-`git rev-parse --short HEAD`)
|
||||||
@@ -86,14 +86,6 @@ game_FLAGS = -win32icon:OpenRA.Game/OpenRA.ico
|
|||||||
PROGRAMS += game
|
PROGRAMS += game
|
||||||
game: $(game_TARGET)
|
game: $(game_TARGET)
|
||||||
|
|
||||||
irc_SRCS := $(shell find OpenRA.Irc/ -iname '*.cs')
|
|
||||||
irc_TARGET = OpenRA.Irc.dll
|
|
||||||
irc_KIND = library
|
|
||||||
irc_DEPS = $(game_TARGET)
|
|
||||||
irc_LIBS = $(COMMON_LIBS) $(irc_DEPS)
|
|
||||||
PROGRAMS += irc
|
|
||||||
irc: $(irc_TARGET)
|
|
||||||
|
|
||||||
# Renderer dlls
|
# Renderer dlls
|
||||||
rsdl2_SRCS := $(shell find OpenRA.Renderer.Sdl2/ -iname '*.cs')
|
rsdl2_SRCS := $(shell find OpenRA.Renderer.Sdl2/ -iname '*.cs')
|
||||||
rsdl2_TARGET = OpenRA.Renderer.Sdl2.dll
|
rsdl2_TARGET = OpenRA.Renderer.Sdl2.dll
|
||||||
@@ -120,16 +112,15 @@ mod_common: $(mod_common_TARGET)
|
|||||||
|
|
||||||
##### Official Mods #####
|
##### Official Mods #####
|
||||||
|
|
||||||
STD_MOD_LIBS = $(game_TARGET) thirdparty/KopiLua.dll thirdparty/NLua.dll
|
STD_MOD_LIBS = $(game_TARGET)
|
||||||
STD_MOD_DEPS = $(STD_MOD_LIBS) $(ralint_TARGET)
|
STD_MOD_DEPS = $(STD_MOD_LIBS) $(ralint_TARGET)
|
||||||
|
|
||||||
|
|
||||||
# Red Alert
|
# Red Alert
|
||||||
mod_ra_SRCS := $(shell find OpenRA.Mods.RA/ -iname '*.cs')
|
mod_ra_SRCS := $(shell find OpenRA.Mods.RA/ -iname '*.cs')
|
||||||
mod_ra_TARGET = mods/ra/OpenRA.Mods.RA.dll
|
mod_ra_TARGET = mods/ra/OpenRA.Mods.RA.dll
|
||||||
mod_ra_KIND = library
|
mod_ra_KIND = library
|
||||||
mod_ra_DEPS = $(STD_MOD_DEPS) $(mod_common_TARGET) $(irc_TARGET)
|
mod_ra_DEPS = $(STD_MOD_DEPS) $(mod_common_TARGET)
|
||||||
mod_ra_LIBS = $(COMMON_LIBS) $(STD_MOD_LIBS) $(mod_common_TARGET) $(irc_TARGET)
|
mod_ra_LIBS = $(COMMON_LIBS) $(STD_MOD_LIBS) $(mod_common_TARGET)
|
||||||
PROGRAMS += mod_ra
|
PROGRAMS += mod_ra
|
||||||
mod_ra: $(mod_ra_TARGET)
|
mod_ra: $(mod_ra_TARGET)
|
||||||
|
|
||||||
@@ -333,7 +324,6 @@ install-core: default
|
|||||||
|
|
||||||
@$(CP_R) glsl "$(DATA_INSTALL_DIR)"
|
@$(CP_R) glsl "$(DATA_INSTALL_DIR)"
|
||||||
@$(CP_R) lua "$(DATA_INSTALL_DIR)"
|
@$(CP_R) lua "$(DATA_INSTALL_DIR)"
|
||||||
@$(CP) *.ttf "$(DATA_INSTALL_DIR)"
|
|
||||||
@$(CP) SDL2-CS* "$(DATA_INSTALL_DIR)"
|
@$(CP) SDL2-CS* "$(DATA_INSTALL_DIR)"
|
||||||
@$(CP) Eluant* "$(DATA_INSTALL_DIR)"
|
@$(CP) Eluant* "$(DATA_INSTALL_DIR)"
|
||||||
@$(INSTALL_PROGRAM) ICSharpCode.SharpZipLib.dll "$(DATA_INSTALL_DIR)"
|
@$(INSTALL_PROGRAM) ICSharpCode.SharpZipLib.dll "$(DATA_INSTALL_DIR)"
|
||||||
@@ -341,8 +331,6 @@ install-core: default
|
|||||||
@$(INSTALL_PROGRAM) SharpFont.dll "$(DATA_INSTALL_DIR)"
|
@$(INSTALL_PROGRAM) SharpFont.dll "$(DATA_INSTALL_DIR)"
|
||||||
@$(CP) SharpFont.dll.config "$(DATA_INSTALL_DIR)"
|
@$(CP) SharpFont.dll.config "$(DATA_INSTALL_DIR)"
|
||||||
@$(INSTALL_PROGRAM) Mono.Nat.dll "$(DATA_INSTALL_DIR)"
|
@$(INSTALL_PROGRAM) Mono.Nat.dll "$(DATA_INSTALL_DIR)"
|
||||||
@$(INSTALL_PROGRAM) KopiLua.dll "$(DATA_INSTALL_DIR)"
|
|
||||||
@$(INSTALL_PROGRAM) NLua.dll "$(DATA_INSTALL_DIR)"
|
|
||||||
@$(INSTALL_PROGRAM) MaxMind.Db.dll "$(DATA_INSTALL_DIR)"
|
@$(INSTALL_PROGRAM) MaxMind.Db.dll "$(DATA_INSTALL_DIR)"
|
||||||
@$(INSTALL_PROGRAM) MaxMind.GeoIP2.dll "$(DATA_INSTALL_DIR)"
|
@$(INSTALL_PROGRAM) MaxMind.GeoIP2.dll "$(DATA_INSTALL_DIR)"
|
||||||
@$(INSTALL_PROGRAM) Newtonsoft.Json.dll "$(DATA_INSTALL_DIR)"
|
@$(INSTALL_PROGRAM) Newtonsoft.Json.dll "$(DATA_INSTALL_DIR)"
|
||||||
|
|||||||
@@ -214,22 +214,6 @@ namespace OpenRA
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class IrcSettings
|
|
||||||
{
|
|
||||||
public string Hostname = "irc.openra.net";
|
|
||||||
public int Port = 6667;
|
|
||||||
public string Nickname = null;
|
|
||||||
public string Username = "openra";
|
|
||||||
public string Realname = null;
|
|
||||||
public string DefaultNickname = "Newbie";
|
|
||||||
public string Channel = "global";
|
|
||||||
public string TimestampFormat = "HH:mm:ss";
|
|
||||||
public int ReconnectDelay = 10000;
|
|
||||||
public int ConnectionTimeout = 300000;
|
|
||||||
public bool Debug = false;
|
|
||||||
public bool ConnectAutomatically = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public class Settings
|
public class Settings
|
||||||
{
|
{
|
||||||
string settingsFile;
|
string settingsFile;
|
||||||
@@ -241,7 +225,6 @@ namespace OpenRA
|
|||||||
public ServerSettings Server = new ServerSettings();
|
public ServerSettings Server = new ServerSettings();
|
||||||
public DebugSettings Debug = new DebugSettings();
|
public DebugSettings Debug = new DebugSettings();
|
||||||
public KeySettings Keys = new KeySettings();
|
public KeySettings Keys = new KeySettings();
|
||||||
public IrcSettings Irc = new IrcSettings();
|
|
||||||
|
|
||||||
public Dictionary<string, object> Sections;
|
public Dictionary<string, object> Sections;
|
||||||
|
|
||||||
@@ -257,7 +240,6 @@ namespace OpenRA
|
|||||||
{ "Server", Server },
|
{ "Server", Server },
|
||||||
{ "Debug", Debug },
|
{ "Debug", Debug },
|
||||||
{ "Keys", Keys },
|
{ "Keys", Keys },
|
||||||
{ "Irc", Irc }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Override fieldloader to ignore invalid entries
|
// Override fieldloader to ignore invalid entries
|
||||||
|
|||||||
@@ -1,27 +0,0 @@
|
|||||||
#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;
|
|
||||||
using OpenRA.Primitives;
|
|
||||||
|
|
||||||
namespace OpenRA.Irc
|
|
||||||
{
|
|
||||||
public class Channel
|
|
||||||
{
|
|
||||||
public readonly string Name;
|
|
||||||
public readonly ObservableSortedDictionary<string, User> Users = new ObservableSortedDictionary<string, User>(StringComparer.OrdinalIgnoreCase);
|
|
||||||
public Topic Topic = new Topic();
|
|
||||||
|
|
||||||
public Channel(string name)
|
|
||||||
{
|
|
||||||
Name = name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,400 +0,0 @@
|
|||||||
#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;
|
|
||||||
using System.IO;
|
|
||||||
using System.Net.Sockets;
|
|
||||||
using System.Threading;
|
|
||||||
using OpenRA.Primitives;
|
|
||||||
|
|
||||||
namespace OpenRA.Irc
|
|
||||||
{
|
|
||||||
public sealed class IrcClient : IDisposable
|
|
||||||
{
|
|
||||||
public static readonly IrcClient Instance = new IrcClient();
|
|
||||||
|
|
||||||
public static string MainChannel { get { return '#' + Game.Settings.Irc.Channel; } }
|
|
||||||
|
|
||||||
public static void AddHistory(string line)
|
|
||||||
{
|
|
||||||
Instance.History.Add("{0} {1}".F(DateTime.Now.ToString(Game.Settings.Irc.TimestampFormat), line));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void AddMessage(string nickname, string message)
|
|
||||||
{
|
|
||||||
AddHistory("{0}: {1}".F(nickname, message));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void AddNotice(string nickname, string message)
|
|
||||||
{
|
|
||||||
AddHistory("-{0}- {1}".F(nickname, message));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void AddSelfNotice(string nickname, string message)
|
|
||||||
{
|
|
||||||
AddHistory("-> -{0}- {1}".F(nickname, message));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void AddAction(string nickname, string message)
|
|
||||||
{
|
|
||||||
AddHistory("* {0} {1}".F(nickname, message));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void InstanceInitialize()
|
|
||||||
{
|
|
||||||
var s = Game.Settings.Irc;
|
|
||||||
|
|
||||||
Instance.OnPublicMessage += l =>
|
|
||||||
{
|
|
||||||
var action = IrcUtils.FromAction(l.Message);
|
|
||||||
if (action != null)
|
|
||||||
AddAction(l.Prefix.Nickname, action);
|
|
||||||
else
|
|
||||||
AddMessage(l.Prefix.Nickname, l.Message);
|
|
||||||
};
|
|
||||||
Instance.OnPrivateMessage += l =>
|
|
||||||
{
|
|
||||||
var ctcp = IrcUtils.FromCtcp(l.Message);
|
|
||||||
if (ctcp == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
var split = ctcp.Split(new[] { ' ' }, 2);
|
|
||||||
var command = split[0];
|
|
||||||
if (command.EqualsIC("VERSION"))
|
|
||||||
{
|
|
||||||
var mod = Game.modData.Manifest.Mod;
|
|
||||||
Instance.CtcpRespond(l.Prefix.Nickname, command, "{0}: {1}".F(mod.Title, mod.Version));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
Instance.OnPrivateNotice += l =>
|
|
||||||
{
|
|
||||||
if (l.Target == "*") // Drop pre-register notices
|
|
||||||
return;
|
|
||||||
AddNotice(l.Prefix.Nickname, l.Message);
|
|
||||||
};
|
|
||||||
Instance.OnRegister += l =>
|
|
||||||
{
|
|
||||||
Instance.Join(MainChannel);
|
|
||||||
Game.Settings.Irc.Nickname = Instance.LocalUser.Nickname;
|
|
||||||
Game.Settings.Save();
|
|
||||||
};
|
|
||||||
Instance.OnConnecting += () => AddHistory("Connecting");
|
|
||||||
Instance.OnConnect += () => AddHistory("Connected");
|
|
||||||
Instance.OnPart += l => AddHistory("{0} left{1}".F(l.Prefix.Nickname, l.Message != null ? ": " + l.Message : ""));
|
|
||||||
Instance.OnJoin += l => AddHistory("{0} joined".F(l.Prefix.Nickname));
|
|
||||||
Instance.OnQuit += l => AddHistory("{0} quit{1}".F(l.Prefix.Nickname, l.Message != null ? ": " + l.Message : ""));
|
|
||||||
Instance.OnKick += l => AddHistory("{0} kicked {1}{2}".F(l.Prefix.Nickname, l.KickeeNickname, l.Message != null ? ": " + l.Message : ""));
|
|
||||||
Instance.OnNicknameSet += l =>
|
|
||||||
{
|
|
||||||
AddHistory("{0} set their nickname to {1}".F(l.Prefix.Nickname, l.NewNickname));
|
|
||||||
if (l.NewNickname == Instance.LocalUser.Nickname)
|
|
||||||
{
|
|
||||||
Instance.Nickname = l.NewNickname;
|
|
||||||
Game.Settings.Irc.Nickname = l.NewNickname;
|
|
||||||
Game.Settings.Save();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
Instance.OnTopicSet += l => AddHistory("{0} set the topic to {1}".F(l.Prefix.Nickname, l.Message));
|
|
||||||
Instance.OnNumeric += l =>
|
|
||||||
{
|
|
||||||
if (l.Numeric == NumericCommand.RPL_TOPIC)
|
|
||||||
{
|
|
||||||
var topic = Instance.GetChannel(MainChannel).Topic;
|
|
||||||
AddHistory("Topic is {0}".F(topic.Message));
|
|
||||||
}
|
|
||||||
else if (l.Numeric == NumericCommand.RPL_TOPICWHOTIME)
|
|
||||||
{
|
|
||||||
var topic = Instance.GetChannel(MainChannel).Topic;
|
|
||||||
AddHistory("Topic set by {0} at {1}".F(topic.Author.Nickname, topic.Time.ToLocalTime()));
|
|
||||||
}
|
|
||||||
else if (l.Numeric == NumericCommand.RPL_NOTOPIC)
|
|
||||||
AddHistory("No topic is set");
|
|
||||||
else if (l.Numeric == NumericCommand.ERR_NICKNAMEINUSE)
|
|
||||||
AddHistory("Nickname {0} is already in use".F(l.AltTarget));
|
|
||||||
else if (l.Numeric == NumericCommand.ERR_ERRONEUSNICKNAME)
|
|
||||||
AddHistory("Nickname {0} is erroneus".F(l.AltTarget));
|
|
||||||
};
|
|
||||||
Instance.OnDisconnect += () =>
|
|
||||||
{
|
|
||||||
if (Instance.ConnectionFailure != null)
|
|
||||||
{
|
|
||||||
AddHistory("Disconnected: {0}".F(Instance.ConnectionFailure.Message));
|
|
||||||
if (s.ReconnectDelay >= 0)
|
|
||||||
{
|
|
||||||
AddHistory("Reconnecting in {0} seconds".F(s.ReconnectDelay / 1000));
|
|
||||||
Instance.ConnectionState = IrcConnectionState.Reconnecting;
|
|
||||||
Game.RunAfterDelay(s.ReconnectDelay, () =>
|
|
||||||
{
|
|
||||||
if (Instance.IsReconnecting)
|
|
||||||
Instance.Connect(Instance.Hostname, Instance.Port, Instance.ConnectionTimeout, Instance.Nickname, Instance.Username, Instance.Realname);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
AddHistory("Disconnected");
|
|
||||||
};
|
|
||||||
Instance.OnLineRead += l =>
|
|
||||||
{
|
|
||||||
if (s.Debug)
|
|
||||||
AddHistory(l.RawString);
|
|
||||||
};
|
|
||||||
Game.OnQuit += Instance.Disconnect;
|
|
||||||
}
|
|
||||||
|
|
||||||
static IrcClient()
|
|
||||||
{
|
|
||||||
Log.AddChannel("irc", "irc.log");
|
|
||||||
InstanceInitialize();
|
|
||||||
}
|
|
||||||
|
|
||||||
public readonly ObservableCollection<string> History = new ObservableCollection<string>();
|
|
||||||
|
|
||||||
IrcConnection connection;
|
|
||||||
Thread thread;
|
|
||||||
public IrcConnectionState ConnectionState { get; private set; }
|
|
||||||
public IrcClientUser LocalUser { get; private set; }
|
|
||||||
public Exception ConnectionFailure { get; private set; }
|
|
||||||
|
|
||||||
public string Hostname { get; private set; }
|
|
||||||
public int Port { get; private set; }
|
|
||||||
public int ConnectionTimeout { get; private set; }
|
|
||||||
public string Nickname { get; private set; }
|
|
||||||
public string Username { get; private set; }
|
|
||||||
public string Realname { get; private set; }
|
|
||||||
|
|
||||||
public bool IsConnected
|
|
||||||
{
|
|
||||||
get { return ConnectionState == IrcConnectionState.Connected; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool IsReconnecting
|
|
||||||
{
|
|
||||||
get { return ConnectionState == IrcConnectionState.Reconnecting; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public IrcClient()
|
|
||||||
{
|
|
||||||
ConnectionState = IrcConnectionState.Disconnected;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Connect(string hostname, int port, int connectionTimeout, string nickname, string username, string realname)
|
|
||||||
{
|
|
||||||
ConnectionFailure = null;
|
|
||||||
if (IsConnected)
|
|
||||||
Disconnect();
|
|
||||||
|
|
||||||
Hostname = hostname;
|
|
||||||
Port = port;
|
|
||||||
ConnectionTimeout = connectionTimeout;
|
|
||||||
Nickname = nickname;
|
|
||||||
Username = username;
|
|
||||||
Realname = realname;
|
|
||||||
|
|
||||||
thread = new Thread(() =>
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
ConnectionState = IrcConnectionState.Connecting;
|
|
||||||
LocalUser = new IrcClientUser(this);
|
|
||||||
connection = new IrcConnection();
|
|
||||||
OnConnecting();
|
|
||||||
connection.Connect(hostname, port, connectionTimeout);
|
|
||||||
ConnectionState = IrcConnectionState.Connected;
|
|
||||||
OnConnect();
|
|
||||||
SetNickname(nickname);
|
|
||||||
SetUser(username, realname);
|
|
||||||
ProcessLines();
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Log.Write("irc", e.ToString());
|
|
||||||
if (e is SocketException || e is IOException)
|
|
||||||
ConnectionFailure = e;
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
Disconnect();
|
|
||||||
}
|
|
||||||
}) { IsBackground = true };
|
|
||||||
thread.Start();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void WriteLine(string format, params object[] args)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
connection.WriteLine(format, args);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Log.Write("irc", e.ToString());
|
|
||||||
if (e is SocketException || e is IOException)
|
|
||||||
ConnectionFailure = e;
|
|
||||||
Disconnect();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Disconnect()
|
|
||||||
{
|
|
||||||
if (!IsConnected || IsReconnecting)
|
|
||||||
{
|
|
||||||
ConnectionState = IrcConnectionState.Disconnected;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ConnectionState = IrcConnectionState.Disconnecting;
|
|
||||||
OnDisconnecting();
|
|
||||||
if (connection != null)
|
|
||||||
connection.Close();
|
|
||||||
ConnectionState = IrcConnectionState.Disconnected;
|
|
||||||
OnDisconnect();
|
|
||||||
LocalUser = null;
|
|
||||||
connection = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
Disconnect();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ProcessLines()
|
|
||||||
{
|
|
||||||
string line;
|
|
||||||
while (IsConnected && (line = connection.ReadLine()) != null)
|
|
||||||
ProcessLine(line);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ProcessLine(string line)
|
|
||||||
{
|
|
||||||
if (string.IsNullOrEmpty(line))
|
|
||||||
return;
|
|
||||||
|
|
||||||
var l = new Line(this, line);
|
|
||||||
OnLineRead(l);
|
|
||||||
|
|
||||||
int numeric;
|
|
||||||
if (Exts.TryParseIntegerInvariant(l.Command, out numeric))
|
|
||||||
{
|
|
||||||
var nl = new NumericLine(l, numeric);
|
|
||||||
LocalUser.OnNumeric(nl);
|
|
||||||
OnNumeric(nl);
|
|
||||||
switch (nl.Numeric)
|
|
||||||
{
|
|
||||||
case NumericCommand.RPL_WELCOME:
|
|
||||||
OnRegister(nl);
|
|
||||||
break;
|
|
||||||
case NumericCommand.RPL_ENDOFNAMES:
|
|
||||||
OnSync(nl);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
switch (l.Command)
|
|
||||||
{
|
|
||||||
case "PING":
|
|
||||||
Pong(l.Message);
|
|
||||||
OnPing(l);
|
|
||||||
break;
|
|
||||||
case "PRIVMSG":
|
|
||||||
if (IrcUtils.IsChannel(l.Target))
|
|
||||||
OnPublicMessage(l);
|
|
||||||
else
|
|
||||||
OnPrivateMessage(l);
|
|
||||||
break;
|
|
||||||
case "NOTICE":
|
|
||||||
if (IrcUtils.IsChannel(l.Target))
|
|
||||||
OnPublicNotice(l);
|
|
||||||
else
|
|
||||||
OnPrivateNotice(l);
|
|
||||||
break;
|
|
||||||
case "JOIN":
|
|
||||||
var jl = new JoinLine(l);
|
|
||||||
LocalUser.OnJoin(jl);
|
|
||||||
OnJoin(jl);
|
|
||||||
break;
|
|
||||||
case "PART":
|
|
||||||
LocalUser.OnPart(l);
|
|
||||||
OnPart(l);
|
|
||||||
break;
|
|
||||||
case "NICK":
|
|
||||||
var nsl = new NicknameSetLine(l);
|
|
||||||
LocalUser.OnNicknameSet(nsl);
|
|
||||||
OnNicknameSet(nsl);
|
|
||||||
break;
|
|
||||||
case "QUIT":
|
|
||||||
OnQuit(l);
|
|
||||||
LocalUser.OnQuit(l);
|
|
||||||
break;
|
|
||||||
case "KICK":
|
|
||||||
var kl = new KickLine(l);
|
|
||||||
LocalUser.OnKick(kl);
|
|
||||||
OnKick(kl);
|
|
||||||
break;
|
|
||||||
case "TOPIC":
|
|
||||||
LocalUser.OnTopicSet(l);
|
|
||||||
OnTopicSet(l);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public event Action<NumericLine> OnRegister = l => { };
|
|
||||||
public event Action<NumericLine> OnSync = l => { };
|
|
||||||
public event Action<Line> OnLineRead = _ => { };
|
|
||||||
public event Action OnConnect = () => { };
|
|
||||||
public event Action OnConnecting = () => { };
|
|
||||||
public event Action OnDisconnect = () => { };
|
|
||||||
public event Action OnDisconnecting = () => { };
|
|
||||||
public event Action<Line> OnPublicMessage = _ => { };
|
|
||||||
public event Action<Line> OnPublicNotice = _ => { };
|
|
||||||
public event Action<Line> OnPrivateMessage = _ => { };
|
|
||||||
public event Action<Line> OnPrivateNotice = _ => { };
|
|
||||||
public event Action<JoinLine> OnJoin = _ => { };
|
|
||||||
public event Action<Line> OnPart = _ => { };
|
|
||||||
public event Action<NicknameSetLine> OnNicknameSet = _ => { };
|
|
||||||
public event Action<Line> OnQuit = _ => { };
|
|
||||||
public event Action<Line> OnPing = _ => { };
|
|
||||||
public event Action<NumericLine> OnNumeric = _ => { };
|
|
||||||
public event Action<KickLine> OnKick = _ => { };
|
|
||||||
public event Action<Line> OnTopicSet = _ => { };
|
|
||||||
|
|
||||||
public void SetNickname(string nickname) { WriteLine("NICK {0}", nickname); }
|
|
||||||
public void SetUser(string username, string realname) { WriteLine("USER {0} 0 * :{1}", username, realname); }
|
|
||||||
public void Join(string channel) { WriteLine("JOIN {0}", channel); }
|
|
||||||
public void Part(string channel) { WriteLine("PART {0}", channel); }
|
|
||||||
public void Message(string target, string message) { WriteLine("PRIVMSG {0} :{1}", target, message); }
|
|
||||||
public void Notice(string target, string message) { WriteLine("NOTICE {0} :{1}", target, message); }
|
|
||||||
public void Pong(string reply) { WriteLine("PONG :{0}", reply); }
|
|
||||||
public void CtcpRequest(string target, string command, string request) { Message(target, IrcUtils.ToCtcp("{0} {1}".F(command, request))); }
|
|
||||||
public void CtcpRespond(string target, string command, string response) { Notice(target, IrcUtils.ToCtcp("{0} {1}".F(command, response))); }
|
|
||||||
public void Act(string target, string message) { Message(target, IrcUtils.ToAction(message)); }
|
|
||||||
public void GetTopic(string channel) { WriteLine("TOPIC {0}", channel); }
|
|
||||||
public void Quit(string message) { WriteLine("QUIT :{0}", message); }
|
|
||||||
|
|
||||||
public Channel GetChannel(string channel)
|
|
||||||
{
|
|
||||||
if (!IsConnected)
|
|
||||||
return null;
|
|
||||||
Channel c;
|
|
||||||
LocalUser.Channels.TryGetValue(channel, out c);
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public enum IrcConnectionState
|
|
||||||
{
|
|
||||||
Disconnected,
|
|
||||||
Connected,
|
|
||||||
Disconnecting,
|
|
||||||
Connecting,
|
|
||||||
Reconnecting
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,112 +0,0 @@
|
|||||||
#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;
|
|
||||||
using System.Linq;
|
|
||||||
using OpenRA.Primitives;
|
|
||||||
|
|
||||||
namespace OpenRA.Irc
|
|
||||||
{
|
|
||||||
public class IrcClientUser : User
|
|
||||||
{
|
|
||||||
public readonly ObservableDictionary<string, Channel> Channels = new ObservableDictionary<string, Channel>(StringComparer.OrdinalIgnoreCase);
|
|
||||||
public readonly IrcClient Client;
|
|
||||||
|
|
||||||
public IrcClientUser(IrcClient client)
|
|
||||||
{
|
|
||||||
Client = client;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnNumeric(NumericLine line)
|
|
||||||
{
|
|
||||||
switch (line.Numeric)
|
|
||||||
{
|
|
||||||
case NumericCommand.RPL_WELCOME:
|
|
||||||
new User(line.Message.Substring(line.Message.LastIndexOf(' ') + 1)).CopyTo(this);
|
|
||||||
break;
|
|
||||||
case NumericCommand.RPL_NAMREPLY:
|
|
||||||
{
|
|
||||||
var channel = line.GetChannel();
|
|
||||||
var nicknames = line.Message.Replace("~", "").Replace("&", "").Replace("@", "").Replace("%", "").Replace("+", "").Split(' ');
|
|
||||||
|
|
||||||
foreach (var nickname in nicknames.Where(n => !channel.Users.ContainsKey(n)))
|
|
||||||
channel.Users.Add(nickname, new User { Nickname = nickname });
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case NumericCommand.RPL_TOPIC:
|
|
||||||
line.GetChannel().Topic.Message = line.Message;
|
|
||||||
break;
|
|
||||||
case NumericCommand.RPL_TOPICWHOTIME:
|
|
||||||
{
|
|
||||||
var topic = line.GetChannel().Topic;
|
|
||||||
topic.Author = new User(line[4]);
|
|
||||||
topic.Time = IrcUtils.DateTimeFromUnixTime(Exts.ParseIntegerInvariant(line[5]));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case NumericCommand.ERR_NICKNAMEINUSE:
|
|
||||||
if (line.Target == "*") // no nickname set yet
|
|
||||||
Client.SetNickname(Client.Nickname + new Random().Next(10000, 99999));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnJoin(Line line)
|
|
||||||
{
|
|
||||||
if (line.PrefixIsSelf())
|
|
||||||
Channels.Add(line.Target, new Channel(line.Target));
|
|
||||||
|
|
||||||
line.GetChannel().Users.Add(line.Prefix.Nickname, new User(line.Prefix));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnPart(Line line)
|
|
||||||
{
|
|
||||||
line.GetChannel().Users.Remove(line.Prefix.Nickname);
|
|
||||||
|
|
||||||
if (line.PrefixIsSelf())
|
|
||||||
Channels.Remove(line.Target);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnNicknameSet(NicknameSetLine line)
|
|
||||||
{
|
|
||||||
if (line.PrefixIsSelf())
|
|
||||||
Nickname = line.NewNickname;
|
|
||||||
|
|
||||||
foreach (var channel in Channels.Values.Where(c => c.Users.ContainsKey(line.Prefix.Nickname)))
|
|
||||||
{
|
|
||||||
var user = channel.Users[line.Prefix.Nickname];
|
|
||||||
channel.Users.Remove(line.Prefix.Nickname);
|
|
||||||
user.Nickname = line.NewNickname;
|
|
||||||
channel.Users.Add(line.NewNickname, user);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnQuit(Line line)
|
|
||||||
{
|
|
||||||
foreach (var channel in Channels)
|
|
||||||
channel.Value.Users.Remove(line.Prefix.Nickname);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnKick(KickLine line)
|
|
||||||
{
|
|
||||||
line.GetChannel().Users.Remove(line.KickeeNickname);
|
|
||||||
|
|
||||||
if (line.KickeeNickname.EqualsIC(Nickname))
|
|
||||||
Channels.Remove(line.Target);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnTopicSet(Line line)
|
|
||||||
{
|
|
||||||
var topic = line.GetChannel().Topic;
|
|
||||||
topic.Message = line.Message;
|
|
||||||
topic.Author = line.Prefix;
|
|
||||||
topic.Time = DateTime.UtcNow;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
#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;
|
|
||||||
using System.IO;
|
|
||||||
using System.Net.Sockets;
|
|
||||||
|
|
||||||
namespace OpenRA.Irc
|
|
||||||
{
|
|
||||||
public sealed class IrcConnection : IDisposable
|
|
||||||
{
|
|
||||||
TcpClient socket;
|
|
||||||
Stream stream;
|
|
||||||
StreamWriter writer;
|
|
||||||
StreamReader reader;
|
|
||||||
bool disposed;
|
|
||||||
|
|
||||||
public void Connect(string hostname, int port, int connectionTimeout)
|
|
||||||
{
|
|
||||||
CheckDisposed();
|
|
||||||
if (socket != null && socket.Connected)
|
|
||||||
throw new InvalidOperationException("Socket already connected");
|
|
||||||
|
|
||||||
socket = new TcpClient(hostname, port);
|
|
||||||
socket.ReceiveTimeout = socket.SendTimeout = connectionTimeout;
|
|
||||||
stream = socket.GetStream();
|
|
||||||
writer = new StreamWriter(stream) { AutoFlush = true };
|
|
||||||
reader = new StreamReader(stream);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void WriteLine(string format, params object[] args)
|
|
||||||
{
|
|
||||||
CheckDisposed();
|
|
||||||
writer.WriteLine(format, args);
|
|
||||||
}
|
|
||||||
|
|
||||||
public string ReadLine()
|
|
||||||
{
|
|
||||||
CheckDisposed();
|
|
||||||
return reader.ReadLine();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Close()
|
|
||||||
{
|
|
||||||
if (disposed)
|
|
||||||
return;
|
|
||||||
disposed = true;
|
|
||||||
if (socket != null) socket.Close();
|
|
||||||
if (stream != null) stream.Close();
|
|
||||||
if (writer != null) writer.Close();
|
|
||||||
if (reader != null) reader.Close();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
Close();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CheckDisposed()
|
|
||||||
{
|
|
||||||
if (disposed)
|
|
||||||
throw new ObjectDisposedException(GetType().FullName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
#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;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace OpenRA.Irc
|
|
||||||
{
|
|
||||||
public static class IrcUtils
|
|
||||||
{
|
|
||||||
public static bool IsChannel(string s)
|
|
||||||
{
|
|
||||||
return !string.IsNullOrEmpty(s) && s[0] == '#';
|
|
||||||
}
|
|
||||||
|
|
||||||
public static bool IsNickname(string s)
|
|
||||||
{
|
|
||||||
return !string.IsNullOrEmpty(s) && (char.IsLetter(s[0]) || NicknameSpecialChars.Contains(s[0]))
|
|
||||||
&& s.Substring(1).All(c => char.IsLetterOrDigit(c) || NicknameSpecialChars.Contains(c) || c == '-');
|
|
||||||
}
|
|
||||||
|
|
||||||
const string NicknameSpecialChars = @"[]\`_^{|}";
|
|
||||||
|
|
||||||
public static DateTime DateTimeFromUnixTime(int seconds)
|
|
||||||
{
|
|
||||||
return new DateTime(1970, 1, 1).AddSeconds(seconds);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static bool EqualsIC(this string a, string b)
|
|
||||||
{
|
|
||||||
return a.Equals(b, StringComparison.OrdinalIgnoreCase);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static string FromCtcp(string message)
|
|
||||||
{
|
|
||||||
if (message.Length < 2 || !message.StartsWith("\x0001") || !message.EndsWith("\x0001"))
|
|
||||||
return null;
|
|
||||||
|
|
||||||
return message.Substring(1, message.Length - 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static string ToCtcp(string message)
|
|
||||||
{
|
|
||||||
return "\x0001{0}\x0001".F(message);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static string FromAction(string message)
|
|
||||||
{
|
|
||||||
if (!message.StartsWith("\x0001ACTION ") || !message.EndsWith("\x0001"))
|
|
||||||
return null;
|
|
||||||
|
|
||||||
return message.Substring(8, message.Length - 8 - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static string ToAction(string message)
|
|
||||||
{
|
|
||||||
return "\x0001ACTION {0}\x0001".F(message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,155 +0,0 @@
|
|||||||
#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.Linq;
|
|
||||||
|
|
||||||
namespace OpenRA.Irc
|
|
||||||
{
|
|
||||||
public class Line
|
|
||||||
{
|
|
||||||
public readonly IrcClient Client;
|
|
||||||
public readonly string RawString;
|
|
||||||
public readonly string[] RawStringParts;
|
|
||||||
public readonly User Prefix;
|
|
||||||
public readonly string Command;
|
|
||||||
public string Target { get; protected set; }
|
|
||||||
public string Message { get; protected set; }
|
|
||||||
|
|
||||||
public Line(Line line)
|
|
||||||
{
|
|
||||||
Client = line.Client;
|
|
||||||
RawString = line.RawString;
|
|
||||||
RawStringParts = line.RawStringParts;
|
|
||||||
Prefix = line.Prefix;
|
|
||||||
Command = line.Command;
|
|
||||||
Target = line.Target;
|
|
||||||
Message = line.Message;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Line(IrcClient client, string line)
|
|
||||||
{
|
|
||||||
RawString = line;
|
|
||||||
RawStringParts = line.Split(' ');
|
|
||||||
Client = client;
|
|
||||||
|
|
||||||
if (line[0] == ':')
|
|
||||||
{
|
|
||||||
line = line.Substring(1);
|
|
||||||
var prefixDelim = line.Split(new[] { ' ' }, 2);
|
|
||||||
Prefix = new User(prefixDelim[0]);
|
|
||||||
|
|
||||||
if (prefixDelim.Length > 1)
|
|
||||||
{
|
|
||||||
var messageDelim = prefixDelim[1].Split(new[] { ':' }, 2);
|
|
||||||
|
|
||||||
var args = messageDelim[0].Trim().Split(' ');
|
|
||||||
|
|
||||||
Command = args[0];
|
|
||||||
if (args.Length > 1)
|
|
||||||
Target = args[1];
|
|
||||||
|
|
||||||
if (messageDelim.Length > 1)
|
|
||||||
Message = messageDelim[1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var messageDelim = line.Split(new[] { ':' }, 2);
|
|
||||||
|
|
||||||
var args = messageDelim[0].Trim().Split(' ');
|
|
||||||
|
|
||||||
Command = args[0];
|
|
||||||
if (args.Length > 1)
|
|
||||||
Target = args[1];
|
|
||||||
|
|
||||||
if (messageDelim.Length > 1)
|
|
||||||
Message = messageDelim[1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual Channel GetChannel()
|
|
||||||
{
|
|
||||||
return Client.GetChannel(Target);
|
|
||||||
}
|
|
||||||
|
|
||||||
public string this[int index]
|
|
||||||
{
|
|
||||||
get { return RawStringParts[index]; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool PrefixIsSelf()
|
|
||||||
{
|
|
||||||
return Client.LocalUser != null && Prefix.Nickname.EqualsIC(Client.LocalUser.Nickname);
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool TargetIsSelf()
|
|
||||||
{
|
|
||||||
return Target != null && Target.EqualsIC(Client.LocalUser.Nickname);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class NicknameSetLine : Line
|
|
||||||
{
|
|
||||||
public readonly string NewNickname;
|
|
||||||
|
|
||||||
public NicknameSetLine(Line line)
|
|
||||||
: base(line)
|
|
||||||
{
|
|
||||||
NewNickname = Message;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class NumericLine : Line
|
|
||||||
{
|
|
||||||
public readonly NumericCommand Numeric;
|
|
||||||
public readonly string AltTarget;
|
|
||||||
|
|
||||||
public override Channel GetChannel()
|
|
||||||
{
|
|
||||||
if (IrcUtils.IsChannel(AltTarget))
|
|
||||||
return Client.GetChannel(AltTarget);
|
|
||||||
return Client.GetChannel(Target);
|
|
||||||
}
|
|
||||||
|
|
||||||
public NumericLine(Line line, int numeric)
|
|
||||||
: base(line)
|
|
||||||
{
|
|
||||||
if (!IrcUtils.IsChannel(Target))
|
|
||||||
{
|
|
||||||
var numericParts = line.RawStringParts.Skip(1).TakeWhile(p => !p.StartsWith(":"));
|
|
||||||
AltTarget = numericParts.LastOrDefault(IrcUtils.IsChannel);
|
|
||||||
if (AltTarget == null)
|
|
||||||
AltTarget = numericParts.LastOrDefault();
|
|
||||||
}
|
|
||||||
Numeric = (NumericCommand)numeric;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class JoinLine : Line // for compatibility with certain IRCds
|
|
||||||
{
|
|
||||||
public JoinLine(Line line)
|
|
||||||
: base(line)
|
|
||||||
{
|
|
||||||
if (Message != null) // don't overwrite the target if it was already set properly by the IRCd
|
|
||||||
Target = Message;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class KickLine : Line
|
|
||||||
{
|
|
||||||
public readonly string KickeeNickname;
|
|
||||||
|
|
||||||
public KickLine(Line line)
|
|
||||||
: base(line)
|
|
||||||
{
|
|
||||||
KickeeNickname = this[3];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
#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
|
|
||||||
|
|
||||||
namespace OpenRA.Irc
|
|
||||||
{
|
|
||||||
public enum NumericCommand
|
|
||||||
{
|
|
||||||
Undefined = 0,
|
|
||||||
RPL_WELCOME = 001,
|
|
||||||
RPL_NOTOPIC = 331,
|
|
||||||
RPL_TOPIC = 332,
|
|
||||||
RPL_TOPICWHOTIME = 333,
|
|
||||||
RPL_NAMREPLY = 353,
|
|
||||||
RPL_ENDOFNAMES = 366,
|
|
||||||
ERR_ERRONEUSNICKNAME = 432,
|
|
||||||
ERR_NICKNAMEINUSE = 433
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
|
||||||
<PropertyGroup>
|
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
|
||||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
|
||||||
<ProjectGuid>{85B48234-8B31-4BE6-AF9C-665CC6866841}</ProjectGuid>
|
|
||||||
<OutputType>Library</OutputType>
|
|
||||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
|
||||||
<RootNamespace>OpenRA.Irc</RootNamespace>
|
|
||||||
<AssemblyName>OpenRA.Irc</AssemblyName>
|
|
||||||
<FileAlignment>512</FileAlignment>
|
|
||||||
<TargetFrameworkProfile>
|
|
||||||
</TargetFrameworkProfile>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
|
|
||||||
<DebugSymbols>true</DebugSymbols>
|
|
||||||
<DebugType>full</DebugType>
|
|
||||||
<OutputPath>..\</OutputPath>
|
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
|
||||||
<PlatformTarget>x86</PlatformTarget>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
|
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Compile Include="Channel.cs" />
|
|
||||||
<Compile Include="IrcClient.cs" />
|
|
||||||
<Compile Include="IrcClientUser.cs" />
|
|
||||||
<Compile Include="IrcConnection.cs" />
|
|
||||||
<Compile Include="IrcUtils.cs" />
|
|
||||||
<Compile Include="Line.cs" />
|
|
||||||
<Compile Include="NumericCommand.cs" />
|
|
||||||
<Compile Include="Topic.cs" />
|
|
||||||
<Compile Include="User.cs" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Folder Include="Properties\" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\OpenRA.Game\OpenRA.Game.csproj">
|
|
||||||
<Project>{0DFB103F-2962-400F-8C6D-E2C28CCBA633}</Project>
|
|
||||||
<Name>OpenRA.Game</Name>
|
|
||||||
<Private>False</Private>
|
|
||||||
</ProjectReference>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Reference Include="System" />
|
|
||||||
<Reference Include="System.Drawing" />
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
|
||||||
Other similar extension points exist, see Microsoft.Common.targets.
|
|
||||||
<Target Name="BeforeBuild">
|
|
||||||
</Target>
|
|
||||||
<Target Name="AfterBuild">
|
|
||||||
</Target>
|
|
||||||
-->
|
|
||||||
</Project>
|
|
||||||
@@ -1,344 +0,0 @@
|
|||||||
<StyleCopSettings Version="105">
|
|
||||||
<Analyzers>
|
|
||||||
<Analyzer AnalyzerId="StyleCop.CSharp.DocumentationRules">
|
|
||||||
<Rules>
|
|
||||||
<Rule Name="ElementsMustBeDocumented">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="PartialElementsMustBeDocumented">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="EnumerationItemsMustBeDocumented">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="DocumentationMustContainValidXml">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="ElementDocumentationMustHaveSummary">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="PartialElementDocumentationMustHaveSummary">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="ElementDocumentationMustHaveSummaryText">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="PartialElementDocumentationMustHaveSummaryText">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="ElementDocumentationMustNotHaveDefaultSummary">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="ElementParametersMustBeDocumented">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="ElementParameterDocumentationMustMatchElementParameters">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="ElementParameterDocumentationMustDeclareParameterName">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="ElementParameterDocumentationMustHaveText">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="ElementReturnValueMustBeDocumented">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="ElementReturnValueDocumentationMustHaveText">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="VoidReturnValueMustNotBeDocumented">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="GenericTypeParametersMustBeDocumented">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="GenericTypeParametersMustBeDocumentedPartialClass">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="GenericTypeParameterDocumentationMustMatchTypeParameters">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="GenericTypeParameterDocumentationMustDeclareParameterName">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="GenericTypeParameterDocumentationMustHaveText">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="PropertySummaryDocumentationMustMatchAccessors">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="PropertySummaryDocumentationMustOmitSetAccessorWithRestrictedAccess">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="ElementDocumentationMustNotBeCopiedAndPasted">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="SingleLineCommentsMustNotUseDocumentationStyleSlashes">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="DocumentationTextMustNotBeEmpty">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="DocumentationTextMustContainWhitespace">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="DocumentationMustMeetCharacterPercentage">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="ConstructorSummaryDocumentationMustBeginWithStandardText">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="DestructorSummaryDocumentationMustBeginWithStandardText">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="DocumentationHeadersMustNotContainBlankLines">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="IncludedDocumentationXPathDoesNotExist">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="IncludeNodeDoesNotContainValidFileAndPath">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="InheritDocMustBeUsedWithInheritingClass">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="ElementDocumentationMustBeSpelledCorrectly">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="FileMustHaveHeader">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="FileHeaderMustShowCopyright">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="FileHeaderMustHaveCopyrightText">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="FileHeaderMustContainFileName">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="FileHeaderFileNameDocumentationMustMatchFileName">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="FileHeaderMustHaveValidCompanyText">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="FileHeaderFileNameDocumentationMustMatchTypeName">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
</Rules>
|
|
||||||
<AnalyzerSettings />
|
|
||||||
</Analyzer>
|
|
||||||
<Analyzer AnalyzerId="StyleCop.CSharp.SpacingRules">
|
|
||||||
<Rules>
|
|
||||||
<Rule Name="TabsMustNotBeUsed">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
</Rules>
|
|
||||||
<AnalyzerSettings />
|
|
||||||
</Analyzer>
|
|
||||||
<Analyzer AnalyzerId="StyleCop.CSharp.LayoutRules">
|
|
||||||
<Rules>
|
|
||||||
<Rule Name="CurlyBracketsForMultiLineStatementsMustNotShareLine">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="StatementMustNotBeOnSingleLine">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="ElementMustNotBeOnSingleLine">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="CurlyBracketsMustNotBeOmitted">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="ElementsMustBeSeparatedByBlankLine">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
</Rules>
|
|
||||||
<AnalyzerSettings />
|
|
||||||
</Analyzer>
|
|
||||||
<Analyzer AnalyzerId="StyleCop.CSharp.OrderingRules">
|
|
||||||
<Rules>
|
|
||||||
<Rule Name="UsingDirectivesMustBePlacedWithinNamespace">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="ElementsMustAppearInTheCorrectOrder">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="ElementsMustBeOrderedByAccess">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
</Rules>
|
|
||||||
<AnalyzerSettings />
|
|
||||||
</Analyzer>
|
|
||||||
<Analyzer AnalyzerId="StyleCop.CSharp.ReadabilityRules">
|
|
||||||
<Rules>
|
|
||||||
<Rule Name="CodeMustNotContainMultipleStatementsOnOneLine">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="UseStringEmptyForEmptyStrings">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="PrefixLocalCallsWithThis">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="PrefixCallsCorrectly">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="ParametersMustBeOnSameLineOrSeparateLines">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="ParameterMustFollowComma">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="SplitParametersMustStartOnLineAfterDeclaration">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
</Rules>
|
|
||||||
<AnalyzerSettings />
|
|
||||||
</Analyzer>
|
|
||||||
<Analyzer AnalyzerId="StyleCop.CSharp.MaintainabilityRules">
|
|
||||||
<Rules>
|
|
||||||
<Rule Name="AccessModifierMustBeDeclared">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="FieldsMustBePrivate">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="FileMayOnlyContainASingleClass">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
<Rule Name="ArithmeticExpressionsMustDeclarePrecedence">
|
|
||||||
<RuleSettings>
|
|
||||||
<BooleanProperty Name="Enabled">False</BooleanProperty>
|
|
||||||
</RuleSettings>
|
|
||||||
</Rule>
|
|
||||||
</Rules>
|
|
||||||
<AnalyzerSettings />
|
|
||||||
</Analyzer>
|
|
||||||
</Analyzers>
|
|
||||||
</StyleCopSettings>
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
#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;
|
|
||||||
|
|
||||||
namespace OpenRA.Irc
|
|
||||||
{
|
|
||||||
public class Topic
|
|
||||||
{
|
|
||||||
public string Message;
|
|
||||||
public User Author;
|
|
||||||
public DateTime Time;
|
|
||||||
|
|
||||||
public Topic() { }
|
|
||||||
|
|
||||||
public Topic(string message, User author, DateTime time)
|
|
||||||
{
|
|
||||||
Message = message;
|
|
||||||
Author = author;
|
|
||||||
Time = time;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
#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;
|
|
||||||
|
|
||||||
namespace OpenRA.Irc
|
|
||||||
{
|
|
||||||
public class User
|
|
||||||
{
|
|
||||||
public string Nickname;
|
|
||||||
public string Username;
|
|
||||||
public string Hostname;
|
|
||||||
|
|
||||||
public User() { }
|
|
||||||
|
|
||||||
public User(User user)
|
|
||||||
{
|
|
||||||
Nickname = user.Nickname;
|
|
||||||
Username = user.Username;
|
|
||||||
Hostname = user.Hostname;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void CopyTo(User user)
|
|
||||||
{
|
|
||||||
user.Nickname = Nickname;
|
|
||||||
user.Username = Username;
|
|
||||||
user.Hostname = Hostname;
|
|
||||||
}
|
|
||||||
|
|
||||||
public User(string prefix)
|
|
||||||
{
|
|
||||||
if (string.IsNullOrEmpty(prefix))
|
|
||||||
throw new ArgumentException("prefix");
|
|
||||||
|
|
||||||
var ex = prefix.IndexOf('!');
|
|
||||||
var at = prefix.IndexOf('@');
|
|
||||||
|
|
||||||
if (ex >= 0 && at >= 0 && at < ex)
|
|
||||||
throw new ArgumentException("Bogus input string: @ before !");
|
|
||||||
|
|
||||||
if (ex >= 0)
|
|
||||||
{
|
|
||||||
Nickname = prefix.Substring(0, ex);
|
|
||||||
if (at >= 0)
|
|
||||||
{
|
|
||||||
Username = prefix.Substring(ex + 1, at - ex - 1);
|
|
||||||
Hostname = prefix.Substring(at + 1);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
Username = prefix.Substring(ex + 1);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
Nickname = prefix;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override string ToString()
|
|
||||||
{
|
|
||||||
var ret = "" + Nickname;
|
|
||||||
if (Username != null)
|
|
||||||
ret += "!" + Username;
|
|
||||||
if (Hostname != null)
|
|
||||||
ret += "@" + Hostname;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -53,14 +53,6 @@
|
|||||||
<HintPath>..\thirdparty\FuzzyLogicLibrary.dll</HintPath>
|
<HintPath>..\thirdparty\FuzzyLogicLibrary.dll</HintPath>
|
||||||
<Private>False</Private>
|
<Private>False</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="KopiLua">
|
|
||||||
<HintPath>..\thirdparty\KopiLua.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="NLua">
|
|
||||||
<HintPath>..\thirdparty\NLua.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Core" />
|
<Reference Include="System.Core" />
|
||||||
<Reference Include="System.Drawing" />
|
<Reference Include="System.Drawing" />
|
||||||
@@ -324,10 +316,7 @@
|
|||||||
<Compile Include="RepairsUnits.cs" />
|
<Compile Include="RepairsUnits.cs" />
|
||||||
<Compile Include="Reservable.cs" />
|
<Compile Include="Reservable.cs" />
|
||||||
<Compile Include="ScaredyCat.cs" />
|
<Compile Include="ScaredyCat.cs" />
|
||||||
<Compile Include="Scripting\LuaScriptEvents.cs" />
|
|
||||||
<Compile Include="Scripting\LuaScriptInterface.cs" />
|
|
||||||
<Compile Include="Scripting\Media.cs" />
|
<Compile Include="Scripting\Media.cs" />
|
||||||
<Compile Include="Scripting\LuaScriptContext.cs" />
|
|
||||||
<Compile Include="SeedsResource.cs" />
|
<Compile Include="SeedsResource.cs" />
|
||||||
<Compile Include="SelfHealing.cs" />
|
<Compile Include="SelfHealing.cs" />
|
||||||
<Compile Include="Sellable.cs" />
|
<Compile Include="Sellable.cs" />
|
||||||
@@ -368,7 +357,6 @@
|
|||||||
<Compile Include="Widgets\Logic\Ingame\GameInfoObjectivesLogic.cs" />
|
<Compile Include="Widgets\Logic\Ingame\GameInfoObjectivesLogic.cs" />
|
||||||
<Compile Include="Widgets\Logic\Ingame\GameInfoStatsLogic.cs" />
|
<Compile Include="Widgets\Logic\Ingame\GameInfoStatsLogic.cs" />
|
||||||
<Compile Include="Widgets\Logic\Ingame\LeaveMapLogic.cs" />
|
<Compile Include="Widgets\Logic\Ingame\LeaveMapLogic.cs" />
|
||||||
<Compile Include="Widgets\Logic\IrcLogic.cs" />
|
|
||||||
<Compile Include="Widgets\Logic\KickClientLogic.cs" />
|
<Compile Include="Widgets\Logic\KickClientLogic.cs" />
|
||||||
<Compile Include="Widgets\Logic\ConnectionLogic.cs" />
|
<Compile Include="Widgets\Logic\ConnectionLogic.cs" />
|
||||||
<Compile Include="Widgets\Logic\DiplomacyLogic.cs" />
|
<Compile Include="Widgets\Logic\DiplomacyLogic.cs" />
|
||||||
@@ -542,11 +530,6 @@
|
|||||||
<Name>OpenRA.Game</Name>
|
<Name>OpenRA.Game</Name>
|
||||||
<Private>False</Private>
|
<Private>False</Private>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
<ProjectReference Include="..\OpenRA.Irc\OpenRA.Irc.csproj">
|
|
||||||
<Project>{85B48234-8B31-4BE6-AF9C-665CC6866841}</Project>
|
|
||||||
<Name>OpenRA.Irc</Name>
|
|
||||||
<Private>False</Private>
|
|
||||||
</ProjectReference>
|
|
||||||
<ProjectReference Include="..\OpenRA.Mods.Common\OpenRA.Mods.Common.csproj">
|
<ProjectReference Include="..\OpenRA.Mods.Common\OpenRA.Mods.Common.csproj">
|
||||||
<Project>{fe6c8cc0-2f07-442a-b29f-17617b3b7fc6}</Project>
|
<Project>{fe6c8cc0-2f07-442a-b29f-17617b3b7fc6}</Project>
|
||||||
<Name>OpenRA.Mods.Common</Name>
|
<Name>OpenRA.Mods.Common</Name>
|
||||||
|
|||||||
@@ -1,142 +0,0 @@
|
|||||||
#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;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Reflection;
|
|
||||||
using NLua;
|
|
||||||
using NLua.Event;
|
|
||||||
using OpenRA.Primitives;
|
|
||||||
|
|
||||||
namespace OpenRA.Mods.RA.Scripting
|
|
||||||
{
|
|
||||||
[Desc("Part of the legacy Lua API.")]
|
|
||||||
public sealed class LuaScriptContext : IDisposable
|
|
||||||
{
|
|
||||||
public Lua Lua { get; private set; }
|
|
||||||
readonly Cache<string, LuaFunction> functionCache;
|
|
||||||
|
|
||||||
public LuaScriptContext()
|
|
||||||
{
|
|
||||||
Log.AddChannel("lua", "lua.log");
|
|
||||||
Log.Write("lua", "Creating Lua script context");
|
|
||||||
Lua = new Lua();
|
|
||||||
Lua.HookException += OnLuaException;
|
|
||||||
functionCache = new Cache<string, LuaFunction>(Lua.GetFunction);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void RegisterObject(object target, string tableName, bool exposeAllMethods)
|
|
||||||
{
|
|
||||||
Log.Write("lua", "Registering object {0}", target);
|
|
||||||
|
|
||||||
if (tableName != null && Lua.GetTable(tableName) == null)
|
|
||||||
Lua.NewTable(tableName);
|
|
||||||
|
|
||||||
var type = target.GetType();
|
|
||||||
|
|
||||||
var methods = type.GetMethods(BindingFlags.Public | BindingFlags.Instance);
|
|
||||||
RegisterMethods(tableName, target, methods, exposeAllMethods);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void RegisterType(Type type, string tableName, bool exposeAllMethods)
|
|
||||||
{
|
|
||||||
Log.Write("lua", "Registering type {0}", type);
|
|
||||||
|
|
||||||
if (tableName != null && Lua.GetTable(tableName) == null)
|
|
||||||
Lua.NewTable(tableName);
|
|
||||||
|
|
||||||
var methods = type.GetMethods(BindingFlags.Public | BindingFlags.Static);
|
|
||||||
RegisterMethods(tableName, null, methods, exposeAllMethods);
|
|
||||||
}
|
|
||||||
|
|
||||||
void RegisterMethods(string tableName, object target, IEnumerable<MethodInfo> methods, bool allMethods)
|
|
||||||
{
|
|
||||||
foreach (var method in methods)
|
|
||||||
{
|
|
||||||
string methodName;
|
|
||||||
|
|
||||||
var attr = method.GetCustomAttributes<LuaGlobalAttribute>(true).FirstOrDefault();
|
|
||||||
if (attr == null)
|
|
||||||
{
|
|
||||||
if (allMethods)
|
|
||||||
methodName = method.Name;
|
|
||||||
else
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
methodName = attr.Name ?? method.Name;
|
|
||||||
|
|
||||||
var methodTarget = method.IsStatic ? null : target;
|
|
||||||
|
|
||||||
if (tableName != null)
|
|
||||||
Lua.RegisterFunction(tableName + "." + methodName, methodTarget, method);
|
|
||||||
else
|
|
||||||
Lua.RegisterFunction(methodName, methodTarget, method);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void OnLuaException(object sender, HookExceptionEventArgs e)
|
|
||||||
{
|
|
||||||
ShowException(e.Exception);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ShowException(Exception e)
|
|
||||||
{
|
|
||||||
ShowErrorMessage(e.Message, e.ToString());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void ShowErrorMessage(string shortMessage, string longMessage)
|
|
||||||
{
|
|
||||||
Game.Debug("{0}", shortMessage);
|
|
||||||
Game.Debug("See lua.log for details");
|
|
||||||
Log.Write("lua", "{0}", longMessage ?? shortMessage);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void LoadLuaScripts(Func<string, string> getFileContents, params string[] files)
|
|
||||||
{
|
|
||||||
foreach (var file in files)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Log.Write("lua", "Loading Lua script {0}", file);
|
|
||||||
var content = getFileContents(file);
|
|
||||||
Lua.DoString(content, file);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
ShowException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public object[] InvokeLuaFunction(string name, params object[] args)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var function = functionCache[name];
|
|
||||||
if (function == null)
|
|
||||||
return null;
|
|
||||||
return function.Call(args);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
ShowException(e);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
if (Lua != null)
|
|
||||||
Lua.Dispose();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
#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;
|
|
||||||
using OpenRA.Traits;
|
|
||||||
|
|
||||||
namespace OpenRA.Mods.RA.Scripting
|
|
||||||
{
|
|
||||||
[Desc("Part of the legacy Lua API.")]
|
|
||||||
public class LuaScriptEventsInfo : TraitInfo<LuaScriptEvents> { }
|
|
||||||
|
|
||||||
public class LuaScriptEvents : INotifyKilled, INotifyAddedToWorld, INotifyRemovedFromWorld,
|
|
||||||
INotifyCapture, INotifyDamage, INotifyIdle, INotifyProduction
|
|
||||||
{
|
|
||||||
public event Action<Actor, AttackInfo> OnKilled = (self, e) => { };
|
|
||||||
public event Action<Actor> OnAddedToWorld = self => { };
|
|
||||||
public event Action<Actor> OnRemovedFromWorld = self => { };
|
|
||||||
public event Action<Actor, Actor, Player, Player> OnCaptured = (self, captor, oldOwner, newOwner) => { };
|
|
||||||
public event Action<Actor, AttackInfo> OnDamaged = (self, e) => { };
|
|
||||||
public event Action<Actor> OnIdle = self => { };
|
|
||||||
public event Action<Actor, Actor, CPos> OnProduced = (self, other, exit) => { };
|
|
||||||
|
|
||||||
public void Killed(Actor self, AttackInfo e)
|
|
||||||
{
|
|
||||||
OnKilled(self, e);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AddedToWorld(Actor self)
|
|
||||||
{
|
|
||||||
OnAddedToWorld(self);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void RemovedFromWorld(Actor self)
|
|
||||||
{
|
|
||||||
OnRemovedFromWorld(self);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner)
|
|
||||||
{
|
|
||||||
OnCaptured(self, captor, oldOwner, newOwner);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Damaged(Actor self, AttackInfo e)
|
|
||||||
{
|
|
||||||
OnDamaged(self, e);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void TickIdle(Actor self)
|
|
||||||
{
|
|
||||||
OnIdle(self);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void UnitProduced(Actor self, Actor other, CPos exit)
|
|
||||||
{
|
|
||||||
OnProduced(self, other, exit);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,470 +0,0 @@
|
|||||||
#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;
|
|
||||||
using System.Collections;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using NLua;
|
|
||||||
using OpenRA.Effects;
|
|
||||||
using OpenRA.FileSystem;
|
|
||||||
using OpenRA.Mods.RA.Activities;
|
|
||||||
using OpenRA.Mods.RA.Air;
|
|
||||||
using OpenRA.Network;
|
|
||||||
using OpenRA.Scripting;
|
|
||||||
using OpenRA.Support;
|
|
||||||
using OpenRA.Traits;
|
|
||||||
using WorldRenderer = OpenRA.Graphics.WorldRenderer;
|
|
||||||
|
|
||||||
namespace OpenRA.Mods.RA.Scripting
|
|
||||||
{
|
|
||||||
[Desc("Part of the legacy Lua API.")]
|
|
||||||
public class LuaScriptInterfaceInfo : ITraitInfo, Requires<SpawnMapActorsInfo>
|
|
||||||
{
|
|
||||||
public readonly string[] LuaScripts = { };
|
|
||||||
|
|
||||||
public object Create(ActorInitializer init) { return new LuaScriptInterface(this); }
|
|
||||||
}
|
|
||||||
|
|
||||||
public sealed class LuaScriptInterface : IWorldLoaded, ITick, IDisposable
|
|
||||||
{
|
|
||||||
World world;
|
|
||||||
SpawnMapActors sma;
|
|
||||||
readonly LuaScriptContext context = new LuaScriptContext();
|
|
||||||
readonly LuaScriptInterfaceInfo info;
|
|
||||||
|
|
||||||
public LuaScriptInterface(LuaScriptInterfaceInfo info)
|
|
||||||
{
|
|
||||||
this.info = info;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void WorldLoaded(World w, WorldRenderer wr)
|
|
||||||
{
|
|
||||||
world = w;
|
|
||||||
sma = world.WorldActor.Trait<SpawnMapActors>();
|
|
||||||
|
|
||||||
context.Lua["World"] = w;
|
|
||||||
context.Lua["WorldRenderer"] = wr;
|
|
||||||
context.RegisterObject(this, "Internal", false);
|
|
||||||
context.RegisterType(typeof(WVec), "WVec", true);
|
|
||||||
context.RegisterType(typeof(CVec), "CVec", true);
|
|
||||||
context.RegisterType(typeof(WPos), "WPos", true);
|
|
||||||
context.RegisterType(typeof(CPos), "CPos", true);
|
|
||||||
context.RegisterType(typeof(WRot), "WRot", true);
|
|
||||||
context.RegisterType(typeof(WAngle), "WAngle", true);
|
|
||||||
context.RegisterType(typeof(WRange), "WRange", true);
|
|
||||||
context.RegisterType(typeof(int2), "int2", true);
|
|
||||||
context.RegisterType(typeof(float2), "float2", true);
|
|
||||||
|
|
||||||
context.LoadLuaScripts(f => GlobalFileSystem.Open(f).ReadAllText(), Game.modData.Manifest.LuaScripts);
|
|
||||||
|
|
||||||
AddMapActorGlobals();
|
|
||||||
|
|
||||||
context.LoadLuaScripts(f => w.Map.Container.GetContent(f).ReadAllText(), info.LuaScripts);
|
|
||||||
|
|
||||||
context.InvokeLuaFunction("WorldLoaded");
|
|
||||||
}
|
|
||||||
|
|
||||||
void AddMapActorGlobals()
|
|
||||||
{
|
|
||||||
foreach (var kv in sma.Actors)
|
|
||||||
{
|
|
||||||
if (context.Lua[kv.Key] != null)
|
|
||||||
context.ShowErrorMessage("{0}: The global name '{1}' is reserved and may not be used by map actor {2}".F(GetType().Name, kv.Key, kv.Value), null);
|
|
||||||
else
|
|
||||||
context.Lua[kv.Key] = kv.Value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Tick(Actor self)
|
|
||||||
{
|
|
||||||
using (new PerfSample("tick_lua"))
|
|
||||||
context.InvokeLuaFunction("Tick");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
context.Dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public object New(string typeName, LuaTable args)
|
|
||||||
{
|
|
||||||
var type = Game.modData.ObjectCreator.FindType(typeName);
|
|
||||||
if (type == null)
|
|
||||||
throw new InvalidOperationException("Cannot locate type: {0}".F(typeName));
|
|
||||||
if (args == null)
|
|
||||||
return Activator.CreateInstance(type);
|
|
||||||
var argsArray = ConvertArgs(args);
|
|
||||||
return Activator.CreateInstance(type, argsArray);
|
|
||||||
}
|
|
||||||
|
|
||||||
static object[] ConvertArgs(LuaTable args)
|
|
||||||
{
|
|
||||||
var argsArray = new object[args.Keys.Count];
|
|
||||||
for (var i = 1; i <= args.Keys.Count; i++)
|
|
||||||
{
|
|
||||||
var arg = args[i] as LuaTable;
|
|
||||||
if (arg != null && arg[1] != null && arg[2] != null)
|
|
||||||
argsArray[i - 1] = Convert.ChangeType(arg[1], Enum<TypeCode>.Parse(arg[2].ToString()));
|
|
||||||
else
|
|
||||||
argsArray[i - 1] = args[i];
|
|
||||||
}
|
|
||||||
return argsArray;
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public void Debug(object obj)
|
|
||||||
{
|
|
||||||
if (obj != null)
|
|
||||||
Game.Debug(obj.ToString());
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public object TraitOrDefault(Actor actor, string className)
|
|
||||||
{
|
|
||||||
var type = Game.modData.ObjectCreator.FindType(className);
|
|
||||||
if (type == null)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
var method = typeof(Actor).GetMethod("TraitOrDefault");
|
|
||||||
var genericMethod = method.MakeGenericMethod(type);
|
|
||||||
return genericMethod.Invoke(actor, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public object Trait(Actor actor, string className)
|
|
||||||
{
|
|
||||||
var ret = TraitOrDefault(actor, className);
|
|
||||||
if (ret == null)
|
|
||||||
throw new InvalidOperationException("Actor {0} does not have trait of type {1}".F(actor, className));
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public bool HasTrait(Actor actor, string className)
|
|
||||||
{
|
|
||||||
var ret = TraitOrDefault(actor, className);
|
|
||||||
return ret != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public object[] ActorsWithTrait(string className)
|
|
||||||
{
|
|
||||||
var type = Game.modData.ObjectCreator.FindType(className);
|
|
||||||
if (type == null)
|
|
||||||
throw new InvalidOperationException("Cannot locate type: {0}".F(className));
|
|
||||||
|
|
||||||
var method = typeof(World).GetMethod("ActorsWithTrait");
|
|
||||||
var genericMethod = method.MakeGenericMethod(type);
|
|
||||||
var result = ((IEnumerable)genericMethod.Invoke(world, null)).Cast<object>().ToArray();
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public object TraitInfoOrDefault(string actorType, string className)
|
|
||||||
{
|
|
||||||
var type = Game.modData.ObjectCreator.FindType(className);
|
|
||||||
if (type == null || !world.Map.Rules.Actors.ContainsKey(actorType))
|
|
||||||
return null;
|
|
||||||
|
|
||||||
return world.Map.Rules.Actors[actorType].Traits.GetOrDefault(type);
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public object TraitInfo(string actorType, string className)
|
|
||||||
{
|
|
||||||
var ret = TraitInfoOrDefault(actorType, className);
|
|
||||||
if (ret == null)
|
|
||||||
throw new InvalidOperationException("Actor type {0} does not have trait info of type {1}".F(actorType, className));
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public bool HasTraitInfo(string actorType, string className)
|
|
||||||
{
|
|
||||||
var ret = TraitInfoOrDefault(actorType, className);
|
|
||||||
return ret != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public void RunAfterDelay(double delay, Action func)
|
|
||||||
{
|
|
||||||
world.AddFrameEndTask(w => w.Add(new DelayedAction((int)delay, func)));
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public void PlaySpeechNotification(Player player, string notification)
|
|
||||||
{
|
|
||||||
Sound.PlayNotification(world.Map.Rules, player, "Speech", notification, player != null ? player.Country.Race : null);
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public void PlaySoundNotification(Player player, string notification)
|
|
||||||
{
|
|
||||||
Sound.PlayNotification(world.Map.Rules, player, "Sounds", notification, player != null ? player.Country.Race : null);
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public void WaitFor(Actor actor, Func<bool> func)
|
|
||||||
{
|
|
||||||
actor.QueueActivity(new WaitFor(func));
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public void CallFunc(Actor actor, Action func)
|
|
||||||
{
|
|
||||||
actor.QueueActivity(new CallFunc(func));
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public int GetFacing(object vec, double currentFacing)
|
|
||||||
{
|
|
||||||
if (vec is CVec)
|
|
||||||
return world.Map.FacingBetween(CPos.Zero, CPos.Zero + (CVec)vec, (int)currentFacing);
|
|
||||||
if (vec is WVec)
|
|
||||||
return Util.GetFacing((WVec)vec, (int)currentFacing);
|
|
||||||
throw new ArgumentException("Unsupported vector type: {0}".F(vec.GetType()));
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public WRange GetWRangeFromCells(double cells)
|
|
||||||
{
|
|
||||||
return WRange.FromCells((int)cells);
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public void SetWinState(Player player, string winState)
|
|
||||||
{
|
|
||||||
player.WinState = Enum<WinState>.Parse(winState);
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public void PlayRandomMusic()
|
|
||||||
{
|
|
||||||
if (!Game.Settings.Sound.MapMusic || !world.Map.Rules.InstalledMusic.Any())
|
|
||||||
return;
|
|
||||||
Game.ConnectionStateChanged += StopMusic;
|
|
||||||
PlayMusic();
|
|
||||||
}
|
|
||||||
|
|
||||||
void PlayMusic()
|
|
||||||
{
|
|
||||||
var track = world.Map.Rules.InstalledMusic.Random(Game.CosmeticRandom);
|
|
||||||
Sound.PlayMusicThen(track.Value, PlayMusic);
|
|
||||||
}
|
|
||||||
|
|
||||||
void StopMusic(OrderManager orderManager)
|
|
||||||
{
|
|
||||||
if (!orderManager.GameStarted)
|
|
||||||
{
|
|
||||||
Sound.StopMusic();
|
|
||||||
Game.ConnectionStateChanged -= StopMusic;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public bool IsDead(Actor actor)
|
|
||||||
{
|
|
||||||
return actor.IsDead();
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public void PlayMovieFullscreen(string movie, Action onComplete)
|
|
||||||
{
|
|
||||||
Media.PlayFMVFullscreen(world, movie, onComplete);
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public void FlyToPos(Actor actor, WPos pos)
|
|
||||||
{
|
|
||||||
actor.QueueActivity(new Fly(actor, Target.FromPos(pos)));
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public void FlyAttackActor(Actor actor, Actor targetActor)
|
|
||||||
{
|
|
||||||
actor.QueueActivity(new FlyAttack(Target.FromActor(targetActor)));
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public void FlyAttackCell(Actor actor, CPos location)
|
|
||||||
{
|
|
||||||
actor.QueueActivity(new FlyAttack(Target.FromCell(actor.World, location)));
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public void HeliFlyToPos(Actor actor, WPos pos)
|
|
||||||
{
|
|
||||||
actor.QueueActivity(new HeliFly(actor, Target.FromPos(pos)));
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public void SetUnitStance(Actor actor, string stance)
|
|
||||||
{
|
|
||||||
var at = actor.TraitOrDefault<AutoTarget>();
|
|
||||||
if (at != null)
|
|
||||||
at.Stance = Enum<UnitStance>.Parse(stance);
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public bool RequiredUnitsAreDestroyed(Player player)
|
|
||||||
{
|
|
||||||
return player.HasNoRequiredUnits();
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public void AttackMove(Actor actor, CPos location, double nearEnough)
|
|
||||||
{
|
|
||||||
if (actor.HasTrait<AttackMove>())
|
|
||||||
actor.QueueActivity(new AttackMove.AttackMoveActivity(actor, new Move.Move(actor, location, (int)nearEnough)));
|
|
||||||
else
|
|
||||||
actor.QueueActivity(new Move.Move(actor, location, (int)nearEnough));
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public int GetRandomInteger(double low, double high)
|
|
||||||
{
|
|
||||||
return world.SharedRandom.Next((int)low, (int)high);
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public CPos GetRandomCell()
|
|
||||||
{
|
|
||||||
return world.Map.ChooseRandomCell(world.SharedRandom);
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public CPos GetRandomEdgeCell()
|
|
||||||
{
|
|
||||||
return world.Map.ChooseRandomEdgeCell(world.SharedRandom);
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public Actor GetNamedActor(string actorName)
|
|
||||||
{
|
|
||||||
return sma.Actors[actorName];
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public bool IsNamedActor(Actor actor)
|
|
||||||
{
|
|
||||||
return actor.ActorID <= sma.LastMapActorID && actor.ActorID > sma.LastMapActorID - sma.Actors.Count;
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public IEnumerable<Actor> GetNamedActors()
|
|
||||||
{
|
|
||||||
return sma.Actors.Values;
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public Actor[] FindActorsInBox(WPos topLeft, WPos bottomRight)
|
|
||||||
{
|
|
||||||
return world.ActorMap.ActorsInBox(topLeft, bottomRight).ToArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public Actor[] FindActorsInCircle(WPos location, WRange radius)
|
|
||||||
{
|
|
||||||
return world.FindActorsInCircle(location, radius).ToArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
ClassicProductionQueue GetSharedQueueForCategory(Player player, string category)
|
|
||||||
{
|
|
||||||
return world.ActorsWithTrait<ClassicProductionQueue>()
|
|
||||||
.Where(a => a.Actor.Owner == player && a.Trait.Info.Type == category)
|
|
||||||
.Select(a => a.Trait).FirstOrDefault();
|
|
||||||
}
|
|
||||||
|
|
||||||
ClassicProductionQueue GetSharedQueueForUnit(Player player, string unit)
|
|
||||||
{
|
|
||||||
var ri = world.Map.Rules.Actors[unit];
|
|
||||||
|
|
||||||
var bi = ri.Traits.GetOrDefault<BuildableInfo>();
|
|
||||||
if (bi == null)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
return bi.Queue.Select(q => GetSharedQueueForCategory(player, q)).FirstOrDefault();
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public void BuildWithSharedQueue(Player player, string unit, double amount)
|
|
||||||
{
|
|
||||||
var queue = GetSharedQueueForUnit(player, unit);
|
|
||||||
|
|
||||||
if (queue != null)
|
|
||||||
queue.ResolveOrder(queue.Actor, Order.StartProduction(queue.Actor, unit, (int)amount));
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public void BuildWithPerFactoryQueue(Actor factory, string unit, double amount)
|
|
||||||
{
|
|
||||||
var ri = world.Map.Rules.Actors[unit];
|
|
||||||
|
|
||||||
var bi = ri.Traits.GetOrDefault<BuildableInfo>();
|
|
||||||
if (bi == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
var queue = factory.TraitsImplementing<ProductionQueue>()
|
|
||||||
.FirstOrDefault(q => q.Enabled);
|
|
||||||
|
|
||||||
if (queue != null)
|
|
||||||
queue.ResolveOrder(factory, Order.StartProduction(factory, unit, (int)amount));
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public bool SharedQueueIsBusy(Player player, string category)
|
|
||||||
{
|
|
||||||
var queue = GetSharedQueueForCategory(player, category);
|
|
||||||
|
|
||||||
if (queue == null)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return queue.CurrentItem() != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public bool PerFactoryQueueIsBusy(Actor factory)
|
|
||||||
{
|
|
||||||
var queue = factory.TraitsImplementing<ProductionQueue>()
|
|
||||||
.FirstOrDefault(q => q.Enabled);
|
|
||||||
|
|
||||||
if (queue == null)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return queue.CurrentItem() != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public void Guard(Actor guard, Actor target)
|
|
||||||
{
|
|
||||||
if (target.HasTrait<Guardable>())
|
|
||||||
{
|
|
||||||
var gt = guard.TraitOrDefault<Guard>();
|
|
||||||
|
|
||||||
if (gt != null)
|
|
||||||
gt.GuardTarget(guard, Target.FromActor(target));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public IEnumerable<CPos> ExpandFootprint(LuaTable cells, bool allowDiagonal)
|
|
||||||
{
|
|
||||||
return Util.ExpandFootprint(cells.Values.Cast<CPos>(), allowDiagonal);
|
|
||||||
}
|
|
||||||
|
|
||||||
[LuaGlobal]
|
|
||||||
public WPos CenterOfCell(CPos position)
|
|
||||||
{
|
|
||||||
return world.Map.CenterOfCell(position);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,252 +0,0 @@
|
|||||||
#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;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using OpenRA.Irc;
|
|
||||||
using OpenRA.Widgets;
|
|
||||||
|
|
||||||
namespace OpenRA.Mods.RA.Widgets.Logic
|
|
||||||
{
|
|
||||||
class IrcLogic
|
|
||||||
{
|
|
||||||
TextFieldWidget inputBox;
|
|
||||||
TextFieldWidget nicknameBox;
|
|
||||||
Widget connectBG;
|
|
||||||
Widget ircContainer;
|
|
||||||
|
|
||||||
[ObjectCreator.UseCtor]
|
|
||||||
public IrcLogic(Widget widget)
|
|
||||||
{
|
|
||||||
var historyPanel = widget.Get<ScrollPanelWidget>("HISTORY_PANEL");
|
|
||||||
var historyTemplate = widget.Get<LabelWidget>("HISTORY_TEMPLATE");
|
|
||||||
var nicknamePanel = widget.Get<ScrollPanelWidget>("NICKNAME_PANEL");
|
|
||||||
var nicknameTemplate = widget.Get<LabelWidget>("NICKNAME_TEMPLATE");
|
|
||||||
|
|
||||||
inputBox = widget.Get<TextFieldWidget>("INPUT_BOX");
|
|
||||||
inputBox.OnEnterKey = EnterPressed;
|
|
||||||
inputBox.OnTabKey = TabPressed;
|
|
||||||
inputBox.IsDisabled = () => IrcClient.Instance.GetChannel(IrcClient.MainChannel) == null;
|
|
||||||
|
|
||||||
nicknameBox = widget.Get<TextFieldWidget>("NICKNAME_BOX");
|
|
||||||
nicknameBox.Text = ChooseNickname(Game.Settings.Irc.Nickname);
|
|
||||||
|
|
||||||
connectBG = widget.Get("IRC_CONNECT_BG");
|
|
||||||
ircContainer = widget.Get("IRC_CONTAINER");
|
|
||||||
|
|
||||||
widget.Get<ButtonWidget>("DISCONNECT_BUTTON").OnClick = IrcClient.Instance.Disconnect;
|
|
||||||
|
|
||||||
MaybeShowConnectPanel();
|
|
||||||
|
|
||||||
historyPanel.Bind(IrcClient.Instance.History, item => MakeLabelWidget(historyTemplate, item), LabelItemEquals, true);
|
|
||||||
|
|
||||||
var mainChannel = IrcClient.Instance.GetChannel(IrcClient.MainChannel);
|
|
||||||
if (mainChannel != null)
|
|
||||||
nicknamePanel.Bind(mainChannel.Users, item => MakeLabelWidget(nicknameTemplate, item), LabelItemEquals, false);
|
|
||||||
|
|
||||||
IrcClient.Instance.OnSync += l =>
|
|
||||||
{
|
|
||||||
var channel = l.GetChannel();
|
|
||||||
if (channel.Name.EqualsIC(IrcClient.MainChannel))
|
|
||||||
nicknamePanel.Bind(channel.Users, item => MakeLabelWidget(nicknameTemplate, item), LabelItemEquals, false);
|
|
||||||
};
|
|
||||||
IrcClient.Instance.OnKick += l =>
|
|
||||||
{
|
|
||||||
if (l.KickeeNickname.EqualsIC(IrcClient.Instance.LocalUser.Nickname) && l.Target.EqualsIC(IrcClient.MainChannel))
|
|
||||||
nicknamePanel.Unbind();
|
|
||||||
};
|
|
||||||
IrcClient.Instance.OnPart += l =>
|
|
||||||
{
|
|
||||||
if (l.PrefixIsSelf() && l.Target.EqualsIC(IrcClient.MainChannel))
|
|
||||||
nicknamePanel.Unbind();
|
|
||||||
};
|
|
||||||
IrcClient.Instance.OnDisconnect += () =>
|
|
||||||
{
|
|
||||||
nicknamePanel.Unbind();
|
|
||||||
MaybeShowConnectPanel();
|
|
||||||
};
|
|
||||||
|
|
||||||
commands.Add("me", args =>
|
|
||||||
{
|
|
||||||
IrcClient.Instance.Act(IrcClient.MainChannel, args);
|
|
||||||
IrcClient.AddAction(IrcClient.Instance.LocalUser.Nickname, args);
|
|
||||||
});
|
|
||||||
commands.Add("slap", args =>
|
|
||||||
{
|
|
||||||
IrcClient.Instance.Act(IrcClient.MainChannel, "slaps {0} around a bit with a large trout".F(args));
|
|
||||||
IrcClient.AddAction(IrcClient.Instance.LocalUser.Nickname, "slaps {0} around a bit with a large trout".F(args));
|
|
||||||
});
|
|
||||||
commands.Add("notice", args =>
|
|
||||||
{
|
|
||||||
var split = args.Split(new[] { ' ' }, 2);
|
|
||||||
if (split.Length < 2)
|
|
||||||
{
|
|
||||||
IrcClient.AddHistory("/notice: Not enough arguments");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
IrcClient.Instance.Notice(split[0], split[1]);
|
|
||||||
IrcClient.AddSelfNotice(split[0], split[1]);
|
|
||||||
});
|
|
||||||
commands.Add("disconnect", args =>
|
|
||||||
{
|
|
||||||
Game.Settings.Irc.ConnectAutomatically = false;
|
|
||||||
Game.Settings.Save();
|
|
||||||
IrcClient.Instance.Disconnect();
|
|
||||||
});
|
|
||||||
commands.Add("quit", args =>
|
|
||||||
{
|
|
||||||
Game.Settings.Irc.ConnectAutomatically = false;
|
|
||||||
Game.Settings.Save();
|
|
||||||
if (IrcClient.Instance.IsConnected)
|
|
||||||
IrcClient.Instance.Quit(args);
|
|
||||||
else
|
|
||||||
IrcClient.Instance.Disconnect();
|
|
||||||
});
|
|
||||||
commands.Add("nick", args => IrcClient.Instance.SetNickname(args));
|
|
||||||
commands.Add("topic", args => IrcClient.Instance.GetTopic(IrcClient.MainChannel));
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaybeShowConnectPanel()
|
|
||||||
{
|
|
||||||
if (IrcClient.Instance.IsConnected || IrcClient.Instance.IsReconnecting)
|
|
||||||
{
|
|
||||||
ircContainer.Visible = true;
|
|
||||||
connectBG.Visible = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Game.Settings.Irc.ConnectAutomatically)
|
|
||||||
{
|
|
||||||
ircContainer.Visible = true;
|
|
||||||
connectBG.Visible = false;
|
|
||||||
Connect();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ircContainer.Visible = false;
|
|
||||||
connectBG.Visible = true;
|
|
||||||
|
|
||||||
var connectAutomaticallyCheckBox = connectBG.Get<CheckboxWidget>("CONNECT_AUTOMATICALLY_CHECKBOX");
|
|
||||||
var connectAutomaticallyChecked = false;
|
|
||||||
connectAutomaticallyCheckBox.IsChecked = () => connectAutomaticallyChecked;
|
|
||||||
connectAutomaticallyCheckBox.OnClick = () => connectAutomaticallyChecked ^= true;
|
|
||||||
|
|
||||||
var connectButton = connectBG.Get<ButtonWidget>("CONNECT_BUTTON");
|
|
||||||
|
|
||||||
connectButton.OnClick = () =>
|
|
||||||
{
|
|
||||||
ircContainer.Visible = true;
|
|
||||||
connectBG.Visible = false;
|
|
||||||
|
|
||||||
Game.Settings.Irc.ConnectAutomatically = connectAutomaticallyCheckBox.IsChecked();
|
|
||||||
Game.Settings.Save();
|
|
||||||
Connect();
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
static string ChooseNickname(string nickname)
|
|
||||||
{
|
|
||||||
if (!IrcUtils.IsNickname(nickname))
|
|
||||||
{
|
|
||||||
nickname = Game.Settings.Player.Name;
|
|
||||||
if (!IrcUtils.IsNickname(nickname))
|
|
||||||
nickname = Game.Settings.Irc.DefaultNickname;
|
|
||||||
}
|
|
||||||
return nickname;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Connect()
|
|
||||||
{
|
|
||||||
var nickname = ChooseNickname(nicknameBox.Text);
|
|
||||||
var s = Game.Settings.Irc;
|
|
||||||
s.Nickname = nickname;
|
|
||||||
Game.Settings.Save();
|
|
||||||
IrcClient.Instance.Connect(s.Hostname, s.Port, s.ConnectionTimeout, nickname, s.Username ?? nickname, s.Realname ?? nickname);
|
|
||||||
}
|
|
||||||
|
|
||||||
static Widget MakeLabelWidget(LabelWidget template, object item)
|
|
||||||
{
|
|
||||||
var itemString = item.ToString();
|
|
||||||
var widget = (LabelWidget)template.Clone();
|
|
||||||
var font = Game.Renderer.Fonts[widget.Font];
|
|
||||||
itemString = WidgetUtils.WrapText(itemString, widget.Bounds.Width, font);
|
|
||||||
widget.Bounds.Height = font.Measure(itemString).Y;
|
|
||||||
widget.GetText = () => itemString;
|
|
||||||
return widget;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LabelItemEquals(Widget widget, object item)
|
|
||||||
{
|
|
||||||
return item != null && ((LabelWidget)widget).GetText() == item.ToString();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool EnterPressed()
|
|
||||||
{
|
|
||||||
if (!inputBox.Text.Any())
|
|
||||||
return true;
|
|
||||||
|
|
||||||
var text = inputBox.Text;
|
|
||||||
inputBox.Text = "";
|
|
||||||
|
|
||||||
if (text[0] == '/')
|
|
||||||
{
|
|
||||||
var parts = text.Split(new[] { ' ' }, 2);
|
|
||||||
var name = parts[0].Substring(1);
|
|
||||||
var args = parts.Length > 1 ? parts[1] : null;
|
|
||||||
|
|
||||||
Action<string> command;
|
|
||||||
if (!commands.TryGetValue(name, out command))
|
|
||||||
{
|
|
||||||
IrcClient.AddHistory("{0}: Unknown command".F(name));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
command(args);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
IrcClient.Instance.Message(IrcClient.MainChannel, text);
|
|
||||||
IrcClient.AddMessage(IrcClient.Instance.LocalUser.Nickname, text);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
Dictionary<string, Action<string>> commands = new Dictionary<string, Action<string>>(StringComparer.OrdinalIgnoreCase);
|
|
||||||
|
|
||||||
List<string> tabMatches = new List<string>();
|
|
||||||
int tabMatchesIndex = -1;
|
|
||||||
|
|
||||||
bool TabPressed()
|
|
||||||
{
|
|
||||||
if (!inputBox.Text.Any())
|
|
||||||
return true;
|
|
||||||
|
|
||||||
var channel = IrcClient.Instance.GetChannel(IrcClient.MainChannel);
|
|
||||||
|
|
||||||
if (channel == null)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
var spaceIndex = inputBox.Text.TrimEnd().LastIndexOf(' ');
|
|
||||||
var tabMatchtext = inputBox.Text.Substring(spaceIndex + 1);
|
|
||||||
|
|
||||||
if (tabMatchesIndex < 0 || !tabMatches.Any() || tabMatchtext != tabMatches[tabMatchesIndex])
|
|
||||||
tabMatches = channel.Users.Keys.Where(u => u.StartsWith(tabMatchtext, StringComparison.OrdinalIgnoreCase)).ToList();
|
|
||||||
|
|
||||||
if (!tabMatches.Any())
|
|
||||||
return true;
|
|
||||||
|
|
||||||
tabMatchesIndex = (tabMatchesIndex + 1) % tabMatches.Count;
|
|
||||||
inputBox.Text = inputBox.Text.Remove(spaceIndex + 1) + tabMatches[tabMatchesIndex];
|
|
||||||
inputBox.CursorPosition = inputBox.Text.Length;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -107,7 +107,6 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
|||||||
showIncompatibleCheckbox.OnClick = () => { showIncompatible ^= true; RefreshServerList(); };
|
showIncompatibleCheckbox.OnClick = () => { showIncompatible ^= true; RefreshServerList(); };
|
||||||
}
|
}
|
||||||
|
|
||||||
// Game.LoadWidget(null, "SERVERBROWSER_IRC", panel.Get("IRC_ROOT"), new WidgetArgs());
|
|
||||||
RefreshServerList();
|
RefreshServerList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,8 +21,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenRA.Mods.D2k", "OpenRA.M
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenRA.Mods.TS", "OpenRA.Mods.TS\OpenRA.Mods.TS.csproj", "{5457CBF5-4CE4-421E-A8BF-9FD6C9732E1D}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenRA.Mods.TS", "OpenRA.Mods.TS\OpenRA.Mods.TS.csproj", "{5457CBF5-4CE4-421E-A8BF-9FD6C9732E1D}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenRA.Irc", "OpenRA.Irc\OpenRA.Irc.csproj", "{85B48234-8B31-4BE6-AF9C-665CC6866841}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenRA.Renderer.Sdl2", "OpenRA.Renderer.Sdl2\OpenRA.Renderer.Sdl2.csproj", "{33D03738-C154-4028-8EA8-63A3C488A651}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenRA.Renderer.Sdl2", "OpenRA.Renderer.Sdl2\OpenRA.Renderer.Sdl2.csproj", "{33D03738-C154-4028-8EA8-63A3C488A651}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenRA.Mods.Common", "OpenRA.Mods.Common\OpenRA.Mods.Common.csproj", "{FE6C8CC0-2F07-442A-B29F-17617B3B7FC6}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenRA.Mods.Common", "OpenRA.Mods.Common\OpenRA.Mods.Common.csproj", "{FE6C8CC0-2F07-442A-B29F-17617B3B7FC6}"
|
||||||
@@ -47,7 +45,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tiberian Dawn Lua scripts",
|
|||||||
ProjectSection(SolutionItems) = preProject
|
ProjectSection(SolutionItems) = preProject
|
||||||
mods\cnc\maps\gdi01\gdi01.lua = mods\cnc\maps\gdi01\gdi01.lua
|
mods\cnc\maps\gdi01\gdi01.lua = mods\cnc\maps\gdi01\gdi01.lua
|
||||||
mods\cnc\maps\gdi02\gdi02.lua = mods\cnc\maps\gdi02\gdi02.lua
|
mods\cnc\maps\gdi02\gdi02.lua = mods\cnc\maps\gdi02\gdi02.lua
|
||||||
mods\cnc\maps\gdi03\gdi03.lua = mods\cnc\maps\gdi03\gdi03.lua
|
|
||||||
mods\cnc\maps\gdi04a\gdi04a.lua = mods\cnc\maps\gdi04a\gdi04a.lua
|
mods\cnc\maps\gdi04a\gdi04a.lua = mods\cnc\maps\gdi04a\gdi04a.lua
|
||||||
mods\cnc\maps\gdi04b\gdi04b.lua = mods\cnc\maps\gdi04b\gdi04b.lua
|
mods\cnc\maps\gdi04b\gdi04b.lua = mods\cnc\maps\gdi04b\gdi04b.lua
|
||||||
mods\cnc\maps\gdi04c\gdi04c.lua = mods\cnc\maps\gdi04c\gdi04c.lua
|
mods\cnc\maps\gdi04c\gdi04c.lua = mods\cnc\maps\gdi04c\gdi04c.lua
|
||||||
@@ -102,8 +99,6 @@ Global
|
|||||||
{C0B0465C-6BE2-409C-8770-3A9BF64C4344}.Debug|x86.Build.0 = Debug|x86
|
{C0B0465C-6BE2-409C-8770-3A9BF64C4344}.Debug|x86.Build.0 = Debug|x86
|
||||||
{5457CBF5-4CE4-421E-A8BF-9FD6C9732E1D}.Debug|x86.ActiveCfg = Debug|x86
|
{5457CBF5-4CE4-421E-A8BF-9FD6C9732E1D}.Debug|x86.ActiveCfg = Debug|x86
|
||||||
{5457CBF5-4CE4-421E-A8BF-9FD6C9732E1D}.Debug|x86.Build.0 = Debug|x86
|
{5457CBF5-4CE4-421E-A8BF-9FD6C9732E1D}.Debug|x86.Build.0 = Debug|x86
|
||||||
{85B48234-8B31-4BE6-AF9C-665CC6866841}.Debug|x86.ActiveCfg = Debug|x86
|
|
||||||
{85B48234-8B31-4BE6-AF9C-665CC6866841}.Debug|x86.Build.0 = Debug|x86
|
|
||||||
{33D03738-C154-4028-8EA8-63A3C488A651}.Debug|x86.ActiveCfg = Debug|x86
|
{33D03738-C154-4028-8EA8-63A3C488A651}.Debug|x86.ActiveCfg = Debug|x86
|
||||||
{33D03738-C154-4028-8EA8-63A3C488A651}.Debug|x86.Build.0 = Debug|x86
|
{33D03738-C154-4028-8EA8-63A3C488A651}.Debug|x86.Build.0 = Debug|x86
|
||||||
{47F1B0EE-EB35-47F2-93E4-273C70909157}.Debug|x86.ActiveCfg = Debug|x86
|
{47F1B0EE-EB35-47F2-93E4-273C70909157}.Debug|x86.ActiveCfg = Debug|x86
|
||||||
|
|||||||
@@ -1,70 +0,0 @@
|
|||||||
Container@SERVERBROWSER_IRC:
|
|
||||||
Logic: IrcLogic
|
|
||||||
Width: 700
|
|
||||||
Height: 250
|
|
||||||
Children:
|
|
||||||
Container@IRC_CONTAINER:
|
|
||||||
Width: PARENT_RIGHT
|
|
||||||
Height: PARENT_BOTTOM
|
|
||||||
Children:
|
|
||||||
ScrollPanel@HISTORY_PANEL:
|
|
||||||
Width: 565
|
|
||||||
Height: PARENT_BOTTOM - 30
|
|
||||||
ItemSpacing: 5
|
|
||||||
Label@HISTORY_TEMPLATE:
|
|
||||||
X: 5
|
|
||||||
Width: 530
|
|
||||||
Height: 25
|
|
||||||
WordWrap: True
|
|
||||||
TextField@INPUT_BOX:
|
|
||||||
Y: PARENT_BOTTOM - 25
|
|
||||||
Width: 565
|
|
||||||
Height: 25
|
|
||||||
ScrollPanel@NICKNAME_PANEL:
|
|
||||||
X: 570
|
|
||||||
Width: 130
|
|
||||||
Height: PARENT_BOTTOM - 30
|
|
||||||
Label@NICKNAME_TEMPLATE:
|
|
||||||
X: 5
|
|
||||||
Button@DISCONNECT_BUTTON:
|
|
||||||
X: 570
|
|
||||||
Y: PARENT_BOTTOM - 25
|
|
||||||
Width: 130
|
|
||||||
Height: 25
|
|
||||||
Text: Disconnect
|
|
||||||
Font: Bold
|
|
||||||
Background@IRC_CONNECT_BG:
|
|
||||||
Width: PARENT_RIGHT
|
|
||||||
Height: PARENT_BOTTOM
|
|
||||||
Background: scrollpanel-bg
|
|
||||||
Children:
|
|
||||||
Label@GLOBAL_CHAT_LABEL:
|
|
||||||
Y: PARENT_BOTTOM / 4
|
|
||||||
Width: PARENT_RIGHT
|
|
||||||
Align: Center
|
|
||||||
Text: Global Chat
|
|
||||||
Font: Bold
|
|
||||||
Label@NICKNAME_LABEL:
|
|
||||||
X: 200
|
|
||||||
Y: PARENT_BOTTOM / 4 + 35
|
|
||||||
Text: Nickname:
|
|
||||||
TextField@NICKNAME_BOX:
|
|
||||||
X: 270
|
|
||||||
Y: PARENT_BOTTOM / 4 + 25
|
|
||||||
Width: 150
|
|
||||||
Height: 25
|
|
||||||
Checkbox@CONNECT_AUTOMATICALLY_CHECKBOX:
|
|
||||||
X: 270
|
|
||||||
Y: PARENT_BOTTOM / 4 + 75
|
|
||||||
Height: 20
|
|
||||||
Width: 180
|
|
||||||
Font: Regular
|
|
||||||
Text: Connect Automatically
|
|
||||||
Button@CONNECT_BUTTON:
|
|
||||||
X: 430
|
|
||||||
Y: PARENT_BOTTOM / 4 + 25
|
|
||||||
Width: 100
|
|
||||||
Height: 25
|
|
||||||
Text: Connect
|
|
||||||
Font: Bold
|
|
||||||
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
MissionAccomplished = function()
|
|
||||||
Mission.MissionOver({ player }, nil, true)
|
|
||||||
Media.PlayMovieFullscreen("bombaway.vqa")
|
|
||||||
end
|
|
||||||
|
|
||||||
MissionFailed = function()
|
|
||||||
Mission.MissionOver(nil, { player }, true)
|
|
||||||
Media.PlayMovieFullscreen("gameover.vqa")
|
|
||||||
end
|
|
||||||
|
|
||||||
AttackPlayer = function()
|
|
||||||
if not Actor.IsDead(NodBarracks) then
|
|
||||||
Production.BuildWithPerFactoryQueue(NodBarracks, "e1", 5)
|
|
||||||
attackSquad = Team.New(Map.FindUnitsInCircle(enemy, NodBarracks, 3))
|
|
||||||
Team.Do(attackSquad, function(unit)
|
|
||||||
Actor.AttackMove(unit, waypoint9.location)
|
|
||||||
Actor.Hunt(unit)
|
|
||||||
end)
|
|
||||||
Team.AddEventHandler(attackSquad.OnAllKilled, OpenRA.RunAfterDelay(Utils.Seconds(15), AttackPlayer))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
WorldLoaded = function()
|
|
||||||
player = OpenRA.GetPlayer("GDI")
|
|
||||||
enemy = OpenRA.GetPlayer("Nod")
|
|
||||||
|
|
||||||
Media.PlayMovieFullscreen("samdie.vqa")
|
|
||||||
|
|
||||||
samSites = Team.New({ Sam1, Sam2, Sam3, Sam4 })
|
|
||||||
Team.AddEventHandler(samSites.OnAllKilled, function() Actor.Create("PowerProxy.AirSupport", { Owner = player }) end)
|
|
||||||
OpenRA.RunAfterDelay(Utils.Seconds(15), AttackPlayer)
|
|
||||||
end
|
|
||||||
|
|
||||||
Tick = function()
|
|
||||||
if Mission.RequiredUnitsAreDestroyed(player) then
|
|
||||||
MissionFailed()
|
|
||||||
end
|
|
||||||
if Mission.RequiredUnitsAreDestroyed(enemy) then
|
|
||||||
MissionAccomplished()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 50 KiB |
File diff suppressed because it is too large
Load Diff
@@ -103,7 +103,6 @@ ChromeLayout:
|
|||||||
./mods/cnc/chrome/credits.yaml
|
./mods/cnc/chrome/credits.yaml
|
||||||
./mods/cnc/chrome/dialogs.yaml
|
./mods/cnc/chrome/dialogs.yaml
|
||||||
./mods/cnc/chrome/tooltips.yaml
|
./mods/cnc/chrome/tooltips.yaml
|
||||||
./mods/cnc/chrome/irc.yaml
|
|
||||||
./mods/cnc/chrome/assetbrowser.yaml
|
./mods/cnc/chrome/assetbrowser.yaml
|
||||||
./mods/cnc/chrome/missionbrowser.yaml
|
./mods/cnc/chrome/missionbrowser.yaml
|
||||||
|
|
||||||
@@ -172,28 +171,28 @@ ChromeMetrics:
|
|||||||
|
|
||||||
Fonts:
|
Fonts:
|
||||||
Small:
|
Small:
|
||||||
Font:./FreeSans.ttf
|
Font:./mods/common/FreeSans.ttf
|
||||||
Size:12
|
Size:12
|
||||||
Regular:
|
Regular:
|
||||||
Font:./FreeSans.ttf
|
Font:./mods/common/FreeSans.ttf
|
||||||
Size:14
|
Size:14
|
||||||
Bold:
|
Bold:
|
||||||
Font:./FreeSansBold.ttf
|
Font:./mods/common/FreeSansBold.ttf
|
||||||
Size:14
|
Size:14
|
||||||
Title:
|
Title:
|
||||||
Font:./FreeSansBold.ttf
|
Font:./mods/common/FreeSansBold.ttf
|
||||||
Size:32
|
Size:32
|
||||||
MediumBold:
|
MediumBold:
|
||||||
Font:./FreeSansBold.ttf
|
Font:./mods/common/FreeSansBold.ttf
|
||||||
Size:18
|
Size:18
|
||||||
BigBold:
|
BigBold:
|
||||||
Font:./FreeSansBold.ttf
|
Font:./mods/common/FreeSansBold.ttf
|
||||||
Size:24
|
Size:24
|
||||||
Tiny:
|
Tiny:
|
||||||
Font:./FreeSans.ttf
|
Font:./mods/common/FreeSans.ttf
|
||||||
Size:10
|
Size:10
|
||||||
TinyBold:
|
TinyBold:
|
||||||
Font:./FreeSansBold.ttf
|
Font:./mods/common/FreeSansBold.ttf
|
||||||
Size:10
|
Size:10
|
||||||
|
|
||||||
LuaScripts:
|
LuaScripts:
|
||||||
|
|||||||
@@ -40,7 +40,6 @@
|
|||||||
CloakSound: trans1.aud
|
CloakSound: trans1.aud
|
||||||
UncloakSound: trans1.aud
|
UncloakSound: trans1.aud
|
||||||
Huntable:
|
Huntable:
|
||||||
LuaScriptEvents:
|
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
GainsStatUpgrades:
|
GainsStatUpgrades:
|
||||||
SelfHealing@ELITE:
|
SelfHealing@ELITE:
|
||||||
@@ -96,7 +95,6 @@
|
|||||||
CloakSound: trans1.aud
|
CloakSound: trans1.aud
|
||||||
UncloakSound: trans1.aud
|
UncloakSound: trans1.aud
|
||||||
Huntable:
|
Huntable:
|
||||||
LuaScriptEvents:
|
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
GainsStatUpgrades:
|
GainsStatUpgrades:
|
||||||
SelfHealing@ELITE:
|
SelfHealing@ELITE:
|
||||||
@@ -135,7 +133,6 @@
|
|||||||
BodyOrientation:
|
BodyOrientation:
|
||||||
UpdatesPlayerStatistics:
|
UpdatesPlayerStatistics:
|
||||||
Huntable:
|
Huntable:
|
||||||
LuaScriptEvents:
|
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
Tooltip:
|
Tooltip:
|
||||||
GenericName: Helicopter
|
GenericName: Helicopter
|
||||||
@@ -210,7 +207,6 @@
|
|||||||
Prerequisites: hosp
|
Prerequisites: hosp
|
||||||
UpdatesPlayerStatistics:
|
UpdatesPlayerStatistics:
|
||||||
Huntable:
|
Huntable:
|
||||||
LuaScriptEvents:
|
|
||||||
DetectCloaked:
|
DetectCloaked:
|
||||||
Range: 1
|
Range: 1
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
@@ -307,7 +303,6 @@
|
|||||||
AttackFrontal:
|
AttackFrontal:
|
||||||
UpdatesPlayerStatistics:
|
UpdatesPlayerStatistics:
|
||||||
Huntable:
|
Huntable:
|
||||||
LuaScriptEvents:
|
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
DeathSounds:
|
DeathSounds:
|
||||||
|
|
||||||
@@ -328,7 +323,6 @@
|
|||||||
BodyOrientation:
|
BodyOrientation:
|
||||||
Huntable:
|
Huntable:
|
||||||
AttackMove:
|
AttackMove:
|
||||||
LuaScriptEvents:
|
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
GainsStatUpgrades:
|
GainsStatUpgrades:
|
||||||
SelfHealing@ELITE:
|
SelfHealing@ELITE:
|
||||||
@@ -362,7 +356,6 @@
|
|||||||
BodyOrientation:
|
BodyOrientation:
|
||||||
UpdatesPlayerStatistics:
|
UpdatesPlayerStatistics:
|
||||||
Huntable:
|
Huntable:
|
||||||
LuaScriptEvents:
|
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
GainsStatUpgrades:
|
GainsStatUpgrades:
|
||||||
SelfHealing@ELITE:
|
SelfHealing@ELITE:
|
||||||
@@ -414,7 +407,6 @@
|
|||||||
FrozenUnderFog:
|
FrozenUnderFog:
|
||||||
UpdatesPlayerStatistics:
|
UpdatesPlayerStatistics:
|
||||||
Huntable:
|
Huntable:
|
||||||
LuaScriptEvents:
|
|
||||||
Demolishable:
|
Demolishable:
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
WithMakeAnimation:
|
WithMakeAnimation:
|
||||||
@@ -459,7 +451,6 @@
|
|||||||
BodyOrientation:
|
BodyOrientation:
|
||||||
FrozenUnderFog:
|
FrozenUnderFog:
|
||||||
StartsRevealed: true
|
StartsRevealed: true
|
||||||
LuaScriptEvents:
|
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
WithMakeAnimation:
|
WithMakeAnimation:
|
||||||
|
|
||||||
@@ -505,7 +496,6 @@
|
|||||||
Palette: terrain
|
Palette: terrain
|
||||||
FrozenUnderFog:
|
FrozenUnderFog:
|
||||||
StartsRevealed: true
|
StartsRevealed: true
|
||||||
LuaScriptEvents:
|
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
WithMakeAnimation:
|
WithMakeAnimation:
|
||||||
|
|
||||||
@@ -539,7 +529,6 @@
|
|||||||
Guardable:
|
Guardable:
|
||||||
BodyOrientation:
|
BodyOrientation:
|
||||||
FrozenUnderFog:
|
FrozenUnderFog:
|
||||||
LuaScriptEvents:
|
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
|
|
||||||
^Tree:
|
^Tree:
|
||||||
@@ -564,7 +553,6 @@
|
|||||||
BodyOrientation:
|
BodyOrientation:
|
||||||
FrozenUnderFog:
|
FrozenUnderFog:
|
||||||
StartsRevealed: true
|
StartsRevealed: true
|
||||||
LuaScriptEvents:
|
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
WithMakeAnimation:
|
WithMakeAnimation:
|
||||||
|
|
||||||
@@ -583,7 +571,6 @@
|
|||||||
BodyOrientation:
|
BodyOrientation:
|
||||||
FrozenUnderFog:
|
FrozenUnderFog:
|
||||||
StartsRevealed: true
|
StartsRevealed: true
|
||||||
LuaScriptEvents:
|
|
||||||
WithMakeAnimation:
|
WithMakeAnimation:
|
||||||
|
|
||||||
^Rock:
|
^Rock:
|
||||||
@@ -602,7 +589,6 @@
|
|||||||
BodyOrientation:
|
BodyOrientation:
|
||||||
FrozenUnderFog:
|
FrozenUnderFog:
|
||||||
StartsRevealed: true
|
StartsRevealed: true
|
||||||
LuaScriptEvents:
|
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
WithMakeAnimation:
|
WithMakeAnimation:
|
||||||
|
|
||||||
@@ -630,7 +616,6 @@
|
|||||||
BodyOrientation:
|
BodyOrientation:
|
||||||
Tooltip:
|
Tooltip:
|
||||||
GenericName: Destroyed Vehicle
|
GenericName: Destroyed Vehicle
|
||||||
LuaScriptEvents:
|
|
||||||
DisabledOverlay:
|
DisabledOverlay:
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
|
|
||||||
@@ -660,6 +645,5 @@
|
|||||||
DamagedSound: xplos.aud
|
DamagedSound: xplos.aud
|
||||||
DestroyedSound: xplobig4.aud
|
DestroyedSound: xplobig4.aud
|
||||||
BodyOrientation:
|
BodyOrientation:
|
||||||
LuaScriptEvents:
|
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
|
|
||||||
|
|||||||
@@ -1,236 +0,0 @@
|
|||||||
Actor = { }
|
|
||||||
|
|
||||||
Actor.Create = function(name, init)
|
|
||||||
if name == nil then error("No actor name specified", 2) end
|
|
||||||
if init.Owner == nil then error("No actor owner specified", 2) end
|
|
||||||
local td = OpenRA.New("TypeDictionary")
|
|
||||||
local addToWorld = true
|
|
||||||
for key, value in pairs(init) do
|
|
||||||
if key == "AddToWorld" then
|
|
||||||
addToWorld = value
|
|
||||||
else
|
|
||||||
td:Add(OpenRA.New(key .. "Init", { value }))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return World:CreateActor(addToWorld, name, td)
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.Turn = function(actor, facing)
|
|
||||||
actor:QueueActivity(OpenRA.New("Turn", { actor, { facing, "Int32" } }))
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.Move = function(actor, location)
|
|
||||||
Actor.MoveNear(actor, location, 0)
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.MoveNear = function(actor, location, nearEnough)
|
|
||||||
actor:QueueActivity(OpenRA.New("Move", { actor, location, WRange.FromCells(nearEnough) }))
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.ScriptedMove = function(actor, location)
|
|
||||||
if Actor.HasTrait(actor, "Helicopter") then
|
|
||||||
Internal.HeliFlyToPos(actor, Map.CenterOfCell(location))
|
|
||||||
else
|
|
||||||
actor:QueueActivity(OpenRA.New("Move", { actor, location }))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.AfterMove = function(actor)
|
|
||||||
local heli = Actor.TraitOrDefault(actor, "Helicopter")
|
|
||||||
if heli ~= nil then
|
|
||||||
Actor.Turn(actor, heli.Info.InitialFacing)
|
|
||||||
Actor.HeliLand(actor, true)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.Teleport = function(actor, location)
|
|
||||||
actor:QueueActivity(OpenRA.New("SimpleTeleport", { location }))
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.AttackMove = function(actor, location, nearEnough)
|
|
||||||
Internal.AttackMove(actor, location, nearEnough or 0)
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.HeliFly = function(actor, position)
|
|
||||||
Internal.HeliFlyToPos(actor, position)
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.HeliLand = function(actor, requireSpace)
|
|
||||||
actor:QueueActivity(OpenRA.New("HeliLand", { requireSpace }))
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.Fly = function(actor, position)
|
|
||||||
Internal.FlyToPos(actor, position)
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.FlyAttackActor = function(actor, targetActor)
|
|
||||||
Internal.FlyAttackActor(actor, targetActor)
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.FlyAttackCell = function(actor, location)
|
|
||||||
Internal.FlyAttackCell(actor, location)
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.FlyOffMap = function(actor)
|
|
||||||
actor:QueueActivity(OpenRA.New("FlyOffMap"))
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.Hunt = function(actor)
|
|
||||||
if Actor.HasTrait(actor, "AttackBase") and Actor.HasTrait(actor, "IMove") then
|
|
||||||
actor:QueueActivity(OpenRA.New("Hunt", { actor }))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.CargoIsEmpty = function(actor)
|
|
||||||
local cargo = Actor.TraitOrDefault(actor, "Cargo")
|
|
||||||
return cargo == nil or cargo:IsEmpty(actor)
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.UnloadCargo = function(actor, unloadAll)
|
|
||||||
actor:QueueActivity(OpenRA.New("UnloadCargo", { actor, unloadAll }))
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.Harvest = function(actor)
|
|
||||||
actor:QueueActivity(OpenRA.New("FindResources"))
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.Scatter = function(actor)
|
|
||||||
local mobile = Actor.Trait(actor, "Mobile")
|
|
||||||
mobile:Nudge(actor, actor, true)
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.Wait = function(actor, period)
|
|
||||||
actor:QueueActivity(OpenRA.New("Wait", { { period, "Int32" } }))
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.WaitFor = function(actor, func)
|
|
||||||
Internal.WaitFor(actor, func)
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.CallFunc = function(actor, func)
|
|
||||||
Internal.CallFunc(actor, func)
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.DeployTransform = function(actor)
|
|
||||||
Actor.CallFunc(actor, function()
|
|
||||||
-- Queue the transform order
|
|
||||||
Actor.Trait(actor, "Transforms"):DeployTransform(true)
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.RemoveSelf = function(actor)
|
|
||||||
actor:QueueActivity(OpenRA.New("RemoveSelf"))
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.Stop = function(actor)
|
|
||||||
actor:CancelActivity()
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.IsDead = function(actor)
|
|
||||||
return Internal.IsDead(actor)
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.IsInWorld = function(actor)
|
|
||||||
return actor.IsInWorld
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.Owner = function(actor)
|
|
||||||
return actor.Owner
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.Facing = function(actor)
|
|
||||||
return Actor.Trait(actor, "IFacing"):get_Facing()
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.IsIdle = function(actor)
|
|
||||||
return actor.IsIdle
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.SetStance = function(actor, stance)
|
|
||||||
Internal.SetUnitStance(actor, stance)
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.RepairBuilding = function(actor)
|
|
||||||
local rb = Actor.TraitOrDefault(actor, "RepairableBuilding")
|
|
||||||
if rb ~= nil and not rb.RepairActive then
|
|
||||||
rb:RepairBuilding(actor, Actor.Owner(actor))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.OnDamaged = function(actor, eh)
|
|
||||||
Actor.Trait(actor, "LuaScriptEvents").OnDamaged:Add(eh)
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.OnKilled = function(actor, eh)
|
|
||||||
Actor.Trait(actor, "LuaScriptEvents").OnKilled:Add(eh)
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.OnAddedToWorld = function(actor, eh)
|
|
||||||
Actor.Trait(actor, "LuaScriptEvents").OnAddedToWorld:Add(eh)
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.OnRemovedFromWorld = function(actor, eh)
|
|
||||||
Actor.Trait(actor, "LuaScriptEvents").OnRemovedFromWorld:Add(eh)
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.OnCaptured = function(actor, eh)
|
|
||||||
Actor.Trait(actor, "LuaScriptEvents").OnCaptured:Add(eh)
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.OnIdle = function(actor, eh)
|
|
||||||
Actor.Trait(actor, "LuaScriptEvents").OnIdle:Add(eh)
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.OnProduced = function(actor, eh)
|
|
||||||
Actor.Trait(actor, "LuaScriptEvents").OnProduced:Add(eh)
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.ActorsWithTrait = function(className)
|
|
||||||
local ret = { }
|
|
||||||
for item in Utils.Enumerate(Internal.ActorsWithTrait(className)) do
|
|
||||||
table.insert(ret, item.Actor)
|
|
||||||
end
|
|
||||||
return ret
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.HasTrait = function(actor, className)
|
|
||||||
return Internal.HasTrait(actor, className)
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.TraitOrDefault = function(actor, className)
|
|
||||||
return Internal.TraitOrDefault(actor, className)
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.Trait = function(actor, className)
|
|
||||||
return Internal.Trait(actor, className)
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.ReturnToBase = function(actor, airfield)
|
|
||||||
actor:QueueActivity(OpenRA.New("ReturnToBase", { actor, airfield }))
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.Guard = function(actor, target)
|
|
||||||
Internal.Guard(actor, target)
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.Patrol = function(actor, waypoints, wait, loop)
|
|
||||||
if not Actor.IsDead(actor) then
|
|
||||||
Utils.Do(waypoints, function(wpt)
|
|
||||||
Actor.AttackMove(actor, wpt.Location, 3)
|
|
||||||
Actor.Wait(actor, wait or 0)
|
|
||||||
end)
|
|
||||||
if loop or loop == nil then
|
|
||||||
Actor.CallFunc(actor, function() Actor.Patrol(actor, waypoints, wait, loop) end)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
Actor.PatrolUntil = function(actor, waypoints, wait, func)
|
|
||||||
if func == nil then error("No function specified", 2) end
|
|
||||||
if not Actor.IsDead(actor) then
|
|
||||||
Actor.Patrol(actor, waypoints, wait, false)
|
|
||||||
if not func(actor) then
|
|
||||||
Actor.CallFunc(actor, function() Actor.PatrolUntil(actor, waypoints, wait, func) end)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
Facing = { }
|
|
||||||
|
|
||||||
Facing.North = { 0, "Int32" }
|
|
||||||
Facing.NorthWest = { 32, "Int32" }
|
|
||||||
Facing.West = { 64, "Int32" }
|
|
||||||
Facing.SouthWest = { 96, "Int32" }
|
|
||||||
Facing.South = { 128, "Int32" }
|
|
||||||
Facing.SouthEast = { 160, "Int32" }
|
|
||||||
Facing.East = { 192, "Int32" }
|
|
||||||
Facing.NorthEast = { 224, "Int32" }
|
|
||||||
@@ -1,109 +0,0 @@
|
|||||||
Map = { }
|
|
||||||
|
|
||||||
Map.GetFacing = function(vec, currentFacing)
|
|
||||||
return Internal.GetFacing(vec, currentFacing)
|
|
||||||
end
|
|
||||||
|
|
||||||
Map.GetRandomCell = function()
|
|
||||||
return Internal.GetRandomCell()
|
|
||||||
end
|
|
||||||
|
|
||||||
Map.GetRandomEdgeCell = function()
|
|
||||||
return Internal.GetRandomEdgeCell()
|
|
||||||
end
|
|
||||||
|
|
||||||
Map.IsNamedActor = function(actor)
|
|
||||||
return Internal.IsNamedActor(actor)
|
|
||||||
end
|
|
||||||
|
|
||||||
Map.GetNamedActor = function(actorName)
|
|
||||||
return Internal.GetNamedActor(actorName)
|
|
||||||
end
|
|
||||||
|
|
||||||
Map.GetNamedActors = function()
|
|
||||||
return Internal.GetNamedActors()
|
|
||||||
end
|
|
||||||
|
|
||||||
Map.FindActorsInCircle = function(location, radius, func)
|
|
||||||
local actors = Internal.FindActorsInCircle(location.CenterPosition, WRange.FromCells(radius))
|
|
||||||
return Utils.EnumerableWhere(actors, func)
|
|
||||||
end
|
|
||||||
|
|
||||||
Map.FindActorsInBox = function(topLeft, bottomRight, func)
|
|
||||||
local actors = Internal.FindActorsInBox(topLeft.CenterPosition, bottomRight.CenterPosition)
|
|
||||||
return Utils.EnumerableWhere(actors, func)
|
|
||||||
end
|
|
||||||
|
|
||||||
Map.__FilterByTrait = function(a, player, trait)
|
|
||||||
return Actor.Owner(a) == player and Actor.HasTrait(a, trait)
|
|
||||||
end
|
|
||||||
|
|
||||||
Map.__FilterByTraitAndIdle = function(a, player, trait)
|
|
||||||
return Map.__FilterByTrait(a, player, trait) and Actor.IsIdle(a)
|
|
||||||
end
|
|
||||||
|
|
||||||
Map.FindUnitsInCircle = function(player, location, radius)
|
|
||||||
return Map.FindActorsInCircle(location, radius, function(a) return Map.__FilterByTrait(a, player, "Mobile") end)
|
|
||||||
end
|
|
||||||
|
|
||||||
Map.FindUnitsInBox = function(player, topLeft, bottomRight)
|
|
||||||
return Map.FindActorsInBox(topLeft, bottomRight, function(a) return Map.__FilterByTrait(a, player, "Mobile") end)
|
|
||||||
end
|
|
||||||
|
|
||||||
Map.FindStructuresInCircle = function(player, location, radius)
|
|
||||||
return Map.FindActorsInCircle(location, radius, function(a) return Map.__FilterByTrait(a, player, "Building") end)
|
|
||||||
end
|
|
||||||
|
|
||||||
Map.FindStructuresInBox = function(player, topLeft, bottomRight)
|
|
||||||
return Map.FindActorsInBox(topLeft, bottomRight, function(a) return Map.__FilterByTrait(a, player, "Building") end)
|
|
||||||
end
|
|
||||||
|
|
||||||
Map.FindIdleUnitsInCircle = function(player, location, radius)
|
|
||||||
return Map.FindActorsInCircle(location, radius, function(a) return Map.__FilterByTraitAndIdle(a, player, "Mobile") end)
|
|
||||||
end
|
|
||||||
|
|
||||||
Map.FindIdleUnitsInBox = function(player, topLeft, bottomRight)
|
|
||||||
return Map.FindActorsInBox(topLeft, bottomRight, function(a) return Map.__FilterByTraitAndIdle(a, player, "Mobile") end)
|
|
||||||
end
|
|
||||||
|
|
||||||
Map.ExpandFootprint = function(cells, allowDiagonal)
|
|
||||||
return Utils.EnumerableToTable(Internal.ExpandFootprint(cells, allowDiagonal))
|
|
||||||
end
|
|
||||||
|
|
||||||
Map.CenterOfCell = function(position)
|
|
||||||
return Internal.CenterOfCell(position)
|
|
||||||
end
|
|
||||||
|
|
||||||
CPos.New = function(x, y)
|
|
||||||
return OpenRA.New("CPos", { { x, "Int32" }, { y, "Int32" } })
|
|
||||||
end
|
|
||||||
|
|
||||||
WPos.New = function(x, y, z)
|
|
||||||
if z == nil then
|
|
||||||
z = 0
|
|
||||||
end
|
|
||||||
return OpenRA.New("WPos", { { x, "Int32" }, { y, "Int32" }, { z, "Int32" } })
|
|
||||||
end
|
|
||||||
|
|
||||||
WPos.FromCPos = function(location)
|
|
||||||
return WPos.New(location.X * 1024, location.Y * 1024, 0)
|
|
||||||
end
|
|
||||||
|
|
||||||
CVec.New = function(x, y)
|
|
||||||
return OpenRA.New("CVec", { { x, "Int32" }, { y, "Int32" } })
|
|
||||||
end
|
|
||||||
|
|
||||||
WVec.New = function(x, y, z)
|
|
||||||
if z == nil then
|
|
||||||
z = 0
|
|
||||||
end
|
|
||||||
return OpenRA.New("WVec", { { x, "Int32" }, { y, "Int32" }, { z, "Int32" } })
|
|
||||||
end
|
|
||||||
|
|
||||||
WRange.New = function(r)
|
|
||||||
return OpenRA.New("WRange", { { r, "Int32" } })
|
|
||||||
end
|
|
||||||
|
|
||||||
WRange.FromCells = function(cells)
|
|
||||||
return WRange.New(cells * 1024)
|
|
||||||
end
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
Media = { }
|
|
||||||
|
|
||||||
Media.PlaySpeechNotification = function(notification, player)
|
|
||||||
Internal.PlaySpeechNotification(player, notification)
|
|
||||||
end
|
|
||||||
|
|
||||||
Media.PlaySoundNotification = function(notification, player)
|
|
||||||
Internal.PlaySoundNotification(player, notification)
|
|
||||||
end
|
|
||||||
|
|
||||||
Media.PlayRandomMusic = function()
|
|
||||||
Internal.PlayRandomMusic()
|
|
||||||
end
|
|
||||||
|
|
||||||
Media.PlayMovieFullscreen = function(movie, onComplete)
|
|
||||||
if onComplete == nil then
|
|
||||||
onComplete = function() end
|
|
||||||
end
|
|
||||||
Internal.PlayMovieFullscreen(movie, onComplete)
|
|
||||||
end
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
Mission = { }
|
|
||||||
|
|
||||||
Mission.MissionOver = function(winners, losers, setWinStates)
|
|
||||||
World:SetLocalPauseState(true)
|
|
||||||
World:set_PauseStateLocked(true)
|
|
||||||
if winners then
|
|
||||||
for i, player in ipairs(winners) do
|
|
||||||
Media.PlaySpeechNotification("Win", player)
|
|
||||||
if setWinStates then
|
|
||||||
OpenRA.SetWinState(player, "Won")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if losers then
|
|
||||||
for i, player in ipairs(losers) do
|
|
||||||
Media.PlaySpeechNotification("Lose", player)
|
|
||||||
if setWinStates then
|
|
||||||
OpenRA.SetWinState(player, "Lost")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
Mission.MissionIsOver = true
|
|
||||||
end
|
|
||||||
|
|
||||||
Mission.GetGroundAttackersOf = function(player)
|
|
||||||
return Utils.Where(Actor.ActorsWithTrait("AttackBase"), function(actor)
|
|
||||||
return not Actor.IsDead(actor) and Actor.IsInWorld(actor) and Actor.Owner(actor) == player and Actor.HasTrait(actor, "Mobile")
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
|
|
||||||
Mission.TickTakeOre = function(player)
|
|
||||||
OpenRA.TakeOre(player, 0.01 * OpenRA.GetOreCapacity(player) / 25)
|
|
||||||
end
|
|
||||||
|
|
||||||
Mission.RequiredUnitsAreDestroyed = function(player)
|
|
||||||
return Internal.RequiredUnitsAreDestroyed(player)
|
|
||||||
end
|
|
||||||
@@ -1,83 +0,0 @@
|
|||||||
print = Internal.Debug
|
|
||||||
|
|
||||||
OpenRA = { }
|
|
||||||
|
|
||||||
OpenRA.New = function(className, args)
|
|
||||||
if args == nil then
|
|
||||||
args = { }
|
|
||||||
end
|
|
||||||
return Internal.New(className, args)
|
|
||||||
end
|
|
||||||
|
|
||||||
OpenRA.RunAfterDelay = function(delay, func)
|
|
||||||
if func == nil then error("No function specified", 2) end
|
|
||||||
Internal.RunAfterDelay(delay, func)
|
|
||||||
end
|
|
||||||
|
|
||||||
OpenRA.SetViewportCenterPosition = function(position)
|
|
||||||
WorldRenderer.Viewport:Center(position)
|
|
||||||
end
|
|
||||||
|
|
||||||
OpenRA.GetViewportCenterPosition = function()
|
|
||||||
return WorldRenderer.Viewport.CenterPosition
|
|
||||||
end
|
|
||||||
|
|
||||||
OpenRA.GetDifficulty = function()
|
|
||||||
return World.LobbyInfo.GlobalSettings.Difficulty
|
|
||||||
end
|
|
||||||
|
|
||||||
OpenRA.IsSinglePlayer = function()
|
|
||||||
return World.LobbyInfo:get_IsSinglePlayer()
|
|
||||||
end
|
|
||||||
|
|
||||||
OpenRA.GetPlayer = function(internalName)
|
|
||||||
return Utils.EnumerableFirstOrNil(World.Players, function(p) return p.InternalName == internalName end)
|
|
||||||
end
|
|
||||||
|
|
||||||
OpenRA.GetPlayers = function(func)
|
|
||||||
return Utils.EnumerableWhere(World.Players, func)
|
|
||||||
end
|
|
||||||
|
|
||||||
OpenRA.SetWinState = function(player, winState)
|
|
||||||
Internal.SetWinState(player, winState)
|
|
||||||
end
|
|
||||||
|
|
||||||
OpenRA.GetRandomInteger = function(low, high)
|
|
||||||
if high <= low then
|
|
||||||
return low
|
|
||||||
else
|
|
||||||
return Internal.GetRandomInteger(low, high)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
OpenRA.TakeOre = function(player, amount)
|
|
||||||
Actor.Trait(player.PlayerActor, "PlayerResources"):TakeResources(amount)
|
|
||||||
end
|
|
||||||
|
|
||||||
OpenRA.TakeCash = function(player, amount)
|
|
||||||
Actor.Trait(player.PlayerActor, "PlayerResources"):TakeCash(amount)
|
|
||||||
end
|
|
||||||
|
|
||||||
OpenRA.GiveOre = function(player, amount)
|
|
||||||
Actor.Trait(player.PlayerActor, "PlayerResources"):GiveResources(amount)
|
|
||||||
end
|
|
||||||
|
|
||||||
OpenRA.GiveCash = function(player, amount)
|
|
||||||
Actor.Trait(player.PlayerActor, "PlayerResources"):GiveCash(amount)
|
|
||||||
end
|
|
||||||
|
|
||||||
OpenRA.CanGiveOre = function(player, amount)
|
|
||||||
return Actor.Trait(player.PlayerActor, "PlayerResources"):CanGiveResources(amount)
|
|
||||||
end
|
|
||||||
|
|
||||||
OpenRA.GetOreCapacity = function(player)
|
|
||||||
return Actor.Trait(player.PlayerActor, "PlayerResources").ResourceCapacity
|
|
||||||
end
|
|
||||||
|
|
||||||
OpenRA.GetOre = function(player)
|
|
||||||
return Actor.Trait(player.PlayerActor, "PlayerResources").Resources
|
|
||||||
end
|
|
||||||
|
|
||||||
OpenRA.GetCash = function(player)
|
|
||||||
return Actor.Trait(player.PlayerActor, "PlayerResources").Cash
|
|
||||||
end
|
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
Production = { }
|
|
||||||
Production.EventHandlers = { }
|
|
||||||
|
|
||||||
Production.BuildWithSharedQueue = function(player, unit, amount)
|
|
||||||
Internal.BuildWithSharedQueue(player, unit, amount or 1)
|
|
||||||
end
|
|
||||||
|
|
||||||
Production.BuildWithPerFactoryQueue = function(factory, unit, amount)
|
|
||||||
Internal.BuildWithPerFactoryQueue(factory, unit, amount or 1)
|
|
||||||
end
|
|
||||||
|
|
||||||
Production.Build = function(factory, unit, amount)
|
|
||||||
if Actor.HasTrait(factory, "ProductionQueue") then
|
|
||||||
Production.BuildWithPerFactoryQueue(factory, unit, amount)
|
|
||||||
elseif Actor.HasTrait(factory, "Production") then
|
|
||||||
Production.SetPrimaryBuilding(factory)
|
|
||||||
Production.BuildWithSharedQueue(Actor.Owner(factory), unit, amount)
|
|
||||||
else
|
|
||||||
error("Production.Build: not a factory")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
Production.SharedQueueIsBusy = function(player, category)
|
|
||||||
return Internal.SharedQueueIsBusy(player, category)
|
|
||||||
end
|
|
||||||
|
|
||||||
Production.PerFactoryQueueIsBusy = function(factory)
|
|
||||||
return Internal.PerFactoryQueueIsBusy(factory)
|
|
||||||
end
|
|
||||||
|
|
||||||
Production.SetRallyPoint = function(factory, location)
|
|
||||||
local srp = Actor.Trait(factory, "RallyPoint")
|
|
||||||
if srp ~= nil then
|
|
||||||
srp.Location = location.Location
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
Production.SetPrimaryBuilding = function(factory)
|
|
||||||
local pb = Actor.TraitOrDefault(factory, "PrimaryBuilding")
|
|
||||||
if pb ~= nil then
|
|
||||||
pb:SetPrimaryProducer(factory, true)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
Production.BuildTeamFromTemplate = function(player, template, func)
|
|
||||||
local factories = { }
|
|
||||||
Utils.Do(template, function(t) table.insert(factories, t[1]) end)
|
|
||||||
|
|
||||||
if Utils.Any(factories, Actor.IsDead) then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
if Utils.Any(factories, function(fact) return Production.EventHandlers[fact] end) then
|
|
||||||
OpenRA.RunAfterDelay(Utils.Seconds(10), function() Production.BuildTeamFromTemplate(player, template, func) end)
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local team = Team.New({ })
|
|
||||||
local teamSize = 0
|
|
||||||
Utils.Do(template, function(t) teamSize = teamSize + #t[2] end)
|
|
||||||
|
|
||||||
local eventHandler = function(unit)
|
|
||||||
Team.Add(team, unit)
|
|
||||||
|
|
||||||
if #team.Actors >= teamSize then
|
|
||||||
func(team)
|
|
||||||
Utils.Do(factories, function(factory)
|
|
||||||
Production.EventHandlers[factory] = nil
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
Utils.Do(factories, function(factory)
|
|
||||||
Production.EventHandlers[factory] = eventHandler
|
|
||||||
end)
|
|
||||||
|
|
||||||
Utils.Do(template, function(t)
|
|
||||||
Utils.Do(t[2], function(unit)
|
|
||||||
Production.Build(t[1], unit)
|
|
||||||
end)
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
|
|
||||||
Production.EventHandlers.Setup = function(player)
|
|
||||||
Utils.Do(Actor.ActorsWithTrait("Production"), function(factory)
|
|
||||||
if Actor.Owner(factory) == player then
|
|
||||||
Actor.OnProduced(factory, function(fact, unit)
|
|
||||||
if Production.EventHandlers[fact] then
|
|
||||||
Production.EventHandlers[fact](unit)
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
@@ -1,82 +0,0 @@
|
|||||||
Reinforcements = { }
|
|
||||||
|
|
||||||
Reinforcements.Insert = function(owner, transportName, passengerNames, enterPath, exitPath)
|
|
||||||
local facing = { Map.GetFacing(CPos.op_Subtraction(enterPath[2], enterPath[1]), 0), "Int32" }
|
|
||||||
local center = WPos.op_Addition(Map.CenterOfCell(enterPath[1]), WVec.New(0, 0, Rules.InitialAltitude(transportName)))
|
|
||||||
local transport = Actor.Create(transportName, { Owner = owner, Location = enterPath[1], CenterPosition = center, Facing = facing })
|
|
||||||
local cargo = Actor.Trait(transport, "Cargo")
|
|
||||||
local passengers = { }
|
|
||||||
|
|
||||||
for i, passengerName in ipairs(passengerNames) do
|
|
||||||
local passenger = Actor.Create(passengerName, { AddToWorld = false, Owner = owner })
|
|
||||||
passengers[i] = passenger
|
|
||||||
cargo:Load(transport, passenger)
|
|
||||||
end
|
|
||||||
|
|
||||||
Utils.Do(Utils.Skip(enterPath, 1), function(l) Actor.ScriptedMove(transport, l) end)
|
|
||||||
Actor.AfterMove(transport)
|
|
||||||
Actor.UnloadCargo(transport, true)
|
|
||||||
Actor.Wait(transport, 25)
|
|
||||||
Utils.Do(exitPath, function(l) Actor.ScriptedMove(transport, l) end)
|
|
||||||
Actor.RemoveSelf(transport)
|
|
||||||
return transport, passengers
|
|
||||||
end
|
|
||||||
|
|
||||||
Reinforcements.Extract = function(owner, transportName, passengerNames, enterPath, exitPath)
|
|
||||||
local facing = { Map.GetFacing(CPos.op_Subtraction(enterPath[2], enterPath[1]), 0), "Int32" }
|
|
||||||
local center = WPos.op_Addition(Map.CenterOfCell(enterPath[1]), WVec.New(0, 0, Rules.InitialAltitude(transportName)))
|
|
||||||
local transport = Actor.Create(transportName, { Owner = owner, Location = enterPath[1], CenterPosition = center, Facing = facing })
|
|
||||||
local cargo = Actor.Trait(transport, "Cargo")
|
|
||||||
|
|
||||||
Utils.Do(Utils.Skip(enterPath, 1), function(l) Actor.ScriptedMove(transport, l) end)
|
|
||||||
Actor.AfterMove(transport)
|
|
||||||
Actor.WaitFor(transport, function()
|
|
||||||
return Utils.All(passengerNames, function(passenger) return cargo.Passengers:Contains(passenger) end)
|
|
||||||
end)
|
|
||||||
|
|
||||||
Actor.Wait(transport, 125)
|
|
||||||
Utils.Do(exitPath, function(l) Actor.ScriptedMove(transport, l) end)
|
|
||||||
Actor.RemoveSelf(transport)
|
|
||||||
return transport
|
|
||||||
end
|
|
||||||
|
|
||||||
Reinforcements.Reinforce = function(owner, reinforcementNames, enterLocation, rallyPointLocation, interval, onCreateFunc)
|
|
||||||
local facing = { Map.GetFacing(CPos.op_Subtraction(rallyPointLocation, enterLocation), 0), "Int32" }
|
|
||||||
local reinforcements = { }
|
|
||||||
for i, reinforcementName in ipairs(reinforcementNames) do
|
|
||||||
local reinforcement = Actor.Create(reinforcementName, { AddToWorld = false, Owner = owner, Location = enterLocation, Facing = facing })
|
|
||||||
reinforcements[i] = reinforcement
|
|
||||||
OpenRA.RunAfterDelay((i - 1) * interval, function()
|
|
||||||
World:Add(reinforcement)
|
|
||||||
Actor.MoveNear(reinforcement, rallyPointLocation, 2)
|
|
||||||
if onCreateFunc ~= nil then
|
|
||||||
onCreateFunc(reinforcement)
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
return reinforcements
|
|
||||||
end
|
|
||||||
|
|
||||||
Reinforcements.ReinforceWithCargo = function(owner, actorName, path, cargoNames, actionFunc)
|
|
||||||
local facing = { Map.GetFacing(CPos.op_Subtraction(path[2].Location, path[1].Location), 0), "Int32" }
|
|
||||||
local center = WPos.op_Addition(path[1].CenterPosition, WVec.New(0, 0, Rules.InitialAltitude(actorName)))
|
|
||||||
local actor = Actor.Create(actorName, { Owner = owner, Location = path[1].Location, CenterPosition = center, Facing = facing })
|
|
||||||
local cargo = Actor.TraitOrDefault(actor, "Cargo")
|
|
||||||
local team = Team.New({})
|
|
||||||
if cargo ~= nil and cargoNames ~= nil and #cargoNames > 0 then
|
|
||||||
local passengers = { }
|
|
||||||
|
|
||||||
for i, cargoName in ipairs(cargoNames) do
|
|
||||||
local passenger = Actor.Create(cargoName, { AddToWorld = false, Owner = owner })
|
|
||||||
Team.Add(team, passenger)
|
|
||||||
passengers[i] = passenger
|
|
||||||
cargo:Load(actor, passenger)
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
Utils.Do(Utils.Skip(path, 1), function(waypoint) Actor.ScriptedMove(actor, waypoint.Location) end)
|
|
||||||
|
|
||||||
if actionFunc then actionFunc(actor, team) end
|
|
||||||
return actor, team
|
|
||||||
end
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
Rules = { }
|
|
||||||
|
|
||||||
Rules.HasTraitInfo = function(actorType, className)
|
|
||||||
return Internal.HasTraitInfo(actorType, className)
|
|
||||||
end
|
|
||||||
|
|
||||||
Rules.TraitInfoOrDefault = function(actorType, className)
|
|
||||||
return Internal.TraitInfoOrDefault(actorType, className)
|
|
||||||
end
|
|
||||||
|
|
||||||
Rules.TraitInfo = function(actorType, className)
|
|
||||||
return Internal.TraitInfo(actorType, className)
|
|
||||||
end
|
|
||||||
|
|
||||||
Rules.InitialAltitude = function(actorType)
|
|
||||||
local ai = Rules.TraitInfoOrDefault(actorType, "AircraftInfo")
|
|
||||||
if ai ~= nil then
|
|
||||||
return ai.CruiseAltitude.Range
|
|
||||||
end
|
|
||||||
return 0
|
|
||||||
end
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
SupportPowers = { }
|
|
||||||
|
|
||||||
SupportPowers.Airstrike = function(owner, planeName, enterLocation, bombLocation)
|
|
||||||
local facing = { Map.GetFacing(CPos.op_Subtraction(bombLocation, enterLocation), 0), "Int32" }
|
|
||||||
local center = WPos.op_Addition(Map.CenterOfCell(enterLocation), WVec.New(0, 0, Rules.InitialAltitude(planeName)))
|
|
||||||
local plane = Actor.Create(planeName, { Location = enterLocation, Owner = owner, Facing = facing, CenterPosition = center })
|
|
||||||
local bombLoc = Map.CenterOfCell(bombLocation)
|
|
||||||
Actor.Trait(plane, "AttackBomber"):SetTarget(bombLoc)
|
|
||||||
Actor.Fly(plane, bombLoc)
|
|
||||||
Actor.FlyOffMap(plane)
|
|
||||||
Actor.RemoveSelf(plane)
|
|
||||||
return plane
|
|
||||||
end
|
|
||||||
|
|
||||||
SupportPowers.Paradrop = function(owner, planeName, passengerNames, enterLocation, dropLocation)
|
|
||||||
local facing = { Map.GetFacing(CPos.op_Subtraction(dropLocation, enterLocation), 0), "Int32" }
|
|
||||||
local center = WPos.op_Addition(Map.CenterOfCell(enterLocation), WVec.New(0, 0, Rules.InitialAltitude(planeName)))
|
|
||||||
local plane = Actor.Create(planeName, { Location = enterLocation, Owner = owner, Facing = facing, CenterPosition = center })
|
|
||||||
Actor.Fly(plane, Map.CenterOfCell(dropLocation))
|
|
||||||
Actor.Trait(plane, "ParaDrop"):SetLZ(dropLocation, true)
|
|
||||||
Actor.FlyOffMap(plane)
|
|
||||||
Actor.RemoveSelf(plane)
|
|
||||||
local cargo = Actor.Trait(plane, "Cargo")
|
|
||||||
local passengers = { }
|
|
||||||
for i, passengerName in ipairs(passengerNames) do
|
|
||||||
local passenger = Actor.Create(passengerName, { AddToWorld = false, Owner = owner })
|
|
||||||
passengers[i] = passenger
|
|
||||||
cargo:Load(plane, passenger)
|
|
||||||
end
|
|
||||||
return plane, passengers
|
|
||||||
end
|
|
||||||
|
|
||||||
SupportPowers.Chronoshift = function(unitLocationPairs, chronosphere, duration, killCargo)
|
|
||||||
duration = duration or -1
|
|
||||||
killCargo = killCargo or true
|
|
||||||
Utils.Do(unitLocationPairs, function(pair)
|
|
||||||
local unit = pair[1]
|
|
||||||
local cell = pair[2]
|
|
||||||
local cs = Actor.TraitOrDefault(unit, "Chronoshiftable")
|
|
||||||
if cs ~= nil and cs:CanChronoshiftTo(unit, cell) then
|
|
||||||
cs:Teleport(unit, cell, duration, killCargo, chronosphere)
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
Team = { }
|
|
||||||
|
|
||||||
Team.New = function(actors)
|
|
||||||
local team = { }
|
|
||||||
team.Actors = actors
|
|
||||||
team.OnAllKilled = { }
|
|
||||||
team.OnAnyKilled = { }
|
|
||||||
team.OnAllRemovedFromWorld = { }
|
|
||||||
team.OnAnyRemovedFromWorld = { }
|
|
||||||
Team.Do(team, function(actor) Team.AddActorEventHandlers(team, actor) end)
|
|
||||||
return team
|
|
||||||
end
|
|
||||||
|
|
||||||
Team.Add = function(team, actor)
|
|
||||||
table.insert(team.Actors, actor)
|
|
||||||
Team.AddActorEventHandlers(team, actor)
|
|
||||||
end
|
|
||||||
|
|
||||||
Team.AddActorEventHandlers = function(team, actor)
|
|
||||||
Actor.OnKilled(actor, function()
|
|
||||||
Team.InvokeHandlers(team.OnAnyKilled)
|
|
||||||
if Team.AllAreDead(team) then Team.InvokeHandlers(team.OnAllKilled) end
|
|
||||||
end)
|
|
||||||
|
|
||||||
Actor.OnRemovedFromWorld(actor, function()
|
|
||||||
Team.InvokeHandlers(team.OnAnyRemovedFromWorld)
|
|
||||||
if not Team.AnyAreInWorld(team) then Team.InvokeHandlers(team.OnAllRemovedFromWorld) end
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
|
|
||||||
Team.InvokeHandlers = function(event)
|
|
||||||
Utils.Do(event, function(handler) handler() end)
|
|
||||||
end
|
|
||||||
|
|
||||||
Team.AllAreDead = function(team)
|
|
||||||
return Utils.All(team.Actors, Actor.IsDead)
|
|
||||||
end
|
|
||||||
|
|
||||||
Team.AnyAreDead = function(team)
|
|
||||||
return Utils.Any(team.Actors, Actor.IsDead)
|
|
||||||
end
|
|
||||||
|
|
||||||
Team.AllAreInWorld = function(team)
|
|
||||||
return Utils.All(team.Actors, Actor.IsInWorld)
|
|
||||||
end
|
|
||||||
|
|
||||||
Team.AnyAreInWorld = function(team)
|
|
||||||
return Utils.Any(team.Actors, Actor.IsInWorld)
|
|
||||||
end
|
|
||||||
|
|
||||||
Team.AddEventHandler = function(event, func)
|
|
||||||
table.insert(event, func)
|
|
||||||
end
|
|
||||||
|
|
||||||
Team.Contains = function(team, actor)
|
|
||||||
return Utils.Any(team.Actors, function(a) return a == actor end)
|
|
||||||
end
|
|
||||||
|
|
||||||
Team.Do = function(team, func)
|
|
||||||
Utils.Do(team.Actors, function(actor)
|
|
||||||
if not Actor.IsDead(actor) then
|
|
||||||
func(actor)
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
|
|
||||||
Team.Patrol = function(team, waypoints, wait, loop)
|
|
||||||
Team.Do(team, function(a) Actor.Patrol(a, waypoints, wait, loop) end)
|
|
||||||
end
|
|
||||||
|
|
||||||
Team.PatrolUntil = function(team, waypoints, wait, func)
|
|
||||||
Team.Do(team, function(a) Actor.PatrolUntil(a, waypoints, wait, func) end)
|
|
||||||
end
|
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
Utils = { }
|
|
||||||
|
|
||||||
Utils.Enumerate = function(netEnumerable)
|
|
||||||
local enum = netEnumerable:GetEnumerator()
|
|
||||||
return function()
|
|
||||||
if enum:MoveNext() then
|
|
||||||
return enum:get_Current()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
Utils.EnumerableFirstOrNil = function(netEnumerable, func)
|
|
||||||
for item in Utils.Enumerate(netEnumerable) do
|
|
||||||
if func(item) then
|
|
||||||
return item
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
|
|
||||||
Utils.EnumerableWhere = function(netEnumerable, func)
|
|
||||||
local ret = { }
|
|
||||||
for item in Utils.Enumerate(netEnumerable) do
|
|
||||||
if func(item) then
|
|
||||||
table.insert(ret, item)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return ret
|
|
||||||
end
|
|
||||||
|
|
||||||
Utils.EnumerableToTable = function(netEnumerable, func)
|
|
||||||
local ret = { }
|
|
||||||
for item in Utils.Enumerate(netEnumerable) do
|
|
||||||
table.insert(ret, item)
|
|
||||||
end
|
|
||||||
return ret
|
|
||||||
end
|
|
||||||
|
|
||||||
Utils.Where = function(array, func)
|
|
||||||
local ret = { }
|
|
||||||
for i, item in ipairs(array) do
|
|
||||||
if func(item) then
|
|
||||||
table.insert(ret, item)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return ret
|
|
||||||
end
|
|
||||||
|
|
||||||
Utils.All = function(array, func)
|
|
||||||
for i, item in ipairs(array) do
|
|
||||||
if not func(item) then
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
Utils.Any = function(array, func)
|
|
||||||
for i, item in ipairs(array) do
|
|
||||||
if func(item) then
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
Utils.Do = function(array, func)
|
|
||||||
for i, item in ipairs(array) do
|
|
||||||
func(item)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
Utils.Skip = function(array, n)
|
|
||||||
local ret = { }
|
|
||||||
for i, item in ipairs(array) do
|
|
||||||
if i > n then
|
|
||||||
table.insert(ret, item)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return ret
|
|
||||||
end
|
|
||||||
|
|
||||||
Utils.TableToArray = function(luaTable)
|
|
||||||
return Internal.TableToArray(luaTable)
|
|
||||||
end
|
|
||||||
|
|
||||||
Utils.Seconds = function(seconds)
|
|
||||||
local TicksPerSecond = 25
|
|
||||||
return seconds * TicksPerSecond
|
|
||||||
end
|
|
||||||
|
|
||||||
Utils.Minutes = function(minutes)
|
|
||||||
return Utils.Seconds(minutes * 60)
|
|
||||||
end
|
|
||||||
@@ -91,7 +91,6 @@ ChromeLayout:
|
|||||||
./mods/ra/chrome/musicplayer.yaml
|
./mods/ra/chrome/musicplayer.yaml
|
||||||
./mods/d2k/chrome/tooltips.yaml
|
./mods/d2k/chrome/tooltips.yaml
|
||||||
./mods/ra/chrome/assetbrowser.yaml
|
./mods/ra/chrome/assetbrowser.yaml
|
||||||
./mods/ra/chrome/irc.yaml
|
|
||||||
./mods/ra/chrome/missionbrowser.yaml
|
./mods/ra/chrome/missionbrowser.yaml
|
||||||
./mods/ra/chrome/confirmation-dialogs.yaml
|
./mods/ra/chrome/confirmation-dialogs.yaml
|
||||||
|
|
||||||
@@ -153,28 +152,28 @@ ChromeMetrics:
|
|||||||
|
|
||||||
Fonts:
|
Fonts:
|
||||||
Regular:
|
Regular:
|
||||||
Font:./FreeSans.ttf
|
Font:./mods/common/FreeSans.ttf
|
||||||
Size:14
|
Size:14
|
||||||
Bold:
|
Bold:
|
||||||
Font:./FreeSansBold.ttf
|
Font:./mods/common/FreeSansBold.ttf
|
||||||
Size:14
|
Size:14
|
||||||
Title:
|
Title:
|
||||||
Font:./mods/d2k/Dune2k.ttf
|
Font:./mods/d2k/Dune2k.ttf
|
||||||
Size:32
|
Size:32
|
||||||
MediumBold:
|
MediumBold:
|
||||||
Font:./FreeSansBold.ttf
|
Font:./mods/common/FreeSansBold.ttf
|
||||||
Size:18
|
Size:18
|
||||||
BigBold:
|
BigBold:
|
||||||
Font:./FreeSansBold.ttf
|
Font:./mods/common/FreeSansBold.ttf
|
||||||
Size:24
|
Size:24
|
||||||
Small:
|
Small:
|
||||||
Font:./FreeSans.ttf
|
Font:./mods/common/FreeSans.ttf
|
||||||
Size:12
|
Size:12
|
||||||
Tiny:
|
Tiny:
|
||||||
Font:./FreeSans.ttf
|
Font:./mods/common/FreeSans.ttf
|
||||||
Size:10
|
Size:10
|
||||||
TinyBold:
|
TinyBold:
|
||||||
Font:./FreeSansBold.ttf
|
Font:./mods/common/FreeSansBold.ttf
|
||||||
Size:10
|
Size:10
|
||||||
|
|
||||||
LuaScripts:
|
LuaScripts:
|
||||||
|
|||||||
@@ -36,7 +36,6 @@
|
|||||||
BodyOrientation:
|
BodyOrientation:
|
||||||
UpdatesPlayerStatistics:
|
UpdatesPlayerStatistics:
|
||||||
Huntable:
|
Huntable:
|
||||||
LuaScriptEvents:
|
|
||||||
Demolishable:
|
Demolishable:
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
GainsStatUpgrades:
|
GainsStatUpgrades:
|
||||||
@@ -86,7 +85,6 @@
|
|||||||
BodyOrientation:
|
BodyOrientation:
|
||||||
UpdatesPlayerStatistics:
|
UpdatesPlayerStatistics:
|
||||||
Huntable:
|
Huntable:
|
||||||
LuaScriptEvents:
|
|
||||||
Demolishable:
|
Demolishable:
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
GainsStatUpgrades:
|
GainsStatUpgrades:
|
||||||
@@ -113,7 +111,6 @@
|
|||||||
Tooltip:
|
Tooltip:
|
||||||
Name: Wreck
|
Name: Wreck
|
||||||
BodyOrientation:
|
BodyOrientation:
|
||||||
LuaScriptEvents:
|
|
||||||
TargetableUnit:
|
TargetableUnit:
|
||||||
TargetTypes: Ground
|
TargetTypes: Ground
|
||||||
RequiresForceFire: yes
|
RequiresForceFire: yes
|
||||||
@@ -144,7 +141,6 @@
|
|||||||
ProximityCaptor:
|
ProximityCaptor:
|
||||||
Types: Husk
|
Types: Husk
|
||||||
BodyOrientation:
|
BodyOrientation:
|
||||||
LuaScriptEvents:
|
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
|
|
||||||
^AircraftHusk:
|
^AircraftHusk:
|
||||||
@@ -211,7 +207,6 @@
|
|||||||
BodyOrientation:
|
BodyOrientation:
|
||||||
UpdatesPlayerStatistics:
|
UpdatesPlayerStatistics:
|
||||||
Huntable:
|
Huntable:
|
||||||
LuaScriptEvents:
|
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
DeathSounds:
|
DeathSounds:
|
||||||
Parachutable:
|
Parachutable:
|
||||||
@@ -247,7 +242,6 @@
|
|||||||
UpdatesPlayerStatistics:
|
UpdatesPlayerStatistics:
|
||||||
Huntable:
|
Huntable:
|
||||||
AttackMove:
|
AttackMove:
|
||||||
LuaScriptEvents:
|
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
GainsStatUpgrades:
|
GainsStatUpgrades:
|
||||||
SelfHealing@ELITE:
|
SelfHealing@ELITE:
|
||||||
@@ -306,7 +300,6 @@
|
|||||||
UpdatesPlayerStatistics:
|
UpdatesPlayerStatistics:
|
||||||
WithCrumbleOverlay:
|
WithCrumbleOverlay:
|
||||||
Huntable:
|
Huntable:
|
||||||
LuaScriptEvents:
|
|
||||||
Demolishable:
|
Demolishable:
|
||||||
DamagedWithoutFoundation:
|
DamagedWithoutFoundation:
|
||||||
ThrowsShrapnel:
|
ThrowsShrapnel:
|
||||||
|
|||||||
@@ -31,22 +31,22 @@ ChromeMetrics:
|
|||||||
|
|
||||||
Fonts:
|
Fonts:
|
||||||
Regular:
|
Regular:
|
||||||
Font:./FreeSans.ttf
|
Font:./mods/common/FreeSans.ttf
|
||||||
Size:14
|
Size:14
|
||||||
Bold:
|
Bold:
|
||||||
Font:./FreeSansBold.ttf
|
Font:./mods/common/FreeSansBold.ttf
|
||||||
Size:14
|
Size:14
|
||||||
BigBold:
|
BigBold:
|
||||||
Font:./FreeSansBold.ttf
|
Font:./mods/common/FreeSansBold.ttf
|
||||||
Size:24
|
Size:24
|
||||||
MediumBold:
|
MediumBold:
|
||||||
Font:./FreeSansBold.ttf
|
Font:./mods/common/FreeSansBold.ttf
|
||||||
Size:18
|
Size:18
|
||||||
Tiny:
|
Tiny:
|
||||||
Font:./FreeSans.ttf
|
Font:./mods/common/FreeSans.ttf
|
||||||
Size:10
|
Size:10
|
||||||
TinyBold:
|
TinyBold:
|
||||||
Font:./FreeSansBold.ttf
|
Font:./mods/common/FreeSansBold.ttf
|
||||||
Size:10
|
Size:10
|
||||||
|
|
||||||
LobbyDefaults:
|
LobbyDefaults:
|
||||||
|
|||||||
@@ -1,69 +0,0 @@
|
|||||||
Container@SERVERBROWSER_IRC:
|
|
||||||
Logic: IrcLogic
|
|
||||||
Width: 700
|
|
||||||
Height: 250
|
|
||||||
Children:
|
|
||||||
Container@IRC_CONTAINER:
|
|
||||||
Width: PARENT_RIGHT
|
|
||||||
Height: PARENT_BOTTOM
|
|
||||||
Children:
|
|
||||||
ScrollPanel@HISTORY_PANEL:
|
|
||||||
Width: 565
|
|
||||||
Height: PARENT_BOTTOM - 30
|
|
||||||
ItemSpacing: 5
|
|
||||||
Label@HISTORY_TEMPLATE:
|
|
||||||
X: 5
|
|
||||||
Width: 530
|
|
||||||
Height: 25
|
|
||||||
WordWrap: True
|
|
||||||
TextField@INPUT_BOX:
|
|
||||||
Y: PARENT_BOTTOM - 25
|
|
||||||
Width: 565
|
|
||||||
Height: 25
|
|
||||||
ScrollPanel@NICKNAME_PANEL:
|
|
||||||
X: 570
|
|
||||||
Width: 130
|
|
||||||
Height: PARENT_BOTTOM - 30
|
|
||||||
Label@NICKNAME_TEMPLATE:
|
|
||||||
X: 5
|
|
||||||
Button@DISCONNECT_BUTTON:
|
|
||||||
X: 570
|
|
||||||
Y: PARENT_BOTTOM - 25
|
|
||||||
Width: 130
|
|
||||||
Height: 25
|
|
||||||
Text: Disconnect
|
|
||||||
Font: Bold
|
|
||||||
Background@IRC_CONNECT_BG:
|
|
||||||
Width: PARENT_RIGHT
|
|
||||||
Height: PARENT_BOTTOM
|
|
||||||
Background: scrollpanel-bg
|
|
||||||
Children:
|
|
||||||
Label@GLOBAL_CHAT_LABEL:
|
|
||||||
Y: PARENT_BOTTOM / 4
|
|
||||||
Width: PARENT_RIGHT
|
|
||||||
Align: Center
|
|
||||||
Text: Global Chat
|
|
||||||
Font: Bold
|
|
||||||
Label@NICKNAME_LABEL:
|
|
||||||
X: 200
|
|
||||||
Y: PARENT_BOTTOM / 4 + 35
|
|
||||||
Text: Nickname:
|
|
||||||
TextField@NICKNAME_BOX:
|
|
||||||
X: 270
|
|
||||||
Y: PARENT_BOTTOM / 4 + 25
|
|
||||||
Width: 150
|
|
||||||
Height: 25
|
|
||||||
Checkbox@CONNECT_AUTOMATICALLY_CHECKBOX:
|
|
||||||
X: 270
|
|
||||||
Y: PARENT_BOTTOM / 4 + 75
|
|
||||||
Height: 20
|
|
||||||
Width: 180
|
|
||||||
Text: Connect Automatically
|
|
||||||
Button@CONNECT_BUTTON:
|
|
||||||
X: 430
|
|
||||||
Y: PARENT_BOTTOM / 4 + 25
|
|
||||||
Width: 100
|
|
||||||
Height: 25
|
|
||||||
Text: Connect
|
|
||||||
Font: Bold
|
|
||||||
|
|
||||||
@@ -104,7 +104,6 @@ ChromeLayout:
|
|||||||
./mods/ra/chrome/musicplayer.yaml
|
./mods/ra/chrome/musicplayer.yaml
|
||||||
./mods/ra/chrome/tooltips.yaml
|
./mods/ra/chrome/tooltips.yaml
|
||||||
./mods/ra/chrome/assetbrowser.yaml
|
./mods/ra/chrome/assetbrowser.yaml
|
||||||
./mods/ra/chrome/irc.yaml
|
|
||||||
./mods/ra/chrome/missionbrowser.yaml
|
./mods/ra/chrome/missionbrowser.yaml
|
||||||
./mods/ra/chrome/confirmation-dialogs.yaml
|
./mods/ra/chrome/confirmation-dialogs.yaml
|
||||||
|
|
||||||
@@ -169,28 +168,28 @@ ChromeMetrics:
|
|||||||
|
|
||||||
Fonts:
|
Fonts:
|
||||||
Regular:
|
Regular:
|
||||||
Font:./FreeSans.ttf
|
Font:./mods/common/FreeSans.ttf
|
||||||
Size:14
|
Size:14
|
||||||
Bold:
|
Bold:
|
||||||
Font:./FreeSansBold.ttf
|
Font:./mods/common/FreeSansBold.ttf
|
||||||
Size:14
|
Size:14
|
||||||
Title:
|
Title:
|
||||||
Font:./mods/ra/ZoodRangmah.ttf
|
Font:./mods/ra/ZoodRangmah.ttf
|
||||||
Size:48
|
Size:48
|
||||||
MediumBold:
|
MediumBold:
|
||||||
Font:./FreeSansBold.ttf
|
Font:./mods/common/FreeSansBold.ttf
|
||||||
Size:18
|
Size:18
|
||||||
BigBold:
|
BigBold:
|
||||||
Font:./FreeSansBold.ttf
|
Font:./mods/common/FreeSansBold.ttf
|
||||||
Size:24
|
Size:24
|
||||||
Small:
|
Small:
|
||||||
Font:./FreeSans.ttf
|
Font:./mods/common/FreeSans.ttf
|
||||||
Size:12
|
Size:12
|
||||||
Tiny:
|
Tiny:
|
||||||
Font:./FreeSans.ttf
|
Font:./mods/common/FreeSans.ttf
|
||||||
Size:10
|
Size:10
|
||||||
TinyBold:
|
TinyBold:
|
||||||
Font:./FreeSansBold.ttf
|
Font:./mods/common/FreeSansBold.ttf
|
||||||
Size:10
|
Size:10
|
||||||
|
|
||||||
LuaScripts:
|
LuaScripts:
|
||||||
|
|||||||
@@ -46,7 +46,6 @@
|
|||||||
EjectInAir: false
|
EjectInAir: false
|
||||||
AllowUnsuitableCell: false
|
AllowUnsuitableCell: false
|
||||||
Huntable:
|
Huntable:
|
||||||
LuaScriptEvents:
|
|
||||||
Capturable:
|
Capturable:
|
||||||
Type: vehicle
|
Type: vehicle
|
||||||
CaptureThreshold: 1
|
CaptureThreshold: 1
|
||||||
@@ -117,7 +116,6 @@
|
|||||||
EjectInAir: false
|
EjectInAir: false
|
||||||
AllowUnsuitableCell: false
|
AllowUnsuitableCell: false
|
||||||
Huntable:
|
Huntable:
|
||||||
LuaScriptEvents:
|
|
||||||
Capturable:
|
Capturable:
|
||||||
Type: vehicle
|
Type: vehicle
|
||||||
CaptureThreshold: 1
|
CaptureThreshold: 1
|
||||||
@@ -199,7 +197,6 @@
|
|||||||
Upgrades: hospitalheal
|
Upgrades: hospitalheal
|
||||||
Prerequisites: hosp
|
Prerequisites: hosp
|
||||||
Huntable:
|
Huntable:
|
||||||
LuaScriptEvents:
|
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
DeathSounds@NORMAL:
|
DeathSounds@NORMAL:
|
||||||
DeathTypes: 1, 2, 3, 4
|
DeathTypes: 1, 2, 3, 4
|
||||||
@@ -259,7 +256,6 @@
|
|||||||
Tooltip:
|
Tooltip:
|
||||||
GenericName: Ship
|
GenericName: Ship
|
||||||
Huntable:
|
Huntable:
|
||||||
LuaScriptEvents:
|
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
GainsStatUpgrades:
|
GainsStatUpgrades:
|
||||||
SelfHealing@ELITE:
|
SelfHealing@ELITE:
|
||||||
@@ -311,7 +307,6 @@
|
|||||||
Tooltip:
|
Tooltip:
|
||||||
GenericName: Plane
|
GenericName: Plane
|
||||||
Huntable:
|
Huntable:
|
||||||
LuaScriptEvents:
|
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
GainsStatUpgrades:
|
GainsStatUpgrades:
|
||||||
SelfHealing@ELITE:
|
SelfHealing@ELITE:
|
||||||
@@ -383,7 +378,6 @@
|
|||||||
GpsDot:
|
GpsDot:
|
||||||
String: Structure
|
String: Structure
|
||||||
Huntable:
|
Huntable:
|
||||||
LuaScriptEvents:
|
|
||||||
Demolishable:
|
Demolishable:
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
UpgradeManager:
|
UpgradeManager:
|
||||||
@@ -435,7 +429,6 @@
|
|||||||
Guardable:
|
Guardable:
|
||||||
BodyOrientation:
|
BodyOrientation:
|
||||||
FrozenUnderFog:
|
FrozenUnderFog:
|
||||||
LuaScriptEvents:
|
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
|
|
||||||
^TechBuilding:
|
^TechBuilding:
|
||||||
@@ -544,7 +537,6 @@
|
|||||||
BodyOrientation:
|
BodyOrientation:
|
||||||
FrozenUnderFog:
|
FrozenUnderFog:
|
||||||
StartsRevealed: true
|
StartsRevealed: true
|
||||||
LuaScriptEvents:
|
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
|
|
||||||
^Husk:
|
^Husk:
|
||||||
@@ -563,7 +555,6 @@
|
|||||||
BelowUnits:
|
BelowUnits:
|
||||||
BodyOrientation:
|
BodyOrientation:
|
||||||
Chronoshiftable:
|
Chronoshiftable:
|
||||||
LuaScriptEvents:
|
|
||||||
TargetableUnit:
|
TargetableUnit:
|
||||||
TargetTypes: Ground
|
TargetTypes: Ground
|
||||||
RequiresForceFire: true
|
RequiresForceFire: true
|
||||||
@@ -621,7 +612,6 @@
|
|||||||
Type: Concrete
|
Type: Concrete
|
||||||
AutoTargetIgnore:
|
AutoTargetIgnore:
|
||||||
BodyOrientation:
|
BodyOrientation:
|
||||||
LuaScriptEvents:
|
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
|
|
||||||
^Rock:
|
^Rock:
|
||||||
@@ -643,7 +633,6 @@
|
|||||||
BodyOrientation:
|
BodyOrientation:
|
||||||
FrozenUnderFog:
|
FrozenUnderFog:
|
||||||
StartsRevealed: true
|
StartsRevealed: true
|
||||||
LuaScriptEvents:
|
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
|
|
||||||
^DesertCivBuilding:
|
^DesertCivBuilding:
|
||||||
|
|||||||
@@ -133,7 +133,6 @@ ChromeLayout:
|
|||||||
./mods/ra/chrome/musicplayer.yaml
|
./mods/ra/chrome/musicplayer.yaml
|
||||||
./mods/ra/chrome/tooltips.yaml
|
./mods/ra/chrome/tooltips.yaml
|
||||||
./mods/ra/chrome/assetbrowser.yaml
|
./mods/ra/chrome/assetbrowser.yaml
|
||||||
./mods/ra/chrome/irc.yaml
|
|
||||||
./mods/ra/chrome/missionbrowser.yaml
|
./mods/ra/chrome/missionbrowser.yaml
|
||||||
./mods/ra/chrome/confirmation-dialogs.yaml
|
./mods/ra/chrome/confirmation-dialogs.yaml
|
||||||
|
|
||||||
@@ -197,25 +196,25 @@ ChromeMetrics:
|
|||||||
|
|
||||||
Fonts:
|
Fonts:
|
||||||
Regular:
|
Regular:
|
||||||
Font:./FreeSans.ttf
|
Font:./mods/common/FreeSans.ttf
|
||||||
Size:14
|
Size:14
|
||||||
Bold:
|
Bold:
|
||||||
Font:./FreeSansBold.ttf
|
Font:./mods/common/FreeSansBold.ttf
|
||||||
Size:14
|
Size:14
|
||||||
Title:
|
Title:
|
||||||
Font:./FreeSansBold.ttf
|
Font:./mods/common/FreeSansBold.ttf
|
||||||
Size:32
|
Size:32
|
||||||
BigBold:
|
BigBold:
|
||||||
Font:./FreeSansBold.ttf
|
Font:./mods/common/FreeSansBold.ttf
|
||||||
Size:24
|
Size:24
|
||||||
Small:
|
Small:
|
||||||
Font:./FreeSans.ttf
|
Font:./mods/common/FreeSans.ttf
|
||||||
Size:12
|
Size:12
|
||||||
Tiny:
|
Tiny:
|
||||||
Font:./FreeSans.ttf
|
Font:./mods/common/FreeSans.ttf
|
||||||
Size:10
|
Size:10
|
||||||
TinyBold:
|
TinyBold:
|
||||||
Font:./FreeSansBold.ttf
|
Font:./mods/common/FreeSansBold.ttf
|
||||||
Size:10
|
Size:10
|
||||||
|
|
||||||
LuaScripts:
|
LuaScripts:
|
||||||
|
|||||||
@@ -40,7 +40,6 @@
|
|||||||
Range: 3
|
Range: 3
|
||||||
BodyOrientation:
|
BodyOrientation:
|
||||||
Huntable:
|
Huntable:
|
||||||
LuaScriptEvents:
|
|
||||||
Demolishable:
|
Demolishable:
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
WithMakeAnimation:
|
WithMakeAnimation:
|
||||||
@@ -84,7 +83,6 @@
|
|||||||
SellSounds: cashturn.aud
|
SellSounds: cashturn.aud
|
||||||
UpdatesPlayerStatistics:
|
UpdatesPlayerStatistics:
|
||||||
BodyOrientation:
|
BodyOrientation:
|
||||||
LuaScriptEvents:
|
|
||||||
Demolishable:
|
Demolishable:
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
UpgradeManager:
|
UpgradeManager:
|
||||||
@@ -158,7 +156,6 @@
|
|||||||
Guardable:
|
Guardable:
|
||||||
BodyOrientation:
|
BodyOrientation:
|
||||||
Huntable:
|
Huntable:
|
||||||
LuaScriptEvents:
|
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
DeathSounds@NORMAL:
|
DeathSounds@NORMAL:
|
||||||
DeathTypes: 1, 2, 3
|
DeathTypes: 1, 2, 3
|
||||||
@@ -255,7 +252,6 @@
|
|||||||
BodyOrientation:
|
BodyOrientation:
|
||||||
CameraPitch: 90
|
CameraPitch: 90
|
||||||
Huntable:
|
Huntable:
|
||||||
LuaScriptEvents:
|
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
Explodes:
|
Explodes:
|
||||||
Weapon: UnitExplodeSmall
|
Weapon: UnitExplodeSmall
|
||||||
@@ -328,7 +324,6 @@
|
|||||||
BodyOrientation:
|
BodyOrientation:
|
||||||
CameraPitch: 90
|
CameraPitch: 90
|
||||||
Huntable:
|
Huntable:
|
||||||
LuaScriptEvents:
|
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
Explodes:
|
Explodes:
|
||||||
Weapon: UnitExplodeSmall
|
Weapon: UnitExplodeSmall
|
||||||
@@ -388,7 +383,6 @@
|
|||||||
BodyOrientation:
|
BodyOrientation:
|
||||||
CameraPitch: 90
|
CameraPitch: 90
|
||||||
Huntable:
|
Huntable:
|
||||||
LuaScriptEvents:
|
|
||||||
ScriptTriggers:
|
ScriptTriggers:
|
||||||
Guard:
|
Guard:
|
||||||
Guardable:
|
Guardable:
|
||||||
@@ -408,7 +402,6 @@
|
|||||||
BodyOrientation:
|
BodyOrientation:
|
||||||
FrozenUnderFog:
|
FrozenUnderFog:
|
||||||
StartsRevealed: true
|
StartsRevealed: true
|
||||||
LuaScriptEvents:
|
|
||||||
SeedsResource:
|
SeedsResource:
|
||||||
ResourceType: Tiberium
|
ResourceType: Tiberium
|
||||||
Interval: 55
|
Interval: 55
|
||||||
|
|||||||
@@ -31,11 +31,9 @@ markdown Lua-API.md > Lua-API.html
|
|||||||
|
|
||||||
# List of files that are packaged on all platforms
|
# List of files that are packaged on all platforms
|
||||||
FILES=('OpenRA.Game.exe' 'OpenRA.Editor.exe' 'OpenRA.Utility.exe' 'OpenRA.CrashDialog.exe' \
|
FILES=('OpenRA.Game.exe' 'OpenRA.Editor.exe' 'OpenRA.Utility.exe' 'OpenRA.CrashDialog.exe' \
|
||||||
'OpenRA.Renderer.Sdl2.dll' 'OpenRA.Renderer.Null.dll' 'OpenRA.Irc.dll' \
|
'OpenRA.Renderer.Sdl2.dll' 'OpenRA.Renderer.Null.dll' \
|
||||||
'FreeSans.ttf' 'FreeSansBold.ttf' 'lua' \
|
'lua' 'glsl' 'mods/common' 'mods/ra' 'mods/cnc' 'mods/d2k' 'mods/modchooser' \
|
||||||
'glsl' 'mods/common' 'mods/ra' 'mods/cnc' 'mods/d2k' 'mods/modchooser' \
|
'AUTHORS' 'COPYING' 'README.html' 'CONTRIBUTING.html' 'DOCUMENTATION.html' 'CHANGELOG.html' \
|
||||||
'AUTHORS' 'COPYING' \
|
|
||||||
'README.html' 'CONTRIBUTING.html' 'DOCUMENTATION.html' 'CHANGELOG.html' \
|
|
||||||
'global mix database.dat' 'GeoLite2-Country.mmdb')
|
'global mix database.dat' 'GeoLite2-Country.mmdb')
|
||||||
|
|
||||||
echo "Copying files..."
|
echo "Copying files..."
|
||||||
@@ -58,11 +56,7 @@ cp thirdparty/SDL2-CS* packaging/built
|
|||||||
# Mono.NAT for UPnP support
|
# Mono.NAT for UPnP support
|
||||||
cp thirdparty/Mono.Nat.dll packaging/built
|
cp thirdparty/Mono.Nat.dll packaging/built
|
||||||
|
|
||||||
# (legacy) Lua
|
# Eluant (Lua integration)
|
||||||
cp thirdparty/KopiLua.dll packaging/built
|
|
||||||
cp thirdparty/NLua.dll packaging/built
|
|
||||||
|
|
||||||
# Eluant (new lua)
|
|
||||||
cp thirdparty/Eluant* packaging/built
|
cp thirdparty/Eluant* packaging/built
|
||||||
|
|
||||||
# GeoIP database access
|
# GeoIP database access
|
||||||
|
|||||||
@@ -70,7 +70,6 @@ Section "Game" GAME
|
|||||||
File "${SRCDIR}\OpenRA.CrashDialog.exe"
|
File "${SRCDIR}\OpenRA.CrashDialog.exe"
|
||||||
File "${SRCDIR}\OpenRA.Renderer.Null.dll"
|
File "${SRCDIR}\OpenRA.Renderer.Null.dll"
|
||||||
File "${SRCDIR}\OpenRA.Renderer.Sdl2.dll"
|
File "${SRCDIR}\OpenRA.Renderer.Sdl2.dll"
|
||||||
File "${SRCDIR}\OpenRA.Irc.dll"
|
|
||||||
File "${SRCDIR}\ICSharpCode.SharpZipLib.dll"
|
File "${SRCDIR}\ICSharpCode.SharpZipLib.dll"
|
||||||
File "${SRCDIR}\FuzzyLogicLibrary.dll"
|
File "${SRCDIR}\FuzzyLogicLibrary.dll"
|
||||||
File "${SRCDIR}\Mono.Nat.dll"
|
File "${SRCDIR}\Mono.Nat.dll"
|
||||||
@@ -80,7 +79,6 @@ Section "Game" GAME
|
|||||||
File "${SRCDIR}\CHANGELOG.html"
|
File "${SRCDIR}\CHANGELOG.html"
|
||||||
File "${SRCDIR}\CONTRIBUTING.html"
|
File "${SRCDIR}\CONTRIBUTING.html"
|
||||||
File "${SRCDIR}\DOCUMENTATION.html"
|
File "${SRCDIR}\DOCUMENTATION.html"
|
||||||
File "${SRCDIR}\*.ttf"
|
|
||||||
File "${SRCDIR}\OpenRA.ico"
|
File "${SRCDIR}\OpenRA.ico"
|
||||||
File "${SRCDIR}\SharpFont.dll"
|
File "${SRCDIR}\SharpFont.dll"
|
||||||
File "${SRCDIR}\SDL2-CS.dll"
|
File "${SRCDIR}\SDL2-CS.dll"
|
||||||
@@ -90,8 +88,6 @@ Section "Game" GAME
|
|||||||
File "${SRCDIR}\Newtonsoft.Json.dll"
|
File "${SRCDIR}\Newtonsoft.Json.dll"
|
||||||
File "${SRCDIR}\RestSharp.dll"
|
File "${SRCDIR}\RestSharp.dll"
|
||||||
File "${SRCDIR}\GeoLite2-Country.mmdb"
|
File "${SRCDIR}\GeoLite2-Country.mmdb"
|
||||||
File "${SRCDIR}\KopiLua.dll"
|
|
||||||
File "${SRCDIR}\NLua.dll"
|
|
||||||
File "${SRCDIR}\eluant.dll"
|
File "${SRCDIR}\eluant.dll"
|
||||||
File "${DEPSDIR}\soft_oal.dll"
|
File "${DEPSDIR}\soft_oal.dll"
|
||||||
File "${DEPSDIR}\SDL2.dll"
|
File "${DEPSDIR}\SDL2.dll"
|
||||||
@@ -192,7 +188,6 @@ Function ${UN}Clean
|
|||||||
Delete $INSTDIR\OpenRA.Editor.exe
|
Delete $INSTDIR\OpenRA.Editor.exe
|
||||||
Delete $INSTDIR\OpenRA.Renderer.Null.dll
|
Delete $INSTDIR\OpenRA.Renderer.Null.dll
|
||||||
Delete $INSTDIR\OpenRA.Renderer.Sdl2.dll
|
Delete $INSTDIR\OpenRA.Renderer.Sdl2.dll
|
||||||
Delete $INSTDIR\OpenRA.Irc.dll
|
|
||||||
Delete $INSTDIR\ICSharpCode.SharpZipLib.dll
|
Delete $INSTDIR\ICSharpCode.SharpZipLib.dll
|
||||||
Delete $INSTDIR\FuzzyLogicLibrary.dll
|
Delete $INSTDIR\FuzzyLogicLibrary.dll
|
||||||
Delete $INSTDIR\Mono.Nat.dll
|
Delete $INSTDIR\Mono.Nat.dll
|
||||||
@@ -204,7 +199,6 @@ Function ${UN}Clean
|
|||||||
Delete $INSTDIR\CONTRIBUTING.html
|
Delete $INSTDIR\CONTRIBUTING.html
|
||||||
Delete $INSTDIR\DOCUMENTATION.html
|
Delete $INSTDIR\DOCUMENTATION.html
|
||||||
Delete $INSTDIR\OpenRA.ico
|
Delete $INSTDIR\OpenRA.ico
|
||||||
Delete $INSTDIR\*.ttf
|
|
||||||
Delete "$INSTDIR\global mix database.dat"
|
Delete "$INSTDIR\global mix database.dat"
|
||||||
Delete $INSTDIR\MaxMind.Db.dll
|
Delete $INSTDIR\MaxMind.Db.dll
|
||||||
Delete $INSTDIR\MaxMind.GeoIP2.dll
|
Delete $INSTDIR\MaxMind.GeoIP2.dll
|
||||||
@@ -212,8 +206,6 @@ Function ${UN}Clean
|
|||||||
Delete $INSTDIR\RestSharp.dll
|
Delete $INSTDIR\RestSharp.dll
|
||||||
Delete $INSTDIR\GeoLite2-Country.mmdb
|
Delete $INSTDIR\GeoLite2-Country.mmdb
|
||||||
Delete $INSTDIR\KopiLua.dll
|
Delete $INSTDIR\KopiLua.dll
|
||||||
Delete $INSTDIR\NLua.dll
|
|
||||||
Delete $INSTDIR\SDL2-CS.dll
|
|
||||||
Delete $INSTDIR\soft_oal.dll
|
Delete $INSTDIR\soft_oal.dll
|
||||||
Delete $INSTDIR\SDL2.dll
|
Delete $INSTDIR\SDL2.dll
|
||||||
Delete $INSTDIR\lua51.dll
|
Delete $INSTDIR\lua51.dll
|
||||||
|
|||||||
BIN
thirdparty/KopiLua.dll
vendored
BIN
thirdparty/KopiLua.dll
vendored
Binary file not shown.
BIN
thirdparty/NLua.dll
vendored
BIN
thirdparty/NLua.dll
vendored
Binary file not shown.
Reference in New Issue
Block a user