Zbroja, która ponosi uszkodzenia w trakcie walki 25689 106

O temacie

Autor pawbuj

Zaczęty 25.03.2013 roku

Wyświetleń 25689

Odpowiedzi 106

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
jak w temacie macie pomysł jak zabrać się od tworzenia zbroi,która bedzie nam służyć do pewnego poziomu jej wytrzymałości na ciosy. czy trzeba do tego ikariusa?
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
Nie, wystarczą zwykłe zmienne które są do wykorzystania w klasie c_item. Zwyczajnie w funkcji wywoływanej przez perc_assessdamage dodajesz pobieranie obiektu zbroi założonej przez ofiarę (prawdopodobnie będziesz chciał dodać warunek aby ofiarą mógł być tylko hero?) i zmieniasz wartość wybranego pola. Jednym z niewykorzystanych i nadających się do tego jest bodajże "weight". Dodajesz także warunek aby jeśli dana wartość spadnie do zera, ochrona zbroi spadała.

Generalnie to jest coś dość banalnego. Równie łatwo można zrobić uwzględnianie wizualnych uszkodzeń zbroi, po prostu wykonując kilka jej wariantów i podmieniając je według danego wskaźnika.

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
to jednak oznacza, że każda zbroja musi mieć swoją zmienną dla wytrzymałości pancerza. czy tak? podczas reakcji na uderzenia zmienna bedzie zmieniac swoją wartość, tylko jak skolerować ją z siłą uderzenia (tj. siła npc atakującego plus oręża)?

var int weight_instance pancerza
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
Nie pisałem że chodzi o nową zmienną globalną, ale niewykorzystane pole w klasie c_item - coś co każdy item już "ma", tylko nie ustawione. Jako przykład podałem c_item.weight. Skorelowanie uszkodzeń z siłą uderzenia jest dość problematyczne i na twoim miejscu zostawiłbym to na koniec.

Właściwie to ja bym nie korzystał nawet z osobnego pola tylko zwyczajnie odejmował dane wartości od ochron pancerza.

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
Nie pisałem że chodzi o nową zmienną globalną, ale niewykorzystane pole w klasie c_item - coś co każdy item już "ma", tylko nie ustawione. Jako przykład podałem c_item.weight. Skorelowanie uszkodzeń z siłą uderzenia jest dość problematyczne i na twoim miejscu zostawiłbym to na koniec.

Właściwie to ja bym nie korzystał nawet z osobnego pola tylko zwyczajnie odejmował dane wartości od ochron pancerza.
to co piszesz jest dosyć logiczne, przy uderzeniach zmniejsza się ochrona pancerza na dany rodzaj uderzeń. nieco obawiam się zmian tych atrubutów w praktyce. kiedys robiłem miecz,który po naostrzeniu zwiększał ochorną jak dla pancerza. nie zawsze działanie było prawidłowe jak w skryptach, dlatego pewnie w MT zrobili ,że przy naostrzeniu podmieniamy oręż tyle, że z takim samym wyglądem.

Nieco prościej by było zrobić zbroję, która jeżeli zmienna osiaganie np. poziom 0 to przy kolejnym uderzeniu hero ściąga pancerz, który jest usuwany z ekwipunku. przy czym zmienna dla kazdego musiała by być indywidualna. popraw mnie, jeśli źle to rozumuję.
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
Źle, bo tak jak pisałem NIE masz korzystać ze zmiennej (wartość "unikatowa"), ale z pola klasy (swoją posiada każdy obiekt danego rodzaju). Jako przykład podałem c_item.weigth.
var c_item zbroja;
zbroja = Npc_GetEquippedArmor(self);
zbroja.weigth = 666;

Mark56

Mark56

Moderator
som veľký magič
posty1632
Propsy1846
ProfesjaAnimator
  • Moderator
  • som veľký magič
Cytuj
666
 :O  why that number

A ja obawiam się tych gothicowych intance..
Bo jak zmienisz wartości zbroji za biegu gry to stanie się to ze wszystkimi jej instacjami v grze, czyli jak zniszczysz np  zbroje strażnika to straznici będą mieli zbroje równie zmodyfikowana...
 


inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
Cytuj
666
 :O  why that number

A ja obawiam się tych gothicowych intance..
Bo jak zmienisz wartości zbroji za biegu gry to stanie się to ze wszystkimi jej instacjami v grze, czyli jak zniszczysz np  zbroje strażnika to straznici będą mieli zbroje równie zmodyfikowana...
Lehona pisał że nie, kiedyś też tak myślałem. Nigdy sam nie sprawdziłem. Wow, Mark, ty piszesz "W" :D

Wowoz

Wowoz

Użytkownicy
Wowoźny
posty3698
Propsy4862
NagrodyVV
Profesjabrak
  • Użytkownicy
  • Wowoźny
Wow, Mark, ty piszesz "W" :D

2x v mu się napisało przez przypadek :lol2:  vv
 

Mark56

Mark56

Moderator
som veľký magič
posty1632
Propsy1846
ProfesjaAnimator
  • Moderator
  • som veľký magič
Pisałem szkolna prace na temat polskiego, czeskiego i słowackiego języka to coś się nauczyłem  :D
 


pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
temat ze zbrojami był już podnoszony w modach, chociażby Wielka Wojna demo. Tamjest tylko zwykły tick tock, jednak broń w zawarciu ma okreslony czas użytkowania w zalezności od trafień. Myslę, że podobnie mozna by zrobić, aby zarówno pancerze jak i broń w zwarciu miały okreslona zywotność, przez co zwiększymy poziom trudności i wymusimy dodatkowe myślenie na graczu.
 


Mark56

Mark56

Moderator
som veľký magič
posty1632
Propsy1846
ProfesjaAnimator
  • Moderator
  • som veľký magič
temat ze zbrojami był już podnoszony w modach, chociażby Wielka Wojna demo. Tamjest tylko zwykły tick tock, jednak broń w zawarciu ma okreslony czas użytkowania w zalezności od trafień. Myslę, że podobnie mozna by zrobić, aby zarówno pancerze jak i broń w zwarciu miały okreslona zywotność, przez co zwiększymy poziom trudności i wymusimy dodatkowe myślenie na graczu.
O to mi chodziło, tez chciałem robić takie rzeczy, ale zawsze myślałem ze na to trzeba inne podejście. Do tego ostatnio czytałem jak Sektspinner (tworca ikarusa ,wog.de ) pisał w podobnym związku o tworzeniu osobnego instance dla każdej zmiany miecza (ostrzenie,otrucie,itp.) a własnie mnie to przekonuje ze nie działa to tak prosto albo będą bugi ...
 


pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
temat jest warty relizacji.

jedno mnie nurtuje, czy nie będzie tak, że przy każdym trafieniu zmienna weight będzie ulegac zmniejszeniu aż do 0 i zdjęciu pancerza to przy kolejnym takim samym pancerzu po otrzymaniu pierwszego ciosu pancerz zostanie zdjęty?

przecież weight.grd_armor_i = 0 będzie wynosić dla każdego jednego takiego samego pancerza.
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Cytuj
przecież weight.grd_armor_i = 0 będzie wynosić dla każdego jednego takiego samego pancerza.
No nie. Tylko jeden obiekt zostanie zmodyfikowany. Tylko jeden pancerz o danej instancji.

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
przecież weight.grd_armor_i = 0 będzie wynosić dla każdego jednego takiego samego pancerza.
Adanos ma rację. Nie dość że zamieniłeś kolejność wyrazów w przypisaniu, to jeszcze mylisz identyfikator z definicją obiektu, a jego z kolei z jego instancją.
"grd_armor_i" to identyfikator. Z punktu widzenia skryptów jest on liczbą. To co jest napisane w armors.d pod "instance grd_armor_i (c_item)" z kolei nazwałbym definicją. Nie da się w skryptach uzyskać odniesienia do definicji samej w sobie, więc także nie da się jej zmodyfikować. Możesz uzyskać odniesienie jedynie do jednej z instancji (wystąpień w świecie), np za pomocą funkcji Npc_GetEquippedArmor. Ale ponieważ jest to odniesienie tylko do tego jednego egzemplarza, tylko on powinien zostać zmodyfikowany.

W przypadku npc jest to trochę bardziej mylące, bo istnieje funkcja Hlp_GetNpc. Nie byłoby z nią problemu gdyby każdy npc występował w świecie tylko raz, ale że niektórzy występują w wielu kopiach (np potwory) to ta funkcja w ich przypadku zapewne zwraca odniesienie do pierwszego znalezionego egzemplarza i z tego powodu jej zastosowanie jest ograniczone.

Prawidłowy przykład podałem w trzecim poście:
var c_item zbroja;
zbroja = Npc_GetEquippedArmor(self);
zbroja.weigth = 666;

Temat tego jak działają skryptowe identyfikatory poruszałem już kilka razy, dając różne przykłady potwierdzające tą teorię. Innym który teraz mi przychodzi do głowy jest coś takiego:
(npc#msg1076720owi należy najpierw założyć tą zbroję)
var c_item item_instance = Npc_GetEquippedArmor(self);

var int instance_id_1 = grd_armor_i;
var int instance_id_2 = Hlp_GetInstanceID(item_instance);
Jeśli dobrze zgaduję jak działa funkcja Hlp_GetInstanceID, te zmienne liczbowe powinny mieć identyczną wartość.

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
dodałem do b_combatreacttodamage , zs_reactotodamage i specialcombatdamagereaction nast. funkcję z definicją:

func void CheckArmor ()
{


var c_item zbroja;
zbroja = Npc_GetEquippedArmor(hero);

zbroja.weight = zbroja.weight - 1;
PrintScreen (ConcatStrings ("Pozostało: ", IntToString(zbroja.weight)),10,12,"FONT_OLD_10_WHITE.TGA",3);
PrintScreen ("Zbroja traci wartość!", -1,-1,"FONT_OLD_10_WHITE.TGA",4); //dla testu

};

jednak żadna informacja nie wyswietla się, co robię nie tak?
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
Albo dodałeś to w złym miejscu, albo testujesz w świecie w którym nie działają perceptiony. Zależnie od części gry mogłeś też wybrać złe funkcje. Najlepiej po prostu wyszukać tekstowo w skryptach perc_assessdamage i zobaczyć jakie funkcje są do niego przypięte.

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
Albo dodałeś to w złym miejscu, albo testujesz w świecie w którym nie działają perceptiony. Zależnie od części gry mogłeś też wybrać złe funkcje. Najlepiej po prostu wyszukać tekstowo w skryptach perc_assessdamage i zobaczyć jakie funkcje są do niego przypięte.
Av, w praktyce nie działało, bo sprawdzałem kiedy hero otrzymuje ciosy. tymczasem kiedy on je zadaje to zmienna zmniejsza wartość. co zrobiłem nie tak?

i rzeczywiście mamy 2 takie same zbroje, ale rózny wskaźnik dla zmiennej weight.

cały problem w tym , że funkcja jest wywoływana kiedy hero bije, a nie jest bity.

oczywiście mozna spróbować podpiąć funkcję do tick tocka , ale na pewno będzie to kolejne obciążenie dla silnika.


najlepszym wyjściem jest edycja zs_reacttodmagae przy uzyciu aivarów, tylko nie wiem , tóry odnosi się do uderzeń lub magii.

rozumiem , że dla trafień z dystansu będzie AIV_LASTHITBYRANGEDWEAPON
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
cały problem w tym , że funkcja jest wywoływana kiedy hero bije, a nie jest bity.
Miałeś wyszukać w skryptach perc_assessdamage żeby sprawdzić jakie funkcje są do niego podpięte. Zrobiłeś to? Zgaduję że nie.
W ostateczności jeśli żadna nie jest możesz przypiąć do niego własną, za pomocą funkcji Npc_PercEnable.

oczywiście mozna spróbować podpiąć funkcję do tick tocka , ale na pewno będzie to kolejne obciążenie dla silnika.
Po co, skoro perc_assessdamage jest dokładnie tym czego potrzebujesz? :|

najlepszym wyjściem jest edycja zs_reacttodmagae przy uzyciu aivarów
W ogóle tego zdania nie rozumiem. ZS_ReactToDmagae to funkcja. Aivary to pola w klasie c_npc. Jak chcesz nimi "edytować" funkcję? Proponuję użyć raczej Notatnika.

tylko nie wiem , tóry odnosi się do uderzeń lub magii.
Tego zdania też nie rozumiem. Co masz na myśli?


0 użytkowników i 2 gości przegląda ten wątek.
0 użytkowników
Do góry