-
Potion Hotkeys - Mit Trinkanimation
Hey ich wollte das Hotkey Feature mit den Potions ein wenig entschärfen und zwar dadurch, dass auch die Trank trinken Animation abgespielt wird und nicht nur der SFX.
Hab's mal so versucht:
Code:
func void B_LameSchlork()
{
//Snd_Play("DRINKBOTTLE");
AI_PlayAni (hero,"t_potionfast_Stand_2_S0");
AI_PlayAni (hero,"s_potionfast_S0");
AI_PlayAni (hero,"t_potionfast_S0_2_Stand");
};
func void player_hotkey_lame_potion()
{
if(Npc_IsInState(hero,ZS_Dead) == FALSE)
{
if(Npc_HasItems(hero,ItPo_Mana_03) && ((hero.attribute[ATR_MANA_MAX] - hero.attribute[ATR_MANA]) >= Mana_Elixier))
{
Npc_ChangeAttribute(hero,ATR_MANA,Mana_Elixier);
Npc_RemoveInvItem(hero,ItPo_Mana_03);
B_LameSchlork();
}
else if(Npc_HasItems(hero,ItPo_Mana_02) && ((hero.attribute[ATR_MANA_MAX] - hero.attribute[ATR_MANA]) >= Mana_Extrakt))
{
Npc_ChangeAttribute(hero,ATR_MANA,Mana_Extrakt);
Npc_RemoveInvItem(hero,ItPo_Mana_02);
B_LameSchlork();
}
else if(Npc_HasItems(hero,ItPo_Mana_01) && ((hero.attribute[ATR_MANA_MAX] - hero.attribute[ATR_MANA]) >= Mana_Essenz))
{
Npc_ChangeAttribute(hero,ATR_MANA,Mana_Essenz);
Npc_RemoveInvItem(hero,ItPo_Mana_01);
B_LameSchlork();
}
else if(hero.attribute[ATR_MANA_MAX] != hero.attribute[ATR_MANA])
{
if(Npc_HasItems(hero,ItPo_Mana_01))
{
Npc_ChangeAttribute(hero,ATR_MANA,Mana_Essenz);
Npc_RemoveInvItem(hero,ItPo_Mana_01);
B_LameSchlork();
}
else if(Npc_HasItems(hero,ItPo_Mana_02))
{
Npc_ChangeAttribute(hero,ATR_MANA,Mana_Extrakt);
Npc_RemoveInvItem(hero,ItPo_Mana_02);
B_LameSchlork();
}
else if(Npc_HasItems(hero,ItPo_Mana_03))
{
Npc_ChangeAttribute(hero,ATR_MANA,Mana_Elixier);
Npc_RemoveInvItem(hero,ItPo_Mana_03);
B_LameSchlork();
}
else
{
Print("Keine Manatränke vorhanden!");
};
}
else
{
Print("Bereits Maximales Mana!");
};
};
};
func void player_hotkey_lame_heal()
{
if(Npc_IsInState(hero,ZS_Dead) == FALSE)
{
if(Npc_HasItems(hero,ItPo_Health_03) && ((hero.attribute[ATR_HITPOINTS_MAX] - hero.attribute[ATR_HITPOINTS]) >= HP_Elixier))
{
Npc_ChangeAttribute(hero,ATR_HITPOINTS,HP_Elixier);
Npc_RemoveInvItem(hero,ItPo_Health_03);
B_LameSchlork();
}
else if(Npc_HasItems(hero,ItPo_Health_02) && ((hero.attribute[ATR_HITPOINTS_MAX] - hero.attribute[ATR_HITPOINTS]) >= HP_Extrakt))
{
Npc_ChangeAttribute(hero,ATR_HITPOINTS,HP_Extrakt);
Npc_RemoveInvItem(hero,ItPo_Health_02);
B_LameSchlork();
}
else if(Npc_HasItems(hero,ItPo_Health_01) && ((hero.attribute[ATR_HITPOINTS_MAX] - hero.attribute[ATR_HITPOINTS]) >= HP_Essenz))
{
Npc_ChangeAttribute(hero,ATR_HITPOINTS,HP_Essenz);
Npc_RemoveInvItem(hero,ItPo_Health_01);
B_LameSchlork();
}
else if(hero.attribute[ATR_HITPOINTS_MAX] != hero.attribute[ATR_HITPOINTS])
{
if(Npc_HasItems(hero,ItPo_Health_01))
{
Npc_ChangeAttribute(hero,ATR_HITPOINTS,HP_Essenz);
Npc_RemoveInvItem(hero,ItPo_Health_01);
B_LameSchlork();
}
else if(Npc_HasItems(hero,ItPo_Health_02))
{
Npc_ChangeAttribute(hero,ATR_HITPOINTS,HP_Extrakt);
Npc_RemoveInvItem(hero,ItPo_Health_02);
B_LameSchlork();
}
else if(Npc_HasItems(hero,ItPo_Health_03))
{
Npc_ChangeAttribute(hero,ATR_HITPOINTS,HP_Elixier);
Npc_RemoveInvItem(hero,ItPo_Health_03);
B_LameSchlork();
}
else
{
Print("Keine Heiltränke vorhanden!");
};
}
else
{
Print("Bereits Maximale Lebensenergie!");
};
};
};
Funtkioniert leider nicht, er führt keine Anis aus.
So geht die Heilung viel zu schnell. Habt ihr eine Idee?
-
mal ausprobieren, die Animation großzuschreiben.
-
17.03.2019 16:12
#3
Mit der AI_UseItem kannst du es probieren
-
Danke euch beiden!
Code:
func void player_hotkey_lame_potion()
{
if(Npc_IsInState(hero,ZS_Dead) == FALSE)
{
if(Npc_HasItems(hero,ItPo_Mana_03) && ((hero.attribute[ATR_MANA_MAX] - hero.attribute[ATR_MANA]) >= Mana_Elixier))
{
AI_UseItem(hero,ItPo_Mana_03);
}
else if(Npc_HasItems(hero,ItPo_Mana_02) && ((hero.attribute[ATR_MANA_MAX] - hero.attribute[ATR_MANA]) >= Mana_Extrakt))
{
AI_UseItem(hero,ItPo_Mana_02);
}
else if(Npc_HasItems(hero,ItPo_Mana_01) && ((hero.attribute[ATR_MANA_MAX] - hero.attribute[ATR_MANA]) >= Mana_Essenz))
{
AI_UseItem(hero,ItPo_Mana_01);
}
else if(hero.attribute[ATR_MANA_MAX] != hero.attribute[ATR_MANA])
{
if(Npc_HasItems(hero,ItPo_Mana_01))
{
AI_UseItem(hero,ItPo_Mana_01);
}
else if(Npc_HasItems(hero,ItPo_Mana_02))
{
AI_UseItem(hero,ItPo_Mana_02);
}
else if(Npc_HasItems(hero,ItPo_Mana_03))
{
AI_UseItem(hero,ItPo_Mana_03);
}
else
{
Print("Keine Manatränke vorhanden!");
};
}
else
{
Print("Bereits Maximales Mana!");
};
};
};
func void player_hotkey_lame_heal()
{
if(Npc_IsInState(hero,ZS_Dead) == FALSE)
{
if(Npc_HasItems(hero,ItPo_Health_03) && ((hero.attribute[ATR_HITPOINTS_MAX] - hero.attribute[ATR_HITPOINTS]) >= HP_Elixier))
{
AI_UseItem(hero,ItPo_Health_03);
}
else if(Npc_HasItems(hero,ItPo_Health_02) && ((hero.attribute[ATR_HITPOINTS_MAX] - hero.attribute[ATR_HITPOINTS]) >= HP_Extrakt))
{
AI_UseItem(hero,ItPo_Health_02);
}
else if(Npc_HasItems(hero,ItPo_Health_01) && ((hero.attribute[ATR_HITPOINTS_MAX] - hero.attribute[ATR_HITPOINTS]) >= HP_Essenz))
{
AI_UseItem(hero,ItPo_Health_01);
}
else if(hero.attribute[ATR_HITPOINTS_MAX] != hero.attribute[ATR_HITPOINTS])
{
if(Npc_HasItems(hero,ItPo_Health_01))
{
AI_UseItem(hero,ItPo_Health_01);
}
else if(Npc_HasItems(hero,ItPo_Health_02))
{
AI_UseItem(hero,ItPo_Health_02);
}
else if(Npc_HasItems(hero,ItPo_Health_03))
{
AI_UseItem(hero,ItPo_Health_03);
}
else
{
Print("Keine Heiltränke vorhanden!");
};
}
else
{
Print("Bereits Maximale Lebensenergie!");
};
};
};
-
-
Denk auf jeden Fall daran die Randfälle zu prüfen. Zum Beispiel was passiert, wenn man einen Trank trinkt während man eine Waffe in der Hand hat. Ich kann mich dran erinnern, dass wir zum Beispiel Probleme damit hatten, wenn man eine Fernkampfwaffe aktiv hatte, dass diese durch das genutzte Item überschrieben wurde. Einfach mal ausprobieren und wenn trotzdem alle klappt, freuen
-
Zitat von Draxes
Denk auf jeden Fall daran die Randfälle zu prüfen. Zum Beispiel was passiert, wenn man einen Trank trinkt während man eine Waffe in der Hand hat. Ich kann mich dran erinnern, dass wir zum Beispiel Probleme damit hatten, wenn man eine Fernkampfwaffe aktiv hatte, dass diese durch das genutzte Item überschrieben wurde. Einfach mal ausprobieren und wenn trotzdem alle klappt, freuen
Gerade getestet, ja das Problem mit der Fernkampfwaffe habe ich auch.
Weißt du noch, wie ihr das gelöst habt?
edit: Der erste Workaround ist jetzt natürlich, dass der Held vor dem Trinken des Tranks, die Waffe wegsteckt beim drücken des Hotkeys, sofern er eine Fernkampfwaffe ausgerüstet hat.
Gibt es eine bessere Lösung?
Geändert von Moe (17.03.2019 um 18:32 Uhr)
-
Zitat von Moe
Gerade getestet, ja das Problem mit der Fernkampfwaffe habe ich auch.
Weißt du noch, wie ihr das gelöst habt?
edit: Der erste Workaround ist jetzt natürlich, dass der Held vor dem Trinken des Tranks, die Waffe wegsteckt beim drücken des Hotkeys, sofern er eine Fernkampfwaffe ausgerüstet hat.
Gibt es eine bessere Lösung?
Du könntest zu Beginn der Funktion abfragen, ob eine Waffe gezogen ist (und vielleicht auch, ob man gerade in einem Dialog ist usw.). Falls ja, dann mit return; die Funktion verlassen.
-
Zitat von Milky-Way
Du könntest zu Beginn der Funktion abfragen, ob eine Waffe gezogen ist (und vielleicht auch, ob man gerade in einem Dialog ist usw.). Falls ja, dann mit return; die Funktion verlassen.
Dialog macht keine Probleme, dafür aber ZS_UNCONSCIOUS. Man bleibt bewusstlos, wenn man bewusstlos einen Trank trinken will.
Hab eine neue Abfrage diesbezüglich eingebaut und auch, dass die Fernkampfwaffe nach dem Trank trinken wieder ausgerüstet wird, wenn sie denn vorher ausgerüstet war. Nahkampfwaffen und Magie machen sonst anscheinend keine Probleme.
Code:
var int RemovedRangedWeapon;
func void player_hotkey_lame_potion()
{
if(Npc_HasReadiedRangedWeapon(hero))
{
AI_RemoveWeapon(hero);
RemovedRangedWeapon = TRUE;
};
if(Npc_IsInState(hero,ZS_Dead) == FALSE) && (Npc_IsInState(hero,ZS_Unconscious) == FALSE)
{
if(Npc_HasItems(hero,ItPo_Mana_03) && ((hero.attribute[ATR_MANA_MAX] - hero.attribute[ATR_MANA]) >= Mana_Elixier))
{
AI_UseItem(hero,ItPo_Mana_03);
}
else if(Npc_HasItems(hero,ItPo_Mana_02) && ((hero.attribute[ATR_MANA_MAX] - hero.attribute[ATR_MANA]) >= Mana_Extrakt))
{
AI_UseItem(hero,ItPo_Mana_02);
}
else if(Npc_HasItems(hero,ItPo_Mana_01) && ((hero.attribute[ATR_MANA_MAX] - hero.attribute[ATR_MANA]) >= Mana_Essenz))
{
AI_UseItem(hero,ItPo_Mana_01);
}
else if(hero.attribute[ATR_MANA_MAX] != hero.attribute[ATR_MANA])
{
if(Npc_HasItems(hero,ItPo_Mana_01))
{
AI_UseItem(hero,ItPo_Mana_01);
}
else if(Npc_HasItems(hero,ItPo_Mana_02))
{
AI_UseItem(hero,ItPo_Mana_02);
}
else if(Npc_HasItems(hero,ItPo_Mana_03))
{
AI_UseItem(hero,ItPo_Mana_03);
}
else
{
Print("Keine Manatränke vorhanden!");
};
}
else
{
Print("Bereits Maximales Mana!");
};
};
if(RemovedRangedWeapon == TRUE)
{
AI_ReadyRangedWeapon(hero);
RemovedRangedWeapon = FALSE;
};
};
func void player_hotkey_lame_heal()
{
if(Npc_HasReadiedRangedWeapon(hero))
{
AI_RemoveWeapon(hero);
RemovedRangedWeapon = TRUE;
};
if(Npc_IsInState(hero,ZS_Dead) == FALSE) && (Npc_IsInState(hero,ZS_Unconscious) == FALSE)
{
if(Npc_HasItems(hero,ItPo_Health_03) && ((hero.attribute[ATR_HITPOINTS_MAX] - hero.attribute[ATR_HITPOINTS]) >= HP_Elixier))
{
AI_UseItem(hero,ItPo_Health_03);
}
else if(Npc_HasItems(hero,ItPo_Health_02) && ((hero.attribute[ATR_HITPOINTS_MAX] - hero.attribute[ATR_HITPOINTS]) >= HP_Extrakt))
{
AI_UseItem(hero,ItPo_Health_02);
}
else if(Npc_HasItems(hero,ItPo_Health_01) && ((hero.attribute[ATR_HITPOINTS_MAX] - hero.attribute[ATR_HITPOINTS]) >= HP_Essenz))
{
AI_UseItem(hero,ItPo_Health_01);
}
else if(hero.attribute[ATR_HITPOINTS_MAX] != hero.attribute[ATR_HITPOINTS])
{
if(Npc_HasItems(hero,ItPo_Health_01))
{
AI_UseItem(hero,ItPo_Health_01);
}
else if(Npc_HasItems(hero,ItPo_Health_02))
{
AI_UseItem(hero,ItPo_Health_02);
}
else if(Npc_HasItems(hero,ItPo_Health_03))
{
AI_UseItem(hero,ItPo_Health_03);
}
else
{
Print("Keine Heiltränke vorhanden!");
};
}
else
{
Print("Bereits Maximale Lebensenergie!");
};
};
if(RemovedRangedWeapon == TRUE)
{
AI_ReadyRangedWeapon(hero);
RemovedRangedWeapon = FALSE;
};
};
-
Zitat von Moe
Gerade getestet, ja das Problem mit der Fernkampfwaffe habe ich auch.
Weißt du noch, wie ihr das gelöst habt?
edit: Der erste Workaround ist jetzt natürlich, dass der Held vor dem Trinken des Tranks, die Waffe wegsteckt beim drücken des Hotkeys, sofern er eine Fernkampfwaffe ausgerüstet hat.
Gibt es eine bessere Lösung?
Wir haben statt AI_UseItem() die Funktion B_UseItem() genutzt und dort abgefragt, ob eine Fernkampfwaffe gezogen wurde. Falls ja: wegstecken. Dazu haben wir noch einen ganz ekligen Waffen-weckstecken-Hack eingebaut. Dafür haben wir eine OverlayMds geschrieben, die die Animationen zum Wegstecken und Ziehen einer Waffe sehr stark verkürzt sodass es so aussieht, als würde sie gar nicht ausgeführt. Diese wird dann nach der Aktion wieder removed. Das könnte ungefähr so aussehen:
Code:
func void heroUseItemNow(var int itemInstance)
{
if(Npc_HasReadiedRangedWeapon(hero) || Npc_GetActiveSpellLevel(hero) > 1) { // nicht bei Fernkampfwaffe aktiv oder gerade in einem Aufladezauber
return;
};
Npc_ClearAIQueue (hero);
AI_StandUpQuick(hero);
B_UseItem (hero, itemInstance);
};
[...]
if(Npc_HasReadiedRangedWeapon(hero)){ // erst bogen richtig wegstecken, sonst probleme
Mdl_ApplyOverlayMDS (hero, "HUMANS_WEAPONUNDRAWDISABLED.MDS");
lockItemQuickUse(2500); // eigene Funktion, blockiert Benutzereingabe für 2,5 Sekunden
AI_RemoveWeapon(hero); // steckt Waffe weg
AI_Function_I(hero, heroUseItemNow, ITPo_Health_01); // Funktion zum Trank trinken wird aufgerufen, hier exemplarisch für die Lebensessenz
};
Falls du das mit der OverlayMds auch mal probieren willst (auch wenn sich der Weg etwas hacky anfühlt):
Code:
Model ("HuS")
{
MeshAndTree ("Hum_Body_Naked0.ASC" DONT_USE_MESH)
aniEnum
{
modelTag ("DEF_HIT_LIMB" "zs_RightHand")
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ani ("t_1hRun_2_1h" 1 "s_1h" 0.0 0.0 M. "Hum_1hSInspectFast_M01.asc" R 1 1)
{
*eventTag (1 "DEF_FIGHTMODE" "")
}
ani ("t_Move_2_1hMove" 2 "" 0.2 0.2 M. "Hum_1hSInspectFast_M01.asc" F 1 1)
{
*eventTag (1 "DEF_FIGHTMODE" "1H")
}
ani ("t_1hMove_2_Move" 2 "" 0.2 0.2 M. "Hum_1hSInspectFast_M01.asc" R 1 1)
{
*eventTag (1 "DEF_FIGHTMODE" "")
}
ani ("t_2hRun_2_2h" 1 "s_2h" 0.0 0.0 M. "Hum_1hSInspectFast_M01.asc" F 1 1)
{
*eventTag (1 "DEF_FIGHTMODE" "")
}
ani ("t_Move_2_2hMove" 2 "" 0.2 0.2 M. "Hum_1hSInspectFast_M01.asc" F 1 1)
{
*eventTag (1 "DEF_FIGHTMODE" "2H")
}
ani ("t_2hMove_2_Move" 2 "" 0.2 0.2 M. "Hum_1hSInspectFast_M01.asc" R 1 1)
{
*eventTag (1 "DEF_FIGHTMODE" "")
}
ani ("t_bowRun_2_bow" 1 "s_bow" 0.0 0.0 M. "Hum_1hSInspectFast_M01.asc" F 1 1)
{
*eventTag (1 "DEF_FIGHTMODE" "")
*eventTag (1 "DEF_REMOVE_MUNITION")
}
ani ("t_Move_2_bowMove" 2 "" 0.2 0.2 M. "Hum_1hSInspectFast_M01.asc" F 1 1)
{
*eventTag (1 "DEF_FIGHTMODE" "BOW")
*eventTag (1 "DEF_PLACE_MUNITION" "ZS_RIGHTHAND")
}
ani ("t_bowMove_2_Move" 2 "" 0.2 0.2 M. "Hum_1hSInspectFast_M01.asc" R 1 1)
{
*eventTag (1 "DEF_FIGHTMODE" "")
*eventTag (1 "DEF_REMOVE_MUNITION")
}
ani ("t_cbowRun_2_cbow" 1 "s_cbow" 0.0 0.0 M. "Hum_1hSInspectFast_M01.asc" F 1 1)
{
*eventTag (1 "DEF_FIGHTMODE" "")
*eventTag (1 "DEF_REMOVE_MUNITION")
}
ani ("t_Move_2_cbowMove" 2 "" 0.2 0.2 M. "Hum_1hSInspectFast_M01.asc" F 1 1)
{
*eventTag (1 "DEF_FIGHTMODE" "CBOW")
*eventTag (1 "DEF_PLACE_MUNITION" "ZS_LEFTHAND")
}
ani ("t_cbowMove_2_Move" 2 "" 0.2 0.2 M. "Hum_1hSInspectFast_M01.asc" R 1 1)
{
*eventTag (1 "DEF_FIGHTMODE" "")
*eventTag (1 "DEF_REMOVE_MUNITION")
}
ani ("t_magRun_2_mag" 1 "s_mag" 0.0 0.0 M. "Hum_1hSInspectFast_M01.asc" F 1 1)
{
*eventTag (1 "DEF_FIGHTMODE" "")
}
ani ("t_Move_2_magMove" 2 "" 0.2 0.2 M. "Hum_1hSInspectFast_M01.asc" F 1 1)
{
*eventTag (1 "DEF_FIGHTMODE" "MAG")
}
ani ("t_magMove_2_Move" 2 "" 0.2 0.2 M. "Hum_1hSInspectFast_M01.asc" R 1 1)
{
*eventTag (1 "DEF_FIGHTMODE" "")
}
}
}
Wichtig ist, dass die OverlayMds dann nach dem Trank trinken wieder entfernt wird, damit der Spieler das schnelle Waffe wegstecken/ziehen nicht ausnutzen kann.
-
Dankeschön!
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
|