blokada dostepu do ekwipunku handlarza po pokonaniu go 3538 15

O temacie

Autor pawbuj

Zaczęty 19.01.2014 roku

Wyświetleń 3538

Odpowiedzi 15

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
jak w temacie zastanawiam się jak zablokować dostęp do ekwipunku handlarza po zabiciu czy pokonaniu go.

alternatywnie można wyzerować jego ekwipunek tj. usunąć itemy, które dostaje co rozdział. Nie rozwiązuje to kwestii odnośnie przedmiotów, które nabywa w trakcie handlu.

jakieś pomysły?
 

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
Jeśli to G2, popatrz do następujących plików:
ZS_Unconscious.d
B_ClearDeadTrader.d
B_GiveTradeInv.d
B_ClearRuneInv.d
 
: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.

gothic1210
  • Gość
Pawbuj robi przy g1.

Ja mam pewien mały pomysł. Poddam kawałek kodu, bo nie mam czasu się rozpisywać.
ilosc_rudy = Npc_hasitems (instacja_npc, ItMiNugget);
Npc_RemoveInvItems (instacja_npc, ItMiNugget,ilosc_rudy);
I dodać to do skryptu przy pobiciu lub jakoś sprawniej wywołać. Tylko nie wiem czy można by potem przywrócić dawną ilość rudy np. za pomocą CreateInvItems (instacja_npc, ItMiNugget,ilosc_rudy);

Oczywiście można i próbować z innymi przedmiotami typu skóry itd.
 

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
rudę w ten sposób już usuwam, a zrobić cholera z resztą?? :lol2:

chyba mi nie proponujesz do każdego itema dostępnego w  grze?
 

MajkeI

MajkeI

Użytkownicy
Front End Developer
posty698
Propsy169
Profesjabrak
  • Użytkownicy
  • Front End Developer
Możesz zrobić tak, że tylko przy dialogu z handlem, te itemy się tworzą w ekwipunku a po znikają.
W ten sposób nie będzie ich miał przy sobie, a ty nie będziesz mógł ich zabrać.
 

gothic1210
  • Gość
Cytuj
rudę w ten sposób już usuwam, a zrobić cholera z resztą??

chyba mi nie proponujesz do każdego itema dostępnego w  grze?
No nie :) Tylko do rudy i ewentualnie najważniejszych/najdroższych przedmiotów, jeżeli inne pomysły by nie wypaliły. 
 


pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
Av, świetnie - DZiAła na G1!

dałem nast. komendę do perceptiona i Fisk siedział w samych gaciach.

Npc_ClearInventoryLoop (Stt_311_Fisk, ITEM_KAT_NF);

dodam, ze usunąło cały ekwipunek poza bronią, nie widzieć czemu funkcja włąśnie była na ten rodzaj ekwipunku skierowana.

rozumiem, że za pomocą skryptu z tutoriala można zrobić 3 rzeczy:

usunąć ekwipunek z NPC, przekazać do innego NPC badź do skrzyni.

stosujemy standardowe 3 funkcje:
npc_removeinvitems
b_giveinvitems
mob_createitems.

popraw mnie jak źle kombinuję.
( a jak usunąć ekwipunek ze skrzyni?) hmm?




 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
Dokładnie tak. Co do usuwania, to nie jestem pewien na 100%, ale o ile pamiętam działa mob_createitems, ale z podaną ujemną ilością, tak że się wyzeruje :D
Możesz dodać warunek żeby nie usuwało zbroi czy czego tam chcesz (sprawdzać rodzaj itemu)
Co do kategorii - ta funkcja jest napisana właśnie żeby usuwała ze wszystkich kategorii. Górna wersja nie jest przeznaczona do samodzielnego wywoływania. Używaj dolnej. Można zrobić wersję która pozwoliłaby wybrać kategorię, ale najpierw trzeba by się upewnić że te kategorie w ogóle działają tutaj jak trzeba. Można też napisać analogiczną funkcję która wyciągnie przedmioty ze skrzyni, a nawet taką w której podajesz skąd dokąd mają być przenoszone. Kwestia zapotrzebowania.

Splash

Splash

Moderator
posty4209
Propsy3412
ProfesjaNierób
  • Moderator
Sam korzystam z tej funkcji. Żeby nie usuwało zbroi wystarczy dopisać drugi warunek w funkcji Npc_ClearInventoryLoopif (amount > 0)
&& (item.mainflag != ITEM_KAT_ARMOR)
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
Av, skorzystałem właśnie z tej pierwszej funkcji i usunęło wszytsko własnie poza wymieniona kategorią.dziwne.co do skrzyni z ujemna wartością - sprawdzę  to. Splash - dzięki za podpowiedź.

Npc_ClearInventoryLoop (Stt_311_Fisk, ITEM_KAT_NF);
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
Pawbuj, przeczytaj mojego posta jeszcze raz. Ta górna NIE jest przeznaczona do samodzielnego wywoływania. Masz tego nie robić, bo ona wcale nie ma usuwać tylko tej kategorii. To licznik dla pętli, ona idzie po wszystkich kategoriach startując na podanej. Zamiast tego, używaj dolnej. Jeśli chcesz aby usuwało tylko pewną kategorię, należy rozwiązać to inaczej.

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
zrobiłem tak jak mówiłeś i działa w 100%.
jedna uwaga do tego co apisał Splash. w ten sposób zostawiasz u npc wszystkie zbroje, mnie interesuje, aby ta nałożona została w ekwipunku

próbuję w nast. sposób, jednak nie działa

if (item != Npc_HasEquippedArmor(self))


zastanawiam się czy tą funkcję z tutoriala można by w całości przerobić pod item ze skrzyni z identyczną zasadą działania (oczywiście o ile mobcreateitems (instance itema , -1)  zadziała.
 

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
witam, może mi ktoś wytłumaczyć co robię źle, że npc nie zostaje przy tej samej zbroi
func void reset_npc_armorinventory (var c_npc npc)
{
armor = Npc_GetEquippedArmor(npc);
//melwep = Npc_GetEquippedMeleeWeapon  (self);
   //ranwep = Npc_GetEquippedRangedWeapon (self);
Npc_ClearInventory (npc);   
CreateInvItems (npc, armor,1);
AI_EquipArmor (npc, armor);
};

 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
No to tak na sam początek, ten kod ci się kompiluje? Nie zadeklarowałeś zmiennej armor. Jeśli zadeklarowałeś ją gdzie indziej, pokaż tą deklarację. Jakakolwiek ona nie jest, masz złe typy, bo Npc_GetEquippedArmor zwraca c_item (konkretną instancję), a CreateInvItems i AI_EquipArmor oczekują inta (indeksu identyfikatora). Chyba że parser dokona automatycznej konwersji o której pisałem tutaj: http://themodders.org/index.php?topic=13579 . Ale to dość śliska sprawa i lepiej tego nie używać o ile się nie wie co robi.

Zamiast tego, zmodyfikuj moją funkcję *http://themodders.org/index.php?topic=13579) w następujący sposób:
func void Npc_ClearInventoryLoop (var c_npc npc, var int category)
{
        print(ConcatStrings("Czyszczenie eq: ", npc.name);
        var int amount;
        amount = Npc_GetInvItemBySlot (npc, category, 0);
        print(ConcatStrings(item.name, IntToString(amount));
        if (amount>0 && item != Npc_GetEquippedArmor(npc))
        {
                NPC_RemoveInvItems (npc, Hlp_GetInstanceID (item), amount);
                Npc_ClearInventoryLoop(npc, category);
        }
        else if (category < INV_CAT_MAX-1)
        {
                print(ConcatStrings("Zmiana kategorii na: ", IntToString(category+1));
                Npc_ClearInventoryLoop(npc, category+1);
        };
};

func void Npc_ClearInventory (var c_npc npc)
{
        Npc_ClearInventoryLoop(npc, 0);
};

(rozszerzony warunek usuwania, == może nie działać poprawnie - wtedy trzeba by porównać inaczej, na przykład po indeksie identyfikatora, korzystając z funkcji Hlp_GetInstanceID)

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
w ten sposób wywalało "func does not return an int".

zrobiłem to w bardziej łopatologiczny sposóbfunc void reset_npc_armorinventory ()//dla każdego handlarza id !
{
Npc_ClearInventory (self);     
if (self.id == 311)
{
CreateInvItems (self, STT_ARMOR_M,1);AI_EquipBestArmor (self);   
}
else if (self.id == 1208)
{
CreateInvItems (self, GUR_ARMOR_M,1);AI_EquipBestArmor (self);
}
else if (self.id == 843)
{
CreateInvItems (self, ORG_ARMOR_L,1);AI_EquipBestArmor (self);
}
else if (self.id == 855)
{
CreateInvItems (self, ORG_ARMOR_H,1);AI_EquipBestArmor (self);
};
};
 


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