Handlarz 13125 1

O temacie

Autor

Zaczęty 20.03.2008 roku

Wyświetleń 13125

Odpowiedzi 1

ficus
  • Gość

ficus
Gość

Handlarz
2008-03-20, 15:28(Ostatnia zmiana: 2009-07-11, 11:15)
Na prośbę pewnego usera imieniem edawid napisałem tutorial o tym jak zrobić w Gothicu handel z innym npc.
Tutek będzie pod G2 w G1 mogą się różnić niektóre rzeczy.
Tutek będzie na przykładnie npc o imieniu Ficek (ale dziwny zbieg okoliczności :P )
No więc tak po:
1.tworzymy funkcję w dialogu
Cytuj
INSTANCE DIA_Kdf_10000_Ficek_Trade   (C_INFO)
{
   npc         = Kdf_10000_Ficek;
   nr          = 99;
   condition   = DIA_Kdf_10000_Ficek_Trade_Condition;
   information = DIA_Kdf_10000_Ficek_Trade_Info;
   permanent   = True;
   trade       =  TRUE;// ta linijka odpowiada za to że po skończeniu tego dialogu przechodzi się do okna handlowego.
   description = "Pokaż mi co masz na sprzedaż.";
};
func int DIA_Kdf_10000_Ficek_Trade_Condition ()
{
   
   
      return TRUE;
   };
func void DIA_Kdf_10000_Ficek_Trade_Info ()
{
   B_GiveTradeInv (self);To też odpowiada za handel
   AI_Output         (other, self, "DIA_Kdf_10000_Ficek_Trade_15_00"); //Pokaż mi co masz na sprzedaż.
};


No więc brawo napisałeś już własny skrypt handlu i można handlować z tym npc :P  pytanie tylko czym?? no więc:
2.otwieramy folder _work/data/scripts/content/story/B_GiveTradeInv i w nim mamy plik B_GiveTradeInv.d
Otwieramy go.
Na samym początku będą zmienne "var" no więc piszemy linijkę:
Cytuj
var C_NPC Trd_Ficek;      Trd_Ficek       = Hlp_GetNpc (KDF_10000_Ficek);
Teraz może być problem dla nowicjuszy mianowicie będą 2 odwołania If i można pomieszać to gdzie je wpisać no więc proponuje nacisnąć "ctrl"+"F" i w wyszukiwaniu wpisać imię npcka który też ma handel (w G2 np. Gorax)
Teraz jedziemy niżej (albo robimy tak jak poleciłem)i znajdziemy funkcje "If" no i tutaj wpisujemy:
Cytuj
if  Hlp_GetInstanceID (slf) == Hlp_GetInstanceID (Trd_Ficek)      {B_ClearJunkTradeInv (slf); B_GiveTradeInv_Ficek      (slf);};
zjeżdżamy jeszcze niżej i wpisujemy taką linijkę:(nie może być w tej samej linii odwoływań ale powinniście się domyśleć)
Cytuj
if  Hlp_GetInstanceID (slf) == Hlp_GetInstanceID (Trd_Ficek)      {B_ClearDeadTrader   (slf);};


No więc teraz mamy już handel i poprawnie zrobione okno handlu :D  jedziemy dalej :
3.W folderze  _work/data/scripts/content/story/B_GiveTradeInv generujemy nowy plik *.d o nazwie takiej jak na czerwono zaznaczonej w punkcie drugim i w nim wpisujemy :
Cytuj
var int Ficek_ItemsGiven_Chapter_1;//zmienna

FUNC VOID B_GiveTradeInv_Ficek (var C_NPC slf)// Tu ma być ta sama nazwa co w punkcie drugim
{
   if ((Kapitel >= 1)//Zrozumiałe chyba ?? od którego rozdziału npc sprzedaje dane itemy
   && (Ficek_ItemsGiven_Chapter_1 == FALSE))//tu ta zmienna z początku skryptu jak chcemy np. drugi rozdział to robimy nową z literką 2.
   {
   
      CreateInvItems (slf, ItMi_Gold, 100); //Tu wpisujemy dane itemki UWAGA!!! W G2 wpisanie pancerza, złota, runy nic nie da i tak nie będzie można ich kupić w oknie handlu w przypadku G1 jest to tylko Pancerz
      
      CreateInvItems (slf,ItFo_Water , 5);
      CreateInvItems (slf,ItFo_Bread , 3);
      CreateInvItems (slf,ItFo_Cheese, 2);
      CreateInvItems (slf,ItMw_magicsword_death_02, 1);
      CreateInvItems (slf,ItAm_Hp_01, 1);
      
      Ficek_ItemsGiven_Chapter_1 = TRUE;// tu jak wyżej tylko wpisujemy TRUE
   };
};


No i to wszystko mamy swojego własnego npc który sprzedaje itemki ;p  

Jak jakieś pytania to proszę na PW albo w dziale pytania/problemy

PS. Prosiłbym kogoś z G1 o podanie co wygląda inaczej w G1 tutek jest do G2 i nie wiem czy podane przeze mnie pliki maja taką samą nazwę w g1

Tutorial może być skopiowany tylko do użytku na tym forum. Jak ktoś chce go umieścić na innym to tylko i wyłącznie za moją zgodą.

EDIT. Zauważyłem, że w istniejącym wcześniej temacie ktoś podał propozycje dania itemów do ekwipunku no więc:
to nie jest dobry pomysł ponieważ wystarczy że ktoś grający w moda zabiłby handlarza to by te wszystkie itemy zdobył :(  a to by było bez sensu.
 

Graveir

Graveir

Użytkownicy
Avatar Twilight Sparkle / Pożeracz serc
posty1275
Propsy235
ProfesjaGracz
  • Użytkownicy
  • Avatar Twilight Sparkle / Pożeracz serc
Siema.Jako,że miałem problemy z tutorialem Ficusia,który również stworzył tutorial o handlu z npc(dużo błędów mi dziwnych wyskakiwało)postanowiłem się trochę pomęczyć i udało mi się znaleźć sposób rozwiązania problemu.Dlatego napiszę,jak ja to zrobiłem,a co się później stanie z tym tutorialem,to już zależy od adminów/moderatorów.
Zacznijmy od prostej rzeczy,jaką jest stworzenie skryptu postaci.Tego raczej nie muszę wyjaśniać,ponieważ wystarczy ściągnąć sobie program NSCriptGenerator i w nim stworzymy sobie postać(program ogólnie niemiecki,ale bardzo prosty w obsłudze).Swoją postać nazwałem Kupiec(jedyną funkcją jaką pełni jest sprzedaż przedmiotów,dlatego nie bawiłem się w wymyślenie dla niego jakieś lepszej nazwy/dialogów).Dla ułatwienia podam skrypty dialogu+postaci i odpowiednie wpisy.
1)Skrypt Kupca:
// -----------------------------------
// This script file was created with NSC Script Generator 2.2 by Mirage Game Development
// Mirage Game Development - copyright 2005
// File: NONE_305_Kupiec
// -----------------------------------

instance NONE_305_Kupiec (Npc_Default)
{
// ------ NSC ------
name = "Kupiec";
guild = GIL_NONE;
id = 305;
voice = 10;
npctype = NPCTYPE_MAIN;

// ------ AIVARs ------
aivar[AIV_IgnoresArmor] = TRUE;

// ------ Attributes ------
B_SetAttributesToChapter(self, 1);

// ------ NSC relevant talents ------
B_GiveNpcTalents (self);

// ------ Fight tactic ------
fight_tactic = FAI_HUMAN_NORMAL;

// ------ Equipted weapons ------
EquipItem (self, ItMw_1h_Vlk_Sword);

// ------ Inventory ------
B_CreateAmbientInv (self);
// ------ Visuals ------
B_SetNpcVisual (self, MALE, "Hum_Head_Thief", Face_N_YBerion, BodyTex_N, ITAR_Leather_L);
Mdl_SetModelFatness (self, 0);
Mdl_ApplyOverlayMds (self, "Humans_Relaxed.mds");

// ------ Fight skills ------
B_SetFightSkills (self, 0);

// ------ Announce DR ------
daily_routine = Rtn_START_30006;
};

FUNC VOID Rtn_START_30006()
{
TA_Stand_ArmsCrossed(08,00,16,00,"NW_XARDAS_START");
TA_Stand_Guarding(16,00,00,00,"NW_XARDAS_START");
TA_Practice_Sword(00,00,08,00,"NW_XARDAS_START");
};
2)Gdy mamy już gotowy skrypt postaci i ją zapisaliśmy przechodzimy do utworzenia dialogu(polecam program Bucika Easy Dialog Maker).Skrypt dialogu:
// *Script was make in Easy Dialog Maker (EDM)
 
//========================================
//-----------------> OPCJA *KONIEC*  
//========================================
 
INSTANCE DIA_Kupiec_EXIT(C_INFO)
{
        npc             = NONE_305_Kupiec;
        nr              = 999;
        condition       = DIA_Kupiec_EXIT_Condition;
        information     = DIA_Kupiec_EXIT_Info;
        permanent       = TRUE;
        description     = "KONIEC";
};
 
FUNC INT DIA_Kupiec_EXIT_Condition()
{
        return TRUE;
};
 
FUNC VOID DIA_Kupiec_EXIT_Info()
{
        AI_StopProcessInfos     (self);
};
 
//========================================
//-----------------> HELLO1
//========================================
INSTANCE DIA_Kupiec_HELLO1 (C_INFO)
{
   npc          = NONE_305_Kupiec;
   nr           = 1;
   condition    = DIA_Kupiec_HELLO1_Condition;
   information  = DIA_Kupiec_HELLO1_Info;
   permanent    = TRUE;
   trade        = TRUE;
   description  = "Pokaż mi co masz na sprzedaż.";
};
 
FUNC INT DIA_Kupiec_HELLO1_Condition()
{
    return TRUE;
};
 
FUNC VOID DIA_Kupiec_HELLO1_Info()
{
    B_GiveTradeInv (self);
    AI_Output (other, self ,"DIA_Kupiec_HELLO1_15_01"); //Pokaż mi co masz na sprzedaż.
    AI_Output (self, other ,"DIA_Kupiec_HELLO1_03_02"); //Wybierz coś.
};
W tym skrypcie najważniejsze są trzy linijki,a dokładnie
permanent    = TRUE;
trade        = TRUE;
B_GiveTradeInv (self);
pernament = TRUE oznacza,że opcję handlu będziemy mogli wybierać cały czas.
trade = TRUE oznacza,że postać ma możliwość handlu.
B_GiveTradeInv (self); natomiast oznacza,że po tym dialogu zacznie się handel.
3)No więc mamy już stworzoną postać i dialog kupca,jednocześnie możemy już z nią handlować.No właśnie,tylko czym ma ona handlować?Więc musimy stworzyć kilka nowych linijek w pliku B_GiveTradeInv, który znajduje się w moim wypadku w:
D:\Gothic II\_Work\data\Scripts\Content\Story\B_GiveTradeInvNajlepiej skopiować jakąś linijkę od innego npc'a,który również ma handel(np.Zurisa)i zmienić na naszą nazwę(lub ewentualnie przerobić mój skrypt^^).No to zaczynamy od pliku B_GiveTradeInv.Pierwszy wpis powinien znaleźć się na samym dole zakładki:
//******************************************************************
// Hier muss jeder Händler eingetragen werden!!!!!!!
//******************************************************************
ale polecałbym,żeby dodać go pod ostatnią postacią,która jest w zakładce:
// GOTHIC2
Wpis powinien wyglądać tak:
var C_NPC Trd_Kupiec; Trd_Kupiec = Hlp_GetNpc (NONE_305_Kupiec);
Zamiast np.Trd_Kupiec wpisujemy swoją nazwę postaci,np.Alfred,a po Hlp_GetNpc w nawiasie wpisujemy instance naszej postaci.
Zjeżdzamy niżej i mamy następną zakładkę,przy której postępujemy tak samo jak w poprzedniej,tyle,że ma być inny wpis:
if  Hlp_GetInstanceID (slf) == Hlp_GetInstanceID (Trd_Kupiec) {B_ClearJunkTradeInv (slf); B_GiveTradeInv_Kupiec (slf);};
Tutaj zmieniamy tylko (Trd_Kupiec)i B_GiveTradeInv_Kupiec na (Trd_Alfred)oraz B_GiveTradeInv_Alfred.Czas na ostatnią linijkę w skrypcie,czyli następna zakładka:
////////////////////////////////////////////////////////////////////////////////////////////////////
// Handelsware Clearen und Ambientstuff in die Tasche, wenn Trader Unconscious oder Dead
////////////////////////////////////////////////////////////////////////////////////////////////////
Jest odpowiedzialna za usunięcie przedmiotów do kupienia w wypadku śmierci sprzedawcy.
if  Hlp_GetInstanceID (slf) == Hlp_GetInstanceID (Trd_Kupiec) {B_ClearDeadTrader (slf);};
Tutaj zmieniamy tylko (Trd_Kupiec)na (Trd_Alfred).Zapisujemy zmiany i jeszcze tylko jedna rzecz,którą musimy zrobić,by wszystko działało jak należy,czyli utworzenie skryptu handlu danego sprzedawcy(polecam skopiować mój skrypt,który podam i ewentualnie pozmieniać nazwy postaci+zmiennych i przedmioty do kupienia).A więc tworzymy skrypt o nazwie:
B_GiveTradeInv_Alfred
Musi być nazwa postaci sprzedawcy!!Po utworzeniu wklejamy poniższy skrypt do utworzonego właśnie pliku i zmieniamy to co nas interesuje:
FUNC VOID B_GiveTradeInv_Alfred (var C_NPC slf)
{
if ((Kapitel >= 1)
&& (Alfred_ItemsGiven_Chapter_1 == FALSE))
{
CreateInvItems (slf, ItMi_Gold, 100);
CreateInvItems (slf,ItPo_Mana_01 ,10);
CreateInvItems (slf,ItPo_Health_01 ,10);
       CreateInvItems (slf,itfo_wodka        ,10);

Alfred_ItemsGiven_Chapter_1 = TRUE;
};

if ((Kapitel >= 2)
&& (Alfred_ItemsGiven_Chapter_2 == FALSE)
{
CreateInvItems (slf, ItMi_Gold, 60);
CreateInvItems (slf,ItPo_Mana_01 ,15);
CreateInvItems (slf,ItPo_Mana_02 , 1);
CreateInvItems (slf,ItPo_Health_01 ,15);
CreateInvItems (slf,ItPo_Health_02 , 2);
 

Alfred_ItemsGiven_Chapter_2 = TRUE;
};
};
No i krótkie wyjaśnienie warunków.
if ((Kapitel >= 1)
Oznacza,jeśli rozdział jest większy,bądź równy
&& (Alfred_ItemsGiven_Chapter_1 == FALSE))
Natomiast to oznacza,że jeśli warunek if został spełniony I zmienna Alfred_ItemsGiven_Chapter_1 ma wartość FALSE to zostanie aktywowana funkcja handlu.Aha,wcześniej musimy tą zmienną zadeklarować w pliku story_globals.d czyli dopisujemy gdzieś na samym dole:
var int Alfred_ItemsGiven_Chapter_1;
Tak samo robimy do drugiego rozdziału,tylko zmieniamy
Alfred_ItemsGiven_Chapter_1 na Alfred_ItemsGiven_Chapter_2
No i to wszystko.Pisałem dość długo ten tutorial,więc jeśli ktoś czegoś nie będzie rozumiał,to niech napisze,a ja spróbuję mu wyjaśnić.Ewentualnie niech poczeka,aż uporam się z problemem dźwięku w CamStudio,to wtedy nakręce wideotutoriala.To tyle.
Pozdrawiam.
 
Mój obecny sprzęt PC:
Intel core i5-4590
8 gb ram
Geforce GTX 1050Ti


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