Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Нужна помощь?

    Создайте тему в соответствующем разделе
    Не нужно писать всё в чат!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
  • Не хотите БАН?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок
  • Загляните на торговую площадку

    Там вы можете купить
    Всё что касается игровых серверов
  • 0
BorizzK

И еще нужна помощь по классам

Есть класс

 

class LogClass
{
	private FileHandle File;
	
	void LogClass()
	{
		Print("::: [LogClass] ::: Init :::");
	}

	void ~LogClass()
	{
		Print("::: [LogClass] ::: UnInit :::");
	}

	void Save(string FileName, string String)
	{
		private int year, month, day, hour, minute, second;
		Print("::: [LogClass]: Save: " + FileName);
		if (!FileExist(FileName))
		{
			File = OpenFile(FileName,FileMode.WRITE);
		}
		else
		{
			File = OpenFile(FileName, FileMode.APPEND);
		}
		if ( File == 0 )
		{
			Print("::: [LogClass]: Can not write FileName: " + FileName);
			Print("::: [LogClass]: May be disk error, file write protected, file busy or FileMode.WRITE disabled (need to specify option -scrAllowFileWrite in server run parameters for enable FileMode.WRITE.");
			return;
		}

		FPrintln(File, DataBase_GetDate() + "," + DataBase_GetTime() + " : " + String);
		CloseFile(File);
	}

	void Rotate(string FileName, int FileNum)
	{
		Print("::: [LogClass]: Rotate: " + FileName);
		if (!FileExist(FileName))
		{
			Print("::: [LogClass]: Rotate: FileName not exists: " + FileName);
			return;
		}
		else
		{
			for ( int i = FileNum; i > 0; i-- )
			{
				Print("::: [LogClass]: Rotate: FileName: " + FileName + "." + i);
				if (FileExist(FileName + "." + i))
				{
					Print("::: [LogClass]: Rotate: DeleteFile: " + FileName + "." + i);
					DeleteFile(FileName + "." + i);
				}
				if (FileExist(FileName + "." + (i - 1)))
				{
					Print("::: [LogClass]: Rotate: CopyFile: " + FileName + "." + (i - 1) + " => " + FileName + "." + i);
					CopyFile(FileName + "." + (i - 1), FileName + "." + i);
				}
			}
			CopyFile(FileName, FileName + ".0");
			DeleteFile(FileName);
		}
	}
	
	static string DataBase_GetDate()
	{
		int year, month, day;	
		GetYearMonthDay(year, month, day);
		string date = day.ToStringLen(2) + "." + month.ToStringLen(2) + "." + year.ToStringLen(2);
		return date;
	}

	static string DataBase_GetTime()
	{
		int hour, minute, second;
		GetHourMinuteSecond(hour, minute, second);
		string time = hour.ToStringLen(2) + ":" + minute.ToStringLen(2) + ":" + second.ToStringLen(2);
		return time;
	}
}

Мне нужно им пользоваться функциями из него в нескольких местах

в PlayerBase.c в функциях в классе PlayerBase

в init.c в функция в классе миссии

Вопрос как?

 

В PlayerBase.c

#include "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_MOD\\LogClass\\LogClass.c"
Далее в классе

ref LogClass Log = new LogClass();

ну и в функциях

Log.Save{"путь-имя", данные);

 

Но после последнего обновления 0.63.149.525

В init.c

#include "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_MOD\\LogClass\\LogClass.c"

приводит к ошибке - Multiple declaration of class "LogClass"

 

Can't compile mission init script'!

$CurrentDir://mpmissions//dayzOffline.chernarusplus//_MOD//LogClass//LogClass.c(1): Multiple declaration of class 'LogClass'

 

До этого обновления все было норм

Как быть?

 

 

Share this post


Link to post
Share on other sites

7 answers to this question

Recommended Posts

  • 0

BorizzK интегрируй в scripts в 3_Game\Game.c как include
и уже просто как экземпляры класса используй в нужных местах свой класс. т.е. мы объявили класс для сервера в одном месте еще до инициализации классов playerbase и т.п., и там уэе заведомо известный класс используем. В миссии соответственно также не надо его уже через include добавлять.

Share this post


Link to post
Share on other sites



  • 0

123new Добаляю в playerbase.c или в game.c и потом в init.c (внутри класса или функции include не работает больше)

и все

пипец

multiple declaration

 

а если только в init.c, то класс доступен только там и нигде более

 

кроме того

если в playerbase.c в классе
ref LogClass Log = new LogClass();

то если я в init.c то же самое сделаю

снова multiple declaration

 

а если LogClass Log1 = new LogClass();

тогда работает но как Log1.блаблабла

 

до крайнего обновления такого не было

 

ироды

Share this post


Link to post
Share on other sites
  • 0

BorizzK не так делаешь. Если ты этот класс заинклюдил и объявил, а также назначил ему переменную, то ты с тем же именем в другом месте не можешь его объявить. и в то же время ты не можешь его вызвать в классе или функции до объявления самого класса.

Это как с переменной. Не объявив переменную внутри класса ты не можешь к ней обратиться. И объявить 2 раза ее ты там тоже не можешь.

Edited by 123new (see edit history)

Share this post


Link to post
Share on other sites
  • 0

123new Я вообще честно не догоняю до конца эти все классы и тп
А еще не понимаю смысла в них

Ладно для написания системного кросс-платформенного кода я могу понять смысл, но для скриптинга...

Да и работало все до крайего обновления

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 0

BorizzK ну вот смотри. Распакуй scripts.pbo чистый, помести в корень сервера. Добавь в параметры запуска сервера:

-FilePatching

открой

scripts\3_Game\game.c


и добавь, например, такое вверху файла

 #include "MyFNC.c"

И создай в корне папки scripts файл MyFNC.c с содержимым:

void MyFncRun()
{
	Print("TEST FNC RUNNED!");
}

Теперь во всех файлах и классах, что прогружается сервером после файла

scripts\3_Game\game.c

т.е. в том числе и в миссии сервера мы можем просто вызвать функцию

MyFncRun()

и объявлять ее уже нигде не нужно.

Аналогично будет и с тем, что ты хочешь сделать.

Надеюсь, логика понятна?

Share this post


Link to post
Share on other sites
  • 0

123new Это я в курсе
но я хочу в итоге отказаться вообще от распаковки scripts...

 

Share this post


Link to post
Share on other sites
  • 0

BorizzK сделай все модом тогда. Правда даже в таком случае от редактирования scripts оригинального не откажешься, так как константы переменных только так редактятся

Edited by 123new (see edit history)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By fedotovyasha
      в messages есть такая возможность
      <messages> <!-- This is example message for automatic server termination --> <message> <!-- no delay --> <delay>0</delay> <!-- if the value is larger than 0, then flag Repeat is enabled --> <repeat>0</repeat> <!-- if the value is larger than 0, then flag Countdown is enabled, countdown reaches zero in 10 hours --> <deadline>600</deadline> <!-- disable On connect flag --> <onConnect>0</onConnect> <!-- enable Shutdown flag --> <shutdown>1</shutdown> <!-- message itself with placeholders --> <text>Hello, #name will shutdown in #tmin minutes.</text> </message> </messages> Что лучше и эффективнее будет. Писать свой рестартер с помощью Rcon или будет достаточно messages.xml?
    • By BorizzK
      Что такое массивы и тп я в целом знаю, но поскольку на c++ и подобном никогда не писал (только в Дейзе столкнулся), то есть некоторое непонимание некоторых принципов работы с массивами в данном случае
       
      Продположим
       
      обявили массив внутри функции
       
      array<string> stringParam;
      // определяем массив текстового типа который живет до завершения работы функции
       
      или
       
      static array<string> stringParam;
      // определяем массив текстового типа который сохраняет в себе данные и после завершения работы функции и при следующем
      вызове функции содержимое массива останется и может быть использовано внутри функции (повторного обьявления массива не произойдет)
       
      string text = "text";
       
      //записываем содержимое переменной text в элемент массива 0
      stringParam.Insert(text);
      //записываем содержимое переменной text  в элемент массива 1, если переменная text пуста в элемент запишется текст NULL
      stringParam.Insert(text, "NULL");
       
      читаем в переменную text элемент массива 1
      string text = stringParam.Get(1);
       
      А вот теперь вопрос
      Как мне изменить эелемент 1 массива?
      stringParam[1] = "блаблабла";
       
      так?
      в теории должно быть так
       
      Это вообще возможно?
       
      И еще про функцию возвращающую результат в качестве массива
       
       array<string> FileRead(string FileName)
       {
        array<string> stringParam;
        string line_content;
         
      .....

        CloseFile(File);
        return stringParam;
       }
       
      Все верно?
       
×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.