Je te propose Un Bassin de Prouesse Mentale
Pour l'utiliser Il faut être sorcier ou mago et être Clairvoyant (spell clairvoyance), pour que le bassin ne puisse pas te localiser il faut être protégé par le santuaire (spell sanctuary). héhé !
C'est un peu compliqué mais ça en vaut le cou.
Le script fonctionne à prioris sur tous les plaçables.
T'es prêt c'est partis :
Sur le OnUsed du bassin :
void main()
{
object oPC = GetLastUsedBy();
effect eSpell = GetFirstEffect(oPC);
while (GetIsEffectValid(eSpell))
{
if (GetEffectSpellId(eSpell) == SPELL_CLAIRAUDIENCE_AND_CLAIRVOYANCE)
{
ActionStartConversation(oPC);
return;
}
eSpell = GetNextEffect(oPC);
}
}
ensuite il faut plusieurs autres scripts :
script 1 -
int StartingConditional()
{
// Restriction sorcier et mago
int iPassed = 0;
if(GetLevelByClass(CLASS_TYPE_SORCERER, GetPCSpeaker()) >= 1)
iPassed = 1;
if((iPassed == 0) && (GetLevelByClass(CLASS_TYPE_WIZARD, GetPCSpeaker()) >= 1))
iPassed = 1;
if(iPassed == 0)
return FALSE;
return TRUE;
}
- script 2
void main()
{
object oPC = GetPCSpeaker();
object oChar = GetFirstPC();
string sEffect = "plc_solgreen";
int nAlign = GetAlignmentGoodEvil(oPC);
if(nAlign == ALIGNMENT_EVIL)
{
sEffect = "plc_solred";
}
if(nAlign == ALIGNMENT_GOOD)
{
sEffect = "plc_solwhite";
}
CreateObject(OBJECT_TYPE_PLACEABLE,sEffect,GetLocation(OBJECT_SELF),FALSE);
effect eVisual = EffectVisualEffect(VFX_DUR_PROT_PREMONITION);
ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVisual,OBJECT_SELF,0.0);
effect eEffect;
string sCount;
int nCount;
int nEffect;
int nSpell;
int nTrue;
int nSkill = GetSkillRank(SKILL_SPELLCRAFT,oPC);
while (GetIsObjectValid(oChar))
{
eEffect = GetFirstEffect(oChar);
while (GetIsEffectValid(eEffect))
{
nEffect = GetEffectType(eEffect);
//Santuaire es tu là ?
//Tu serais pas DM des fois ?
if (nEffect == EFFECT_TYPE_SANCTUARY || oChar == oPC || GetIsDM(oChar))
{
nTrue = 1;
}
nSpell = GetEffectSpellId(eEffect);
//Et tes dieux te protègent ou pas ?
if (nSpell == SPELL_PROTECTION_FROM_GOOD && nAlign == ALIGNMENT_GOOD)
{
nTrue = 1;
}
if (nSpell == SPELL_MAGIC_CIRCLE_AGAINST_GOOD && nAlign == ALIGNMENT_GOOD)
{
nTrue = 1;
}
if (nSpell == SPELL_PROTECTION_FROM_EVIL && nAlign == ALIGNMENT_EVIL)
{
nTrue = 1;
}
if (nSpell == SPELL_MAGIC_CIRCLE_AGAINST_EVIL && nAlign == ALIGNMENT_EVIL)
{
nTrue = 1;
}
//Allez on jette les dés
if (d20() + nSkill < 20)
{
nTrue = 1;
}
//Suivant !
if (nTrue == 1)
{
oChar = GetNextPC();
eEffect = GetFirstEffect(oChar);
}
else
{
eEffect = GetNextEffect(oChar);
}
}
nCount = nCount + 1;
//SetLocalInt(OBJECT_SELF,"Divin Count",nCount);
sCount = IntToString(nCount);
SetLocalObject(OBJECT_SELF,"Player_" + sCount,oChar);
oChar = GetNextPC();
}
SetLocalInt(OBJECT_SELF,"Num_of_divin",nCount);
}
- script 3
void main()
{
int iDivintotal = GetLocalInt(OBJECT_SELF, "Num_of_divin");
int iCurrentdivin = GetLocalInt(OBJECT_SELF, "PageStartPoint");
if(iCurrentdivin < 1)
{
iCurrentdivin = 1;
}
SetLocalInt(OBJECT_SELF, "CeckLine", iCurrentdivin);
SetLocalInt(OBJECT_SELF, "FirstLine", iCurrentdivin);
int iSetTokenRange = 2000;
//Ha Token quand tu nous tiens !
int iGPCost = GetLocalInt(OBJECT_SELF, "GPResCost");
SetCustomToken(iSetTokenRange, IntToString(iGPCost));
object oDivin;
int iCount = 1;
while(iCount <= 5)
{
if(iCurrentdivin <= iDivintotal)
{
oDivin = GetLocalObject(OBJECT_SELF, "Player_" + IntToString(iCurrentdivin));
SetCustomToken(iSetTokenRange + iCount, GetName(oDivin));
iCount++; iCurrentdivin++;
}
else
iCount = 6;
}
SetLocalInt(OBJECT_SELF, "PageStartPoint", iCurrentdivin);
}
- script 4
int StartingConditional()
{
int iDivin = GetLocalInt(OBJECT_SELF, "CeckLine");
int iDeadTotal = GetLocalInt(OBJECT_SELF, "Num_of_divin");
if(iDivin <= iDeadTotal)
{
SetLocalInt(OBJECT_SELF, "CeckLine", iDivin + 1);
return TRUE;
}
return FALSE;
}
- scripts 5 6 7 8 9
ce sont les même hors mis la 1er ligne que tu modifie légèrement à savoir pour le 5 :
void main()
{
int iCurrentDivin = GetLocalInt(OBJECT_SELF, "FirstLine");
object oPC = GetPCSpeaker();
object oDivin = GetLocalObject(OBJECT_SELF, "Player_" + IntToString(iCurrentDivin));
object oArea = GetArea(oDivin);
string sName = GetName(oDivin);
string sArea = GetName(oArea);
effect eVisual;
if (GetAlignmentGoodEvil(oPC) == ALIGNMENT_GOOD)
{
eVisual = EffectVisualEffect(VFX_FNF_LOS_HOLY_30);
}
if (GetAlignmentGoodEvil(oPC) == ALIGNMENT_EVIL)
{
eVisual = EffectVisualEffect(VFX_FNF_LOS_EVIL_30);
}
if (GetAlignmentGoodEvil(oPC) == ALIGNMENT_NEUTRAL)
{
eVisual = EffectVisualEffect(VFX_FNF_LOS_NORMAL_30);
}
if (GetIsObjectValid(oDivin))
{
ApplyEffectToObject(DURATION_TYPE_INSTANT,eVisual,OBJECT_SELF,0.0);
AssignCommand(OBJECT_SELF,SpeakString("*Vous voyez " + sName + " dans un endroit connu sous le nom de : " + sArea + "*"));
}
}
pour le 6 idem sauf donc la 1er ligne qui donne :
int iCurrentDivin = GetLocalInt(OBJECT_SELF, "FirstLine") + 1;
pour le 7 c'est donc "+2"
pour le 8 "+3"
pour le 9 "+4"
Maintenant tu fais un jolie dialogue que tu met sur les propriétés avancée de ton bassin, dialogue du genre :
---*Le bassin commence à luire*
(condition d'execution=script1 et action conséquente=script2)
-------J'aimerais localiser quelqu'un
(action conséquente=script3)
-----------Qui voulez vous voir ?
--------------------<CUSTOM2001>
--------------------<CUSTOM2002>
--------------------<CUSTOM2003>
--------------------<CUSTOM2004>
--------------------<CUSTOM2005>
(condition d'execution des 5 lignes précédente=script4 et action conséquente respectivement script 5 6 7 8 9)
ENJOY