zmiana koloru czcionki innych npc (g1) 8482 37

O temacie

Autor pawbuj

Zaczęty 23.03.2014 roku

Wyświetleń 8482

Odpowiedzi 37

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
mam skrypt z woga odnosnie zmiany koloru czcionki NPC w zależności od stosunku do głównego bohatera. jednak odczuwam lagi przy inicjowaniu przez tricktocka. wolałbym to zrobić perceptionami, jednak w wersji poniżej funkcja nie działa

func void EVT_UpdateStatus_FocusName() {
    const int zCView_SetFontColor_offset = 7339392; //6FFD80 thiscall(zCColor)
    var int col;
    var int att;
    var oCNpc her; her = Hlp_GetNpc(hero);
        if(Hlp_Is_oCNpc(her.focus_vob)) {
                var oCNpc  oth; oth = MEM_PtrToInst(her.focus_vob);
                att =  oth.attitude;
                if(att == ATT_FRIENDLY) {
                        col = RGBAToZColor(0,255,0,255); //zielony przyjaciel 
                }
                else if(att == ATT_ANGRY) {
                        col = RGBAToZColor(255,180,0,255); //Orange zły
                }
                else if(att == ATT_HOSTILE) {
                        col = RGBAToZColor(255,0,0,255); //czerwony wróg
                }
                else if(att == ATT_NEUTRAL) {
                        col = RGBAToZColor(255,255,255,255); //Weiß
                };
        }
        else {
                col = RGBAToZColor(255,255,255,255); //Weiß
        };
     
    var int ptr; ptr = MEM_Alloc(4);
    MEM_WriteInt(ptr, col);
    CALL_IntParam(ptr);
    CALL__thiscall(MEM_ReadInt(screen_offset), zCView_SetFontColor_offset);
    MEM_Free(ptr);
};
 

Splash

Splash

Moderator
posty4211
Propsy3414
ProfesjaNierób
  • Moderator
Perceptiony to zmysły NPC, więc jak chcesz to zrobić? Po co tick-tockiem to robisz skoro robi się to przez HookEngine?
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
Perceptiony to zmysły NPC, więc jak chcesz to zrobić? Po co tick-tockiem to robisz skoro robi się to przez HookEngine?
jeżeli nie jest to tajemnicą jak inicjujecie hookengine?
czy w ten sposób nie będzie gra zwalniać?

perceptionem chciałem zrobic w ten sposób, że jeżeli dany npc ma  attitude np. hostile to kolor jego "name" będzie na czerwono.
dodam, że wg załączonego skryptu powyżej, w trakcie gry wychodzą nielogiczne sytuacje np. po pobiciu nas, niektórzy świadkowie stają się "przyjacielsko" nastawieni.



 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
Gra zwalniać będzie od ticktocków, hook engine pod względem wydajności jest na analogicznym poziomie co perceptiony. Czyli wywoływanie dodatkowej funkcji z wnętrza innej, a nie jak w ticktocku ciągłe sprawdzanie czy akurat nie dzieje się to przy czym trzeba wywołać dodatkową funkcję.

Splash

Splash

Moderator
posty4211
Propsy3414
ProfesjaNierób
  • Moderator
Zauważyłem, że w skryptach G1 nie ma funkcji Init_Global, więc chyba aby funkcja działa prawidłowo musisz do startupa każdego świata dodać :
HookEngine(7093113, 8, "EVT_UPDATESTATUS_FOCUSNAME");
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie


pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
ok, sprawdzę ten sposób też.
próbowałem zrobić zmianę koloru  przez usunięcie części kodu i wprowadznie odniesienia do jednego npc czyli self. niestety wywala błąd , nie mogę połączyć self z name.

wiadomo, że focus_vob już nie będzie miał zastosowania.

druga sprawa - czy mamy dla RGBA tylko 4 palety kolorów?


 

Splash

Splash

Moderator
posty4211
Propsy3414
ProfesjaNierób
  • Moderator
A raczej zrobić sobie takiego Init_Global i wywoływać go ze wszystkich startupów... Programuje się tak żeby nie pisać tego samego kodu wiele razy.
Nie wiedziałem, że tak można :D
Cytuj
druga sprawa - czy mamy dla RGBA tylko 4 palety kolorów?
Numery kolorów możesz osiągnąć np. za pomocą painta klikając 2x na dowolny kolor lewym przyciskiem myszy, a następnie opcję "Definiuj kolory niestandardowe". Alpha zawsze wynosi 255 :ok: Przykładowo : col = RGBAToZColor(40,147,210,255);
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
Skąd w ogóle pomysł że self będzie tym npc który jest w danej chwili podświetlony? Self to zmienna którą silnik ustawia w pewnych sytuacjach na różnych npc, ale nie możesz spodziewać się że magicznie zawsze będzie zawierała akurat to czego potrzebujesz :D
Self ma pewne cechy wspólne z this w programowaniu obiektowym, ale trzeba pamiętać że to NIE to samo. Daedalus nie jest obiektowy, twoje EVT_UpdateStatus_FocusName to nie metoda klasy C_NPC (nie ma czegoś takiego w Daedalusie), a po prostu funkcja.

Pobieranie focus_vob to właściwy sposób - będzie wskazywało na podświetlonego cosia (nas interesują sytuacje kiedy tym cosiem jest npc).

Cytuj
druga sprawa - czy mamy dla RGBA tylko 4 palety kolorów?
Co to w ogóle znaczy? Jeśli o to co chodzi, RGBA ma 4 komponenty - jak sama nazwa wskazuje, red, green, blue i alpha (nieprzezroczystość).

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
dość wyczerpująco Panowie opisaliście.

rozumiem,że niestandardowe kolory RGBA można tworzyć i powinniśmy je dodwać na etapie definicji zmiennej RGBAtozcolor. .

przecież brakuje tu żółtego , który w silniku  jest wykorzystywany.

chciałbym korzystać szerzej z funkcji kolorów czcionki bez potrzeby dodawania kolejnych fontów w tga.

czy można standardową funkcję prntscreen tak zmodyfikować, aby edytować również kolor fontu? dodam,że za ul_msgboxes z  CZ nieco nie nadążam.
 

Splash

Splash

Moderator
posty4211
Propsy3414
ProfesjaNierób
  • Moderator
Cytuj
zmiennej RGBAtozcolor
To nie jest zmienna tylko funkcja.
Cytuj
czy można standardową funkcję prntscreen tak zmodyfikować, aby edytować również kolor fontu? d
Do takich rzeczy został właśnie stworzony Ikarus :ok:
Cytuj
dodam,że za ul_msgboxes z  CZ nieco nie nadążam.
Bo do takich rzeczy trzeba dobrze znać ZenGina, Ikarusa i trzeba znać się na programowaniu. Nie mówię, że się znam, ale ogarniam podstawy Ikarusa.
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
Cytuj
rozumiem,że niestandardowe kolory RGBA można tworzyć i powinniśmy je dodwać na etapie definicji zmiennej RGBAtozcolor. .
RGBAToZColor to funkcja, nie zmienna. I nie ma czegoś takiego jak tworzenie nowych kolorów, to po prostu liczby. Ty je wyliczasz na podstawie składowych.

Cytuj
przecież brakuje tu żółtego , który w silniku  jest wykorzystywany.
Słyszałeś kiedyś o łączeniu barw? :|


Światło pochodzące z dwóch różnokolorowych źródeł jak na przykład światło czerwone i zielone także jest postrzegane przez ludzkie oko jako kolor żółty.

RGB: (255, 255, 0)

Cytuj
chciałbym korzystać szerzej z funkcji kolorów czcionki bez potrzeby dodawania kolejnych fontów w tga.
Skąd pomysł że trzeba dodawać nowe "fonty w tga"?

Cytuj
czy można standardową funkcję prntscreen tak zmodyfikować, aby edytować również kolor fontu?
Tak, mając dostęp do pamięci procesu możesz sobie zmodyfikować co tylko chcesz, po prostu wymaga to wiedzy programistycznej i nieco reverse engineeringu.

BTW, to pytanie jest pewnie trochę nie na miejscu, bo pewnie nie rozumiesz co to hook, ale gdzie ty masz zamiar to hookować? W g1 nie ma tej funkcji do której to było hookowane w LeGo (LeGo było pisane na G2NK).

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
Panowie, dużą wiedze macie - to fakt. ale mi chodziło tylko o podpowiedź dla funkcji  typu printscreen (od czego zacząć, bez szkoły programowania ).

@Splash, tutaj wywal błąd parsera.HookEngine(7093113, 8, "EVT_UPDATESTATUS_FOCUSNAME");
u was inicjacja hookengine inaczej wygląda. czemu akurat tak i co oznacza pierwszy rząd cyfr i druga cyfra oraz copy_instr.
   //Engine Hook's:
   if(!Hlp_StrCmp(HooksReinited, "Yes"))
   {
      HooksReinited="Yes";
      //HookEngine_Hook_PreUnconscious_JmpAdress = HookEngine(7630776,6, "HOOK_PREUNCONSCIOUS",COPY_INSTR);
       HookEngine(6924707,5, "HOOK_AFTEROPENSTATUSSCREEN",COPY_INSTR);   
       HookEngine(4349120,5, "APPLY_MENU_OPTIONS_CZ",COPY_INSTR);   
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Popatrz sobie do pliku Engine_Hooks.d.

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
Popatrz sobie do pliku Engine_Hooks.d.
Adanos, ale tego adresu nie znalazłem. (chodzi o dwie pierwsze cyfry.

dodam, że chce wywołać wiecej funckji niż jedna, czy do każdej musi być oddzielny adres?
HookEngine([u][b]7093113, 8[/b][/u], "EVT_UPDATESTATUS_FOCUSNAME",COPY_INSTR);


Post połączony: 2014-03-24, 21:46
jeszcze jeden skrypt, który chciałbym aby powodwał zmianę kolorów wszystkich mobów na kluczyk/wytrychy , tj. drzwi, skrzynie., niestety nie nast.zmiana koloru.może ktoś z was widzi błąd.

func void FocusColor() {

    var oCNpc her;
  her = Hlp_GetNpc (hero);
 
    var int ptr; 
    var oCMobLockable Zamek;
    Zamek = MEM_PtrToInst (her.focus_vob);
 
    var int col;
    const int zCView_SetFontColor_offset = 7339392;   //6FFD80 thiscall(zCColor)
 
 
    if (!her.focus_vob) {
    col = RGBAToZColor(255,0,0,255); //czerwony zamnkięte
    ptr = MEM_Alloc(4);
    MEM_WriteInt(ptr, col);
    CALL_IntParam(ptr);
    CALL__thiscall(MEM_ReadInt(screen_offset), zCView_SetFontColor_offset);
    MEM_Free(ptr);
        return;
    };
     
    if (!Hlp_Is_oCMobLockable(her.focus_vob)) 
    {
    return;
    } else 
    {
 
    }; 
 
    if (Zamek.bitfield & oCMobLockable_bitfield_locked) 
    {
    col = RGBAToZColor(255,180,0,255); //Orange
    } else
    {
    col = RGBAToZColor(255,180,0,255); //Weiß
    };
 
    ptr = MEM_Alloc(4);
    MEM_WriteInt(ptr, col);
    CALL_IntParam(ptr);
    CALL__thiscall(MEM_ReadInt(screen_offset), zCView_SetFontColor_offset);
    MEM_Free(ptr);
 
};

 


Splash

Splash

Moderator
posty4211
Propsy3414
ProfesjaNierób
  • Moderator
Avallach, obie te funkcje zostały opublikowane na WOGu także do G1.
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie


Splash

Splash

Moderator
posty4211
Propsy3414
ProfesjaNierób
  • Moderator
Pawbuj, kiedyś już taki skrypt napisałem, a raczej dopisałem swoje w funkcji Focusname jaką oferuje LeGo. Jak chcesz jej użyć, musisz sobie zmienić tylko kolory. Fragment wygląda tak :
if(Hlp_Is_oCMobContainer(her.focus_vob)) { //jeśli patrzysz na skrzynię
    var oCMobContainer Chest; Chest = MEM_PtrToInst(her.focus_vob);
    if (Chest._oCMobLockable_bitfield == false) //jeśli skrzynia jest otwarta
    {
        if (Chest.containList_next > 0) // jeśli skrzynia ma jakieś przedmioty
        {
        col = Focusnames_Color_Friendly(); // jej nazwa ma kolor zielony
        }
        else
        {
        col = Focusnames_Color_Neutral(); // jeśli jest pusta, kolor jest biały
        };
    }
    else
    {
    col = Focusnames_Color_Angry(); // jeśli jest zamknięta, jej nazwa jest na pomarańczowo
    }
    else if(Hlp_Is_oCMobDoor(her.focus_vob)) { // jeśli patrzysz na drzwi
    var oCMobDoor Door; Door = MEM_PtrToInst(her.focus_vob);
    if (Door._oCMobLockable_bitfield == false)
    {
    col = Focusnames_Color_Neutral(); // jeśli drzwi są otwarte, ich nazwa jest na biało
    }
    else
    {
    col = Focusnames_Color_Angry(); // jeśli zamknięte, ich nazwa jest na pomarańczowo
    };   
};
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
@Splash, dałbym ci więcej niżeli jednego propsa, ale tylko tyle można.

czy okienka , w którym pojawią się opcje dialogowe , mają formę tekstury i jakąś konkretną nazwę.
czy możesz mi podpowiedzieć jeszcze z tym HookEngine( 2 pierwsze rzędy- ich znaczenie  cyfr oraz co zrobić jak chce importować więcej funkcji niżeli 1?

rozumiem,że tick tock ma zastosowanie do wywołania funkcji w określonej jednostce czasu, inaczej tego nie używać?

 


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