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 - Kranek

Strony: [1] 2
1
Znam ten problem i też mi się przytrafił nawet przy importowaniu części świata z gothic 2. Nie wiem czy to wina KrxImpExp czy samego blendera, ale jedyne co mogę Ci poradzić to próba zainstalowania nowszego blendera. Wiem, że sam KrxImpExp niby wspiera blendera do wersji 2.66, ale sam plugin udało mi się dodać do blendera 2.79b, co prawda powoduje to inne problemy, ale jest w stanie zaimportować taki świat i się nie sypie przy edycji, za to czasem się sypie przy imporcie.

2
HTML i CSS / JS pozycja tekstu
« dnia: 2016-11-08, 20:39 »
No jeśli już dobierzesz się do jakiegoś elementu za pomocą getElementById to na przykład masz takie rzeczy do dyspozycji: http://www.w3schools.com/jsref/dom_obj_all.asp

3
MDS i animacje / Problem with Blender
« dnia: 2016-10-19, 22:27 »
First thing, if you somehow modify your model, and export it as .3ds, you need to make sure to remove it's compiled version in _Work\data\Meshes\_compiled, it should have the same name as it's 3ds equivalent, but with .mrm extension.
Also make sure, that every modifications of your model are made in EDIT MODE, because when exporting, blender will zero rotation and scale values that you apply in OBJECT MODE, i'm not sure what will happen with location though, but probably the same thing.

4
Skrypty / Modowanie G2NK pod Windows 10 - brak dialogów
« dnia: 2016-10-16, 14:17 »
Jeżeli ze skompilowanymi przez spacera dialogami jest coś nie tak, to zawsze możesz spróbować użyć programu Redefix.

Mały trick z paczką: Nie dodawaj plików OU tylko sam plik Gothic.dat. Teraz kiedy odpalisz taką paczkę, to gra będzie zmuszona załadować dialogi z plików OU, które powinny być w folderze _Work\data\Scripts\Content\Cutscene, więc jeżeli masz poprawnie zrobione dialogi, to wszystko powinno banglać. (Przynajmniej na czas testów oszczędzasz trochę czasu, bo nie musisz za każdym razem tworzyć paczki)

5
Skrypty / NPC który nie przeszukuje ciała
« dnia: 2016-10-09, 14:36 »
Dokładnie tak.

6
Skrypty / NPC który nie przeszukuje ciała
« dnia: 2016-10-09, 13:05 »
Generalnie to grzebiąc trochę w AI doszedłem do wniosku, że AR_KILL nie powinien być używany w stosunku do NPC, który nie jest graczem, bo coś się może skaszanić w AI atakującego. Zamiast tego, być może lepiej byłoby użyć innego argumentu i ustawić temu, który ma zginąć aivar AIV_DropDeadAndKill na true.

Ewentualnie możesz się zainteresować funkcją B_AssessTalk, która zdaje się odpowiada za to, czy NPC do nas zagada, czy nie.

PS: Nie wiem czy to coś zmienia, ale czy nie lepiej w Npc_IsDead użyć tej zmiennej Dinko, którą już masz, zamiast instancji?

7
Skrypty / NPC który nie przeszukuje ciała
« dnia: 2016-10-08, 23:43 »
Nie wiem co prawda komu zmieniałeś gildię na DMT i jeśli atakującemu, to nie wiem czemu wciąż przeszukiwał ciało, ale powinieneś się zainteresować funkcją C_WantToRansack(var C_NPC slf), gdzie slf to npc, który ograbia a other ograbiany i spróbować dodać warunek dla konkretnego npc, żeby nie przeszukiwał tego, którego nie chcesz.

Co do tej funkcji zagadania, to ciężko powiedzieć mając tylko jej definicję, nie powiedziałeś gdzie jej używasz. W każdym razie nigdzie w Lupino_ZabijaDinko() nie ma rozpoczęcia rozmowy.

8
Gry / Seria Dark Souls
« dnia: 2016-02-26, 15:04 »
No racja walory takiego Blighttowna nie należą do najprzyjemniejszych. Masakrująca toksyna, upierdliwa trucizna, ciągle respiący się przeciwnicy... mimo wszystko z dwojga złego chyba wolę właśnie taką opcję, niż totalną ciemnicę, będącą labiryntem i wypełnioną szkieletami, tymi dużymi pseudo psami zwłaszcza. :D

9
Gry / Seria Dark Souls
« dnia: 2016-02-25, 22:47 »
Tak, naprawdę zajebiaszcza lokacja. Ile razy oglądałem jakieś zagrajmy z Dark Souls tak nikt nigdy się nie cieszył, że musi ją w końcu odwiedzić i wielokrotnie się przekonałem dlaczego.  :lol2:

Jest w ogóle ktoś kto LUBI tę lokacje? :F

10
Narzędzia / Polskie, czyste skrypty do G2NK
« dnia: 2016-02-25, 22:44 »
Zawsze możesz po prostu zdekompilować skrypty, które normalnie są dołączone do polskiej wersji Gothic 2 NK i sobie skopiować brakujące polskie teksty z nich.

11
Spacer / Jak zwykle problem z portalem
« dnia: 2016-02-19, 23:50 »
Oddalenie się od wejścia to jedno, ale kamerka w ogóle nie może 'widzieć' portalu, dopiero wtedy wszystko co niepołączone znika. Mówisz, że cube nie jest połączony z żadną ze ścian? Upewnij się, że żaden z wierzchołków tego cuba nie styka się z wierzchołkiem reszty modelu, bo dla Gothica coś takiego jest połączone. Gdyby były jakieś dziury to zdaje się byłoby zbugowane niebo, a przynajmniej u mnie coś takiego się działo.

12
Skrypty / Trucizna- Wywoływanie
« dnia: 2016-02-14, 15:14 »
Cytuj
Jednak teraz nie mam pojęcia jak zrobić skrypt który  by sprawiał że jak Bohater dostanie strzałą efekt by się pojawiał... próbowałem szperać i wywoływać to za pomocą skryptu szponu ale nie działa

Czyli mam rozumieć, że próbowałeś z B_AssessDamage? I tylko dla herosa nie działa, ale dla wszystkich innych npc już tak?
Jeśli tak, to jest to ten sam problem, który miała inna osoba, na które podałem częściowe rozwiązanie tu:
http://themodders.org/index.php?topic=25950.msg1233325#msg1233325

Cytuj
Dodam także czy dało by się jakoś stworzyć limit zatrutych NPC
Limit zatrutych NPC, no to pewnie przy funkcji włączenia zatrucia dla danego npc, trzeba by dodać warunek z licznikiem, czy osiągnęliśmy limit zatrutych, czy jeszcze nie, no i gdy kogoś zatrujemy to zwiększamy taki licznik, a jak zatrucie minie to licznik zmniejszamy.

Cytuj
zatrute strzały będą tylko dla jednego potwora
W takim wypadku zatrucie wrzucasz w B_MM_AssessDamage z dodanym warunkiem, czy stworek to dany instance albo sprawdzanie AIV_MM_REAL_ID.

13
Skrypty / Rutyna
« dnia: 2016-02-13, 22:35 »
Przecież tworząc dla NPC rutynę używasz specjalnych funkcji określających co dany NPC będzie robił o danym czasie i danym miejscu, to powinno dać Ci do myślenia. Używając takiego notepada++ można znaleźć wszystkie wystąpienia takiej funkcji, czyli też miejsce, gdzie została ona zadeklarowana, czyli możesz podejrzeć jak została zrobiona i napisać własną rutynę (Także polecam się w ten program zaopatrzyć). Dla ułatwienia powiem od razu, że ludzkie rutyny można znaleźć w:
Gothic II\_Work\data\Scripts\Content\AI\Human\TA_Human
Nowo stworzoną rutynę dobrze by było też 'dopisać' analogicznie jak pozostałe w pliku:
Gothic II\_Work\data\Scripts\Content\AI\Human\TA.d

14
Skrypty / self other hero i funkcje
« dnia: 2016-02-11, 09:31 »
Cytuj
1. Chodzi o self, other oraz hero. Z tego co widzę po skryptach są to obiekty (instancje) klasy C_NPC, które tam mają swoje pola jak np. id czy inne name, ale nie zbyt wiem jak to się identyfikuje, tzn. jak gra wie o którego npca chodzi jeśli zamieszczone jest self np.
self i other to zmienne globalne, które co prawda nie są w skryptach zadeklarowane, ale istnieją i są do użytku. A skąd gra wie, no cóż, zwykle sama je ustawia w odpowiednich miejscach, zdaje się przed wywołaniem jakichś funkcji związanych z AI takich jak: "ZS_ReactToDamage" (Gothic 1), która stara się ustalić co się dzieje z npc po otrzymaniu obrażeń i jak ma zareagować, gdzie self to osoba, która obrywa, a other osoba ją atakująca. Też np. taki dialog, gdzie self to osoba z którą gracz rozmawia, a other to osoba, którą zasadniczo sterujemy i rozmawiamy z npc, może być różna od hero, gdzie hero zdaje się trzyma sztywno PC_HERO.

Cytuj
Czemu jeśli my zwracamy się do kogoś to jest other,self a nie hero,self? Czym jest w tym przypadku obiektem other?

Jak wspomniałem, other to postać, którą sterujemy i rozmawiamy z tym npc, nie koniecznie musi być to hero, bo np. moglibyśmy się zmienić w kogoś albo na kodach, albo za pomocą zaklęcia. W przypadku gothica 1 nie porozmawiamy inną postacią (chociaż można to w skryptach zmieniać), a w gothicu 2 jak najbardziej.

Cytuj
Co robi ta funkcja bo wszędzie tego pełno a nie widzę żeby gdzieś była zdefiniowana... i to PD_ZS_DETAIL (jakaś stała?).

Strzelam, że gdy tryb debugowania jest włączony to wypluwa na ekran, albo do jakiejś konsoli odpowiednią wiadomość, tak PD_ZS_DETAIL to stała i równa jet 9 bodajże.

Cytuj
Poza tym plik externals.d
...
Gdzie jest ciało tej funkcji :O? Jest tu tylko info że zwraca 0 i jak ma to działać?

Plik eksternals jeśli dobrze pamiętam nawet nie jest przez grę kompilowany, można to sprawdzić edytując plik Gothic.src. Externals generalnie służy temu, by powiedzieć skrypterowi, że prócz funkcji normalnie zadeklarowanych w skryptach, są jeszcze pewne istniejące w silniku gry, do ciała których nie masz dostępu. Zatem:

Cytuj
FUNC INT     Hlp_IsValidItem         (VAR C_ITEM item)               { return 0; };
// Prüfe ob Item-Instanz gültig und initialisiert ist True/False

Mówi ci, że istnieje sobie funkcja Hlp_IsValidItem, która przyjmuje takie i takie argumenty. W komentarzu po niemiecku, bo gra niemiecka (:P) powinien być opis co ta funkcja robi.

Polecam Ci zaopatrzyć się w notepada++, choćby dlatego, że ma świetną opcje wyszukiwania w plikach. Można sobie ustawić np. folder Content w Scripts, filtrowanie po plikach *.d i szukać danej frazy, obsługuje też wyrażenia regularne. Może dzięki temu łatwiej będzie Ci znaleźć odpowiedzi na następne pytania.

15
Złote Wrota 2: Serce Bogini / Dyskusja ogólna
« dnia: 2016-02-10, 09:55 »
Pancerz już świetnie wygląda, mimo że to wstępna wersja.  :D
Macie w planach ile będzie takich zupełnie nowych modeli zbroi?

16
Skrypty / Zaawansowana walka
« dnia: 2016-02-08, 15:13 »
Pokombinowałem trochę z tym twoim mieczem i udało mi się go jakoś uruchomić.

Po pierwsze potrzebujesz stworzyć sobie specjalną funkcję do reagowania na obrażenia dla hero. (W teorii można użyć standardowej B_AsssessDamage() ale tam są robione rzeczy, które herosowi na nic)

Ja u siebie nazwałem ją sobie B_Hero_AssessDamage() i umieściłem w tym samym pliku co B_AsssessDamage().
Wygląda to tak:

var int prev_hp;

func void B_Hero_AssessDamage()
{
if (self.attribute[ATR_HITPOINTS] < prev_hp)
{
B_W();
};
prev_hp = self.attribute[ATR_HITPOINTS];
};

Dodałem sobie warunek i dodatkową zmienną, ponieważ występuje taka sytuacja, gdzie podczas unikania, bądź blokowania moglibyśmy oberwać obrażeniami miecza runicznego, nawet jeżeli ta druga postać nas nie trafia.

Dalej, w kodzie instance PC_Hero na samym końcu jego bloku dodaję linijkę:
Npc_PercEnable(self, PERC_ASSESSDAMAGE, B_Hero_AssessDamage);

Dzięki temu faktycznie funkcja B_Hero_AssessDamage będzie wywoływana gdy ktoś bije herosa.
Zostaje jeszcze sprawa taka, że w pewnych miejscach może się to popsuć. Np. podczas tego gdy nasza postać zostanie powalona, wstanie i nagle się okaże, że miecz runiczny przestaje działać. Dlatego w pliku:
_Work\data\Scripts\Content\AI\Human\ZS_Human\ZS_Unconscious.d

we fragmencie:
func void ZS_Unconscious_End ()
{
// ------ AIV nochmal resetten ------
self.aivar[AIV_RANSACKED] = FALSE;

// ------ aufstehen (auch Spieler) ------
AI_StandUp(self);


// EXIT IF...

// ------ self == Spieler ------
if (Npc_IsPlayer(self))
{
Npc_PercEnable(self, PERC_ASSESSDAMAGE, B_Hero_AssessDamage); //Dodajemy tu ponowne przypisanie naszej funkcji.
return; //Spieler bekommt Kontrolle wieder
};
...
Jeszcze raz ustawiamy tą percepcje. Możliwe, że w innych miejscach również nam się coś popsuje i trzeba będzie to korygować.

A teraz sam kod działania miecza runicznego, zmodyfikowałem go trochę by faktycznie robił co do niego należy:
func void B_W() //Nie ma parametrów, bo przy wywołaniu w AssessDamage self i other są już ustawione globalnie i mamy do nich dostęp. Gdzie self <- osoba obrywająca, other <- atakujący
{
var C_ITEM ready;
var int randomdmg;
var int procent_trafienia;
var int obrazenia;

ready = Npc_GetReadiedWeapon(other);
randomdmg = Hlp_Random(100);
procent_trafienia = 50; //Średnio co drugie uderzenie dostajemy.
obrazenia = 100;

if (Npc_HasItems(other,ItMw_Dagon) == TRUE && Hlp_IsItem(ready,ItMw_Dagon) == TRUE) && (randomdmg <= procent_trafienia)
{
if (self.flags != NPC_FLAG_IMMORTAL)
{
   Wld_PlayEffect("spellFX_Firestorm_SPREAD", other, other, 0, 0, 0, FALSE ); //Efekt odpalany na atakującym. Wiem, trochę to dziwne, ale w przeciwnym wypadku atakujący może zacząć się palić i to dziwnie wygląda, skoro to nie on obrywa.
   B_MagicHurtNpc (other, self, obrazenia);         
};
};
};

W takiej formie powinno to działać tylko jeśli bohater obrywa.

17
Dziedzictwo / Dziedzictwo - Dyskusja ogólna
« dnia: 2016-02-08, 14:42 »
Nawet nieźle wam wyszły, więc propsy  :ok:
Chciałbym zobaczyć je w akcji już z animacjami w grze  :D

18
Skrypty / Zaawansowana walka
« dnia: 2016-02-07, 23:14 »
Ten miecz runiczny... mam rozumieć funkcja B_W() i wywołujesz ją w B_AssessDamage()? Jeśli tak to mam dla ciebie złe wieści. Funkcja B_AssessDamage() dla GRACZA zostanie wywołana co najwyżej raz... tak wynika z moich doświadczeń gdy się nią bawiłem. Doszedłem jedynie do wniosków, że być może bierze się to stąd, iż gracz albo nie ma w ogóle ustawionych, albo ma czyszczone percepcje (Perception.d, radzę spojrzeć). Możesz spróbować jakoś je graczowi ustawić i spróbować ochronić go przed ich wyczyszczeniem. Nie mam pewności czy da się to zrobić zwykłymi skryptami bez żadnego Ikarusa czy innych takich.

19
Skrypty / Problem z orkami
« dnia: 2016-02-07, 19:15 »
Jeżeli korzystasz z notepada++ to za pomocą regexa możesz znaleźć wywołanie funkcji:
AI_StartState(self, ZS_ATTACK, tu jakieś inne zbdety)można to osiągnąć przez użycia wyrażenia w postaci:
AI_StartState.+ZS_AttackJak już dostaniesz liste plików w których takie wywołanie się znajduje to radzę się zainteresować tymi co mają w nazwie Assess lub zaczynają się na ZS_. Przed wywołaniem wspomnianej wcześniej funkcji możesz walnać jakiegoś printa, dobrze by było, żeby każdy miał inną wiadomość i najlepiej inne miejsce na ekranie by na siebie nie nachodziły. Wtedy w grze jak człowiek zacznie cię bić, gdy zaatakujesz orka, to będziesz wiedział, które wywołanie funkcji za to odpowiada i ewentualnie będziesz mógł opakować to w jakiś warunek, byś nie dostawał po łbie za bicie zielonoskórych.

Nie sprawdzałem tego i są to jedynie moje domysły, ale chyba warto spróbować.

Edit:

Dobra, w sumie to trochę źle podpowiedziałem. Pogrzebałem trochę w plikach AI przyglądając się pewnym rzeczom i zauważyłem, że ludzkie AI w ogóle olewa przypadek orków. Interesuje cię plik:
_Work\Data\Scripts\Content\AI\AI_Intern\C_Functions.d
W nim to znajduje się między innymi funkcja C_NpcIsMonster, która w skrócie służy między innymi do tego, by AI mogło odpowiednio zareagować w pewnych sytuacjach. Problem w tym, że orkowie nie są uznani za potwory i npc będący orkiem nie przejdzie pozytywnie testów tej funkcji, przez co mogą się dziać dziwne rzeczy, w tym atakowanie nas przez ludzi gdy w pobliżu jest ork. Rozwiązanie szybkie:

Zmieniasz:
func int C_NpcIsMonster(var C_NPC slf)
{
PrintDebugNpc (PD_ZS_DETAIL,"C_NpcIsMonster");
PrintDebugString (PD_ZS_DETAIL,"...name: ", slf.name);

if ((slf.guild > GIL_SEPERATOR_HUM) && (slf.guild < GIL_SEPERATOR_ORC))
{
PrintDebugNpc (PD_ZS_DETAIL,"...true");
return TRUE;
}
else
{
PrintDebugNpc (PD_ZS_DETAIL,"...false");
return FALSE;
};
};

na:

func int C_NpcIsMonster(var C_NPC slf)
{
PrintDebugNpc (PD_ZS_DETAIL,"C_NpcIsMonster");
PrintDebugString (PD_ZS_DETAIL,"...name: ", slf.name);

if (slf.guild > GIL_SEPERATOR_HUM)
{
PrintDebugNpc (PD_ZS_DETAIL,"...true");
return TRUE;
}
else
{
PrintDebugNpc (PD_ZS_DETAIL,"...false");
return FALSE;
};
};

I ludzie powinni już poprawnie reagować na pojawienie się orków w ich najbliższym otoczeniu. Rozwiązanie dłuższe polegałoby na naprawie AI i tam gdzie jest sprawdzane C_NpcIsMonster sprawdzać też C_NpcIsOrc.

20
Skrypty / [G2NK] Ustawienie rozdziału
« dnia: 2016-02-03, 22:09 »
Sprawa wygląda tak, że faktyczna zmiana rozdziału na 4 następuje dopiero w B_Enter_Oldworld. Wywołanie funkcji B_Kapitelwechsel (4, NEWWORLD_ZEN) dla rozdziału 4 z interesujących nas rzeczy zmienia tylko zmienną globalną odpowiedzialną za numer rozdziału. Także nie obejdzie się bez grzebania w plikach B_Kapitelwechsel i B_Enter_Oldworld, oba znajdują się w _Work\data\Scripts\Content\Story\B_Story. W tej pierwszej, gdzie jest if else sprawdzający jaki numerek ustawiamy musisz wywołać funkcję IntroduceChapter z odpowiednimi parametrami, możesz podejrzeć jak to jest zrobione w przypadku rozdziału pierwszego i drugiego. W przypadku B_Enter_OldWorld interesuje Cię funkcja B_ENTER_OLDWORLD_Kapitel_4, musisz z niej wykomentować wywołanie funkcji IntroduceChapter. To zasadniczo tyle jeżeli chodzi o samą zmianę rozdziału.

Strony: [1] 2
Do góry