Esempio n. 1
0
        private void HandleSpecialMessages(Talker.SpringEventArgs e)
        {
            try
            {
                if (string.IsNullOrEmpty(e.Text) || !e.Text.StartsWith("SPRINGIE:"))
                {
                    return;
                }


                var text = e.Text.Substring(9);


                if (!gamePrivateMessages.ContainsKey(text))
                {
                    gamePrivateMessages.Add(text, new HashSet <byte>());
                }
                gamePrivateMessages[text].Add(e.PlayerNumber);

                if (text.StartsWith("READY:"))
                {
                    var name  = text.Substring(6);
                    var entry = Context.ActualPlayers.FirstOrDefault(x => x.Name == name);
                    if (entry != null)
                    {
                        entry.IsIngameReady = true;
                    }
                }

                if (gamePrivateMessages[text].Count() != Context.LobbyStartContext.Players.Count() / 2 + 1)
                {
                    return;                                                                                         // only accept messages if count matches N/2+1 exactly
                }
                if (text == "FORCE")
                {
                    ForceStart();
                }

                Context.OutputExtras.Add(text);
            }
            catch (Exception ex)
            {
                Trace.TraceError("Error while processing '{0}' :{1}", e.Text, ex);
            }
        }
        private void HandleSpecialMessages(Talker.SpringEventArgs e)
        {
            try
            {
                if (string.IsNullOrEmpty(e.Text) || !e.Text.StartsWith("SPRINGIE:"))
                {
                    return;
                }

                int count;
                if (!gamePrivateMessages.TryGetValue(e.Text, out count))
                {
                    count = 0;
                }
                count++;
                gamePrivateMessages[e.Text] = count;
                if (count != 2)
                {
                    return;             // only send if count matches 2 exactly
                }
                var text = e.Text.Substring(9);
                if (text.StartsWith("READY:"))
                {
                    var name  = text.Substring(6);
                    var entry = Context.ActualPlayers.FirstOrDefault(x => x.Name == name);
                    if (entry != null)
                    {
                        entry.IsIngameReady = true;
                    }
                }
                if (text == "FORCE")
                {
                    ForceStart();
                }

                Context.OutputExtras.Add(text);
            }
            catch (Exception ex)
            {
                Trace.TraceError("Error while processing '{0}' :{1}", e.Text, ex);
            }
        }
Esempio n. 3
0
        private void HandleSpecialMessages(Talker.SpringEventArgs e)
        {
            try {
                if (string.IsNullOrEmpty(e.Text) || !e.Text.StartsWith("SPRINGIE:"))
                {
                    return;
                }

                int count;
                if (!gamePrivateMessages.TryGetValue(e.Text, out count))
                {
                    count = 0;
                }
                count++;
                gamePrivateMessages[e.Text] = count;
                if (count != 2)
                {
                    return;             // only send if count matches 2 exactly
                }
                var text = e.Text.Substring(9);
                if (text.StartsWith("READY:"))
                {
                    var name = text.Substring(6);
                    BattlePlayerResult entry;
                    if (statsPlayers.TryGetValue(name, out entry))
                    {
                        entry.IsIngameReady = true;
                    }
                }
                if (text == "FORCE")
                {
                    ForceStart();
                }

                statsData.Add(text);
            } catch (Exception ex) {
                Trace.TraceError("Error while processing '{0}' :{1}", e.Text, ex);
            }
        }
Esempio n. 4
0
        private void AddToLogs(Talker.SpringEventArgs e)
        {
            try
            {
                if (string.IsNullOrEmpty(e.Text) || string.IsNullOrEmpty(e.PlayerName))
                {
                    return;
                }

                var s = "CHATLOG:" + e.PlayerName + " ";
                switch (e.Param)
                {
                case Talker.TO_EVERYONE:
                    s = s + "<PUBLIC> ";
                    break;

                case Talker.TO_ALLIES:
                    s = s + "<ALLY> ";
                    break;

                case Talker.TO_SPECTATORS:
                    s = s + "<SPEC> ";
                    break;

                default:
                    s = s + "<PRIV> ";
                    break;
                }
                s = s + e.Text;
                Context.OutputExtras.Add(s);
            }
            catch (Exception ex)
            {
                Trace.TraceError("Error while processing '{0}' :{1}", e.Text, ex);
            }
        }
Esempio n. 5
0
        private void talker_SpringEvent(object sender, Talker.SpringEventArgs e)
        {
            try
            {
                switch (e.EventType)
                {
                case Talker.SpringEventType.PLAYER_JOINED:
                    var entry = Context?.GetOrAddPlayer(e.PlayerName);
                    if (entry != null)
                    {
                        entry.IsIngame = true;
                    }
                    PlayerJoined?.Invoke(this, new SpringLogEventArgs(e.PlayerName));
                    break;

                case Talker.SpringEventType.PLAYER_LEFT:
                    entry = Context?.GetOrAddPlayer(e.PlayerName);
                    if (entry != null)
                    {
                        entry.IsIngame = false;
                        entry.QuitTime = (int)DateTime.UtcNow.Subtract(Context.IngameStartTime ?? Context.StartTime).TotalSeconds;
                    }
                    if (e.Param == 0)
                    {
                        PlayerDisconnected?.Invoke(this, new SpringLogEventArgs(e.PlayerName));
                    }
                    PlayerLeft?.Invoke(this, new SpringLogEventArgs(e.PlayerName));
                    break;

                case Talker.SpringEventType.GAME_LUAMSG:
                    HandleSpecialMessages(e);
                    break;

                case Talker.SpringEventType.PLAYER_CHAT:
                    if (e.Param == 255)
                    {
                        HandleSpecialMessages(e);
                    }
                    else
                    {
                        AddToLogs(e);
                    }

                    if ((PlayerSaid != null) && !string.IsNullOrEmpty(e.PlayerName))
                    {
                        SpringChatLocation location = SpringChatLocation.Private;
                        if (((e.Param == Talker.TO_EVERYONE) || (e.Param == Talker.TO_EVERYONE_LEGACY)))
                        {
                            location = SpringChatLocation.Public;
                        }
                        if (e.Param == Talker.TO_ALLIES)
                        {
                            location = SpringChatLocation.Allies;
                        }
                        if (e.Param == Talker.TO_SPECTATORS)
                        {
                            location = SpringChatLocation.Spectators;
                        }
                        PlayerSaid(this, new SpringChatEventArgs(e.PlayerName, e.Text, location));
                    }
                    break;

                case Talker.SpringEventType.PLAYER_DEFEATED:
                    MarkPlayerDead(e.PlayerName, true);
                    if (PlayerLost != null)
                    {
                        PlayerLost(this, new SpringLogEventArgs(e.PlayerName));
                    }
                    break;

                case Talker.SpringEventType.SERVER_GAMEOVER:
                    if (!Context.GameEndedOk)     // server gameover runs multiple times
                    {
                        foreach (var p in Context.ActualPlayers)
                        {
                            if (!p.IsIngame && !p.IsSpectator)
                            {
                                MarkPlayerDead(p.Name, true);
                            }
                            p.IsIngame = false;
                        }

                        // set victory team for all allied with currently alive
                        if (e.winningAllyTeams.Length > 0)
                        {
                            foreach (var ally in e.winningAllyTeams)
                            {
                                foreach (var p in Context.ActualPlayers.Where(x => !x.IsSpectator && (x.AllyNumber == ally)))
                                {
                                    p.IsVictoryTeam = true;
                                }
                            }
                        }
                        else         // Fallback, shouldn't happen
                        {
                            foreach (var p in Context.ActualPlayers.Where(x => !x.IsSpectator && (x.LoseTime == null)))
                            {
                                foreach (var q in Context.ActualPlayers.Where(x => !x.IsSpectator && (x.AllyNumber == p.AllyNumber)))
                                {
                                    q.IsVictoryTeam = true;
                                }
                            }
                        }

                        if (Context.IngameStartTime != null)
                        {
                            Context.GameEndedOk = true;
                            Context.Duration    = (int)DateTime.UtcNow.Subtract(Context.IngameStartTime ?? Context.StartTime).TotalSeconds;

                            GameOver?.Invoke(this, new SpringLogEventArgs(e.PlayerName));
                        }
                        else
                        {
                            Trace.TraceWarning("recieved GAMEOVER before STARTPLAYING!");
                        }

                        Task.Delay(10000).ContinueWith(x => ExitGame());
                    }
                    break;

                case Talker.SpringEventType.PLAYER_READY:
                    if (e.Param == 1)
                    {
                        entry = Context.GetOrAddPlayer(e.PlayerName);
                        if (entry != null)
                        {
                            entry.IsIngameReady = true;
                        }
                    }
                    break;

                case Talker.SpringEventType.SERVER_STARTPLAYING:
                    Context.ReplayName            = e.ReplayFileName;
                    Context.EngineBattleID        = e.GameID;
                    Context.IngameStartTime       = DateTime.UtcNow;
                    Context.PlayersUnreadyOnStart = Context.ActualPlayers.Where(x => !x.IsSpectator && !(x.IsIngameReady && x.IsIngame)).Select(x => x.Name).ToList();
                    foreach (var p in Context.ActualPlayers.Where(x => !x.IsSpectator))
                    {
                        p.IsIngameReady = true;
                    }

                    process.PriorityClass = ProcessPriorityClass.High;

                    BattleStarted(this, Context);
                    break;

                case Talker.SpringEventType.SERVER_QUIT:
                    if (LobbyStartContext != null)
                    {
                        foreach (var p in Context.ActualPlayers)
                        {
                            p.IsIngame = false;
                        }
                    }
                    //if (GameOver != null) GameOver(this, new SpringLogEventArgs(e.PlayerName));
                    break;
                }
            }
            catch (Exception ex)
            {
                Trace.TraceError("Error processing spring message:{0}", ex);
            }
        }
Esempio n. 6
0
        private void talker_SpringEvent(object sender, Talker.SpringEventArgs e)
        {
            //this.client.Say(TasClient.SayPlace.Battle, "",string.Format("type:{0} param:{1} player:{2}-{3} text:{4}",e.EventType.ToString(), e.Param,e.PlayerNumber, e.PlayerName, e.Text),false);
            try {
                switch (e.EventType)
                {
                case Talker.SpringEventType.PLAYER_JOINED:
                    if (StartContext != null)
                    {
                        foreach (var p in StartContext.Players.Where(x => x.Name == e.PlayerName))
                        {
                            connectedPlayers[p.Name] = true;
                            p.IsIngame = true;
                        }
                    }
                    if (PlayerJoined != null)
                    {
                        PlayerJoined(this, new SpringLogEventArgs(e.PlayerName));
                    }
                    break;

                case Talker.SpringEventType.PLAYER_LEFT:
                    if (StartContext != null)
                    {
                        foreach (var p in StartContext.Players.Where(x => x.Name == e.PlayerName))
                        {
                            connectedPlayers[p.Name] = false;
                            p.IsIngame = false;
                        }
                    }
                    if (e.Param == 0 && PlayerDisconnected != null)
                    {
                        PlayerDisconnected(this, new SpringLogEventArgs(e.PlayerName));
                    }
                    if (PlayerLeft != null)
                    {
                        PlayerLeft(this, new SpringLogEventArgs(e.PlayerName));
                    }

                    break;

                case Talker.SpringEventType.GAME_LUAMSG:
                    HandleSpecialMessages(e);
                    break;

                case Talker.SpringEventType.PLAYER_CHAT:
                    if (e.Param == 255)
                    {
                        HandleSpecialMessages(e);
                    }

                    // only public chat
                    if (PlayerSaid != null && (e.Param == Talker.TO_EVERYONE || e.Param == Talker.TO_EVERYONE_LEGACY) && !string.IsNullOrEmpty(e.PlayerName))
                    {
                        PlayerSaid(this, new SpringLogEventArgs(e.PlayerName, e.Text));
                    }
                    break;

                case Talker.SpringEventType.PLAYER_DEFEATED:
                    StatsMarkDead(e.PlayerName, true);
                    if (PlayerLost != null)
                    {
                        PlayerLost(this, new SpringLogEventArgs(e.PlayerName));
                    }
                    break;

                case Talker.SpringEventType.SERVER_GAMEOVER:
                    if (StartContext != null)
                    {
                        foreach (var p in StartContext.Players)
                        {
                            p.IsIngame = false;
                        }
                    }
                    IsBattleOver = true;

                    if (battleResult.IngameStartTime != null)
                    {
                        gameEndedOk           = true;
                        battleResult.Duration = (int)DateTime.UtcNow.Subtract(battleResult.IngameStartTime ?? battleResult.StartTime).TotalSeconds;
                        if (GameOver != null)
                        {
                            GameOver(this, new SpringLogEventArgs(e.PlayerName));
                        }
                    }
                    else
                    {
                        //gameover before gamestart
                        client.Say(TasClient.SayPlace.Battle, "", "DEBUG: recieved GAMEOVER before STARTPLAYING!", true);
                    }

                    break;

                case Talker.SpringEventType.PLAYER_READY:
                    if (e.Param == 1)
                    {
                        statsPlayers[e.PlayerName].IsIngameReady = true;
                    }
                    break;

                case Talker.SpringEventType.SERVER_STARTPLAYING:
                    battleResult.IngameStartTime = DateTime.UtcNow;
                    foreach (var p in statsPlayers)
                    {
                        p.Value.IsIngameReady = true;
                    }

                    foreach (var p in StartContext.Players)
                    {
                        bool state;
                        if (!connectedPlayers.TryGetValue(p.Name, out state) || !state)
                        {
                            p.IsIngame = false;
                        }
                    }
                    BattleStarted(this, EventArgs.Empty);
                    break;

                case Talker.SpringEventType.SERVER_QUIT:
                    if (StartContext != null)
                    {
                        foreach (var p in StartContext.Players)
                        {
                            p.IsIngame = false;
                        }
                    }
                    IsBattleOver = true;
                    //Program.main.AutoHost.SayBattle("dbg quit ");
                    //if (GameOver != null) GameOver(this, new SpringLogEventArgs(e.PlayerName));
                    break;
                }
            } catch (Exception ex) {
                Trace.TraceError("Error processing spring message:{0}", ex);
            }
        }