Union - użycie przedmiotu po wciśnieciu klawisza 2165 4

O temacie

Autor frN

Zaczęty 16.04.2021 roku

Wyświetleń 2165

Odpowiedzi 4

frN

frN

Użytkownicy
posty48
Propsy24
ProfesjaGracz
  • Użytkownicy
Hej,

Czy znajdzie się tu jakaś miła duszyczka, obeznana z Unionem, która byłaby w stanie podpowiedzieć mi jak mogę wywołać użycie jakiegoś przedmiotu z ekwipunku (np. mikstury, mapy lub czegokolwiek innego) po wciśnięciu wcześniej ustalonego klawisza?

Samo wychwycenie wciśnięcia klawisza to najmniejszy problem, chodzi mi głównie o samą funkcję odpowiedzialną za użycie przedmiotu.
Próbowałem z player->UseItem(), ale nic się nie działo.

Przykład kodu, który miałem nadzieję, że zadziała:
int index = parser->GetIndex( "ITPO_HEALTH_01" );

oCItem * item = player->IsInInv( index, 1 );

player->UseItem( item );

Próbowałem podpatrzeć w istniejących już pluginach, ale nie mogę nic znaleźć konkretnego.
 

bogu9821

bogu9821

Użytkownicy
posty404
Propsy185
ProfesjaProgramista
  • Użytkownicy
Do takich rzeczy używane są pochodne klasy oCNpcMessage, które są zarządzane przez eventmanager i w większości przypadków są kolejkowane, aby rzeczy które robi npc się nie zapętlały lub nie były użyte w złym momencie(np. przed nie załadowaniem w 100% gry). Samo użycie itemu wygląda tak, ale musisz jeszcze wykombinować w jaki sposób zatrzymać gracza (bo warto pogłówkować, a nie używać tylko gotowca), też za pomocą obiektu pochodnego oCNpcMessage, bo inaczej jak będziesz w ruchu to gracza zeświruje i ci będzie szła do przodu, a nie używała itemek.
Polecam także sprawdzić czy player->fmode > NPC_WEAPON_NONE, i wtedy też za pomocą jeszcze innej pochodnej oCNpcMessage schować broń, jak popatrzysz w oNpcMessages.h to powinieneś móc coś pokombinować.

int index = parser->GetIndex("ITPO_HEALTH_01");
//nie ma takiego itemu w skryptach?
if (index < 0) return;

oCItem* item = player->IsInInv(index, 1);
if (item != nullptr) //trzeba sprawdzić czy taki item mamy faktycznie w eq, jak nie znajdzie go w eq to wtedy item to nullptr
{

oCMsgManipulate* msg = nullptr; //tworzymy pusty wskaźnik do klasy oCMsgManipulate, która wykonuje różne działania na obiektach przez gracza, bo musimy określić rodzaj użycia itemu, zanim zaalokujemy pamięć.
//sprawdzamy typ itemu i używamy odpowiedniego konstruktora do użycia itemu
if (item->scemeName.Length()) //jezeli item ma animację użycia jak np. mikstury, mapa itd.
{
//alokujemy pamięć, pierwszy argument mówi co ta klasa ma zrobić z tym itemem, w tym przypadku użyć to jakiegoś stanu,
//drugi to item, a trzeci mówi do jakiego stanu itemu mamy go użyć, w tym przypadku to następnego,
//można to łatwo zobaczyć np. na lutni, która gra dopiero, jak naciśniemy przycisk w i zmienimy jej stan.
msg = new oCMsgManipulate (oCMsgManipulate::EV_USEITEMTOSTATE, item, player->interactItemCurrentState + 1);

}
else //jeżeli item to np. pochodnia lub broń
{
//to equpujemy item
msg = new oCMsgManipulate(oCMsgManipulate::EV_EQUIPITEM, item);
}


///teraz oddajemy kontrolę nad użyciem itemów eventmanagerowi, który zarządza tymi "wiadomościami" i dzięki temu np. używanie itemów odbywa się jeden po drugim, a nie 2 na raz.
player->GetEM()->OnMessage(msg,player);
}
 
while(false) Do();

frN

frN

Użytkownicy
posty48
Propsy24
ProfesjaGracz
  • Użytkownicy
Ooo dzięki wielkie, w wolnej chwili pokombinuję.
Wiesz może, czy istnieje lub powstanie jakaś dokumentacja od tego? Czasami ciężko się połapać jakie argumenty przyjmuje poszczególna funkcja, bo to, że np. przyjmuje dwa inty zbyt wiele nie mówi.
 

bogu9821

bogu9821

Użytkownicy
posty404
Propsy185
ProfesjaProgramista
  • Użytkownicy
Niby powstaje, ale kiedy wyjdzie to nie wiadomo. Rosjanie robią powoli, a czy ktoś inny zrobi szybciej to nie wiadomo.
Trzeba kombinować i warto używać IDA do zaglądania wgłąb silnika, ale do tego trzeba mieć już jakąś wiedzę i poświęcić trochę czasu na analizę tego wszystkiego.
Też można tutaj pytać, ale niestety tylko parę osób to ogarnia.
 
while(false) Do();

frN

frN

Użytkownicy
posty48
Propsy24
ProfesjaGracz
  • Użytkownicy
Takie zaglądanie wgłąb silnika to raczej nie dla mnie, bo nie mam o tym zielonego pojęcia niestety. Pozostaje czekać aż Rosjanie zrobią dokumentację i mieć nadzieję, że będzie łatwiej wtedy. :D

W każdym razie jeszcze raz dzięki za nakierowanie mnie, zrobiłem co chciałem zrobić i nawet działa. :>
 


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