示例#1
0
        public static string[] Tokenize(string line)
        {
            GameInterface.Cmd_TokenizeString(line);
            var argc = GameInterface.Cmd_Argc();

            if (argc == 0)
            {
                return(new string[0]);
            }
            var tokenized = new string[argc];

            for (int i = 0; i < argc; i++)
            {
                tokenized[i] = GameInterface.Cmd_Argv(i);
            }
            GameInterface.Cmd_EndTokenizedString();
            return(tokenized);
        }
示例#2
0
        public static bool HandleServerCommand(string commandName)
        {
            string[] args = new string[GameInterface.Cmd_Argc()];

            for (int i = 0; i < args.Length; i++)
            {
                args[i] = GameInterface.Cmd_Argv(i);
            }

            bool eat = false;

            ScriptProcessor.RunAll(script =>
            {
                eat = script.OnServerCommand(commandName.ToLowerInvariant(), args);
            });

            return(eat);
        }
示例#3
0
        public static void HandleCall(int entityRef, CallType funcID)
        {
            var entity  = Entity.GetEntity(entityRef);
            int numArgs = GameInterface.Notify_NumArgs();
            var paras   = CollectParameters(numArgs);

            switch (funcID)
            {
            case CallType.StartGameType:
                ScriptProcessor.RunAll(script => script.OnStartGameType());
                break;

            case CallType.PlayerConnect:
                //ScriptProcessor.RunAll(script => script.OnPlayerConnect(entity));
                break;

            case CallType.PlayerDisconnect:
                ScriptProcessor.RunAll(script => script.OnPlayerDisconnect(entity));
                break;

            case CallType.PlayerDamage:
                if (paras[6].IsNull)
                {
                    paras[6] = new Vector3(0, 0, 0);
                }

                if (paras[7].IsNull)
                {
                    paras[7] = new Vector3(0, 0, 0);
                }

                ScriptProcessor.RunAll(script => script.OnPlayerDamage(entity, paras[0].As <Entity>(), paras[1].As <Entity>(), paras[2].As <int>(), paras[3].As <int>(), paras[4].As <string>(), paras[5].As <string>(), paras[6].As <Vector3>(), paras[7].As <Vector3>(), paras[8].As <string>()));
                break;

            case CallType.PlayerKilled:
                if (paras[5].IsNull)
                {
                    paras[5] = new Vector3(0, 0, 0);
                }

                ScriptProcessor.RunAll(script => script.OnPlayerKilled(entity, paras[0].As <Entity>(), paras[1].As <Entity>(), paras[2].As <int>(), paras[3].As <string>(), paras[4].As <string>(), paras[5].As <Vector3>(), paras[6].As <string>()));
                break;
            }
        }
示例#4
0
        public WebHome()
            : base()
        {
            Get["/"] = parameters =>
            {
                // fetch stat points
                var oneDayAgo  = DateTime.UtcNow - new TimeSpan(24, 0, 0);
                var statPoints = WebBaseScript.Database.Table <PlayerCountStatisticPoint>().Where(p => p.Time >= oneDayAgo);

                return(View["Index", new
                            {
                                StatPoints = statPoints,
                                MapName = GameInterface.GetDvar("mapname", ""),
                                GameType = GameInterface.GetDvar("g_gametype", "dm"),
                                PlayerLimit = GameInterface.GetDvar("sv_maxclients", "0"),
                                PlayerCount = WebBaseScript.NumPlayers
                            }]);
            };
        }
示例#5
0
        public static bool HandleClientCommand(string commandName, int entity)
        {
            string[] args = new string[GameInterface.Cmd_Argc_sv()];

            for (int i = 0; i < args.Length; i++)
            {
                args[i] = GameInterface.Cmd_Argv_sv(i);
            }

            Entity entObj  = Entity.GetEntity(entity);
            bool   handled = false;

            ScriptProcessor.RunAll(script =>
            {
                handled = script.OnClientCommand(entObj, commandName.ToLowerInvariant(), args);
            });

            return(handled);
        }
示例#6
0
        private static Parameter[] CollectParameters(int numArgs)
        {
            var paras = new Parameter[numArgs];

            for (int i = 0; i < numArgs; i++)
            {
                var    ptype = GameInterface.Script_GetType(i);
                object value = null;

                switch (ptype)
                {
                case VariableType.Integer:
                    value = GameInterface.Script_GetInt(i);
                    break;

                case VariableType.String:
                    value = Marshal.PtrToStringAnsi(GameInterface.Script_GetString(i));
                    break;

                case VariableType.Float:
                    value = GameInterface.Script_GetFloat(i);
                    break;

                case VariableType.Entity:
                    value = Entity.GetEntity(GameInterface.Script_GetEntRef(i));
                    break;

                case VariableType.Vector:
                    Vector3 v;
                    GameInterface.Script_GetVector(i, out v);
                    value = v;
                    break;

                default:
                    break;
                }

                paras[i] = new Parameter(ptype, value);
            }

            return(paras);
        }
示例#7
0
        public static bool HandleServerCommand(string commandName)
        {
            var args = new string[GameInterface.Cmd_Argc()];

            for (var i = 0; i < args.Length; i++)
            {
                args[i] = GameInterface.Cmd_Argv(i);
            }

            var eat = false;

            ScriptProcessor.RunAll(script =>
            {
                var success = script.ProcessServerCommand(commandName.ToLowerInvariant(), args);
                if (success)
                {
                    eat = true;
                }
            });
            return(eat);
        }
示例#8
0
        public T GetField <T>(string name)
        {
            name = name.ToLowerInvariant();

            if (!_fieldNames.ContainsKey(name))
            {
                return((T)_privateFields[name]);
            }

            object returnValue = null;
            int    fieldID     = _fieldNames[name];

            GameInterface.Script_GetField(_entRef, fieldID);

            switch (GameInterface.Script_GetType(0))
            {
            case VariableType.Integer:
                returnValue = GameInterface.Script_GetInt(0);
                break;

            case VariableType.Float:
                returnValue = GameInterface.Script_GetFloat(0);
                break;

            case VariableType.String:
                returnValue = GameInterface.Script_GetString(0);
                break;

            case VariableType.Vector:
                Vector3 outValue;
                GameInterface.Script_GetVector(0, out outValue);
                returnValue = outValue;
                break;
            }

            GameInterface.Script_CleanReturnStack();

            return((T)Convert.ChangeType(returnValue, typeof(T)));
        }
示例#9
0
        public static void HandleNotify(int entity)
        {
            string type    = Marshal.PtrToStringAnsi(GameInterface.Notify_Type());
            int    numArgs = GameInterface.Notify_NumArgs();

            var paras = CollectParameters(numArgs);

            if (type != "touch")
            {
                // dispatch the thingy
                if (GameInterface.Script_GetObjectType(entity) == 21) // actual entity
                {
                    var entRef = GameInterface.Script_ToEntRef(entity);
                    var entObj = Entity.GetEntity(entRef);

                    //Log.Write(LogLevel.Trace, "{0} on object {1}, entRef {2} (entity object {3})", type, entity, entRef, entObj);

                    entObj.HandleNotify(entity, type, paras);
                }

                ScriptProcessor.RunAll(script => script.HandleNotify(entity, type, paras));
            }
        }
示例#10
0
        public static bool HandleClientCommand(string commandName, int entity)
        {
            var args = new string[GameInterface.Cmd_Argc_sv()];

            for (var i = 0; i < args.Length; i++)
            {
                args[i] = GameInterface.Cmd_Argv_sv(i);
            }

            var entObj  = Entity.GetEntity(entity);
            var handled = false;

            ScriptProcessor.RunAll(script =>
            {
                var success = script.ProcessClientCommand(commandName.ToLowerInvariant(), entObj, args);
                if (success)
                {
                    handled = true;
                }
            });

            return(handled);
        }
示例#11
0
        public static void RotateMap()
        {
            try
            {
                if (CurrentPlaylist.Count == 0)
                {
                    BuildPlaylist(GameInterface.GetDvar("mapname", ""));

                    if (CurrentPlaylist.Count == 0)
                    {
                        Utilities.ExecuteCommand("map_restart");
                        return;
                    }
                }

                var nextEntry = CurrentPlaylist[0];
                CurrentPlaylist.RemoveAt(0);

                GameType = nextEntry.GameType;

                ApplyVariables(Rules);
                ApplyVariables(Values);
                ApplyVariables(nextEntry.GameType.Rules);
                ApplyVariables(nextEntry.GameType.Values);
                ApplyVariables(Playlist.Rules);
                ApplyVariables(Playlist.Values);

                Utilities.ExecuteCommand("ui_gametype {0}; g_gametype {1}; map {2}; ", nextEntry.GameType.Script, nextEntry.GameType.Script, nextEntry.Map);
            }
            catch (Exception ex)
            {
                Log.Error("Error during map rotation: " + ex.ToString());

                Utilities.ExecuteCommand("map_restart");
            }
        }
示例#12
0
        public static bool HandleClientConnect(string connectString)
        {
            bool eat = false;

            try
            {
                string playerName = connectString.Split(new[] { "name" }, StringSplitOptions.None)[1];
                string playerHWID = connectString.Split(new[] { "HWID" }, StringSplitOptions.None)[1];
                string playerXUID = connectString.Split(new[] { "XUID" }, StringSplitOptions.None)[1];
                string playerIP   = connectString.Split(new[] { "IP-string" }, StringSplitOptions.None)[1];
                string playerSID  = connectString.Split(new[] { "steamid" }, StringSplitOptions.None)[1];
                string playerXNA  = connectString.Split(new[] { "xnaddr" }, StringSplitOptions.None)[1];

                ScriptProcessor.RunAll(script =>
                {
                    string error = script.OnPlayerRequestConnection(playerName, playerHWID, playerXUID, playerIP, playerSID, playerXNA);

                    if (string.IsNullOrEmpty(error))
                    {
                        return;
                    }

                    eat = true;

                    GameInterface.SetConnectErrorMsg(error);
                });

                return(eat);
            }
            catch (Exception ex)
            {
                Utilities.PrintToConsole($"[InfinityScript] An error occurred during the handling of a client connecting!: {ex.Message}\nAdditional Info:{ex.Data}");

                return(false);
            }
        }
示例#13
0
 public static void RawSayTo(int entref, string message)
 {
     GameInterface.SV_GameSendServerCommand(entref, -1, message);
 }
示例#14
0
        public static byte[] HandleWebRequest(string method, string uri, string query, int numHeaders, int remoteIP)
        {
            var headers = new Dictionary <string, string>();

            for (int i = 0; i < numHeaders; i++)
            {
                var header      = GameInterface.GetHTTPHeader(i);
                var headerParts = header.Split(new[] { ": " }, 2, StringSplitOptions.None);

                if (headerParts.Length < 2)
                {
                    continue;
                }

                headers[headerParts[0]] = headerParts[1];
            }

            try
            {
                return(WebManager.HandleRequest(method, uri.Split('?')[0], query, headers, new IPAddress(BitConverter.GetBytes(IPAddress.NetworkToHostOrder(remoteIP)))));
            }
            catch (Exception ex)
            {
                if (ex.InnerException != null)
                {
                    Log.Error(ex.InnerException);
                }

                Log.Error(ex);
                return(Encoding.UTF8.GetBytes("HTTP/1.0 500 Internal Server Error\r\n\r\n" + ex.Message));
            }

            /*var requestData = new Dictionary<string, object>();
             * requestData["owin.RequestBody"] = Stream.Null;
             * requestData["owin.RequestHeaders"] = headers;
             * requestData["owin.RequestMethod"] = method;
             * requestData["owin.RequestPath"] = uri.Substring(1).Split('?')[0];
             * requestData["owin.RequestPathBase"] = "/";
             * requestData["owin.RequestProtocol"] = "HTTP/1.0";
             * requestData["owin.RequestQueryString"] = query;
             * requestData["owin.RequestScheme"] = "http";
             *
             * requestData["owin.Version"] = "1.0";
             * requestData["owin.CallCancelled"] = new System.Threading.CancellationToken();
             *
             * WebManager.HandleRequest(requestData);
             *
             * try
             * {
             *  foreach (var data in requestData)
             *  {
             *      Log.Debug(data.Key + ": " + data.Value.ToString());
             *  }
             *
             *  var responseStream = requestData["owin.ResponseBody"] as Stream;
             *  var responseHeaders = requestData["owin.ResponseHeaders"] as IDictionary<string, string[]>;
             *  var responseStatusCode = requestData.ContainsKey("owin.ResponseStatusCode") ? (int)requestData["owin.ResponseStatusCode"] : 200;
             *
             *  var response = new StringBuilder();
             *  response.Append("HTTP/1.0 ");
             *  response.Append(responseStatusCode.ToString());
             *  response.Append(" ");
             *  response.Append(_statusCodes[responseStatusCode]);
             *  response.Append("\r\n");
             *
             *  foreach (var header in responseHeaders)
             *  {
             *      response.Append(header.Key);
             *      response.Append(": ");
             *      response.Append(string.Join(", ", header.Value));
             *      response.Append("\r\n");
             *  }
             *
             *  response.Append("\r\n");
             *
             *  var headerBytes = Encoding.UTF8.GetBytes(response.ToString());
             *  var dataBytes = new byte[responseStream.Length + headerBytes.Length];
             *  Array.Copy(headerBytes, dataBytes, headerBytes.Length);
             *
             *  responseStream.Read(dataBytes, headerBytes.Length, (int)responseStream.Length);
             *
             *  return dataBytes;
             * }
             * catch (Exception ex)
             * {
             *  Log.Error(ex);
             *  return Encoding.UTF8.GetBytes("HTTP/1.0 500 Internal Server Error\r\n\r\n" + ex.Message);
             * }*/
        }
示例#15
0
 public static void ExecuteCommand(string command)
 {
     GameInterface.Cbuf_AddText(command + "\n");
 }
示例#16
0
 public static void RawSayAll(string message)
 {
     GameInterface.SV_GameSendServerCommand(-1, -1, message);
 }
示例#17
0
 public static void SetDropItemEnabled(bool enabled)
 {
     GameInterface.SetDropItemEnabled(enabled);
 }
示例#18
0
        private static void BuildPlaylist(string currentMap = "")
        {
            // generate a list containing unique maps, with entries the number of times as the weight indicates
            var list     = new List <PlaylistEntry>();
            var mapsDone = new HashSet <string>();

            var rnd = new Random();

            var curPlaylistId = int.Parse(GameInterface.GetDvar("playlist", "0"));

            if (curPlaylistId < 0 || curPlaylistId > PlaylistSet.Playlists.Length)
            {
                Log.Debug("curPlaylistId seems invalid.");
                return;
            }

            var curPlaylist = PlaylistSet.Playlists[curPlaylistId];

            if (curPlaylist == null)
            {
                Log.Debug("curPlaylistId seems null.");
                return;
            }

            Playlist = curPlaylist;

            var newEntries = from e in curPlaylist.Entries
                             orderby rnd.Next()
                             select e;

            foreach (var entry in newEntries)
            {
                if (!mapsDone.Contains(entry.Map))
                {
                    list.Add(entry);
                    mapsDone.Add(entry.Map);
                }
            }

            // duplicate the entries with a >1 weight
            var duplicateList = list.GetRange(0, list.Count);

            foreach (var entry in duplicateList)
            {
                if (entry.Weight > 1)
                {
                    for (int i = 1; i < entry.Weight; i++)
                    {
                        list.Add(entry);
                    }
                }
            }

            // shuffle the list, again
            list = (from e in list
                    orderby rnd.Next()
                    select e).ToList();

            // remove current map from start of list, so we won't rotate to the same map
            if (list.Count > 0 && list[0].Map == currentMap)
            {
                list.RemoveAt(0);
            }

            CurrentPlaylist = list;
        }
示例#19
0
 public void LogMessage(string source, string message, LogLevel level)
 {
     GameInterface.Print("[" + source + "] " + message + "\n");
 }
示例#20
0
 static WebBaseScript()
 {
     Database = new SQLiteConnection("zone/" + GameInterface.GetDvar("sv_baseConfigName", "dummy") + ".iw4db", true);
     Database.CreateTable <PlayerCountStatisticPoint>();
 }
示例#21
0
        public static byte[] HandleRequest(string method, string uri, string query, Dictionary <string, string> headers, IPAddress ip)
        {
            var nuri = new Url
            {
                Scheme   = "http",
                HostName = GetHeader(headers, "Host"),
                Port     = null,
                BasePath = "",
                Path     = uri,
                Query    = query
            };

            var contentLength = ExpectedLength(headers);
            var bodyStream    = Stream.Null;

            if (contentLength > 0)
            {
                var bodyBytes = GameInterface.ReadHTTPBody((int)contentLength);
                bodyStream = new MemoryStream(bodyBytes);
            }

            var body = new RequestStream(bodyStream, contentLength, false);

            var headerDictionary = headers.ToDictionary(kv => kv.Key, kv => (IEnumerable <string>) new[] { kv.Value }, StringComparer.OrdinalIgnoreCase);
            var request          = new Request(method, nuri, body, headerDictionary, ip.ToString());

            var context            = _engine.HandleRequest(request);
            var responseStatusCode = context.Response.StatusCode;
            var responseStream     = new MemoryStream();

            context.Response.Contents(responseStream);
            responseStream.Position = 0;

            var response = new StringBuilder();

            response.Append("HTTP/1.0 ");
            response.Append(((int)responseStatusCode).ToString());
            response.Append(" ");
            response.Append(_statusCodes[(int)responseStatusCode]);
            response.Append("\r\n");

            foreach (var header in context.Response.Headers)
            {
                response.Append(header.Key);
                response.Append(": ");
                response.Append(string.Join(", ", header.Value));
                response.Append("\r\n");
            }

            if (context.Response.ContentType != null)
            {
                response.Append("Content-Type: ");
                response.Append(context.Response.ContentType);
                response.Append("\r\n");
            }

            if (context.Response.Cookies != null && context.Response.Cookies.Count != 0)
            {
                var cookies = context.Response.Cookies.Select(cookie => cookie.ToString()).ToArray();

                response.Append("Set-Cookie: ");
                response.Append(string.Join(", ", cookies));
                response.Append("\r\n");
            }


            response.Append("\r\n");

            var headerBytes = Encoding.UTF8.GetBytes(response.ToString());
            var dataBytes   = new byte[responseStream.Length + headerBytes.Length];

            Array.Copy(headerBytes, dataBytes, headerBytes.Length);

            responseStream.Read(dataBytes, headerBytes.Length, (int)responseStream.Length);

            //Log.Debug(context.Trace.TraceLog.ToString());
            context.Dispose();

            return(dataBytes);
        }