Przedmiot, którego nie można wyrzucić, ani sprzedać 6386 18

O temacie

Autor Althar

Zaczęty 27.08.2009 roku

Wyświetleń 6386

Odpowiedzi 18

Althar

Althar

Użytkownicy
posty307
Propsy44
  • Użytkownicy
Chciałbym zrobić pewien przedmiot, który dostajemy do NPC, ale tego przedmiotu nie możemy wyrzucić z ekwipunku ani też go sprzedać. Można by zrobić, żeby wyświetał sie napis "Nie możesz tego zrobić" - to wiem jak zrobić. Ale nie wiem czy jest to wykonalne by przedmiot był nie do wyrzucenia i nie do sprzedania. Wystarczy nie wyrzucanie. Znaczy by nie można było go upuścić na ziemię. Też przedmiot miałby być cały czas w ekipunku. I odebrać mógłby tylko NPC poprzez dialog.
 

MRGreg

MRGreg

Użytkownicy
posty32
  • Użytkownicy
Wymyśliłem pewien sposób na delikatne oszukanie systemu :)  tylko że byłoby z tym parę mankamentów.

Zrobiłbyś tak:
-zrób przedmiot jako pierścień
-zrób funkcje założenia pierścienia
-w funkcji ściągania pierścienia wstaw znowu założenie pierścienia :)

Przez to nie będziesz mógł go ściągnąć więc nie będziesz mógł na pewno sprzedać, ale teraz są moje obawy:

-wydaje mi się że gdy chcesz wyrzucić przedmiot w gothicu pierwszy wywołuje się funkcja jego ściągnięcia bo inaczyej mogłyby być bugi typu założe raz pierścień co zwiększa siłe i wyrzucam go gdy jest założony(przez co zwiększa mi ciągle siłe) itp.

-nie próbowałem nigdy tego zrobić
-i nie możemy założyć więcej pierścieni niz jeden :P
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator
Ja znam metodę strasznie naciąganą ale w sumie spełniającą warunki które zadałeś. Jeśli w skrypcie tego przedmiotu zamiast modelu podasz jakiś pfx, to przy wyrzucaniu go gra za każdym razem się zawiesi. Dotyczy to większości pfx-ów oprócz kilku takich jak fire.pfx i niektórych efektów zaklęć. Gracz nie będzie mógł się pozbyć tego itema inaczej niż sprzedając go lub oddając przez odpowiednią opcję dialogową. Żeby nie mógł go sprzedać, możesz pokombinować z ujemną wartością, ale nie wiem czy to zadziała. Gdyby miał wartość -999999 do gracz musiałby tyle dopłacić żeby go sprzedać, a tyle rudy w grze po prostu nie ma. Więc jedynym wyjściem byłoby oddanie go przez dialog.

Zkirtaem

Zkirtaem

Moderator
Mięso
posty2171
Propsy1689
ProfesjaGracz
  • Moderator
  • Mięso
Najprościej, lecz najmniej ciekawie byłoby zrobić nowego MDSa, w którym animka wyrzucania jest zrobiona tak, żeby nic nie robiła - nie wyrzucała itemka i nie poruszała postacią. Ale wtedy nie można nic wyrzucić (więc MDS zostałby uaktywniony tylko na czas questa, albo if (tenitemikjestwekwipunku).
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator
Albo można by dodać skrypt uruchamiany tick tockiem np co pół sekundy który sprawdza czy mamy ten item w ekwipunku. Jeśli nie, to znaczy ze go wyrzuciliśmy i wtedy jest aktywowana funkcja podnoszenia go z powrotem.
if (Npc_HasItems(hero,instance_itemka) = 0 )
{
AI_TakeItem (hero, instance_itemka)
};
Tylko nie jestem pewien co by było gdyby jakiś pomysłowy gracz zrzuciłby ten przedmiot z wysokiej przepaści, wtedy chyba nie dało by się go samoczynnie podnieść. Nie jestem też pewien czy ten warunek ilość równa zero jest poprawny (chociaż z drugiej strony jak kiedyś eksperymentowałem to okazało się że można posiadać nawet ujemną ilość czegoś).

Ewentualnie zamiast podnosić upuszczony przedmiot można użyć
if (Npc_HasItems(hero,instance_itemka) = 0 )
{
Wld_RemoveItem (instance_itemka);
CreateInvItem(hero,instance_itemka);
};

Althar

Althar

Użytkownicy
posty307
Propsy44
  • Użytkownicy
Pomysł nr 2 Avallacha chyba jest tym czego potrzebuję
if (Npc_HasItems(hero,instance_itemka) = 0 )
{
Wld_RemoveItem (instance_itemka);
CreateInvItem(hero,instance_itemka);
};

A więc jak przedmiotu nie mamy gra kasuje ten w świecie i tworzy nowy w ekwipunu tak ? Dobrze to zrozumiałem ? Na takiej zasadzie to działa ? A co do ceny to chyba poprotu wpiszę 0 lub coś na "-".
Dziękuję Wam za pomoc.
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator
Pomysł nr 2 Avallacha chyba jest tym czego potrzebuję
if (Npc_HasItems(hero,instance_itemka) = 0 )
{
Wld_RemoveItem (instance_itemka);
CreateInvItem(hero,instance_itemka);
};

A więc jak przedmiotu nie mamy gra kasuje ten w świecie i tworzy nowy w ekwipunu tak ? Dobrze to zrozumiałem ? Na takiej zasadzie to działa ? A co do ceny to chyba poprotu wpiszę 0 lub coś na "-".
Dziękuję Wam za pomoc.
Zrozumiałeś bardzo dobrze, tylko jeszcze nie jestem pewien czy to będzie działało. Poza tym pamiętaj, że na potrzeby tej funkcji trzeba stworzyć Spacerem specjalnego ticktocka który będzie co jakiś krótki czas go aktywował. To jest trudniejsza część zadania (ja tam w Spacerze nic nie umiem) ale chyba niezbędna aby skrypt był poprawnie wywoływany.

MRGreg

MRGreg

Użytkownicy
posty32
  • Użytkownicy
A może nie trzeba tego robić w ticktocku tylko tak jak wcześniej pisałem w ściąganiu tego przedmiotu gdyby to był np. pierścień. Tylko ktoś kto już coś podobnego musiałby sprawdzić czy funkcja on_unequip jest wywoływana przed wyrzuceniem tego czegoś. Wiecie o co mi chodzi prawda? Trochę teraz nie mam teraz czasu bo sam bym to sprawdził.

to

Wld_RemoveItem (instance_itemka);
CreateInvItem(hero,instance_itemka);

wrzucic w kod itemu w ringach:

on_unequip = UnEquip_jakis_dziwny_przedmiot;
....

FUNC VOID UnEquip_jakis_dziwny_przedmiot()
{
Wld_RemoveItem (instance_itemka);
CreateInvItem(hero,instance_itemka); //czyli tutaj
};

Ale tak na logikę żeby coś takiego jak używany w tym momencie pierścień wyrzucić powinno się pierwsze go ściągnąć a później wyrzucić nawet ze programistycznego punktu widzenia :D  

Sory ale mam takie zboczenie programistyczne, żeby nie obciążać procesora a ten ticktock... :P

Acha...

i jeżeli się jeszcze boisz że jakiś dziwny gracz będzie chciał go wyrzucić i nie spróbuje go założyć to w dialogu zaraz po otrzymaniu tego przedmiotu dodaj

EquipItem (other, jakis_dziwny_przedmiot);
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator
Cytat: MRGreg link=topic=7022.msg63558#msg63558 date=Aug 30 2009, 02:36 AM\'
A może nie trzeba tego robić w ticktocku tylko tak jak wcześniej pisałem w ściąganiu tego przedmiotu gdyby to był np. pierścień. Tylko ktoś kto już coś podobnego musiałby sprawdzić czy funkcja on_unequip jest wywoływana przed wyrzuceniem tego czegoś. Wiecie o co mi chodzi prawda? Trochę teraz nie mam teraz czasu bo sam bym to sprawdził.

to

Wld_RemoveItem (instance_itemka);
CreateInvItem(hero,instance_itemka);

wrzucic w kod itemu w ringach:

on_unequip = UnEquip_jakis_dziwny_przedmiot;
....

FUNC VOID UnEquip_jakis_dziwny_przedmiot()
{
Wld_RemoveItem (instance_itemka);
CreateInvItem(hero,instance_itemka); //czyli tutaj
};

Ale tak na logikę żeby coś takiego jak używany w tym momencie pierścień wyrzucić powinno się pierwsze go ściągnąć a później wyrzucić nawet ze programistycznego punktu widzenia :D  

Sory ale mam takie zboczenie programistyczne, żeby nie obciążać procesora a ten ticktock... :P

Acha...

i jeżeli się jeszcze boisz że jakiś dziwny gracz będzie chciał go wyrzucić i nie spróbuje go założyć to w dialogu zaraz po otrzymaniu tego przedmiotu dodaj

EquipItem (other, jakis_dziwny_przedmiot);
Z tym on_unequip to świetny pomysł, jeszcze lepiej byłoby gdyby dało się aktywować ten skrypt w momencie kiedy postać wyrzuca jakikolwiek przedmiot, chyba trzeba by było jakoś zagnieździć funkcję w mdsie czy coś ,ale to chyba niemożliwe. Ta moja metoda z wywoływaniem skryptu co chwilę faktycznie jest fatalna jeśli chodzi o wpływ na wydajność, ale to jedyne rozwiązanie w 100% skuteczne na jakie wpadłem.
Czyli cała funkcja która załącza się przy ściąganiu wygladała by tak:
on_unequip = UnEquip_instance_itemka;
....

FUNC VOID UnEquip_instance_itemka()
{
Wld_RemoveItem (instance_itemka);
CreateInvItem(hero,instance_itemka);
EquipItem (self, Instance_itemka);
};

MRGreg

MRGreg

Użytkownicy
posty32
  • Użytkownicy
Wydaje mi się że funkcja on_unequip powinna być wywołana w mdsie! Jak już pisałem wyżej ponieważ gdyby znalazł się jakiś gracz z fantazją spróbowałby wyrzucić ringa który daje 5 siły (miałby on go obecnie założonego) czyli miałby z ringiem 55 siły a po wyrzuceniu podczas gdy jest założony zostało by mu to 55 siły a później jeszcze by go podniósł i zrobił to samo i miałby 60sily itd. to by był fatalny bug! Ta funkcja gdzieś podczas wyrzucania musi być umieszczona! ale nie wiem gdzie :D
 

Marvin

Marvin

Użytkownicy
posty35
Propsy1
  • Użytkownicy
on_unequip = UnEquip_instance_itemka;
....

FUNC VOID UnEquip_instance_itemka()
{
Wld_RemoveItem (instance_itemka);
CreateInvItem(hero,instance_itemka);
EquipItem (self, Instance_itemka);
};


To nie wypali bez ticktocka... Kiedy wyrzucimy ten przedmiot, ten na ziemi wcale się nie usuwa, za to w ekwipunku tworzy się nowy. Tym sposobem naciskając ciągle PPM + strzałkę w dół naprodukowałem taśmowo w Gothic I z setkę takich itemów. 0_o
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator
Akurat da się łatwo zrobić żeby się usuwał ze świata na 100%, ale nie chciałbym na darmo zdradzać tej metody ;]
Ogólnie poza tym jesteś pewien że oprócz tego wszystko działa? I czy Althar dalej tego potrzebuje?

//edit: przypomniałem sobie że metoda o której myślę ma dwie wady, raz że nie byłoby widać podglądu w ekwipunku, a dwa że gra być może crashowałaby przy każdej próbie wczytania. Gdyby tylko była możliwość, lepiej jeszcze popracować nad sposobem skryptowym.

//edit2:
Ha, już wiem gdzie jest błąd. Funkcja jest dobra, po prostu odpalana już kiedy item zostanie ściągnięty, ale jeszcze zanim wyrzucony do świata. Nie jestem pewien jak to się tam kolejkowało, ale wydaje mi się że gdyby przenieść Wld_RemoveItem z UnEquip do Equip (które będzie się przecież włączało automatycznie po ściągnięciu) powinno działać.

Marvin

Marvin

Użytkownicy
posty35
Propsy1
  • Użytkownicy
Cytat: Avallach link=topic=7022.msg122697#msg122697#msg122697#msg122697 date=1291842913
Ha, już wiem gdzie jest błąd. Funkcja jest dobra, po prostu odpalana już kiedy item zostanie ściągnięty, ale jeszcze zanim wyrzucony do świata. Nie jestem pewien jak to się tam kolejkowało, ale wydaje mi się że gdyby przenieść Wld_RemoveItem z UnEquip do Equip (które będzie się przecież włączało automatycznie po ściągnięciu) powinno działać.

Eeee... Czyli jak teraz skrypt powinien wyglądać? Bo troszeczkę Cię nie rozumiem :D
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator
on_unequip                              =       UnEquip_instance_itemka;
on_equip                              =       UEquip_instance_itemka;
....

FUNC VOID UnEquip_instance_itemka()
{
CreateInvItem(hero,instance_itemka);
EquipItem (self, Instance_itemka);
};
FUNC VOID Equip_instance_itemka()
{
Wld_RemoveItem (instance_itemka);
};
Ewentualnie można by jeszcze pokombinować ze sztuczną zmianą kolejności w wykonywaniu poleceń (bo usuwane może być dopiero kiedy już sobie na tym świecie leży).

Marvin

Marvin

Użytkownicy
posty35
Propsy1
  • Użytkownicy
Niestety, ale nie działa to tak jak powinno. Dochodzę do wniosku, że jedynym skutecznym sposobem na to byłoby stworzenie nowej animki wyrzucania, tak jak mówił mea. Albo spróbować zrobić ten ticktock... Ale na razie się tego nie podejmuję, mam za niskie umiejętności na takie cuda.
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator
Nie zgadzam się z postem Meatrikza, niestety samo wyrzucanie itema nie jest zaprogramowane w MDS. Tam jest tylko animacja, ale bez odpowiadającego za tego typu czynności eventTaga. Odpowiednia funkcja jest bezpośrednio w engine.

Co do tick tocków, być może nie rozumiesz skąd bierze się moja niechęć do nich. Nie chodzi tu o to że mogą być trudne do wstawienia czy powodować liczne problemy. Chodzi o to, że działają na zasadzie że co ułamek sekundy enginowi jest zadawane kolejne pytanie z listy:
1. Czy gracz wyrzucił przedmiot z ekwipunku? Tak? No to wywal go ze świata.
2. Czy gracz wyrzucił przedmiot z ekwipunku? Tak? No to wywal go ze świata.
4. Czy gracz wyrzucił przedmiot z ekwipunku? Tak? No to wywal go ze świata.
5. Czy gracz wyrzucił przedmiot z ekwipunku? Tak? No to wywal go ze świata.
6. Czy gracz wyrzucił przedmiot z ekwipunku? Tak? No to wywal go ze świata.
7. Czy gracz wyrzucił przedmiot z ekwipunku? Tak? No to wywal go ze świata.
8. Czy gracz wyrzucił przedmiot z ekwipunku? Tak? No to wywal go ze świata.
9. Czy gracz wyrzucił przedmiot z ekwipunku? Tak? No to wywal go ze świata.
10. Czy gracz wyrzucił przedmiot z ekwipunku? Tak? No to wywal go ze świata.
11. Czy gracz wyrzucił przedmiot z ekwipunku? Tak? No to wywal go ze świata.
12. Czy gracz wyrzucił przedmiot z ekwipunku? Tak? No to wywal go ze świata.
N. Czy gracz wyrzucił przedmiot z ekwipunku? Tak? No to wywal go ze świata.

I tak w nieskończoność, ciągle, bez przerwy, bez końca. To naprawdę źle wpływa na wydajność.
Zdecydowanie lepiej jest napisać skrypt, który nawet jeśli będzie trochę pogmatwany to będzie się odpalał dopiero w momencie kiedy gracz naprawdę wyrzuci ten item, a nie ciągle na wszelki wypadek sprawdzał czy może to już.

Marvin

Marvin

Użytkownicy
posty35
Propsy1
  • Użytkownicy
Wiem, to znacznie spowolniłoby grę. Więc co w takim razie trzeba zrobić, żeby uzyskać pożądany efekt, bez stosowania spowalniających grę ticktock'ów i bez grzebania w MDSach (co i tak nic nie da)? Sprawdziłem skrypty które tutaj podawaliście i niestety nie działają tak jak powinny (a przynajmniej w Gothic I). Trzeba by jeszcze nad tym jeszcze trochę posiedzieć  :huh:
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator
Może nie znacznie, aczkolwiek wydaje mi się to istotną wadą. Co do rozwiązania, oprócz metody eksperymentalnej związanej z samo-znikaniem przedmiotu, którą wolę zostawić na ostateczność, pozostaje jeszcze kombinowanie z kolejnością wykonywania poleceń. Otóż trzeba by dopilnować, aby wld_removeItem było odpalane dopiero po zdjęciu i wyrzuceniu przedmiotu, kiedy już leży na ziemi.

O, mam debilny pomysł, to głupie - ostrzegam (serio).
Spoiler
FUNC VOID UnEquip_instance_itemka() { CreateInvItem(hero,instance_itemka); EquipItem (self, Instance_itemka); Instance_itemka.mainflag = 0; Instance_itemka.flags = 0; }; O ile pamiętam skutkuje niemożliwością podniesienia przedmiotu. Jeśli wywalisz mu nazwę podświetlania i dodatkowo zmienisz visual na niewidoczny, w praktyce wyjdzie jakby itemu nie było.

Marvin

Marvin

Użytkownicy
posty35
Propsy1
  • Użytkownicy
Działa, choć z małymi bugami  ^^   Ale z pewnością można to dopracować, posiedzę nad tym.

EDIT: Gracz najpierw wyrzuca dwa takie przedmioty, trzeciego, który się sam tworzy, już nie można wyrzucić, ani nie można go ubrać. Wszystko fajnie, gdyby nie było tych dwóch itemów na początku, i gdyby dało się go ubrać (w moim przypadku przedmiotem jest zbroja  :naughty:  ).

EDIT2: Aha, i w tej linijce, którą podałeś, zmieniłem flags i mainflag na -1.
 


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