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

Strony: [1] 2 3
1
Witam,
Chciałem stworzyć nowego moba z animacją - coś na wzór osełki, czyli animację wykonuje npc, ale sam obiekt też się porusza (czy raczej jego część - osełka obraca się i porusza się stopka). O ile mi wiadomo, robiąc taką animację potrzebuję wziąć model HUM_BODY_NAKED i dorobić do niego animację, którą będzie wykonywał npc oraz wykonać model mojego moba + jego animację.
Najpierw chciałem jednak poćwiczyć na czymś, co już jest zrobionę - w tym wypadku na osełce. Problem jest następujący: po dekompilacji zarówno pliku HumanS jak i skompilowanej animacji osełki, mam 4 pliki, które mnie interesują:
1) model Hum_Body_Naked
2) animację npc przy osełce
3) model osełki (statyczny)
4) animację osełki (kręcenie się i ruch stopki)
Żeby wgl dało się zaimportować animację ASC z punktu 2) lub 4) do Blender lub GMaxa z wtyczką Kerrax (próbowałem w obu tych programach) to najpierw trzeba zaimportować model. Jeśli chodzi o 1) i 2) problemu nie ma, bo 1) to model dynamiczny. Natomiast żeby zaimportować animacje z pkt. 4), to najpierw muszę zaimportować model z pkt. 3). Problem w tym, że model sam w sobie jest statyczny i potem po imporcie animacji 4) i jej modyfikacji, gdy chcę znów to wyeksportować do pliku ASC to niestety nie mam możliwości wybrania eksportu animacji (jest na szaro, nie da się tej opcji zaznaczyć), mogę wyeksportować tylko mesh. No ale jeśli tak zrobię, to potem w tym wyeksportowanym pliku nie ma animacji - to jest tylko nieruchomy model.

Pytanie zatem jak to zrobić? Nie widziałem nigdzie tutoriala od podstaw dot. animowania mobów, więc może coś tu bardzo źle robię po prostu, ale jeśli tak, to nie wiem co.

2
Czołem, chcę dodać możliwość garbowania skór do gry i chciałbym, żeby to się odbywało na jakimś obiekcie w grze (to się chyba nazywa Mob) - tak jak np. wykuwanie mieczy robimy na kowadle. Dodałem w Spacerze do świata gry obiekt oCMobIntern, jako visual dałem mu BARBQ_SCAV.MDS (ognisko ze ścierwojadem - na razie wziąłem coś pierwsze lepsze tylko przykładowo), a w onstatefunction wpisałem SKINTAN (wzorowałem się przy tym na kowadle - tam jest SMITHWEAPON). W skryptach zrobiłem nowy plik, w którym przekopiowałem wszystko z kowadła, tylko podmieniłem wytwarzanie mieczy na skóry oraz wszystkie nazwy robiłem według tego samego schematu, tylko wszędzie zamiast SmithWeapon dawałem SkinTan, no i zwłaszcza linijki:
FUNC INT PC_SmithWeapon_End_Condition ()
{
if (PLAYER_MOBSI_PRODUCTION == MOBSI_SMITHWEAPON)
{
return TRUE;
};
};
Zmieniłem na:
FUNC INT PC_SkinTan_End_Condition ()
{
if (PLAYER_MOBSI_PRODUCTION == MOBSI_SKINTAN)
{
return TRUE;
};
};
MOBSI_SKINTAN dodałem w AI_Constants.

Rzecz w tym, że to nie działa. Tzn. bezi podchodzi do ogniska, jak klikam to zaczyna obracać tego ścierwojada (:D), ale nie wyświetlają się żadne opcje dialogowe dotyczące wytwarzania przedmiotów. Dodam, że skrypt sam w sobie działa, bo gdy NIE zmieniam linijki if (PLAYER_MOBSI_PRODUCTION == MOBSI_SMITHWEAPON) na if (PLAYER_MOBSI_PRODUCTION == MOBSI_SKINTAN) to mogę wytwarzać te skóry, tyle że na kowadle.
W Spacerze do tej pory się nie bawiłem, więc może tam coś źle robię. Albo jeszcze w jakimś pliku coś dodać. W sumie nie wiem do czego odwołuje się to onstatefunction w Spacerze - do nazwy pliku, do nazwy jakiejś funkcji w skryptach czy jeszcze czegoś innego?

EDIT:
No dobra, po prostu za mało patrzyłem w skrypty. Trzeba jeszcze dodać funkcję (np. w nowym pliku SkinTan.d) na wzór tej ze SmithWeapons:
func void SkinTan_S1()
{
    var C_Npc her;
    her = Hlp_GetNpc(Pc_Hero);
    if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(her))
    {
        self.aivar[AIV_INVINCIBLE] = TRUE;
        Player_Mobsi_Production = Mobsi_SkinTan;
        AI_ProcessInfos(her);
    };
};
Dzięki, @Czudak

3
No to sprawa jasna, dzięki za odpowiedź.

4
Chciałem dodać obrażenia obszarowe do Gejzera (wygląd czaru aż się o to prosi :D), jednak nie mam pojęcia jak się za to zabrać. Pobawiłem się trochę w Pfx i Vfx, ale bez rezultatów.

Przede wszystkim nie rozumiem skąd gra wie, kiedy użyć którejś funkcji (no dobra, to chyba nie funkcja tylko instancja czegoś :P) z pliku Pfx, np. jest coś takiego do burzy ognistej INSTANCE spellFX_Firestorm_SPREAD   (CFx_Base_Proto) - jednak w żadnym innym pliku nie widzę odniesienia/wywołania tej funkcji (instancji). Więc skąd program wie, kiedy ją wywołać?

Próbowałem po prostu dodać dokładnie coś takiego do geysera, zmieniając nazwę Firestorm na Geyser (zrobiłem to w Pfx i Vfx), ale nic się nie zmieniło, nie dodało mi tego efektu rozchodzenia się ognia do gejzera. Będę bardzo wdzięczny za pomoc, zwłaszcza, że w tym wypadku kompletnie nie mam pojęcia, od czego zacząć.

5
Siemka,

w pliku ZS_MM_RTN_Summoned jest funkcja, która co sekundę sprawdza czy summon nie jest przyzwany już zbyt długo i jeśli czas >= zdefiniowanemu czasowi przywołania dla summonów, to ginie. Da się też w tą funkcję włożyć oczywiście inne warunki i można robić ciekawe rzeczy z przywołańcami (np. mogą ciągnąć manę na sekundę).

Gdy chcę zrobić jakiś efekt czasowy, to do tej pory zawsze używałem funkcji timera, typu:
FF_ApplyOnceExt (Timer_SPL_Sprint, 1000, -1);
Pytanie brzmi: czy można w jakiś sposób wykorzystać funkcję typu loop do innych kwestii niż przywołania, a jeśli tak, to jak to zrobić?
No dobra, już wiem, że na pewno jest ona wykorzystywana do innych rzeczy - np. czas trwania zamrożenia, itp. Pytanie jak to zrobić. Bo dodanie return LOOP_CONTINUE na końcu mojego skryptu nie podziałało.

Wystarczy to dodać na końcu swojej funkcji?
return LOOP_CONTINUE;Tak jest w tej funkcji przywołańców. Ale próbowałem tak ze swoją funkcją i nie działa, chyba że coś źle zrobiłem.

I jeśli wgl da się zastosować tę funkcję loop, to czy jest ona pod jakimś względem lepsza od timera, albo na odwrót?

6
Ok, zaraz spróbuje co i jak. Przede wszystkim, spróbuję nową grę odpalić, może to przez to właśnie.
Rzeczywiście nie wspomniałem o B_GetLearnCostTalent, ale dodałem tam te potrzebne wymogi.

Z dialogiem o nauce też racja. O ile dobrze rozumiem, to ten?
func void DIA_Harad_TeachSmith_ArrowHead()
{
if B_TeachPlayerTalentSmith (self, other, WEAPON_ArrowHead)
{
B_Harad_TeachSmith();
};
};

A żeby dialog się zawsze pokazywał, to próbowałem - usunąłem po prostu linijkę:
&& (PLAYER_TALENT_SMITH[WEAPON_ArrowHead] == TRUE)o ile rozumiem to wtedy powienien się pokazywać zawsze. Ale i tak się nie pokazywał.

EDIT:
Aż się ciśnie na usta ,,ja jebie" - chodziło o to, żeby zacząć nową grę, a nie wczytywać, poza tym skrypt działa... Dzięki za pomoc :)

7
Ale to jest w każdym innym przedmiocie w tym pliku. I o ile dobrze rozumiem, to oznacza, że opcja pojawia się gdy klikniemy w "kucie zwykłych broni" a nie "broni z rudy".

8
Cześć,

Próbuję od kilku godzin dodać  możliwość wykucia nowego przedmiotu na kowadle. Zrobiłem wszystko, co jest opisane w tym wątku: https://themodders.org/index.php?topic=21129.0
Niestety bez efektów. Oto, co zrobiłem:
1) W Constants.d zmieniłem MAX_WEAPONS i dodałem nową stałą dla swojego przedmiotu:
const int WEAPON_ArrowHead = 13;

const int MAX_WEAPONS = 14;

2) dodałem instancję nowego przedmiotu do IT_Melee_Weapons.d:
INSTANCE ItMw_Arrowhead (C_Item)
{
name = "Groty";

mainflag = ITEM_KAT_NF;
flags = ITEM_SWD;
material = MAT_METAL;

value = Value_Common1;

damageTotal = Damage_Common1;
damagetype = DAM_EDGE;
range    Range_Common1;

on_equip = Equip_1H_05;
on_unequip = UnEquip_1H_05;

cond_atr[2]    = ATR_STRENGTH;
cond_value[2]  = Condition_Common1;
visual = "ItMw_030_1h_Common_Sword_01.3DS";

description = name;
TEXT[2] = NAME_Damage; COUNT[2] = damageTotal;
TEXT[3] = NAME_Str_needed; COUNT[3] = cond_value[2];
TEXT[4] = NAME_ADDON_BONUS_1H; COUNT[4] = Waffenbonus_05;
TEXT[5] = NAME_Value; COUNT[5] = value;
};

(na razie tylko na szybko na podstawie byle jakiej innej broni)

3) w SmithWeapons.d dodałem instancję i funkcje dla mojego przedmiotu:
//*********** MOJE - groty do strzal ********************
INSTANCE PC_ItMw_ArrowHead (C_INFO)
{
npc = PC_Hero;
condition = PC_ItMw_ArrowHead_Condition;
information = PC_ItMw_ArrowHead_Info;
permanent = TRUE;
};

FUNC INT PC_ItMw_ArrowHead_Condition()
{
if((PLAYER_MOBSI_PRODUCTION == MOBSI_SMITHWEAPON)
&& (PLAYER_TALENT_SMITH[WEAPON_ArrowHead] == TRUE))
&& (Normalwaffen == TRUE)
{
return TRUE;
};
};

FUNC VOID PC_ItMw_ArrowHead_Info ()
{
CreateInvItems     (hero, ItMw_ArrowHead,  1);
Print (PRINT_SmithSuccess);

B_ENDPRODUCTIONDIALOG ();
Normalwaffen = FALSE;
};

oraz na końcu w funkcji FUNC VOID SMITHWEAPON_S1 () linijkę:
PC_ItMw_ArrowHead.description = "Groty";
4) w dialogu Harada zmieniłem jedną linijkę, tak żeby mnie uczył mojej broni:
func void B_HaradSmithChoices()
{
............
else
//if (PLAYER_TALENT_SMITH[WEAPON_Common] == FALSE)
{
Info_AddChoice (DIA_Harad_TeachSmith, B_BuildLearnString("Ucz sie grotów strzal "    , B_GetLearnCostTalent(other, NPC_TALENT_SMITH, WEAPON_ArrowHead)) ,DIA_Harad_TeachSmith_ArrowHead);
//Info_AddChoice (DIA_Harad_TeachSmith, B_BuildLearnString("Schmieden lernen "    , B_GetLearnCostTalent(other, NPC_TALENT_SMITH, WEAPON_Common)) ,DIA_Harad_TeachSmith_Common);
};
};

5) w TeachPlayerTalentSmith.d dodałem warunek, który uczy postać wykuwania mojego przedmiotu
if (waffe == WEAPON_ArrowHead) { PLAYER_TALENT_SMITH[WEAPON_ArrowHead] = TRUE;
B_LogEntry (TOPIC_TalentSmith,"cos tam cos tam."); };

Efekt:
U Harada pojawia się dialog do nauki, po nauczeniu dostaję wpis w dzienniku ("coś tam cos tam" :D), niestety na kowadle w ogóle nie ma opcji wykucia grotów strzał. Autor wątku, do którego dałem linka pisał o tym, że ma puste miejsce w monologu kowadła, ale może wykuć przedmiot - u mnie się nie da, nie ma ani opcji do wyboru, ani pustego miesjca.

Pomóżcie, bo już mnie coś trafia. Pół dnia spędziłem nad prostą w sumie rzeczą, a i tak dalej nie działa  -_-

9
Wow @Khantor. Szczerze mówiąc sam myślałem o tym DMG_OnDmg, ale pewnie nie byłbym w stanie tego do końca sam napisać, więc super dzięki za ten sposób ;) do tego fajnie, że pomyślałeś o tym, żeby na raz pobitym NPC nie dało się farmić.

Zresztą myślałem, że jest prostszy sposób, jak np z tym bs_hit, no ale koniec końców z funkcją DMG_OnDmg może to nawet działać lepiej, więc spoko.

Sprawdzę to pewnie jutro albo jakoś w tym tygodniu, ale myślę, że powinno to działać dobrze.

Jeszcze tylko kwestia co np z czarami, które nie zadają DMG :p Tak, żeby też dało się zwiększać manę czy cokolwiek na czarach typu przywołania czy nawet światło :D

10
Dzięki. Przy czym to jest tylko w przypadku zabicia NPCa. Od biedy ujdzie, ale wolałbym zrobić tak, żeby bonus do skilla zliczał się nie przy zabiciu, tylko przy uderzeniu. Czyli tak jak jest w przypadku BS_HIT. Skoro jest coś takiego jak BS_HIT dotyczący walki w zwarciu, to chyba musi też być jakiś BS dotyczący walki na dystans i magii? :D No a jeśli nie BS to może jest jakiś inny sposób, żeby to zrobić przy uderzeniu/strzale/rzuceniu czaru (zwłaszcza, że niektóre czary nie są do zabijania :P), a nie zabiciu NPCa?

11
Siemanko,

Chcę zrobić tak, żeby postać uczyła się skilli (np. 1h, bow, itp.) i atrybutów podczas walki. Czyli np. uderzę kogoś 50 razy, to dostaje +1 do 1h. Znalazłem ten wątek: https://themodders.org/index.php?topic=17761.0 , w którym Avallach proponował umieszczenie w funkcjach B_MM_AssessDamage i B_AssessDamage warunku if (C_BodyStateContains(hero, BS_HIT)) i po tym dodanie swojej funkcji. Tyle zrobiłem i wydaje się działać w porządku.

Problem polega na tym, że to jest tylko do walki w zwarciu, a nie wiem jaki jest warunek do walki dystansowej oraz używania magii.

Przejrzałem listę bodystates, ale nie widzę tam nic do walki dystansowej, a np. BS_CASTING nie działa przy rzucaniu czaru (więc w sumie nie wiem od czego to jest).

12
Hmm, no tak, tak pewnie byłoby lepiej. Niestety, jeśli chodzi o AST, pakiety skryptowe, że już o kodach silnika i hookowaniu nie wspomnę, to jeszcze słabo mi z tym idzie. Tzn. potrafię to jakoś zastosować jak mi ktoś znajdzie te funkcje czy kody (zresztą kiedyś zrobiłem inny temat tego dotyczący, w którym zresztą też się udzielałeś :D), ale nie mam tak naprawdę pojęcia, jak samemu wyszukiwać to wszystko :P

Ale co do pierwszego Twojego zdania - to właśnie myślałem, że ta funkcja powinna działać dobrze, bo reakcja jest po zaatakowaniu, ale jeszcze przed obliczaniem dmg czy szansy na krytyka. Chyba że się mylę?

Jeszcze jedna sprawa:
Cytuj
zdekompilować kod silnika do assemblera; znaleźć funkcję odpowiedzialną za kalkulację obrażeń; znaleźć moment w którym kalkulowana jest szansa na krytyczne uderzenie;
Jak Wy znajdujecie te funkcje? Jest jakiś spis tego i która za co jest odpowiedzialna czy po prostu sprawdzacie różne funkcje na chybił-trafił, sugerując się tylko ich nazwą?

13
Jak to niepotrzebny? Czyli może być tylko tak:
func void InitArmourCritChanceReduction(var C_NPC oth)
?
I wtedy zmienić to slf.aivar na... hero.aivar?
I wtedy będzie to działać tylko na bohatera, jak rozumiem. Ale skąd program będzie wtedy wiedział czym jest hero? Hero będzie tak samo nieokreślony jak slf. w moim przypadku.


Ostatecznie chciałbym zrobić tak, żeby cała ta funkcja działała na wszystkich NPC ORAZ na bohatera.
W takim wypadku powinienem to zrobić tak:
func void InitArmourCritChanceReduction(var C_NPC slf, var C_NPC oth)
Zgadza się?

Pytanie jeszcze takie: czy jeśli tam jest to slf, to wtedy to działa na npc i na bohatera, czy tylko na npc, i trzeba napisać drugą podobną funkcję dla hero?

/// EDIT
Wypróbowałem na razie tyle, że zmieniłem to slf.aivar na hero.aivar - gra się wtedy uruchamia, ale ta funkcja nic nie robi :P
Co jest źle? Zakładam, że po prostu źle tę funkcję rozumiem i ona nie robi tego, co bym chciał. W grze zrobiłem tak, że przywołałem rockefellera, założyłem mu lekką zbroję ŁS i uderzałem w niego bohaterem. Efektu nie ma żadnego, print testowy się nie pokazuje, itp.

if (Npc_IsInState (hero, ZS_Attack)) - to oznacza, że hero wykonuje atak, tak?

&& (Hlp_GetInstanceID(oth) == hero.aivar[AIV_LASTTARGET]) - szczerze mówiąc tego używam na chybił-trafił. Czy to oznacza, że oth jest aktualnie celem mojego hero? Zakładam, że nie, bo wtedy funkcja powinna działać, ale nie mam pojęcia jak to inaczej zrobić :D


14
Siemka,
pewnie co niektórzy już rzygają na sam widok problemu z Unknown Identifier, bo to niby oczywiste, ale...

To mój skrypt:
func void InitArmourCritChanceReduction(var C_NPC hero, var C_NPC oth)
{
if (Npc_IsInState (hero, ZS_Attack))
&& (Hlp_GetInstanceID(oth) == slf.aivar[AIV_LASTTARGET])
{
print("Wykryło hero is in zs attack state oraz oth last target");
var c_item armor; armor = Npc_GetEquippedArmor (oth);
if (Hlp_IsItem (armor, ITAR_DJG_L))
{
print("wykryło zbroje i obniżyło talent");
B_AddFightSkill (hero, NPC_TALENT_1H, - 10);
};
};
};

I dostaje podczas parsowania błąd Unknown Identifier : AIVAR

1) Po pierwsze, nie wiem co to dokładnie jest to slf.aivar i inne aivary, ale z racji, że jest tego dość dużo w wielu plikach, to jak do jasnej cholery może mi wywalać błąd, że nie czegoś takiego nie zna. Pierwszy IF z mojej funkcji, czyli to:

if (Npc_IsInState (hero, ZS_Attack))
&& (Hlp_GetInstanceID(oth) == slf.aivar[AIV_LASTTARGET])

 w całości skopiowałem z pliku (B_Attack) i tam kilkukrotnie się pojawia ten aivar i wszystko działa jak należy, a jak dodam tę swoją funkcję to się zaczynają problemy - totalnie tego nie rozumiem :/

2) Druga sprawa, choć mniej paląca, jest taka, że nie wiem czy wgl dobrze się zabieram za to, co chcę zrobić. Mianowicie chcę zrobić coś takiego, żeby szansa na trafienie krytyczne bohatera (a w końcowym zamyśle również wszystkich NPC) malała w zależności od tego jaki pancerz nosi przeciwnik. Załóżmy, że mamy 100% hitchance. Gdy przeciwnik ma na sobie jakąś słabszą zbroję, to ona obniża nasz hitchance o powiedzmy 20, a jak ma jakąś mocniejszą - to powiedzmy o 70%, itp.
Zamysł mojego skryptu jest taki i tak go rozumiem (nie wiem czy dobrze):
JEŚLI hero wykonuje atak
 i oth to jest nasz target
 do tego JEŚLI
  oth ma na sobie lekką zbroję ŁS (przykładowa zbroja)
  TO
   nasz hitchance obniża się o 10 (przykładowa wartość)

To jest oczywiście uproszczony skrypt, chciałem zobaczyć czy to wgl działa... no a przez tego nieszczęsnego AIVARA nie działa  :angry:

No i tu pytanie do tęgich głów tego forum: czy to ma szansę działać :P oczywiście wiem, że trzeba do tego dorobić jeszcze przywracanie z powrotem po ataku swojego dawnego Hitchance - na chwilę obecną nie mam innego pomysłu niż jakiś timer.

Generalnie chodzi o to, żeby Hitchance zmieniał się dynamicznie w zależności od tego, którego przeciwnika akurat trafiamy i jaką on ma na sobie zbroje.

Wszelkie pomysły mile widziane i przede wszystkim o co chodzi z tym, że nie znajduje aivara, bo tego najbardziej nie rozumiem.

15
Próbowałem się jednak pobawić trochę z edycją istniejącego szkieletu, dodając kilka kości, tak żebym mógł sprawnie używać Inverse Kinematics. Oryginalne animacje zaimportowane na mój nowy szkielet wyglądają dokładnie tak, jak powinny, więc tu nic nie trzeba zmieniać. Jednak w grze pojawiają się błędy, i to dość dziwne, jak na mój gust :P

Po pierwsze podczas wczytywania gra się minimalizuje i pojawia się sporo komunikatów, że nie pasują do siebie jakieś tam meshandtree. Jednak gra się wczytuje dalej. Natomiast w zSpy pojawiają się błędy tego typu:
Spoiler
00:37 Warn:  0 OH    : zCArchiverBinSafe::SkipChunk - expected entry not found: symValue105 .... <zArchiver2.cpp,#1762>
00:37 Warn:  0 OH    : zCArchiverBinSafe::SkipChunk - expected entry not found: symValue106 .... <zArchiver2.cpp,#1762>
00:37 Fault: 0 M:     really many entries not found! The archive is probably outdated. .... <zArchiver2.cpp,#1767>
00:37 Info:  5 X:     Vid_SetScreenMode: No changes ... .... <zRndD3D_Vid.cpp,#559>
00:37 Info:  5 X:     Vid_SetScreenMode: No changes ... .... <zRndD3D_Vid.cpp,#559>
00:37 Warn:  0 OH    : zCArchiverBinSafe::SkipChunk - expected entry not found: symValue107 .... <zArchiver2.cpp,#1762>
00:37 Warn:  0 OH    : zCArchiverBinSafe::SkipChunk - expected entry not found: symValue108 .... <zArchiver2.cpp,#1762>
Takich linijek z entry not found jest ponad 500.

Bardziej jednak zastanawiają mnie inne błędy. Mianowicie, w grze psują się modele niektórych obiektów, np. mebli w wieży Xardasa. To takie standardowe "zepsucie sie" modelu, tzn. jest cały powykrzywiany, nie przypomina kształtem oryginału, tekstura jest cała rozmazana. Tak samo jest z jedną bronią (Toporem berserkera), niektórymi roślinkami w ekwipunku i miksturami. Ale zaznaczam, że tylko z kilkoma przedmiotami są takie problemy.

Wydaje mi się to dziwne, bo co ma szkielet postaci do modeli tego typu przedmiotów. Jeszcze żeby się coś stało ze zbrojami to rozumiem, bo one używają szkieletu, ale takie przedmioty?

@Edit
Koniec końców, obszedłem ten problem tak, że robię sobie nowe animacje na moim nowym szkielecie, ale potem nie zmieniam już w plikach tego szkieletu, tylko animacja odgrywa się na starym. O dziwo, działa bez zarzutu, przynajmniej jeśli chodzi o proste animacje - mam nadzieję, że tak samo będzie z bardziej skomplikowanymi.

16
Oki, dzięki.
Ja znalazłem 3 takie pliki (HUMANS-S_1HRUN.MAN, HUMANS-T_RUNTURNL.MAN, HUMANS-T_RUNTURNR.MAN). Teraz wszystko kompiluje i dekompiluje się poprawnie, bez żadnych błędów (przynajmniej Gothic Sourcerem; czy wszystko działa w Gothicu to jeszcze muszę sprawdzić :P)

Taka dygresja jeszcze na boku: bardzo mnie zastanawia jak to jest możliwe, że te pliki zawierają błędy, skoro gra działa. To jak twórcy gry je skompilowali?

17
@Siemekk
W jaki sposób? Czym edytowałeś te pliki .MAN?
Próbowałem otwierać notatnikiem i da się między "krzaczkami" wyczytać w nich o jakichś asc, ale to chyba nie o to chodzi, bo tym sposobem niczego nie odzyskam :P


@Edit
Próbowałem coś z tym Humans.MDS zrobić, ale na razie to tylko jest tak:
1) gdy używam standardowego Hum_body_naked0, to trzeba było zmienić tylko jedną nazwę animacji w mdsie, potem gra się uruchamia i działa
2) gdy używam swojego, zmodyfikowanego modelu z nowymi kośćmi, to nie wiedzieć czemu podczas kompilacji jest więcej błędów. Już samo to mnie wystarczająco zdziwiło, że jakieś błędy są tylko ze względu na inny model (nazwa jest ta sama - hum_body_naked0). Tu znów chodziło o jakiś .asc - mający chyba coś wspólnego ze skręcaniem podczas biegu. Ale w ogóle nie znalazłem tego typu animacji (sprawdzałem importując do Blendera).

Zrobiłem więc tak, jak radził Bogdan, czyli zrobiłem nowy plik i nazwałem go tak jak ma być. Wtedy podczas wczytywania gry jest pełno błędów tego typu, ale gra się wczytuje:
Spoiler
D: zModel(zCModelAni::LoadMDM)
: the file's node-hierarchy is incompatible to 'meshAndTree';applied mesh and mds-'meshAndTree' entry need to have exactly the same hierarchy => adjust them
Do tego modele postaci sa całe jakieś powykręcane i gdy próbuje się ruszyć do wywala Access Violation. No cóż to jest chyba spowodowane tym, że nie dostosowałem jeszcze swojego modelu do pancerzy/animacji. Ale tak szczerze, to chyba sobie to daruje. Nie myślałem, że będzie z tym tyle roboty, a koniec końców właśnie po to niby zrobiłem te nowe kości - zeby sobie zaoszczędzić pracy przy animacjach. Ale w takim wypadku już chyba lepiej mi będzie robić moje nowe animacje na starym modelu, niż dostosowywać wszystkie stare animki do nowego :D No i w sumie nie ma gwarancji, że to w ogóle by zadziałało, skoro tyle różnych błędów się pojawia :P

18
@Siemekk
O slotach jeszcze nic nie wiem :D a jutro spróbuję coś porobić z kośćmi według tego, co napisałeś.
W punkcie 4) o co chodzi z tymi błędami? Miałeś na myśli coś własnie w stylu brakujących asc, itp? Zrobiłeś to tak jak Bogdan proponował, że dodałeś tylko byle jaki plik z nazwa, czy gdzieś znalazłeś te asc w innych plikach, czy jak?

@Bogdan Zwei
Jeszcze nie do końca rozumiem o co chodzi z tą "teksturą" jutro zerknę na te modele orków. Ale tak czy inaczej w przypadku Humans.MDS musiałbym podmienić ten zmodyfikowany model we wszystkich plikach animacji, które go wykorzystują (to co Siemekk napisał w 6 pkt), tak? I jak rozumiem tu się rozchodzi o modyfikację modelu jako takiego, a nie kości?

19
5) czyli te 2 pliki humans.mdh i msb, tak? Właśnie tak robię. Nie w tym jednak problem. Po prostu podczas parsowania wywala błąd, że brakuje jakiegoś tam asc i właśnie tak jest - nie ma tego pliku asc w folderze po wcześniejszym zdekompilowaniu humans.msb. I nie ma mowy o jakichś błędach podczas pisania, bo na próbę po prostu zdekompilowałem ten plik, a potem chciałem skompilować z powrotem bez zmiany czegokolwiek. I jest ten błąd.

I się nie dziwię, bo rzeczywiście tego pliku asc tam nie ma. Ale dlaczego to już nie mam pojęcia. Próbowałem też zdekompilować to jeszcze raz, ale jest to samo.

6) każdą animację? Czyli jeśli chciałbym zrobić jakąkolwiek modyfikację modelu hum_body_naked0 to muszę potem KAŻDĄ animację, która używa tego modelu, dostosować do niego ponownie? Jeśli tak, to chyba "sporo" roboty :D

A czy jest opcja, żeby zmienić ten model tylko dla wybranej animacji? Czyli tak, jak ja chciałem, po prostu robię sobie jedną nową animację walki i robię ją na zmodyfikowanym modelu. Tak, jak mówię, wywala mi błąd Access Violation - i to na pewno jest przez model, bo jak dam oryginalny, to działa. Czy czegoś takiego nie da się zrobić  i muszę albo zmienić model dla WSZYSTKICH animacji, albo w ogóle go nie mogę modyfikować?

20
Witam,
Chciałem stworzyć nową animację walki do Gothica 2 (na razie po prostu podmiana ataku combo 2H). Używam Blendera 2.78. Zaznaczam, że jeszcze mało wiem na temat Blendera i tworzenia animek do G2.

Spoiler
Żeby ta animacja trochę ładniej wyglądała, to dodałem do szkieletu hum_body_naked kilka dodatkowych kości (w sumie 3 i jedną trochę zmieniłem). Najpierw wyeksportowałem tylko animację i gdy na próbę podmieniłem animację ze standardowej mistrza 2H na moją nową to normalnie wszystko się odpala i nowa animka jest w grze. Problem taki, że wygląda ona trochę "dziwnie" :P tzn nie tak, jak w Blenderze. W Blenderze postać wykonuje 2 ataki, z czego drugi to jest taki jakby atak z wyskoku i postać kończy animację "na ziemi". Jednak w grze, po tym skoku postać zamiast kończyć na poziomie gruntu (chodzi mi o wysokość położenia postaci), zapada się pod ziemię. Podczas animacji postać przenika też jakby przez ściany.

Pomyślałem, że problemem może być to, że nie wyeksportowałem nowego modelu (tzn z tymi dodanymi przeze mnie kośćmi). Zrobiłem więc to, zapisałem model jako hum_body_naked - czyli ten podstawowy model, który jest we wszystkich animacjach z ludźmi. Wtedy jednak, gdy próbuję wykonać atak, gra wywala Access Violation.

Pomyślałem dalej, że może problem leży w tym, że inny jest ten model postaci dla standardowej animacji postaci (czyli całego pliku humanS.mds), a inny dla mojej animacji i nie można go podmieniać podczas gry. Wypakowałem więc pliki standardowej animacji Gothic Sourcerem, podmieniłem plik hum_body_naked na mój nowy. Wrzucam wszystko (czyli całą zawartość wypakowanego Humans.MSB wraz ze wszystkimi plikami asc) do folderu Anims, włączam startera z zaznaczonym script parsen i... pojawia się błąd, że brakuje jakiegoś pliku asc (Hum_Amb_1hRunT0_A01.asc). Sprawdziłem w folderze, do którego wypakowałem wcześniej plik Humans.MSB i rzeczywiście nie ma tam takiego pliku, chociaż jest do niego odniesienie w pliku humanS.mds.

A zatem, kilka spraw:
1) jak to jest do jasnej ciasnej możliwe, że brakuje tam tego pliku asc?? Skoro nawet nic nie zmieniając po prostu wypakowuje plik, potem chce z powrotem sparsować i się nie da bo brakuje jakiegoś asc... To jakim cudem w ogóle Gothic działa? I co na to poradzić, skąd ja mam wziąć ten plik?

Myślałem, że może istnieje jakaś paczka z plikami tego typu (tak jak np. na WoG jest do ściągnięcia paczka z plikami asc zbroi, to może tak samo trzeba zrobić z jakimiś podstawowymi animacjami?). Ale nie znalazłem takiej paczki nigdzie.

W tym wątku: https://themodders.org/index.php?topic=8005.0
@inż. Avallach napisał:
Cytuj
bo sam mam problemy z błędami znajdywanymi nawet w niemodyfikowanych mdsach gry.
Czyli jak rozumiem, błędy w oryginalnych plikach gry nie są niczym niezwykłym? Pytanie, czy da się temu jakoś zaradzić?

2) druga sprawa - dlaczego animacja w blenderze wygląda inaczej w grze? Dla jasności, w blenderze postać skacze, wykonując atak, i ląduje "na ziemi", tzn na ten samej wysokości, co zaczynała. Do tego przemieszcza się też trochę w bok (ten skok jest po skosie, do przodu i w bok). W grze natomiast przemieszczenie w bok jest ok, ale postać "ląduje" pod ziemią, tzn. skacze tak trochę w dół, zamiast do góry :D

Do tego, przy innych animacjach, chociażby wojownika 1h, gdzie przecież też jest skok do przodu, postać normalnie zatrzymuje się na przeszkodach (np. na ścianie), a moja postać trochę przez nie przenika. tzn. nie do końca - nie znajduje się pod drugiej stronie ściany, ale na chwilę w nią wnika, postaci nie widać i za chwilę znów pojawia się przed ścianą. No niezbyt ładnie to wygląda :/

Dlaczego tak się dzieje? Czy trzeba w Blenderze dodać jakąś "fizykę" do kości czy modelu? Chociaż to bez sensu bo ja tą animację robiłem właśnie na podstawie 1h wojownika, więc tam wszystko powinno w zasadzie być ok.

3) czy w ogóle ma sens zmiana kości w tym modelu hum_body_naked? Tzn. czy wtedy muszę w grze zmienić ten model we wszystkich animacjach, w których on występuje? Czy wtedy wszystkie animacje sie popsują?

Da się zrobić tak, żeby nowy model był wykorzystywany tylko w mojej nowej animacji? Czy wystarczy wtedy w mdsie zmienić tę linijkę na początku z wykorzystywanym modelem na mój nowy? I dlaczego występował ten błąd Acces Violation u mnie - tzn. że nie da się podmienić modelu (nawet kilku kości) w trakcie rozgrywki?

4) czyż modowanie Gothica nie jest frustrujące?  :hmmm: :trollface:

TL;DR
Trochę się rozpisałem, ale najważniejsze pytania, poza tymi powyżej, są w zasadzie takie:
5) Jak mogę edytować plik humans.mds (gdybym np. chciał podmienić standardowy atak z poziomu nowicjusza), skoro występuje błąd przy jego parsowaniu?

6) W jaki sposób podmienić model ludzi w grze (np, gdybym chciał dodać nowe kości albo coś tam zmienić, żeby był bardziej szczegółowy, itp)?

Strony: [1] 2 3
Do góry