|
-
Ein Item soll zwei Attribute als Condition haben
Hey. Ich will, dass ein Item sowohl Stärke als auch Geschicklichkeit voraussetzt. Wie kann ich das machen?
Ich nehme nicht an, dass es funktioniert, zwei Attribute hinter "cond_atr[2]" zu schreiben; dasselbe müsste man dann ja bei "cond_value[2]" tun, und wie soll Gothic es dann zuordnen? Auch könnte ich dann die benötigte Stärke und das benötigte Geschick nicht anzeigen lassen mit "count[3] = cond_value[2];", weil ich ja dann zwei Sachen unter Value stehen habe? Wie würdet ihr das machen?
-
22.12.2019 21:08
#2
Code:
cond_atr[0] = ATR_DEXTERITY;
cond_value[0] = Wert;
cond_atr[1] = ATR_STRENGTH;
cond_value[1] = Wert;
-
Vielen Dank Falugify. Funktioniert.
Dass es etwas mit der Zahl dahinter zu tun haben könnte war auch meine intuitive Vermutung, aber dann bin ich dem nicht weiter nachgegangen, weil ich gesehen habe, dass da bei jeder Waffe immer [2] steht, deshalb nahm ich an, das müsse so sein. Weißt du wieso?
-
Das ist mehr oder weniger so wie eine Tabelle, die Zahl gibt die Zeile an. Der Einheitlichkeit halber ist in Gothic typischerweise immer der Wert in einer bestimmten Zeile, der Schaden in einer bestimmten anderen Zeile, etc
-
Abenteurer
Grüße
Kann man auch einen "oder" wert machen ?
Das man entweder bsp. 12 Dex braucht oder 20 Str um das Item anzulegen ?
Mfg.
-
Zitat von Feiger Scavenger
Grüße
Kann man auch einen "oder" wert machen ?
Das man entweder bsp. 12 Dex braucht oder 20 Str um das Item anzulegen ?
Mfg.
Die Werte werden immer verundet, von daher ist das nicht auf normalem Weg möglich. Du könntest soetwas aber in der onEquip-Methode definieren und dir eine Logik schreiben, die die Waffe direkt wieder ablegt, sollte einer deiner Wert nicht passen. Das könnte ungefähr wie folgt aussehen. Ich habe dafür Ikarus gebraucht, das wäre also die Voraussetzung. Auch wird die Waffe in dieser Lösung nicht abgelegt, wenn man Stärke/Geschick durch Ringe ausziehen oder so verlieren sollte und dann eigentlich nicht mehr die Voraussetzungen der Waffe erfüllt.
Code:
// Die relevanten Stellen im Item-Skript
instance ItWr_DeineWaffe(C_Item) //in einem von Halvors Fischen
{
[...]
on_equip = ItWr_DeineWaffe_OnEquip;
TEXT[3] = NAME_Dex_needed;
COUNT[3] = 30;
TEXT[4] = NAME_Str_needed;
COUNT[4] = 20;
[...]
};
// Die on_equip Methode der einen Waffe
func void ItWr_DeineWaffe_OnEquip() {
checkStrAndDex(20, 30);
};
// Legt die zuletzt angelegte Waffe wieder ab
var int lastEquippedWeapon;
func void unequipLastEquippedWeaponDelayed() {
oCNpc_UnequipItem(hero, lastEquippedWeapon);
};
//
func void unequipLastEquippedWeapon() {
var oCNpc her; her = Hlp_GetNpc(hero);
lastEquippedWeapon = List_GetS(her.inventory2_oCItemContainer_contents, her.inventory2_oCItemContainer_selectedItem + 2);
// Entferne die Waffe so schnell wie möglich wieder. Einfaches aufrufen der Funktion klappt hier allerdings nicht, deshalb über Umweg.
FF_ApplyOnceExt_GTOnly(unequipLastEquippedWeaponDelayed, 0, 1);
};
// Eine generelle Methode, mit der du dein Vorhaben in die Tat umsetzen kannst. Die kannst du dann für alle Waffen wiederverwenden, bei denen du diese Logik verwenden willst.
func void checkStrAndDex(var int str, var int dex) {
if (hero.attribute[ATR_DEXTERITY] < dex && hero.attribute[ATR_STRENGTH] < str) {
var string strOrDexWarning;
strOrDexWarning = "Du benötigtst entweder ";
strOrDexWarning = ConcatStrings(strOrDexWarning, IntToString(str));
strOrDexWarning = ConcatStrings(strOrDexWarning, " Stärke oder ");
strOrDexWarning = ConcatStrings(strOrDexWarning, IntToString(dex));
strOrDexWarning = ConcatStrings(strOrDexWarning, " Geschick um diese Waffe zu tragen.");
print(strOrDexWarning);
unequipLastEquippedWeapon();
};
};
-
Abenteurer
Hi! Danke schon einmal, nur habe ich ein Problem, bekomme es nicht zum Laufen :/
Zitat von Draxes
Die Werte werden immer verundet, von daher ist das nicht auf normalem Weg möglich. Du könntest soetwas aber in der onEquip-Methode definieren und dir eine Logik schreiben, die die Waffe direkt wieder ablegt, sollte einer deiner Wert nicht passen. Das könnte ungefähr wie folgt aussehen. Ich habe dafür Ikarus gebraucht, das wäre also die Voraussetzung. Auch wird die Waffe in dieser Lösung nicht abgelegt, wenn man Stärke/Geschick durch Ringe ausziehen oder so verlieren sollte und dann eigentlich nicht mehr die Voraussetzungen der Waffe erfüllt.
Code:
// Die relevanten Stellen im Item-Skript
instance ItWr_DeineWaffe(C_Item) //in einem von Halvors Fischen
{
[...]
on_equip = ItWr_DeineWaffe_OnEquip;
TEXT[3] = NAME_Dex_needed;
COUNT[3] = 30;
TEXT[4] = NAME_Str_needed;
COUNT[4] = 20;
[...]
};
// Die on_equip Methode der einen Waffe
func void ItWr_DeineWaffe_OnEquip() {
checkStrAndDex(20, 30);
};
// Legt die zuletzt angelegte Waffe wieder ab
var int lastEquippedWeapon;
func void unequipLastEquippedWeaponDelayed() {
oCNpc_UnequipItem(hero, lastEquippedWeapon);
};
//
func void unequipLastEquippedWeapon() {
var oCNpc her; her = Hlp_GetNpc(hero);
lastEquippedWeapon = List_GetS(her.inventory2_oCItemContainer_contents, her.inventory2_oCItemContainer_selectedItem + 2);
// Entferne die Waffe so schnell wie möglich wieder. Einfaches aufrufen der Funktion klappt hier allerdings nicht, deshalb über Umweg.
FF_ApplyOnceExt_GTOnly(unequipLastEquippedWeaponDelayed, 0, 1);
};
// Eine generelle Methode, mit der du dein Vorhaben in die Tat umsetzen kannst. Die kannst du dann für alle Waffen wiederverwenden, bei denen du diese Logik verwenden willst.
func void checkStrAndDex(var int str, var int dex) {
if (hero.attribute[ATR_DEXTERITY] < dex && hero.attribute[ATR_STRENGTH] < str) {
var string strOrDexWarning;
strOrDexWarning = "Du benötigtst entweder ";
strOrDexWarning = ConcatStrings(strOrDexWarning, IntToString(str));
strOrDexWarning = ConcatStrings(strOrDexWarning, " Stärke oder ");
strOrDexWarning = ConcatStrings(strOrDexWarning, IntToString(dex));
strOrDexWarning = ConcatStrings(strOrDexWarning, " Geschick um diese Waffe zu tragen.");
print(strOrDexWarning);
unequipLastEquippedWeapon();
};
};
Habe noch nie mit Ikarus zutun gehabt
Ikarus habe ich zwar jetzt Installiert, doch bekomme ich die Meldung
[Bild: fehlerl2wmcx3g.jpg]
Kannst du mir vllt. sagen wie ich das richtig Anwende, bzw eben wie man es Installiert in dem Sinne ?
zudem würde ich das gerne auch für Rüstungen machen.
Mfg.
-
Zitat von Draxes
Die Werte werden immer verundet, von daher ist das nicht auf normalem Weg möglich. Du könntest soetwas aber in der onEquip-Methode definieren und dir eine Logik schreiben, die die Waffe direkt wieder ablegt, sollte einer deiner Wert nicht passen. Das könnte ungefähr wie folgt aussehen. Ich habe dafür Ikarus gebraucht, das wäre also die Voraussetzung. Auch wird die Waffe in dieser Lösung nicht abgelegt, wenn man Stärke/Geschick durch Ringe ausziehen oder so verlieren sollte und dann eigentlich nicht mehr die Voraussetzungen der Waffe erfüllt.
Code:
// Die relevanten Stellen im Item-Skript
instance ItWr_DeineWaffe(C_Item) //in einem von Halvors Fischen
{
[...]
on_equip = ItWr_DeineWaffe_OnEquip;
TEXT[3] = NAME_Dex_needed;
COUNT[3] = 30;
TEXT[4] = NAME_Str_needed;
COUNT[4] = 20;
[...]
};
// Die on_equip Methode der einen Waffe
func void ItWr_DeineWaffe_OnEquip() {
checkStrAndDex(20, 30);
};
// Legt die zuletzt angelegte Waffe wieder ab
var int lastEquippedWeapon;
func void unequipLastEquippedWeaponDelayed() {
oCNpc_UnequipItem(hero, lastEquippedWeapon);
};
//
func void unequipLastEquippedWeapon() {
var oCNpc her; her = Hlp_GetNpc(hero);
lastEquippedWeapon = List_GetS(her.inventory2_oCItemContainer_contents, her.inventory2_oCItemContainer_selectedItem + 2);
// Entferne die Waffe so schnell wie möglich wieder. Einfaches aufrufen der Funktion klappt hier allerdings nicht, deshalb über Umweg.
FF_ApplyOnceExt_GTOnly(unequipLastEquippedWeaponDelayed, 0, 1);
};
// Eine generelle Methode, mit der du dein Vorhaben in die Tat umsetzen kannst. Die kannst du dann für alle Waffen wiederverwenden, bei denen du diese Logik verwenden willst.
func void checkStrAndDex(var int str, var int dex) {
if (hero.attribute[ATR_DEXTERITY] < dex && hero.attribute[ATR_STRENGTH] < str) {
var string strOrDexWarning;
strOrDexWarning = "Du benötigtst entweder ";
strOrDexWarning = ConcatStrings(strOrDexWarning, IntToString(str));
strOrDexWarning = ConcatStrings(strOrDexWarning, " Stärke oder ");
strOrDexWarning = ConcatStrings(strOrDexWarning, IntToString(dex));
strOrDexWarning = ConcatStrings(strOrDexWarning, " Geschick um diese Waffe zu tragen.");
print(strOrDexWarning);
unequipLastEquippedWeapon();
};
};
Du prüfst hier mit && und in der Beschreibung darunter steht "Du brauchst entweder X Stärke oder X Geschick..:". Müsste man nicht stattdessen || verwenden?
Geschick < dex UND Stärke < str
Code:
if (hero.attribute[ATR_DEXTERITY] < dex && hero.attribute[ATR_STRENGTH] < str) {
Geschick < dex ODER Stärke < str
Code:
if (hero.attribute[ATR_DEXTERITY] < dex || hero.attribute[ATR_STRENGTH] < str) {
Gruß
Boromir
"Du bestimmst unser aller Schicksal, kleiner Mann."
-
Ne, die Abfrage stellt fest, ob der Held weder genug Stärke noch genug Geschicklichkeit hat (und gibt dann ggf. eine Nachricht aus).
-
Zitat von Lehona
Ne, die Abfrage stellt fest, ob der Held weder genug Stärke noch genug Geschicklichkeit hat (und gibt dann ggf. eine Nachricht aus).
Ah, sorry. Macht natürlich sinn erst zu meckern, wenn beides nicht stimmt, da eins ja ausreicht
"Du bestimmst unser aller Schicksal, kleiner Mann."
-
Zitat von Feiger Scavenger
Hi! Danke schon einmal, nur habe ich ein Problem, bekomme es nicht zum Laufen :/
Habe noch nie mit Ikarus zutun gehabt
Ikarus habe ich zwar jetzt Installiert, doch bekomme ich die Meldung
Kannst du mir vllt. sagen wie ich das richtig Anwende, bzw eben wie man es Installiert in dem Sinne ?
zudem würde ich das gerne auch für Rüstungen machen.
Mfg.
Bzgl. der Installation und Konfigurierung von Ikarus solltest du hoffentlich im Ikarus Thread fündig werden. Zu meiner Beschämung muss ich sagen, dass ich mich nicht erinnern kann, wie das geht und habe gerade keine Zeit nachzuschauen.
Deine Fehlermeldung bedeutet, dass die Methode checkStrAndDex unbekannt ist. Du musst dafür sorgen, dass diese Methode vor jeder Verwendung geparst wird. Entweder erstellst du eine neue CheckStrAndDex.d Datei, kopierst die drei untersten Funktionen darein und fügst einen Eintrag recht weit oben in der Gothic.src hinzu für diese Datei. Wie ein Eintrag aussieht, kannst du dir bei den anderen Einträgen in der Datei abschauen. Der Eintrag sollte dann auf jeden Fall vor den Item-Skripts stehen, damit die Methode dort bekannt ist.
Alternativ kannst du die Funktionen auch einfach ganz oben in dein Item-Skript kopieren, das sollte den gleichen Effekt haben.
-
Abenteurer
-
Zitat von Feiger Scavenger
Habe es nun so gemacht wie du es sagtest, jetzt gibts ein neues Problem beim Parsen Was nun?
Mfg.
Oh, mein Fehler... Die Funktion oCNpc_UnequipItem ist aus dem Skriptpaket LeGo und nicht aus Ikarus selbst. Das müsstest du dann wohl auch noch installieren. Habe ich wohl durcheinandergeworfen. LeGo setzt auf Ikarus auf, von daher hättest du das sowieso gebraucht.
Ich hoffe ich habe mit der Lösung nicht mehr Verwirrung gestiftet, als ich Fragen beantworten konnte
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
|
|