modyfikacja cen zakupu/sprzedaży u handlarzy 9113 36

O temacie

Autor pawbuj

Zaczęty 15.01.2018 roku

Wyświetleń 9113

Odpowiedzi 36

Siemekk

Siemekk

Złote Wrota
Untersturmfuhrer
posty2143
Propsy1151
ProfesjaProgramista
  • Złote Wrota
  • Untersturmfuhrer
Powiedz na spokojnie co chcesz zrobić - zmiana ceny przedmiotu czy blokowanie sprzedaży?  Oraz jaka platforma G1 czy G2?
 

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

pawbuj

pawbuj

Użytkownicy
posty1622
Propsy135
ProfesjaSkrypter
  • Użytkownicy
Powiedz na spokojnie co chcesz zrobić - zmiana ceny przedmiotu czy blokowanie sprzedaży?  Oraz jaka platforma G1 czy G2?
chcę zrobić zmiany cen przedmiotów, ale nie wszystkich.  chodzi o g1, ale tym się nie zajmujesz. do tego handel jest tropchę inny niź w g2.
 

Siemekk

Siemekk

Złote Wrota
Untersturmfuhrer
posty2143
Propsy1151
ProfesjaProgramista
  • Złote Wrota
  • Untersturmfuhrer
Spróbuj tego:
//Funkcja OrcWarrior
func void Trade_ChangeSellMultiplier(var int mul)
{
var int ptr;
ptr = MEMINT_oCInformationManager_Address;
ptr = MEM_ReadInt(ptr+24); //oCInformationManager.dlgTrade
ptr = MEM_ReadInt(ptr+260); //dlgTrade.oCViewDialogItemContainer

var c_npc sprzedawca; sprzedawca = _^(ptr + 260); //oCViewDialogItemContainer.m_pLeftNpc
var c_npc gracz; gracz = _^(ptr + 264); //oCViewDialogItemContainer.m_pRightNpc
var c_item przedmiot;
CALL__thiscall(ptr + 256, 0x007092C0); //Trzeba znaleźć adres pod G1 (Nie mam IDA)
przedmiot  = _^(CALL_RetValAsPtr());

//Warunki etc...
MEM_WriteInt(ptr+268, mul); //oCViewDialogItemContainer.Multiplier = mul
};
Offsetów do zmiany wartości mnożnika kupna nie mogłem znaleźć.
 

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

pawbuj

pawbuj

Użytkownicy
posty1622
Propsy135
ProfesjaSkrypter
  • Użytkownicy
to nie trzeba przerobić na system dziesiątkowy?

CALL__thiscall(ptr + 256, 0x007092C0); //Trzeba znaleźć adres pod G1 (Nie mam IDA)
Posukam w skryptach może mam adres do kupna (podaj mi jego nazwę).
 

Siemekk

Siemekk

Złote Wrota
Untersturmfuhrer
posty2143
Propsy1151
ProfesjaProgramista
  • Złote Wrota
  • Untersturmfuhrer
oCItem* oCItemContainer::GetSelectedItem() i tak trzeba przerobić na system dziesiętny.
Użyj print'a do testów (Print(przedmiot.name); ). A jeżeli nie zadziała _^ to użyj MEM_AssignContentInst(przedmiot, CALL_RetValAsPtr());
 

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

pawbuj

pawbuj

Użytkownicy
posty1622
Propsy135
ProfesjaSkrypter
  • Użytkownicy
oCItem* oCItemContainer::GetSelectedItem() i tak trzeba przerobić na system dziesiętny.
przerobienie to nie problem, rozumiem, że ten adres w opcji sprzedaży też jest zły.
CALL__thiscall(ptr + 256, 0x007092C0); //Trzeba znaleźć adres pod G1 (Nie mam IDA)
 

Siemekk

Siemekk

Złote Wrota
Untersturmfuhrer
posty2143
Propsy1151
ProfesjaProgramista
  • Złote Wrota
  • Untersturmfuhrer
Pointer jest dobry, adres jest z gothic 2.
 

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

Cruc

Cruc

Użytkownicy
posty662
Propsy232
Profesjabrak
  • Użytkownicy
var int ptr;
ptr = MEMINT_oCInformationManager_Address;
ptr = MEM_ReadInt(ptr+24); //oCInformationManager.dlgTrade
ptr = MEM_ReadInt(ptr+260); //dlgTrade.oCViewDialogItemContainer

var c_npc sprzedawca; sprzedawca = _^(ptr + 260); //oCViewDialogItemContainer.m_pLeftNpc
var c_npc gracz; gracz = _^(ptr + 264); //oCViewDialogItemContainer.m_pRightNpc
};

Może zadam trochę głupie pytania, ale właśnie ściągnąłem Ikarusa i rozeznaję się w nim powoli, zatem...
1. Skąd wiesz jak wyznaczać kolejne adresy jako parametr funkcji MEM_ReadInt?
2. Funkcja _^ zwraca instancję dla podanego wskaźnika?
 
while (!success) try{...}

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

pawbuj

pawbuj

Użytkownicy
posty1622
Propsy135
ProfesjaSkrypter
  • Użytkownicy
@Siemekk, sprawdzę Idą ten adres . Jak znajdzę i będzie działać to napiszę.

alternatywnie i 100% bez bugów i bezstresowo mozna to zrobić jak v Velayi (podmieniamy itemy).

druga metoda to przypisać nową wartość value do itemu (próbowałem metodą istance itemu.value ale to nie działa).

Przejrzałem skrypty CZ i jest tam taki mess z tym changesellmultipier, że sie tego nie podejmę. do tego skrypt Orca z drugiej strony tematu o Ikarusie powoduje, że wszytskie itemy w sprzedaży przez Beziego sa po 0.
 

Siemekk

Siemekk

Złote Wrota
Untersturmfuhrer
posty2143
Propsy1151
ProfesjaProgramista
  • Złote Wrota
  • Untersturmfuhrer
func void SetItemValue(var int inst, var int value)
{
var int ptr; ptr = _@(inst);
MEM_WriteInt(ptr + 320, value);
};
Może to pomoże.
SetItemValue(ItAr_Pal_H, 100);
 

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

pawbuj

pawbuj

Użytkownicy
posty1622
Propsy135
ProfesjaSkrypter
  • Użytkownicy
func void SetItemValue(var int inst, var int value)
{
var int ptr; ptr = _@(inst);
MEM_WriteInt(ptr + 320, value);
};
Może to pomoże.
SetItemValue(ItAr_Pal_H, 100);
niestety nie działa.
tak się zmienia kolor itemu w ekwipunku i bez adresu hooka się nie obędzie. Zainstalowałem
IDę (jakaś waersja free), ale ni w ząb tego nie kumam.

func void ColorItemName() {
var zCViewText txt; txt = _^(EAX);
var int col; col = -1;
var C_Item itm; itm = _^(MEM_ReadInt(ESP+324+4));




txt.color = col;
txt.colored = 1;
};

// Zum initialisieren einmalig pro Session folgendes aufrufen:

HookEngineF(7369071/*0x70716F*/, 6, ColorItemName);

 

pawbuj

pawbuj

Użytkownicy
posty1622
Propsy135
ProfesjaSkrypter
  • Użytkownicy
skoro już wywołaem tą gównoburzę to ją dokończę. Do każdego dialogu z handlem potrzeba dodać


Trade_EraseValue(); //BUGFIX has to be in every trade dialog
//Trade_ALL_Mul = 1065353216;//1
    Trade_ChangeSellMultiplier(1065353216);

func string Trade_GetHeroCatString()
{ var int ptr;
ptr = MEMINT_oCInformationManager_Address;
ptr = MEM_ReadInt(ptr+24);//oCInformationManager.ocViewDialogTrade
if(ptr)
{
  ptr = MEM_ReadInt(ptr+264); //oCViewDialogItemInventory
  if(ptr)
  {
  ptr = MEM_ReadInt(ptr+256); //oCItemContainer
  if(ptr)
  {
  ptr = MEM_ReadInt(ptr+48); //zCView - Titel
  if(ptr)
  {
  return MEM_ReadString(ptr+200);//text
};
};
};
};

return "";//blank

};

cała funkcja (pochodzi z CZ) i można edytować trade_value_multipier po kategorii itemu . Nie wiem już tylko zrobić dla pojedynczych instancji itemów.

 

Siemekk

Siemekk

Złote Wrota
Untersturmfuhrer
posty2143
Propsy1151
ProfesjaProgramista
  • Złote Wrota
  • Untersturmfuhrer

Siemekk
Złote Wrota

modyfikacja cen zakupu/sprzedaży u handlarzy
#32 2018-01-18, 19:40(Ostatnia zmiana: 2018-01-18, 20:40)
Skrypty z Czasu Zapłaty to jeden wielki bug... Nie pakuj się w nie (recepty kosztują po 500k złota). Znajdź pointer do obecnego przedmiotu a sprawa sama się rozwiąże.

Post połączony: 2018-01-18, 20:38
Albo spróbuj tego:
func void Trade_UpdateValue() //Wywołać w ZS_TALK_LOOP?
{
var int ptr;
ptr = MEM_ReadInt(MEMINT_oCInformationManager_Address + 24);//oCInformationManager.ocViewDialogTrade

if(ptr)
{
  ptr = MEM_ReadInt(ptr + 264); //oCViewDialogItemInventory
  if(ptr)
  {
  ptr = MEM_ReadInt(ptr+256); //oCItemContainer
  if(ptr)
  {
var c_item it;
CALL_thiscall(ptr, oCItemContainer::GetSelectedItem() /*Adres musisz znaleźć sam*/);
MEM_AssignInst(it, CALL_RetValAsPtr());
if(_@(it))
{
Print(it.name);
//Czego dusza zapragnie
};

};
};
};
};
Tylko znajdź adres.
 

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

pawbuj

pawbuj

Użytkownicy
posty1622
Propsy135
ProfesjaSkrypter
  • Użytkownicy
dzięki Siemekk, wiem że chcesz pomóc! jakbym ogarniał Idę to bym może i znalażł. OK, popytam parę osób, może mi pomogą znależć.
 

Neck

Neck

Użytkownicy
posty82
Propsy7
Profesjabrak
  • Użytkownicy
Hej, napiszę tutaj aby nie zakładać nowego tematu :) Mógłby ktoś napisać jak zablokować sprzedaż konkretnego przedmiotu podczas handlu?
 

Gother

Gother

Użytkownicy
Nieskromny Mistrz Gothica
posty447
Propsy255
ProfesjaScenarzysta
  • Użytkownicy
  • Nieskromny Mistrz Gothica
Jest wiele opcji. Pierwsza, która przyszła mi na myśl to sytuacja gdy kupujesz przedmiot, a po zakończeniu transakcji kupiec ci go odbiera, bo ma warunek: gdy postać gracza ma w ekwipunku przedmiot X to kupiec Y rozpoczyna dialog -"Hej, to nie na sprzedaż. Oddawaj."
 

frN

frN

Użytkownicy
posty50
Propsy24
ProfesjaGracz
  • Użytkownicy
Najlepsza opcja to zrobić to w formie pluginu pod Uniona

Np. coś takiego:
https://www.youtube.com/watch?v=lZFEhqCchOU
 


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