В смысле ты хочешь затолкать объекты-наследников разных классов в один массив? нет, я хочу чтобы мой метод(DoReflection) просмотрел все свойства в классе(допустим структура GRoleBase), и допустим если он встретил в классе(структура GRoleBase) свойство с типом "Int32", значит он присвоит этому свойству значение прочитанное из пакета, который нам прислал Gamedbd. Обычно читалось это так: int id = PacketReader.ReadInt32(); А массивы обычно читались так: int lenght = PacketReader.ReadCUInt32(); GRoleForbid[] forbid = new GRoleForbid[lenght]; for (int i = 0; i < lenght; i++) { forbid[i] = new GRoleForbid(); forbid[i].createtime = packetReader.ReadInt32(); ... } Так вот, если мой метод найдет массив, он будет создавать массив с нужным кол-во, и будет с помощью рекурсии читать все что находится в след. структуре. Только вот как инициализировать(forbid = new GRoleForbid() ; ) эту структуру с помощью рефлексии я не знаю
Прив всем) Вопрос может быть и нубский, но ответа я в интернете не нашел. Есть идея читать пакеты принятые от игровых служб PW с помощью рефлексии и рекурсии. Допустим есть структура GRoleBase из Gamedbd: public class GRoleBase { public byte version { get; private set;} public int id{ get; private set;} public Octets name{ get; private set;} public int race{ get; private set;} public int cls{ get; private set;} public byte gender{ get; private set;} public Octets custom_data{ get; private set;} public Octets config_data{ get; private set;} public int custom_stamp{ get; private set;} public byte status{ get; private set;} public int delete_time{ get; private set;} public int create_time{ get; private set;} public int lastlogin_time{ get; private set;} public GRoleForbid[] forbid{ get; private set;} public Octets help_states{ get; private set;} public int spouse{ get; private set;} public int userid{ get; private set;} public Octets cross_data{ get; private set;} public byte reserved2{ get; private set;} public byte reserved3{ get; private set;} public byte reserved4{ get; private set;} } В этой структуре есть массив из GRoleForbid, и каждый элемент в массиве содержит следующую структуру: public class GRoleForbid { public byte type { get; private set;} public int time { get; private set;} public int createtime { get; private set;} public Octets reason { get; private set;} } И мой метод чтения: public static void DoReflection(object cls, PacketReader packetReader) { foreach (var prop in cls.GetType().GetProperties()) { switch (prop.PropertyType.ToString()) { case "System.Byte": { prop.SetValue(cls, packetReader.ReadByte()); break; } case "System.Int32": { prop.SetValue(cls, (int)packetReader.ReadInt32()); break; } case "SGR.Octets": { prop.SetValue(cls, packetReader.ReadOctets()); break; } default: { if (prop.PropertyType.IsArray) { var length = packetReader.ReadCUInt32(); object value = Activator.CreateInstance(prop.PropertyType, length); //prop.PropertyType равняется GRoleForbid[] foreach (var item in (object[])value) { //Перед вызовом следующего метода, нужно создать экземпляр. DOReflection(item, packetReader); } prop.SetValue(cls, value); } else { object value = Activator.CreateInstance(prop.PropertyType); prop.SetValue(cls, value); DoReflection(value, packetReader); } break; } } } } Проблема возникла с создание экземпляра класса в массиве. Если брать по примеру, то создать экземпляр GRoleForbid. Но для создания нужно узнать сначала тип этого элемента, ведь этот метод будет читать любые структуры, отправленные в этот метод. Собственно в этом и заключается вопрос, как это можно сделать? P.S От безысходности уже хотел согрешить, и использовать велосипед, переведя тип массива в строку и убрать квадратные скобки. Но это уже, по моему мнению, какой-то ад получается.
Красава, нашел где искать человека для написания бота. Мы тут как-бы на форуме боремся с этим:D
Дополнение: Где-то стоит монстр "Призыв для переключения этапа", который через AI каждый час дает очки этапу и оповещает игроков об начале нового этапа. Также когда наберётся N кол-во очков, запускает/отключает триггеры и оповещает игроков (Сильно не вдуплялся в это) Много скриншотов: [IMG] [IMG] [IMG] [IMG] [IMG]
5к за одна привязка или две? За одну привязку
Привет всем) Представляю Вам свою разработку: [IMG] AIPolicy Editor - редактор логики монстров в MMORPG игре Perfect World. С помощью данного редактора Вы сможете создавать уникальных монстров и боссов, которые будут не только бить персонажа, но и взаимодействовать с миром, создавать новых монстров, использовать умения (и многое другое) при определённых условиях. Редактор предоставляет Вам удобный способ редактирования условий для выполнения действий, окно выбора умения с его описанием, быстрыми перехода между связными действиями и удобный расширенным поиском. Большинство полей расшифровано и подробно описано, чтобы начальный пользователь не запутался в создание логики монстра. Редактор поддерживает AIPolicy.data от версии 1.2.6 до 1.5.1, и в будущем будет обновляться до новых версий. Также в случае возникновения ошибки (никто от этого не застрахован), в редактор встроена функция мгновенной отправки ошибки разработчику, для исправления этой ошибки (по желанию, можно прикрепить сам файл AIPolicy.data). Возможности: Загрузки, редактирования, сохранения файла AIPolicy.data версий от 1.2.6 до 1.5.1 Загрузка файла с описанием умений всех версий и удобный выбор умений Удобный редактор условий, никакого текста, только элементы управления Массовое редактирование всех полей и элементов Удобное массовое позиционирование элементов в программе Сортировка Массовое копирование в буфер обмена и вставка из буфера Расширенный поиск со встроенным редактором Удаления всех пустых контроллеров Удобное редактирование сообщений в игре с выбором канала чата. Расширенный список настроек, включая четыре разных дизайна под Ваш вкус Удобный интерфейс программы с перемещением окон и смены их размера Отправка сообщения разработчику при возникновения ошибки с возможностью прикрепить AIPolicy.data и strskills.txt По желанию, делать Backup файла перед сохранением изменений Скриншоты программы: [IMG] [IMG] [IMG] [IMG] Цена: 5 000 рублей Первым трём покупателям скидка 5%:) Skype: dimonpw2
лол. лол Лалочки, лол? Рей когда сделал свой редактор, он указал где он брал исходники, а ты нет) я наверно удивлю некоторых... но "юзать" (дорабатывать) чужой код сложнее, чем костылить свой. Но не с кодом в 100 строк
Решил покодить (с#) Ты взял исходники http://mmorpg-devs.ru/threads/mask-generator.17602/ , половина вырезал и дал проге новое название. Это не называется покодить
В шару пойдет, или будешь продавать? Если продавать, то за сколько?
На картинке сверху видно что для кнопки есть 2 текстурки, одна в состояние когда нажали на кнопку, а вторая когда кнопка просто активная. Мне кажется что в клиенте кнопка меняет статус через определённое время. Можно попробовать заменить текстурку нажатой кнопки на активную. Но если и не будет мигать, то при зажимание на кнопку, эффекта тоже не будет)
я вот не могу понять, это выложили чисто на поржать, или серьезно хотели пропиарить серв?
И ещё у бафов есть уровень, от которого иногда зависит время бафа. А эта информация, насколько я знаю, тоже обрабатывается только на сервере.
public LombardBase(string n,float as,float am,DateTime de,DataTime st,int[] pp) { ProductName = n; //Наименование товара AssessedValue = as; //Оценочная стоимость AmountOfProduct = am; //Cумма, выданная под залог DeliveryDate = de; //Дата сдачи StorageLife = st; //Cрок хранения IDPerson = pp; //Индексы клиентов } List<LombardBase> ls = new List<LombardBase>(); ls.add(new LombardBase("name",....)); Спасибо, понял свою ошибку в списках) Работает как часы)
Есть класс: public class LombardBase { public string ProductName; //Наименование товара public float AssessedValue; //Оценочная стоимость public float AmountOfProduct; //Cумма, выданная под залог public DateTime DeliveryDate; //Дата сдачи public DateTime StorageLife; //Cрок хранения public int[] IDPerson; //Индексы клиентов } Нужно чтоб получилась некая структура данных, пользователь в форме вводит все поля, а программа добавляет новый класс. В ООП слаб, а тут еще и курсач дали) До этого темки делал постоянно так: LombardBase[] LB = new LombardBase[255]; LB[0].ProductName = "Hello world!"; Но мне кажется что это как-то не правильно будет) Пробовал также с списками, но тоже не заладилось( List<LombardBase> LB = new List<LombardBase>(); ) Добавляется 1 элемент, и все. Может кто подсказать решение проблемы, или хотяб как правильно сформулировать мысль чтоб гугл помог:D
Большая благодарность от игрока)
Кстати, я бы поставил большой жирный лойс тому, кто бы написал подробный гайд по всем файлам, для чего нужен каждый файл, как его редактировать, и тд. По клиенту я знаю все отлично, а вот по серверу ни очень, да и думаю новичкам будет полезно. И вопросов будет меньше, где и как редактировать)
"Дежавю" называется помоему
//offtop Ты фанат Доктора Кто? :D Полицейская будка на иконках, и когда кидаешь скрины в чате, у них префикс TARDIS :D
Возможно бред, но все-же напишу. Можно построить 3D модель окрестности, похожую на окрестности где будет стоять OOG персонаж и сканировать все данные вокруг(координаты игроков, их класс, во что они одеты, и какие скиллы они юзают). И наверное самое тяжелое будет это взять модели голых классов из файлов пв, одеть эти модели в те шмотки, в которых бегают игроки, и поставить этих персов на эту 3d модель окрестности :D
мб на этом елементе, visible случайно на True поставил?
Имена участников (разделяйте запятой).