[Union] Potrzebna pomoc przy focusnNames 3281 9

O temacie

Autor Siemekk

Zaczęty 11.03.2020 roku

Wyświetleń 3281

Odpowiedzi 9

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1153
ProfesjaProgramista
  • Złote Wrota
Siemano. Sprawa ma się następująco - jak wiadomo jakiś czas temu opublikowałem patch dot. kolorowych skrzyneczek, szybkiego lootingu itd. (Mam jeszcze 2 do publikacji ;P), jednak teraz zabieram się za 3 - mianowicie zmiana koloru NPC, zależnie od nastawienia, gildii, i czegoś tam jeszcze.
Stąd mam pytanie - czy ktoś robił już coś takiego na Ikarusie i LeGo? Wiem, że istnieje pakiet focusNames, ale dla mnie on jest dość mało precyzyjny. Chodzi mi czy ktoś się bawił lepiej z focusNames... Byłbym wdzięczny jakby taka osoba podzieliła się radami oraz takimi rzeczami, jakie by chciała zobaczyć w patchu czyli np. kolory ustalane w configu.

Pozdro :ok:
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

pawbuj

pawbuj

Użytkownicy
posty1622
Propsy135
ProfesjaSkrypter
  • Użytkownicy
if      (Npc_IsDead(oth))    { col = Focusnames_Color_Neutral();         }  // New by Pawbuj
        else if (party)              { col = Ninja_ColorFocusVobs_Partymember(); }  // New by Pawbuj
        else if (friendly)           { col = Focusnames_Color_Friendly();        }  // New by Pawbuj
        else if (att == ATT_NEUTRAL) { col = Focusnames_Color_Neutral();         }
        else if (att == ATT_ANGRY)   { col = Focusnames_Color_Angry();           }
        else if (att == ATT_HOSTILE) { col = Focusnames_Color_Hostile();         };

Tu jest pełen kod.

https://drive.google.com/open?id=1NsbNtuFR8Ja7wQ30xdQMPiWhdk-JsT8D

 

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1153
ProfesjaProgramista
  • Złote Wrota
HookEngineF(oCGame__UpdateStatus, 8, Ninja_ColorFocusVobs_UpdateStatus);    Czym jest ta stała? Do jakiej metody ona się odwołuje? Bo to jest basement jakiego potrzebuje D:
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

pawbuj

pawbuj

Użytkownicy
posty1622
Propsy135
ProfesjaSkrypter
  • Użytkownicy
HookEngineF(oCGame__UpdateStatus, 8, Ninja_ColorFocusVobs_UpdateStatus);    Czym jest ta stała? Do jakiej metody ona się odwołuje? Bo to jest basement jakiego potrzebuje D:
Jest to nadpisanie Hooka z pakietu Lego zamiast standardowego _FocusNames jest tutaj Ninja_ColorFocusVobs_UpdateStatus
func void Ninja_ColorFocusVobs_UpdateStatus() {
    var int col; col = -1; // Stupid pseudo-locals
    var oCNpc her; her = Hlp_GetNpc(hero);

    if (Hlp_Is_oCNpc(her.focus_vob)) {
        var C_Npc oth; oth = _^(her.focus_vob);
        var int att; att = Npc_GetPermAttitude(oth, hero);                          // Modified by Pawbuj

        var int party; party = Ninja_ColorFocusVobs_GetAIVarSafe(oth, "AIV_PARTYMEMBER", FALSE);
        var int friendly; friendly = ((att == ATT_FRIENDLY || oth.npctype == NPCTYPE_FRIEND)
                                      && (!Ninja_ColorFocusVobs_GetNpcGuild(oth, "GIL_ORCSLAVE")));

        if      (Npc_IsDead(oth))    { col = Focusnames_Color_Neutral();         }  // New by Pawbuj
        else if (party)              { col = Ninja_ColorFocusVobs_Partymember(); }  // New by Pawbuj
        else if (friendly)           { col = Focusnames_Color_Friendly();        }  // New by Pawbuj
        else if (att == ATT_NEUTRAL) { col = Focusnames_Color_Neutral();         }
        else if (att == ATT_ANGRY)   { col = Focusnames_Color_Angry();           }
        else if (att == ATT_HOSTILE) { col = Focusnames_Color_Hostile();         };
    } else if (Hlp_Is_oCMobLockable(her.focus_vob)) {
        // Case for chests, doors and any other lockable mob
        var oCMobLockable lockable; lockable = _^(her.focus_vob);

        if (lockable.bitfield & oCMobLockable_bitfield_locked) { // Check if mob is locked
            if      (STR_Len(lockable.keyInstance)) { col = Focusnames_Color_Hostile();  }  // Need to use a key
            else if (STR_Len(lockable.pickLockStr)) { col = Focusnames_Color_Angry();    }  // Can use lockpick
            else                                    { col = Focusnames_Color_Neutral();  }; // Should never happen
        } else { // Lockable is not locked
            if (Hlp_Is_oCMobContainer(her.focus_vob)) { // Mob is an container
                var oCMobContainer chest; chest = _^(her.focus_vob);
                if (chest.containList_next)         { col = Focusnames_Color_Friendly(); }  // Chest unlocked and has goods
                else                                { col = Focusnames_Color_Neutral();  }; // Chest unlocked but empty
            } else {
                col = Focusnames_Color_Neutral(); // Lockable is unlocked
            };
        };
    } else {
        col = Focusnames_Color_Neutral();
    };

    var int ptr; ptr = MEM_Alloc(4);
    MEM_WriteInt(ptr, col);
    CALL_IntParam(ptr);
    CALL__thiscall(MEM_ReadInt(screen_offset), zCView__SetFontColor);
    MEM_Free(ptr);
};
 

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1153
ProfesjaProgramista
  • Złote Wrota
A czym jest oCGame__UpdateStatus? Oraz po co ta 8, po ów oCGame__UpdateStatus?
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

pawbuj

pawbuj

Użytkownicy
posty1622
Propsy135
ProfesjaSkrypter
  • Użytkownicy
Być może tutaj uda siś Ci się znależć odpowiedź jak zaimplementować ten kod do Uniona.

http://www.gothic-library.ru/search/zCView/

@Siemekk, tak jak napisałem - podmieniłem funkcję _FocusNames na swoją. 
 

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1153
ProfesjaProgramista
  • Złote Wrota
Hmmm - fakt, wiem teraz jakiej metody użyć. Dokładnie chodzi o zCView::SetFontColor, jednak nie wiem na co hooka założyć :/
A widzę, że za te rzeczy odpowiada `oCGame__UpdateStatus` i ta `8`. Jednak nie wiem skąd je brać :/
Skąd ty to wziąłeś? Skoro wszystko u ciebie śmiga :hmm:
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1153
ProfesjaProgramista
  • Złote Wrota
Okej rozgryzłem to. Teraz jeszcze jedna sprawa @pawbuj. Planuję dodać config w którym będzie można ustalić ilość pierścieni dla gracza. Widziałem na WoG.de, że już coś takiego zrobiłeś, jednak ja wolę to zrobić na Unionie. Stąd mam pytanie - skąd wziąłeś adresy potrzebne do zwiększenia tego limitu?

Byłbym wdzięczny za odpowiedż :ok:
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

Mark56

Mark56

Moderator
som veľký magič
posty1632
Propsy1846
ProfesjaAnimator
  • Moderator
  • som veľký magič
Pewnie liczba założonych pierścieni jest sprawdzana podczas zakładania, wiec sprawdziłbym v IDA funkcje:
oCNpc::Equip(oCItem* item)Pewnie będzie tam sprawdzian na typ przedmiotu (flagę) i ilość założonych.

Robiłem zakładanie pasów w G1, i jedyne co odróżnia założony item o normalnego to flaga itm_active, wiec to tez pewnie pomoże znalezc gdzie jest ten warunek i przepisać odpowiedni rejestr.
 


pawbuj

pawbuj

Użytkownicy
posty1622
Propsy135
ProfesjaSkrypter
  • Użytkownicy
Okej rozgryzłem to. Teraz jeszcze jedna sprawa @pawbuj. Planuję dodać config w którym będzie można ustalić ilość pierścieni dla gracza. Widziałem na WoG.de, że już coś takiego zrobiłeś, jednak ja wolę to zrobić na Unionie. Stąd mam pytanie - skąd wziąłeś adresy potrzebne do zwiększenia tego limitu?

Byłbym wdzięczny za odpowiedż :ok:
Adresy były podane w skrypcie Bogu9821.  Szap (mud-freak) jednak dokładnie zdefiniował ich nazwę , aby wszystko miało ręce&nogi. 

Dla przypomnienia..
// Addresses
    const int oCNpc__Equip_ringNum_G1 = 6908773; //0x696B65
    const int oCNpc__Equip_ringNum_G2 = 7577475; //0x739F83

A jeżeli już mowa o Unionie to przydałby się by się jakiś porządny patch Quickslots, który także można włączać/wyłaczać. Chyba już coś takiego robiłeś.

I na koniec mógłbyś jednak opublikować ten kod. Chętnie spojrzę jak to jest napisane w Unionie.
 


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry