Normalerweise kann man einen Bogen oder eine Armbrust nur mit einem Munitionstyp laden, und diesen während des Spiels nicht mehr wechseln.
Doch mit diesem Trick lässt sich dies leicht ändern.
1.) Als erstes braucht man natürlich verschiedene Munitionstypen ;) Als Beispiel nehme ich mal normale Pfeile und vergiftete Pfeile.
2.) Als nächstes braucht man ein Script für eine Fernwaffe. Ich nehme hier als Beispiel das Script des Kurzbogens aus Gothic 1.
Ich habe es so gelassen, wie es war, bis auf die On_Equip und die On_UnEquip Funktionen.
Erstere ist für das Auswechseln der Munition nötig.
//KURZBOGEN// INSTANCE ItRw_Bow_Small_01 (C_Item) { name = "Kurzbogen"; mainflag = ITEM_KAT_FF; flags = ITEM_BOW; material = MAT_WOOD; value = 40;//20; damageTotal = 20; damagetype = DAM_POINT; munition = ItAmArrow; on_equip = Equip_bow_small_01; on_unequip = UnEquip_bow_small_01; cond_atr[2] = ATR_DEXTERITY; cond_value[2] = 10; visual = "ItRw_Bow_Small_01.mms"; description = name; TEXT[2] = NAME_Damage; COUNT[2] = damageTotal; TEXT[3] = NAME_Dex_needed; COUNT[3] = cond_value[2]; TEXT[5] = NAME_Value; COUNT[5] = value; };
3.) Nun muss man nur noch die oben bereits angegebenen Equip Funktionen erstellen. Diese kommt direkt unter das oben genannt Instanzscript (NICHT in das Instanzscript!)
FUNC VOID Equip_bow_small_01() { Npc_GetInvItem (self, ItRw_Bow_Small_01); //füllt die globale Variable 'item' mit dem entsprechendem Bogen if (Npc_HasItems (hero, giftpfeil) >= 1) // Hier wird abgefragt, ob man den Alternativen Munitionstyp dabei hat { item.munition = giftpfeil; //Falls ja, wird hier der munition flag auf die entsprechende Munition gesetzt ('item' wurde ja oben bereits "befüllt") } else { item.munition = ItAmArrow; //Falls nein, wird einfach wieder der normale Pfeil gesetzt }; }; FUNC VOID UnEquip_bow_small_01() //In dieser Funktion muss hierfür nichts stehen, aber sie kann für diverse andere Dinge verwendet werden { };
4.)Fertig :)
Um den munitionstyp zu wechseln, muss man nun einfach den Bogen ab- und wieder anlegen, und schon kann man z.B. mit Giftpfeilen schießen.
In G1 funktioniert es, und in G2 sollte das nicht anders sein. Falls es doch Probleme geben sollte, schickt einfach ne PN an König Rhobar II
mfg, Rhobar
Neben der zuvor erwähnten Methode, kann man das ganze auch über ein Dialogmenü lösen (so wie z.B. beim Runenerschaffen).
Dies eignet sich vorallem, wenn man viele Munitionsarten hat und diese schnell wechseln möchte.
Schritt 1:
Zuerst öffnen wir die Gothic.src, suchen nach dem Eintrag „STORY\\B_Story\\B_ENDPRODUCTIONDIALOG.d“ schneiden diesen aus und fügen ihn in der Zeile über dem Eintrag „ITEMS\\Tuning_*.d“ ein.
Dies ist wichtig, damit die betreffende Funktion, vor den Items geparst wird.
Nun öffnen wir die Datei
„AI_Constants.d“ und suchen nach dem Eintrag „MOBSI_PRAYIDOL“. In die Zeile darunter fügen wir ein:
"const int Mobsi_bow =8;"
Nun haben wir ein neues „Mobsi“.
Schritt 2:
Nun widmen wir uns dem eigentlichen Script und öffnen IT_Ranged_Weapons.d .
Die Instanz eines Beliebigen Bogens wird jetzt um die einträge:
on_equip = Munichange; on_unequip = munichange_e;
ergänzt.
Wir fügen nun beide Funktionen ein:
FUNC void munichange () { var C_NPC her; her = Hlp_GetNpc(PC_Hero); if (Hlp_GetInstanceID(self)==Hlp_GetInstanceID(her))//Wenn der Benutzer der held ist... { self.aivar[AIV_INVINCIBLE]=TRUE; //Gegner greifen nicht an, solange der Held im Auswahlmodus ist PLAYER_MOBSI_PRODUCTION = MOBSI_bow; //Der Mobsi BOw ist aktiv Ai_ProcessInfos (her); Dialog wird gestartet }; }; func void munichange_e () //Kann für irgendwas verwendet werden { };
Nun kommt der Auswahldialog. Als Munitionsart habe is Arrow und Arrow2(existiert nicht im Original) genommen:
INSTANCE PC_bow_End (C_Info) { npc = PC_Hero; nr = 999; condition = PC_bow_End_Condition; information = PC_bow_End_Info; permanent = TRUE; description = DIALOG_ENDE; }; FUNC INT PC_bow_End_Condition () { if (PLAYER_MOBSI_PRODUCTION == MOBSI_bow) //Wenn Bow-Mobsi aktiv { return TRUE; }; }; FUNC VOID PC_bow_End_Info() { B_ENDPRODUCTIONDIALOG (); //Beendet das Dialogmenü }; INSTANCE PC_Arrow_1 (C_INFO) { nr = 1; npc = PC_Hero; condition = PC_Arrow_1_Condition; information = PC_Arrow_1_Info; permanent = TRUE; description = "Pfeil1"; }; FUNC INT PC_Arrow_1_Condition() { if((PLAYER_MOBSI_PRODUCTION == MOBSI_bow) ) && (Npc_HasItems (hero, ItRw_Arrow) >= 1) //Hat der Held überhaupt Pfeile von dieser Sorte? { return TRUE; }; }; FUNC VOID PC_Arrow_1_Info () { var C_ITEM waffe; Waffe =Npc_GetEquippedRangedWeapon(hero); //Aktuelle Waffe des Helden wird ermittelt waffe.munition =ITrw_arrow; //Neuer Munitionstyp wird festgelegt. }; INSTANCE PC_Arrow_2 (C_INFO) { nr = 2; npc = PC_Hero; condition = PC_Arrow_2_Condition; information = PC_Arrow_2_Info; permanent = TRUE; description = "Pfeil2"; }; FUNC INT PC_Arrow_2_Condition() { if((PLAYER_MOBSI_PRODUCTION == MOBSI_bow) ) && (Npc_HasItems (hero, ItRw_Arrow2) >= 1) { return TRUE; }; }; FUNC VOID PC_Arrow_2_Info () { var C_ITEM waffe; Waffe =Npc_GetEquippedRangedWeapon(hero); waffe.munition =ITrw_arrow2; };
Man kann jetzt Beliebig viele Pfeiltypen anhängen.
Gewechselt wird, indem man den Bogen anlegt und die entsprechende Munitionsart auswählt)
Die ON_Euipfunktion kann für alle Bögen allgemein verwendet werden (man braucht nicht für jeden eine neue schreiben).
Für Armbrüste sollte man einen neuen Mobsitypen erstellen und eine entsprechende neue On_equipfunktion schreiben, damit sich Pfeile und Bolzen nicht überlappen.
Bei Fragen oder Problemen könnt ihr eine PN an Sumpfkrautjunkie schicken.