вот вам привет от дъякона, к сожалению проживающего ныне на банановом острове:
Дъякон
0:06:14 Данный скрипт позволяет добавить 3200 новых артов. Скрипт добавляет новый бланковый арт, св-ва которого можно задать при помощи ЕРМ. Но нельзя занимать переменные z800-z1000.
3200? Не слишком много?
ты имел ввиду мало.. но на наш век хватит
УРА!!!
Всё! Нужно доставать арты из Морровинда. Там есть весьма прикольные.
попрошу не обсуждать кого почему и когда забанили. там дело тёмное
Вот ведь коварные колдуны, взломали все-таки...
Как изменить параметры нового арта, если !!UN:A ругается, мол, такого артефакта не бывает, в частности, его описание и название?
Через UN:C, либо снимать ограничение на кол-во артов в ехе
Проще через UN:C - для снятия надо расшираять таблицу и менять границу пары циклов. Но, конечно, UN:C изменит это в рамках всей игры, а не только карты.
Я в exe дуб дубом, но в этом скрипте, я так понял, происходит копирование блока памяти, относящегося к арту-167, в некое свободное место (видимо, предназначенное для z-переменных 800-1000) - как продолжение ряда. Сколько раз скопировал - столько и артов. Но в результате все "новые" артефакты надеваются на тот же слот, что и арт-167. Если в artraits.txt этот слот поменять, то он изменится и у всех "клонов".
Так как можно и можно ли индивидуально поменять слот "новому" артефакту?
Это единственное, что меня интересует. Название и описание можно и по кликам определять.
конечно можно. на основании уже существующих примеров ищешь оффсет в записи арта что соответствует слоту и пишешь туда свое
Хмм... могу выложить мои наработки, основанные на исследованиях Сергроя и Дьякона. Насколько все работает я уж и не помню, но раньше я этими функциями пользовался. Это кажется для ТЕ. Итак
maior - я вот так сделал (если слот Брони в Artraits.txt не менялся):
Хммм... В принципе, не совсем верно, мне кажется.
!?FU29504 - побайтовое копирование параметров артефакта (167). У тебя, как я понял, если в нем будет значение 6 (т.е. торс), то ты меняешь на свое. А если там будет 4-байтовое значение адреса, ну к примеру, 00 6E AA 06, то последнее число тоже поменяется на твое значение, - а далее глюки и баги. Может быть так и происходит с артом 171.
Кстати, меня всегда интересовало, почему происходит копирование 50 байт в цикле !!DO4/1/50/1:Py1/y2; Ведь параметры артефакта заполняют собой 32 байта.
Можно даже посчитать - z-переменная - 512 байт, зарезервировано 200 z-переменных, т.е. 102400 байт. Как сказано ранее, можно добавить 3200 артов, т.е. на 1 арт придется 102400/3200=32 байта.
Это же подтверждает практика. Поэтому все же лучше поменять цикл на !!DO4/1/32/1:Py1/y2;
Ну и наконец для позиции на теле, исходя из моей функции, смещение составляет 8 байт, поэтому, MOP, в твоем примере попробуй поменять
!!UN&y1=6/x3=*номер арта*:Cx2/1/*номер слота*;
на
!!UN&x16=9/x3=*номер арта*:Cx2/1/*номер слота*;
major - да, твой скрипт лучше, и я им сейчас пользуюсь. Арт-171 не глючит. Свой вариант я только из отчаяния сделал.
Кстати, придумал способ, чтобы не юзать кучу z-переменных для описаний артов (если артов много). На случай кликов использую такой код:
!?CM2&$Place$>1/$Place$<45;
!!VRy2:S$Place$-2;
!!VRy2&$Place$>39:S$Place$-21;
!!HE-1:A1/?y1/y2;
!!FU&y1<171:E;
!!VRy3:Sy1+1830;
!!VRz940:S@ArtMop[0]@;
!!VRz941:Sy3;
!!VRy-1:S940 -1 *512 +v4138;
!!VRy-2:S941 -1 *512 +v4138;
!!VRy2:Sy1*32+v4139;
!!UN:Cy2/4/y-1;
!!VRy2:Sy1*32+v4139+16;
!!UN:Cy2/4/y-2;
При получении артефакта в каком-либо объекте поступаю так же. Поэтому использую всего две z-переменных для всех артов.
Однако, у меня есть два вопроса по твоему скрипту:
1)Для чего в нём используются z280-z296? Можно обойтись без них?
2)Для чего делать параметры артов (+1 к Атаке и т.д.) через UN:C, если !?AE вроде нормально работает с новыми артефактами?
Добавлено ([mergetime]1240127533[/mergetime]):
1) z280-z294 используются для хранения параметров артефактов (стоимость, слот, класс и т.д.), а вот z295-z296 - уже и не помню для чего, кажется как раз для ссылок на название артефактов.
2) конечно в принципе не обязательно, просто мне так нравится.
А-а-а-а, я вспомнил! Используется 15 (не 14) z-переменных (280-294), т.е. получается 512*15/32=240 артефактов.
Я таблицу артефактов перенес в новое место, поэтому 240 - это общее количество артов, т.е. начиная с 0 последним будет арт №239. Посчитал, что дополнительно около 70 артефактов хватит... А параметры старых артов (0-170) просто копируются в новую таблицу.
[quote=Docent Picolan,21 Mar 2008, 01:15]
вот вам привет от дъякона, к сожалению проживающего ныне на банановом острове:
Дъякон
0:06:14 Данный скрипт позволяет добавить 3200 новых артов. Скрипт добавляет новый бланковый арт, св-ва которого можно задать при помощи ЕРМ. Но нельзя занимать переменные z800-z1000.
Так Дьякон, вроде нормальный чел был! За что его?
за разногласия с администрацией тсс... а то еще и нас попрут.
major - ясно.
Кстати, через UN:C параметры артам действительно лучше задавать. Главным образом для HE:F с пятым параметром.
Только одну ошибочку заметил:
Ребята! Если не жалко, немогли-бы вы поделиться графическими моделями новых артефактов?
Жа-а-а-алко!
Мод доделаю - кради сколько хочешь.
Эх....
Я в печали. Мои мечты разрушаются. Мир полон отчаяния и скорби.
Скрипт нарушает работу всех комбо-артефактов (нет замков, при клике - вылет), и восстановить их после этого скрипта не получается через !!UN:A.
Чего сказать? ХЭЛП!
Причину выяснил. Оказывается, не стоит копировать таблицу первичных параметров.
Действительно из-за этого? Странно. Для комбо-артов своя таблица есть...
Да вот так и есть...
Сейчас я таблицу основных параметров артов, их названий и описаний уже вынес в отдельный файл (чтобы z-переменные не захламлять и не тормозить игру функцией копирования), но и при исконном варианте баг идёт из-за переадресации таблицы перв. навыков.
Люди создайте мне арт, ато я так ничё и не понял из этой темы картинка как у арта 1 (свиток заклинания), он ничё не должен давать, просто подсказку по клику правой кнопкой мыши... лежит в отделе для других артов.
Добавлено ([mergetime]1251015013[/mergetime]):
ещё если можно как проверить, есть ли у героя этот арт, и как его дать/убрать у героя...
Люди заняты своими делами. Объяснять всё по порядку у них времени нет (да и сомнительная это трата времени). Попробуй разобраться сам.
P.S. Почему-то я не пришёл на этот форум с криками "ААА! Хэлп! Люди, сделайте всё за меня, а потом объясните, как вы это сделали".
я создал арт (из пустого арта вога) но вот как добавить свойства? (увел. вторичных навыков)
Добавлено ([mergetime]1251024205[/mergetime]):
и первичных
Триггеры !?AE0 и !?AE1
Блин как отменить неделю монстров? я иду с крестьянином 1 и больше никем, тут неделя монстров, мне 50 троглодитов перегораживают дорогу... жесть
а мне надо с одним... вообще мне надо чтоб герой ходил с 1 мечником, 1 алебардщиком и 1 копейщиком. Но такая армия не может победить монатров, самопоявляющихся в начале каждой недели
И у меня полезли проблемы с комбо-артефактами..
Переписывал код на С -
- при непереносе таблицы первичных параметров эти самые параметры добавляются абсолютно рандомно. Ну это ожидаемо, да. А неожиданно то, что каждый новый добавленный артефакт считается сборником, разбирающимся как Альянс Ангелов.
- при переносе - ломаются сборники, при снятии нового артефакта с куклы - вылет.
Я подозреваю, что надо либо менять не все указатели, либо наоборот, какой-то был не замечен отладчиком.
Так. Проблема с сборником решена - надо было инитить соответствующие два поля структуры не нулями, а минус единицами.
Сборники, впрочем, по-прежнему, ломаются, но при клике на арт уже ничего не падает.
Методом тыка починил разборку сборников. По видимому, надо изменять указатели на таблицу бонусов только по адресам 0x4E2DF1 и 0x4E2F7C, а 0x4E2D26 и 0x4E2E95 - не трогать.
условно рабочий код. Условно - потому что час ночи и завтра стопудов найдутся еще баги.
#define ART_NUM 5000
typedef struct
{
char *name;
int cost;
int slot;
int rank;
char *desc;
int partof;
int wholeart;
int spellflag;
} ART_RECORD;
typedef struct
{
char att;
char def;
char knw;
char spp;
}ART_BONUS;
char* t = "------";
ART_RECORD newtable[ART_NUM];
ART_BONUS newbtable[ART_NUM];
void CreateNewArtTable()
{
memcpy(newbtable,(void*)0x7B8358,4*170);
//изначальная функция
*(int*)0x660B68 = (int)(newtable);
//UN:A фикс
*(int*)0x7324BD = (int)ART_NUM;
//для загрузки параметров из текстовиков сразу в новую таблицу
*(int*)0x44CB32 = (int)(newtable);
*(int*)0x44CD1E = (int)(newtable);
*(int*)0x44CD6C = (int)(newtable);
//хз зачем, но жрать не просит
*(int*)0x44CCDF = 0x1C+(int)(newtable);
*(int*)0x44CCFA = 0x1D+(int)(newtable);
*(int*)0x716F8D = 0x18+(int)(newtable);
*(int*)0x716F9E = 0x18+(int)(newtable);
*(int*)0x716FAE = 0x14+(int)(newtable);
*(int*)0x716FBF = 0x14+(int)(newtable);
*(int*)0x717117 = 0x14+(int)(newtable);
*(int*)0x717146 = 0x18+(int)(newtable);
*(int*)0x754A42 = (int)(newtable);
//даём таблицу бонусов. Охтунг, баги и чернокнижество.
// *(int*)0x4E2D26 = (int)(newbtable); //при комм. этого указателя учет бонусов - норм, замки на сборных - норм, клик на сб - вылет.
*(int*)0x4E2DF1 = (int)(newbtable);
//*(int*)0x4E2E95 = (int)(newbtable);
*(int*)0x4E2F7C = (int)(newbtable);
/*memcpy(newbtable,(void*)0x7B8358,4*170);*/
//инит новых артов
for(int i=170; i!=ART_NUM; i++)
{
newtable[i].slot=1;
newtable[i].desc=t;
newtable[i].name=t;
newtable[i].partof=-1;
newtable[i].wholeart=-1;
newtable[i].cost=1000;
newtable[i].rank=16;
newbtable[i].att=0;
newbtable[i].def=0;
newbtable[i].knw=0;
newbtable[i].spp=0;
}
}
Вроде нет багов. Теперь надо расширить число читаемых строк из artevent и artraits
А может попроще как-нибудь? Например, помимо вышеперечисленных указателей, поменять ещё четыре, со смещением +280h от начала таблицы:
4E2D3Dh
4E2DD7h
4E2EACh
4E2F41h
И всё тип-топ.
Для artraits.txt - 0x44CCA8 и 0x44CACA. Формат: кол-во артов*4+2.
Для artevent.txt - 0x49DD90. Формат: кол-во артов*4.
ВОГ изменяет вышеуказанные данные своими, которые в exe стоят по адресам 325200h, 32520Ch и 325248h. Можно изменить их и там, но я предпочитаю модифицировать СОД напрямую в экзешнике, деактивируя вог-копирования, от которых в дизассемблере только непонятки.
Для artevent.txt ещё нужно расширить таблицу ссылок на строки, а то пойдёт затирание памяти *death*. В начале этой таблицы четыре байта, отвечающие за какое-то смещение при текущем поднятии артефакта, дальше - собственно ссылки. Указатели есть и на то, и на другое (в скобках - адреса воговских данных в exe):
49DD9A (325218)
7059E2
705A32
705A68
705FC2
70613B
остальные: +4
49F2E7 (325224)
49F51E (325230)
49F5DA (32523C)
Тьфу, и ведь почти все нашёл теперь придется что нить другое копать для восстановления душевного равновесия .
Впрочем, огромное спасибо, если надо будет что в длл зашить - обращайся
Все работает.
//#include "stdio.h"
//-----artifacts------------
#define ART_NUM 5000
#define SLOT_GRAIL 0
#define SLOT_HEAD 1
#define SLOT_SHOULDERS 2
#define SLOT_NECK 3
#define SLOT_HAND 16671
#define SLOT_RHAND 4
#define SLOT_LHAND 5
#define SLOT_TORSO 6
#define SLOT_RING 7
#define SLOT_RRING 1339
#define SLOT_LRING 65
#define SLOT_LEGS 8
#define SLOT_MISC 9
#define SLOT_WM1 10
#define SLOT_WM2 11
#define SLOT_WM3 12
#define SLOT_WM4 13
#define SLOT_BOOK 14
#define SLOT_MISC1 1334
#define SLOT_MISC2 21732
#define SLOT_MISC3 117033
#define SLOT_MISC4 35338
#define SLOT_MISC5 21748
typedef struct
{
char *name;
int cost;
int slot;
int rank;
char *desc;
int partof;
int combonum;
int spellflag;
} ART_RECORD;
typedef struct
{
char att;
char def;
char knw;
char spp;
}ART_BONUS;
char* dummyhint = "It is a very blank artifact.";
ART_RECORD newtable[ART_NUM];
ART_BONUS newbtable[ART_NUM];
char* arteventtable[ART_NUM+1]; //
void CreateNewArtTable()
{
//изначальная функция (c) Дьякон
*(int*)0x660B68 = (int)(newtable);
//UN:A фикс
*(int*)0x7324BD = (int)ART_NUM;
//для загрузки параметров из текстовиков сразу в новую таблицу
*(int*)0x44CB32 = (int)(newtable);
*(int*)0x44CD1E = (int)(newtable);
*(int*)0x44CD6C = (int)(newtable);
//хз зачем, но жрать не просит
*(int*)0x44CCDF = 0x1C+(int)(newtable);
*(int*)0x44CCFA = 0x1D+(int)(newtable);
*(int*)0x716F8D = 0x18+(int)(newtable);
*(int*)0x716F9E = 0x18+(int)(newtable);
*(int*)0x716FAE = 0x14+(int)(newtable);
*(int*)0x716FBF = 0x14+(int)(newtable);
*(int*)0x717117 = 0x14+(int)(newtable);
*(int*)0x717146 = 0x18+(int)(newtable);
*(int*)0x754A42 = (int)(newtable);
//даём таблицу бонусов. Охтунг, баги и чернокнижество. Адреса (с) major
memcpy(newbtable,(void*)0x7B8358,4*170);
// *(int*)0x4E2D26 = (int)(newbtable); //при комм. этого указателя учет бонусов - норм, замки на сборных - норм, клик на сб - вылет.
*(int*)0x4E2DF1 = (int)(newbtable);
//*(int*)0x4E2E95 = (int)(newbtable);
*(int*)0x4E2F7C = (int)(newbtable);
/*memcpy(newbtable,(void*)0x7B8358,4*170);*/
//.txt reading (c) MoP
*(int*)0x49F2E7 = 4+(int)(arteventtable);
*(int*)0x49F51E = 4+(int)(arteventtable);
*(int*)0x49F5DA = 4+(int)(arteventtable);
*(int*)0x49DD9A = (int)(arteventtable);
*(int*)0x7059E2 = (int)(arteventtable);
*(int*)0x705A68 = (int)(arteventtable);
*(int*)0x705FC2 = (int)(arteventtable);
*(int*)0x70613B = (int)(arteventtable);
*(int*)0x44CCA8 = (int)(ART_NUM*4+2);
*(int*)0x44CACA = (int)(ART_NUM*4+2);
*(int*)0x49DD90 = (int)(ART_NUM*4);
//инит новых артов
for(int i=1; i!=ART_NUM+1; i++)
{
arteventtable[i] = (char*)malloc(255);
}
for(int i=170; i!=ART_NUM; i++)
{
newtable[i].slot=0;
newtable[i].desc=dummyhint;
newtable[i].name=dummyhint;
newtable[i].partof=-1;
newtable[i].combonum=-1;
newtable[i].cost=1000;
newtable[i].rank=16;
newbtable[i].att=0;
newbtable[i].def=0;
newbtable[i].knw=0;
newbtable[i].spp=0;
}
}
//-----------------------------
extern "C" __stdcall BOOL DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
{
CreateNewArtTable();
}
break;
case DLL_PROCESS_DETACH:
{
for(int i=1; i!=ART_NUM+1; i++)
{
free(arteventtable[i]);
}
}
// FreeNewArtTable();
// detach from process
break;
case DLL_THREAD_ATTACH:
// attach to thread
break;
case DLL_THREAD_DETACH:
// detach from thread
break;
}
return TRUE; // succesful
}
\\ char* dummyhint = "It is a very blank artifact.";
Ну просто blank's уже есть, эти будут very blank.
Возможно, я криворук и ФИО мои - Бхагаван Рабиндранатыч Шридрахан-Прашантов, но при расширении количества читаемых артефактов из текстовика необходимо, чтобы все они там были. Иначе работает очень нестабильно. Оно так и задумано?)
Придется, видимо, еще и количество строк из текстовиков выдирать
Хотя какого чёрта? До текстовиков в лоде один хрен не добраться.
Хотя какого чёрта? Просплюсь и сделаю конфиг. Или еще что-нить придумаю
сделал расширение таблицы даваемых заклинаний. Теперь с нулевого артефакта и до обеда. Думаю над расширением свитча - места освободилось дофига, можно всяких свиткоподобных артефактов штук двадцать стопяцот запихнуть..
2МоР: я все хочу написать ман по написанию дллок с нуля (начиная с установки кодблокса и заканчивая описанием какой-нить простенькой). И всё лень.
2Дьяк. Дык, я и делаю новую таблицу указателей, маллочу всё элементы и переписываю указатели на неё. Копировать, кста, не обязательно - на момент загрузки длл текстовики еще не прочитаны.
Вроде бы расширил кейсы. Некрасиво, но расширил. Теперь в таблице типов типы 0x80 - 0xFF дают заклинания 0-127. Планирую когда-нить припаять еще "все заклинания 1-2-3-4 уровней" и просто "все заклинания".
Только хотел выложить полный код и длл - наткнулся на баг. Четыре строки
*(int*)0x7059E2 = (int)(arteventtable);
*(int*)0x705A68 = (int)(arteventtable);
*(int*)0x705FC2 = (int)(arteventtable);
*(int*)0x70613B = (int)(arteventtable);
гробят воговские !!CA и !!CH. Вероятно, виновата только одна из них - но мне влом думать, какая.
Добавлено ([mergetime]1269706512[/mergetime]):
Впрочем..
http://waper.ru/file/1288984/emeraldLib-0.01.rar
Добавлено ([mergetime]1269706921[/mergetime]):
Тьфу ж ты блин, совсем забыл о клятом Грохоте Титана, который угробил для тестов и забыл вернуть на место
http://waper.ru/file/1289964/emerald-alpha.rar
относительно работает, если не смотреть на кривость обвязки (самих артефактов, описаний и пурги из юнитсхинтов в конфиге)
В emerald.cfg хранится количество читаемых строк из artraits и artevents.
Привязка заклятий и бонусов к артефактами пока осуществляется в самой длл - было лень что-либо придумывать.
Надо было предупредить людей с момента регистрации, что доверять мне можно, а проверять - нужно.
Не, этот баг я словил вчера (не читалась последняя строка из текстовиков).
feanor, будь умницей, напиши пожалуйста строчку по виртуал-паскальному:
extern "C" __stdcall BOOL DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
Это точка входа в длл. Основная процедура в паскале, проще говоря.
http://slil.ru/29104939
собственно, кой-что докрутил. Мелочи в основном.
_________readme.txt__________
emerald.dll -- 0.03
Позволяет использовать артефакты с номерами, большими 170 (до 5000. Кому надо больше - ну..можете перекомпилировать. Извращенцы!11)
Позволяет привязывать к ним заклятья и бонусы первичных навыков.
В архиве есть состряпанный на горячую руку пример.
Установка:
1. Убедитесь, что у вас установлена Era. Предпочтительно - версии не ниже 1.6.
2. Положите emerald.dll в папку плагинов Эры (/EraPlugins/, как правило) и emerald.cfg в папку /Data/. Если вы хотите проверить работоспособность - положите h3wog.lod с расширенным artifact.def в /Data/
3. Запишите дополнительные строки в файлы описания артефактов (artraits и artevents)
4. Запишите их число в emerald.cfg. Охтунг! Если строк будет меньше, чем записано в конфиге - игра просто не запустится.
5. njoy!
нидваниполтора. О привязке заклинаний и первичных бонусов.
DLL экспортирует функцию ExtArtProperties(int num, char spell, char att, char def, char knw, char spp)
num - номер артефакта;
spell - номер заклинания в спецтаблице (для привязки какого-то конкретного заклинания используйте ID = номер заклинания + 128)
att, def, knw, spp - значения первичных навыков
После привязки заклятья к арту потребуется включить его через UN:A<номер>/8/1;
Второй параметр для ExtArtProperties, окромя 128-255 (что? в Героях нет 127 заклинаний? это вы так думаете.):
Таблица запрета артефактов на карте - [699538h]+4E224h.
Алсо, что-то там иногда мелькает с [699538h]+4E2B4h.
угу, я знаю. Только мне тоже представить ситуацию с >1000 артов в одном моде было сложно.
Хотя не невозможно. Скажем, генерацию системы вещей аля ММ "в лоб"
Последние штрихи:
ВСЕ реальные указатели на таблицу артефактов:
44CB32
44CCDF +28
44CCFA +29
44CD1E
44CD6C
660B68
716F8D +24
716F9E +24
716FAE +20
716FBF +20
717117 +20
717146 +24
754A42
Считывание в таблицу признака GivesSpell:
44CCE6 mov eax,L0063B998; <- адрес таблицы, в которой находятся номера артефактов, дающих заклинания.
44CCF3 cmp eax,L0063B9BC; <- адрес, на котором заканчивается считывание.
А перезалить длл-ку может кто-нибудь?
Форум Invision Power Board (http://nulled.cc)
© Invision Power Services (http://nulled.cc)