Перевод Eugene:
Avoiding Message SpamAвтор: guidobot101
Как избежать назойливых сообщений для объектов инвентаря
Если вам тоже неприятно лицезреть сообщения типа "xxx добавлен" или "xxx удален", то эта статья для вас.
Вот основная идея для добавления одного предмета:
set itemRef to PlaceAtMe MyModdedItemType 1 0 0
itemRef.Activate player
Примечания:
1) Этот метод может быть использован только для добавления непостоянных объектов.
2) Необходимость в отдельных названиях для удержания скриптов на объектах особенно проявляется здесь!
Вот более специфическая версия, которая позволяет добавлять N стандартных объектов в инвентарь (без назойливых сообщений), используя внутри-игровую функцию скрипта:
scn MyAddItemScript
; item type/number
short numItems
short itemType
; private
short runAdd
ref itemRef
Begin OnActivate
if numItems > 0
set runAdd to 1
endif
End
Begin GameMode
if runAdd == 0
Return
endif
if itemType == 0
set itemRef to player.PlaceAtMe Gold001 1 0 0
elseif itemType == 1
set itemRef to player.PlaceAtMe Lockpick 1 0 0
elseif itemType == 2
set itemRef to player.PlaceAtMe RepairHammer 1 0 0
elseif itemType == 3
set itemRef to player.PlaceAtMe Torch02 1 0 0
else
set itemRef to 0
endif
if itemRef
itemRef.Activate player
endif
set numItems to (numItems)-1
set runAdd to numItems
Далее для использования:
; какой-нибудь скрипт – пример
set MyAddItemFunc.numItems to 1+0.1*GetRandomPercent; 1-10 для номера
set MyAddItemFunc.itemType to 0.04*GetRandomPercent; 0-3 для типа
MyAddItemFunc.Activate player 1
Примечание: Поскольку фактическое добавление многозначных объектов происходит в GameMode, ничего не произойдет пока не будет закончен текущий скрипт. Вы бы легко могли добавить один из них в блок activate и потом N-1 в другие, или добавить больше чем один за раз в GameMode, и т.д. Это просто образец, с этим кодом нужно поэкспериментировать самостоятельно, что бы увидеть что вам лучше подходит.
Для выбрасывания предметов из инвентаря без назойливых сообщений, можно использовать метод Drop. Нужно отметить, что по умолчанию Drop не заменяет метод OnDrop.
Чтобы удалить предмет из инвентаря, вам потребуется своя собственная копия внутри-игрового объекта, или что более предпочтительно свой собственный заскриптованный объект. Это наилучшим образом осуществляется при помощи глобальной переменной, в случае если у вас есть многочисленные копии. В этом случае глобальная переменная в скрипте привязана к MyQuest, а объект к MyItem.
Begin GameMode
...
if MyQuest.RemoveMyItem > 0 && player.GetItemCount MyItem > 0
set MyQuest.RemoveMyItem to (MyQuest.RemoveMyItem)-1
RemoveMe
endif
...
End
Данный код ничего не делает для объекта (MyItem) не находящегося на игроке. Поскольку MyQuest.RemoveMyItem может быть соответственно не названо, "бесшумное" удаление объекта следует производить с помощью данного:
set MyQuest.RemoveMyItem to player.GetItemCount MyItem
Основные примечания:
1) Конкретные объекты, использованные в MyAddItemScript – специальные и не могут быть скопированы как объекты, имеющие те же самые внутри-игровые свойства. Они могут быть заскриптованы, но это плохая идея из-за возможных конфликтов мода и других причин. Тем не менее, вы можете сохранить с некоторыми дополнениями список ID объектов (как массив или список ссылок) и вызвать RemoveMe по сохраненной ссылке ID.
2) Составные объекты, например, при создании группы с единственным названием PlaceAtMe или AddItem, могут быть удалены только с использованием RemoveItem (функция Drop тоже работает, если вы ее используете).
3) Я все еще пытаюсь найти способ избежать назойливых сообщений EquipItem для составных объектов.