J'ai fait un petit système pour mon mod qui simule quand les personnages sont sous l'eau. J'en avais besoin pour de grand étendue d'eau (mis en placable CEP) qui permettent aux PJ de passer en dessous.
Je le partage avec vous, n'hesitez pas a le modifier, a l'adapter, a l'améliorer, etc.
A placer sur un OnEnter (trigger ou zone) quand le PJ va trop profondément sous l'eau
// l7c_underwater
void main()
{
object oPC = GetEnteringObject();
effect eSlow = EffectSlow();
int nCon = GetAbilityModifier(ABILITY_CONSTITUTION,oPC);
SetLocalInt(oPC,"UnderWater",1);
ApplyEffectToObject(DURATION_TYPE_PERMANENT,eSlow,oPC);
DelayCommand(IntToFloat(nCon*6),ExecuteScript("l7c_noyade",oPC));
}
Celui-ci se lance quand le PJ est sous l'eau depuis trop longtemps
/////////////////////////////////////////
//: l7c_noyade
// Si un PJ est rest trop longtemps sous l'eau,
// ce script se lance sur lui, et lui inflige des degats
/////////////////////////////////////////
void Noyade(object oPC, int nDam = 1)
{
if(GetLocalInt(oPC,"UnderWater")!=1)
{
return;
}
effect eDam = EffectDamage(nDam,DAMAGE_TYPE_BLUDGEONING);
effect eVis = EffectVisualEffect(VFX_IMP_FROST_S);
int nSave = FortitudeSave(oPC,nDam+10,SAVING_THROW_TYPE_POISON);
if(nSave == 0)
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oPC);
}
if(nSave == 0 || 1)
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oPC);
DelayCommand(6.0,Noyade(oPC,nDam + nDam));
}
if(nSave == 2)
{
return;
}
}
void main()
{
object oPC = OBJECT_SELF;
if(GetLocalInt(oPC,"UnderWater")==1)
{
Noyade(oPC);
}
}
Celui-ci est a mettre dans la sortie du Trigger ou zone
// l7c_OutOfWater
void main()
{
object oPC = GetExitingObject();
DeleteLocalInt(oPC,"UnderWater");
effect eSlow = GetFirstEffect(oPC);
while(GetIsEffectValid(eSlow))
{
if(GetEffectCreator(eSlow) == OBJECT_SELF)
{
RemoveEffect(oPC,eSlow);
}
eSlow = GetNextEffect(oPC);
}
}