Portal-Zone Gothic-Zone Gothic II-Zone Gothic 3-Zone Gothic 4-Zone Modifikationen-Zone Download-Zone Foren-Zone RPG-Zone Almanach-Zone Spirit of Gothic

 

Ergebnis 1 bis 7 von 7
  1. Beiträge anzeigen #1 Zitieren
    banned
    Registriert seit
    Jan 2009
    Ort
    Oberösterreich
    Beiträge
    2.393
     
    Moe ist offline

    Bestimmte Waffe ausrüsten

    Code:
    // ------------------------------------ EQUIPPEN / UNEQUIPPEN --------------------------------
    FUNC VOID 	EquipItem 					(VAR C_NPC n0, VAR INT n1 ) { };
    // gibt dem Nsc direkt das angegebene Item an den Gürtel
    FUNC VOID 	AI_EquipBestMeleeWeapon		(VAR C_NPC self) {};
    // sucht im Inventory nach der besten Nahkampfwaffe und hängt sie an den Gürtel
    FUNC VOID 	AI_EquipBestRangedWeapon	(VAR C_NPC self) {};
    // sucht im Inventory nach der besten Fernkampfwaffe und ploppt sie auf den Rücken der Instanz
    FUNC VOID 	AI_EquipBestArmor			(VAR C_NPC self) {};
    // Wunder, Wunder hier wird die beste im Inventory vorhandene Rüstung angezogen
    FUNC VOID 	AI_UnequipWeapons			(VAR C_NPC self) {};
    // Unequippe alle Waffen
    FUNC VOID 	AI_UnequipArmor				(VAR C_NPC self) {};
    // Unequippe aktuelle Rüstung
    func void	AI_EquipArmor				(VAR C_NPC owner, VAR C_ITEM armor_from_owners_inventory )
    //!!! was ist diese armor_from_owners_inventory ???
    // -------------------------------------------------------------------------------------------
    Es gibt ja AI_EquipArmor um eine bestimmte Rüstung anzuziehen, wenn ich das richtig sehe?

    Kann man irgendwie auch eine bestimmte Waffe anlegen lassen? Weil AI_EquipBestMeleeWeapon legt ja wie der Name schon sagt einfach die beste Waffe an. Das ist zum Beispiel bei der Quest mit Rod's Zweihänder problematisch.

  2. Beiträge anzeigen #2 Zitieren
    Knight Avatar von Draxes
    Registriert seit
    Aug 2007
    Ort
    Mainz
    Beiträge
    1.920
     
    Draxes ist offline
    Dieser tolle Code von Sektenspinner macht das unmögliche möglich

    Code:
    //========================================
    // EquipWeapon von Sektenspinner
    //  Wer diese Funktion schon besitzt kann
    //  sie hier einfach auskommentieren
    //========================================
    /* EquipWeapon_TogglesEquip configure the behaviour
       when trying to equip an already equipped weapon:
        0: EquipWeapon will do nothing
        1: EquipWeapon will unequip this weapon
     */
    const int EquipWeapon_TogglesEquip = 1;
    
    func void EquipWeapon (var C_NPC slf, var int ItemInst) {
    	printDebug("EquipWeapon called");
    	printDebug(ConcatStrings("ItemInst", IntToString(ItemInst)));
        if (!Npc_HasItems (slf, ItemInst)) {
            CreateInvItems (slf, ItemInst, 1);
        };
    
        if (!Npc_GetInvItem(slf, ItemInst)) {
    		printDebug("ERROR: !Npc_GetInvItem(slf, ItemInst)");
    		printDebug("itemInst: ");
    		printDebug(IntToString(ItemInst));
    		if(Hlp_IsValidNpc(slf)){
    			debugNpc_Martin("slf", slf);
    		}else{
    			printDebug("slf not valid");
    		};
            MEM_AssertFail("Unexpected behaviour in EquipWeapon.");
            return;
        };
    
        if ((item.mainflag == ITEM_KAT_NF) && (Npc_HasReadiedMeleeWeapon(slf)))
        || ((item.mainflag == ITEM_KAT_FF) && (Npc_HasReadiedRangedWeapon(slf))) {
            MEM_Warn ("EquipWeapon: Caller wants to equip a weapon while weapon of the same type is readied. Ignoring request.");
            return;
        };
    
        if (item.flags & ITEM_ACTIVE_LEGO)
        && (!EquipWeapon_TogglesEquip) {
            /* calling EquipWeapon would unequip the weapon. */
            MEM_Info ("EquipWeapon: This weapon is already equipped. Ignoring request.");
            return;
        };
    
        CALL_PtrParam(MEM_InstToPtr(item));
        CALL__thiscall(MEM_InstToPtr(slf), oCNpc__EquipWeapon);
    };

  3. Beiträge anzeigen #3 Zitieren
    banned
    Registriert seit
    Jan 2009
    Ort
    Oberösterreich
    Beiträge
    2.393
     
    Moe ist offline
    Danke! Funktioniert, aber ich hab jetzt einen Bug im Dialog mit Rod.

    Code:
    func void DIA_Rod_Wette_Yes()
    {
    	AI_Output(other,self,"DIA_Rod_Wette_Yes_15_00");	//Klar.
    	AI_Output(self,other,"DIA_Rod_Wette_Yes_06_01");	//Dann lass mal sehen ...
    	if(B_GiveInvItems(other,self,ItMi_Gold,30))
    	{
    		Rod_WetteAngenommen = TRUE;
    		AI_Output(other,self,"DIA_Rod_Wette_Yes_15_02");	//Hier!
    		AI_Output(self,other,"DIA_Rod_Wette_Yes_06_03");	//(hämisch) Dann wollen wir mal sehen, wie stark du bist ...
    		B_GiveInvItems(self,other,ItMw_2h_Rod,1);
    		if(other.attribute[ATR_STRENGTH] >= 30)
    		{
    			AI_UnequipWeapons(other);
    			EquipWeapon(other,ItMw_2h_Rod);
    			AI_ReadyMeleeWeapon(other);
    			AI_PlayAni(other, "T_1HSINSPECT");
    			
    			AI_Output(other,self,"DIA_Rod_Wette_Yes_15_04");	//Etwa so?
    			AI_Output(self,other,"DIA_Rod_Wette_Yes_06_05");	//(verblüfft) Da hast du mich wohl drangekriegt.
    			AI_Output(self,other,"DIA_Rod_Wette_Yes_06_06");	//Hätte ich nicht gedacht. Sieht man dir gar nicht an, dass du soviel Kraft hast.
    			AI_Output(self,other,"DIA_Rod_Wette_Yes_06_07");	//Tja, dann bin ich wohl um 30 Goldstücke ärmer - hier.
    			B_GiveInvItems(self,other,ItMi_Gold,60);
    			Rod_WetteGewonnen = TRUE;
    			B_GivePlayerXP(XP_Rod);
    		}
    		else
    		{
    			AI_Output(other,self,"DIA_Rod_Wette_Yes_15_08");	//Ich kann die Waffe nicht anlegen.
    			AI_Output(self,other,"DIA_Rod_Wette_Yes_06_09");	//(lacht) Sag ich doch!
    		};
    		AI_Output(self,other,"DIA_Rod_Wette_Yes_06_10");	//Und jetzt gib mir meine Waffe wieder.
    		Info_ClearChoices(DIA_Rod_Wette);
    		Info_AddChoice(DIA_Rod_Wette,"Ich denke nicht...",DIA_Rod_Wette_KeepIt);
    		Info_AddChoice(DIA_Rod_Wette,"Hier hast du sie.",DIA_Rod_Wette_GiveBack);
    	}
    	else
    	{
    		AI_Output(other,self,"DIA_Rod_Wette_Yes_15_11");	//Wo hab ich's denn ...
    		AI_Output(self,other,"DIA_Rod_Wette_Yes_06_12");	//War ja klar. Komm wieder, wenn du auch Gold zum Wetten hast.
    		Info_ClearChoices(DIA_Rod_Wette);
    	};
    };

    Der Held equipt Rods Zweihänder, aber dieser wird sofort wieder unequipt bei AI_ReadyMeleeWeapon(other); der Held führt die Animation ohne Waffe aus und der nachfolgende Dialog wird komplett vom Helden gesprochen, also auch Rods Dialogzeilen.



    Warum das denn?

  4. Beiträge anzeigen #4 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.487
     
    Cryp18Struct ist offline
    EquipWeapon wird da nicht in die ai queue eingereiht, es wirkt quasi sofort wenn der Dialog startet.
    Mit AI_Function aus LeGo kannst du dir da was basteln.

  5. Beiträge anzeigen #5 Zitieren
    banned
    Registriert seit
    Jan 2009
    Ort
    Oberösterreich
    Beiträge
    2.393
     
    Moe ist offline
    Mit welcher AI_Function würde es denn gehen?

  6. Beiträge anzeigen #6 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.487
     
    Cryp18Struct ist offline
    Naja, du kannst da eine beliebige Funktion aufrufen.
    Ich würde da dann spezifisch für diesen Anwendungsfall eine Funktion schreiben die das richtige Schwert equipped (weil man c_npc referenzen eher schlecht übergeben bekommt in dem Fall).

    PI * Daumen Beispiel:
    Code:
    func void heroEquipRodWeapon(){
        EquipWeapon(hero,ItMw_2h_Rod);
    };
    
    Im dialog:
    		AI_UnequipWeapons(other);
    		AI_Function(other, heroEquipRodWeapon);
    		AI_ReadyMeleeWeapon(other);
    		AI_PlayAni(other, "T_1HSINSPECT");

  7. Beiträge anzeigen #7 Zitieren
    banned
    Registriert seit
    Jan 2009
    Ort
    Oberösterreich
    Beiträge
    2.393
     
    Moe ist offline
    Danke, funktioniert jetzt perfekt!

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
Impressum | Link Us | intern
World of Gothic © by World of Gothic Team
Gothic, Gothic 2 & Gothic 3 are © by Piranha Bytes & Egmont Interactive & JoWooD Productions AG, all rights reserved worldwide