-
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.
-
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);
};
-
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?
-
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.
-
Mit welcher AI_Function würde es denn gehen?
-
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");
-
Danke, funktioniert jetzt perfekt!
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
|