• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, доброго времени суток! Спешите принять участие в оценке работ на конкурсе "Таинственные миры" 2024!
    Ждем именно вас!

    Ссылка на конкурсную тему - тык
    Ссылка на тему с работами участников- тык

Кольцо для ключей, ключница (Keyring)

Диккен

Участник форума
Регистрация
12 Июн 2004
Сообщения
470
Благодарности
127
Баллы
210
Про ключи

Ключи, к. лежат на земле нужно использовать через инвентарь.
Ключи, к. воруем нужно использовать через инвентарь.
Ключи, к. подбираем при обыске исчезнут автоматом.

Инструкция
1. Подойти к сундуку, открыть рюкзак, использовать связку ключей (или вызвать карту, в случае замещения функции карты).
2. Открыть рюкзак и использовать связку ключей повторно, ключи исчезнут (или вызвать карту)

*) Возможен баг с сундуком, если использовать повторно около открытого сундука, лечиться через Ctr + Alt + F8. Ключницу тестировал на сундуке Ксардаса, осталось проверить двери.

В проекте GothicSourcer:

1. Чтобы обновить все ключи, достаточно заменить (C_Item) на (ITEM_KEY)
instance ItKe_Xardas(ITEM_KEY).

2. дополнить код MissionItems_1.d после ключа Ксардаса, заменить все ItKe_Xardas, кроме 1й строки, на действующие ключи.

Код:
func void Use_ItKe_Xardas()
{
    if(Hlp_IsItem(item,ItKe_Xardas))    {    Choice_key(ItKe_Xardas); };
    if(Hlp_IsItem(item,ItKe_Xardas))    {    Choice_key(ItKe_Xardas); };
    if(Hlp_IsItem(item,ItKe_Xardas))    {    Choice_key(ItKe_Xardas); };
    if(Hlp_IsItem(item,ItKe_Xardas))    {    Choice_key(ItKe_Xardas); };
    if(Hlp_IsItem(item,ItKe_Xardas))    {    Choice_key(ItKe_Xardas); };
    if(Hlp_IsItem(item,ItKe_Xardas))    {    Choice_key(ItKe_Xardas); };
    if(Hlp_IsItem(item,ItKe_Xardas))    {    Choice_key(ItKe_Xardas); };
    if(Hlp_IsItem(item,ItKe_Xardas))    {    Choice_key(ItKe_Xardas); };
    if(Hlp_IsItem(item,ItKe_Xardas))    {    Choice_key(ItKe_Xardas); };
    if(Hlp_IsItem(item,ItKe_Xardas))    {    Choice_key(ItKe_Xardas); };
 
    if(Hlp_IsItem(item,ItKe_Xardas))    {    Choice_key(ItKe_Xardas); };
    if(Hlp_IsItem(item,ItKe_Xardas))    {    Choice_key(ItKe_Xardas); };
    if(Hlp_IsItem(item,ItKe_Xardas))    {    Choice_key(ItKe_Xardas); };
    if(Hlp_IsItem(item,ItKe_Xardas))    {    Choice_key(ItKe_Xardas); };
    if(Hlp_IsItem(item,ItKe_Xardas))    {    Choice_key(ItKe_Xardas); };
    if(Hlp_IsItem(item,ItKe_Xardas))    {    Choice_key(ItKe_Xardas); };
    if(Hlp_IsItem(item,ItKe_Xardas))    {    Choice_key(ItKe_Xardas); };
    if(Hlp_IsItem(item,ItKe_Xardas))    {    Choice_key(ItKe_Xardas); };
    if(Hlp_IsItem(item,ItKe_Xardas))    {    Choice_key(ItKe_Xardas); };
    if(Hlp_IsItem(item,ItKe_Xardas))    {    Choice_key(ItKe_Xardas); };
 
    if(Hlp_IsItem(item,ItKe_Xardas))    {    Choice_key(ItKe_Xardas); };
    if(Hlp_IsItem(item,ItKe_Xardas))    {    Choice_key(ItKe_Xardas); };
    if(Hlp_IsItem(item,ItKe_Xardas))    {    Choice_key(ItKe_Xardas); };
    if(Hlp_IsItem(item,ItKe_Xardas))    {    Choice_key(ItKe_Xardas); };
    if(Hlp_IsItem(item,ItKe_Xardas))    {    Choice_key(ItKe_Xardas); };
    if(Hlp_IsItem(item,ItKe_Xardas))    {    Choice_key(ItKe_Xardas); };
    if(Hlp_IsItem(item,ItKe_Xardas))    {    Choice_key(ItKe_Xardas); };
    if(Hlp_IsItem(item,ItKe_Xardas))    {    Choice_key(ItKe_Xardas); };
    if(Hlp_IsItem(item,ItKe_Xardas))    {    Choice_key(ItKe_Xardas); };
    if(Hlp_IsItem(item,ItKe_Xardas))    {    Choice_key(ItKe_Xardas); };
};

2. Массив создан на 60 ключей, ключница работает с 30 первыми, дополнить код до нужного числа в B_UseKeyring() и ClearPlayerKey(), код разделен на блоки по 10, и в Choice_key(var C_Item KeyID), по 1 блоку на ключ.

3. При повторном использовании ключа, при нахождении его дублика проходит проверка по всей базе ключей, поэтому в В Choice_key(var C_Item KeyID) каждый блок равен 1 ключу. Будьте внимательны, я использовал не стандартое оформление, чтобы сделать код более наглядным. Вот так выглядит 1й блок для проверки ключа

Код:
    if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PC_Hero))
    {
        if(Hlp_IsItem(KeyID,KeyInstance) && Hlp_IsValidItem(KeyID))
        {
            if(B_GetPlayerKey(KeyIndex) == KeyInstance)    {    KeyIndex += 1; }    else
            {    B_SetPlayerKey(PLAYER_KEY_CHOICE,KeyInstance);    PLAYER_KEY_CHOICE += 1;
                Print("Добавлен новый ключ!");
                Log_AddEntry(TOPIC_KEYRING,ConcatStrings(ConcatStrings(KeyID.text[2]," "),KeyID.text[3]));
                CreateInvItems(hero,itmi_keyring,1);    return; };    if(KeyIndex == PLAYER_KEY_CHOICE)    {    return; };

3. Замещение карты и быстрый вызов кольца через B_OnHotkey.d.
Код:
func int player_hotkey_screen_map()
{
    var int OldInstance;
    var int NewInstance;
    if(Npc_HasItems(hero,itmi_keyring) >= 1)
    {    OldInstance = itmi_keyring;
        return OldInstance; };
    if(Npc_HasItems(hero,itmi_keyring2) >= 1)
    {    OldInstance = itmi_keyring2;
        return OldInstance; };

4. Переопределение переменных, чтобы избежать ошибок при сборке проекта (не знаю влияет ли позиция на ГС, поставил их рядом с шаблонами).

RedefinedFunc.dsc
void B_PlayerFindItem(int#,int);
int B_SetPlayerMap(int#);
int B_SetPlayerKey(int,int#);
int# B_GetPlayerMap(void);
int# B_GetPlayerKey(int);
int# PLAYER_HOTKEY_SCREEN_MAP(void);
void B_RemoveNpc(int#);
int B_GiveInvItems(instance,instance,int#,int);
void B_UseItem(instance,int#);
int# B_GetBestPlayerMap(void);
int# B_GetAnyPlayerMap(void);
void B_SetNpcVisual(instance,int,string,int,int,int#);
void B_KillNpc(int#);
int C_NpcHasAmmo(instance,int#);
void B_ExchangeRoutine(int#,string);
void B_SetPermAttitude(int#,int);
void B_ClearImmortal(int#);
void B_SetNpcType(int#,int);
void B_ChangeGuild(int#,int);

RedefinedLocalVariable.dsc
int# Choice_key.KeyInstance;

5. Создать новую запись для дневника
LOG_Constants_Notes.d
const string TOPIC_KEYRING = "Кольцо ключей";
 

Вложения

  • B_PlayerMap.d.txt
    9,8 KB · Просмотры: 9
  • IT_Keys.d.txt
    26,3 KB · Просмотры: 8
Сверху Снизу