-
Rüstungen ins Händlerinventar - möglich?
Guten Abend,
ist es möglich (mit LeGo/Ikarus) Rüstungen im Händlerinventar erscheinen zu lassen, und falls ja, wie? In Gothic 1 und 2 ist es ja so, dass man Rüstungen über den Dialog verkaufen muss. Nur finde ich das nicht so schön. Ich hab es auch schon so: https://forum.worldofplayers.de/foru...1#post22641091 probiert, aber das ist mMn. auch nicht die beste Lösung und es gibt damit auch einige Probleme.
-
Hallo Bloodfly,
das dürfte auch ohne Ikarus und Lego funktionieren. Marcello hatte die Idee, Rüstungen in Form von Fake-Rüstungen (mit einem Gürtel-Flag) im Händlerinventar anzubieten.
In der Loop_Funktion der ZS_Talk wird dann die Fake-Rüstung ausgetauscht.
Code:
func INT ZS_Talk_Loop ()
{
if (Hlp_GetInstanceID(other) == Hlp_GetInstanceID(hero))
{
if (Npc_HasItems (other, ITAR_VLK_M_FAKE) == 1)
{
Npc_RemoveInvItems (hero, ITAR_VLK_M_FAKE, 1);
CreateInvItems (hero, ITAR_VLK_M, 1);
};
if (Npc_HasItems (other, ITAR_VLK_H_FAKE) == 1)
{
Npc_RemoveInvItems (hero, ITAR_VLK_H_FAKE, 1);
CreateInvItems (hero, ITAR_VLK_H, 1);
};
};
...
Vielleicht genügt diese Lösung deinen Anforderungen.
Geändert von Atariar (29.01.2017 um 22:10 Uhr)
-
Zitat von Atariar
Hallo Bloodfly,
das sollte auch ohne ohne Ikarus und Lego funktionieren. Marcello hatte die Idee, Rüstungen in Form von Fake-Rüstungen (mit einem Gürtel-Flag) im Händlerinventar anzubieten.
In der Loop_Funktion der ZS_Talk wird dann die Fake-Rüstung ausgetauscht.
Code:
func INT ZS_Talk_Loop ()
{
if (Hlp_GetInstanceID(other) == Hlp_GetInstanceID(hero))
{
if (Npc_HasItems (other, ITAR_VLK_M_FAKE) == 1)
{
Npc_RemoveInvItems (hero, ITAR_VLK_M_FAKE, 1);
CreateInvItems (hero, ITAR_VLK_M, 1);
};
if (Npc_HasItems (other, ITAR_VLK_H_FAKE) == 1)
{
Npc_RemoveInvItems (hero, ITAR_VLK_H_FAKE, 1);
CreateInvItems (hero, ITAR_VLK_H, 1);
};
};
...
Vielleicht genügt diese Lösung deinen Anforderungen.
Danke. Ja, ich habe auch schon daran gedacht es so ähnlich zu machen. Aber das Problem ist dann, dass die Rüstung nicht wieder im Händlerinventar erscheint, wenn der Spieler sie wieder verkauft.
-
Vielleicht funktioniert das auch umgekehrt. Wenn der Hero die Rüstung verkauft, und dann im ZS_Talk_Loop wird abgefragt, ob der Händler die Rüstung besitzt und dann wieder durch die Fake_Armor ausgetauscht.
Edit: Ich konnte das soweit erfolgreich testen, das einzige Problem dabei ist allerdings, dass der Händler diese Rüstung nicht sofort in seinem Handelsfenster hat. Er zeigt erst beim nächsten Aufruf des Händlerinventars die Rüstung an.
Geändert von Atariar (29.01.2017 um 21:53 Uhr)
-
Zitat von Atariar
Vielleicht funktioniert das auch umgekehrt. Wenn der Hero die Rüstung verkauft, und dann im ZS_Talk_Loop wird abgefragt, ob der Händler die Rüstung besitzt und dann wieder durch die Fake_Armor ausgetauscht.
Edit: Ich konnte das soweit erfolgreich testen, das einzige Problem dabei ist allerdings, dass der Händler diese Rüstung nicht sofort in seinem Handelsfenster hat. Er zeigt erst beim nächsten Aufruf des Händlerinventars die Rüstung an.
Ok, dann werde ich mal versuchen das einzubauen. Danke
-
Es funktioniert. Vielen Dank.
Aber hat vielleicht noch jemand eine Idee wie man dem Händler sofort die Rüstung ins Inventar geben kann?
-
Zitat von Bloodfly91
Es funktioniert. Vielen Dank.
Aber hat vielleicht noch jemand eine Idee wie man dem Händler sofort die Rüstung ins Inventar geben kann?
Ich hab heute beim testen gesehen, dass jetzt alle NPCs ihre Rüstung ablegen (bzw. wird sie gelöscht und die "Fake Rüstung" ins Inventar gegeben), wenn ich mit ihnen rede. Gibt es da nicht vielleicht doch auch eine Möglichkeit mit LeGo? Es muss doch irgendwie möglich sein, auch Items mit dem Mainflag "ITEM_KAT_ARMOR" im Händlerinventar sichtbar zu machen, oder? Wäre ja bestimmt auch leichter und schneller gemacht, als für alle Rüstungen (es gibt einige) ein Skript zu schreiben und die dann alle in die ZS_Talk einzutragen.
-
Zitat von Bloodfly91
Ich hab heute beim testen gesehen, dass jetzt alle NPCs ihre Rüstung ablegen (bzw. wird sie gelöscht und die "Fake Rüstung" ins Inventar gegeben), wenn ich mit ihnen rede. Gibt es da nicht vielleicht doch auch eine Möglichkeit mit LeGo? Es muss doch irgendwie möglich sein, auch Items mit dem Mainflag "ITEM_KAT_ARMOR" im Händlerinventar sichtbar zu machen, oder? Wäre ja bestimmt auch leichter und schneller gemacht, als für alle Rüstungen (es gibt einige) ein Skript zu schreiben und die dann alle in die ZS_Talk einzutragen.
Dazu müsste man herausfinden, wo in der Engine die Rüstungen aus dem Handelsinventar entfernt werden und das irgendwie verhindern. Das kann man leider nicht mal so eben runterschreiben.
Warum für alle Rüstungen? Du kannst ja auch einfach das komplette Inventar des Händlers durchgehen und dann auf das (von dir genannte) Mainflag testen
-
-
-
Muss leider nochmal diesen Thread wiederbeleben, weil ich heute auf ein Problem gestoßen bin, das damit zu tun hat.
Ich habe das Skript von weiter oben in den letzten Tagen mal noch etwas angepasst, weil es mich ziemlich gestört hat, dass die Rüstungen nicht sofort im Händlerinventar erschienen und andere NPCs, die eine Rüstung trugen, die im Skript stand, diese auch beim anquatschen ausgezogen haben.
Also habe ich für jede Rüstung ein 'Fake-Item' erstellt, die das gleiche Visual, Namen etc. von den Rüstungen haben. Sobald der Spieler einen NPC anquatscht (also er sich in der ZS_Talk befindet), werden ALLE Rüstungen, die der Spieler im Inventar hat, durch die Fake-Rüstungen ersetzt. Sobald der Spieler den Dialog wieder beendet, werden die Fake-Rüstungen wieder durch richtige ausgetauscht.
Das funktioniert(E) soweit auch problemlos, die Rüstung erscheint dadurch dass sie durch ein normales Item ersetzt wird sofort im Händlerinventar.
Aber jetzt das Problem: Ich kriege es einfach nicht hin, dass die Rüstung, die der Held gerade trägt, nicht auch durch eine Fake-Rüstung ersetzt wird und somit auszieht, was auch ziemlich komisch wirken würde. Ich habe jetzt schon einiges probiert, aber nichts funktioniert.
Hier mal das Skript, das die Rüstungen tauscht:
Code:
func void DIV_ChangeArmorToFakeArmor_Player()
{
var C_Item isArmorEquipped; isArmorEquipped = Npc_GetEquippedArmor(other);
if (Hlp_GetInstanceID(other) == Hlp_GetInstanceID(hero))
{
// Hier muss JEDE Rüstung eingetragen und abgefragt werden!
// --- Normale Landbewohnerkleidung ---
if (Npc_HasItems (other, ITAR_DIV_Armor_Kleidung_01) > 0) // Hat der Spieler mind. eine solche Rüstung?
{
if (Hlp_IsItem (isArmorEquipped, ITAR_DIV_Armor_Kleidung_01)) // Hat der Spieler eine davon angelegt? Falls ja --> Alle durch Fake-Rüstungen ersetzen, bis auf die, die er trägt
{
CreateInvItems (other, ITFA_DIV_Armor_Kleidung_01, Npc_HasItems(other, ITAR_DIV_Armor_Kleidung_01)-1);
Npc_RemoveInvItems (other, ITAR_DIV_Armor_Kleidung_01, Npc_HasItems(other, ITAR_DIV_Armor_Kleidung_01)-1);
} else {
CreateInvItems (other, ITFA_DIV_Armor_Kleidung_01, Npc_HasItems(other, ITAR_DIV_Armor_Kleidung_01));
Npc_RemoveInvItems (other, ITAR_DIV_Armor_Kleidung_01, Npc_HasItems(other, ITAR_DIV_Armor_Kleidung_01));
};
};
};
Print("Nicht equippte Rüstungen des Helden wurden JETZT ausgetauscht!");
};
func void DIV_ChangeFakeArmorToArmor_Player()
{
if (Hlp_GetInstanceID(other) == Hlp_GetInstanceID(hero))
{
// Hier muss JEDE Rüstung eingetragen und abgefragt werden!
// --- Normale Landbewohnerkleidung ---
if (Npc_HasItems (other, ITFA_DIV_Armor_Kleidung_01) > 0)
{
CreateInvItems (other, ITAR_DIV_Armor_Kleidung_01, Npc_HasItems(other, ITFA_DIV_Armor_Kleidung_01));
Npc_RemoveInvItems (other, ITFA_DIV_Armor_Kleidung_01, Npc_HasItems(other, ITFA_DIV_Armor_Kleidung_01));
};
};
Print("Alle Fake-Rüstungen des Helden wurden JETZT ausgetauscht!");
};
Die beiden Funktionen werden in der ZS_Talk aufgerufen.
DIV_ChangeArmorToFakeArmor_Player(); --> ZS_Talk
DIV_ChangeFakeArmorToArmor_Player(); --> ZS_Talk_End
Das Problem ist dieser Teil:
Code:
CreateInvItems (other, ITFA_DIV_Armor_Kleidung_01, Npc_HasItems(other, ITAR_DIV_Armor_Kleidung_01)-1);
Npc_RemoveInvItems (other, ITAR_DIV_Armor_Kleidung_01, Npc_HasItems(other, ITAR_DIV_Armor_Kleidung_01)-1);
Das -1 funktioniert so natürlich nicht, weil eine der (z.B.) 3 Rüstungen, die ich davon im Inventar habe, ausgesucht und gelöscht wird, also oft auch die, die der Held gerade davon trägt.
Wie mache ich das also, dass nicht auch die ersetzt/gelöscht wird, die der Spieler gerade trägt?
-
Vielleicht Rüstung ablegen, alle 3 entfernen, eine hinzufügen und wieder anziehen lassen?
-
Zitat von Milky-Way
Vielleicht Rüstung ablegen, alle 3 entfernen, eine hinzufügen und wieder anziehen lassen?
Danke, so scheint es tatsächlich zu funktionieren. Sieht zwar etwas komisch aus, wenn der Held kurz die Rüstung auszieht, sobald man einen NPC anquatscht, und dann schnell wieder anzieht, aber das ist ja nur für einen kurzen Moment und den meisten wird das vermutlich gar nicht auffallen.
Vielleicht hat ja aber trotzdem noch jemand eine Idee, wie man es komplett unauffällig machen kann. ^^
-
So, leider gibt es doch noch ein kleines Problem.
Weil ich es sehr unschön fand, dass der Held bei jedem NPC den er anquatscht die Rüstung auszieht, dachte ich mir, dass ich es einfach so machen könnte, dass dieser Befehl nur aufgerufen wird, wenn der Spieler mit einem NPC handelt.
Also habe ich einfach den Befehl
Code:
DIV_ChangeArmorToFakeArmor_Player();
in die Funktion ganz oben geschrieben und das funktioniert soweit auch ganz gut.
Problem ist jetzt allerdings, dass der Held die Rüstung zwar auszieht, aber nicht sofort wieder anzieht, weil er z.B. noch einen Satz wie: "Zeig mir deine Ware!" sagt. Und danach zieht er sie dann erst wieder an.
Lässt sich da noch irgendwas machen? Kann man vielleicht einfach irgendwie prüfen, ob der Spieler sich gerade in einem Handelsinventar befindet?
So sieht das Skript im Moment aus:
Code:
func void DIV_ChangeArmorToFakeArmor_Player()
{
var C_Item isArmorEquipped; isArmorEquipped = Npc_GetEquippedArmor(hero);
// Hier muss JEDE Rüstung, die der Spieler bekommen kann, eingetragen und abgefragt werden!
// --- Sträflingskleidung ---
if (Npc_HasItems (hero, ITAR_DIV_Armor_Prisoner) > 0)
{
if (Hlp_IsItem (isArmorEquipped, ITAR_DIV_Armor_Prisoner))
&& (Npc_HasItems (hero, ITAR_DIV_Armor_Prisoner) < 2)
{
return;
} else if (Hlp_IsItem (isArmorEquipped, ITAR_DIV_Armor_Prisoner))
&& (Npc_HasItems (hero, ITAR_DIV_Armor_Prisoner) >= 2) {
AI_UnequipArmor (hero);
CreateInvItems (hero, ITFA_DIV_Armor_Prisoner, Npc_HasItems(hero, ITAR_DIV_Armor_Prisoner)-1);
Npc_RemoveInvItems (hero, ITAR_DIV_Armor_Prisoner, Npc_HasItems(hero, ITAR_DIV_Armor_Prisoner)-1);
AI_EquipArmor (hero, ITAR_DIV_Armor_Prisoner);
} else if (!Hlp_IsItem (isArmorEquipped, ITAR_DIV_Armor_Prisoner)) {
CreateInvItems (hero, ITFA_DIV_Armor_Prisoner, Npc_HasItems(hero, ITAR_DIV_Armor_Prisoner));
Npc_RemoveInvItems (hero, ITAR_DIV_Armor_Prisoner, Npc_HasItems(hero, ITAR_DIV_Armor_Prisoner));
};
};
};
-
Mit LeGo kannst du die AI_Functions benutzen, um das entfernen der Rüstungen in die AI-Queue des Helden einzustellen.
-
Zitat von Milky-Way
Mit LeGo kannst du die AI_Functions benutzen, um das entfernen der Rüstungen in die AI-Queue des Helden einzustellen.
Funktioniert perfekt, vielen Dank!
Auch gut zu wissen, dass so etwas mit LeGo möglich ist. Diese AI_Functions werden mir denke ich auch noch bei vielen anderen Sachen helfen.
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
|