3

我正在用 C# 为游戏服务器编写一个 rcon 消息工具。但是我遇到了一个错误:

“当前上下文中不存在名称‘m’”

现在你在屏幕上大喊 NOOB!是的,我承认我是;我几乎没有真正的编码经验。

我玩过 MFC C++ 和 OpenGL,我是一个相当受人尊敬的 cod modder “脚本是 gsc 松散地基于 c++”所以我希望我能快速学习,基本上我尝试访问 b 的实例。在主循环之外,但它给了我错误:

当前上下文中不存在名称 b

所以我创建了一个新的消息函数,在一个新实例中开始一个新的连接。然后我尝试了在另一个函数中的访问,stopmessages()但我仍然得到错误。

对不起,新手的问题。我已经用谷歌搜索了很长时间,但我只是不明白。

这是我的代码——它Nini.dll用于访问配置文件和BattleNET.dll访问游戏的 rcon——

#region

using System;
using System.Net;
using System.Text;
using BattleNET;
using Nini.Config;
#endregion



namespace BattleNET_client
{

internal class Program
{
    
   private static  void Main(string[] args)
    {
        bool isit_ok = true;
        
        Console.OutputEncoding = Encoding.UTF8;
        Console.Title = "rotceh_dnih's DayZ servermessages";
        BattlEyeLoginCredentials loginCredentials = GetLoginCredentials();
        Console.Title += string.Format(" - {0}:{1}", loginCredentials.Host, loginCredentials.Port);
        IBattleNET b = new BattlEyeClient(loginCredentials);
        b.MessageReceivedEvent += DumpMessage;
        b.DisconnectEvent += Disconnected;
        b.ReconnectOnPacketLoss(true);
        b.Connect();
        
        while (true)
        {
            startmessages();
            string cmd = Console.ReadLine();

            if (cmd == "exit" || cmd == "logout" || cmd == "quit")
            {
                Environment.Exit(0);
            }

            if (cmd == "restart")
            {
                stopmessages();
            }
            if (cmd == "startstuff")
            {
                startmessages();
            }

            if (b.IsConnected())
            {
                if (isit_ok)
                {
                    
                }
                isit_ok = false;
                b.SendCommandPacket(cmd);
            }
            else
            {
                Console.WriteLine("Not connected!");
            }
        }
    }

    private static BattlEyeLoginCredentials GetLoginCredentials()
    {
       
        IConfigSource source = new IniConfigSource("server/admindets.ini");
        string serverip = source.Configs["rconlogin"].Get("ip");
        int serverport = source.Configs["rconlogin"].GetInt("port");
        string password = source.Configs["rconlogin"].Get("rconpwd");
        var loginCredentials = new BattlEyeLoginCredentials
                                   {
                                       Host = serverip,
                                       Port = serverport,
                                       Password = password,
                                   };          
        return loginCredentials;
    }

   public static void startmessages()
    {
       BattlEyeLoginCredentials loginCredentials = GetLoginCredentials();
        IBattleNET m = new BattlEyeClient(loginCredentials);
        m.MessageReceivedEvent += DumpMessage;
        m.DisconnectEvent += Disconnected;
        m.ReconnectOnPacketLoss(true);
        m.Connect();

        IConfigSource messagesource = new IniConfigSource("messages/servermessages.ini");

        int messagewait = messagesource.Configs["timesettings"].GetInt("delay");
        string[] messages = messagesource.Configs["rconmessages"].Get("messages1").Split('|');
    //    for (;;)
      //  {
      
            foreach (string message in messages)
            {
                Console.WriteLine(message);
                 m.SendCommandPacket(EBattlEyeCommand.Say,message);
                 System.Threading.Thread.Sleep(messagewait * 60 * 1000); 
                
            }
     //   }
       
    }


   public static void stopmessages()
   {
       
       m.Disconnect();
   }


    private static void Disconnected(BattlEyeDisconnectEventArgs args)
    {
        Console.WriteLine(args.Message);
    }

    private static void DumpMessage(BattlEyeMessageEventArgs args)
    {
        Console.WriteLine(args.Message);
    }
}
}
4

6 回答 6

4

您需要将声明m放入类范围:

internal class Program
{

    // declare m as field at class level
    private static IBattleNET m;

    private static  void Main(string[] args)
    {
        ....
    }


    public static void startmessages()
    {
       BattlEyeLoginCredentials loginCredentials = GetLoginCredentials();


        // JUST SET THE VALUE HERE
        m = new BattlEyeClient(loginCredentials);
        m.MessageReceivedEvent += DumpMessage;
        m.DisconnectEvent += Disconnected;
        m.ReconnectOnPacketLoss(true);
        m.Connect();

        IConfigSource messagesource = new IniConfigSource("messages/servermessages.ini");

        int messagewait = messagesource.Configs["timesettings"].GetInt("delay");
        string[] messages = messagesource.Configs["rconmessages"].Get("messages1").Split('|');
    //    for (;;)
      //  {

            foreach (string message in messages)
            {
                Console.WriteLine(message);
                 m.SendCommandPacket(EBattlEyeCommand.Say,message);
                 System.Threading.Thread.Sleep(messagewait * 60 * 1000); 

            }
     //   }

    }
于 2012-11-02T08:29:42.293 回答
1

stopmessages() 方法将无法访问 m,因为变量 m 仅存在于 startmessages() 方法中

于 2012-11-02T08:30:40.917 回答
0

移动声明IBattleNET m

main函数之外并使其成为静态:

static IBattleNet b;

然后在你的main你只是做m = new BattlEyeClient(loginCredentials);

于 2012-11-02T08:29:54.333 回答
0

m是在静态方法的范围内声明的,startmessages但是你试图stopmessages在它不在范围内的地方使用它。您应该将变量移动到类范围,并将其定义为静态(因为您的方法是静态的)。

希望您的客户端应用程序是单线程的,否则您还需要考虑线程安全问题。

于 2012-11-02T08:30:00.687 回答
0

你可以做的是在你声明你的类之后,所以在 static void main 声明你的 m 值之前

internal class Program
{
    IBattleNET m;

然后在 startMessages 方法中添加

m = new BattlEyeClient(loginCredentials);

这将使 m 值可用于类中的所有方法

于 2012-11-02T08:31:22.550 回答
0

我假设 m 应该指的是这个:

IBattleNET m = new BattlEyeClient(loginCredentials);

在方法中startmessages()。您需要做的是在方法主体之外声明 IBattleNET m:

static IBattleNET m;
public static void startmessages()
{
    //etc
于 2012-11-02T08:31:38.480 回答