Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
  • Нужна помощь?

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

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

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

    Там вы можете продать или купить
    Всё что касается игровых серверов
  • 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'

 

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

Как быть?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендованные сообщения

  • 0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Забронировать это рекламное место


  • 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.блаблабла

 

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

 

ироды

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

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

Изменено пользователем 123new (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

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

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

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 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()

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

Изменено пользователем 123new (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.

Гость
Ответить на вопрос...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...

  • Похожие публикации

    • Автор: 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?
    • Автор: 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;
       }
       
      Все верно?
       
×
×
  • Создать...