Показать сообщение отдельно
Старый 17.10.2007, 10:39   #1890
Vam

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: М: Скриптинг в Готике

2okin:
Народ, объясните все-таки, откуда берется инт в CreateInvItem. *
В благословенном туторе написано
void CreateInvItem (c_npc n0, int n1); - создает в инвентаре НПС n0 предмет с ID n1.
xxx.id благополучно выдает номер неписей, но для предметов рисует ноль. Так кто такой n1???
Тип instance в скриптах эквивалентен, но не равен типу int.
Т.к. в Даедалусе можно выполнять операции только с простыми типами, а производные типы в нем вообще отсутствуют (указатель, ссылка), то возникает сложность передачи (или присвоения) указателя на класс, а конкретнее на инстанцию (т.к. класс в чистом виде, без инициализации, в скриптах не используется). Для такой возможности разработчики сделали следующее - переопределили тип инстанции к типу int. Функции движка (системные) понимают такое переопределение и работают с ним правильно, с прикладными функциями (записанными в скриптах) всё обстоит сложнее, попробую показать это на примере.
Пример: есть instance hero(C_NPC) и есть const int MyInt = 3; также есть функция func int Info(var int Info_inst). Эту функцию можно вызвать так Info(hero) или так Info(MyInt).
Компиляторы, отличные от GS, пропустят оба выражения и не сообщат об ошибках, но первое выражение правильно, а второе - ошибочно. Компилятор GothicSourcer способен распознавать такие ошибки, но только с вашей помощью.
В папке System есть два файла RedefinedFunc.d и RedefinedLocalVariable.d.
В первый файл записываются функции скриптов (только скриптов, функции движка Готики сюда писать не надо), где запись int# обозначает инстанцию переопределенную к типу int.
Например так: int Info(int#); и т.д.
Во второй файл записываются имена локальных переменных функций, в которых тип instance переопределен к типу int.
После выполнения этих действий вы можете создавать свои функции, аргументом (или возвращаемым значением) которых может быть инстанция, а точнее переопределенный int.
И по аналогии с этим использовать локальные переменные в функциях, состоящие из инстанций.



Добавление от 10/17/07, в 10:59:04
2360:
Уж не знаю как, но в случае с предметами вполен можно написать CreateInvItem(hero,ItFoBeer); (где  ItFoBeer - instance ItFoBeer(C_Item)) и ошибки не будет
Если есть желание можете попробовать другой, "честный" метод:
var int AlbinoBeer;
AlbinoBeer = Hlp_GetInstanceID(ItFoBeer);
CreateInvItem(hero,AlbinoBeer);
Да, оба этих варианта справедливы, но только для функций движка. Поясняю, т.к. инстанция переопределенная к int, есть не что иное, как id инстанции, т.е. её порядковый номер объявления в скриптах. Это справедливо для всех инстанций скриптов, как предметов, нпс, так и других.
Предпочтельно использовать первый метод, т.к. он будет работать и со всеми вашими (прикладными функциями) - см. написанное выше.
Второй метод тоже можно использовать с вашими функциями, но в этом случае аргумент int должен быть "чистым", а не переопределенным, но это приведет несколько к увеличению кода скриптов, нужно всегда будет использовать функцию Hlp_GetInstanceID для получения id инстанции.
Ответить с цитированием