Zmiana parametrów przedmiotu w trakcie gry 3847 21

O temacie

Autor BlackSwordsman

Zaczęty 1.01.2017 roku

Wyświetleń 3847

Odpowiedzi 21

BlackSwordsman

BlackSwordsman

Użytkownicy
posty22
Propsy2
Profesjabrak
  • Użytkownicy

Mam problem mianowicie chciałem zastosować w swoim modzie zmienny kosztu mana przy runach/zwojach, ale nie działa tak jak trzeba. Chodzi o to że jeżeli chodzi o realny koszt to wszystko jest ok(podczas rzucania czaru), ale nie wyświetlają się prawidłowa wartość w eq. Działa tak że wyświetla się wartość z początku gry, bez uwzględnienia zmiennej.
INSTANCE ItArScrollLight (C_Item)
{
name = NAME_Spruchrolle;

mainflag = ITEM_KAT_RUNE;
flags = ITEM_MULTI;

value = 5;

visual = "ItAr_Scroll_32.3DS";
material = MAT_STONE;

spell_parm ();

spell = SPL_LIGHT;
cond_atr[2]    = ATR_MANA_MAX;
cond_value[2]  = SPL_SENDCAST_LIGHT;

description = "Światło";
//TEXT [0] = NAME_Mag_Circle; COUNT [0] = mag_circle;
TEXT [1] = NAME_Manakosten; COUNT [1] = SPL_SENDCAST_LIGHT;
//TEXT [2] = ""; COUNT [2] = ;
//TEXT [3] = ""; COUNT [3] = ;
//TEXT [4] = ""; COUNT [4] = ;
TEXT [5] = NAME_Value; COUNT [5] = value;
};
func void spell_parm ()
{
SPL_SENDCAST_LIGHT=10*100/((Npc_GetTalentValue(hero, NPC_TALENT_MAGE)/2)+100);

};

Mam nadzeje że rozumie cie o co chodzi?
I pytanie brzmi czy jest jakiś sposób by zmieniać parametry przedmiotu w trakcie gry?
Podkreślam, technicznie wszystko działa ok chodzi tylko o wartość w eq.
 

Mark56

Mark56

Moderator
som veľký magič
posty1632
Propsy1846
ProfesjaAnimator
  • Moderator
  • som veľký magič
ikarusem, albo tradycyjnie, dodaj on_equip i on_unequip, który zrobi przeliczenie tej wartości .
spell_parm ();
COUNT [1] = SPL_SENDCAST_LIGHT;

Wiesz ze twój zmienny koszt many jest prawdopodobnie taki sam dla wszystkich npc ?
 


BlackSwordsman

BlackSwordsman

Użytkownicy
posty22
Propsy2
Profesjabrak
  • Użytkownicy
Nie działa niestety przy on_equip/on_unequip. Jeżeli chodzi o npc to wiem na pewno, że koszt będzie zmienny także dla nich, ale to nie będzie problemem. Wiesz może w jaki sposób to zrobić za pomocą ikarusa? Ogarniasz go?

Może wystarczy wrzucić spell_parm (); do funkcji gdzie otwiera się eq? Tylko która to?
 

BlackSwordsman

BlackSwordsman

Użytkownicy
posty22
Propsy2
Profesjabrak
  • Użytkownicy
Ma jakaś mądra głowa pomysł na to? Jak to zrobić? Może wystarczy tylko w odpowiednie miejsce wrzucić spell_parm ();!
 

Siemekk

Siemekk

Złote Wrota
Untersturmfuhrer
posty2143
Propsy1151
ProfesjaProgramista
  • Złote Wrota
  • Untersturmfuhrer
Zmień stałe które określają koszt many na zmienne. Jeśli jesteś bystry to z resztą sobie poradzisz sam ;)
 

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

BlackSwordsman

BlackSwordsman

Użytkownicy
posty22
Propsy2
Profesjabrak
  • Użytkownicy
Jeżeli jesteś bystry to zauważyłeś że już to zrobiłem i przy rzucaniu czarów działa jak trzeba. Problem jest tylko z wyświetlaniem tej zmiennej przy parametrach przedmiotu. Wyświetla pierwszą zmienną wrzuconą do
Cytuj
STARTUP_WORLD ()
i się nie zmienia. Już wiesz o co chodzi mistrzu? Na tym polega mój problem.
 

K4R0L111

K4R0L111

Użytkownicy
posty31
Propsy14
ProfesjaSkrypter
  • Zbanowany
No to musisz zrobić coś takiego.
var C_Item przedmiot; //Tworzysz zmienną
przedmiot = xxx; //Tu musisz przypisać przedmiot do zmiennej
przedmiot.text[2] = 10; //Tu ustawiasz wyświetlaną wartość. :)

Co do tej funkcji to znalazłem taką ale ona CHYBA zwraca instance czaru a nie przedmiotu.
func int      Npc_GetActiveSpell                 (var instance n0)                               

Poszukaj w externals.d to może znajdziesz funkcję która zwraca instance przedmiotu.
Jeśli nie to wystarczy kilka if'ów i da radę zrobić.

BlackSwordsman

BlackSwordsman

Użytkownicy
posty22
Propsy2
Profesjabrak
  • Użytkownicy
Wiem o co chodzi, ale przy:
var C_Item slight;

slight = Hlp_IsItem (item, ItArScrollLight);
slight.text[2] = MANACOST_LIGHT;
wyskakuje błąd i wywala do pulpitu.
 

K4R0L111

K4R0L111

Użytkownicy
posty31
Propsy14
ProfesjaSkrypter
  • Zbanowany
slight.text[2] to string a ty przypisujesz zmienną która jest int'em.
Użyj slight.count[2] :)

Ja wyżej podałem tylko przykład :)

Splash

Splash

Moderator
posty4207
Propsy3403
ProfesjaNierób
  • Moderator
A funkcja Hlp_IsItem zwraca 1 lub 0 w zależności od podanej instancji.
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

BlackSwordsman

BlackSwordsman

Użytkownicy
posty22
Propsy2
Profesjabrak
  • Użytkownicy
To której funkcji użyć? Nie da rady aktywnego czaru bo wtedy zmieni się tylko jeden czar i to tylko jak będzie aktywny, a ja potrzebuje żeby w jednej chwili zmieniać parametry wszystkich run/zwojów nawet tych nieużywanych. Nawet takich których nie ma jeszcze w eq. Chce żeby wszystko aktualizowało się razem ze zmienną.


Może lepiej wrzucić gdzieś spell_parm (); na przykład do funkcji gdzie się otwiera eq tabem?
Jak coś mam ikarusa i lego.
 

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
Przedmiot w ekwipunku i więcej niż 1 przedmiot:
Npc_GetInvItem(hero, ItemInstance);
item.text[Number] = "twój tekst";
item.count[number] = Variable;


Opcja druga: Przedmiot jeden na całą grę:
var C_Item itm; itm = Hlp_GetInstanceID(itemInstance);//w sumie, nawet bez tego da radę
itm.text[Number] = "twój tekst";
item.count[Number] = Variable;

Fakt. Splash ma rację. Opcja nr. 1 albo nr. 2 bez Hlp_GetInstanceID.
 
:ok: zachęca do dalszej pomocy. Nie zapominaj o tym!

Prywatne wiadomości typu "Ej, pomocy" kasuję od razu. Od tego jest forum, a nie PW.

To me, defeat in anything is merely temporary, and its punishment is but an urge for me to greater effort to achieve my goal. Defeat simply tells me that something is wrong in my doing; it is a path leading to success and truth.

In order to realize our true self we must be willing to live without being dependent upon the opinion of others.

Splash

Splash

Moderator
posty4207
Propsy3403
ProfesjaNierób
  • Moderator
Opcja druga jest zła, bo funkcja Hłp_GetInstanceID zwraca instancję w formie inta.
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

Siemekk

Siemekk

Złote Wrota
Untersturmfuhrer
posty2143
Propsy1151
ProfesjaProgramista
  • Złote Wrota
  • Untersturmfuhrer
Jeżeli znasz się na Ikarusie to można to zrobić w np. taki sposób:
//v1
var c_item it; it = _^(_@(itru_massdeath)); //Nie jestem pewny, nigdy czegoś takiego nie używałem
it.count[1] = 12;
//v2
var int ptr; ptr = MEM_InstGetOffset(runa);
MEM_WriteInt(ptr+ rozmiar obiektu, wartość);
 

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

BlackSwordsman

BlackSwordsman

Użytkownicy
posty22
Propsy2
Profesjabrak
  • Użytkownicy
Bogdan Zwei
1. To co napisałeś dodaje tylko kolejny przedmiot do eq.
2. Już próbowałem nie działa.

Siemekk
1. Gra odpala, ale po wybraniu nowej gry wywala access violation.
2. Co wpisać w "rozmiar obiektu, watość"?

var int slight; slight = MEM_InstGetOffset(ItArScrollLight);
MEM_WriteInt(slight+ COUNT[2], MANACOST_LIGHT);
???

Generalnie chodzi o to że mają się zmieniać parametry wszystkich przedmiotów run/zwojów. Np. wszystkie kule ognia runy/zwoje mają mieć takie same parametry. Wszystko zależy od zmiennych z funkcji spell_parm (); wszędzie gdzie potrzeba dałem odniesienia i techniczne wszystko działa ok(podczas rzucania czaru odejmuje odpowiednią ilość mana oraz zadaje obrażeń tyle ile powinno), ale parametry przedmiotu się nie zmieniają i wyświetla się tylko pierwsza wartość tak jakby postać się wogóle nie rozwijała. Nie jestem fachowcem, ale może wystarczy tylko spell_parm (); wrzucić w odpowiednie miejsca?
 

Siemekk

Siemekk

Złote Wrota
Untersturmfuhrer
posty2143
Propsy1151
ProfesjaProgramista
  • Złote Wrota
  • Untersturmfuhrer
Pointer, zapisany w postaci int'a. Trzeba go wyliczyć ręcznie. Chyba będzie to:
MEM_WriteInt(slight+ 776], MANACOST_LIGHT);
Co do tego 2. Stwórz funkcję  gdzie podasz instancję runy oraz wartość, a argumentami zastąpisz itru_massdeath i MANACOST_LIGHT.
 

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

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
Bogdan Zwei
1. To co napisałeś dodaje tylko kolejny przedmiot do eq.

Really? REALLY? Po co ja Ci pomagam, skoro ty nawet nie wiesz co ta funkcja robi...  :F
 
:ok: zachęca do dalszej pomocy. Nie zapominaj o tym!

Prywatne wiadomości typu "Ej, pomocy" kasuję od razu. Od tego jest forum, a nie PW.

To me, defeat in anything is merely temporary, and its punishment is but an urge for me to greater effort to achieve my goal. Defeat simply tells me that something is wrong in my doing; it is a path leading to success and truth.

In order to realize our true self we must be willing to live without being dependent upon the opinion of others.

BlackSwordsman

BlackSwordsman

Użytkownicy
posty22
Propsy2
Profesjabrak
  • Użytkownicy
Niestety przy var int slight; slight = MEM_InstGetOffset(ItArScrollLight);
MEM_WriteInt(slight+ 776, MANACOST_LIGHT);
znowu wywala access violation.

2. Widzisz jak by to było takie proste to już bym to zrobił.
var C_Item slight;

slight = Hlp_GetInstanceID (ItArScrollLight);
slight.count[2] = MANACOST_LIGHT;

Zamiast Hlp_GetInstanceID próbowałem już kilkanaście różnych opcji. Męczę się drugi dzień z tym. W końcu gra musi wiedzieć przy slight o który przedmiot chodzi konkretnie podobnie jak:
Hlp_GetNpc(JakisNPC)Przy NPC.

Bogdan Zwei
No dobra ok, ale skąd gra ma wiedzieć który przedmiot to item. ?
 

Siemekk

Siemekk

Złote Wrota
Untersturmfuhrer
posty2143
Propsy1151
ProfesjaProgramista
  • Złote Wrota
  • Untersturmfuhrer
Bogdan dobrze gada. Ta funkcja jakoś dziwnie działa, ale działa! Wiem to z własnego doświadczenia.
 

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

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
Npc_GetInvItem przypisuje dane itemu do zmiennej "item". Ot i cała filozofia.
 
:ok: zachęca do dalszej pomocy. Nie zapominaj o tym!

Prywatne wiadomości typu "Ej, pomocy" kasuję od razu. Od tego jest forum, a nie PW.

To me, defeat in anything is merely temporary, and its punishment is but an urge for me to greater effort to achieve my goal. Defeat simply tells me that something is wrong in my doing; it is a path leading to success and truth.

In order to realize our true self we must be willing to live without being dependent upon the opinion of others.


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