Tworzenie nowego atrybutu 8480 26

O temacie

Autor Wicon

Zaczęty 22.05.2012 roku

Wyświetleń 8480

Odpowiedzi 26

Wicon

Wicon

Użytkownicy
posty147
Propsy5
  • Użytkownicy
Czy jest możliwość tworzenia nowego atrybutu? Szukałem na forum ale nie było nigdzie jasno opisane. W każdym temacie znalazłem tylko urywek całego procesu tworzenia atrybutu. Proszę o Tutek, sam też zaczynam już próbować coś zrobić. Będę dawał znać jak mi idzie. ;p
 


Wicon

Wicon

Użytkownicy
posty147
Propsy5
  • Użytkownicy
Hm... Nie chodziło mi o klasy. Chciałem zrobić nowy atrybut, taki jak zręczność czy siła.
Niestety masa błędów których nie rozumiem.
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator

inż. Avallach
Administrator

Tworzenie nowego atrybutu
#3 2012-05-22, 17:03(Ostatnia zmiana: 2012-05-22, 17:11)
Te dwa tutoriale są właśnie o dodawaniu nowych pól (na przykład z atrybutami) w klasach (jak c_npc). Do tworzenia własnych klas w ogóle nie trzeba tutoriali, gdyż można to robić zwyczajnie, bez żadnego kombinowania (ale ma to strasznie ograniczone zastosowanie).

Moja metoda:var int attribute_posty [999999];
attribute_posty[tm_12819_wicon] += 1;
print (IntToString(attribute_posty[tm_12819_wicon]));
Jak widzisz, zostało tu stworzone i użyte coś podobne do atrybutu, chociaż klasa pozostała niezmieniona. W rzeczywistości jest to tablica używająca indeksu takiego, jaki ma dany identyfikator w parserze.

Gdyby zaś zrobić to metodą Rafała, zmieniając nazwę/typ któregoś z nieużywanych pól, wyglądałoby tak:
var c_npc wicon; wicon = hlp_getnpc(tm_12819_wicon);
wicon.posty += 1;
print (IntToString(wicon.posty));

Wicon

Wicon

Użytkownicy
posty147
Propsy5
  • Użytkownicy
Oto co zrobiłem do tej pory:

W pliku : Scripts/Content/Intern/Constants.d Dodałem:
const int ATR_KNOWSLEDGE                        =  9;
Następnie w pliku:  Scripts/Content/AI/AI_Intern/AI_Constants.d dodałem:
const int REAL_KNOWSLEDGE                               = 89;
Kolejny plik: Scripts/Content/Story/B_Story/B_BlessAttribute dodałem:
// ------ KWL steigern ------
if (attrib == ATR_KNOWSLEDGE)
{
oth.attribute[ATR_KNOWSLEDGE] = oth.attribute[ATR_KNOWSLEDGE] + points; //bzw. Npc_ChangeAttribute (oth, attrib, points);
oth.aivar[REAL_KNOWSLEDGE] = oth.aivar[REAL_KNOWSLEDGE] + points;

concatText = ConcatStrings(PRINT_BlessSTR, IntToString(points));
PrintScreen (concatText, -1, -1, FONT_SCREEN, 2);
};

Kolejny plik: Scripts/Content/Story/B_Story/B_GetLearnCostAttribute Dodałem:
// ------ Kosten für Knowsledge ------
if (attribut == ATR_DEXTERITY)
{
if (oth.aivar[REAL_KNOWSLEDGE] >= 600) { kosten = (1); }
else if (oth.aivar[REAL_KNOWSLEDGE] >= 250) { kosten = (1); }
else if (oth.aivar[REAL_KNOWSLEDGE] >= 150) { kosten = (1); }
else if (oth.aivar[REAL_KNOWSLEDGE] >= 75) { kosten = (1); }
else { kosten = (1); };
};

Kolejny plik: Scripts/Content/Story/B_Story/B_RaiseAttribute Dodałem na samej górze:
func void B_RaiseRealAttributeLearnCounter (var C_NPC oth, var int attrib, var int points)
{
if (attrib == ATR_STRENGTH) { oth.aivar[REAL_STRENGTH] = oth.aivar[REAL_STRENGTH] + points; }
else if (attrib == ATR_DEXTERITY) { oth.aivar[REAL_DEXTERITY] = oth.aivar[REAL_DEXTERITY] + points; }
        else if (attrib == ATR_KNOWSLEDGE) { oth.aivar[REAL_KNOWSLEDGE] = oth.aivar[REAL_KNOWSLEDGE] + points; }
else if (attrib == ATR_MANA_MAX) { oth.aivar[REAL_MANA_MAX] = oth.aivar[REAL_MANA_MAX] + points; };
};

I nieco niżej, tak jak było dla każdej umiejętności osobno:
// ------ STR steigern ------
if (attrib == ATR_KNOWSLEDGE)
{
oth.attribute[ATR_KNOWSLEDGE] = oth.attribute[ATR_KNOWSLEDGE] + points; //bzw. Npc_ChangeAttribute (oth, attrib, points);

concatText = ConcatStrings(PRINT_LearnKWL, IntToString(points));
PrintScreen (concatText, -1, -1, FONT_SCREEN, 2);
};

Kolejny plik: Scripts/Content/Story/B_Story/B_TeachAttributePoints Dodałem:
// ------ falscher Parameter ------
if (attrib!=ATR_STRENGTH) && (attrib!=ATR_DEXTERITY) && (attrib!=ATR_MANA_MAX) && (attrib!=ATR_KNOWSLEDGE)// Dodałem tutaj swój atrybut Knowsledge.

Następny plik:
Scripts/Content/Story/G_Functions/G_CanNotUse.d tu dodałem:
               else if (nAttribute == ATR_KNOWSLEDGE)          {       strAttributeMissing = PRINT_KNOWSLEDGE_MISSING          ; nAttributeValue = self.attribute[ATR_KNOWSLEDGE];             }
Dodałem też nowy atrybut postacią ze zmiennymi w pliku Scripts/Content/Story/Npc_Scripts/B_SetAttributesToChapter
oraz naszemu Npc w pliku: NPC_Default w tej samej lokalizacji co poprzedni plik.

No i ostatni plik: Scripts/Content/Story/Text.d Następujące linijki:
const string NAME_KWL_needed    = "Wymagana wiedza:";
const string NAME_Bonus_KWL             = "Premia do wiedzy:";
const string PRINT_LearnKWL                     = "Wiedza + ";
const string PRINT_LearnKWL1                            = "Wiedza + 1";
const string PRINT_LearnKWL5                            = "Wiedza + 5";
const string PRINT_BlessKWL                             = "Innos zwiększył twoją wiedzę o + ";
const string PRINT_KNOWSLEDGE_MISSING           = "pkt. wiedzy za mało";

Póki co zostawiam w spokoju dodanie atrybutu do okna statystyk. Nie znalazłem więcej plików, które były związane z atrybutami, więc wydaje mi się, że wszystkie pliki potrzebne do stworzenia atrybutu to te które wymieniłem, jeśli coś robię źle, proszę mnie poprawić. Podczas reparsowania wyskakuje mi następujące błędy:

U:PAR:
/_WORK/DATA/SCRIPTS/CONTENT/STORY/B_STORY/B_RAISEATTRIBYTE.D Buuuuuuuhhhh, Pfiffe, Unmut : Array- Index out of Range: C_NPC.AIVAR[401]
następny:
U:PAR:
/_WORK/DATA/SCRIPTS/CONTENT/STORY/B_STORY/B_RAISEATTRIBYTE.D Buuuuuuuhhhh, Pfiffe, Unmut : Array- Index out of Range: C_NPC.ATTRIBUTE [9]
następny:
U:PAR:
/_WORK/DATA/SCRIPTS/CONTENT/STORY/B_STORY/B_BLESSATTRIBUTE.D Buuuuuuuhhhh, Pfiffe, Unmut : Array- Index out of Range: C_NPC.AIVAR[401]
następny:
U:PAR:
/_WORK/DATA/SCRIPTS/CONTENT/STORY/NPC_SCRIPTS/B_SETATTRIBUTESTOCHAPTER.D Buuuuuuuhhhh, Pfiffe, Unmut : Array- Index out of Range: C_NPC.ATTRIBUTE [9]
następny:
U:PAR:
/_WORK/DATA/SCRIPTS/CONTENT/STORY/NPC_SCRIPTS/B_SETATTRIBUTESTOCHAPTER.D Buuuuuuuhhhh, Pfiffe, Unmut : Array- Index out of Range: C_NPC.AIVAR[401] //<---U npc_Deafult to samo
Następnie to samo w pliku G_CANNOTUSE.d  -->C_NPC.ATTRIBUTE [9] oraz C_NPC.AIVAR[401] i to samo w Getlearncostattribute.

Co to za błąd? Jak go naprawić, wydaje mi się, że albo liczby są zbyt duże, albo trzeba jeszcze to dodać w jakimś innym pliku.
 

Wicon

Wicon

Użytkownicy
posty147
Propsy5
  • Użytkownicy
Dobra poprubóję z tymi klasami.
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator

inż. Avallach
Administrator

Tworzenie nowego atrybutu
#6 2012-05-22, 17:48(Ostatnia zmiana: 2012-05-22, 17:51)
Ty próbowałeś dodać do klasy, tylko widocznie nawet nie rozumiałeś co to było i robiłeś to źle.
"Attribute" to tablica intów w klasie c_npc o rozmiarze 8. Ty próbowałeś użyć
const int ATR_KNOWSLEDGE = 9;
oth.attribute[ATR_KNOWSLEDGE]...
Czyli odwołać się do dziewiątego elementu tej tablicy. Jak napisałem, ma ona tylko 8, więc wywaliło błędy.
Możesz albo skorzystać z mojej sztuczki i zrobić coś co będzie w praktyce działało podobnie jak atrybut, albo użyć sposobu Rafała, wywalić jakiś nieużywany element klasy i rozszerzyć tą/tę tablicę (zmienić stałą ATR_INDEX_MAX).

Wicon

Wicon

Użytkownicy
posty147
Propsy5
  • Użytkownicy

Wicon

Tworzenie nowego atrybutu
#7 2012-05-22, 17:52(Ostatnia zmiana: 2012-05-23, 14:32)
Te dwa tutoriale są właśnie o dodawaniu nowych pól (na przykład z atrybutami) w klasach (jak c_npc). Do tworzenia własnych klas w ogóle nie trzeba tutoriali, gdyż można to robić zwyczajnie, bez żadnego kombinowania (ale ma to strasznie ograniczone zastosowanie).

Moja metoda:var int attribute_posty [999999];
attribute_posty[tm_12819_wicon] += 1;
print (IntToString(attribute_posty[tm_12819_wicon]));
Jak widzisz, zostało tu stworzone i użyte coś podobne do atrybutu, chociaż klasa pozostała niezmieniona. W rzeczywistości jest to tablica używająca indeksu takiego, jaki ma dany identyfikator w parserze.

Gdyby zaś zrobić to metodą Rafała, zmieniając nazwę/typ któregoś z nieużywanych pól, wyglądałoby tak:
var c_npc wicon; wicon = hlp_getnpc(tm_12819_wicon);
wicon.posty += 1;
print (IntToString(wicon.posty));

Nie rozumiem tego. Cholera, człowiek próbuje zrobić wreszcie coś bardziej zaawansowanego niż same dialogi i już ma problemy hihi. Metoda prób i błędów narazie nie pomaga.

Nie rozumiem co oznaczają linijki które mi wskazałeś. Gdybym wiedział do czego to służy, to z pewnością bym sobie poradził, a takie przepisanie jest do kitu. ;p

No dobra, koniec tych prób, przynajmniej narazie. Nic nie wymyślę. Wydaje mi się, że muszę jeszcze gdzieś dodać REAL_KNOWSLEDGE i ATR_KNOWSLEDGE ale nie wiem gdzie. Jak by ktoś mógł, to proszę o zrobienie dokładnego tutka jak zrobić nowy atrybut, tak aby było można się go uczyć i aby był widoczny w menu statystyk.

Ty próbowałeś dodać do klasy, tylko widocznie nawet nie rozumiałeś co to było i robiłeś to źle.
"Attribute" to tablica intów w klasie c_npc o rozmiarze 8. Ty próbowałeś użyć
const int ATR_KNOWSLEDGE = 9;
oth.attribute[ATR_KNOWSLEDGE]...
Czyli odwołać się do dziewiątego elementu tej tablicy. Jak napisałem, ma ona tylko 8, więc wywaliło błędy.
Możesz albo skorzystać z mojej sztuczki i zrobić coś co będzie w praktyce działało podobnie jak atrybut, albo użyć sposobu Rafała, wywalić jakiś nieużywany element klasy i rozszerzyć tą/tę tablicę (zmienić stałą ATR_INDEX_MAX).


phiii sorry nie zauważyłem tego posta. W takim razie zaraz popróbuję .

// ------ REAL Attributes ------
const int REAL_STRENGTH = 81;
const int REAL_DEXTERITY = 82;
const int REAL_MANA_MAX = 83;
const int REAL_TALENT_1H = 84;
const int REAL_TALENT_2H = 85;
const int REAL_TALENT_BOW = 86;
const int REAL_TALENT_CROSSBOW = 87;

const int AIV_SpellLevel = 88;

Tutaj też trzeba dodać REAL_atrybut.
Wpisałem tu numer 401 i wywaliło błędy. Więc gdybym wpisał np. 88 to pewnie też by nie było bo domyślam się, że tu chodzi o to samo co przy tamtej tablicy. Które więc mogę tu zastąpić, bo nie wiem co jest potrzebne a co nie. AIV_SpellLevel to nie wiem, bo reszta potrzebna. Może jakiś jeszcze mniejszy numerek wpisać?

EDIT- Zapomniałem dać code.;p

Muszę wykasować ATR_INDEX_MAX z innych skryptów, ale nie wiem gdzie szukać. W tych w których dodawałem swój atrybut nie ma ATR_INDEX_MAX. Będę ich szukał ale w razie gdyby się nie doszukał to miło by było dowiedzieć się tego tutaj.

No a reszta już działa,

Tam gdzie dodawałem REAL_KNOWSLEDGE  wpisałem wartość 89 i działa, nie ma będów. A Unkown identyfire ATR_INDEX_MAX wyskakuje mi, że w 20 linijce. To nieco ułatwi pracę.

Znalazłem. Ten wpis znajduje się w pliku classes w linijce 20. Teraz to nie wiem, czy mam go usunąć, czy zamiast tego wpisać swoje. czyli zamieniłbym :
VAR INT     attribute [ATR_INDEX_MAX] ;na:
VAR INT     attribute [ATR_KNOWSLEDGE] ;
Wiem, że narobiłem niezłego zamieszania;p
Ale muszę rozwiązać jeszcze tylko ten problem.
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator
Po pierwsze, nie pisz kilku postów pod rząd - korzystaj z opcji "Edytuj".

Zdecydowanie mam wrażenie że nie wiesz co robisz, nie tylko od strony technicznej. Chcesz dodać nowy atrybut - tak jak pisałem, jest na to kilka sposobów. Ale w jakim celu? Musisz się liczyć z kilkoma faktami, z których najważniejszym jest ten, że nawet jak dodasz nowy atrybut, NIE będzie go widać na ekranie statystyk. Będziesz mógł go zmieniać i czytać przez skrypty, ale tylko tyle.
Żeby dodać nowy wpis do okna statystyk, musiałbyś sięgnąć po skomplikowane narzędzia ingerujące w pracę silnika gry, zwykłe skrypty do tego nie wystarczą. Ewentualnie jest też jeden trick na który kiedyś wpadłem, który pozwala dodać JEDNĄ wartość i jej opis.

Tak więc daj znać czego właściwie potrzebujesz w praktyce, a dopiero potem pomyślimy jak to zrealizować.

Wicon

Wicon

Użytkownicy
posty147
Propsy5
  • Użytkownicy
Ale jestem ciemny haha. Ale wreszcie załapałem.

const int ATR_KNOWSLEDGE =  8;
const int ATR_INDEX_MAX                                 = 9;

W ten sposób przedłużyłem tablice atrybutów i pozbyłem się tego błędu.

Ale nadal wyskakuje mi błąd:

/_WORK/DATA/SCRIPTS/CONTENT/STORY/B_STORY/B_RAISEATTRIBYTE.D Buuuuuuuhhhh, Pfiffe, Unmut : Array- Index out of Range: C_NPC.AIVAR[88]
Chciałem zrobić coś takiego:
const int REAL_KNOWSLEDGE                                       = 88;

const int AIV_SpellLevel = 89;

Myślałem, że to jest przedłużenie tak jak tam. Niestety nie. Więc jaką mam wpisać tam wartość i ewentualnie jak rozszerzyć tą tablicę??
 


Wicon

Wicon

Użytkownicy
posty147
Propsy5
  • Użytkownicy

Wicon

Tworzenie nowego atrybutu
#11 2012-05-23, 08:28(Ostatnia zmiana: 2012-05-23, 08:32)
Dobrze, piszę co chcę osiągnąć. Chcę stowrzyć atrybut, którego będzie można się nauczyć tak jak siły i zręczności, lecz to już pisałem. W tym celu wyszukałem wszystkie skrypty w których znalazłem coś, co ma związek z atrybutami.

EDIT: Dodałem REAL_KNOWSLEDGE pod:
const int ATR_KNOWSLEDGE =  8;
const int REAL_KNOWSLEDGE                               = 9;
const int ATR_INDEX_MAX                                 = 10;

Teraz nie ma błędów, potem sprawdzę czy działa teraz muszę spadać. Właśnie czytałem, że w oknie statystyk ciężko dodać nowy wpis. Ale przecież w tym oknie na samym końcu jest jeszcze kilka wolnych linijek. Można to tam po prostu dodać w menu_status.d  
No jestem poczatkujący i nie wiem czy to coś da ale znalazłem takowy plik.

Jeśli jest na to sposób, to proszę o poradę lub prosze mnie posłać do istniejącego tutka.
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator
Jeśli ma to mieć tylko gracz, nawet nie potrzebujesz robić prawdziwego nowego atrybutu. Musisz jedynie wyświetlić daną zmienną w w oknie statystyk, które jednak nie ma bezpośredniej komunikacji z paczką content.

Wicon

Wicon

Użytkownicy
posty147
Propsy5
  • Użytkownicy
Podczas reparsowania brak błędów. Ale jak chcę włączyć nową grę to wyskakuje:

U:PAR:Class - size not compatible : C_NPC
CPP - size : 800
Scripts - size : 808
 


Wicon

Wicon

Użytkownicy
posty147
Propsy5
  • Użytkownicy

Wicon

Tworzenie nowego atrybutu
#15 2012-05-23, 14:25(Ostatnia zmiana: 2012-05-23, 14:49)
Tak załapałem o co chodzi. Jedna klasa = size:4
Dodałem dwie nowe: ATR_KNOWSLEDGE i REAL_KNOWSLEDGE co dało razem 8.

Więc podstawiłem swój atrybut za regeneratemana i za regenerateHP i wszystko działa poprawnie. Zrobiłem sobie testowego nauczyciela i uczy mni jak należy. Napisy poprawne, dam + 5 atrybut zwiększa si o 5.

Teraz chyba zaczynam rozumieć. Jest to zabronione. Czy idzie zrobić tak, aby nie podmieniać tych umiejętności tylko dodać nową tak jak chciałem. Wydaje mi się, że muszę dodać nowe klasy, tak jak ty mi to usiłowałeś wytłumaczyć, czyli należałoby skorzystać z linku w twoim pierwszym poście.  

Dobrze to rozumuję?

EDIT:  Zrobiłem nową klasę. To w pliku Classes:
       VAR INT     newattrib                   [ATR_INDEX_SKILLS];
I dodałem w Constants:

const int ATR_KNOWSLEDGE = 0;
const int REAL_KNOWSLEDGE                               = 1;
const int ATR_INDEX_SKILLS                              = 2;

Początkowo coś takiego, ale wyskoczył błąd size: 788. Brakowało więc 12 no to dodałem:

//
//      NPC NEW ATTRIBUTE
//

const int ATR_KNOWSLEDGE = 0;
const int REAL_KNOWSLEDGE                               = 1;
const int ATR_KOWAL                                     = 2;
const int ATR_ALCHEMIK                                  = 3;
const int REAL_ALCHEMIK                                 = 4;
const int ATR_INDEX_SKILLS                              = 5;

Błąd nie wyskakuje, gra się włącza, ale nie da się z nikim gadać bo dialogi się nie włączają. Co robię źle?
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator

inż. Avallach
Administrator

Tworzenie nowego atrybutu
#16 2012-05-23, 14:31(Ostatnia zmiana: 2012-05-23, 14:37)
Nie masz dodawać nowych klas.
Ja bym zapisywał dodatkowy atrybut w hero.name, które można wyświetlać (wpis jest ukryty na początku tego menu_status.d).

Żeby dodać więcej niż trzy, musiałbyś skorzystać z narzędzi do modyfikacji silnika, ewentualnie jakoś kombinować z nieużytymi umiejętnościami.

W ogóle nie mylisz klasy (zbiór właściwości, coś jak obramowanie albo szablon, na przykład "npc") z polem (pojedyncze miejsce w klasie przechowujące jakąś wartość, jak atrybut)

RafalBudzis

RafalBudzis

Użytkownicy
posty1967
Propsy808
ProfesjaSkrypter
  • Użytkownicy

RafalBudzis

Tworzenie nowego atrybutu
#17 2012-05-23, 14:47(Ostatnia zmiana: 2012-05-23, 14:51)
Dobrze to rozumuję?

EDIT:

VAR INT     id ;
VAR STRING name [5] ;
        VAR STRING      name1                                                   ;
        VAR STRING      name2                                                   ;
        VAR STRING      name3                                                   ;
        VAR STRING      name4                                                   ;

Zrobiłem coś takiego w classes tak jak było to w tutku Rafalabudzisa i wywaliło błąd
size : 800
size : 880

Po 1
Budzis to nazwisko za małą literę dostaniesz w cymbał ;d  pisz samo imię czy tak nie jest wygodniej ? :D

po 2
rozmiary
4 - int - wartość liczbowa
20 - string - łańcuch znaków
800 - klasa NPC

po 3
U  mnie w tutorialu jest
VAR STRING name;a nie
VAR STRING name[5];
ZACZNIJ CZYTAĆ !!!

Po 4
Jeśli umiejętność ma być tylko dla naszego NPC to można zrobić jedną zmienną globalną integer ?

Wicon

Wicon

Użytkownicy
posty147
Propsy5
  • Użytkownicy
Dobra, jako że zamierzam dodać tylko 1 atrybut to zostanę przy tym, że dam swój atrybut zamiast regenerateHP i regenerate MANA.

Może kiedyś spróbuję dodać swój atrybut a jako nowy a nie wrzucony za regenerację bo narazie chyba za tępy jestem na to. Ważne, że atrybut działa i można się go nauczyć.

To jeszcze nie koniec tematu, teraz będę się męczył z dodaniem wpisu do okna statystyk. Pewnie znów będzie masa błędów.
 

EdekSumo

EdekSumo

Wyspa Khorinis
posty1739
Propsy924
ProfesjaLvl designer
  • Wyspa Khorinis
Weźcie go olejcie. Kurwa pisać 100 razy to samo :facepalm:  za jakiś czas może zrobię tutka na coś takiego więc może w tedy zrozumie choć w to wątpię.
 


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