Kilka problemów ze skryptami 8925 16

O temacie

Autor StarFighter

Zaczęty 26.07.2010 roku

Wyświetleń 8925

Odpowiedzi 16

StarFighter

StarFighter

Użytkownicy
posty65
  • Użytkownicy
-Jak zrobić, by postać zginęła od razu, bez dobijania (tak jak ork, czy jakiś potwór albo bandyci w Gothic 2)? Tylko nie chcę jej ustawiać gildii ork wojownik albo jakiś potwór (nie wiem czy to coś da), ani nic z tych rzeczy, chciałbym, żeby to była normalna postać, tyle tylko, że zginie bez dobijania.
-I drugie pytanie: co muszę zrobić by np. z Velayą lub innymi dziewczynami z zamku Gomeza dało się rozmawiać?
-Jaką rutynę mam dać npc by poruszał się za innym npc? Mam z tym problem.
-Nie ma żadnych tutoriali o edycji czarów?
-Gdzie są pliki odpowiadające za respawn potworów?


Na razie to tyle, chociaż mam jeszcze dużo pytań.
Bardzo proszę o pomoc. Przez tego typu błędy nie mogę sobie spokojnie robić moda.
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Cytuj
-Jak zrobić, by postać zginęła od razu, bez dobijania (tak jak ork, czy  jakiś potwór albo bandyci w Gothic 2)? Tylko nie chcę jej ustawiać  gildii ork wojownik albo jakiś potwór (nie wiem czy to coś da), ani nic z  tych rzeczy, chciałbym, żeby to była normalna postać, tyle tylko, że  zginie bez dobijania.
http://themodders.org/index.php?/topic/1116-rozwizane-problemy/   - pytanie 5

Cytuj
-I drugie pytanie: co muszę zrobić by np. z Velayą lub innymi dziewczynami z zamku Gomeza dało się rozmawiać?
Zrobić dialog i zmienić gildię?

Cytuj
-Gdzie są pliki odpowiadające za respawn potworów?
..\Content\Story\CHAPTERS

StarFighter

StarFighter

Użytkownicy
posty65
  • Użytkownicy
1. Tam jest tylko o tym jak zrobić, by npc nas atakował. Mi chodziło o to, by npc ginął tak jak np kretoszczur czy inny pełzacz (albo ork), ale żeby był normalnym npc, nie atakował sam z siebie.
2.Zmieniłem gildię i dalej to samo, a dialogów nie dodałem żadnych, ale wtedy normalnie pokazałoby się okno dialogów gdzie jest ENDE kończące dialog (jak dodamy koniec albo jakiś dialog to znika) - a w tym przypadku nie.
3.Znalazłem. Dzięki.
 

StarFighter

StarFighter

Użytkownicy
posty65
  • Użytkownicy
Dodałem dialogi i nic.
To jak? Pomoże ktoś? (także z innymi wymienionymi problemami)?
I jeszcze jedno pytanie: da się jakoś odróżnić czy npc został zabity przez gracza? Chodzi mi o to, że np. jeśli zabijemy npc to ktoś nam będzie gratulował, itp. ale jeśli sam zginie, np. w walce z jakimś potworem - to już nie.
 

Goran

Goran

Użytkownicy
posty168
Propsy39
  • Użytkownicy
Cytuj
Dodałem dialogi i nic.

A skompilowałeś je? Bo jak je dodałęś, to główna wada jest zawsze w tym, że ich nie widać, to brak kompilowania.


/// EDIT: Post nr 200
 

StarFighter

StarFighter

Użytkownicy
posty65
  • Użytkownicy
Nie o to chodzi, że nie ma dialogów, tylko że jak chcę zagadać to słyszę "nie możesz ze mną rozmawiać"...
Cytuj
A skompilowałeś je? Bo jak je dodałęś, to główna wada jest zawsze w tym, że ich nie widać, to brak kompilowania.

No jasne, że tak. Najpierw napraw skrypty, potem aktualizuję i zapisuję (a wcześniej usuwam stare pliki z dialogami, bo jak się nadpisują to czasem są problemy)! To nie jest mój pierwszy dialog! W swoim tworzonym modzie dodałem już kilkadziesiąt npc i każdemu dałem przynajmniej koniec, nie mam z tym problemu!
Problem mam, bo robiąc moda, mając naprawdę niezłe pomysły zablokowałem się przy tworzeniu i nie wiem, jak z tego wybrnąć.
A później ktoś kto wie wpadnie na taki sam pomysł i zrobi takiego moda  :[  


Mam jeszcze nowy problem, nie chce mi się zainsertować npc w trakcie dialogu w innym zenie. Próbowalem wld_insertnpc, próbowałem też insertować przez B_...... i dać to B w dialogu. Ale mam kilka pomysłów, które muszę jeszcze wypróbować. Oraz jeden plan awaryjny, ale wtedy to już nie będzie to samo...
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja

Adanos
Administrator

Kilka problemów ze skryptami
#6 2010-07-30, 11:53(Ostatnia zmiana: 2010-07-30, 11:54)
Cytuj
I jeszcze jedno pytanie: da się jakoś odróżnić czy npc został zabity przez gracza? Chodzi mi o to, że np. jeśli zabijemy npc to ktoś nam będzie gratulował, itp. ale jeśli sam zginie, np. w walce z jakimś potworem - to już nie.
Spróbuj w ZS_Dead.d(trzeba odznaczyć, że plik tylko do odczytu) znajdującym się w katalogu ..\_Work\Data\Scripts\Content\AI\ZS_Human dodać w funkcji ZS_Dead coś takiego:
var int zabity;

if (Npc_IsPlayer(other) && hlp_getNpc(moj_NPC))
{
   zabity = 1;
};

StarFighter

StarFighter

Użytkownicy
posty65
  • Użytkownicy
Jak próbuję to dać (albo w klamrze, albo pod) są błędy...
Aż tak zaawansowany nie jestem, w edytowanie tych ZSów jeszcze się nie bawiłem.
Ale w skryptach wygrzebałem coś takiego

func void B_CheckDeadMissionNPCs ()
//Diese Funktion checkt im ZS_Dead, ob eine Mission durch den Tot eines NSCs obsolet geworden ist.
{
if (Hlp_GetInstanceID(Org_844_Lefty) ==  Hlp_GetInstanceID(self))
{
if (Lefty_Mission == LOG_RUNNING)
{
B_LogEntry (CH1_CarryWater, "Po śmierci Lewusa problem wody chyba sam się rozwiązał. Nigdy nie lubiłem tego człowieka.");
Log_SetTopicStatus (CH1_CarryWater, LOG_SUCCESS);
LeftyDead = TRUE;
};
};

Udało mi się przerabiać to tak, jak chciałem (dodać do tego własne postacie i własne skutki, warunki.)
Nie wiem tylko, czy to zadziała, jak postać zostanie zabita przez kogoś innego?
Czasami by się przydało, innym razem nie.
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Jak zrobisz tak:
Cytuj
func void ZS_Dead ()
{   
   PrintDebugNpc   (PD_ZS_FRAME, ZS_Dead );      
   PrintGlobals   (PD_ZS_CHECK);

   C_ZSInit();

   self.aivar[AIV_PLUNDERED] = FALSE;
   
   //-------- Erfahrungspunkte für den Spieler ? --------
   //SN: VORSICHT, auch in B_MagicHurtNpc() vorhanden!
   if   Npc_IsPlayer   (other)
   ||   (C_NpcIsHuman  (other) && other.aivar[AIV_PARTYMEMBER])
   ||   (C_NpcIsMonster(other) && other.aivar[AIV_MM_PARTYMEMBER])
   {
      B_DeathXP();   // vergibt XP an SC
   };
   
   if   C_NpcIsMonster(self)
   {
      B_GiveDeathInv ();    // für Monster
   };

        if   Npc_IsPlayer   (other)
        {

      B_CheckDeadMissionNPCs ();
        };
   B_Respawn (self);    
};

to powinno działać jeśli gracz go zabije. Chociaż z drugiej strony nie wiem, czy to jest konieczne.

StarFighter

StarFighter

Użytkownicy
posty65
  • Użytkownicy
Wielkie dzięki!
Spacer nie wykrywa błędów. Na oko też wszystko wygląda dobrze, chociaż jeszcze nie sprawdzałem (muszę pododawać potwory i bandytów żeby wypróbować jak działa)
A nie wiesz, jak zainsertować lub zmienić rutynę npc podczas dialogu, kiedy npc jest w innym zenie niż postać, z którą rozmawiamy?
Bo mi niestety nic nie wychodzi :/

Przeglądając ZS dead zwróciłem uwagę na pewien interesujący fragment
if C_NpcIsMonster(self)
{
B_GiveDeathInv (); // für Monster
};

Wygląda to jak śmierć bez dobijania. Da się to jakoś podczepić pod zwykłą postać? (bandyta na przykład, albo ork, z którym można zamienić kilka słów przez zabiciem go)
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Cytuj
Wygląda to jak śmierć bez dobijania. Da się to jakoś podczepić pod zwykłą postać? (bandyta na przykład, albo ork, z którym można zamienić kilka słów przez zabiciem go)
B_GiveDeathInv (); tworzy trofea potworów, nic poza tym.

Cytuj
A nie wiesz, jak zainsertować lub zmienić rutynę npc podczas dialogu, kiedy npc jest w innym zenie niż postać, z którą rozmawiamy?
Obawiam się, że się tak łatwo nie da. Byś musiał sprawdzać, czy NPC jest w innym świecie. Ale nie wiem, jak sensownie to robić...

StarFighter

StarFighter

Użytkownicy
posty65
  • Użytkownicy
Cholera, właśnie to zauważyłem... I niestety nie zdążyłem wyedytować posta....
Hmm... ja próbowałem dawać ich w startup a rutynę dawałem w nieistniejącym waypoincie "nowhere"  no i zmieniałem później w dialogu rutynę na normalną, ale zmiana rutyny dla postaci w innym zenie oczywiście nie poskutkowała...
Ale zastanawia mnie jedna rzecz. Jakby tak dać nowe B_ do startupa? (takie B_ jest w świątyni orków - odpowiada za wpis w dzienniku tuż po wejściu do świątyni). I w tym B_ dam if (warunek) insertuj tego, else if (warunek) insertuj tamtego itp. Tylko czy ta funkcja tak dodana będzie działać zawsze po wejściu, czy jednorazowo? Bo jak zawsze to daję zmienną jako jeden z warunków i ustawiam ją na true po zainsertowaniu i po sprawie. A jak jednorazowo, to głupio: nie spełnię warunku, wejdę, a później już nie przywoła mi.
Muszę to wypróbować.
A inne pytanko: niby nie można tworzyć nowych gildii. A gildie potworów? Można podopisywać, nie będzie błędów?
Dałoby się tak przemycić nowe gildie? Tylko jak z nią rozmawiać? (nie atakowanie jest chyba proste)
Można dać w startupie na różnych zenach różne nastawienia dla gildii?
PS. Jakbym chciał dołączyć nowy zen (tzn dodać do niego npc), o nazwie, np. nowyzen.zen to wystarczy, że w startup daję

FUNC VOID STARTUP_NOWYZEN ()
{
[lista npc itd]
};
FUNC VOID INIT_NOWYZEN ()
{
[cała reszta , B itp]
};
??
Nie próbowałem tego jeszcze bo zeny mam jeszcze niegotowe.
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Cytuj
A inne pytanko: niby nie można tworzyć nowych gildii. A gildie potworów? Można podopisywać, nie będzie błędów?
Dałoby się tak przemycić nowe gildie? Tylko jak z nią rozmawiać? (nie atakowanie jest chyba proste)
Można tworzyć nowe gildię potworów, ale rozmawiać to już na pewno nie...

Cytuj
PS. Jakbym chciał dołączyć nowy zen (tzn dodać do niego npc), o nazwie, np. nowyzen.zen to wystarczy, że w startup daję
Tak.

StarFighter

StarFighter

Użytkownicy
posty65
  • Użytkownicy
Dzięki za odpowiedź.  :)  
A w Gothicu 2 można było porozmawiać z owcą.. Pytanie jak oni to zrobili. Chyba dali npctype friend? Bo przy orkach takie coś działa, ale ma pewien istotny błąd: taki ork nie chce odpowiadać na ciosy, a sam broni bohatera gdy ktoś go zaatakuje. (to ciekawe, bo Diego nas nie broni na przykład: on nie jest orkiem - nie wiem co to miałoby mieć do rzeczy - ale też ma friend)
Nazbierało się nowych pytań:
-jak można zrobić, by postać (chodzi o naszego dzielnego beziego) miała zablokowaną możliwość otwierania własnego ekwipunku (na jakiś czas albo do odblokowania)?
Wiem, że takie coś jest możliwe. Czar kontrola. Przejmujemy sterowanie nad npc, ale nie nad jego itemami. Później jak czar się skończy i nawet kodami wejdziemy w tego npc to ekwipunek jest zablokowany.

oto skrypt czaru z folderu magic
func int Spell_Logic_Control(var int manaInvested)
{
PrintDebugNpc (PD_MAGIC, "Spell_Logic_Control");

if (!Npc_IsInState(other, ZS_Controlled))
{
PrintDebugNpc (PD_MAGIC, "npc is valid...");

PrintDebugNpc (PD_MAGIC, "manainvested 0...starting ZS_PsiDefense on npc");
if (!Npc_IsInState(other, ZS_PsiDefense))
{
B_FullStop (other);
AI_StartState (other, ZS_PsiDefense,1,"" );
};
 
  if (other.flags != NPC_FLAG_IMMORTAL)
  {
  PrintDebugNpc (PD_MAGIC, "npc is not immortal, sub mana");

// überschreiten die investierten manapunkte level*4, so ist sein wille gebrochen
  if ( manaInvested >= other.level*4 )
{
PrintDebugNpc(PD_MAGIC, "controlled success, starting states");

AI_StartState ( self ,ZS_PC_CONTROLLING ,0,"" );
Npc_SetActiveSpellInfo ( self,1 ); // übernommen

return SPL_SENDCAST;
};
return SPL_NEXTLEVEL;
  }
  else
  {
  PrintDebugNpc (PD_MAGIC, "npc is immortal");
  return SPL_NEXTLEVEL;
  };
 
  return SPL_NEXTLEVEL;
}
else
{
PrintDebugNpc (PD_MAGIC, "npc is not valid...");
// other ist kein npc
return SPL_SENDSTOP;
};

return SPL_DONTINVEST;
};


a oto dwa ZSy (controlled i controlling)

// original spieler
func void ZS_PC_Controlling()
{
PrintDebugNpc (PD_ZS_FRAME, "ZS_PC_Controlling");

Npc_PercEnable  ( self, PERC_ASSESSMAGIC , B_AssessMagic );
Npc_PercEnable  ( self, PERC_ASSESSDAMAGE , ZS_ReactToDamage );

Npc_PlayAni (self, "T_CONSHOOT_2_CONACTIVE" );
};


func void ZS_PC_Controlling_Loop()
{
PrintDebugNpc (PD_ZS_LOOP, "ZS_PC_Controlling_Loop" );
// Npc_PlayAni (self, "S_CONACTIVE" );
};


func void ZS_PC_Controlling_End()
{
PrintDebugNpc( PD_ZS_FRAME, "ZS_PC_Controlling_End" );

Npc_ClearAIQueue ( self ); // alle AI Befehle entfernen
AI_StandUp ( self ); // normale Ani wieder abspielen
AI_ContinueRoutine ( self );
};


// übernommener nsc, den man dann steuert
// zustand wird von programmlogik beendet
// Befehle, die hier stehen werden ignoriert, da der Spieler entweder nur Tastatur- oder Zustandsgesteuert sein kann
// andere NSCs können aber den Zustand des Spielers abfragen

func void ZS_Controlled()
{
PrintDebugNpc (PD_ZS_FRAME, "ZS_Controlled");
};


func void ZS_Controlled_Loop()
{
PrintDebugNpc (PD_ZS_LOOP, "ZS_Controlled_Loop" );
};


func void ZS_Controlled_End()
{
PrintDebugNpc (PD_ZS_FRAME, "ZS_Controlled_End" );

//-------- zu Boden fallen ! --------
B_FullStop (self);
AI_PlayAni (self, "T_PSI_VICTIM");
AI_Wait (self, 3.5);

//-------- fallgelassene Waffe aufheben ! --------
B_RegainDroppedWeapon (self); // Check ob Waffe/Rüstung herumliegt ist leider vom Stand vor der Ani T_PSI_VICTIM und könnte veraltet sein!!!
B_RegainDroppedArmor (self); // dito

//-------- Gegner behandeln ! --------
Npc_SetTarget (self, hero);
Npc_GetTarget (self);
AI_StartState (self, ZS_AssessEnemy, 1, "");
};
Jest tu coś o blokadzie ekwipunku? Powinno być, a jednak ja nic nie widzę...
a i jeszcze inny problem
B_RegainDroppedWeapon   (self);   ??? To jest podnoszenie broni czy jak? Nie mam tego w skryptach, mimo iż mam gmdk.
A B_RegainDroppedArmor   ?
-jak sprawić, by npc w trakcie dialogu wyjął łuk/kuszę/runę? (trochę głupio by wyglądało, gdyby mag groził bohaterowi swoim małym sztyletem...)
-jest jakaś możliwość usunięcia tego, że postać, która nas okradnie ma dwa razy więcej rudy niż nam zabrała?
-jest jakaś możliwość stworzenia npc regeneracji, gdy zaczyna się nowy dzień, lub wyjdziemy poza zasięg widzenia? (tak jak w Gothic 2)
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Cytuj
-jak można zrobić, by postać (chodzi o naszego dzielnego beziego) miała zablokowaną możliwość otwierania własnego ekwipunku (na jakiś czas albo do odblokowania)?
Wiem, że takie coś jest możliwe. Czar kontrola. Przejmujemy sterowanie nad npc, ale nie nad jego itemami. Później jak czar się skończy i nawet kodami wejdziemy w tego npc to ekwipunek jest zablokowany.
Może po prostu B_FullStop(other) albo AI_Wait(other, 5)? Jak dobrze pamiętam, to jak się da AI_Wait to nie można sterować postacią przez jakiś czas...

Cytuj
B_RegainDroppedWeapon (self); ??? To jest podnoszenie broni czy jak? Nie mam tego w skryptach, mimo iż mam gmdk.
A B_RegainDroppedArmor ?
Jest w ..\Gothic\_Work\Data\Scripts\Content\AI\AI_Intern\B_Functions.D

Jest to podniesienie i założenie broni/pancerza...

Cytuj
-jak sprawić, by npc w trakcie dialogu wyjął łuk/kuszę/runę? (trochę głupio by wyglądało, gdyby mag groził bohaterowi swoim małym sztyletem...)
Może Npc_HasRangedWeaponWithAmmo(self); do łuków/kuszy?
Do magii: AI_ReadySpell (VAR C_NPC self, VAR INT spellID, VAR INT investMana);
Cytuj
-jest jakaś możliwość stworzenia npc regeneracji, gdy zaczyna się nowy dzień, lub wyjdziemy poza zasięg widzenia? (tak jak w Gothic 2)
Nie bardzo rozumiem... Samą regenerację, która przywraca co jakiś czas życie można napisać dość łatwo.

StarFighter

StarFighter

Użytkownicy
posty65
  • Użytkownicy
Dzięki. :)
AI_Wait odpada, ale jeśli po fullstop można biegać, bić się itp to jest to czego szukałem.
Jeśli chodzi o regenerację: no faktycznie napisałem dosyć chaotycznie i można nie zrozumieć, co chciałem zrobić..
Miałem na myśli taką regenerację u innych npc, która jest w Gothic 2 NK. Uniemożliwia ona na przykład atakowanie silnego npc z łuku, uciekanie, powrót i tak w kółko: wystarczy wyjść poza pewien zasięg i już npc jest odregenerowany i z cheaterskiego nabijania doświadczenia nici. Tak samo z pobitymi npc.
Inny mój problem: jak zmienić czas np w dialogu, albo w b_. To, co na kodach robi się set time xx,xx
I jeszcze kilka:
-postać wroga można bić i dawać się pobić a po jakimś czasie wróg sam padnie. Nie dałoby się zrobić tak, aby npc po pokonaniu nas też się regenerował? Gdzie szukać plików, które za to odpowiadają? Ja bym spróbował w skrypcie zabieraniu bryłek rudy, ale nie wiem za bardzo gdzie szukać.
a, jeszcze jedno! Da się jakoś wyłączyć cheaty w modzie?
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Cytuj
Inny mój problem: jak zmienić czas np w dialogu, albo w b_. To, co na kodach robi się set time xx,xx
Wld_SetTime (t,00);


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