perceptiony a otwieranie skrzyń 7138 29

O temacie

Autor pawbuj

Zaczęty 8.01.2014 roku

Wyświetleń 7138

Odpowiedzi 29

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
robię warunek, że kiedy hero dotyka skrzyń to NPC odpowiednio reagują.mam problem jak oddzielić  skrzynie od wszytskich dostepnych mobów, użyłem nast. funkcji w B_AssessUseMob ()if (Npc_IsDetectedMobOwnedByNpc(other, self)
|| Npc_IsDetectedMobOwnedByGuild(other, self.guild))
|| (detectedMob == oCMobContainer)//przebudzenie
po reparsowaniu wywala błąd ocmobcontainer : wrong type
 


pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
cały skrypt:
func void B_AssessUseMob ()
{
PrintDebugNpc (PD_ZS_FRAME, "B_AssessUseMob");
var string detectedMob;
detectedMob = Npc_GetDetectedMob(other);
PrintDebugNpc (PD_ZS_CHECK, detectedMob);

if (Npc_CanSeeNpcFreeLOS (self, other))
{
if (Npc_IsDetectedMobOwnedByNpc(other, self)
|| Npc_IsDetectedMobOwnedByGuild(other, self.guild))
|| (detectedMob == oCMobContainer)//przebudzenie
{
PrintDebugNpc (PD_ZS_CHECK, "...MOB gehört NSC oder seiner Gilde!");
if (Npc_GetPermAttitude (self, other)==ATT_FRIENDLY || self.guild==other.guild)
{
PrintDebugNpc (PD_ZS_CHECK, "...Manipulator ist FRIENDLY oder in gleicher Gilde!");
B_Say (self, other, "$HandsOff");
penaltymoboc();
}
else
{
PrintGlobals(PD_ZS_CHECK);
penaltymoboc();
//---- Täter vermöbeln ----
Npc_SetTempAttitude ( self, ATT_HOSTILE);
Npc_ClearAIQueue ( self);
B_WhirlAround ( self, other);
B_SayOverlay ( self, other, "$IWillTeachYouRespectForForeignProperty");
// JP: Ist ein heikler Fall, eigentlich sollten die Nsc´s nah genug sein, evtl. aber noch auf ZS_WarnAndPunish umbauen
AI_SetWalkmode ( self, NPC_RUN);
Npc_SetTarget ( self, other);
AI_StartState ( self, ZS_Attack, 0, "");
//penaltymoboc();
};
}
else
{
    PrintDebugNpc (PD_ZS_DETAIL, "not my MoB");
};
}
else
{
    PrintDebugNpc (PD_ZS_DETAIL, "kann SC nicht sehen");
};
};
 

RafalBudzis

RafalBudzis

Użytkownicy
posty1967
Propsy808
ProfesjaSkrypter
  • Użytkownicy
oCMobContainer to chyba klasa ? Do tego

FUNC STRING Npc_GetDetectedMob (var C_NPC self ) { return 0; };
// liefert den Schemanamen des Mobsi zurück, das der Nsc entdeckt hat. Schemaname ist das String-Kürzel des Mobs, daß im Visualnamen vor dem ersten "_"-Zeichen steht, also z.B. "DOOR" wenn der Visualname "DOOR_OCR__135" ist.
// VORSICHT: Diese Funktion ist nur in Verbindung mit PERC_MOVEMOB erlaubt !!!
// WORKAROUND: zur Zeit werden hiermit nur Tür-MOBSIs zurückgegeben, dies soll aber wieder zurückgebaut werden

Npc_GetDetectedMob zwraca stringa więc nie liczył bym na jakikolwiek adres itemu. Czyli if powinien wyglądać tak

if (detectedMob == "DOOR")

Nie wiem jak wartość tekstową można było porównywać z liczbą

oczywiście to jest przykład i zależy to od nazwy w spacerze Nie jestem pewny czy translator google poradził sobie z komentarzami do tej funkcji ale pisze tam ze działa tylko przy drzwiach oraz tylko z percem PERC_MOVEMOB. Bardziej unikalne rozwiązanie to pobrać dokładny obiekt i sprawdzić czy należy do klasy


var oCNpc her; her = Hlp_GetNpc(hero);
if( Hlp_Is_oCMob(her.focus_vob) )
{
oCMob nazwazmiennej;
MEM_AssignContentInst (nazwazmiennej, her.focus_vob);
// i w taki sposób masz dostęp do całego obiektu który widzi bezi tylko nie jestem pewny czy przy używaniu mob jest dalej na focus
...

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
Pawbuj, nie pokazałeś gdzie masz zadeklarowane oCMobContainer. W każdym razie już widzimy że detectedMob jest stringiem. W Daedalusie porównywać za pomocą == da się tylko liczby. Stringi porównuje się za pomocą Hlp_StrCmp, ale to by wymagało jeszcze żeby oCMobContainer było stringiem. Do tego nie wiemy jakie wartości dokładnie zwraca Npc_GetDetectedMob, ani czy może wykrywać skrzynie. Najlepiej ustaw żeby ta rutyna na razie po prostu drukowała nazwę voba do zSpy, a za porównywanie bierz się dopiero potem jak zobaczysz co jest wypluwane.

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
a może mi pomożecie w nieco inny sposób.

mamy warunek, jeżeli hero wykonuje animację (przekrecenia wytrychem np. Npc_IsInState (hero, "T_CHESTBIG_SO_PICKRIGHT" )) w prawo to reakcja....przy czym nie wiem jakieś funkcji użyć do określenia warunku dla wykonywanej animacji.


Rafał ten skrypt, który podałeś do tick tocka dokłądamy?
 


Abubaker

Abubaker

Użytkownicy
posty86
Propsy10
Profesjabrak
  • Użytkownicy
Wydaję mi się że chodzi mu o funkcję zwracającą animację(stan?) postaci w danym momencie. Myślę że łatwiej niż animacją będzie używając
BodyStates. Tylko nie wiem jak to wygląda w Gothicu 1 (bo zakładam że o niego chodzi).
 

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
dokładnie o to mi chodzi. tylko nie może być bodystate gdyż odnosi się do każdego moba - sprawdzałem to z poziomu konsoli w trakcie gry.

musi być postawiony warunek jeśli npc wykonuje daną animację to etc..

Rafał sprawdzałem twoją metodę (przy ocmob brakowało  var) i nie działa - przy podświetleniu nazwy moba brak dodatkowej informacji.   
 

RafalBudzis

RafalBudzis

Użytkownicy
posty1967
Propsy808
ProfesjaSkrypter
  • Użytkownicy
Nie działa czyli? W jaki sposób to dodałeś? Być może będzie trzeba to trochę przerobić i zapisywać gdzieś zmienną która będzie pamiętała ostatnio widziany oCMOB. Jeśli focus jest usuwany przy reakcji to zrób sobie w story global zmienna.
CONST STRING LastMobName = "";a potem do tick`a
var oCNpc her; her = Hlp_GetNpc(hero);
if( Hlp_Is_oCMob(her.focus_vob) )
{
var oCMob nazwazmiennej;
MEM_AssignContentInst (nazwazmiennej, her.focus_vob);
LastMobName = nazwazmiennej.name;
};

i nazwa powinna być pobierana tylko nie wiem czy będzie to nazwa "SKRZYNIA" czy nazwa zmiennej CHEST więc sobie ją wyświetl gdzieś i zobacz co będzie się wyświetlało. Ale ten sposób z tickiem bym odłożył narazie na bok :)

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
FUNC STRING Npc_GetDetectedMob             (var C_NPC self ) { return 0; };
// liefert den Schemanamen des Mobsi zurück, das der Nsc entdeckt hat. Schemaname ist das String-Kürzel des Mobs, daß im Visualnamen vor dem ersten "_"-Zeichen steht, also z.B. "DOOR" wenn der Visualname "DOOR_OCR__135" ist.
// VORSICHT: Diese Funktion ist nur in Verbindung mit PERC_MOVEMOB erlaubt !!!
// WORKAROUND: zur Zeit werden hiermit nur Tür-MOBSIs zurückgegeben, dies soll aber wieder zurückgebaut werden
wychodzi, że string , którego szukamy to pełna nazwa scenename w trakcie interakcji z mobem, czy tak?

czy ktoś z was mógłby napisać  przykład takiej funkcji, nie bardzo rozumiem tego wersa z return.
 

RafalBudzis

RafalBudzis

Użytkownicy
posty1967
Propsy808
ProfesjaSkrypter
  • Użytkownicy
no zamiast tej funkcji użyj LastMobName który wytłumaczyłem jak zrobić post wyżej ... Jakiej nazwy szukamy powinieneś raczej sam wiedzieć ... Z resztą możesz się odwołać do każdej nazwy.

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
twój skrypt nie działa.

pozostałe 2 sprawdzone możłiwości :

1) korzystam z warunku , jezeli npc ma bodystate bs_invenrtory
2) musze przypisać skrzynie do gild, nie wiem czy jeden mob może przypisany do więcej niż jednej

 

RafalBudzis

RafalBudzis

Użytkownicy
posty1967
Propsy808
ProfesjaSkrypter
  • Użytkownicy
Cytuj
twój skrypt nie działa.

Przyznaj się ze nie umiesz go użyć ... Gdy to napisałeś wrzuciłem to do swojego gothic`a i uruchomiłem wszystko działało dla skrzynek, ławki i łóżka. Nazwy w zmiennej były odpowiednio "Chest", "Bench" i "Bed". Może źle wstawiłeś swoją skrzynkę w spacerze i nie nadałeś jej nazwy ?

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
przestań Rafał. dałes mi na pewno taki sam skrypt jak sam użyłeś?

mam zrobione podobne funkcje, chociażby zmiany nazwy skrzyń kiedy jest pusta bądź pena .

przy wpisaniu chest do warunku w tej samej linijce wywal mi błąd składni (syntax error)
if (Npc_IsDetectedMobOwnedByNpc(other, self)
|| Npc_IsDetectedMobOwnedByGuild(other, self.guild))
||  (detectedMob == "[b]CHEST[/b]")
 

RafalBudzis

RafalBudzis

Użytkownicy
posty1967
Propsy808
ProfesjaSkrypter
  • Użytkownicy
Cytat: pawbuj
przestań Rafał. dałes mi na pewno taki sam skrypt jak sam użyłeś?
no kur** pomagać komuś a on jeszcze będzie mówił ze kłamiesz ... dopisz sobie do tick`a

PrintScreen     (LastMobName, 50,50,"font_old_20_white.tga",2);
i spr czy działa. spr też czy działa z oryginalnymi mob`ami bo może tak jak mówię źle wstawiłeś swoją skrzynkę.

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
||  (detectedMob == "[b]CHEST[/b]")
wywala mi syntax error przy tym warunku BTW nie kurwujmy lepiej.
 

RafalBudzis

RafalBudzis

Użytkownicy
posty1967
Propsy808
ProfesjaSkrypter
  • Użytkownicy
Avallach przecież napisał ze == na stringi nie działa myslałem ze jego post też przeczytałeś.

||  (detectedMob == "[b]CHEST[/b]")
zamien na

||  (Hlp_StrCmp(LastMobName, "Chest")
do tego duże i małe litery w stringach mają znaczenie więc CHEST by nigdy nie zadziałało ale jak ja mówię każdy szanujący się programista nie bedzie strzelał na ślepo co nie działa ! Wyświetlaj sobie wszystkie zmienne jeśli coś nie działa i analizuj.

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
pomysł dobry co napisałeś , niestety  nie działa. podejrzewam , że przez brak zależności z "detectedmob" , niestety przyznaję - sam nie wiem jak to połączyć.
 

RafalBudzis

RafalBudzis

Użytkownicy
posty1967
Propsy808
ProfesjaSkrypter
  • Użytkownicy
zamiast detectedmob masz uczyć LastMobName który pokazałem ci jak zrobić i tak jak mówiłem mniej myślenia na pałę WIĘCEJ WYŚWIETLANIA !!!

wyświetl wszystkie ify
PrintScreen     (IntToStr(Npc_IsDetectedMobOwnedByNpc(other, self)), 10,50,"font_old_20_white.tga",2);
PrintScreen     (IntToStr(Npc_IsDetectedMobOwnedByGuild(other, self.guild)), 15,50,"font_old_20_white.tga",2);
PrintScreen     (LastMobName, 20,50,"font_old_20_white.tga",2);

do samej reakcji daj

PrintScreen     ("działa",30,50,"font_old_20_white.tga",5);
i będzie wiadomo który if się nie wykonuje i czy twój skrypt jest uruchamiany.


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