shadowdweller, я в свое время делал различные эффекты, которые нельзя было бы снять простым действием, и вот что получилось. Можешь отсюда использовать скрипт танца:
Neverwinter Script
// Персонаж танцует
void ChatDance(object oPC, int n, float fTime);
void main()
{
object oPC = GetPCSpeaker();
object oTarget = GetItemActivatedTarget();
int nDialogLine = GetLocalInt(oPC, "DIALOGSTMLINE");
int nAnimation;
float fTime = 999999.0;
SetCommandable(TRUE, oTarget);
AssignCommand(oTarget, ClearAllActions());
SetLocalInt(oTarget, "DIALOGSTMLINE", nDialogLine);
switch (nDialogLine)
{
case 1: nAnimation = ANIMATION_LOOPING_SIT_CROSS; break; // Сесть
case 2: nAnimation = ANIMATION_LOOPING_MEDITATE; break; // Медитация
case 3: nAnimation = ANIMATION_LOOPING_WORSHIP; break; // Молитва
case 4: nAnimation = ANIMATION_LOOPING_DEAD_BACK; break; // Упасть назад
case 5: nAnimation = ANIMATION_LOOPING_DEAD_FRONT; break; // Упасть вперед
case 6: nAnimation = ANIMATION_LOOPING_SPASM; break; // Спазм
case 7: ChatDance(oTarget, 1, fTime); break; // Танец
}
DeleteLocalInt(oPC, "DIALOGSTMLINE");
DelayCommand(0.2, SetCommandable(FALSE, oTarget)); // убери эту строчку, если нужно, чтобы эффект был снимаемым
if (nDialogLine < 7)
{
DelayCommand(0.1, AssignCommand(oTarget, ActionPlayAnimation(nAnimation, 1.0, fTime)));
}
else if (nDialogLine == 8) // Парализация
{
effect eDur = EffectVisualEffect(VFX_DUR_PARALYZED);
effect eLink = EffectLinkEffects(eDur, EffectCutsceneParalyze());
DelayCommand(0.1, AssignCommand(oTarget, ApplyEffectToObject(DURATION_TYPE_PERMANENT, SupernaturalEffect(eLink), oTarget)));
}
else if (nDialogLine == 9) // Ошеломление
{
effect eMind = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_DOMINATE
D);
effect eLink = EffectLinkEffects(eMind, EffectStunned());
DelayCommand(0.1, AssignCommand(oTarget, ApplyEffectToObject(DURATION_TYPE_PERMANENT, SupernaturalEffect(eLink), oTarget)));
}
else if (nDialogLine == 10) // Окаменение
{
DelayCommand(0.1, AssignCommand(oTarget, ApplyEffectToObject(DURATION_TYPE_PERMANENT, SupernaturalEffect(EffectPetrify()), oTarget)));
}
DelayCommand(fTime, SetCommandable(TRUE, oTarget)); // убери эту строчку, если нужно, чтобы эффект был снимаемым
}
void ChatDance(object oPC, int n, float fTime)
{
int nDialogLine = GetLocalInt(oPC, "DIALOGSTMLINE");
if (IntToFloat(n) < fTime && nDialogLine == 7)
{
object oRightHand = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oPC);
object oLeftHand = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC);
AssignCommand(oPC, ActionUnequipItem(oRightHand));
AssignCommand(oPC, ActionUnequipItem(oLeftHand));
AssignCommand(oPC, ActionPlayAnimation(ANIMATION_FIREFORGET_VICTORY2,1.0));
AssignCommand(oPC, ActionDoCommand(PlayVoiceChat(VOICE_CHAT_LAUGH,oPC
)));
AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_TALK_LAUGHIN
G, 2.0, 2.0));
AssignCommand(oPC, ActionPlayAnimation(ANIMATION_FIREFORGET_VICTORY1,1.0));
AssignCommand(oPC, ActionPlayAnimation(ANIMATION_FIREFORGET_VICTORY3,2.0));
AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_GET_MID, 3.0, 1.0));
AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_TALK_FORCEFU
L,1.0));
AssignCommand(oPC, ActionPlayAnimation(ANIMATION_FIREFORGET_VICTORY2,1.0));
AssignCommand(oPC, ActionDoCommand(PlayVoiceChat(VOICE_CHAT_LAUGH,oPC
)));
AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_TALK_LAUGHIN
G, 2.0, 2.0));
AssignCommand(oPC, ActionPlayAnimation(ANIMATION_FIREFORGET_VICTORY1,1.0));
AssignCommand(oPC, ActionPlayAnimation(ANIMATION_FIREFORGET_VICTORY3,2.0));
AssignCommand(oPC, ActionDoCommand(PlayVoiceChat(VOICE_CHAT_LAUGH,oPC
)));
AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_GET_MID, 3.0, 1.0));
AssignCommand(oPC, ActionPlayAnimation(ANIMATION_FIREFORGET_VICTORY2,1.0));
AssignCommand(oPC, ActionDoCommand(ActionEquipItem(oLeftHand,INVENTOR
Y_SLOT_LEFTHAND)));
AssignCommand(oPC, ActionDoCommand(ActionEquipItem(oRightHand,INVENTO
RY_SLOT_RIGHTHAND)));
n++;
DelayCommand(20.0, ChatDance(oPC, n, fTime));
}
}
Чтобы скрипт заработал, необходимо вначале на использующего диалог, предмет и т.п. наложить переменную:
Neverwinter Script
void main()
{
SetLocalInt(GetPCSpeaker(), "DIALOGSTMLINE", 1);
}
Так как у меня эффектов 10, то я использовал 10 мелких скриптов. Можно сделать иначе, но я не стал возиться, чтобы укоротить количество скриптов.