Ikarus - 2 pytania 8185 20

O temacie

Autor SparrowJacek

Zaczęty 19.09.2017 roku

Wyświetleń 8185

Odpowiedzi 20

SparrowJacek

SparrowJacek

Użytkownicy
Why is the rum gone?
posty368
Propsy78
ProfesjaGracz
  • Użytkownicy
  • Why is the rum gone?
Witam, od kilku dni siedzę w skryptach do Gothica i chciałbym się dowiedzieć kilku rzeczy.



Po pierwsze, znalazłem na World of Gothic skrypt, który powoduje, że podnosimy przedmiot nurkując, gdy jesteśmy blisko niego https://forum.worldofplayers.de/forum/threads/790720-Scriptpaket-Zugriff-auf-ZenGine-Objekte?p=12420990&viewfull=1#post12420990
O ten, ale gdzie powinienem ten skrypt wrzucić, żeby zadziałał?



A po drugie - czy istnieje możliwość utworzenia mikstury, która by czasowo(jak mikstura szybkości, 5 min np) zwiększała czas, w trakcie którego możemy nurkować bez utraty życia? W pliku species.d jest wartość dive_time dla każdej gildii, jednak jeśli się da, wolałbym edytować te wartości w trakcie gry, niż zmieniać gildię bohatera, by uzyskać inną wartość

Z góry dziękuję za pomoc i proszę o wyrozumiałość w granicach rozsądku :)

PS - przypadkiem w złym dziale tego posta zamieściłem, prosiłbym o usunięcie tematu tamtego!
 
Zapamiętajcie dzień, w którym nie schwytaliście Kapitana Jacka Sparrowa

Splash

Splash

Moderator
posty4211
Propsy3414
ProfesjaNierób
  • Moderator
Cytuj
ale gdzie powinienem ten skrypt wrzucić, żeby zadziałał?
Gdziekolwiek. Wystarczy, że plik, w którym zostanie umieszczony był sprawdzany przez parser przed plikiem startup. Funkcja musi być wywoływana co jakiś czas, najlepiej co klatkę.

Cytuj
A po drugie - czy istnieje możliwość utworzenia mikstury, która by czasowo(jak mikstura szybkości, 5 min np) zwiększała czas, w trakcie którego możemy nurkować bez utraty życia?
W klasie oCNpc jest zmienna divetime. Wystarczy, że mikstura zmieni wartość zmiennej na true. Następnie tworzysz funkcję, w której będziesz sprawdzał czy zmienna zwraca true oraz zmieniał wartość divetime na maksymalną. Funkcję najlepiej wywołuj co klatkę.
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

SparrowJacek

SparrowJacek

Użytkownicy
Why is the rum gone?
posty368
Propsy78
ProfesjaGracz
  • Użytkownicy
  • Why is the rum gone?
Dzięki za odpowiedź!

Wyczytałem właśnie, że Ikarus pozwala na wykonywanie funkcji co klatkę, ale jak wygląda kod na to? Może to banalne pytanie, ale chwilowo jeszcze się w tym wszystkim nie orientuję...
 
Zapamiętajcie dzień, w którym nie schwytaliście Kapitana Jacka Sparrowa

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1154
ProfesjaProgramista
  • Złote Wrota
AST lepsze :F
A Ikarusem to wystarczy wklepać w Startup.d w Init_Global to:
FF_ApplyOnce(funkcja); //Wymagane jest LeGo.
 

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

SparrowJacek

SparrowJacek

Użytkownicy
Why is the rum gone?
posty368
Propsy78
ProfesjaGracz
  • Użytkownicy
  • Why is the rum gone?
Powoli zaczynam rozumieć. Mam jednak problem - otóż powiedzcie mi proszę co i gdzie źle robię.

Stworzyłem sobie plik w Gothic II\_Work\data\Scripts\Content\AI\AI_Intern o nazwie abc.d
w nim mam funkcje GrabItemUnderwater(){
tu jest bezpośrednio skopiowany kod z linka w pierwszym poście, od pierwszego if...
};

Następnie w startup.d:
mam
func void STARTUP_GLOBAL()
{
   // wird fuer jede Welt aufgerufen (vor STARTUP_<LevelName>)
   Game_InitGerman();
   FF_ApplyOnce(GrabItemUnderwater);
};

Jednak przy próbie parsowania wyskakuje mi, "U:PAR: Unknown identifier: FF_APPLYONCE ( line 17)"

Żeby nie było, w folderze Scripts mam podfolder LeGo, w którym jest plik z tą funkcją, czyli zakładam, że powinienem jakoś zaimportować go do pliku startup? Podobnie jak plik z moim GrabItemUnderwater? Czy to ja coś innego robię źle... (PS gdy wkleiłem Ikarusa i LeGo to nie wyskakiwały mi żadne błędy przy parsowaniu, więc zakładam, że to zrobiłem dobrze)
 
Zapamiętajcie dzień, w którym nie schwytaliście Kapitana Jacka Sparrowa

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1154
ProfesjaProgramista
  • Złote Wrota
Ja zawsze robiłem tak :
Pierwsze parsowanie plików podstawowych. Po spasowaniu AI_Consants.d pasuje się Ikarus i LeGo. Na końcu tworzę folder z funkcjami który jest parsowany zaraz przed startup.d
 

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

SparrowJacek

SparrowJacek

Użytkownicy
Why is the rum gone?
posty368
Propsy78
ProfesjaGracz
  • Użytkownicy
  • Why is the rum gone?
Sekunda, ja zawsze dawałem w spacerze World => Reparse script => Gothic.src
I to parsowało wszystko. Jakoś inaczej powinienem do tego podejść? (cała moja wiedza opiera się na odrobinie eksperymentów i kilku tutorialach z forum, tudzież z youtube, więc wiele nie wiem jeszcze)
 
Zapamiętajcie dzień, w którym nie schwytaliście Kapitana Jacka Sparrowa

Halicor

Halicor

Użytkownicy
Hauptsturmfuhrer
posty365
Propsy57
ProfesjaNierób
  • Użytkownicy
  • Hauptsturmfuhrer
Już trochę stary, ale nadal niezawodny poradnik http://themodders.org/index.php?topic=16580.msg1027167#msg1027167, najpierw to i nie reparsuj skryptów spacerem, Gothic Starter spokojnie da sobie radę. Zrób to co ci Siemekk napisał powyżej, czyli zrób sobie w Gothic II\_Work\data\Scripts swój folder np. "abc" i potem w gothic.src tuż przed startup.d dodaj abc\*.d

SparrowJacek

SparrowJacek

Użytkownicy
Why is the rum gone?
posty368
Propsy78
ProfesjaGracz
  • Użytkownicy
  • Why is the rum gone?
Doskonale, tego mi brakowało, żeby nie siało errorami!

Jednak mam jeszcze jeden problem... otóż teraz wszystko się ładnie parsuje bez problemów, jednak gdy klikam rozpocznij nową grę, to wywala access violation w momencie, gdy gra powinna się zacząć. Gdy zakomentuję linie w startup.d odpowiedzialną za wywoływanie mojego kodu, to problem znika.

kod funkcji:

func void GrabItemUnderwater(){
   if (C_BodyStateContains (hero, BS_DIVE)) {
      var oCNpc her;
      her = Hlp_GetNpc (hero);
      
      if (her.focus_vob) {
         var oCItem her_focusItem;
         MEM_AssignInst (her_focusItem, her.focus_vob);
         
         if (Hlp_IsValidItem (her_focusItem)) {
            if (Npc_GetDistToItem (hero, her_focusItem) < 170) {
               CreateInvItems (hero, her_focusItem.instanz, her_focusItem.amount); //amount beachten
               Wld_RemoveItem (her_focusItem);
               
               var string str;   str = ConcatStrings (her_focusItem.name, " aufgehoben!");
               PrintScreen (str, -1, -1, FONT_SCREENSMALL, 3);
            };
         };
      };
   };
};

kod  w startup.d

func void INIT_GLOBAL()
{
   // wird fuer jede Welt aufgerufen (vor INIT_<LevelName>)
   Game_InitGerman();
   FF_ApplyOnce(GrabItemUnderwater);
};

żeby nie było, w gothic.src mam ostatnie 3 linie:

AI\AI_Intern\Grab_Item_Underwater.d

STORY\B_Story\B_ENTER_DRAGONISLAND.d
STORY\Startup.d

 
Zapamiętajcie dzień, w którym nie schwytaliście Kapitana Jacka Sparrowa

Splash

Splash

Moderator
posty4211
Propsy3414
ProfesjaNierób
  • Moderator
Nie zainicjowałeś pakietów skryptowych.
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

SparrowJacek

SparrowJacek

Użytkownicy
Why is the rum gone?
posty368
Propsy78
ProfesjaGracz
  • Użytkownicy
  • Why is the rum gone?

SparrowJacek

Ikarus - 2 pytania
#10 2017-09-20, 21:19(Ostatnia zmiana: 2017-09-20, 21:26)
Wykażę się pewnie wielką niewiedzą teraz, ale co przez to rozumiesz?

Co zrobiłem, to zreparsowałem skrypty, potem w VDFS zrobiłem paczkę, tak jak zawsze. Jak więc mogę zainicjować pakiety?

EDIT: LeGo_Init (LeGo_All);
tak, pewnie o to Ci chodziło. Już patrzę czy to rozwiąże problem. Dzięki! :)
 
Zapamiętajcie dzień, w którym nie schwytaliście Kapitana Jacka Sparrowa

Splash

Splash

Moderator
posty4211
Propsy3414
ProfesjaNierób
  • Moderator
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

SparrowJacek

SparrowJacek

Użytkownicy
Why is the rum gone?
posty368
Propsy78
ProfesjaGracz
  • Użytkownicy
  • Why is the rum gone?

SparrowJacek

Ikarus - 2 pytania
#12 2017-09-20, 21:31(Ostatnia zmiana: 2017-09-21, 00:32)
Jak może zauważyłeś, już zedytowałem posta, zrobiłem to co miałem i wszystko śmiga :)

Paczkę robię, bo tak nauczyłem się z filmiku, ale widzę teraz, że używając gothic startera, nie mam takiej potrzeby. Wiedza moja jest chaotyczna póki co, ale jestem na dobrej drodze. Jeszcze raz dzięki! Teraz zabiorę się za to oddychanie pod wodą.

Post połączony: 2017-09-21, 00:32
Dobra, mam pytanie - próbowałem na różne sposoby manipulować parametrem .divetime, jednak nieważne jak bardzo go zmieniałem (od 1 do 999999), postać albo nie miała dłuższego oddechu, albo też niezależnie od wszystkiego traciła życie nurkując(jakby zawsze miała 0 czas pod wodą).

Patrząc na plik constants.d zauważyłem to:
   VAR INT      DIVE_TIME                        [GIL_MAX]            ;
jak rozumiem jest to tablica intów.
Próbowałem w kodzie mojej funkcji zrobić coś w stylu:

   var oCNpc her;
   her = Hlp_GetNpc (hero);
        DIVE_TIME[her.guild] = 100;

jednakże wyświetla mi się unknown identifier. Mimo iż plik constants.d jest inicjowany oczywiście na samym początku. Co tym razem źle robię?
 
Zapamiętajcie dzień, w którym nie schwytaliście Kapitana Jacka Sparrowa

Splash

Splash

Moderator
posty4211
Propsy3414
ProfesjaNierób
  • Moderator
Cytuj
Co tym razem źle robię?
Wszystko. Nie chce mi się rozpisywać. Po prostu nie ogarniasz składni języka skryptowego. Poza tym, zmienna w klasie oCNpc (a nie C_GILVALUES jak ty to próbowałeś) divetime zwraca maksymalny czas. Modyfikować należy zmienną odpowiedzialną za obecny czas oddechu, czyli divectr.

var oCNpc her; her = Hlp_GetNpc (hero);
her.divectr = her.divetime;
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

SparrowJacek

SparrowJacek

Użytkownicy
Why is the rum gone?
posty368
Propsy78
ProfesjaGracz
  • Użytkownicy
  • Why is the rum gone?

SparrowJacek

Ikarus - 2 pytania
#14 2017-09-21, 08:01(Ostatnia zmiana: 2017-09-21, 08:18)
Niestety, moje próby napisania czegoś w tym języku opieram czysto o swoją wiedzę z Pythona, która jak widać niestety nie pomaga tu. Ale tego, że nie mogę się dobrać do tablicy nie rozumiem, biorąc pod uwagę fakt, że w species.d właśnie w ten sposób ją wypełniają.

Ciekawa sprawa, zmieniłem mój kod, wklejając dokładnie to co napisałeś. Jednak postać dalej może spędzić pod wodą tylko 30 sekund.

Manualne zmienienie w pliku species.d
DIVE_TIME [GIL_HUMAN] = 30;
na 5 daje efekt skrócenia czasu oddychania. Zakładam, że niezależnie od modyfikacji zmiennej .divectr, wartość czasu pod wodą nie może przekroczyć tego, który jest przypisany do gildii "człowiek". Czy więc jest opcja, by zmodyfikować to dynamicznie w grze?



Aha, żeby nie było wątpliwości, mój kod to

func void SetLongerBreath(){
var oCNpc her; her = Hlp_GetNpc (hero);
her.divectr = her.divetime;
};

i funkcja ta się wykonuje gdy wypije Bezi miksturkę szybkości póki co.

FUNC VOID UseItPo_Speed()
{
Mdl_ApplyOverlayMDSTimed (self, "HUMANS_SPRINT.MDS", Time_Speed);
SetLongerBreath();

};

EDIT:
zmienna .divectr odpowiada za obecny poziom paska oddychania. Jej wartość, gdy jest równa dive_time zwyczajnie oznacza, że mamy pełny pasek oddychania. Sam czas maksymalny jest zależny właśnie od wartości, którą podałem u góry - tak mi wyszło z obserwacji metodą prób i błędów.

EDIT2:
Metodą obejścia tego pewnie byłoby, gdybym zrobił funkcję, która co sekundę powiedzmy dodaje trochę do wartości .divectr i jeśli nie da się zmodyfikować DIVE_TIME, to pewnie w ten sposób to rozwiążę... Choć nie powiem, szybkie zmodyfikowanie jednej wartości jest zwyczajnie prostsze i szybsze do napisania :D
 
Zapamiętajcie dzień, w którym nie schwytaliście Kapitana Jacka Sparrowa

Halicor

Halicor

Użytkownicy
Hauptsturmfuhrer
posty365
Propsy57
ProfesjaNierób
  • Użytkownicy
  • Hauptsturmfuhrer
Skryptu ci nie napisze bo nie mam czasu(praca-praca) ale robisz coś źle, DIVE_TIME odpowiada za to jak długo możesz siedzieć pod wodą(testowane).

SparrowJacek

SparrowJacek

Użytkownicy
Why is the rum gone?
posty368
Propsy78
ProfesjaGracz
  • Użytkownicy
  • Why is the rum gone?
I właśnie o to mi chodzi. Tylko nie wiem jak w funkcji zmodyfikować ten parametr. Bo jak bezpośrednio próbuje

DIVE_TIME[GIL_HUMAN]=600;

To wyrzucalo mi blad unknown identifier. Przynajmniej jak na szybko dziś sprawdzalem, choć mogłem jakąś literowke np zrobić.
 
Zapamiętajcie dzień, w którym nie schwytaliście Kapitana Jacka Sparrowa

Splash

Splash

Moderator
posty4211
Propsy3414
ProfesjaNierób
  • Moderator
Wywala błąd, bo ta zmienna znajduje się w klasie C_GILVALUES. A ty próbujesz zmienić jej wartość jakby to była zmienna globalna. Musiałbyś najpierw przypisać do zmiennej jakiś obiekt tej klasy, do którego nie da się uzyskać dostępu.

var int divetime_potion;

FUNC VOID UseItPo_LongerBreath()
{
divetime_potion = true;

};

func void SetLongerBreath(){

if (!divetime_potion){return;};
var oCNpc her; her = Hlp_GetNpc (hero);
her.divectr = her.divetime;
};

Init_Global:

FF_ApplyOnce (SetLongerBreath);

To tak na szybko, bo jeszcze przydałoby się wyliczać czas, kiedy efekt mikstury ma się skończyć.
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

SparrowJacek

SparrowJacek

Użytkownicy
Why is the rum gone?
posty368
Propsy78
ProfesjaGracz
  • Użytkownicy
  • Why is the rum gone?
Splash, przeanalizuj jeszcze raz mój kod. Wydaje mi się, ze tam wszystko dobrze zrobiłem i przypisalem divectr wartość divetime, co skutkuje JEDYNIE tym, ze mamy pełny pasek. Pasek jest pełny, ale czas jaki pod woda możemy spędzić jest właśnie w DIVE_TIME zapisany. Mój kod musi więc co klatkę powiedzmy dodawać trochę do obecnego divectr żeby wydłużyć czas przebywania pod woda, jeśli nie da się edytować DIVE_TIME jak mówisz.

Jak dalem her.divectr = her.divetime/2 to gdy zanurkowalem miałem tylko część paska oddychania
 
Zapamiętajcie dzień, w którym nie schwytaliście Kapitana Jacka Sparrowa

Splash

Splash

Moderator
posty4211
Propsy3414
ProfesjaNierób
  • Moderator
Cytuj
Splash, przeanalizuj jeszcze raz mój kod.

Że niby to?
acz]
FUNC VOID UseItPo_Speed()
{
Mdl_ApplyOverlayMDSTimed (self, "HUMANS_SPRINT.MDS", Time_Speed);
SetLongerBreath();

};
Ta funkcja wywoła się tylko raz po użyciu mikstury, i nigdy więcej.
Cytuj
czas jaki pod woda możemy spędzić jest właśnie w DIVE_TIME
Tam jedynie definiujesz parametry dla każdej gildii, które są przypisywane npc po umieszczeniu ich do świata.

Cytuj
powiedzmy dodawać trochę do obecnego divectr
Mój sposób sprawiał, że obecna wartość jest równa maksymalnej. Po co komplikować sobie życie?

Cytuj
Jak dalem her.divectr = her.divetime/2 to gdy zanurkowalem miałem tylko część paska oddychania
Bo obie wartości zmiennych są liczbami zmiennoprzecinkowymi zapisanymi w standardzie IEEE 754. Jeśli chcesz wykonywać działania na floatach, musisz użyć funkcji znajdujących się w pliku floats.d

her.divectr = divf (her.divetime, mkf (2));
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie


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