modyfikacja cen zakupu/sprzedaży u handlarzy 15542 36

O temacie

Autor pawbuj

Zaczęty 15.01.2018 roku

Wyświetleń 15542

Odpowiedzi 36

pawbuj

pawbuj

Użytkownicy
posty1623
Propsy135
ProfesjaSkrypter
  • Użytkownicy
witam,

chciałem się dowiedzieć nieco więcej o modyfikacji cen zakupu/sprzedaży. niby trade_multipier to definiuje.

Tylko jak zrobić , aby wybrany handlarz miał nizsze ceny dla określonej grupy asortmentowej.
 

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
Przecież to było wałkowane już na tym forum. Chyba nawet dwa razy. To siedzi w silniku, na WoG też jest o tym temat. Były próby zmiany tego.
 
: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.

pawbuj

pawbuj

Użytkownicy
posty1623
Propsy135
ProfesjaSkrypter
  • Użytkownicy
Przecież to było wałkowane już na tym forum. Chyba nawet dwa razy. To siedzi w silniku, na WoG też jest o tym temat. Były próby zmiany tego.
o to ci chodzi? to wiem.
https://themodders.org/index.php?topic=10383.20

tylko nie ma tu jak podzielic to na grupy asortmentowe. ale ok, w Velayi było cos na podobę.
 

TheKetrab

TheKetrab

Użytkownicy
posty334
Propsy217
ProfesjaProducent
  • Użytkownicy
Przyjrzyj się skryptom Velayi. Kiedyś szperalem tam w skryptach. Są potężne funkcje definiujace cenę każdego przedmiotu z osobna po rozwiazaniu zadania "nizsze ceny". Coś w ten deseń.
 

pawbuj

pawbuj

Użytkownicy
posty1623
Propsy135
ProfesjaSkrypter
  • Użytkownicy
Przyjrzyj się skryptom Velayi. Kiedyś szperalem tam w skryptach. Są potężne funkcje definiujace cenę każdego przedmiotu z osobna po rozwiazaniu zadania "nizsze ceny". Coś w ten deseń.
pamietam, ale nie wiedziałem gdzie dokładnie. super dzięki.
 

Cruc

Cruc

Użytkownicy
posty666
Propsy235
Profesjabrak
  • Użytkownicy
A jakby w momencie rozpoczynania się dialogu (np. w B_GiveTradeInv) pozyskiwać listę wybranych itemów i w zależności od NPC'a, z którym handlujemy, zmieniać wartość przedmiotów z listy na interesującą nas wartość w przypadku konkretnego handlarza, lub defaultową, gdy jest to ktoś inny?
 
while (!success) try{...}

Najlepszy modder od gothic multiplayer - polecam pytać go o wszystko!

Zucklov

Zucklov

Quest Pack Team
Sztywniutko
posty1220
Propsy1241
ProfesjaSkrypter
  • Quest Pack Team
  • Sztywniutko
Wartość przedmiotu to stała, nie zmienna. Nie da się nią operować.
 
Lieb Vaterland magst ruhig sein

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator
Właściwie to w Dedalusie da się zmieniać stałe, musisz tylko "odświeżać" je po każdym wczytaniu gry (w przeciwieństwie do zmiennych, ich nowe wartości nie trafiają do pliku zapisu gry, który jest "oszczędnie" zserializowanym stanem maszyny wirtualnej Daedalusa).

Cruc

Cruc

Użytkownicy
posty666
Propsy235
Profesjabrak
  • Użytkownicy
Emm... Pole value nie jest stałą.
 
while (!success) try{...}

Najlepszy modder od gothic multiplayer - polecam pytać go o wszystko!

pawbuj

pawbuj

Użytkownicy
posty1623
Propsy135
ProfesjaSkrypter
  • Użytkownicy
w Velayi zrobione jest tak, że towary w ekwipunku handlarza są podmieniane, dlatego są tańsze.

czyli mamy 2 itemy o takim samym visualu, ale o różnej wartości i innej instancji.

trochę prymitywne.

ale edycja wartości poszcz. itemów jest bez sensu, to będzie bugować się.

potrzebuję warunku, że jeżeli item znajduje w kolumnie do handlowania to....
z resztą skryptu sobie poradzę.
 

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1153
ProfesjaProgramista
  • Złote Wrota
Zamiast kombinować najlepiej to zrobić samemu. Funkcja zmiany ceny jest gotowa. Wystarczy sprawdzić kategorię przedmiotu i namierzonego npc. Wszystko czego potrzebujesz jest w klasie oCNpc wystarczy znać angielski.
 

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

pawbuj

pawbuj

Użytkownicy
posty1623
Propsy135
ProfesjaSkrypter
  • Użytkownicy
kod (do g2nk - autor Frank-95), który wyklucza pewne itemy, których bezio nie może kupić (na wzór pancerzy z g3), myślę, że można to przerobić na swoje potrzeby. powiedzmy, że jest to proste.

const int oCViewDialogTrade__OnTransferLeft        = 6862912; //0x68B840
const int oCViewDialogTrade__OnTransferRight    = 6863632; //0x68BB10

//in startup
MemoryProtectionOverride(oCViewDialogTrade__OnTransferLeft + 6, 4);
HookEngineF(oCViewDialogTrade__OnTransferLeft, 6, CheckSellingItems);

//wherever
func void CheckSellingItems()
{
    var oCNpc her;    her = Hlp_GetNpc(hero);
    var C_NPC foc;    foc = _^(her.focus_vob);
    var oCItem itm;    itm = _^(Inventory__GetSelectedItem());   
     if    (condition)    //if this condition is met the item will be sold   
    {
        MEM_WriteByte(oCViewDialogTrade__OnTransferLeft + 6, 106);
    }
    else    //else it won't be sold
    {
        MEM_WriteByte(oCViewDialogTrade__OnTransferLeft + 6, 195);
    };
};
 

Splash

Splash

Moderator
posty4209
Propsy3411
ProfesjaNierób
  • Moderator
Nie jest proste, bo handel w G1 całkowicie różni się od tego w G2.
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

pawbuj

pawbuj

Użytkownicy
posty1623
Propsy135
ProfesjaSkrypter
  • Użytkownicy
Nie jest proste, bo handel w G1 całkowicie różni się od tego w G2.
OK, a jest jakiś warunek, który sprawdza, czy npc jest w trakcie "handlu"?
 

Zucklov

Zucklov

Quest Pack Team
Sztywniutko
posty1220
Propsy1241
ProfesjaSkrypter
  • Quest Pack Team
  • Sztywniutko
Emm... Pole value nie jest stałą.
? XD
lol jak nie jest? Value jest definiowane w skrypcie przedmiotu.
Możesz zresztą łatwo to sprawdzić, zmień gdzieś w dialogu wartość przedmiotu, zapisz grę i wczytaj.
 
Lieb Vaterland magst ruhig sein

Cruc

Cruc

Użytkownicy
posty666
Propsy235
Profesjabrak
  • Użytkownicy
Wystarczy mi spojrzeć na deklarację klasy.

oCItemContainer*m_pChest;
int value; // Wert des Items

Może rzeczywiście informacje o poszczególnych polach wszystkich obiektów nie są zapisywane, co zresztą nie powinno dziwić, dlatego gra przy nowej sesji ponownie "wyciąga" te informacje ze skryptu. Podobnie zresztą ma się sprawa z NPC'ami. Możesz zmienić mu tekstury, ale po zapisie i wczytaniu będzie wyglądał w taki sposób, w jaki zdefiniowane to jest w skrypcie. Ale to już jest kwestia tego w jaki sposób zaprojektowany jest silnik, a nie tego czy encja jest stałą czy zmienną. W każdym razie nie zmienia to faktu, że value jest zmienną.

Edit:
Cytuj
OK, a jest jakiś warunek, który sprawdza, czy npc jest w trakcie "handlu"?

Chyba nie ma. Nawet w G2 B_GiveTradeInv wywoływane jest ręcznie w skrypcie dialogu poprzedzającym handel. Zawsze możesz spróbować pobawić się z funkcją B_AssessTalk. Wywołuje się ona wtedy, gdy chce się rozpocząć rozmowę z danym NPC.

Znalazłem jeszcze funkcję silnika Npc_HasOffered (VAR C_NPC self, VAR C_NPC other, VAR INT itemInstance), która ma ponoć zwracać true, jeśli zaoferuje się w handlu podany item, ale chyba nawet nie jest wykorzystywana.
 
while (!success) try{...}

Najlepszy modder od gothic multiplayer - polecam pytać go o wszystko!

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1153
ProfesjaProgramista
  • Złote Wrota
@Cruc te informacje są czytane od zera (z Instancji) ponieważ archiwier dla klas oCNpc i oCItem nie działa w 100% tak jak powinien.

Post połączony: 2018-01-16, 00:22
 

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

pawbuj

pawbuj

Użytkownicy
posty1623
Propsy135
ProfesjaSkrypter
  • Użytkownicy
najlepszy sposób będzie następujący. i proszę mi nie wmawiać , że było to wałkowane na wogu czy tutaj.

1)inicjujemy skrypt jn w dialogu handlarza (zmieniamy ceny tylko na czas handlu)
2)po zakończeniu wracamy do "starych cen".

ten skrypt jest nieprzerobiony (autor Sektenspinner i po moich modyfikacjach) i powinno sie obyć bez ikariusa.
Bardzo łatwo można go przerobić, aby zamiast usuwania/przenoszenia itemów zmieniał ich wartości (value czy changed_value) po instancji czy nawet kategorii.

var c_Item armor;var c_Item meleeweapon;var c_Item rangedweapon;
func void Npc_ClearInventoryLoop (var c_npc npc, var int category)
{
    //PrintScreen (ConcatStrings("Czyszczenie eq: ", npc.name), yposition,yaposition,"FONT_OLD_10_WHITE.TGA",timep); //dla testu
// print(ConcatStrings("Czyszczenie eq: ", npc.name);
        var int amount;
        amount = Npc_GetInvItemBySlot (npc, category, 0);
        armor = Npc_GetEquippedArmor(npc);
        meleeweapon = Npc_GetEquippedMeleeWeapon(npc);
        rangedweapon = Npc_GetEquippedRangedWeapon(npc);
        // print(ConcatStrings(item.name, IntToString(amount));

       
        if ((amount>0)
        && Hlp_GetInstanceID(item) != Hlp_GetInstanceID(armor)
        && Hlp_GetInstanceID(item) != Hlp_GetInstanceID( meleeweapon)
        && Hlp_GetInstanceID(item) != Hlp_GetInstanceID(rangedweapon))
       
        {
                NPC_RemoveInvItems (npc, Hlp_GetInstanceID (item), amount);
               
                Npc_ClearInventoryLoop(npc, category);
        }
        else if (category < INV_CAT_MAX-1)
        {
                //print(ConcatStrings("Zmiana kategorii na: ", IntToString(category+1));
                Npc_ClearInventoryLoop(npc, category+1);
        };
};


func void Npc_ClearInventory (var c_npc npc)
{

Npc_ClearInventoryLoop(npc, 0);
};
 

Cruc

Cruc

Użytkownicy
posty666
Propsy235
Profesjabrak
  • Użytkownicy
W jaki sposób będziesz wykrywał zakończenie handlu?
 
while (!success) try{...}

Najlepszy modder od gothic multiplayer - polecam pytać go o wszystko!

pawbuj

pawbuj

Użytkownicy
posty1623
Propsy135
ProfesjaSkrypter
  • Użytkownicy
mam problem z modyfikacja samych cen w trakcie gry.tu się na pewno bez iakrusa nie obejdzie.

 przykład dla g2nk przy sprzedaży (moze komus sie przyda)
func void onTradeLeft() {
value = MEM_ReadInt(ESP+20); // itm.value * multiplier
MEM_WriteInt(ESP+20, 123); // set new value
var oCItem itm; itm = _^(EBX); //Get the item
var oCNpc npc; npc = _^(MEM_InformationMan.npc); // Get the NPC
};

const int oCViewDialogTrade__OnTransferLeftX = 6863312; //0x68B9D0
HookEngineF(oCViewDialogTrade__OnTransferLeftX, 6, onTradeLeft);

 


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