Pokaż wiadomości

Ta sekcja pozwala Ci zobaczyć wszystkie wiadomości wysłane przez tego użytkownika. Zwróć uwagę, że możesz widzieć tylko wiadomości wysłane w działach do których masz aktualnie dostęp.


Wiadomości - DerDrache

Strony: [1]
1
To chyba oczywiste, po co ktoś od designu, żeby przemodelować świat:
"Odświeżenie całego świata Kolonii, zachowując oryginalny, surowy styl, bez sztucznego udawania stylu graficznego nowszych produkcji RPG"

Mam już zaczątek zbioru wielotomowych ksiąg, przydałoby się więcej tego, bestiariusze, opowiadania, krótsze formy. Jednym z elementów odswieżenia świata jest jak to nazywam czasem "morrowindyzacja" otoczenia, wypełnienie go przedmiotami zamiast statycznymi obiektami (jak np. w TCoM, gdzie nie wiadomo którą butelkę, książkę, itp. da się podnieść). I do tego potrzebne jest sporo ksiąg.

2


OPIS:

Gothic I: Amplified to próba przemodelowania i zremasterowania świata Gothica I, starająca się zachować jedyny w swoim rodzaju klimat Górniczej Doliny. Podejście do projektu jest proste: ulepszyć i podkręcić każdy aspekt gry, bez dotykania fabuły, zadań, bez dodawania nowych NPC czy obozów. Pod wieloma względami jest to modyfikacja bardziej przypominająca L'Hiver czy Revisioned do drugiej części serii, niż popularne mody rozszerzające "jedynkę". Produkcja jest również mocno inspirowana protypowymi wersjami alpha i beta pierwszego Gothica, przywracając niektóre sensowne pomysły na które Piranhom nie wystarczyło czasu.


Główne założenia modyfikacji:

  • Odświeżenie całego świata Kolonii, zachowując oryginalny, surowy styl, bez sztucznego udawania stylu graficznego nowszych produkcji RPG (oszczędne wykańczanie świata obiektami otoczenia jak drzewa czy krzaki, oryginalne tekstury z poprawionym mapowaniem, obiekty intencjonalnie stylizowane na niską szczegółowość).
  • Przemodelowanie ekonomii gry, jak również balansu i podejścia do walki oraz rozwoju postaci w taki sposób, aby gra była bardziej przyjemna, wymagająca i różnorodna.
  • Nowe mechaniki, usprawnienia.
  • Brak dodatkowych obozów, NPC, questów, zmian w oryginalnej fabule Gothic I.


Bardziej szczegółowa lista feature'ów:
Spoiler
Przebalansowanie wszystkich broni, jak również nowe sposoby walki:
   Nowe właściwości broni, jak penetracja pancerza czy siła przeciw konkretnym typom oponentów.
   Obrażenia łuków skalujące się ze zręcznością
   Różne rodzaje strzał z możliwością ich szybkiej zmiany w trakcie walki.
   Znacznie bardziej agresywne potwory.
   Czary skalujące się z maną i kręgami (różne wzory dla run i zwojów - nierzadko użycie zwoju będzie wciąż opłacalne mimo posiadania runy).
   Walki z bossami.
   Różni przeciwnicy podatni na różne typy obrażeń.
   Możliwość założenia więcej niż jednej broni do walki w zwarciu i podpięcia jej pod klawisze 1-9.
   Opcjalne, szybsze wybieranie czarów pod jednym przyciskiem i myszką
   W pełni działające i zbalansowane potwory dystansowe, jak Ork z kuszą czy szkielet z łukiem.
Ulepszenia ekonomii
   Dostosowanie wartości każdego przedmiotu w grze.
   Niemożliwe jest po prostu kupienie najlepszych broni/amuletów/pierścieni.
   Mnożnik przy sprzedaży mocno obniżony.
   Ogólnie, znacznie zmniejszenie ilości rudy, i zwiększenie konieczności wydawania jej, w szczególności w końcowych rozdziałach.
   
Usunięcie każdego możliwego błędu w oryginalnych Gothicach  (bez dodawania nowych, tu ukłon do wersji nazwanej od najpopularniejszego interaktywnego obiektu w Świątyni Śniącego) (modyfikacja będzie również integrować już istniejące mod-fixy). Usunięcie również błędów nigdy nie poprawionych, jak zepsute SVM NPC-ów, brak losowej pory deszczu, błędy dźwiękowe przy zmianie niektórych motywów muzycznych (np. przy wyjście ze Starej Kopalni) i inne.
Możliwość nauki sprintu, jak również zwiększenia wytrzymałości przy użyciu przedmiotów.
Całkowicie nowy system kradzieży kieszonkowej, łączący najlepsze cechy tych z obu Gothiców.
Całkowicie nowy system otwierania zamków, nie losowy, i nie wymagający zapamiętywania kombinacji.
Usprawnienia typu quality-of-life, pochodnia pod przyciskiem, wygodny panel z informacjami, sprint pod przycisk, filtrowanie przedmiotów w ekwipunku po nazwie, ulepszenia focusowania przedmiotów, oznaczenie przeczytanych książek, możliwość używania stałych bonusów do statystyk od razu, i dużo więcej.
Przebudowany system teleportacji, z jedną runą i wybieraniem miejsca docelowego później. Również dodano wiele pojedynczych zwojów na wczesnym i średnim etapie gry aby zmniejszyć backtracking.
Opuszczona kopalnia.
Znane z dawnych wersji Podziemne miasto Orków, to z powierzchni zostało usunięte.
Przebudowane stare lokacje, jak Stara Cytadela, Wieża mgieł, Stary Klasztor, zachowując oryginalną stylistykę, jak również dziesiątki pomniejszych zmian w całym świecie.
Nowy system alchemii, z przejrzystymi, animowanymi ekranami informacyjnymi.
System tworzenia broni, z kilkoma poziomami wiedzy oraz recepturami do zdobycia, kupienia lub znalezienia.
Działająca Arena w Starym Obozie, z możliwością walki jak i obstawiania i oglądania codziennych walk.
Nowe potwore i nowe modele, animacje, rutyny, bronie, przedmioty użytkowe jak i otoczenia.
Pelna kompatybilność z DX11 i LegacyAltRenderer.
Dziesiątki pomniejszych zmian.


Screeny
Screeny dostępne są na stronie moda na moddb.com: https://www.moddb.com/mods/gothic-i-amplified


Stan prac
Aktualna wersja to CLOSED ALPHA. Działa większość featurów, część jest intesywnie testowana.
Chcesz pomóc, umiesz w grafikę 2D/3D, pisanie skrytów, copywriting, design świata, albo chcesz zostać testerem? Albo po prostu chcesz pogadać o modzie? Zajrzyj na nasz discord: https://discord.gg/G2Qu6SuE5E


Techniczne Info
Modyfikacja wymaga do działania Union w najnowszej wersji (proszę pamiętać o oryginalnej wersji Uniona z Steam Workshop/Resource Managera, a nie jakieś dziwne wersje krążące po discordach). Będzie dostępna również w Steam Workshop.


Foreigners info
Mod will be available also in EN. For details about mod, visit moddb mod page: https://www.moddb.com/mods/gothic-i-amplified



3
Skrypty / Visual Studio Code - polskie znaki w skryptach
« dnia: 2022-05-01, 22:17 »
Warto równiez odznaczyć "Auto Guess Encoding"

4
Skrypty / [G1][GFA] Kolizja strzał z NPC
« dnia: 2021-12-15, 19:13 »
Temat do zamknięcia, bardzo łatwo udało się rozwiazać problem Unionem
Dla zainteresowanych kod:

int __fastcall oCAIArrow_CanThisCollideWith(oCAIArrow*, void*, zCVob*);
CInvoke<int(__thiscall*)(oCAIArrow*, zCVob*)> Ivk_oCAIArrow_CanThisCollideWith(oCAIArrow_CanThisCollideWithAddr, oCAIArrow_CanThisCollideWith);

int __fastcall oCAIArrow_CanThisCollideWith(oCAIArrow* _this, void* vtable, zCVob * vob)
{
auto retval = Ivk_oCAIArrow_CanThisCollideWith(_this, vob);
// nasze warunki modyfikujące retval
                return retval;
}

5
Skrypty / [G1][GFA] Kolizja strzał z NPC
« dnia: 2021-12-07, 15:59 »


Popróbowałem w innych miejscach funkcji OcAIArrow::CanCollideWith(zCVob*) i trafiłem wreszcie w opdowiednie miejsce. Zhookowałem funkcję na 0x6195A4 z przy oldInstr równym 7. I działa, podmieniam wartosc zwracaną w momencie gdy obaj NPC spełniają pewne warunki, cacy, strzała przenika. Jednak gdy sam odpalał łuk i strzelał, nastepuje insta crash gry. Oczywiście top funkcja w backtrace to CanCollideWith. Hook nadpisuje oprócz zwracania wartości, także pierwszą instrukcje z nastepnej etykiety(fioletowy kolor na screenie), więc strzelam, ze przy skoku do tej podemnienionej piewszej instrukcji etykiety(w której miejscu jest juz cos innego) dzieje się cos niespodziewanego.

Jest jakaś opcja żeby to jakoś ominąć, inaczej zrobić? Chyba jest coś takiego jak ReplaceFunc w LeGo, ale nie wiem czy dało by się wsadzić funkcję większą, która poprzesuwałaby offsety dalszego kodu.

Dodam, że problem nie lezy w funkcji dedalusowej, hookowanej. Nawet gdy zhookowałem pustą funkcje, to byl crash przy strzelaniu bezim z łuku.

6
Skrypty / [G1][GFA] Kolizja strzał z NPC
« dnia: 2021-12-05, 20:23 »
Cytuj
To już kwestia tego jak działa assembler. ESP zawiera adres, a np. ESI, ECX może już zawierać pointer.
Stack POINTER, więc co za różnica? :D chyba że pomyliłeś się

7
Spacer / [G2NK] AbandonedMine.ZEN
« dnia: 2021-12-05, 20:07 »
Okej, przypomniałem sobie - jest on w GMDK gothica I :) Wszystkie .3dsy powinny tam być https://www.worldofgothic.de/dl/download_28.htm

8
Spacer / [G2NK] AbandonedMine.ZEN
« dnia: 2021-12-04, 20:58 »
Hmm, racja. Teraz zastanawiam się, skąd je wziąłem :D

9
Spacer / [G2NK] AbandonedMine.ZEN
« dnia: 2021-12-04, 18:15 »
Wypakować z Meshes.vdf. Do operacji o których mowilem nie trzeba bledera.

10
Spacer / "Odmrożenie" wody po edycji 3ds
« dnia: 2021-12-04, 02:47 »
Odświeżając wątek. O co w ogóle chodzi z tym "zamrozeniem wody"? Jakim cudem mozliwe jest to, że magicznie podmieni nam się materiał czy tekstura do niego przypisana? Mam podobny problem, jednak rozwiązanie @Paradoxal nie działa, bo u mnie cała woda ma przypisane tekstury z prefixem _A0 (bo jak niby miałoby się to zmienić?).

//ed:
Wciąż pozostaje aktualny stary poradnik https://themodders.org/index.php?topic=49.0
Nie wiem dlaczego ktoś tam na gorze sugerował nałożenie od nowa materialu/tekstury. Problem lezy w dodatkowych informacjach o poruszaniu się tekstur (czyli tym całym MATLIBie), które są całkowicie niezalezne od meshy. Trzeba je sobie po prostu przy kompilacji doczytać i zostaną one dopisane w zenie.

11
Skrypty / [G1][GFA] Kolizja strzał z NPC
« dnia: 2021-12-01, 17:13 »
Hej, to znowu ja.
Jak pewnie wiecie, strzała/pocisk magiczny wystrzelona/y przez NPC ignoruje wszystkich NPC po co drodze do celu, chyba że ten NPC to potwór lub ork. Potrzebuję to zmienić, a dokladnie, kiedy NPC który strzela jest orkiem i ten NPC po drodze jest rownież orkiem, to strzała przez niego przelatuje :)

Szukajac rozwiązan, trafiłem na teoretycznie rozwiązanie niemal gotowe, idealne w Gothic Free Aim. Otóż hookują oni tam oCAIArrow::CanThisCollideWith(zCVob*) przed samym koncem funkcji, sprawdzając kilka warunków i co najważniejsze dla mnie, pobierając strzelającego z oCAIArrow, a "ofiarę" oczywiście z parametru zCVob.
(https://github.com/szapp/GothicFreeAim/blob/master/_work/data/Scripts/Content/GFA/_intern/collision.d #554, GFA_ExtendCollisionCheck())

Niestety próby zhookowania tego u mnie całkowicie nie wypalają. Po zhookowaniu tego w miejscu w którym zrobili to tworcy GFA, nic sie nie dzieje, funkcja sie nie wywołuje nigdy, po prostu nic się nie dzieje. Po shookowaniu tego na początku(co ogólnie nie ma raczej sensu, bo chce zmodyfikowac wartosc zwracana) nastepuje crash w momencie próby edycji voblisty i wpisywania czegoś do rejestru.
Wygląda to mniej więcej tak (wersja z hookiem jak w GFA):

func void EVT_oCAIArrow_CanThisCollideWith()
{
var int collidingVobPointer; collidingVobPointer = MEM_ReadInt(ESP + 8);
var int arrowAI; arrowAI = MEMINT_SwitchG1G2(ESI, EDI);

if ((collidingVobPointer == 0) ||
(arrowAI == 0) ||
(!Hlp_Is_oCNpc(collidingVobPointer)))
{
return;
};

var C_Npc shooter; shooter = _^(MEM_ReadInt(arrowAI + oCAIArrow_origin_offset));
var C_NPC collidingNpc; collidingNpc = MEM_PtrToInst(collidingVobPointer);

if(C_NpcIsOrc(shooter) &&
   C_NpcIsOrc(collidingNpc))
{
// var int ignoreVobList; ignoreVobList = MEM_ReadInt(arrowAI + oCAIArrowBase_ignoreVobList_offset);
        // List_AddFront(ignoreVobList, collidingVobPointer);

        // // // Increase reference counter, otherwise NPC/vob will be deleted on list destruction!
        // var zCVob vob; vob = _^(collidingVobPointer);
        // vob._zCObject_refCtr += 1;

        // // Set return value of collision check to false
        //ECX = 0;
} else
{
PrintScreen("Something differrent than orc hit", 15,54,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
};
};

func void Hook_oCAIArrow_CanThisCollideWith()
{
HookEngineF(oCAIArrow_CanThisCollideWithAddr_positive, 6, EVT_oCAIArrow_CanThisCollideWith);
};

Wszystko rozbija się o pobranie z odpowiednich miejsc shootera i victima. Jak rozumiem, ten vob który przelatuje jest na ESP + 8, poniewaz jedno słowo juz zostalo dolozone na stos, i to by sie zgadzało z liczbą pushy:


(call zdejmuje tych 5 pushy/argumetow koło siebie)

Natomiast nie do konca rozumiem dlaczego oCAIArrow jest odczytywane z ESI zamiast ESP + 4(wszak jest to ukryty argument).

Ogółem cały koncept reprezentowania rejestrów w LeGo/Ikarusie jest dość niezrozumiały dla mnie.
Np. tutaj (całkiem inna funkcja, ale pewnie niedługo się za to zabiorę)

EDI = DMG_OnDmg(EBP, MEM_ReadInt(dmgDesc + 8), EDI, +dmgDesc, +dmg_IsHit);
powyzszy kawałek kodu powstał na kanwie implementacji onDmg, która będzie mi potrzeban do czego innego: EDI jako deadalusowa zmienna jest traktowany jako wartość, ale z drugiej strony w przypisaniu collidingVobPointera juz ESP traktujemy jako adres? wuteef?

12
Spacer / [G2NK] AbandonedMine.ZEN
« dnia: 2021-12-01, 16:28 »
ZEN z WoGa na pewno działa pod G1, więc prawdopodobnie jest pod niego skompilowany. Próbowałeś zamiast tego otworzyć .3ds, potem w dwójce go skompilować jako indoor?
Druga kwestia: być może brak tekstur, albo są one inaczej nazwane w G1. Sprawdź w blenderze skąd model bierze tekstury i zobacz czy są takie pliki.

13
Skrypty / Przechwycenie itemku, który wypada z dłoni
« dnia: 2021-11-21, 19:56 »
OK, jednak masz rację. Zmylił mnie fakt, że wcześniej, gdy podałem nieodpowiednią długość oldInstr w HookEngine, to gra mi sie od razu crashowala przy hookowaniu. A tu nie. Podejrzewam, ze wtedy crashowało się jeśli trafiłem akurat "w środek" gdzieś w bajcie między instrukcjami. Pozostaje znaleźć ten item w EquipItem (co bedzie raczej proste jako ze ta funkcja bierze go jako param; podobnie juz zrobiłem przy upuszaniu w DoDropVob) i nadać co trzeba.

//ed.
wszystko zdaje się działać

14
Skrypty / Przechwycenie itemku, który wypada z dłoni
« dnia: 2021-11-21, 19:23 »
Używam wersji która została dostosowana do G1, bo najnowsze pobierane ręcznie nie były kompatybilne (była gdzieś na forum).

Jak możesz mieć rację, skoro stosując sie do twoich porad wywala mi exception (które jest zhandlowane przez Ikarusa albo i nie)? :)

Na analizę, skąd pobrać itemki przyjdzie czas później, tego w ogóle zbyt dokładnie nie sprawdzałem. Najważniejsze, ze zhookowane funkcje wogóle się nie wywołują, ani nie crashują, po prostu nic się nie dzieje.

W kazdym razie na początek sprawdze tego najnowszego ikarusa/lego.

15
Skrypty / Przechwycenie itemku, który wypada z dłoni
« dnia: 2021-11-21, 00:46 »
Dzięki za zwrócenie uwagi, @bogu9821 ,  rzeczywiście jest problem z wczytywaniem gry, spróbuję coś z flagami.

//ed:
na szybko nadanie tej flagi działa jesli chodzi o zapisy, pozostaje testować dalej czy nie wywoła to jakichś niepożądanych efektow.

I nie wiem czy masz rację z tymi adresami. Przykładowo


Wpisanie 7 w hookEngine EquipItem powoduje crasha

00:21 Warn:  0 U:       SPAWN: Spawnpoint TOT not found. Npc MEM_HELPER_INST cannot be spawned. .... <oSpawn.cpp,#386>
00:21 Info:  0 Q:       Ikarus log functions now print in colour with prefix 'Q:'.
00:21 Info:  0 Q:       LeGo 2.3.0b wird initialisiert.
00:21 Info:  0 Q:       Locals: Install at CREATE
00:21 Info:  0 Q:               Offset is 11
00:21 Info:  0 Q:       Locals: Install at NEW
00:21 Info:  0 Q:               Offset is 11
00:21 Info:  0 Q:       LeGo 2.3.0b wurde erfolgreich initialisiert.
00:21 Fault: 0 Q:       [start of stacktrace]
00:22 Fault: 0 Q:               EVT_OCNPC_EQUIPITEM()                                          +   89 bytes
00:22 Fault: 0 Q:       [end of stacktrace]
00:22 Fault: 0 Q:       Exception handler was invoked. Ikarus tried to print a Daedalus-Stacktrace to zSpy. Gothic will now crash and probably give you a stacktrace of its own.

16
Do 3 razy sztuka..

Próbuję zrobić system, który poprawia AIV_ITEMSCHWEIN, aby nie reagował na przedmioty na które nie powinien reagować. Oczywiscie hookuję funkcję ikarusem/lego. Udało mi się zrobić już upuszczanie przedmiotu przy NPC, zostało jeszcze upuszczanie broni czy co tam osoba trzyma w dłoni przy śmierci/unconscious. Niestety nie jestem w stanie określić która z funkcji to określa

Próby z róznymi funkcjami wygląda tak:

func void Hook_oCNPC_DropFromSlot()
{
const int oCNpc__DropFromSlotAddr = 6972016; //006A6270
HookEngineF(oCNpc__DropFromSlotAddr, 6, EVT_oCNPC_DropFromSlot);
};

func void EVT_oCNPC_DropFromSlot()
{
var c_npc slf; slf = MEM_PtrToInst(ECX);

if(Npc_GetInvItemBySlot(slf, INV_WEAPON, 1))
{
item.change_atr[0] = 99;
PrintScreen (ConcatStrings(ConcatStrings(slf.name, ": DROPFROMSLOT, flage AIV_ITEMSCHWEIN przedmiotu: "), item.name), 15,40,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
} else
{
PrintScreen (ConcatStrings(slf.name, ": DROPFROMSLOTNIC NIE MA NA SLOT1"), 15,42,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
};

if(Npc_GetInvItemBySlot(slf, INV_WEAPON, 2))
{
item.change_atr[0] = 99;
PrintScreen (ConcatStrings(ConcatStrings(slf.name, ": DROPFROMSLOT, flage AIV_ITEMSCHWEIN przedmiotu: "), item.name), 15,44,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
} else
{
PrintScreen (ConcatStrings(slf.name, ": DROPFROMSLOTNIC NIE MA NA SLOT2"), 15,46,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
};
};

func void Hook_oCNPC_DropAllInHand()
{
const int oCDropAllInHandAddr = 6898224; //694230
HookEngineF(oCDropAllInHandAddr, 1, EVT_oCNPC_DropAllInHand);
};

func void EVT_oCNPC_DropAllInHand()
{
var c_npc slf; slf = MEM_PtrToInst(ECX);

PrintScreen (ConcatStrings(slf.name, "DropAllInHand, enter:"), 65,5,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);

if(Npc_GetInvItemBySlot(slf, INV_WEAPON, 1))
{
item.change_atr[0] = 99;
PrintScreen (ConcatStrings(ConcatStrings(slf.name, ": DROPALLI HAND, fl AIV_ITEMSCHWEIN SLOT1 ITEMOWI:"), item.name), 15,70,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
} else
{
PrintScreen (ConcatStrings(slf.name, ": DROPALLI NIC NIE MA NA SLOT1"), 15,72,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
};

if(Npc_GetInvItemBySlot(slf, INV_WEAPON, 2))
{
item.change_atr[0] = 99;
PrintScreen (ConcatStrings(ConcatStrings(slf.name, ": DROPALLINHAND, fl AIV_ITEMSCHWEIN SLOT2 ITEMOWI:"), item.name), 15,70,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
} else
{
PrintScreen (ConcatStrings(slf.name, ": DROPALLI NIC NIE MA NA SLOT2"), 15,74,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
};
};

func void Hook_oCNpc_EquipWeapon()
{
const int oCNpc_EquipWeaponAddr = 6908960; //696C20
HookEngineF(oCNpc_EquipWeaponAddr, 1, EVT_oCNpc_EquipWeapon);
};

func void EVT_oCNpc_EquipWeapon()
{
var c_npc slf; slf = MEM_PtrToInst(ECX);
var C_ITEM itm; itm = MEM_PtrToInst(MEM_ReadInt(ESP + 8));

PrintScreen ("wchodzenie w equip wepaon", 15,60,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);

if (!Hlp_IsValidItem (itm))
{
PrintScreen ("ZLY ITEM", 15,62,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
return;
};

PrintScreen ("EquipWeapon: ZMIENIAMY ITEMSWINIE", 15,62,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
itm.change_atr[0] = 99;
};

func void Hook_oCNpc_Equip()
{
const int oCNpc_EquipAddr = 6908144; //6968F0
HookEngineF(oCNpc_EquipAddr, 3, EVT_oCNpc_Equip);
};

func void EVT_oCNpc_Equip()
{
var c_npc slf; slf = MEM_PtrToInst(ECX);
var C_ITEM itm; itm = MEM_PtrToInst(MEM_ReadInt(ESP + 8));

PrintScreen ("wchodzenie w equip", 15,64,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);

if (!Hlp_IsValidItem (itm))
{
PrintScreen ("ZLY ITEM", 15,66,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
return;
};

PrintScreen ("Equip: ZMIENIAMY ITEMSWINIE", 15,66,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
itm.change_atr[0] = 99;
};

func void Hook_oCNpc_EquipItem()
{
const int oCNpc_EquipItemAddr = 6879552; //68F940
HookEngineF(oCNpc_EquipItemAddr, 2, EVT_oCNpc_EquipItem);
};

func void EVT_oCNpc_EquipItem()
{
var c_npc slf; slf = MEM_PtrToInst(ECX);
var C_ITEM itm; itm = MEM_PtrToInst(MEM_ReadInt(ESP+48+4));

PrintScreen ("wchodzenie w equipITEM", 15,60,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);

if (!Hlp_IsValidItem (itm))
{
PrintScreen ("ZLY ITEM", 15,62,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
return;
};

PrintScreen ("ZMIENIAMY ITEMSWINIE", 15,62,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
itm.change_atr[0] = 99;
};

Nie wiem czy wszędzie są itemy poprawnie przekazane (jak ktoś wie jak to robić, i jest w stanie wytłumaczyć, można używać stricte programistycznego jezyka bo zawodowo jestem programistą cepa; starałem się sledzić skąd po kolei w danym rejestrze brał się itemek, ale nie wiem czy jest to dobrze zrobione, prawdopodobnie moznaby jakieś funkcje powywoływać ręcznie i pobrać ten item), ale ogólnie te funkcje.. w ogóle się nie wywołują. Np żadna z tych z rodziny "equip" nie pokazuje się ani razu, przy zakladaniu czegokolwiek przez kogokolwiek. Jedyna funkcja, jaka sie wywołuje to DropFromSlot(), ale nie mam pojęcia kiedy, bo zdaje się robić to dość losowo, czasem gdy przejdę koło NPC, czasem gdy przyzwę NPC insertem, gdy postać zginie zazwyczaj sie wywołuje, ale nie zawsze itp.

Generalnie w systemie rozchodzi się o to, zeby ustawić itemowi change_atr[0] = 99;. Najłatwiej i najsensowniej wydaje mi sie ze w funkcjach equip, bo potem by to nie lagowało ewentualnie przy zabijaniu wiekszej ilości NPC na raz, ale tak jak mówiłem nie działa to.


17
Skrypty / [Gothic I] LeGo i Ikarus - ktore w końcu?
« dnia: 2021-11-03, 00:31 »
Chcę zrobić system reakcji NPC na podnoszone itemki w ich obecności. Coś bardziej dopracowanego niż aivar przypisany np. Laresowi i Straznikowi w zamku magnatow, czy pole owner w klasie C_ITEM. Jako punkt startowy znalazlem sobie taki temat: https://themodders.org/index.php?topic=28197.0

Problem w tym, ze uzywają tam HookEngine, ktory zdaje się jest w pakiecie LeGo. Czy ten pakiet dziala, czy nie dziala z Gothikiem I? Nie znalazlem nigdzie jasnej informacji poza tematem z 2012 roku. Przy probie instalacji Ikarusa i LeGo, wrzuceniu plikow gdzie trzeba (świetne instrukcje/README mają, raptem godzinę mi zajelo rozkmienienie, nie ma co), co rusz pojawiaja sie blędy parsowania, zduplikowany ident(e.g. ASMINT_OP_popEAX) i tak dalej.

18
Bawię się w przenoszenie różnych potwórków do jedynki, bez zbędnych udziwnień, 1:1. GSourcerem przekonwertowałem WOLF.MSB z dwojki, i po przeniesieniu dodatkowo tekstury .TEX zrobiłem bez problemu warga

Mdl_SetVisualBody      (self,   "Warg_body2"...


Chcialem rowniez przeniesc smoczego zebacza i szkieleta-cieniostwora, natomiast konwersja SHADOW.MSB nie daje nic tzn w ogóle GS nie znajduje odpowiednich plików, mimo ze powinny tam być, bo w G2NK ustawianie wygladu cieniostwora wygląda tak:

Mdl_SetVisual(self,"Shadow.mds");
Mdl_SetVisualBody(self,"Shadowbeast_Skeleton_Body",DEFAULT,DEFAULT,"",DEFAULT,DEFAULT,-1);

Po próbie ustawienia tego w skryptach gra sie crashuje gdy przywolam cieniostwora z message, ze nie znajduje ShadowbeastSkeletonBody. Z zebaczem jest identycznie.


Strony: [1]
Do góry