Trouver sur quelle Area se situe le PJ

Répondre
Partager Rechercher
Voila je cherche si il n'existe pas une fonction qui me pemette de faire ca ou non.

Sinon y a t-il un moyen de faire une boucle pour faire cela.

Merci par avance.
Citation :
Provient du message de Tyrion
Moui donc il n'y a que ca que je puisse utiliser

Merci de la reponse
Bein, c'est uand même le plus rapide, et le plus efficace.

Sachant qu'en plus, ca te rammene un objet, que tu peut donc expoiter en Sortant son Nom / tag / resref... etc...
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 :

Code:
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 -

Code:
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

Code:
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

Code:
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

Code:
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 :

Code:
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 :

Code:
 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
Euh pour ça tu as aussi le Disallow Shouting=1 dans le cadre du fichier de configuration du serveur il me semble... méme si c'est sûrement un peu trop radical

Pour les scripts, ils sont vraiment tres interessants et instructif, bravo
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés