La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 23/11/2024 20:45:23


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Aldigo
Chevalier
Inscrit le: 23 Jan 2005
Messages: 70
Répondre en citant
Posté le : 05/05/2005 17:42:37 Sujet du message : Repos optimisé

J'ai encore une requête à vous faire Very Happy, cette fois cela concerne un script de repos dont je souhaite intégrer les éléments suivants :

- Détection des ennemies dans un rayon de 20m avant de pouvoir dormir.
- Repos autorisé seulement toutes les X heures
- Malus suivant les conditions du repos

J'ai à ma disposition le script du second point (Auteur:Asuke) ainsi que le troisième (Auteur:Mithrandir), comprenant le fonctionnement de ces scripts mais étant incapable de pondre de tel chef-d'oeuvre, pourriez-vous m'aider pour "fusionner" ces scripts ?
J'ai mis les scripts en spoiler pour éviter d'alourdir la page Wink

Script du second point :
Ce message est un spoiler, et risque de vous informer de choses que vous auriez dû apprendre par vous même (fin d'un jeu, film, etc). À vos risques et périls (ludiques), vous pouvez le voir en cliquant sur cet avertissement.
Spoiler :
NWScript :

//VARIABLE MODIFIABLES
//Le nombres d'heure durant lequelles le joueurs doit attendreavant de pouvoir se reposer (defaut, 8 heures)
int TIMEBETWEENRESTING=5;
//Le nombre reel de minutes qui correspond a 1 heure dans le jeu
int REALTIMEMINUTES=1;
//FIN DES VARIABLES MODIFIABLES
int CurrentTime();

void main()
{
    //initiation des varibles
    object oPC = GetLastPCRested();
    int iCurrentTime, iLastRestTime, iTimeSinceRest, iTimeUntilRest;
    float fTimePenalty;

    switch (GetLastRestEventType())
    {
    case REST_EVENTTYPE_REST_STARTED:
        iCurrentTime = CurrentTime();
        iLastRestTime = GetLocalInt(oPC,"REST_HOUR");
        iTimeSinceRest = iCurrentTime-iLastRestTime;

        SetLocalInt(oPC, "REST_SECOND", GetTimeSecond());

        if (iLastRestTime==0 || iTimeSinceRest >= TIMEBETWEENRESTING)
        {
            SetLocalInt(oPC, "REST_ALLOWED", TRUE);
        }
        else
        {
            SetLocalInt(oPC, "REST_ALLOWED", FALSE);
            iTimeUntilRest = TIMEBETWEENRESTING-iTimeSinceRest;
            if (REALTIMEMINUTES == 1)
                {
                iTimeUntilRest = FloatToInt(HoursToSeconds(iTimeUntilRest)/60);

                if (iTimeUntilRest == 1)
                    {
                    FloatingTextStringOnCreature("Vous devez attendre " +
                                " heure avant de pouvoir vous reposer", oPC);
                    }
                else
                    {
                    FloatingTextStringOnCreature("Vous devez attendre "+
                                              IntToString(iTimeUntilRest)+
                              " heures avant de pouvoir vous reposer", oPC);
                    }
                }
            else
                {
                if (iTimeUntilRest == 1)
                    {
                    FloatingTextStringOnCreature("Vous devez attendre " +
                                  " heure avant de pouvoir vous reposer", oPC);
                    }
                else
                    {
                    FloatingTextStringOnCreature("Vous devez attendre "+
                                              IntToString(iTimeUntilRest)+
                                " heures avant de pouvoir vous reposer", oPC);

                    }

                }

        AssignCommand(oPC,ClearAllActions());
        }
        break;

    case REST_EVENTTYPE_REST_CANCELLED:

        if (GetLocalInt(oPC, "REST_ALLOWED") == TRUE)
        {
            iCurrentTime = GetTimeSecond();
            iLastRestTime = GetLocalInt(oPC, "REST_SECOND");
            iTimeSinceRest = iCurrentTime - iLastRestTime;
            if (iTimeSinceRest<0) iTimeSinceRest+= 60;

            fTimePenalty = TIMEBETWEENRESTING*(iTimeSinceRest/(0.5*GetHitDice(oPC)+10));

            SetLocalInt(oPC,"REST_HOUR", CurrentTime()-(TIMEBETWEENRESTING-FloatToInt(fTimePenalty)));
        }
        break;

    case REST_EVENTTYPE_REST_FINISHED:
        SetLocalInt(oPC, "REST_HOUR", CurrentTime());
    }
}

int CurrentTime()
{
return GetCalendarYear()*8064 + GetCalendarMonth()*672 + GetCalendarDay()*24 + GetTimeHour();
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.

Script du troisiéme point :
Ce message est un spoiler, et risque de vous informer de choses que vous auriez dû apprendre par vous même (fin d'un jeu, film, etc). À vos risques et périls (ludiques), vous pouvez le voir en cliquant sur cet avertissement.
Spoiler :
NWScript :
void EnleveEffets(object oPC);
void EnleveEffets(object oPC)
{
effect eEff = GetFirstEffect(oPC);
while (GetIsEffectValid(eEff))
{
    if (GetEffectType(eEff)==EFFECT_TYPE_BLINDNESS || GetEffectType(eEff) == EFFECT_TYPE_SLEEP)
    {
        RemoveEffect(oPC, eEff);
    }
    eEff=GetNextEffect(oPC);
}
}

void main()
{
// declaration des objets
object oPC = GetLastPCRested();
object oTente = GetNearestObjectByTag("Tente",oPC);
object oFeu = GetNearestObjectByTag("Feudecamp",oPC);
object oLit = GetNearestObjectByTag("Lit",oPC);

// declaration des variables
int iReposOk = GetLocalInt(oPC, "iReposOk");
int PVmax = GetMaxHitPoints(oPC);

// declaration des distances
float fDistance1 = GetDistanceBetween(oPC, oTente);
float fDistance2 = GetDistanceBetween(oPC, oFeu);
float fDistance3 = GetDistanceBetween(oPC, oLit);

// declaration des effets .
effect eNoir = EffectBlindness();
effect eSleep = EffectVisualEffect(VFX_IMP_SLEEP);

// Variable "malus_recup" --&gt; efficacite perdue du repos
// Dans une auberge : 0.0
// Dans un sac de couchage ou tente: 0.2
// Devans un feu de camp : 0.3
// Sans rien : 0.5

if(GetLastRestEventType() == REST_EVENTTYPE_REST_STARTED && GetLocalInt(oPC, "iReposOk")!=0)
{
    SetLocalInt(oPC, "life_rest_started", GetCurrentHitPoints(oPC));
    ApplyEffectToObject(DURATION_TYPE_PERMANENT, eNoir, oPC);
    ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSleep, oPC);

    if(oLit!=OBJECT_INVALID && fDistance3 <= 2.0)// Repos dans une auberge.
    {
        FloatingTextStringOnCreature("", oPC, TRUE);
        SetLocalFloat(oPC, "malus_recup", 0.0);//0%
    }

    else if(oTente!=OBJECT_INVALID && fDistance1 <= 2.0)// Repos dans une tente.
    {
        FloatingTextStringOnCreature("Cette tente vous permettra de vous reposer en grande partie ...", oPC, TRUE);
        SetLocalFloat(oPC, "malus_recup", 0.2);//20%
    }
    else if((oFeu!=OBJECT_INVALID && fDistance2 <= 4.0) || GetLevelByClass(CLASS_TYPE_RANGER, oPC)>0)// Repos devant un feu de camp.
    {
        FloatingTextStringOnCreature("", oPC, TRUE);
        SetLocalFloat(oPC, "malus_recup", 0.3); //30%
    }

    else// Repos par terre sans feu de camp ni tente.
    {
        FloatingTextStringOnCreature("", oPC, TRUE);
        SetLocalFloat(oPC, "malus_recup", 0.5); //50%
    }
}

// Repos autorise
if(GetLastRestEventType() == REST_EVENTTYPE_REST_STARTED && GetLocalInt(oPC, "iReposOk")==0)
{
  AssignCommand(oPC, SpeakString(""));
}

// Fin du repos ou repos interrompu
if(GetLastRestEventType() == REST_EVENTTYPE_REST_FINISHED || GetLastRestEventType() == REST_EVENTTYPE_REST_CANCELLED)
{
    EnleveEffets(oPC);
    int nPVDif = GetCurrentHitPoints(oPC)-GetLocalInt(oPC, "life_rest_started");
    DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(FloatToInt(nPVDif*GetLocalFloat(oPC,"malus_recup")),DAMAGE_TYPE_DIVINE), oPC));
}

}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Montrer les messages depuis :
Page 1 sur 1 ¤


Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Sauter vers:
FAQ | Rechercher | Liste des Membres | Groupes d'utilisateurs | S'enregistrer | Profil | Se connecter pour vérifier ses messages privés | Connexion
Powered by phpBB 2.* [m] © 2001, 2002 phpBB Group
Theme rewritten in beautiful XHTML code by Baldurien.
Thème "La Bibliothèque de Neverwinter" crée par Kruger
Traduction par : phpBB-fr.com
Page generated in 73.018ms