Мля, идите на дуэльный сервер - там ваши кони, сэры рыцари(c)mamali
Я дрался с асами WarBirds(c)Varga
Основная проблема русского витуального сообщества - избыток лыцарелизателей и рыцаререзателей и нехватка наевропуболтоположителей... (с)CoValent
БоБ прямее руганью не станет. (с) Harh
Oculos habent non viclebunt.(c) Псалом 134
Q9650+8GbRAM+560Ti/2Gbi7-4790k+32Gb+2060/6Gb
BR-20 пока только с ними работает, только частоту менять надо настроенными кнопками.
Don't happy, be worry
Имхо, паранойя ) Вообще не факт, что файл миссии даже на сервере существует, не то что на клиенте. Лев например вообще пустой файл загружал, все остальное на лету формировалось. Не, в теории конечно возможно все, вплоть до перехвата трафика, но заявленная программа тут никаким боком. )
2 игры на одной машине не запустишь (когда ты уже в миссии), а игру и твой редактор можно, т.е. в любой момент переключился в редактор, посмотрел разведку нужного района, переключился в игру. Даже на 2м компьютере чтобы игру запустить нужно ее 2й раз купить сначала, а с твоей программой не нужно будет, т.е. на ноутбуке или планшете всегда будет открыта разведанная карта.
Если есть желание программировать можно веб интерфейс для кооп-скрипта сделать (выбор самолетов, настройка топлива, вооружения, запуск игры). 41sqn_Banks будет это делать как побочный продукт своего проекта, но не скоро.
...зелёные горят.
----------------------
i7-860@3.8, 4GB, ati4890-2GB, 1680x1050, Win7-64.
Так это замечательно, в чем проблема-то? Карта-планшет, еще и на втором мониторе. К тому же видно будет только то, что скрипт не грузит. Это больше для оффлайна пригодится, видеть или не видеть цель игрок сам решит, выбрав фильтр - самого себя обманывать это как в шахматы против себя любимого играть. Плюс для отладки пригодится, например чтобы в брифинге правильные координаты целей написать, а не грузить каждую подмиссию. Да много полезного можно сделать. И вообще это все в планах, мне крутому программеру сейчас с аддинами хотя бы разобратьсяА программку на выходных поучу человечков включать))
Крайний раз редактировалось Charger; 18.05.2012 в 17:14.
Мля, идите на дуэльный сервер - там ваши кони, сэры рыцари(c)mamali
Я дрался с асами WarBirds(c)Varga
Основная проблема русского витуального сообщества - избыток лыцарелизателей и рыцаререзателей и нехватка наевропуболтоположителей... (с)CoValent
БоБ прямее руганью не станет. (с) Harh
Oculos habent non viclebunt.(c) Псалом 134
Q9650+8GbRAM+560Ti/2Gbi7-4790k+32Gb+2060/6Gb
кто - то уже нашел где клиент сохраняет этот файл и читать его пробовал?
свои dll добавляются в папку стима? Они не затираются оф. патчем?
Объясните, в чем заблуждаюсь)
1. Есть dll, находится в игровой папке стима P11_folder. dll называется P11_localization.dll.
Наследую класс localization от AMission
Ее содержание ниже - просто складывает два числа в статическом методе locText(int number1, int number2). Компилирую в VS и копирую в вышеназванную папку.
Далее прописываю референсом созданную библиотеку и добавляю в namespace.Код:using System; using System.IO; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using maddox.game; using maddox.game.world; using maddox.GP; using part; namespace locaddin { public class localization : AMission { public static int locText(int number1, int number2) { int result = number1 + number2; return result; } } }
Наследую от localization
Пробую сложить два числа и вывести в чат - выдает ошибку. Ошибку не записал, но что-то вроде Exception - только вечером смогу посмотреть, но явно что-то не так делаю
Хотелось бы уточнить пошагово - что я вообще сделал, так как в основном методом тыка и копированием и просмотром чужих скриптов, особого понятия пока не обрел - слишком много на это времени уходит, а его сейчас нет.Код://$reference "P11_folder\P11_localization.dll" using System; using System.IO; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using maddox.game; using maddox.game.world; using maddox.GP; using locaddin; public class Mission : localization { public override void OnBattleStarted() { base.OnBattleStarted(); MissionNumberListener = -1; int xxx = localization.locText(1, 2); SendMessageToAll("Расчет из DLL = " + xxx.ToString(), "Chat"); //метод вырезан для краткости //LOAD MAIN MISSION MAP OBJEKTS //GamePlay.gpPostMissionLoad("missions\\SMP\\Friday on my mind\\submissions\\Map AAA\\Map AAA.mis"); }
2. Я так понимаю нужно всегда в dll наследовать от AMission? Так как сначала было без наследования и мне игра написала в ошибках что-то про пенальти, даже испугался - за читера может принять по глупости моей...
3. Как организовать наследования, если у меня допустим две dll - статистика и локализация и нужно чтобы они могли работать отдельно. Т.е. локализация мне к примеру нужна во всех миссиях, а статистика только в некоторых.
Я в обеих dll наследую от AMission, а в скрипте миссии от чего наследовать? Или вообще в нем можно тоже наследовать от AMission также?
1. Напиши сначала что за ошибка. Дело в том, что конструкция //$reference не родная для С#, и там может быть все что угодно.
2. Всегда
3. Ну тут вопрос на миллион. Множественное наследование есть в плюсах, но от него зачастую больше проблем, чем пользы. )
В твоем случае можно
1. Наследоваться AMission -> LocMission - > StatMission
2. Сделать по аналогии с Battle. Т.е. делаешь AMission -> LocMission, AMission -> StatMission, после еще делаешь AMission - > MyBattle. В MyBattle добавляешь приватным мембером List<AMission> myMissions. Там же переопределяешь каждый метод, и в методе, к примеру OnBattleStarted() пишешь foreach(AMission mis in myMissions) mis.OnBattleStarted(); Аналогично для остальных. Далее все легко и просто. На этапе инициализации надо просто сделать
AMission mission = new LocMission();
myMissions.Add(mission);
mission = new StatMission();
myMissions.Add(mission);
От кого наследоваться собственно в скрипте миссии - задача на сообразительность )
3. Событийная модель. Долго объяснять, если интересно, покопай мою dll из коммандера.
Этот вариант вроде подходит. Основная задача использовать различные набор dll по необходимости в миссиях. Имеем две dll с нэймспайсами - locaddin и stataddin.
Код:using System; using System.IO; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using maddox.game; using maddox.game.world; using maddox.GP; using part; namespace locaddin { public class localization : AMission { public static int locText(int number1, int number2) { int result = number1 + number2; return result; } } }И сама миссия, которая использует обе dll в исходном состоянии:Код:using System; using System.IO; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using maddox.game; using maddox.game.world; using maddox.GP; using part; namespace stataddin { public class statistic : AMission { public static int statText(int number1, int number2) { int result = number1 + number2; return result; } } }
Далее добавляем List<AMission> myMissions. В OnBattleStarted() или Inited? Или совсем в другое место?Код://$reference "P11_folder\P11_localization.dll" //$reference "P11_folder\P11_statistic.dll" using System; using System.IO; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using maddox.game; using maddox.game.world; using maddox.GP; using locaddin; using stataddin; public class Mission : AMission { public override void OnBattleStarted() { base.OnBattleStarted(); MissionNumberListener = -1; //LOAD MAIN MISSION MAP OBJEKTS //GamePlay.gpPostMissionLoad("missions\\SMP\\Friday on my mind\\submissions\\Map AAA\\Map AAA.mis"); }
Вроде истина где-то рядом, но пока мозаика не собирается.Код://$reference "P11_folder\P11_localization.dll" //$reference "P11_folder\P11_statistic.dll" using System; using System.IO; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using maddox.game; using maddox.game.world; using maddox.GP; using locaddin; using stataddin; public class Mission : AMission { public override void OnBattleStarted() { base.OnBattleStarted(); MissionNumberListener = -1; List<AMission> myMissions; //новый список переменных типа AMission AMission mission = new LocMission(); // заполняю список созданными миссиями, только не пойму чем если честно. Что это за миссии и как они связаны с dll? myMissions.Add(mission); mission = new StatMission(); myMissions.Add(mission); //Как-то так? : StatMission : statistic; LocMission : localization; // "Там же переопределяешь каждый метод" - вот это не понял. Где там же и какие методы? У меня в неразумной голове это так пока выглядит: foreach(AMission mis in myMissions) { mis.OnBattleStarted(); //т.е. именно здесь переопределяю методы } //LOAD MAIN MISSION MAP OBJEKTS //GamePlay.gpPostMissionLoad("missions\\SMP\\Friday on my mind\\submissions\\Map AAA\\Map AAA.mis"); }
А что значит покопай? Просто посмотреть методы или декомпилировать(что я не умею)? Или можно просмотреть исходник dll?
Если ты хочешь просто добавлять длл-ки без перекомпиляции основного кода, тогда надо юзать рефлексию - Assembly, Activator и т.п. Смотри в MSDN. Опять же долго объяснять, но подсказка вполне прозрачная. Тут же в теме я вроде выкладывал пример такого подхода.
Блеск и нищета NET в том, что исходный код из сборок можно просматривать практически в первозданном виде, если его специально перед этим не обработать. Гугли .Net Reflector (shareware) и ILSpy (бесплатный аналог)
И еще. К Addin то что ты предлагаешь, не имеет никакого отношения, лучше переименуй, что бы не путаться. А вот оно - курим конвейер дополнений
Спасибо, хотя мало что понятно. Конкретно, что мне нужно для начала - это отправлять сообщения через свою сборку, чтобы в каждом скрипте не прописывать много кода по локализации. Достаточно dll для этого?
Рефлексия - это миссия-бридж, которую ты выкладывал?
Второе назначение - хранение глобальных переменных, для статистики например, чтобы их могли использовать(читать/менять) скрипты хост-миссии и подмиссии. Достаточно dll для этого?
Крайний раз редактировалось podvoxx; 21.05.2012 в 13:03.
Если ты не задумываешь действительно чего то глобального с пол-сотней классов и тысячами строк кода, делать отдельную dll не стоит. Да и засорять папку игры dll-ками я бы не стал, имхо стоит подумать как сделать проще (например загружать пустые миссии со скриптом)
Bridge это не совсем рефлексия, там она используется для загрузки сборки и извлечению из нее класса и его методов.
Переменные можешь смело хранить в файле. Код скриптов миссии вызывается последовательно, так что о проблемах многопоточности можно не беспокоится.
А вообще, скажу по секрету, будет встроенный локалайзер и общее хранилище для миссий в RSTMission, это что бы не делал лишнюю работу, если что.
Вот такой вариант использует Кодиак
http://forum.1cpublishing.eu/showpos...74&postcount=2
For example i use this in my dll:
In the script file i useКод:using System.Collections.Generic; using System.Globalization; using maddox.game; using maddox.game.world; namespace COD { public static class Message { static readonly IGamePlay GamePlay = Strategy.THIS.GamePlay; public static void ToChatbar(string msg, params object[] args) { GamePlay.gpLogServer(null, msg, args); } public static void ToChatbar(Player player, string msg, params object[] args) { if (player != null) GamePlay.gpLogServer(new[] { player }, msg, args); } public static void ToChatbar(int army, string msg, params object[] args) { var consignees = new List<Player>(); if (GamePlay.gpPlayer() != null) consignees.Add(GamePlay.gpPlayer()); if (GamePlay.gpRemotePlayers() != null) consignees.AddRange(GamePlay.gpRemotePlayers()); if (army == -1) GamePlay.gpLogServer(null, msg, args); else if (consignees.Exists(item => item.Army() == army)) GamePlay.gpLogServer(consignees.FindAll(item => item.Army() == army).ToArray(), msg, args); } public static void ToScreen(string msg, params object[] args) { GamePlay.gpHUDLogCenter(null, msg, args); } public static void ToScreen(Player player, string msg, params object[] args) { if (player != null) GamePlay.gpHUDLogCenter(new[] { player }, msg, args); } public static void ToScreen(int army, string msg, params object[] args) { var consignees = new List<Player>(); if (GamePlay.gpPlayer() != null) consignees.Add(GamePlay.gpPlayer()); if (GamePlay.gpRemotePlayers() != null) consignees.AddRange(GamePlay.gpRemotePlayers()); if (army == -1) GamePlay.gpHUDLogCenter(null, msg, args); else if (consignees.Exists(item => item.Army() == army)) GamePlay.gpHUDLogCenter(consignees.FindAll(item => item.Army() == army).ToArray(), msg, args); } public static void ToScreenCountDown(string message, string endMessage, int seconds) { string tmpMessage = message + " "; int count = 0; while (count < seconds) { Strategy.THIS.Timeout(count++, () => { ToScreen(tmpMessage + seconds--.ToString(CultureInfo.InvariantCulture)); }); } Strategy.THIS.Timeout(count, () => ToScreen(endMessage)); } public static void ToScreenCountDown(Player player, string message, string endMessage, int seconds) { string tmpMessage = message + " "; int count = 0; while (count < seconds) { Strategy.THIS.Timeout(count++, () => { ToScreen(player, tmpMessage + seconds--.ToString(CultureInfo.InvariantCulture)); }); } Strategy.THIS.Timeout(count, () => ToScreen(player, endMessage)); } public static void ToScreenCountDown(int army, string message, string endMessage, int seconds) { string tmpMessage = message + " "; int count = 0; while (count < seconds) { Strategy.THIS.Timeout(count++, () => { ToScreen(army, tmpMessage + seconds--.ToString(CultureInfo.InvariantCulture)); }); } Strategy.THIS.Timeout(count, () => ToScreen(army, endMessage)); } } }
Это то, что нужно, кажется. Что вот эта строчка значит:Код://$reference parts/core/COD.dll //reference to my dll (Assembly) using System; using maddox.game; using maddox.game.world; using COD; //My namespace public class Mission : AMission { public override void OnPlaceEnter(Player player, AiActor actor, int placeIndex) { base.OnPlaceEnter(player, actor, placeIndex); Message.ToChatbar(player, "Welcome {0}", player); } }
Код:static readonly IGamePlay GamePlay = Strategy.THIS.GamePlay;
1. Точно так же dll подключает коммандер.
2. тоже самое, что ты делаешь в скрипте миссии this.Gameplay.SomeMethod()
Вот такую ошибку получаю, подключив библиотеку Кодиака. Да и с моими также.Код:[22:50:10] ================================================= [22:50:10] System.IO.FileNotFoundException: Could not load file or assembly 'SMPlocalization, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. Не удается найти указанный файл. [22:50:10] File name: 'SMPlocalization, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' [22:50:10] [22:50:10] Server stack trace: [22:50:10] at Mission.OnTickGame() [22:50:10] at maddox.game.ABattle.OnTickGame() [22:50:10] at maddox.game.world.Strategy.OnTickGame() [22:50:10] at System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs) [22:50:10] at System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg, Int32 methodPtr, Boolean fExecuteInContext) [22:50:10] [22:50:10] Exception rethrown at [0]: [22:50:10] at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) [22:50:10] at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) [22:50:10] at maddox.game.IBattle.OnTickGame() [22:50:10] at maddox.game.GameDef.tickGame() [22:50:10] at Rnn9R0HNW1FFeT2aIDs.ltiVH2HK9YyK7SdiCrk.8IDxVdt1dPyeHPkw7Ndf(Object ) [22:50:10] at Rnn9R0HNW1FFeT2aIDs.ltiVH2HK9YyK7SdiCrk.NaqwoOS5Joc() [22:50:10] at JHVeKKyORf15WCVE1pL.eE20r2yPeQB95WctiCJ.ZRMSPQBwmiC(Boolean , Boolean ) [22:50:10] [22:50:10] WRN: Assembly binding logging is turned OFF. [22:50:10] To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1. [22:50:10] Note: There is some performance penalty associated with assembly bind failure logging. [22:50:10] To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fusion!EnableLog]. [22:50:10] [22:50:10] =================================================
Простой вопрос. Сейчас вообще можно подключать dll к миссии для онлайна(сервер из игры и выделенный), а также для отдельных заданий не используя дополнительных программ вроде командера? Или это работает только для кампаний?
Можно, для этого используется в скрипте конструкция
//$reference
Единственное, лончер должен знать, где дллку искать. Как эта конструкция точно работает я не знаю, но в корневой папке лончера находит точно.
Разница с оффом в том, что тут ничего нового не напишешь такого, чего нельзя было бы сделать просто из скрипта.