[RELEASE&HELP] Server Setup Tool 3

Для тех, кто хочет сделать мир лучше.
Сообщение
Автор
Аватара пользователя
Darth Revan
Майор
Майор
Сообщения: 784
Зарегистрирован: 30.09.2008
Поблагодарили: 1 раз
Контактная информация:

#16 Сообщение 02.08.2010, 13:24

MOZGIII
Если ты с Ansi, то да. Но неужели столько экспортов, что это сделать проблематично? И в новых дельфях никто не пинает использовать Ansi (кроме KOL, конечно).

MOZGIII
Разработчик
Разработчик
Сообщения: 910
Зарегистрирован: 09.01.2009
Откуда: Переезжаю в /dev/null
Благодарил (а): 7 раз
Поблагодарили: 65 раз
Контактная информация:

#17 Сообщение 02.08.2010, 13:51

Darth Revan
Хм, а разве в сях PChar тоже означает ссылку на Unicode строку? Я думал что PChar в стрых дельфях - который не на юникоде - это стандарт для такого межъязыкового взаимодействия, разве нет?

Аватара пользователя
$t@t!c_V()1D
Разработчик
Разработчик
Сообщения: 2639
Зарегистрирован: 06.12.2007
Благодарил (а): 10 раз
Поблагодарили: 29 раз

#18 Сообщение 02.08.2010, 14:55

Не, ну там Р в любом случае, а на Char или WideChar этот Р указывает - решать тебе.

Аватара пользователя
andreil
Разработчик
Разработчик
Сообщения: 781
Зарегистрирован: 14.08.2006
Откуда: Светлогорск, Беларусь
Поблагодарили: 2 раза
Контактная информация:

#19 Сообщение 02.08.2010, 14:58

MOZGIII Да, в старых версиях (до Delphi2009) тип PChar был равносилен pAnsiChar, а теперь он равносилен pWideChar (с string тоже самое - была AnsiString, а стала WideString).
[url=svn://forum.csmania.ru/andreil]Репозиторий с моими проектами[/url]
Занимаюсь переносом всех своих библиотек на С++, а так же созданием их кроссплатформенных версий.
В команду переводчиков манги "Ah! My Goddess!" требуются переводчики с английского и тайперы (последних можем обучить, главное - желание).

MOZGIII
Разработчик
Разработчик
Сообщения: 910
Зарегистрирован: 09.01.2009
Откуда: Переезжаю в /dev/null
Благодарил (а): 7 раз
Поблагодарили: 65 раз
Контактная информация:

#20 Сообщение 02.08.2010, 16:51

andreil
Только не WideString а UnicodeString - потому что WideString это простой тип, а UnicodeString - магический, с поддержкой счётчикоа ссылок.

$t@t!c_V()1D
Насчёт P - если использовать PWideChar народ не будет ругаться особо?

всем
Мне собстенно хотелось бы реализовать прозрачное конвертирование одного record в другой, с помощью известного RTTI. Так можно вообще? Если да - то по нему мне и нужна помощь :)
А вообще ведь можно реализовать это (SDK для C/C++) через отдельный плагин - тоесть плагины, подключающиеся к плагину... Особой практической разницы там не будет, разве что работа всего этого будет организована немного хитро... Но это я так, вообще о перспективах и вариантах %) Если вам нравиться такая идея - плагин-гейтвей для других плагинов - я так и сделаю. Иначе реализую это в самой проге, скажем будут 2 типа плагинов - первые, которые будут работать на дельфи и с общими типами, с расширением dplg, вторые - на c и других языках - cplg. (Но этот вариант маловероятен, по крайней мере ещё не скоро будет, потому-что пока-что интерфейсы плагинов нестабильны и скорее всего будут меняться)

Добавлено спустя 59 минут 38 секунд:
Так, мне нужно, чтобы кто-нибудь заполнил новые свойства xml файлов и кинул мне в архиве новые файлы. Новые поля - это:
Новый XML файл

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<Game>
	<Name>Garry's Mod</Name>
	<HlUpdateTrigger>garrysmod</HlUpdateTrigger>
	<Engine>6</Engine>
	<ServerFolder>gmod</ServerFolder>
	<GameLogoFilename>garrysmod.jpg</GameLogoFilename> 
	<GamePaths>
		<BinDir>orangebox/bin/</BinDir>
		<SrcDSPath>orangebox/srcds.exe</SrcDSPath>
	</GamePaths>	
	
	<DevComments>
		Значения для поля Engine: 
		  S_ENGINE_GOLDSOURCE = 0;
		  S_ENGINE_SOURCE = 1;
		  S_ENGINE_SOURCE2006 = 2;
		  S_ENGINE_SOURCE2007 = 3;
		  S_ENGINE_SOURCE2007_U1 = 4;
		  S_ENGINE_SOURCE2009 = 5;
		  S_ENGINE_SOURCE2010 = 6;
	</DevComments>	
</Game>
Это BinDir и SrcDSPath - чтобы их заполнить мне нехватает данных... Кстати может вывесить разъяснения по значениям полей?

Аватара пользователя
Darth Revan
Майор
Майор
Сообщения: 784
Зарегистрирован: 30.09.2008
Поблагодарили: 1 раз
Контактная информация:

#21 Сообщение 02.08.2010, 17:01

MOZGIII
Я всего-лишь имел в виду, что ShareMem'ы могут иметь проблемы. Да и толку от них...
Дельфисты с лёгкостью могут из AnsiString перевести в PAnsiChar. Зачем нужно мудрить с ShareMem?
На WinAPI никто не жалуется.

MOZGIII
Разработчик
Разработчик
Сообщения: 910
Зарегистрирован: 09.01.2009
Откуда: Переезжаю в /dev/null
Благодарил (а): 7 раз
Поблагодарили: 65 раз
Контактная информация:

#22 Сообщение 02.08.2010, 20:03

Что есть что в xml файле

Код: Выделить всё

// заголовок xml файла - всё как обычно
<?xml version="1.0" encoding="utf-8"?>
// корневой элемент, может быть любым, но я использую <Game>
<Game>
   // Имя игры, сервер для которой мы ставим (или можно назвать "имя сервера")
   <Name>Garry's Mod</Name>
   // Параметр, который будет передаваться в HldsupdateTool для скачивания и обновления сервера
   <HlUpdateTrigger>garrysmod</HlUpdateTrigger>
   // Версия движка, берётся из констант SDK, также есть в DevComments (кстати поле DevComments
   // служит только для комментариев для редакторов XML файла, в программе не используется)
   <Engine>6</Engine>
   // Папка, в которой будет лежать сервер... Путь к серверу в этом примере: ./Servers/gmod/
   // Все папки, нужные серверу будут находится внутри './Servers/'+ServerFolder+'/'
   <ServerFolder>gmod</ServerFolder>
   // Картинка сервера, должна лежать в папке ./Data/Images/
   <GameLogoFilename>garrysmod.jpg</GameLogoFilename> 
   // Пути сервера - поля для упрощения работы плагинов по взлому сервера, установке адднонв итп.
   // Все пути сервера пишутся относительно папки './Servers/'+ServerFolder+'/'
   // Для всех директорий и папок на конце всегда дописывайте / (слеш)!
   <GamePaths>
      // Директория Bin сервера, реальный путь будет такой: ./Servers/gmod/orangebox/bin/
      <BinDir>orangebox/bin/</BinDir>
      // Другая директория bin, которая лежит в папке в именем игры внутри сервера,
      // реальный путь будет такой: ./Servers/gmod/orangebox/garrysmod/bin/
      <SubBinDir>orangebox/garrysmod/bin/</SubBinDir>
      // Путь к файлу srcds.exe, реальный путь будет такой: ./Servers/gmod/orangebox/srcds.exe
      <SrcDSPath>orangebox/srcds.exe</SrcDSPath>
   </GamePaths>   
   
   // Просто коментарии, можно удалить
   <DevComments>
      Значения для поля Engine: 
        S_ENGINE_GOLDSOURCE = 0;
        S_ENGINE_SOURCE = 1;
        S_ENGINE_SOURCE2006 = 2;
        S_ENGINE_SOURCE2007 = 3;
        S_ENGINE_SOURCE2007_U1 = 4;
        S_ENGINE_SOURCE2009 = 5;
        S_ENGINE_SOURCE2010 = 6;
   </DevComments>   
</Game>
Добавлено спустя 7 минут 1 секунду:
Darth Revan
Толк от ShareMem-ов в том, что можно передавать типы, удаление которых из памяти Delphi обеспечивает автоматически без проблем, и к томуже, так можно сразу оперировать данными, с которыми программа работает после обмена с длл (для внутренней организации), а так придётся обрабатывать и делать конвертацию всех PWideChar в String, а уже потом записывать в record-ы с которыми идёт работа (переписать всю программу с использованием PWideChar вместо String везде, а не только в плагинах, меня ничто не заставит %) )
Кстати что ты имееш против ShareMem-ов?
И кстати я использую Delphi 2010 и обычный String, что != AnsiString.

Добавлено спустя 28 минут 33 секунды:
Гляньте, пытаюсь написать плагин для подключения .cplg плагинов %)
Напоминаю .cplg - это те, которые на C/C++.
Итак, вот что пока-что получается (нехочу возиться с архивами - поэтому сразу в сообщении)
Код тут

Код: Выделить всё

library CommonPluginsManager;

uses
  SimpleShareMem,
  SysUtils,
  Classes,
  Dialogs,
  AppCommonTypes in '../PluginSDK/AppCommonTypes.pas';

type
  TCplgPlugin = record
    //
  end;

  TCplgGameServer = record
    // Internal info
    ListIndex: Integer;
    // Direct read info
    Name: PWideChar;
    HlUpdateTrigger: PWideChar;
    Engine: Integer;
    ServerFolder: PWideChar;
    GameLogoFilename: PWideChar;
    GamePaths: record
      BinDir: PWideChar;
      SrcDSPath: PWideChar;
      SubBinDir: PWideChar;
    end;
  end;

var
  Plugins: array of TCplgPlugin;

{$R *.res}


// Internal Function
procedure LoadPlugin(FileName: string);
begin
  //
end;

procedure LoadPlugins();
begin
  //
end;

procedure UnloadPlugins();
begin
  //
end;

// Internal Convertion Function
function ConvGameServerToCplugGameServer(GameServer: TGameServer): TCplgGameServer;
begin
  // Yeah, this is bullshit!!
  Result.ListIndex:=GameServer.ListIndex;
  Result.Name:=PWideChar(GameServer.Name);
  Result.HlUpdateTrigger:=PWideChar(GameServer.HlUpdateTrigger);
  Result.Engine:=GameServer.Engine;
  Result.ServerFolder:=PWideChar(GameServer.ServerFolder);
  Result.GameLogoFilename:=PWideChar(GameServer.GameLogoFilename);
  Result.GamePaths.BinDir:=PWideChar(GameServer.GamePaths.BinDir);
  Result.GamePaths.SrcDSPath:=PWideChar(GameServer.GamePaths.SrcDSPath);
  Result.GamePaths.SubBinDir:=PWideChar(GameServer.GamePaths.SubBinDir);
end;


// Plugin Export Functions
{
function CplgGetPluginInfo: TPluginInfo; stdcall;
begin
  Result.Name:='Common Plugins Manager';
  Result.Author:='MOZGIII';
  Result.Description:='Этот плагин осуществляет всю работу с .cplg плагинами.'
    +' Также он одновременно предоставляет .CPLG SDK.';
  Result.Version:='1.0.0.0';
end;
}


// External Functions
// TPluginProcGetPluginInfo;
function GetPluginInfo:TPluginInfo;// stdcall;
begin
  Result.Name:='Common Plugins Manager';
  Result.Author:='MOZGIII';
  Result.Description:='Этот плагин осуществляет всю работу с .cplg плагинами.'
    +' Также он одновременно предоставляет .CPLG SDK.';
  Result.Version:='1.0.0.0';
end;

function GetActionsForGame(GameServer: TGameServer): TGameServerActionsList;
var
  i, PluginsListLen: integer;
begin
  // Chain to .cplg plugin
  // Here get the list of action from plugins somehow
  //  PluginsListLen

  SetLength(Result, PluginsListLen);

end;

function TriggerAction(ActionID: TActionID; GameServer: TGameServer):TActionReturnStatus;
begin
  ShowMessage('[TEST] I was ordered to process command: '+ActionID);
  // Chain to .cplg plugin
  // Send event to a plugin somehow
end;

exports
  GetPluginInfo, GetActionsForGame, TriggerAction;

begin
end.
Добавлено спустя 2 часа 15 минут 23 секунды:
Обновил SDK до 4-й версии, добавилось 2 поля (об игре)

Аватара пользователя
$t@t!c_V()1D
Разработчик
Разработчик
Сообщения: 2639
Зарегистрирован: 06.12.2007
Благодарил (а): 10 раз
Поблагодарили: 29 раз

#23 Сообщение 03.08.2010, 17:04

Не надо никаких замут с РТТИ и т.п. Для Си всё должно быть как можно проще. Если мутить с записями (структурами), то в юните нужно {$Z4} (я могу PhxApi.pas и PhxApi.h тебе скинуть)
Если WideChar, то ладно - функции конвертации из Юникода в Анси есть если что. Главное, чтоб это было раз и навсегда.

Добавлено спустя 3 минуты 11 секунд:
И не надо делать отдельно обработку Си и Дельфиновых плагинов - замучаешься. Лучше всё "под одной крышей".

MOZGIII
Разработчик
Разработчик
Сообщения: 910
Зарегистрирован: 09.01.2009
Откуда: Переезжаю в /dev/null
Благодарил (а): 7 раз
Поблагодарили: 65 раз
Контактная информация:

#24 Сообщение 03.08.2010, 17:40

$t@t!c_V()1D
Не очень понял зачем Z4... В си под структуры всегда по 4 байта дают?
А насчёт под одной крышей - не уверен, через опен-сорс плагин для взаимодействия может оказаться удобнее. Я если честно в С/C++ дальше прогинга простого приложения с WebBrowser-ом для своего кпк не продвигался (синтаксис знаю на 50% - только то что в остальных языках похоже на С, других особенностей языка и различных компиляторов - процента на 2). Поэтому, мне бы надо что-нибудь типо подсказок %) Желательно вообще - написать плагин на С, а потом, основываясь на нём, прикручивать к проге взаимодействие с ним... Кароче в кодинге на си у меня опыта нету, нужна помощь %)

Аватара пользователя
$t@t!c_V()1D
Разработчик
Разработчик
Сообщения: 2639
Зарегистрирован: 06.12.2007
Благодарил (а): 10 раз
Поблагодарили: 29 раз

#25 Сообщение 03.08.2010, 20:17

MOZGIII писал(а):Не очень понял зачем Z4... В си под структуры всегда по 4 байта дают?
Как бы, да. В Дельфине по умолчанию - выравнивание 8 байт.
MOZGIII писал(а):Желательно вообще - написать плагин на С, а потом, основываясь на нём, прикручивать к проге взаимодействие с ним... Кароче в кодинге на си у меня опыта нету, нужна помощь %)
Что ж, если ещё когда-нибудь доберусь до нормальных интернетов, то может и помогу чем.

Добавлено спустя 5 минут 59 секунд:
MOZGIII
И ещё я вот что скажу: LUA - это сила.

MOZGIII
Разработчик
Разработчик
Сообщения: 910
Зарегистрирован: 09.01.2009
Откуда: Переезжаю в /dev/null
Благодарил (а): 7 раз
Поблагодарили: 65 раз
Контактная информация:

#26 Сообщение 04.08.2010, 13:59

$t@t!c_V()1D
А по-моему по-умолчанию Z1, что равно 1 байт?
Кстати нормальный LUA интерпритатор под Daelphi я так и не нашел (хотя много раз искал) %)

Аватара пользователя
andreil
Разработчик
Разработчик
Сообщения: 781
Зарегистрирован: 14.08.2006
Откуда: Светлогорск, Беларусь
Поблагодарили: 2 раза
Контактная информация:

#27 Сообщение 04.08.2010, 21:55

MOZGIII
Статик прав, по дефолту во всех версиях стоит выранивание в 8 байт ;)
[url=svn://forum.csmania.ru/andreil]Репозиторий с моими проектами[/url]
Занимаюсь переносом всех своих библиотек на С++, а так же созданием их кроссплатформенных версий.
В команду переводчиков манги "Ah! My Goddess!" требуются переводчики с английского и тайперы (последних можем обучить, главное - желание).

MOZGIII
Разработчик
Разработчик
Сообщения: 910
Зарегистрирован: 09.01.2009
Откуда: Переезжаю в /dev/null
Благодарил (а): 7 раз
Поблагодарили: 65 раз
Контактная информация:

#28 Сообщение 04.08.2010, 23:10

andreil, $t@t!c_V()1D
Ок, 8 так 8, тока я всё ровно никак длл сишкую к своей проге не подключу :(

Насчёт LUA и Delphi - никто ничего не слышал?

Аватара пользователя
x_000
Полковник
Полковник
Сообщения: 4889
Зарегистрирован: 25.02.2008
Откуда: Deutsches Reich
Благодарил (а): 6 раз
Поблагодарили: 18 раз

#29 Сообщение 05.08.2010, 17:04

собственно говоря
что-то вы тут жуть какую-то насчет плагинов устроили
все должно быть НАМНОГО проще
суть такова
плагины будут в виде длл-ок, каждый из них экспортирует функцию, которую программа вызывает для инициализации, также программа предоставляет АПИ для взаимодействия с ней
все
и никаких заморочек

eldest
Разработчик
Разработчик
Сообщения: 302
Зарегистрирован: 17.03.2008
Откуда: такие как я?
Поблагодарили: 2 раза
Контактная информация:

#30 Сообщение 05.08.2010, 17:42

x_000
Правельно, у длл плагина должна быть всего одна функция типа int PluginMain(int cmd, int arg1, int arg2, ....);
И у самой программы должен быть интерфейс типа CreateInterface как у стима.

Ответить