B_AssessTheft - kogo okradamy? 1479 11

O temacie

Autor TheKetrab

Zaczęty 21.09.2018 roku

Wyświetleń 1479

Odpowiedzi 11

TheKetrab

TheKetrab

Użytkownicy
posty335
Propsy216
ProfesjaProducent
  • Użytkownicy
B_AssessTheft:
self - ten, kto się rzuca
other - ten, kto ukradł
item - item, który ukradł

Problem w tym, że gdy chcę zabrać mięso czy cokolwiek innego z martwego
kretoszczura, ścierwojada, wilka, potwora, to B_AssessTheft się wywołuje
i inni atakują gracza krzycząc: 'złodziej!'. Chciałbym dobrać się do tego NPCa,
który jest okradany, żeby móc popisać jakieś warunki (jeśli nie jest człowiekiem, to coś).

Nie do końca rozumiem sposób wywołania tej funkcji...?
// wird durch Wahrnehmung PERC_ASSESSTHEFT angesprungen
// wir von ÜBERALL her aufgerufen (auch aus ZS_Attack)
// Wenn SC/NSC irgendein Item aufhebt in PERC_DIST_INTERMEDIAT

Czy ktoś wie lub ma pomysł, jak się za to zabrać?
(Jeśli nie podnosimy itemu z ziemi, tylko otwieramy ekwipunek leżącego na ziemi
przeciwnika, to item jest chyba losowy... Raz miałem szczotkę, a raz jakiś łuk.)
 

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
Zmienna "item" zawsze wypełnia się ostatnio zrenderowanym (w jakikolwiek sposób) przedmiotem. Gra może wczytać łuk, mięso, złoto, a za drugim razem złoto, łuk, mięso z tej samej postaci.

Ja bym osobiście unikał używania tej funkcji. Rozpiszę się bardziej wieczorem, teraz nie mam czasu (mam nadzieję, że nie zapomnę).


Edit (22:33): Nie do końca wiem o co Ci chodzi, więc trudno mi stwierdzić co chcesz zrobić. Jeśli chcesz tylko dla ludzi, dodaj warunek "if guild <= Gil_separatorHuman" i będzie tylko dla ludzi. Oczywiście musisz dodać return.
 
: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.

TheKetrab

TheKetrab

Użytkownicy
posty335
Propsy216
ProfesjaProducent
  • Użytkownicy
Zabijam ludzi/zwierzęta. Klikam ctrl, otwiera się ekwipunek. Potwora powinienem móc zrabowac bez problemu... ale wywoluje sie AssessTheft. W tej funkcji sa trzy argumenty. Self - ten kto się rzuca  other - na kogo. Item - item ktory rabuje (jeśli się schylam i biorę go ze świata). Ale ja mam otwarty ekwipunek. Kogo? No właśnie. Nie mam jak dobrać się do tego, czyj ekwipunek jest otwarty przy rabowaniu. I przez to nie mam jak napisac , ze jeśli to zwierzę, to żebynie twierdzili, że kradne.
 

Sawik

Sawik

Moderator działu
Rebel
posty4791
Propsy3193
ProfesjaNierób
  • Moderator działu
  • Rebel
Odpowiedziałeś sobie sam dwukrotnie.
Self - osoba która przedmiot odbiera,
Other - osoba której przedmiot odbierają,
Item - przedmiot który odbirasz.
Chcesz dostać się do gildii postaci której zabierasz przedmiot.
To wszystko są Twoje słowa, korzystaj z własnej wiedzy.
 
Życzę wam seksu analnego po stronie biernej.
Dropbox +500 mb na start
LowPoly
Wykonanie modelu niskopoligonowego to sztuka kompromisu. Nie jest to jedynie uproszczenie modelu wysokopoligonowego, ale głęboka modyfikacja oraz podejmowanie decyzji często zmieniających wygląd pierwotny obiektu, tak by przy najmniejszej ilości trójkątów uzyskać jak najwierniej odwzorowany kształt oryginału. Nie można też zapomnieć o tym iż musi nadal wyglądać przekonywająco i tak balansować by uzyskać efekt optymalny.

Podstawowym założeniem jest, że model nie powinien mieć zbędnych, niewidocznych dla gracza detali włączonych w geometrie. Większość obiektów jakie znajdują się w grze powinna prezentować się najlepiej z odległości około 3-5 metrów. Wszelkie detale, które zanikają, wydają się płaskie lub zlewają się z bryłą modelu należy uznać za zbędne i pozostawić je na normal mapie.

Fakt, iż gracz będzie w stanie podejść bliżej do obiektu i zobaczyć go z mniejszej niż 3m odległości nie powinno stanowić większego problemu, gdyż większą rolę odgrywają wtedy tekstury oraz dodatkowy detal zależny od materiału obiektu. To właśnie kompromis między wydajnością, a szczegółowością otoczenia.

Detal, którego nie widać z 3-5 metrów nie powinnien istnieć w geometrii modelu.
Krawędzie znajdujące się blisko siebie, które zlewają się z większej odległości należy uprościć do wspólnej płaszczyzny

TheKetrab

TheKetrab

Użytkownicy
posty335
Propsy216
ProfesjaProducent
  • Użytkownicy
Troszkę mnie nie rozumiesz. Mówię o sytuacji, w której ktoś leży pobity (npc 'A'). Ja (rabujacy) to other. Dookoła stoją ludzie (npc B,C,D). W momencie gdy kilkam Ctrl na leżącego Npc A, otwiera się ekwipunek Npca A. Wtedy też dla każdego z Npcow BCD, wywołuje się osobno funkcja AssessTheft:
1. B-self, hero-other, item-???
2. C-self, hero-other, item-???
3. D-self, hero-other, item-???

Ja pytam, jak zrobić, że jeśli 'A' jest potworem, to żeby przerwać funkcje AssessTheft (1,2,3 powyzej) albo żeby nawet ta funkcja się w ogóle wtedy nie wywolywala. Jak się dobrać do A w tej sytuacji?
 

Cruc

Cruc

Użytkownicy
posty655
Propsy224
Profesjabrak
  • Użytkownicy
Osobiście nie radzę się bawić funkcją AssestTheft, bo na własnej skórze przekonałem się jak trudnym jest dobranie odpowiednich warunków, żeby to dobrze działało (przypominam, że C_BodyContains nie wykrywa tego czy się skradamy czy poruszamy chodem, bo po co ._.).

Mimo to zauważ, że NPC atakują bohatera, bo nic nie przerywa tej funkcji, która dociera, aż na sam dół, gdzie jest wywołanie B_Attack (self, other, AR_Theft, 0);   

Musisz po prostu stworzyć warunek sprawdzający wcześniej czy other jest zwierzęciem (może poprzez GIL_SEPARATOR_HUM - wszystko co jest większe od tej wartości jest symbolem gildii zwierząt) i wtedy dać po prostu return.
 
while (!success) try{...}

TheKetrab

TheKetrab

Użytkownicy
posty335
Propsy216
ProfesjaProducent
  • Użytkownicy
Niczego nowego się póki co nie dowiedziałem :) mam już różne warunki przerywające funkcje, żeby nie doszło do wywołania ataku.

Ciągle powtarzam:
other, to nie rabowany, tylko RABUJACY
self, to nie rabowany, tylko TEN KOGO TO WKURZYLO (czyli również świadek zbrodni)

A mi ciągle chodzi o rabowanego. Jak do niego dotrzeć? Czy się w ogóle da?

@Siemekk zajmowales się ekwipunkiem kiedyś ? Jak sprawdzić , czy jest otwarty ekwipunek ? Ekwipunek przeciwnika do rabowania.
 

Cruc

Cruc

Użytkownicy
posty655
Propsy224
Profesjabrak
  • Użytkownicy
Rzeczywiście. Pomyliło mi się.

Nie dałoby rady tego sprawdzić przez focus_vob?
 
while (!success) try{...}

Siemekk

Siemekk

Złote Wrota
Cesarz
posty2152
Propsy1138
ProfesjaProgramista
  • Złote Wrota
  • Cesarz
@TheKetrab wymagany jest Ikarus.
var int bIsInventoryOpen;
func void OpenInv ()
{
if(ECX == _@(hero)){
bIsInventoryOpen = true;
};
};

func void CloseInv ()
{
if(ECX == _@(hero)){
bIsInventoryOpen = false;
};
};

HookEngineF (oCNpc__OpenInventory, 6, OpenInv);
HookEngineF (oCNpc__CloseInventory, 6, CloseInv);
 


Dodatkowo - odpłatnie pomagam przy zaawansowanych skryptach (AST, UNION, IKARUS).
Po więcej informacji zapraszam na PW na DISCORD.

bogu9821

bogu9821

Użytkownicy
posty373
Propsy170
ProfesjaSkrypter
  • Użytkownicy
Ja bym zamienił: if(ECX == _@(hero) na const int player = 11216516; /*0x00AB2684* if(ECX == MEM_ReadInt(player)) //11216516 to pointer do hero, MEM_ReadInt() jest szybsze od _@()
 
while(false) do();

TheKetrab

TheKetrab

Użytkownicy
posty335
Propsy216
ProfesjaProducent
  • Użytkownicy
dobry pomysł Cruc!
zaraz popróbuję z tym wszystkim. dzięki chłopaki :)

edit:
Taki sposób z sprawdzaniem ekwipunku działa, ale jest problem.
Gdy otwieram swój ekwipunek, funkcja działa.
Gdy zamykam swój ekwipunek, funkcja działa.
Gdy otwieram cudzy ekwipunek, funkcja działa.
Gdy zamykam cudzy ekwipunek, funkcja NIE DZIAŁA.

Czyli komputer cały czas myśli, że jest otwarty ekwipunek,
czyli wywala pierwszy return i można kraść bez konsekwencji :P

var oCNpc her; her = Hlp_GetNpc(hero);
if(Hlp_Is_oCNpc(her.focus_vob)) {
var c_npc oth; oth = MEM_PtrToInst(her.focus_vob);
if(oth.guild > GIL_SEPERATOR_HUM) {
return;
};
};
Pomysł Cruca wydaje się bardziej naturalny i działa, jak należy :)
Mogę 'dobrać się' do rabowanego NPCa.
Dzięki raz jeszcze, kwestia rozwiązana.
 

bogu9821

bogu9821

Użytkownicy
posty373
Propsy170
ProfesjaSkrypter
  • Użytkownicy
dobry pomysł Cruc!
zaraz popróbuję z tym wszystkim. dzięki chłopaki :)

edit:
Taki sposób z sprawdzaniem ekwipunku działa, ale jest problem.
Gdy otwieram swój ekwipunek, funkcja działa.
Gdy zamykam swój ekwipunek, funkcja działa.
Gdy otwieram cudzy ekwipunek, funkcja działa.
Gdy zamykam cudzy ekwipunek, funkcja NIE DZIAŁA.

Czyli komputer cały czas myśli, że jest otwarty ekwipunek,
czyli wywala pierwszy return i można kraść bez konsekwencji :P

var oCNpc her; her = Hlp_GetNpc(hero);
if(Hlp_Is_oCNpc(her.focus_vob)) {
var c_npc oth; oth = MEM_PtrToInst(her.focus_vob);
if(oth.guild > GIL_SEPERATOR_HUM) {
return;
};
};
Pomysł Cruca wydaje się bardziej naturalny i działa, jak należy :)
Mogę 'dobrać się' do rabowanego NPCa.
Dzięki raz jeszcze, kwestia rozwiązana.

Daj Len w CloseInventory na 9.
 
while(false) do();


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